cscg24-guacamole

CSCG 2024 Challenge 'Guacamole Mashup'
git clone https://git.sinitax.com/sinitax/cscg24-guacamole
Log | Files | Refs | sfeed.txt

react-dom.development.js (1077022B)


      1/**
      2 * @license React
      3 * react-dom.development.js
      4 *
      5 * Copyright (c) Facebook, Inc. and its affiliates.
      6 *
      7 * This source code is licensed under the MIT license found in the
      8 * LICENSE file in the root directory of this source tree.
      9 */
     10(function (global, factory) {
     11  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react')) :
     12  typeof define === 'function' && define.amd ? define(['exports', 'react'], factory) :
     13  (global = global || self, factory(global.ReactDOM = {}, global.React));
     14}(this, (function (exports, React) { 'use strict';
     15
     16  var ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
     17
     18  var suppressWarning = false;
     19  function setSuppressWarning(newSuppressWarning) {
     20    {
     21      suppressWarning = newSuppressWarning;
     22    }
     23  } // In DEV, calls to console.warn and console.error get replaced
     24  // by calls to these methods by a Babel plugin.
     25  //
     26  // In PROD (or in packages without access to React internals),
     27  // they are left as they are instead.
     28
     29  function warn(format) {
     30    {
     31      if (!suppressWarning) {
     32        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
     33          args[_key - 1] = arguments[_key];
     34        }
     35
     36        printWarning('warn', format, args);
     37      }
     38    }
     39  }
     40  function error(format) {
     41    {
     42      if (!suppressWarning) {
     43        for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
     44          args[_key2 - 1] = arguments[_key2];
     45        }
     46
     47        printWarning('error', format, args);
     48      }
     49    }
     50  }
     51
     52  function printWarning(level, format, args) {
     53    // When changing this logic, you might want to also
     54    // update consoleWithStackDev.www.js as well.
     55    {
     56      var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
     57      var stack = ReactDebugCurrentFrame.getStackAddendum();
     58
     59      if (stack !== '') {
     60        format += '%s';
     61        args = args.concat([stack]);
     62      } // eslint-disable-next-line react-internal/safe-string-coercion
     63
     64
     65      var argsWithFormat = args.map(function (item) {
     66        return String(item);
     67      }); // Careful: RN currently depends on this prefix
     68
     69      argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it
     70      // breaks IE9: https://github.com/facebook/react/issues/13610
     71      // eslint-disable-next-line react-internal/no-production-logging
     72
     73      Function.prototype.apply.call(console[level], console, argsWithFormat);
     74    }
     75  }
     76
     77  var FunctionComponent = 0;
     78  var ClassComponent = 1;
     79  var IndeterminateComponent = 2; // Before we know whether it is function or class
     80
     81  var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
     82
     83  var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
     84
     85  var HostComponent = 5;
     86  var HostText = 6;
     87  var Fragment = 7;
     88  var Mode = 8;
     89  var ContextConsumer = 9;
     90  var ContextProvider = 10;
     91  var ForwardRef = 11;
     92  var Profiler = 12;
     93  var SuspenseComponent = 13;
     94  var MemoComponent = 14;
     95  var SimpleMemoComponent = 15;
     96  var LazyComponent = 16;
     97  var IncompleteClassComponent = 17;
     98  var DehydratedFragment = 18;
     99  var SuspenseListComponent = 19;
    100  var ScopeComponent = 21;
    101  var OffscreenComponent = 22;
    102  var LegacyHiddenComponent = 23;
    103  var CacheComponent = 24;
    104  var TracingMarkerComponent = 25;
    105
    106  // -----------------------------------------------------------------------------
    107
    108  var enableClientRenderFallbackOnTextMismatch = true; // TODO: Need to review this code one more time before landing
    109  // the react-reconciler package.
    110
    111  var enableNewReconciler = false; // Support legacy Primer support on internal FB www
    112
    113  var enableLazyContextPropagation = false; // FB-only usage. The new API has different semantics.
    114
    115  var enableLegacyHidden = false; // Enables unstable_avoidThisFallback feature in Fiber
    116
    117  var enableSuspenseAvoidThisFallback = false; // Enables unstable_avoidThisFallback feature in Fizz
    118  // React DOM Chopping Block
    119  //
    120  // Similar to main Chopping Block but only flags related to React DOM. These are
    121  // grouped because we will likely batch all of them into a single major release.
    122  // -----------------------------------------------------------------------------
    123  // Disable support for comment nodes as React DOM containers. Already disabled
    124  // in open source, but www codebase still relies on it. Need to remove.
    125
    126  var disableCommentsAsDOMContainers = true; // Disable javascript: URL strings in href for XSS protection.
    127  // and client rendering, mostly to allow JSX attributes to apply to the custom
    128  // element's object properties instead of only HTML attributes.
    129  // https://github.com/facebook/react/issues/11347
    130
    131  var enableCustomElementPropertySupport = false; // Disables children for <textarea> elements
    132  var warnAboutStringRefs = false; // -----------------------------------------------------------------------------
    133  // Debugging and DevTools
    134  // -----------------------------------------------------------------------------
    135  // Adds user timing marks for e.g. state updates, suspense, and work loop stuff,
    136  // for an experimental timeline tool.
    137
    138  var enableSchedulingProfiler = true; // Helps identify side effects in render-phase lifecycle hooks and setState
    139
    140  var enableProfilerTimer = true; // Record durations for commit and passive effects phases.
    141
    142  var enableProfilerCommitHooks = true; // Phase param passed to onRender callback differentiates between an "update" and a "cascading-update".
    143
    144  var allNativeEvents = new Set();
    145  /**
    146   * Mapping from registration name to event name
    147   */
    148
    149
    150  var registrationNameDependencies = {};
    151  /**
    152   * Mapping from lowercase registration names to the properly cased version,
    153   * used to warn in the case of missing event handlers. Available
    154   * only in true.
    155   * @type {Object}
    156   */
    157
    158  var possibleRegistrationNames =  {} ; // Trust the developer to only use possibleRegistrationNames in true
    159
    160  function registerTwoPhaseEvent(registrationName, dependencies) {
    161    registerDirectEvent(registrationName, dependencies);
    162    registerDirectEvent(registrationName + 'Capture', dependencies);
    163  }
    164  function registerDirectEvent(registrationName, dependencies) {
    165    {
    166      if (registrationNameDependencies[registrationName]) {
    167        error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName);
    168      }
    169    }
    170
    171    registrationNameDependencies[registrationName] = dependencies;
    172
    173    {
    174      var lowerCasedName = registrationName.toLowerCase();
    175      possibleRegistrationNames[lowerCasedName] = registrationName;
    176
    177      if (registrationName === 'onDoubleClick') {
    178        possibleRegistrationNames.ondblclick = registrationName;
    179      }
    180    }
    181
    182    for (var i = 0; i < dependencies.length; i++) {
    183      allNativeEvents.add(dependencies[i]);
    184    }
    185  }
    186
    187  var canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');
    188
    189  var hasOwnProperty = Object.prototype.hasOwnProperty;
    190
    191  /*
    192   * The `'' + value` pattern (used in in perf-sensitive code) throws for Symbol
    193   * and Temporal.* types. See https://github.com/facebook/react/pull/22064.
    194   *
    195   * The functions in this module will throw an easier-to-understand,
    196   * easier-to-debug exception with a clear errors message message explaining the
    197   * problem. (Instead of a confusing exception thrown inside the implementation
    198   * of the `value` object).
    199   */
    200  // $FlowFixMe only called in DEV, so void return is not possible.
    201  function typeName(value) {
    202    {
    203      // toStringTag is needed for namespaced types like Temporal.Instant
    204      var hasToStringTag = typeof Symbol === 'function' && Symbol.toStringTag;
    205      var type = hasToStringTag && value[Symbol.toStringTag] || value.constructor.name || 'Object';
    206      return type;
    207    }
    208  } // $FlowFixMe only called in DEV, so void return is not possible.
    209
    210
    211  function willCoercionThrow(value) {
    212    {
    213      try {
    214        testStringCoercion(value);
    215        return false;
    216      } catch (e) {
    217        return true;
    218      }
    219    }
    220  }
    221
    222  function testStringCoercion(value) {
    223    // If you ended up here by following an exception call stack, here's what's
    224    // happened: you supplied an object or symbol value to React (as a prop, key,
    225    // DOM attribute, CSS property, string ref, etc.) and when React tried to
    226    // coerce it to a string using `'' + value`, an exception was thrown.
    227    //
    228    // The most common types that will cause this exception are `Symbol` instances
    229    // and Temporal objects like `Temporal.Instant`. But any object that has a
    230    // `valueOf` or `[Symbol.toPrimitive]` method that throws will also cause this
    231    // exception. (Library authors do this to prevent users from using built-in
    232    // numeric operators like `+` or comparison operators like `>=` because custom
    233    // methods are needed to perform accurate arithmetic or comparison.)
    234    //
    235    // To fix the problem, coerce this object or symbol value to a string before
    236    // passing it to React. The most reliable way is usually `String(value)`.
    237    //
    238    // To find which value is throwing, check the browser or debugger console.
    239    // Before this exception was thrown, there should be `console.error` output
    240    // that shows the type (Symbol, Temporal.PlainDate, etc.) that caused the
    241    // problem and how that type was used: key, atrribute, input value prop, etc.
    242    // In most cases, this console output also shows the component and its
    243    // ancestor components where the exception happened.
    244    //
    245    // eslint-disable-next-line react-internal/safe-string-coercion
    246    return '' + value;
    247  }
    248
    249  function checkAttributeStringCoercion(value, attributeName) {
    250    {
    251      if (willCoercionThrow(value)) {
    252        error('The provided `%s` attribute is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', attributeName, typeName(value));
    253
    254        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    255      }
    256    }
    257  }
    258  function checkKeyStringCoercion(value) {
    259    {
    260      if (willCoercionThrow(value)) {
    261        error('The provided key is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
    262
    263        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    264      }
    265    }
    266  }
    267  function checkPropStringCoercion(value, propName) {
    268    {
    269      if (willCoercionThrow(value)) {
    270        error('The provided `%s` prop is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
    271
    272        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    273      }
    274    }
    275  }
    276  function checkCSSPropertyStringCoercion(value, propName) {
    277    {
    278      if (willCoercionThrow(value)) {
    279        error('The provided `%s` CSS property is an unsupported type %s.' + ' This value must be coerced to a string before before using it here.', propName, typeName(value));
    280
    281        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    282      }
    283    }
    284  }
    285  function checkHtmlStringCoercion(value) {
    286    {
    287      if (willCoercionThrow(value)) {
    288        error('The provided HTML markup uses a value of unsupported type %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
    289
    290        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    291      }
    292    }
    293  }
    294  function checkFormFieldValueStringCoercion(value) {
    295    {
    296      if (willCoercionThrow(value)) {
    297        error('Form field values (value, checked, defaultValue, or defaultChecked props)' + ' must be strings, not %s.' + ' This value must be coerced to a string before before using it here.', typeName(value));
    298
    299        return testStringCoercion(value); // throw (to help callers find troubleshooting comments)
    300      }
    301    }
    302  }
    303
    304  // A reserved attribute.
    305  // It is handled by React separately and shouldn't be written to the DOM.
    306  var RESERVED = 0; // A simple string attribute.
    307  // Attributes that aren't in the filter are presumed to have this type.
    308
    309  var STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called
    310  // "enumerated" attributes with "true" and "false" as possible values.
    311  // When true, it should be set to a "true" string.
    312  // When false, it should be set to a "false" string.
    313
    314  var BOOLEANISH_STRING = 2; // A real boolean attribute.
    315  // When true, it should be present (set either to an empty string or its name).
    316  // When false, it should be omitted.
    317
    318  var BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.
    319  // When true, it should be present (set either to an empty string or its name).
    320  // When false, it should be omitted.
    321  // For any other value, should be present with that value.
    322
    323  var OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.
    324  // When falsy, it should be removed.
    325
    326  var NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.
    327  // When falsy, it should be removed.
    328
    329  var POSITIVE_NUMERIC = 6;
    330
    331  /* eslint-disable max-len */
    332  var 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";
    333  /* eslint-enable max-len */
    334
    335  var ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
    336  var VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');
    337  var illegalAttributeNameCache = {};
    338  var validatedAttributeNameCache = {};
    339  function isAttributeNameSafe(attributeName) {
    340    if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {
    341      return true;
    342    }
    343
    344    if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {
    345      return false;
    346    }
    347
    348    if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
    349      validatedAttributeNameCache[attributeName] = true;
    350      return true;
    351    }
    352
    353    illegalAttributeNameCache[attributeName] = true;
    354
    355    {
    356      error('Invalid attribute name: `%s`', attributeName);
    357    }
    358
    359    return false;
    360  }
    361  function shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {
    362    if (propertyInfo !== null) {
    363      return propertyInfo.type === RESERVED;
    364    }
    365
    366    if (isCustomComponentTag) {
    367      return false;
    368    }
    369
    370    if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {
    371      return true;
    372    }
    373
    374    return false;
    375  }
    376  function shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {
    377    if (propertyInfo !== null && propertyInfo.type === RESERVED) {
    378      return false;
    379    }
    380
    381    switch (typeof value) {
    382      case 'function': // $FlowIssue symbol is perfectly valid here
    383
    384      case 'symbol':
    385        // eslint-disable-line
    386        return true;
    387
    388      case 'boolean':
    389        {
    390          if (isCustomComponentTag) {
    391            return false;
    392          }
    393
    394          if (propertyInfo !== null) {
    395            return !propertyInfo.acceptsBooleans;
    396          } else {
    397            var prefix = name.toLowerCase().slice(0, 5);
    398            return prefix !== 'data-' && prefix !== 'aria-';
    399          }
    400        }
    401
    402      default:
    403        return false;
    404    }
    405  }
    406  function shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {
    407    if (value === null || typeof value === 'undefined') {
    408      return true;
    409    }
    410
    411    if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {
    412      return true;
    413    }
    414
    415    if (isCustomComponentTag) {
    416
    417      return false;
    418    }
    419
    420    if (propertyInfo !== null) {
    421
    422      switch (propertyInfo.type) {
    423        case BOOLEAN:
    424          return !value;
    425
    426        case OVERLOADED_BOOLEAN:
    427          return value === false;
    428
    429        case NUMERIC:
    430          return isNaN(value);
    431
    432        case POSITIVE_NUMERIC:
    433          return isNaN(value) || value < 1;
    434      }
    435    }
    436
    437    return false;
    438  }
    439  function getPropertyInfo(name) {
    440    return properties.hasOwnProperty(name) ? properties[name] : null;
    441  }
    442
    443  function PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {
    444    this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;
    445    this.attributeName = attributeName;
    446    this.attributeNamespace = attributeNamespace;
    447    this.mustUseProperty = mustUseProperty;
    448    this.propertyName = name;
    449    this.type = type;
    450    this.sanitizeURL = sanitizeURL;
    451    this.removeEmptyString = removeEmptyString;
    452  } // When adding attributes to this list, be sure to also add them to
    453  // the `possibleStandardNames` module to ensure casing and incorrect
    454  // name warnings.
    455
    456
    457  var properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.
    458
    459  var reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular
    460  // elements (not just inputs). Now that ReactDOMInput assigns to the
    461  // defaultValue property -- do we need this?
    462  'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];
    463
    464  reservedProps.forEach(function (name) {
    465    properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty
    466    name, // attributeName
    467    null, // attributeNamespace
    468    false, // sanitizeURL
    469    false);
    470  }); // A few React string attributes have a different name.
    471  // This is a mapping from React prop names to the attribute names.
    472
    473  [['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {
    474    var name = _ref[0],
    475        attributeName = _ref[1];
    476    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    477    attributeName, // attributeName
    478    null, // attributeNamespace
    479    false, // sanitizeURL
    480    false);
    481  }); // These are "enumerated" HTML attributes that accept "true" and "false".
    482  // In React, we let users pass `true` and `false` even though technically
    483  // these aren't boolean attributes (they are coerced to strings).
    484
    485  ['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {
    486    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
    487    name.toLowerCase(), // attributeName
    488    null, // attributeNamespace
    489    false, // sanitizeURL
    490    false);
    491  }); // These are "enumerated" SVG attributes that accept "true" and "false".
    492  // In React, we let users pass `true` and `false` even though technically
    493  // these aren't boolean attributes (they are coerced to strings).
    494  // Since these are SVG attributes, their attribute names are case-sensitive.
    495
    496  ['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {
    497    properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty
    498    name, // attributeName
    499    null, // attributeNamespace
    500    false, // sanitizeURL
    501    false);
    502  }); // These are HTML boolean attributes.
    503
    504  ['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM
    505  // on the client side because the browsers are inconsistent. Instead we call focus().
    506  'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata
    507  'itemScope'].forEach(function (name) {
    508    properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty
    509    name.toLowerCase(), // attributeName
    510    null, // attributeNamespace
    511    false, // sanitizeURL
    512    false);
    513  }); // These are the few React props that we set as DOM properties
    514  // rather than attributes. These are all booleans.
    515
    516  ['checked', // Note: `option.selected` is not updated if `select.multiple` is
    517  // disabled with `removeAttribute`. We have special logic for handling this.
    518  'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,
    519  // you'll need to set attributeName to name.toLowerCase()
    520  // instead in the assignment below.
    521  ].forEach(function (name) {
    522    properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty
    523    name, // attributeName
    524    null, // attributeNamespace
    525    false, // sanitizeURL
    526    false);
    527  }); // These are HTML attributes that are "overloaded booleans": they behave like
    528  // booleans, but can also accept a string value.
    529
    530  ['capture', 'download' // NOTE: if you add a camelCased prop to this list,
    531  // you'll need to set attributeName to name.toLowerCase()
    532  // instead in the assignment below.
    533  ].forEach(function (name) {
    534    properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty
    535    name, // attributeName
    536    null, // attributeNamespace
    537    false, // sanitizeURL
    538    false);
    539  }); // These are HTML attributes that must be positive numbers.
    540
    541  ['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,
    542  // you'll need to set attributeName to name.toLowerCase()
    543  // instead in the assignment below.
    544  ].forEach(function (name) {
    545    properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty
    546    name, // attributeName
    547    null, // attributeNamespace
    548    false, // sanitizeURL
    549    false);
    550  }); // These are HTML attributes that must be numbers.
    551
    552  ['rowSpan', 'start'].forEach(function (name) {
    553    properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty
    554    name.toLowerCase(), // attributeName
    555    null, // attributeNamespace
    556    false, // sanitizeURL
    557    false);
    558  });
    559  var CAMELIZE = /[\-\:]([a-z])/g;
    560
    561  var capitalize = function (token) {
    562    return token[1].toUpperCase();
    563  }; // This is a list of all SVG attributes that need special casing, namespacing,
    564  // or boolean value assignment. Regular attributes that just accept strings
    565  // and have the same names are omitted, just like in the HTML attribute filter.
    566  // Some of these attributes can be hard to find. This list was created by
    567  // scraping the MDN documentation.
    568
    569
    570  ['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,
    571  // you'll need to set attributeName to name.toLowerCase()
    572  // instead in the assignment below.
    573  ].forEach(function (attributeName) {
    574    var name = attributeName.replace(CAMELIZE, capitalize);
    575    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    576    attributeName, null, // attributeNamespace
    577    false, // sanitizeURL
    578    false);
    579  }); // String SVG attributes with the xlink namespace.
    580
    581  ['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,
    582  // you'll need to set attributeName to name.toLowerCase()
    583  // instead in the assignment below.
    584  ].forEach(function (attributeName) {
    585    var name = attributeName.replace(CAMELIZE, capitalize);
    586    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    587    attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL
    588    false);
    589  }); // String SVG attributes with the xml namespace.
    590
    591  ['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,
    592  // you'll need to set attributeName to name.toLowerCase()
    593  // instead in the assignment below.
    594  ].forEach(function (attributeName) {
    595    var name = attributeName.replace(CAMELIZE, capitalize);
    596    properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty
    597    attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL
    598    false);
    599  }); // These attribute exists both in HTML and SVG.
    600  // The attribute name is case-sensitive in SVG so we can't just use
    601  // the React name like we do for attributes that exist only in HTML.
    602
    603  ['tabIndex', 'crossOrigin'].forEach(function (attributeName) {
    604    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
    605    attributeName.toLowerCase(), // attributeName
    606    null, // attributeNamespace
    607    false, // sanitizeURL
    608    false);
    609  }); // These attributes accept URLs. These must not allow javascript: URLS.
    610  // These will also need to accept Trusted Types object in the future.
    611
    612  var xlinkHref = 'xlinkHref';
    613  properties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty
    614  'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL
    615  false);
    616  ['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {
    617    properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty
    618    attributeName.toLowerCase(), // attributeName
    619    null, // attributeNamespace
    620    true, // sanitizeURL
    621    true);
    622  });
    623
    624  // and any newline or tab are filtered out as if they're not part of the URL.
    625  // https://url.spec.whatwg.org/#url-parsing
    626  // Tab or newline are defined as \r\n\t:
    627  // https://infra.spec.whatwg.org/#ascii-tab-or-newline
    628  // A C0 control is a code point in the range \u0000 NULL to \u001F
    629  // INFORMATION SEPARATOR ONE, inclusive:
    630  // https://infra.spec.whatwg.org/#c0-control-or-space
    631
    632  /* eslint-disable max-len */
    633
    634  var 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;
    635  var didWarn = false;
    636
    637  function sanitizeURL(url) {
    638    {
    639      if (!didWarn && isJavaScriptProtocol.test(url)) {
    640        didWarn = true;
    641
    642        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));
    643      }
    644    }
    645  }
    646
    647  /**
    648   * Get the value for a property on a node. Only used in DEV for SSR validation.
    649   * The "expected" argument is used as a hint of what the expected value is.
    650   * Some properties have multiple equivalent values.
    651   */
    652  function getValueForProperty(node, name, expected, propertyInfo) {
    653    {
    654      if (propertyInfo.mustUseProperty) {
    655        var propertyName = propertyInfo.propertyName;
    656        return node[propertyName];
    657      } else {
    658        // This check protects multiple uses of `expected`, which is why the
    659        // react-internal/safe-string-coercion rule is disabled in several spots
    660        // below.
    661        {
    662          checkAttributeStringCoercion(expected, name);
    663        }
    664
    665        if ( propertyInfo.sanitizeURL) {
    666          // If we haven't fully disabled javascript: URLs, and if
    667          // the hydration is successful of a javascript: URL, we
    668          // still want to warn on the client.
    669          // eslint-disable-next-line react-internal/safe-string-coercion
    670          sanitizeURL('' + expected);
    671        }
    672
    673        var attributeName = propertyInfo.attributeName;
    674        var stringValue = null;
    675
    676        if (propertyInfo.type === OVERLOADED_BOOLEAN) {
    677          if (node.hasAttribute(attributeName)) {
    678            var value = node.getAttribute(attributeName);
    679
    680            if (value === '') {
    681              return true;
    682            }
    683
    684            if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
    685              return value;
    686            } // eslint-disable-next-line react-internal/safe-string-coercion
    687
    688
    689            if (value === '' + expected) {
    690              return expected;
    691            }
    692
    693            return value;
    694          }
    695        } else if (node.hasAttribute(attributeName)) {
    696          if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
    697            // We had an attribute but shouldn't have had one, so read it
    698            // for the error message.
    699            return node.getAttribute(attributeName);
    700          }
    701
    702          if (propertyInfo.type === BOOLEAN) {
    703            // If this was a boolean, it doesn't matter what the value is
    704            // the fact that we have it is the same as the expected.
    705            return expected;
    706          } // Even if this property uses a namespace we use getAttribute
    707          // because we assume its namespaced name is the same as our config.
    708          // To use getAttributeNS we need the local name which we don't have
    709          // in our config atm.
    710
    711
    712          stringValue = node.getAttribute(attributeName);
    713        }
    714
    715        if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {
    716          return stringValue === null ? expected : stringValue; // eslint-disable-next-line react-internal/safe-string-coercion
    717        } else if (stringValue === '' + expected) {
    718          return expected;
    719        } else {
    720          return stringValue;
    721        }
    722      }
    723    }
    724  }
    725  /**
    726   * Get the value for a attribute on a node. Only used in DEV for SSR validation.
    727   * The third argument is used as a hint of what the expected value is. Some
    728   * attributes have multiple equivalent values.
    729   */
    730
    731  function getValueForAttribute(node, name, expected, isCustomComponentTag) {
    732    {
    733      if (!isAttributeNameSafe(name)) {
    734        return;
    735      }
    736
    737      if (!node.hasAttribute(name)) {
    738        return expected === undefined ? undefined : null;
    739      }
    740
    741      var value = node.getAttribute(name);
    742
    743      {
    744        checkAttributeStringCoercion(expected, name);
    745      }
    746
    747      if (value === '' + expected) {
    748        return expected;
    749      }
    750
    751      return value;
    752    }
    753  }
    754  /**
    755   * Sets the value for a property on a node.
    756   *
    757   * @param {DOMElement} node
    758   * @param {string} name
    759   * @param {*} value
    760   */
    761
    762  function setValueForProperty(node, name, value, isCustomComponentTag) {
    763    var propertyInfo = getPropertyInfo(name);
    764
    765    if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {
    766      return;
    767    }
    768
    769    if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {
    770      value = null;
    771    }
    772
    773
    774    if (isCustomComponentTag || propertyInfo === null) {
    775      if (isAttributeNameSafe(name)) {
    776        var _attributeName = name;
    777
    778        if (value === null) {
    779          node.removeAttribute(_attributeName);
    780        } else {
    781          {
    782            checkAttributeStringCoercion(value, name);
    783          }
    784
    785          node.setAttribute(_attributeName,  '' + value);
    786        }
    787      }
    788
    789      return;
    790    }
    791
    792    var mustUseProperty = propertyInfo.mustUseProperty;
    793
    794    if (mustUseProperty) {
    795      var propertyName = propertyInfo.propertyName;
    796
    797      if (value === null) {
    798        var type = propertyInfo.type;
    799        node[propertyName] = type === BOOLEAN ? false : '';
    800      } else {
    801        // Contrary to `setAttribute`, object properties are properly
    802        // `toString`ed by IE8/9.
    803        node[propertyName] = value;
    804      }
    805
    806      return;
    807    } // The rest are treated as attributes with special cases.
    808
    809
    810    var attributeName = propertyInfo.attributeName,
    811        attributeNamespace = propertyInfo.attributeNamespace;
    812
    813    if (value === null) {
    814      node.removeAttribute(attributeName);
    815    } else {
    816      var _type = propertyInfo.type;
    817      var attributeValue;
    818
    819      if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {
    820        // If attribute type is boolean, we know for sure it won't be an execution sink
    821        // and we won't require Trusted Type here.
    822        attributeValue = '';
    823      } else {
    824        // `setAttribute` with objects becomes only `[object]` in IE8/9,
    825        // ('' + value) makes it output the correct toString()-value.
    826        {
    827          {
    828            checkAttributeStringCoercion(value, attributeName);
    829          }
    830
    831          attributeValue = '' + value;
    832        }
    833
    834        if (propertyInfo.sanitizeURL) {
    835          sanitizeURL(attributeValue.toString());
    836        }
    837      }
    838
    839      if (attributeNamespace) {
    840        node.setAttributeNS(attributeNamespace, attributeName, attributeValue);
    841      } else {
    842        node.setAttribute(attributeName, attributeValue);
    843      }
    844    }
    845  }
    846
    847  // ATTENTION
    848  // When adding new symbols to this file,
    849  // Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
    850  // The Symbol used to tag the ReactElement-like types.
    851  var REACT_ELEMENT_TYPE = Symbol.for('react.element');
    852  var REACT_PORTAL_TYPE = Symbol.for('react.portal');
    853  var REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
    854  var REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
    855  var REACT_PROFILER_TYPE = Symbol.for('react.profiler');
    856  var REACT_PROVIDER_TYPE = Symbol.for('react.provider');
    857  var REACT_CONTEXT_TYPE = Symbol.for('react.context');
    858  var REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
    859  var REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
    860  var REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
    861  var REACT_MEMO_TYPE = Symbol.for('react.memo');
    862  var REACT_LAZY_TYPE = Symbol.for('react.lazy');
    863  var REACT_SCOPE_TYPE = Symbol.for('react.scope');
    864  var REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
    865  var REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
    866  var REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
    867  var REACT_CACHE_TYPE = Symbol.for('react.cache');
    868  var REACT_TRACING_MARKER_TYPE = Symbol.for('react.tracing_marker');
    869  var MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
    870  var FAUX_ITERATOR_SYMBOL = '@@iterator';
    871  function getIteratorFn(maybeIterable) {
    872    if (maybeIterable === null || typeof maybeIterable !== 'object') {
    873      return null;
    874    }
    875
    876    var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];
    877
    878    if (typeof maybeIterator === 'function') {
    879      return maybeIterator;
    880    }
    881
    882    return null;
    883  }
    884
    885  var assign = Object.assign;
    886
    887  // Helpers to patch console.logs to avoid logging during side-effect free
    888  // replaying on render function. This currently only patches the object
    889  // lazily which won't cover if the log function was extracted eagerly.
    890  // We could also eagerly patch the method.
    891  var disabledDepth = 0;
    892  var prevLog;
    893  var prevInfo;
    894  var prevWarn;
    895  var prevError;
    896  var prevGroup;
    897  var prevGroupCollapsed;
    898  var prevGroupEnd;
    899
    900  function disabledLog() {}
    901
    902  disabledLog.__reactDisabledLog = true;
    903  function disableLogs() {
    904    {
    905      if (disabledDepth === 0) {
    906        /* eslint-disable react-internal/no-production-logging */
    907        prevLog = console.log;
    908        prevInfo = console.info;
    909        prevWarn = console.warn;
    910        prevError = console.error;
    911        prevGroup = console.group;
    912        prevGroupCollapsed = console.groupCollapsed;
    913        prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099
    914
    915        var props = {
    916          configurable: true,
    917          enumerable: true,
    918          value: disabledLog,
    919          writable: true
    920        }; // $FlowFixMe Flow thinks console is immutable.
    921
    922        Object.defineProperties(console, {
    923          info: props,
    924          log: props,
    925          warn: props,
    926          error: props,
    927          group: props,
    928          groupCollapsed: props,
    929          groupEnd: props
    930        });
    931        /* eslint-enable react-internal/no-production-logging */
    932      }
    933
    934      disabledDepth++;
    935    }
    936  }
    937  function reenableLogs() {
    938    {
    939      disabledDepth--;
    940
    941      if (disabledDepth === 0) {
    942        /* eslint-disable react-internal/no-production-logging */
    943        var props = {
    944          configurable: true,
    945          enumerable: true,
    946          writable: true
    947        }; // $FlowFixMe Flow thinks console is immutable.
    948
    949        Object.defineProperties(console, {
    950          log: assign({}, props, {
    951            value: prevLog
    952          }),
    953          info: assign({}, props, {
    954            value: prevInfo
    955          }),
    956          warn: assign({}, props, {
    957            value: prevWarn
    958          }),
    959          error: assign({}, props, {
    960            value: prevError
    961          }),
    962          group: assign({}, props, {
    963            value: prevGroup
    964          }),
    965          groupCollapsed: assign({}, props, {
    966            value: prevGroupCollapsed
    967          }),
    968          groupEnd: assign({}, props, {
    969            value: prevGroupEnd
    970          })
    971        });
    972        /* eslint-enable react-internal/no-production-logging */
    973      }
    974
    975      if (disabledDepth < 0) {
    976        error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');
    977      }
    978    }
    979  }
    980
    981  var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
    982  var prefix;
    983  function describeBuiltInComponentFrame(name, source, ownerFn) {
    984    {
    985      if (prefix === undefined) {
    986        // Extract the VM specific prefix used by each line.
    987        try {
    988          throw Error();
    989        } catch (x) {
    990          var match = x.stack.trim().match(/\n( *(at )?)/);
    991          prefix = match && match[1] || '';
    992        }
    993      } // We use the prefix to ensure our stacks line up with native stack frames.
    994
    995
    996      return '\n' + prefix + name;
    997    }
    998  }
    999  var reentry = false;
   1000  var componentFrameCache;
   1001
   1002  {
   1003    var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;
   1004    componentFrameCache = new PossiblyWeakMap();
   1005  }
   1006
   1007  function describeNativeComponentFrame(fn, construct) {
   1008    // If something asked for a stack inside a fake render, it should get ignored.
   1009    if ( !fn || reentry) {
   1010      return '';
   1011    }
   1012
   1013    {
   1014      var frame = componentFrameCache.get(fn);
   1015
   1016      if (frame !== undefined) {
   1017        return frame;
   1018      }
   1019    }
   1020
   1021    var control;
   1022    reentry = true;
   1023    var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.
   1024
   1025    Error.prepareStackTrace = undefined;
   1026    var previousDispatcher;
   1027
   1028    {
   1029      previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function
   1030      // for warnings.
   1031
   1032      ReactCurrentDispatcher.current = null;
   1033      disableLogs();
   1034    }
   1035
   1036    try {
   1037      // This should throw.
   1038      if (construct) {
   1039        // Something should be setting the props in the constructor.
   1040        var Fake = function () {
   1041          throw Error();
   1042        }; // $FlowFixMe
   1043
   1044
   1045        Object.defineProperty(Fake.prototype, 'props', {
   1046          set: function () {
   1047            // We use a throwing setter instead of frozen or non-writable props
   1048            // because that won't throw in a non-strict mode function.
   1049            throw Error();
   1050          }
   1051        });
   1052
   1053        if (typeof Reflect === 'object' && Reflect.construct) {
   1054          // We construct a different control for this case to include any extra
   1055          // frames added by the construct call.
   1056          try {
   1057            Reflect.construct(Fake, []);
   1058          } catch (x) {
   1059            control = x;
   1060          }
   1061
   1062          Reflect.construct(fn, [], Fake);
   1063        } else {
   1064          try {
   1065            Fake.call();
   1066          } catch (x) {
   1067            control = x;
   1068          }
   1069
   1070          fn.call(Fake.prototype);
   1071        }
   1072      } else {
   1073        try {
   1074          throw Error();
   1075        } catch (x) {
   1076          control = x;
   1077        }
   1078
   1079        fn();
   1080      }
   1081    } catch (sample) {
   1082      // This is inlined manually because closure doesn't do it for us.
   1083      if (sample && control && typeof sample.stack === 'string') {
   1084        // This extracts the first frame from the sample that isn't also in the control.
   1085        // Skipping one frame that we assume is the frame that calls the two.
   1086        var sampleLines = sample.stack.split('\n');
   1087        var controlLines = control.stack.split('\n');
   1088        var s = sampleLines.length - 1;
   1089        var c = controlLines.length - 1;
   1090
   1091        while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {
   1092          // We expect at least one stack frame to be shared.
   1093          // Typically this will be the root most one. However, stack frames may be
   1094          // cut off due to maximum stack limits. In this case, one maybe cut off
   1095          // earlier than the other. We assume that the sample is longer or the same
   1096          // and there for cut off earlier. So we should find the root most frame in
   1097          // the sample somewhere in the control.
   1098          c--;
   1099        }
   1100
   1101        for (; s >= 1 && c >= 0; s--, c--) {
   1102          // Next we find the first one that isn't the same which should be the
   1103          // frame that called our sample function and the control.
   1104          if (sampleLines[s] !== controlLines[c]) {
   1105            // In V8, the first line is describing the message but other VMs don't.
   1106            // If we're about to return the first line, and the control is also on the same
   1107            // line, that's a pretty good indicator that our sample threw at same line as
   1108            // the control. I.e. before we entered the sample frame. So we ignore this result.
   1109            // This can happen if you passed a class to function component, or non-function.
   1110            if (s !== 1 || c !== 1) {
   1111              do {
   1112                s--;
   1113                c--; // We may still have similar intermediate frames from the construct call.
   1114                // The next one that isn't the same should be our match though.
   1115
   1116                if (c < 0 || sampleLines[s] !== controlLines[c]) {
   1117                  // V8 adds a "new" prefix for native classes. Let's remove it to make it prettier.
   1118                  var _frame = '\n' + sampleLines[s].replace(' at new ', ' at '); // If our component frame is labeled "<anonymous>"
   1119                  // but we have a user-provided "displayName"
   1120                  // splice it in to make the stack more readable.
   1121
   1122
   1123                  if (fn.displayName && _frame.includes('<anonymous>')) {
   1124                    _frame = _frame.replace('<anonymous>', fn.displayName);
   1125                  }
   1126
   1127                  {
   1128                    if (typeof fn === 'function') {
   1129                      componentFrameCache.set(fn, _frame);
   1130                    }
   1131                  } // Return the line we found.
   1132
   1133
   1134                  return _frame;
   1135                }
   1136              } while (s >= 1 && c >= 0);
   1137            }
   1138
   1139            break;
   1140          }
   1141        }
   1142      }
   1143    } finally {
   1144      reentry = false;
   1145
   1146      {
   1147        ReactCurrentDispatcher.current = previousDispatcher;
   1148        reenableLogs();
   1149      }
   1150
   1151      Error.prepareStackTrace = previousPrepareStackTrace;
   1152    } // Fallback to just using the name if we couldn't make it throw.
   1153
   1154
   1155    var name = fn ? fn.displayName || fn.name : '';
   1156    var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';
   1157
   1158    {
   1159      if (typeof fn === 'function') {
   1160        componentFrameCache.set(fn, syntheticFrame);
   1161      }
   1162    }
   1163
   1164    return syntheticFrame;
   1165  }
   1166
   1167  function describeClassComponentFrame(ctor, source, ownerFn) {
   1168    {
   1169      return describeNativeComponentFrame(ctor, true);
   1170    }
   1171  }
   1172  function describeFunctionComponentFrame(fn, source, ownerFn) {
   1173    {
   1174      return describeNativeComponentFrame(fn, false);
   1175    }
   1176  }
   1177
   1178  function shouldConstruct(Component) {
   1179    var prototype = Component.prototype;
   1180    return !!(prototype && prototype.isReactComponent);
   1181  }
   1182
   1183  function describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {
   1184
   1185    if (type == null) {
   1186      return '';
   1187    }
   1188
   1189    if (typeof type === 'function') {
   1190      {
   1191        return describeNativeComponentFrame(type, shouldConstruct(type));
   1192      }
   1193    }
   1194
   1195    if (typeof type === 'string') {
   1196      return describeBuiltInComponentFrame(type);
   1197    }
   1198
   1199    switch (type) {
   1200      case REACT_SUSPENSE_TYPE:
   1201        return describeBuiltInComponentFrame('Suspense');
   1202
   1203      case REACT_SUSPENSE_LIST_TYPE:
   1204        return describeBuiltInComponentFrame('SuspenseList');
   1205    }
   1206
   1207    if (typeof type === 'object') {
   1208      switch (type.$$typeof) {
   1209        case REACT_FORWARD_REF_TYPE:
   1210          return describeFunctionComponentFrame(type.render);
   1211
   1212        case REACT_MEMO_TYPE:
   1213          // Memo may contain any component type so we recursively resolve it.
   1214          return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);
   1215
   1216        case REACT_LAZY_TYPE:
   1217          {
   1218            var lazyComponent = type;
   1219            var payload = lazyComponent._payload;
   1220            var init = lazyComponent._init;
   1221
   1222            try {
   1223              // Lazy may contain any component type so we recursively resolve it.
   1224              return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);
   1225            } catch (x) {}
   1226          }
   1227      }
   1228    }
   1229
   1230    return '';
   1231  }
   1232
   1233  function describeFiber(fiber) {
   1234    var owner =  fiber._debugOwner ? fiber._debugOwner.type : null ;
   1235    var source =  fiber._debugSource ;
   1236
   1237    switch (fiber.tag) {
   1238      case HostComponent:
   1239        return describeBuiltInComponentFrame(fiber.type);
   1240
   1241      case LazyComponent:
   1242        return describeBuiltInComponentFrame('Lazy');
   1243
   1244      case SuspenseComponent:
   1245        return describeBuiltInComponentFrame('Suspense');
   1246
   1247      case SuspenseListComponent:
   1248        return describeBuiltInComponentFrame('SuspenseList');
   1249
   1250      case FunctionComponent:
   1251      case IndeterminateComponent:
   1252      case SimpleMemoComponent:
   1253        return describeFunctionComponentFrame(fiber.type);
   1254
   1255      case ForwardRef:
   1256        return describeFunctionComponentFrame(fiber.type.render);
   1257
   1258      case ClassComponent:
   1259        return describeClassComponentFrame(fiber.type);
   1260
   1261      default:
   1262        return '';
   1263    }
   1264  }
   1265
   1266  function getStackByFiberInDevAndProd(workInProgress) {
   1267    try {
   1268      var info = '';
   1269      var node = workInProgress;
   1270
   1271      do {
   1272        info += describeFiber(node);
   1273        node = node.return;
   1274      } while (node);
   1275
   1276      return info;
   1277    } catch (x) {
   1278      return '\nError generating stack: ' + x.message + '\n' + x.stack;
   1279    }
   1280  }
   1281
   1282  function getWrappedName(outerType, innerType, wrapperName) {
   1283    var displayName = outerType.displayName;
   1284
   1285    if (displayName) {
   1286      return displayName;
   1287    }
   1288
   1289    var functionName = innerType.displayName || innerType.name || '';
   1290    return functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName;
   1291  } // Keep in sync with react-reconciler/getComponentNameFromFiber
   1292
   1293
   1294  function getContextName(type) {
   1295    return type.displayName || 'Context';
   1296  } // Note that the reconciler package should generally prefer to use getComponentNameFromFiber() instead.
   1297
   1298
   1299  function getComponentNameFromType(type) {
   1300    if (type == null) {
   1301      // Host root, text node or just invalid type.
   1302      return null;
   1303    }
   1304
   1305    {
   1306      if (typeof type.tag === 'number') {
   1307        error('Received an unexpected object in getComponentNameFromType(). ' + 'This is likely a bug in React. Please file an issue.');
   1308      }
   1309    }
   1310
   1311    if (typeof type === 'function') {
   1312      return type.displayName || type.name || null;
   1313    }
   1314
   1315    if (typeof type === 'string') {
   1316      return type;
   1317    }
   1318
   1319    switch (type) {
   1320      case REACT_FRAGMENT_TYPE:
   1321        return 'Fragment';
   1322
   1323      case REACT_PORTAL_TYPE:
   1324        return 'Portal';
   1325
   1326      case REACT_PROFILER_TYPE:
   1327        return 'Profiler';
   1328
   1329      case REACT_STRICT_MODE_TYPE:
   1330        return 'StrictMode';
   1331
   1332      case REACT_SUSPENSE_TYPE:
   1333        return 'Suspense';
   1334
   1335      case REACT_SUSPENSE_LIST_TYPE:
   1336        return 'SuspenseList';
   1337
   1338    }
   1339
   1340    if (typeof type === 'object') {
   1341      switch (type.$$typeof) {
   1342        case REACT_CONTEXT_TYPE:
   1343          var context = type;
   1344          return getContextName(context) + '.Consumer';
   1345
   1346        case REACT_PROVIDER_TYPE:
   1347          var provider = type;
   1348          return getContextName(provider._context) + '.Provider';
   1349
   1350        case REACT_FORWARD_REF_TYPE:
   1351          return getWrappedName(type, type.render, 'ForwardRef');
   1352
   1353        case REACT_MEMO_TYPE:
   1354          var outerName = type.displayName || null;
   1355
   1356          if (outerName !== null) {
   1357            return outerName;
   1358          }
   1359
   1360          return getComponentNameFromType(type.type) || 'Memo';
   1361
   1362        case REACT_LAZY_TYPE:
   1363          {
   1364            var lazyComponent = type;
   1365            var payload = lazyComponent._payload;
   1366            var init = lazyComponent._init;
   1367
   1368            try {
   1369              return getComponentNameFromType(init(payload));
   1370            } catch (x) {
   1371              return null;
   1372            }
   1373          }
   1374
   1375        // eslint-disable-next-line no-fallthrough
   1376      }
   1377    }
   1378
   1379    return null;
   1380  }
   1381
   1382  function getWrappedName$1(outerType, innerType, wrapperName) {
   1383    var functionName = innerType.displayName || innerType.name || '';
   1384    return outerType.displayName || (functionName !== '' ? wrapperName + "(" + functionName + ")" : wrapperName);
   1385  } // Keep in sync with shared/getComponentNameFromType
   1386
   1387
   1388  function getContextName$1(type) {
   1389    return type.displayName || 'Context';
   1390  }
   1391
   1392  function getComponentNameFromFiber(fiber) {
   1393    var tag = fiber.tag,
   1394        type = fiber.type;
   1395
   1396    switch (tag) {
   1397      case CacheComponent:
   1398        return 'Cache';
   1399
   1400      case ContextConsumer:
   1401        var context = type;
   1402        return getContextName$1(context) + '.Consumer';
   1403
   1404      case ContextProvider:
   1405        var provider = type;
   1406        return getContextName$1(provider._context) + '.Provider';
   1407
   1408      case DehydratedFragment:
   1409        return 'DehydratedFragment';
   1410
   1411      case ForwardRef:
   1412        return getWrappedName$1(type, type.render, 'ForwardRef');
   1413
   1414      case Fragment:
   1415        return 'Fragment';
   1416
   1417      case HostComponent:
   1418        // Host component type is the display name (e.g. "div", "View")
   1419        return type;
   1420
   1421      case HostPortal:
   1422        return 'Portal';
   1423
   1424      case HostRoot:
   1425        return 'Root';
   1426
   1427      case HostText:
   1428        return 'Text';
   1429
   1430      case LazyComponent:
   1431        // Name comes from the type in this case; we don't have a tag.
   1432        return getComponentNameFromType(type);
   1433
   1434      case Mode:
   1435        if (type === REACT_STRICT_MODE_TYPE) {
   1436          // Don't be less specific than shared/getComponentNameFromType
   1437          return 'StrictMode';
   1438        }
   1439
   1440        return 'Mode';
   1441
   1442      case OffscreenComponent:
   1443        return 'Offscreen';
   1444
   1445      case Profiler:
   1446        return 'Profiler';
   1447
   1448      case ScopeComponent:
   1449        return 'Scope';
   1450
   1451      case SuspenseComponent:
   1452        return 'Suspense';
   1453
   1454      case SuspenseListComponent:
   1455        return 'SuspenseList';
   1456
   1457      case TracingMarkerComponent:
   1458        return 'TracingMarker';
   1459      // The display name for this tags come from the user-provided type:
   1460
   1461      case ClassComponent:
   1462      case FunctionComponent:
   1463      case IncompleteClassComponent:
   1464      case IndeterminateComponent:
   1465      case MemoComponent:
   1466      case SimpleMemoComponent:
   1467        if (typeof type === 'function') {
   1468          return type.displayName || type.name || null;
   1469        }
   1470
   1471        if (typeof type === 'string') {
   1472          return type;
   1473        }
   1474
   1475        break;
   1476
   1477    }
   1478
   1479    return null;
   1480  }
   1481
   1482  var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;
   1483  var current = null;
   1484  var isRendering = false;
   1485  function getCurrentFiberOwnerNameInDevOrNull() {
   1486    {
   1487      if (current === null) {
   1488        return null;
   1489      }
   1490
   1491      var owner = current._debugOwner;
   1492
   1493      if (owner !== null && typeof owner !== 'undefined') {
   1494        return getComponentNameFromFiber(owner);
   1495      }
   1496    }
   1497
   1498    return null;
   1499  }
   1500
   1501  function getCurrentFiberStackInDev() {
   1502    {
   1503      if (current === null) {
   1504        return '';
   1505      } // Safe because if current fiber exists, we are reconciling,
   1506      // and it is guaranteed to be the work-in-progress version.
   1507
   1508
   1509      return getStackByFiberInDevAndProd(current);
   1510    }
   1511  }
   1512
   1513  function resetCurrentFiber() {
   1514    {
   1515      ReactDebugCurrentFrame.getCurrentStack = null;
   1516      current = null;
   1517      isRendering = false;
   1518    }
   1519  }
   1520  function setCurrentFiber(fiber) {
   1521    {
   1522      ReactDebugCurrentFrame.getCurrentStack = fiber === null ? null : getCurrentFiberStackInDev;
   1523      current = fiber;
   1524      isRendering = false;
   1525    }
   1526  }
   1527  function getCurrentFiber() {
   1528    {
   1529      return current;
   1530    }
   1531  }
   1532  function setIsRendering(rendering) {
   1533    {
   1534      isRendering = rendering;
   1535    }
   1536  }
   1537
   1538  // Flow does not allow string concatenation of most non-string types. To work
   1539  // around this limitation, we use an opaque type that can only be obtained by
   1540  // passing the value through getToStringValue first.
   1541  function toString(value) {
   1542    // The coercion safety check is performed in getToStringValue().
   1543    // eslint-disable-next-line react-internal/safe-string-coercion
   1544    return '' + value;
   1545  }
   1546  function getToStringValue(value) {
   1547    switch (typeof value) {
   1548      case 'boolean':
   1549      case 'number':
   1550      case 'string':
   1551      case 'undefined':
   1552        return value;
   1553
   1554      case 'object':
   1555        {
   1556          checkFormFieldValueStringCoercion(value);
   1557        }
   1558
   1559        return value;
   1560
   1561      default:
   1562        // function, symbol are assigned as empty strings
   1563        return '';
   1564    }
   1565  }
   1566
   1567  var hasReadOnlyValue = {
   1568    button: true,
   1569    checkbox: true,
   1570    image: true,
   1571    hidden: true,
   1572    radio: true,
   1573    reset: true,
   1574    submit: true
   1575  };
   1576  function checkControlledValueProps(tagName, props) {
   1577    {
   1578      if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {
   1579        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`.');
   1580      }
   1581
   1582      if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {
   1583        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`.');
   1584      }
   1585    }
   1586  }
   1587
   1588  function isCheckable(elem) {
   1589    var type = elem.type;
   1590    var nodeName = elem.nodeName;
   1591    return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');
   1592  }
   1593
   1594  function getTracker(node) {
   1595    return node._valueTracker;
   1596  }
   1597
   1598  function detachTracker(node) {
   1599    node._valueTracker = null;
   1600  }
   1601
   1602  function getValueFromNode(node) {
   1603    var value = '';
   1604
   1605    if (!node) {
   1606      return value;
   1607    }
   1608
   1609    if (isCheckable(node)) {
   1610      value = node.checked ? 'true' : 'false';
   1611    } else {
   1612      value = node.value;
   1613    }
   1614
   1615    return value;
   1616  }
   1617
   1618  function trackValueOnNode(node) {
   1619    var valueField = isCheckable(node) ? 'checked' : 'value';
   1620    var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
   1621
   1622    {
   1623      checkFormFieldValueStringCoercion(node[valueField]);
   1624    }
   1625
   1626    var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail
   1627    // and don't track value will cause over reporting of changes,
   1628    // but it's better then a hard failure
   1629    // (needed for certain tests that spyOn input values and Safari)
   1630
   1631    if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
   1632      return;
   1633    }
   1634
   1635    var get = descriptor.get,
   1636        set = descriptor.set;
   1637    Object.defineProperty(node, valueField, {
   1638      configurable: true,
   1639      get: function () {
   1640        return get.call(this);
   1641      },
   1642      set: function (value) {
   1643        {
   1644          checkFormFieldValueStringCoercion(value);
   1645        }
   1646
   1647        currentValue = '' + value;
   1648        set.call(this, value);
   1649      }
   1650    }); // We could've passed this the first time
   1651    // but it triggers a bug in IE11 and Edge 14/15.
   1652    // Calling defineProperty() again should be equivalent.
   1653    // https://github.com/facebook/react/issues/11768
   1654
   1655    Object.defineProperty(node, valueField, {
   1656      enumerable: descriptor.enumerable
   1657    });
   1658    var tracker = {
   1659      getValue: function () {
   1660        return currentValue;
   1661      },
   1662      setValue: function (value) {
   1663        {
   1664          checkFormFieldValueStringCoercion(value);
   1665        }
   1666
   1667        currentValue = '' + value;
   1668      },
   1669      stopTracking: function () {
   1670        detachTracker(node);
   1671        delete node[valueField];
   1672      }
   1673    };
   1674    return tracker;
   1675  }
   1676
   1677  function track(node) {
   1678    if (getTracker(node)) {
   1679      return;
   1680    } // TODO: Once it's just Fiber we can move this to node._wrapperState
   1681
   1682
   1683    node._valueTracker = trackValueOnNode(node);
   1684  }
   1685  function updateValueIfChanged(node) {
   1686    if (!node) {
   1687      return false;
   1688    }
   1689
   1690    var tracker = getTracker(node); // if there is no tracker at this point it's unlikely
   1691    // that trying again will succeed
   1692
   1693    if (!tracker) {
   1694      return true;
   1695    }
   1696
   1697    var lastValue = tracker.getValue();
   1698    var nextValue = getValueFromNode(node);
   1699
   1700    if (nextValue !== lastValue) {
   1701      tracker.setValue(nextValue);
   1702      return true;
   1703    }
   1704
   1705    return false;
   1706  }
   1707
   1708  function getActiveElement(doc) {
   1709    doc = doc || (typeof document !== 'undefined' ? document : undefined);
   1710
   1711    if (typeof doc === 'undefined') {
   1712      return null;
   1713    }
   1714
   1715    try {
   1716      return doc.activeElement || doc.body;
   1717    } catch (e) {
   1718      return doc.body;
   1719    }
   1720  }
   1721
   1722  var didWarnValueDefaultValue = false;
   1723  var didWarnCheckedDefaultChecked = false;
   1724  var didWarnControlledToUncontrolled = false;
   1725  var didWarnUncontrolledToControlled = false;
   1726
   1727  function isControlled(props) {
   1728    var usesChecked = props.type === 'checkbox' || props.type === 'radio';
   1729    return usesChecked ? props.checked != null : props.value != null;
   1730  }
   1731  /**
   1732   * Implements an <input> host component that allows setting these optional
   1733   * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
   1734   *
   1735   * If `checked` or `value` are not supplied (or null/undefined), user actions
   1736   * that affect the checked state or value will trigger updates to the element.
   1737   *
   1738   * If they are supplied (and not null/undefined), the rendered element will not
   1739   * trigger updates to the element. Instead, the props must change in order for
   1740   * the rendered element to be updated.
   1741   *
   1742   * The rendered element will be initialized as unchecked (or `defaultChecked`)
   1743   * with an empty value (or `defaultValue`).
   1744   *
   1745   * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
   1746   */
   1747
   1748
   1749  function getHostProps(element, props) {
   1750    var node = element;
   1751    var checked = props.checked;
   1752    var hostProps = assign({}, props, {
   1753      defaultChecked: undefined,
   1754      defaultValue: undefined,
   1755      value: undefined,
   1756      checked: checked != null ? checked : node._wrapperState.initialChecked
   1757    });
   1758    return hostProps;
   1759  }
   1760  function initWrapperState(element, props) {
   1761    {
   1762      checkControlledValueProps('input', props);
   1763
   1764      if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {
   1765        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://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
   1766
   1767        didWarnCheckedDefaultChecked = true;
   1768      }
   1769
   1770      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {
   1771        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://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);
   1772
   1773        didWarnValueDefaultValue = true;
   1774      }
   1775    }
   1776
   1777    var node = element;
   1778    var defaultValue = props.defaultValue == null ? '' : props.defaultValue;
   1779    node._wrapperState = {
   1780      initialChecked: props.checked != null ? props.checked : props.defaultChecked,
   1781      initialValue: getToStringValue(props.value != null ? props.value : defaultValue),
   1782      controlled: isControlled(props)
   1783    };
   1784  }
   1785  function updateChecked(element, props) {
   1786    var node = element;
   1787    var checked = props.checked;
   1788
   1789    if (checked != null) {
   1790      setValueForProperty(node, 'checked', checked, false);
   1791    }
   1792  }
   1793  function updateWrapper(element, props) {
   1794    var node = element;
   1795
   1796    {
   1797      var controlled = isControlled(props);
   1798
   1799      if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {
   1800        error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
   1801
   1802        didWarnUncontrolledToControlled = true;
   1803      }
   1804
   1805      if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {
   1806        error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');
   1807
   1808        didWarnControlledToUncontrolled = true;
   1809      }
   1810    }
   1811
   1812    updateChecked(element, props);
   1813    var value = getToStringValue(props.value);
   1814    var type = props.type;
   1815
   1816    if (value != null) {
   1817      if (type === 'number') {
   1818        if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.
   1819        // eslint-disable-next-line
   1820        node.value != value) {
   1821          node.value = toString(value);
   1822        }
   1823      } else if (node.value !== toString(value)) {
   1824        node.value = toString(value);
   1825      }
   1826    } else if (type === 'submit' || type === 'reset') {
   1827      // Submit/reset inputs need the attribute removed completely to avoid
   1828      // blank-text buttons.
   1829      node.removeAttribute('value');
   1830      return;
   1831    }
   1832
   1833    {
   1834      // When syncing the value attribute, the value comes from a cascade of
   1835      // properties:
   1836      //  1. The value React property
   1837      //  2. The defaultValue React property
   1838      //  3. Otherwise there should be no change
   1839      if (props.hasOwnProperty('value')) {
   1840        setDefaultValue(node, props.type, value);
   1841      } else if (props.hasOwnProperty('defaultValue')) {
   1842        setDefaultValue(node, props.type, getToStringValue(props.defaultValue));
   1843      }
   1844    }
   1845
   1846    {
   1847      // When syncing the checked attribute, it only changes when it needs
   1848      // to be removed, such as transitioning from a checkbox into a text input
   1849      if (props.checked == null && props.defaultChecked != null) {
   1850        node.defaultChecked = !!props.defaultChecked;
   1851      }
   1852    }
   1853  }
   1854  function postMountWrapper(element, props, isHydrating) {
   1855    var node = element; // Do not assign value if it is already set. This prevents user text input
   1856    // from being lost during SSR hydration.
   1857
   1858    if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {
   1859      var type = props.type;
   1860      var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the
   1861      // default value provided by the browser. See: #12872
   1862
   1863      if (isButton && (props.value === undefined || props.value === null)) {
   1864        return;
   1865      }
   1866
   1867      var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input
   1868      // from being lost during SSR hydration.
   1869
   1870      if (!isHydrating) {
   1871        {
   1872          // When syncing the value attribute, the value property should use
   1873          // the wrapperState._initialValue property. This uses:
   1874          //
   1875          //   1. The value React property when present
   1876          //   2. The defaultValue React property when present
   1877          //   3. An empty string
   1878          if (initialValue !== node.value) {
   1879            node.value = initialValue;
   1880          }
   1881        }
   1882      }
   1883
   1884      {
   1885        // Otherwise, the value attribute is synchronized to the property,
   1886        // so we assign defaultValue to the same thing as the value property
   1887        // assignment step above.
   1888        node.defaultValue = initialValue;
   1889      }
   1890    } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
   1891    // this is needed to work around a chrome bug where setting defaultChecked
   1892    // will sometimes influence the value of checked (even after detachment).
   1893    // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
   1894    // We need to temporarily unset name to avoid disrupting radio button groups.
   1895
   1896
   1897    var name = node.name;
   1898
   1899    if (name !== '') {
   1900      node.name = '';
   1901    }
   1902
   1903    {
   1904      // When syncing the checked attribute, both the checked property and
   1905      // attribute are assigned at the same time using defaultChecked. This uses:
   1906      //
   1907      //   1. The checked React property when present
   1908      //   2. The defaultChecked React property when present
   1909      //   3. Otherwise, false
   1910      node.defaultChecked = !node.defaultChecked;
   1911      node.defaultChecked = !!node._wrapperState.initialChecked;
   1912    }
   1913
   1914    if (name !== '') {
   1915      node.name = name;
   1916    }
   1917  }
   1918  function restoreControlledState(element, props) {
   1919    var node = element;
   1920    updateWrapper(node, props);
   1921    updateNamedCousins(node, props);
   1922  }
   1923
   1924  function updateNamedCousins(rootNode, props) {
   1925    var name = props.name;
   1926
   1927    if (props.type === 'radio' && name != null) {
   1928      var queryRoot = rootNode;
   1929
   1930      while (queryRoot.parentNode) {
   1931        queryRoot = queryRoot.parentNode;
   1932      } // If `rootNode.form` was non-null, then we could try `form.elements`,
   1933      // but that sometimes behaves strangely in IE8. We could also try using
   1934      // `form.getElementsByName`, but that will only return direct children
   1935      // and won't include inputs that use the HTML5 `form=` attribute. Since
   1936      // the input might not even be in a form. It might not even be in the
   1937      // document. Let's just use the local `querySelectorAll` to ensure we don't
   1938      // miss anything.
   1939
   1940
   1941      {
   1942        checkAttributeStringCoercion(name, 'name');
   1943      }
   1944
   1945      var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type="radio"]');
   1946
   1947      for (var i = 0; i < group.length; i++) {
   1948        var otherNode = group[i];
   1949
   1950        if (otherNode === rootNode || otherNode.form !== rootNode.form) {
   1951          continue;
   1952        } // This will throw if radio buttons rendered by different copies of React
   1953        // and the same name are rendered into the same form (same as #1939).
   1954        // That's probably okay; we don't support it just as we don't support
   1955        // mixing React radio buttons with non-React ones.
   1956
   1957
   1958        var otherProps = getFiberCurrentPropsFromNode(otherNode);
   1959
   1960        if (!otherProps) {
   1961          throw new Error('ReactDOMInput: Mixing React and non-React radio inputs with the ' + 'same `name` is not supported.');
   1962        } // We need update the tracked value on the named cousin since the value
   1963        // was changed but the input saw no event or value set
   1964
   1965
   1966        updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that
   1967        // was previously checked to update will cause it to be come re-checked
   1968        // as appropriate.
   1969
   1970        updateWrapper(otherNode, otherProps);
   1971      }
   1972    }
   1973  } // In Chrome, assigning defaultValue to certain input types triggers input validation.
   1974  // For number inputs, the display value loses trailing decimal points. For email inputs,
   1975  // Chrome raises "The specified value <x> is not a valid email address".
   1976  //
   1977  // Here we check to see if the defaultValue has actually changed, avoiding these problems
   1978  // when the user is inputting text
   1979  //
   1980  // https://github.com/facebook/react/issues/7253
   1981
   1982
   1983  function setDefaultValue(node, type, value) {
   1984    if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js
   1985    type !== 'number' || getActiveElement(node.ownerDocument) !== node) {
   1986      if (value == null) {
   1987        node.defaultValue = toString(node._wrapperState.initialValue);
   1988      } else if (node.defaultValue !== toString(value)) {
   1989        node.defaultValue = toString(value);
   1990      }
   1991    }
   1992  }
   1993
   1994  var didWarnSelectedSetOnOption = false;
   1995  var didWarnInvalidChild = false;
   1996  var didWarnInvalidInnerHTML = false;
   1997  /**
   1998   * Implements an <option> host component that warns when `selected` is set.
   1999   */
   2000
   2001  function validateProps(element, props) {
   2002    {
   2003      // If a value is not provided, then the children must be simple.
   2004      if (props.value == null) {
   2005        if (typeof props.children === 'object' && props.children !== null) {
   2006          React.Children.forEach(props.children, function (child) {
   2007            if (child == null) {
   2008              return;
   2009            }
   2010
   2011            if (typeof child === 'string' || typeof child === 'number') {
   2012              return;
   2013            }
   2014
   2015            if (!didWarnInvalidChild) {
   2016              didWarnInvalidChild = true;
   2017
   2018              error('Cannot infer the option value of complex children. ' + 'Pass a `value` prop or use a plain string as children to <option>.');
   2019            }
   2020          });
   2021        } else if (props.dangerouslySetInnerHTML != null) {
   2022          if (!didWarnInvalidInnerHTML) {
   2023            didWarnInvalidInnerHTML = true;
   2024
   2025            error('Pass a `value` prop if you set dangerouslyInnerHTML so React knows ' + 'which value should be selected.');
   2026          }
   2027        }
   2028      } // TODO: Remove support for `selected` in <option>.
   2029
   2030
   2031      if (props.selected != null && !didWarnSelectedSetOnOption) {
   2032        error('Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');
   2033
   2034        didWarnSelectedSetOnOption = true;
   2035      }
   2036    }
   2037  }
   2038  function postMountWrapper$1(element, props) {
   2039    // value="" should make a value attribute (#6219)
   2040    if (props.value != null) {
   2041      element.setAttribute('value', toString(getToStringValue(props.value)));
   2042    }
   2043  }
   2044
   2045  var isArrayImpl = Array.isArray; // eslint-disable-next-line no-redeclare
   2046
   2047  function isArray(a) {
   2048    return isArrayImpl(a);
   2049  }
   2050
   2051  var didWarnValueDefaultValue$1;
   2052
   2053  {
   2054    didWarnValueDefaultValue$1 = false;
   2055  }
   2056
   2057  function getDeclarationErrorAddendum() {
   2058    var ownerName = getCurrentFiberOwnerNameInDevOrNull();
   2059
   2060    if (ownerName) {
   2061      return '\n\nCheck the render method of `' + ownerName + '`.';
   2062    }
   2063
   2064    return '';
   2065  }
   2066
   2067  var valuePropNames = ['value', 'defaultValue'];
   2068  /**
   2069   * Validation function for `value` and `defaultValue`.
   2070   */
   2071
   2072  function checkSelectPropTypes(props) {
   2073    {
   2074      checkControlledValueProps('select', props);
   2075
   2076      for (var i = 0; i < valuePropNames.length; i++) {
   2077        var propName = valuePropNames[i];
   2078
   2079        if (props[propName] == null) {
   2080          continue;
   2081        }
   2082
   2083        var propNameIsArray = isArray(props[propName]);
   2084
   2085        if (props.multiple && !propNameIsArray) {
   2086          error('The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());
   2087        } else if (!props.multiple && propNameIsArray) {
   2088          error('The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());
   2089        }
   2090      }
   2091    }
   2092  }
   2093
   2094  function updateOptions(node, multiple, propValue, setDefaultSelected) {
   2095    var options = node.options;
   2096
   2097    if (multiple) {
   2098      var selectedValues = propValue;
   2099      var selectedValue = {};
   2100
   2101      for (var i = 0; i < selectedValues.length; i++) {
   2102        // Prefix to avoid chaos with special keys.
   2103        selectedValue['$' + selectedValues[i]] = true;
   2104      }
   2105
   2106      for (var _i = 0; _i < options.length; _i++) {
   2107        var selected = selectedValue.hasOwnProperty('$' + options[_i].value);
   2108
   2109        if (options[_i].selected !== selected) {
   2110          options[_i].selected = selected;
   2111        }
   2112
   2113        if (selected && setDefaultSelected) {
   2114          options[_i].defaultSelected = true;
   2115        }
   2116      }
   2117    } else {
   2118      // Do not set `select.value` as exact behavior isn't consistent across all
   2119      // browsers for all cases.
   2120      var _selectedValue = toString(getToStringValue(propValue));
   2121
   2122      var defaultSelected = null;
   2123
   2124      for (var _i2 = 0; _i2 < options.length; _i2++) {
   2125        if (options[_i2].value === _selectedValue) {
   2126          options[_i2].selected = true;
   2127
   2128          if (setDefaultSelected) {
   2129            options[_i2].defaultSelected = true;
   2130          }
   2131
   2132          return;
   2133        }
   2134
   2135        if (defaultSelected === null && !options[_i2].disabled) {
   2136          defaultSelected = options[_i2];
   2137        }
   2138      }
   2139
   2140      if (defaultSelected !== null) {
   2141        defaultSelected.selected = true;
   2142      }
   2143    }
   2144  }
   2145  /**
   2146   * Implements a <select> host component that allows optionally setting the
   2147   * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
   2148   * stringable. If `multiple` is true, the prop must be an array of stringables.
   2149   *
   2150   * If `value` is not supplied (or null/undefined), user actions that change the
   2151   * selected option will trigger updates to the rendered options.
   2152   *
   2153   * If it is supplied (and not null/undefined), the rendered options will not
   2154   * update in response to user actions. Instead, the `value` prop must change in
   2155   * order for the rendered options to update.
   2156   *
   2157   * If `defaultValue` is provided, any options with the supplied values will be
   2158   * selected.
   2159   */
   2160
   2161
   2162  function getHostProps$1(element, props) {
   2163    return assign({}, props, {
   2164      value: undefined
   2165    });
   2166  }
   2167  function initWrapperState$1(element, props) {
   2168    var node = element;
   2169
   2170    {
   2171      checkSelectPropTypes(props);
   2172    }
   2173
   2174    node._wrapperState = {
   2175      wasMultiple: !!props.multiple
   2176    };
   2177
   2178    {
   2179      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {
   2180        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://reactjs.org/link/controlled-components');
   2181
   2182        didWarnValueDefaultValue$1 = true;
   2183      }
   2184    }
   2185  }
   2186  function postMountWrapper$2(element, props) {
   2187    var node = element;
   2188    node.multiple = !!props.multiple;
   2189    var value = props.value;
   2190
   2191    if (value != null) {
   2192      updateOptions(node, !!props.multiple, value, false);
   2193    } else if (props.defaultValue != null) {
   2194      updateOptions(node, !!props.multiple, props.defaultValue, true);
   2195    }
   2196  }
   2197  function postUpdateWrapper(element, props) {
   2198    var node = element;
   2199    var wasMultiple = node._wrapperState.wasMultiple;
   2200    node._wrapperState.wasMultiple = !!props.multiple;
   2201    var value = props.value;
   2202
   2203    if (value != null) {
   2204      updateOptions(node, !!props.multiple, value, false);
   2205    } else if (wasMultiple !== !!props.multiple) {
   2206      // For simplicity, reapply `defaultValue` if `multiple` is toggled.
   2207      if (props.defaultValue != null) {
   2208        updateOptions(node, !!props.multiple, props.defaultValue, true);
   2209      } else {
   2210        // Revert the select back to its default unselected state.
   2211        updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);
   2212      }
   2213    }
   2214  }
   2215  function restoreControlledState$1(element, props) {
   2216    var node = element;
   2217    var value = props.value;
   2218
   2219    if (value != null) {
   2220      updateOptions(node, !!props.multiple, value, false);
   2221    }
   2222  }
   2223
   2224  var didWarnValDefaultVal = false;
   2225
   2226  /**
   2227   * Implements a <textarea> host component that allows setting `value`, and
   2228   * `defaultValue`. This differs from the traditional DOM API because value is
   2229   * usually set as PCDATA children.
   2230   *
   2231   * If `value` is not supplied (or null/undefined), user actions that affect the
   2232   * value will trigger updates to the element.
   2233   *
   2234   * If `value` is supplied (and not null/undefined), the rendered element will
   2235   * not trigger updates to the element. Instead, the `value` prop must change in
   2236   * order for the rendered element to be updated.
   2237   *
   2238   * The rendered element will be initialized with an empty value, the prop
   2239   * `defaultValue` if specified, or the children content (deprecated).
   2240   */
   2241  function getHostProps$2(element, props) {
   2242    var node = element;
   2243
   2244    if (props.dangerouslySetInnerHTML != null) {
   2245      throw new Error('`dangerouslySetInnerHTML` does not make sense on <textarea>.');
   2246    } // Always set children to the same thing. In IE9, the selection range will
   2247    // get reset if `textContent` is mutated.  We could add a check in setTextContent
   2248    // to only set the value if/when the value differs from the node value (which would
   2249    // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
   2250    // solution. The value can be a boolean or object so that's why it's forced
   2251    // to be a string.
   2252
   2253
   2254    var hostProps = assign({}, props, {
   2255      value: undefined,
   2256      defaultValue: undefined,
   2257      children: toString(node._wrapperState.initialValue)
   2258    });
   2259
   2260    return hostProps;
   2261  }
   2262  function initWrapperState$2(element, props) {
   2263    var node = element;
   2264
   2265    {
   2266      checkControlledValueProps('textarea', props);
   2267
   2268      if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {
   2269        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://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component');
   2270
   2271        didWarnValDefaultVal = true;
   2272      }
   2273    }
   2274
   2275    var initialValue = props.value; // Only bother fetching default value if we're going to use it
   2276
   2277    if (initialValue == null) {
   2278      var children = props.children,
   2279          defaultValue = props.defaultValue;
   2280
   2281      if (children != null) {
   2282        {
   2283          error('Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');
   2284        }
   2285
   2286        {
   2287          if (defaultValue != null) {
   2288            throw new Error('If you supply `defaultValue` on a <textarea>, do not pass children.');
   2289          }
   2290
   2291          if (isArray(children)) {
   2292            if (children.length > 1) {
   2293              throw new Error('<textarea> can only have at most one child.');
   2294            }
   2295
   2296            children = children[0];
   2297          }
   2298
   2299          defaultValue = children;
   2300        }
   2301      }
   2302
   2303      if (defaultValue == null) {
   2304        defaultValue = '';
   2305      }
   2306
   2307      initialValue = defaultValue;
   2308    }
   2309
   2310    node._wrapperState = {
   2311      initialValue: getToStringValue(initialValue)
   2312    };
   2313  }
   2314  function updateWrapper$1(element, props) {
   2315    var node = element;
   2316    var value = getToStringValue(props.value);
   2317    var defaultValue = getToStringValue(props.defaultValue);
   2318
   2319    if (value != null) {
   2320      // Cast `value` to a string to ensure the value is set correctly. While
   2321      // browsers typically do this as necessary, jsdom doesn't.
   2322      var newValue = toString(value); // To avoid side effects (such as losing text selection), only set value if changed
   2323
   2324      if (newValue !== node.value) {
   2325        node.value = newValue;
   2326      }
   2327
   2328      if (props.defaultValue == null && node.defaultValue !== newValue) {
   2329        node.defaultValue = newValue;
   2330      }
   2331    }
   2332
   2333    if (defaultValue != null) {
   2334      node.defaultValue = toString(defaultValue);
   2335    }
   2336  }
   2337  function postMountWrapper$3(element, props) {
   2338    var node = element; // This is in postMount because we need access to the DOM node, which is not
   2339    // available until after the component has mounted.
   2340
   2341    var textContent = node.textContent; // Only set node.value if textContent is equal to the expected
   2342    // initial value. In IE10/IE11 there is a bug where the placeholder attribute
   2343    // will populate textContent as well.
   2344    // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
   2345
   2346    if (textContent === node._wrapperState.initialValue) {
   2347      if (textContent !== '' && textContent !== null) {
   2348        node.value = textContent;
   2349      }
   2350    }
   2351  }
   2352  function restoreControlledState$2(element, props) {
   2353    // DOM component is still mounted; update
   2354    updateWrapper$1(element, props);
   2355  }
   2356
   2357  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
   2358  var MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';
   2359  var SVG_NAMESPACE = 'http://www.w3.org/2000/svg'; // Assumes there is no parent namespace.
   2360
   2361  function getIntrinsicNamespace(type) {
   2362    switch (type) {
   2363      case 'svg':
   2364        return SVG_NAMESPACE;
   2365
   2366      case 'math':
   2367        return MATH_NAMESPACE;
   2368
   2369      default:
   2370        return HTML_NAMESPACE;
   2371    }
   2372  }
   2373  function getChildNamespace(parentNamespace, type) {
   2374    if (parentNamespace == null || parentNamespace === HTML_NAMESPACE) {
   2375      // No (or default) parent namespace: potential entry point.
   2376      return getIntrinsicNamespace(type);
   2377    }
   2378
   2379    if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {
   2380      // We're leaving SVG.
   2381      return HTML_NAMESPACE;
   2382    } // By default, pass namespace below.
   2383
   2384
   2385    return parentNamespace;
   2386  }
   2387
   2388  /* globals MSApp */
   2389
   2390  /**
   2391   * Create a function which has 'unsafe' privileges (required by windows8 apps)
   2392   */
   2393  var createMicrosoftUnsafeLocalFunction = function (func) {
   2394    if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {
   2395      return function (arg0, arg1, arg2, arg3) {
   2396        MSApp.execUnsafeLocalFunction(function () {
   2397          return func(arg0, arg1, arg2, arg3);
   2398        });
   2399      };
   2400    } else {
   2401      return func;
   2402    }
   2403  };
   2404
   2405  var reusableSVGContainer;
   2406  /**
   2407   * Set the innerHTML property of a node
   2408   *
   2409   * @param {DOMElement} node
   2410   * @param {string} html
   2411   * @internal
   2412   */
   2413
   2414  var setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {
   2415    if (node.namespaceURI === SVG_NAMESPACE) {
   2416
   2417      if (!('innerHTML' in node)) {
   2418        // IE does not have innerHTML for SVG nodes, so instead we inject the
   2419        // new markup in a temp node and then move the child nodes across into
   2420        // the target node
   2421        reusableSVGContainer = reusableSVGContainer || document.createElement('div');
   2422        reusableSVGContainer.innerHTML = '<svg>' + html.valueOf().toString() + '</svg>';
   2423        var svgNode = reusableSVGContainer.firstChild;
   2424
   2425        while (node.firstChild) {
   2426          node.removeChild(node.firstChild);
   2427        }
   2428
   2429        while (svgNode.firstChild) {
   2430          node.appendChild(svgNode.firstChild);
   2431        }
   2432
   2433        return;
   2434      }
   2435    }
   2436
   2437    node.innerHTML = html;
   2438  });
   2439
   2440  /**
   2441   * HTML nodeType values that represent the type of the node
   2442   */
   2443  var ELEMENT_NODE = 1;
   2444  var TEXT_NODE = 3;
   2445  var COMMENT_NODE = 8;
   2446  var DOCUMENT_NODE = 9;
   2447  var DOCUMENT_FRAGMENT_NODE = 11;
   2448
   2449  /**
   2450   * Set the textContent property of a node. For text updates, it's faster
   2451   * to set the `nodeValue` of the Text node directly instead of using
   2452   * `.textContent` which will remove the existing node and create a new one.
   2453   *
   2454   * @param {DOMElement} node
   2455   * @param {string} text
   2456   * @internal
   2457   */
   2458
   2459  var setTextContent = function (node, text) {
   2460    if (text) {
   2461      var firstChild = node.firstChild;
   2462
   2463      if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {
   2464        firstChild.nodeValue = text;
   2465        return;
   2466      }
   2467    }
   2468
   2469    node.textContent = text;
   2470  };
   2471
   2472  // List derived from Gecko source code:
   2473  // https://github.com/mozilla/gecko-dev/blob/4e638efc71/layout/style/test/property_database.js
   2474  var shorthandToLonghand = {
   2475    animation: ['animationDelay', 'animationDirection', 'animationDuration', 'animationFillMode', 'animationIterationCount', 'animationName', 'animationPlayState', 'animationTimingFunction'],
   2476    background: ['backgroundAttachment', 'backgroundClip', 'backgroundColor', 'backgroundImage', 'backgroundOrigin', 'backgroundPositionX', 'backgroundPositionY', 'backgroundRepeat', 'backgroundSize'],
   2477    backgroundPosition: ['backgroundPositionX', 'backgroundPositionY'],
   2478    border: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth', 'borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth', 'borderLeftColor', 'borderLeftStyle', 'borderLeftWidth', 'borderRightColor', 'borderRightStyle', 'borderRightWidth', 'borderTopColor', 'borderTopStyle', 'borderTopWidth'],
   2479    borderBlockEnd: ['borderBlockEndColor', 'borderBlockEndStyle', 'borderBlockEndWidth'],
   2480    borderBlockStart: ['borderBlockStartColor', 'borderBlockStartStyle', 'borderBlockStartWidth'],
   2481    borderBottom: ['borderBottomColor', 'borderBottomStyle', 'borderBottomWidth'],
   2482    borderColor: ['borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor'],
   2483    borderImage: ['borderImageOutset', 'borderImageRepeat', 'borderImageSlice', 'borderImageSource', 'borderImageWidth'],
   2484    borderInlineEnd: ['borderInlineEndColor', 'borderInlineEndStyle', 'borderInlineEndWidth'],
   2485    borderInlineStart: ['borderInlineStartColor', 'borderInlineStartStyle', 'borderInlineStartWidth'],
   2486    borderLeft: ['borderLeftColor', 'borderLeftStyle', 'borderLeftWidth'],
   2487    borderRadius: ['borderBottomLeftRadius', 'borderBottomRightRadius', 'borderTopLeftRadius', 'borderTopRightRadius'],
   2488    borderRight: ['borderRightColor', 'borderRightStyle', 'borderRightWidth'],
   2489    borderStyle: ['borderBottomStyle', 'borderLeftStyle', 'borderRightStyle', 'borderTopStyle'],
   2490    borderTop: ['borderTopColor', 'borderTopStyle', 'borderTopWidth'],
   2491    borderWidth: ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth'],
   2492    columnRule: ['columnRuleColor', 'columnRuleStyle', 'columnRuleWidth'],
   2493    columns: ['columnCount', 'columnWidth'],
   2494    flex: ['flexBasis', 'flexGrow', 'flexShrink'],
   2495    flexFlow: ['flexDirection', 'flexWrap'],
   2496    font: ['fontFamily', 'fontFeatureSettings', 'fontKerning', 'fontLanguageOverride', 'fontSize', 'fontSizeAdjust', 'fontStretch', 'fontStyle', 'fontVariant', 'fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition', 'fontWeight', 'lineHeight'],
   2497    fontVariant: ['fontVariantAlternates', 'fontVariantCaps', 'fontVariantEastAsian', 'fontVariantLigatures', 'fontVariantNumeric', 'fontVariantPosition'],
   2498    gap: ['columnGap', 'rowGap'],
   2499    grid: ['gridAutoColumns', 'gridAutoFlow', 'gridAutoRows', 'gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
   2500    gridArea: ['gridColumnEnd', 'gridColumnStart', 'gridRowEnd', 'gridRowStart'],
   2501    gridColumn: ['gridColumnEnd', 'gridColumnStart'],
   2502    gridColumnGap: ['columnGap'],
   2503    gridGap: ['columnGap', 'rowGap'],
   2504    gridRow: ['gridRowEnd', 'gridRowStart'],
   2505    gridRowGap: ['rowGap'],
   2506    gridTemplate: ['gridTemplateAreas', 'gridTemplateColumns', 'gridTemplateRows'],
   2507    listStyle: ['listStyleImage', 'listStylePosition', 'listStyleType'],
   2508    margin: ['marginBottom', 'marginLeft', 'marginRight', 'marginTop'],
   2509    marker: ['markerEnd', 'markerMid', 'markerStart'],
   2510    mask: ['maskClip', 'maskComposite', 'maskImage', 'maskMode', 'maskOrigin', 'maskPositionX', 'maskPositionY', 'maskRepeat', 'maskSize'],
   2511    maskPosition: ['maskPositionX', 'maskPositionY'],
   2512    outline: ['outlineColor', 'outlineStyle', 'outlineWidth'],
   2513    overflow: ['overflowX', 'overflowY'],
   2514    padding: ['paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop'],
   2515    placeContent: ['alignContent', 'justifyContent'],
   2516    placeItems: ['alignItems', 'justifyItems'],
   2517    placeSelf: ['alignSelf', 'justifySelf'],
   2518    textDecoration: ['textDecorationColor', 'textDecorationLine', 'textDecorationStyle'],
   2519    textEmphasis: ['textEmphasisColor', 'textEmphasisStyle'],
   2520    transition: ['transitionDelay', 'transitionDuration', 'transitionProperty', 'transitionTimingFunction'],
   2521    wordWrap: ['overflowWrap']
   2522  };
   2523
   2524  /**
   2525   * CSS properties which accept numbers but are not in units of "px".
   2526   */
   2527  var isUnitlessNumber = {
   2528    animationIterationCount: true,
   2529    aspectRatio: true,
   2530    borderImageOutset: true,
   2531    borderImageSlice: true,
   2532    borderImageWidth: true,
   2533    boxFlex: true,
   2534    boxFlexGroup: true,
   2535    boxOrdinalGroup: true,
   2536    columnCount: true,
   2537    columns: true,
   2538    flex: true,
   2539    flexGrow: true,
   2540    flexPositive: true,
   2541    flexShrink: true,
   2542    flexNegative: true,
   2543    flexOrder: true,
   2544    gridArea: true,
   2545    gridRow: true,
   2546    gridRowEnd: true,
   2547    gridRowSpan: true,
   2548    gridRowStart: true,
   2549    gridColumn: true,
   2550    gridColumnEnd: true,
   2551    gridColumnSpan: true,
   2552    gridColumnStart: true,
   2553    fontWeight: true,
   2554    lineClamp: true,
   2555    lineHeight: true,
   2556    opacity: true,
   2557    order: true,
   2558    orphans: true,
   2559    tabSize: true,
   2560    widows: true,
   2561    zIndex: true,
   2562    zoom: true,
   2563    // SVG-related properties
   2564    fillOpacity: true,
   2565    floodOpacity: true,
   2566    stopOpacity: true,
   2567    strokeDasharray: true,
   2568    strokeDashoffset: true,
   2569    strokeMiterlimit: true,
   2570    strokeOpacity: true,
   2571    strokeWidth: true
   2572  };
   2573  /**
   2574   * @param {string} prefix vendor-specific prefix, eg: Webkit
   2575   * @param {string} key style name, eg: transitionDuration
   2576   * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
   2577   * WebkitTransitionDuration
   2578   */
   2579
   2580  function prefixKey(prefix, key) {
   2581    return prefix + key.charAt(0).toUpperCase() + key.substring(1);
   2582  }
   2583  /**
   2584   * Support style names that may come passed in prefixed by adding permutations
   2585   * of vendor prefixes.
   2586   */
   2587
   2588
   2589  var prefixes = ['Webkit', 'ms', 'Moz', 'O']; // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
   2590  // infinite loop, because it iterates over the newly added props too.
   2591
   2592  Object.keys(isUnitlessNumber).forEach(function (prop) {
   2593    prefixes.forEach(function (prefix) {
   2594      isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];
   2595    });
   2596  });
   2597
   2598  /**
   2599   * Convert a value into the proper css writable value. The style name `name`
   2600   * should be logical (no hyphens), as specified
   2601   * in `CSSProperty.isUnitlessNumber`.
   2602   *
   2603   * @param {string} name CSS property name such as `topMargin`.
   2604   * @param {*} value CSS property value such as `10px`.
   2605   * @return {string} Normalized style value with dimensions applied.
   2606   */
   2607
   2608  function dangerousStyleValue(name, value, isCustomProperty) {
   2609    // Note that we've removed escapeTextForBrowser() calls here since the
   2610    // whole string will be escaped when the attribute is injected into
   2611    // the markup. If you provide unsafe user data here they can inject
   2612    // arbitrary CSS which may be problematic (I couldn't repro this):
   2613    // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
   2614    // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
   2615    // This is not an XSS hole but instead a potential CSS injection issue
   2616    // which has lead to a greater discussion about how we're going to
   2617    // trust URLs moving forward. See #2115901
   2618    var isEmpty = value == null || typeof value === 'boolean' || value === '';
   2619
   2620    if (isEmpty) {
   2621      return '';
   2622    }
   2623
   2624    if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {
   2625      return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers
   2626    }
   2627
   2628    {
   2629      checkCSSPropertyStringCoercion(value, name);
   2630    }
   2631
   2632    return ('' + value).trim();
   2633  }
   2634
   2635  var uppercasePattern = /([A-Z])/g;
   2636  var msPattern = /^ms-/;
   2637  /**
   2638   * Hyphenates a camelcased CSS property name, for example:
   2639   *
   2640   *   > hyphenateStyleName('backgroundColor')
   2641   *   < "background-color"
   2642   *   > hyphenateStyleName('MozTransition')
   2643   *   < "-moz-transition"
   2644   *   > hyphenateStyleName('msTransition')
   2645   *   < "-ms-transition"
   2646   *
   2647   * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
   2648   * is converted to `-ms-`.
   2649   */
   2650
   2651  function hyphenateStyleName(name) {
   2652    return name.replace(uppercasePattern, '-$1').toLowerCase().replace(msPattern, '-ms-');
   2653  }
   2654
   2655  var warnValidStyle = function () {};
   2656
   2657  {
   2658    // 'msTransform' is correct, but the other prefixes should be capitalized
   2659    var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
   2660    var msPattern$1 = /^-ms-/;
   2661    var hyphenPattern = /-(.)/g; // style values shouldn't contain a semicolon
   2662
   2663    var badStyleValueWithSemicolonPattern = /;\s*$/;
   2664    var warnedStyleNames = {};
   2665    var warnedStyleValues = {};
   2666    var warnedForNaNValue = false;
   2667    var warnedForInfinityValue = false;
   2668
   2669    var camelize = function (string) {
   2670      return string.replace(hyphenPattern, function (_, character) {
   2671        return character.toUpperCase();
   2672      });
   2673    };
   2674
   2675    var warnHyphenatedStyleName = function (name) {
   2676      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
   2677        return;
   2678      }
   2679
   2680      warnedStyleNames[name] = true;
   2681
   2682      error('Unsupported style property %s. Did you mean %s?', name, // As Andi Smith suggests
   2683      // (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
   2684      // is converted to lowercase `ms`.
   2685      camelize(name.replace(msPattern$1, 'ms-')));
   2686    };
   2687
   2688    var warnBadVendoredStyleName = function (name) {
   2689      if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {
   2690        return;
   2691      }
   2692
   2693      warnedStyleNames[name] = true;
   2694
   2695      error('Unsupported vendor-prefixed style property %s. Did you mean %s?', name, name.charAt(0).toUpperCase() + name.slice(1));
   2696    };
   2697
   2698    var warnStyleValueWithSemicolon = function (name, value) {
   2699      if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {
   2700        return;
   2701      }
   2702
   2703      warnedStyleValues[value] = true;
   2704
   2705      error("Style property values shouldn't contain a semicolon. " + 'Try "%s: %s" instead.', name, value.replace(badStyleValueWithSemicolonPattern, ''));
   2706    };
   2707
   2708    var warnStyleValueIsNaN = function (name, value) {
   2709      if (warnedForNaNValue) {
   2710        return;
   2711      }
   2712
   2713      warnedForNaNValue = true;
   2714
   2715      error('`NaN` is an invalid value for the `%s` css style property.', name);
   2716    };
   2717
   2718    var warnStyleValueIsInfinity = function (name, value) {
   2719      if (warnedForInfinityValue) {
   2720        return;
   2721      }
   2722
   2723      warnedForInfinityValue = true;
   2724
   2725      error('`Infinity` is an invalid value for the `%s` css style property.', name);
   2726    };
   2727
   2728    warnValidStyle = function (name, value) {
   2729      if (name.indexOf('-') > -1) {
   2730        warnHyphenatedStyleName(name);
   2731      } else if (badVendoredStyleNamePattern.test(name)) {
   2732        warnBadVendoredStyleName(name);
   2733      } else if (badStyleValueWithSemicolonPattern.test(value)) {
   2734        warnStyleValueWithSemicolon(name, value);
   2735      }
   2736
   2737      if (typeof value === 'number') {
   2738        if (isNaN(value)) {
   2739          warnStyleValueIsNaN(name, value);
   2740        } else if (!isFinite(value)) {
   2741          warnStyleValueIsInfinity(name, value);
   2742        }
   2743      }
   2744    };
   2745  }
   2746
   2747  var warnValidStyle$1 = warnValidStyle;
   2748
   2749  /**
   2750   * Operations for dealing with CSS properties.
   2751   */
   2752
   2753  /**
   2754   * This creates a string that is expected to be equivalent to the style
   2755   * attribute generated by server-side rendering. It by-passes warnings and
   2756   * security checks so it's not safe to use this value for anything other than
   2757   * comparison. It is only used in DEV for SSR validation.
   2758   */
   2759
   2760  function createDangerousStringForStyles(styles) {
   2761    {
   2762      var serialized = '';
   2763      var delimiter = '';
   2764
   2765      for (var styleName in styles) {
   2766        if (!styles.hasOwnProperty(styleName)) {
   2767          continue;
   2768        }
   2769
   2770        var styleValue = styles[styleName];
   2771
   2772        if (styleValue != null) {
   2773          var isCustomProperty = styleName.indexOf('--') === 0;
   2774          serialized += delimiter + (isCustomProperty ? styleName : hyphenateStyleName(styleName)) + ':';
   2775          serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);
   2776          delimiter = ';';
   2777        }
   2778      }
   2779
   2780      return serialized || null;
   2781    }
   2782  }
   2783  /**
   2784   * Sets the value for multiple styles on a node.  If a value is specified as
   2785   * '' (empty string), the corresponding style property will be unset.
   2786   *
   2787   * @param {DOMElement} node
   2788   * @param {object} styles
   2789   */
   2790
   2791  function setValueForStyles(node, styles) {
   2792    var style = node.style;
   2793
   2794    for (var styleName in styles) {
   2795      if (!styles.hasOwnProperty(styleName)) {
   2796        continue;
   2797      }
   2798
   2799      var isCustomProperty = styleName.indexOf('--') === 0;
   2800
   2801      {
   2802        if (!isCustomProperty) {
   2803          warnValidStyle$1(styleName, styles[styleName]);
   2804        }
   2805      }
   2806
   2807      var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);
   2808
   2809      if (styleName === 'float') {
   2810        styleName = 'cssFloat';
   2811      }
   2812
   2813      if (isCustomProperty) {
   2814        style.setProperty(styleName, styleValue);
   2815      } else {
   2816        style[styleName] = styleValue;
   2817      }
   2818    }
   2819  }
   2820
   2821  function isValueEmpty(value) {
   2822    return value == null || typeof value === 'boolean' || value === '';
   2823  }
   2824  /**
   2825   * Given {color: 'red', overflow: 'hidden'} returns {
   2826   *   color: 'color',
   2827   *   overflowX: 'overflow',
   2828   *   overflowY: 'overflow',
   2829   * }. This can be read as "the overflowY property was set by the overflow
   2830   * shorthand". That is, the values are the property that each was derived from.
   2831   */
   2832
   2833
   2834  function expandShorthandMap(styles) {
   2835    var expanded = {};
   2836
   2837    for (var key in styles) {
   2838      var longhands = shorthandToLonghand[key] || [key];
   2839
   2840      for (var i = 0; i < longhands.length; i++) {
   2841        expanded[longhands[i]] = key;
   2842      }
   2843    }
   2844
   2845    return expanded;
   2846  }
   2847  /**
   2848   * When mixing shorthand and longhand property names, we warn during updates if
   2849   * we expect an incorrect result to occur. In particular, we warn for:
   2850   *
   2851   * Updating a shorthand property (longhand gets overwritten):
   2852   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'baz', fontVariant: 'bar'}
   2853   *   becomes .style.font = 'baz'
   2854   * Removing a shorthand property (longhand gets lost too):
   2855   *   {font: 'foo', fontVariant: 'bar'} -> {fontVariant: 'bar'}
   2856   *   becomes .style.font = ''
   2857   * Removing a longhand property (should revert to shorthand; doesn't):
   2858   *   {font: 'foo', fontVariant: 'bar'} -> {font: 'foo'}
   2859   *   becomes .style.fontVariant = ''
   2860   */
   2861
   2862
   2863  function validateShorthandPropertyCollisionInDev(styleUpdates, nextStyles) {
   2864    {
   2865      if (!nextStyles) {
   2866        return;
   2867      }
   2868
   2869      var expandedUpdates = expandShorthandMap(styleUpdates);
   2870      var expandedStyles = expandShorthandMap(nextStyles);
   2871      var warnedAbout = {};
   2872
   2873      for (var key in expandedUpdates) {
   2874        var originalKey = expandedUpdates[key];
   2875        var correctOriginalKey = expandedStyles[key];
   2876
   2877        if (correctOriginalKey && originalKey !== correctOriginalKey) {
   2878          var warningKey = originalKey + ',' + correctOriginalKey;
   2879
   2880          if (warnedAbout[warningKey]) {
   2881            continue;
   2882          }
   2883
   2884          warnedAbout[warningKey] = true;
   2885
   2886          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);
   2887        }
   2888      }
   2889    }
   2890  }
   2891
   2892  // For HTML, certain tags should omit their close tag. We keep a list for
   2893  // those special-case tags.
   2894  var omittedCloseTags = {
   2895    area: true,
   2896    base: true,
   2897    br: true,
   2898    col: true,
   2899    embed: true,
   2900    hr: true,
   2901    img: true,
   2902    input: true,
   2903    keygen: true,
   2904    link: true,
   2905    meta: true,
   2906    param: true,
   2907    source: true,
   2908    track: true,
   2909    wbr: true // NOTE: menuitem's close tag should be omitted, but that causes problems.
   2910
   2911  };
   2912
   2913  // `omittedCloseTags` except that `menuitem` should still have its closing tag.
   2914
   2915  var voidElementTags = assign({
   2916    menuitem: true
   2917  }, omittedCloseTags);
   2918
   2919  var HTML = '__html';
   2920
   2921  function assertValidProps(tag, props) {
   2922    if (!props) {
   2923      return;
   2924    } // Note the use of `==` which checks for null or undefined.
   2925
   2926
   2927    if (voidElementTags[tag]) {
   2928      if (props.children != null || props.dangerouslySetInnerHTML != null) {
   2929        throw new Error(tag + " is a void element tag and must neither have `children` nor " + 'use `dangerouslySetInnerHTML`.');
   2930      }
   2931    }
   2932
   2933    if (props.dangerouslySetInnerHTML != null) {
   2934      if (props.children != null) {
   2935        throw new Error('Can only set one of `children` or `props.dangerouslySetInnerHTML`.');
   2936      }
   2937
   2938      if (typeof props.dangerouslySetInnerHTML !== 'object' || !(HTML in props.dangerouslySetInnerHTML)) {
   2939        throw new Error('`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. ' + 'Please visit https://reactjs.org/link/dangerously-set-inner-html ' + 'for more information.');
   2940      }
   2941    }
   2942
   2943    {
   2944      if (!props.suppressContentEditableWarning && props.contentEditable && props.children != null) {
   2945        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.');
   2946      }
   2947    }
   2948
   2949    if (props.style != null && typeof props.style !== 'object') {
   2950      throw new Error('The `style` prop expects a mapping from style properties to values, ' + "not a string. For example, style={{marginRight: spacing + 'em'}} when " + 'using JSX.');
   2951    }
   2952  }
   2953
   2954  function isCustomComponent(tagName, props) {
   2955    if (tagName.indexOf('-') === -1) {
   2956      return typeof props.is === 'string';
   2957    }
   2958
   2959    switch (tagName) {
   2960      // These are reserved SVG and MathML elements.
   2961      // We don't mind this list too much because we expect it to never grow.
   2962      // The alternative is to track the namespace in a few places which is convoluted.
   2963      // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
   2964      case 'annotation-xml':
   2965      case 'color-profile':
   2966      case 'font-face':
   2967      case 'font-face-src':
   2968      case 'font-face-uri':
   2969      case 'font-face-format':
   2970      case 'font-face-name':
   2971      case 'missing-glyph':
   2972        return false;
   2973
   2974      default:
   2975        return true;
   2976    }
   2977  }
   2978
   2979  // When adding attributes to the HTML or SVG allowed attribute list, be sure to
   2980  // also add them to this module to ensure casing and incorrect name
   2981  // warnings.
   2982  var possibleStandardNames = {
   2983    // HTML
   2984    accept: 'accept',
   2985    acceptcharset: 'acceptCharset',
   2986    'accept-charset': 'acceptCharset',
   2987    accesskey: 'accessKey',
   2988    action: 'action',
   2989    allowfullscreen: 'allowFullScreen',
   2990    alt: 'alt',
   2991    as: 'as',
   2992    async: 'async',
   2993    autocapitalize: 'autoCapitalize',
   2994    autocomplete: 'autoComplete',
   2995    autocorrect: 'autoCorrect',
   2996    autofocus: 'autoFocus',
   2997    autoplay: 'autoPlay',
   2998    autosave: 'autoSave',
   2999    capture: 'capture',
   3000    cellpadding: 'cellPadding',
   3001    cellspacing: 'cellSpacing',
   3002    challenge: 'challenge',
   3003    charset: 'charSet',
   3004    checked: 'checked',
   3005    children: 'children',
   3006    cite: 'cite',
   3007    class: 'className',
   3008    classid: 'classID',
   3009    classname: 'className',
   3010    cols: 'cols',
   3011    colspan: 'colSpan',
   3012    content: 'content',
   3013    contenteditable: 'contentEditable',
   3014    contextmenu: 'contextMenu',
   3015    controls: 'controls',
   3016    controlslist: 'controlsList',
   3017    coords: 'coords',
   3018    crossorigin: 'crossOrigin',
   3019    dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',
   3020    data: 'data',
   3021    datetime: 'dateTime',
   3022    default: 'default',
   3023    defaultchecked: 'defaultChecked',
   3024    defaultvalue: 'defaultValue',
   3025    defer: 'defer',
   3026    dir: 'dir',
   3027    disabled: 'disabled',
   3028    disablepictureinpicture: 'disablePictureInPicture',
   3029    disableremoteplayback: 'disableRemotePlayback',
   3030    download: 'download',
   3031    draggable: 'draggable',
   3032    enctype: 'encType',
   3033    enterkeyhint: 'enterKeyHint',
   3034    for: 'htmlFor',
   3035    form: 'form',
   3036    formmethod: 'formMethod',
   3037    formaction: 'formAction',
   3038    formenctype: 'formEncType',
   3039    formnovalidate: 'formNoValidate',
   3040    formtarget: 'formTarget',
   3041    frameborder: 'frameBorder',
   3042    headers: 'headers',
   3043    height: 'height',
   3044    hidden: 'hidden',
   3045    high: 'high',
   3046    href: 'href',
   3047    hreflang: 'hrefLang',
   3048    htmlfor: 'htmlFor',
   3049    httpequiv: 'httpEquiv',
   3050    'http-equiv': 'httpEquiv',
   3051    icon: 'icon',
   3052    id: 'id',
   3053    imagesizes: 'imageSizes',
   3054    imagesrcset: 'imageSrcSet',
   3055    innerhtml: 'innerHTML',
   3056    inputmode: 'inputMode',
   3057    integrity: 'integrity',
   3058    is: 'is',
   3059    itemid: 'itemID',
   3060    itemprop: 'itemProp',
   3061    itemref: 'itemRef',
   3062    itemscope: 'itemScope',
   3063    itemtype: 'itemType',
   3064    keyparams: 'keyParams',
   3065    keytype: 'keyType',
   3066    kind: 'kind',
   3067    label: 'label',
   3068    lang: 'lang',
   3069    list: 'list',
   3070    loop: 'loop',
   3071    low: 'low',
   3072    manifest: 'manifest',
   3073    marginwidth: 'marginWidth',
   3074    marginheight: 'marginHeight',
   3075    max: 'max',
   3076    maxlength: 'maxLength',
   3077    media: 'media',
   3078    mediagroup: 'mediaGroup',
   3079    method: 'method',
   3080    min: 'min',
   3081    minlength: 'minLength',
   3082    multiple: 'multiple',
   3083    muted: 'muted',
   3084    name: 'name',
   3085    nomodule: 'noModule',
   3086    nonce: 'nonce',
   3087    novalidate: 'noValidate',
   3088    open: 'open',
   3089    optimum: 'optimum',
   3090    pattern: 'pattern',
   3091    placeholder: 'placeholder',
   3092    playsinline: 'playsInline',
   3093    poster: 'poster',
   3094    preload: 'preload',
   3095    profile: 'profile',
   3096    radiogroup: 'radioGroup',
   3097    readonly: 'readOnly',
   3098    referrerpolicy: 'referrerPolicy',
   3099    rel: 'rel',
   3100    required: 'required',
   3101    reversed: 'reversed',
   3102    role: 'role',
   3103    rows: 'rows',
   3104    rowspan: 'rowSpan',
   3105    sandbox: 'sandbox',
   3106    scope: 'scope',
   3107    scoped: 'scoped',
   3108    scrolling: 'scrolling',
   3109    seamless: 'seamless',
   3110    selected: 'selected',
   3111    shape: 'shape',
   3112    size: 'size',
   3113    sizes: 'sizes',
   3114    span: 'span',
   3115    spellcheck: 'spellCheck',
   3116    src: 'src',
   3117    srcdoc: 'srcDoc',
   3118    srclang: 'srcLang',
   3119    srcset: 'srcSet',
   3120    start: 'start',
   3121    step: 'step',
   3122    style: 'style',
   3123    summary: 'summary',
   3124    tabindex: 'tabIndex',
   3125    target: 'target',
   3126    title: 'title',
   3127    type: 'type',
   3128    usemap: 'useMap',
   3129    value: 'value',
   3130    width: 'width',
   3131    wmode: 'wmode',
   3132    wrap: 'wrap',
   3133    // SVG
   3134    about: 'about',
   3135    accentheight: 'accentHeight',
   3136    'accent-height': 'accentHeight',
   3137    accumulate: 'accumulate',
   3138    additive: 'additive',
   3139    alignmentbaseline: 'alignmentBaseline',
   3140    'alignment-baseline': 'alignmentBaseline',
   3141    allowreorder: 'allowReorder',
   3142    alphabetic: 'alphabetic',
   3143    amplitude: 'amplitude',
   3144    arabicform: 'arabicForm',
   3145    'arabic-form': 'arabicForm',
   3146    ascent: 'ascent',
   3147    attributename: 'attributeName',
   3148    attributetype: 'attributeType',
   3149    autoreverse: 'autoReverse',
   3150    azimuth: 'azimuth',
   3151    basefrequency: 'baseFrequency',
   3152    baselineshift: 'baselineShift',
   3153    'baseline-shift': 'baselineShift',
   3154    baseprofile: 'baseProfile',
   3155    bbox: 'bbox',
   3156    begin: 'begin',
   3157    bias: 'bias',
   3158    by: 'by',
   3159    calcmode: 'calcMode',
   3160    capheight: 'capHeight',
   3161    'cap-height': 'capHeight',
   3162    clip: 'clip',
   3163    clippath: 'clipPath',
   3164    'clip-path': 'clipPath',
   3165    clippathunits: 'clipPathUnits',
   3166    cliprule: 'clipRule',
   3167    'clip-rule': 'clipRule',
   3168    color: 'color',
   3169    colorinterpolation: 'colorInterpolation',
   3170    'color-interpolation': 'colorInterpolation',
   3171    colorinterpolationfilters: 'colorInterpolationFilters',
   3172    'color-interpolation-filters': 'colorInterpolationFilters',
   3173    colorprofile: 'colorProfile',
   3174    'color-profile': 'colorProfile',
   3175    colorrendering: 'colorRendering',
   3176    'color-rendering': 'colorRendering',
   3177    contentscripttype: 'contentScriptType',
   3178    contentstyletype: 'contentStyleType',
   3179    cursor: 'cursor',
   3180    cx: 'cx',
   3181    cy: 'cy',
   3182    d: 'd',
   3183    datatype: 'datatype',
   3184    decelerate: 'decelerate',
   3185    descent: 'descent',
   3186    diffuseconstant: 'diffuseConstant',
   3187    direction: 'direction',
   3188    display: 'display',
   3189    divisor: 'divisor',
   3190    dominantbaseline: 'dominantBaseline',
   3191    'dominant-baseline': 'dominantBaseline',
   3192    dur: 'dur',
   3193    dx: 'dx',
   3194    dy: 'dy',
   3195    edgemode: 'edgeMode',
   3196    elevation: 'elevation',
   3197    enablebackground: 'enableBackground',
   3198    'enable-background': 'enableBackground',
   3199    end: 'end',
   3200    exponent: 'exponent',
   3201    externalresourcesrequired: 'externalResourcesRequired',
   3202    fill: 'fill',
   3203    fillopacity: 'fillOpacity',
   3204    'fill-opacity': 'fillOpacity',
   3205    fillrule: 'fillRule',
   3206    'fill-rule': 'fillRule',
   3207    filter: 'filter',
   3208    filterres: 'filterRes',
   3209    filterunits: 'filterUnits',
   3210    floodopacity: 'floodOpacity',
   3211    'flood-opacity': 'floodOpacity',
   3212    floodcolor: 'floodColor',
   3213    'flood-color': 'floodColor',
   3214    focusable: 'focusable',
   3215    fontfamily: 'fontFamily',
   3216    'font-family': 'fontFamily',
   3217    fontsize: 'fontSize',
   3218    'font-size': 'fontSize',
   3219    fontsizeadjust: 'fontSizeAdjust',
   3220    'font-size-adjust': 'fontSizeAdjust',
   3221    fontstretch: 'fontStretch',
   3222    'font-stretch': 'fontStretch',
   3223    fontstyle: 'fontStyle',
   3224    'font-style': 'fontStyle',
   3225    fontvariant: 'fontVariant',
   3226    'font-variant': 'fontVariant',
   3227    fontweight: 'fontWeight',
   3228    'font-weight': 'fontWeight',
   3229    format: 'format',
   3230    from: 'from',
   3231    fx: 'fx',
   3232    fy: 'fy',
   3233    g1: 'g1',
   3234    g2: 'g2',
   3235    glyphname: 'glyphName',
   3236    'glyph-name': 'glyphName',
   3237    glyphorientationhorizontal: 'glyphOrientationHorizontal',
   3238    'glyph-orientation-horizontal': 'glyphOrientationHorizontal',
   3239    glyphorientationvertical: 'glyphOrientationVertical',
   3240    'glyph-orientation-vertical': 'glyphOrientationVertical',
   3241    glyphref: 'glyphRef',
   3242    gradienttransform: 'gradientTransform',
   3243    gradientunits: 'gradientUnits',
   3244    hanging: 'hanging',
   3245    horizadvx: 'horizAdvX',
   3246    'horiz-adv-x': 'horizAdvX',
   3247    horizoriginx: 'horizOriginX',
   3248    'horiz-origin-x': 'horizOriginX',
   3249    ideographic: 'ideographic',
   3250    imagerendering: 'imageRendering',
   3251    'image-rendering': 'imageRendering',
   3252    in2: 'in2',
   3253    in: 'in',
   3254    inlist: 'inlist',
   3255    intercept: 'intercept',
   3256    k1: 'k1',
   3257    k2: 'k2',
   3258    k3: 'k3',
   3259    k4: 'k4',
   3260    k: 'k',
   3261    kernelmatrix: 'kernelMatrix',
   3262    kernelunitlength: 'kernelUnitLength',
   3263    kerning: 'kerning',
   3264    keypoints: 'keyPoints',
   3265    keysplines: 'keySplines',
   3266    keytimes: 'keyTimes',
   3267    lengthadjust: 'lengthAdjust',
   3268    letterspacing: 'letterSpacing',
   3269    'letter-spacing': 'letterSpacing',
   3270    lightingcolor: 'lightingColor',
   3271    'lighting-color': 'lightingColor',
   3272    limitingconeangle: 'limitingConeAngle',
   3273    local: 'local',
   3274    markerend: 'markerEnd',
   3275    'marker-end': 'markerEnd',
   3276    markerheight: 'markerHeight',
   3277    markermid: 'markerMid',
   3278    'marker-mid': 'markerMid',
   3279    markerstart: 'markerStart',
   3280    'marker-start': 'markerStart',
   3281    markerunits: 'markerUnits',
   3282    markerwidth: 'markerWidth',
   3283    mask: 'mask',
   3284    maskcontentunits: 'maskContentUnits',
   3285    maskunits: 'maskUnits',
   3286    mathematical: 'mathematical',
   3287    mode: 'mode',
   3288    numoctaves: 'numOctaves',
   3289    offset: 'offset',
   3290    opacity: 'opacity',
   3291    operator: 'operator',
   3292    order: 'order',
   3293    orient: 'orient',
   3294    orientation: 'orientation',
   3295    origin: 'origin',
   3296    overflow: 'overflow',
   3297    overlineposition: 'overlinePosition',
   3298    'overline-position': 'overlinePosition',
   3299    overlinethickness: 'overlineThickness',
   3300    'overline-thickness': 'overlineThickness',
   3301    paintorder: 'paintOrder',
   3302    'paint-order': 'paintOrder',
   3303    panose1: 'panose1',
   3304    'panose-1': 'panose1',
   3305    pathlength: 'pathLength',
   3306    patterncontentunits: 'patternContentUnits',
   3307    patterntransform: 'patternTransform',
   3308    patternunits: 'patternUnits',
   3309    pointerevents: 'pointerEvents',
   3310    'pointer-events': 'pointerEvents',
   3311    points: 'points',
   3312    pointsatx: 'pointsAtX',
   3313    pointsaty: 'pointsAtY',
   3314    pointsatz: 'pointsAtZ',
   3315    prefix: 'prefix',
   3316    preservealpha: 'preserveAlpha',
   3317    preserveaspectratio: 'preserveAspectRatio',
   3318    primitiveunits: 'primitiveUnits',
   3319    property: 'property',
   3320    r: 'r',
   3321    radius: 'radius',
   3322    refx: 'refX',
   3323    refy: 'refY',
   3324    renderingintent: 'renderingIntent',
   3325    'rendering-intent': 'renderingIntent',
   3326    repeatcount: 'repeatCount',
   3327    repeatdur: 'repeatDur',
   3328    requiredextensions: 'requiredExtensions',
   3329    requiredfeatures: 'requiredFeatures',
   3330    resource: 'resource',
   3331    restart: 'restart',
   3332    result: 'result',
   3333    results: 'results',
   3334    rotate: 'rotate',
   3335    rx: 'rx',
   3336    ry: 'ry',
   3337    scale: 'scale',
   3338    security: 'security',
   3339    seed: 'seed',
   3340    shaperendering: 'shapeRendering',
   3341    'shape-rendering': 'shapeRendering',
   3342    slope: 'slope',
   3343    spacing: 'spacing',
   3344    specularconstant: 'specularConstant',
   3345    specularexponent: 'specularExponent',
   3346    speed: 'speed',
   3347    spreadmethod: 'spreadMethod',
   3348    startoffset: 'startOffset',
   3349    stddeviation: 'stdDeviation',
   3350    stemh: 'stemh',
   3351    stemv: 'stemv',
   3352    stitchtiles: 'stitchTiles',
   3353    stopcolor: 'stopColor',
   3354    'stop-color': 'stopColor',
   3355    stopopacity: 'stopOpacity',
   3356    'stop-opacity': 'stopOpacity',
   3357    strikethroughposition: 'strikethroughPosition',
   3358    'strikethrough-position': 'strikethroughPosition',
   3359    strikethroughthickness: 'strikethroughThickness',
   3360    'strikethrough-thickness': 'strikethroughThickness',
   3361    string: 'string',
   3362    stroke: 'stroke',
   3363    strokedasharray: 'strokeDasharray',
   3364    'stroke-dasharray': 'strokeDasharray',
   3365    strokedashoffset: 'strokeDashoffset',
   3366    'stroke-dashoffset': 'strokeDashoffset',
   3367    strokelinecap: 'strokeLinecap',
   3368    'stroke-linecap': 'strokeLinecap',
   3369    strokelinejoin: 'strokeLinejoin',
   3370    'stroke-linejoin': 'strokeLinejoin',
   3371    strokemiterlimit: 'strokeMiterlimit',
   3372    'stroke-miterlimit': 'strokeMiterlimit',
   3373    strokewidth: 'strokeWidth',
   3374    'stroke-width': 'strokeWidth',
   3375    strokeopacity: 'strokeOpacity',
   3376    'stroke-opacity': 'strokeOpacity',
   3377    suppresscontenteditablewarning: 'suppressContentEditableWarning',
   3378    suppresshydrationwarning: 'suppressHydrationWarning',
   3379    surfacescale: 'surfaceScale',
   3380    systemlanguage: 'systemLanguage',
   3381    tablevalues: 'tableValues',
   3382    targetx: 'targetX',
   3383    targety: 'targetY',
   3384    textanchor: 'textAnchor',
   3385    'text-anchor': 'textAnchor',
   3386    textdecoration: 'textDecoration',
   3387    'text-decoration': 'textDecoration',
   3388    textlength: 'textLength',
   3389    textrendering: 'textRendering',
   3390    'text-rendering': 'textRendering',
   3391    to: 'to',
   3392    transform: 'transform',
   3393    typeof: 'typeof',
   3394    u1: 'u1',
   3395    u2: 'u2',
   3396    underlineposition: 'underlinePosition',
   3397    'underline-position': 'underlinePosition',
   3398    underlinethickness: 'underlineThickness',
   3399    'underline-thickness': 'underlineThickness',
   3400    unicode: 'unicode',
   3401    unicodebidi: 'unicodeBidi',
   3402    'unicode-bidi': 'unicodeBidi',
   3403    unicoderange: 'unicodeRange',
   3404    'unicode-range': 'unicodeRange',
   3405    unitsperem: 'unitsPerEm',
   3406    'units-per-em': 'unitsPerEm',
   3407    unselectable: 'unselectable',
   3408    valphabetic: 'vAlphabetic',
   3409    'v-alphabetic': 'vAlphabetic',
   3410    values: 'values',
   3411    vectoreffect: 'vectorEffect',
   3412    'vector-effect': 'vectorEffect',
   3413    version: 'version',
   3414    vertadvy: 'vertAdvY',
   3415    'vert-adv-y': 'vertAdvY',
   3416    vertoriginx: 'vertOriginX',
   3417    'vert-origin-x': 'vertOriginX',
   3418    vertoriginy: 'vertOriginY',
   3419    'vert-origin-y': 'vertOriginY',
   3420    vhanging: 'vHanging',
   3421    'v-hanging': 'vHanging',
   3422    videographic: 'vIdeographic',
   3423    'v-ideographic': 'vIdeographic',
   3424    viewbox: 'viewBox',
   3425    viewtarget: 'viewTarget',
   3426    visibility: 'visibility',
   3427    vmathematical: 'vMathematical',
   3428    'v-mathematical': 'vMathematical',
   3429    vocab: 'vocab',
   3430    widths: 'widths',
   3431    wordspacing: 'wordSpacing',
   3432    'word-spacing': 'wordSpacing',
   3433    writingmode: 'writingMode',
   3434    'writing-mode': 'writingMode',
   3435    x1: 'x1',
   3436    x2: 'x2',
   3437    x: 'x',
   3438    xchannelselector: 'xChannelSelector',
   3439    xheight: 'xHeight',
   3440    'x-height': 'xHeight',
   3441    xlinkactuate: 'xlinkActuate',
   3442    'xlink:actuate': 'xlinkActuate',
   3443    xlinkarcrole: 'xlinkArcrole',
   3444    'xlink:arcrole': 'xlinkArcrole',
   3445    xlinkhref: 'xlinkHref',
   3446    'xlink:href': 'xlinkHref',
   3447    xlinkrole: 'xlinkRole',
   3448    'xlink:role': 'xlinkRole',
   3449    xlinkshow: 'xlinkShow',
   3450    'xlink:show': 'xlinkShow',
   3451    xlinktitle: 'xlinkTitle',
   3452    'xlink:title': 'xlinkTitle',
   3453    xlinktype: 'xlinkType',
   3454    'xlink:type': 'xlinkType',
   3455    xmlbase: 'xmlBase',
   3456    'xml:base': 'xmlBase',
   3457    xmllang: 'xmlLang',
   3458    'xml:lang': 'xmlLang',
   3459    xmlns: 'xmlns',
   3460    'xml:space': 'xmlSpace',
   3461    xmlnsxlink: 'xmlnsXlink',
   3462    'xmlns:xlink': 'xmlnsXlink',
   3463    xmlspace: 'xmlSpace',
   3464    y1: 'y1',
   3465    y2: 'y2',
   3466    y: 'y',
   3467    ychannelselector: 'yChannelSelector',
   3468    z: 'z',
   3469    zoomandpan: 'zoomAndPan'
   3470  };
   3471
   3472  var ariaProperties = {
   3473    'aria-current': 0,
   3474    // state
   3475    'aria-description': 0,
   3476    'aria-details': 0,
   3477    'aria-disabled': 0,
   3478    // state
   3479    'aria-hidden': 0,
   3480    // state
   3481    'aria-invalid': 0,
   3482    // state
   3483    'aria-keyshortcuts': 0,
   3484    'aria-label': 0,
   3485    'aria-roledescription': 0,
   3486    // Widget Attributes
   3487    'aria-autocomplete': 0,
   3488    'aria-checked': 0,
   3489    'aria-expanded': 0,
   3490    'aria-haspopup': 0,
   3491    'aria-level': 0,
   3492    'aria-modal': 0,
   3493    'aria-multiline': 0,
   3494    'aria-multiselectable': 0,
   3495    'aria-orientation': 0,
   3496    'aria-placeholder': 0,
   3497    'aria-pressed': 0,
   3498    'aria-readonly': 0,
   3499    'aria-required': 0,
   3500    'aria-selected': 0,
   3501    'aria-sort': 0,
   3502    'aria-valuemax': 0,
   3503    'aria-valuemin': 0,
   3504    'aria-valuenow': 0,
   3505    'aria-valuetext': 0,
   3506    // Live Region Attributes
   3507    'aria-atomic': 0,
   3508    'aria-busy': 0,
   3509    'aria-live': 0,
   3510    'aria-relevant': 0,
   3511    // Drag-and-Drop Attributes
   3512    'aria-dropeffect': 0,
   3513    'aria-grabbed': 0,
   3514    // Relationship Attributes
   3515    'aria-activedescendant': 0,
   3516    'aria-colcount': 0,
   3517    'aria-colindex': 0,
   3518    'aria-colspan': 0,
   3519    'aria-controls': 0,
   3520    'aria-describedby': 0,
   3521    'aria-errormessage': 0,
   3522    'aria-flowto': 0,
   3523    'aria-labelledby': 0,
   3524    'aria-owns': 0,
   3525    'aria-posinset': 0,
   3526    'aria-rowcount': 0,
   3527    'aria-rowindex': 0,
   3528    'aria-rowspan': 0,
   3529    'aria-setsize': 0
   3530  };
   3531
   3532  var warnedProperties = {};
   3533  var rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
   3534  var rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
   3535
   3536  function validateProperty(tagName, name) {
   3537    {
   3538      if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {
   3539        return true;
   3540      }
   3541
   3542      if (rARIACamel.test(name)) {
   3543        var ariaName = 'aria-' + name.slice(4).toLowerCase();
   3544        var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null; // If this is an aria-* attribute, but is not listed in the known DOM
   3545        // DOM properties, then it is an invalid aria-* attribute.
   3546
   3547        if (correctName == null) {
   3548          error('Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', name);
   3549
   3550          warnedProperties[name] = true;
   3551          return true;
   3552        } // aria-* attributes should be lowercase; suggest the lowercase version.
   3553
   3554
   3555        if (name !== correctName) {
   3556          error('Invalid ARIA attribute `%s`. Did you mean `%s`?', name, correctName);
   3557
   3558          warnedProperties[name] = true;
   3559          return true;
   3560        }
   3561      }
   3562
   3563      if (rARIA.test(name)) {
   3564        var lowerCasedName = name.toLowerCase();
   3565        var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null; // If this is an aria-* attribute, but is not listed in the known DOM
   3566        // DOM properties, then it is an invalid aria-* attribute.
   3567
   3568        if (standardName == null) {
   3569          warnedProperties[name] = true;
   3570          return false;
   3571        } // aria-* attributes should be lowercase; suggest the lowercase version.
   3572
   3573
   3574        if (name !== standardName) {
   3575          error('Unknown ARIA attribute `%s`. Did you mean `%s`?', name, standardName);
   3576
   3577          warnedProperties[name] = true;
   3578          return true;
   3579        }
   3580      }
   3581    }
   3582
   3583    return true;
   3584  }
   3585
   3586  function warnInvalidARIAProps(type, props) {
   3587    {
   3588      var invalidProps = [];
   3589
   3590      for (var key in props) {
   3591        var isValid = validateProperty(type, key);
   3592
   3593        if (!isValid) {
   3594          invalidProps.push(key);
   3595        }
   3596      }
   3597
   3598      var unknownPropString = invalidProps.map(function (prop) {
   3599        return '`' + prop + '`';
   3600      }).join(', ');
   3601
   3602      if (invalidProps.length === 1) {
   3603        error('Invalid aria prop %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
   3604      } else if (invalidProps.length > 1) {
   3605        error('Invalid aria props %s on <%s> tag. ' + 'For details, see https://reactjs.org/link/invalid-aria-props', unknownPropString, type);
   3606      }
   3607    }
   3608  }
   3609
   3610  function validateProperties(type, props) {
   3611    if (isCustomComponent(type, props)) {
   3612      return;
   3613    }
   3614
   3615    warnInvalidARIAProps(type, props);
   3616  }
   3617
   3618  var didWarnValueNull = false;
   3619  function validateProperties$1(type, props) {
   3620    {
   3621      if (type !== 'input' && type !== 'textarea' && type !== 'select') {
   3622        return;
   3623      }
   3624
   3625      if (props != null && props.value === null && !didWarnValueNull) {
   3626        didWarnValueNull = true;
   3627
   3628        if (type === 'select' && props.multiple) {
   3629          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);
   3630        } else {
   3631          error('`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.', type);
   3632        }
   3633      }
   3634    }
   3635  }
   3636
   3637  var validateProperty$1 = function () {};
   3638
   3639  {
   3640    var warnedProperties$1 = {};
   3641    var EVENT_NAME_REGEX = /^on./;
   3642    var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
   3643    var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');
   3644    var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');
   3645
   3646    validateProperty$1 = function (tagName, name, value, eventRegistry) {
   3647      if (hasOwnProperty.call(warnedProperties$1, name) && warnedProperties$1[name]) {
   3648        return true;
   3649      }
   3650
   3651      var lowerCasedName = name.toLowerCase();
   3652
   3653      if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {
   3654        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.');
   3655
   3656        warnedProperties$1[name] = true;
   3657        return true;
   3658      } // We can't rely on the event system being injected on the server.
   3659
   3660
   3661      if (eventRegistry != null) {
   3662        var registrationNameDependencies = eventRegistry.registrationNameDependencies,
   3663            possibleRegistrationNames = eventRegistry.possibleRegistrationNames;
   3664
   3665        if (registrationNameDependencies.hasOwnProperty(name)) {
   3666          return true;
   3667        }
   3668
   3669        var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;
   3670
   3671        if (registrationName != null) {
   3672          error('Invalid event handler property `%s`. Did you mean `%s`?', name, registrationName);
   3673
   3674          warnedProperties$1[name] = true;
   3675          return true;
   3676        }
   3677
   3678        if (EVENT_NAME_REGEX.test(name)) {
   3679          error('Unknown event handler property `%s`. It will be ignored.', name);
   3680
   3681          warnedProperties$1[name] = true;
   3682          return true;
   3683        }
   3684      } else if (EVENT_NAME_REGEX.test(name)) {
   3685        // If no event plugins have been injected, we are in a server environment.
   3686        // So we can't tell if the event name is correct for sure, but we can filter
   3687        // out known bad ones like `onclick`. We can't suggest a specific replacement though.
   3688        if (INVALID_EVENT_NAME_REGEX.test(name)) {
   3689          error('Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.', name);
   3690        }
   3691
   3692        warnedProperties$1[name] = true;
   3693        return true;
   3694      } // Let the ARIA attribute hook validate ARIA attributes
   3695
   3696
   3697      if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
   3698        return true;
   3699      }
   3700
   3701      if (lowerCasedName === 'innerhtml') {
   3702        error('Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');
   3703
   3704        warnedProperties$1[name] = true;
   3705        return true;
   3706      }
   3707
   3708      if (lowerCasedName === 'aria') {
   3709        error('The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');
   3710
   3711        warnedProperties$1[name] = true;
   3712        return true;
   3713      }
   3714
   3715      if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {
   3716        error('Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.', typeof value);
   3717
   3718        warnedProperties$1[name] = true;
   3719        return true;
   3720      }
   3721
   3722      if (typeof value === 'number' && isNaN(value)) {
   3723        error('Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.', name);
   3724
   3725        warnedProperties$1[name] = true;
   3726        return true;
   3727      }
   3728
   3729      var propertyInfo = getPropertyInfo(name);
   3730      var isReserved = propertyInfo !== null && propertyInfo.type === RESERVED; // Known attributes should match the casing specified in the property config.
   3731
   3732      if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
   3733        var standardName = possibleStandardNames[lowerCasedName];
   3734
   3735        if (standardName !== name) {
   3736          error('Invalid DOM property `%s`. Did you mean `%s`?', name, standardName);
   3737
   3738          warnedProperties$1[name] = true;
   3739          return true;
   3740        }
   3741      } else if (!isReserved && name !== lowerCasedName) {
   3742        // Unknown attributes should have lowercase casing since that's how they
   3743        // will be cased anyway with server rendering.
   3744        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);
   3745
   3746        warnedProperties$1[name] = true;
   3747        return true;
   3748      }
   3749
   3750      if (typeof value === 'boolean' && shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
   3751        if (value) {
   3752          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);
   3753        } else {
   3754          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);
   3755        }
   3756
   3757        warnedProperties$1[name] = true;
   3758        return true;
   3759      } // Now that we've validated casing, do not validate
   3760      // data types for reserved props
   3761
   3762
   3763      if (isReserved) {
   3764        return true;
   3765      } // Warn when a known attribute is a bad type
   3766
   3767
   3768      if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, false)) {
   3769        warnedProperties$1[name] = true;
   3770        return false;
   3771      } // Warn when passing the strings 'false' or 'true' into a boolean prop
   3772
   3773
   3774      if ((value === 'false' || value === 'true') && propertyInfo !== null && propertyInfo.type === BOOLEAN) {
   3775        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);
   3776
   3777        warnedProperties$1[name] = true;
   3778        return true;
   3779      }
   3780
   3781      return true;
   3782    };
   3783  }
   3784
   3785  var warnUnknownProperties = function (type, props, eventRegistry) {
   3786    {
   3787      var unknownProps = [];
   3788
   3789      for (var key in props) {
   3790        var isValid = validateProperty$1(type, key, props[key], eventRegistry);
   3791
   3792        if (!isValid) {
   3793          unknownProps.push(key);
   3794        }
   3795      }
   3796
   3797      var unknownPropString = unknownProps.map(function (prop) {
   3798        return '`' + prop + '`';
   3799      }).join(', ');
   3800
   3801      if (unknownProps.length === 1) {
   3802        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://reactjs.org/link/attribute-behavior ', unknownPropString, type);
   3803      } else if (unknownProps.length > 1) {
   3804        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://reactjs.org/link/attribute-behavior ', unknownPropString, type);
   3805      }
   3806    }
   3807  };
   3808
   3809  function validateProperties$2(type, props, eventRegistry) {
   3810    if (isCustomComponent(type, props)) {
   3811      return;
   3812    }
   3813
   3814    warnUnknownProperties(type, props, eventRegistry);
   3815  }
   3816
   3817  var IS_EVENT_HANDLE_NON_MANAGED_NODE = 1;
   3818  var IS_NON_DELEGATED = 1 << 1;
   3819  var IS_CAPTURE_PHASE = 1 << 2;
   3820  // set to LEGACY_FB_SUPPORT. LEGACY_FB_SUPPORT only gets set when
   3821  // we call willDeferLaterForLegacyFBSupport, thus not bailing out
   3822  // will result in endless cycles like an infinite loop.
   3823  // We also don't want to defer during event replaying.
   3824
   3825  var SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS = IS_EVENT_HANDLE_NON_MANAGED_NODE | IS_NON_DELEGATED | IS_CAPTURE_PHASE;
   3826
   3827  // This exists to avoid circular dependency between ReactDOMEventReplaying
   3828  // and DOMPluginEventSystem.
   3829  var currentReplayingEvent = null;
   3830  function setReplayingEvent(event) {
   3831    {
   3832      if (currentReplayingEvent !== null) {
   3833        error('Expected currently replaying event to be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
   3834      }
   3835    }
   3836
   3837    currentReplayingEvent = event;
   3838  }
   3839  function resetReplayingEvent() {
   3840    {
   3841      if (currentReplayingEvent === null) {
   3842        error('Expected currently replaying event to not be null. This error ' + 'is likely caused by a bug in React. Please file an issue.');
   3843      }
   3844    }
   3845
   3846    currentReplayingEvent = null;
   3847  }
   3848  function isReplayingEvent(event) {
   3849    return event === currentReplayingEvent;
   3850  }
   3851
   3852  /**
   3853   * Gets the target node from a native browser event by accounting for
   3854   * inconsistencies in browser DOM APIs.
   3855   *
   3856   * @param {object} nativeEvent Native browser event.
   3857   * @return {DOMEventTarget} Target node.
   3858   */
   3859
   3860  function getEventTarget(nativeEvent) {
   3861    // Fallback to nativeEvent.srcElement for IE9
   3862    // https://github.com/facebook/react/issues/12506
   3863    var target = nativeEvent.target || nativeEvent.srcElement || window; // Normalize SVG <use> element events #4963
   3864
   3865    if (target.correspondingUseElement) {
   3866      target = target.correspondingUseElement;
   3867    } // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
   3868    // @see http://www.quirksmode.org/js/events_properties.html
   3869
   3870
   3871    return target.nodeType === TEXT_NODE ? target.parentNode : target;
   3872  }
   3873
   3874  var restoreImpl = null;
   3875  var restoreTarget = null;
   3876  var restoreQueue = null;
   3877
   3878  function restoreStateOfTarget(target) {
   3879    // We perform this translation at the end of the event loop so that we
   3880    // always receive the correct fiber here
   3881    var internalInstance = getInstanceFromNode(target);
   3882
   3883    if (!internalInstance) {
   3884      // Unmounted
   3885      return;
   3886    }
   3887
   3888    if (typeof restoreImpl !== 'function') {
   3889      throw new 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.');
   3890    }
   3891
   3892    var stateNode = internalInstance.stateNode; // Guard against Fiber being unmounted.
   3893
   3894    if (stateNode) {
   3895      var _props = getFiberCurrentPropsFromNode(stateNode);
   3896
   3897      restoreImpl(internalInstance.stateNode, internalInstance.type, _props);
   3898    }
   3899  }
   3900
   3901  function setRestoreImplementation(impl) {
   3902    restoreImpl = impl;
   3903  }
   3904  function enqueueStateRestore(target) {
   3905    if (restoreTarget) {
   3906      if (restoreQueue) {
   3907        restoreQueue.push(target);
   3908      } else {
   3909        restoreQueue = [target];
   3910      }
   3911    } else {
   3912      restoreTarget = target;
   3913    }
   3914  }
   3915  function needsStateRestore() {
   3916    return restoreTarget !== null || restoreQueue !== null;
   3917  }
   3918  function restoreStateIfNeeded() {
   3919    if (!restoreTarget) {
   3920      return;
   3921    }
   3922
   3923    var target = restoreTarget;
   3924    var queuedTargets = restoreQueue;
   3925    restoreTarget = null;
   3926    restoreQueue = null;
   3927    restoreStateOfTarget(target);
   3928
   3929    if (queuedTargets) {
   3930      for (var i = 0; i < queuedTargets.length; i++) {
   3931        restoreStateOfTarget(queuedTargets[i]);
   3932      }
   3933    }
   3934  }
   3935
   3936  // the renderer. Such as when we're dispatching events or if third party
   3937  // libraries need to call batchedUpdates. Eventually, this API will go away when
   3938  // everything is batched by default. We'll then have a similar API to opt-out of
   3939  // scheduled work and instead do synchronous work.
   3940  // Defaults
   3941
   3942  var batchedUpdatesImpl = function (fn, bookkeeping) {
   3943    return fn(bookkeeping);
   3944  };
   3945
   3946  var flushSyncImpl = function () {};
   3947
   3948  var isInsideEventHandler = false;
   3949
   3950  function finishEventHandler() {
   3951    // Here we wait until all updates have propagated, which is important
   3952    // when using controlled components within layers:
   3953    // https://github.com/facebook/react/issues/1698
   3954    // Then we restore state of any controlled component.
   3955    var controlledComponentsHavePendingUpdates = needsStateRestore();
   3956
   3957    if (controlledComponentsHavePendingUpdates) {
   3958      // If a controlled event was fired, we may need to restore the state of
   3959      // the DOM node back to the controlled value. This is necessary when React
   3960      // bails out of the update without touching the DOM.
   3961      // TODO: Restore state in the microtask, after the discrete updates flush,
   3962      // instead of early flushing them here.
   3963      flushSyncImpl();
   3964      restoreStateIfNeeded();
   3965    }
   3966  }
   3967
   3968  function batchedUpdates(fn, a, b) {
   3969    if (isInsideEventHandler) {
   3970      // If we are currently inside another batch, we need to wait until it
   3971      // fully completes before restoring state.
   3972      return fn(a, b);
   3973    }
   3974
   3975    isInsideEventHandler = true;
   3976
   3977    try {
   3978      return batchedUpdatesImpl(fn, a, b);
   3979    } finally {
   3980      isInsideEventHandler = false;
   3981      finishEventHandler();
   3982    }
   3983  } // TODO: Replace with flushSync
   3984  function setBatchingImplementation(_batchedUpdatesImpl, _discreteUpdatesImpl, _flushSyncImpl) {
   3985    batchedUpdatesImpl = _batchedUpdatesImpl;
   3986    flushSyncImpl = _flushSyncImpl;
   3987  }
   3988
   3989  function isInteractive(tag) {
   3990    return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';
   3991  }
   3992
   3993  function shouldPreventMouseEvent(name, type, props) {
   3994    switch (name) {
   3995      case 'onClick':
   3996      case 'onClickCapture':
   3997      case 'onDoubleClick':
   3998      case 'onDoubleClickCapture':
   3999      case 'onMouseDown':
   4000      case 'onMouseDownCapture':
   4001      case 'onMouseMove':
   4002      case 'onMouseMoveCapture':
   4003      case 'onMouseUp':
   4004      case 'onMouseUpCapture':
   4005      case 'onMouseEnter':
   4006        return !!(props.disabled && isInteractive(type));
   4007
   4008      default:
   4009        return false;
   4010    }
   4011  }
   4012  /**
   4013   * @param {object} inst The instance, which is the source of events.
   4014   * @param {string} registrationName Name of listener (e.g. `onClick`).
   4015   * @return {?function} The stored callback.
   4016   */
   4017
   4018
   4019  function getListener(inst, registrationName) {
   4020    var stateNode = inst.stateNode;
   4021
   4022    if (stateNode === null) {
   4023      // Work in progress (ex: onload events in incremental mode).
   4024      return null;
   4025    }
   4026
   4027    var props = getFiberCurrentPropsFromNode(stateNode);
   4028
   4029    if (props === null) {
   4030      // Work in progress.
   4031      return null;
   4032    }
   4033
   4034    var listener = props[registrationName];
   4035
   4036    if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
   4037      return null;
   4038    }
   4039
   4040    if (listener && typeof listener !== 'function') {
   4041      throw new Error("Expected `" + registrationName + "` listener to be a function, instead got a value of `" + typeof listener + "` type.");
   4042    }
   4043
   4044    return listener;
   4045  }
   4046
   4047  var passiveBrowserEventsSupported = false; // Check if browser support events with passive listeners
   4048  // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support
   4049
   4050  if (canUseDOM) {
   4051    try {
   4052      var options = {}; // $FlowFixMe: Ignore Flow complaining about needing a value
   4053
   4054      Object.defineProperty(options, 'passive', {
   4055        get: function () {
   4056          passiveBrowserEventsSupported = true;
   4057        }
   4058      });
   4059      window.addEventListener('test', options, options);
   4060      window.removeEventListener('test', options, options);
   4061    } catch (e) {
   4062      passiveBrowserEventsSupported = false;
   4063    }
   4064  }
   4065
   4066  function invokeGuardedCallbackProd(name, func, context, a, b, c, d, e, f) {
   4067    var funcArgs = Array.prototype.slice.call(arguments, 3);
   4068
   4069    try {
   4070      func.apply(context, funcArgs);
   4071    } catch (error) {
   4072      this.onError(error);
   4073    }
   4074  }
   4075
   4076  var invokeGuardedCallbackImpl = invokeGuardedCallbackProd;
   4077
   4078  {
   4079    // In DEV mode, we swap out invokeGuardedCallback for a special version
   4080    // that plays more nicely with the browser's DevTools. The idea is to preserve
   4081    // "Pause on exceptions" behavior. Because React wraps all user-provided
   4082    // functions in invokeGuardedCallback, and the production version of
   4083    // invokeGuardedCallback uses a try-catch, all user exceptions are treated
   4084    // like caught exceptions, and the DevTools won't pause unless the developer
   4085    // takes the extra step of enabling pause on caught exceptions. This is
   4086    // unintuitive, though, because even though React has caught the error, from
   4087    // the developer's perspective, the error is uncaught.
   4088    //
   4089    // To preserve the expected "Pause on exceptions" behavior, we don't use a
   4090    // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
   4091    // DOM node, and call the user-provided callback from inside an event handler
   4092    // for that fake event. If the callback throws, the error is "captured" using
   4093    // a global event handler. But because the error happens in a different
   4094    // event loop context, it does not interrupt the normal program flow.
   4095    // Effectively, this gives us try-catch behavior without actually using
   4096    // try-catch. Neat!
   4097    // Check that the browser supports the APIs we need to implement our special
   4098    // DEV version of invokeGuardedCallback
   4099    if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {
   4100      var fakeNode = document.createElement('react');
   4101
   4102      invokeGuardedCallbackImpl = function invokeGuardedCallbackDev(name, func, context, a, b, c, d, e, f) {
   4103        // If document doesn't exist we know for sure we will crash in this method
   4104        // when we call document.createEvent(). However this can cause confusing
   4105        // errors: https://github.com/facebook/create-react-app/issues/3482
   4106        // So we preemptively throw with a better message instead.
   4107        if (typeof document === 'undefined' || document === null) {
   4108          throw new 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.');
   4109        }
   4110
   4111        var evt = document.createEvent('Event');
   4112        var didCall = false; // Keeps track of whether the user-provided callback threw an error. We
   4113        // set this to true at the beginning, then set it to false right after
   4114        // calling the function. If the function errors, `didError` will never be
   4115        // set to false. This strategy works even if the browser is flaky and
   4116        // fails to call our global error handler, because it doesn't rely on
   4117        // the error event at all.
   4118
   4119        var didError = true; // Keeps track of the value of window.event so that we can reset it
   4120        // during the callback to let user code access window.event in the
   4121        // browsers that support it.
   4122
   4123        var windowEvent = window.event; // Keeps track of the descriptor of window.event to restore it after event
   4124        // dispatching: https://github.com/facebook/react/issues/13688
   4125
   4126        var windowEventDescriptor = Object.getOwnPropertyDescriptor(window, 'event');
   4127
   4128        function restoreAfterDispatch() {
   4129          // We immediately remove the callback from event listeners so that
   4130          // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
   4131          // nested call would trigger the fake event handlers of any call higher
   4132          // in the stack.
   4133          fakeNode.removeEventListener(evtType, callCallback, false); // We check for window.hasOwnProperty('event') to prevent the
   4134          // window.event assignment in both IE <= 10 as they throw an error
   4135          // "Member not found" in strict mode, and in Firefox which does not
   4136          // support window.event.
   4137
   4138          if (typeof window.event !== 'undefined' && window.hasOwnProperty('event')) {
   4139            window.event = windowEvent;
   4140          }
   4141        } // Create an event handler for our fake event. We will synchronously
   4142        // dispatch our fake event using `dispatchEvent`. Inside the handler, we
   4143        // call the user-provided callback.
   4144
   4145
   4146        var funcArgs = Array.prototype.slice.call(arguments, 3);
   4147
   4148        function callCallback() {
   4149          didCall = true;
   4150          restoreAfterDispatch();
   4151          func.apply(context, funcArgs);
   4152          didError = false;
   4153        } // Create a global error event handler. We use this to capture the value
   4154        // that was thrown. It's possible that this error handler will fire more
   4155        // than once; for example, if non-React code also calls `dispatchEvent`
   4156        // and a handler for that event throws. We should be resilient to most of
   4157        // those cases. Even if our error event handler fires more than once, the
   4158        // last error event is always used. If the callback actually does error,
   4159        // we know that the last error event is the correct one, because it's not
   4160        // possible for anything else to have happened in between our callback
   4161        // erroring and the code that follows the `dispatchEvent` call below. If
   4162        // the callback doesn't error, but the error event was fired, we know to
   4163        // ignore it because `didError` will be false, as described above.
   4164
   4165
   4166        var error; // Use this to track whether the error event is ever called.
   4167
   4168        var didSetError = false;
   4169        var isCrossOriginError = false;
   4170
   4171        function handleWindowError(event) {
   4172          error = event.error;
   4173          didSetError = true;
   4174
   4175          if (error === null && event.colno === 0 && event.lineno === 0) {
   4176            isCrossOriginError = true;
   4177          }
   4178
   4179          if (event.defaultPrevented) {
   4180            // Some other error handler has prevented default.
   4181            // Browsers silence the error report if this happens.
   4182            // We'll remember this to later decide whether to log it or not.
   4183            if (error != null && typeof error === 'object') {
   4184              try {
   4185                error._suppressLogging = true;
   4186              } catch (inner) {// Ignore.
   4187              }
   4188            }
   4189          }
   4190        } // Create a fake event type.
   4191
   4192
   4193        var evtType = "react-" + (name ? name : 'invokeguardedcallback'); // Attach our event handlers
   4194
   4195        window.addEventListener('error', handleWindowError);
   4196        fakeNode.addEventListener(evtType, callCallback, false); // Synchronously dispatch our fake event. If the user-provided function
   4197        // errors, it will trigger our global error handler.
   4198
   4199        evt.initEvent(evtType, false, false);
   4200        fakeNode.dispatchEvent(evt);
   4201
   4202        if (windowEventDescriptor) {
   4203          Object.defineProperty(window, 'event', windowEventDescriptor);
   4204        }
   4205
   4206        if (didCall && didError) {
   4207          if (!didSetError) {
   4208            // The callback errored, but the error event never fired.
   4209            // eslint-disable-next-line react-internal/prod-error-codes
   4210            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.');
   4211          } else if (isCrossOriginError) {
   4212            // eslint-disable-next-line react-internal/prod-error-codes
   4213            error = new Error("A cross-origin error was thrown. React doesn't have access to " + 'the actual error object in development. ' + 'See https://reactjs.org/link/crossorigin-error for more information.');
   4214          }
   4215
   4216          this.onError(error);
   4217        } // Remove our event listeners
   4218
   4219
   4220        window.removeEventListener('error', handleWindowError);
   4221
   4222        if (!didCall) {
   4223          // Something went really wrong, and our event was not dispatched.
   4224          // https://github.com/facebook/react/issues/16734
   4225          // https://github.com/facebook/react/issues/16585
   4226          // Fall back to the production implementation.
   4227          restoreAfterDispatch();
   4228          return invokeGuardedCallbackProd.apply(this, arguments);
   4229        }
   4230      };
   4231    }
   4232  }
   4233
   4234  var invokeGuardedCallbackImpl$1 = invokeGuardedCallbackImpl;
   4235
   4236  var hasError = false;
   4237  var caughtError = null; // Used by event system to capture/rethrow the first error.
   4238
   4239  var hasRethrowError = false;
   4240  var rethrowError = null;
   4241  var reporter = {
   4242    onError: function (error) {
   4243      hasError = true;
   4244      caughtError = error;
   4245    }
   4246  };
   4247  /**
   4248   * Call a function while guarding against errors that happens within it.
   4249   * Returns an error if it throws, otherwise null.
   4250   *
   4251   * In production, this is implemented using a try-catch. The reason we don't
   4252   * use a try-catch directly is so that we can swap out a different
   4253   * implementation in DEV mode.
   4254   *
   4255   * @param {String} name of the guard to use for logging or debugging
   4256   * @param {Function} func The function to invoke
   4257   * @param {*} context The context to use when calling the function
   4258   * @param {...*} args Arguments for function
   4259   */
   4260
   4261  function invokeGuardedCallback(name, func, context, a, b, c, d, e, f) {
   4262    hasError = false;
   4263    caughtError = null;
   4264    invokeGuardedCallbackImpl$1.apply(reporter, arguments);
   4265  }
   4266  /**
   4267   * Same as invokeGuardedCallback, but instead of returning an error, it stores
   4268   * it in a global so it can be rethrown by `rethrowCaughtError` later.
   4269   * TODO: See if caughtError and rethrowError can be unified.
   4270   *
   4271   * @param {String} name of the guard to use for logging or debugging
   4272   * @param {Function} func The function to invoke
   4273   * @param {*} context The context to use when calling the function
   4274   * @param {...*} args Arguments for function
   4275   */
   4276
   4277  function invokeGuardedCallbackAndCatchFirstError(name, func, context, a, b, c, d, e, f) {
   4278    invokeGuardedCallback.apply(this, arguments);
   4279
   4280    if (hasError) {
   4281      var error = clearCaughtError();
   4282
   4283      if (!hasRethrowError) {
   4284        hasRethrowError = true;
   4285        rethrowError = error;
   4286      }
   4287    }
   4288  }
   4289  /**
   4290   * During execution of guarded functions we will capture the first error which
   4291   * we will rethrow to be handled by the top level error handler.
   4292   */
   4293
   4294  function rethrowCaughtError() {
   4295    if (hasRethrowError) {
   4296      var error = rethrowError;
   4297      hasRethrowError = false;
   4298      rethrowError = null;
   4299      throw error;
   4300    }
   4301  }
   4302  function hasCaughtError() {
   4303    return hasError;
   4304  }
   4305  function clearCaughtError() {
   4306    if (hasError) {
   4307      var error = caughtError;
   4308      hasError = false;
   4309      caughtError = null;
   4310      return error;
   4311    } else {
   4312      throw new Error('clearCaughtError was called but no error was captured. This error ' + 'is likely caused by a bug in React. Please file an issue.');
   4313    }
   4314  }
   4315
   4316  var ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
   4317  var _ReactInternals$Sched = ReactInternals.Scheduler,
   4318      unstable_cancelCallback = _ReactInternals$Sched.unstable_cancelCallback,
   4319      unstable_now = _ReactInternals$Sched.unstable_now,
   4320      unstable_scheduleCallback = _ReactInternals$Sched.unstable_scheduleCallback,
   4321      unstable_shouldYield = _ReactInternals$Sched.unstable_shouldYield,
   4322      unstable_requestPaint = _ReactInternals$Sched.unstable_requestPaint,
   4323      unstable_getFirstCallbackNode = _ReactInternals$Sched.unstable_getFirstCallbackNode,
   4324      unstable_runWithPriority = _ReactInternals$Sched.unstable_runWithPriority,
   4325      unstable_next = _ReactInternals$Sched.unstable_next,
   4326      unstable_continueExecution = _ReactInternals$Sched.unstable_continueExecution,
   4327      unstable_pauseExecution = _ReactInternals$Sched.unstable_pauseExecution,
   4328      unstable_getCurrentPriorityLevel = _ReactInternals$Sched.unstable_getCurrentPriorityLevel,
   4329      unstable_ImmediatePriority = _ReactInternals$Sched.unstable_ImmediatePriority,
   4330      unstable_UserBlockingPriority = _ReactInternals$Sched.unstable_UserBlockingPriority,
   4331      unstable_NormalPriority = _ReactInternals$Sched.unstable_NormalPriority,
   4332      unstable_LowPriority = _ReactInternals$Sched.unstable_LowPriority,
   4333      unstable_IdlePriority = _ReactInternals$Sched.unstable_IdlePriority,
   4334      unstable_forceFrameRate = _ReactInternals$Sched.unstable_forceFrameRate,
   4335      unstable_flushAllWithoutAsserting = _ReactInternals$Sched.unstable_flushAllWithoutAsserting,
   4336      unstable_yieldValue = _ReactInternals$Sched.unstable_yieldValue,
   4337      unstable_setDisableYieldValue = _ReactInternals$Sched.unstable_setDisableYieldValue;
   4338
   4339  /**
   4340   * `ReactInstanceMap` maintains a mapping from a public facing stateful
   4341   * instance (key) and the internal representation (value). This allows public
   4342   * methods to accept the user facing instance as an argument and map them back
   4343   * to internal methods.
   4344   *
   4345   * Note that this module is currently shared and assumed to be stateless.
   4346   * If this becomes an actual Map, that will break.
   4347   */
   4348  function get(key) {
   4349    return key._reactInternals;
   4350  }
   4351  function has(key) {
   4352    return key._reactInternals !== undefined;
   4353  }
   4354  function set(key, value) {
   4355    key._reactInternals = value;
   4356  }
   4357
   4358  // Don't change these two values. They're used by React Dev Tools.
   4359  var NoFlags =
   4360  /*                      */
   4361  0;
   4362  var PerformedWork =
   4363  /*                */
   4364  1; // You can change the rest (and add more).
   4365
   4366  var Placement =
   4367  /*                    */
   4368  2;
   4369  var Update =
   4370  /*                       */
   4371  4;
   4372  var ChildDeletion =
   4373  /*                */
   4374  16;
   4375  var ContentReset =
   4376  /*                 */
   4377  32;
   4378  var Callback =
   4379  /*                     */
   4380  64;
   4381  var DidCapture =
   4382  /*                   */
   4383  128;
   4384  var ForceClientRender =
   4385  /*            */
   4386  256;
   4387  var Ref =
   4388  /*                          */
   4389  512;
   4390  var Snapshot =
   4391  /*                     */
   4392  1024;
   4393  var Passive =
   4394  /*                      */
   4395  2048;
   4396  var Hydrating =
   4397  /*                    */
   4398  4096;
   4399  var Visibility =
   4400  /*                   */
   4401  8192;
   4402  var StoreConsistency =
   4403  /*             */
   4404  16384;
   4405  var LifecycleEffectMask = Passive | Update | Callback | Ref | Snapshot | StoreConsistency; // Union of all commit flags (flags with the lifetime of a particular commit)
   4406
   4407  var HostEffectMask =
   4408  /*               */
   4409  32767; // These are not really side effects, but we still reuse this field.
   4410
   4411  var Incomplete =
   4412  /*                   */
   4413  32768;
   4414  var ShouldCapture =
   4415  /*                */
   4416  65536;
   4417  var ForceUpdateForLegacySuspense =
   4418  /* */
   4419  131072;
   4420  var Forked =
   4421  /*                       */
   4422  1048576; // Static tags describe aspects of a fiber that are not specific to a render,
   4423  // e.g. a fiber uses a passive effect (even if there are no updates on this particular render).
   4424  // This enables us to defer more work in the unmount case,
   4425  // since we can defer traversing the tree during layout to look for Passive effects,
   4426  // and instead rely on the static flag as a signal that there may be cleanup work.
   4427
   4428  var RefStatic =
   4429  /*                    */
   4430  2097152;
   4431  var LayoutStatic =
   4432  /*                 */
   4433  4194304;
   4434  var PassiveStatic =
   4435  /*                */
   4436  8388608; // These flags allow us to traverse to fibers that have effects on mount
   4437  // without traversing the entire tree after every commit for
   4438  // double invoking
   4439
   4440  var MountLayoutDev =
   4441  /*               */
   4442  16777216;
   4443  var MountPassiveDev =
   4444  /*              */
   4445  33554432; // Groups of flags that are used in the commit phase to skip over trees that
   4446  // don't contain effects, by checking subtreeFlags.
   4447
   4448  var BeforeMutationMask = // TODO: Remove Update flag from before mutation phase by re-landing Visibility
   4449  // flag logic (see #20043)
   4450  Update | Snapshot | ( 0);
   4451  var MutationMask = Placement | Update | ChildDeletion | ContentReset | Ref | Hydrating | Visibility;
   4452  var LayoutMask = Update | Callback | Ref | Visibility; // TODO: Split into PassiveMountMask and PassiveUnmountMask
   4453
   4454  var PassiveMask = Passive | ChildDeletion; // Union of tags that don't get reset on clones.
   4455  // This allows certain concepts to persist without recalculating them,
   4456  // e.g. whether a subtree contains passive effects or portals.
   4457
   4458  var StaticMask = LayoutStatic | PassiveStatic | RefStatic;
   4459
   4460  var ReactCurrentOwner = ReactSharedInternals.ReactCurrentOwner;
   4461  function getNearestMountedFiber(fiber) {
   4462    var node = fiber;
   4463    var nearestMounted = fiber;
   4464
   4465    if (!fiber.alternate) {
   4466      // If there is no alternate, this might be a new tree that isn't inserted
   4467      // yet. If it is, then it will have a pending insertion effect on it.
   4468      var nextNode = node;
   4469
   4470      do {
   4471        node = nextNode;
   4472
   4473        if ((node.flags & (Placement | Hydrating)) !== NoFlags) {
   4474          // This is an insertion or in-progress hydration. The nearest possible
   4475          // mounted fiber is the parent but we need to continue to figure out
   4476          // if that one is still mounted.
   4477          nearestMounted = node.return;
   4478        }
   4479
   4480        nextNode = node.return;
   4481      } while (nextNode);
   4482    } else {
   4483      while (node.return) {
   4484        node = node.return;
   4485      }
   4486    }
   4487
   4488    if (node.tag === HostRoot) {
   4489      // TODO: Check if this was a nested HostRoot when used with
   4490      // renderContainerIntoSubtree.
   4491      return nearestMounted;
   4492    } // If we didn't hit the root, that means that we're in an disconnected tree
   4493    // that has been unmounted.
   4494
   4495
   4496    return null;
   4497  }
   4498  function getSuspenseInstanceFromFiber(fiber) {
   4499    if (fiber.tag === SuspenseComponent) {
   4500      var suspenseState = fiber.memoizedState;
   4501
   4502      if (suspenseState === null) {
   4503        var current = fiber.alternate;
   4504
   4505        if (current !== null) {
   4506          suspenseState = current.memoizedState;
   4507        }
   4508      }
   4509
   4510      if (suspenseState !== null) {
   4511        return suspenseState.dehydrated;
   4512      }
   4513    }
   4514
   4515    return null;
   4516  }
   4517  function getContainerFromFiber(fiber) {
   4518    return fiber.tag === HostRoot ? fiber.stateNode.containerInfo : null;
   4519  }
   4520  function isFiberMounted(fiber) {
   4521    return getNearestMountedFiber(fiber) === fiber;
   4522  }
   4523  function isMounted(component) {
   4524    {
   4525      var owner = ReactCurrentOwner.current;
   4526
   4527      if (owner !== null && owner.tag === ClassComponent) {
   4528        var ownerFiber = owner;
   4529        var instance = ownerFiber.stateNode;
   4530
   4531        if (!instance._warnedAboutRefsInRender) {
   4532          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.', getComponentNameFromFiber(ownerFiber) || 'A component');
   4533        }
   4534
   4535        instance._warnedAboutRefsInRender = true;
   4536      }
   4537    }
   4538
   4539    var fiber = get(component);
   4540
   4541    if (!fiber) {
   4542      return false;
   4543    }
   4544
   4545    return getNearestMountedFiber(fiber) === fiber;
   4546  }
   4547
   4548  function assertIsMounted(fiber) {
   4549    if (getNearestMountedFiber(fiber) !== fiber) {
   4550      throw new Error('Unable to find node on an unmounted component.');
   4551    }
   4552  }
   4553
   4554  function findCurrentFiberUsingSlowPath(fiber) {
   4555    var alternate = fiber.alternate;
   4556
   4557    if (!alternate) {
   4558      // If there is no alternate, then we only need to check if it is mounted.
   4559      var nearestMounted = getNearestMountedFiber(fiber);
   4560
   4561      if (nearestMounted === null) {
   4562        throw new Error('Unable to find node on an unmounted component.');
   4563      }
   4564
   4565      if (nearestMounted !== fiber) {
   4566        return null;
   4567      }
   4568
   4569      return fiber;
   4570    } // If we have two possible branches, we'll walk backwards up to the root
   4571    // to see what path the root points to. On the way we may hit one of the
   4572    // special cases and we'll deal with them.
   4573
   4574
   4575    var a = fiber;
   4576    var b = alternate;
   4577
   4578    while (true) {
   4579      var parentA = a.return;
   4580
   4581      if (parentA === null) {
   4582        // We're at the root.
   4583        break;
   4584      }
   4585
   4586      var parentB = parentA.alternate;
   4587
   4588      if (parentB === null) {
   4589        // There is no alternate. This is an unusual case. Currently, it only
   4590        // happens when a Suspense component is hidden. An extra fragment fiber
   4591        // is inserted in between the Suspense fiber and its children. Skip
   4592        // over this extra fragment fiber and proceed to the next parent.
   4593        var nextParent = parentA.return;
   4594
   4595        if (nextParent !== null) {
   4596          a = b = nextParent;
   4597          continue;
   4598        } // If there's no parent, we're at the root.
   4599
   4600
   4601        break;
   4602      } // If both copies of the parent fiber point to the same child, we can
   4603      // assume that the child is current. This happens when we bailout on low
   4604      // priority: the bailed out fiber's child reuses the current child.
   4605
   4606
   4607      if (parentA.child === parentB.child) {
   4608        var child = parentA.child;
   4609
   4610        while (child) {
   4611          if (child === a) {
   4612            // We've determined that A is the current branch.
   4613            assertIsMounted(parentA);
   4614            return fiber;
   4615          }
   4616
   4617          if (child === b) {
   4618            // We've determined that B is the current branch.
   4619            assertIsMounted(parentA);
   4620            return alternate;
   4621          }
   4622
   4623          child = child.sibling;
   4624        } // We should never have an alternate for any mounting node. So the only
   4625        // way this could possibly happen is if this was unmounted, if at all.
   4626
   4627
   4628        throw new Error('Unable to find node on an unmounted component.');
   4629      }
   4630
   4631      if (a.return !== b.return) {
   4632        // The return pointer of A and the return pointer of B point to different
   4633        // fibers. We assume that return pointers never criss-cross, so A must
   4634        // belong to the child set of A.return, and B must belong to the child
   4635        // set of B.return.
   4636        a = parentA;
   4637        b = parentB;
   4638      } else {
   4639        // The return pointers point to the same fiber. We'll have to use the
   4640        // default, slow path: scan the child sets of each parent alternate to see
   4641        // which child belongs to which set.
   4642        //
   4643        // Search parent A's child set
   4644        var didFindChild = false;
   4645        var _child = parentA.child;
   4646
   4647        while (_child) {
   4648          if (_child === a) {
   4649            didFindChild = true;
   4650            a = parentA;
   4651            b = parentB;
   4652            break;
   4653          }
   4654
   4655          if (_child === b) {
   4656            didFindChild = true;
   4657            b = parentA;
   4658            a = parentB;
   4659            break;
   4660          }
   4661
   4662          _child = _child.sibling;
   4663        }
   4664
   4665        if (!didFindChild) {
   4666          // Search parent B's child set
   4667          _child = parentB.child;
   4668
   4669          while (_child) {
   4670            if (_child === a) {
   4671              didFindChild = true;
   4672              a = parentB;
   4673              b = parentA;
   4674              break;
   4675            }
   4676
   4677            if (_child === b) {
   4678              didFindChild = true;
   4679              b = parentB;
   4680              a = parentA;
   4681              break;
   4682            }
   4683
   4684            _child = _child.sibling;
   4685          }
   4686
   4687          if (!didFindChild) {
   4688            throw new Error('Child was not found in either parent set. This indicates a bug ' + 'in React related to the return pointer. Please file an issue.');
   4689          }
   4690        }
   4691      }
   4692
   4693      if (a.alternate !== b) {
   4694        throw new Error("Return fibers should always be each others' alternates. " + 'This error is likely caused by a bug in React. Please file an issue.');
   4695      }
   4696    } // If the root is not a host container, we're in a disconnected tree. I.e.
   4697    // unmounted.
   4698
   4699
   4700    if (a.tag !== HostRoot) {
   4701      throw new Error('Unable to find node on an unmounted component.');
   4702    }
   4703
   4704    if (a.stateNode.current === a) {
   4705      // We've determined that A is the current branch.
   4706      return fiber;
   4707    } // Otherwise B has to be current branch.
   4708
   4709
   4710    return alternate;
   4711  }
   4712  function findCurrentHostFiber(parent) {
   4713    var currentParent = findCurrentFiberUsingSlowPath(parent);
   4714    return currentParent !== null ? findCurrentHostFiberImpl(currentParent) : null;
   4715  }
   4716
   4717  function findCurrentHostFiberImpl(node) {
   4718    // Next we'll drill down this component to find the first HostComponent/Text.
   4719    if (node.tag === HostComponent || node.tag === HostText) {
   4720      return node;
   4721    }
   4722
   4723    var child = node.child;
   4724
   4725    while (child !== null) {
   4726      var match = findCurrentHostFiberImpl(child);
   4727
   4728      if (match !== null) {
   4729        return match;
   4730      }
   4731
   4732      child = child.sibling;
   4733    }
   4734
   4735    return null;
   4736  }
   4737
   4738  function findCurrentHostFiberWithNoPortals(parent) {
   4739    var currentParent = findCurrentFiberUsingSlowPath(parent);
   4740    return currentParent !== null ? findCurrentHostFiberWithNoPortalsImpl(currentParent) : null;
   4741  }
   4742
   4743  function findCurrentHostFiberWithNoPortalsImpl(node) {
   4744    // Next we'll drill down this component to find the first HostComponent/Text.
   4745    if (node.tag === HostComponent || node.tag === HostText) {
   4746      return node;
   4747    }
   4748
   4749    var child = node.child;
   4750
   4751    while (child !== null) {
   4752      if (child.tag !== HostPortal) {
   4753        var match = findCurrentHostFiberWithNoPortalsImpl(child);
   4754
   4755        if (match !== null) {
   4756          return match;
   4757        }
   4758      }
   4759
   4760      child = child.sibling;
   4761    }
   4762
   4763    return null;
   4764  }
   4765
   4766  // This module only exists as an ESM wrapper around the external CommonJS
   4767  var scheduleCallback = unstable_scheduleCallback;
   4768  var cancelCallback = unstable_cancelCallback;
   4769  var shouldYield = unstable_shouldYield;
   4770  var requestPaint = unstable_requestPaint;
   4771  var now = unstable_now;
   4772  var getCurrentPriorityLevel = unstable_getCurrentPriorityLevel;
   4773  var ImmediatePriority = unstable_ImmediatePriority;
   4774  var UserBlockingPriority = unstable_UserBlockingPriority;
   4775  var NormalPriority = unstable_NormalPriority;
   4776  var LowPriority = unstable_LowPriority;
   4777  var IdlePriority = unstable_IdlePriority;
   4778  // this doesn't actually exist on the scheduler, but it *does*
   4779  // on scheduler/unstable_mock, which we'll need for internal testing
   4780  var unstable_yieldValue$1 = unstable_yieldValue;
   4781  var unstable_setDisableYieldValue$1 = unstable_setDisableYieldValue;
   4782
   4783  var rendererID = null;
   4784  var injectedHook = null;
   4785  var injectedProfilingHooks = null;
   4786  var hasLoggedError = false;
   4787  var isDevToolsPresent = typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ !== 'undefined';
   4788  function injectInternals(internals) {
   4789    if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {
   4790      // No DevTools
   4791      return false;
   4792    }
   4793
   4794    var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
   4795
   4796    if (hook.isDisabled) {
   4797      // This isn't a real property on the hook, but it can be set to opt out
   4798      // of DevTools integration and associated warnings and logs.
   4799      // https://github.com/facebook/react/issues/3877
   4800      return true;
   4801    }
   4802
   4803    if (!hook.supportsFiber) {
   4804      {
   4805        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://reactjs.org/link/react-devtools');
   4806      } // DevTools exists, even though it doesn't support Fiber.
   4807
   4808
   4809      return true;
   4810    }
   4811
   4812    try {
   4813      if (enableSchedulingProfiler) {
   4814        // Conditionally inject these hooks only if Timeline profiler is supported by this build.
   4815        // This gives DevTools a way to feature detect that isn't tied to version number
   4816        // (since profiling and timeline are controlled by different feature flags).
   4817        internals = assign({}, internals, {
   4818          getLaneLabelMap: getLaneLabelMap,
   4819          injectProfilingHooks: injectProfilingHooks
   4820        });
   4821      }
   4822
   4823      rendererID = hook.inject(internals); // We have successfully injected, so now it is safe to set up hooks.
   4824
   4825      injectedHook = hook;
   4826    } catch (err) {
   4827      // Catch all errors because it is unsafe to throw during initialization.
   4828      {
   4829        error('React instrumentation encountered an error: %s.', err);
   4830      }
   4831    }
   4832
   4833    if (hook.checkDCE) {
   4834      // This is the real DevTools.
   4835      return true;
   4836    } else {
   4837      // This is likely a hook installed by Fast Refresh runtime.
   4838      return false;
   4839    }
   4840  }
   4841  function onScheduleRoot(root, children) {
   4842    {
   4843      if (injectedHook && typeof injectedHook.onScheduleFiberRoot === 'function') {
   4844        try {
   4845          injectedHook.onScheduleFiberRoot(rendererID, root, children);
   4846        } catch (err) {
   4847          if ( !hasLoggedError) {
   4848            hasLoggedError = true;
   4849
   4850            error('React instrumentation encountered an error: %s', err);
   4851          }
   4852        }
   4853      }
   4854    }
   4855  }
   4856  function onCommitRoot(root, eventPriority) {
   4857    if (injectedHook && typeof injectedHook.onCommitFiberRoot === 'function') {
   4858      try {
   4859        var didError = (root.current.flags & DidCapture) === DidCapture;
   4860
   4861        if (enableProfilerTimer) {
   4862          var schedulerPriority;
   4863
   4864          switch (eventPriority) {
   4865            case DiscreteEventPriority:
   4866              schedulerPriority = ImmediatePriority;
   4867              break;
   4868
   4869            case ContinuousEventPriority:
   4870              schedulerPriority = UserBlockingPriority;
   4871              break;
   4872
   4873            case DefaultEventPriority:
   4874              schedulerPriority = NormalPriority;
   4875              break;
   4876
   4877            case IdleEventPriority:
   4878              schedulerPriority = IdlePriority;
   4879              break;
   4880
   4881            default:
   4882              schedulerPriority = NormalPriority;
   4883              break;
   4884          }
   4885
   4886          injectedHook.onCommitFiberRoot(rendererID, root, schedulerPriority, didError);
   4887        } else {
   4888          injectedHook.onCommitFiberRoot(rendererID, root, undefined, didError);
   4889        }
   4890      } catch (err) {
   4891        {
   4892          if (!hasLoggedError) {
   4893            hasLoggedError = true;
   4894
   4895            error('React instrumentation encountered an error: %s', err);
   4896          }
   4897        }
   4898      }
   4899    }
   4900  }
   4901  function onPostCommitRoot(root) {
   4902    if (injectedHook && typeof injectedHook.onPostCommitFiberRoot === 'function') {
   4903      try {
   4904        injectedHook.onPostCommitFiberRoot(rendererID, root);
   4905      } catch (err) {
   4906        {
   4907          if (!hasLoggedError) {
   4908            hasLoggedError = true;
   4909
   4910            error('React instrumentation encountered an error: %s', err);
   4911          }
   4912        }
   4913      }
   4914    }
   4915  }
   4916  function onCommitUnmount(fiber) {
   4917    if (injectedHook && typeof injectedHook.onCommitFiberUnmount === 'function') {
   4918      try {
   4919        injectedHook.onCommitFiberUnmount(rendererID, fiber);
   4920      } catch (err) {
   4921        {
   4922          if (!hasLoggedError) {
   4923            hasLoggedError = true;
   4924
   4925            error('React instrumentation encountered an error: %s', err);
   4926          }
   4927        }
   4928      }
   4929    }
   4930  }
   4931  function setIsStrictModeForDevtools(newIsStrictMode) {
   4932    {
   4933      if (typeof unstable_yieldValue$1 === 'function') {
   4934        // We're in a test because Scheduler.unstable_yieldValue only exists
   4935        // in SchedulerMock. To reduce the noise in strict mode tests,
   4936        // suppress warnings and disable scheduler yielding during the double render
   4937        unstable_setDisableYieldValue$1(newIsStrictMode);
   4938        setSuppressWarning(newIsStrictMode);
   4939      }
   4940
   4941      if (injectedHook && typeof injectedHook.setStrictMode === 'function') {
   4942        try {
   4943          injectedHook.setStrictMode(rendererID, newIsStrictMode);
   4944        } catch (err) {
   4945          {
   4946            if (!hasLoggedError) {
   4947              hasLoggedError = true;
   4948
   4949              error('React instrumentation encountered an error: %s', err);
   4950            }
   4951          }
   4952        }
   4953      }
   4954    }
   4955  } // Profiler API hooks
   4956
   4957  function injectProfilingHooks(profilingHooks) {
   4958    injectedProfilingHooks = profilingHooks;
   4959  }
   4960
   4961  function getLaneLabelMap() {
   4962    {
   4963      var map = new Map();
   4964      var lane = 1;
   4965
   4966      for (var index = 0; index < TotalLanes; index++) {
   4967        var label = getLabelForLane(lane);
   4968        map.set(lane, label);
   4969        lane *= 2;
   4970      }
   4971
   4972      return map;
   4973    }
   4974  }
   4975
   4976  function markCommitStarted(lanes) {
   4977    {
   4978      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStarted === 'function') {
   4979        injectedProfilingHooks.markCommitStarted(lanes);
   4980      }
   4981    }
   4982  }
   4983  function markCommitStopped() {
   4984    {
   4985      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markCommitStopped === 'function') {
   4986        injectedProfilingHooks.markCommitStopped();
   4987      }
   4988    }
   4989  }
   4990  function markComponentRenderStarted(fiber) {
   4991    {
   4992      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStarted === 'function') {
   4993        injectedProfilingHooks.markComponentRenderStarted(fiber);
   4994      }
   4995    }
   4996  }
   4997  function markComponentRenderStopped() {
   4998    {
   4999      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentRenderStopped === 'function') {
   5000        injectedProfilingHooks.markComponentRenderStopped();
   5001      }
   5002    }
   5003  }
   5004  function markComponentPassiveEffectMountStarted(fiber) {
   5005    {
   5006      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStarted === 'function') {
   5007        injectedProfilingHooks.markComponentPassiveEffectMountStarted(fiber);
   5008      }
   5009    }
   5010  }
   5011  function markComponentPassiveEffectMountStopped() {
   5012    {
   5013      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectMountStopped === 'function') {
   5014        injectedProfilingHooks.markComponentPassiveEffectMountStopped();
   5015      }
   5016    }
   5017  }
   5018  function markComponentPassiveEffectUnmountStarted(fiber) {
   5019    {
   5020      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStarted === 'function') {
   5021        injectedProfilingHooks.markComponentPassiveEffectUnmountStarted(fiber);
   5022      }
   5023    }
   5024  }
   5025  function markComponentPassiveEffectUnmountStopped() {
   5026    {
   5027      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentPassiveEffectUnmountStopped === 'function') {
   5028        injectedProfilingHooks.markComponentPassiveEffectUnmountStopped();
   5029      }
   5030    }
   5031  }
   5032  function markComponentLayoutEffectMountStarted(fiber) {
   5033    {
   5034      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStarted === 'function') {
   5035        injectedProfilingHooks.markComponentLayoutEffectMountStarted(fiber);
   5036      }
   5037    }
   5038  }
   5039  function markComponentLayoutEffectMountStopped() {
   5040    {
   5041      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectMountStopped === 'function') {
   5042        injectedProfilingHooks.markComponentLayoutEffectMountStopped();
   5043      }
   5044    }
   5045  }
   5046  function markComponentLayoutEffectUnmountStarted(fiber) {
   5047    {
   5048      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStarted === 'function') {
   5049        injectedProfilingHooks.markComponentLayoutEffectUnmountStarted(fiber);
   5050      }
   5051    }
   5052  }
   5053  function markComponentLayoutEffectUnmountStopped() {
   5054    {
   5055      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentLayoutEffectUnmountStopped === 'function') {
   5056        injectedProfilingHooks.markComponentLayoutEffectUnmountStopped();
   5057      }
   5058    }
   5059  }
   5060  function markComponentErrored(fiber, thrownValue, lanes) {
   5061    {
   5062      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentErrored === 'function') {
   5063        injectedProfilingHooks.markComponentErrored(fiber, thrownValue, lanes);
   5064      }
   5065    }
   5066  }
   5067  function markComponentSuspended(fiber, wakeable, lanes) {
   5068    {
   5069      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markComponentSuspended === 'function') {
   5070        injectedProfilingHooks.markComponentSuspended(fiber, wakeable, lanes);
   5071      }
   5072    }
   5073  }
   5074  function markLayoutEffectsStarted(lanes) {
   5075    {
   5076      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStarted === 'function') {
   5077        injectedProfilingHooks.markLayoutEffectsStarted(lanes);
   5078      }
   5079    }
   5080  }
   5081  function markLayoutEffectsStopped() {
   5082    {
   5083      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markLayoutEffectsStopped === 'function') {
   5084        injectedProfilingHooks.markLayoutEffectsStopped();
   5085      }
   5086    }
   5087  }
   5088  function markPassiveEffectsStarted(lanes) {
   5089    {
   5090      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStarted === 'function') {
   5091        injectedProfilingHooks.markPassiveEffectsStarted(lanes);
   5092      }
   5093    }
   5094  }
   5095  function markPassiveEffectsStopped() {
   5096    {
   5097      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markPassiveEffectsStopped === 'function') {
   5098        injectedProfilingHooks.markPassiveEffectsStopped();
   5099      }
   5100    }
   5101  }
   5102  function markRenderStarted(lanes) {
   5103    {
   5104      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStarted === 'function') {
   5105        injectedProfilingHooks.markRenderStarted(lanes);
   5106      }
   5107    }
   5108  }
   5109  function markRenderYielded() {
   5110    {
   5111      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderYielded === 'function') {
   5112        injectedProfilingHooks.markRenderYielded();
   5113      }
   5114    }
   5115  }
   5116  function markRenderStopped() {
   5117    {
   5118      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderStopped === 'function') {
   5119        injectedProfilingHooks.markRenderStopped();
   5120      }
   5121    }
   5122  }
   5123  function markRenderScheduled(lane) {
   5124    {
   5125      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markRenderScheduled === 'function') {
   5126        injectedProfilingHooks.markRenderScheduled(lane);
   5127      }
   5128    }
   5129  }
   5130  function markForceUpdateScheduled(fiber, lane) {
   5131    {
   5132      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markForceUpdateScheduled === 'function') {
   5133        injectedProfilingHooks.markForceUpdateScheduled(fiber, lane);
   5134      }
   5135    }
   5136  }
   5137  function markStateUpdateScheduled(fiber, lane) {
   5138    {
   5139      if (injectedProfilingHooks !== null && typeof injectedProfilingHooks.markStateUpdateScheduled === 'function') {
   5140        injectedProfilingHooks.markStateUpdateScheduled(fiber, lane);
   5141      }
   5142    }
   5143  }
   5144
   5145  var NoMode =
   5146  /*                         */
   5147  0; // TODO: Remove ConcurrentMode by reading from the root tag instead
   5148
   5149  var ConcurrentMode =
   5150  /*                 */
   5151  1;
   5152  var ProfileMode =
   5153  /*                    */
   5154  2;
   5155  var StrictLegacyMode =
   5156  /*               */
   5157  8;
   5158  var StrictEffectsMode =
   5159  /*              */
   5160  16;
   5161
   5162  // TODO: This is pretty well supported by browsers. Maybe we can drop it.
   5163  var clz32 = Math.clz32 ? Math.clz32 : clz32Fallback; // Count leading zeros.
   5164  // Based on:
   5165  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/clz32
   5166
   5167  var log = Math.log;
   5168  var LN2 = Math.LN2;
   5169
   5170  function clz32Fallback(x) {
   5171    var asUint = x >>> 0;
   5172
   5173    if (asUint === 0) {
   5174      return 32;
   5175    }
   5176
   5177    return 31 - (log(asUint) / LN2 | 0) | 0;
   5178  }
   5179
   5180  // If those values are changed that package should be rebuilt and redeployed.
   5181
   5182  var TotalLanes = 31;
   5183  var NoLanes =
   5184  /*                        */
   5185  0;
   5186  var NoLane =
   5187  /*                          */
   5188  0;
   5189  var SyncLane =
   5190  /*                        */
   5191  1;
   5192  var InputContinuousHydrationLane =
   5193  /*    */
   5194  2;
   5195  var InputContinuousLane =
   5196  /*             */
   5197  4;
   5198  var DefaultHydrationLane =
   5199  /*            */
   5200  8;
   5201  var DefaultLane =
   5202  /*                     */
   5203  16;
   5204  var TransitionHydrationLane =
   5205  /*                */
   5206  32;
   5207  var TransitionLanes =
   5208  /*                       */
   5209  4194240;
   5210  var TransitionLane1 =
   5211  /*                        */
   5212  64;
   5213  var TransitionLane2 =
   5214  /*                        */
   5215  128;
   5216  var TransitionLane3 =
   5217  /*                        */
   5218  256;
   5219  var TransitionLane4 =
   5220  /*                        */
   5221  512;
   5222  var TransitionLane5 =
   5223  /*                        */
   5224  1024;
   5225  var TransitionLane6 =
   5226  /*                        */
   5227  2048;
   5228  var TransitionLane7 =
   5229  /*                        */
   5230  4096;
   5231  var TransitionLane8 =
   5232  /*                        */
   5233  8192;
   5234  var TransitionLane9 =
   5235  /*                        */
   5236  16384;
   5237  var TransitionLane10 =
   5238  /*                       */
   5239  32768;
   5240  var TransitionLane11 =
   5241  /*                       */
   5242  65536;
   5243  var TransitionLane12 =
   5244  /*                       */
   5245  131072;
   5246  var TransitionLane13 =
   5247  /*                       */
   5248  262144;
   5249  var TransitionLane14 =
   5250  /*                       */
   5251  524288;
   5252  var TransitionLane15 =
   5253  /*                       */
   5254  1048576;
   5255  var TransitionLane16 =
   5256  /*                       */
   5257  2097152;
   5258  var RetryLanes =
   5259  /*                            */
   5260  130023424;
   5261  var RetryLane1 =
   5262  /*                             */
   5263  4194304;
   5264  var RetryLane2 =
   5265  /*                             */
   5266  8388608;
   5267  var RetryLane3 =
   5268  /*                             */
   5269  16777216;
   5270  var RetryLane4 =
   5271  /*                             */
   5272  33554432;
   5273  var RetryLane5 =
   5274  /*                             */
   5275  67108864;
   5276  var SomeRetryLane = RetryLane1;
   5277  var SelectiveHydrationLane =
   5278  /*          */
   5279  134217728;
   5280  var NonIdleLanes =
   5281  /*                          */
   5282  268435455;
   5283  var IdleHydrationLane =
   5284  /*               */
   5285  268435456;
   5286  var IdleLane =
   5287  /*                        */
   5288  536870912;
   5289  var OffscreenLane =
   5290  /*                   */
   5291  1073741824; // This function is used for the experimental timeline (react-devtools-timeline)
   5292  // It should be kept in sync with the Lanes values above.
   5293
   5294  function getLabelForLane(lane) {
   5295    {
   5296      if (lane & SyncLane) {
   5297        return 'Sync';
   5298      }
   5299
   5300      if (lane & InputContinuousHydrationLane) {
   5301        return 'InputContinuousHydration';
   5302      }
   5303
   5304      if (lane & InputContinuousLane) {
   5305        return 'InputContinuous';
   5306      }
   5307
   5308      if (lane & DefaultHydrationLane) {
   5309        return 'DefaultHydration';
   5310      }
   5311
   5312      if (lane & DefaultLane) {
   5313        return 'Default';
   5314      }
   5315
   5316      if (lane & TransitionHydrationLane) {
   5317        return 'TransitionHydration';
   5318      }
   5319
   5320      if (lane & TransitionLanes) {
   5321        return 'Transition';
   5322      }
   5323
   5324      if (lane & RetryLanes) {
   5325        return 'Retry';
   5326      }
   5327
   5328      if (lane & SelectiveHydrationLane) {
   5329        return 'SelectiveHydration';
   5330      }
   5331
   5332      if (lane & IdleHydrationLane) {
   5333        return 'IdleHydration';
   5334      }
   5335
   5336      if (lane & IdleLane) {
   5337        return 'Idle';
   5338      }
   5339
   5340      if (lane & OffscreenLane) {
   5341        return 'Offscreen';
   5342      }
   5343    }
   5344  }
   5345  var NoTimestamp = -1;
   5346  var nextTransitionLane = TransitionLane1;
   5347  var nextRetryLane = RetryLane1;
   5348
   5349  function getHighestPriorityLanes(lanes) {
   5350    switch (getHighestPriorityLane(lanes)) {
   5351      case SyncLane:
   5352        return SyncLane;
   5353
   5354      case InputContinuousHydrationLane:
   5355        return InputContinuousHydrationLane;
   5356
   5357      case InputContinuousLane:
   5358        return InputContinuousLane;
   5359
   5360      case DefaultHydrationLane:
   5361        return DefaultHydrationLane;
   5362
   5363      case DefaultLane:
   5364        return DefaultLane;
   5365
   5366      case TransitionHydrationLane:
   5367        return TransitionHydrationLane;
   5368
   5369      case TransitionLane1:
   5370      case TransitionLane2:
   5371      case TransitionLane3:
   5372      case TransitionLane4:
   5373      case TransitionLane5:
   5374      case TransitionLane6:
   5375      case TransitionLane7:
   5376      case TransitionLane8:
   5377      case TransitionLane9:
   5378      case TransitionLane10:
   5379      case TransitionLane11:
   5380      case TransitionLane12:
   5381      case TransitionLane13:
   5382      case TransitionLane14:
   5383      case TransitionLane15:
   5384      case TransitionLane16:
   5385        return lanes & TransitionLanes;
   5386
   5387      case RetryLane1:
   5388      case RetryLane2:
   5389      case RetryLane3:
   5390      case RetryLane4:
   5391      case RetryLane5:
   5392        return lanes & RetryLanes;
   5393
   5394      case SelectiveHydrationLane:
   5395        return SelectiveHydrationLane;
   5396
   5397      case IdleHydrationLane:
   5398        return IdleHydrationLane;
   5399
   5400      case IdleLane:
   5401        return IdleLane;
   5402
   5403      case OffscreenLane:
   5404        return OffscreenLane;
   5405
   5406      default:
   5407        {
   5408          error('Should have found matching lanes. This is a bug in React.');
   5409        } // This shouldn't be reachable, but as a fallback, return the entire bitmask.
   5410
   5411
   5412        return lanes;
   5413    }
   5414  }
   5415
   5416  function getNextLanes(root, wipLanes) {
   5417    // Early bailout if there's no pending work left.
   5418    var pendingLanes = root.pendingLanes;
   5419
   5420    if (pendingLanes === NoLanes) {
   5421      return NoLanes;
   5422    }
   5423
   5424    var nextLanes = NoLanes;
   5425    var suspendedLanes = root.suspendedLanes;
   5426    var pingedLanes = root.pingedLanes; // Do not work on any idle work until all the non-idle work has finished,
   5427    // even if the work is suspended.
   5428
   5429    var nonIdlePendingLanes = pendingLanes & NonIdleLanes;
   5430
   5431    if (nonIdlePendingLanes !== NoLanes) {
   5432      var nonIdleUnblockedLanes = nonIdlePendingLanes & ~suspendedLanes;
   5433
   5434      if (nonIdleUnblockedLanes !== NoLanes) {
   5435        nextLanes = getHighestPriorityLanes(nonIdleUnblockedLanes);
   5436      } else {
   5437        var nonIdlePingedLanes = nonIdlePendingLanes & pingedLanes;
   5438
   5439        if (nonIdlePingedLanes !== NoLanes) {
   5440          nextLanes = getHighestPriorityLanes(nonIdlePingedLanes);
   5441        }
   5442      }
   5443    } else {
   5444      // The only remaining work is Idle.
   5445      var unblockedLanes = pendingLanes & ~suspendedLanes;
   5446
   5447      if (unblockedLanes !== NoLanes) {
   5448        nextLanes = getHighestPriorityLanes(unblockedLanes);
   5449      } else {
   5450        if (pingedLanes !== NoLanes) {
   5451          nextLanes = getHighestPriorityLanes(pingedLanes);
   5452        }
   5453      }
   5454    }
   5455
   5456    if (nextLanes === NoLanes) {
   5457      // This should only be reachable if we're suspended
   5458      // TODO: Consider warning in this path if a fallback timer is not scheduled.
   5459      return NoLanes;
   5460    } // If we're already in the middle of a render, switching lanes will interrupt
   5461    // it and we'll lose our progress. We should only do this if the new lanes are
   5462    // higher priority.
   5463
   5464
   5465    if (wipLanes !== NoLanes && wipLanes !== nextLanes && // If we already suspended with a delay, then interrupting is fine. Don't
   5466    // bother waiting until the root is complete.
   5467    (wipLanes & suspendedLanes) === NoLanes) {
   5468      var nextLane = getHighestPriorityLane(nextLanes);
   5469      var wipLane = getHighestPriorityLane(wipLanes);
   5470
   5471      if ( // Tests whether the next lane is equal or lower priority than the wip
   5472      // one. This works because the bits decrease in priority as you go left.
   5473      nextLane >= wipLane || // Default priority updates should not interrupt transition updates. The
   5474      // only difference between default updates and transition updates is that
   5475      // default updates do not support refresh transitions.
   5476      nextLane === DefaultLane && (wipLane & TransitionLanes) !== NoLanes) {
   5477        // Keep working on the existing in-progress tree. Do not interrupt.
   5478        return wipLanes;
   5479      }
   5480    }
   5481
   5482    if ((nextLanes & InputContinuousLane) !== NoLanes) {
   5483      // When updates are sync by default, we entangle continuous priority updates
   5484      // and default updates, so they render in the same batch. The only reason
   5485      // they use separate lanes is because continuous updates should interrupt
   5486      // transitions, but default updates should not.
   5487      nextLanes |= pendingLanes & DefaultLane;
   5488    } // Check for entangled lanes and add them to the batch.
   5489    //
   5490    // A lane is said to be entangled with another when it's not allowed to render
   5491    // in a batch that does not also include the other lane. Typically we do this
   5492    // when multiple updates have the same source, and we only want to respond to
   5493    // the most recent event from that source.
   5494    //
   5495    // Note that we apply entanglements *after* checking for partial work above.
   5496    // This means that if a lane is entangled during an interleaved event while
   5497    // it's already rendering, we won't interrupt it. This is intentional, since
   5498    // entanglement is usually "best effort": we'll try our best to render the
   5499    // lanes in the same batch, but it's not worth throwing out partially
   5500    // completed work in order to do it.
   5501    // TODO: Reconsider this. The counter-argument is that the partial work
   5502    // represents an intermediate state, which we don't want to show to the user.
   5503    // And by spending extra time finishing it, we're increasing the amount of
   5504    // time it takes to show the final state, which is what they are actually
   5505    // waiting for.
   5506    //
   5507    // For those exceptions where entanglement is semantically important, like
   5508    // useMutableSource, we should ensure that there is no partial work at the
   5509    // time we apply the entanglement.
   5510
   5511
   5512    var entangledLanes = root.entangledLanes;
   5513
   5514    if (entangledLanes !== NoLanes) {
   5515      var entanglements = root.entanglements;
   5516      var lanes = nextLanes & entangledLanes;
   5517
   5518      while (lanes > 0) {
   5519        var index = pickArbitraryLaneIndex(lanes);
   5520        var lane = 1 << index;
   5521        nextLanes |= entanglements[index];
   5522        lanes &= ~lane;
   5523      }
   5524    }
   5525
   5526    return nextLanes;
   5527  }
   5528  function getMostRecentEventTime(root, lanes) {
   5529    var eventTimes = root.eventTimes;
   5530    var mostRecentEventTime = NoTimestamp;
   5531
   5532    while (lanes > 0) {
   5533      var index = pickArbitraryLaneIndex(lanes);
   5534      var lane = 1 << index;
   5535      var eventTime = eventTimes[index];
   5536
   5537      if (eventTime > mostRecentEventTime) {
   5538        mostRecentEventTime = eventTime;
   5539      }
   5540
   5541      lanes &= ~lane;
   5542    }
   5543
   5544    return mostRecentEventTime;
   5545  }
   5546
   5547  function computeExpirationTime(lane, currentTime) {
   5548    switch (lane) {
   5549      case SyncLane:
   5550      case InputContinuousHydrationLane:
   5551      case InputContinuousLane:
   5552        // User interactions should expire slightly more quickly.
   5553        //
   5554        // NOTE: This is set to the corresponding constant as in Scheduler.js.
   5555        // When we made it larger, a product metric in www regressed, suggesting
   5556        // there's a user interaction that's being starved by a series of
   5557        // synchronous updates. If that theory is correct, the proper solution is
   5558        // to fix the starvation. However, this scenario supports the idea that
   5559        // expiration times are an important safeguard when starvation
   5560        // does happen.
   5561        return currentTime + 250;
   5562
   5563      case DefaultHydrationLane:
   5564      case DefaultLane:
   5565      case TransitionHydrationLane:
   5566      case TransitionLane1:
   5567      case TransitionLane2:
   5568      case TransitionLane3:
   5569      case TransitionLane4:
   5570      case TransitionLane5:
   5571      case TransitionLane6:
   5572      case TransitionLane7:
   5573      case TransitionLane8:
   5574      case TransitionLane9:
   5575      case TransitionLane10:
   5576      case TransitionLane11:
   5577      case TransitionLane12:
   5578      case TransitionLane13:
   5579      case TransitionLane14:
   5580      case TransitionLane15:
   5581      case TransitionLane16:
   5582        return currentTime + 5000;
   5583
   5584      case RetryLane1:
   5585      case RetryLane2:
   5586      case RetryLane3:
   5587      case RetryLane4:
   5588      case RetryLane5:
   5589        // TODO: Retries should be allowed to expire if they are CPU bound for
   5590        // too long, but when I made this change it caused a spike in browser
   5591        // crashes. There must be some other underlying bug; not super urgent but
   5592        // ideally should figure out why and fix it. Unfortunately we don't have
   5593        // a repro for the crashes, only detected via production metrics.
   5594        return NoTimestamp;
   5595
   5596      case SelectiveHydrationLane:
   5597      case IdleHydrationLane:
   5598      case IdleLane:
   5599      case OffscreenLane:
   5600        // Anything idle priority or lower should never expire.
   5601        return NoTimestamp;
   5602
   5603      default:
   5604        {
   5605          error('Should have found matching lanes. This is a bug in React.');
   5606        }
   5607
   5608        return NoTimestamp;
   5609    }
   5610  }
   5611
   5612  function markStarvedLanesAsExpired(root, currentTime) {
   5613    // TODO: This gets called every time we yield. We can optimize by storing
   5614    // the earliest expiration time on the root. Then use that to quickly bail out
   5615    // of this function.
   5616    var pendingLanes = root.pendingLanes;
   5617    var suspendedLanes = root.suspendedLanes;
   5618    var pingedLanes = root.pingedLanes;
   5619    var expirationTimes = root.expirationTimes; // Iterate through the pending lanes and check if we've reached their
   5620    // expiration time. If so, we'll assume the update is being starved and mark
   5621    // it as expired to force it to finish.
   5622
   5623    var lanes = pendingLanes;
   5624
   5625    while (lanes > 0) {
   5626      var index = pickArbitraryLaneIndex(lanes);
   5627      var lane = 1 << index;
   5628      var expirationTime = expirationTimes[index];
   5629
   5630      if (expirationTime === NoTimestamp) {
   5631        // Found a pending lane with no expiration time. If it's not suspended, or
   5632        // if it's pinged, assume it's CPU-bound. Compute a new expiration time
   5633        // using the current time.
   5634        if ((lane & suspendedLanes) === NoLanes || (lane & pingedLanes) !== NoLanes) {
   5635          // Assumes timestamps are monotonically increasing.
   5636          expirationTimes[index] = computeExpirationTime(lane, currentTime);
   5637        }
   5638      } else if (expirationTime <= currentTime) {
   5639        // This lane expired
   5640        root.expiredLanes |= lane;
   5641      }
   5642
   5643      lanes &= ~lane;
   5644    }
   5645  } // This returns the highest priority pending lanes regardless of whether they
   5646  // are suspended.
   5647
   5648  function getHighestPriorityPendingLanes(root) {
   5649    return getHighestPriorityLanes(root.pendingLanes);
   5650  }
   5651  function getLanesToRetrySynchronouslyOnError(root) {
   5652    var everythingButOffscreen = root.pendingLanes & ~OffscreenLane;
   5653
   5654    if (everythingButOffscreen !== NoLanes) {
   5655      return everythingButOffscreen;
   5656    }
   5657
   5658    if (everythingButOffscreen & OffscreenLane) {
   5659      return OffscreenLane;
   5660    }
   5661
   5662    return NoLanes;
   5663  }
   5664  function includesSyncLane(lanes) {
   5665    return (lanes & SyncLane) !== NoLanes;
   5666  }
   5667  function includesNonIdleWork(lanes) {
   5668    return (lanes & NonIdleLanes) !== NoLanes;
   5669  }
   5670  function includesOnlyRetries(lanes) {
   5671    return (lanes & RetryLanes) === lanes;
   5672  }
   5673  function includesOnlyNonUrgentLanes(lanes) {
   5674    var UrgentLanes = SyncLane | InputContinuousLane | DefaultLane;
   5675    return (lanes & UrgentLanes) === NoLanes;
   5676  }
   5677  function includesOnlyTransitions(lanes) {
   5678    return (lanes & TransitionLanes) === lanes;
   5679  }
   5680  function includesBlockingLane(root, lanes) {
   5681
   5682    var SyncDefaultLanes = InputContinuousHydrationLane | InputContinuousLane | DefaultHydrationLane | DefaultLane;
   5683    return (lanes & SyncDefaultLanes) !== NoLanes;
   5684  }
   5685  function includesExpiredLane(root, lanes) {
   5686    // This is a separate check from includesBlockingLane because a lane can
   5687    // expire after a render has already started.
   5688    return (lanes & root.expiredLanes) !== NoLanes;
   5689  }
   5690  function isTransitionLane(lane) {
   5691    return (lane & TransitionLanes) !== NoLanes;
   5692  }
   5693  function claimNextTransitionLane() {
   5694    // Cycle through the lanes, assigning each new transition to the next lane.
   5695    // In most cases, this means every transition gets its own lane, until we
   5696    // run out of lanes and cycle back to the beginning.
   5697    var lane = nextTransitionLane;
   5698    nextTransitionLane <<= 1;
   5699
   5700    if ((nextTransitionLane & TransitionLanes) === NoLanes) {
   5701      nextTransitionLane = TransitionLane1;
   5702    }
   5703
   5704    return lane;
   5705  }
   5706  function claimNextRetryLane() {
   5707    var lane = nextRetryLane;
   5708    nextRetryLane <<= 1;
   5709
   5710    if ((nextRetryLane & RetryLanes) === NoLanes) {
   5711      nextRetryLane = RetryLane1;
   5712    }
   5713
   5714    return lane;
   5715  }
   5716  function getHighestPriorityLane(lanes) {
   5717    return lanes & -lanes;
   5718  }
   5719  function pickArbitraryLane(lanes) {
   5720    // This wrapper function gets inlined. Only exists so to communicate that it
   5721    // doesn't matter which bit is selected; you can pick any bit without
   5722    // affecting the algorithms where its used. Here I'm using
   5723    // getHighestPriorityLane because it requires the fewest operations.
   5724    return getHighestPriorityLane(lanes);
   5725  }
   5726
   5727  function pickArbitraryLaneIndex(lanes) {
   5728    return 31 - clz32(lanes);
   5729  }
   5730
   5731  function laneToIndex(lane) {
   5732    return pickArbitraryLaneIndex(lane);
   5733  }
   5734
   5735  function includesSomeLane(a, b) {
   5736    return (a & b) !== NoLanes;
   5737  }
   5738  function isSubsetOfLanes(set, subset) {
   5739    return (set & subset) === subset;
   5740  }
   5741  function mergeLanes(a, b) {
   5742    return a | b;
   5743  }
   5744  function removeLanes(set, subset) {
   5745    return set & ~subset;
   5746  }
   5747  function intersectLanes(a, b) {
   5748    return a & b;
   5749  } // Seems redundant, but it changes the type from a single lane (used for
   5750  // updates) to a group of lanes (used for flushing work).
   5751
   5752  function laneToLanes(lane) {
   5753    return lane;
   5754  }
   5755  function higherPriorityLane(a, b) {
   5756    // This works because the bit ranges decrease in priority as you go left.
   5757    return a !== NoLane && a < b ? a : b;
   5758  }
   5759  function createLaneMap(initial) {
   5760    // Intentionally pushing one by one.
   5761    // https://v8.dev/blog/elements-kinds#avoid-creating-holes
   5762    var laneMap = [];
   5763
   5764    for (var i = 0; i < TotalLanes; i++) {
   5765      laneMap.push(initial);
   5766    }
   5767
   5768    return laneMap;
   5769  }
   5770  function markRootUpdated(root, updateLane, eventTime) {
   5771    root.pendingLanes |= updateLane; // If there are any suspended transitions, it's possible this new update
   5772    // could unblock them. Clear the suspended lanes so that we can try rendering
   5773    // them again.
   5774    //
   5775    // TODO: We really only need to unsuspend only lanes that are in the
   5776    // `subtreeLanes` of the updated fiber, or the update lanes of the return
   5777    // path. This would exclude suspended updates in an unrelated sibling tree,
   5778    // since there's no way for this update to unblock it.
   5779    //
   5780    // We don't do this if the incoming update is idle, because we never process
   5781    // idle updates until after all the regular updates have finished; there's no
   5782    // way it could unblock a transition.
   5783
   5784    if (updateLane !== IdleLane) {
   5785      root.suspendedLanes = NoLanes;
   5786      root.pingedLanes = NoLanes;
   5787    }
   5788
   5789    var eventTimes = root.eventTimes;
   5790    var index = laneToIndex(updateLane); // We can always overwrite an existing timestamp because we prefer the most
   5791    // recent event, and we assume time is monotonically increasing.
   5792
   5793    eventTimes[index] = eventTime;
   5794  }
   5795  function markRootSuspended(root, suspendedLanes) {
   5796    root.suspendedLanes |= suspendedLanes;
   5797    root.pingedLanes &= ~suspendedLanes; // The suspended lanes are no longer CPU-bound. Clear their expiration times.
   5798
   5799    var expirationTimes = root.expirationTimes;
   5800    var lanes = suspendedLanes;
   5801
   5802    while (lanes > 0) {
   5803      var index = pickArbitraryLaneIndex(lanes);
   5804      var lane = 1 << index;
   5805      expirationTimes[index] = NoTimestamp;
   5806      lanes &= ~lane;
   5807    }
   5808  }
   5809  function markRootPinged(root, pingedLanes, eventTime) {
   5810    root.pingedLanes |= root.suspendedLanes & pingedLanes;
   5811  }
   5812  function markRootFinished(root, remainingLanes) {
   5813    var noLongerPendingLanes = root.pendingLanes & ~remainingLanes;
   5814    root.pendingLanes = remainingLanes; // Let's try everything again
   5815
   5816    root.suspendedLanes = NoLanes;
   5817    root.pingedLanes = NoLanes;
   5818    root.expiredLanes &= remainingLanes;
   5819    root.mutableReadLanes &= remainingLanes;
   5820    root.entangledLanes &= remainingLanes;
   5821    var entanglements = root.entanglements;
   5822    var eventTimes = root.eventTimes;
   5823    var expirationTimes = root.expirationTimes; // Clear the lanes that no longer have pending work
   5824
   5825    var lanes = noLongerPendingLanes;
   5826
   5827    while (lanes > 0) {
   5828      var index = pickArbitraryLaneIndex(lanes);
   5829      var lane = 1 << index;
   5830      entanglements[index] = NoLanes;
   5831      eventTimes[index] = NoTimestamp;
   5832      expirationTimes[index] = NoTimestamp;
   5833      lanes &= ~lane;
   5834    }
   5835  }
   5836  function markRootEntangled(root, entangledLanes) {
   5837    // In addition to entangling each of the given lanes with each other, we also
   5838    // have to consider _transitive_ entanglements. For each lane that is already
   5839    // entangled with *any* of the given lanes, that lane is now transitively
   5840    // entangled with *all* the given lanes.
   5841    //
   5842    // Translated: If C is entangled with A, then entangling A with B also
   5843    // entangles C with B.
   5844    //
   5845    // If this is hard to grasp, it might help to intentionally break this
   5846    // function and look at the tests that fail in ReactTransition-test.js. Try
   5847    // commenting out one of the conditions below.
   5848    var rootEntangledLanes = root.entangledLanes |= entangledLanes;
   5849    var entanglements = root.entanglements;
   5850    var lanes = rootEntangledLanes;
   5851
   5852    while (lanes) {
   5853      var index = pickArbitraryLaneIndex(lanes);
   5854      var lane = 1 << index;
   5855
   5856      if ( // Is this one of the newly entangled lanes?
   5857      lane & entangledLanes | // Is this lane transitively entangled with the newly entangled lanes?
   5858      entanglements[index] & entangledLanes) {
   5859        entanglements[index] |= entangledLanes;
   5860      }
   5861
   5862      lanes &= ~lane;
   5863    }
   5864  }
   5865  function getBumpedLaneForHydration(root, renderLanes) {
   5866    var renderLane = getHighestPriorityLane(renderLanes);
   5867    var lane;
   5868
   5869    switch (renderLane) {
   5870      case InputContinuousLane:
   5871        lane = InputContinuousHydrationLane;
   5872        break;
   5873
   5874      case DefaultLane:
   5875        lane = DefaultHydrationLane;
   5876        break;
   5877
   5878      case TransitionLane1:
   5879      case TransitionLane2:
   5880      case TransitionLane3:
   5881      case TransitionLane4:
   5882      case TransitionLane5:
   5883      case TransitionLane6:
   5884      case TransitionLane7:
   5885      case TransitionLane8:
   5886      case TransitionLane9:
   5887      case TransitionLane10:
   5888      case TransitionLane11:
   5889      case TransitionLane12:
   5890      case TransitionLane13:
   5891      case TransitionLane14:
   5892      case TransitionLane15:
   5893      case TransitionLane16:
   5894      case RetryLane1:
   5895      case RetryLane2:
   5896      case RetryLane3:
   5897      case RetryLane4:
   5898      case RetryLane5:
   5899        lane = TransitionHydrationLane;
   5900        break;
   5901
   5902      case IdleLane:
   5903        lane = IdleHydrationLane;
   5904        break;
   5905
   5906      default:
   5907        // Everything else is already either a hydration lane, or shouldn't
   5908        // be retried at a hydration lane.
   5909        lane = NoLane;
   5910        break;
   5911    } // Check if the lane we chose is suspended. If so, that indicates that we
   5912    // already attempted and failed to hydrate at that level. Also check if we're
   5913    // already rendering that lane, which is rare but could happen.
   5914
   5915
   5916    if ((lane & (root.suspendedLanes | renderLanes)) !== NoLane) {
   5917      // Give up trying to hydrate and fall back to client render.
   5918      return NoLane;
   5919    }
   5920
   5921    return lane;
   5922  }
   5923  function addFiberToLanesMap(root, fiber, lanes) {
   5924
   5925    if (!isDevToolsPresent) {
   5926      return;
   5927    }
   5928
   5929    var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
   5930
   5931    while (lanes > 0) {
   5932      var index = laneToIndex(lanes);
   5933      var lane = 1 << index;
   5934      var updaters = pendingUpdatersLaneMap[index];
   5935      updaters.add(fiber);
   5936      lanes &= ~lane;
   5937    }
   5938  }
   5939  function movePendingFibersToMemoized(root, lanes) {
   5940
   5941    if (!isDevToolsPresent) {
   5942      return;
   5943    }
   5944
   5945    var pendingUpdatersLaneMap = root.pendingUpdatersLaneMap;
   5946    var memoizedUpdaters = root.memoizedUpdaters;
   5947
   5948    while (lanes > 0) {
   5949      var index = laneToIndex(lanes);
   5950      var lane = 1 << index;
   5951      var updaters = pendingUpdatersLaneMap[index];
   5952
   5953      if (updaters.size > 0) {
   5954        updaters.forEach(function (fiber) {
   5955          var alternate = fiber.alternate;
   5956
   5957          if (alternate === null || !memoizedUpdaters.has(alternate)) {
   5958            memoizedUpdaters.add(fiber);
   5959          }
   5960        });
   5961        updaters.clear();
   5962      }
   5963
   5964      lanes &= ~lane;
   5965    }
   5966  }
   5967  function getTransitionsForLanes(root, lanes) {
   5968    {
   5969      return null;
   5970    }
   5971  }
   5972
   5973  var DiscreteEventPriority = SyncLane;
   5974  var ContinuousEventPriority = InputContinuousLane;
   5975  var DefaultEventPriority = DefaultLane;
   5976  var IdleEventPriority = IdleLane;
   5977  var currentUpdatePriority = NoLane;
   5978  function getCurrentUpdatePriority() {
   5979    return currentUpdatePriority;
   5980  }
   5981  function setCurrentUpdatePriority(newPriority) {
   5982    currentUpdatePriority = newPriority;
   5983  }
   5984  function runWithPriority(priority, fn) {
   5985    var previousPriority = currentUpdatePriority;
   5986
   5987    try {
   5988      currentUpdatePriority = priority;
   5989      return fn();
   5990    } finally {
   5991      currentUpdatePriority = previousPriority;
   5992    }
   5993  }
   5994  function higherEventPriority(a, b) {
   5995    return a !== 0 && a < b ? a : b;
   5996  }
   5997  function lowerEventPriority(a, b) {
   5998    return a === 0 || a > b ? a : b;
   5999  }
   6000  function isHigherEventPriority(a, b) {
   6001    return a !== 0 && a < b;
   6002  }
   6003  function lanesToEventPriority(lanes) {
   6004    var lane = getHighestPriorityLane(lanes);
   6005
   6006    if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
   6007      return DiscreteEventPriority;
   6008    }
   6009
   6010    if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
   6011      return ContinuousEventPriority;
   6012    }
   6013
   6014    if (includesNonIdleWork(lane)) {
   6015      return DefaultEventPriority;
   6016    }
   6017
   6018    return IdleEventPriority;
   6019  }
   6020
   6021  // This is imported by the event replaying implementation in React DOM. It's
   6022  // in a separate file to break a circular dependency between the renderer and
   6023  // the reconciler.
   6024  function isRootDehydrated(root) {
   6025    var currentState = root.current.memoizedState;
   6026    return currentState.isDehydrated;
   6027  }
   6028
   6029  var _attemptSynchronousHydration;
   6030
   6031  function setAttemptSynchronousHydration(fn) {
   6032    _attemptSynchronousHydration = fn;
   6033  }
   6034  function attemptSynchronousHydration(fiber) {
   6035    _attemptSynchronousHydration(fiber);
   6036  }
   6037  var attemptContinuousHydration;
   6038  function setAttemptContinuousHydration(fn) {
   6039    attemptContinuousHydration = fn;
   6040  }
   6041  var attemptHydrationAtCurrentPriority;
   6042  function setAttemptHydrationAtCurrentPriority(fn) {
   6043    attemptHydrationAtCurrentPriority = fn;
   6044  }
   6045  var getCurrentUpdatePriority$1;
   6046  function setGetCurrentUpdatePriority(fn) {
   6047    getCurrentUpdatePriority$1 = fn;
   6048  }
   6049  var attemptHydrationAtPriority;
   6050  function setAttemptHydrationAtPriority(fn) {
   6051    attemptHydrationAtPriority = fn;
   6052  } // TODO: Upgrade this definition once we're on a newer version of Flow that
   6053  // has this definition built-in.
   6054
   6055  var hasScheduledReplayAttempt = false; // The queue of discrete events to be replayed.
   6056
   6057  var queuedDiscreteEvents = []; // Indicates if any continuous event targets are non-null for early bailout.
   6058  // if the last target was dehydrated.
   6059
   6060  var queuedFocus = null;
   6061  var queuedDrag = null;
   6062  var queuedMouse = null; // For pointer events there can be one latest event per pointerId.
   6063
   6064  var queuedPointers = new Map();
   6065  var queuedPointerCaptures = new Map(); // We could consider replaying selectionchange and touchmoves too.
   6066
   6067  var queuedExplicitHydrationTargets = [];
   6068  var discreteReplayableEvents = ['mousedown', 'mouseup', 'touchcancel', 'touchend', 'touchstart', 'auxclick', 'dblclick', 'pointercancel', 'pointerdown', 'pointerup', 'dragend', 'dragstart', 'drop', 'compositionend', 'compositionstart', 'keydown', 'keypress', 'keyup', 'input', 'textInput', // Intentionally camelCase
   6069  'copy', 'cut', 'paste', 'click', 'change', 'contextmenu', 'reset', 'submit'];
   6070  function isDiscreteEventThatRequiresHydration(eventType) {
   6071    return discreteReplayableEvents.indexOf(eventType) > -1;
   6072  }
   6073
   6074  function createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6075    return {
   6076      blockedOn: blockedOn,
   6077      domEventName: domEventName,
   6078      eventSystemFlags: eventSystemFlags,
   6079      nativeEvent: nativeEvent,
   6080      targetContainers: [targetContainer]
   6081    };
   6082  }
   6083
   6084  function clearIfContinuousEvent(domEventName, nativeEvent) {
   6085    switch (domEventName) {
   6086      case 'focusin':
   6087      case 'focusout':
   6088        queuedFocus = null;
   6089        break;
   6090
   6091      case 'dragenter':
   6092      case 'dragleave':
   6093        queuedDrag = null;
   6094        break;
   6095
   6096      case 'mouseover':
   6097      case 'mouseout':
   6098        queuedMouse = null;
   6099        break;
   6100
   6101      case 'pointerover':
   6102      case 'pointerout':
   6103        {
   6104          var pointerId = nativeEvent.pointerId;
   6105          queuedPointers.delete(pointerId);
   6106          break;
   6107        }
   6108
   6109      case 'gotpointercapture':
   6110      case 'lostpointercapture':
   6111        {
   6112          var _pointerId = nativeEvent.pointerId;
   6113          queuedPointerCaptures.delete(_pointerId);
   6114          break;
   6115        }
   6116    }
   6117  }
   6118
   6119  function accumulateOrCreateContinuousQueuedReplayableEvent(existingQueuedEvent, blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6120    if (existingQueuedEvent === null || existingQueuedEvent.nativeEvent !== nativeEvent) {
   6121      var queuedEvent = createQueuedReplayableEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent);
   6122
   6123      if (blockedOn !== null) {
   6124        var _fiber2 = getInstanceFromNode(blockedOn);
   6125
   6126        if (_fiber2 !== null) {
   6127          // Attempt to increase the priority of this target.
   6128          attemptContinuousHydration(_fiber2);
   6129        }
   6130      }
   6131
   6132      return queuedEvent;
   6133    } // If we have already queued this exact event, then it's because
   6134    // the different event systems have different DOM event listeners.
   6135    // We can accumulate the flags, and the targetContainers, and
   6136    // store a single event to be replayed.
   6137
   6138
   6139    existingQueuedEvent.eventSystemFlags |= eventSystemFlags;
   6140    var targetContainers = existingQueuedEvent.targetContainers;
   6141
   6142    if (targetContainer !== null && targetContainers.indexOf(targetContainer) === -1) {
   6143      targetContainers.push(targetContainer);
   6144    }
   6145
   6146    return existingQueuedEvent;
   6147  }
   6148
   6149  function queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6150    // These set relatedTarget to null because the replayed event will be treated as if we
   6151    // moved from outside the window (no target) onto the target once it hydrates.
   6152    // Instead of mutating we could clone the event.
   6153    switch (domEventName) {
   6154      case 'focusin':
   6155        {
   6156          var focusEvent = nativeEvent;
   6157          queuedFocus = accumulateOrCreateContinuousQueuedReplayableEvent(queuedFocus, blockedOn, domEventName, eventSystemFlags, targetContainer, focusEvent);
   6158          return true;
   6159        }
   6160
   6161      case 'dragenter':
   6162        {
   6163          var dragEvent = nativeEvent;
   6164          queuedDrag = accumulateOrCreateContinuousQueuedReplayableEvent(queuedDrag, blockedOn, domEventName, eventSystemFlags, targetContainer, dragEvent);
   6165          return true;
   6166        }
   6167
   6168      case 'mouseover':
   6169        {
   6170          var mouseEvent = nativeEvent;
   6171          queuedMouse = accumulateOrCreateContinuousQueuedReplayableEvent(queuedMouse, blockedOn, domEventName, eventSystemFlags, targetContainer, mouseEvent);
   6172          return true;
   6173        }
   6174
   6175      case 'pointerover':
   6176        {
   6177          var pointerEvent = nativeEvent;
   6178          var pointerId = pointerEvent.pointerId;
   6179          queuedPointers.set(pointerId, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointers.get(pointerId) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, pointerEvent));
   6180          return true;
   6181        }
   6182
   6183      case 'gotpointercapture':
   6184        {
   6185          var _pointerEvent = nativeEvent;
   6186          var _pointerId2 = _pointerEvent.pointerId;
   6187          queuedPointerCaptures.set(_pointerId2, accumulateOrCreateContinuousQueuedReplayableEvent(queuedPointerCaptures.get(_pointerId2) || null, blockedOn, domEventName, eventSystemFlags, targetContainer, _pointerEvent));
   6188          return true;
   6189        }
   6190    }
   6191
   6192    return false;
   6193  } // Check if this target is unblocked. Returns true if it's unblocked.
   6194
   6195  function attemptExplicitHydrationTarget(queuedTarget) {
   6196    // TODO: This function shares a lot of logic with findInstanceBlockingEvent.
   6197    // Try to unify them. It's a bit tricky since it would require two return
   6198    // values.
   6199    var targetInst = getClosestInstanceFromNode(queuedTarget.target);
   6200
   6201    if (targetInst !== null) {
   6202      var nearestMounted = getNearestMountedFiber(targetInst);
   6203
   6204      if (nearestMounted !== null) {
   6205        var tag = nearestMounted.tag;
   6206
   6207        if (tag === SuspenseComponent) {
   6208          var instance = getSuspenseInstanceFromFiber(nearestMounted);
   6209
   6210          if (instance !== null) {
   6211            // We're blocked on hydrating this boundary.
   6212            // Increase its priority.
   6213            queuedTarget.blockedOn = instance;
   6214            attemptHydrationAtPriority(queuedTarget.priority, function () {
   6215              attemptHydrationAtCurrentPriority(nearestMounted);
   6216            });
   6217            return;
   6218          }
   6219        } else if (tag === HostRoot) {
   6220          var root = nearestMounted.stateNode;
   6221
   6222          if (isRootDehydrated(root)) {
   6223            queuedTarget.blockedOn = getContainerFromFiber(nearestMounted); // We don't currently have a way to increase the priority of
   6224            // a root other than sync.
   6225
   6226            return;
   6227          }
   6228        }
   6229      }
   6230    }
   6231
   6232    queuedTarget.blockedOn = null;
   6233  }
   6234
   6235  function queueExplicitHydrationTarget(target) {
   6236    // TODO: This will read the priority if it's dispatched by the React
   6237    // event system but not native events. Should read window.event.type, like
   6238    // we do for updates (getCurrentEventPriority).
   6239    var updatePriority = getCurrentUpdatePriority$1();
   6240    var queuedTarget = {
   6241      blockedOn: null,
   6242      target: target,
   6243      priority: updatePriority
   6244    };
   6245    var i = 0;
   6246
   6247    for (; i < queuedExplicitHydrationTargets.length; i++) {
   6248      // Stop once we hit the first target with lower priority than
   6249      if (!isHigherEventPriority(updatePriority, queuedExplicitHydrationTargets[i].priority)) {
   6250        break;
   6251      }
   6252    }
   6253
   6254    queuedExplicitHydrationTargets.splice(i, 0, queuedTarget);
   6255
   6256    if (i === 0) {
   6257      attemptExplicitHydrationTarget(queuedTarget);
   6258    }
   6259  }
   6260
   6261  function attemptReplayContinuousQueuedEvent(queuedEvent) {
   6262    if (queuedEvent.blockedOn !== null) {
   6263      return false;
   6264    }
   6265
   6266    var targetContainers = queuedEvent.targetContainers;
   6267
   6268    while (targetContainers.length > 0) {
   6269      var targetContainer = targetContainers[0];
   6270      var nextBlockedOn = findInstanceBlockingEvent(queuedEvent.domEventName, queuedEvent.eventSystemFlags, targetContainer, queuedEvent.nativeEvent);
   6271
   6272      if (nextBlockedOn === null) {
   6273        {
   6274          var nativeEvent = queuedEvent.nativeEvent;
   6275          var nativeEventClone = new nativeEvent.constructor(nativeEvent.type, nativeEvent);
   6276          setReplayingEvent(nativeEventClone);
   6277          nativeEvent.target.dispatchEvent(nativeEventClone);
   6278          resetReplayingEvent();
   6279        }
   6280      } else {
   6281        // We're still blocked. Try again later.
   6282        var _fiber3 = getInstanceFromNode(nextBlockedOn);
   6283
   6284        if (_fiber3 !== null) {
   6285          attemptContinuousHydration(_fiber3);
   6286        }
   6287
   6288        queuedEvent.blockedOn = nextBlockedOn;
   6289        return false;
   6290      } // This target container was successfully dispatched. Try the next.
   6291
   6292
   6293      targetContainers.shift();
   6294    }
   6295
   6296    return true;
   6297  }
   6298
   6299  function attemptReplayContinuousQueuedEventInMap(queuedEvent, key, map) {
   6300    if (attemptReplayContinuousQueuedEvent(queuedEvent)) {
   6301      map.delete(key);
   6302    }
   6303  }
   6304
   6305  function replayUnblockedEvents() {
   6306    hasScheduledReplayAttempt = false;
   6307
   6308
   6309    if (queuedFocus !== null && attemptReplayContinuousQueuedEvent(queuedFocus)) {
   6310      queuedFocus = null;
   6311    }
   6312
   6313    if (queuedDrag !== null && attemptReplayContinuousQueuedEvent(queuedDrag)) {
   6314      queuedDrag = null;
   6315    }
   6316
   6317    if (queuedMouse !== null && attemptReplayContinuousQueuedEvent(queuedMouse)) {
   6318      queuedMouse = null;
   6319    }
   6320
   6321    queuedPointers.forEach(attemptReplayContinuousQueuedEventInMap);
   6322    queuedPointerCaptures.forEach(attemptReplayContinuousQueuedEventInMap);
   6323  }
   6324
   6325  function scheduleCallbackIfUnblocked(queuedEvent, unblocked) {
   6326    if (queuedEvent.blockedOn === unblocked) {
   6327      queuedEvent.blockedOn = null;
   6328
   6329      if (!hasScheduledReplayAttempt) {
   6330        hasScheduledReplayAttempt = true; // Schedule a callback to attempt replaying as many events as are
   6331        // now unblocked. This first might not actually be unblocked yet.
   6332        // We could check it early to avoid scheduling an unnecessary callback.
   6333
   6334        unstable_scheduleCallback(unstable_NormalPriority, replayUnblockedEvents);
   6335      }
   6336    }
   6337  }
   6338
   6339  function retryIfBlockedOn(unblocked) {
   6340    // Mark anything that was blocked on this as no longer blocked
   6341    // and eligible for a replay.
   6342    if (queuedDiscreteEvents.length > 0) {
   6343      scheduleCallbackIfUnblocked(queuedDiscreteEvents[0], unblocked); // This is a exponential search for each boundary that commits. I think it's
   6344      // worth it because we expect very few discrete events to queue up and once
   6345      // we are actually fully unblocked it will be fast to replay them.
   6346
   6347      for (var i = 1; i < queuedDiscreteEvents.length; i++) {
   6348        var queuedEvent = queuedDiscreteEvents[i];
   6349
   6350        if (queuedEvent.blockedOn === unblocked) {
   6351          queuedEvent.blockedOn = null;
   6352        }
   6353      }
   6354    }
   6355
   6356    if (queuedFocus !== null) {
   6357      scheduleCallbackIfUnblocked(queuedFocus, unblocked);
   6358    }
   6359
   6360    if (queuedDrag !== null) {
   6361      scheduleCallbackIfUnblocked(queuedDrag, unblocked);
   6362    }
   6363
   6364    if (queuedMouse !== null) {
   6365      scheduleCallbackIfUnblocked(queuedMouse, unblocked);
   6366    }
   6367
   6368    var unblock = function (queuedEvent) {
   6369      return scheduleCallbackIfUnblocked(queuedEvent, unblocked);
   6370    };
   6371
   6372    queuedPointers.forEach(unblock);
   6373    queuedPointerCaptures.forEach(unblock);
   6374
   6375    for (var _i = 0; _i < queuedExplicitHydrationTargets.length; _i++) {
   6376      var queuedTarget = queuedExplicitHydrationTargets[_i];
   6377
   6378      if (queuedTarget.blockedOn === unblocked) {
   6379        queuedTarget.blockedOn = null;
   6380      }
   6381    }
   6382
   6383    while (queuedExplicitHydrationTargets.length > 0) {
   6384      var nextExplicitTarget = queuedExplicitHydrationTargets[0];
   6385
   6386      if (nextExplicitTarget.blockedOn !== null) {
   6387        // We're still blocked.
   6388        break;
   6389      } else {
   6390        attemptExplicitHydrationTarget(nextExplicitTarget);
   6391
   6392        if (nextExplicitTarget.blockedOn === null) {
   6393          // We're unblocked.
   6394          queuedExplicitHydrationTargets.shift();
   6395        }
   6396      }
   6397    }
   6398  }
   6399
   6400  var ReactCurrentBatchConfig = ReactSharedInternals.ReactCurrentBatchConfig; // TODO: can we stop exporting these?
   6401
   6402  var _enabled = true; // This is exported in FB builds for use by legacy FB layer infra.
   6403  // We'd like to remove this but it's not clear if this is safe.
   6404
   6405  function setEnabled(enabled) {
   6406    _enabled = !!enabled;
   6407  }
   6408  function isEnabled() {
   6409    return _enabled;
   6410  }
   6411  function createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags) {
   6412    var eventPriority = getEventPriority(domEventName);
   6413    var listenerWrapper;
   6414
   6415    switch (eventPriority) {
   6416      case DiscreteEventPriority:
   6417        listenerWrapper = dispatchDiscreteEvent;
   6418        break;
   6419
   6420      case ContinuousEventPriority:
   6421        listenerWrapper = dispatchContinuousEvent;
   6422        break;
   6423
   6424      case DefaultEventPriority:
   6425      default:
   6426        listenerWrapper = dispatchEvent;
   6427        break;
   6428    }
   6429
   6430    return listenerWrapper.bind(null, domEventName, eventSystemFlags, targetContainer);
   6431  }
   6432
   6433  function dispatchDiscreteEvent(domEventName, eventSystemFlags, container, nativeEvent) {
   6434    var previousPriority = getCurrentUpdatePriority();
   6435    var prevTransition = ReactCurrentBatchConfig.transition;
   6436    ReactCurrentBatchConfig.transition = null;
   6437
   6438    try {
   6439      setCurrentUpdatePriority(DiscreteEventPriority);
   6440      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
   6441    } finally {
   6442      setCurrentUpdatePriority(previousPriority);
   6443      ReactCurrentBatchConfig.transition = prevTransition;
   6444    }
   6445  }
   6446
   6447  function dispatchContinuousEvent(domEventName, eventSystemFlags, container, nativeEvent) {
   6448    var previousPriority = getCurrentUpdatePriority();
   6449    var prevTransition = ReactCurrentBatchConfig.transition;
   6450    ReactCurrentBatchConfig.transition = null;
   6451
   6452    try {
   6453      setCurrentUpdatePriority(ContinuousEventPriority);
   6454      dispatchEvent(domEventName, eventSystemFlags, container, nativeEvent);
   6455    } finally {
   6456      setCurrentUpdatePriority(previousPriority);
   6457      ReactCurrentBatchConfig.transition = prevTransition;
   6458    }
   6459  }
   6460
   6461  function dispatchEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6462    if (!_enabled) {
   6463      return;
   6464    }
   6465
   6466    {
   6467      dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent);
   6468    }
   6469  }
   6470
   6471  function dispatchEventWithEnableCapturePhaseSelectiveHydrationWithoutDiscreteEventReplay(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6472    var blockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
   6473
   6474    if (blockedOn === null) {
   6475      dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
   6476      clearIfContinuousEvent(domEventName, nativeEvent);
   6477      return;
   6478    }
   6479
   6480    if (queueIfContinuousEvent(blockedOn, domEventName, eventSystemFlags, targetContainer, nativeEvent)) {
   6481      nativeEvent.stopPropagation();
   6482      return;
   6483    } // We need to clear only if we didn't queue because
   6484    // queueing is accumulative.
   6485
   6486
   6487    clearIfContinuousEvent(domEventName, nativeEvent);
   6488
   6489    if (eventSystemFlags & IS_CAPTURE_PHASE && isDiscreteEventThatRequiresHydration(domEventName)) {
   6490      while (blockedOn !== null) {
   6491        var fiber = getInstanceFromNode(blockedOn);
   6492
   6493        if (fiber !== null) {
   6494          attemptSynchronousHydration(fiber);
   6495        }
   6496
   6497        var nextBlockedOn = findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent);
   6498
   6499        if (nextBlockedOn === null) {
   6500          dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, return_targetInst, targetContainer);
   6501        }
   6502
   6503        if (nextBlockedOn === blockedOn) {
   6504          break;
   6505        }
   6506
   6507        blockedOn = nextBlockedOn;
   6508      }
   6509
   6510      if (blockedOn !== null) {
   6511        nativeEvent.stopPropagation();
   6512      }
   6513
   6514      return;
   6515    } // This is not replayable so we'll invoke it but without a target,
   6516    // in case the event system needs to trace it.
   6517
   6518
   6519    dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, null, targetContainer);
   6520  }
   6521
   6522  var return_targetInst = null; // Returns a SuspenseInstance or Container if it's blocked.
   6523  // The return_targetInst field above is conceptually part of the return value.
   6524
   6525  function findInstanceBlockingEvent(domEventName, eventSystemFlags, targetContainer, nativeEvent) {
   6526    // TODO: Warn if _enabled is false.
   6527    return_targetInst = null;
   6528    var nativeEventTarget = getEventTarget(nativeEvent);
   6529    var targetInst = getClosestInstanceFromNode(nativeEventTarget);
   6530
   6531    if (targetInst !== null) {
   6532      var nearestMounted = getNearestMountedFiber(targetInst);
   6533
   6534      if (nearestMounted === null) {
   6535        // This tree has been unmounted already. Dispatch without a target.
   6536        targetInst = null;
   6537      } else {
   6538        var tag = nearestMounted.tag;
   6539
   6540        if (tag === SuspenseComponent) {
   6541          var instance = getSuspenseInstanceFromFiber(nearestMounted);
   6542
   6543          if (instance !== null) {
   6544            // Queue the event to be replayed later. Abort dispatching since we
   6545            // don't want this event dispatched twice through the event system.
   6546            // TODO: If this is the first discrete event in the queue. Schedule an increased
   6547            // priority for this boundary.
   6548            return instance;
   6549          } // This shouldn't happen, something went wrong but to avoid blocking
   6550          // the whole system, dispatch the event without a target.
   6551          // TODO: Warn.
   6552
   6553
   6554          targetInst = null;
   6555        } else if (tag === HostRoot) {
   6556          var root = nearestMounted.stateNode;
   6557
   6558          if (isRootDehydrated(root)) {
   6559            // If this happens during a replay something went wrong and it might block
   6560            // the whole system.
   6561            return getContainerFromFiber(nearestMounted);
   6562          }
   6563
   6564          targetInst = null;
   6565        } else if (nearestMounted !== targetInst) {
   6566          // If we get an event (ex: img onload) before committing that
   6567          // component's mount, ignore it for now (that is, treat it as if it was an
   6568          // event on a non-React tree). We might also consider queueing events and
   6569          // dispatching them after the mount.
   6570          targetInst = null;
   6571        }
   6572      }
   6573    }
   6574
   6575    return_targetInst = targetInst; // We're not blocked on anything.
   6576
   6577    return null;
   6578  }
   6579  function getEventPriority(domEventName) {
   6580    switch (domEventName) {
   6581      // Used by SimpleEventPlugin:
   6582      case 'cancel':
   6583      case 'click':
   6584      case 'close':
   6585      case 'contextmenu':
   6586      case 'copy':
   6587      case 'cut':
   6588      case 'auxclick':
   6589      case 'dblclick':
   6590      case 'dragend':
   6591      case 'dragstart':
   6592      case 'drop':
   6593      case 'focusin':
   6594      case 'focusout':
   6595      case 'input':
   6596      case 'invalid':
   6597      case 'keydown':
   6598      case 'keypress':
   6599      case 'keyup':
   6600      case 'mousedown':
   6601      case 'mouseup':
   6602      case 'paste':
   6603      case 'pause':
   6604      case 'play':
   6605      case 'pointercancel':
   6606      case 'pointerdown':
   6607      case 'pointerup':
   6608      case 'ratechange':
   6609      case 'reset':
   6610      case 'resize':
   6611      case 'seeked':
   6612      case 'submit':
   6613      case 'touchcancel':
   6614      case 'touchend':
   6615      case 'touchstart':
   6616      case 'volumechange': // Used by polyfills:
   6617      // eslint-disable-next-line no-fallthrough
   6618
   6619      case 'change':
   6620      case 'selectionchange':
   6621      case 'textInput':
   6622      case 'compositionstart':
   6623      case 'compositionend':
   6624      case 'compositionupdate': // Only enableCreateEventHandleAPI:
   6625      // eslint-disable-next-line no-fallthrough
   6626
   6627      case 'beforeblur':
   6628      case 'afterblur': // Not used by React but could be by user code:
   6629      // eslint-disable-next-line no-fallthrough
   6630
   6631      case 'beforeinput':
   6632      case 'blur':
   6633      case 'fullscreenchange':
   6634      case 'focus':
   6635      case 'hashchange':
   6636      case 'popstate':
   6637      case 'select':
   6638      case 'selectstart':
   6639        return DiscreteEventPriority;
   6640
   6641      case 'drag':
   6642      case 'dragenter':
   6643      case 'dragexit':
   6644      case 'dragleave':
   6645      case 'dragover':
   6646      case 'mousemove':
   6647      case 'mouseout':
   6648      case 'mouseover':
   6649      case 'pointermove':
   6650      case 'pointerout':
   6651      case 'pointerover':
   6652      case 'scroll':
   6653      case 'toggle':
   6654      case 'touchmove':
   6655      case 'wheel': // Not used by React but could be by user code:
   6656      // eslint-disable-next-line no-fallthrough
   6657
   6658      case 'mouseenter':
   6659      case 'mouseleave':
   6660      case 'pointerenter':
   6661      case 'pointerleave':
   6662        return ContinuousEventPriority;
   6663
   6664      case 'message':
   6665        {
   6666          // We might be in the Scheduler callback.
   6667          // Eventually this mechanism will be replaced by a check
   6668          // of the current priority on the native scheduler.
   6669          var schedulerPriority = getCurrentPriorityLevel();
   6670
   6671          switch (schedulerPriority) {
   6672            case ImmediatePriority:
   6673              return DiscreteEventPriority;
   6674
   6675            case UserBlockingPriority:
   6676              return ContinuousEventPriority;
   6677
   6678            case NormalPriority:
   6679            case LowPriority:
   6680              // TODO: Handle LowSchedulerPriority, somehow. Maybe the same lane as hydration.
   6681              return DefaultEventPriority;
   6682
   6683            case IdlePriority:
   6684              return IdleEventPriority;
   6685
   6686            default:
   6687              return DefaultEventPriority;
   6688          }
   6689        }
   6690
   6691      default:
   6692        return DefaultEventPriority;
   6693    }
   6694  }
   6695
   6696  function addEventBubbleListener(target, eventType, listener) {
   6697    target.addEventListener(eventType, listener, false);
   6698    return listener;
   6699  }
   6700  function addEventCaptureListener(target, eventType, listener) {
   6701    target.addEventListener(eventType, listener, true);
   6702    return listener;
   6703  }
   6704  function addEventCaptureListenerWithPassiveFlag(target, eventType, listener, passive) {
   6705    target.addEventListener(eventType, listener, {
   6706      capture: true,
   6707      passive: passive
   6708    });
   6709    return listener;
   6710  }
   6711  function addEventBubbleListenerWithPassiveFlag(target, eventType, listener, passive) {
   6712    target.addEventListener(eventType, listener, {
   6713      passive: passive
   6714    });
   6715    return listener;
   6716  }
   6717
   6718  /**
   6719   * These variables store information about text content of a target node,
   6720   * allowing comparison of content before and after a given event.
   6721   *
   6722   * Identify the node where selection currently begins, then observe
   6723   * both its text content and its current position in the DOM. Since the
   6724   * browser may natively replace the target node during composition, we can
   6725   * use its position to find its replacement.
   6726   *
   6727   *
   6728   */
   6729  var root = null;
   6730  var startText = null;
   6731  var fallbackText = null;
   6732  function initialize(nativeEventTarget) {
   6733    root = nativeEventTarget;
   6734    startText = getText();
   6735    return true;
   6736  }
   6737  function reset() {
   6738    root = null;
   6739    startText = null;
   6740    fallbackText = null;
   6741  }
   6742  function getData() {
   6743    if (fallbackText) {
   6744      return fallbackText;
   6745    }
   6746
   6747    var start;
   6748    var startValue = startText;
   6749    var startLength = startValue.length;
   6750    var end;
   6751    var endValue = getText();
   6752    var endLength = endValue.length;
   6753
   6754    for (start = 0; start < startLength; start++) {
   6755      if (startValue[start] !== endValue[start]) {
   6756        break;
   6757      }
   6758    }
   6759
   6760    var minEnd = startLength - start;
   6761
   6762    for (end = 1; end <= minEnd; end++) {
   6763      if (startValue[startLength - end] !== endValue[endLength - end]) {
   6764        break;
   6765      }
   6766    }
   6767
   6768    var sliceTail = end > 1 ? 1 - end : undefined;
   6769    fallbackText = endValue.slice(start, sliceTail);
   6770    return fallbackText;
   6771  }
   6772  function getText() {
   6773    if ('value' in root) {
   6774      return root.value;
   6775    }
   6776
   6777    return root.textContent;
   6778  }
   6779
   6780  /**
   6781   * `charCode` represents the actual "character code" and is safe to use with
   6782   * `String.fromCharCode`. As such, only keys that correspond to printable
   6783   * characters produce a valid `charCode`, the only exception to this is Enter.
   6784   * The Tab-key is considered non-printable and does not have a `charCode`,
   6785   * presumably because it does not produce a tab-character in browsers.
   6786   *
   6787   * @param {object} nativeEvent Native browser event.
   6788   * @return {number} Normalized `charCode` property.
   6789   */
   6790  function getEventCharCode(nativeEvent) {
   6791    var charCode;
   6792    var keyCode = nativeEvent.keyCode;
   6793
   6794    if ('charCode' in nativeEvent) {
   6795      charCode = nativeEvent.charCode; // FF does not set `charCode` for the Enter-key, check against `keyCode`.
   6796
   6797      if (charCode === 0 && keyCode === 13) {
   6798        charCode = 13;
   6799      }
   6800    } else {
   6801      // IE8 does not implement `charCode`, but `keyCode` has the correct value.
   6802      charCode = keyCode;
   6803    } // IE and Edge (on Windows) and Chrome / Safari (on Windows and Linux)
   6804    // report Enter as charCode 10 when ctrl is pressed.
   6805
   6806
   6807    if (charCode === 10) {
   6808      charCode = 13;
   6809    } // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
   6810    // Must not discard the (non-)printable Enter-key.
   6811
   6812
   6813    if (charCode >= 32 || charCode === 13) {
   6814      return charCode;
   6815    }
   6816
   6817    return 0;
   6818  }
   6819
   6820  function functionThatReturnsTrue() {
   6821    return true;
   6822  }
   6823
   6824  function functionThatReturnsFalse() {
   6825    return false;
   6826  } // This is intentionally a factory so that we have different returned constructors.
   6827  // If we had a single constructor, it would be megamorphic and engines would deopt.
   6828
   6829
   6830  function createSyntheticEvent(Interface) {
   6831    /**
   6832     * Synthetic events are dispatched by event plugins, typically in response to a
   6833     * top-level event delegation handler.
   6834     *
   6835     * These systems should generally use pooling to reduce the frequency of garbage
   6836     * collection. The system should check `isPersistent` to determine whether the
   6837     * event should be released into the pool after being dispatched. Users that
   6838     * need a persisted event should invoke `persist`.
   6839     *
   6840     * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
   6841     * normalizing browser quirks. Subclasses do not necessarily have to implement a
   6842     * DOM interface; custom application-specific events can also subclass this.
   6843     */
   6844    function SyntheticBaseEvent(reactName, reactEventType, targetInst, nativeEvent, nativeEventTarget) {
   6845      this._reactName = reactName;
   6846      this._targetInst = targetInst;
   6847      this.type = reactEventType;
   6848      this.nativeEvent = nativeEvent;
   6849      this.target = nativeEventTarget;
   6850      this.currentTarget = null;
   6851
   6852      for (var _propName in Interface) {
   6853        if (!Interface.hasOwnProperty(_propName)) {
   6854          continue;
   6855        }
   6856
   6857        var normalize = Interface[_propName];
   6858
   6859        if (normalize) {
   6860          this[_propName] = normalize(nativeEvent);
   6861        } else {
   6862          this[_propName] = nativeEvent[_propName];
   6863        }
   6864      }
   6865
   6866      var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;
   6867
   6868      if (defaultPrevented) {
   6869        this.isDefaultPrevented = functionThatReturnsTrue;
   6870      } else {
   6871        this.isDefaultPrevented = functionThatReturnsFalse;
   6872      }
   6873
   6874      this.isPropagationStopped = functionThatReturnsFalse;
   6875      return this;
   6876    }
   6877
   6878    assign(SyntheticBaseEvent.prototype, {
   6879      preventDefault: function () {
   6880        this.defaultPrevented = true;
   6881        var event = this.nativeEvent;
   6882
   6883        if (!event) {
   6884          return;
   6885        }
   6886
   6887        if (event.preventDefault) {
   6888          event.preventDefault(); // $FlowFixMe - flow is not aware of `unknown` in IE
   6889        } else if (typeof event.returnValue !== 'unknown') {
   6890          event.returnValue = false;
   6891        }
   6892
   6893        this.isDefaultPrevented = functionThatReturnsTrue;
   6894      },
   6895      stopPropagation: function () {
   6896        var event = this.nativeEvent;
   6897
   6898        if (!event) {
   6899          return;
   6900        }
   6901
   6902        if (event.stopPropagation) {
   6903          event.stopPropagation(); // $FlowFixMe - flow is not aware of `unknown` in IE
   6904        } else if (typeof event.cancelBubble !== 'unknown') {
   6905          // The ChangeEventPlugin registers a "propertychange" event for
   6906          // IE. This event does not support bubbling or cancelling, and
   6907          // any references to cancelBubble throw "Member not found".  A
   6908          // typeof check of "unknown" circumvents this issue (and is also
   6909          // IE specific).
   6910          event.cancelBubble = true;
   6911        }
   6912
   6913        this.isPropagationStopped = functionThatReturnsTrue;
   6914      },
   6915
   6916      /**
   6917       * We release all dispatched `SyntheticEvent`s after each event loop, adding
   6918       * them back into the pool. This allows a way to hold onto a reference that
   6919       * won't be added back into the pool.
   6920       */
   6921      persist: function () {// Modern event system doesn't use pooling.
   6922      },
   6923
   6924      /**
   6925       * Checks if this event should be released back into the pool.
   6926       *
   6927       * @return {boolean} True if this should not be released, false otherwise.
   6928       */
   6929      isPersistent: functionThatReturnsTrue
   6930    });
   6931    return SyntheticBaseEvent;
   6932  }
   6933  /**
   6934   * @interface Event
   6935   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   6936   */
   6937
   6938
   6939  var EventInterface = {
   6940    eventPhase: 0,
   6941    bubbles: 0,
   6942    cancelable: 0,
   6943    timeStamp: function (event) {
   6944      return event.timeStamp || Date.now();
   6945    },
   6946    defaultPrevented: 0,
   6947    isTrusted: 0
   6948  };
   6949  var SyntheticEvent = createSyntheticEvent(EventInterface);
   6950
   6951  var UIEventInterface = assign({}, EventInterface, {
   6952    view: 0,
   6953    detail: 0
   6954  });
   6955
   6956  var SyntheticUIEvent = createSyntheticEvent(UIEventInterface);
   6957  var lastMovementX;
   6958  var lastMovementY;
   6959  var lastMouseEvent;
   6960
   6961  function updateMouseMovementPolyfillState(event) {
   6962    if (event !== lastMouseEvent) {
   6963      if (lastMouseEvent && event.type === 'mousemove') {
   6964        lastMovementX = event.screenX - lastMouseEvent.screenX;
   6965        lastMovementY = event.screenY - lastMouseEvent.screenY;
   6966      } else {
   6967        lastMovementX = 0;
   6968        lastMovementY = 0;
   6969      }
   6970
   6971      lastMouseEvent = event;
   6972    }
   6973  }
   6974  /**
   6975   * @interface MouseEvent
   6976   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   6977   */
   6978
   6979
   6980  var MouseEventInterface = assign({}, UIEventInterface, {
   6981    screenX: 0,
   6982    screenY: 0,
   6983    clientX: 0,
   6984    clientY: 0,
   6985    pageX: 0,
   6986    pageY: 0,
   6987    ctrlKey: 0,
   6988    shiftKey: 0,
   6989    altKey: 0,
   6990    metaKey: 0,
   6991    getModifierState: getEventModifierState,
   6992    button: 0,
   6993    buttons: 0,
   6994    relatedTarget: function (event) {
   6995      if (event.relatedTarget === undefined) return event.fromElement === event.srcElement ? event.toElement : event.fromElement;
   6996      return event.relatedTarget;
   6997    },
   6998    movementX: function (event) {
   6999      if ('movementX' in event) {
   7000        return event.movementX;
   7001      }
   7002
   7003      updateMouseMovementPolyfillState(event);
   7004      return lastMovementX;
   7005    },
   7006    movementY: function (event) {
   7007      if ('movementY' in event) {
   7008        return event.movementY;
   7009      } // Don't need to call updateMouseMovementPolyfillState() here
   7010      // because it's guaranteed to have already run when movementX
   7011      // was copied.
   7012
   7013
   7014      return lastMovementY;
   7015    }
   7016  });
   7017
   7018  var SyntheticMouseEvent = createSyntheticEvent(MouseEventInterface);
   7019  /**
   7020   * @interface DragEvent
   7021   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   7022   */
   7023
   7024  var DragEventInterface = assign({}, MouseEventInterface, {
   7025    dataTransfer: 0
   7026  });
   7027
   7028  var SyntheticDragEvent = createSyntheticEvent(DragEventInterface);
   7029  /**
   7030   * @interface FocusEvent
   7031   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   7032   */
   7033
   7034  var FocusEventInterface = assign({}, UIEventInterface, {
   7035    relatedTarget: 0
   7036  });
   7037
   7038  var SyntheticFocusEvent = createSyntheticEvent(FocusEventInterface);
   7039  /**
   7040   * @interface Event
   7041   * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
   7042   * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
   7043   */
   7044
   7045  var AnimationEventInterface = assign({}, EventInterface, {
   7046    animationName: 0,
   7047    elapsedTime: 0,
   7048    pseudoElement: 0
   7049  });
   7050
   7051  var SyntheticAnimationEvent = createSyntheticEvent(AnimationEventInterface);
   7052  /**
   7053   * @interface Event
   7054   * @see http://www.w3.org/TR/clipboard-apis/
   7055   */
   7056
   7057  var ClipboardEventInterface = assign({}, EventInterface, {
   7058    clipboardData: function (event) {
   7059      return 'clipboardData' in event ? event.clipboardData : window.clipboardData;
   7060    }
   7061  });
   7062
   7063  var SyntheticClipboardEvent = createSyntheticEvent(ClipboardEventInterface);
   7064  /**
   7065   * @interface Event
   7066   * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
   7067   */
   7068
   7069  var CompositionEventInterface = assign({}, EventInterface, {
   7070    data: 0
   7071  });
   7072
   7073  var SyntheticCompositionEvent = createSyntheticEvent(CompositionEventInterface);
   7074  /**
   7075   * @interface Event
   7076   * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
   7077   *      /#events-inputevents
   7078   */
   7079  // Happens to share the same list for now.
   7080
   7081  var SyntheticInputEvent = SyntheticCompositionEvent;
   7082  /**
   7083   * Normalization of deprecated HTML5 `key` values
   7084   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
   7085   */
   7086
   7087  var normalizeKey = {
   7088    Esc: 'Escape',
   7089    Spacebar: ' ',
   7090    Left: 'ArrowLeft',
   7091    Up: 'ArrowUp',
   7092    Right: 'ArrowRight',
   7093    Down: 'ArrowDown',
   7094    Del: 'Delete',
   7095    Win: 'OS',
   7096    Menu: 'ContextMenu',
   7097    Apps: 'ContextMenu',
   7098    Scroll: 'ScrollLock',
   7099    MozPrintableKey: 'Unidentified'
   7100  };
   7101  /**
   7102   * Translation from legacy `keyCode` to HTML5 `key`
   7103   * Only special keys supported, all others depend on keyboard layout or browser
   7104   * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
   7105   */
   7106
   7107  var translateToKey = {
   7108    '8': 'Backspace',
   7109    '9': 'Tab',
   7110    '12': 'Clear',
   7111    '13': 'Enter',
   7112    '16': 'Shift',
   7113    '17': 'Control',
   7114    '18': 'Alt',
   7115    '19': 'Pause',
   7116    '20': 'CapsLock',
   7117    '27': 'Escape',
   7118    '32': ' ',
   7119    '33': 'PageUp',
   7120    '34': 'PageDown',
   7121    '35': 'End',
   7122    '36': 'Home',
   7123    '37': 'ArrowLeft',
   7124    '38': 'ArrowUp',
   7125    '39': 'ArrowRight',
   7126    '40': 'ArrowDown',
   7127    '45': 'Insert',
   7128    '46': 'Delete',
   7129    '112': 'F1',
   7130    '113': 'F2',
   7131    '114': 'F3',
   7132    '115': 'F4',
   7133    '116': 'F5',
   7134    '117': 'F6',
   7135    '118': 'F7',
   7136    '119': 'F8',
   7137    '120': 'F9',
   7138    '121': 'F10',
   7139    '122': 'F11',
   7140    '123': 'F12',
   7141    '144': 'NumLock',
   7142    '145': 'ScrollLock',
   7143    '224': 'Meta'
   7144  };
   7145  /**
   7146   * @param {object} nativeEvent Native browser event.
   7147   * @return {string} Normalized `key` property.
   7148   */
   7149
   7150  function getEventKey(nativeEvent) {
   7151    if (nativeEvent.key) {
   7152      // Normalize inconsistent values reported by browsers due to
   7153      // implementations of a working draft specification.
   7154      // FireFox implements `key` but returns `MozPrintableKey` for all
   7155      // printable characters (normalized to `Unidentified`), ignore it.
   7156      var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
   7157
   7158      if (key !== 'Unidentified') {
   7159        return key;
   7160      }
   7161    } // Browser does not implement `key`, polyfill as much of it as we can.
   7162
   7163
   7164    if (nativeEvent.type === 'keypress') {
   7165      var charCode = getEventCharCode(nativeEvent); // The enter-key is technically both printable and non-printable and can
   7166      // thus be captured by `keypress`, no other non-printable key should.
   7167
   7168      return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);
   7169    }
   7170
   7171    if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {
   7172      // While user keyboard layout determines the actual meaning of each
   7173      // `keyCode` value, almost all function keys have a universal value.
   7174      return translateToKey[nativeEvent.keyCode] || 'Unidentified';
   7175    }
   7176
   7177    return '';
   7178  }
   7179  /**
   7180   * Translation from modifier key to the associated property in the event.
   7181   * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
   7182   */
   7183
   7184
   7185  var modifierKeyToProp = {
   7186    Alt: 'altKey',
   7187    Control: 'ctrlKey',
   7188    Meta: 'metaKey',
   7189    Shift: 'shiftKey'
   7190  }; // Older browsers (Safari <= 10, iOS Safari <= 10.2) do not support
   7191  // getModifierState. If getModifierState is not supported, we map it to a set of
   7192  // modifier keys exposed by the event. In this case, Lock-keys are not supported.
   7193
   7194  function modifierStateGetter(keyArg) {
   7195    var syntheticEvent = this;
   7196    var nativeEvent = syntheticEvent.nativeEvent;
   7197
   7198    if (nativeEvent.getModifierState) {
   7199      return nativeEvent.getModifierState(keyArg);
   7200    }
   7201
   7202    var keyProp = modifierKeyToProp[keyArg];
   7203    return keyProp ? !!nativeEvent[keyProp] : false;
   7204  }
   7205
   7206  function getEventModifierState(nativeEvent) {
   7207    return modifierStateGetter;
   7208  }
   7209  /**
   7210   * @interface KeyboardEvent
   7211   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   7212   */
   7213
   7214
   7215  var KeyboardEventInterface = assign({}, UIEventInterface, {
   7216    key: getEventKey,
   7217    code: 0,
   7218    location: 0,
   7219    ctrlKey: 0,
   7220    shiftKey: 0,
   7221    altKey: 0,
   7222    metaKey: 0,
   7223    repeat: 0,
   7224    locale: 0,
   7225    getModifierState: getEventModifierState,
   7226    // Legacy Interface
   7227    charCode: function (event) {
   7228      // `charCode` is the result of a KeyPress event and represents the value of
   7229      // the actual printable character.
   7230      // KeyPress is deprecated, but its replacement is not yet final and not
   7231      // implemented in any major browser. Only KeyPress has charCode.
   7232      if (event.type === 'keypress') {
   7233        return getEventCharCode(event);
   7234      }
   7235
   7236      return 0;
   7237    },
   7238    keyCode: function (event) {
   7239      // `keyCode` is the result of a KeyDown/Up event and represents the value of
   7240      // physical keyboard key.
   7241      // The actual meaning of the value depends on the users' keyboard layout
   7242      // which cannot be detected. Assuming that it is a US keyboard layout
   7243      // provides a surprisingly accurate mapping for US and European users.
   7244      // Due to this, it is left to the user to implement at this time.
   7245      if (event.type === 'keydown' || event.type === 'keyup') {
   7246        return event.keyCode;
   7247      }
   7248
   7249      return 0;
   7250    },
   7251    which: function (event) {
   7252      // `which` is an alias for either `keyCode` or `charCode` depending on the
   7253      // type of the event.
   7254      if (event.type === 'keypress') {
   7255        return getEventCharCode(event);
   7256      }
   7257
   7258      if (event.type === 'keydown' || event.type === 'keyup') {
   7259        return event.keyCode;
   7260      }
   7261
   7262      return 0;
   7263    }
   7264  });
   7265
   7266  var SyntheticKeyboardEvent = createSyntheticEvent(KeyboardEventInterface);
   7267  /**
   7268   * @interface PointerEvent
   7269   * @see http://www.w3.org/TR/pointerevents/
   7270   */
   7271
   7272  var PointerEventInterface = assign({}, MouseEventInterface, {
   7273    pointerId: 0,
   7274    width: 0,
   7275    height: 0,
   7276    pressure: 0,
   7277    tangentialPressure: 0,
   7278    tiltX: 0,
   7279    tiltY: 0,
   7280    twist: 0,
   7281    pointerType: 0,
   7282    isPrimary: 0
   7283  });
   7284
   7285  var SyntheticPointerEvent = createSyntheticEvent(PointerEventInterface);
   7286  /**
   7287   * @interface TouchEvent
   7288   * @see http://www.w3.org/TR/touch-events/
   7289   */
   7290
   7291  var TouchEventInterface = assign({}, UIEventInterface, {
   7292    touches: 0,
   7293    targetTouches: 0,
   7294    changedTouches: 0,
   7295    altKey: 0,
   7296    metaKey: 0,
   7297    ctrlKey: 0,
   7298    shiftKey: 0,
   7299    getModifierState: getEventModifierState
   7300  });
   7301
   7302  var SyntheticTouchEvent = createSyntheticEvent(TouchEventInterface);
   7303  /**
   7304   * @interface Event
   7305   * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
   7306   * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
   7307   */
   7308
   7309  var TransitionEventInterface = assign({}, EventInterface, {
   7310    propertyName: 0,
   7311    elapsedTime: 0,
   7312    pseudoElement: 0
   7313  });
   7314
   7315  var SyntheticTransitionEvent = createSyntheticEvent(TransitionEventInterface);
   7316  /**
   7317   * @interface WheelEvent
   7318   * @see http://www.w3.org/TR/DOM-Level-3-Events/
   7319   */
   7320
   7321  var WheelEventInterface = assign({}, MouseEventInterface, {
   7322    deltaX: function (event) {
   7323      return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
   7324      'wheelDeltaX' in event ? -event.wheelDeltaX : 0;
   7325    },
   7326    deltaY: function (event) {
   7327      return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
   7328      'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
   7329      'wheelDelta' in event ? -event.wheelDelta : 0;
   7330    },
   7331    deltaZ: 0,
   7332    // Browsers without "deltaMode" is reporting in raw wheel delta where one
   7333    // notch on the scroll is always +/- 120, roughly equivalent to pixels.
   7334    // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
   7335    // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
   7336    deltaMode: 0
   7337  });
   7338
   7339  var SyntheticWheelEvent = createSyntheticEvent(WheelEventInterface);
   7340
   7341  var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
   7342
   7343  var START_KEYCODE = 229;
   7344  var canUseCompositionEvent = canUseDOM && 'CompositionEvent' in window;
   7345  var documentMode = null;
   7346
   7347  if (canUseDOM && 'documentMode' in document) {
   7348    documentMode = document.documentMode;
   7349  } // Webkit offers a very useful `textInput` event that can be used to
   7350  // directly represent `beforeInput`. The IE `textinput` event is not as
   7351  // useful, so we don't use it.
   7352
   7353
   7354  var canUseTextInputEvent = canUseDOM && 'TextEvent' in window && !documentMode; // In IE9+, we have access to composition events, but the data supplied
   7355  // by the native compositionend event may be incorrect. Japanese ideographic
   7356  // spaces, for instance (\u3000) are not recorded correctly.
   7357
   7358  var useFallbackCompositionData = canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);
   7359  var SPACEBAR_CODE = 32;
   7360  var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
   7361
   7362  function registerEvents() {
   7363    registerTwoPhaseEvent('onBeforeInput', ['compositionend', 'keypress', 'textInput', 'paste']);
   7364    registerTwoPhaseEvent('onCompositionEnd', ['compositionend', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
   7365    registerTwoPhaseEvent('onCompositionStart', ['compositionstart', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
   7366    registerTwoPhaseEvent('onCompositionUpdate', ['compositionupdate', 'focusout', 'keydown', 'keypress', 'keyup', 'mousedown']);
   7367  } // Track whether we've ever handled a keypress on the space key.
   7368
   7369
   7370  var hasSpaceKeypress = false;
   7371  /**
   7372   * Return whether a native keypress event is assumed to be a command.
   7373   * This is required because Firefox fires `keypress` events for key commands
   7374   * (cut, copy, select-all, etc.) even though no character is inserted.
   7375   */
   7376
   7377  function isKeypressCommand(nativeEvent) {
   7378    return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) && // ctrlKey && altKey is equivalent to AltGr, and is not a command.
   7379    !(nativeEvent.ctrlKey && nativeEvent.altKey);
   7380  }
   7381  /**
   7382   * Translate native top level events into event types.
   7383   */
   7384
   7385
   7386  function getCompositionEventType(domEventName) {
   7387    switch (domEventName) {
   7388      case 'compositionstart':
   7389        return 'onCompositionStart';
   7390
   7391      case 'compositionend':
   7392        return 'onCompositionEnd';
   7393
   7394      case 'compositionupdate':
   7395        return 'onCompositionUpdate';
   7396    }
   7397  }
   7398  /**
   7399   * Does our fallback best-guess model think this event signifies that
   7400   * composition has begun?
   7401   */
   7402
   7403
   7404  function isFallbackCompositionStart(domEventName, nativeEvent) {
   7405    return domEventName === 'keydown' && nativeEvent.keyCode === START_KEYCODE;
   7406  }
   7407  /**
   7408   * Does our fallback mode think that this event is the end of composition?
   7409   */
   7410
   7411
   7412  function isFallbackCompositionEnd(domEventName, nativeEvent) {
   7413    switch (domEventName) {
   7414      case 'keyup':
   7415        // Command keys insert or clear IME input.
   7416        return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
   7417
   7418      case 'keydown':
   7419        // Expect IME keyCode on each keydown. If we get any other
   7420        // code we must have exited earlier.
   7421        return nativeEvent.keyCode !== START_KEYCODE;
   7422
   7423      case 'keypress':
   7424      case 'mousedown':
   7425      case 'focusout':
   7426        // Events are not possible without cancelling IME.
   7427        return true;
   7428
   7429      default:
   7430        return false;
   7431    }
   7432  }
   7433  /**
   7434   * Google Input Tools provides composition data via a CustomEvent,
   7435   * with the `data` property populated in the `detail` object. If this
   7436   * is available on the event object, use it. If not, this is a plain
   7437   * composition event and we have nothing special to extract.
   7438   *
   7439   * @param {object} nativeEvent
   7440   * @return {?string}
   7441   */
   7442
   7443
   7444  function getDataFromCustomEvent(nativeEvent) {
   7445    var detail = nativeEvent.detail;
   7446
   7447    if (typeof detail === 'object' && 'data' in detail) {
   7448      return detail.data;
   7449    }
   7450
   7451    return null;
   7452  }
   7453  /**
   7454   * Check if a composition event was triggered by Korean IME.
   7455   * Our fallback mode does not work well with IE's Korean IME,
   7456   * so just use native composition events when Korean IME is used.
   7457   * Although CompositionEvent.locale property is deprecated,
   7458   * it is available in IE, where our fallback mode is enabled.
   7459   *
   7460   * @param {object} nativeEvent
   7461   * @return {boolean}
   7462   */
   7463
   7464
   7465  function isUsingKoreanIME(nativeEvent) {
   7466    return nativeEvent.locale === 'ko';
   7467  } // Track the current IME composition status, if any.
   7468
   7469
   7470  var isComposing = false;
   7471  /**
   7472   * @return {?object} A SyntheticCompositionEvent.
   7473   */
   7474
   7475  function extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
   7476    var eventType;
   7477    var fallbackData;
   7478
   7479    if (canUseCompositionEvent) {
   7480      eventType = getCompositionEventType(domEventName);
   7481    } else if (!isComposing) {
   7482      if (isFallbackCompositionStart(domEventName, nativeEvent)) {
   7483        eventType = 'onCompositionStart';
   7484      }
   7485    } else if (isFallbackCompositionEnd(domEventName, nativeEvent)) {
   7486      eventType = 'onCompositionEnd';
   7487    }
   7488
   7489    if (!eventType) {
   7490      return null;
   7491    }
   7492
   7493    if (useFallbackCompositionData && !isUsingKoreanIME(nativeEvent)) {
   7494      // The current composition is stored statically and must not be
   7495      // overwritten while composition continues.
   7496      if (!isComposing && eventType === 'onCompositionStart') {
   7497        isComposing = initialize(nativeEventTarget);
   7498      } else if (eventType === 'onCompositionEnd') {
   7499        if (isComposing) {
   7500          fallbackData = getData();
   7501        }
   7502      }
   7503    }
   7504
   7505    var listeners = accumulateTwoPhaseListeners(targetInst, eventType);
   7506
   7507    if (listeners.length > 0) {
   7508      var event = new SyntheticCompositionEvent(eventType, domEventName, null, nativeEvent, nativeEventTarget);
   7509      dispatchQueue.push({
   7510        event: event,
   7511        listeners: listeners
   7512      });
   7513
   7514      if (fallbackData) {
   7515        // Inject data generated from fallback path into the synthetic event.
   7516        // This matches the property of native CompositionEventInterface.
   7517        event.data = fallbackData;
   7518      } else {
   7519        var customData = getDataFromCustomEvent(nativeEvent);
   7520
   7521        if (customData !== null) {
   7522          event.data = customData;
   7523        }
   7524      }
   7525    }
   7526  }
   7527
   7528  function getNativeBeforeInputChars(domEventName, nativeEvent) {
   7529    switch (domEventName) {
   7530      case 'compositionend':
   7531        return getDataFromCustomEvent(nativeEvent);
   7532
   7533      case 'keypress':
   7534        /**
   7535         * If native `textInput` events are available, our goal is to make
   7536         * use of them. However, there is a special case: the spacebar key.
   7537         * In Webkit, preventing default on a spacebar `textInput` event
   7538         * cancels character insertion, but it *also* causes the browser
   7539         * to fall back to its default spacebar behavior of scrolling the
   7540         * page.
   7541         *
   7542         * Tracking at:
   7543         * https://code.google.com/p/chromium/issues/detail?id=355103
   7544         *
   7545         * To avoid this issue, use the keypress event as if no `textInput`
   7546         * event is available.
   7547         */
   7548        var which = nativeEvent.which;
   7549
   7550        if (which !== SPACEBAR_CODE) {
   7551          return null;
   7552        }
   7553
   7554        hasSpaceKeypress = true;
   7555        return SPACEBAR_CHAR;
   7556
   7557      case 'textInput':
   7558        // Record the characters to be added to the DOM.
   7559        var chars = nativeEvent.data; // If it's a spacebar character, assume that we have already handled
   7560        // it at the keypress level and bail immediately. Android Chrome
   7561        // doesn't give us keycodes, so we need to ignore it.
   7562
   7563        if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
   7564          return null;
   7565        }
   7566
   7567        return chars;
   7568
   7569      default:
   7570        // For other native event types, do nothing.
   7571        return null;
   7572    }
   7573  }
   7574  /**
   7575   * For browsers that do not provide the `textInput` event, extract the
   7576   * appropriate string to use for SyntheticInputEvent.
   7577   */
   7578
   7579
   7580  function getFallbackBeforeInputChars(domEventName, nativeEvent) {
   7581    // If we are currently composing (IME) and using a fallback to do so,
   7582    // try to extract the composed characters from the fallback object.
   7583    // If composition event is available, we extract a string only at
   7584    // compositionevent, otherwise extract it at fallback events.
   7585    if (isComposing) {
   7586      if (domEventName === 'compositionend' || !canUseCompositionEvent && isFallbackCompositionEnd(domEventName, nativeEvent)) {
   7587        var chars = getData();
   7588        reset();
   7589        isComposing = false;
   7590        return chars;
   7591      }
   7592
   7593      return null;
   7594    }
   7595
   7596    switch (domEventName) {
   7597      case 'paste':
   7598        // If a paste event occurs after a keypress, throw out the input
   7599        // chars. Paste events should not lead to BeforeInput events.
   7600        return null;
   7601
   7602      case 'keypress':
   7603        /**
   7604         * As of v27, Firefox may fire keypress events even when no character
   7605         * will be inserted. A few possibilities:
   7606         *
   7607         * - `which` is `0`. Arrow keys, Esc key, etc.
   7608         *
   7609         * - `which` is the pressed key code, but no char is available.
   7610         *   Ex: 'AltGr + d` in Polish. There is no modified character for
   7611         *   this key combination and no character is inserted into the
   7612         *   document, but FF fires the keypress for char code `100` anyway.
   7613         *   No `input` event will occur.
   7614         *
   7615         * - `which` is the pressed key code, but a command combination is
   7616         *   being used. Ex: `Cmd+C`. No character is inserted, and no
   7617         *   `input` event will occur.
   7618         */
   7619        if (!isKeypressCommand(nativeEvent)) {
   7620          // IE fires the `keypress` event when a user types an emoji via
   7621          // Touch keyboard of Windows.  In such a case, the `char` property
   7622          // holds an emoji character like `\uD83D\uDE0A`.  Because its length
   7623          // is 2, the property `which` does not represent an emoji correctly.
   7624          // In such a case, we directly return the `char` property instead of
   7625          // using `which`.
   7626          if (nativeEvent.char && nativeEvent.char.length > 1) {
   7627            return nativeEvent.char;
   7628          } else if (nativeEvent.which) {
   7629            return String.fromCharCode(nativeEvent.which);
   7630          }
   7631        }
   7632
   7633        return null;
   7634
   7635      case 'compositionend':
   7636        return useFallbackCompositionData && !isUsingKoreanIME(nativeEvent) ? null : nativeEvent.data;
   7637
   7638      default:
   7639        return null;
   7640    }
   7641  }
   7642  /**
   7643   * Extract a SyntheticInputEvent for `beforeInput`, based on either native
   7644   * `textInput` or fallback behavior.
   7645   *
   7646   * @return {?object} A SyntheticInputEvent.
   7647   */
   7648
   7649
   7650  function extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget) {
   7651    var chars;
   7652
   7653    if (canUseTextInputEvent) {
   7654      chars = getNativeBeforeInputChars(domEventName, nativeEvent);
   7655    } else {
   7656      chars = getFallbackBeforeInputChars(domEventName, nativeEvent);
   7657    } // If no characters are being inserted, no BeforeInput event should
   7658    // be fired.
   7659
   7660
   7661    if (!chars) {
   7662      return null;
   7663    }
   7664
   7665    var listeners = accumulateTwoPhaseListeners(targetInst, 'onBeforeInput');
   7666
   7667    if (listeners.length > 0) {
   7668      var event = new SyntheticInputEvent('onBeforeInput', 'beforeinput', null, nativeEvent, nativeEventTarget);
   7669      dispatchQueue.push({
   7670        event: event,
   7671        listeners: listeners
   7672      });
   7673      event.data = chars;
   7674    }
   7675  }
   7676  /**
   7677   * Create an `onBeforeInput` event to match
   7678   * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
   7679   *
   7680   * This event plugin is based on the native `textInput` event
   7681   * available in Chrome, Safari, Opera, and IE. This event fires after
   7682   * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
   7683   *
   7684   * `beforeInput` is spec'd but not implemented in any browsers, and
   7685   * the `input` event does not provide any useful information about what has
   7686   * actually been added, contrary to the spec. Thus, `textInput` is the best
   7687   * available event to identify the characters that have actually been inserted
   7688   * into the target node.
   7689   *
   7690   * This plugin is also responsible for emitting `composition` events, thus
   7691   * allowing us to share composition fallback code for both `beforeInput` and
   7692   * `composition` event types.
   7693   */
   7694
   7695
   7696  function extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   7697    extractCompositionEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   7698    extractBeforeInputEvent(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   7699  }
   7700
   7701  /**
   7702   * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
   7703   */
   7704  var supportedInputTypes = {
   7705    color: true,
   7706    date: true,
   7707    datetime: true,
   7708    'datetime-local': true,
   7709    email: true,
   7710    month: true,
   7711    number: true,
   7712    password: true,
   7713    range: true,
   7714    search: true,
   7715    tel: true,
   7716    text: true,
   7717    time: true,
   7718    url: true,
   7719    week: true
   7720  };
   7721
   7722  function isTextInputElement(elem) {
   7723    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
   7724
   7725    if (nodeName === 'input') {
   7726      return !!supportedInputTypes[elem.type];
   7727    }
   7728
   7729    if (nodeName === 'textarea') {
   7730      return true;
   7731    }
   7732
   7733    return false;
   7734  }
   7735
   7736  /**
   7737   * Checks if an event is supported in the current execution environment.
   7738   *
   7739   * NOTE: This will not work correctly for non-generic events such as `change`,
   7740   * `reset`, `load`, `error`, and `select`.
   7741   *
   7742   * Borrows from Modernizr.
   7743   *
   7744   * @param {string} eventNameSuffix Event name, e.g. "click".
   7745   * @return {boolean} True if the event is supported.
   7746   * @internal
   7747   * @license Modernizr 3.0.0pre (Custom Build) | MIT
   7748   */
   7749
   7750  function isEventSupported(eventNameSuffix) {
   7751    if (!canUseDOM) {
   7752      return false;
   7753    }
   7754
   7755    var eventName = 'on' + eventNameSuffix;
   7756    var isSupported = (eventName in document);
   7757
   7758    if (!isSupported) {
   7759      var element = document.createElement('div');
   7760      element.setAttribute(eventName, 'return;');
   7761      isSupported = typeof element[eventName] === 'function';
   7762    }
   7763
   7764    return isSupported;
   7765  }
   7766
   7767  function registerEvents$1() {
   7768    registerTwoPhaseEvent('onChange', ['change', 'click', 'focusin', 'focusout', 'input', 'keydown', 'keyup', 'selectionchange']);
   7769  }
   7770
   7771  function createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, target) {
   7772    // Flag this event loop as needing state restore.
   7773    enqueueStateRestore(target);
   7774    var listeners = accumulateTwoPhaseListeners(inst, 'onChange');
   7775
   7776    if (listeners.length > 0) {
   7777      var event = new SyntheticEvent('onChange', 'change', null, nativeEvent, target);
   7778      dispatchQueue.push({
   7779        event: event,
   7780        listeners: listeners
   7781      });
   7782    }
   7783  }
   7784  /**
   7785   * For IE shims
   7786   */
   7787
   7788
   7789  var activeElement = null;
   7790  var activeElementInst = null;
   7791  /**
   7792   * SECTION: handle `change` event
   7793   */
   7794
   7795  function shouldUseChangeEvent(elem) {
   7796    var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
   7797    return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';
   7798  }
   7799
   7800  function manualDispatchChangeEvent(nativeEvent) {
   7801    var dispatchQueue = [];
   7802    createAndAccumulateChangeEvent(dispatchQueue, activeElementInst, nativeEvent, getEventTarget(nativeEvent)); // If change and propertychange bubbled, we'd just bind to it like all the
   7803    // other events and have it go through ReactBrowserEventEmitter. Since it
   7804    // doesn't, we manually listen for the events and so we have to enqueue and
   7805    // process the abstract event manually.
   7806    //
   7807    // Batching is necessary here in order to ensure that all event handlers run
   7808    // before the next rerender (including event handlers attached to ancestor
   7809    // elements instead of directly on the input). Without this, controlled
   7810    // components don't work properly in conjunction with event bubbling because
   7811    // the component is rerendered and the value reverted before all the event
   7812    // handlers can run. See https://github.com/facebook/react/issues/708.
   7813
   7814    batchedUpdates(runEventInBatch, dispatchQueue);
   7815  }
   7816
   7817  function runEventInBatch(dispatchQueue) {
   7818    processDispatchQueue(dispatchQueue, 0);
   7819  }
   7820
   7821  function getInstIfValueChanged(targetInst) {
   7822    var targetNode = getNodeFromInstance(targetInst);
   7823
   7824    if (updateValueIfChanged(targetNode)) {
   7825      return targetInst;
   7826    }
   7827  }
   7828
   7829  function getTargetInstForChangeEvent(domEventName, targetInst) {
   7830    if (domEventName === 'change') {
   7831      return targetInst;
   7832    }
   7833  }
   7834  /**
   7835   * SECTION: handle `input` event
   7836   */
   7837
   7838
   7839  var isInputEventSupported = false;
   7840
   7841  if (canUseDOM) {
   7842    // IE9 claims to support the input event but fails to trigger it when
   7843    // deleting text, so we ignore its input events.
   7844    isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);
   7845  }
   7846  /**
   7847   * (For IE <=9) Starts tracking propertychange events on the passed-in element
   7848   * and override the value property so that we can distinguish user events from
   7849   * value changes in JS.
   7850   */
   7851
   7852
   7853  function startWatchingForValueChange(target, targetInst) {
   7854    activeElement = target;
   7855    activeElementInst = targetInst;
   7856    activeElement.attachEvent('onpropertychange', handlePropertyChange);
   7857  }
   7858  /**
   7859   * (For IE <=9) Removes the event listeners from the currently-tracked element,
   7860   * if any exists.
   7861   */
   7862
   7863
   7864  function stopWatchingForValueChange() {
   7865    if (!activeElement) {
   7866      return;
   7867    }
   7868
   7869    activeElement.detachEvent('onpropertychange', handlePropertyChange);
   7870    activeElement = null;
   7871    activeElementInst = null;
   7872  }
   7873  /**
   7874   * (For IE <=9) Handles a propertychange event, sending a `change` event if
   7875   * the value of the active element has changed.
   7876   */
   7877
   7878
   7879  function handlePropertyChange(nativeEvent) {
   7880    if (nativeEvent.propertyName !== 'value') {
   7881      return;
   7882    }
   7883
   7884    if (getInstIfValueChanged(activeElementInst)) {
   7885      manualDispatchChangeEvent(nativeEvent);
   7886    }
   7887  }
   7888
   7889  function handleEventsForInputEventPolyfill(domEventName, target, targetInst) {
   7890    if (domEventName === 'focusin') {
   7891      // In IE9, propertychange fires for most input events but is buggy and
   7892      // doesn't fire when text is deleted, but conveniently, selectionchange
   7893      // appears to fire in all of the remaining cases so we catch those and
   7894      // forward the event if the value has changed
   7895      // In either case, we don't want to call the event handler if the value
   7896      // is changed from JS so we redefine a setter for `.value` that updates
   7897      // our activeElementValue variable, allowing us to ignore those changes
   7898      //
   7899      // stopWatching() should be a noop here but we call it just in case we
   7900      // missed a blur event somehow.
   7901      stopWatchingForValueChange();
   7902      startWatchingForValueChange(target, targetInst);
   7903    } else if (domEventName === 'focusout') {
   7904      stopWatchingForValueChange();
   7905    }
   7906  } // For IE8 and IE9.
   7907
   7908
   7909  function getTargetInstForInputEventPolyfill(domEventName, targetInst) {
   7910    if (domEventName === 'selectionchange' || domEventName === 'keyup' || domEventName === 'keydown') {
   7911      // On the selectionchange event, the target is just document which isn't
   7912      // helpful for us so just check activeElement instead.
   7913      //
   7914      // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
   7915      // propertychange on the first input event after setting `value` from a
   7916      // script and fires only keydown, keypress, keyup. Catching keyup usually
   7917      // gets it and catching keydown lets us fire an event for the first
   7918      // keystroke if user does a key repeat (it'll be a little delayed: right
   7919      // before the second keystroke). Other input methods (e.g., paste) seem to
   7920      // fire selectionchange normally.
   7921      return getInstIfValueChanged(activeElementInst);
   7922    }
   7923  }
   7924  /**
   7925   * SECTION: handle `click` event
   7926   */
   7927
   7928
   7929  function shouldUseClickEvent(elem) {
   7930    // Use the `click` event to detect changes to checkbox and radio inputs.
   7931    // This approach works across all browsers, whereas `change` does not fire
   7932    // until `blur` in IE8.
   7933    var nodeName = elem.nodeName;
   7934    return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');
   7935  }
   7936
   7937  function getTargetInstForClickEvent(domEventName, targetInst) {
   7938    if (domEventName === 'click') {
   7939      return getInstIfValueChanged(targetInst);
   7940    }
   7941  }
   7942
   7943  function getTargetInstForInputOrChangeEvent(domEventName, targetInst) {
   7944    if (domEventName === 'input' || domEventName === 'change') {
   7945      return getInstIfValueChanged(targetInst);
   7946    }
   7947  }
   7948
   7949  function handleControlledInputBlur(node) {
   7950    var state = node._wrapperState;
   7951
   7952    if (!state || !state.controlled || node.type !== 'number') {
   7953      return;
   7954    }
   7955
   7956    {
   7957      // If controlled, assign the value attribute to the current value on blur
   7958      setDefaultValue(node, 'number', node.value);
   7959    }
   7960  }
   7961  /**
   7962   * This plugin creates an `onChange` event that normalizes change events
   7963   * across form elements. This event fires at a time when it's possible to
   7964   * change the element's value without seeing a flicker.
   7965   *
   7966   * Supported elements are:
   7967   * - input (see `isTextInputElement`)
   7968   * - textarea
   7969   * - select
   7970   */
   7971
   7972
   7973  function extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   7974    var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
   7975    var getTargetInstFunc, handleEventFunc;
   7976
   7977    if (shouldUseChangeEvent(targetNode)) {
   7978      getTargetInstFunc = getTargetInstForChangeEvent;
   7979    } else if (isTextInputElement(targetNode)) {
   7980      if (isInputEventSupported) {
   7981        getTargetInstFunc = getTargetInstForInputOrChangeEvent;
   7982      } else {
   7983        getTargetInstFunc = getTargetInstForInputEventPolyfill;
   7984        handleEventFunc = handleEventsForInputEventPolyfill;
   7985      }
   7986    } else if (shouldUseClickEvent(targetNode)) {
   7987      getTargetInstFunc = getTargetInstForClickEvent;
   7988    }
   7989
   7990    if (getTargetInstFunc) {
   7991      var inst = getTargetInstFunc(domEventName, targetInst);
   7992
   7993      if (inst) {
   7994        createAndAccumulateChangeEvent(dispatchQueue, inst, nativeEvent, nativeEventTarget);
   7995        return;
   7996      }
   7997    }
   7998
   7999    if (handleEventFunc) {
   8000      handleEventFunc(domEventName, targetNode, targetInst);
   8001    } // When blurring, set the value attribute for number inputs
   8002
   8003
   8004    if (domEventName === 'focusout') {
   8005      handleControlledInputBlur(targetNode);
   8006    }
   8007  }
   8008
   8009  function registerEvents$2() {
   8010    registerDirectEvent('onMouseEnter', ['mouseout', 'mouseover']);
   8011    registerDirectEvent('onMouseLeave', ['mouseout', 'mouseover']);
   8012    registerDirectEvent('onPointerEnter', ['pointerout', 'pointerover']);
   8013    registerDirectEvent('onPointerLeave', ['pointerout', 'pointerover']);
   8014  }
   8015  /**
   8016   * For almost every interaction we care about, there will be both a top-level
   8017   * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
   8018   * we do not extract duplicate events. However, moving the mouse into the
   8019   * browser from outside will not fire a `mouseout` event. In this case, we use
   8020   * the `mouseover` top-level event.
   8021   */
   8022
   8023
   8024  function extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   8025    var isOverEvent = domEventName === 'mouseover' || domEventName === 'pointerover';
   8026    var isOutEvent = domEventName === 'mouseout' || domEventName === 'pointerout';
   8027
   8028    if (isOverEvent && !isReplayingEvent(nativeEvent)) {
   8029      // If this is an over event with a target, we might have already dispatched
   8030      // the event in the out event of the other target. If this is replayed,
   8031      // then it's because we couldn't dispatch against this target previously
   8032      // so we have to do it now instead.
   8033      var related = nativeEvent.relatedTarget || nativeEvent.fromElement;
   8034
   8035      if (related) {
   8036        // If the related node is managed by React, we can assume that we have
   8037        // already dispatched the corresponding events during its mouseout.
   8038        if (getClosestInstanceFromNode(related) || isContainerMarkedAsRoot(related)) {
   8039          return;
   8040        }
   8041      }
   8042    }
   8043
   8044    if (!isOutEvent && !isOverEvent) {
   8045      // Must not be a mouse or pointer in or out - ignoring.
   8046      return;
   8047    }
   8048
   8049    var win; // TODO: why is this nullable in the types but we read from it?
   8050
   8051    if (nativeEventTarget.window === nativeEventTarget) {
   8052      // `nativeEventTarget` is probably a window object.
   8053      win = nativeEventTarget;
   8054    } else {
   8055      // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
   8056      var doc = nativeEventTarget.ownerDocument;
   8057
   8058      if (doc) {
   8059        win = doc.defaultView || doc.parentWindow;
   8060      } else {
   8061        win = window;
   8062      }
   8063    }
   8064
   8065    var from;
   8066    var to;
   8067
   8068    if (isOutEvent) {
   8069      var _related = nativeEvent.relatedTarget || nativeEvent.toElement;
   8070
   8071      from = targetInst;
   8072      to = _related ? getClosestInstanceFromNode(_related) : null;
   8073
   8074      if (to !== null) {
   8075        var nearestMounted = getNearestMountedFiber(to);
   8076
   8077        if (to !== nearestMounted || to.tag !== HostComponent && to.tag !== HostText) {
   8078          to = null;
   8079        }
   8080      }
   8081    } else {
   8082      // Moving to a node from outside the window.
   8083      from = null;
   8084      to = targetInst;
   8085    }
   8086
   8087    if (from === to) {
   8088      // Nothing pertains to our managed components.
   8089      return;
   8090    }
   8091
   8092    var SyntheticEventCtor = SyntheticMouseEvent;
   8093    var leaveEventType = 'onMouseLeave';
   8094    var enterEventType = 'onMouseEnter';
   8095    var eventTypePrefix = 'mouse';
   8096
   8097    if (domEventName === 'pointerout' || domEventName === 'pointerover') {
   8098      SyntheticEventCtor = SyntheticPointerEvent;
   8099      leaveEventType = 'onPointerLeave';
   8100      enterEventType = 'onPointerEnter';
   8101      eventTypePrefix = 'pointer';
   8102    }
   8103
   8104    var fromNode = from == null ? win : getNodeFromInstance(from);
   8105    var toNode = to == null ? win : getNodeFromInstance(to);
   8106    var leave = new SyntheticEventCtor(leaveEventType, eventTypePrefix + 'leave', from, nativeEvent, nativeEventTarget);
   8107    leave.target = fromNode;
   8108    leave.relatedTarget = toNode;
   8109    var enter = null; // We should only process this nativeEvent if we are processing
   8110    // the first ancestor. Next time, we will ignore the event.
   8111
   8112    var nativeTargetInst = getClosestInstanceFromNode(nativeEventTarget);
   8113
   8114    if (nativeTargetInst === targetInst) {
   8115      var enterEvent = new SyntheticEventCtor(enterEventType, eventTypePrefix + 'enter', to, nativeEvent, nativeEventTarget);
   8116      enterEvent.target = toNode;
   8117      enterEvent.relatedTarget = fromNode;
   8118      enter = enterEvent;
   8119    }
   8120
   8121    accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leave, enter, from, to);
   8122  }
   8123
   8124  /**
   8125   * inlined Object.is polyfill to avoid requiring consumers ship their own
   8126   * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
   8127   */
   8128  function is(x, y) {
   8129    return x === y && (x !== 0 || 1 / x === 1 / y) || x !== x && y !== y // eslint-disable-line no-self-compare
   8130    ;
   8131  }
   8132
   8133  var objectIs = typeof Object.is === 'function' ? Object.is : is;
   8134
   8135  /**
   8136   * Performs equality by iterating through keys on an object and returning false
   8137   * when any key has values which are not strictly equal between the arguments.
   8138   * Returns true when the values of all keys are strictly equal.
   8139   */
   8140
   8141  function shallowEqual(objA, objB) {
   8142    if (objectIs(objA, objB)) {
   8143      return true;
   8144    }
   8145
   8146    if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {
   8147      return false;
   8148    }
   8149
   8150    var keysA = Object.keys(objA);
   8151    var keysB = Object.keys(objB);
   8152
   8153    if (keysA.length !== keysB.length) {
   8154      return false;
   8155    } // Test for A's keys different from B.
   8156
   8157
   8158    for (var i = 0; i < keysA.length; i++) {
   8159      var currentKey = keysA[i];
   8160
   8161      if (!hasOwnProperty.call(objB, currentKey) || !objectIs(objA[currentKey], objB[currentKey])) {
   8162        return false;
   8163      }
   8164    }
   8165
   8166    return true;
   8167  }
   8168
   8169  /**
   8170   * Given any node return the first leaf node without children.
   8171   *
   8172   * @param {DOMElement|DOMTextNode} node
   8173   * @return {DOMElement|DOMTextNode}
   8174   */
   8175
   8176  function getLeafNode(node) {
   8177    while (node && node.firstChild) {
   8178      node = node.firstChild;
   8179    }
   8180
   8181    return node;
   8182  }
   8183  /**
   8184   * Get the next sibling within a container. This will walk up the
   8185   * DOM if a node's siblings have been exhausted.
   8186   *
   8187   * @param {DOMElement|DOMTextNode} node
   8188   * @return {?DOMElement|DOMTextNode}
   8189   */
   8190
   8191
   8192  function getSiblingNode(node) {
   8193    while (node) {
   8194      if (node.nextSibling) {
   8195        return node.nextSibling;
   8196      }
   8197
   8198      node = node.parentNode;
   8199    }
   8200  }
   8201  /**
   8202   * Get object describing the nodes which contain characters at offset.
   8203   *
   8204   * @param {DOMElement|DOMTextNode} root
   8205   * @param {number} offset
   8206   * @return {?object}
   8207   */
   8208
   8209
   8210  function getNodeForCharacterOffset(root, offset) {
   8211    var node = getLeafNode(root);
   8212    var nodeStart = 0;
   8213    var nodeEnd = 0;
   8214
   8215    while (node) {
   8216      if (node.nodeType === TEXT_NODE) {
   8217        nodeEnd = nodeStart + node.textContent.length;
   8218
   8219        if (nodeStart <= offset && nodeEnd >= offset) {
   8220          return {
   8221            node: node,
   8222            offset: offset - nodeStart
   8223          };
   8224        }
   8225
   8226        nodeStart = nodeEnd;
   8227      }
   8228
   8229      node = getLeafNode(getSiblingNode(node));
   8230    }
   8231  }
   8232
   8233  /**
   8234   * @param {DOMElement} outerNode
   8235   * @return {?object}
   8236   */
   8237
   8238  function getOffsets(outerNode) {
   8239    var ownerDocument = outerNode.ownerDocument;
   8240    var win = ownerDocument && ownerDocument.defaultView || window;
   8241    var selection = win.getSelection && win.getSelection();
   8242
   8243    if (!selection || selection.rangeCount === 0) {
   8244      return null;
   8245    }
   8246
   8247    var anchorNode = selection.anchorNode,
   8248        anchorOffset = selection.anchorOffset,
   8249        focusNode = selection.focusNode,
   8250        focusOffset = selection.focusOffset; // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
   8251    // up/down buttons on an <input type="number">. Anonymous divs do not seem to
   8252    // expose properties, triggering a "Permission denied error" if any of its
   8253    // properties are accessed. The only seemingly possible way to avoid erroring
   8254    // is to access a property that typically works for non-anonymous divs and
   8255    // catch any error that may otherwise arise. See
   8256    // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
   8257
   8258    try {
   8259      /* eslint-disable no-unused-expressions */
   8260      anchorNode.nodeType;
   8261      focusNode.nodeType;
   8262      /* eslint-enable no-unused-expressions */
   8263    } catch (e) {
   8264      return null;
   8265    }
   8266
   8267    return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset);
   8268  }
   8269  /**
   8270   * Returns {start, end} where `start` is the character/codepoint index of
   8271   * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
   8272   * `end` is the index of (focusNode, focusOffset).
   8273   *
   8274   * Returns null if you pass in garbage input but we should probably just crash.
   8275   *
   8276   * Exported only for testing.
   8277   */
   8278
   8279  function getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode, focusOffset) {
   8280    var length = 0;
   8281    var start = -1;
   8282    var end = -1;
   8283    var indexWithinAnchor = 0;
   8284    var indexWithinFocus = 0;
   8285    var node = outerNode;
   8286    var parentNode = null;
   8287
   8288    outer: while (true) {
   8289      var next = null;
   8290
   8291      while (true) {
   8292        if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {
   8293          start = length + anchorOffset;
   8294        }
   8295
   8296        if (node === focusNode && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {
   8297          end = length + focusOffset;
   8298        }
   8299
   8300        if (node.nodeType === TEXT_NODE) {
   8301          length += node.nodeValue.length;
   8302        }
   8303
   8304        if ((next = node.firstChild) === null) {
   8305          break;
   8306        } // Moving from `node` to its first child `next`.
   8307
   8308
   8309        parentNode = node;
   8310        node = next;
   8311      }
   8312
   8313      while (true) {
   8314        if (node === outerNode) {
   8315          // If `outerNode` has children, this is always the second time visiting
   8316          // it. If it has no children, this is still the first loop, and the only
   8317          // valid selection is anchorNode and focusNode both equal to this node
   8318          // and both offsets 0, in which case we will have handled above.
   8319          break outer;
   8320        }
   8321
   8322        if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {
   8323          start = length;
   8324        }
   8325
   8326        if (parentNode === focusNode && ++indexWithinFocus === focusOffset) {
   8327          end = length;
   8328        }
   8329
   8330        if ((next = node.nextSibling) !== null) {
   8331          break;
   8332        }
   8333
   8334        node = parentNode;
   8335        parentNode = node.parentNode;
   8336      } // Moving from `node` to its next sibling `next`.
   8337
   8338
   8339      node = next;
   8340    }
   8341
   8342    if (start === -1 || end === -1) {
   8343      // This should never happen. (Would happen if the anchor/focus nodes aren't
   8344      // actually inside the passed-in node.)
   8345      return null;
   8346    }
   8347
   8348    return {
   8349      start: start,
   8350      end: end
   8351    };
   8352  }
   8353  /**
   8354   * In modern non-IE browsers, we can support both forward and backward
   8355   * selections.
   8356   *
   8357   * Note: IE10+ supports the Selection object, but it does not support
   8358   * the `extend` method, which means that even in modern IE, it's not possible
   8359   * to programmatically create a backward selection. Thus, for all IE
   8360   * versions, we use the old IE API to create our selections.
   8361   *
   8362   * @param {DOMElement|DOMTextNode} node
   8363   * @param {object} offsets
   8364   */
   8365
   8366  function setOffsets(node, offsets) {
   8367    var doc = node.ownerDocument || document;
   8368    var win = doc && doc.defaultView || window; // Edge fails with "Object expected" in some scenarios.
   8369    // (For instance: TinyMCE editor used in a list component that supports pasting to add more,
   8370    // fails when pasting 100+ items)
   8371
   8372    if (!win.getSelection) {
   8373      return;
   8374    }
   8375
   8376    var selection = win.getSelection();
   8377    var length = node.textContent.length;
   8378    var start = Math.min(offsets.start, length);
   8379    var end = offsets.end === undefined ? start : Math.min(offsets.end, length); // IE 11 uses modern selection, but doesn't support the extend method.
   8380    // Flip backward selections, so we can set with a single range.
   8381
   8382    if (!selection.extend && start > end) {
   8383      var temp = end;
   8384      end = start;
   8385      start = temp;
   8386    }
   8387
   8388    var startMarker = getNodeForCharacterOffset(node, start);
   8389    var endMarker = getNodeForCharacterOffset(node, end);
   8390
   8391    if (startMarker && endMarker) {
   8392      if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {
   8393        return;
   8394      }
   8395
   8396      var range = doc.createRange();
   8397      range.setStart(startMarker.node, startMarker.offset);
   8398      selection.removeAllRanges();
   8399
   8400      if (start > end) {
   8401        selection.addRange(range);
   8402        selection.extend(endMarker.node, endMarker.offset);
   8403      } else {
   8404        range.setEnd(endMarker.node, endMarker.offset);
   8405        selection.addRange(range);
   8406      }
   8407    }
   8408  }
   8409
   8410  function isTextNode(node) {
   8411    return node && node.nodeType === TEXT_NODE;
   8412  }
   8413
   8414  function containsNode(outerNode, innerNode) {
   8415    if (!outerNode || !innerNode) {
   8416      return false;
   8417    } else if (outerNode === innerNode) {
   8418      return true;
   8419    } else if (isTextNode(outerNode)) {
   8420      return false;
   8421    } else if (isTextNode(innerNode)) {
   8422      return containsNode(outerNode, innerNode.parentNode);
   8423    } else if ('contains' in outerNode) {
   8424      return outerNode.contains(innerNode);
   8425    } else if (outerNode.compareDocumentPosition) {
   8426      return !!(outerNode.compareDocumentPosition(innerNode) & 16);
   8427    } else {
   8428      return false;
   8429    }
   8430  }
   8431
   8432  function isInDocument(node) {
   8433    return node && node.ownerDocument && containsNode(node.ownerDocument.documentElement, node);
   8434  }
   8435
   8436  function isSameOriginFrame(iframe) {
   8437    try {
   8438      // Accessing the contentDocument of a HTMLIframeElement can cause the browser
   8439      // to throw, e.g. if it has a cross-origin src attribute.
   8440      // Safari will show an error in the console when the access results in "Blocked a frame with origin". e.g:
   8441      // iframe.contentDocument.defaultView;
   8442      // A safety way is to access one of the cross origin properties: Window or Location
   8443      // Which might result in "SecurityError" DOM Exception and it is compatible to Safari.
   8444      // https://html.spec.whatwg.org/multipage/browsers.html#integration-with-idl
   8445      return typeof iframe.contentWindow.location.href === 'string';
   8446    } catch (err) {
   8447      return false;
   8448    }
   8449  }
   8450
   8451  function getActiveElementDeep() {
   8452    var win = window;
   8453    var element = getActiveElement();
   8454
   8455    while (element instanceof win.HTMLIFrameElement) {
   8456      if (isSameOriginFrame(element)) {
   8457        win = element.contentWindow;
   8458      } else {
   8459        return element;
   8460      }
   8461
   8462      element = getActiveElement(win.document);
   8463    }
   8464
   8465    return element;
   8466  }
   8467  /**
   8468   * @ReactInputSelection: React input selection module. Based on Selection.js,
   8469   * but modified to be suitable for react and has a couple of bug fixes (doesn't
   8470   * assume buttons have range selections allowed).
   8471   * Input selection module for React.
   8472   */
   8473
   8474  /**
   8475   * @hasSelectionCapabilities: we get the element types that support selection
   8476   * from https://html.spec.whatwg.org/#do-not-apply, looking at `selectionStart`
   8477   * and `selectionEnd` rows.
   8478   */
   8479
   8480
   8481  function hasSelectionCapabilities(elem) {
   8482    var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();
   8483    return nodeName && (nodeName === 'input' && (elem.type === 'text' || elem.type === 'search' || elem.type === 'tel' || elem.type === 'url' || elem.type === 'password') || nodeName === 'textarea' || elem.contentEditable === 'true');
   8484  }
   8485  function getSelectionInformation() {
   8486    var focusedElem = getActiveElementDeep();
   8487    return {
   8488      focusedElem: focusedElem,
   8489      selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection(focusedElem) : null
   8490    };
   8491  }
   8492  /**
   8493   * @restoreSelection: If any selection information was potentially lost,
   8494   * restore it. This is useful when performing operations that could remove dom
   8495   * nodes and place them back in, resulting in focus being lost.
   8496   */
   8497
   8498  function restoreSelection(priorSelectionInformation) {
   8499    var curFocusedElem = getActiveElementDeep();
   8500    var priorFocusedElem = priorSelectionInformation.focusedElem;
   8501    var priorSelectionRange = priorSelectionInformation.selectionRange;
   8502
   8503    if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {
   8504      if (priorSelectionRange !== null && hasSelectionCapabilities(priorFocusedElem)) {
   8505        setSelection(priorFocusedElem, priorSelectionRange);
   8506      } // Focusing a node can change the scroll position, which is undesirable
   8507
   8508
   8509      var ancestors = [];
   8510      var ancestor = priorFocusedElem;
   8511
   8512      while (ancestor = ancestor.parentNode) {
   8513        if (ancestor.nodeType === ELEMENT_NODE) {
   8514          ancestors.push({
   8515            element: ancestor,
   8516            left: ancestor.scrollLeft,
   8517            top: ancestor.scrollTop
   8518          });
   8519        }
   8520      }
   8521
   8522      if (typeof priorFocusedElem.focus === 'function') {
   8523        priorFocusedElem.focus();
   8524      }
   8525
   8526      for (var i = 0; i < ancestors.length; i++) {
   8527        var info = ancestors[i];
   8528        info.element.scrollLeft = info.left;
   8529        info.element.scrollTop = info.top;
   8530      }
   8531    }
   8532  }
   8533  /**
   8534   * @getSelection: Gets the selection bounds of a focused textarea, input or
   8535   * contentEditable node.
   8536   * -@input: Look up selection bounds of this input
   8537   * -@return {start: selectionStart, end: selectionEnd}
   8538   */
   8539
   8540  function getSelection(input) {
   8541    var selection;
   8542
   8543    if ('selectionStart' in input) {
   8544      // Modern browser with input or textarea.
   8545      selection = {
   8546        start: input.selectionStart,
   8547        end: input.selectionEnd
   8548      };
   8549    } else {
   8550      // Content editable or old IE textarea.
   8551      selection = getOffsets(input);
   8552    }
   8553
   8554    return selection || {
   8555      start: 0,
   8556      end: 0
   8557    };
   8558  }
   8559  /**
   8560   * @setSelection: Sets the selection bounds of a textarea or input and focuses
   8561   * the input.
   8562   * -@input     Set selection bounds of this input or textarea
   8563   * -@offsets   Object of same form that is returned from get*
   8564   */
   8565
   8566  function setSelection(input, offsets) {
   8567    var start = offsets.start;
   8568    var end = offsets.end;
   8569
   8570    if (end === undefined) {
   8571      end = start;
   8572    }
   8573
   8574    if ('selectionStart' in input) {
   8575      input.selectionStart = start;
   8576      input.selectionEnd = Math.min(end, input.value.length);
   8577    } else {
   8578      setOffsets(input, offsets);
   8579    }
   8580  }
   8581
   8582  var skipSelectionChangeEvent = canUseDOM && 'documentMode' in document && document.documentMode <= 11;
   8583
   8584  function registerEvents$3() {
   8585    registerTwoPhaseEvent('onSelect', ['focusout', 'contextmenu', 'dragend', 'focusin', 'keydown', 'keyup', 'mousedown', 'mouseup', 'selectionchange']);
   8586  }
   8587
   8588  var activeElement$1 = null;
   8589  var activeElementInst$1 = null;
   8590  var lastSelection = null;
   8591  var mouseDown = false;
   8592  /**
   8593   * Get an object which is a unique representation of the current selection.
   8594   *
   8595   * The return value will not be consistent across nodes or browsers, but
   8596   * two identical selections on the same node will return identical objects.
   8597   */
   8598
   8599  function getSelection$1(node) {
   8600    if ('selectionStart' in node && hasSelectionCapabilities(node)) {
   8601      return {
   8602        start: node.selectionStart,
   8603        end: node.selectionEnd
   8604      };
   8605    } else {
   8606      var win = node.ownerDocument && node.ownerDocument.defaultView || window;
   8607      var selection = win.getSelection();
   8608      return {
   8609        anchorNode: selection.anchorNode,
   8610        anchorOffset: selection.anchorOffset,
   8611        focusNode: selection.focusNode,
   8612        focusOffset: selection.focusOffset
   8613      };
   8614    }
   8615  }
   8616  /**
   8617   * Get document associated with the event target.
   8618   */
   8619
   8620
   8621  function getEventTargetDocument(eventTarget) {
   8622    return eventTarget.window === eventTarget ? eventTarget.document : eventTarget.nodeType === DOCUMENT_NODE ? eventTarget : eventTarget.ownerDocument;
   8623  }
   8624  /**
   8625   * Poll selection to see whether it's changed.
   8626   *
   8627   * @param {object} nativeEvent
   8628   * @param {object} nativeEventTarget
   8629   * @return {?SyntheticEvent}
   8630   */
   8631
   8632
   8633  function constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget) {
   8634    // Ensure we have the right element, and that the user is not dragging a
   8635    // selection (this matches native `select` event behavior). In HTML5, select
   8636    // fires only on input and textarea thus if there's no focused element we
   8637    // won't dispatch.
   8638    var doc = getEventTargetDocument(nativeEventTarget);
   8639
   8640    if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement(doc)) {
   8641      return;
   8642    } // Only fire when selection has actually changed.
   8643
   8644
   8645    var currentSelection = getSelection$1(activeElement$1);
   8646
   8647    if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {
   8648      lastSelection = currentSelection;
   8649      var listeners = accumulateTwoPhaseListeners(activeElementInst$1, 'onSelect');
   8650
   8651      if (listeners.length > 0) {
   8652        var event = new SyntheticEvent('onSelect', 'select', null, nativeEvent, nativeEventTarget);
   8653        dispatchQueue.push({
   8654          event: event,
   8655          listeners: listeners
   8656        });
   8657        event.target = activeElement$1;
   8658      }
   8659    }
   8660  }
   8661  /**
   8662   * This plugin creates an `onSelect` event that normalizes select events
   8663   * across form elements.
   8664   *
   8665   * Supported elements are:
   8666   * - input (see `isTextInputElement`)
   8667   * - textarea
   8668   * - contentEditable
   8669   *
   8670   * This differs from native browser implementations in the following ways:
   8671   * - Fires on contentEditable fields as well as inputs.
   8672   * - Fires for collapsed selection.
   8673   * - Fires after user input.
   8674   */
   8675
   8676
   8677  function extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   8678    var targetNode = targetInst ? getNodeFromInstance(targetInst) : window;
   8679
   8680    switch (domEventName) {
   8681      // Track the input node that has focus.
   8682      case 'focusin':
   8683        if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {
   8684          activeElement$1 = targetNode;
   8685          activeElementInst$1 = targetInst;
   8686          lastSelection = null;
   8687        }
   8688
   8689        break;
   8690
   8691      case 'focusout':
   8692        activeElement$1 = null;
   8693        activeElementInst$1 = null;
   8694        lastSelection = null;
   8695        break;
   8696      // Don't fire the event while the user is dragging. This matches the
   8697      // semantics of the native select event.
   8698
   8699      case 'mousedown':
   8700        mouseDown = true;
   8701        break;
   8702
   8703      case 'contextmenu':
   8704      case 'mouseup':
   8705      case 'dragend':
   8706        mouseDown = false;
   8707        constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
   8708        break;
   8709      // Chrome and IE fire non-standard event when selection is changed (and
   8710      // sometimes when it hasn't). IE's event fires out of order with respect
   8711      // to key and input events on deletion, so we discard it.
   8712      //
   8713      // Firefox doesn't support selectionchange, so check selection status
   8714      // after each key entry. The selection changes after keydown and before
   8715      // keyup, but we check on keydown as well in the case of holding down a
   8716      // key, when multiple keydown events are fired but only one keyup is.
   8717      // This is also our approach for IE handling, for the reason above.
   8718
   8719      case 'selectionchange':
   8720        if (skipSelectionChangeEvent) {
   8721          break;
   8722        }
   8723
   8724      // falls through
   8725
   8726      case 'keydown':
   8727      case 'keyup':
   8728        constructSelectEvent(dispatchQueue, nativeEvent, nativeEventTarget);
   8729    }
   8730  }
   8731
   8732  /**
   8733   * Generate a mapping of standard vendor prefixes using the defined style property and event name.
   8734   *
   8735   * @param {string} styleProp
   8736   * @param {string} eventName
   8737   * @returns {object}
   8738   */
   8739
   8740  function makePrefixMap(styleProp, eventName) {
   8741    var prefixes = {};
   8742    prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
   8743    prefixes['Webkit' + styleProp] = 'webkit' + eventName;
   8744    prefixes['Moz' + styleProp] = 'moz' + eventName;
   8745    return prefixes;
   8746  }
   8747  /**
   8748   * A list of event names to a configurable list of vendor prefixes.
   8749   */
   8750
   8751
   8752  var vendorPrefixes = {
   8753    animationend: makePrefixMap('Animation', 'AnimationEnd'),
   8754    animationiteration: makePrefixMap('Animation', 'AnimationIteration'),
   8755    animationstart: makePrefixMap('Animation', 'AnimationStart'),
   8756    transitionend: makePrefixMap('Transition', 'TransitionEnd')
   8757  };
   8758  /**
   8759   * Event names that have already been detected and prefixed (if applicable).
   8760   */
   8761
   8762  var prefixedEventNames = {};
   8763  /**
   8764   * Element to check for prefixes on.
   8765   */
   8766
   8767  var style = {};
   8768  /**
   8769   * Bootstrap if a DOM exists.
   8770   */
   8771
   8772  if (canUseDOM) {
   8773    style = document.createElement('div').style; // On some platforms, in particular some releases of Android 4.x,
   8774    // the un-prefixed "animation" and "transition" properties are defined on the
   8775    // style object but the events that fire will still be prefixed, so we need
   8776    // to check if the un-prefixed events are usable, and if not remove them from the map.
   8777
   8778    if (!('AnimationEvent' in window)) {
   8779      delete vendorPrefixes.animationend.animation;
   8780      delete vendorPrefixes.animationiteration.animation;
   8781      delete vendorPrefixes.animationstart.animation;
   8782    } // Same as above
   8783
   8784
   8785    if (!('TransitionEvent' in window)) {
   8786      delete vendorPrefixes.transitionend.transition;
   8787    }
   8788  }
   8789  /**
   8790   * Attempts to determine the correct vendor prefixed event name.
   8791   *
   8792   * @param {string} eventName
   8793   * @returns {string}
   8794   */
   8795
   8796
   8797  function getVendorPrefixedEventName(eventName) {
   8798    if (prefixedEventNames[eventName]) {
   8799      return prefixedEventNames[eventName];
   8800    } else if (!vendorPrefixes[eventName]) {
   8801      return eventName;
   8802    }
   8803
   8804    var prefixMap = vendorPrefixes[eventName];
   8805
   8806    for (var styleProp in prefixMap) {
   8807      if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
   8808        return prefixedEventNames[eventName] = prefixMap[styleProp];
   8809      }
   8810    }
   8811
   8812    return eventName;
   8813  }
   8814
   8815  var ANIMATION_END = getVendorPrefixedEventName('animationend');
   8816  var ANIMATION_ITERATION = getVendorPrefixedEventName('animationiteration');
   8817  var ANIMATION_START = getVendorPrefixedEventName('animationstart');
   8818  var TRANSITION_END = getVendorPrefixedEventName('transitionend');
   8819
   8820  var topLevelEventsToReactNames = new Map(); // NOTE: Capitalization is important in this list!
   8821  //
   8822  // E.g. it needs "pointerDown", not "pointerdown".
   8823  // This is because we derive both React name ("onPointerDown")
   8824  // and DOM name ("pointerdown") from the same list.
   8825  //
   8826  // Exceptions that don't match this convention are listed separately.
   8827  //
   8828  // prettier-ignore
   8829
   8830  var simpleEventPluginEvents = ['abort', 'auxClick', 'cancel', 'canPlay', 'canPlayThrough', 'click', 'close', 'contextMenu', 'copy', 'cut', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'gotPointerCapture', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'lostPointerCapture', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'pointerCancel', 'pointerDown', 'pointerMove', 'pointerOut', 'pointerOver', 'pointerUp', 'progress', 'rateChange', 'reset', 'resize', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'touchCancel', 'touchEnd', 'touchStart', 'volumeChange', 'scroll', 'toggle', 'touchMove', 'waiting', 'wheel'];
   8831
   8832  function registerSimpleEvent(domEventName, reactName) {
   8833    topLevelEventsToReactNames.set(domEventName, reactName);
   8834    registerTwoPhaseEvent(reactName, [domEventName]);
   8835  }
   8836
   8837  function registerSimpleEvents() {
   8838    for (var i = 0; i < simpleEventPluginEvents.length; i++) {
   8839      var eventName = simpleEventPluginEvents[i];
   8840      var domEventName = eventName.toLowerCase();
   8841      var capitalizedEvent = eventName[0].toUpperCase() + eventName.slice(1);
   8842      registerSimpleEvent(domEventName, 'on' + capitalizedEvent);
   8843    } // Special cases where event names don't match.
   8844
   8845
   8846    registerSimpleEvent(ANIMATION_END, 'onAnimationEnd');
   8847    registerSimpleEvent(ANIMATION_ITERATION, 'onAnimationIteration');
   8848    registerSimpleEvent(ANIMATION_START, 'onAnimationStart');
   8849    registerSimpleEvent('dblclick', 'onDoubleClick');
   8850    registerSimpleEvent('focusin', 'onFocus');
   8851    registerSimpleEvent('focusout', 'onBlur');
   8852    registerSimpleEvent(TRANSITION_END, 'onTransitionEnd');
   8853  }
   8854
   8855  function extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   8856    var reactName = topLevelEventsToReactNames.get(domEventName);
   8857
   8858    if (reactName === undefined) {
   8859      return;
   8860    }
   8861
   8862    var SyntheticEventCtor = SyntheticEvent;
   8863    var reactEventType = domEventName;
   8864
   8865    switch (domEventName) {
   8866      case 'keypress':
   8867        // Firefox creates a keypress event for function keys too. This removes
   8868        // the unwanted keypress events. Enter is however both printable and
   8869        // non-printable. One would expect Tab to be as well (but it isn't).
   8870        if (getEventCharCode(nativeEvent) === 0) {
   8871          return;
   8872        }
   8873
   8874      /* falls through */
   8875
   8876      case 'keydown':
   8877      case 'keyup':
   8878        SyntheticEventCtor = SyntheticKeyboardEvent;
   8879        break;
   8880
   8881      case 'focusin':
   8882        reactEventType = 'focus';
   8883        SyntheticEventCtor = SyntheticFocusEvent;
   8884        break;
   8885
   8886      case 'focusout':
   8887        reactEventType = 'blur';
   8888        SyntheticEventCtor = SyntheticFocusEvent;
   8889        break;
   8890
   8891      case 'beforeblur':
   8892      case 'afterblur':
   8893        SyntheticEventCtor = SyntheticFocusEvent;
   8894        break;
   8895
   8896      case 'click':
   8897        // Firefox creates a click event on right mouse clicks. This removes the
   8898        // unwanted click events.
   8899        if (nativeEvent.button === 2) {
   8900          return;
   8901        }
   8902
   8903      /* falls through */
   8904
   8905      case 'auxclick':
   8906      case 'dblclick':
   8907      case 'mousedown':
   8908      case 'mousemove':
   8909      case 'mouseup': // TODO: Disabled elements should not respond to mouse events
   8910
   8911      /* falls through */
   8912
   8913      case 'mouseout':
   8914      case 'mouseover':
   8915      case 'contextmenu':
   8916        SyntheticEventCtor = SyntheticMouseEvent;
   8917        break;
   8918
   8919      case 'drag':
   8920      case 'dragend':
   8921      case 'dragenter':
   8922      case 'dragexit':
   8923      case 'dragleave':
   8924      case 'dragover':
   8925      case 'dragstart':
   8926      case 'drop':
   8927        SyntheticEventCtor = SyntheticDragEvent;
   8928        break;
   8929
   8930      case 'touchcancel':
   8931      case 'touchend':
   8932      case 'touchmove':
   8933      case 'touchstart':
   8934        SyntheticEventCtor = SyntheticTouchEvent;
   8935        break;
   8936
   8937      case ANIMATION_END:
   8938      case ANIMATION_ITERATION:
   8939      case ANIMATION_START:
   8940        SyntheticEventCtor = SyntheticAnimationEvent;
   8941        break;
   8942
   8943      case TRANSITION_END:
   8944        SyntheticEventCtor = SyntheticTransitionEvent;
   8945        break;
   8946
   8947      case 'scroll':
   8948        SyntheticEventCtor = SyntheticUIEvent;
   8949        break;
   8950
   8951      case 'wheel':
   8952        SyntheticEventCtor = SyntheticWheelEvent;
   8953        break;
   8954
   8955      case 'copy':
   8956      case 'cut':
   8957      case 'paste':
   8958        SyntheticEventCtor = SyntheticClipboardEvent;
   8959        break;
   8960
   8961      case 'gotpointercapture':
   8962      case 'lostpointercapture':
   8963      case 'pointercancel':
   8964      case 'pointerdown':
   8965      case 'pointermove':
   8966      case 'pointerout':
   8967      case 'pointerover':
   8968      case 'pointerup':
   8969        SyntheticEventCtor = SyntheticPointerEvent;
   8970        break;
   8971    }
   8972
   8973    var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
   8974
   8975    {
   8976      // Some events don't bubble in the browser.
   8977      // In the past, React has always bubbled them, but this can be surprising.
   8978      // We're going to try aligning closer to the browser behavior by not bubbling
   8979      // them in React either. We'll start by not bubbling onScroll, and then expand.
   8980      var accumulateTargetOnly = !inCapturePhase && // TODO: ideally, we'd eventually add all events from
   8981      // nonDelegatedEvents list in DOMPluginEventSystem.
   8982      // Then we can remove this special list.
   8983      // This is a breaking change that can wait until React 18.
   8984      domEventName === 'scroll';
   8985
   8986      var _listeners = accumulateSinglePhaseListeners(targetInst, reactName, nativeEvent.type, inCapturePhase, accumulateTargetOnly);
   8987
   8988      if (_listeners.length > 0) {
   8989        // Intentionally create event lazily.
   8990        var _event = new SyntheticEventCtor(reactName, reactEventType, null, nativeEvent, nativeEventTarget);
   8991
   8992        dispatchQueue.push({
   8993          event: _event,
   8994          listeners: _listeners
   8995        });
   8996      }
   8997    }
   8998  }
   8999
   9000  // TODO: remove top-level side effect.
   9001  registerSimpleEvents();
   9002  registerEvents$2();
   9003  registerEvents$1();
   9004  registerEvents$3();
   9005  registerEvents();
   9006
   9007  function extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags, targetContainer) {
   9008    // TODO: we should remove the concept of a "SimpleEventPlugin".
   9009    // This is the basic functionality of the event system. All
   9010    // the other plugins are essentially polyfills. So the plugin
   9011    // should probably be inlined somewhere and have its logic
   9012    // be core the to event system. This would potentially allow
   9013    // us to ship builds of React without the polyfilled plugins below.
   9014    extractEvents$4(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
   9015    var shouldProcessPolyfillPlugins = (eventSystemFlags & SHOULD_NOT_PROCESS_POLYFILL_EVENT_PLUGINS) === 0; // We don't process these events unless we are in the
   9016    // event's native "bubble" phase, which means that we're
   9017    // not in the capture phase. That's because we emulate
   9018    // the capture phase here still. This is a trade-off,
   9019    // because in an ideal world we would not emulate and use
   9020    // the phases properly, like we do with the SimpleEvent
   9021    // plugin. However, the plugins below either expect
   9022    // emulation (EnterLeave) or use state localized to that
   9023    // plugin (BeforeInput, Change, Select). The state in
   9024    // these modules complicates things, as you'll essentially
   9025    // get the case where the capture phase event might change
   9026    // state, only for the following bubble event to come in
   9027    // later and not trigger anything as the state now
   9028    // invalidates the heuristics of the event plugin. We
   9029    // could alter all these plugins to work in such ways, but
   9030    // that might cause other unknown side-effects that we
   9031    // can't foresee right now.
   9032
   9033    if (shouldProcessPolyfillPlugins) {
   9034      extractEvents$2(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   9035      extractEvents$1(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   9036      extractEvents$3(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   9037      extractEvents(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget);
   9038    }
   9039  } // List of events that need to be individually attached to media elements.
   9040
   9041
   9042  var mediaEventTypes = ['abort', 'canplay', 'canplaythrough', 'durationchange', 'emptied', 'encrypted', 'ended', 'error', 'loadeddata', 'loadedmetadata', 'loadstart', 'pause', 'play', 'playing', 'progress', 'ratechange', 'resize', 'seeked', 'seeking', 'stalled', 'suspend', 'timeupdate', 'volumechange', 'waiting']; // We should not delegate these events to the container, but rather
   9043  // set them on the actual target element itself. This is primarily
   9044  // because these events do not consistently bubble in the DOM.
   9045
   9046  var nonDelegatedEvents = new Set(['cancel', 'close', 'invalid', 'load', 'scroll', 'toggle'].concat(mediaEventTypes));
   9047
   9048  function executeDispatch(event, listener, currentTarget) {
   9049    var type = event.type || 'unknown-event';
   9050    event.currentTarget = currentTarget;
   9051    invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);
   9052    event.currentTarget = null;
   9053  }
   9054
   9055  function processDispatchQueueItemsInOrder(event, dispatchListeners, inCapturePhase) {
   9056    var previousInstance;
   9057
   9058    if (inCapturePhase) {
   9059      for (var i = dispatchListeners.length - 1; i >= 0; i--) {
   9060        var _dispatchListeners$i = dispatchListeners[i],
   9061            instance = _dispatchListeners$i.instance,
   9062            currentTarget = _dispatchListeners$i.currentTarget,
   9063            listener = _dispatchListeners$i.listener;
   9064
   9065        if (instance !== previousInstance && event.isPropagationStopped()) {
   9066          return;
   9067        }
   9068
   9069        executeDispatch(event, listener, currentTarget);
   9070        previousInstance = instance;
   9071      }
   9072    } else {
   9073      for (var _i = 0; _i < dispatchListeners.length; _i++) {
   9074        var _dispatchListeners$_i = dispatchListeners[_i],
   9075            _instance = _dispatchListeners$_i.instance,
   9076            _currentTarget = _dispatchListeners$_i.currentTarget,
   9077            _listener = _dispatchListeners$_i.listener;
   9078
   9079        if (_instance !== previousInstance && event.isPropagationStopped()) {
   9080          return;
   9081        }
   9082
   9083        executeDispatch(event, _listener, _currentTarget);
   9084        previousInstance = _instance;
   9085      }
   9086    }
   9087  }
   9088
   9089  function processDispatchQueue(dispatchQueue, eventSystemFlags) {
   9090    var inCapturePhase = (eventSystemFlags & IS_CAPTURE_PHASE) !== 0;
   9091
   9092    for (var i = 0; i < dispatchQueue.length; i++) {
   9093      var _dispatchQueue$i = dispatchQueue[i],
   9094          event = _dispatchQueue$i.event,
   9095          listeners = _dispatchQueue$i.listeners;
   9096      processDispatchQueueItemsInOrder(event, listeners, inCapturePhase); //  event system doesn't use pooling.
   9097    } // This would be a good time to rethrow if any of the event handlers threw.
   9098
   9099
   9100    rethrowCaughtError();
   9101  }
   9102
   9103  function dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
   9104    var nativeEventTarget = getEventTarget(nativeEvent);
   9105    var dispatchQueue = [];
   9106    extractEvents$5(dispatchQueue, domEventName, targetInst, nativeEvent, nativeEventTarget, eventSystemFlags);
   9107    processDispatchQueue(dispatchQueue, eventSystemFlags);
   9108  }
   9109
   9110  function listenToNonDelegatedEvent(domEventName, targetElement) {
   9111    {
   9112      if (!nonDelegatedEvents.has(domEventName)) {
   9113        error('Did not expect a listenToNonDelegatedEvent() call for "%s". ' + 'This is a bug in React. Please file an issue.', domEventName);
   9114      }
   9115    }
   9116
   9117    var isCapturePhaseListener = false;
   9118    var listenerSet = getEventListenerSet(targetElement);
   9119    var listenerSetKey = getListenerSetKey(domEventName, isCapturePhaseListener);
   9120
   9121    if (!listenerSet.has(listenerSetKey)) {
   9122      addTrappedEventListener(targetElement, domEventName, IS_NON_DELEGATED, isCapturePhaseListener);
   9123      listenerSet.add(listenerSetKey);
   9124    }
   9125  }
   9126  function listenToNativeEvent(domEventName, isCapturePhaseListener, target) {
   9127    {
   9128      if (nonDelegatedEvents.has(domEventName) && !isCapturePhaseListener) {
   9129        error('Did not expect a listenToNativeEvent() call for "%s" in the bubble phase. ' + 'This is a bug in React. Please file an issue.', domEventName);
   9130      }
   9131    }
   9132
   9133    var eventSystemFlags = 0;
   9134
   9135    if (isCapturePhaseListener) {
   9136      eventSystemFlags |= IS_CAPTURE_PHASE;
   9137    }
   9138
   9139    addTrappedEventListener(target, domEventName, eventSystemFlags, isCapturePhaseListener);
   9140  } // This is only used by createEventHandle when the
   9141  var listeningMarker = '_reactListening' + Math.random().toString(36).slice(2);
   9142  function listenToAllSupportedEvents(rootContainerElement) {
   9143    if (!rootContainerElement[listeningMarker]) {
   9144      rootContainerElement[listeningMarker] = true;
   9145      allNativeEvents.forEach(function (domEventName) {
   9146        // We handle selectionchange separately because it
   9147        // doesn't bubble and needs to be on the document.
   9148        if (domEventName !== 'selectionchange') {
   9149          if (!nonDelegatedEvents.has(domEventName)) {
   9150            listenToNativeEvent(domEventName, false, rootContainerElement);
   9151          }
   9152
   9153          listenToNativeEvent(domEventName, true, rootContainerElement);
   9154        }
   9155      });
   9156      var ownerDocument = rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
   9157
   9158      if (ownerDocument !== null) {
   9159        // The selectionchange event also needs deduplication
   9160        // but it is attached to the document.
   9161        if (!ownerDocument[listeningMarker]) {
   9162          ownerDocument[listeningMarker] = true;
   9163          listenToNativeEvent('selectionchange', false, ownerDocument);
   9164        }
   9165      }
   9166    }
   9167  }
   9168
   9169  function addTrappedEventListener(targetContainer, domEventName, eventSystemFlags, isCapturePhaseListener, isDeferredListenerForLegacyFBSupport) {
   9170    var listener = createEventListenerWrapperWithPriority(targetContainer, domEventName, eventSystemFlags); // If passive option is not supported, then the event will be
   9171    // active and not passive.
   9172
   9173    var isPassiveListener = undefined;
   9174
   9175    if (passiveBrowserEventsSupported) {
   9176      // Browsers introduced an intervention, making these events
   9177      // passive by default on document. React doesn't bind them
   9178      // to document anymore, but changing this now would undo
   9179      // the performance wins from the change. So we emulate
   9180      // the existing behavior manually on the roots now.
   9181      // https://github.com/facebook/react/issues/19651
   9182      if (domEventName === 'touchstart' || domEventName === 'touchmove' || domEventName === 'wheel') {
   9183        isPassiveListener = true;
   9184      }
   9185    }
   9186
   9187    targetContainer =  targetContainer;
   9188    var unsubscribeListener; // When legacyFBSupport is enabled, it's for when we
   9189
   9190
   9191    if (isCapturePhaseListener) {
   9192      if (isPassiveListener !== undefined) {
   9193        unsubscribeListener = addEventCaptureListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
   9194      } else {
   9195        unsubscribeListener = addEventCaptureListener(targetContainer, domEventName, listener);
   9196      }
   9197    } else {
   9198      if (isPassiveListener !== undefined) {
   9199        unsubscribeListener = addEventBubbleListenerWithPassiveFlag(targetContainer, domEventName, listener, isPassiveListener);
   9200      } else {
   9201        unsubscribeListener = addEventBubbleListener(targetContainer, domEventName, listener);
   9202      }
   9203    }
   9204  }
   9205
   9206  function isMatchingRootContainer(grandContainer, targetContainer) {
   9207    return grandContainer === targetContainer || grandContainer.nodeType === COMMENT_NODE && grandContainer.parentNode === targetContainer;
   9208  }
   9209
   9210  function dispatchEventForPluginEventSystem(domEventName, eventSystemFlags, nativeEvent, targetInst, targetContainer) {
   9211    var ancestorInst = targetInst;
   9212
   9213    if ((eventSystemFlags & IS_EVENT_HANDLE_NON_MANAGED_NODE) === 0 && (eventSystemFlags & IS_NON_DELEGATED) === 0) {
   9214      var targetContainerNode = targetContainer; // If we are using the legacy FB support flag, we
   9215
   9216      if (targetInst !== null) {
   9217        // The below logic attempts to work out if we need to change
   9218        // the target fiber to a different ancestor. We had similar logic
   9219        // in the legacy event system, except the big difference between
   9220        // systems is that the modern event system now has an event listener
   9221        // attached to each React Root and React Portal Root. Together,
   9222        // the DOM nodes representing these roots are the "rootContainer".
   9223        // To figure out which ancestor instance we should use, we traverse
   9224        // up the fiber tree from the target instance and attempt to find
   9225        // root boundaries that match that of our current "rootContainer".
   9226        // If we find that "rootContainer", we find the parent fiber
   9227        // sub-tree for that root and make that our ancestor instance.
   9228        var node = targetInst;
   9229
   9230        mainLoop: while (true) {
   9231          if (node === null) {
   9232            return;
   9233          }
   9234
   9235          var nodeTag = node.tag;
   9236
   9237          if (nodeTag === HostRoot || nodeTag === HostPortal) {
   9238            var container = node.stateNode.containerInfo;
   9239
   9240            if (isMatchingRootContainer(container, targetContainerNode)) {
   9241              break;
   9242            }
   9243
   9244            if (nodeTag === HostPortal) {
   9245              // The target is a portal, but it's not the rootContainer we're looking for.
   9246              // Normally portals handle their own events all the way down to the root.
   9247              // So we should be able to stop now. However, we don't know if this portal
   9248              // was part of *our* root.
   9249              var grandNode = node.return;
   9250
   9251              while (grandNode !== null) {
   9252                var grandTag = grandNode.tag;
   9253
   9254                if (grandTag === HostRoot || grandTag === HostPortal) {
   9255                  var grandContainer = grandNode.stateNode.containerInfo;
   9256
   9257                  if (isMatchingRootContainer(grandContainer, targetContainerNode)) {
   9258                    // This is the rootContainer we're looking for and we found it as
   9259                    // a parent of the Portal. That means we can ignore it because the
   9260                    // Portal will bubble through to us.
   9261                    return;
   9262                  }
   9263                }
   9264
   9265                grandNode = grandNode.return;
   9266              }
   9267            } // Now we need to find it's corresponding host fiber in the other
   9268            // tree. To do this we can use getClosestInstanceFromNode, but we
   9269            // need to validate that the fiber is a host instance, otherwise
   9270            // we need to traverse up through the DOM till we find the correct
   9271            // node that is from the other tree.
   9272
   9273
   9274            while (container !== null) {
   9275              var parentNode = getClosestInstanceFromNode(container);
   9276
   9277              if (parentNode === null) {
   9278                return;
   9279              }
   9280
   9281              var parentTag = parentNode.tag;
   9282
   9283              if (parentTag === HostComponent || parentTag === HostText) {
   9284                node = ancestorInst = parentNode;
   9285                continue mainLoop;
   9286              }
   9287
   9288              container = container.parentNode;
   9289            }
   9290          }
   9291
   9292          node = node.return;
   9293        }
   9294      }
   9295    }
   9296
   9297    batchedUpdates(function () {
   9298      return dispatchEventsForPlugins(domEventName, eventSystemFlags, nativeEvent, ancestorInst);
   9299    });
   9300  }
   9301
   9302  function createDispatchListener(instance, listener, currentTarget) {
   9303    return {
   9304      instance: instance,
   9305      listener: listener,
   9306      currentTarget: currentTarget
   9307    };
   9308  }
   9309
   9310  function accumulateSinglePhaseListeners(targetFiber, reactName, nativeEventType, inCapturePhase, accumulateTargetOnly, nativeEvent) {
   9311    var captureName = reactName !== null ? reactName + 'Capture' : null;
   9312    var reactEventName = inCapturePhase ? captureName : reactName;
   9313    var listeners = [];
   9314    var instance = targetFiber;
   9315    var lastHostComponent = null; // Accumulate all instances and listeners via the target -> root path.
   9316
   9317    while (instance !== null) {
   9318      var _instance2 = instance,
   9319          stateNode = _instance2.stateNode,
   9320          tag = _instance2.tag; // Handle listeners that are on HostComponents (i.e. <div>)
   9321
   9322      if (tag === HostComponent && stateNode !== null) {
   9323        lastHostComponent = stateNode; // createEventHandle listeners
   9324
   9325
   9326        if (reactEventName !== null) {
   9327          var listener = getListener(instance, reactEventName);
   9328
   9329          if (listener != null) {
   9330            listeners.push(createDispatchListener(instance, listener, lastHostComponent));
   9331          }
   9332        }
   9333      } // If we are only accumulating events for the target, then we don't
   9334      // continue to propagate through the React fiber tree to find other
   9335      // listeners.
   9336
   9337
   9338      if (accumulateTargetOnly) {
   9339        break;
   9340      } // If we are processing the onBeforeBlur event, then we need to take
   9341
   9342      instance = instance.return;
   9343    }
   9344
   9345    return listeners;
   9346  } // We should only use this function for:
   9347  // - BeforeInputEventPlugin
   9348  // - ChangeEventPlugin
   9349  // - SelectEventPlugin
   9350  // This is because we only process these plugins
   9351  // in the bubble phase, so we need to accumulate two
   9352  // phase event listeners (via emulation).
   9353
   9354  function accumulateTwoPhaseListeners(targetFiber, reactName) {
   9355    var captureName = reactName + 'Capture';
   9356    var listeners = [];
   9357    var instance = targetFiber; // Accumulate all instances and listeners via the target -> root path.
   9358
   9359    while (instance !== null) {
   9360      var _instance3 = instance,
   9361          stateNode = _instance3.stateNode,
   9362          tag = _instance3.tag; // Handle listeners that are on HostComponents (i.e. <div>)
   9363
   9364      if (tag === HostComponent && stateNode !== null) {
   9365        var currentTarget = stateNode;
   9366        var captureListener = getListener(instance, captureName);
   9367
   9368        if (captureListener != null) {
   9369          listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
   9370        }
   9371
   9372        var bubbleListener = getListener(instance, reactName);
   9373
   9374        if (bubbleListener != null) {
   9375          listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
   9376        }
   9377      }
   9378
   9379      instance = instance.return;
   9380    }
   9381
   9382    return listeners;
   9383  }
   9384
   9385  function getParent(inst) {
   9386    if (inst === null) {
   9387      return null;
   9388    }
   9389
   9390    do {
   9391      inst = inst.return; // TODO: If this is a HostRoot we might want to bail out.
   9392      // That is depending on if we want nested subtrees (layers) to bubble
   9393      // events to their parent. We could also go through parentNode on the
   9394      // host node but that wouldn't work for React Native and doesn't let us
   9395      // do the portal feature.
   9396    } while (inst && inst.tag !== HostComponent);
   9397
   9398    if (inst) {
   9399      return inst;
   9400    }
   9401
   9402    return null;
   9403  }
   9404  /**
   9405   * Return the lowest common ancestor of A and B, or null if they are in
   9406   * different trees.
   9407   */
   9408
   9409
   9410  function getLowestCommonAncestor(instA, instB) {
   9411    var nodeA = instA;
   9412    var nodeB = instB;
   9413    var depthA = 0;
   9414
   9415    for (var tempA = nodeA; tempA; tempA = getParent(tempA)) {
   9416      depthA++;
   9417    }
   9418
   9419    var depthB = 0;
   9420
   9421    for (var tempB = nodeB; tempB; tempB = getParent(tempB)) {
   9422      depthB++;
   9423    } // If A is deeper, crawl up.
   9424
   9425
   9426    while (depthA - depthB > 0) {
   9427      nodeA = getParent(nodeA);
   9428      depthA--;
   9429    } // If B is deeper, crawl up.
   9430
   9431
   9432    while (depthB - depthA > 0) {
   9433      nodeB = getParent(nodeB);
   9434      depthB--;
   9435    } // Walk in lockstep until we find a match.
   9436
   9437
   9438    var depth = depthA;
   9439
   9440    while (depth--) {
   9441      if (nodeA === nodeB || nodeB !== null && nodeA === nodeB.alternate) {
   9442        return nodeA;
   9443      }
   9444
   9445      nodeA = getParent(nodeA);
   9446      nodeB = getParent(nodeB);
   9447    }
   9448
   9449    return null;
   9450  }
   9451
   9452  function accumulateEnterLeaveListenersForEvent(dispatchQueue, event, target, common, inCapturePhase) {
   9453    var registrationName = event._reactName;
   9454    var listeners = [];
   9455    var instance = target;
   9456
   9457    while (instance !== null) {
   9458      if (instance === common) {
   9459        break;
   9460      }
   9461
   9462      var _instance4 = instance,
   9463          alternate = _instance4.alternate,
   9464          stateNode = _instance4.stateNode,
   9465          tag = _instance4.tag;
   9466
   9467      if (alternate !== null && alternate === common) {
   9468        break;
   9469      }
   9470
   9471      if (tag === HostComponent && stateNode !== null) {
   9472        var currentTarget = stateNode;
   9473
   9474        if (inCapturePhase) {
   9475          var captureListener = getListener(instance, registrationName);
   9476
   9477          if (captureListener != null) {
   9478            listeners.unshift(createDispatchListener(instance, captureListener, currentTarget));
   9479          }
   9480        } else if (!inCapturePhase) {
   9481          var bubbleListener = getListener(instance, registrationName);
   9482
   9483          if (bubbleListener != null) {
   9484            listeners.push(createDispatchListener(instance, bubbleListener, currentTarget));
   9485          }
   9486        }
   9487      }
   9488
   9489      instance = instance.return;
   9490    }
   9491
   9492    if (listeners.length !== 0) {
   9493      dispatchQueue.push({
   9494        event: event,
   9495        listeners: listeners
   9496      });
   9497    }
   9498  } // We should only use this function for:
   9499  // - EnterLeaveEventPlugin
   9500  // This is because we only process this plugin
   9501  // in the bubble phase, so we need to accumulate two
   9502  // phase event listeners.
   9503
   9504
   9505  function accumulateEnterLeaveTwoPhaseListeners(dispatchQueue, leaveEvent, enterEvent, from, to) {
   9506    var common = from && to ? getLowestCommonAncestor(from, to) : null;
   9507
   9508    if (from !== null) {
   9509      accumulateEnterLeaveListenersForEvent(dispatchQueue, leaveEvent, from, common, false);
   9510    }
   9511
   9512    if (to !== null && enterEvent !== null) {
   9513      accumulateEnterLeaveListenersForEvent(dispatchQueue, enterEvent, to, common, true);
   9514    }
   9515  }
   9516  function getListenerSetKey(domEventName, capture) {
   9517    return domEventName + "__" + (capture ? 'capture' : 'bubble');
   9518  }
   9519
   9520  var didWarnInvalidHydration = false;
   9521  var DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';
   9522  var SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';
   9523  var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';
   9524  var AUTOFOCUS = 'autoFocus';
   9525  var CHILDREN = 'children';
   9526  var STYLE = 'style';
   9527  var HTML$1 = '__html';
   9528  var warnedUnknownTags;
   9529  var validatePropertiesInDevelopment;
   9530  var warnForPropDifference;
   9531  var warnForExtraAttributes;
   9532  var warnForInvalidEventListener;
   9533  var canDiffStyleForHydrationWarning;
   9534  var normalizeHTML;
   9535
   9536  {
   9537    warnedUnknownTags = {
   9538      // There are working polyfills for <dialog>. Let people use it.
   9539      dialog: true,
   9540      // Electron ships a custom <webview> tag to display external web content in
   9541      // an isolated frame and process.
   9542      // This tag is not present in non Electron environments such as JSDom which
   9543      // is often used for testing purposes.
   9544      // @see https://electronjs.org/docs/api/webview-tag
   9545      webview: true
   9546    };
   9547
   9548    validatePropertiesInDevelopment = function (type, props) {
   9549      validateProperties(type, props);
   9550      validateProperties$1(type, props);
   9551      validateProperties$2(type, props, {
   9552        registrationNameDependencies: registrationNameDependencies,
   9553        possibleRegistrationNames: possibleRegistrationNames
   9554      });
   9555    }; // IE 11 parses & normalizes the style attribute as opposed to other
   9556    // browsers. It adds spaces and sorts the properties in some
   9557    // non-alphabetical order. Handling that would require sorting CSS
   9558    // properties in the client & server versions or applying
   9559    // `expectedStyle` to a temporary DOM node to read its `style` attribute
   9560    // normalized. Since it only affects IE, we're skipping style warnings
   9561    // in that browser completely in favor of doing all that work.
   9562    // See https://github.com/facebook/react/issues/11807
   9563
   9564
   9565    canDiffStyleForHydrationWarning = canUseDOM && !document.documentMode;
   9566
   9567    warnForPropDifference = function (propName, serverValue, clientValue) {
   9568      if (didWarnInvalidHydration) {
   9569        return;
   9570      }
   9571
   9572      var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);
   9573      var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);
   9574
   9575      if (normalizedServerValue === normalizedClientValue) {
   9576        return;
   9577      }
   9578
   9579      didWarnInvalidHydration = true;
   9580
   9581      error('Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));
   9582    };
   9583
   9584    warnForExtraAttributes = function (attributeNames) {
   9585      if (didWarnInvalidHydration) {
   9586        return;
   9587      }
   9588
   9589      didWarnInvalidHydration = true;
   9590      var names = [];
   9591      attributeNames.forEach(function (name) {
   9592        names.push(name);
   9593      });
   9594
   9595      error('Extra attributes from the server: %s', names);
   9596    };
   9597
   9598    warnForInvalidEventListener = function (registrationName, listener) {
   9599      if (listener === false) {
   9600        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);
   9601      } else {
   9602        error('Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener);
   9603      }
   9604    }; // Parse the HTML and read it back to normalize the HTML string so that it
   9605    // can be used for comparison.
   9606
   9607
   9608    normalizeHTML = function (parent, html) {
   9609      // We could have created a separate document here to avoid
   9610      // re-initializing custom elements if they exist. But this breaks
   9611      // how <noscript> is being handled. So we use the same document.
   9612      // See the discussion in https://github.com/facebook/react/pull/11157.
   9613      var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);
   9614      testElement.innerHTML = html;
   9615      return testElement.innerHTML;
   9616    };
   9617  } // HTML parsing normalizes CR and CRLF to LF.
   9618  // It also can turn \u0000 into \uFFFD inside attributes.
   9619  // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
   9620  // If we have a mismatch, it might be caused by that.
   9621  // We will still patch up in this case but not fire the warning.
   9622
   9623
   9624  var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
   9625  var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
   9626
   9627  function normalizeMarkupForTextOrAttribute(markup) {
   9628    {
   9629      checkHtmlStringCoercion(markup);
   9630    }
   9631
   9632    var markupString = typeof markup === 'string' ? markup : '' + markup;
   9633    return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');
   9634  }
   9635
   9636  function checkForUnmatchedText(serverText, clientText, isConcurrentMode, shouldWarnDev) {
   9637    var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);
   9638    var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);
   9639
   9640    if (normalizedServerText === normalizedClientText) {
   9641      return;
   9642    }
   9643
   9644    if (shouldWarnDev) {
   9645      {
   9646        if (!didWarnInvalidHydration) {
   9647          didWarnInvalidHydration = true;
   9648
   9649          error('Text content did not match. Server: "%s" Client: "%s"', normalizedServerText, normalizedClientText);
   9650        }
   9651      }
   9652    }
   9653
   9654    if (isConcurrentMode && enableClientRenderFallbackOnTextMismatch) {
   9655      // In concurrent roots, we throw when there's a text mismatch and revert to
   9656      // client rendering, up to the nearest Suspense boundary.
   9657      throw new Error('Text content does not match server-rendered HTML.');
   9658    }
   9659  }
   9660
   9661  function getOwnerDocumentFromRootContainer(rootContainerElement) {
   9662    return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;
   9663  }
   9664
   9665  function noop() {}
   9666
   9667  function trapClickOnNonInteractiveElement(node) {
   9668    // Mobile Safari does not fire properly bubble click events on
   9669    // non-interactive elements, which means delegated click listeners do not
   9670    // fire. The workaround for this bug involves attaching an empty click
   9671    // listener on the target node.
   9672    // https://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
   9673    // Just set it using the onclick property so that we don't have to manage any
   9674    // bookkeeping for it. Not sure if we need to clear it when the listener is
   9675    // removed.
   9676    // TODO: Only do this for the relevant Safaris maybe?
   9677    node.onclick = noop;
   9678  }
   9679
   9680  function setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {
   9681    for (var propKey in nextProps) {
   9682      if (!nextProps.hasOwnProperty(propKey)) {
   9683        continue;
   9684      }
   9685
   9686      var nextProp = nextProps[propKey];
   9687
   9688      if (propKey === STYLE) {
   9689        {
   9690          if (nextProp) {
   9691            // Freeze the next style object so that we can assume it won't be
   9692            // mutated. We have already warned for this in the past.
   9693            Object.freeze(nextProp);
   9694          }
   9695        } // Relies on `updateStylesByID` not mutating `styleUpdates`.
   9696
   9697
   9698        setValueForStyles(domElement, nextProp);
   9699      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
   9700        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
   9701
   9702        if (nextHtml != null) {
   9703          setInnerHTML(domElement, nextHtml);
   9704        }
   9705      } else if (propKey === CHILDREN) {
   9706        if (typeof nextProp === 'string') {
   9707          // Avoid setting initial textContent when the text is empty. In IE11 setting
   9708          // textContent on a <textarea> will cause the placeholder to not
   9709          // show within the <textarea> until it has been focused and blurred again.
   9710          // https://github.com/facebook/react/issues/6731#issuecomment-254874553
   9711          var canSetTextContent = tag !== 'textarea' || nextProp !== '';
   9712
   9713          if (canSetTextContent) {
   9714            setTextContent(domElement, nextProp);
   9715          }
   9716        } else if (typeof nextProp === 'number') {
   9717          setTextContent(domElement, '' + nextProp);
   9718        }
   9719      } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (propKey === AUTOFOCUS) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
   9720        if (nextProp != null) {
   9721          if ( typeof nextProp !== 'function') {
   9722            warnForInvalidEventListener(propKey, nextProp);
   9723          }
   9724
   9725          if (propKey === 'onScroll') {
   9726            listenToNonDelegatedEvent('scroll', domElement);
   9727          }
   9728        }
   9729      } else if (nextProp != null) {
   9730        setValueForProperty(domElement, propKey, nextProp, isCustomComponentTag);
   9731      }
   9732    }
   9733  }
   9734
   9735  function updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {
   9736    // TODO: Handle wasCustomComponentTag
   9737    for (var i = 0; i < updatePayload.length; i += 2) {
   9738      var propKey = updatePayload[i];
   9739      var propValue = updatePayload[i + 1];
   9740
   9741      if (propKey === STYLE) {
   9742        setValueForStyles(domElement, propValue);
   9743      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
   9744        setInnerHTML(domElement, propValue);
   9745      } else if (propKey === CHILDREN) {
   9746        setTextContent(domElement, propValue);
   9747      } else {
   9748        setValueForProperty(domElement, propKey, propValue, isCustomComponentTag);
   9749      }
   9750    }
   9751  }
   9752
   9753  function createElement(type, props, rootContainerElement, parentNamespace) {
   9754    var isCustomComponentTag; // We create tags in the namespace of their parent container, except HTML
   9755    // tags get no namespace.
   9756
   9757    var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);
   9758    var domElement;
   9759    var namespaceURI = parentNamespace;
   9760
   9761    if (namespaceURI === HTML_NAMESPACE) {
   9762      namespaceURI = getIntrinsicNamespace(type);
   9763    }
   9764
   9765    if (namespaceURI === HTML_NAMESPACE) {
   9766      {
   9767        isCustomComponentTag = isCustomComponent(type, props); // Should this check be gated by parent namespace? Not sure we want to
   9768        // allow <SVG> or <mATH>.
   9769
   9770        if (!isCustomComponentTag && type !== type.toLowerCase()) {
   9771          error('<%s /> is using incorrect casing. ' + 'Use PascalCase for React components, ' + 'or lowercase for HTML elements.', type);
   9772        }
   9773      }
   9774
   9775      if (type === 'script') {
   9776        // Create the script via .innerHTML so its "parser-inserted" flag is
   9777        // set to true and it does not execute
   9778        var div = ownerDocument.createElement('div');
   9779
   9780        div.innerHTML = '<script><' + '/script>'; // eslint-disable-line
   9781        // This is guaranteed to yield a script element.
   9782
   9783        var firstChild = div.firstChild;
   9784        domElement = div.removeChild(firstChild);
   9785      } else if (typeof props.is === 'string') {
   9786        // $FlowIssue `createElement` should be updated for Web Components
   9787        domElement = ownerDocument.createElement(type, {
   9788          is: props.is
   9789        });
   9790      } else {
   9791        // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
   9792        // See discussion in https://github.com/facebook/react/pull/6896
   9793        // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
   9794        domElement = ownerDocument.createElement(type); // Normally attributes are assigned in `setInitialDOMProperties`, however the `multiple` and `size`
   9795        // attributes on `select`s needs to be added before `option`s are inserted.
   9796        // This prevents:
   9797        // - a bug where the `select` does not scroll to the correct option because singular
   9798        //  `select` elements automatically pick the first item #13222
   9799        // - a bug where the `select` set the first item as selected despite the `size` attribute #14239
   9800        // See https://github.com/facebook/react/issues/13222
   9801        // and https://github.com/facebook/react/issues/14239
   9802
   9803        if (type === 'select') {
   9804          var node = domElement;
   9805
   9806          if (props.multiple) {
   9807            node.multiple = true;
   9808          } else if (props.size) {
   9809            // Setting a size greater than 1 causes a select to behave like `multiple=true`, where
   9810            // it is possible that no option is selected.
   9811            //
   9812            // This is only necessary when a select in "single selection mode".
   9813            node.size = props.size;
   9814          }
   9815        }
   9816      }
   9817    } else {
   9818      domElement = ownerDocument.createElementNS(namespaceURI, type);
   9819    }
   9820
   9821    {
   9822      if (namespaceURI === HTML_NAMESPACE) {
   9823        if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !hasOwnProperty.call(warnedUnknownTags, type)) {
   9824          warnedUnknownTags[type] = true;
   9825
   9826          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);
   9827        }
   9828      }
   9829    }
   9830
   9831    return domElement;
   9832  }
   9833  function createTextNode(text, rootContainerElement) {
   9834    return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);
   9835  }
   9836  function setInitialProperties(domElement, tag, rawProps, rootContainerElement) {
   9837    var isCustomComponentTag = isCustomComponent(tag, rawProps);
   9838
   9839    {
   9840      validatePropertiesInDevelopment(tag, rawProps);
   9841    } // TODO: Make sure that we check isMounted before firing any of these events.
   9842
   9843
   9844    var props;
   9845
   9846    switch (tag) {
   9847      case 'dialog':
   9848        listenToNonDelegatedEvent('cancel', domElement);
   9849        listenToNonDelegatedEvent('close', domElement);
   9850        props = rawProps;
   9851        break;
   9852
   9853      case 'iframe':
   9854      case 'object':
   9855      case 'embed':
   9856        // We listen to this event in case to ensure emulated bubble
   9857        // listeners still fire for the load event.
   9858        listenToNonDelegatedEvent('load', domElement);
   9859        props = rawProps;
   9860        break;
   9861
   9862      case 'video':
   9863      case 'audio':
   9864        // We listen to these events in case to ensure emulated bubble
   9865        // listeners still fire for all the media events.
   9866        for (var i = 0; i < mediaEventTypes.length; i++) {
   9867          listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
   9868        }
   9869
   9870        props = rawProps;
   9871        break;
   9872
   9873      case 'source':
   9874        // We listen to this event in case to ensure emulated bubble
   9875        // listeners still fire for the error event.
   9876        listenToNonDelegatedEvent('error', domElement);
   9877        props = rawProps;
   9878        break;
   9879
   9880      case 'img':
   9881      case 'image':
   9882      case 'link':
   9883        // We listen to these events in case to ensure emulated bubble
   9884        // listeners still fire for error and load events.
   9885        listenToNonDelegatedEvent('error', domElement);
   9886        listenToNonDelegatedEvent('load', domElement);
   9887        props = rawProps;
   9888        break;
   9889
   9890      case 'details':
   9891        // We listen to this event in case to ensure emulated bubble
   9892        // listeners still fire for the toggle event.
   9893        listenToNonDelegatedEvent('toggle', domElement);
   9894        props = rawProps;
   9895        break;
   9896
   9897      case 'input':
   9898        initWrapperState(domElement, rawProps);
   9899        props = getHostProps(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
   9900        // listeners still fire for the invalid event.
   9901
   9902        listenToNonDelegatedEvent('invalid', domElement);
   9903        break;
   9904
   9905      case 'option':
   9906        validateProps(domElement, rawProps);
   9907        props = rawProps;
   9908        break;
   9909
   9910      case 'select':
   9911        initWrapperState$1(domElement, rawProps);
   9912        props = getHostProps$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
   9913        // listeners still fire for the invalid event.
   9914
   9915        listenToNonDelegatedEvent('invalid', domElement);
   9916        break;
   9917
   9918      case 'textarea':
   9919        initWrapperState$2(domElement, rawProps);
   9920        props = getHostProps$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
   9921        // listeners still fire for the invalid event.
   9922
   9923        listenToNonDelegatedEvent('invalid', domElement);
   9924        break;
   9925
   9926      default:
   9927        props = rawProps;
   9928    }
   9929
   9930    assertValidProps(tag, props);
   9931    setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);
   9932
   9933    switch (tag) {
   9934      case 'input':
   9935        // TODO: Make sure we check if this is still unmounted or do any clean
   9936        // up necessary since we never stop tracking anymore.
   9937        track(domElement);
   9938        postMountWrapper(domElement, rawProps, false);
   9939        break;
   9940
   9941      case 'textarea':
   9942        // TODO: Make sure we check if this is still unmounted or do any clean
   9943        // up necessary since we never stop tracking anymore.
   9944        track(domElement);
   9945        postMountWrapper$3(domElement);
   9946        break;
   9947
   9948      case 'option':
   9949        postMountWrapper$1(domElement, rawProps);
   9950        break;
   9951
   9952      case 'select':
   9953        postMountWrapper$2(domElement, rawProps);
   9954        break;
   9955
   9956      default:
   9957        if (typeof props.onClick === 'function') {
   9958          // TODO: This cast may not be sound for SVG, MathML or custom elements.
   9959          trapClickOnNonInteractiveElement(domElement);
   9960        }
   9961
   9962        break;
   9963    }
   9964  } // Calculate the diff between the two objects.
   9965
   9966  function diffProperties(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {
   9967    {
   9968      validatePropertiesInDevelopment(tag, nextRawProps);
   9969    }
   9970
   9971    var updatePayload = null;
   9972    var lastProps;
   9973    var nextProps;
   9974
   9975    switch (tag) {
   9976      case 'input':
   9977        lastProps = getHostProps(domElement, lastRawProps);
   9978        nextProps = getHostProps(domElement, nextRawProps);
   9979        updatePayload = [];
   9980        break;
   9981
   9982      case 'select':
   9983        lastProps = getHostProps$1(domElement, lastRawProps);
   9984        nextProps = getHostProps$1(domElement, nextRawProps);
   9985        updatePayload = [];
   9986        break;
   9987
   9988      case 'textarea':
   9989        lastProps = getHostProps$2(domElement, lastRawProps);
   9990        nextProps = getHostProps$2(domElement, nextRawProps);
   9991        updatePayload = [];
   9992        break;
   9993
   9994      default:
   9995        lastProps = lastRawProps;
   9996        nextProps = nextRawProps;
   9997
   9998        if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {
   9999          // TODO: This cast may not be sound for SVG, MathML or custom elements.
  10000          trapClickOnNonInteractiveElement(domElement);
  10001        }
  10002
  10003        break;
  10004    }
  10005
  10006    assertValidProps(tag, nextProps);
  10007    var propKey;
  10008    var styleName;
  10009    var styleUpdates = null;
  10010
  10011    for (propKey in lastProps) {
  10012      if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {
  10013        continue;
  10014      }
  10015
  10016      if (propKey === STYLE) {
  10017        var lastStyle = lastProps[propKey];
  10018
  10019        for (styleName in lastStyle) {
  10020          if (lastStyle.hasOwnProperty(styleName)) {
  10021            if (!styleUpdates) {
  10022              styleUpdates = {};
  10023            }
  10024
  10025            styleUpdates[styleName] = '';
  10026          }
  10027        }
  10028      } 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 (registrationNameDependencies.hasOwnProperty(propKey)) {
  10029        // This is a special case. If any listener updates we need to ensure
  10030        // that the "current" fiber pointer gets updated so we need a commit
  10031        // to update this element.
  10032        if (!updatePayload) {
  10033          updatePayload = [];
  10034        }
  10035      } else {
  10036        // For all other deleted properties we add it to the queue. We use
  10037        // the allowed property list in the commit phase instead.
  10038        (updatePayload = updatePayload || []).push(propKey, null);
  10039      }
  10040    }
  10041
  10042    for (propKey in nextProps) {
  10043      var nextProp = nextProps[propKey];
  10044      var lastProp = lastProps != null ? lastProps[propKey] : undefined;
  10045
  10046      if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {
  10047        continue;
  10048      }
  10049
  10050      if (propKey === STYLE) {
  10051        {
  10052          if (nextProp) {
  10053            // Freeze the next style object so that we can assume it won't be
  10054            // mutated. We have already warned for this in the past.
  10055            Object.freeze(nextProp);
  10056          }
  10057        }
  10058
  10059        if (lastProp) {
  10060          // Unset styles on `lastProp` but not on `nextProp`.
  10061          for (styleName in lastProp) {
  10062            if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {
  10063              if (!styleUpdates) {
  10064                styleUpdates = {};
  10065              }
  10066
  10067              styleUpdates[styleName] = '';
  10068            }
  10069          } // Update styles that changed since `lastProp`.
  10070
  10071
  10072          for (styleName in nextProp) {
  10073            if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {
  10074              if (!styleUpdates) {
  10075                styleUpdates = {};
  10076              }
  10077
  10078              styleUpdates[styleName] = nextProp[styleName];
  10079            }
  10080          }
  10081        } else {
  10082          // Relies on `updateStylesByID` not mutating `styleUpdates`.
  10083          if (!styleUpdates) {
  10084            if (!updatePayload) {
  10085              updatePayload = [];
  10086            }
  10087
  10088            updatePayload.push(propKey, styleUpdates);
  10089          }
  10090
  10091          styleUpdates = nextProp;
  10092        }
  10093      } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
  10094        var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
  10095        var lastHtml = lastProp ? lastProp[HTML$1] : undefined;
  10096
  10097        if (nextHtml != null) {
  10098          if (lastHtml !== nextHtml) {
  10099            (updatePayload = updatePayload || []).push(propKey, nextHtml);
  10100          }
  10101        }
  10102      } else if (propKey === CHILDREN) {
  10103        if (typeof nextProp === 'string' || typeof nextProp === 'number') {
  10104          (updatePayload = updatePayload || []).push(propKey, '' + nextProp);
  10105        }
  10106      } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING) ; else if (registrationNameDependencies.hasOwnProperty(propKey)) {
  10107        if (nextProp != null) {
  10108          // We eagerly listen to this even though we haven't committed yet.
  10109          if ( typeof nextProp !== 'function') {
  10110            warnForInvalidEventListener(propKey, nextProp);
  10111          }
  10112
  10113          if (propKey === 'onScroll') {
  10114            listenToNonDelegatedEvent('scroll', domElement);
  10115          }
  10116        }
  10117
  10118        if (!updatePayload && lastProp !== nextProp) {
  10119          // This is a special case. If any listener updates we need to ensure
  10120          // that the "current" props pointer gets updated so we need a commit
  10121          // to update this element.
  10122          updatePayload = [];
  10123        }
  10124      } else {
  10125        // For any other property we always add it to the queue and then we
  10126        // filter it out using the allowed property list during the commit.
  10127        (updatePayload = updatePayload || []).push(propKey, nextProp);
  10128      }
  10129    }
  10130
  10131    if (styleUpdates) {
  10132      {
  10133        validateShorthandPropertyCollisionInDev(styleUpdates, nextProps[STYLE]);
  10134      }
  10135
  10136      (updatePayload = updatePayload || []).push(STYLE, styleUpdates);
  10137    }
  10138
  10139    return updatePayload;
  10140  } // Apply the diff.
  10141
  10142  function updateProperties(domElement, updatePayload, tag, lastRawProps, nextRawProps) {
  10143    // Update checked *before* name.
  10144    // In the middle of an update, it is possible to have multiple checked.
  10145    // When a checked radio tries to change name, browser makes another radio's checked false.
  10146    if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {
  10147      updateChecked(domElement, nextRawProps);
  10148    }
  10149
  10150    var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
  10151    var isCustomComponentTag = isCustomComponent(tag, nextRawProps); // Apply the diff.
  10152
  10153    updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag); // TODO: Ensure that an update gets scheduled if any of the special props
  10154    // changed.
  10155
  10156    switch (tag) {
  10157      case 'input':
  10158        // Update the wrapper around inputs *after* updating props. This has to
  10159        // happen after `updateDOMProperties`. Otherwise HTML5 input validations
  10160        // raise warnings and prevent the new value from being assigned.
  10161        updateWrapper(domElement, nextRawProps);
  10162        break;
  10163
  10164      case 'textarea':
  10165        updateWrapper$1(domElement, nextRawProps);
  10166        break;
  10167
  10168      case 'select':
  10169        // <select> value update needs to occur after <option> children
  10170        // reconciliation
  10171        postUpdateWrapper(domElement, nextRawProps);
  10172        break;
  10173    }
  10174  }
  10175
  10176  function getPossibleStandardName(propName) {
  10177    {
  10178      var lowerCasedName = propName.toLowerCase();
  10179
  10180      if (!possibleStandardNames.hasOwnProperty(lowerCasedName)) {
  10181        return null;
  10182      }
  10183
  10184      return possibleStandardNames[lowerCasedName] || null;
  10185    }
  10186  }
  10187
  10188  function diffHydratedProperties(domElement, tag, rawProps, parentNamespace, rootContainerElement, isConcurrentMode, shouldWarnDev) {
  10189    var isCustomComponentTag;
  10190    var extraAttributeNames;
  10191
  10192    {
  10193      isCustomComponentTag = isCustomComponent(tag, rawProps);
  10194      validatePropertiesInDevelopment(tag, rawProps);
  10195    } // TODO: Make sure that we check isMounted before firing any of these events.
  10196
  10197
  10198    switch (tag) {
  10199      case 'dialog':
  10200        listenToNonDelegatedEvent('cancel', domElement);
  10201        listenToNonDelegatedEvent('close', domElement);
  10202        break;
  10203
  10204      case 'iframe':
  10205      case 'object':
  10206      case 'embed':
  10207        // We listen to this event in case to ensure emulated bubble
  10208        // listeners still fire for the load event.
  10209        listenToNonDelegatedEvent('load', domElement);
  10210        break;
  10211
  10212      case 'video':
  10213      case 'audio':
  10214        // We listen to these events in case to ensure emulated bubble
  10215        // listeners still fire for all the media events.
  10216        for (var i = 0; i < mediaEventTypes.length; i++) {
  10217          listenToNonDelegatedEvent(mediaEventTypes[i], domElement);
  10218        }
  10219
  10220        break;
  10221
  10222      case 'source':
  10223        // We listen to this event in case to ensure emulated bubble
  10224        // listeners still fire for the error event.
  10225        listenToNonDelegatedEvent('error', domElement);
  10226        break;
  10227
  10228      case 'img':
  10229      case 'image':
  10230      case 'link':
  10231        // We listen to these events in case to ensure emulated bubble
  10232        // listeners still fire for error and load events.
  10233        listenToNonDelegatedEvent('error', domElement);
  10234        listenToNonDelegatedEvent('load', domElement);
  10235        break;
  10236
  10237      case 'details':
  10238        // We listen to this event in case to ensure emulated bubble
  10239        // listeners still fire for the toggle event.
  10240        listenToNonDelegatedEvent('toggle', domElement);
  10241        break;
  10242
  10243      case 'input':
  10244        initWrapperState(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
  10245        // listeners still fire for the invalid event.
  10246
  10247        listenToNonDelegatedEvent('invalid', domElement);
  10248        break;
  10249
  10250      case 'option':
  10251        validateProps(domElement, rawProps);
  10252        break;
  10253
  10254      case 'select':
  10255        initWrapperState$1(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
  10256        // listeners still fire for the invalid event.
  10257
  10258        listenToNonDelegatedEvent('invalid', domElement);
  10259        break;
  10260
  10261      case 'textarea':
  10262        initWrapperState$2(domElement, rawProps); // We listen to this event in case to ensure emulated bubble
  10263        // listeners still fire for the invalid event.
  10264
  10265        listenToNonDelegatedEvent('invalid', domElement);
  10266        break;
  10267    }
  10268
  10269    assertValidProps(tag, rawProps);
  10270
  10271    {
  10272      extraAttributeNames = new Set();
  10273      var attributes = domElement.attributes;
  10274
  10275      for (var _i = 0; _i < attributes.length; _i++) {
  10276        var name = attributes[_i].name.toLowerCase();
  10277
  10278        switch (name) {
  10279          // Controlled attributes are not validated
  10280          // TODO: Only ignore them on controlled tags.
  10281          case 'value':
  10282            break;
  10283
  10284          case 'checked':
  10285            break;
  10286
  10287          case 'selected':
  10288            break;
  10289
  10290          default:
  10291            // Intentionally use the original name.
  10292            // See discussion in https://github.com/facebook/react/pull/10676.
  10293            extraAttributeNames.add(attributes[_i].name);
  10294        }
  10295      }
  10296    }
  10297
  10298    var updatePayload = null;
  10299
  10300    for (var propKey in rawProps) {
  10301      if (!rawProps.hasOwnProperty(propKey)) {
  10302        continue;
  10303      }
  10304
  10305      var nextProp = rawProps[propKey];
  10306
  10307      if (propKey === CHILDREN) {
  10308        // For text content children we compare against textContent. This
  10309        // might match additional HTML that is hidden when we read it using
  10310        // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
  10311        // satisfies our requirement. Our requirement is not to produce perfect
  10312        // HTML and attributes. Ideally we should preserve structure but it's
  10313        // ok not to if the visible content is still enough to indicate what
  10314        // even listeners these nodes might be wired up to.
  10315        // TODO: Warn if there is more than a single textNode as a child.
  10316        // TODO: Should we use domElement.firstChild.nodeValue to compare?
  10317        if (typeof nextProp === 'string') {
  10318          if (domElement.textContent !== nextProp) {
  10319            if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
  10320              checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
  10321            }
  10322
  10323            updatePayload = [CHILDREN, nextProp];
  10324          }
  10325        } else if (typeof nextProp === 'number') {
  10326          if (domElement.textContent !== '' + nextProp) {
  10327            if (rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
  10328              checkForUnmatchedText(domElement.textContent, nextProp, isConcurrentMode, shouldWarnDev);
  10329            }
  10330
  10331            updatePayload = [CHILDREN, '' + nextProp];
  10332          }
  10333        }
  10334      } else if (registrationNameDependencies.hasOwnProperty(propKey)) {
  10335        if (nextProp != null) {
  10336          if ( typeof nextProp !== 'function') {
  10337            warnForInvalidEventListener(propKey, nextProp);
  10338          }
  10339
  10340          if (propKey === 'onScroll') {
  10341            listenToNonDelegatedEvent('scroll', domElement);
  10342          }
  10343        }
  10344      } else if (shouldWarnDev && true && // Convince Flow we've calculated it (it's DEV-only in this method.)
  10345      typeof isCustomComponentTag === 'boolean') {
  10346        // Validate that the properties correspond to their expected values.
  10347        var serverValue = void 0;
  10348        var propertyInfo = isCustomComponentTag && enableCustomElementPropertySupport ? null : getPropertyInfo(propKey);
  10349
  10350        if (rawProps[SUPPRESS_HYDRATION_WARNING] === true) ; else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING || // Controlled attributes are not validated
  10351        // TODO: Only ignore them on controlled tags.
  10352        propKey === 'value' || propKey === 'checked' || propKey === 'selected') ; else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
  10353          var serverHTML = domElement.innerHTML;
  10354          var nextHtml = nextProp ? nextProp[HTML$1] : undefined;
  10355
  10356          if (nextHtml != null) {
  10357            var expectedHTML = normalizeHTML(domElement, nextHtml);
  10358
  10359            if (expectedHTML !== serverHTML) {
  10360              warnForPropDifference(propKey, serverHTML, expectedHTML);
  10361            }
  10362          }
  10363        } else if (propKey === STYLE) {
  10364          // $FlowFixMe - Should be inferred as not undefined.
  10365          extraAttributeNames.delete(propKey);
  10366
  10367          if (canDiffStyleForHydrationWarning) {
  10368            var expectedStyle = createDangerousStringForStyles(nextProp);
  10369            serverValue = domElement.getAttribute('style');
  10370
  10371            if (expectedStyle !== serverValue) {
  10372              warnForPropDifference(propKey, serverValue, expectedStyle);
  10373            }
  10374          }
  10375        } else if (isCustomComponentTag && !enableCustomElementPropertySupport) {
  10376          // $FlowFixMe - Should be inferred as not undefined.
  10377          extraAttributeNames.delete(propKey.toLowerCase());
  10378          serverValue = getValueForAttribute(domElement, propKey, nextProp);
  10379
  10380          if (nextProp !== serverValue) {
  10381            warnForPropDifference(propKey, serverValue, nextProp);
  10382          }
  10383        } else if (!shouldIgnoreAttribute(propKey, propertyInfo, isCustomComponentTag) && !shouldRemoveAttribute(propKey, nextProp, propertyInfo, isCustomComponentTag)) {
  10384          var isMismatchDueToBadCasing = false;
  10385
  10386          if (propertyInfo !== null) {
  10387            // $FlowFixMe - Should be inferred as not undefined.
  10388            extraAttributeNames.delete(propertyInfo.attributeName);
  10389            serverValue = getValueForProperty(domElement, propKey, nextProp, propertyInfo);
  10390          } else {
  10391            var ownNamespace = parentNamespace;
  10392
  10393            if (ownNamespace === HTML_NAMESPACE) {
  10394              ownNamespace = getIntrinsicNamespace(tag);
  10395            }
  10396
  10397            if (ownNamespace === HTML_NAMESPACE) {
  10398              // $FlowFixMe - Should be inferred as not undefined.
  10399              extraAttributeNames.delete(propKey.toLowerCase());
  10400            } else {
  10401              var standardName = getPossibleStandardName(propKey);
  10402
  10403              if (standardName !== null && standardName !== propKey) {
  10404                // If an SVG prop is supplied with bad casing, it will
  10405                // be successfully parsed from HTML, but will produce a mismatch
  10406                // (and would be incorrectly rendered on the client).
  10407                // However, we already warn about bad casing elsewhere.
  10408                // So we'll skip the misleading extra mismatch warning in this case.
  10409                isMismatchDueToBadCasing = true; // $FlowFixMe - Should be inferred as not undefined.
  10410
  10411                extraAttributeNames.delete(standardName);
  10412              } // $FlowFixMe - Should be inferred as not undefined.
  10413
  10414
  10415              extraAttributeNames.delete(propKey);
  10416            }
  10417
  10418            serverValue = getValueForAttribute(domElement, propKey, nextProp);
  10419          }
  10420
  10421          var dontWarnCustomElement = enableCustomElementPropertySupport  ;
  10422
  10423          if (!dontWarnCustomElement && nextProp !== serverValue && !isMismatchDueToBadCasing) {
  10424            warnForPropDifference(propKey, serverValue, nextProp);
  10425          }
  10426        }
  10427      }
  10428    }
  10429
  10430    {
  10431      if (shouldWarnDev) {
  10432        if ( // $FlowFixMe - Should be inferred as not undefined.
  10433        extraAttributeNames.size > 0 && rawProps[SUPPRESS_HYDRATION_WARNING] !== true) {
  10434          // $FlowFixMe - Should be inferred as not undefined.
  10435          warnForExtraAttributes(extraAttributeNames);
  10436        }
  10437      }
  10438    }
  10439
  10440    switch (tag) {
  10441      case 'input':
  10442        // TODO: Make sure we check if this is still unmounted or do any clean
  10443        // up necessary since we never stop tracking anymore.
  10444        track(domElement);
  10445        postMountWrapper(domElement, rawProps, true);
  10446        break;
  10447
  10448      case 'textarea':
  10449        // TODO: Make sure we check if this is still unmounted or do any clean
  10450        // up necessary since we never stop tracking anymore.
  10451        track(domElement);
  10452        postMountWrapper$3(domElement);
  10453        break;
  10454
  10455      case 'select':
  10456      case 'option':
  10457        // For input and textarea we current always set the value property at
  10458        // post mount to force it to diverge from attributes. However, for
  10459        // option and select we don't quite do the same thing and select
  10460        // is not resilient to the DOM state changing so we don't do that here.
  10461        // TODO: Consider not doing this for input and textarea.
  10462        break;
  10463
  10464      default:
  10465        if (typeof rawProps.onClick === 'function') {
  10466          // TODO: This cast may not be sound for SVG, MathML or custom elements.
  10467          trapClickOnNonInteractiveElement(domElement);
  10468        }
  10469
  10470        break;
  10471    }
  10472
  10473    return updatePayload;
  10474  }
  10475  function diffHydratedText(textNode, text, isConcurrentMode) {
  10476    var isDifferent = textNode.nodeValue !== text;
  10477    return isDifferent;
  10478  }
  10479  function warnForDeletedHydratableElement(parentNode, child) {
  10480    {
  10481      if (didWarnInvalidHydration) {
  10482        return;
  10483      }
  10484
  10485      didWarnInvalidHydration = true;
  10486
  10487      error('Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());
  10488    }
  10489  }
  10490  function warnForDeletedHydratableText(parentNode, child) {
  10491    {
  10492      if (didWarnInvalidHydration) {
  10493        return;
  10494      }
  10495
  10496      didWarnInvalidHydration = true;
  10497
  10498      error('Did not expect server HTML to contain the text node "%s" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());
  10499    }
  10500  }
  10501  function warnForInsertedHydratedElement(parentNode, tag, props) {
  10502    {
  10503      if (didWarnInvalidHydration) {
  10504        return;
  10505      }
  10506
  10507      didWarnInvalidHydration = true;
  10508
  10509      error('Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());
  10510    }
  10511  }
  10512  function warnForInsertedHydratedText(parentNode, text) {
  10513    {
  10514      if (text === '') {
  10515        // We expect to insert empty text nodes since they're not represented in
  10516        // the HTML.
  10517        // TODO: Remove this special case if we can just avoid inserting empty
  10518        // text nodes.
  10519        return;
  10520      }
  10521
  10522      if (didWarnInvalidHydration) {
  10523        return;
  10524      }
  10525
  10526      didWarnInvalidHydration = true;
  10527
  10528      error('Expected server HTML to contain a matching text node for "%s" in <%s>.', text, parentNode.nodeName.toLowerCase());
  10529    }
  10530  }
  10531  function restoreControlledState$3(domElement, tag, props) {
  10532    switch (tag) {
  10533      case 'input':
  10534        restoreControlledState(domElement, props);
  10535        return;
  10536
  10537      case 'textarea':
  10538        restoreControlledState$2(domElement, props);
  10539        return;
  10540
  10541      case 'select':
  10542        restoreControlledState$1(domElement, props);
  10543        return;
  10544    }
  10545  }
  10546
  10547  var validateDOMNesting = function () {};
  10548
  10549  var updatedAncestorInfo = function () {};
  10550
  10551  {
  10552    // This validation code was written based on the HTML5 parsing spec:
  10553    // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
  10554    //
  10555    // Note: this does not catch all invalid nesting, nor does it try to (as it's
  10556    // not clear what practical benefit doing so provides); instead, we warn only
  10557    // for cases where the parser will give a parse tree differing from what React
  10558    // intended. For example, <b><div></div></b> is invalid but we don't warn
  10559    // because it still parses correctly; we do warn for other cases like nested
  10560    // <p> tags where the beginning of the second element implicitly closes the
  10561    // first, causing a confusing mess.
  10562    // https://html.spec.whatwg.org/multipage/syntax.html#special
  10563    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
  10564
  10565    var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template', // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
  10566    // TODO: Distinguish by namespace here -- for <title>, including it here
  10567    // errs on the side of fewer warnings
  10568    'foreignObject', 'desc', 'title']; // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
  10569
  10570    var buttonScopeTags = inScopeTags.concat(['button']); // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
  10571
  10572    var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];
  10573    var emptyAncestorInfo = {
  10574      current: null,
  10575      formTag: null,
  10576      aTagInScope: null,
  10577      buttonTagInScope: null,
  10578      nobrTagInScope: null,
  10579      pTagInButtonScope: null,
  10580      listItemTagAutoclosing: null,
  10581      dlItemTagAutoclosing: null
  10582    };
  10583
  10584    updatedAncestorInfo = function (oldInfo, tag) {
  10585      var ancestorInfo = assign({}, oldInfo || emptyAncestorInfo);
  10586
  10587      var info = {
  10588        tag: tag
  10589      };
  10590
  10591      if (inScopeTags.indexOf(tag) !== -1) {
  10592        ancestorInfo.aTagInScope = null;
  10593        ancestorInfo.buttonTagInScope = null;
  10594        ancestorInfo.nobrTagInScope = null;
  10595      }
  10596
  10597      if (buttonScopeTags.indexOf(tag) !== -1) {
  10598        ancestorInfo.pTagInButtonScope = null;
  10599      } // See rules for 'li', 'dd', 'dt' start tags in
  10600      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
  10601
  10602
  10603      if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {
  10604        ancestorInfo.listItemTagAutoclosing = null;
  10605        ancestorInfo.dlItemTagAutoclosing = null;
  10606      }
  10607
  10608      ancestorInfo.current = info;
  10609
  10610      if (tag === 'form') {
  10611        ancestorInfo.formTag = info;
  10612      }
  10613
  10614      if (tag === 'a') {
  10615        ancestorInfo.aTagInScope = info;
  10616      }
  10617
  10618      if (tag === 'button') {
  10619        ancestorInfo.buttonTagInScope = info;
  10620      }
  10621
  10622      if (tag === 'nobr') {
  10623        ancestorInfo.nobrTagInScope = info;
  10624      }
  10625
  10626      if (tag === 'p') {
  10627        ancestorInfo.pTagInButtonScope = info;
  10628      }
  10629
  10630      if (tag === 'li') {
  10631        ancestorInfo.listItemTagAutoclosing = info;
  10632      }
  10633
  10634      if (tag === 'dd' || tag === 'dt') {
  10635        ancestorInfo.dlItemTagAutoclosing = info;
  10636      }
  10637
  10638      return ancestorInfo;
  10639    };
  10640    /**
  10641     * Returns whether
  10642     */
  10643
  10644
  10645    var isTagValidWithParent = function (tag, parentTag) {
  10646      // First, let's check if we're in an unusual parsing mode...
  10647      switch (parentTag) {
  10648        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
  10649        case 'select':
  10650          return tag === 'option' || tag === 'optgroup' || tag === '#text';
  10651
  10652        case 'optgroup':
  10653          return tag === 'option' || tag === '#text';
  10654        // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
  10655        // but
  10656
  10657        case 'option':
  10658          return tag === '#text';
  10659        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
  10660        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
  10661        // No special behavior since these rules fall back to "in body" mode for
  10662        // all except special table nodes which cause bad parsing behavior anyway.
  10663        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
  10664
  10665        case 'tr':
  10666          return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';
  10667        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
  10668
  10669        case 'tbody':
  10670        case 'thead':
  10671        case 'tfoot':
  10672          return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';
  10673        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
  10674
  10675        case 'colgroup':
  10676          return tag === 'col' || tag === 'template';
  10677        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
  10678
  10679        case 'table':
  10680          return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';
  10681        // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
  10682
  10683        case 'head':
  10684          return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';
  10685        // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
  10686
  10687        case 'html':
  10688          return tag === 'head' || tag === 'body' || tag === 'frameset';
  10689
  10690        case 'frameset':
  10691          return tag === 'frame';
  10692
  10693        case '#document':
  10694          return tag === 'html';
  10695      } // Probably in the "in body" parsing mode, so we outlaw only tag combos
  10696      // where the parsing rules cause implicit opens or closes to be added.
  10697      // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
  10698
  10699
  10700      switch (tag) {
  10701        case 'h1':
  10702        case 'h2':
  10703        case 'h3':
  10704        case 'h4':
  10705        case 'h5':
  10706        case 'h6':
  10707          return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';
  10708
  10709        case 'rp':
  10710        case 'rt':
  10711          return impliedEndTags.indexOf(parentTag) === -1;
  10712
  10713        case 'body':
  10714        case 'caption':
  10715        case 'col':
  10716        case 'colgroup':
  10717        case 'frameset':
  10718        case 'frame':
  10719        case 'head':
  10720        case 'html':
  10721        case 'tbody':
  10722        case 'td':
  10723        case 'tfoot':
  10724        case 'th':
  10725        case 'thead':
  10726        case 'tr':
  10727          // These tags are only valid with a few parents that have special child
  10728          // parsing rules -- if we're down here, then none of those matched and
  10729          // so we allow it only if we don't know what the parent is, as all other
  10730          // cases are invalid.
  10731          return parentTag == null;
  10732      }
  10733
  10734      return true;
  10735    };
  10736    /**
  10737     * Returns whether
  10738     */
  10739
  10740
  10741    var findInvalidAncestorForTag = function (tag, ancestorInfo) {
  10742      switch (tag) {
  10743        case 'address':
  10744        case 'article':
  10745        case 'aside':
  10746        case 'blockquote':
  10747        case 'center':
  10748        case 'details':
  10749        case 'dialog':
  10750        case 'dir':
  10751        case 'div':
  10752        case 'dl':
  10753        case 'fieldset':
  10754        case 'figcaption':
  10755        case 'figure':
  10756        case 'footer':
  10757        case 'header':
  10758        case 'hgroup':
  10759        case 'main':
  10760        case 'menu':
  10761        case 'nav':
  10762        case 'ol':
  10763        case 'p':
  10764        case 'section':
  10765        case 'summary':
  10766        case 'ul':
  10767        case 'pre':
  10768        case 'listing':
  10769        case 'table':
  10770        case 'hr':
  10771        case 'xmp':
  10772        case 'h1':
  10773        case 'h2':
  10774        case 'h3':
  10775        case 'h4':
  10776        case 'h5':
  10777        case 'h6':
  10778          return ancestorInfo.pTagInButtonScope;
  10779
  10780        case 'form':
  10781          return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;
  10782
  10783        case 'li':
  10784          return ancestorInfo.listItemTagAutoclosing;
  10785
  10786        case 'dd':
  10787        case 'dt':
  10788          return ancestorInfo.dlItemTagAutoclosing;
  10789
  10790        case 'button':
  10791          return ancestorInfo.buttonTagInScope;
  10792
  10793        case 'a':
  10794          // Spec says something about storing a list of markers, but it sounds
  10795          // equivalent to this check.
  10796          return ancestorInfo.aTagInScope;
  10797
  10798        case 'nobr':
  10799          return ancestorInfo.nobrTagInScope;
  10800      }
  10801
  10802      return null;
  10803    };
  10804
  10805    var didWarn$1 = {};
  10806
  10807    validateDOMNesting = function (childTag, childText, ancestorInfo) {
  10808      ancestorInfo = ancestorInfo || emptyAncestorInfo;
  10809      var parentInfo = ancestorInfo.current;
  10810      var parentTag = parentInfo && parentInfo.tag;
  10811
  10812      if (childText != null) {
  10813        if (childTag != null) {
  10814          error('validateDOMNesting: when childText is passed, childTag should be null');
  10815        }
  10816
  10817        childTag = '#text';
  10818      }
  10819
  10820      var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;
  10821      var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);
  10822      var invalidParentOrAncestor = invalidParent || invalidAncestor;
  10823
  10824      if (!invalidParentOrAncestor) {
  10825        return;
  10826      }
  10827
  10828      var ancestorTag = invalidParentOrAncestor.tag;
  10829      var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag;
  10830
  10831      if (didWarn$1[warnKey]) {
  10832        return;
  10833      }
  10834
  10835      didWarn$1[warnKey] = true;
  10836      var tagDisplayName = childTag;
  10837      var whitespaceInfo = '';
  10838
  10839      if (childTag === '#text') {
  10840        if (/\S/.test(childText)) {
  10841          tagDisplayName = 'Text nodes';
  10842        } else {
  10843          tagDisplayName = 'Whitespace text nodes';
  10844          whitespaceInfo = " Make sure you don't have any extra whitespace between tags on " + 'each line of your source code.';
  10845        }
  10846      } else {
  10847        tagDisplayName = '<' + childTag + '>';
  10848      }
  10849
  10850      if (invalidParent) {
  10851        var info = '';
  10852
  10853        if (ancestorTag === 'table' && childTag === 'tr') {
  10854          info += ' Add a <tbody>, <thead> or <tfoot> to your code to match the DOM tree generated by ' + 'the browser.';
  10855        }
  10856
  10857        error('validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info);
  10858      } else {
  10859        error('validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.', tagDisplayName, ancestorTag);
  10860      }
  10861    };
  10862  }
  10863
  10864  var SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';
  10865  var SUSPENSE_START_DATA = '$';
  10866  var SUSPENSE_END_DATA = '/$';
  10867  var SUSPENSE_PENDING_START_DATA = '$?';
  10868  var SUSPENSE_FALLBACK_START_DATA = '$!';
  10869  var STYLE$1 = 'style';
  10870  var eventsEnabled = null;
  10871  var selectionInformation = null;
  10872  function getRootHostContext(rootContainerInstance) {
  10873    var type;
  10874    var namespace;
  10875    var nodeType = rootContainerInstance.nodeType;
  10876
  10877    switch (nodeType) {
  10878      case DOCUMENT_NODE:
  10879      case DOCUMENT_FRAGMENT_NODE:
  10880        {
  10881          type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';
  10882          var root = rootContainerInstance.documentElement;
  10883          namespace = root ? root.namespaceURI : getChildNamespace(null, '');
  10884          break;
  10885        }
  10886
  10887      default:
  10888        {
  10889          var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;
  10890          var ownNamespace = container.namespaceURI || null;
  10891          type = container.tagName;
  10892          namespace = getChildNamespace(ownNamespace, type);
  10893          break;
  10894        }
  10895    }
  10896
  10897    {
  10898      var validatedTag = type.toLowerCase();
  10899      var ancestorInfo = updatedAncestorInfo(null, validatedTag);
  10900      return {
  10901        namespace: namespace,
  10902        ancestorInfo: ancestorInfo
  10903      };
  10904    }
  10905  }
  10906  function getChildHostContext(parentHostContext, type, rootContainerInstance) {
  10907    {
  10908      var parentHostContextDev = parentHostContext;
  10909      var namespace = getChildNamespace(parentHostContextDev.namespace, type);
  10910      var ancestorInfo = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type);
  10911      return {
  10912        namespace: namespace,
  10913        ancestorInfo: ancestorInfo
  10914      };
  10915    }
  10916  }
  10917  function getPublicInstance(instance) {
  10918    return instance;
  10919  }
  10920  function prepareForCommit(containerInfo) {
  10921    eventsEnabled = isEnabled();
  10922    selectionInformation = getSelectionInformation();
  10923    var activeInstance = null;
  10924
  10925    setEnabled(false);
  10926    return activeInstance;
  10927  }
  10928  function resetAfterCommit(containerInfo) {
  10929    restoreSelection(selectionInformation);
  10930    setEnabled(eventsEnabled);
  10931    eventsEnabled = null;
  10932    selectionInformation = null;
  10933  }
  10934  function createInstance(type, props, rootContainerInstance, hostContext, internalInstanceHandle) {
  10935    var parentNamespace;
  10936
  10937    {
  10938      // TODO: take namespace into account when validating.
  10939      var hostContextDev = hostContext;
  10940      validateDOMNesting(type, null, hostContextDev.ancestorInfo);
  10941
  10942      if (typeof props.children === 'string' || typeof props.children === 'number') {
  10943        var string = '' + props.children;
  10944        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
  10945        validateDOMNesting(null, string, ownAncestorInfo);
  10946      }
  10947
  10948      parentNamespace = hostContextDev.namespace;
  10949    }
  10950
  10951    var domElement = createElement(type, props, rootContainerInstance, parentNamespace);
  10952    precacheFiberNode(internalInstanceHandle, domElement);
  10953    updateFiberProps(domElement, props);
  10954    return domElement;
  10955  }
  10956  function appendInitialChild(parentInstance, child) {
  10957    parentInstance.appendChild(child);
  10958  }
  10959  function finalizeInitialChildren(domElement, type, props, rootContainerInstance, hostContext) {
  10960    setInitialProperties(domElement, type, props, rootContainerInstance);
  10961
  10962    switch (type) {
  10963      case 'button':
  10964      case 'input':
  10965      case 'select':
  10966      case 'textarea':
  10967        return !!props.autoFocus;
  10968
  10969      case 'img':
  10970        return true;
  10971
  10972      default:
  10973        return false;
  10974    }
  10975  }
  10976  function prepareUpdate(domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {
  10977    {
  10978      var hostContextDev = hostContext;
  10979
  10980      if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {
  10981        var string = '' + newProps.children;
  10982        var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type);
  10983        validateDOMNesting(null, string, ownAncestorInfo);
  10984      }
  10985    }
  10986
  10987    return diffProperties(domElement, type, oldProps, newProps);
  10988  }
  10989  function shouldSetTextContent(type, props) {
  10990    return type === 'textarea' || type === 'noscript' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && props.dangerouslySetInnerHTML.__html != null;
  10991  }
  10992  function createTextInstance(text, rootContainerInstance, hostContext, internalInstanceHandle) {
  10993    {
  10994      var hostContextDev = hostContext;
  10995      validateDOMNesting(null, text, hostContextDev.ancestorInfo);
  10996    }
  10997
  10998    var textNode = createTextNode(text, rootContainerInstance);
  10999    precacheFiberNode(internalInstanceHandle, textNode);
  11000    return textNode;
  11001  }
  11002  function getCurrentEventPriority() {
  11003    var currentEvent = window.event;
  11004
  11005    if (currentEvent === undefined) {
  11006      return DefaultEventPriority;
  11007    }
  11008
  11009    return getEventPriority(currentEvent.type);
  11010  }
  11011  // if a component just imports ReactDOM (e.g. for findDOMNode).
  11012  // Some environments might not have setTimeout or clearTimeout.
  11013
  11014  var scheduleTimeout = typeof setTimeout === 'function' ? setTimeout : undefined;
  11015  var cancelTimeout = typeof clearTimeout === 'function' ? clearTimeout : undefined;
  11016  var noTimeout = -1;
  11017  var localPromise = typeof Promise === 'function' ? Promise : undefined; // -------------------
  11018  var scheduleMicrotask = typeof queueMicrotask === 'function' ? queueMicrotask : typeof localPromise !== 'undefined' ? function (callback) {
  11019    return localPromise.resolve(null).then(callback).catch(handleErrorInNextTick);
  11020  } : scheduleTimeout; // TODO: Determine the best fallback here.
  11021
  11022  function handleErrorInNextTick(error) {
  11023    setTimeout(function () {
  11024      throw error;
  11025    });
  11026  } // -------------------
  11027  function commitMount(domElement, type, newProps, internalInstanceHandle) {
  11028    // Despite the naming that might imply otherwise, this method only
  11029    // fires if there is an `Update` effect scheduled during mounting.
  11030    // This happens if `finalizeInitialChildren` returns `true` (which it
  11031    // does to implement the `autoFocus` attribute on the client). But
  11032    // there are also other cases when this might happen (such as patching
  11033    // up text content during hydration mismatch). So we'll check this again.
  11034    switch (type) {
  11035      case 'button':
  11036      case 'input':
  11037      case 'select':
  11038      case 'textarea':
  11039        if (newProps.autoFocus) {
  11040          domElement.focus();
  11041        }
  11042
  11043        return;
  11044
  11045      case 'img':
  11046        {
  11047          if (newProps.src) {
  11048            domElement.src = newProps.src;
  11049          }
  11050
  11051          return;
  11052        }
  11053    }
  11054  }
  11055  function commitUpdate(domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {
  11056    // Apply the diff to the DOM node.
  11057    updateProperties(domElement, updatePayload, type, oldProps, newProps); // Update the props handle so that we know which props are the ones with
  11058    // with current event handlers.
  11059
  11060    updateFiberProps(domElement, newProps);
  11061  }
  11062  function resetTextContent(domElement) {
  11063    setTextContent(domElement, '');
  11064  }
  11065  function commitTextUpdate(textInstance, oldText, newText) {
  11066    textInstance.nodeValue = newText;
  11067  }
  11068  function appendChild(parentInstance, child) {
  11069    parentInstance.appendChild(child);
  11070  }
  11071  function appendChildToContainer(container, child) {
  11072    var parentNode;
  11073
  11074    if (container.nodeType === COMMENT_NODE) {
  11075      parentNode = container.parentNode;
  11076      parentNode.insertBefore(child, container);
  11077    } else {
  11078      parentNode = container;
  11079      parentNode.appendChild(child);
  11080    } // This container might be used for a portal.
  11081    // If something inside a portal is clicked, that click should bubble
  11082    // through the React tree. However, on Mobile Safari the click would
  11083    // never bubble through the *DOM* tree unless an ancestor with onclick
  11084    // event exists. So we wouldn't see it and dispatch it.
  11085    // This is why we ensure that non React root containers have inline onclick
  11086    // defined.
  11087    // https://github.com/facebook/react/issues/11918
  11088
  11089
  11090    var reactRootContainer = container._reactRootContainer;
  11091
  11092    if ((reactRootContainer === null || reactRootContainer === undefined) && parentNode.onclick === null) {
  11093      // TODO: This cast may not be sound for SVG, MathML or custom elements.
  11094      trapClickOnNonInteractiveElement(parentNode);
  11095    }
  11096  }
  11097  function insertBefore(parentInstance, child, beforeChild) {
  11098    parentInstance.insertBefore(child, beforeChild);
  11099  }
  11100  function insertInContainerBefore(container, child, beforeChild) {
  11101    if (container.nodeType === COMMENT_NODE) {
  11102      container.parentNode.insertBefore(child, beforeChild);
  11103    } else {
  11104      container.insertBefore(child, beforeChild);
  11105    }
  11106  }
  11107
  11108  function removeChild(parentInstance, child) {
  11109    parentInstance.removeChild(child);
  11110  }
  11111  function removeChildFromContainer(container, child) {
  11112    if (container.nodeType === COMMENT_NODE) {
  11113      container.parentNode.removeChild(child);
  11114    } else {
  11115      container.removeChild(child);
  11116    }
  11117  }
  11118  function clearSuspenseBoundary(parentInstance, suspenseInstance) {
  11119    var node = suspenseInstance; // Delete all nodes within this suspense boundary.
  11120    // There might be nested nodes so we need to keep track of how
  11121    // deep we are and only break out when we're back on top.
  11122
  11123    var depth = 0;
  11124
  11125    do {
  11126      var nextNode = node.nextSibling;
  11127      parentInstance.removeChild(node);
  11128
  11129      if (nextNode && nextNode.nodeType === COMMENT_NODE) {
  11130        var data = nextNode.data;
  11131
  11132        if (data === SUSPENSE_END_DATA) {
  11133          if (depth === 0) {
  11134            parentInstance.removeChild(nextNode); // Retry if any event replaying was blocked on this.
  11135
  11136            retryIfBlockedOn(suspenseInstance);
  11137            return;
  11138          } else {
  11139            depth--;
  11140          }
  11141        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_PENDING_START_DATA || data === SUSPENSE_FALLBACK_START_DATA) {
  11142          depth++;
  11143        }
  11144      }
  11145
  11146      node = nextNode;
  11147    } while (node); // TODO: Warn, we didn't find the end comment boundary.
  11148    // Retry if any event replaying was blocked on this.
  11149
  11150
  11151    retryIfBlockedOn(suspenseInstance);
  11152  }
  11153  function clearSuspenseBoundaryFromContainer(container, suspenseInstance) {
  11154    if (container.nodeType === COMMENT_NODE) {
  11155      clearSuspenseBoundary(container.parentNode, suspenseInstance);
  11156    } else if (container.nodeType === ELEMENT_NODE) {
  11157      clearSuspenseBoundary(container, suspenseInstance);
  11158    } // Retry if any event replaying was blocked on this.
  11159
  11160
  11161    retryIfBlockedOn(container);
  11162  }
  11163  function hideInstance(instance) {
  11164    // TODO: Does this work for all element types? What about MathML? Should we
  11165    // pass host context to this method?
  11166    instance = instance;
  11167    var style = instance.style;
  11168
  11169    if (typeof style.setProperty === 'function') {
  11170      style.setProperty('display', 'none', 'important');
  11171    } else {
  11172      style.display = 'none';
  11173    }
  11174  }
  11175  function hideTextInstance(textInstance) {
  11176    textInstance.nodeValue = '';
  11177  }
  11178  function unhideInstance(instance, props) {
  11179    instance = instance;
  11180    var styleProp = props[STYLE$1];
  11181    var display = styleProp !== undefined && styleProp !== null && styleProp.hasOwnProperty('display') ? styleProp.display : null;
  11182    instance.style.display = dangerousStyleValue('display', display);
  11183  }
  11184  function unhideTextInstance(textInstance, text) {
  11185    textInstance.nodeValue = text;
  11186  }
  11187  function clearContainer(container) {
  11188    if (container.nodeType === ELEMENT_NODE) {
  11189      container.textContent = '';
  11190    } else if (container.nodeType === DOCUMENT_NODE) {
  11191      if (container.documentElement) {
  11192        container.removeChild(container.documentElement);
  11193      }
  11194    }
  11195  } // -------------------
  11196  function canHydrateInstance(instance, type, props) {
  11197    if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {
  11198      return null;
  11199    } // This has now been refined to an element node.
  11200
  11201
  11202    return instance;
  11203  }
  11204  function canHydrateTextInstance(instance, text) {
  11205    if (text === '' || instance.nodeType !== TEXT_NODE) {
  11206      // Empty strings are not parsed by HTML so there won't be a correct match here.
  11207      return null;
  11208    } // This has now been refined to a text node.
  11209
  11210
  11211    return instance;
  11212  }
  11213  function canHydrateSuspenseInstance(instance) {
  11214    if (instance.nodeType !== COMMENT_NODE) {
  11215      // Empty strings are not parsed by HTML so there won't be a correct match here.
  11216      return null;
  11217    } // This has now been refined to a suspense node.
  11218
  11219
  11220    return instance;
  11221  }
  11222  function isSuspenseInstancePending(instance) {
  11223    return instance.data === SUSPENSE_PENDING_START_DATA;
  11224  }
  11225  function isSuspenseInstanceFallback(instance) {
  11226    return instance.data === SUSPENSE_FALLBACK_START_DATA;
  11227  }
  11228  function getSuspenseInstanceFallbackErrorDetails(instance) {
  11229    var dataset = instance.nextSibling && instance.nextSibling.dataset;
  11230    var digest, message, stack;
  11231
  11232    if (dataset) {
  11233      digest = dataset.dgst;
  11234
  11235      {
  11236        message = dataset.msg;
  11237        stack = dataset.stck;
  11238      }
  11239    }
  11240
  11241    {
  11242      return {
  11243        message: message,
  11244        digest: digest,
  11245        stack: stack
  11246      };
  11247    } // let value = {message: undefined, hash: undefined};
  11248    // const nextSibling = instance.nextSibling;
  11249    // if (nextSibling) {
  11250    //   const dataset = ((nextSibling: any): HTMLTemplateElement).dataset;
  11251    //   value.message = dataset.msg;
  11252    //   value.hash = dataset.hash;
  11253    //   if (true) {
  11254    //     value.stack = dataset.stack;
  11255    //   }
  11256    // }
  11257    // return value;
  11258
  11259  }
  11260  function registerSuspenseInstanceRetry(instance, callback) {
  11261    instance._reactRetry = callback;
  11262  }
  11263
  11264  function getNextHydratable(node) {
  11265    // Skip non-hydratable nodes.
  11266    for (; node != null; node = node.nextSibling) {
  11267      var nodeType = node.nodeType;
  11268
  11269      if (nodeType === ELEMENT_NODE || nodeType === TEXT_NODE) {
  11270        break;
  11271      }
  11272
  11273      if (nodeType === COMMENT_NODE) {
  11274        var nodeData = node.data;
  11275
  11276        if (nodeData === SUSPENSE_START_DATA || nodeData === SUSPENSE_FALLBACK_START_DATA || nodeData === SUSPENSE_PENDING_START_DATA) {
  11277          break;
  11278        }
  11279
  11280        if (nodeData === SUSPENSE_END_DATA) {
  11281          return null;
  11282        }
  11283      }
  11284    }
  11285
  11286    return node;
  11287  }
  11288
  11289  function getNextHydratableSibling(instance) {
  11290    return getNextHydratable(instance.nextSibling);
  11291  }
  11292  function getFirstHydratableChild(parentInstance) {
  11293    return getNextHydratable(parentInstance.firstChild);
  11294  }
  11295  function getFirstHydratableChildWithinContainer(parentContainer) {
  11296    return getNextHydratable(parentContainer.firstChild);
  11297  }
  11298  function getFirstHydratableChildWithinSuspenseInstance(parentInstance) {
  11299    return getNextHydratable(parentInstance.nextSibling);
  11300  }
  11301  function hydrateInstance(instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle, shouldWarnDev) {
  11302    precacheFiberNode(internalInstanceHandle, instance); // TODO: Possibly defer this until the commit phase where all the events
  11303    // get attached.
  11304
  11305    updateFiberProps(instance, props);
  11306    var parentNamespace;
  11307
  11308    {
  11309      var hostContextDev = hostContext;
  11310      parentNamespace = hostContextDev.namespace;
  11311    } // TODO: Temporary hack to check if we're in a concurrent root. We can delete
  11312    // when the legacy root API is removed.
  11313
  11314
  11315    var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
  11316    return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance, isConcurrentMode, shouldWarnDev);
  11317  }
  11318  function hydrateTextInstance(textInstance, text, internalInstanceHandle, shouldWarnDev) {
  11319    precacheFiberNode(internalInstanceHandle, textInstance); // TODO: Temporary hack to check if we're in a concurrent root. We can delete
  11320    // when the legacy root API is removed.
  11321
  11322    var isConcurrentMode = (internalInstanceHandle.mode & ConcurrentMode) !== NoMode;
  11323    return diffHydratedText(textInstance, text);
  11324  }
  11325  function hydrateSuspenseInstance(suspenseInstance, internalInstanceHandle) {
  11326    precacheFiberNode(internalInstanceHandle, suspenseInstance);
  11327  }
  11328  function getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance) {
  11329    var node = suspenseInstance.nextSibling; // Skip past all nodes within this suspense boundary.
  11330    // There might be nested nodes so we need to keep track of how
  11331    // deep we are and only break out when we're back on top.
  11332
  11333    var depth = 0;
  11334
  11335    while (node) {
  11336      if (node.nodeType === COMMENT_NODE) {
  11337        var data = node.data;
  11338
  11339        if (data === SUSPENSE_END_DATA) {
  11340          if (depth === 0) {
  11341            return getNextHydratableSibling(node);
  11342          } else {
  11343            depth--;
  11344          }
  11345        } else if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
  11346          depth++;
  11347        }
  11348      }
  11349
  11350      node = node.nextSibling;
  11351    } // TODO: Warn, we didn't find the end comment boundary.
  11352
  11353
  11354    return null;
  11355  } // Returns the SuspenseInstance if this node is a direct child of a
  11356  // SuspenseInstance. I.e. if its previous sibling is a Comment with
  11357  // SUSPENSE_x_START_DATA. Otherwise, null.
  11358
  11359  function getParentSuspenseInstance(targetInstance) {
  11360    var node = targetInstance.previousSibling; // Skip past all nodes within this suspense boundary.
  11361    // There might be nested nodes so we need to keep track of how
  11362    // deep we are and only break out when we're back on top.
  11363
  11364    var depth = 0;
  11365
  11366    while (node) {
  11367      if (node.nodeType === COMMENT_NODE) {
  11368        var data = node.data;
  11369
  11370        if (data === SUSPENSE_START_DATA || data === SUSPENSE_FALLBACK_START_DATA || data === SUSPENSE_PENDING_START_DATA) {
  11371          if (depth === 0) {
  11372            return node;
  11373          } else {
  11374            depth--;
  11375          }
  11376        } else if (data === SUSPENSE_END_DATA) {
  11377          depth++;
  11378        }
  11379      }
  11380
  11381      node = node.previousSibling;
  11382    }
  11383
  11384    return null;
  11385  }
  11386  function commitHydratedContainer(container) {
  11387    // Retry if any event replaying was blocked on this.
  11388    retryIfBlockedOn(container);
  11389  }
  11390  function commitHydratedSuspenseInstance(suspenseInstance) {
  11391    // Retry if any event replaying was blocked on this.
  11392    retryIfBlockedOn(suspenseInstance);
  11393  }
  11394  function shouldDeleteUnhydratedTailInstances(parentType) {
  11395    return parentType !== 'head' && parentType !== 'body';
  11396  }
  11397  function didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, text, isConcurrentMode) {
  11398    var shouldWarnDev = true;
  11399    checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
  11400  }
  11401  function didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, text, isConcurrentMode) {
  11402    if (parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
  11403      var shouldWarnDev = true;
  11404      checkForUnmatchedText(textInstance.nodeValue, text, isConcurrentMode, shouldWarnDev);
  11405    }
  11406  }
  11407  function didNotHydrateInstanceWithinContainer(parentContainer, instance) {
  11408    {
  11409      if (instance.nodeType === ELEMENT_NODE) {
  11410        warnForDeletedHydratableElement(parentContainer, instance);
  11411      } else if (instance.nodeType === COMMENT_NODE) ; else {
  11412        warnForDeletedHydratableText(parentContainer, instance);
  11413      }
  11414    }
  11415  }
  11416  function didNotHydrateInstanceWithinSuspenseInstance(parentInstance, instance) {
  11417    {
  11418      // $FlowFixMe: Only Element or Document can be parent nodes.
  11419      var parentNode = parentInstance.parentNode;
  11420
  11421      if (parentNode !== null) {
  11422        if (instance.nodeType === ELEMENT_NODE) {
  11423          warnForDeletedHydratableElement(parentNode, instance);
  11424        } else if (instance.nodeType === COMMENT_NODE) ; else {
  11425          warnForDeletedHydratableText(parentNode, instance);
  11426        }
  11427      }
  11428    }
  11429  }
  11430  function didNotHydrateInstance(parentType, parentProps, parentInstance, instance, isConcurrentMode) {
  11431    {
  11432      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
  11433        if (instance.nodeType === ELEMENT_NODE) {
  11434          warnForDeletedHydratableElement(parentInstance, instance);
  11435        } else if (instance.nodeType === COMMENT_NODE) ; else {
  11436          warnForDeletedHydratableText(parentInstance, instance);
  11437        }
  11438      }
  11439    }
  11440  }
  11441  function didNotFindHydratableInstanceWithinContainer(parentContainer, type, props) {
  11442    {
  11443      warnForInsertedHydratedElement(parentContainer, type);
  11444    }
  11445  }
  11446  function didNotFindHydratableTextInstanceWithinContainer(parentContainer, text) {
  11447    {
  11448      warnForInsertedHydratedText(parentContainer, text);
  11449    }
  11450  }
  11451  function didNotFindHydratableInstanceWithinSuspenseInstance(parentInstance, type, props) {
  11452    {
  11453      // $FlowFixMe: Only Element or Document can be parent nodes.
  11454      var parentNode = parentInstance.parentNode;
  11455      if (parentNode !== null) warnForInsertedHydratedElement(parentNode, type);
  11456    }
  11457  }
  11458  function didNotFindHydratableTextInstanceWithinSuspenseInstance(parentInstance, text) {
  11459    {
  11460      // $FlowFixMe: Only Element or Document can be parent nodes.
  11461      var parentNode = parentInstance.parentNode;
  11462      if (parentNode !== null) warnForInsertedHydratedText(parentNode, text);
  11463    }
  11464  }
  11465  function didNotFindHydratableInstance(parentType, parentProps, parentInstance, type, props, isConcurrentMode) {
  11466    {
  11467      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
  11468        warnForInsertedHydratedElement(parentInstance, type);
  11469      }
  11470    }
  11471  }
  11472  function didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, text, isConcurrentMode) {
  11473    {
  11474      if (isConcurrentMode || parentProps[SUPPRESS_HYDRATION_WARNING$1] !== true) {
  11475        warnForInsertedHydratedText(parentInstance, text);
  11476      }
  11477    }
  11478  }
  11479  function errorHydratingContainer(parentContainer) {
  11480    {
  11481      // TODO: This gets logged by onRecoverableError, too, so we should be
  11482      // able to remove it.
  11483      error('An error occurred during hydration. The server HTML was replaced with client content in <%s>.', parentContainer.nodeName.toLowerCase());
  11484    }
  11485  }
  11486  function preparePortalMount(portalInstance) {
  11487    listenToAllSupportedEvents(portalInstance);
  11488  }
  11489
  11490  var randomKey = Math.random().toString(36).slice(2);
  11491  var internalInstanceKey = '__reactFiber$' + randomKey;
  11492  var internalPropsKey = '__reactProps$' + randomKey;
  11493  var internalContainerInstanceKey = '__reactContainer$' + randomKey;
  11494  var internalEventHandlersKey = '__reactEvents$' + randomKey;
  11495  var internalEventHandlerListenersKey = '__reactListeners$' + randomKey;
  11496  var internalEventHandlesSetKey = '__reactHandles$' + randomKey;
  11497  function detachDeletedInstance(node) {
  11498    // TODO: This function is only called on host components. I don't think all of
  11499    // these fields are relevant.
  11500    delete node[internalInstanceKey];
  11501    delete node[internalPropsKey];
  11502    delete node[internalEventHandlersKey];
  11503    delete node[internalEventHandlerListenersKey];
  11504    delete node[internalEventHandlesSetKey];
  11505  }
  11506  function precacheFiberNode(hostInst, node) {
  11507    node[internalInstanceKey] = hostInst;
  11508  }
  11509  function markContainerAsRoot(hostRoot, node) {
  11510    node[internalContainerInstanceKey] = hostRoot;
  11511  }
  11512  function unmarkContainerAsRoot(node) {
  11513    node[internalContainerInstanceKey] = null;
  11514  }
  11515  function isContainerMarkedAsRoot(node) {
  11516    return !!node[internalContainerInstanceKey];
  11517  } // Given a DOM node, return the closest HostComponent or HostText fiber ancestor.
  11518  // If the target node is part of a hydrated or not yet rendered subtree, then
  11519  // this may also return a SuspenseComponent or HostRoot to indicate that.
  11520  // Conceptually the HostRoot fiber is a child of the Container node. So if you
  11521  // pass the Container node as the targetNode, you will not actually get the
  11522  // HostRoot back. To get to the HostRoot, you need to pass a child of it.
  11523  // The same thing applies to Suspense boundaries.
  11524
  11525  function getClosestInstanceFromNode(targetNode) {
  11526    var targetInst = targetNode[internalInstanceKey];
  11527
  11528    if (targetInst) {
  11529      // Don't return HostRoot or SuspenseComponent here.
  11530      return targetInst;
  11531    } // If the direct event target isn't a React owned DOM node, we need to look
  11532    // to see if one of its parents is a React owned DOM node.
  11533
  11534
  11535    var parentNode = targetNode.parentNode;
  11536
  11537    while (parentNode) {
  11538      // We'll check if this is a container root that could include
  11539      // React nodes in the future. We need to check this first because
  11540      // if we're a child of a dehydrated container, we need to first
  11541      // find that inner container before moving on to finding the parent
  11542      // instance. Note that we don't check this field on  the targetNode
  11543      // itself because the fibers are conceptually between the container
  11544      // node and the first child. It isn't surrounding the container node.
  11545      // If it's not a container, we check if it's an instance.
  11546      targetInst = parentNode[internalContainerInstanceKey] || parentNode[internalInstanceKey];
  11547
  11548      if (targetInst) {
  11549        // Since this wasn't the direct target of the event, we might have
  11550        // stepped past dehydrated DOM nodes to get here. However they could
  11551        // also have been non-React nodes. We need to answer which one.
  11552        // If we the instance doesn't have any children, then there can't be
  11553        // a nested suspense boundary within it. So we can use this as a fast
  11554        // bailout. Most of the time, when people add non-React children to
  11555        // the tree, it is using a ref to a child-less DOM node.
  11556        // Normally we'd only need to check one of the fibers because if it
  11557        // has ever gone from having children to deleting them or vice versa
  11558        // it would have deleted the dehydrated boundary nested inside already.
  11559        // However, since the HostRoot starts out with an alternate it might
  11560        // have one on the alternate so we need to check in case this was a
  11561        // root.
  11562        var alternate = targetInst.alternate;
  11563
  11564        if (targetInst.child !== null || alternate !== null && alternate.child !== null) {
  11565          // Next we need to figure out if the node that skipped past is
  11566          // nested within a dehydrated boundary and if so, which one.
  11567          var suspenseInstance = getParentSuspenseInstance(targetNode);
  11568
  11569          while (suspenseInstance !== null) {
  11570            // We found a suspense instance. That means that we haven't
  11571            // hydrated it yet. Even though we leave the comments in the
  11572            // DOM after hydrating, and there are boundaries in the DOM
  11573            // that could already be hydrated, we wouldn't have found them
  11574            // through this pass since if the target is hydrated it would
  11575            // have had an internalInstanceKey on it.
  11576            // Let's get the fiber associated with the SuspenseComponent
  11577            // as the deepest instance.
  11578            var targetSuspenseInst = suspenseInstance[internalInstanceKey];
  11579
  11580            if (targetSuspenseInst) {
  11581              return targetSuspenseInst;
  11582            } // If we don't find a Fiber on the comment, it might be because
  11583            // we haven't gotten to hydrate it yet. There might still be a
  11584            // parent boundary that hasn't above this one so we need to find
  11585            // the outer most that is known.
  11586
  11587
  11588            suspenseInstance = getParentSuspenseInstance(suspenseInstance); // If we don't find one, then that should mean that the parent
  11589            // host component also hasn't hydrated yet. We can return it
  11590            // below since it will bail out on the isMounted check later.
  11591          }
  11592        }
  11593
  11594        return targetInst;
  11595      }
  11596
  11597      targetNode = parentNode;
  11598      parentNode = targetNode.parentNode;
  11599    }
  11600
  11601    return null;
  11602  }
  11603  /**
  11604   * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
  11605   * instance, or null if the node was not rendered by this React.
  11606   */
  11607
  11608  function getInstanceFromNode(node) {
  11609    var inst = node[internalInstanceKey] || node[internalContainerInstanceKey];
  11610
  11611    if (inst) {
  11612      if (inst.tag === HostComponent || inst.tag === HostText || inst.tag === SuspenseComponent || inst.tag === HostRoot) {
  11613        return inst;
  11614      } else {
  11615        return null;
  11616      }
  11617    }
  11618
  11619    return null;
  11620  }
  11621  /**
  11622   * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
  11623   * DOM node.
  11624   */
  11625
  11626  function getNodeFromInstance(inst) {
  11627    if (inst.tag === HostComponent || inst.tag === HostText) {
  11628      // In Fiber this, is just the state node right now. We assume it will be
  11629      // a host component or host text.
  11630      return inst.stateNode;
  11631    } // Without this first invariant, passing a non-DOM-component triggers the next
  11632    // invariant for a missing parent, which is super confusing.
  11633
  11634
  11635    throw new Error('getNodeFromInstance: Invalid argument.');
  11636  }
  11637  function getFiberCurrentPropsFromNode(node) {
  11638    return node[internalPropsKey] || null;
  11639  }
  11640  function updateFiberProps(node, props) {
  11641    node[internalPropsKey] = props;
  11642  }
  11643  function getEventListenerSet(node) {
  11644    var elementListenerSet = node[internalEventHandlersKey];
  11645
  11646    if (elementListenerSet === undefined) {
  11647      elementListenerSet = node[internalEventHandlersKey] = new Set();
  11648    }
  11649
  11650    return elementListenerSet;
  11651  }
  11652
  11653  var loggedTypeFailures = {};
  11654  var ReactDebugCurrentFrame$1 = ReactSharedInternals.ReactDebugCurrentFrame;
  11655
  11656  function setCurrentlyValidatingElement(element) {
  11657    {
  11658      if (element) {
  11659        var owner = element._owner;
  11660        var stack = describeUnknownElementTypeFrameInDEV(element.type, element._source, owner ? owner.type : null);
  11661        ReactDebugCurrentFrame$1.setExtraStackFrame(stack);
  11662      } else {
  11663        ReactDebugCurrentFrame$1.setExtraStackFrame(null);
  11664      }
  11665    }
  11666  }
  11667
  11668  function checkPropTypes(typeSpecs, values, location, componentName, element) {
  11669    {
  11670      // $FlowFixMe This is okay but Flow doesn't know it.
  11671      var has = Function.call.bind(hasOwnProperty);
  11672
  11673      for (var typeSpecName in typeSpecs) {
  11674        if (has(typeSpecs, typeSpecName)) {
  11675          var error$1 = void 0; // Prop type validation may throw. In case they do, we don't want to
  11676          // fail the render phase where it didn't fail before. So we log it.
  11677          // After these have been cleaned up, we'll let them throw.
  11678
  11679          try {
  11680            // This is intentionally an invariant that gets caught. It's the same
  11681            // behavior as without this statement except with a better message.
  11682            if (typeof typeSpecs[typeSpecName] !== 'function') {
  11683              // eslint-disable-next-line react-internal/prod-error-codes
  11684              var err = Error((componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' + 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.');
  11685              err.name = 'Invariant Violation';
  11686              throw err;
  11687            }
  11688
  11689            error$1 = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED');
  11690          } catch (ex) {
  11691            error$1 = ex;
  11692          }
  11693
  11694          if (error$1 && !(error$1 instanceof Error)) {
  11695            setCurrentlyValidatingElement(element);
  11696
  11697            error('%s: type specification of %s' + ' `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error$1);
  11698
  11699            setCurrentlyValidatingElement(null);
  11700          }
  11701
  11702          if (error$1 instanceof Error && !(error$1.message in loggedTypeFailures)) {
  11703            // Only monitor this failure once because there tends to be a lot of the
  11704            // same error.
  11705            loggedTypeFailures[error$1.message] = true;
  11706            setCurrentlyValidatingElement(element);
  11707
  11708            error('Failed %s type: %s', location, error$1.message);
  11709
  11710            setCurrentlyValidatingElement(null);
  11711          }
  11712        }
  11713      }
  11714    }
  11715  }
  11716
  11717  var valueStack = [];
  11718  var fiberStack;
  11719
  11720  {
  11721    fiberStack = [];
  11722  }
  11723
  11724  var index = -1;
  11725
  11726  function createCursor(defaultValue) {
  11727    return {
  11728      current: defaultValue
  11729    };
  11730  }
  11731
  11732  function pop(cursor, fiber) {
  11733    if (index < 0) {
  11734      {
  11735        error('Unexpected pop.');
  11736      }
  11737
  11738      return;
  11739    }
  11740
  11741    {
  11742      if (fiber !== fiberStack[index]) {
  11743        error('Unexpected Fiber popped.');
  11744      }
  11745    }
  11746
  11747    cursor.current = valueStack[index];
  11748    valueStack[index] = null;
  11749
  11750    {
  11751      fiberStack[index] = null;
  11752    }
  11753
  11754    index--;
  11755  }
  11756
  11757  function push(cursor, value, fiber) {
  11758    index++;
  11759    valueStack[index] = cursor.current;
  11760
  11761    {
  11762      fiberStack[index] = fiber;
  11763    }
  11764
  11765    cursor.current = value;
  11766  }
  11767
  11768  var warnedAboutMissingGetChildContext;
  11769
  11770  {
  11771    warnedAboutMissingGetChildContext = {};
  11772  }
  11773
  11774  var emptyContextObject = {};
  11775
  11776  {
  11777    Object.freeze(emptyContextObject);
  11778  } // A cursor to the current merged context object on the stack.
  11779
  11780
  11781  var contextStackCursor = createCursor(emptyContextObject); // A cursor to a boolean indicating whether the context has changed.
  11782
  11783  var didPerformWorkStackCursor = createCursor(false); // Keep track of the previous context object that was on the stack.
  11784  // We use this to get access to the parent context after we have already
  11785  // pushed the next context provider, and now need to merge their contexts.
  11786
  11787  var previousContext = emptyContextObject;
  11788
  11789  function getUnmaskedContext(workInProgress, Component, didPushOwnContextIfProvider) {
  11790    {
  11791      if (didPushOwnContextIfProvider && isContextProvider(Component)) {
  11792        // If the fiber is a context provider itself, when we read its context
  11793        // we may have already pushed its own child context on the stack. A context
  11794        // provider should not "see" its own child context. Therefore we read the
  11795        // previous (parent) context instead for a context provider.
  11796        return previousContext;
  11797      }
  11798
  11799      return contextStackCursor.current;
  11800    }
  11801  }
  11802
  11803  function cacheContext(workInProgress, unmaskedContext, maskedContext) {
  11804    {
  11805      var instance = workInProgress.stateNode;
  11806      instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
  11807      instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
  11808    }
  11809  }
  11810
  11811  function getMaskedContext(workInProgress, unmaskedContext) {
  11812    {
  11813      var type = workInProgress.type;
  11814      var contextTypes = type.contextTypes;
  11815
  11816      if (!contextTypes) {
  11817        return emptyContextObject;
  11818      } // Avoid recreating masked context unless unmasked context has changed.
  11819      // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
  11820      // This may trigger infinite loops if componentWillReceiveProps calls setState.
  11821
  11822
  11823      var instance = workInProgress.stateNode;
  11824
  11825      if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {
  11826        return instance.__reactInternalMemoizedMaskedChildContext;
  11827      }
  11828
  11829      var context = {};
  11830
  11831      for (var key in contextTypes) {
  11832        context[key] = unmaskedContext[key];
  11833      }
  11834
  11835      {
  11836        var name = getComponentNameFromFiber(workInProgress) || 'Unknown';
  11837        checkPropTypes(contextTypes, context, 'context', name);
  11838      } // Cache unmasked context so we can avoid recreating masked context unless necessary.
  11839      // Context is created before the class component is instantiated so check for instance.
  11840
  11841
  11842      if (instance) {
  11843        cacheContext(workInProgress, unmaskedContext, context);
  11844      }
  11845
  11846      return context;
  11847    }
  11848  }
  11849
  11850  function hasContextChanged() {
  11851    {
  11852      return didPerformWorkStackCursor.current;
  11853    }
  11854  }
  11855
  11856  function isContextProvider(type) {
  11857    {
  11858      var childContextTypes = type.childContextTypes;
  11859      return childContextTypes !== null && childContextTypes !== undefined;
  11860    }
  11861  }
  11862
  11863  function popContext(fiber) {
  11864    {
  11865      pop(didPerformWorkStackCursor, fiber);
  11866      pop(contextStackCursor, fiber);
  11867    }
  11868  }
  11869
  11870  function popTopLevelContextObject(fiber) {
  11871    {
  11872      pop(didPerformWorkStackCursor, fiber);
  11873      pop(contextStackCursor, fiber);
  11874    }
  11875  }
  11876
  11877  function pushTopLevelContextObject(fiber, context, didChange) {
  11878    {
  11879      if (contextStackCursor.current !== emptyContextObject) {
  11880        throw new Error('Unexpected context found on stack. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  11881      }
  11882
  11883      push(contextStackCursor, context, fiber);
  11884      push(didPerformWorkStackCursor, didChange, fiber);
  11885    }
  11886  }
  11887
  11888  function processChildContext(fiber, type, parentContext) {
  11889    {
  11890      var instance = fiber.stateNode;
  11891      var childContextTypes = type.childContextTypes; // TODO (bvaughn) Replace this behavior with an invariant() in the future.
  11892      // It has only been added in Fiber to match the (unintentional) behavior in Stack.
  11893
  11894      if (typeof instance.getChildContext !== 'function') {
  11895        {
  11896          var componentName = getComponentNameFromFiber(fiber) || 'Unknown';
  11897
  11898          if (!warnedAboutMissingGetChildContext[componentName]) {
  11899            warnedAboutMissingGetChildContext[componentName] = true;
  11900
  11901            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);
  11902          }
  11903        }
  11904
  11905        return parentContext;
  11906      }
  11907
  11908      var childContext = instance.getChildContext();
  11909
  11910      for (var contextKey in childContext) {
  11911        if (!(contextKey in childContextTypes)) {
  11912          throw new Error((getComponentNameFromFiber(fiber) || 'Unknown') + ".getChildContext(): key \"" + contextKey + "\" is not defined in childContextTypes.");
  11913        }
  11914      }
  11915
  11916      {
  11917        var name = getComponentNameFromFiber(fiber) || 'Unknown';
  11918        checkPropTypes(childContextTypes, childContext, 'child context', name);
  11919      }
  11920
  11921      return assign({}, parentContext, childContext);
  11922    }
  11923  }
  11924
  11925  function pushContextProvider(workInProgress) {
  11926    {
  11927      var instance = workInProgress.stateNode; // We push the context as early as possible to ensure stack integrity.
  11928      // If the instance does not exist yet, we will push null at first,
  11929      // and replace it on the stack later when invalidating the context.
  11930
  11931      var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyContextObject; // Remember the parent context so we can merge with it later.
  11932      // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
  11933
  11934      previousContext = contextStackCursor.current;
  11935      push(contextStackCursor, memoizedMergedChildContext, workInProgress);
  11936      push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);
  11937      return true;
  11938    }
  11939  }
  11940
  11941  function invalidateContextProvider(workInProgress, type, didChange) {
  11942    {
  11943      var instance = workInProgress.stateNode;
  11944
  11945      if (!instance) {
  11946        throw new Error('Expected to have an instance by this point. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  11947      }
  11948
  11949      if (didChange) {
  11950        // Merge parent and own context.
  11951        // Skip this if we're not updating due to sCU.
  11952        // This avoids unnecessarily recomputing memoized values.
  11953        var mergedContext = processChildContext(workInProgress, type, previousContext);
  11954        instance.__reactInternalMemoizedMergedChildContext = mergedContext; // Replace the old (or empty) context with the new one.
  11955        // It is important to unwind the context in the reverse order.
  11956
  11957        pop(didPerformWorkStackCursor, workInProgress);
  11958        pop(contextStackCursor, workInProgress); // Now push the new context and mark that it has changed.
  11959
  11960        push(contextStackCursor, mergedContext, workInProgress);
  11961        push(didPerformWorkStackCursor, didChange, workInProgress);
  11962      } else {
  11963        pop(didPerformWorkStackCursor, workInProgress);
  11964        push(didPerformWorkStackCursor, didChange, workInProgress);
  11965      }
  11966    }
  11967  }
  11968
  11969  function findCurrentUnmaskedContext(fiber) {
  11970    {
  11971      // Currently this is only used with renderSubtreeIntoContainer; not sure if it
  11972      // makes sense elsewhere
  11973      if (!isFiberMounted(fiber) || fiber.tag !== ClassComponent) {
  11974        throw new Error('Expected subtree parent to be a mounted class component. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  11975      }
  11976
  11977      var node = fiber;
  11978
  11979      do {
  11980        switch (node.tag) {
  11981          case HostRoot:
  11982            return node.stateNode.context;
  11983
  11984          case ClassComponent:
  11985            {
  11986              var Component = node.type;
  11987
  11988              if (isContextProvider(Component)) {
  11989                return node.stateNode.__reactInternalMemoizedMergedChildContext;
  11990              }
  11991
  11992              break;
  11993            }
  11994        }
  11995
  11996        node = node.return;
  11997      } while (node !== null);
  11998
  11999      throw new Error('Found unexpected detached subtree parent. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  12000    }
  12001  }
  12002
  12003  var LegacyRoot = 0;
  12004  var ConcurrentRoot = 1;
  12005
  12006  var syncQueue = null;
  12007  var includesLegacySyncCallbacks = false;
  12008  var isFlushingSyncQueue = false;
  12009  function scheduleSyncCallback(callback) {
  12010    // Push this callback into an internal queue. We'll flush these either in
  12011    // the next tick, or earlier if something calls `flushSyncCallbackQueue`.
  12012    if (syncQueue === null) {
  12013      syncQueue = [callback];
  12014    } else {
  12015      // Push onto existing queue. Don't need to schedule a callback because
  12016      // we already scheduled one when we created the queue.
  12017      syncQueue.push(callback);
  12018    }
  12019  }
  12020  function scheduleLegacySyncCallback(callback) {
  12021    includesLegacySyncCallbacks = true;
  12022    scheduleSyncCallback(callback);
  12023  }
  12024  function flushSyncCallbacksOnlyInLegacyMode() {
  12025    // Only flushes the queue if there's a legacy sync callback scheduled.
  12026    // TODO: There's only a single type of callback: performSyncOnWorkOnRoot. So
  12027    // it might make more sense for the queue to be a list of roots instead of a
  12028    // list of generic callbacks. Then we can have two: one for legacy roots, one
  12029    // for concurrent roots. And this method would only flush the legacy ones.
  12030    if (includesLegacySyncCallbacks) {
  12031      flushSyncCallbacks();
  12032    }
  12033  }
  12034  function flushSyncCallbacks() {
  12035    if (!isFlushingSyncQueue && syncQueue !== null) {
  12036      // Prevent re-entrance.
  12037      isFlushingSyncQueue = true;
  12038      var i = 0;
  12039      var previousUpdatePriority = getCurrentUpdatePriority();
  12040
  12041      try {
  12042        var isSync = true;
  12043        var queue = syncQueue; // TODO: Is this necessary anymore? The only user code that runs in this
  12044        // queue is in the render or commit phases.
  12045
  12046        setCurrentUpdatePriority(DiscreteEventPriority);
  12047
  12048        for (; i < queue.length; i++) {
  12049          var callback = queue[i];
  12050
  12051          do {
  12052            callback = callback(isSync);
  12053          } while (callback !== null);
  12054        }
  12055
  12056        syncQueue = null;
  12057        includesLegacySyncCallbacks = false;
  12058      } catch (error) {
  12059        // If something throws, leave the remaining callbacks on the queue.
  12060        if (syncQueue !== null) {
  12061          syncQueue = syncQueue.slice(i + 1);
  12062        } // Resume flushing in the next tick
  12063
  12064
  12065        scheduleCallback(ImmediatePriority, flushSyncCallbacks);
  12066        throw error;
  12067      } finally {
  12068        setCurrentUpdatePriority(previousUpdatePriority);
  12069        isFlushingSyncQueue = false;
  12070      }
  12071    }
  12072
  12073    return null;
  12074  }
  12075
  12076  // TODO: Use the unified fiber stack module instead of this local one?
  12077  // Intentionally not using it yet to derisk the initial implementation, because
  12078  // the way we push/pop these values is a bit unusual. If there's a mistake, I'd
  12079  // rather the ids be wrong than crash the whole reconciler.
  12080  var forkStack = [];
  12081  var forkStackIndex = 0;
  12082  var treeForkProvider = null;
  12083  var treeForkCount = 0;
  12084  var idStack = [];
  12085  var idStackIndex = 0;
  12086  var treeContextProvider = null;
  12087  var treeContextId = 1;
  12088  var treeContextOverflow = '';
  12089  function isForkedChild(workInProgress) {
  12090    warnIfNotHydrating();
  12091    return (workInProgress.flags & Forked) !== NoFlags;
  12092  }
  12093  function getForksAtLevel(workInProgress) {
  12094    warnIfNotHydrating();
  12095    return treeForkCount;
  12096  }
  12097  function getTreeId() {
  12098    var overflow = treeContextOverflow;
  12099    var idWithLeadingBit = treeContextId;
  12100    var id = idWithLeadingBit & ~getLeadingBit(idWithLeadingBit);
  12101    return id.toString(32) + overflow;
  12102  }
  12103  function pushTreeFork(workInProgress, totalChildren) {
  12104    // This is called right after we reconcile an array (or iterator) of child
  12105    // fibers, because that's the only place where we know how many children in
  12106    // the whole set without doing extra work later, or storing addtional
  12107    // information on the fiber.
  12108    //
  12109    // That's why this function is separate from pushTreeId — it's called during
  12110    // the render phase of the fork parent, not the child, which is where we push
  12111    // the other context values.
  12112    //
  12113    // In the Fizz implementation this is much simpler because the child is
  12114    // rendered in the same callstack as the parent.
  12115    //
  12116    // It might be better to just add a `forks` field to the Fiber type. It would
  12117    // make this module simpler.
  12118    warnIfNotHydrating();
  12119    forkStack[forkStackIndex++] = treeForkCount;
  12120    forkStack[forkStackIndex++] = treeForkProvider;
  12121    treeForkProvider = workInProgress;
  12122    treeForkCount = totalChildren;
  12123  }
  12124  function pushTreeId(workInProgress, totalChildren, index) {
  12125    warnIfNotHydrating();
  12126    idStack[idStackIndex++] = treeContextId;
  12127    idStack[idStackIndex++] = treeContextOverflow;
  12128    idStack[idStackIndex++] = treeContextProvider;
  12129    treeContextProvider = workInProgress;
  12130    var baseIdWithLeadingBit = treeContextId;
  12131    var baseOverflow = treeContextOverflow; // The leftmost 1 marks the end of the sequence, non-inclusive. It's not part
  12132    // of the id; we use it to account for leading 0s.
  12133
  12134    var baseLength = getBitLength(baseIdWithLeadingBit) - 1;
  12135    var baseId = baseIdWithLeadingBit & ~(1 << baseLength);
  12136    var slot = index + 1;
  12137    var length = getBitLength(totalChildren) + baseLength; // 30 is the max length we can store without overflowing, taking into
  12138    // consideration the leading 1 we use to mark the end of the sequence.
  12139
  12140    if (length > 30) {
  12141      // We overflowed the bitwise-safe range. Fall back to slower algorithm.
  12142      // This branch assumes the length of the base id is greater than 5; it won't
  12143      // work for smaller ids, because you need 5 bits per character.
  12144      //
  12145      // We encode the id in multiple steps: first the base id, then the
  12146      // remaining digits.
  12147      //
  12148      // Each 5 bit sequence corresponds to a single base 32 character. So for
  12149      // example, if the current id is 23 bits long, we can convert 20 of those
  12150      // bits into a string of 4 characters, with 3 bits left over.
  12151      //
  12152      // First calculate how many bits in the base id represent a complete
  12153      // sequence of characters.
  12154      var numberOfOverflowBits = baseLength - baseLength % 5; // Then create a bitmask that selects only those bits.
  12155
  12156      var newOverflowBits = (1 << numberOfOverflowBits) - 1; // Select the bits, and convert them to a base 32 string.
  12157
  12158      var newOverflow = (baseId & newOverflowBits).toString(32); // Now we can remove those bits from the base id.
  12159
  12160      var restOfBaseId = baseId >> numberOfOverflowBits;
  12161      var restOfBaseLength = baseLength - numberOfOverflowBits; // Finally, encode the rest of the bits using the normal algorithm. Because
  12162      // we made more room, this time it won't overflow.
  12163
  12164      var restOfLength = getBitLength(totalChildren) + restOfBaseLength;
  12165      var restOfNewBits = slot << restOfBaseLength;
  12166      var id = restOfNewBits | restOfBaseId;
  12167      var overflow = newOverflow + baseOverflow;
  12168      treeContextId = 1 << restOfLength | id;
  12169      treeContextOverflow = overflow;
  12170    } else {
  12171      // Normal path
  12172      var newBits = slot << baseLength;
  12173
  12174      var _id = newBits | baseId;
  12175
  12176      var _overflow = baseOverflow;
  12177      treeContextId = 1 << length | _id;
  12178      treeContextOverflow = _overflow;
  12179    }
  12180  }
  12181  function pushMaterializedTreeId(workInProgress) {
  12182    warnIfNotHydrating(); // This component materialized an id. This will affect any ids that appear
  12183    // in its children.
  12184
  12185    var returnFiber = workInProgress.return;
  12186
  12187    if (returnFiber !== null) {
  12188      var numberOfForks = 1;
  12189      var slotIndex = 0;
  12190      pushTreeFork(workInProgress, numberOfForks);
  12191      pushTreeId(workInProgress, numberOfForks, slotIndex);
  12192    }
  12193  }
  12194
  12195  function getBitLength(number) {
  12196    return 32 - clz32(number);
  12197  }
  12198
  12199  function getLeadingBit(id) {
  12200    return 1 << getBitLength(id) - 1;
  12201  }
  12202
  12203  function popTreeContext(workInProgress) {
  12204    // Restore the previous values.
  12205    // This is a bit more complicated than other context-like modules in Fiber
  12206    // because the same Fiber may appear on the stack multiple times and for
  12207    // different reasons. We have to keep popping until the work-in-progress is
  12208    // no longer at the top of the stack.
  12209    while (workInProgress === treeForkProvider) {
  12210      treeForkProvider = forkStack[--forkStackIndex];
  12211      forkStack[forkStackIndex] = null;
  12212      treeForkCount = forkStack[--forkStackIndex];
  12213      forkStack[forkStackIndex] = null;
  12214    }
  12215
  12216    while (workInProgress === treeContextProvider) {
  12217      treeContextProvider = idStack[--idStackIndex];
  12218      idStack[idStackIndex] = null;
  12219      treeContextOverflow = idStack[--idStackIndex];
  12220      idStack[idStackIndex] = null;
  12221      treeContextId = idStack[--idStackIndex];
  12222      idStack[idStackIndex] = null;
  12223    }
  12224  }
  12225  function getSuspendedTreeContext() {
  12226    warnIfNotHydrating();
  12227
  12228    if (treeContextProvider !== null) {
  12229      return {
  12230        id: treeContextId,
  12231        overflow: treeContextOverflow
  12232      };
  12233    } else {
  12234      return null;
  12235    }
  12236  }
  12237  function restoreSuspendedTreeContext(workInProgress, suspendedContext) {
  12238    warnIfNotHydrating();
  12239    idStack[idStackIndex++] = treeContextId;
  12240    idStack[idStackIndex++] = treeContextOverflow;
  12241    idStack[idStackIndex++] = treeContextProvider;
  12242    treeContextId = suspendedContext.id;
  12243    treeContextOverflow = suspendedContext.overflow;
  12244    treeContextProvider = workInProgress;
  12245  }
  12246
  12247  function warnIfNotHydrating() {
  12248    {
  12249      if (!getIsHydrating()) {
  12250        error('Expected to be hydrating. This is a bug in React. Please file ' + 'an issue.');
  12251      }
  12252    }
  12253  }
  12254
  12255  // This may have been an insertion or a hydration.
  12256
  12257  var hydrationParentFiber = null;
  12258  var nextHydratableInstance = null;
  12259  var isHydrating = false; // This flag allows for warning supression when we expect there to be mismatches
  12260  // due to earlier mismatches or a suspended fiber.
  12261
  12262  var didSuspendOrErrorDEV = false; // Hydration errors that were thrown inside this boundary
  12263
  12264  var hydrationErrors = null;
  12265
  12266  function warnIfHydrating() {
  12267    {
  12268      if (isHydrating) {
  12269        error('We should not be hydrating here. This is a bug in React. Please file a bug.');
  12270      }
  12271    }
  12272  }
  12273
  12274  function markDidThrowWhileHydratingDEV() {
  12275    {
  12276      didSuspendOrErrorDEV = true;
  12277    }
  12278  }
  12279  function didSuspendOrErrorWhileHydratingDEV() {
  12280    {
  12281      return didSuspendOrErrorDEV;
  12282    }
  12283  }
  12284
  12285  function enterHydrationState(fiber) {
  12286
  12287    var parentInstance = fiber.stateNode.containerInfo;
  12288    nextHydratableInstance = getFirstHydratableChildWithinContainer(parentInstance);
  12289    hydrationParentFiber = fiber;
  12290    isHydrating = true;
  12291    hydrationErrors = null;
  12292    didSuspendOrErrorDEV = false;
  12293    return true;
  12294  }
  12295
  12296  function reenterHydrationStateFromDehydratedSuspenseInstance(fiber, suspenseInstance, treeContext) {
  12297
  12298    nextHydratableInstance = getFirstHydratableChildWithinSuspenseInstance(suspenseInstance);
  12299    hydrationParentFiber = fiber;
  12300    isHydrating = true;
  12301    hydrationErrors = null;
  12302    didSuspendOrErrorDEV = false;
  12303
  12304    if (treeContext !== null) {
  12305      restoreSuspendedTreeContext(fiber, treeContext);
  12306    }
  12307
  12308    return true;
  12309  }
  12310
  12311  function warnUnhydratedInstance(returnFiber, instance) {
  12312    {
  12313      switch (returnFiber.tag) {
  12314        case HostRoot:
  12315          {
  12316            didNotHydrateInstanceWithinContainer(returnFiber.stateNode.containerInfo, instance);
  12317            break;
  12318          }
  12319
  12320        case HostComponent:
  12321          {
  12322            var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
  12323            didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance, // TODO: Delete this argument when we remove the legacy root API.
  12324            isConcurrentMode);
  12325            break;
  12326          }
  12327
  12328        case SuspenseComponent:
  12329          {
  12330            var suspenseState = returnFiber.memoizedState;
  12331            if (suspenseState.dehydrated !== null) didNotHydrateInstanceWithinSuspenseInstance(suspenseState.dehydrated, instance);
  12332            break;
  12333          }
  12334      }
  12335    }
  12336  }
  12337
  12338  function deleteHydratableInstance(returnFiber, instance) {
  12339    warnUnhydratedInstance(returnFiber, instance);
  12340    var childToDelete = createFiberFromHostInstanceForDeletion();
  12341    childToDelete.stateNode = instance;
  12342    childToDelete.return = returnFiber;
  12343    var deletions = returnFiber.deletions;
  12344
  12345    if (deletions === null) {
  12346      returnFiber.deletions = [childToDelete];
  12347      returnFiber.flags |= ChildDeletion;
  12348    } else {
  12349      deletions.push(childToDelete);
  12350    }
  12351  }
  12352
  12353  function warnNonhydratedInstance(returnFiber, fiber) {
  12354    {
  12355      if (didSuspendOrErrorDEV) {
  12356        // Inside a boundary that already suspended. We're currently rendering the
  12357        // siblings of a suspended node. The mismatch may be due to the missing
  12358        // data, so it's probably a false positive.
  12359        return;
  12360      }
  12361
  12362      switch (returnFiber.tag) {
  12363        case HostRoot:
  12364          {
  12365            var parentContainer = returnFiber.stateNode.containerInfo;
  12366
  12367            switch (fiber.tag) {
  12368              case HostComponent:
  12369                var type = fiber.type;
  12370                var props = fiber.pendingProps;
  12371                didNotFindHydratableInstanceWithinContainer(parentContainer, type);
  12372                break;
  12373
  12374              case HostText:
  12375                var text = fiber.pendingProps;
  12376                didNotFindHydratableTextInstanceWithinContainer(parentContainer, text);
  12377                break;
  12378            }
  12379
  12380            break;
  12381          }
  12382
  12383        case HostComponent:
  12384          {
  12385            var parentType = returnFiber.type;
  12386            var parentProps = returnFiber.memoizedProps;
  12387            var parentInstance = returnFiber.stateNode;
  12388
  12389            switch (fiber.tag) {
  12390              case HostComponent:
  12391                {
  12392                  var _type = fiber.type;
  12393                  var _props = fiber.pendingProps;
  12394                  var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
  12395                  didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props, // TODO: Delete this argument when we remove the legacy root API.
  12396                  isConcurrentMode);
  12397                  break;
  12398                }
  12399
  12400              case HostText:
  12401                {
  12402                  var _text = fiber.pendingProps;
  12403
  12404                  var _isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
  12405
  12406                  didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text, // TODO: Delete this argument when we remove the legacy root API.
  12407                  _isConcurrentMode);
  12408                  break;
  12409                }
  12410            }
  12411
  12412            break;
  12413          }
  12414
  12415        case SuspenseComponent:
  12416          {
  12417            var suspenseState = returnFiber.memoizedState;
  12418            var _parentInstance = suspenseState.dehydrated;
  12419            if (_parentInstance !== null) switch (fiber.tag) {
  12420              case HostComponent:
  12421                var _type2 = fiber.type;
  12422                var _props2 = fiber.pendingProps;
  12423                didNotFindHydratableInstanceWithinSuspenseInstance(_parentInstance, _type2);
  12424                break;
  12425
  12426              case HostText:
  12427                var _text2 = fiber.pendingProps;
  12428                didNotFindHydratableTextInstanceWithinSuspenseInstance(_parentInstance, _text2);
  12429                break;
  12430            }
  12431            break;
  12432          }
  12433
  12434        default:
  12435          return;
  12436      }
  12437    }
  12438  }
  12439
  12440  function insertNonHydratedInstance(returnFiber, fiber) {
  12441    fiber.flags = fiber.flags & ~Hydrating | Placement;
  12442    warnNonhydratedInstance(returnFiber, fiber);
  12443  }
  12444
  12445  function tryHydrate(fiber, nextInstance) {
  12446    switch (fiber.tag) {
  12447      case HostComponent:
  12448        {
  12449          var type = fiber.type;
  12450          var props = fiber.pendingProps;
  12451          var instance = canHydrateInstance(nextInstance, type);
  12452
  12453          if (instance !== null) {
  12454            fiber.stateNode = instance;
  12455            hydrationParentFiber = fiber;
  12456            nextHydratableInstance = getFirstHydratableChild(instance);
  12457            return true;
  12458          }
  12459
  12460          return false;
  12461        }
  12462
  12463      case HostText:
  12464        {
  12465          var text = fiber.pendingProps;
  12466          var textInstance = canHydrateTextInstance(nextInstance, text);
  12467
  12468          if (textInstance !== null) {
  12469            fiber.stateNode = textInstance;
  12470            hydrationParentFiber = fiber; // Text Instances don't have children so there's nothing to hydrate.
  12471
  12472            nextHydratableInstance = null;
  12473            return true;
  12474          }
  12475
  12476          return false;
  12477        }
  12478
  12479      case SuspenseComponent:
  12480        {
  12481          var suspenseInstance = canHydrateSuspenseInstance(nextInstance);
  12482
  12483          if (suspenseInstance !== null) {
  12484            var suspenseState = {
  12485              dehydrated: suspenseInstance,
  12486              treeContext: getSuspendedTreeContext(),
  12487              retryLane: OffscreenLane
  12488            };
  12489            fiber.memoizedState = suspenseState; // Store the dehydrated fragment as a child fiber.
  12490            // This simplifies the code for getHostSibling and deleting nodes,
  12491            // since it doesn't have to consider all Suspense boundaries and
  12492            // check if they're dehydrated ones or not.
  12493
  12494            var dehydratedFragment = createFiberFromDehydratedFragment(suspenseInstance);
  12495            dehydratedFragment.return = fiber;
  12496            fiber.child = dehydratedFragment;
  12497            hydrationParentFiber = fiber; // While a Suspense Instance does have children, we won't step into
  12498            // it during the first pass. Instead, we'll reenter it later.
  12499
  12500            nextHydratableInstance = null;
  12501            return true;
  12502          }
  12503
  12504          return false;
  12505        }
  12506
  12507      default:
  12508        return false;
  12509    }
  12510  }
  12511
  12512  function shouldClientRenderOnMismatch(fiber) {
  12513    return (fiber.mode & ConcurrentMode) !== NoMode && (fiber.flags & DidCapture) === NoFlags;
  12514  }
  12515
  12516  function throwOnHydrationMismatch(fiber) {
  12517    throw new Error('Hydration failed because the initial UI does not match what was ' + 'rendered on the server.');
  12518  }
  12519
  12520  function tryToClaimNextHydratableInstance(fiber) {
  12521    if (!isHydrating) {
  12522      return;
  12523    }
  12524
  12525    var nextInstance = nextHydratableInstance;
  12526
  12527    if (!nextInstance) {
  12528      if (shouldClientRenderOnMismatch(fiber)) {
  12529        warnNonhydratedInstance(hydrationParentFiber, fiber);
  12530        throwOnHydrationMismatch();
  12531      } // Nothing to hydrate. Make it an insertion.
  12532
  12533
  12534      insertNonHydratedInstance(hydrationParentFiber, fiber);
  12535      isHydrating = false;
  12536      hydrationParentFiber = fiber;
  12537      return;
  12538    }
  12539
  12540    var firstAttemptedInstance = nextInstance;
  12541
  12542    if (!tryHydrate(fiber, nextInstance)) {
  12543      if (shouldClientRenderOnMismatch(fiber)) {
  12544        warnNonhydratedInstance(hydrationParentFiber, fiber);
  12545        throwOnHydrationMismatch();
  12546      } // If we can't hydrate this instance let's try the next one.
  12547      // We use this as a heuristic. It's based on intuition and not data so it
  12548      // might be flawed or unnecessary.
  12549
  12550
  12551      nextInstance = getNextHydratableSibling(firstAttemptedInstance);
  12552      var prevHydrationParentFiber = hydrationParentFiber;
  12553
  12554      if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
  12555        // Nothing to hydrate. Make it an insertion.
  12556        insertNonHydratedInstance(hydrationParentFiber, fiber);
  12557        isHydrating = false;
  12558        hydrationParentFiber = fiber;
  12559        return;
  12560      } // We matched the next one, we'll now assume that the first one was
  12561      // superfluous and we'll delete it. Since we can't eagerly delete it
  12562      // we'll have to schedule a deletion. To do that, this node needs a dummy
  12563      // fiber associated with it.
  12564
  12565
  12566      deleteHydratableInstance(prevHydrationParentFiber, firstAttemptedInstance);
  12567    }
  12568  }
  12569
  12570  function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {
  12571
  12572    var instance = fiber.stateNode;
  12573    var shouldWarnIfMismatchDev = !didSuspendOrErrorDEV;
  12574    var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber, shouldWarnIfMismatchDev); // TODO: Type this specific to this type of component.
  12575
  12576    fiber.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
  12577    // is a new ref we mark this as an update.
  12578
  12579    if (updatePayload !== null) {
  12580      return true;
  12581    }
  12582
  12583    return false;
  12584  }
  12585
  12586  function prepareToHydrateHostTextInstance(fiber) {
  12587
  12588    var textInstance = fiber.stateNode;
  12589    var textContent = fiber.memoizedProps;
  12590    var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);
  12591
  12592    if (shouldUpdate) {
  12593      // We assume that prepareToHydrateHostTextInstance is called in a context where the
  12594      // hydration parent is the parent host component of this host text.
  12595      var returnFiber = hydrationParentFiber;
  12596
  12597      if (returnFiber !== null) {
  12598        switch (returnFiber.tag) {
  12599          case HostRoot:
  12600            {
  12601              var parentContainer = returnFiber.stateNode.containerInfo;
  12602              var isConcurrentMode = (returnFiber.mode & ConcurrentMode) !== NoMode;
  12603              didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
  12604              isConcurrentMode);
  12605              break;
  12606            }
  12607
  12608          case HostComponent:
  12609            {
  12610              var parentType = returnFiber.type;
  12611              var parentProps = returnFiber.memoizedProps;
  12612              var parentInstance = returnFiber.stateNode;
  12613
  12614              var _isConcurrentMode2 = (returnFiber.mode & ConcurrentMode) !== NoMode;
  12615
  12616              didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent, // TODO: Delete this argument when we remove the legacy root API.
  12617              _isConcurrentMode2);
  12618              break;
  12619            }
  12620        }
  12621      }
  12622    }
  12623
  12624    return shouldUpdate;
  12625  }
  12626
  12627  function prepareToHydrateHostSuspenseInstance(fiber) {
  12628
  12629    var suspenseState = fiber.memoizedState;
  12630    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
  12631
  12632    if (!suspenseInstance) {
  12633      throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  12634    }
  12635
  12636    hydrateSuspenseInstance(suspenseInstance, fiber);
  12637  }
  12638
  12639  function skipPastDehydratedSuspenseInstance(fiber) {
  12640
  12641    var suspenseState = fiber.memoizedState;
  12642    var suspenseInstance = suspenseState !== null ? suspenseState.dehydrated : null;
  12643
  12644    if (!suspenseInstance) {
  12645      throw new Error('Expected to have a hydrated suspense instance. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  12646    }
  12647
  12648    return getNextHydratableInstanceAfterSuspenseInstance(suspenseInstance);
  12649  }
  12650
  12651  function popToNextHostParent(fiber) {
  12652    var parent = fiber.return;
  12653
  12654    while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot && parent.tag !== SuspenseComponent) {
  12655      parent = parent.return;
  12656    }
  12657
  12658    hydrationParentFiber = parent;
  12659  }
  12660
  12661  function popHydrationState(fiber) {
  12662
  12663    if (fiber !== hydrationParentFiber) {
  12664      // We're deeper than the current hydration context, inside an inserted
  12665      // tree.
  12666      return false;
  12667    }
  12668
  12669    if (!isHydrating) {
  12670      // If we're not currently hydrating but we're in a hydration context, then
  12671      // we were an insertion and now need to pop up reenter hydration of our
  12672      // siblings.
  12673      popToNextHostParent(fiber);
  12674      isHydrating = true;
  12675      return false;
  12676    } // If we have any remaining hydratable nodes, we need to delete them now.
  12677    // We only do this deeper than head and body since they tend to have random
  12678    // other nodes in them. We also ignore components with pure text content in
  12679    // side of them. We also don't delete anything inside the root container.
  12680
  12681
  12682    if (fiber.tag !== HostRoot && (fiber.tag !== HostComponent || shouldDeleteUnhydratedTailInstances(fiber.type) && !shouldSetTextContent(fiber.type, fiber.memoizedProps))) {
  12683      var nextInstance = nextHydratableInstance;
  12684
  12685      if (nextInstance) {
  12686        if (shouldClientRenderOnMismatch(fiber)) {
  12687          warnIfUnhydratedTailNodes(fiber);
  12688          throwOnHydrationMismatch();
  12689        } else {
  12690          while (nextInstance) {
  12691            deleteHydratableInstance(fiber, nextInstance);
  12692            nextInstance = getNextHydratableSibling(nextInstance);
  12693          }
  12694        }
  12695      }
  12696    }
  12697
  12698    popToNextHostParent(fiber);
  12699
  12700    if (fiber.tag === SuspenseComponent) {
  12701      nextHydratableInstance = skipPastDehydratedSuspenseInstance(fiber);
  12702    } else {
  12703      nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;
  12704    }
  12705
  12706    return true;
  12707  }
  12708
  12709  function hasUnhydratedTailNodes() {
  12710    return isHydrating && nextHydratableInstance !== null;
  12711  }
  12712
  12713  function warnIfUnhydratedTailNodes(fiber) {
  12714    var nextInstance = nextHydratableInstance;
  12715
  12716    while (nextInstance) {
  12717      warnUnhydratedInstance(fiber, nextInstance);
  12718      nextInstance = getNextHydratableSibling(nextInstance);
  12719    }
  12720  }
  12721
  12722  function resetHydrationState() {
  12723
  12724    hydrationParentFiber = null;
  12725    nextHydratableInstance = null;
  12726    isHydrating = false;
  12727    didSuspendOrErrorDEV = false;
  12728  }
  12729
  12730  function upgradeHydrationErrorsToRecoverable() {
  12731    if (hydrationErrors !== null) {
  12732      // Successfully completed a forced client render. The errors that occurred
  12733      // during the hydration attempt are now recovered. We will log them in
  12734      // commit phase, once the entire tree has finished.
  12735      queueRecoverableErrors(hydrationErrors);
  12736      hydrationErrors = null;
  12737    }
  12738  }
  12739
  12740  function getIsHydrating() {
  12741    return isHydrating;
  12742  }
  12743
  12744  function queueHydrationError(error) {
  12745    if (hydrationErrors === null) {
  12746      hydrationErrors = [error];
  12747    } else {
  12748      hydrationErrors.push(error);
  12749    }
  12750  }
  12751
  12752  var ReactCurrentBatchConfig$1 = ReactSharedInternals.ReactCurrentBatchConfig;
  12753  var NoTransition = null;
  12754  function requestCurrentTransition() {
  12755    return ReactCurrentBatchConfig$1.transition;
  12756  }
  12757
  12758  var ReactStrictModeWarnings = {
  12759    recordUnsafeLifecycleWarnings: function (fiber, instance) {},
  12760    flushPendingUnsafeLifecycleWarnings: function () {},
  12761    recordLegacyContextWarning: function (fiber, instance) {},
  12762    flushLegacyContextWarning: function () {},
  12763    discardPendingWarnings: function () {}
  12764  };
  12765
  12766  {
  12767    var findStrictRoot = function (fiber) {
  12768      var maybeStrictRoot = null;
  12769      var node = fiber;
  12770
  12771      while (node !== null) {
  12772        if (node.mode & StrictLegacyMode) {
  12773          maybeStrictRoot = node;
  12774        }
  12775
  12776        node = node.return;
  12777      }
  12778
  12779      return maybeStrictRoot;
  12780    };
  12781
  12782    var setToSortedString = function (set) {
  12783      var array = [];
  12784      set.forEach(function (value) {
  12785        array.push(value);
  12786      });
  12787      return array.sort().join(', ');
  12788    };
  12789
  12790    var pendingComponentWillMountWarnings = [];
  12791    var pendingUNSAFE_ComponentWillMountWarnings = [];
  12792    var pendingComponentWillReceivePropsWarnings = [];
  12793    var pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
  12794    var pendingComponentWillUpdateWarnings = [];
  12795    var pendingUNSAFE_ComponentWillUpdateWarnings = []; // Tracks components we have already warned about.
  12796
  12797    var didWarnAboutUnsafeLifecycles = new Set();
  12798
  12799    ReactStrictModeWarnings.recordUnsafeLifecycleWarnings = function (fiber, instance) {
  12800      // Dedupe strategy: Warn once per component.
  12801      if (didWarnAboutUnsafeLifecycles.has(fiber.type)) {
  12802        return;
  12803      }
  12804
  12805      if (typeof instance.componentWillMount === 'function' && // Don't warn about react-lifecycles-compat polyfilled components.
  12806      instance.componentWillMount.__suppressDeprecationWarning !== true) {
  12807        pendingComponentWillMountWarnings.push(fiber);
  12808      }
  12809
  12810      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillMount === 'function') {
  12811        pendingUNSAFE_ComponentWillMountWarnings.push(fiber);
  12812      }
  12813
  12814      if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
  12815        pendingComponentWillReceivePropsWarnings.push(fiber);
  12816      }
  12817
  12818      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
  12819        pendingUNSAFE_ComponentWillReceivePropsWarnings.push(fiber);
  12820      }
  12821
  12822      if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
  12823        pendingComponentWillUpdateWarnings.push(fiber);
  12824      }
  12825
  12826      if (fiber.mode & StrictLegacyMode && typeof instance.UNSAFE_componentWillUpdate === 'function') {
  12827        pendingUNSAFE_ComponentWillUpdateWarnings.push(fiber);
  12828      }
  12829    };
  12830
  12831    ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings = function () {
  12832      // We do an initial pass to gather component names
  12833      var componentWillMountUniqueNames = new Set();
  12834
  12835      if (pendingComponentWillMountWarnings.length > 0) {
  12836        pendingComponentWillMountWarnings.forEach(function (fiber) {
  12837          componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12838          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12839        });
  12840        pendingComponentWillMountWarnings = [];
  12841      }
  12842
  12843      var UNSAFE_componentWillMountUniqueNames = new Set();
  12844
  12845      if (pendingUNSAFE_ComponentWillMountWarnings.length > 0) {
  12846        pendingUNSAFE_ComponentWillMountWarnings.forEach(function (fiber) {
  12847          UNSAFE_componentWillMountUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12848          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12849        });
  12850        pendingUNSAFE_ComponentWillMountWarnings = [];
  12851      }
  12852
  12853      var componentWillReceivePropsUniqueNames = new Set();
  12854
  12855      if (pendingComponentWillReceivePropsWarnings.length > 0) {
  12856        pendingComponentWillReceivePropsWarnings.forEach(function (fiber) {
  12857          componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12858          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12859        });
  12860        pendingComponentWillReceivePropsWarnings = [];
  12861      }
  12862
  12863      var UNSAFE_componentWillReceivePropsUniqueNames = new Set();
  12864
  12865      if (pendingUNSAFE_ComponentWillReceivePropsWarnings.length > 0) {
  12866        pendingUNSAFE_ComponentWillReceivePropsWarnings.forEach(function (fiber) {
  12867          UNSAFE_componentWillReceivePropsUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12868          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12869        });
  12870        pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
  12871      }
  12872
  12873      var componentWillUpdateUniqueNames = new Set();
  12874
  12875      if (pendingComponentWillUpdateWarnings.length > 0) {
  12876        pendingComponentWillUpdateWarnings.forEach(function (fiber) {
  12877          componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12878          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12879        });
  12880        pendingComponentWillUpdateWarnings = [];
  12881      }
  12882
  12883      var UNSAFE_componentWillUpdateUniqueNames = new Set();
  12884
  12885      if (pendingUNSAFE_ComponentWillUpdateWarnings.length > 0) {
  12886        pendingUNSAFE_ComponentWillUpdateWarnings.forEach(function (fiber) {
  12887          UNSAFE_componentWillUpdateUniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12888          didWarnAboutUnsafeLifecycles.add(fiber.type);
  12889        });
  12890        pendingUNSAFE_ComponentWillUpdateWarnings = [];
  12891      } // Finally, we flush all the warnings
  12892      // UNSAFE_ ones before the deprecated ones, since they'll be 'louder'
  12893
  12894
  12895      if (UNSAFE_componentWillMountUniqueNames.size > 0) {
  12896        var sortedNames = setToSortedString(UNSAFE_componentWillMountUniqueNames);
  12897
  12898        error('Using UNSAFE_componentWillMount in strict mode is not recommended and may indicate bugs in your code. ' + 'See https://reactjs.org/link/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);
  12899      }
  12900
  12901      if (UNSAFE_componentWillReceivePropsUniqueNames.size > 0) {
  12902        var _sortedNames = setToSortedString(UNSAFE_componentWillReceivePropsUniqueNames);
  12903
  12904        error('Using UNSAFE_componentWillReceiveProps in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/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://reactjs.org/link/derived-state\n' + '\nPlease update the following components: %s', _sortedNames);
  12905      }
  12906
  12907      if (UNSAFE_componentWillUpdateUniqueNames.size > 0) {
  12908        var _sortedNames2 = setToSortedString(UNSAFE_componentWillUpdateUniqueNames);
  12909
  12910        error('Using UNSAFE_componentWillUpdate in strict mode is not recommended ' + 'and may indicate bugs in your code. ' + 'See https://reactjs.org/link/unsafe-component-lifecycles for details.\n\n' + '* Move data fetching code or side effects to componentDidUpdate.\n' + '\nPlease update the following components: %s', _sortedNames2);
  12911      }
  12912
  12913      if (componentWillMountUniqueNames.size > 0) {
  12914        var _sortedNames3 = setToSortedString(componentWillMountUniqueNames);
  12915
  12916        warn('componentWillMount has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/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 18.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);
  12917      }
  12918
  12919      if (componentWillReceivePropsUniqueNames.size > 0) {
  12920        var _sortedNames4 = setToSortedString(componentWillReceivePropsUniqueNames);
  12921
  12922        warn('componentWillReceiveProps has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/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://reactjs.org/link/derived-state\n' + '* Rename componentWillReceiveProps to UNSAFE_componentWillReceiveProps to suppress ' + 'this warning in non-strict mode. In React 18.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);
  12923      }
  12924
  12925      if (componentWillUpdateUniqueNames.size > 0) {
  12926        var _sortedNames5 = setToSortedString(componentWillUpdateUniqueNames);
  12927
  12928        warn('componentWillUpdate has been renamed, and is not recommended for use. ' + 'See https://reactjs.org/link/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 18.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);
  12929      }
  12930    };
  12931
  12932    var pendingLegacyContextWarning = new Map(); // Tracks components we have already warned about.
  12933
  12934    var didWarnAboutLegacyContext = new Set();
  12935
  12936    ReactStrictModeWarnings.recordLegacyContextWarning = function (fiber, instance) {
  12937      var strictRoot = findStrictRoot(fiber);
  12938
  12939      if (strictRoot === null) {
  12940        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.');
  12941
  12942        return;
  12943      } // Dedup strategy: Warn once per component.
  12944
  12945
  12946      if (didWarnAboutLegacyContext.has(fiber.type)) {
  12947        return;
  12948      }
  12949
  12950      var warningsForRoot = pendingLegacyContextWarning.get(strictRoot);
  12951
  12952      if (fiber.type.contextTypes != null || fiber.type.childContextTypes != null || instance !== null && typeof instance.getChildContext === 'function') {
  12953        if (warningsForRoot === undefined) {
  12954          warningsForRoot = [];
  12955          pendingLegacyContextWarning.set(strictRoot, warningsForRoot);
  12956        }
  12957
  12958        warningsForRoot.push(fiber);
  12959      }
  12960    };
  12961
  12962    ReactStrictModeWarnings.flushLegacyContextWarning = function () {
  12963      pendingLegacyContextWarning.forEach(function (fiberArray, strictRoot) {
  12964        if (fiberArray.length === 0) {
  12965          return;
  12966        }
  12967
  12968        var firstFiber = fiberArray[0];
  12969        var uniqueNames = new Set();
  12970        fiberArray.forEach(function (fiber) {
  12971          uniqueNames.add(getComponentNameFromFiber(fiber) || 'Component');
  12972          didWarnAboutLegacyContext.add(fiber.type);
  12973        });
  12974        var sortedNames = setToSortedString(uniqueNames);
  12975
  12976        try {
  12977          setCurrentFiber(firstFiber);
  12978
  12979          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://reactjs.org/link/legacy-context', sortedNames);
  12980        } finally {
  12981          resetCurrentFiber();
  12982        }
  12983      });
  12984    };
  12985
  12986    ReactStrictModeWarnings.discardPendingWarnings = function () {
  12987      pendingComponentWillMountWarnings = [];
  12988      pendingUNSAFE_ComponentWillMountWarnings = [];
  12989      pendingComponentWillReceivePropsWarnings = [];
  12990      pendingUNSAFE_ComponentWillReceivePropsWarnings = [];
  12991      pendingComponentWillUpdateWarnings = [];
  12992      pendingUNSAFE_ComponentWillUpdateWarnings = [];
  12993      pendingLegacyContextWarning = new Map();
  12994    };
  12995  }
  12996
  12997  function resolveDefaultProps(Component, baseProps) {
  12998    if (Component && Component.defaultProps) {
  12999      // Resolve default props. Taken from ReactElement
  13000      var props = assign({}, baseProps);
  13001      var defaultProps = Component.defaultProps;
  13002
  13003      for (var propName in defaultProps) {
  13004        if (props[propName] === undefined) {
  13005          props[propName] = defaultProps[propName];
  13006        }
  13007      }
  13008
  13009      return props;
  13010    }
  13011
  13012    return baseProps;
  13013  }
  13014
  13015  var valueCursor = createCursor(null);
  13016  var rendererSigil;
  13017
  13018  {
  13019    // Use this to detect multiple renderers using the same context
  13020    rendererSigil = {};
  13021  }
  13022
  13023  var currentlyRenderingFiber = null;
  13024  var lastContextDependency = null;
  13025  var lastFullyObservedContext = null;
  13026  var isDisallowedContextReadInDEV = false;
  13027  function resetContextDependencies() {
  13028    // This is called right before React yields execution, to ensure `readContext`
  13029    // cannot be called outside the render phase.
  13030    currentlyRenderingFiber = null;
  13031    lastContextDependency = null;
  13032    lastFullyObservedContext = null;
  13033
  13034    {
  13035      isDisallowedContextReadInDEV = false;
  13036    }
  13037  }
  13038  function enterDisallowedContextReadInDEV() {
  13039    {
  13040      isDisallowedContextReadInDEV = true;
  13041    }
  13042  }
  13043  function exitDisallowedContextReadInDEV() {
  13044    {
  13045      isDisallowedContextReadInDEV = false;
  13046    }
  13047  }
  13048  function pushProvider(providerFiber, context, nextValue) {
  13049    {
  13050      push(valueCursor, context._currentValue, providerFiber);
  13051      context._currentValue = nextValue;
  13052
  13053      {
  13054        if (context._currentRenderer !== undefined && context._currentRenderer !== null && context._currentRenderer !== rendererSigil) {
  13055          error('Detected multiple renderers concurrently rendering the ' + 'same context provider. This is currently unsupported.');
  13056        }
  13057
  13058        context._currentRenderer = rendererSigil;
  13059      }
  13060    }
  13061  }
  13062  function popProvider(context, providerFiber) {
  13063    var currentValue = valueCursor.current;
  13064    pop(valueCursor, providerFiber);
  13065
  13066    {
  13067      {
  13068        context._currentValue = currentValue;
  13069      }
  13070    }
  13071  }
  13072  function scheduleContextWorkOnParentPath(parent, renderLanes, propagationRoot) {
  13073    // Update the child lanes of all the ancestors, including the alternates.
  13074    var node = parent;
  13075
  13076    while (node !== null) {
  13077      var alternate = node.alternate;
  13078
  13079      if (!isSubsetOfLanes(node.childLanes, renderLanes)) {
  13080        node.childLanes = mergeLanes(node.childLanes, renderLanes);
  13081
  13082        if (alternate !== null) {
  13083          alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
  13084        }
  13085      } else if (alternate !== null && !isSubsetOfLanes(alternate.childLanes, renderLanes)) {
  13086        alternate.childLanes = mergeLanes(alternate.childLanes, renderLanes);
  13087      }
  13088
  13089      if (node === propagationRoot) {
  13090        break;
  13091      }
  13092
  13093      node = node.return;
  13094    }
  13095
  13096    {
  13097      if (node !== propagationRoot) {
  13098        error('Expected to find the propagation root when scheduling context work. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  13099      }
  13100    }
  13101  }
  13102  function propagateContextChange(workInProgress, context, renderLanes) {
  13103    {
  13104      propagateContextChange_eager(workInProgress, context, renderLanes);
  13105    }
  13106  }
  13107
  13108  function propagateContextChange_eager(workInProgress, context, renderLanes) {
  13109
  13110    var fiber = workInProgress.child;
  13111
  13112    if (fiber !== null) {
  13113      // Set the return pointer of the child to the work-in-progress fiber.
  13114      fiber.return = workInProgress;
  13115    }
  13116
  13117    while (fiber !== null) {
  13118      var nextFiber = void 0; // Visit this fiber.
  13119
  13120      var list = fiber.dependencies;
  13121
  13122      if (list !== null) {
  13123        nextFiber = fiber.child;
  13124        var dependency = list.firstContext;
  13125
  13126        while (dependency !== null) {
  13127          // Check if the context matches.
  13128          if (dependency.context === context) {
  13129            // Match! Schedule an update on this fiber.
  13130            if (fiber.tag === ClassComponent) {
  13131              // Schedule a force update on the work-in-progress.
  13132              var lane = pickArbitraryLane(renderLanes);
  13133              var update = createUpdate(NoTimestamp, lane);
  13134              update.tag = ForceUpdate; // TODO: Because we don't have a work-in-progress, this will add the
  13135              // update to the current fiber, too, which means it will persist even if
  13136              // this render is thrown away. Since it's a race condition, not sure it's
  13137              // worth fixing.
  13138              // Inlined `enqueueUpdate` to remove interleaved update check
  13139
  13140              var updateQueue = fiber.updateQueue;
  13141
  13142              if (updateQueue === null) ; else {
  13143                var sharedQueue = updateQueue.shared;
  13144                var pending = sharedQueue.pending;
  13145
  13146                if (pending === null) {
  13147                  // This is the first update. Create a circular list.
  13148                  update.next = update;
  13149                } else {
  13150                  update.next = pending.next;
  13151                  pending.next = update;
  13152                }
  13153
  13154                sharedQueue.pending = update;
  13155              }
  13156            }
  13157
  13158            fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
  13159            var alternate = fiber.alternate;
  13160
  13161            if (alternate !== null) {
  13162              alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
  13163            }
  13164
  13165            scheduleContextWorkOnParentPath(fiber.return, renderLanes, workInProgress); // Mark the updated lanes on the list, too.
  13166
  13167            list.lanes = mergeLanes(list.lanes, renderLanes); // Since we already found a match, we can stop traversing the
  13168            // dependency list.
  13169
  13170            break;
  13171          }
  13172
  13173          dependency = dependency.next;
  13174        }
  13175      } else if (fiber.tag === ContextProvider) {
  13176        // Don't scan deeper if this is a matching provider
  13177        nextFiber = fiber.type === workInProgress.type ? null : fiber.child;
  13178      } else if (fiber.tag === DehydratedFragment) {
  13179        // If a dehydrated suspense boundary is in this subtree, we don't know
  13180        // if it will have any context consumers in it. The best we can do is
  13181        // mark it as having updates.
  13182        var parentSuspense = fiber.return;
  13183
  13184        if (parentSuspense === null) {
  13185          throw new Error('We just came from a parent so we must have had a parent. This is a bug in React.');
  13186        }
  13187
  13188        parentSuspense.lanes = mergeLanes(parentSuspense.lanes, renderLanes);
  13189        var _alternate = parentSuspense.alternate;
  13190
  13191        if (_alternate !== null) {
  13192          _alternate.lanes = mergeLanes(_alternate.lanes, renderLanes);
  13193        } // This is intentionally passing this fiber as the parent
  13194        // because we want to schedule this fiber as having work
  13195        // on its children. We'll use the childLanes on
  13196        // this fiber to indicate that a context has changed.
  13197
  13198
  13199        scheduleContextWorkOnParentPath(parentSuspense, renderLanes, workInProgress);
  13200        nextFiber = fiber.sibling;
  13201      } else {
  13202        // Traverse down.
  13203        nextFiber = fiber.child;
  13204      }
  13205
  13206      if (nextFiber !== null) {
  13207        // Set the return pointer of the child to the work-in-progress fiber.
  13208        nextFiber.return = fiber;
  13209      } else {
  13210        // No child. Traverse to next sibling.
  13211        nextFiber = fiber;
  13212
  13213        while (nextFiber !== null) {
  13214          if (nextFiber === workInProgress) {
  13215            // We're back to the root of this subtree. Exit.
  13216            nextFiber = null;
  13217            break;
  13218          }
  13219
  13220          var sibling = nextFiber.sibling;
  13221
  13222          if (sibling !== null) {
  13223            // Set the return pointer of the sibling to the work-in-progress fiber.
  13224            sibling.return = nextFiber.return;
  13225            nextFiber = sibling;
  13226            break;
  13227          } // No more siblings. Traverse up.
  13228
  13229
  13230          nextFiber = nextFiber.return;
  13231        }
  13232      }
  13233
  13234      fiber = nextFiber;
  13235    }
  13236  }
  13237  function prepareToReadContext(workInProgress, renderLanes) {
  13238    currentlyRenderingFiber = workInProgress;
  13239    lastContextDependency = null;
  13240    lastFullyObservedContext = null;
  13241    var dependencies = workInProgress.dependencies;
  13242
  13243    if (dependencies !== null) {
  13244      {
  13245        var firstContext = dependencies.firstContext;
  13246
  13247        if (firstContext !== null) {
  13248          if (includesSomeLane(dependencies.lanes, renderLanes)) {
  13249            // Context list has a pending update. Mark that this fiber performed work.
  13250            markWorkInProgressReceivedUpdate();
  13251          } // Reset the work-in-progress list
  13252
  13253
  13254          dependencies.firstContext = null;
  13255        }
  13256      }
  13257    }
  13258  }
  13259  function readContext(context) {
  13260    {
  13261      // This warning would fire if you read context inside a Hook like useMemo.
  13262      // Unlike the class check below, it's not enforced in production for perf.
  13263      if (isDisallowedContextReadInDEV) {
  13264        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().');
  13265      }
  13266    }
  13267
  13268    var value =  context._currentValue ;
  13269
  13270    if (lastFullyObservedContext === context) ; else {
  13271      var contextItem = {
  13272        context: context,
  13273        memoizedValue: value,
  13274        next: null
  13275      };
  13276
  13277      if (lastContextDependency === null) {
  13278        if (currentlyRenderingFiber === null) {
  13279          throw new 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().');
  13280        } // This is the first dependency for this component. Create a new list.
  13281
  13282
  13283        lastContextDependency = contextItem;
  13284        currentlyRenderingFiber.dependencies = {
  13285          lanes: NoLanes,
  13286          firstContext: contextItem
  13287        };
  13288      } else {
  13289        // Append a new context item.
  13290        lastContextDependency = lastContextDependency.next = contextItem;
  13291      }
  13292    }
  13293
  13294    return value;
  13295  }
  13296
  13297  // render. When this render exits, either because it finishes or because it is
  13298  // interrupted, the interleaved updates will be transferred onto the main part
  13299  // of the queue.
  13300
  13301  var concurrentQueues = null;
  13302  function pushConcurrentUpdateQueue(queue) {
  13303    if (concurrentQueues === null) {
  13304      concurrentQueues = [queue];
  13305    } else {
  13306      concurrentQueues.push(queue);
  13307    }
  13308  }
  13309  function finishQueueingConcurrentUpdates() {
  13310    // Transfer the interleaved updates onto the main queue. Each queue has a
  13311    // `pending` field and an `interleaved` field. When they are not null, they
  13312    // point to the last node in a circular linked list. We need to append the
  13313    // interleaved list to the end of the pending list by joining them into a
  13314    // single, circular list.
  13315    if (concurrentQueues !== null) {
  13316      for (var i = 0; i < concurrentQueues.length; i++) {
  13317        var queue = concurrentQueues[i];
  13318        var lastInterleavedUpdate = queue.interleaved;
  13319
  13320        if (lastInterleavedUpdate !== null) {
  13321          queue.interleaved = null;
  13322          var firstInterleavedUpdate = lastInterleavedUpdate.next;
  13323          var lastPendingUpdate = queue.pending;
  13324
  13325          if (lastPendingUpdate !== null) {
  13326            var firstPendingUpdate = lastPendingUpdate.next;
  13327            lastPendingUpdate.next = firstInterleavedUpdate;
  13328            lastInterleavedUpdate.next = firstPendingUpdate;
  13329          }
  13330
  13331          queue.pending = lastInterleavedUpdate;
  13332        }
  13333      }
  13334
  13335      concurrentQueues = null;
  13336    }
  13337  }
  13338  function enqueueConcurrentHookUpdate(fiber, queue, update, lane) {
  13339    var interleaved = queue.interleaved;
  13340
  13341    if (interleaved === null) {
  13342      // This is the first update. Create a circular list.
  13343      update.next = update; // At the end of the current render, this queue's interleaved updates will
  13344      // be transferred to the pending queue.
  13345
  13346      pushConcurrentUpdateQueue(queue);
  13347    } else {
  13348      update.next = interleaved.next;
  13349      interleaved.next = update;
  13350    }
  13351
  13352    queue.interleaved = update;
  13353    return markUpdateLaneFromFiberToRoot(fiber, lane);
  13354  }
  13355  function enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane) {
  13356    var interleaved = queue.interleaved;
  13357
  13358    if (interleaved === null) {
  13359      // This is the first update. Create a circular list.
  13360      update.next = update; // At the end of the current render, this queue's interleaved updates will
  13361      // be transferred to the pending queue.
  13362
  13363      pushConcurrentUpdateQueue(queue);
  13364    } else {
  13365      update.next = interleaved.next;
  13366      interleaved.next = update;
  13367    }
  13368
  13369    queue.interleaved = update;
  13370  }
  13371  function enqueueConcurrentClassUpdate(fiber, queue, update, lane) {
  13372    var interleaved = queue.interleaved;
  13373
  13374    if (interleaved === null) {
  13375      // This is the first update. Create a circular list.
  13376      update.next = update; // At the end of the current render, this queue's interleaved updates will
  13377      // be transferred to the pending queue.
  13378
  13379      pushConcurrentUpdateQueue(queue);
  13380    } else {
  13381      update.next = interleaved.next;
  13382      interleaved.next = update;
  13383    }
  13384
  13385    queue.interleaved = update;
  13386    return markUpdateLaneFromFiberToRoot(fiber, lane);
  13387  }
  13388  function enqueueConcurrentRenderForLane(fiber, lane) {
  13389    return markUpdateLaneFromFiberToRoot(fiber, lane);
  13390  } // Calling this function outside this module should only be done for backwards
  13391  // compatibility and should always be accompanied by a warning.
  13392
  13393  var unsafe_markUpdateLaneFromFiberToRoot = markUpdateLaneFromFiberToRoot;
  13394
  13395  function markUpdateLaneFromFiberToRoot(sourceFiber, lane) {
  13396    // Update the source fiber's lanes
  13397    sourceFiber.lanes = mergeLanes(sourceFiber.lanes, lane);
  13398    var alternate = sourceFiber.alternate;
  13399
  13400    if (alternate !== null) {
  13401      alternate.lanes = mergeLanes(alternate.lanes, lane);
  13402    }
  13403
  13404    {
  13405      if (alternate === null && (sourceFiber.flags & (Placement | Hydrating)) !== NoFlags) {
  13406        warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
  13407      }
  13408    } // Walk the parent path to the root and update the child lanes.
  13409
  13410
  13411    var node = sourceFiber;
  13412    var parent = sourceFiber.return;
  13413
  13414    while (parent !== null) {
  13415      parent.childLanes = mergeLanes(parent.childLanes, lane);
  13416      alternate = parent.alternate;
  13417
  13418      if (alternate !== null) {
  13419        alternate.childLanes = mergeLanes(alternate.childLanes, lane);
  13420      } else {
  13421        {
  13422          if ((parent.flags & (Placement | Hydrating)) !== NoFlags) {
  13423            warnAboutUpdateOnNotYetMountedFiberInDEV(sourceFiber);
  13424          }
  13425        }
  13426      }
  13427
  13428      node = parent;
  13429      parent = parent.return;
  13430    }
  13431
  13432    if (node.tag === HostRoot) {
  13433      var root = node.stateNode;
  13434      return root;
  13435    } else {
  13436      return null;
  13437    }
  13438  }
  13439
  13440  var UpdateState = 0;
  13441  var ReplaceState = 1;
  13442  var ForceUpdate = 2;
  13443  var CaptureUpdate = 3; // Global state that is reset at the beginning of calling `processUpdateQueue`.
  13444  // It should only be read right after calling `processUpdateQueue`, via
  13445  // `checkHasForceUpdateAfterProcessing`.
  13446
  13447  var hasForceUpdate = false;
  13448  var didWarnUpdateInsideUpdate;
  13449  var currentlyProcessingQueue;
  13450
  13451  {
  13452    didWarnUpdateInsideUpdate = false;
  13453    currentlyProcessingQueue = null;
  13454  }
  13455
  13456  function initializeUpdateQueue(fiber) {
  13457    var queue = {
  13458      baseState: fiber.memoizedState,
  13459      firstBaseUpdate: null,
  13460      lastBaseUpdate: null,
  13461      shared: {
  13462        pending: null,
  13463        interleaved: null,
  13464        lanes: NoLanes
  13465      },
  13466      effects: null
  13467    };
  13468    fiber.updateQueue = queue;
  13469  }
  13470  function cloneUpdateQueue(current, workInProgress) {
  13471    // Clone the update queue from current. Unless it's already a clone.
  13472    var queue = workInProgress.updateQueue;
  13473    var currentQueue = current.updateQueue;
  13474
  13475    if (queue === currentQueue) {
  13476      var clone = {
  13477        baseState: currentQueue.baseState,
  13478        firstBaseUpdate: currentQueue.firstBaseUpdate,
  13479        lastBaseUpdate: currentQueue.lastBaseUpdate,
  13480        shared: currentQueue.shared,
  13481        effects: currentQueue.effects
  13482      };
  13483      workInProgress.updateQueue = clone;
  13484    }
  13485  }
  13486  function createUpdate(eventTime, lane) {
  13487    var update = {
  13488      eventTime: eventTime,
  13489      lane: lane,
  13490      tag: UpdateState,
  13491      payload: null,
  13492      callback: null,
  13493      next: null
  13494    };
  13495    return update;
  13496  }
  13497  function enqueueUpdate(fiber, update, lane) {
  13498    var updateQueue = fiber.updateQueue;
  13499
  13500    if (updateQueue === null) {
  13501      // Only occurs if the fiber has been unmounted.
  13502      return null;
  13503    }
  13504
  13505    var sharedQueue = updateQueue.shared;
  13506
  13507    {
  13508      if (currentlyProcessingQueue === sharedQueue && !didWarnUpdateInsideUpdate) {
  13509        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.');
  13510
  13511        didWarnUpdateInsideUpdate = true;
  13512      }
  13513    }
  13514
  13515    if (isUnsafeClassRenderPhaseUpdate()) {
  13516      // This is an unsafe render phase update. Add directly to the update
  13517      // queue so we can process it immediately during the current render.
  13518      var pending = sharedQueue.pending;
  13519
  13520      if (pending === null) {
  13521        // This is the first update. Create a circular list.
  13522        update.next = update;
  13523      } else {
  13524        update.next = pending.next;
  13525        pending.next = update;
  13526      }
  13527
  13528      sharedQueue.pending = update; // Update the childLanes even though we're most likely already rendering
  13529      // this fiber. This is for backwards compatibility in the case where you
  13530      // update a different component during render phase than the one that is
  13531      // currently renderings (a pattern that is accompanied by a warning).
  13532
  13533      return unsafe_markUpdateLaneFromFiberToRoot(fiber, lane);
  13534    } else {
  13535      return enqueueConcurrentClassUpdate(fiber, sharedQueue, update, lane);
  13536    }
  13537  }
  13538  function entangleTransitions(root, fiber, lane) {
  13539    var updateQueue = fiber.updateQueue;
  13540
  13541    if (updateQueue === null) {
  13542      // Only occurs if the fiber has been unmounted.
  13543      return;
  13544    }
  13545
  13546    var sharedQueue = updateQueue.shared;
  13547
  13548    if (isTransitionLane(lane)) {
  13549      var queueLanes = sharedQueue.lanes; // If any entangled lanes are no longer pending on the root, then they must
  13550      // have finished. We can remove them from the shared queue, which represents
  13551      // a superset of the actually pending lanes. In some cases we may entangle
  13552      // more than we need to, but that's OK. In fact it's worse if we *don't*
  13553      // entangle when we should.
  13554
  13555      queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
  13556
  13557      var newQueueLanes = mergeLanes(queueLanes, lane);
  13558      sharedQueue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
  13559      // the lane finished since the last time we entangled it. So we need to
  13560      // entangle it again, just to be sure.
  13561
  13562      markRootEntangled(root, newQueueLanes);
  13563    }
  13564  }
  13565  function enqueueCapturedUpdate(workInProgress, capturedUpdate) {
  13566    // Captured updates are updates that are thrown by a child during the render
  13567    // phase. They should be discarded if the render is aborted. Therefore,
  13568    // we should only put them on the work-in-progress queue, not the current one.
  13569    var queue = workInProgress.updateQueue; // Check if the work-in-progress queue is a clone.
  13570
  13571    var current = workInProgress.alternate;
  13572
  13573    if (current !== null) {
  13574      var currentQueue = current.updateQueue;
  13575
  13576      if (queue === currentQueue) {
  13577        // The work-in-progress queue is the same as current. This happens when
  13578        // we bail out on a parent fiber that then captures an error thrown by
  13579        // a child. Since we want to append the update only to the work-in
  13580        // -progress queue, we need to clone the updates. We usually clone during
  13581        // processUpdateQueue, but that didn't happen in this case because we
  13582        // skipped over the parent when we bailed out.
  13583        var newFirst = null;
  13584        var newLast = null;
  13585        var firstBaseUpdate = queue.firstBaseUpdate;
  13586
  13587        if (firstBaseUpdate !== null) {
  13588          // Loop through the updates and clone them.
  13589          var update = firstBaseUpdate;
  13590
  13591          do {
  13592            var clone = {
  13593              eventTime: update.eventTime,
  13594              lane: update.lane,
  13595              tag: update.tag,
  13596              payload: update.payload,
  13597              callback: update.callback,
  13598              next: null
  13599            };
  13600
  13601            if (newLast === null) {
  13602              newFirst = newLast = clone;
  13603            } else {
  13604              newLast.next = clone;
  13605              newLast = clone;
  13606            }
  13607
  13608            update = update.next;
  13609          } while (update !== null); // Append the captured update the end of the cloned list.
  13610
  13611
  13612          if (newLast === null) {
  13613            newFirst = newLast = capturedUpdate;
  13614          } else {
  13615            newLast.next = capturedUpdate;
  13616            newLast = capturedUpdate;
  13617          }
  13618        } else {
  13619          // There are no base updates.
  13620          newFirst = newLast = capturedUpdate;
  13621        }
  13622
  13623        queue = {
  13624          baseState: currentQueue.baseState,
  13625          firstBaseUpdate: newFirst,
  13626          lastBaseUpdate: newLast,
  13627          shared: currentQueue.shared,
  13628          effects: currentQueue.effects
  13629        };
  13630        workInProgress.updateQueue = queue;
  13631        return;
  13632      }
  13633    } // Append the update to the end of the list.
  13634
  13635
  13636    var lastBaseUpdate = queue.lastBaseUpdate;
  13637
  13638    if (lastBaseUpdate === null) {
  13639      queue.firstBaseUpdate = capturedUpdate;
  13640    } else {
  13641      lastBaseUpdate.next = capturedUpdate;
  13642    }
  13643
  13644    queue.lastBaseUpdate = capturedUpdate;
  13645  }
  13646
  13647  function getStateFromUpdate(workInProgress, queue, update, prevState, nextProps, instance) {
  13648    switch (update.tag) {
  13649      case ReplaceState:
  13650        {
  13651          var payload = update.payload;
  13652
  13653          if (typeof payload === 'function') {
  13654            // Updater function
  13655            {
  13656              enterDisallowedContextReadInDEV();
  13657            }
  13658
  13659            var nextState = payload.call(instance, prevState, nextProps);
  13660
  13661            {
  13662              if ( workInProgress.mode & StrictLegacyMode) {
  13663                setIsStrictModeForDevtools(true);
  13664
  13665                try {
  13666                  payload.call(instance, prevState, nextProps);
  13667                } finally {
  13668                  setIsStrictModeForDevtools(false);
  13669                }
  13670              }
  13671
  13672              exitDisallowedContextReadInDEV();
  13673            }
  13674
  13675            return nextState;
  13676          } // State object
  13677
  13678
  13679          return payload;
  13680        }
  13681
  13682      case CaptureUpdate:
  13683        {
  13684          workInProgress.flags = workInProgress.flags & ~ShouldCapture | DidCapture;
  13685        }
  13686      // Intentional fallthrough
  13687
  13688      case UpdateState:
  13689        {
  13690          var _payload = update.payload;
  13691          var partialState;
  13692
  13693          if (typeof _payload === 'function') {
  13694            // Updater function
  13695            {
  13696              enterDisallowedContextReadInDEV();
  13697            }
  13698
  13699            partialState = _payload.call(instance, prevState, nextProps);
  13700
  13701            {
  13702              if ( workInProgress.mode & StrictLegacyMode) {
  13703                setIsStrictModeForDevtools(true);
  13704
  13705                try {
  13706                  _payload.call(instance, prevState, nextProps);
  13707                } finally {
  13708                  setIsStrictModeForDevtools(false);
  13709                }
  13710              }
  13711
  13712              exitDisallowedContextReadInDEV();
  13713            }
  13714          } else {
  13715            // Partial state object
  13716            partialState = _payload;
  13717          }
  13718
  13719          if (partialState === null || partialState === undefined) {
  13720            // Null and undefined are treated as no-ops.
  13721            return prevState;
  13722          } // Merge the partial state and the previous state.
  13723
  13724
  13725          return assign({}, prevState, partialState);
  13726        }
  13727
  13728      case ForceUpdate:
  13729        {
  13730          hasForceUpdate = true;
  13731          return prevState;
  13732        }
  13733    }
  13734
  13735    return prevState;
  13736  }
  13737
  13738  function processUpdateQueue(workInProgress, props, instance, renderLanes) {
  13739    // This is always non-null on a ClassComponent or HostRoot
  13740    var queue = workInProgress.updateQueue;
  13741    hasForceUpdate = false;
  13742
  13743    {
  13744      currentlyProcessingQueue = queue.shared;
  13745    }
  13746
  13747    var firstBaseUpdate = queue.firstBaseUpdate;
  13748    var lastBaseUpdate = queue.lastBaseUpdate; // Check if there are pending updates. If so, transfer them to the base queue.
  13749
  13750    var pendingQueue = queue.shared.pending;
  13751
  13752    if (pendingQueue !== null) {
  13753      queue.shared.pending = null; // The pending queue is circular. Disconnect the pointer between first
  13754      // and last so that it's non-circular.
  13755
  13756      var lastPendingUpdate = pendingQueue;
  13757      var firstPendingUpdate = lastPendingUpdate.next;
  13758      lastPendingUpdate.next = null; // Append pending updates to base queue
  13759
  13760      if (lastBaseUpdate === null) {
  13761        firstBaseUpdate = firstPendingUpdate;
  13762      } else {
  13763        lastBaseUpdate.next = firstPendingUpdate;
  13764      }
  13765
  13766      lastBaseUpdate = lastPendingUpdate; // If there's a current queue, and it's different from the base queue, then
  13767      // we need to transfer the updates to that queue, too. Because the base
  13768      // queue is a singly-linked list with no cycles, we can append to both
  13769      // lists and take advantage of structural sharing.
  13770      // TODO: Pass `current` as argument
  13771
  13772      var current = workInProgress.alternate;
  13773
  13774      if (current !== null) {
  13775        // This is always non-null on a ClassComponent or HostRoot
  13776        var currentQueue = current.updateQueue;
  13777        var currentLastBaseUpdate = currentQueue.lastBaseUpdate;
  13778
  13779        if (currentLastBaseUpdate !== lastBaseUpdate) {
  13780          if (currentLastBaseUpdate === null) {
  13781            currentQueue.firstBaseUpdate = firstPendingUpdate;
  13782          } else {
  13783            currentLastBaseUpdate.next = firstPendingUpdate;
  13784          }
  13785
  13786          currentQueue.lastBaseUpdate = lastPendingUpdate;
  13787        }
  13788      }
  13789    } // These values may change as we process the queue.
  13790
  13791
  13792    if (firstBaseUpdate !== null) {
  13793      // Iterate through the list of updates to compute the result.
  13794      var newState = queue.baseState; // TODO: Don't need to accumulate this. Instead, we can remove renderLanes
  13795      // from the original lanes.
  13796
  13797      var newLanes = NoLanes;
  13798      var newBaseState = null;
  13799      var newFirstBaseUpdate = null;
  13800      var newLastBaseUpdate = null;
  13801      var update = firstBaseUpdate;
  13802
  13803      do {
  13804        var updateLane = update.lane;
  13805        var updateEventTime = update.eventTime;
  13806
  13807        if (!isSubsetOfLanes(renderLanes, updateLane)) {
  13808          // Priority is insufficient. Skip this update. If this is the first
  13809          // skipped update, the previous update/state is the new base
  13810          // update/state.
  13811          var clone = {
  13812            eventTime: updateEventTime,
  13813            lane: updateLane,
  13814            tag: update.tag,
  13815            payload: update.payload,
  13816            callback: update.callback,
  13817            next: null
  13818          };
  13819
  13820          if (newLastBaseUpdate === null) {
  13821            newFirstBaseUpdate = newLastBaseUpdate = clone;
  13822            newBaseState = newState;
  13823          } else {
  13824            newLastBaseUpdate = newLastBaseUpdate.next = clone;
  13825          } // Update the remaining priority in the queue.
  13826
  13827
  13828          newLanes = mergeLanes(newLanes, updateLane);
  13829        } else {
  13830          // This update does have sufficient priority.
  13831          if (newLastBaseUpdate !== null) {
  13832            var _clone = {
  13833              eventTime: updateEventTime,
  13834              // This update is going to be committed so we never want uncommit
  13835              // it. Using NoLane works because 0 is a subset of all bitmasks, so
  13836              // this will never be skipped by the check above.
  13837              lane: NoLane,
  13838              tag: update.tag,
  13839              payload: update.payload,
  13840              callback: update.callback,
  13841              next: null
  13842            };
  13843            newLastBaseUpdate = newLastBaseUpdate.next = _clone;
  13844          } // Process this update.
  13845
  13846
  13847          newState = getStateFromUpdate(workInProgress, queue, update, newState, props, instance);
  13848          var callback = update.callback;
  13849
  13850          if (callback !== null && // If the update was already committed, we should not queue its
  13851          // callback again.
  13852          update.lane !== NoLane) {
  13853            workInProgress.flags |= Callback;
  13854            var effects = queue.effects;
  13855
  13856            if (effects === null) {
  13857              queue.effects = [update];
  13858            } else {
  13859              effects.push(update);
  13860            }
  13861          }
  13862        }
  13863
  13864        update = update.next;
  13865
  13866        if (update === null) {
  13867          pendingQueue = queue.shared.pending;
  13868
  13869          if (pendingQueue === null) {
  13870            break;
  13871          } else {
  13872            // An update was scheduled from inside a reducer. Add the new
  13873            // pending updates to the end of the list and keep processing.
  13874            var _lastPendingUpdate = pendingQueue; // Intentionally unsound. Pending updates form a circular list, but we
  13875            // unravel them when transferring them to the base queue.
  13876
  13877            var _firstPendingUpdate = _lastPendingUpdate.next;
  13878            _lastPendingUpdate.next = null;
  13879            update = _firstPendingUpdate;
  13880            queue.lastBaseUpdate = _lastPendingUpdate;
  13881            queue.shared.pending = null;
  13882          }
  13883        }
  13884      } while (true);
  13885
  13886      if (newLastBaseUpdate === null) {
  13887        newBaseState = newState;
  13888      }
  13889
  13890      queue.baseState = newBaseState;
  13891      queue.firstBaseUpdate = newFirstBaseUpdate;
  13892      queue.lastBaseUpdate = newLastBaseUpdate; // Interleaved updates are stored on a separate queue. We aren't going to
  13893      // process them during this render, but we do need to track which lanes
  13894      // are remaining.
  13895
  13896      var lastInterleaved = queue.shared.interleaved;
  13897
  13898      if (lastInterleaved !== null) {
  13899        var interleaved = lastInterleaved;
  13900
  13901        do {
  13902          newLanes = mergeLanes(newLanes, interleaved.lane);
  13903          interleaved = interleaved.next;
  13904        } while (interleaved !== lastInterleaved);
  13905      } else if (firstBaseUpdate === null) {
  13906        // `queue.lanes` is used for entangling transitions. We can set it back to
  13907        // zero once the queue is empty.
  13908        queue.shared.lanes = NoLanes;
  13909      } // Set the remaining expiration time to be whatever is remaining in the queue.
  13910      // This should be fine because the only two other things that contribute to
  13911      // expiration time are props and context. We're already in the middle of the
  13912      // begin phase by the time we start processing the queue, so we've already
  13913      // dealt with the props. Context in components that specify
  13914      // shouldComponentUpdate is tricky; but we'll have to account for
  13915      // that regardless.
  13916
  13917
  13918      markSkippedUpdateLanes(newLanes);
  13919      workInProgress.lanes = newLanes;
  13920      workInProgress.memoizedState = newState;
  13921    }
  13922
  13923    {
  13924      currentlyProcessingQueue = null;
  13925    }
  13926  }
  13927
  13928  function callCallback(callback, context) {
  13929    if (typeof callback !== 'function') {
  13930      throw new Error('Invalid argument passed as callback. Expected a function. Instead ' + ("received: " + callback));
  13931    }
  13932
  13933    callback.call(context);
  13934  }
  13935
  13936  function resetHasForceUpdateBeforeProcessing() {
  13937    hasForceUpdate = false;
  13938  }
  13939  function checkHasForceUpdateAfterProcessing() {
  13940    return hasForceUpdate;
  13941  }
  13942  function commitUpdateQueue(finishedWork, finishedQueue, instance) {
  13943    // Commit the effects
  13944    var effects = finishedQueue.effects;
  13945    finishedQueue.effects = null;
  13946
  13947    if (effects !== null) {
  13948      for (var i = 0; i < effects.length; i++) {
  13949        var effect = effects[i];
  13950        var callback = effect.callback;
  13951
  13952        if (callback !== null) {
  13953          effect.callback = null;
  13954          callCallback(callback, instance);
  13955        }
  13956      }
  13957    }
  13958  }
  13959
  13960  var fakeInternalInstance = {}; // React.Component uses a shared frozen object by default.
  13961  // We'll use it to determine whether we need to initialize legacy refs.
  13962
  13963  var emptyRefsObject = new React.Component().refs;
  13964  var didWarnAboutStateAssignmentForComponent;
  13965  var didWarnAboutUninitializedState;
  13966  var didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate;
  13967  var didWarnAboutLegacyLifecyclesAndDerivedState;
  13968  var didWarnAboutUndefinedDerivedState;
  13969  var warnOnUndefinedDerivedState;
  13970  var warnOnInvalidCallback;
  13971  var didWarnAboutDirectlyAssigningPropsToState;
  13972  var didWarnAboutContextTypeAndContextTypes;
  13973  var didWarnAboutInvalidateContextType;
  13974
  13975  {
  13976    didWarnAboutStateAssignmentForComponent = new Set();
  13977    didWarnAboutUninitializedState = new Set();
  13978    didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate = new Set();
  13979    didWarnAboutLegacyLifecyclesAndDerivedState = new Set();
  13980    didWarnAboutDirectlyAssigningPropsToState = new Set();
  13981    didWarnAboutUndefinedDerivedState = new Set();
  13982    didWarnAboutContextTypeAndContextTypes = new Set();
  13983    didWarnAboutInvalidateContextType = new Set();
  13984    var didWarnOnInvalidCallback = new Set();
  13985
  13986    warnOnInvalidCallback = function (callback, callerName) {
  13987      if (callback === null || typeof callback === 'function') {
  13988        return;
  13989      }
  13990
  13991      var key = callerName + '_' + callback;
  13992
  13993      if (!didWarnOnInvalidCallback.has(key)) {
  13994        didWarnOnInvalidCallback.add(key);
  13995
  13996        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
  13997      }
  13998    };
  13999
  14000    warnOnUndefinedDerivedState = function (type, partialState) {
  14001      if (partialState === undefined) {
  14002        var componentName = getComponentNameFromType(type) || 'Component';
  14003
  14004        if (!didWarnAboutUndefinedDerivedState.has(componentName)) {
  14005          didWarnAboutUndefinedDerivedState.add(componentName);
  14006
  14007          error('%s.getDerivedStateFromProps(): A valid state object (or null) must be returned. ' + 'You have returned undefined.', componentName);
  14008        }
  14009      }
  14010    }; // This is so gross but it's at least non-critical and can be removed if
  14011    // it causes problems. This is meant to give a nicer error message for
  14012    // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
  14013    // ...)) which otherwise throws a "_processChildContext is not a function"
  14014    // exception.
  14015
  14016
  14017    Object.defineProperty(fakeInternalInstance, '_processChildContext', {
  14018      enumerable: false,
  14019      value: function () {
  14020        throw new 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).');
  14021      }
  14022    });
  14023    Object.freeze(fakeInternalInstance);
  14024  }
  14025
  14026  function applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, nextProps) {
  14027    var prevState = workInProgress.memoizedState;
  14028    var partialState = getDerivedStateFromProps(nextProps, prevState);
  14029
  14030    {
  14031      if ( workInProgress.mode & StrictLegacyMode) {
  14032        setIsStrictModeForDevtools(true);
  14033
  14034        try {
  14035          // Invoke the function an extra time to help detect side-effects.
  14036          partialState = getDerivedStateFromProps(nextProps, prevState);
  14037        } finally {
  14038          setIsStrictModeForDevtools(false);
  14039        }
  14040      }
  14041
  14042      warnOnUndefinedDerivedState(ctor, partialState);
  14043    } // Merge the partial state and the previous state.
  14044
  14045
  14046    var memoizedState = partialState === null || partialState === undefined ? prevState : assign({}, prevState, partialState);
  14047    workInProgress.memoizedState = memoizedState; // Once the update queue is empty, persist the derived state onto the
  14048    // base state.
  14049
  14050    if (workInProgress.lanes === NoLanes) {
  14051      // Queue is always non-null for classes
  14052      var updateQueue = workInProgress.updateQueue;
  14053      updateQueue.baseState = memoizedState;
  14054    }
  14055  }
  14056
  14057  var classComponentUpdater = {
  14058    isMounted: isMounted,
  14059    enqueueSetState: function (inst, payload, callback) {
  14060      var fiber = get(inst);
  14061      var eventTime = requestEventTime();
  14062      var lane = requestUpdateLane(fiber);
  14063      var update = createUpdate(eventTime, lane);
  14064      update.payload = payload;
  14065
  14066      if (callback !== undefined && callback !== null) {
  14067        {
  14068          warnOnInvalidCallback(callback, 'setState');
  14069        }
  14070
  14071        update.callback = callback;
  14072      }
  14073
  14074      var root = enqueueUpdate(fiber, update, lane);
  14075
  14076      if (root !== null) {
  14077        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  14078        entangleTransitions(root, fiber, lane);
  14079      }
  14080
  14081      {
  14082        markStateUpdateScheduled(fiber, lane);
  14083      }
  14084    },
  14085    enqueueReplaceState: function (inst, payload, callback) {
  14086      var fiber = get(inst);
  14087      var eventTime = requestEventTime();
  14088      var lane = requestUpdateLane(fiber);
  14089      var update = createUpdate(eventTime, lane);
  14090      update.tag = ReplaceState;
  14091      update.payload = payload;
  14092
  14093      if (callback !== undefined && callback !== null) {
  14094        {
  14095          warnOnInvalidCallback(callback, 'replaceState');
  14096        }
  14097
  14098        update.callback = callback;
  14099      }
  14100
  14101      var root = enqueueUpdate(fiber, update, lane);
  14102
  14103      if (root !== null) {
  14104        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  14105        entangleTransitions(root, fiber, lane);
  14106      }
  14107
  14108      {
  14109        markStateUpdateScheduled(fiber, lane);
  14110      }
  14111    },
  14112    enqueueForceUpdate: function (inst, callback) {
  14113      var fiber = get(inst);
  14114      var eventTime = requestEventTime();
  14115      var lane = requestUpdateLane(fiber);
  14116      var update = createUpdate(eventTime, lane);
  14117      update.tag = ForceUpdate;
  14118
  14119      if (callback !== undefined && callback !== null) {
  14120        {
  14121          warnOnInvalidCallback(callback, 'forceUpdate');
  14122        }
  14123
  14124        update.callback = callback;
  14125      }
  14126
  14127      var root = enqueueUpdate(fiber, update, lane);
  14128
  14129      if (root !== null) {
  14130        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  14131        entangleTransitions(root, fiber, lane);
  14132      }
  14133
  14134      {
  14135        markForceUpdateScheduled(fiber, lane);
  14136      }
  14137    }
  14138  };
  14139
  14140  function checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) {
  14141    var instance = workInProgress.stateNode;
  14142
  14143    if (typeof instance.shouldComponentUpdate === 'function') {
  14144      var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
  14145
  14146      {
  14147        if ( workInProgress.mode & StrictLegacyMode) {
  14148          setIsStrictModeForDevtools(true);
  14149
  14150          try {
  14151            // Invoke the function an extra time to help detect side-effects.
  14152            shouldUpdate = instance.shouldComponentUpdate(newProps, newState, nextContext);
  14153          } finally {
  14154            setIsStrictModeForDevtools(false);
  14155          }
  14156        }
  14157
  14158        if (shouldUpdate === undefined) {
  14159          error('%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentNameFromType(ctor) || 'Component');
  14160        }
  14161      }
  14162
  14163      return shouldUpdate;
  14164    }
  14165
  14166    if (ctor.prototype && ctor.prototype.isPureReactComponent) {
  14167      return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);
  14168    }
  14169
  14170    return true;
  14171  }
  14172
  14173  function checkClassInstance(workInProgress, ctor, newProps) {
  14174    var instance = workInProgress.stateNode;
  14175
  14176    {
  14177      var name = getComponentNameFromType(ctor) || 'Component';
  14178      var renderPresent = instance.render;
  14179
  14180      if (!renderPresent) {
  14181        if (ctor.prototype && typeof ctor.prototype.render === 'function') {
  14182          error('%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);
  14183        } else {
  14184          error('%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);
  14185        }
  14186      }
  14187
  14188      if (instance.getInitialState && !instance.getInitialState.isReactClassApproved && !instance.state) {
  14189        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);
  14190      }
  14191
  14192      if (instance.getDefaultProps && !instance.getDefaultProps.isReactClassApproved) {
  14193        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);
  14194      }
  14195
  14196      if (instance.propTypes) {
  14197        error('propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);
  14198      }
  14199
  14200      if (instance.contextType) {
  14201        error('contextType was defined as an instance property on %s. Use a static ' + 'property to define contextType instead.', name);
  14202      }
  14203
  14204      {
  14205        if (instance.contextTypes) {
  14206          error('contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);
  14207        }
  14208
  14209        if (ctor.contextType && ctor.contextTypes && !didWarnAboutContextTypeAndContextTypes.has(ctor)) {
  14210          didWarnAboutContextTypeAndContextTypes.add(ctor);
  14211
  14212          error('%s declares both contextTypes and contextType static properties. ' + 'The legacy contextTypes property will be ignored.', name);
  14213        }
  14214      }
  14215
  14216      if (typeof instance.componentShouldUpdate === 'function') {
  14217        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);
  14218      }
  14219
  14220      if (ctor.prototype && ctor.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {
  14221        error('%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentNameFromType(ctor) || 'A pure component');
  14222      }
  14223
  14224      if (typeof instance.componentDidUnmount === 'function') {
  14225        error('%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);
  14226      }
  14227
  14228      if (typeof instance.componentDidReceiveProps === 'function') {
  14229        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);
  14230      }
  14231
  14232      if (typeof instance.componentWillRecieveProps === 'function') {
  14233        error('%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);
  14234      }
  14235
  14236      if (typeof instance.UNSAFE_componentWillRecieveProps === 'function') {
  14237        error('%s has a method called ' + 'UNSAFE_componentWillRecieveProps(). Did you mean UNSAFE_componentWillReceiveProps()?', name);
  14238      }
  14239
  14240      var hasMutatedProps = instance.props !== newProps;
  14241
  14242      if (instance.props !== undefined && hasMutatedProps) {
  14243        error('%s(...): When calling super() in `%s`, make sure to pass ' + "up the same props that your component's constructor was passed.", name, name);
  14244      }
  14245
  14246      if (instance.defaultProps) {
  14247        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);
  14248      }
  14249
  14250      if (typeof instance.getSnapshotBeforeUpdate === 'function' && typeof instance.componentDidUpdate !== 'function' && !didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.has(ctor)) {
  14251        didWarnAboutGetSnapshotBeforeUpdateWithoutDidUpdate.add(ctor);
  14252
  14253        error('%s: getSnapshotBeforeUpdate() should be used with componentDidUpdate(). ' + 'This component defines getSnapshotBeforeUpdate() only.', getComponentNameFromType(ctor));
  14254      }
  14255
  14256      if (typeof instance.getDerivedStateFromProps === 'function') {
  14257        error('%s: getDerivedStateFromProps() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
  14258      }
  14259
  14260      if (typeof instance.getDerivedStateFromError === 'function') {
  14261        error('%s: getDerivedStateFromError() is defined as an instance method ' + 'and will be ignored. Instead, declare it as a static method.', name);
  14262      }
  14263
  14264      if (typeof ctor.getSnapshotBeforeUpdate === 'function') {
  14265        error('%s: getSnapshotBeforeUpdate() is defined as a static method ' + 'and will be ignored. Instead, declare it as an instance method.', name);
  14266      }
  14267
  14268      var _state = instance.state;
  14269
  14270      if (_state && (typeof _state !== 'object' || isArray(_state))) {
  14271        error('%s.state: must be set to an object or null', name);
  14272      }
  14273
  14274      if (typeof instance.getChildContext === 'function' && typeof ctor.childContextTypes !== 'object') {
  14275        error('%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', name);
  14276      }
  14277    }
  14278  }
  14279
  14280  function adoptClassInstance(workInProgress, instance) {
  14281    instance.updater = classComponentUpdater;
  14282    workInProgress.stateNode = instance; // The instance needs access to the fiber so that it can schedule updates
  14283
  14284    set(instance, workInProgress);
  14285
  14286    {
  14287      instance._reactInternalInstance = fakeInternalInstance;
  14288    }
  14289  }
  14290
  14291  function constructClassInstance(workInProgress, ctor, props) {
  14292    var isLegacyContextConsumer = false;
  14293    var unmaskedContext = emptyContextObject;
  14294    var context = emptyContextObject;
  14295    var contextType = ctor.contextType;
  14296
  14297    {
  14298      if ('contextType' in ctor) {
  14299        var isValid = // Allow null for conditional declaration
  14300        contextType === null || contextType !== undefined && contextType.$$typeof === REACT_CONTEXT_TYPE && contextType._context === undefined; // Not a <Context.Consumer>
  14301
  14302        if (!isValid && !didWarnAboutInvalidateContextType.has(ctor)) {
  14303          didWarnAboutInvalidateContextType.add(ctor);
  14304          var addendum = '';
  14305
  14306          if (contextType === undefined) {
  14307            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.';
  14308          } else if (typeof contextType !== 'object') {
  14309            addendum = ' However, it is set to a ' + typeof contextType + '.';
  14310          } else if (contextType.$$typeof === REACT_PROVIDER_TYPE) {
  14311            addendum = ' Did you accidentally pass the Context.Provider instead?';
  14312          } else if (contextType._context !== undefined) {
  14313            // <Context.Consumer>
  14314            addendum = ' Did you accidentally pass the Context.Consumer instead?';
  14315          } else {
  14316            addendum = ' However, it is set to an object with keys {' + Object.keys(contextType).join(', ') + '}.';
  14317          }
  14318
  14319          error('%s defines an invalid contextType. ' + 'contextType should point to the Context object returned by React.createContext().%s', getComponentNameFromType(ctor) || 'Component', addendum);
  14320        }
  14321      }
  14322    }
  14323
  14324    if (typeof contextType === 'object' && contextType !== null) {
  14325      context = readContext(contextType);
  14326    } else {
  14327      unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
  14328      var contextTypes = ctor.contextTypes;
  14329      isLegacyContextConsumer = contextTypes !== null && contextTypes !== undefined;
  14330      context = isLegacyContextConsumer ? getMaskedContext(workInProgress, unmaskedContext) : emptyContextObject;
  14331    }
  14332
  14333    var instance = new ctor(props, context); // Instantiate twice to help detect side-effects.
  14334
  14335    {
  14336      if ( workInProgress.mode & StrictLegacyMode) {
  14337        setIsStrictModeForDevtools(true);
  14338
  14339        try {
  14340          instance = new ctor(props, context); // eslint-disable-line no-new
  14341        } finally {
  14342          setIsStrictModeForDevtools(false);
  14343        }
  14344      }
  14345    }
  14346
  14347    var state = workInProgress.memoizedState = instance.state !== null && instance.state !== undefined ? instance.state : null;
  14348    adoptClassInstance(workInProgress, instance);
  14349
  14350    {
  14351      if (typeof ctor.getDerivedStateFromProps === 'function' && state === null) {
  14352        var componentName = getComponentNameFromType(ctor) || 'Component';
  14353
  14354        if (!didWarnAboutUninitializedState.has(componentName)) {
  14355          didWarnAboutUninitializedState.add(componentName);
  14356
  14357          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);
  14358        }
  14359      } // If new component APIs are defined, "unsafe" lifecycles won't be called.
  14360      // Warn about these lifecycles if they are present.
  14361      // Don't warn about react-lifecycles-compat polyfilled methods though.
  14362
  14363
  14364      if (typeof ctor.getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function') {
  14365        var foundWillMountName = null;
  14366        var foundWillReceivePropsName = null;
  14367        var foundWillUpdateName = null;
  14368
  14369        if (typeof instance.componentWillMount === 'function' && instance.componentWillMount.__suppressDeprecationWarning !== true) {
  14370          foundWillMountName = 'componentWillMount';
  14371        } else if (typeof instance.UNSAFE_componentWillMount === 'function') {
  14372          foundWillMountName = 'UNSAFE_componentWillMount';
  14373        }
  14374
  14375        if (typeof instance.componentWillReceiveProps === 'function' && instance.componentWillReceiveProps.__suppressDeprecationWarning !== true) {
  14376          foundWillReceivePropsName = 'componentWillReceiveProps';
  14377        } else if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
  14378          foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';
  14379        }
  14380
  14381        if (typeof instance.componentWillUpdate === 'function' && instance.componentWillUpdate.__suppressDeprecationWarning !== true) {
  14382          foundWillUpdateName = 'componentWillUpdate';
  14383        } else if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
  14384          foundWillUpdateName = 'UNSAFE_componentWillUpdate';
  14385        }
  14386
  14387        if (foundWillMountName !== null || foundWillReceivePropsName !== null || foundWillUpdateName !== null) {
  14388          var _componentName = getComponentNameFromType(ctor) || 'Component';
  14389
  14390          var newApiName = typeof ctor.getDerivedStateFromProps === 'function' ? 'getDerivedStateFromProps()' : 'getSnapshotBeforeUpdate()';
  14391
  14392          if (!didWarnAboutLegacyLifecyclesAndDerivedState.has(_componentName)) {
  14393            didWarnAboutLegacyLifecyclesAndDerivedState.add(_componentName);
  14394
  14395            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://reactjs.org/link/unsafe-component-lifecycles', _componentName, newApiName, foundWillMountName !== null ? "\n  " + foundWillMountName : '', foundWillReceivePropsName !== null ? "\n  " + foundWillReceivePropsName : '', foundWillUpdateName !== null ? "\n  " + foundWillUpdateName : '');
  14396          }
  14397        }
  14398      }
  14399    } // Cache unmasked context so we can avoid recreating masked context unless necessary.
  14400    // ReactFiberContext usually updates this cache but can't for newly-created instances.
  14401
  14402
  14403    if (isLegacyContextConsumer) {
  14404      cacheContext(workInProgress, unmaskedContext, context);
  14405    }
  14406
  14407    return instance;
  14408  }
  14409
  14410  function callComponentWillMount(workInProgress, instance) {
  14411    var oldState = instance.state;
  14412
  14413    if (typeof instance.componentWillMount === 'function') {
  14414      instance.componentWillMount();
  14415    }
  14416
  14417    if (typeof instance.UNSAFE_componentWillMount === 'function') {
  14418      instance.UNSAFE_componentWillMount();
  14419    }
  14420
  14421    if (oldState !== instance.state) {
  14422      {
  14423        error('%s.componentWillMount(): Assigning directly to this.state is ' + "deprecated (except inside a component's " + 'constructor). Use setState instead.', getComponentNameFromFiber(workInProgress) || 'Component');
  14424      }
  14425
  14426      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
  14427    }
  14428  }
  14429
  14430  function callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext) {
  14431    var oldState = instance.state;
  14432
  14433    if (typeof instance.componentWillReceiveProps === 'function') {
  14434      instance.componentWillReceiveProps(newProps, nextContext);
  14435    }
  14436
  14437    if (typeof instance.UNSAFE_componentWillReceiveProps === 'function') {
  14438      instance.UNSAFE_componentWillReceiveProps(newProps, nextContext);
  14439    }
  14440
  14441    if (instance.state !== oldState) {
  14442      {
  14443        var componentName = getComponentNameFromFiber(workInProgress) || 'Component';
  14444
  14445        if (!didWarnAboutStateAssignmentForComponent.has(componentName)) {
  14446          didWarnAboutStateAssignmentForComponent.add(componentName);
  14447
  14448          error('%s.componentWillReceiveProps(): Assigning directly to ' + "this.state is deprecated (except inside a component's " + 'constructor). Use setState instead.', componentName);
  14449        }
  14450      }
  14451
  14452      classComponentUpdater.enqueueReplaceState(instance, instance.state, null);
  14453    }
  14454  } // Invokes the mount life-cycles on a previously never rendered instance.
  14455
  14456
  14457  function mountClassInstance(workInProgress, ctor, newProps, renderLanes) {
  14458    {
  14459      checkClassInstance(workInProgress, ctor, newProps);
  14460    }
  14461
  14462    var instance = workInProgress.stateNode;
  14463    instance.props = newProps;
  14464    instance.state = workInProgress.memoizedState;
  14465    instance.refs = emptyRefsObject;
  14466    initializeUpdateQueue(workInProgress);
  14467    var contextType = ctor.contextType;
  14468
  14469    if (typeof contextType === 'object' && contextType !== null) {
  14470      instance.context = readContext(contextType);
  14471    } else {
  14472      var unmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
  14473      instance.context = getMaskedContext(workInProgress, unmaskedContext);
  14474    }
  14475
  14476    {
  14477      if (instance.state === newProps) {
  14478        var componentName = getComponentNameFromType(ctor) || 'Component';
  14479
  14480        if (!didWarnAboutDirectlyAssigningPropsToState.has(componentName)) {
  14481          didWarnAboutDirectlyAssigningPropsToState.add(componentName);
  14482
  14483          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);
  14484        }
  14485      }
  14486
  14487      if (workInProgress.mode & StrictLegacyMode) {
  14488        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, instance);
  14489      }
  14490
  14491      {
  14492        ReactStrictModeWarnings.recordUnsafeLifecycleWarnings(workInProgress, instance);
  14493      }
  14494    }
  14495
  14496    instance.state = workInProgress.memoizedState;
  14497    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
  14498
  14499    if (typeof getDerivedStateFromProps === 'function') {
  14500      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
  14501      instance.state = workInProgress.memoizedState;
  14502    } // In order to support react-lifecycles-compat polyfilled components,
  14503    // Unsafe lifecycles should not be invoked for components using the new APIs.
  14504
  14505
  14506    if (typeof ctor.getDerivedStateFromProps !== 'function' && typeof instance.getSnapshotBeforeUpdate !== 'function' && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
  14507      callComponentWillMount(workInProgress, instance); // If we had additional state updates during this life-cycle, let's
  14508      // process them now.
  14509
  14510      processUpdateQueue(workInProgress, newProps, instance, renderLanes);
  14511      instance.state = workInProgress.memoizedState;
  14512    }
  14513
  14514    if (typeof instance.componentDidMount === 'function') {
  14515      var fiberFlags = Update;
  14516
  14517      {
  14518        fiberFlags |= LayoutStatic;
  14519      }
  14520
  14521      if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
  14522        fiberFlags |= MountLayoutDev;
  14523      }
  14524
  14525      workInProgress.flags |= fiberFlags;
  14526    }
  14527  }
  14528
  14529  function resumeMountClassInstance(workInProgress, ctor, newProps, renderLanes) {
  14530    var instance = workInProgress.stateNode;
  14531    var oldProps = workInProgress.memoizedProps;
  14532    instance.props = oldProps;
  14533    var oldContext = instance.context;
  14534    var contextType = ctor.contextType;
  14535    var nextContext = emptyContextObject;
  14536
  14537    if (typeof contextType === 'object' && contextType !== null) {
  14538      nextContext = readContext(contextType);
  14539    } else {
  14540      var nextLegacyUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
  14541      nextContext = getMaskedContext(workInProgress, nextLegacyUnmaskedContext);
  14542    }
  14543
  14544    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
  14545    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
  14546    // ever the previously attempted to render - not the "current". However,
  14547    // during componentDidUpdate we pass the "current" props.
  14548    // In order to support react-lifecycles-compat polyfilled components,
  14549    // Unsafe lifecycles should not be invoked for components using the new APIs.
  14550
  14551    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
  14552      if (oldProps !== newProps || oldContext !== nextContext) {
  14553        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
  14554      }
  14555    }
  14556
  14557    resetHasForceUpdateBeforeProcessing();
  14558    var oldState = workInProgress.memoizedState;
  14559    var newState = instance.state = oldState;
  14560    processUpdateQueue(workInProgress, newProps, instance, renderLanes);
  14561    newState = workInProgress.memoizedState;
  14562
  14563    if (oldProps === newProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing()) {
  14564      // If an update was already in progress, we should schedule an Update
  14565      // effect even though we're bailing out, so that cWU/cDU are called.
  14566      if (typeof instance.componentDidMount === 'function') {
  14567        var fiberFlags = Update;
  14568
  14569        {
  14570          fiberFlags |= LayoutStatic;
  14571        }
  14572
  14573        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
  14574          fiberFlags |= MountLayoutDev;
  14575        }
  14576
  14577        workInProgress.flags |= fiberFlags;
  14578      }
  14579
  14580      return false;
  14581    }
  14582
  14583    if (typeof getDerivedStateFromProps === 'function') {
  14584      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
  14585      newState = workInProgress.memoizedState;
  14586    }
  14587
  14588    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext);
  14589
  14590    if (shouldUpdate) {
  14591      // In order to support react-lifecycles-compat polyfilled components,
  14592      // Unsafe lifecycles should not be invoked for components using the new APIs.
  14593      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillMount === 'function' || typeof instance.componentWillMount === 'function')) {
  14594        if (typeof instance.componentWillMount === 'function') {
  14595          instance.componentWillMount();
  14596        }
  14597
  14598        if (typeof instance.UNSAFE_componentWillMount === 'function') {
  14599          instance.UNSAFE_componentWillMount();
  14600        }
  14601      }
  14602
  14603      if (typeof instance.componentDidMount === 'function') {
  14604        var _fiberFlags = Update;
  14605
  14606        {
  14607          _fiberFlags |= LayoutStatic;
  14608        }
  14609
  14610        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
  14611          _fiberFlags |= MountLayoutDev;
  14612        }
  14613
  14614        workInProgress.flags |= _fiberFlags;
  14615      }
  14616    } else {
  14617      // If an update was already in progress, we should schedule an Update
  14618      // effect even though we're bailing out, so that cWU/cDU are called.
  14619      if (typeof instance.componentDidMount === 'function') {
  14620        var _fiberFlags2 = Update;
  14621
  14622        {
  14623          _fiberFlags2 |= LayoutStatic;
  14624        }
  14625
  14626        if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
  14627          _fiberFlags2 |= MountLayoutDev;
  14628        }
  14629
  14630        workInProgress.flags |= _fiberFlags2;
  14631      } // If shouldComponentUpdate returned false, we should still update the
  14632      // memoized state to indicate that this work can be reused.
  14633
  14634
  14635      workInProgress.memoizedProps = newProps;
  14636      workInProgress.memoizedState = newState;
  14637    } // Update the existing instance's state, props, and context pointers even
  14638    // if shouldComponentUpdate returns false.
  14639
  14640
  14641    instance.props = newProps;
  14642    instance.state = newState;
  14643    instance.context = nextContext;
  14644    return shouldUpdate;
  14645  } // Invokes the update life-cycles and returns false if it shouldn't rerender.
  14646
  14647
  14648  function updateClassInstance(current, workInProgress, ctor, newProps, renderLanes) {
  14649    var instance = workInProgress.stateNode;
  14650    cloneUpdateQueue(current, workInProgress);
  14651    var unresolvedOldProps = workInProgress.memoizedProps;
  14652    var oldProps = workInProgress.type === workInProgress.elementType ? unresolvedOldProps : resolveDefaultProps(workInProgress.type, unresolvedOldProps);
  14653    instance.props = oldProps;
  14654    var unresolvedNewProps = workInProgress.pendingProps;
  14655    var oldContext = instance.context;
  14656    var contextType = ctor.contextType;
  14657    var nextContext = emptyContextObject;
  14658
  14659    if (typeof contextType === 'object' && contextType !== null) {
  14660      nextContext = readContext(contextType);
  14661    } else {
  14662      var nextUnmaskedContext = getUnmaskedContext(workInProgress, ctor, true);
  14663      nextContext = getMaskedContext(workInProgress, nextUnmaskedContext);
  14664    }
  14665
  14666    var getDerivedStateFromProps = ctor.getDerivedStateFromProps;
  14667    var hasNewLifecycles = typeof getDerivedStateFromProps === 'function' || typeof instance.getSnapshotBeforeUpdate === 'function'; // Note: During these life-cycles, instance.props/instance.state are what
  14668    // ever the previously attempted to render - not the "current". However,
  14669    // during componentDidUpdate we pass the "current" props.
  14670    // In order to support react-lifecycles-compat polyfilled components,
  14671    // Unsafe lifecycles should not be invoked for components using the new APIs.
  14672
  14673    if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillReceiveProps === 'function' || typeof instance.componentWillReceiveProps === 'function')) {
  14674      if (unresolvedOldProps !== unresolvedNewProps || oldContext !== nextContext) {
  14675        callComponentWillReceiveProps(workInProgress, instance, newProps, nextContext);
  14676      }
  14677    }
  14678
  14679    resetHasForceUpdateBeforeProcessing();
  14680    var oldState = workInProgress.memoizedState;
  14681    var newState = instance.state = oldState;
  14682    processUpdateQueue(workInProgress, newProps, instance, renderLanes);
  14683    newState = workInProgress.memoizedState;
  14684
  14685    if (unresolvedOldProps === unresolvedNewProps && oldState === newState && !hasContextChanged() && !checkHasForceUpdateAfterProcessing() && !(enableLazyContextPropagation   )) {
  14686      // If an update was already in progress, we should schedule an Update
  14687      // effect even though we're bailing out, so that cWU/cDU are called.
  14688      if (typeof instance.componentDidUpdate === 'function') {
  14689        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
  14690          workInProgress.flags |= Update;
  14691        }
  14692      }
  14693
  14694      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
  14695        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
  14696          workInProgress.flags |= Snapshot;
  14697        }
  14698      }
  14699
  14700      return false;
  14701    }
  14702
  14703    if (typeof getDerivedStateFromProps === 'function') {
  14704      applyDerivedStateFromProps(workInProgress, ctor, getDerivedStateFromProps, newProps);
  14705      newState = workInProgress.memoizedState;
  14706    }
  14707
  14708    var shouldUpdate = checkHasForceUpdateAfterProcessing() || checkShouldComponentUpdate(workInProgress, ctor, oldProps, newProps, oldState, newState, nextContext) || // TODO: In some cases, we'll end up checking if context has changed twice,
  14709    // both before and after `shouldComponentUpdate` has been called. Not ideal,
  14710    // but I'm loath to refactor this function. This only happens for memoized
  14711    // components so it's not that common.
  14712    enableLazyContextPropagation   ;
  14713
  14714    if (shouldUpdate) {
  14715      // In order to support react-lifecycles-compat polyfilled components,
  14716      // Unsafe lifecycles should not be invoked for components using the new APIs.
  14717      if (!hasNewLifecycles && (typeof instance.UNSAFE_componentWillUpdate === 'function' || typeof instance.componentWillUpdate === 'function')) {
  14718        if (typeof instance.componentWillUpdate === 'function') {
  14719          instance.componentWillUpdate(newProps, newState, nextContext);
  14720        }
  14721
  14722        if (typeof instance.UNSAFE_componentWillUpdate === 'function') {
  14723          instance.UNSAFE_componentWillUpdate(newProps, newState, nextContext);
  14724        }
  14725      }
  14726
  14727      if (typeof instance.componentDidUpdate === 'function') {
  14728        workInProgress.flags |= Update;
  14729      }
  14730
  14731      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
  14732        workInProgress.flags |= Snapshot;
  14733      }
  14734    } else {
  14735      // If an update was already in progress, we should schedule an Update
  14736      // effect even though we're bailing out, so that cWU/cDU are called.
  14737      if (typeof instance.componentDidUpdate === 'function') {
  14738        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
  14739          workInProgress.flags |= Update;
  14740        }
  14741      }
  14742
  14743      if (typeof instance.getSnapshotBeforeUpdate === 'function') {
  14744        if (unresolvedOldProps !== current.memoizedProps || oldState !== current.memoizedState) {
  14745          workInProgress.flags |= Snapshot;
  14746        }
  14747      } // If shouldComponentUpdate returned false, we should still update the
  14748      // memoized props/state to indicate that this work can be reused.
  14749
  14750
  14751      workInProgress.memoizedProps = newProps;
  14752      workInProgress.memoizedState = newState;
  14753    } // Update the existing instance's state, props, and context pointers even
  14754    // if shouldComponentUpdate returns false.
  14755
  14756
  14757    instance.props = newProps;
  14758    instance.state = newState;
  14759    instance.context = nextContext;
  14760    return shouldUpdate;
  14761  }
  14762
  14763  var didWarnAboutMaps;
  14764  var didWarnAboutGenerators;
  14765  var didWarnAboutStringRefs;
  14766  var ownerHasKeyUseWarning;
  14767  var ownerHasFunctionTypeWarning;
  14768
  14769  var warnForMissingKey = function (child, returnFiber) {};
  14770
  14771  {
  14772    didWarnAboutMaps = false;
  14773    didWarnAboutGenerators = false;
  14774    didWarnAboutStringRefs = {};
  14775    /**
  14776     * Warn if there's no key explicitly set on dynamic arrays of children or
  14777     * object keys are not valid. This allows us to keep track of children between
  14778     * updates.
  14779     */
  14780
  14781    ownerHasKeyUseWarning = {};
  14782    ownerHasFunctionTypeWarning = {};
  14783
  14784    warnForMissingKey = function (child, returnFiber) {
  14785      if (child === null || typeof child !== 'object') {
  14786        return;
  14787      }
  14788
  14789      if (!child._store || child._store.validated || child.key != null) {
  14790        return;
  14791      }
  14792
  14793      if (typeof child._store !== 'object') {
  14794        throw new Error('React Component in warnForMissingKey should have a _store. ' + 'This error is likely caused by a bug in React. Please file an issue.');
  14795      }
  14796
  14797      child._store.validated = true;
  14798      var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
  14799
  14800      if (ownerHasKeyUseWarning[componentName]) {
  14801        return;
  14802      }
  14803
  14804      ownerHasKeyUseWarning[componentName] = true;
  14805
  14806      error('Each child in a list should have a unique ' + '"key" prop. See https://reactjs.org/link/warning-keys for ' + 'more information.');
  14807    };
  14808  }
  14809
  14810  function coerceRef(returnFiber, current, element) {
  14811    var mixedRef = element.ref;
  14812
  14813    if (mixedRef !== null && typeof mixedRef !== 'function' && typeof mixedRef !== 'object') {
  14814      {
  14815        // TODO: Clean this up once we turn on the string ref warning for
  14816        // everyone, because the strict mode case will no longer be relevant
  14817        if ((returnFiber.mode & StrictLegacyMode || warnAboutStringRefs) && // We warn in ReactElement.js if owner and self are equal for string refs
  14818        // because these cannot be automatically converted to an arrow function
  14819        // using a codemod. Therefore, we don't have to warn about string refs again.
  14820        !(element._owner && element._self && element._owner.stateNode !== element._self)) {
  14821          var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
  14822
  14823          if (!didWarnAboutStringRefs[componentName]) {
  14824            {
  14825              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://reactjs.org/link/strict-mode-string-ref', mixedRef);
  14826            }
  14827
  14828            didWarnAboutStringRefs[componentName] = true;
  14829          }
  14830        }
  14831      }
  14832
  14833      if (element._owner) {
  14834        var owner = element._owner;
  14835        var inst;
  14836
  14837        if (owner) {
  14838          var ownerFiber = owner;
  14839
  14840          if (ownerFiber.tag !== ClassComponent) {
  14841            throw new Error('Function components cannot have string refs. ' + 'We recommend using useRef() instead. ' + 'Learn more about using refs safely here: ' + 'https://reactjs.org/link/strict-mode-string-ref');
  14842          }
  14843
  14844          inst = ownerFiber.stateNode;
  14845        }
  14846
  14847        if (!inst) {
  14848          throw new Error("Missing owner for string ref " + mixedRef + ". This error is likely caused by a " + 'bug in React. Please file an issue.');
  14849        } // Assigning this to a const so Flow knows it won't change in the closure
  14850
  14851
  14852        var resolvedInst = inst;
  14853
  14854        {
  14855          checkPropStringCoercion(mixedRef, 'ref');
  14856        }
  14857
  14858        var stringRef = '' + mixedRef; // Check if previous string ref matches new string ref
  14859
  14860        if (current !== null && current.ref !== null && typeof current.ref === 'function' && current.ref._stringRef === stringRef) {
  14861          return current.ref;
  14862        }
  14863
  14864        var ref = function (value) {
  14865          var refs = resolvedInst.refs;
  14866
  14867          if (refs === emptyRefsObject) {
  14868            // This is a lazy pooled frozen object, so we need to initialize.
  14869            refs = resolvedInst.refs = {};
  14870          }
  14871
  14872          if (value === null) {
  14873            delete refs[stringRef];
  14874          } else {
  14875            refs[stringRef] = value;
  14876          }
  14877        };
  14878
  14879        ref._stringRef = stringRef;
  14880        return ref;
  14881      } else {
  14882        if (typeof mixedRef !== 'string') {
  14883          throw new Error('Expected ref to be a function, a string, an object returned by React.createRef(), or null.');
  14884        }
  14885
  14886        if (!element._owner) {
  14887          throw new Error("Element ref was specified as a string (" + mixedRef + ") but no owner was set. This could happen for one of" + ' the following reasons:\n' + '1. You may be adding a ref to a function component\n' + "2. You may be adding a ref to a component that was not created inside a component's render method\n" + '3. You have multiple copies of React loaded\n' + 'See https://reactjs.org/link/refs-must-have-owner for more information.');
  14888        }
  14889      }
  14890    }
  14891
  14892    return mixedRef;
  14893  }
  14894
  14895  function throwOnInvalidObjectType(returnFiber, newChild) {
  14896    var childString = Object.prototype.toString.call(newChild);
  14897    throw new Error("Objects are not valid as a React child (found: " + (childString === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : childString) + "). " + 'If you meant to render a collection of children, use an array ' + 'instead.');
  14898  }
  14899
  14900  function warnOnFunctionType(returnFiber) {
  14901    {
  14902      var componentName = getComponentNameFromFiber(returnFiber) || 'Component';
  14903
  14904      if (ownerHasFunctionTypeWarning[componentName]) {
  14905        return;
  14906      }
  14907
  14908      ownerHasFunctionTypeWarning[componentName] = true;
  14909
  14910      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.');
  14911    }
  14912  }
  14913
  14914  function resolveLazy(lazyType) {
  14915    var payload = lazyType._payload;
  14916    var init = lazyType._init;
  14917    return init(payload);
  14918  } // This wrapper function exists because I expect to clone the code in each path
  14919  // to be able to optimize each path individually by branching early. This needs
  14920  // a compiler or we can do it manually. Helpers that don't need this branching
  14921  // live outside of this function.
  14922
  14923
  14924  function ChildReconciler(shouldTrackSideEffects) {
  14925    function deleteChild(returnFiber, childToDelete) {
  14926      if (!shouldTrackSideEffects) {
  14927        // Noop.
  14928        return;
  14929      }
  14930
  14931      var deletions = returnFiber.deletions;
  14932
  14933      if (deletions === null) {
  14934        returnFiber.deletions = [childToDelete];
  14935        returnFiber.flags |= ChildDeletion;
  14936      } else {
  14937        deletions.push(childToDelete);
  14938      }
  14939    }
  14940
  14941    function deleteRemainingChildren(returnFiber, currentFirstChild) {
  14942      if (!shouldTrackSideEffects) {
  14943        // Noop.
  14944        return null;
  14945      } // TODO: For the shouldClone case, this could be micro-optimized a bit by
  14946      // assuming that after the first child we've already added everything.
  14947
  14948
  14949      var childToDelete = currentFirstChild;
  14950
  14951      while (childToDelete !== null) {
  14952        deleteChild(returnFiber, childToDelete);
  14953        childToDelete = childToDelete.sibling;
  14954      }
  14955
  14956      return null;
  14957    }
  14958
  14959    function mapRemainingChildren(returnFiber, currentFirstChild) {
  14960      // Add the remaining children to a temporary map so that we can find them by
  14961      // keys quickly. Implicit (null) keys get added to this set with their index
  14962      // instead.
  14963      var existingChildren = new Map();
  14964      var existingChild = currentFirstChild;
  14965
  14966      while (existingChild !== null) {
  14967        if (existingChild.key !== null) {
  14968          existingChildren.set(existingChild.key, existingChild);
  14969        } else {
  14970          existingChildren.set(existingChild.index, existingChild);
  14971        }
  14972
  14973        existingChild = existingChild.sibling;
  14974      }
  14975
  14976      return existingChildren;
  14977    }
  14978
  14979    function useFiber(fiber, pendingProps) {
  14980      // We currently set sibling to null and index to 0 here because it is easy
  14981      // to forget to do before returning it. E.g. for the single child case.
  14982      var clone = createWorkInProgress(fiber, pendingProps);
  14983      clone.index = 0;
  14984      clone.sibling = null;
  14985      return clone;
  14986    }
  14987
  14988    function placeChild(newFiber, lastPlacedIndex, newIndex) {
  14989      newFiber.index = newIndex;
  14990
  14991      if (!shouldTrackSideEffects) {
  14992        // During hydration, the useId algorithm needs to know which fibers are
  14993        // part of a list of children (arrays, iterators).
  14994        newFiber.flags |= Forked;
  14995        return lastPlacedIndex;
  14996      }
  14997
  14998      var current = newFiber.alternate;
  14999
  15000      if (current !== null) {
  15001        var oldIndex = current.index;
  15002
  15003        if (oldIndex < lastPlacedIndex) {
  15004          // This is a move.
  15005          newFiber.flags |= Placement;
  15006          return lastPlacedIndex;
  15007        } else {
  15008          // This item can stay in place.
  15009          return oldIndex;
  15010        }
  15011      } else {
  15012        // This is an insertion.
  15013        newFiber.flags |= Placement;
  15014        return lastPlacedIndex;
  15015      }
  15016    }
  15017
  15018    function placeSingleChild(newFiber) {
  15019      // This is simpler for the single child case. We only need to do a
  15020      // placement for inserting new children.
  15021      if (shouldTrackSideEffects && newFiber.alternate === null) {
  15022        newFiber.flags |= Placement;
  15023      }
  15024
  15025      return newFiber;
  15026    }
  15027
  15028    function updateTextNode(returnFiber, current, textContent, lanes) {
  15029      if (current === null || current.tag !== HostText) {
  15030        // Insert
  15031        var created = createFiberFromText(textContent, returnFiber.mode, lanes);
  15032        created.return = returnFiber;
  15033        return created;
  15034      } else {
  15035        // Update
  15036        var existing = useFiber(current, textContent);
  15037        existing.return = returnFiber;
  15038        return existing;
  15039      }
  15040    }
  15041
  15042    function updateElement(returnFiber, current, element, lanes) {
  15043      var elementType = element.type;
  15044
  15045      if (elementType === REACT_FRAGMENT_TYPE) {
  15046        return updateFragment(returnFiber, current, element.props.children, lanes, element.key);
  15047      }
  15048
  15049      if (current !== null) {
  15050        if (current.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
  15051         isCompatibleFamilyForHotReloading(current, element) ) || // Lazy types should reconcile their resolved type.
  15052        // We need to do this after the Hot Reloading check above,
  15053        // because hot reloading has different semantics than prod because
  15054        // it doesn't resuspend. So we can't let the call below suspend.
  15055        typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === current.type) {
  15056          // Move based on index
  15057          var existing = useFiber(current, element.props);
  15058          existing.ref = coerceRef(returnFiber, current, element);
  15059          existing.return = returnFiber;
  15060
  15061          {
  15062            existing._debugSource = element._source;
  15063            existing._debugOwner = element._owner;
  15064          }
  15065
  15066          return existing;
  15067        }
  15068      } // Insert
  15069
  15070
  15071      var created = createFiberFromElement(element, returnFiber.mode, lanes);
  15072      created.ref = coerceRef(returnFiber, current, element);
  15073      created.return = returnFiber;
  15074      return created;
  15075    }
  15076
  15077    function updatePortal(returnFiber, current, portal, lanes) {
  15078      if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {
  15079        // Insert
  15080        var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
  15081        created.return = returnFiber;
  15082        return created;
  15083      } else {
  15084        // Update
  15085        var existing = useFiber(current, portal.children || []);
  15086        existing.return = returnFiber;
  15087        return existing;
  15088      }
  15089    }
  15090
  15091    function updateFragment(returnFiber, current, fragment, lanes, key) {
  15092      if (current === null || current.tag !== Fragment) {
  15093        // Insert
  15094        var created = createFiberFromFragment(fragment, returnFiber.mode, lanes, key);
  15095        created.return = returnFiber;
  15096        return created;
  15097      } else {
  15098        // Update
  15099        var existing = useFiber(current, fragment);
  15100        existing.return = returnFiber;
  15101        return existing;
  15102      }
  15103    }
  15104
  15105    function createChild(returnFiber, newChild, lanes) {
  15106      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
  15107        // Text nodes don't have keys. If the previous node is implicitly keyed
  15108        // we can continue to replace it without aborting even if it is not a text
  15109        // node.
  15110        var created = createFiberFromText('' + newChild, returnFiber.mode, lanes);
  15111        created.return = returnFiber;
  15112        return created;
  15113      }
  15114
  15115      if (typeof newChild === 'object' && newChild !== null) {
  15116        switch (newChild.$$typeof) {
  15117          case REACT_ELEMENT_TYPE:
  15118            {
  15119              var _created = createFiberFromElement(newChild, returnFiber.mode, lanes);
  15120
  15121              _created.ref = coerceRef(returnFiber, null, newChild);
  15122              _created.return = returnFiber;
  15123              return _created;
  15124            }
  15125
  15126          case REACT_PORTAL_TYPE:
  15127            {
  15128              var _created2 = createFiberFromPortal(newChild, returnFiber.mode, lanes);
  15129
  15130              _created2.return = returnFiber;
  15131              return _created2;
  15132            }
  15133
  15134          case REACT_LAZY_TYPE:
  15135            {
  15136              var payload = newChild._payload;
  15137              var init = newChild._init;
  15138              return createChild(returnFiber, init(payload), lanes);
  15139            }
  15140        }
  15141
  15142        if (isArray(newChild) || getIteratorFn(newChild)) {
  15143          var _created3 = createFiberFromFragment(newChild, returnFiber.mode, lanes, null);
  15144
  15145          _created3.return = returnFiber;
  15146          return _created3;
  15147        }
  15148
  15149        throwOnInvalidObjectType(returnFiber, newChild);
  15150      }
  15151
  15152      {
  15153        if (typeof newChild === 'function') {
  15154          warnOnFunctionType(returnFiber);
  15155        }
  15156      }
  15157
  15158      return null;
  15159    }
  15160
  15161    function updateSlot(returnFiber, oldFiber, newChild, lanes) {
  15162      // Update the fiber if the keys match, otherwise return null.
  15163      var key = oldFiber !== null ? oldFiber.key : null;
  15164
  15165      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
  15166        // Text nodes don't have keys. If the previous node is implicitly keyed
  15167        // we can continue to replace it without aborting even if it is not a text
  15168        // node.
  15169        if (key !== null) {
  15170          return null;
  15171        }
  15172
  15173        return updateTextNode(returnFiber, oldFiber, '' + newChild, lanes);
  15174      }
  15175
  15176      if (typeof newChild === 'object' && newChild !== null) {
  15177        switch (newChild.$$typeof) {
  15178          case REACT_ELEMENT_TYPE:
  15179            {
  15180              if (newChild.key === key) {
  15181                return updateElement(returnFiber, oldFiber, newChild, lanes);
  15182              } else {
  15183                return null;
  15184              }
  15185            }
  15186
  15187          case REACT_PORTAL_TYPE:
  15188            {
  15189              if (newChild.key === key) {
  15190                return updatePortal(returnFiber, oldFiber, newChild, lanes);
  15191              } else {
  15192                return null;
  15193              }
  15194            }
  15195
  15196          case REACT_LAZY_TYPE:
  15197            {
  15198              var payload = newChild._payload;
  15199              var init = newChild._init;
  15200              return updateSlot(returnFiber, oldFiber, init(payload), lanes);
  15201            }
  15202        }
  15203
  15204        if (isArray(newChild) || getIteratorFn(newChild)) {
  15205          if (key !== null) {
  15206            return null;
  15207          }
  15208
  15209          return updateFragment(returnFiber, oldFiber, newChild, lanes, null);
  15210        }
  15211
  15212        throwOnInvalidObjectType(returnFiber, newChild);
  15213      }
  15214
  15215      {
  15216        if (typeof newChild === 'function') {
  15217          warnOnFunctionType(returnFiber);
  15218        }
  15219      }
  15220
  15221      return null;
  15222    }
  15223
  15224    function updateFromMap(existingChildren, returnFiber, newIdx, newChild, lanes) {
  15225      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
  15226        // Text nodes don't have keys, so we neither have to check the old nor
  15227        // new node for the key. If both are text nodes, they match.
  15228        var matchedFiber = existingChildren.get(newIdx) || null;
  15229        return updateTextNode(returnFiber, matchedFiber, '' + newChild, lanes);
  15230      }
  15231
  15232      if (typeof newChild === 'object' && newChild !== null) {
  15233        switch (newChild.$$typeof) {
  15234          case REACT_ELEMENT_TYPE:
  15235            {
  15236              var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
  15237
  15238              return updateElement(returnFiber, _matchedFiber, newChild, lanes);
  15239            }
  15240
  15241          case REACT_PORTAL_TYPE:
  15242            {
  15243              var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;
  15244
  15245              return updatePortal(returnFiber, _matchedFiber2, newChild, lanes);
  15246            }
  15247
  15248          case REACT_LAZY_TYPE:
  15249            var payload = newChild._payload;
  15250            var init = newChild._init;
  15251            return updateFromMap(existingChildren, returnFiber, newIdx, init(payload), lanes);
  15252        }
  15253
  15254        if (isArray(newChild) || getIteratorFn(newChild)) {
  15255          var _matchedFiber3 = existingChildren.get(newIdx) || null;
  15256
  15257          return updateFragment(returnFiber, _matchedFiber3, newChild, lanes, null);
  15258        }
  15259
  15260        throwOnInvalidObjectType(returnFiber, newChild);
  15261      }
  15262
  15263      {
  15264        if (typeof newChild === 'function') {
  15265          warnOnFunctionType(returnFiber);
  15266        }
  15267      }
  15268
  15269      return null;
  15270    }
  15271    /**
  15272     * Warns if there is a duplicate or missing key
  15273     */
  15274
  15275
  15276    function warnOnInvalidKey(child, knownKeys, returnFiber) {
  15277      {
  15278        if (typeof child !== 'object' || child === null) {
  15279          return knownKeys;
  15280        }
  15281
  15282        switch (child.$$typeof) {
  15283          case REACT_ELEMENT_TYPE:
  15284          case REACT_PORTAL_TYPE:
  15285            warnForMissingKey(child, returnFiber);
  15286            var key = child.key;
  15287
  15288            if (typeof key !== 'string') {
  15289              break;
  15290            }
  15291
  15292            if (knownKeys === null) {
  15293              knownKeys = new Set();
  15294              knownKeys.add(key);
  15295              break;
  15296            }
  15297
  15298            if (!knownKeys.has(key)) {
  15299              knownKeys.add(key);
  15300              break;
  15301            }
  15302
  15303            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);
  15304
  15305            break;
  15306
  15307          case REACT_LAZY_TYPE:
  15308            var payload = child._payload;
  15309            var init = child._init;
  15310            warnOnInvalidKey(init(payload), knownKeys, returnFiber);
  15311            break;
  15312        }
  15313      }
  15314
  15315      return knownKeys;
  15316    }
  15317
  15318    function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, lanes) {
  15319      // This algorithm can't optimize by searching from both ends since we
  15320      // don't have backpointers on fibers. I'm trying to see how far we can get
  15321      // with that model. If it ends up not being worth the tradeoffs, we can
  15322      // add it later.
  15323      // Even with a two ended optimization, we'd want to optimize for the case
  15324      // where there are few changes and brute force the comparison instead of
  15325      // going for the Map. It'd like to explore hitting that path first in
  15326      // forward-only mode and only go for the Map once we notice that we need
  15327      // lots of look ahead. This doesn't handle reversal as well as two ended
  15328      // search but that's unusual. Besides, for the two ended optimization to
  15329      // work on Iterables, we'd need to copy the whole set.
  15330      // In this first iteration, we'll just live with hitting the bad case
  15331      // (adding everything to a Map) in for every insert/move.
  15332      // If you change this code, also update reconcileChildrenIterator() which
  15333      // uses the same algorithm.
  15334      {
  15335        // First, validate keys.
  15336        var knownKeys = null;
  15337
  15338        for (var i = 0; i < newChildren.length; i++) {
  15339          var child = newChildren[i];
  15340          knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
  15341        }
  15342      }
  15343
  15344      var resultingFirstChild = null;
  15345      var previousNewFiber = null;
  15346      var oldFiber = currentFirstChild;
  15347      var lastPlacedIndex = 0;
  15348      var newIdx = 0;
  15349      var nextOldFiber = null;
  15350
  15351      for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {
  15352        if (oldFiber.index > newIdx) {
  15353          nextOldFiber = oldFiber;
  15354          oldFiber = null;
  15355        } else {
  15356          nextOldFiber = oldFiber.sibling;
  15357        }
  15358
  15359        var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], lanes);
  15360
  15361        if (newFiber === null) {
  15362          // TODO: This breaks on empty slots like null children. That's
  15363          // unfortunate because it triggers the slow path all the time. We need
  15364          // a better way to communicate whether this was a miss or null,
  15365          // boolean, undefined, etc.
  15366          if (oldFiber === null) {
  15367            oldFiber = nextOldFiber;
  15368          }
  15369
  15370          break;
  15371        }
  15372
  15373        if (shouldTrackSideEffects) {
  15374          if (oldFiber && newFiber.alternate === null) {
  15375            // We matched the slot, but we didn't reuse the existing fiber, so we
  15376            // need to delete the existing child.
  15377            deleteChild(returnFiber, oldFiber);
  15378          }
  15379        }
  15380
  15381        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
  15382
  15383        if (previousNewFiber === null) {
  15384          // TODO: Move out of the loop. This only happens for the first run.
  15385          resultingFirstChild = newFiber;
  15386        } else {
  15387          // TODO: Defer siblings if we're not at the right index for this slot.
  15388          // I.e. if we had null values before, then we want to defer this
  15389          // for each null value. However, we also don't want to call updateSlot
  15390          // with the previous one.
  15391          previousNewFiber.sibling = newFiber;
  15392        }
  15393
  15394        previousNewFiber = newFiber;
  15395        oldFiber = nextOldFiber;
  15396      }
  15397
  15398      if (newIdx === newChildren.length) {
  15399        // We've reached the end of the new children. We can delete the rest.
  15400        deleteRemainingChildren(returnFiber, oldFiber);
  15401
  15402        if (getIsHydrating()) {
  15403          var numberOfForks = newIdx;
  15404          pushTreeFork(returnFiber, numberOfForks);
  15405        }
  15406
  15407        return resultingFirstChild;
  15408      }
  15409
  15410      if (oldFiber === null) {
  15411        // If we don't have any more existing children we can choose a fast path
  15412        // since the rest will all be insertions.
  15413        for (; newIdx < newChildren.length; newIdx++) {
  15414          var _newFiber = createChild(returnFiber, newChildren[newIdx], lanes);
  15415
  15416          if (_newFiber === null) {
  15417            continue;
  15418          }
  15419
  15420          lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);
  15421
  15422          if (previousNewFiber === null) {
  15423            // TODO: Move out of the loop. This only happens for the first run.
  15424            resultingFirstChild = _newFiber;
  15425          } else {
  15426            previousNewFiber.sibling = _newFiber;
  15427          }
  15428
  15429          previousNewFiber = _newFiber;
  15430        }
  15431
  15432        if (getIsHydrating()) {
  15433          var _numberOfForks = newIdx;
  15434          pushTreeFork(returnFiber, _numberOfForks);
  15435        }
  15436
  15437        return resultingFirstChild;
  15438      } // Add all children to a key map for quick lookups.
  15439
  15440
  15441      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
  15442
  15443      for (; newIdx < newChildren.length; newIdx++) {
  15444        var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], lanes);
  15445
  15446        if (_newFiber2 !== null) {
  15447          if (shouldTrackSideEffects) {
  15448            if (_newFiber2.alternate !== null) {
  15449              // The new fiber is a work in progress, but if there exists a
  15450              // current, that means that we reused the fiber. We need to delete
  15451              // it from the child list so that we don't add it to the deletion
  15452              // list.
  15453              existingChildren.delete(_newFiber2.key === null ? newIdx : _newFiber2.key);
  15454            }
  15455          }
  15456
  15457          lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);
  15458
  15459          if (previousNewFiber === null) {
  15460            resultingFirstChild = _newFiber2;
  15461          } else {
  15462            previousNewFiber.sibling = _newFiber2;
  15463          }
  15464
  15465          previousNewFiber = _newFiber2;
  15466        }
  15467      }
  15468
  15469      if (shouldTrackSideEffects) {
  15470        // Any existing children that weren't consumed above were deleted. We need
  15471        // to add them to the deletion list.
  15472        existingChildren.forEach(function (child) {
  15473          return deleteChild(returnFiber, child);
  15474        });
  15475      }
  15476
  15477      if (getIsHydrating()) {
  15478        var _numberOfForks2 = newIdx;
  15479        pushTreeFork(returnFiber, _numberOfForks2);
  15480      }
  15481
  15482      return resultingFirstChild;
  15483    }
  15484
  15485    function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, lanes) {
  15486      // This is the same implementation as reconcileChildrenArray(),
  15487      // but using the iterator instead.
  15488      var iteratorFn = getIteratorFn(newChildrenIterable);
  15489
  15490      if (typeof iteratorFn !== 'function') {
  15491        throw new Error('An object is not an iterable. This error is likely caused by a bug in ' + 'React. Please file an issue.');
  15492      }
  15493
  15494      {
  15495        // We don't support rendering Generators because it's a mutation.
  15496        // See https://github.com/facebook/react/issues/12995
  15497        if (typeof Symbol === 'function' && // $FlowFixMe Flow doesn't know about toStringTag
  15498        newChildrenIterable[Symbol.toStringTag] === 'Generator') {
  15499          if (!didWarnAboutGenerators) {
  15500            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.');
  15501          }
  15502
  15503          didWarnAboutGenerators = true;
  15504        } // Warn about using Maps as children
  15505
  15506
  15507        if (newChildrenIterable.entries === iteratorFn) {
  15508          if (!didWarnAboutMaps) {
  15509            error('Using Maps as children is not supported. ' + 'Use an array of keyed ReactElements instead.');
  15510          }
  15511
  15512          didWarnAboutMaps = true;
  15513        } // First, validate keys.
  15514        // We'll get a different iterator later for the main pass.
  15515
  15516
  15517        var _newChildren = iteratorFn.call(newChildrenIterable);
  15518
  15519        if (_newChildren) {
  15520          var knownKeys = null;
  15521
  15522          var _step = _newChildren.next();
  15523
  15524          for (; !_step.done; _step = _newChildren.next()) {
  15525            var child = _step.value;
  15526            knownKeys = warnOnInvalidKey(child, knownKeys, returnFiber);
  15527          }
  15528        }
  15529      }
  15530
  15531      var newChildren = iteratorFn.call(newChildrenIterable);
  15532
  15533      if (newChildren == null) {
  15534        throw new Error('An iterable object provided no iterator.');
  15535      }
  15536
  15537      var resultingFirstChild = null;
  15538      var previousNewFiber = null;
  15539      var oldFiber = currentFirstChild;
  15540      var lastPlacedIndex = 0;
  15541      var newIdx = 0;
  15542      var nextOldFiber = null;
  15543      var step = newChildren.next();
  15544
  15545      for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {
  15546        if (oldFiber.index > newIdx) {
  15547          nextOldFiber = oldFiber;
  15548          oldFiber = null;
  15549        } else {
  15550          nextOldFiber = oldFiber.sibling;
  15551        }
  15552
  15553        var newFiber = updateSlot(returnFiber, oldFiber, step.value, lanes);
  15554
  15555        if (newFiber === null) {
  15556          // TODO: This breaks on empty slots like null children. That's
  15557          // unfortunate because it triggers the slow path all the time. We need
  15558          // a better way to communicate whether this was a miss or null,
  15559          // boolean, undefined, etc.
  15560          if (oldFiber === null) {
  15561            oldFiber = nextOldFiber;
  15562          }
  15563
  15564          break;
  15565        }
  15566
  15567        if (shouldTrackSideEffects) {
  15568          if (oldFiber && newFiber.alternate === null) {
  15569            // We matched the slot, but we didn't reuse the existing fiber, so we
  15570            // need to delete the existing child.
  15571            deleteChild(returnFiber, oldFiber);
  15572          }
  15573        }
  15574
  15575        lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);
  15576
  15577        if (previousNewFiber === null) {
  15578          // TODO: Move out of the loop. This only happens for the first run.
  15579          resultingFirstChild = newFiber;
  15580        } else {
  15581          // TODO: Defer siblings if we're not at the right index for this slot.
  15582          // I.e. if we had null values before, then we want to defer this
  15583          // for each null value. However, we also don't want to call updateSlot
  15584          // with the previous one.
  15585          previousNewFiber.sibling = newFiber;
  15586        }
  15587
  15588        previousNewFiber = newFiber;
  15589        oldFiber = nextOldFiber;
  15590      }
  15591
  15592      if (step.done) {
  15593        // We've reached the end of the new children. We can delete the rest.
  15594        deleteRemainingChildren(returnFiber, oldFiber);
  15595
  15596        if (getIsHydrating()) {
  15597          var numberOfForks = newIdx;
  15598          pushTreeFork(returnFiber, numberOfForks);
  15599        }
  15600
  15601        return resultingFirstChild;
  15602      }
  15603
  15604      if (oldFiber === null) {
  15605        // If we don't have any more existing children we can choose a fast path
  15606        // since the rest will all be insertions.
  15607        for (; !step.done; newIdx++, step = newChildren.next()) {
  15608          var _newFiber3 = createChild(returnFiber, step.value, lanes);
  15609
  15610          if (_newFiber3 === null) {
  15611            continue;
  15612          }
  15613
  15614          lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);
  15615
  15616          if (previousNewFiber === null) {
  15617            // TODO: Move out of the loop. This only happens for the first run.
  15618            resultingFirstChild = _newFiber3;
  15619          } else {
  15620            previousNewFiber.sibling = _newFiber3;
  15621          }
  15622
  15623          previousNewFiber = _newFiber3;
  15624        }
  15625
  15626        if (getIsHydrating()) {
  15627          var _numberOfForks3 = newIdx;
  15628          pushTreeFork(returnFiber, _numberOfForks3);
  15629        }
  15630
  15631        return resultingFirstChild;
  15632      } // Add all children to a key map for quick lookups.
  15633
  15634
  15635      var existingChildren = mapRemainingChildren(returnFiber, oldFiber); // Keep scanning and use the map to restore deleted items as moves.
  15636
  15637      for (; !step.done; newIdx++, step = newChildren.next()) {
  15638        var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, lanes);
  15639
  15640        if (_newFiber4 !== null) {
  15641          if (shouldTrackSideEffects) {
  15642            if (_newFiber4.alternate !== null) {
  15643              // The new fiber is a work in progress, but if there exists a
  15644              // current, that means that we reused the fiber. We need to delete
  15645              // it from the child list so that we don't add it to the deletion
  15646              // list.
  15647              existingChildren.delete(_newFiber4.key === null ? newIdx : _newFiber4.key);
  15648            }
  15649          }
  15650
  15651          lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);
  15652
  15653          if (previousNewFiber === null) {
  15654            resultingFirstChild = _newFiber4;
  15655          } else {
  15656            previousNewFiber.sibling = _newFiber4;
  15657          }
  15658
  15659          previousNewFiber = _newFiber4;
  15660        }
  15661      }
  15662
  15663      if (shouldTrackSideEffects) {
  15664        // Any existing children that weren't consumed above were deleted. We need
  15665        // to add them to the deletion list.
  15666        existingChildren.forEach(function (child) {
  15667          return deleteChild(returnFiber, child);
  15668        });
  15669      }
  15670
  15671      if (getIsHydrating()) {
  15672        var _numberOfForks4 = newIdx;
  15673        pushTreeFork(returnFiber, _numberOfForks4);
  15674      }
  15675
  15676      return resultingFirstChild;
  15677    }
  15678
  15679    function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, lanes) {
  15680      // There's no need to check for keys on text nodes since we don't have a
  15681      // way to define them.
  15682      if (currentFirstChild !== null && currentFirstChild.tag === HostText) {
  15683        // We already have an existing node so let's just update it and delete
  15684        // the rest.
  15685        deleteRemainingChildren(returnFiber, currentFirstChild.sibling);
  15686        var existing = useFiber(currentFirstChild, textContent);
  15687        existing.return = returnFiber;
  15688        return existing;
  15689      } // The existing first child is not a text node so we need to create one
  15690      // and delete the existing ones.
  15691
  15692
  15693      deleteRemainingChildren(returnFiber, currentFirstChild);
  15694      var created = createFiberFromText(textContent, returnFiber.mode, lanes);
  15695      created.return = returnFiber;
  15696      return created;
  15697    }
  15698
  15699    function reconcileSingleElement(returnFiber, currentFirstChild, element, lanes) {
  15700      var key = element.key;
  15701      var child = currentFirstChild;
  15702
  15703      while (child !== null) {
  15704        // TODO: If key === null and child.key === null, then this only applies to
  15705        // the first item in the list.
  15706        if (child.key === key) {
  15707          var elementType = element.type;
  15708
  15709          if (elementType === REACT_FRAGMENT_TYPE) {
  15710            if (child.tag === Fragment) {
  15711              deleteRemainingChildren(returnFiber, child.sibling);
  15712              var existing = useFiber(child, element.props.children);
  15713              existing.return = returnFiber;
  15714
  15715              {
  15716                existing._debugSource = element._source;
  15717                existing._debugOwner = element._owner;
  15718              }
  15719
  15720              return existing;
  15721            }
  15722          } else {
  15723            if (child.elementType === elementType || ( // Keep this check inline so it only runs on the false path:
  15724             isCompatibleFamilyForHotReloading(child, element) ) || // Lazy types should reconcile their resolved type.
  15725            // We need to do this after the Hot Reloading check above,
  15726            // because hot reloading has different semantics than prod because
  15727            // it doesn't resuspend. So we can't let the call below suspend.
  15728            typeof elementType === 'object' && elementType !== null && elementType.$$typeof === REACT_LAZY_TYPE && resolveLazy(elementType) === child.type) {
  15729              deleteRemainingChildren(returnFiber, child.sibling);
  15730
  15731              var _existing = useFiber(child, element.props);
  15732
  15733              _existing.ref = coerceRef(returnFiber, child, element);
  15734              _existing.return = returnFiber;
  15735
  15736              {
  15737                _existing._debugSource = element._source;
  15738                _existing._debugOwner = element._owner;
  15739              }
  15740
  15741              return _existing;
  15742            }
  15743          } // Didn't match.
  15744
  15745
  15746          deleteRemainingChildren(returnFiber, child);
  15747          break;
  15748        } else {
  15749          deleteChild(returnFiber, child);
  15750        }
  15751
  15752        child = child.sibling;
  15753      }
  15754
  15755      if (element.type === REACT_FRAGMENT_TYPE) {
  15756        var created = createFiberFromFragment(element.props.children, returnFiber.mode, lanes, element.key);
  15757        created.return = returnFiber;
  15758        return created;
  15759      } else {
  15760        var _created4 = createFiberFromElement(element, returnFiber.mode, lanes);
  15761
  15762        _created4.ref = coerceRef(returnFiber, currentFirstChild, element);
  15763        _created4.return = returnFiber;
  15764        return _created4;
  15765      }
  15766    }
  15767
  15768    function reconcileSinglePortal(returnFiber, currentFirstChild, portal, lanes) {
  15769      var key = portal.key;
  15770      var child = currentFirstChild;
  15771
  15772      while (child !== null) {
  15773        // TODO: If key === null and child.key === null, then this only applies to
  15774        // the first item in the list.
  15775        if (child.key === key) {
  15776          if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {
  15777            deleteRemainingChildren(returnFiber, child.sibling);
  15778            var existing = useFiber(child, portal.children || []);
  15779            existing.return = returnFiber;
  15780            return existing;
  15781          } else {
  15782            deleteRemainingChildren(returnFiber, child);
  15783            break;
  15784          }
  15785        } else {
  15786          deleteChild(returnFiber, child);
  15787        }
  15788
  15789        child = child.sibling;
  15790      }
  15791
  15792      var created = createFiberFromPortal(portal, returnFiber.mode, lanes);
  15793      created.return = returnFiber;
  15794      return created;
  15795    } // This API will tag the children with the side-effect of the reconciliation
  15796    // itself. They will be added to the side-effect list as we pass through the
  15797    // children and the parent.
  15798
  15799
  15800    function reconcileChildFibers(returnFiber, currentFirstChild, newChild, lanes) {
  15801      // This function is not recursive.
  15802      // If the top level item is an array, we treat it as a set of children,
  15803      // not as a fragment. Nested arrays on the other hand will be treated as
  15804      // fragment nodes. Recursion happens at the normal flow.
  15805      // Handle top level unkeyed fragments as if they were arrays.
  15806      // This leads to an ambiguity between <>{[...]}</> and <>...</>.
  15807      // We treat the ambiguous cases above the same.
  15808      var isUnkeyedTopLevelFragment = typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null;
  15809
  15810      if (isUnkeyedTopLevelFragment) {
  15811        newChild = newChild.props.children;
  15812      } // Handle object types
  15813
  15814
  15815      if (typeof newChild === 'object' && newChild !== null) {
  15816        switch (newChild.$$typeof) {
  15817          case REACT_ELEMENT_TYPE:
  15818            return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, lanes));
  15819
  15820          case REACT_PORTAL_TYPE:
  15821            return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, lanes));
  15822
  15823          case REACT_LAZY_TYPE:
  15824            var payload = newChild._payload;
  15825            var init = newChild._init; // TODO: This function is supposed to be non-recursive.
  15826
  15827            return reconcileChildFibers(returnFiber, currentFirstChild, init(payload), lanes);
  15828        }
  15829
  15830        if (isArray(newChild)) {
  15831          return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, lanes);
  15832        }
  15833
  15834        if (getIteratorFn(newChild)) {
  15835          return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, lanes);
  15836        }
  15837
  15838        throwOnInvalidObjectType(returnFiber, newChild);
  15839      }
  15840
  15841      if (typeof newChild === 'string' && newChild !== '' || typeof newChild === 'number') {
  15842        return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, lanes));
  15843      }
  15844
  15845      {
  15846        if (typeof newChild === 'function') {
  15847          warnOnFunctionType(returnFiber);
  15848        }
  15849      } // Remaining cases are all treated as empty.
  15850
  15851
  15852      return deleteRemainingChildren(returnFiber, currentFirstChild);
  15853    }
  15854
  15855    return reconcileChildFibers;
  15856  }
  15857
  15858  var reconcileChildFibers = ChildReconciler(true);
  15859  var mountChildFibers = ChildReconciler(false);
  15860  function cloneChildFibers(current, workInProgress) {
  15861    if (current !== null && workInProgress.child !== current.child) {
  15862      throw new Error('Resuming work not yet implemented.');
  15863    }
  15864
  15865    if (workInProgress.child === null) {
  15866      return;
  15867    }
  15868
  15869    var currentChild = workInProgress.child;
  15870    var newChild = createWorkInProgress(currentChild, currentChild.pendingProps);
  15871    workInProgress.child = newChild;
  15872    newChild.return = workInProgress;
  15873
  15874    while (currentChild.sibling !== null) {
  15875      currentChild = currentChild.sibling;
  15876      newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps);
  15877      newChild.return = workInProgress;
  15878    }
  15879
  15880    newChild.sibling = null;
  15881  } // Reset a workInProgress child set to prepare it for a second pass.
  15882
  15883  function resetChildFibers(workInProgress, lanes) {
  15884    var child = workInProgress.child;
  15885
  15886    while (child !== null) {
  15887      resetWorkInProgress(child, lanes);
  15888      child = child.sibling;
  15889    }
  15890  }
  15891
  15892  var NO_CONTEXT = {};
  15893  var contextStackCursor$1 = createCursor(NO_CONTEXT);
  15894  var contextFiberStackCursor = createCursor(NO_CONTEXT);
  15895  var rootInstanceStackCursor = createCursor(NO_CONTEXT);
  15896
  15897  function requiredContext(c) {
  15898    if (c === NO_CONTEXT) {
  15899      throw new Error('Expected host context to exist. This error is likely caused by a bug ' + 'in React. Please file an issue.');
  15900    }
  15901
  15902    return c;
  15903  }
  15904
  15905  function getRootHostContainer() {
  15906    var rootInstance = requiredContext(rootInstanceStackCursor.current);
  15907    return rootInstance;
  15908  }
  15909
  15910  function pushHostContainer(fiber, nextRootInstance) {
  15911    // Push current root instance onto the stack;
  15912    // This allows us to reset root when portals are popped.
  15913    push(rootInstanceStackCursor, nextRootInstance, fiber); // Track the context and the Fiber that provided it.
  15914    // This enables us to pop only Fibers that provide unique contexts.
  15915
  15916    push(contextFiberStackCursor, fiber, fiber); // Finally, we need to push the host context to the stack.
  15917    // However, we can't just call getRootHostContext() and push it because
  15918    // we'd have a different number of entries on the stack depending on
  15919    // whether getRootHostContext() throws somewhere in renderer code or not.
  15920    // So we push an empty value first. This lets us safely unwind on errors.
  15921
  15922    push(contextStackCursor$1, NO_CONTEXT, fiber);
  15923    var nextRootContext = getRootHostContext(nextRootInstance); // Now that we know this function doesn't throw, replace it.
  15924
  15925    pop(contextStackCursor$1, fiber);
  15926    push(contextStackCursor$1, nextRootContext, fiber);
  15927  }
  15928
  15929  function popHostContainer(fiber) {
  15930    pop(contextStackCursor$1, fiber);
  15931    pop(contextFiberStackCursor, fiber);
  15932    pop(rootInstanceStackCursor, fiber);
  15933  }
  15934
  15935  function getHostContext() {
  15936    var context = requiredContext(contextStackCursor$1.current);
  15937    return context;
  15938  }
  15939
  15940  function pushHostContext(fiber) {
  15941    var rootInstance = requiredContext(rootInstanceStackCursor.current);
  15942    var context = requiredContext(contextStackCursor$1.current);
  15943    var nextContext = getChildHostContext(context, fiber.type); // Don't push this Fiber's context unless it's unique.
  15944
  15945    if (context === nextContext) {
  15946      return;
  15947    } // Track the context and the Fiber that provided it.
  15948    // This enables us to pop only Fibers that provide unique contexts.
  15949
  15950
  15951    push(contextFiberStackCursor, fiber, fiber);
  15952    push(contextStackCursor$1, nextContext, fiber);
  15953  }
  15954
  15955  function popHostContext(fiber) {
  15956    // Do not pop unless this Fiber provided the current context.
  15957    // pushHostContext() only pushes Fibers that provide unique contexts.
  15958    if (contextFiberStackCursor.current !== fiber) {
  15959      return;
  15960    }
  15961
  15962    pop(contextStackCursor$1, fiber);
  15963    pop(contextFiberStackCursor, fiber);
  15964  }
  15965
  15966  var DefaultSuspenseContext = 0; // The Suspense Context is split into two parts. The lower bits is
  15967  // inherited deeply down the subtree. The upper bits only affect
  15968  // this immediate suspense boundary and gets reset each new
  15969  // boundary or suspense list.
  15970
  15971  var SubtreeSuspenseContextMask = 1; // Subtree Flags:
  15972  // InvisibleParentSuspenseContext indicates that one of our parent Suspense
  15973  // boundaries is not currently showing visible main content.
  15974  // Either because it is already showing a fallback or is not mounted at all.
  15975  // We can use this to determine if it is desirable to trigger a fallback at
  15976  // the parent. If not, then we might need to trigger undesirable boundaries
  15977  // and/or suspend the commit to avoid hiding the parent content.
  15978
  15979  var InvisibleParentSuspenseContext = 1; // Shallow Flags:
  15980  // ForceSuspenseFallback can be used by SuspenseList to force newly added
  15981  // items into their fallback state during one of the render passes.
  15982
  15983  var ForceSuspenseFallback = 2;
  15984  var suspenseStackCursor = createCursor(DefaultSuspenseContext);
  15985  function hasSuspenseContext(parentContext, flag) {
  15986    return (parentContext & flag) !== 0;
  15987  }
  15988  function setDefaultShallowSuspenseContext(parentContext) {
  15989    return parentContext & SubtreeSuspenseContextMask;
  15990  }
  15991  function setShallowSuspenseContext(parentContext, shallowContext) {
  15992    return parentContext & SubtreeSuspenseContextMask | shallowContext;
  15993  }
  15994  function addSubtreeSuspenseContext(parentContext, subtreeContext) {
  15995    return parentContext | subtreeContext;
  15996  }
  15997  function pushSuspenseContext(fiber, newContext) {
  15998    push(suspenseStackCursor, newContext, fiber);
  15999  }
  16000  function popSuspenseContext(fiber) {
  16001    pop(suspenseStackCursor, fiber);
  16002  }
  16003
  16004  function shouldCaptureSuspense(workInProgress, hasInvisibleParent) {
  16005    // If it was the primary children that just suspended, capture and render the
  16006    // fallback. Otherwise, don't capture and bubble to the next boundary.
  16007    var nextState = workInProgress.memoizedState;
  16008
  16009    if (nextState !== null) {
  16010      if (nextState.dehydrated !== null) {
  16011        // A dehydrated boundary always captures.
  16012        return true;
  16013      }
  16014
  16015      return false;
  16016    }
  16017
  16018    var props = workInProgress.memoizedProps; // Regular boundaries always capture.
  16019
  16020    {
  16021      return true;
  16022    } // If it's a boundary we should avoid, then we prefer to bubble up to the
  16023  }
  16024  function findFirstSuspended(row) {
  16025    var node = row;
  16026
  16027    while (node !== null) {
  16028      if (node.tag === SuspenseComponent) {
  16029        var state = node.memoizedState;
  16030
  16031        if (state !== null) {
  16032          var dehydrated = state.dehydrated;
  16033
  16034          if (dehydrated === null || isSuspenseInstancePending(dehydrated) || isSuspenseInstanceFallback(dehydrated)) {
  16035            return node;
  16036          }
  16037        }
  16038      } else if (node.tag === SuspenseListComponent && // revealOrder undefined can't be trusted because it don't
  16039      // keep track of whether it suspended or not.
  16040      node.memoizedProps.revealOrder !== undefined) {
  16041        var didSuspend = (node.flags & DidCapture) !== NoFlags;
  16042
  16043        if (didSuspend) {
  16044          return node;
  16045        }
  16046      } else if (node.child !== null) {
  16047        node.child.return = node;
  16048        node = node.child;
  16049        continue;
  16050      }
  16051
  16052      if (node === row) {
  16053        return null;
  16054      }
  16055
  16056      while (node.sibling === null) {
  16057        if (node.return === null || node.return === row) {
  16058          return null;
  16059        }
  16060
  16061        node = node.return;
  16062      }
  16063
  16064      node.sibling.return = node.return;
  16065      node = node.sibling;
  16066    }
  16067
  16068    return null;
  16069  }
  16070
  16071  var NoFlags$1 =
  16072  /*   */
  16073  0; // Represents whether effect should fire.
  16074
  16075  var HasEffect =
  16076  /* */
  16077  1; // Represents the phase in which the effect (not the clean-up) fires.
  16078
  16079  var Insertion =
  16080  /*  */
  16081  2;
  16082  var Layout =
  16083  /*    */
  16084  4;
  16085  var Passive$1 =
  16086  /*   */
  16087  8;
  16088
  16089  // and should be reset before starting a new render.
  16090  // This tracks which mutable sources need to be reset after a render.
  16091
  16092  var workInProgressSources = [];
  16093  function resetWorkInProgressVersions() {
  16094    for (var i = 0; i < workInProgressSources.length; i++) {
  16095      var mutableSource = workInProgressSources[i];
  16096
  16097      {
  16098        mutableSource._workInProgressVersionPrimary = null;
  16099      }
  16100    }
  16101
  16102    workInProgressSources.length = 0;
  16103  }
  16104  // This ensures that the version used for server rendering matches the one
  16105  // that is eventually read during hydration.
  16106  // If they don't match there's a potential tear and a full deopt render is required.
  16107
  16108  function registerMutableSourceForHydration(root, mutableSource) {
  16109    var getVersion = mutableSource._getVersion;
  16110    var version = getVersion(mutableSource._source); // TODO Clear this data once all pending hydration work is finished.
  16111    // Retaining it forever may interfere with GC.
  16112
  16113    if (root.mutableSourceEagerHydrationData == null) {
  16114      root.mutableSourceEagerHydrationData = [mutableSource, version];
  16115    } else {
  16116      root.mutableSourceEagerHydrationData.push(mutableSource, version);
  16117    }
  16118  }
  16119
  16120  var ReactCurrentDispatcher$1 = ReactSharedInternals.ReactCurrentDispatcher,
  16121      ReactCurrentBatchConfig$2 = ReactSharedInternals.ReactCurrentBatchConfig;
  16122  var didWarnAboutMismatchedHooksForComponent;
  16123  var didWarnUncachedGetSnapshot;
  16124
  16125  {
  16126    didWarnAboutMismatchedHooksForComponent = new Set();
  16127  }
  16128
  16129  // These are set right before calling the component.
  16130  var renderLanes = NoLanes; // The work-in-progress fiber. I've named it differently to distinguish it from
  16131  // the work-in-progress hook.
  16132
  16133  var currentlyRenderingFiber$1 = null; // Hooks are stored as a linked list on the fiber's memoizedState field. The
  16134  // current hook list is the list that belongs to the current fiber. The
  16135  // work-in-progress hook list is a new list that will be added to the
  16136  // work-in-progress fiber.
  16137
  16138  var currentHook = null;
  16139  var workInProgressHook = null; // Whether an update was scheduled at any point during the render phase. This
  16140  // does not get reset if we do another render pass; only when we're completely
  16141  // finished evaluating this component. This is an optimization so we know
  16142  // whether we need to clear render phase updates after a throw.
  16143
  16144  var didScheduleRenderPhaseUpdate = false; // Where an update was scheduled only during the current render pass. This
  16145  // gets reset after each attempt.
  16146  // TODO: Maybe there's some way to consolidate this with
  16147  // `didScheduleRenderPhaseUpdate`. Or with `numberOfReRenders`.
  16148
  16149  var didScheduleRenderPhaseUpdateDuringThisPass = false; // Counts the number of useId hooks in this component.
  16150
  16151  var localIdCounter = 0; // Used for ids that are generated completely client-side (i.e. not during
  16152  // hydration). This counter is global, so client ids are not stable across
  16153  // render attempts.
  16154
  16155  var globalClientIdCounter = 0;
  16156  var RE_RENDER_LIMIT = 25; // In DEV, this is the name of the currently executing primitive hook
  16157
  16158  var currentHookNameInDev = null; // In DEV, this list ensures that hooks are called in the same order between renders.
  16159  // The list stores the order of hooks used during the initial render (mount).
  16160  // Subsequent renders (updates) reference this list.
  16161
  16162  var hookTypesDev = null;
  16163  var hookTypesUpdateIndexDev = -1; // In DEV, this tracks whether currently rendering component needs to ignore
  16164  // the dependencies for Hooks that need them (e.g. useEffect or useMemo).
  16165  // When true, such Hooks will always be "remounted". Only used during hot reload.
  16166
  16167  var ignorePreviousDependencies = false;
  16168
  16169  function mountHookTypesDev() {
  16170    {
  16171      var hookName = currentHookNameInDev;
  16172
  16173      if (hookTypesDev === null) {
  16174        hookTypesDev = [hookName];
  16175      } else {
  16176        hookTypesDev.push(hookName);
  16177      }
  16178    }
  16179  }
  16180
  16181  function updateHookTypesDev() {
  16182    {
  16183      var hookName = currentHookNameInDev;
  16184
  16185      if (hookTypesDev !== null) {
  16186        hookTypesUpdateIndexDev++;
  16187
  16188        if (hookTypesDev[hookTypesUpdateIndexDev] !== hookName) {
  16189          warnOnHookMismatchInDev(hookName);
  16190        }
  16191      }
  16192    }
  16193  }
  16194
  16195  function checkDepsAreArrayDev(deps) {
  16196    {
  16197      if (deps !== undefined && deps !== null && !isArray(deps)) {
  16198        // Verify deps, but only on mount to avoid extra checks.
  16199        // It's unlikely their type would change as usually you define them inline.
  16200        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);
  16201      }
  16202    }
  16203  }
  16204
  16205  function warnOnHookMismatchInDev(currentHookName) {
  16206    {
  16207      var componentName = getComponentNameFromFiber(currentlyRenderingFiber$1);
  16208
  16209      if (!didWarnAboutMismatchedHooksForComponent.has(componentName)) {
  16210        didWarnAboutMismatchedHooksForComponent.add(componentName);
  16211
  16212        if (hookTypesDev !== null) {
  16213          var table = '';
  16214          var secondColumnStart = 30;
  16215
  16216          for (var i = 0; i <= hookTypesUpdateIndexDev; i++) {
  16217            var oldHookName = hookTypesDev[i];
  16218            var newHookName = i === hookTypesUpdateIndexDev ? currentHookName : oldHookName;
  16219            var row = i + 1 + ". " + oldHookName; // Extra space so second column lines up
  16220            // lol @ IE not supporting String#repeat
  16221
  16222            while (row.length < secondColumnStart) {
  16223              row += ' ';
  16224            }
  16225
  16226            row += newHookName + '\n';
  16227            table += row;
  16228          }
  16229
  16230          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://reactjs.org/link/rules-of-hooks\n\n' + '   Previous render            Next render\n' + '   ------------------------------------------------------\n' + '%s' + '   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n', componentName, table);
  16231        }
  16232      }
  16233    }
  16234  }
  16235
  16236  function throwInvalidHookError() {
  16237    throw new 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:\n' + '1. You might have mismatching versions of React and the renderer (such as React DOM)\n' + '2. You might be breaking the Rules of Hooks\n' + '3. You might have more than one copy of React in the same app\n' + 'See https://reactjs.org/link/invalid-hook-call for tips about how to debug and fix this problem.');
  16238  }
  16239
  16240  function areHookInputsEqual(nextDeps, prevDeps) {
  16241    {
  16242      if (ignorePreviousDependencies) {
  16243        // Only true when this component is being hot reloaded.
  16244        return false;
  16245      }
  16246    }
  16247
  16248    if (prevDeps === null) {
  16249      {
  16250        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);
  16251      }
  16252
  16253      return false;
  16254    }
  16255
  16256    {
  16257      // Don't bother comparing lengths in prod because these arrays should be
  16258      // passed inline.
  16259      if (nextDeps.length !== prevDeps.length) {
  16260        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(', ') + "]");
  16261      }
  16262    }
  16263
  16264    for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) {
  16265      if (objectIs(nextDeps[i], prevDeps[i])) {
  16266        continue;
  16267      }
  16268
  16269      return false;
  16270    }
  16271
  16272    return true;
  16273  }
  16274
  16275  function renderWithHooks(current, workInProgress, Component, props, secondArg, nextRenderLanes) {
  16276    renderLanes = nextRenderLanes;
  16277    currentlyRenderingFiber$1 = workInProgress;
  16278
  16279    {
  16280      hookTypesDev = current !== null ? current._debugHookTypes : null;
  16281      hookTypesUpdateIndexDev = -1; // Used for hot reloading:
  16282
  16283      ignorePreviousDependencies = current !== null && current.type !== workInProgress.type;
  16284    }
  16285
  16286    workInProgress.memoizedState = null;
  16287    workInProgress.updateQueue = null;
  16288    workInProgress.lanes = NoLanes; // The following should have already been reset
  16289    // currentHook = null;
  16290    // workInProgressHook = null;
  16291    // didScheduleRenderPhaseUpdate = false;
  16292    // localIdCounter = 0;
  16293    // TODO Warn if no hooks are used at all during mount, then some are used during update.
  16294    // Currently we will identify the update render as a mount because memoizedState === null.
  16295    // This is tricky because it's valid for certain types of components (e.g. React.lazy)
  16296    // Using memoizedState to differentiate between mount/update only works if at least one stateful hook is used.
  16297    // Non-stateful hooks (e.g. context) don't get added to memoizedState,
  16298    // so memoizedState would be null during updates and mounts.
  16299
  16300    {
  16301      if (current !== null && current.memoizedState !== null) {
  16302        ReactCurrentDispatcher$1.current = HooksDispatcherOnUpdateInDEV;
  16303      } else if (hookTypesDev !== null) {
  16304        // This dispatcher handles an edge case where a component is updating,
  16305        // but no stateful hooks have been used.
  16306        // We want to match the production code behavior (which will use HooksDispatcherOnMount),
  16307        // but with the extra DEV validation to ensure hooks ordering hasn't changed.
  16308        // This dispatcher does that.
  16309        ReactCurrentDispatcher$1.current = HooksDispatcherOnMountWithHookTypesInDEV;
  16310      } else {
  16311        ReactCurrentDispatcher$1.current = HooksDispatcherOnMountInDEV;
  16312      }
  16313    }
  16314
  16315    var children = Component(props, secondArg); // Check if there was a render phase update
  16316
  16317    if (didScheduleRenderPhaseUpdateDuringThisPass) {
  16318      // Keep rendering in a loop for as long as render phase updates continue to
  16319      // be scheduled. Use a counter to prevent infinite loops.
  16320      var numberOfReRenders = 0;
  16321
  16322      do {
  16323        didScheduleRenderPhaseUpdateDuringThisPass = false;
  16324        localIdCounter = 0;
  16325
  16326        if (numberOfReRenders >= RE_RENDER_LIMIT) {
  16327          throw new Error('Too many re-renders. React limits the number of renders to prevent ' + 'an infinite loop.');
  16328        }
  16329
  16330        numberOfReRenders += 1;
  16331
  16332        {
  16333          // Even when hot reloading, allow dependencies to stabilize
  16334          // after first render to prevent infinite render phase updates.
  16335          ignorePreviousDependencies = false;
  16336        } // Start over from the beginning of the list
  16337
  16338
  16339        currentHook = null;
  16340        workInProgressHook = null;
  16341        workInProgress.updateQueue = null;
  16342
  16343        {
  16344          // Also validate hook order for cascading updates.
  16345          hookTypesUpdateIndexDev = -1;
  16346        }
  16347
  16348        ReactCurrentDispatcher$1.current =  HooksDispatcherOnRerenderInDEV ;
  16349        children = Component(props, secondArg);
  16350      } while (didScheduleRenderPhaseUpdateDuringThisPass);
  16351    } // We can assume the previous dispatcher is always this one, since we set it
  16352    // at the beginning of the render phase and there's no re-entrance.
  16353
  16354
  16355    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
  16356
  16357    {
  16358      workInProgress._debugHookTypes = hookTypesDev;
  16359    } // This check uses currentHook so that it works the same in DEV and prod bundles.
  16360    // hookTypesDev could catch more cases (e.g. context) but only in DEV bundles.
  16361
  16362
  16363    var didRenderTooFewHooks = currentHook !== null && currentHook.next !== null;
  16364    renderLanes = NoLanes;
  16365    currentlyRenderingFiber$1 = null;
  16366    currentHook = null;
  16367    workInProgressHook = null;
  16368
  16369    {
  16370      currentHookNameInDev = null;
  16371      hookTypesDev = null;
  16372      hookTypesUpdateIndexDev = -1; // Confirm that a static flag was not added or removed since the last
  16373      // render. If this fires, it suggests that we incorrectly reset the static
  16374      // flags in some other part of the codebase. This has happened before, for
  16375      // example, in the SuspenseList implementation.
  16376
  16377      if (current !== null && (current.flags & StaticMask) !== (workInProgress.flags & StaticMask) && // Disable this warning in legacy mode, because legacy Suspense is weird
  16378      // and creates false positives. To make this work in legacy mode, we'd
  16379      // need to mark fibers that commit in an incomplete state, somehow. For
  16380      // now I'll disable the warning that most of the bugs that would trigger
  16381      // it are either exclusive to concurrent mode or exist in both.
  16382      (current.mode & ConcurrentMode) !== NoMode) {
  16383        error('Internal React error: Expected static flag was missing. Please ' + 'notify the React team.');
  16384      }
  16385    }
  16386
  16387    didScheduleRenderPhaseUpdate = false; // This is reset by checkDidRenderIdHook
  16388    // localIdCounter = 0;
  16389
  16390    if (didRenderTooFewHooks) {
  16391      throw new Error('Rendered fewer hooks than expected. This may be caused by an accidental ' + 'early return statement.');
  16392    }
  16393
  16394    return children;
  16395  }
  16396  function checkDidRenderIdHook() {
  16397    // This should be called immediately after every renderWithHooks call.
  16398    // Conceptually, it's part of the return value of renderWithHooks; it's only a
  16399    // separate function to avoid using an array tuple.
  16400    var didRenderIdHook = localIdCounter !== 0;
  16401    localIdCounter = 0;
  16402    return didRenderIdHook;
  16403  }
  16404  function bailoutHooks(current, workInProgress, lanes) {
  16405    workInProgress.updateQueue = current.updateQueue; // TODO: Don't need to reset the flags here, because they're reset in the
  16406    // complete phase (bubbleProperties).
  16407
  16408    if ( (workInProgress.mode & StrictEffectsMode) !== NoMode) {
  16409      workInProgress.flags &= ~(MountPassiveDev | MountLayoutDev | Passive | Update);
  16410    } else {
  16411      workInProgress.flags &= ~(Passive | Update);
  16412    }
  16413
  16414    current.lanes = removeLanes(current.lanes, lanes);
  16415  }
  16416  function resetHooksAfterThrow() {
  16417    // We can assume the previous dispatcher is always this one, since we set it
  16418    // at the beginning of the render phase and there's no re-entrance.
  16419    ReactCurrentDispatcher$1.current = ContextOnlyDispatcher;
  16420
  16421    if (didScheduleRenderPhaseUpdate) {
  16422      // There were render phase updates. These are only valid for this render
  16423      // phase, which we are now aborting. Remove the updates from the queues so
  16424      // they do not persist to the next render. Do not remove updates from hooks
  16425      // that weren't processed.
  16426      //
  16427      // Only reset the updates from the queue if it has a clone. If it does
  16428      // not have a clone, that means it wasn't processed, and the updates were
  16429      // scheduled before we entered the render phase.
  16430      var hook = currentlyRenderingFiber$1.memoizedState;
  16431
  16432      while (hook !== null) {
  16433        var queue = hook.queue;
  16434
  16435        if (queue !== null) {
  16436          queue.pending = null;
  16437        }
  16438
  16439        hook = hook.next;
  16440      }
  16441
  16442      didScheduleRenderPhaseUpdate = false;
  16443    }
  16444
  16445    renderLanes = NoLanes;
  16446    currentlyRenderingFiber$1 = null;
  16447    currentHook = null;
  16448    workInProgressHook = null;
  16449
  16450    {
  16451      hookTypesDev = null;
  16452      hookTypesUpdateIndexDev = -1;
  16453      currentHookNameInDev = null;
  16454      isUpdatingOpaqueValueInRenderPhase = false;
  16455    }
  16456
  16457    didScheduleRenderPhaseUpdateDuringThisPass = false;
  16458    localIdCounter = 0;
  16459  }
  16460
  16461  function mountWorkInProgressHook() {
  16462    var hook = {
  16463      memoizedState: null,
  16464      baseState: null,
  16465      baseQueue: null,
  16466      queue: null,
  16467      next: null
  16468    };
  16469
  16470    if (workInProgressHook === null) {
  16471      // This is the first hook in the list
  16472      currentlyRenderingFiber$1.memoizedState = workInProgressHook = hook;
  16473    } else {
  16474      // Append to the end of the list
  16475      workInProgressHook = workInProgressHook.next = hook;
  16476    }
  16477
  16478    return workInProgressHook;
  16479  }
  16480
  16481  function updateWorkInProgressHook() {
  16482    // This function is used both for updates and for re-renders triggered by a
  16483    // render phase update. It assumes there is either a current hook we can
  16484    // clone, or a work-in-progress hook from a previous render pass that we can
  16485    // use as a base. When we reach the end of the base list, we must switch to
  16486    // the dispatcher used for mounts.
  16487    var nextCurrentHook;
  16488
  16489    if (currentHook === null) {
  16490      var current = currentlyRenderingFiber$1.alternate;
  16491
  16492      if (current !== null) {
  16493        nextCurrentHook = current.memoizedState;
  16494      } else {
  16495        nextCurrentHook = null;
  16496      }
  16497    } else {
  16498      nextCurrentHook = currentHook.next;
  16499    }
  16500
  16501    var nextWorkInProgressHook;
  16502
  16503    if (workInProgressHook === null) {
  16504      nextWorkInProgressHook = currentlyRenderingFiber$1.memoizedState;
  16505    } else {
  16506      nextWorkInProgressHook = workInProgressHook.next;
  16507    }
  16508
  16509    if (nextWorkInProgressHook !== null) {
  16510      // There's already a work-in-progress. Reuse it.
  16511      workInProgressHook = nextWorkInProgressHook;
  16512      nextWorkInProgressHook = workInProgressHook.next;
  16513      currentHook = nextCurrentHook;
  16514    } else {
  16515      // Clone from the current hook.
  16516      if (nextCurrentHook === null) {
  16517        throw new Error('Rendered more hooks than during the previous render.');
  16518      }
  16519
  16520      currentHook = nextCurrentHook;
  16521      var newHook = {
  16522        memoizedState: currentHook.memoizedState,
  16523        baseState: currentHook.baseState,
  16524        baseQueue: currentHook.baseQueue,
  16525        queue: currentHook.queue,
  16526        next: null
  16527      };
  16528
  16529      if (workInProgressHook === null) {
  16530        // This is the first hook in the list.
  16531        currentlyRenderingFiber$1.memoizedState = workInProgressHook = newHook;
  16532      } else {
  16533        // Append to the end of the list.
  16534        workInProgressHook = workInProgressHook.next = newHook;
  16535      }
  16536    }
  16537
  16538    return workInProgressHook;
  16539  }
  16540
  16541  function createFunctionComponentUpdateQueue() {
  16542    return {
  16543      lastEffect: null,
  16544      stores: null
  16545    };
  16546  }
  16547
  16548  function basicStateReducer(state, action) {
  16549    // $FlowFixMe: Flow doesn't like mixed types
  16550    return typeof action === 'function' ? action(state) : action;
  16551  }
  16552
  16553  function mountReducer(reducer, initialArg, init) {
  16554    var hook = mountWorkInProgressHook();
  16555    var initialState;
  16556
  16557    if (init !== undefined) {
  16558      initialState = init(initialArg);
  16559    } else {
  16560      initialState = initialArg;
  16561    }
  16562
  16563    hook.memoizedState = hook.baseState = initialState;
  16564    var queue = {
  16565      pending: null,
  16566      interleaved: null,
  16567      lanes: NoLanes,
  16568      dispatch: null,
  16569      lastRenderedReducer: reducer,
  16570      lastRenderedState: initialState
  16571    };
  16572    hook.queue = queue;
  16573    var dispatch = queue.dispatch = dispatchReducerAction.bind(null, currentlyRenderingFiber$1, queue);
  16574    return [hook.memoizedState, dispatch];
  16575  }
  16576
  16577  function updateReducer(reducer, initialArg, init) {
  16578    var hook = updateWorkInProgressHook();
  16579    var queue = hook.queue;
  16580
  16581    if (queue === null) {
  16582      throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
  16583    }
  16584
  16585    queue.lastRenderedReducer = reducer;
  16586    var current = currentHook; // The last rebase update that is NOT part of the base state.
  16587
  16588    var baseQueue = current.baseQueue; // The last pending update that hasn't been processed yet.
  16589
  16590    var pendingQueue = queue.pending;
  16591
  16592    if (pendingQueue !== null) {
  16593      // We have new updates that haven't been processed yet.
  16594      // We'll add them to the base queue.
  16595      if (baseQueue !== null) {
  16596        // Merge the pending queue and the base queue.
  16597        var baseFirst = baseQueue.next;
  16598        var pendingFirst = pendingQueue.next;
  16599        baseQueue.next = pendingFirst;
  16600        pendingQueue.next = baseFirst;
  16601      }
  16602
  16603      {
  16604        if (current.baseQueue !== baseQueue) {
  16605          // Internal invariant that should never happen, but feasibly could in
  16606          // the future if we implement resuming, or some form of that.
  16607          error('Internal error: Expected work-in-progress queue to be a clone. ' + 'This is a bug in React.');
  16608        }
  16609      }
  16610
  16611      current.baseQueue = baseQueue = pendingQueue;
  16612      queue.pending = null;
  16613    }
  16614
  16615    if (baseQueue !== null) {
  16616      // We have a queue to process.
  16617      var first = baseQueue.next;
  16618      var newState = current.baseState;
  16619      var newBaseState = null;
  16620      var newBaseQueueFirst = null;
  16621      var newBaseQueueLast = null;
  16622      var update = first;
  16623
  16624      do {
  16625        var updateLane = update.lane;
  16626
  16627        if (!isSubsetOfLanes(renderLanes, updateLane)) {
  16628          // Priority is insufficient. Skip this update. If this is the first
  16629          // skipped update, the previous update/state is the new base
  16630          // update/state.
  16631          var clone = {
  16632            lane: updateLane,
  16633            action: update.action,
  16634            hasEagerState: update.hasEagerState,
  16635            eagerState: update.eagerState,
  16636            next: null
  16637          };
  16638
  16639          if (newBaseQueueLast === null) {
  16640            newBaseQueueFirst = newBaseQueueLast = clone;
  16641            newBaseState = newState;
  16642          } else {
  16643            newBaseQueueLast = newBaseQueueLast.next = clone;
  16644          } // Update the remaining priority in the queue.
  16645          // TODO: Don't need to accumulate this. Instead, we can remove
  16646          // renderLanes from the original lanes.
  16647
  16648
  16649          currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, updateLane);
  16650          markSkippedUpdateLanes(updateLane);
  16651        } else {
  16652          // This update does have sufficient priority.
  16653          if (newBaseQueueLast !== null) {
  16654            var _clone = {
  16655              // This update is going to be committed so we never want uncommit
  16656              // it. Using NoLane works because 0 is a subset of all bitmasks, so
  16657              // this will never be skipped by the check above.
  16658              lane: NoLane,
  16659              action: update.action,
  16660              hasEagerState: update.hasEagerState,
  16661              eagerState: update.eagerState,
  16662              next: null
  16663            };
  16664            newBaseQueueLast = newBaseQueueLast.next = _clone;
  16665          } // Process this update.
  16666
  16667
  16668          if (update.hasEagerState) {
  16669            // If this update is a state update (not a reducer) and was processed eagerly,
  16670            // we can use the eagerly computed state
  16671            newState = update.eagerState;
  16672          } else {
  16673            var action = update.action;
  16674            newState = reducer(newState, action);
  16675          }
  16676        }
  16677
  16678        update = update.next;
  16679      } while (update !== null && update !== first);
  16680
  16681      if (newBaseQueueLast === null) {
  16682        newBaseState = newState;
  16683      } else {
  16684        newBaseQueueLast.next = newBaseQueueFirst;
  16685      } // Mark that the fiber performed work, but only if the new state is
  16686      // different from the current state.
  16687
  16688
  16689      if (!objectIs(newState, hook.memoizedState)) {
  16690        markWorkInProgressReceivedUpdate();
  16691      }
  16692
  16693      hook.memoizedState = newState;
  16694      hook.baseState = newBaseState;
  16695      hook.baseQueue = newBaseQueueLast;
  16696      queue.lastRenderedState = newState;
  16697    } // Interleaved updates are stored on a separate queue. We aren't going to
  16698    // process them during this render, but we do need to track which lanes
  16699    // are remaining.
  16700
  16701
  16702    var lastInterleaved = queue.interleaved;
  16703
  16704    if (lastInterleaved !== null) {
  16705      var interleaved = lastInterleaved;
  16706
  16707      do {
  16708        var interleavedLane = interleaved.lane;
  16709        currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, interleavedLane);
  16710        markSkippedUpdateLanes(interleavedLane);
  16711        interleaved = interleaved.next;
  16712      } while (interleaved !== lastInterleaved);
  16713    } else if (baseQueue === null) {
  16714      // `queue.lanes` is used for entangling transitions. We can set it back to
  16715      // zero once the queue is empty.
  16716      queue.lanes = NoLanes;
  16717    }
  16718
  16719    var dispatch = queue.dispatch;
  16720    return [hook.memoizedState, dispatch];
  16721  }
  16722
  16723  function rerenderReducer(reducer, initialArg, init) {
  16724    var hook = updateWorkInProgressHook();
  16725    var queue = hook.queue;
  16726
  16727    if (queue === null) {
  16728      throw new Error('Should have a queue. This is likely a bug in React. Please file an issue.');
  16729    }
  16730
  16731    queue.lastRenderedReducer = reducer; // This is a re-render. Apply the new render phase updates to the previous
  16732    // work-in-progress hook.
  16733
  16734    var dispatch = queue.dispatch;
  16735    var lastRenderPhaseUpdate = queue.pending;
  16736    var newState = hook.memoizedState;
  16737
  16738    if (lastRenderPhaseUpdate !== null) {
  16739      // The queue doesn't persist past this render pass.
  16740      queue.pending = null;
  16741      var firstRenderPhaseUpdate = lastRenderPhaseUpdate.next;
  16742      var update = firstRenderPhaseUpdate;
  16743
  16744      do {
  16745        // Process this render phase update. We don't have to check the
  16746        // priority because it will always be the same as the current
  16747        // render's.
  16748        var action = update.action;
  16749        newState = reducer(newState, action);
  16750        update = update.next;
  16751      } while (update !== firstRenderPhaseUpdate); // Mark that the fiber performed work, but only if the new state is
  16752      // different from the current state.
  16753
  16754
  16755      if (!objectIs(newState, hook.memoizedState)) {
  16756        markWorkInProgressReceivedUpdate();
  16757      }
  16758
  16759      hook.memoizedState = newState; // Don't persist the state accumulated from the render phase updates to
  16760      // the base state unless the queue is empty.
  16761      // TODO: Not sure if this is the desired semantics, but it's what we
  16762      // do for gDSFP. I can't remember why.
  16763
  16764      if (hook.baseQueue === null) {
  16765        hook.baseState = newState;
  16766      }
  16767
  16768      queue.lastRenderedState = newState;
  16769    }
  16770
  16771    return [newState, dispatch];
  16772  }
  16773
  16774  function mountMutableSource(source, getSnapshot, subscribe) {
  16775    {
  16776      return undefined;
  16777    }
  16778  }
  16779
  16780  function updateMutableSource(source, getSnapshot, subscribe) {
  16781    {
  16782      return undefined;
  16783    }
  16784  }
  16785
  16786  function mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
  16787    var fiber = currentlyRenderingFiber$1;
  16788    var hook = mountWorkInProgressHook();
  16789    var nextSnapshot;
  16790    var isHydrating = getIsHydrating();
  16791
  16792    if (isHydrating) {
  16793      if (getServerSnapshot === undefined) {
  16794        throw new Error('Missing getServerSnapshot, which is required for ' + 'server-rendered content. Will revert to client rendering.');
  16795      }
  16796
  16797      nextSnapshot = getServerSnapshot();
  16798
  16799      {
  16800        if (!didWarnUncachedGetSnapshot) {
  16801          if (nextSnapshot !== getServerSnapshot()) {
  16802            error('The result of getServerSnapshot should be cached to avoid an infinite loop');
  16803
  16804            didWarnUncachedGetSnapshot = true;
  16805          }
  16806        }
  16807      }
  16808    } else {
  16809      nextSnapshot = getSnapshot();
  16810
  16811      {
  16812        if (!didWarnUncachedGetSnapshot) {
  16813          var cachedSnapshot = getSnapshot();
  16814
  16815          if (!objectIs(nextSnapshot, cachedSnapshot)) {
  16816            error('The result of getSnapshot should be cached to avoid an infinite loop');
  16817
  16818            didWarnUncachedGetSnapshot = true;
  16819          }
  16820        }
  16821      } // Unless we're rendering a blocking lane, schedule a consistency check.
  16822      // Right before committing, we will walk the tree and check if any of the
  16823      // stores were mutated.
  16824      //
  16825      // We won't do this if we're hydrating server-rendered content, because if
  16826      // the content is stale, it's already visible anyway. Instead we'll patch
  16827      // it up in a passive effect.
  16828
  16829
  16830      var root = getWorkInProgressRoot();
  16831
  16832      if (root === null) {
  16833        throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
  16834      }
  16835
  16836      if (!includesBlockingLane(root, renderLanes)) {
  16837        pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
  16838      }
  16839    } // Read the current snapshot from the store on every render. This breaks the
  16840    // normal rules of React, and only works because store updates are
  16841    // always synchronous.
  16842
  16843
  16844    hook.memoizedState = nextSnapshot;
  16845    var inst = {
  16846      value: nextSnapshot,
  16847      getSnapshot: getSnapshot
  16848    };
  16849    hook.queue = inst; // Schedule an effect to subscribe to the store.
  16850
  16851    mountEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Schedule an effect to update the mutable instance fields. We will update
  16852    // this whenever subscribe, getSnapshot, or value changes. Because there's no
  16853    // clean-up function, and we track the deps correctly, we can call pushEffect
  16854    // directly, without storing any additional state. For the same reason, we
  16855    // don't need to set a static flag, either.
  16856    // TODO: We can move this to the passive phase once we add a pre-commit
  16857    // consistency check. See the next comment.
  16858
  16859    fiber.flags |= Passive;
  16860    pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null);
  16861    return nextSnapshot;
  16862  }
  16863
  16864  function updateSyncExternalStore(subscribe, getSnapshot, getServerSnapshot) {
  16865    var fiber = currentlyRenderingFiber$1;
  16866    var hook = updateWorkInProgressHook(); // Read the current snapshot from the store on every render. This breaks the
  16867    // normal rules of React, and only works because store updates are
  16868    // always synchronous.
  16869
  16870    var nextSnapshot = getSnapshot();
  16871
  16872    {
  16873      if (!didWarnUncachedGetSnapshot) {
  16874        var cachedSnapshot = getSnapshot();
  16875
  16876        if (!objectIs(nextSnapshot, cachedSnapshot)) {
  16877          error('The result of getSnapshot should be cached to avoid an infinite loop');
  16878
  16879          didWarnUncachedGetSnapshot = true;
  16880        }
  16881      }
  16882    }
  16883
  16884    var prevSnapshot = hook.memoizedState;
  16885    var snapshotChanged = !objectIs(prevSnapshot, nextSnapshot);
  16886
  16887    if (snapshotChanged) {
  16888      hook.memoizedState = nextSnapshot;
  16889      markWorkInProgressReceivedUpdate();
  16890    }
  16891
  16892    var inst = hook.queue;
  16893    updateEffect(subscribeToStore.bind(null, fiber, inst, subscribe), [subscribe]); // Whenever getSnapshot or subscribe changes, we need to check in the
  16894    // commit phase if there was an interleaved mutation. In concurrent mode
  16895    // this can happen all the time, but even in synchronous mode, an earlier
  16896    // effect may have mutated the store.
  16897
  16898    if (inst.getSnapshot !== getSnapshot || snapshotChanged || // Check if the susbcribe function changed. We can save some memory by
  16899    // checking whether we scheduled a subscription effect above.
  16900    workInProgressHook !== null && workInProgressHook.memoizedState.tag & HasEffect) {
  16901      fiber.flags |= Passive;
  16902      pushEffect(HasEffect | Passive$1, updateStoreInstance.bind(null, fiber, inst, nextSnapshot, getSnapshot), undefined, null); // Unless we're rendering a blocking lane, schedule a consistency check.
  16903      // Right before committing, we will walk the tree and check if any of the
  16904      // stores were mutated.
  16905
  16906      var root = getWorkInProgressRoot();
  16907
  16908      if (root === null) {
  16909        throw new Error('Expected a work-in-progress root. This is a bug in React. Please file an issue.');
  16910      }
  16911
  16912      if (!includesBlockingLane(root, renderLanes)) {
  16913        pushStoreConsistencyCheck(fiber, getSnapshot, nextSnapshot);
  16914      }
  16915    }
  16916
  16917    return nextSnapshot;
  16918  }
  16919
  16920  function pushStoreConsistencyCheck(fiber, getSnapshot, renderedSnapshot) {
  16921    fiber.flags |= StoreConsistency;
  16922    var check = {
  16923      getSnapshot: getSnapshot,
  16924      value: renderedSnapshot
  16925    };
  16926    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
  16927
  16928    if (componentUpdateQueue === null) {
  16929      componentUpdateQueue = createFunctionComponentUpdateQueue();
  16930      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
  16931      componentUpdateQueue.stores = [check];
  16932    } else {
  16933      var stores = componentUpdateQueue.stores;
  16934
  16935      if (stores === null) {
  16936        componentUpdateQueue.stores = [check];
  16937      } else {
  16938        stores.push(check);
  16939      }
  16940    }
  16941  }
  16942
  16943  function updateStoreInstance(fiber, inst, nextSnapshot, getSnapshot) {
  16944    // These are updated in the passive phase
  16945    inst.value = nextSnapshot;
  16946    inst.getSnapshot = getSnapshot; // Something may have been mutated in between render and commit. This could
  16947    // have been in an event that fired before the passive effects, or it could
  16948    // have been in a layout effect. In that case, we would have used the old
  16949    // snapsho and getSnapshot values to bail out. We need to check one more time.
  16950
  16951    if (checkIfSnapshotChanged(inst)) {
  16952      // Force a re-render.
  16953      forceStoreRerender(fiber);
  16954    }
  16955  }
  16956
  16957  function subscribeToStore(fiber, inst, subscribe) {
  16958    var handleStoreChange = function () {
  16959      // The store changed. Check if the snapshot changed since the last time we
  16960      // read from the store.
  16961      if (checkIfSnapshotChanged(inst)) {
  16962        // Force a re-render.
  16963        forceStoreRerender(fiber);
  16964      }
  16965    }; // Subscribe to the store and return a clean-up function.
  16966
  16967
  16968    return subscribe(handleStoreChange);
  16969  }
  16970
  16971  function checkIfSnapshotChanged(inst) {
  16972    var latestGetSnapshot = inst.getSnapshot;
  16973    var prevValue = inst.value;
  16974
  16975    try {
  16976      var nextValue = latestGetSnapshot();
  16977      return !objectIs(prevValue, nextValue);
  16978    } catch (error) {
  16979      return true;
  16980    }
  16981  }
  16982
  16983  function forceStoreRerender(fiber) {
  16984    var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  16985
  16986    if (root !== null) {
  16987      scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  16988    }
  16989  }
  16990
  16991  function mountState(initialState) {
  16992    var hook = mountWorkInProgressHook();
  16993
  16994    if (typeof initialState === 'function') {
  16995      // $FlowFixMe: Flow doesn't like mixed types
  16996      initialState = initialState();
  16997    }
  16998
  16999    hook.memoizedState = hook.baseState = initialState;
  17000    var queue = {
  17001      pending: null,
  17002      interleaved: null,
  17003      lanes: NoLanes,
  17004      dispatch: null,
  17005      lastRenderedReducer: basicStateReducer,
  17006      lastRenderedState: initialState
  17007    };
  17008    hook.queue = queue;
  17009    var dispatch = queue.dispatch = dispatchSetState.bind(null, currentlyRenderingFiber$1, queue);
  17010    return [hook.memoizedState, dispatch];
  17011  }
  17012
  17013  function updateState(initialState) {
  17014    return updateReducer(basicStateReducer);
  17015  }
  17016
  17017  function rerenderState(initialState) {
  17018    return rerenderReducer(basicStateReducer);
  17019  }
  17020
  17021  function pushEffect(tag, create, destroy, deps) {
  17022    var effect = {
  17023      tag: tag,
  17024      create: create,
  17025      destroy: destroy,
  17026      deps: deps,
  17027      // Circular
  17028      next: null
  17029    };
  17030    var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
  17031
  17032    if (componentUpdateQueue === null) {
  17033      componentUpdateQueue = createFunctionComponentUpdateQueue();
  17034      currentlyRenderingFiber$1.updateQueue = componentUpdateQueue;
  17035      componentUpdateQueue.lastEffect = effect.next = effect;
  17036    } else {
  17037      var lastEffect = componentUpdateQueue.lastEffect;
  17038
  17039      if (lastEffect === null) {
  17040        componentUpdateQueue.lastEffect = effect.next = effect;
  17041      } else {
  17042        var firstEffect = lastEffect.next;
  17043        lastEffect.next = effect;
  17044        effect.next = firstEffect;
  17045        componentUpdateQueue.lastEffect = effect;
  17046      }
  17047    }
  17048
  17049    return effect;
  17050  }
  17051
  17052  function mountRef(initialValue) {
  17053    var hook = mountWorkInProgressHook();
  17054
  17055    {
  17056      var _ref2 = {
  17057        current: initialValue
  17058      };
  17059      hook.memoizedState = _ref2;
  17060      return _ref2;
  17061    }
  17062  }
  17063
  17064  function updateRef(initialValue) {
  17065    var hook = updateWorkInProgressHook();
  17066    return hook.memoizedState;
  17067  }
  17068
  17069  function mountEffectImpl(fiberFlags, hookFlags, create, deps) {
  17070    var hook = mountWorkInProgressHook();
  17071    var nextDeps = deps === undefined ? null : deps;
  17072    currentlyRenderingFiber$1.flags |= fiberFlags;
  17073    hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps);
  17074  }
  17075
  17076  function updateEffectImpl(fiberFlags, hookFlags, create, deps) {
  17077    var hook = updateWorkInProgressHook();
  17078    var nextDeps = deps === undefined ? null : deps;
  17079    var destroy = undefined;
  17080
  17081    if (currentHook !== null) {
  17082      var prevEffect = currentHook.memoizedState;
  17083      destroy = prevEffect.destroy;
  17084
  17085      if (nextDeps !== null) {
  17086        var prevDeps = prevEffect.deps;
  17087
  17088        if (areHookInputsEqual(nextDeps, prevDeps)) {
  17089          hook.memoizedState = pushEffect(hookFlags, create, destroy, nextDeps);
  17090          return;
  17091        }
  17092      }
  17093    }
  17094
  17095    currentlyRenderingFiber$1.flags |= fiberFlags;
  17096    hook.memoizedState = pushEffect(HasEffect | hookFlags, create, destroy, nextDeps);
  17097  }
  17098
  17099  function mountEffect(create, deps) {
  17100    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
  17101      return mountEffectImpl(MountPassiveDev | Passive | PassiveStatic, Passive$1, create, deps);
  17102    } else {
  17103      return mountEffectImpl(Passive | PassiveStatic, Passive$1, create, deps);
  17104    }
  17105  }
  17106
  17107  function updateEffect(create, deps) {
  17108    return updateEffectImpl(Passive, Passive$1, create, deps);
  17109  }
  17110
  17111  function mountInsertionEffect(create, deps) {
  17112    return mountEffectImpl(Update, Insertion, create, deps);
  17113  }
  17114
  17115  function updateInsertionEffect(create, deps) {
  17116    return updateEffectImpl(Update, Insertion, create, deps);
  17117  }
  17118
  17119  function mountLayoutEffect(create, deps) {
  17120    var fiberFlags = Update;
  17121
  17122    {
  17123      fiberFlags |= LayoutStatic;
  17124    }
  17125
  17126    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
  17127      fiberFlags |= MountLayoutDev;
  17128    }
  17129
  17130    return mountEffectImpl(fiberFlags, Layout, create, deps);
  17131  }
  17132
  17133  function updateLayoutEffect(create, deps) {
  17134    return updateEffectImpl(Update, Layout, create, deps);
  17135  }
  17136
  17137  function imperativeHandleEffect(create, ref) {
  17138    if (typeof ref === 'function') {
  17139      var refCallback = ref;
  17140
  17141      var _inst = create();
  17142
  17143      refCallback(_inst);
  17144      return function () {
  17145        refCallback(null);
  17146      };
  17147    } else if (ref !== null && ref !== undefined) {
  17148      var refObject = ref;
  17149
  17150      {
  17151        if (!refObject.hasOwnProperty('current')) {
  17152          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(', ') + '}');
  17153        }
  17154      }
  17155
  17156      var _inst2 = create();
  17157
  17158      refObject.current = _inst2;
  17159      return function () {
  17160        refObject.current = null;
  17161      };
  17162    }
  17163  }
  17164
  17165  function mountImperativeHandle(ref, create, deps) {
  17166    {
  17167      if (typeof create !== 'function') {
  17168        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
  17169      }
  17170    } // TODO: If deps are provided, should we skip comparing the ref itself?
  17171
  17172
  17173    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
  17174    var fiberFlags = Update;
  17175
  17176    {
  17177      fiberFlags |= LayoutStatic;
  17178    }
  17179
  17180    if ( (currentlyRenderingFiber$1.mode & StrictEffectsMode) !== NoMode) {
  17181      fiberFlags |= MountLayoutDev;
  17182    }
  17183
  17184    return mountEffectImpl(fiberFlags, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
  17185  }
  17186
  17187  function updateImperativeHandle(ref, create, deps) {
  17188    {
  17189      if (typeof create !== 'function') {
  17190        error('Expected useImperativeHandle() second argument to be a function ' + 'that creates a handle. Instead received: %s.', create !== null ? typeof create : 'null');
  17191      }
  17192    } // TODO: If deps are provided, should we skip comparing the ref itself?
  17193
  17194
  17195    var effectDeps = deps !== null && deps !== undefined ? deps.concat([ref]) : null;
  17196    return updateEffectImpl(Update, Layout, imperativeHandleEffect.bind(null, create, ref), effectDeps);
  17197  }
  17198
  17199  function mountDebugValue(value, formatterFn) {// This hook is normally a no-op.
  17200    // The react-debug-hooks package injects its own implementation
  17201    // so that e.g. DevTools can display custom hook values.
  17202  }
  17203
  17204  var updateDebugValue = mountDebugValue;
  17205
  17206  function mountCallback(callback, deps) {
  17207    var hook = mountWorkInProgressHook();
  17208    var nextDeps = deps === undefined ? null : deps;
  17209    hook.memoizedState = [callback, nextDeps];
  17210    return callback;
  17211  }
  17212
  17213  function updateCallback(callback, deps) {
  17214    var hook = updateWorkInProgressHook();
  17215    var nextDeps = deps === undefined ? null : deps;
  17216    var prevState = hook.memoizedState;
  17217
  17218    if (prevState !== null) {
  17219      if (nextDeps !== null) {
  17220        var prevDeps = prevState[1];
  17221
  17222        if (areHookInputsEqual(nextDeps, prevDeps)) {
  17223          return prevState[0];
  17224        }
  17225      }
  17226    }
  17227
  17228    hook.memoizedState = [callback, nextDeps];
  17229    return callback;
  17230  }
  17231
  17232  function mountMemo(nextCreate, deps) {
  17233    var hook = mountWorkInProgressHook();
  17234    var nextDeps = deps === undefined ? null : deps;
  17235    var nextValue = nextCreate();
  17236    hook.memoizedState = [nextValue, nextDeps];
  17237    return nextValue;
  17238  }
  17239
  17240  function updateMemo(nextCreate, deps) {
  17241    var hook = updateWorkInProgressHook();
  17242    var nextDeps = deps === undefined ? null : deps;
  17243    var prevState = hook.memoizedState;
  17244
  17245    if (prevState !== null) {
  17246      // Assume these are defined. If they're not, areHookInputsEqual will warn.
  17247      if (nextDeps !== null) {
  17248        var prevDeps = prevState[1];
  17249
  17250        if (areHookInputsEqual(nextDeps, prevDeps)) {
  17251          return prevState[0];
  17252        }
  17253      }
  17254    }
  17255
  17256    var nextValue = nextCreate();
  17257    hook.memoizedState = [nextValue, nextDeps];
  17258    return nextValue;
  17259  }
  17260
  17261  function mountDeferredValue(value) {
  17262    var hook = mountWorkInProgressHook();
  17263    hook.memoizedState = value;
  17264    return value;
  17265  }
  17266
  17267  function updateDeferredValue(value) {
  17268    var hook = updateWorkInProgressHook();
  17269    var resolvedCurrentHook = currentHook;
  17270    var prevValue = resolvedCurrentHook.memoizedState;
  17271    return updateDeferredValueImpl(hook, prevValue, value);
  17272  }
  17273
  17274  function rerenderDeferredValue(value) {
  17275    var hook = updateWorkInProgressHook();
  17276
  17277    if (currentHook === null) {
  17278      // This is a rerender during a mount.
  17279      hook.memoizedState = value;
  17280      return value;
  17281    } else {
  17282      // This is a rerender during an update.
  17283      var prevValue = currentHook.memoizedState;
  17284      return updateDeferredValueImpl(hook, prevValue, value);
  17285    }
  17286  }
  17287
  17288  function updateDeferredValueImpl(hook, prevValue, value) {
  17289    var shouldDeferValue = !includesOnlyNonUrgentLanes(renderLanes);
  17290
  17291    if (shouldDeferValue) {
  17292      // This is an urgent update. If the value has changed, keep using the
  17293      // previous value and spawn a deferred render to update it later.
  17294      if (!objectIs(value, prevValue)) {
  17295        // Schedule a deferred render
  17296        var deferredLane = claimNextTransitionLane();
  17297        currentlyRenderingFiber$1.lanes = mergeLanes(currentlyRenderingFiber$1.lanes, deferredLane);
  17298        markSkippedUpdateLanes(deferredLane); // Set this to true to indicate that the rendered value is inconsistent
  17299        // from the latest value. The name "baseState" doesn't really match how we
  17300        // use it because we're reusing a state hook field instead of creating a
  17301        // new one.
  17302
  17303        hook.baseState = true;
  17304      } // Reuse the previous value
  17305
  17306
  17307      return prevValue;
  17308    } else {
  17309      // This is not an urgent update, so we can use the latest value regardless
  17310      // of what it is. No need to defer it.
  17311      // However, if we're currently inside a spawned render, then we need to mark
  17312      // this as an update to prevent the fiber from bailing out.
  17313      //
  17314      // `baseState` is true when the current value is different from the rendered
  17315      // value. The name doesn't really match how we use it because we're reusing
  17316      // a state hook field instead of creating a new one.
  17317      if (hook.baseState) {
  17318        // Flip this back to false.
  17319        hook.baseState = false;
  17320        markWorkInProgressReceivedUpdate();
  17321      }
  17322
  17323      hook.memoizedState = value;
  17324      return value;
  17325    }
  17326  }
  17327
  17328  function startTransition(setPending, callback, options) {
  17329    var previousPriority = getCurrentUpdatePriority();
  17330    setCurrentUpdatePriority(higherEventPriority(previousPriority, ContinuousEventPriority));
  17331    setPending(true);
  17332    var prevTransition = ReactCurrentBatchConfig$2.transition;
  17333    ReactCurrentBatchConfig$2.transition = {};
  17334    var currentTransition = ReactCurrentBatchConfig$2.transition;
  17335
  17336    {
  17337      ReactCurrentBatchConfig$2.transition._updatedFibers = new Set();
  17338    }
  17339
  17340    try {
  17341      setPending(false);
  17342      callback();
  17343    } finally {
  17344      setCurrentUpdatePriority(previousPriority);
  17345      ReactCurrentBatchConfig$2.transition = prevTransition;
  17346
  17347      {
  17348        if (prevTransition === null && currentTransition._updatedFibers) {
  17349          var updatedFibersCount = currentTransition._updatedFibers.size;
  17350
  17351          if (updatedFibersCount > 10) {
  17352            warn('Detected a large number of updates inside startTransition. ' + 'If this is due to a subscription please re-write it to use React provided hooks. ' + 'Otherwise concurrent mode guarantees are off the table.');
  17353          }
  17354
  17355          currentTransition._updatedFibers.clear();
  17356        }
  17357      }
  17358    }
  17359  }
  17360
  17361  function mountTransition() {
  17362    var _mountState = mountState(false),
  17363        isPending = _mountState[0],
  17364        setPending = _mountState[1]; // The `start` method never changes.
  17365
  17366
  17367    var start = startTransition.bind(null, setPending);
  17368    var hook = mountWorkInProgressHook();
  17369    hook.memoizedState = start;
  17370    return [isPending, start];
  17371  }
  17372
  17373  function updateTransition() {
  17374    var _updateState = updateState(),
  17375        isPending = _updateState[0];
  17376
  17377    var hook = updateWorkInProgressHook();
  17378    var start = hook.memoizedState;
  17379    return [isPending, start];
  17380  }
  17381
  17382  function rerenderTransition() {
  17383    var _rerenderState = rerenderState(),
  17384        isPending = _rerenderState[0];
  17385
  17386    var hook = updateWorkInProgressHook();
  17387    var start = hook.memoizedState;
  17388    return [isPending, start];
  17389  }
  17390
  17391  var isUpdatingOpaqueValueInRenderPhase = false;
  17392  function getIsUpdatingOpaqueValueInRenderPhaseInDEV() {
  17393    {
  17394      return isUpdatingOpaqueValueInRenderPhase;
  17395    }
  17396  }
  17397
  17398  function mountId() {
  17399    var hook = mountWorkInProgressHook();
  17400    var root = getWorkInProgressRoot(); // TODO: In Fizz, id generation is specific to each server config. Maybe we
  17401    // should do this in Fiber, too? Deferring this decision for now because
  17402    // there's no other place to store the prefix except for an internal field on
  17403    // the public createRoot object, which the fiber tree does not currently have
  17404    // a reference to.
  17405
  17406    var identifierPrefix = root.identifierPrefix;
  17407    var id;
  17408
  17409    if (getIsHydrating()) {
  17410      var treeId = getTreeId(); // Use a captial R prefix for server-generated ids.
  17411
  17412      id = ':' + identifierPrefix + 'R' + treeId; // Unless this is the first id at this level, append a number at the end
  17413      // that represents the position of this useId hook among all the useId
  17414      // hooks for this fiber.
  17415
  17416      var localId = localIdCounter++;
  17417
  17418      if (localId > 0) {
  17419        id += 'H' + localId.toString(32);
  17420      }
  17421
  17422      id += ':';
  17423    } else {
  17424      // Use a lowercase r prefix for client-generated ids.
  17425      var globalClientId = globalClientIdCounter++;
  17426      id = ':' + identifierPrefix + 'r' + globalClientId.toString(32) + ':';
  17427    }
  17428
  17429    hook.memoizedState = id;
  17430    return id;
  17431  }
  17432
  17433  function updateId() {
  17434    var hook = updateWorkInProgressHook();
  17435    var id = hook.memoizedState;
  17436    return id;
  17437  }
  17438
  17439  function dispatchReducerAction(fiber, queue, action) {
  17440    {
  17441      if (typeof arguments[3] === 'function') {
  17442        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().');
  17443      }
  17444    }
  17445
  17446    var lane = requestUpdateLane(fiber);
  17447    var update = {
  17448      lane: lane,
  17449      action: action,
  17450      hasEagerState: false,
  17451      eagerState: null,
  17452      next: null
  17453    };
  17454
  17455    if (isRenderPhaseUpdate(fiber)) {
  17456      enqueueRenderPhaseUpdate(queue, update);
  17457    } else {
  17458      var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
  17459
  17460      if (root !== null) {
  17461        var eventTime = requestEventTime();
  17462        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  17463        entangleTransitionUpdate(root, queue, lane);
  17464      }
  17465    }
  17466
  17467    markUpdateInDevTools(fiber, lane);
  17468  }
  17469
  17470  function dispatchSetState(fiber, queue, action) {
  17471    {
  17472      if (typeof arguments[3] === 'function') {
  17473        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().');
  17474      }
  17475    }
  17476
  17477    var lane = requestUpdateLane(fiber);
  17478    var update = {
  17479      lane: lane,
  17480      action: action,
  17481      hasEagerState: false,
  17482      eagerState: null,
  17483      next: null
  17484    };
  17485
  17486    if (isRenderPhaseUpdate(fiber)) {
  17487      enqueueRenderPhaseUpdate(queue, update);
  17488    } else {
  17489      var alternate = fiber.alternate;
  17490
  17491      if (fiber.lanes === NoLanes && (alternate === null || alternate.lanes === NoLanes)) {
  17492        // The queue is currently empty, which means we can eagerly compute the
  17493        // next state before entering the render phase. If the new state is the
  17494        // same as the current state, we may be able to bail out entirely.
  17495        var lastRenderedReducer = queue.lastRenderedReducer;
  17496
  17497        if (lastRenderedReducer !== null) {
  17498          var prevDispatcher;
  17499
  17500          {
  17501            prevDispatcher = ReactCurrentDispatcher$1.current;
  17502            ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  17503          }
  17504
  17505          try {
  17506            var currentState = queue.lastRenderedState;
  17507            var eagerState = lastRenderedReducer(currentState, action); // Stash the eagerly computed state, and the reducer used to compute
  17508            // it, on the update object. If the reducer hasn't changed by the
  17509            // time we enter the render phase, then the eager state can be used
  17510            // without calling the reducer again.
  17511
  17512            update.hasEagerState = true;
  17513            update.eagerState = eagerState;
  17514
  17515            if (objectIs(eagerState, currentState)) {
  17516              // Fast path. We can bail out without scheduling React to re-render.
  17517              // It's still possible that we'll need to rebase this update later,
  17518              // if the component re-renders for a different reason and by that
  17519              // time the reducer has changed.
  17520              // TODO: Do we still need to entangle transitions in this case?
  17521              enqueueConcurrentHookUpdateAndEagerlyBailout(fiber, queue, update, lane);
  17522              return;
  17523            }
  17524          } catch (error) {// Suppress the error. It will throw again in the render phase.
  17525          } finally {
  17526            {
  17527              ReactCurrentDispatcher$1.current = prevDispatcher;
  17528            }
  17529          }
  17530        }
  17531      }
  17532
  17533      var root = enqueueConcurrentHookUpdate(fiber, queue, update, lane);
  17534
  17535      if (root !== null) {
  17536        var eventTime = requestEventTime();
  17537        scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  17538        entangleTransitionUpdate(root, queue, lane);
  17539      }
  17540    }
  17541
  17542    markUpdateInDevTools(fiber, lane);
  17543  }
  17544
  17545  function isRenderPhaseUpdate(fiber) {
  17546    var alternate = fiber.alternate;
  17547    return fiber === currentlyRenderingFiber$1 || alternate !== null && alternate === currentlyRenderingFiber$1;
  17548  }
  17549
  17550  function enqueueRenderPhaseUpdate(queue, update) {
  17551    // This is a render phase update. Stash it in a lazily-created map of
  17552    // queue -> linked list of updates. After this render pass, we'll restart
  17553    // and apply the stashed updates on top of the work-in-progress hook.
  17554    didScheduleRenderPhaseUpdateDuringThisPass = didScheduleRenderPhaseUpdate = true;
  17555    var pending = queue.pending;
  17556
  17557    if (pending === null) {
  17558      // This is the first update. Create a circular list.
  17559      update.next = update;
  17560    } else {
  17561      update.next = pending.next;
  17562      pending.next = update;
  17563    }
  17564
  17565    queue.pending = update;
  17566  } // TODO: Move to ReactFiberConcurrentUpdates?
  17567
  17568
  17569  function entangleTransitionUpdate(root, queue, lane) {
  17570    if (isTransitionLane(lane)) {
  17571      var queueLanes = queue.lanes; // If any entangled lanes are no longer pending on the root, then they
  17572      // must have finished. We can remove them from the shared queue, which
  17573      // represents a superset of the actually pending lanes. In some cases we
  17574      // may entangle more than we need to, but that's OK. In fact it's worse if
  17575      // we *don't* entangle when we should.
  17576
  17577      queueLanes = intersectLanes(queueLanes, root.pendingLanes); // Entangle the new transition lane with the other transition lanes.
  17578
  17579      var newQueueLanes = mergeLanes(queueLanes, lane);
  17580      queue.lanes = newQueueLanes; // Even if queue.lanes already include lane, we don't know for certain if
  17581      // the lane finished since the last time we entangled it. So we need to
  17582      // entangle it again, just to be sure.
  17583
  17584      markRootEntangled(root, newQueueLanes);
  17585    }
  17586  }
  17587
  17588  function markUpdateInDevTools(fiber, lane, action) {
  17589
  17590    {
  17591      markStateUpdateScheduled(fiber, lane);
  17592    }
  17593  }
  17594
  17595  var ContextOnlyDispatcher = {
  17596    readContext: readContext,
  17597    useCallback: throwInvalidHookError,
  17598    useContext: throwInvalidHookError,
  17599    useEffect: throwInvalidHookError,
  17600    useImperativeHandle: throwInvalidHookError,
  17601    useInsertionEffect: throwInvalidHookError,
  17602    useLayoutEffect: throwInvalidHookError,
  17603    useMemo: throwInvalidHookError,
  17604    useReducer: throwInvalidHookError,
  17605    useRef: throwInvalidHookError,
  17606    useState: throwInvalidHookError,
  17607    useDebugValue: throwInvalidHookError,
  17608    useDeferredValue: throwInvalidHookError,
  17609    useTransition: throwInvalidHookError,
  17610    useMutableSource: throwInvalidHookError,
  17611    useSyncExternalStore: throwInvalidHookError,
  17612    useId: throwInvalidHookError,
  17613    unstable_isNewReconciler: enableNewReconciler
  17614  };
  17615
  17616  var HooksDispatcherOnMountInDEV = null;
  17617  var HooksDispatcherOnMountWithHookTypesInDEV = null;
  17618  var HooksDispatcherOnUpdateInDEV = null;
  17619  var HooksDispatcherOnRerenderInDEV = null;
  17620  var InvalidNestedHooksDispatcherOnMountInDEV = null;
  17621  var InvalidNestedHooksDispatcherOnUpdateInDEV = null;
  17622  var InvalidNestedHooksDispatcherOnRerenderInDEV = null;
  17623
  17624  {
  17625    var warnInvalidContextAccess = function () {
  17626      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().');
  17627    };
  17628
  17629    var warnInvalidHookAccess = function () {
  17630      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://reactjs.org/link/rules-of-hooks');
  17631    };
  17632
  17633    HooksDispatcherOnMountInDEV = {
  17634      readContext: function (context) {
  17635        return readContext(context);
  17636      },
  17637      useCallback: function (callback, deps) {
  17638        currentHookNameInDev = 'useCallback';
  17639        mountHookTypesDev();
  17640        checkDepsAreArrayDev(deps);
  17641        return mountCallback(callback, deps);
  17642      },
  17643      useContext: function (context) {
  17644        currentHookNameInDev = 'useContext';
  17645        mountHookTypesDev();
  17646        return readContext(context);
  17647      },
  17648      useEffect: function (create, deps) {
  17649        currentHookNameInDev = 'useEffect';
  17650        mountHookTypesDev();
  17651        checkDepsAreArrayDev(deps);
  17652        return mountEffect(create, deps);
  17653      },
  17654      useImperativeHandle: function (ref, create, deps) {
  17655        currentHookNameInDev = 'useImperativeHandle';
  17656        mountHookTypesDev();
  17657        checkDepsAreArrayDev(deps);
  17658        return mountImperativeHandle(ref, create, deps);
  17659      },
  17660      useInsertionEffect: function (create, deps) {
  17661        currentHookNameInDev = 'useInsertionEffect';
  17662        mountHookTypesDev();
  17663        checkDepsAreArrayDev(deps);
  17664        return mountInsertionEffect(create, deps);
  17665      },
  17666      useLayoutEffect: function (create, deps) {
  17667        currentHookNameInDev = 'useLayoutEffect';
  17668        mountHookTypesDev();
  17669        checkDepsAreArrayDev(deps);
  17670        return mountLayoutEffect(create, deps);
  17671      },
  17672      useMemo: function (create, deps) {
  17673        currentHookNameInDev = 'useMemo';
  17674        mountHookTypesDev();
  17675        checkDepsAreArrayDev(deps);
  17676        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17677        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17678
  17679        try {
  17680          return mountMemo(create, deps);
  17681        } finally {
  17682          ReactCurrentDispatcher$1.current = prevDispatcher;
  17683        }
  17684      },
  17685      useReducer: function (reducer, initialArg, init) {
  17686        currentHookNameInDev = 'useReducer';
  17687        mountHookTypesDev();
  17688        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17689        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17690
  17691        try {
  17692          return mountReducer(reducer, initialArg, init);
  17693        } finally {
  17694          ReactCurrentDispatcher$1.current = prevDispatcher;
  17695        }
  17696      },
  17697      useRef: function (initialValue) {
  17698        currentHookNameInDev = 'useRef';
  17699        mountHookTypesDev();
  17700        return mountRef(initialValue);
  17701      },
  17702      useState: function (initialState) {
  17703        currentHookNameInDev = 'useState';
  17704        mountHookTypesDev();
  17705        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17706        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17707
  17708        try {
  17709          return mountState(initialState);
  17710        } finally {
  17711          ReactCurrentDispatcher$1.current = prevDispatcher;
  17712        }
  17713      },
  17714      useDebugValue: function (value, formatterFn) {
  17715        currentHookNameInDev = 'useDebugValue';
  17716        mountHookTypesDev();
  17717        return mountDebugValue();
  17718      },
  17719      useDeferredValue: function (value) {
  17720        currentHookNameInDev = 'useDeferredValue';
  17721        mountHookTypesDev();
  17722        return mountDeferredValue(value);
  17723      },
  17724      useTransition: function () {
  17725        currentHookNameInDev = 'useTransition';
  17726        mountHookTypesDev();
  17727        return mountTransition();
  17728      },
  17729      useMutableSource: function (source, getSnapshot, subscribe) {
  17730        currentHookNameInDev = 'useMutableSource';
  17731        mountHookTypesDev();
  17732        return mountMutableSource();
  17733      },
  17734      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  17735        currentHookNameInDev = 'useSyncExternalStore';
  17736        mountHookTypesDev();
  17737        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
  17738      },
  17739      useId: function () {
  17740        currentHookNameInDev = 'useId';
  17741        mountHookTypesDev();
  17742        return mountId();
  17743      },
  17744      unstable_isNewReconciler: enableNewReconciler
  17745    };
  17746
  17747    HooksDispatcherOnMountWithHookTypesInDEV = {
  17748      readContext: function (context) {
  17749        return readContext(context);
  17750      },
  17751      useCallback: function (callback, deps) {
  17752        currentHookNameInDev = 'useCallback';
  17753        updateHookTypesDev();
  17754        return mountCallback(callback, deps);
  17755      },
  17756      useContext: function (context) {
  17757        currentHookNameInDev = 'useContext';
  17758        updateHookTypesDev();
  17759        return readContext(context);
  17760      },
  17761      useEffect: function (create, deps) {
  17762        currentHookNameInDev = 'useEffect';
  17763        updateHookTypesDev();
  17764        return mountEffect(create, deps);
  17765      },
  17766      useImperativeHandle: function (ref, create, deps) {
  17767        currentHookNameInDev = 'useImperativeHandle';
  17768        updateHookTypesDev();
  17769        return mountImperativeHandle(ref, create, deps);
  17770      },
  17771      useInsertionEffect: function (create, deps) {
  17772        currentHookNameInDev = 'useInsertionEffect';
  17773        updateHookTypesDev();
  17774        return mountInsertionEffect(create, deps);
  17775      },
  17776      useLayoutEffect: function (create, deps) {
  17777        currentHookNameInDev = 'useLayoutEffect';
  17778        updateHookTypesDev();
  17779        return mountLayoutEffect(create, deps);
  17780      },
  17781      useMemo: function (create, deps) {
  17782        currentHookNameInDev = 'useMemo';
  17783        updateHookTypesDev();
  17784        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17785        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17786
  17787        try {
  17788          return mountMemo(create, deps);
  17789        } finally {
  17790          ReactCurrentDispatcher$1.current = prevDispatcher;
  17791        }
  17792      },
  17793      useReducer: function (reducer, initialArg, init) {
  17794        currentHookNameInDev = 'useReducer';
  17795        updateHookTypesDev();
  17796        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17797        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17798
  17799        try {
  17800          return mountReducer(reducer, initialArg, init);
  17801        } finally {
  17802          ReactCurrentDispatcher$1.current = prevDispatcher;
  17803        }
  17804      },
  17805      useRef: function (initialValue) {
  17806        currentHookNameInDev = 'useRef';
  17807        updateHookTypesDev();
  17808        return mountRef(initialValue);
  17809      },
  17810      useState: function (initialState) {
  17811        currentHookNameInDev = 'useState';
  17812        updateHookTypesDev();
  17813        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17814        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  17815
  17816        try {
  17817          return mountState(initialState);
  17818        } finally {
  17819          ReactCurrentDispatcher$1.current = prevDispatcher;
  17820        }
  17821      },
  17822      useDebugValue: function (value, formatterFn) {
  17823        currentHookNameInDev = 'useDebugValue';
  17824        updateHookTypesDev();
  17825        return mountDebugValue();
  17826      },
  17827      useDeferredValue: function (value) {
  17828        currentHookNameInDev = 'useDeferredValue';
  17829        updateHookTypesDev();
  17830        return mountDeferredValue(value);
  17831      },
  17832      useTransition: function () {
  17833        currentHookNameInDev = 'useTransition';
  17834        updateHookTypesDev();
  17835        return mountTransition();
  17836      },
  17837      useMutableSource: function (source, getSnapshot, subscribe) {
  17838        currentHookNameInDev = 'useMutableSource';
  17839        updateHookTypesDev();
  17840        return mountMutableSource();
  17841      },
  17842      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  17843        currentHookNameInDev = 'useSyncExternalStore';
  17844        updateHookTypesDev();
  17845        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
  17846      },
  17847      useId: function () {
  17848        currentHookNameInDev = 'useId';
  17849        updateHookTypesDev();
  17850        return mountId();
  17851      },
  17852      unstable_isNewReconciler: enableNewReconciler
  17853    };
  17854
  17855    HooksDispatcherOnUpdateInDEV = {
  17856      readContext: function (context) {
  17857        return readContext(context);
  17858      },
  17859      useCallback: function (callback, deps) {
  17860        currentHookNameInDev = 'useCallback';
  17861        updateHookTypesDev();
  17862        return updateCallback(callback, deps);
  17863      },
  17864      useContext: function (context) {
  17865        currentHookNameInDev = 'useContext';
  17866        updateHookTypesDev();
  17867        return readContext(context);
  17868      },
  17869      useEffect: function (create, deps) {
  17870        currentHookNameInDev = 'useEffect';
  17871        updateHookTypesDev();
  17872        return updateEffect(create, deps);
  17873      },
  17874      useImperativeHandle: function (ref, create, deps) {
  17875        currentHookNameInDev = 'useImperativeHandle';
  17876        updateHookTypesDev();
  17877        return updateImperativeHandle(ref, create, deps);
  17878      },
  17879      useInsertionEffect: function (create, deps) {
  17880        currentHookNameInDev = 'useInsertionEffect';
  17881        updateHookTypesDev();
  17882        return updateInsertionEffect(create, deps);
  17883      },
  17884      useLayoutEffect: function (create, deps) {
  17885        currentHookNameInDev = 'useLayoutEffect';
  17886        updateHookTypesDev();
  17887        return updateLayoutEffect(create, deps);
  17888      },
  17889      useMemo: function (create, deps) {
  17890        currentHookNameInDev = 'useMemo';
  17891        updateHookTypesDev();
  17892        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17893        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  17894
  17895        try {
  17896          return updateMemo(create, deps);
  17897        } finally {
  17898          ReactCurrentDispatcher$1.current = prevDispatcher;
  17899        }
  17900      },
  17901      useReducer: function (reducer, initialArg, init) {
  17902        currentHookNameInDev = 'useReducer';
  17903        updateHookTypesDev();
  17904        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17905        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  17906
  17907        try {
  17908          return updateReducer(reducer, initialArg, init);
  17909        } finally {
  17910          ReactCurrentDispatcher$1.current = prevDispatcher;
  17911        }
  17912      },
  17913      useRef: function (initialValue) {
  17914        currentHookNameInDev = 'useRef';
  17915        updateHookTypesDev();
  17916        return updateRef();
  17917      },
  17918      useState: function (initialState) {
  17919        currentHookNameInDev = 'useState';
  17920        updateHookTypesDev();
  17921        var prevDispatcher = ReactCurrentDispatcher$1.current;
  17922        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  17923
  17924        try {
  17925          return updateState(initialState);
  17926        } finally {
  17927          ReactCurrentDispatcher$1.current = prevDispatcher;
  17928        }
  17929      },
  17930      useDebugValue: function (value, formatterFn) {
  17931        currentHookNameInDev = 'useDebugValue';
  17932        updateHookTypesDev();
  17933        return updateDebugValue();
  17934      },
  17935      useDeferredValue: function (value) {
  17936        currentHookNameInDev = 'useDeferredValue';
  17937        updateHookTypesDev();
  17938        return updateDeferredValue(value);
  17939      },
  17940      useTransition: function () {
  17941        currentHookNameInDev = 'useTransition';
  17942        updateHookTypesDev();
  17943        return updateTransition();
  17944      },
  17945      useMutableSource: function (source, getSnapshot, subscribe) {
  17946        currentHookNameInDev = 'useMutableSource';
  17947        updateHookTypesDev();
  17948        return updateMutableSource();
  17949      },
  17950      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  17951        currentHookNameInDev = 'useSyncExternalStore';
  17952        updateHookTypesDev();
  17953        return updateSyncExternalStore(subscribe, getSnapshot);
  17954      },
  17955      useId: function () {
  17956        currentHookNameInDev = 'useId';
  17957        updateHookTypesDev();
  17958        return updateId();
  17959      },
  17960      unstable_isNewReconciler: enableNewReconciler
  17961    };
  17962
  17963    HooksDispatcherOnRerenderInDEV = {
  17964      readContext: function (context) {
  17965        return readContext(context);
  17966      },
  17967      useCallback: function (callback, deps) {
  17968        currentHookNameInDev = 'useCallback';
  17969        updateHookTypesDev();
  17970        return updateCallback(callback, deps);
  17971      },
  17972      useContext: function (context) {
  17973        currentHookNameInDev = 'useContext';
  17974        updateHookTypesDev();
  17975        return readContext(context);
  17976      },
  17977      useEffect: function (create, deps) {
  17978        currentHookNameInDev = 'useEffect';
  17979        updateHookTypesDev();
  17980        return updateEffect(create, deps);
  17981      },
  17982      useImperativeHandle: function (ref, create, deps) {
  17983        currentHookNameInDev = 'useImperativeHandle';
  17984        updateHookTypesDev();
  17985        return updateImperativeHandle(ref, create, deps);
  17986      },
  17987      useInsertionEffect: function (create, deps) {
  17988        currentHookNameInDev = 'useInsertionEffect';
  17989        updateHookTypesDev();
  17990        return updateInsertionEffect(create, deps);
  17991      },
  17992      useLayoutEffect: function (create, deps) {
  17993        currentHookNameInDev = 'useLayoutEffect';
  17994        updateHookTypesDev();
  17995        return updateLayoutEffect(create, deps);
  17996      },
  17997      useMemo: function (create, deps) {
  17998        currentHookNameInDev = 'useMemo';
  17999        updateHookTypesDev();
  18000        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18001        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
  18002
  18003        try {
  18004          return updateMemo(create, deps);
  18005        } finally {
  18006          ReactCurrentDispatcher$1.current = prevDispatcher;
  18007        }
  18008      },
  18009      useReducer: function (reducer, initialArg, init) {
  18010        currentHookNameInDev = 'useReducer';
  18011        updateHookTypesDev();
  18012        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18013        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
  18014
  18015        try {
  18016          return rerenderReducer(reducer, initialArg, init);
  18017        } finally {
  18018          ReactCurrentDispatcher$1.current = prevDispatcher;
  18019        }
  18020      },
  18021      useRef: function (initialValue) {
  18022        currentHookNameInDev = 'useRef';
  18023        updateHookTypesDev();
  18024        return updateRef();
  18025      },
  18026      useState: function (initialState) {
  18027        currentHookNameInDev = 'useState';
  18028        updateHookTypesDev();
  18029        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18030        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnRerenderInDEV;
  18031
  18032        try {
  18033          return rerenderState(initialState);
  18034        } finally {
  18035          ReactCurrentDispatcher$1.current = prevDispatcher;
  18036        }
  18037      },
  18038      useDebugValue: function (value, formatterFn) {
  18039        currentHookNameInDev = 'useDebugValue';
  18040        updateHookTypesDev();
  18041        return updateDebugValue();
  18042      },
  18043      useDeferredValue: function (value) {
  18044        currentHookNameInDev = 'useDeferredValue';
  18045        updateHookTypesDev();
  18046        return rerenderDeferredValue(value);
  18047      },
  18048      useTransition: function () {
  18049        currentHookNameInDev = 'useTransition';
  18050        updateHookTypesDev();
  18051        return rerenderTransition();
  18052      },
  18053      useMutableSource: function (source, getSnapshot, subscribe) {
  18054        currentHookNameInDev = 'useMutableSource';
  18055        updateHookTypesDev();
  18056        return updateMutableSource();
  18057      },
  18058      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  18059        currentHookNameInDev = 'useSyncExternalStore';
  18060        updateHookTypesDev();
  18061        return updateSyncExternalStore(subscribe, getSnapshot);
  18062      },
  18063      useId: function () {
  18064        currentHookNameInDev = 'useId';
  18065        updateHookTypesDev();
  18066        return updateId();
  18067      },
  18068      unstable_isNewReconciler: enableNewReconciler
  18069    };
  18070
  18071    InvalidNestedHooksDispatcherOnMountInDEV = {
  18072      readContext: function (context) {
  18073        warnInvalidContextAccess();
  18074        return readContext(context);
  18075      },
  18076      useCallback: function (callback, deps) {
  18077        currentHookNameInDev = 'useCallback';
  18078        warnInvalidHookAccess();
  18079        mountHookTypesDev();
  18080        return mountCallback(callback, deps);
  18081      },
  18082      useContext: function (context) {
  18083        currentHookNameInDev = 'useContext';
  18084        warnInvalidHookAccess();
  18085        mountHookTypesDev();
  18086        return readContext(context);
  18087      },
  18088      useEffect: function (create, deps) {
  18089        currentHookNameInDev = 'useEffect';
  18090        warnInvalidHookAccess();
  18091        mountHookTypesDev();
  18092        return mountEffect(create, deps);
  18093      },
  18094      useImperativeHandle: function (ref, create, deps) {
  18095        currentHookNameInDev = 'useImperativeHandle';
  18096        warnInvalidHookAccess();
  18097        mountHookTypesDev();
  18098        return mountImperativeHandle(ref, create, deps);
  18099      },
  18100      useInsertionEffect: function (create, deps) {
  18101        currentHookNameInDev = 'useInsertionEffect';
  18102        warnInvalidHookAccess();
  18103        mountHookTypesDev();
  18104        return mountInsertionEffect(create, deps);
  18105      },
  18106      useLayoutEffect: function (create, deps) {
  18107        currentHookNameInDev = 'useLayoutEffect';
  18108        warnInvalidHookAccess();
  18109        mountHookTypesDev();
  18110        return mountLayoutEffect(create, deps);
  18111      },
  18112      useMemo: function (create, deps) {
  18113        currentHookNameInDev = 'useMemo';
  18114        warnInvalidHookAccess();
  18115        mountHookTypesDev();
  18116        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18117        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  18118
  18119        try {
  18120          return mountMemo(create, deps);
  18121        } finally {
  18122          ReactCurrentDispatcher$1.current = prevDispatcher;
  18123        }
  18124      },
  18125      useReducer: function (reducer, initialArg, init) {
  18126        currentHookNameInDev = 'useReducer';
  18127        warnInvalidHookAccess();
  18128        mountHookTypesDev();
  18129        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18130        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  18131
  18132        try {
  18133          return mountReducer(reducer, initialArg, init);
  18134        } finally {
  18135          ReactCurrentDispatcher$1.current = prevDispatcher;
  18136        }
  18137      },
  18138      useRef: function (initialValue) {
  18139        currentHookNameInDev = 'useRef';
  18140        warnInvalidHookAccess();
  18141        mountHookTypesDev();
  18142        return mountRef(initialValue);
  18143      },
  18144      useState: function (initialState) {
  18145        currentHookNameInDev = 'useState';
  18146        warnInvalidHookAccess();
  18147        mountHookTypesDev();
  18148        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18149        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnMountInDEV;
  18150
  18151        try {
  18152          return mountState(initialState);
  18153        } finally {
  18154          ReactCurrentDispatcher$1.current = prevDispatcher;
  18155        }
  18156      },
  18157      useDebugValue: function (value, formatterFn) {
  18158        currentHookNameInDev = 'useDebugValue';
  18159        warnInvalidHookAccess();
  18160        mountHookTypesDev();
  18161        return mountDebugValue();
  18162      },
  18163      useDeferredValue: function (value) {
  18164        currentHookNameInDev = 'useDeferredValue';
  18165        warnInvalidHookAccess();
  18166        mountHookTypesDev();
  18167        return mountDeferredValue(value);
  18168      },
  18169      useTransition: function () {
  18170        currentHookNameInDev = 'useTransition';
  18171        warnInvalidHookAccess();
  18172        mountHookTypesDev();
  18173        return mountTransition();
  18174      },
  18175      useMutableSource: function (source, getSnapshot, subscribe) {
  18176        currentHookNameInDev = 'useMutableSource';
  18177        warnInvalidHookAccess();
  18178        mountHookTypesDev();
  18179        return mountMutableSource();
  18180      },
  18181      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  18182        currentHookNameInDev = 'useSyncExternalStore';
  18183        warnInvalidHookAccess();
  18184        mountHookTypesDev();
  18185        return mountSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
  18186      },
  18187      useId: function () {
  18188        currentHookNameInDev = 'useId';
  18189        warnInvalidHookAccess();
  18190        mountHookTypesDev();
  18191        return mountId();
  18192      },
  18193      unstable_isNewReconciler: enableNewReconciler
  18194    };
  18195
  18196    InvalidNestedHooksDispatcherOnUpdateInDEV = {
  18197      readContext: function (context) {
  18198        warnInvalidContextAccess();
  18199        return readContext(context);
  18200      },
  18201      useCallback: function (callback, deps) {
  18202        currentHookNameInDev = 'useCallback';
  18203        warnInvalidHookAccess();
  18204        updateHookTypesDev();
  18205        return updateCallback(callback, deps);
  18206      },
  18207      useContext: function (context) {
  18208        currentHookNameInDev = 'useContext';
  18209        warnInvalidHookAccess();
  18210        updateHookTypesDev();
  18211        return readContext(context);
  18212      },
  18213      useEffect: function (create, deps) {
  18214        currentHookNameInDev = 'useEffect';
  18215        warnInvalidHookAccess();
  18216        updateHookTypesDev();
  18217        return updateEffect(create, deps);
  18218      },
  18219      useImperativeHandle: function (ref, create, deps) {
  18220        currentHookNameInDev = 'useImperativeHandle';
  18221        warnInvalidHookAccess();
  18222        updateHookTypesDev();
  18223        return updateImperativeHandle(ref, create, deps);
  18224      },
  18225      useInsertionEffect: function (create, deps) {
  18226        currentHookNameInDev = 'useInsertionEffect';
  18227        warnInvalidHookAccess();
  18228        updateHookTypesDev();
  18229        return updateInsertionEffect(create, deps);
  18230      },
  18231      useLayoutEffect: function (create, deps) {
  18232        currentHookNameInDev = 'useLayoutEffect';
  18233        warnInvalidHookAccess();
  18234        updateHookTypesDev();
  18235        return updateLayoutEffect(create, deps);
  18236      },
  18237      useMemo: function (create, deps) {
  18238        currentHookNameInDev = 'useMemo';
  18239        warnInvalidHookAccess();
  18240        updateHookTypesDev();
  18241        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18242        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18243
  18244        try {
  18245          return updateMemo(create, deps);
  18246        } finally {
  18247          ReactCurrentDispatcher$1.current = prevDispatcher;
  18248        }
  18249      },
  18250      useReducer: function (reducer, initialArg, init) {
  18251        currentHookNameInDev = 'useReducer';
  18252        warnInvalidHookAccess();
  18253        updateHookTypesDev();
  18254        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18255        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18256
  18257        try {
  18258          return updateReducer(reducer, initialArg, init);
  18259        } finally {
  18260          ReactCurrentDispatcher$1.current = prevDispatcher;
  18261        }
  18262      },
  18263      useRef: function (initialValue) {
  18264        currentHookNameInDev = 'useRef';
  18265        warnInvalidHookAccess();
  18266        updateHookTypesDev();
  18267        return updateRef();
  18268      },
  18269      useState: function (initialState) {
  18270        currentHookNameInDev = 'useState';
  18271        warnInvalidHookAccess();
  18272        updateHookTypesDev();
  18273        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18274        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18275
  18276        try {
  18277          return updateState(initialState);
  18278        } finally {
  18279          ReactCurrentDispatcher$1.current = prevDispatcher;
  18280        }
  18281      },
  18282      useDebugValue: function (value, formatterFn) {
  18283        currentHookNameInDev = 'useDebugValue';
  18284        warnInvalidHookAccess();
  18285        updateHookTypesDev();
  18286        return updateDebugValue();
  18287      },
  18288      useDeferredValue: function (value) {
  18289        currentHookNameInDev = 'useDeferredValue';
  18290        warnInvalidHookAccess();
  18291        updateHookTypesDev();
  18292        return updateDeferredValue(value);
  18293      },
  18294      useTransition: function () {
  18295        currentHookNameInDev = 'useTransition';
  18296        warnInvalidHookAccess();
  18297        updateHookTypesDev();
  18298        return updateTransition();
  18299      },
  18300      useMutableSource: function (source, getSnapshot, subscribe) {
  18301        currentHookNameInDev = 'useMutableSource';
  18302        warnInvalidHookAccess();
  18303        updateHookTypesDev();
  18304        return updateMutableSource();
  18305      },
  18306      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  18307        currentHookNameInDev = 'useSyncExternalStore';
  18308        warnInvalidHookAccess();
  18309        updateHookTypesDev();
  18310        return updateSyncExternalStore(subscribe, getSnapshot);
  18311      },
  18312      useId: function () {
  18313        currentHookNameInDev = 'useId';
  18314        warnInvalidHookAccess();
  18315        updateHookTypesDev();
  18316        return updateId();
  18317      },
  18318      unstable_isNewReconciler: enableNewReconciler
  18319    };
  18320
  18321    InvalidNestedHooksDispatcherOnRerenderInDEV = {
  18322      readContext: function (context) {
  18323        warnInvalidContextAccess();
  18324        return readContext(context);
  18325      },
  18326      useCallback: function (callback, deps) {
  18327        currentHookNameInDev = 'useCallback';
  18328        warnInvalidHookAccess();
  18329        updateHookTypesDev();
  18330        return updateCallback(callback, deps);
  18331      },
  18332      useContext: function (context) {
  18333        currentHookNameInDev = 'useContext';
  18334        warnInvalidHookAccess();
  18335        updateHookTypesDev();
  18336        return readContext(context);
  18337      },
  18338      useEffect: function (create, deps) {
  18339        currentHookNameInDev = 'useEffect';
  18340        warnInvalidHookAccess();
  18341        updateHookTypesDev();
  18342        return updateEffect(create, deps);
  18343      },
  18344      useImperativeHandle: function (ref, create, deps) {
  18345        currentHookNameInDev = 'useImperativeHandle';
  18346        warnInvalidHookAccess();
  18347        updateHookTypesDev();
  18348        return updateImperativeHandle(ref, create, deps);
  18349      },
  18350      useInsertionEffect: function (create, deps) {
  18351        currentHookNameInDev = 'useInsertionEffect';
  18352        warnInvalidHookAccess();
  18353        updateHookTypesDev();
  18354        return updateInsertionEffect(create, deps);
  18355      },
  18356      useLayoutEffect: function (create, deps) {
  18357        currentHookNameInDev = 'useLayoutEffect';
  18358        warnInvalidHookAccess();
  18359        updateHookTypesDev();
  18360        return updateLayoutEffect(create, deps);
  18361      },
  18362      useMemo: function (create, deps) {
  18363        currentHookNameInDev = 'useMemo';
  18364        warnInvalidHookAccess();
  18365        updateHookTypesDev();
  18366        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18367        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18368
  18369        try {
  18370          return updateMemo(create, deps);
  18371        } finally {
  18372          ReactCurrentDispatcher$1.current = prevDispatcher;
  18373        }
  18374      },
  18375      useReducer: function (reducer, initialArg, init) {
  18376        currentHookNameInDev = 'useReducer';
  18377        warnInvalidHookAccess();
  18378        updateHookTypesDev();
  18379        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18380        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18381
  18382        try {
  18383          return rerenderReducer(reducer, initialArg, init);
  18384        } finally {
  18385          ReactCurrentDispatcher$1.current = prevDispatcher;
  18386        }
  18387      },
  18388      useRef: function (initialValue) {
  18389        currentHookNameInDev = 'useRef';
  18390        warnInvalidHookAccess();
  18391        updateHookTypesDev();
  18392        return updateRef();
  18393      },
  18394      useState: function (initialState) {
  18395        currentHookNameInDev = 'useState';
  18396        warnInvalidHookAccess();
  18397        updateHookTypesDev();
  18398        var prevDispatcher = ReactCurrentDispatcher$1.current;
  18399        ReactCurrentDispatcher$1.current = InvalidNestedHooksDispatcherOnUpdateInDEV;
  18400
  18401        try {
  18402          return rerenderState(initialState);
  18403        } finally {
  18404          ReactCurrentDispatcher$1.current = prevDispatcher;
  18405        }
  18406      },
  18407      useDebugValue: function (value, formatterFn) {
  18408        currentHookNameInDev = 'useDebugValue';
  18409        warnInvalidHookAccess();
  18410        updateHookTypesDev();
  18411        return updateDebugValue();
  18412      },
  18413      useDeferredValue: function (value) {
  18414        currentHookNameInDev = 'useDeferredValue';
  18415        warnInvalidHookAccess();
  18416        updateHookTypesDev();
  18417        return rerenderDeferredValue(value);
  18418      },
  18419      useTransition: function () {
  18420        currentHookNameInDev = 'useTransition';
  18421        warnInvalidHookAccess();
  18422        updateHookTypesDev();
  18423        return rerenderTransition();
  18424      },
  18425      useMutableSource: function (source, getSnapshot, subscribe) {
  18426        currentHookNameInDev = 'useMutableSource';
  18427        warnInvalidHookAccess();
  18428        updateHookTypesDev();
  18429        return updateMutableSource();
  18430      },
  18431      useSyncExternalStore: function (subscribe, getSnapshot, getServerSnapshot) {
  18432        currentHookNameInDev = 'useSyncExternalStore';
  18433        warnInvalidHookAccess();
  18434        updateHookTypesDev();
  18435        return updateSyncExternalStore(subscribe, getSnapshot);
  18436      },
  18437      useId: function () {
  18438        currentHookNameInDev = 'useId';
  18439        warnInvalidHookAccess();
  18440        updateHookTypesDev();
  18441        return updateId();
  18442      },
  18443      unstable_isNewReconciler: enableNewReconciler
  18444    };
  18445  }
  18446
  18447  var now$1 = unstable_now;
  18448  var commitTime = 0;
  18449  var layoutEffectStartTime = -1;
  18450  var profilerStartTime = -1;
  18451  var passiveEffectStartTime = -1;
  18452  /**
  18453   * Tracks whether the current update was a nested/cascading update (scheduled from a layout effect).
  18454   *
  18455   * The overall sequence is:
  18456   *   1. render
  18457   *   2. commit (and call `onRender`, `onCommit`)
  18458   *   3. check for nested updates
  18459   *   4. flush passive effects (and call `onPostCommit`)
  18460   *
  18461   * Nested updates are identified in step 3 above,
  18462   * but step 4 still applies to the work that was just committed.
  18463   * We use two flags to track nested updates then:
  18464   * one tracks whether the upcoming update is a nested update,
  18465   * and the other tracks whether the current update was a nested update.
  18466   * The first value gets synced to the second at the start of the render phase.
  18467   */
  18468
  18469  var currentUpdateIsNested = false;
  18470  var nestedUpdateScheduled = false;
  18471
  18472  function isCurrentUpdateNested() {
  18473    return currentUpdateIsNested;
  18474  }
  18475
  18476  function markNestedUpdateScheduled() {
  18477    {
  18478      nestedUpdateScheduled = true;
  18479    }
  18480  }
  18481
  18482  function resetNestedUpdateFlag() {
  18483    {
  18484      currentUpdateIsNested = false;
  18485      nestedUpdateScheduled = false;
  18486    }
  18487  }
  18488
  18489  function syncNestedUpdateFlag() {
  18490    {
  18491      currentUpdateIsNested = nestedUpdateScheduled;
  18492      nestedUpdateScheduled = false;
  18493    }
  18494  }
  18495
  18496  function getCommitTime() {
  18497    return commitTime;
  18498  }
  18499
  18500  function recordCommitTime() {
  18501
  18502    commitTime = now$1();
  18503  }
  18504
  18505  function startProfilerTimer(fiber) {
  18506
  18507    profilerStartTime = now$1();
  18508
  18509    if (fiber.actualStartTime < 0) {
  18510      fiber.actualStartTime = now$1();
  18511    }
  18512  }
  18513
  18514  function stopProfilerTimerIfRunning(fiber) {
  18515
  18516    profilerStartTime = -1;
  18517  }
  18518
  18519  function stopProfilerTimerIfRunningAndRecordDelta(fiber, overrideBaseTime) {
  18520
  18521    if (profilerStartTime >= 0) {
  18522      var elapsedTime = now$1() - profilerStartTime;
  18523      fiber.actualDuration += elapsedTime;
  18524
  18525      if (overrideBaseTime) {
  18526        fiber.selfBaseDuration = elapsedTime;
  18527      }
  18528
  18529      profilerStartTime = -1;
  18530    }
  18531  }
  18532
  18533  function recordLayoutEffectDuration(fiber) {
  18534
  18535    if (layoutEffectStartTime >= 0) {
  18536      var elapsedTime = now$1() - layoutEffectStartTime;
  18537      layoutEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
  18538      // Or the root (for the DevTools Profiler to read)
  18539
  18540      var parentFiber = fiber.return;
  18541
  18542      while (parentFiber !== null) {
  18543        switch (parentFiber.tag) {
  18544          case HostRoot:
  18545            var root = parentFiber.stateNode;
  18546            root.effectDuration += elapsedTime;
  18547            return;
  18548
  18549          case Profiler:
  18550            var parentStateNode = parentFiber.stateNode;
  18551            parentStateNode.effectDuration += elapsedTime;
  18552            return;
  18553        }
  18554
  18555        parentFiber = parentFiber.return;
  18556      }
  18557    }
  18558  }
  18559
  18560  function recordPassiveEffectDuration(fiber) {
  18561
  18562    if (passiveEffectStartTime >= 0) {
  18563      var elapsedTime = now$1() - passiveEffectStartTime;
  18564      passiveEffectStartTime = -1; // Store duration on the next nearest Profiler ancestor
  18565      // Or the root (for the DevTools Profiler to read)
  18566
  18567      var parentFiber = fiber.return;
  18568
  18569      while (parentFiber !== null) {
  18570        switch (parentFiber.tag) {
  18571          case HostRoot:
  18572            var root = parentFiber.stateNode;
  18573
  18574            if (root !== null) {
  18575              root.passiveEffectDuration += elapsedTime;
  18576            }
  18577
  18578            return;
  18579
  18580          case Profiler:
  18581            var parentStateNode = parentFiber.stateNode;
  18582
  18583            if (parentStateNode !== null) {
  18584              // Detached fibers have their state node cleared out.
  18585              // In this case, the return pointer is also cleared out,
  18586              // so we won't be able to report the time spent in this Profiler's subtree.
  18587              parentStateNode.passiveEffectDuration += elapsedTime;
  18588            }
  18589
  18590            return;
  18591        }
  18592
  18593        parentFiber = parentFiber.return;
  18594      }
  18595    }
  18596  }
  18597
  18598  function startLayoutEffectTimer() {
  18599
  18600    layoutEffectStartTime = now$1();
  18601  }
  18602
  18603  function startPassiveEffectTimer() {
  18604
  18605    passiveEffectStartTime = now$1();
  18606  }
  18607
  18608  function transferActualDuration(fiber) {
  18609    // Transfer time spent rendering these children so we don't lose it
  18610    // after we rerender. This is used as a helper in special cases
  18611    // where we should count the work of multiple passes.
  18612    var child = fiber.child;
  18613
  18614    while (child) {
  18615      fiber.actualDuration += child.actualDuration;
  18616      child = child.sibling;
  18617    }
  18618  }
  18619
  18620  function createCapturedValueAtFiber(value, source) {
  18621    // If the value is an error, call this function immediately after it is thrown
  18622    // so the stack is accurate.
  18623    return {
  18624      value: value,
  18625      source: source,
  18626      stack: getStackByFiberInDevAndProd(source),
  18627      digest: null
  18628    };
  18629  }
  18630  function createCapturedValue(value, digest, stack) {
  18631    return {
  18632      value: value,
  18633      source: null,
  18634      stack: stack != null ? stack : null,
  18635      digest: digest != null ? digest : null
  18636    };
  18637  }
  18638
  18639  // This module is forked in different environments.
  18640  // By default, return `true` to log errors to the console.
  18641  // Forks can return `false` if this isn't desirable.
  18642  function showErrorDialog(boundary, errorInfo) {
  18643    return true;
  18644  }
  18645
  18646  function logCapturedError(boundary, errorInfo) {
  18647    try {
  18648      var logError = showErrorDialog(boundary, errorInfo); // Allow injected showErrorDialog() to prevent default console.error logging.
  18649      // This enables renderers like ReactNative to better manage redbox behavior.
  18650
  18651      if (logError === false) {
  18652        return;
  18653      }
  18654
  18655      var error = errorInfo.value;
  18656
  18657      if (true) {
  18658        var source = errorInfo.source;
  18659        var stack = errorInfo.stack;
  18660        var componentStack = stack !== null ? stack : ''; // Browsers support silencing uncaught errors by calling
  18661        // `preventDefault()` in window `error` handler.
  18662        // We record this information as an expando on the error.
  18663
  18664        if (error != null && error._suppressLogging) {
  18665          if (boundary.tag === ClassComponent) {
  18666            // The error is recoverable and was silenced.
  18667            // Ignore it and don't print the stack addendum.
  18668            // This is handy for testing error boundaries without noise.
  18669            return;
  18670          } // The error is fatal. Since the silencing might have
  18671          // been accidental, we'll surface it anyway.
  18672          // However, the browser would have silenced the original error
  18673          // so we'll print it first, and then print the stack addendum.
  18674
  18675
  18676          console['error'](error); // Don't transform to our wrapper
  18677          // For a more detailed description of this block, see:
  18678          // https://github.com/facebook/react/pull/13384
  18679        }
  18680
  18681        var componentName = source ? getComponentNameFromFiber(source) : null;
  18682        var componentNameMessage = componentName ? "The above error occurred in the <" + componentName + "> component:" : 'The above error occurred in one of your React components:';
  18683        var errorBoundaryMessage;
  18684
  18685        if (boundary.tag === HostRoot) {
  18686          errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\n' + 'Visit https://reactjs.org/link/error-boundaries to learn more about error boundaries.';
  18687        } else {
  18688          var errorBoundaryName = getComponentNameFromFiber(boundary) || 'Anonymous';
  18689          errorBoundaryMessage = "React will try to recreate this component tree from scratch " + ("using the error boundary you provided, " + errorBoundaryName + ".");
  18690        }
  18691
  18692        var combinedMessage = componentNameMessage + "\n" + componentStack + "\n\n" + ("" + errorBoundaryMessage); // In development, we provide our own message with just the component stack.
  18693        // We don't include the original error message and JS stack because the browser
  18694        // has already printed it. Even if the application swallows the error, it is still
  18695        // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
  18696
  18697        console['error'](combinedMessage); // Don't transform to our wrapper
  18698      } else {
  18699        // In production, we print the error directly.
  18700        // This will include the message, the JS stack, and anything the browser wants to show.
  18701        // We pass the error object instead of custom message so that the browser displays the error natively.
  18702        console['error'](error); // Don't transform to our wrapper
  18703      }
  18704    } catch (e) {
  18705      // This method must not throw, or React internal state will get messed up.
  18706      // If console.error is overridden, or logCapturedError() shows a dialog that throws,
  18707      // we want to report this error outside of the normal stack as a last resort.
  18708      // https://github.com/facebook/react/issues/13188
  18709      setTimeout(function () {
  18710        throw e;
  18711      });
  18712    }
  18713  }
  18714
  18715  var PossiblyWeakMap$1 = typeof WeakMap === 'function' ? WeakMap : Map;
  18716
  18717  function createRootErrorUpdate(fiber, errorInfo, lane) {
  18718    var update = createUpdate(NoTimestamp, lane); // Unmount the root by rendering null.
  18719
  18720    update.tag = CaptureUpdate; // Caution: React DevTools currently depends on this property
  18721    // being called "element".
  18722
  18723    update.payload = {
  18724      element: null
  18725    };
  18726    var error = errorInfo.value;
  18727
  18728    update.callback = function () {
  18729      onUncaughtError(error);
  18730      logCapturedError(fiber, errorInfo);
  18731    };
  18732
  18733    return update;
  18734  }
  18735
  18736  function createClassErrorUpdate(fiber, errorInfo, lane) {
  18737    var update = createUpdate(NoTimestamp, lane);
  18738    update.tag = CaptureUpdate;
  18739    var getDerivedStateFromError = fiber.type.getDerivedStateFromError;
  18740
  18741    if (typeof getDerivedStateFromError === 'function') {
  18742      var error$1 = errorInfo.value;
  18743
  18744      update.payload = function () {
  18745        return getDerivedStateFromError(error$1);
  18746      };
  18747
  18748      update.callback = function () {
  18749        {
  18750          markFailedErrorBoundaryForHotReloading(fiber);
  18751        }
  18752
  18753        logCapturedError(fiber, errorInfo);
  18754      };
  18755    }
  18756
  18757    var inst = fiber.stateNode;
  18758
  18759    if (inst !== null && typeof inst.componentDidCatch === 'function') {
  18760      update.callback = function callback() {
  18761        {
  18762          markFailedErrorBoundaryForHotReloading(fiber);
  18763        }
  18764
  18765        logCapturedError(fiber, errorInfo);
  18766
  18767        if (typeof getDerivedStateFromError !== 'function') {
  18768          // To preserve the preexisting retry behavior of error boundaries,
  18769          // we keep track of which ones already failed during this batch.
  18770          // This gets reset before we yield back to the browser.
  18771          // TODO: Warn in strict mode if getDerivedStateFromError is
  18772          // not defined.
  18773          markLegacyErrorBoundaryAsFailed(this);
  18774        }
  18775
  18776        var error$1 = errorInfo.value;
  18777        var stack = errorInfo.stack;
  18778        this.componentDidCatch(error$1, {
  18779          componentStack: stack !== null ? stack : ''
  18780        });
  18781
  18782        {
  18783          if (typeof getDerivedStateFromError !== 'function') {
  18784            // If componentDidCatch is the only error boundary method defined,
  18785            // then it needs to call setState to recover from errors.
  18786            // If no state update is scheduled then the boundary will swallow the error.
  18787            if (!includesSomeLane(fiber.lanes, SyncLane)) {
  18788              error('%s: Error boundaries should implement getDerivedStateFromError(). ' + 'In that method, return a state update to display an error message or fallback UI.', getComponentNameFromFiber(fiber) || 'Unknown');
  18789            }
  18790          }
  18791        }
  18792      };
  18793    }
  18794
  18795    return update;
  18796  }
  18797
  18798  function attachPingListener(root, wakeable, lanes) {
  18799    // Attach a ping listener
  18800    //
  18801    // The data might resolve before we have a chance to commit the fallback. Or,
  18802    // in the case of a refresh, we'll never commit a fallback. So we need to
  18803    // attach a listener now. When it resolves ("pings"), we can decide whether to
  18804    // try rendering the tree again.
  18805    //
  18806    // Only attach a listener if one does not already exist for the lanes
  18807    // we're currently rendering (which acts like a "thread ID" here).
  18808    //
  18809    // We only need to do this in concurrent mode. Legacy Suspense always
  18810    // commits fallbacks synchronously, so there are no pings.
  18811    var pingCache = root.pingCache;
  18812    var threadIDs;
  18813
  18814    if (pingCache === null) {
  18815      pingCache = root.pingCache = new PossiblyWeakMap$1();
  18816      threadIDs = new Set();
  18817      pingCache.set(wakeable, threadIDs);
  18818    } else {
  18819      threadIDs = pingCache.get(wakeable);
  18820
  18821      if (threadIDs === undefined) {
  18822        threadIDs = new Set();
  18823        pingCache.set(wakeable, threadIDs);
  18824      }
  18825    }
  18826
  18827    if (!threadIDs.has(lanes)) {
  18828      // Memoize using the thread ID to prevent redundant listeners.
  18829      threadIDs.add(lanes);
  18830      var ping = pingSuspendedRoot.bind(null, root, wakeable, lanes);
  18831
  18832      {
  18833        if (isDevToolsPresent) {
  18834          // If we have pending work still, restore the original updaters
  18835          restorePendingUpdaters(root, lanes);
  18836        }
  18837      }
  18838
  18839      wakeable.then(ping, ping);
  18840    }
  18841  }
  18842
  18843  function attachRetryListener(suspenseBoundary, root, wakeable, lanes) {
  18844    // Retry listener
  18845    //
  18846    // If the fallback does commit, we need to attach a different type of
  18847    // listener. This one schedules an update on the Suspense boundary to turn
  18848    // the fallback state off.
  18849    //
  18850    // Stash the wakeable on the boundary fiber so we can access it in the
  18851    // commit phase.
  18852    //
  18853    // When the wakeable resolves, we'll attempt to render the boundary
  18854    // again ("retry").
  18855    var wakeables = suspenseBoundary.updateQueue;
  18856
  18857    if (wakeables === null) {
  18858      var updateQueue = new Set();
  18859      updateQueue.add(wakeable);
  18860      suspenseBoundary.updateQueue = updateQueue;
  18861    } else {
  18862      wakeables.add(wakeable);
  18863    }
  18864  }
  18865
  18866  function resetSuspendedComponent(sourceFiber, rootRenderLanes) {
  18867    // A legacy mode Suspense quirk, only relevant to hook components.
  18868
  18869
  18870    var tag = sourceFiber.tag;
  18871
  18872    if ((sourceFiber.mode & ConcurrentMode) === NoMode && (tag === FunctionComponent || tag === ForwardRef || tag === SimpleMemoComponent)) {
  18873      var currentSource = sourceFiber.alternate;
  18874
  18875      if (currentSource) {
  18876        sourceFiber.updateQueue = currentSource.updateQueue;
  18877        sourceFiber.memoizedState = currentSource.memoizedState;
  18878        sourceFiber.lanes = currentSource.lanes;
  18879      } else {
  18880        sourceFiber.updateQueue = null;
  18881        sourceFiber.memoizedState = null;
  18882      }
  18883    }
  18884  }
  18885
  18886  function getNearestSuspenseBoundaryToCapture(returnFiber) {
  18887    var node = returnFiber;
  18888
  18889    do {
  18890      if (node.tag === SuspenseComponent && shouldCaptureSuspense(node)) {
  18891        return node;
  18892      } // This boundary already captured during this render. Continue to the next
  18893      // boundary.
  18894
  18895
  18896      node = node.return;
  18897    } while (node !== null);
  18898
  18899    return null;
  18900  }
  18901
  18902  function markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes) {
  18903    // This marks a Suspense boundary so that when we're unwinding the stack,
  18904    // it captures the suspended "exception" and does a second (fallback) pass.
  18905    if ((suspenseBoundary.mode & ConcurrentMode) === NoMode) {
  18906      // Legacy Mode Suspense
  18907      //
  18908      // If the boundary is in legacy mode, we should *not*
  18909      // suspend the commit. Pretend as if the suspended component rendered
  18910      // null and keep rendering. When the Suspense boundary completes,
  18911      // we'll do a second pass to render the fallback.
  18912      if (suspenseBoundary === returnFiber) {
  18913        // Special case where we suspended while reconciling the children of
  18914        // a Suspense boundary's inner Offscreen wrapper fiber. This happens
  18915        // when a React.lazy component is a direct child of a
  18916        // Suspense boundary.
  18917        //
  18918        // Suspense boundaries are implemented as multiple fibers, but they
  18919        // are a single conceptual unit. The legacy mode behavior where we
  18920        // pretend the suspended fiber committed as `null` won't work,
  18921        // because in this case the "suspended" fiber is the inner
  18922        // Offscreen wrapper.
  18923        //
  18924        // Because the contents of the boundary haven't started rendering
  18925        // yet (i.e. nothing in the tree has partially rendered) we can
  18926        // switch to the regular, concurrent mode behavior: mark the
  18927        // boundary with ShouldCapture and enter the unwind phase.
  18928        suspenseBoundary.flags |= ShouldCapture;
  18929      } else {
  18930        suspenseBoundary.flags |= DidCapture;
  18931        sourceFiber.flags |= ForceUpdateForLegacySuspense; // We're going to commit this fiber even though it didn't complete.
  18932        // But we shouldn't call any lifecycle methods or callbacks. Remove
  18933        // all lifecycle effect tags.
  18934
  18935        sourceFiber.flags &= ~(LifecycleEffectMask | Incomplete);
  18936
  18937        if (sourceFiber.tag === ClassComponent) {
  18938          var currentSourceFiber = sourceFiber.alternate;
  18939
  18940          if (currentSourceFiber === null) {
  18941            // This is a new mount. Change the tag so it's not mistaken for a
  18942            // completed class component. For example, we should not call
  18943            // componentWillUnmount if it is deleted.
  18944            sourceFiber.tag = IncompleteClassComponent;
  18945          } else {
  18946            // When we try rendering again, we should not reuse the current fiber,
  18947            // since it's known to be in an inconsistent state. Use a force update to
  18948            // prevent a bail out.
  18949            var update = createUpdate(NoTimestamp, SyncLane);
  18950            update.tag = ForceUpdate;
  18951            enqueueUpdate(sourceFiber, update, SyncLane);
  18952          }
  18953        } // The source fiber did not complete. Mark it with Sync priority to
  18954        // indicate that it still has pending work.
  18955
  18956
  18957        sourceFiber.lanes = mergeLanes(sourceFiber.lanes, SyncLane);
  18958      }
  18959
  18960      return suspenseBoundary;
  18961    } // Confirmed that the boundary is in a concurrent mode tree. Continue
  18962    // with the normal suspend path.
  18963    //
  18964    // After this we'll use a set of heuristics to determine whether this
  18965    // render pass will run to completion or restart or "suspend" the commit.
  18966    // The actual logic for this is spread out in different places.
  18967    //
  18968    // This first principle is that if we're going to suspend when we complete
  18969    // a root, then we should also restart if we get an update or ping that
  18970    // might unsuspend it, and vice versa. The only reason to suspend is
  18971    // because you think you might want to restart before committing. However,
  18972    // it doesn't make sense to restart only while in the period we're suspended.
  18973    //
  18974    // Restarting too aggressively is also not good because it starves out any
  18975    // intermediate loading state. So we use heuristics to determine when.
  18976    // Suspense Heuristics
  18977    //
  18978    // If nothing threw a Promise or all the same fallbacks are already showing,
  18979    // then don't suspend/restart.
  18980    //
  18981    // If this is an initial render of a new tree of Suspense boundaries and
  18982    // those trigger a fallback, then don't suspend/restart. We want to ensure
  18983    // that we can show the initial loading state as quickly as possible.
  18984    //
  18985    // If we hit a "Delayed" case, such as when we'd switch from content back into
  18986    // a fallback, then we should always suspend/restart. Transitions apply
  18987    // to this case. If none is defined, JND is used instead.
  18988    //
  18989    // If we're already showing a fallback and it gets "retried", allowing us to show
  18990    // another level, but there's still an inner boundary that would show a fallback,
  18991    // then we suspend/restart for 500ms since the last time we showed a fallback
  18992    // anywhere in the tree. This effectively throttles progressive loading into a
  18993    // consistent train of commits. This also gives us an opportunity to restart to
  18994    // get to the completed state slightly earlier.
  18995    //
  18996    // If there's ambiguity due to batching it's resolved in preference of:
  18997    // 1) "delayed", 2) "initial render", 3) "retry".
  18998    //
  18999    // We want to ensure that a "busy" state doesn't get force committed. We want to
  19000    // ensure that new initial loading states can commit as soon as possible.
  19001
  19002
  19003    suspenseBoundary.flags |= ShouldCapture; // TODO: I think we can remove this, since we now use `DidCapture` in
  19004    // the begin phase to prevent an early bailout.
  19005
  19006    suspenseBoundary.lanes = rootRenderLanes;
  19007    return suspenseBoundary;
  19008  }
  19009
  19010  function throwException(root, returnFiber, sourceFiber, value, rootRenderLanes) {
  19011    // The source fiber did not complete.
  19012    sourceFiber.flags |= Incomplete;
  19013
  19014    {
  19015      if (isDevToolsPresent) {
  19016        // If we have pending work still, restore the original updaters
  19017        restorePendingUpdaters(root, rootRenderLanes);
  19018      }
  19019    }
  19020
  19021    if (value !== null && typeof value === 'object' && typeof value.then === 'function') {
  19022      // This is a wakeable. The component suspended.
  19023      var wakeable = value;
  19024      resetSuspendedComponent(sourceFiber);
  19025
  19026      {
  19027        if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
  19028          markDidThrowWhileHydratingDEV();
  19029        }
  19030      }
  19031
  19032
  19033      var suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber);
  19034
  19035      if (suspenseBoundary !== null) {
  19036        suspenseBoundary.flags &= ~ForceClientRender;
  19037        markSuspenseBoundaryShouldCapture(suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); // We only attach ping listeners in concurrent mode. Legacy Suspense always
  19038        // commits fallbacks synchronously, so there are no pings.
  19039
  19040        if (suspenseBoundary.mode & ConcurrentMode) {
  19041          attachPingListener(root, wakeable, rootRenderLanes);
  19042        }
  19043
  19044        attachRetryListener(suspenseBoundary, root, wakeable);
  19045        return;
  19046      } else {
  19047        // No boundary was found. Unless this is a sync update, this is OK.
  19048        // We can suspend and wait for more data to arrive.
  19049        if (!includesSyncLane(rootRenderLanes)) {
  19050          // This is not a sync update. Suspend. Since we're not activating a
  19051          // Suspense boundary, this will unwind all the way to the root without
  19052          // performing a second pass to render a fallback. (This is arguably how
  19053          // refresh transitions should work, too, since we're not going to commit
  19054          // the fallbacks anyway.)
  19055          //
  19056          // This case also applies to initial hydration.
  19057          attachPingListener(root, wakeable, rootRenderLanes);
  19058          renderDidSuspendDelayIfPossible();
  19059          return;
  19060        } // This is a sync/discrete update. We treat this case like an error
  19061        // because discrete renders are expected to produce a complete tree
  19062        // synchronously to maintain consistency with external state.
  19063
  19064
  19065        var uncaughtSuspenseError = new Error('A component suspended while responding to synchronous input. This ' + 'will cause the UI to be replaced with a loading indicator. To ' + 'fix, updates that suspend should be wrapped ' + 'with startTransition.'); // If we're outside a transition, fall through to the regular error path.
  19066        // The error will be caught by the nearest suspense boundary.
  19067
  19068        value = uncaughtSuspenseError;
  19069      }
  19070    } else {
  19071      // This is a regular error, not a Suspense wakeable.
  19072      if (getIsHydrating() && sourceFiber.mode & ConcurrentMode) {
  19073        markDidThrowWhileHydratingDEV();
  19074
  19075        var _suspenseBoundary = getNearestSuspenseBoundaryToCapture(returnFiber); // If the error was thrown during hydration, we may be able to recover by
  19076        // discarding the dehydrated content and switching to a client render.
  19077        // Instead of surfacing the error, find the nearest Suspense boundary
  19078        // and render it again without hydration.
  19079
  19080
  19081        if (_suspenseBoundary !== null) {
  19082          if ((_suspenseBoundary.flags & ShouldCapture) === NoFlags) {
  19083            // Set a flag to indicate that we should try rendering the normal
  19084            // children again, not the fallback.
  19085            _suspenseBoundary.flags |= ForceClientRender;
  19086          }
  19087
  19088          markSuspenseBoundaryShouldCapture(_suspenseBoundary, returnFiber, sourceFiber, root, rootRenderLanes); // Even though the user may not be affected by this error, we should
  19089          // still log it so it can be fixed.
  19090
  19091          queueHydrationError(createCapturedValueAtFiber(value, sourceFiber));
  19092          return;
  19093        }
  19094      }
  19095    }
  19096
  19097    value = createCapturedValueAtFiber(value, sourceFiber);
  19098    renderDidError(value); // We didn't find a boundary that could handle this type of exception. Start
  19099    // over and traverse parent path again, this time treating the exception
  19100    // as an error.
  19101
  19102    var workInProgress = returnFiber;
  19103
  19104    do {
  19105      switch (workInProgress.tag) {
  19106        case HostRoot:
  19107          {
  19108            var _errorInfo = value;
  19109            workInProgress.flags |= ShouldCapture;
  19110            var lane = pickArbitraryLane(rootRenderLanes);
  19111            workInProgress.lanes = mergeLanes(workInProgress.lanes, lane);
  19112            var update = createRootErrorUpdate(workInProgress, _errorInfo, lane);
  19113            enqueueCapturedUpdate(workInProgress, update);
  19114            return;
  19115          }
  19116
  19117        case ClassComponent:
  19118          // Capture and retry
  19119          var errorInfo = value;
  19120          var ctor = workInProgress.type;
  19121          var instance = workInProgress.stateNode;
  19122
  19123          if ((workInProgress.flags & DidCapture) === NoFlags && (typeof ctor.getDerivedStateFromError === 'function' || instance !== null && typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance))) {
  19124            workInProgress.flags |= ShouldCapture;
  19125
  19126            var _lane = pickArbitraryLane(rootRenderLanes);
  19127
  19128            workInProgress.lanes = mergeLanes(workInProgress.lanes, _lane); // Schedule the error boundary to re-render using updated state
  19129
  19130            var _update = createClassErrorUpdate(workInProgress, errorInfo, _lane);
  19131
  19132            enqueueCapturedUpdate(workInProgress, _update);
  19133            return;
  19134          }
  19135
  19136          break;
  19137      }
  19138
  19139      workInProgress = workInProgress.return;
  19140    } while (workInProgress !== null);
  19141  }
  19142
  19143  function getSuspendedCache() {
  19144    {
  19145      return null;
  19146    } // This function is called when a Suspense boundary suspends. It returns the
  19147  }
  19148
  19149  var ReactCurrentOwner$1 = ReactSharedInternals.ReactCurrentOwner;
  19150  var didReceiveUpdate = false;
  19151  var didWarnAboutBadClass;
  19152  var didWarnAboutModulePatternComponent;
  19153  var didWarnAboutContextTypeOnFunctionComponent;
  19154  var didWarnAboutGetDerivedStateOnFunctionComponent;
  19155  var didWarnAboutFunctionRefs;
  19156  var didWarnAboutReassigningProps;
  19157  var didWarnAboutRevealOrder;
  19158  var didWarnAboutTailOptions;
  19159
  19160  {
  19161    didWarnAboutBadClass = {};
  19162    didWarnAboutModulePatternComponent = {};
  19163    didWarnAboutContextTypeOnFunctionComponent = {};
  19164    didWarnAboutGetDerivedStateOnFunctionComponent = {};
  19165    didWarnAboutFunctionRefs = {};
  19166    didWarnAboutReassigningProps = false;
  19167    didWarnAboutRevealOrder = {};
  19168    didWarnAboutTailOptions = {};
  19169  }
  19170
  19171  function reconcileChildren(current, workInProgress, nextChildren, renderLanes) {
  19172    if (current === null) {
  19173      // If this is a fresh new component that hasn't been rendered yet, we
  19174      // won't update its child set by applying minimal side-effects. Instead,
  19175      // we will add them all to the child before it gets rendered. That means
  19176      // we can optimize this reconciliation pass by not tracking side-effects.
  19177      workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
  19178    } else {
  19179      // If the current child is the same as the work in progress, it means that
  19180      // we haven't yet started any work on these children. Therefore, we use
  19181      // the clone algorithm to create a copy of all the current children.
  19182      // If we had any progressed work already, that is invalid at this point so
  19183      // let's throw it out.
  19184      workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderLanes);
  19185    }
  19186  }
  19187
  19188  function forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes) {
  19189    // This function is fork of reconcileChildren. It's used in cases where we
  19190    // want to reconcile without matching against the existing set. This has the
  19191    // effect of all current children being unmounted; even if the type and key
  19192    // are the same, the old child is unmounted and a new child is created.
  19193    //
  19194    // To do this, we're going to go through the reconcile algorithm twice. In
  19195    // the first pass, we schedule a deletion for all the current children by
  19196    // passing null.
  19197    workInProgress.child = reconcileChildFibers(workInProgress, current.child, null, renderLanes); // In the second pass, we mount the new children. The trick here is that we
  19198    // pass null in place of where we usually pass the current child set. This has
  19199    // the effect of remounting all children regardless of whether their
  19200    // identities match.
  19201
  19202    workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
  19203  }
  19204
  19205  function updateForwardRef(current, workInProgress, Component, nextProps, renderLanes) {
  19206    // TODO: current can be non-null here even if the component
  19207    // hasn't yet mounted. This happens after the first render suspends.
  19208    // We'll need to figure out if this is fine or can cause issues.
  19209    {
  19210      if (workInProgress.type !== workInProgress.elementType) {
  19211        // Lazy component props can't be validated in createElement
  19212        // because they're only guaranteed to be resolved here.
  19213        var innerPropTypes = Component.propTypes;
  19214
  19215        if (innerPropTypes) {
  19216          checkPropTypes(innerPropTypes, nextProps, // Resolved props
  19217          'prop', getComponentNameFromType(Component));
  19218        }
  19219      }
  19220    }
  19221
  19222    var render = Component.render;
  19223    var ref = workInProgress.ref; // The rest is a fork of updateFunctionComponent
  19224
  19225    var nextChildren;
  19226    var hasId;
  19227    prepareToReadContext(workInProgress, renderLanes);
  19228
  19229    {
  19230      markComponentRenderStarted(workInProgress);
  19231    }
  19232
  19233    {
  19234      ReactCurrentOwner$1.current = workInProgress;
  19235      setIsRendering(true);
  19236      nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
  19237      hasId = checkDidRenderIdHook();
  19238
  19239      if ( workInProgress.mode & StrictLegacyMode) {
  19240        setIsStrictModeForDevtools(true);
  19241
  19242        try {
  19243          nextChildren = renderWithHooks(current, workInProgress, render, nextProps, ref, renderLanes);
  19244          hasId = checkDidRenderIdHook();
  19245        } finally {
  19246          setIsStrictModeForDevtools(false);
  19247        }
  19248      }
  19249
  19250      setIsRendering(false);
  19251    }
  19252
  19253    {
  19254      markComponentRenderStopped();
  19255    }
  19256
  19257    if (current !== null && !didReceiveUpdate) {
  19258      bailoutHooks(current, workInProgress, renderLanes);
  19259      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19260    }
  19261
  19262    if (getIsHydrating() && hasId) {
  19263      pushMaterializedTreeId(workInProgress);
  19264    } // React DevTools reads this flag.
  19265
  19266
  19267    workInProgress.flags |= PerformedWork;
  19268    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19269    return workInProgress.child;
  19270  }
  19271
  19272  function updateMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
  19273    if (current === null) {
  19274      var type = Component.type;
  19275
  19276      if (isSimpleFunctionComponent(type) && Component.compare === null && // SimpleMemoComponent codepath doesn't resolve outer props either.
  19277      Component.defaultProps === undefined) {
  19278        var resolvedType = type;
  19279
  19280        {
  19281          resolvedType = resolveFunctionForHotReloading(type);
  19282        } // If this is a plain function component without default props,
  19283        // and with only the default shallow comparison, we upgrade it
  19284        // to a SimpleMemoComponent to allow fast path updates.
  19285
  19286
  19287        workInProgress.tag = SimpleMemoComponent;
  19288        workInProgress.type = resolvedType;
  19289
  19290        {
  19291          validateFunctionComponentInDev(workInProgress, type);
  19292        }
  19293
  19294        return updateSimpleMemoComponent(current, workInProgress, resolvedType, nextProps, renderLanes);
  19295      }
  19296
  19297      {
  19298        var innerPropTypes = type.propTypes;
  19299
  19300        if (innerPropTypes) {
  19301          // Inner memo component props aren't currently validated in createElement.
  19302          // We could move it there, but we'd still need this for lazy code path.
  19303          checkPropTypes(innerPropTypes, nextProps, // Resolved props
  19304          'prop', getComponentNameFromType(type));
  19305        }
  19306      }
  19307
  19308      var child = createFiberFromTypeAndProps(Component.type, null, nextProps, workInProgress, workInProgress.mode, renderLanes);
  19309      child.ref = workInProgress.ref;
  19310      child.return = workInProgress;
  19311      workInProgress.child = child;
  19312      return child;
  19313    }
  19314
  19315    {
  19316      var _type = Component.type;
  19317      var _innerPropTypes = _type.propTypes;
  19318
  19319      if (_innerPropTypes) {
  19320        // Inner memo component props aren't currently validated in createElement.
  19321        // We could move it there, but we'd still need this for lazy code path.
  19322        checkPropTypes(_innerPropTypes, nextProps, // Resolved props
  19323        'prop', getComponentNameFromType(_type));
  19324      }
  19325    }
  19326
  19327    var currentChild = current.child; // This is always exactly one child
  19328
  19329    var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
  19330
  19331    if (!hasScheduledUpdateOrContext) {
  19332      // This will be the props with resolved defaultProps,
  19333      // unlike current.memoizedProps which will be the unresolved ones.
  19334      var prevProps = currentChild.memoizedProps; // Default to shallow comparison
  19335
  19336      var compare = Component.compare;
  19337      compare = compare !== null ? compare : shallowEqual;
  19338
  19339      if (compare(prevProps, nextProps) && current.ref === workInProgress.ref) {
  19340        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19341      }
  19342    } // React DevTools reads this flag.
  19343
  19344
  19345    workInProgress.flags |= PerformedWork;
  19346    var newChild = createWorkInProgress(currentChild, nextProps);
  19347    newChild.ref = workInProgress.ref;
  19348    newChild.return = workInProgress;
  19349    workInProgress.child = newChild;
  19350    return newChild;
  19351  }
  19352
  19353  function updateSimpleMemoComponent(current, workInProgress, Component, nextProps, renderLanes) {
  19354    // TODO: current can be non-null here even if the component
  19355    // hasn't yet mounted. This happens when the inner render suspends.
  19356    // We'll need to figure out if this is fine or can cause issues.
  19357    {
  19358      if (workInProgress.type !== workInProgress.elementType) {
  19359        // Lazy component props can't be validated in createElement
  19360        // because they're only guaranteed to be resolved here.
  19361        var outerMemoType = workInProgress.elementType;
  19362
  19363        if (outerMemoType.$$typeof === REACT_LAZY_TYPE) {
  19364          // We warn when you define propTypes on lazy()
  19365          // so let's just skip over it to find memo() outer wrapper.
  19366          // Inner props for memo are validated later.
  19367          var lazyComponent = outerMemoType;
  19368          var payload = lazyComponent._payload;
  19369          var init = lazyComponent._init;
  19370
  19371          try {
  19372            outerMemoType = init(payload);
  19373          } catch (x) {
  19374            outerMemoType = null;
  19375          } // Inner propTypes will be validated in the function component path.
  19376
  19377
  19378          var outerPropTypes = outerMemoType && outerMemoType.propTypes;
  19379
  19380          if (outerPropTypes) {
  19381            checkPropTypes(outerPropTypes, nextProps, // Resolved (SimpleMemoComponent has no defaultProps)
  19382            'prop', getComponentNameFromType(outerMemoType));
  19383          }
  19384        }
  19385      }
  19386    }
  19387
  19388    if (current !== null) {
  19389      var prevProps = current.memoizedProps;
  19390
  19391      if (shallowEqual(prevProps, nextProps) && current.ref === workInProgress.ref && ( // Prevent bailout if the implementation changed due to hot reload.
  19392       workInProgress.type === current.type )) {
  19393        didReceiveUpdate = false; // The props are shallowly equal. Reuse the previous props object, like we
  19394        // would during a normal fiber bailout.
  19395        //
  19396        // We don't have strong guarantees that the props object is referentially
  19397        // equal during updates where we can't bail out anyway — like if the props
  19398        // are shallowly equal, but there's a local state or context update in the
  19399        // same batch.
  19400        //
  19401        // However, as a principle, we should aim to make the behavior consistent
  19402        // across different ways of memoizing a component. For example, React.memo
  19403        // has a different internal Fiber layout if you pass a normal function
  19404        // component (SimpleMemoComponent) versus if you pass a different type
  19405        // like forwardRef (MemoComponent). But this is an implementation detail.
  19406        // Wrapping a component in forwardRef (or React.lazy, etc) shouldn't
  19407        // affect whether the props object is reused during a bailout.
  19408
  19409        workInProgress.pendingProps = nextProps = prevProps;
  19410
  19411        if (!checkScheduledUpdateOrContext(current, renderLanes)) {
  19412          // The pending lanes were cleared at the beginning of beginWork. We're
  19413          // about to bail out, but there might be other lanes that weren't
  19414          // included in the current render. Usually, the priority level of the
  19415          // remaining updates is accumulated during the evaluation of the
  19416          // component (i.e. when processing the update queue). But since since
  19417          // we're bailing out early *without* evaluating the component, we need
  19418          // to account for it here, too. Reset to the value of the current fiber.
  19419          // NOTE: This only applies to SimpleMemoComponent, not MemoComponent,
  19420          // because a MemoComponent fiber does not have hooks or an update queue;
  19421          // rather, it wraps around an inner component, which may or may not
  19422          // contains hooks.
  19423          // TODO: Move the reset at in beginWork out of the common path so that
  19424          // this is no longer necessary.
  19425          workInProgress.lanes = current.lanes;
  19426          return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19427        } else if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
  19428          // This is a special case that only exists for legacy mode.
  19429          // See https://github.com/facebook/react/pull/19216.
  19430          didReceiveUpdate = true;
  19431        }
  19432      }
  19433    }
  19434
  19435    return updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes);
  19436  }
  19437
  19438  function updateOffscreenComponent(current, workInProgress, renderLanes) {
  19439    var nextProps = workInProgress.pendingProps;
  19440    var nextChildren = nextProps.children;
  19441    var prevState = current !== null ? current.memoizedState : null;
  19442
  19443    if (nextProps.mode === 'hidden' || enableLegacyHidden ) {
  19444      // Rendering a hidden tree.
  19445      if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  19446        // In legacy sync mode, don't defer the subtree. Render it now.
  19447        // TODO: Consider how Offscreen should work with transitions in the future
  19448        var nextState = {
  19449          baseLanes: NoLanes,
  19450          cachePool: null,
  19451          transitions: null
  19452        };
  19453        workInProgress.memoizedState = nextState;
  19454
  19455        pushRenderLanes(workInProgress, renderLanes);
  19456      } else if (!includesSomeLane(renderLanes, OffscreenLane)) {
  19457        var spawnedCachePool = null; // We're hidden, and we're not rendering at Offscreen. We will bail out
  19458        // and resume this tree later.
  19459
  19460        var nextBaseLanes;
  19461
  19462        if (prevState !== null) {
  19463          var prevBaseLanes = prevState.baseLanes;
  19464          nextBaseLanes = mergeLanes(prevBaseLanes, renderLanes);
  19465        } else {
  19466          nextBaseLanes = renderLanes;
  19467        } // Schedule this fiber to re-render at offscreen priority. Then bailout.
  19468
  19469
  19470        workInProgress.lanes = workInProgress.childLanes = laneToLanes(OffscreenLane);
  19471        var _nextState = {
  19472          baseLanes: nextBaseLanes,
  19473          cachePool: spawnedCachePool,
  19474          transitions: null
  19475        };
  19476        workInProgress.memoizedState = _nextState;
  19477        workInProgress.updateQueue = null;
  19478        // to avoid a push/pop misalignment.
  19479
  19480
  19481        pushRenderLanes(workInProgress, nextBaseLanes);
  19482
  19483        return null;
  19484      } else {
  19485        // This is the second render. The surrounding visible content has already
  19486        // committed. Now we resume rendering the hidden tree.
  19487        // Rendering at offscreen, so we can clear the base lanes.
  19488        var _nextState2 = {
  19489          baseLanes: NoLanes,
  19490          cachePool: null,
  19491          transitions: null
  19492        };
  19493        workInProgress.memoizedState = _nextState2; // Push the lanes that were skipped when we bailed out.
  19494
  19495        var subtreeRenderLanes = prevState !== null ? prevState.baseLanes : renderLanes;
  19496
  19497        pushRenderLanes(workInProgress, subtreeRenderLanes);
  19498      }
  19499    } else {
  19500      // Rendering a visible tree.
  19501      var _subtreeRenderLanes;
  19502
  19503      if (prevState !== null) {
  19504        // We're going from hidden -> visible.
  19505        _subtreeRenderLanes = mergeLanes(prevState.baseLanes, renderLanes);
  19506
  19507        workInProgress.memoizedState = null;
  19508      } else {
  19509        // We weren't previously hidden, and we still aren't, so there's nothing
  19510        // special to do. Need to push to the stack regardless, though, to avoid
  19511        // a push/pop misalignment.
  19512        _subtreeRenderLanes = renderLanes;
  19513      }
  19514
  19515      pushRenderLanes(workInProgress, _subtreeRenderLanes);
  19516    }
  19517
  19518    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19519    return workInProgress.child;
  19520  } // Note: These happen to have identical begin phases, for now. We shouldn't hold
  19521
  19522  function updateFragment(current, workInProgress, renderLanes) {
  19523    var nextChildren = workInProgress.pendingProps;
  19524    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19525    return workInProgress.child;
  19526  }
  19527
  19528  function updateMode(current, workInProgress, renderLanes) {
  19529    var nextChildren = workInProgress.pendingProps.children;
  19530    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19531    return workInProgress.child;
  19532  }
  19533
  19534  function updateProfiler(current, workInProgress, renderLanes) {
  19535    {
  19536      workInProgress.flags |= Update;
  19537
  19538      {
  19539        // Reset effect durations for the next eventual effect phase.
  19540        // These are reset during render to allow the DevTools commit hook a chance to read them,
  19541        var stateNode = workInProgress.stateNode;
  19542        stateNode.effectDuration = 0;
  19543        stateNode.passiveEffectDuration = 0;
  19544      }
  19545    }
  19546
  19547    var nextProps = workInProgress.pendingProps;
  19548    var nextChildren = nextProps.children;
  19549    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19550    return workInProgress.child;
  19551  }
  19552
  19553  function markRef(current, workInProgress) {
  19554    var ref = workInProgress.ref;
  19555
  19556    if (current === null && ref !== null || current !== null && current.ref !== ref) {
  19557      // Schedule a Ref effect
  19558      workInProgress.flags |= Ref;
  19559
  19560      {
  19561        workInProgress.flags |= RefStatic;
  19562      }
  19563    }
  19564  }
  19565
  19566  function updateFunctionComponent(current, workInProgress, Component, nextProps, renderLanes) {
  19567    {
  19568      if (workInProgress.type !== workInProgress.elementType) {
  19569        // Lazy component props can't be validated in createElement
  19570        // because they're only guaranteed to be resolved here.
  19571        var innerPropTypes = Component.propTypes;
  19572
  19573        if (innerPropTypes) {
  19574          checkPropTypes(innerPropTypes, nextProps, // Resolved props
  19575          'prop', getComponentNameFromType(Component));
  19576        }
  19577      }
  19578    }
  19579
  19580    var context;
  19581
  19582    {
  19583      var unmaskedContext = getUnmaskedContext(workInProgress, Component, true);
  19584      context = getMaskedContext(workInProgress, unmaskedContext);
  19585    }
  19586
  19587    var nextChildren;
  19588    var hasId;
  19589    prepareToReadContext(workInProgress, renderLanes);
  19590
  19591    {
  19592      markComponentRenderStarted(workInProgress);
  19593    }
  19594
  19595    {
  19596      ReactCurrentOwner$1.current = workInProgress;
  19597      setIsRendering(true);
  19598      nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
  19599      hasId = checkDidRenderIdHook();
  19600
  19601      if ( workInProgress.mode & StrictLegacyMode) {
  19602        setIsStrictModeForDevtools(true);
  19603
  19604        try {
  19605          nextChildren = renderWithHooks(current, workInProgress, Component, nextProps, context, renderLanes);
  19606          hasId = checkDidRenderIdHook();
  19607        } finally {
  19608          setIsStrictModeForDevtools(false);
  19609        }
  19610      }
  19611
  19612      setIsRendering(false);
  19613    }
  19614
  19615    {
  19616      markComponentRenderStopped();
  19617    }
  19618
  19619    if (current !== null && !didReceiveUpdate) {
  19620      bailoutHooks(current, workInProgress, renderLanes);
  19621      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19622    }
  19623
  19624    if (getIsHydrating() && hasId) {
  19625      pushMaterializedTreeId(workInProgress);
  19626    } // React DevTools reads this flag.
  19627
  19628
  19629    workInProgress.flags |= PerformedWork;
  19630    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19631    return workInProgress.child;
  19632  }
  19633
  19634  function updateClassComponent(current, workInProgress, Component, nextProps, renderLanes) {
  19635    {
  19636      // This is used by DevTools to force a boundary to error.
  19637      switch (shouldError(workInProgress)) {
  19638        case false:
  19639          {
  19640            var _instance = workInProgress.stateNode;
  19641            var ctor = workInProgress.type; // TODO This way of resetting the error boundary state is a hack.
  19642            // Is there a better way to do this?
  19643
  19644            var tempInstance = new ctor(workInProgress.memoizedProps, _instance.context);
  19645            var state = tempInstance.state;
  19646
  19647            _instance.updater.enqueueSetState(_instance, state, null);
  19648
  19649            break;
  19650          }
  19651
  19652        case true:
  19653          {
  19654            workInProgress.flags |= DidCapture;
  19655            workInProgress.flags |= ShouldCapture; // eslint-disable-next-line react-internal/prod-error-codes
  19656
  19657            var error$1 = new Error('Simulated error coming from DevTools');
  19658            var lane = pickArbitraryLane(renderLanes);
  19659            workInProgress.lanes = mergeLanes(workInProgress.lanes, lane); // Schedule the error boundary to re-render using updated state
  19660
  19661            var update = createClassErrorUpdate(workInProgress, createCapturedValueAtFiber(error$1, workInProgress), lane);
  19662            enqueueCapturedUpdate(workInProgress, update);
  19663            break;
  19664          }
  19665      }
  19666
  19667      if (workInProgress.type !== workInProgress.elementType) {
  19668        // Lazy component props can't be validated in createElement
  19669        // because they're only guaranteed to be resolved here.
  19670        var innerPropTypes = Component.propTypes;
  19671
  19672        if (innerPropTypes) {
  19673          checkPropTypes(innerPropTypes, nextProps, // Resolved props
  19674          'prop', getComponentNameFromType(Component));
  19675        }
  19676      }
  19677    } // Push context providers early to prevent context stack mismatches.
  19678    // During mounting we don't know the child context yet as the instance doesn't exist.
  19679    // We will invalidate the child context in finishClassComponent() right after rendering.
  19680
  19681
  19682    var hasContext;
  19683
  19684    if (isContextProvider(Component)) {
  19685      hasContext = true;
  19686      pushContextProvider(workInProgress);
  19687    } else {
  19688      hasContext = false;
  19689    }
  19690
  19691    prepareToReadContext(workInProgress, renderLanes);
  19692    var instance = workInProgress.stateNode;
  19693    var shouldUpdate;
  19694
  19695    if (instance === null) {
  19696      resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress); // In the initial pass we might need to construct the instance.
  19697
  19698      constructClassInstance(workInProgress, Component, nextProps);
  19699      mountClassInstance(workInProgress, Component, nextProps, renderLanes);
  19700      shouldUpdate = true;
  19701    } else if (current === null) {
  19702      // In a resume, we'll already have an instance we can reuse.
  19703      shouldUpdate = resumeMountClassInstance(workInProgress, Component, nextProps, renderLanes);
  19704    } else {
  19705      shouldUpdate = updateClassInstance(current, workInProgress, Component, nextProps, renderLanes);
  19706    }
  19707
  19708    var nextUnitOfWork = finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes);
  19709
  19710    {
  19711      var inst = workInProgress.stateNode;
  19712
  19713      if (shouldUpdate && inst.props !== nextProps) {
  19714        if (!didWarnAboutReassigningProps) {
  19715          error('It looks like %s is reassigning its own `this.props` while rendering. ' + 'This is not supported and can lead to confusing bugs.', getComponentNameFromFiber(workInProgress) || 'a component');
  19716        }
  19717
  19718        didWarnAboutReassigningProps = true;
  19719      }
  19720    }
  19721
  19722    return nextUnitOfWork;
  19723  }
  19724
  19725  function finishClassComponent(current, workInProgress, Component, shouldUpdate, hasContext, renderLanes) {
  19726    // Refs should update even if shouldComponentUpdate returns false
  19727    markRef(current, workInProgress);
  19728    var didCaptureError = (workInProgress.flags & DidCapture) !== NoFlags;
  19729
  19730    if (!shouldUpdate && !didCaptureError) {
  19731      // Context providers should defer to sCU for rendering
  19732      if (hasContext) {
  19733        invalidateContextProvider(workInProgress, Component, false);
  19734      }
  19735
  19736      return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19737    }
  19738
  19739    var instance = workInProgress.stateNode; // Rerender
  19740
  19741    ReactCurrentOwner$1.current = workInProgress;
  19742    var nextChildren;
  19743
  19744    if (didCaptureError && typeof Component.getDerivedStateFromError !== 'function') {
  19745      // If we captured an error, but getDerivedStateFromError is not defined,
  19746      // unmount all the children. componentDidCatch will schedule an update to
  19747      // re-render a fallback. This is temporary until we migrate everyone to
  19748      // the new API.
  19749      // TODO: Warn in a future release.
  19750      nextChildren = null;
  19751
  19752      {
  19753        stopProfilerTimerIfRunning();
  19754      }
  19755    } else {
  19756      {
  19757        markComponentRenderStarted(workInProgress);
  19758      }
  19759
  19760      {
  19761        setIsRendering(true);
  19762        nextChildren = instance.render();
  19763
  19764        if ( workInProgress.mode & StrictLegacyMode) {
  19765          setIsStrictModeForDevtools(true);
  19766
  19767          try {
  19768            instance.render();
  19769          } finally {
  19770            setIsStrictModeForDevtools(false);
  19771          }
  19772        }
  19773
  19774        setIsRendering(false);
  19775      }
  19776
  19777      {
  19778        markComponentRenderStopped();
  19779      }
  19780    } // React DevTools reads this flag.
  19781
  19782
  19783    workInProgress.flags |= PerformedWork;
  19784
  19785    if (current !== null && didCaptureError) {
  19786      // If we're recovering from an error, reconcile without reusing any of
  19787      // the existing children. Conceptually, the normal children and the children
  19788      // that are shown on error are two different sets, so we shouldn't reuse
  19789      // normal children even if their identities match.
  19790      forceUnmountCurrentAndReconcile(current, workInProgress, nextChildren, renderLanes);
  19791    } else {
  19792      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19793    } // Memoize state using the values we just used to render.
  19794    // TODO: Restructure so we never read values from the instance.
  19795
  19796
  19797    workInProgress.memoizedState = instance.state; // The context might have changed so we need to recalculate it.
  19798
  19799    if (hasContext) {
  19800      invalidateContextProvider(workInProgress, Component, true);
  19801    }
  19802
  19803    return workInProgress.child;
  19804  }
  19805
  19806  function pushHostRootContext(workInProgress) {
  19807    var root = workInProgress.stateNode;
  19808
  19809    if (root.pendingContext) {
  19810      pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);
  19811    } else if (root.context) {
  19812      // Should always be set
  19813      pushTopLevelContextObject(workInProgress, root.context, false);
  19814    }
  19815
  19816    pushHostContainer(workInProgress, root.containerInfo);
  19817  }
  19818
  19819  function updateHostRoot(current, workInProgress, renderLanes) {
  19820    pushHostRootContext(workInProgress);
  19821
  19822    if (current === null) {
  19823      throw new Error('Should have a current fiber. This is a bug in React.');
  19824    }
  19825
  19826    var nextProps = workInProgress.pendingProps;
  19827    var prevState = workInProgress.memoizedState;
  19828    var prevChildren = prevState.element;
  19829    cloneUpdateQueue(current, workInProgress);
  19830    processUpdateQueue(workInProgress, nextProps, null, renderLanes);
  19831    var nextState = workInProgress.memoizedState;
  19832    var root = workInProgress.stateNode;
  19833    // being called "element".
  19834
  19835
  19836    var nextChildren = nextState.element;
  19837
  19838    if ( prevState.isDehydrated) {
  19839      // This is a hydration root whose shell has not yet hydrated. We should
  19840      // attempt to hydrate.
  19841      // Flip isDehydrated to false to indicate that when this render
  19842      // finishes, the root will no longer be dehydrated.
  19843      var overrideState = {
  19844        element: nextChildren,
  19845        isDehydrated: false,
  19846        cache: nextState.cache,
  19847        pendingSuspenseBoundaries: nextState.pendingSuspenseBoundaries,
  19848        transitions: nextState.transitions
  19849      };
  19850      var updateQueue = workInProgress.updateQueue; // `baseState` can always be the last state because the root doesn't
  19851      // have reducer functions so it doesn't need rebasing.
  19852
  19853      updateQueue.baseState = overrideState;
  19854      workInProgress.memoizedState = overrideState;
  19855
  19856      if (workInProgress.flags & ForceClientRender) {
  19857        // Something errored during a previous attempt to hydrate the shell, so we
  19858        // forced a client render.
  19859        var recoverableError = createCapturedValueAtFiber(new Error('There was an error while hydrating. Because the error happened outside ' + 'of a Suspense boundary, the entire root will switch to ' + 'client rendering.'), workInProgress);
  19860        return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError);
  19861      } else if (nextChildren !== prevChildren) {
  19862        var _recoverableError = createCapturedValueAtFiber(new Error('This root received an early update, before anything was able ' + 'hydrate. Switched the entire root to client rendering.'), workInProgress);
  19863
  19864        return mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, _recoverableError);
  19865      } else {
  19866        // The outermost shell has not hydrated yet. Start hydrating.
  19867        enterHydrationState(workInProgress);
  19868
  19869        var child = mountChildFibers(workInProgress, null, nextChildren, renderLanes);
  19870        workInProgress.child = child;
  19871        var node = child;
  19872
  19873        while (node) {
  19874          // Mark each child as hydrating. This is a fast path to know whether this
  19875          // tree is part of a hydrating tree. This is used to determine if a child
  19876          // node has fully mounted yet, and for scheduling event replaying.
  19877          // Conceptually this is similar to Placement in that a new subtree is
  19878          // inserted into the React tree here. It just happens to not need DOM
  19879          // mutations because it already exists.
  19880          node.flags = node.flags & ~Placement | Hydrating;
  19881          node = node.sibling;
  19882        }
  19883      }
  19884    } else {
  19885      // Root is not dehydrated. Either this is a client-only root, or it
  19886      // already hydrated.
  19887      resetHydrationState();
  19888
  19889      if (nextChildren === prevChildren) {
  19890        return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  19891      }
  19892
  19893      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19894    }
  19895
  19896    return workInProgress.child;
  19897  }
  19898
  19899  function mountHostRootWithoutHydrating(current, workInProgress, nextChildren, renderLanes, recoverableError) {
  19900    // Revert to client rendering.
  19901    resetHydrationState();
  19902    queueHydrationError(recoverableError);
  19903    workInProgress.flags |= ForceClientRender;
  19904    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19905    return workInProgress.child;
  19906  }
  19907
  19908  function updateHostComponent(current, workInProgress, renderLanes) {
  19909    pushHostContext(workInProgress);
  19910
  19911    if (current === null) {
  19912      tryToClaimNextHydratableInstance(workInProgress);
  19913    }
  19914
  19915    var type = workInProgress.type;
  19916    var nextProps = workInProgress.pendingProps;
  19917    var prevProps = current !== null ? current.memoizedProps : null;
  19918    var nextChildren = nextProps.children;
  19919    var isDirectTextChild = shouldSetTextContent(type, nextProps);
  19920
  19921    if (isDirectTextChild) {
  19922      // We special case a direct text child of a host node. This is a common
  19923      // case. We won't handle it as a reified child. We will instead handle
  19924      // this in the host environment that also has access to this prop. That
  19925      // avoids allocating another HostText fiber and traversing it.
  19926      nextChildren = null;
  19927    } else if (prevProps !== null && shouldSetTextContent(type, prevProps)) {
  19928      // If we're switching from a direct text child to a normal child, or to
  19929      // empty, we need to schedule the text content to be reset.
  19930      workInProgress.flags |= ContentReset;
  19931    }
  19932
  19933    markRef(current, workInProgress);
  19934    reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  19935    return workInProgress.child;
  19936  }
  19937
  19938  function updateHostText(current, workInProgress) {
  19939    if (current === null) {
  19940      tryToClaimNextHydratableInstance(workInProgress);
  19941    } // Nothing to do here. This is terminal. We'll do the completion step
  19942    // immediately after.
  19943
  19944
  19945    return null;
  19946  }
  19947
  19948  function mountLazyComponent(_current, workInProgress, elementType, renderLanes) {
  19949    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
  19950    var props = workInProgress.pendingProps;
  19951    var lazyComponent = elementType;
  19952    var payload = lazyComponent._payload;
  19953    var init = lazyComponent._init;
  19954    var Component = init(payload); // Store the unwrapped component in the type.
  19955
  19956    workInProgress.type = Component;
  19957    var resolvedTag = workInProgress.tag = resolveLazyComponentTag(Component);
  19958    var resolvedProps = resolveDefaultProps(Component, props);
  19959    var child;
  19960
  19961    switch (resolvedTag) {
  19962      case FunctionComponent:
  19963        {
  19964          {
  19965            validateFunctionComponentInDev(workInProgress, Component);
  19966            workInProgress.type = Component = resolveFunctionForHotReloading(Component);
  19967          }
  19968
  19969          child = updateFunctionComponent(null, workInProgress, Component, resolvedProps, renderLanes);
  19970          return child;
  19971        }
  19972
  19973      case ClassComponent:
  19974        {
  19975          {
  19976            workInProgress.type = Component = resolveClassForHotReloading(Component);
  19977          }
  19978
  19979          child = updateClassComponent(null, workInProgress, Component, resolvedProps, renderLanes);
  19980          return child;
  19981        }
  19982
  19983      case ForwardRef:
  19984        {
  19985          {
  19986            workInProgress.type = Component = resolveForwardRefForHotReloading(Component);
  19987          }
  19988
  19989          child = updateForwardRef(null, workInProgress, Component, resolvedProps, renderLanes);
  19990          return child;
  19991        }
  19992
  19993      case MemoComponent:
  19994        {
  19995          {
  19996            if (workInProgress.type !== workInProgress.elementType) {
  19997              var outerPropTypes = Component.propTypes;
  19998
  19999              if (outerPropTypes) {
  20000                checkPropTypes(outerPropTypes, resolvedProps, // Resolved for outer only
  20001                'prop', getComponentNameFromType(Component));
  20002              }
  20003            }
  20004          }
  20005
  20006          child = updateMemoComponent(null, workInProgress, Component, resolveDefaultProps(Component.type, resolvedProps), // The inner type can have defaults too
  20007          renderLanes);
  20008          return child;
  20009        }
  20010    }
  20011
  20012    var hint = '';
  20013
  20014    {
  20015      if (Component !== null && typeof Component === 'object' && Component.$$typeof === REACT_LAZY_TYPE) {
  20016        hint = ' Did you wrap a component in React.lazy() more than once?';
  20017      }
  20018    } // This message intentionally doesn't mention ForwardRef or MemoComponent
  20019    // because the fact that it's a separate type of work is an
  20020    // implementation detail.
  20021
  20022
  20023    throw new Error("Element type is invalid. Received a promise that resolves to: " + Component + ". " + ("Lazy element type must resolve to a class or function." + hint));
  20024  }
  20025
  20026  function mountIncompleteClassComponent(_current, workInProgress, Component, nextProps, renderLanes) {
  20027    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress); // Promote the fiber to a class and try rendering again.
  20028
  20029    workInProgress.tag = ClassComponent; // The rest of this function is a fork of `updateClassComponent`
  20030    // Push context providers early to prevent context stack mismatches.
  20031    // During mounting we don't know the child context yet as the instance doesn't exist.
  20032    // We will invalidate the child context in finishClassComponent() right after rendering.
  20033
  20034    var hasContext;
  20035
  20036    if (isContextProvider(Component)) {
  20037      hasContext = true;
  20038      pushContextProvider(workInProgress);
  20039    } else {
  20040      hasContext = false;
  20041    }
  20042
  20043    prepareToReadContext(workInProgress, renderLanes);
  20044    constructClassInstance(workInProgress, Component, nextProps);
  20045    mountClassInstance(workInProgress, Component, nextProps, renderLanes);
  20046    return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
  20047  }
  20048
  20049  function mountIndeterminateComponent(_current, workInProgress, Component, renderLanes) {
  20050    resetSuspendedCurrentOnMountInLegacyMode(_current, workInProgress);
  20051    var props = workInProgress.pendingProps;
  20052    var context;
  20053
  20054    {
  20055      var unmaskedContext = getUnmaskedContext(workInProgress, Component, false);
  20056      context = getMaskedContext(workInProgress, unmaskedContext);
  20057    }
  20058
  20059    prepareToReadContext(workInProgress, renderLanes);
  20060    var value;
  20061    var hasId;
  20062
  20063    {
  20064      markComponentRenderStarted(workInProgress);
  20065    }
  20066
  20067    {
  20068      if (Component.prototype && typeof Component.prototype.render === 'function') {
  20069        var componentName = getComponentNameFromType(Component) || 'Unknown';
  20070
  20071        if (!didWarnAboutBadClass[componentName]) {
  20072          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);
  20073
  20074          didWarnAboutBadClass[componentName] = true;
  20075        }
  20076      }
  20077
  20078      if (workInProgress.mode & StrictLegacyMode) {
  20079        ReactStrictModeWarnings.recordLegacyContextWarning(workInProgress, null);
  20080      }
  20081
  20082      setIsRendering(true);
  20083      ReactCurrentOwner$1.current = workInProgress;
  20084      value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
  20085      hasId = checkDidRenderIdHook();
  20086      setIsRendering(false);
  20087    }
  20088
  20089    {
  20090      markComponentRenderStopped();
  20091    } // React DevTools reads this flag.
  20092
  20093
  20094    workInProgress.flags |= PerformedWork;
  20095
  20096    {
  20097      // Support for module components is deprecated and is removed behind a flag.
  20098      // Whether or not it would crash later, we want to show a good message in DEV first.
  20099      if (typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
  20100        var _componentName = getComponentNameFromType(Component) || 'Unknown';
  20101
  20102        if (!didWarnAboutModulePatternComponent[_componentName]) {
  20103          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);
  20104
  20105          didWarnAboutModulePatternComponent[_componentName] = true;
  20106        }
  20107      }
  20108    }
  20109
  20110    if ( // Run these checks in production only if the flag is off.
  20111    // Eventually we'll delete this branch altogether.
  20112     typeof value === 'object' && value !== null && typeof value.render === 'function' && value.$$typeof === undefined) {
  20113      {
  20114        var _componentName2 = getComponentNameFromType(Component) || 'Unknown';
  20115
  20116        if (!didWarnAboutModulePatternComponent[_componentName2]) {
  20117          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.', _componentName2, _componentName2, _componentName2);
  20118
  20119          didWarnAboutModulePatternComponent[_componentName2] = true;
  20120        }
  20121      } // Proceed under the assumption that this is a class instance
  20122
  20123
  20124      workInProgress.tag = ClassComponent; // Throw out any hooks that were used.
  20125
  20126      workInProgress.memoizedState = null;
  20127      workInProgress.updateQueue = null; // Push context providers early to prevent context stack mismatches.
  20128      // During mounting we don't know the child context yet as the instance doesn't exist.
  20129      // We will invalidate the child context in finishClassComponent() right after rendering.
  20130
  20131      var hasContext = false;
  20132
  20133      if (isContextProvider(Component)) {
  20134        hasContext = true;
  20135        pushContextProvider(workInProgress);
  20136      } else {
  20137        hasContext = false;
  20138      }
  20139
  20140      workInProgress.memoizedState = value.state !== null && value.state !== undefined ? value.state : null;
  20141      initializeUpdateQueue(workInProgress);
  20142      adoptClassInstance(workInProgress, value);
  20143      mountClassInstance(workInProgress, Component, props, renderLanes);
  20144      return finishClassComponent(null, workInProgress, Component, true, hasContext, renderLanes);
  20145    } else {
  20146      // Proceed under the assumption that this is a function component
  20147      workInProgress.tag = FunctionComponent;
  20148
  20149      {
  20150
  20151        if ( workInProgress.mode & StrictLegacyMode) {
  20152          setIsStrictModeForDevtools(true);
  20153
  20154          try {
  20155            value = renderWithHooks(null, workInProgress, Component, props, context, renderLanes);
  20156            hasId = checkDidRenderIdHook();
  20157          } finally {
  20158            setIsStrictModeForDevtools(false);
  20159          }
  20160        }
  20161      }
  20162
  20163      if (getIsHydrating() && hasId) {
  20164        pushMaterializedTreeId(workInProgress);
  20165      }
  20166
  20167      reconcileChildren(null, workInProgress, value, renderLanes);
  20168
  20169      {
  20170        validateFunctionComponentInDev(workInProgress, Component);
  20171      }
  20172
  20173      return workInProgress.child;
  20174    }
  20175  }
  20176
  20177  function validateFunctionComponentInDev(workInProgress, Component) {
  20178    {
  20179      if (Component) {
  20180        if (Component.childContextTypes) {
  20181          error('%s(...): childContextTypes cannot be defined on a function component.', Component.displayName || Component.name || 'Component');
  20182        }
  20183      }
  20184
  20185      if (workInProgress.ref !== null) {
  20186        var info = '';
  20187        var ownerName = getCurrentFiberOwnerNameInDevOrNull();
  20188
  20189        if (ownerName) {
  20190          info += '\n\nCheck the render method of `' + ownerName + '`.';
  20191        }
  20192
  20193        var warningKey = ownerName || '';
  20194        var debugSource = workInProgress._debugSource;
  20195
  20196        if (debugSource) {
  20197          warningKey = debugSource.fileName + ':' + debugSource.lineNumber;
  20198        }
  20199
  20200        if (!didWarnAboutFunctionRefs[warningKey]) {
  20201          didWarnAboutFunctionRefs[warningKey] = true;
  20202
  20203          error('Function components cannot be given refs. ' + 'Attempts to access this ref will fail. ' + 'Did you mean to use React.forwardRef()?%s', info);
  20204        }
  20205      }
  20206
  20207      if (typeof Component.getDerivedStateFromProps === 'function') {
  20208        var _componentName3 = getComponentNameFromType(Component) || 'Unknown';
  20209
  20210        if (!didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3]) {
  20211          error('%s: Function components do not support getDerivedStateFromProps.', _componentName3);
  20212
  20213          didWarnAboutGetDerivedStateOnFunctionComponent[_componentName3] = true;
  20214        }
  20215      }
  20216
  20217      if (typeof Component.contextType === 'object' && Component.contextType !== null) {
  20218        var _componentName4 = getComponentNameFromType(Component) || 'Unknown';
  20219
  20220        if (!didWarnAboutContextTypeOnFunctionComponent[_componentName4]) {
  20221          error('%s: Function components do not support contextType.', _componentName4);
  20222
  20223          didWarnAboutContextTypeOnFunctionComponent[_componentName4] = true;
  20224        }
  20225      }
  20226    }
  20227  }
  20228
  20229  var SUSPENDED_MARKER = {
  20230    dehydrated: null,
  20231    treeContext: null,
  20232    retryLane: NoLane
  20233  };
  20234
  20235  function mountSuspenseOffscreenState(renderLanes) {
  20236    return {
  20237      baseLanes: renderLanes,
  20238      cachePool: getSuspendedCache(),
  20239      transitions: null
  20240    };
  20241  }
  20242
  20243  function updateSuspenseOffscreenState(prevOffscreenState, renderLanes) {
  20244    var cachePool = null;
  20245
  20246    return {
  20247      baseLanes: mergeLanes(prevOffscreenState.baseLanes, renderLanes),
  20248      cachePool: cachePool,
  20249      transitions: prevOffscreenState.transitions
  20250    };
  20251  } // TODO: Probably should inline this back
  20252
  20253
  20254  function shouldRemainOnFallback(suspenseContext, current, workInProgress, renderLanes) {
  20255    // If we're already showing a fallback, there are cases where we need to
  20256    // remain on that fallback regardless of whether the content has resolved.
  20257    // For example, SuspenseList coordinates when nested content appears.
  20258    if (current !== null) {
  20259      var suspenseState = current.memoizedState;
  20260
  20261      if (suspenseState === null) {
  20262        // Currently showing content. Don't hide it, even if ForceSuspenseFallback
  20263        // is true. More precise name might be "ForceRemainSuspenseFallback".
  20264        // Note: This is a factoring smell. Can't remain on a fallback if there's
  20265        // no fallback to remain on.
  20266        return false;
  20267      }
  20268    } // Not currently showing content. Consult the Suspense context.
  20269
  20270
  20271    return hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
  20272  }
  20273
  20274  function getRemainingWorkInPrimaryTree(current, renderLanes) {
  20275    // TODO: Should not remove render lanes that were pinged during this render
  20276    return removeLanes(current.childLanes, renderLanes);
  20277  }
  20278
  20279  function updateSuspenseComponent(current, workInProgress, renderLanes) {
  20280    var nextProps = workInProgress.pendingProps; // This is used by DevTools to force a boundary to suspend.
  20281
  20282    {
  20283      if (shouldSuspend(workInProgress)) {
  20284        workInProgress.flags |= DidCapture;
  20285      }
  20286    }
  20287
  20288    var suspenseContext = suspenseStackCursor.current;
  20289    var showFallback = false;
  20290    var didSuspend = (workInProgress.flags & DidCapture) !== NoFlags;
  20291
  20292    if (didSuspend || shouldRemainOnFallback(suspenseContext, current)) {
  20293      // Something in this boundary's subtree already suspended. Switch to
  20294      // rendering the fallback children.
  20295      showFallback = true;
  20296      workInProgress.flags &= ~DidCapture;
  20297    } else {
  20298      // Attempting the main content
  20299      if (current === null || current.memoizedState !== null) {
  20300        // This is a new mount or this boundary is already showing a fallback state.
  20301        // Mark this subtree context as having at least one invisible parent that could
  20302        // handle the fallback state.
  20303        // Avoided boundaries are not considered since they cannot handle preferred fallback states.
  20304        {
  20305          suspenseContext = addSubtreeSuspenseContext(suspenseContext, InvisibleParentSuspenseContext);
  20306        }
  20307      }
  20308    }
  20309
  20310    suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
  20311    pushSuspenseContext(workInProgress, suspenseContext); // OK, the next part is confusing. We're about to reconcile the Suspense
  20312    // boundary's children. This involves some custom reconciliation logic. Two
  20313    // main reasons this is so complicated.
  20314    //
  20315    // First, Legacy Mode has different semantics for backwards compatibility. The
  20316    // primary tree will commit in an inconsistent state, so when we do the
  20317    // second pass to render the fallback, we do some exceedingly, uh, clever
  20318    // hacks to make that not totally break. Like transferring effects and
  20319    // deletions from hidden tree. In Concurrent Mode, it's much simpler,
  20320    // because we bailout on the primary tree completely and leave it in its old
  20321    // state, no effects. Same as what we do for Offscreen (except that
  20322    // Offscreen doesn't have the first render pass).
  20323    //
  20324    // Second is hydration. During hydration, the Suspense fiber has a slightly
  20325    // different layout, where the child points to a dehydrated fragment, which
  20326    // contains the DOM rendered by the server.
  20327    //
  20328    // Third, even if you set all that aside, Suspense is like error boundaries in
  20329    // that we first we try to render one tree, and if that fails, we render again
  20330    // and switch to a different tree. Like a try/catch block. So we have to track
  20331    // which branch we're currently rendering. Ideally we would model this using
  20332    // a stack.
  20333
  20334    if (current === null) {
  20335      // Initial mount
  20336      // Special path for hydration
  20337      // If we're currently hydrating, try to hydrate this boundary.
  20338      tryToClaimNextHydratableInstance(workInProgress); // This could've been a dehydrated suspense component.
  20339
  20340      var suspenseState = workInProgress.memoizedState;
  20341
  20342      if (suspenseState !== null) {
  20343        var dehydrated = suspenseState.dehydrated;
  20344
  20345        if (dehydrated !== null) {
  20346          return mountDehydratedSuspenseComponent(workInProgress, dehydrated);
  20347        }
  20348      }
  20349
  20350      var nextPrimaryChildren = nextProps.children;
  20351      var nextFallbackChildren = nextProps.fallback;
  20352
  20353      if (showFallback) {
  20354        var fallbackFragment = mountSuspenseFallbackChildren(workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
  20355        var primaryChildFragment = workInProgress.child;
  20356        primaryChildFragment.memoizedState = mountSuspenseOffscreenState(renderLanes);
  20357        workInProgress.memoizedState = SUSPENDED_MARKER;
  20358
  20359        return fallbackFragment;
  20360      } else {
  20361        return mountSuspensePrimaryChildren(workInProgress, nextPrimaryChildren);
  20362      }
  20363    } else {
  20364      // This is an update.
  20365      // Special path for hydration
  20366      var prevState = current.memoizedState;
  20367
  20368      if (prevState !== null) {
  20369        var _dehydrated = prevState.dehydrated;
  20370
  20371        if (_dehydrated !== null) {
  20372          return updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, _dehydrated, prevState, renderLanes);
  20373        }
  20374      }
  20375
  20376      if (showFallback) {
  20377        var _nextFallbackChildren = nextProps.fallback;
  20378        var _nextPrimaryChildren = nextProps.children;
  20379        var fallbackChildFragment = updateSuspenseFallbackChildren(current, workInProgress, _nextPrimaryChildren, _nextFallbackChildren, renderLanes);
  20380        var _primaryChildFragment2 = workInProgress.child;
  20381        var prevOffscreenState = current.child.memoizedState;
  20382        _primaryChildFragment2.memoizedState = prevOffscreenState === null ? mountSuspenseOffscreenState(renderLanes) : updateSuspenseOffscreenState(prevOffscreenState, renderLanes);
  20383
  20384        _primaryChildFragment2.childLanes = getRemainingWorkInPrimaryTree(current, renderLanes);
  20385        workInProgress.memoizedState = SUSPENDED_MARKER;
  20386        return fallbackChildFragment;
  20387      } else {
  20388        var _nextPrimaryChildren2 = nextProps.children;
  20389
  20390        var _primaryChildFragment3 = updateSuspensePrimaryChildren(current, workInProgress, _nextPrimaryChildren2, renderLanes);
  20391
  20392        workInProgress.memoizedState = null;
  20393        return _primaryChildFragment3;
  20394      }
  20395    }
  20396  }
  20397
  20398  function mountSuspensePrimaryChildren(workInProgress, primaryChildren, renderLanes) {
  20399    var mode = workInProgress.mode;
  20400    var primaryChildProps = {
  20401      mode: 'visible',
  20402      children: primaryChildren
  20403    };
  20404    var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
  20405    primaryChildFragment.return = workInProgress;
  20406    workInProgress.child = primaryChildFragment;
  20407    return primaryChildFragment;
  20408  }
  20409
  20410  function mountSuspenseFallbackChildren(workInProgress, primaryChildren, fallbackChildren, renderLanes) {
  20411    var mode = workInProgress.mode;
  20412    var progressedPrimaryFragment = workInProgress.child;
  20413    var primaryChildProps = {
  20414      mode: 'hidden',
  20415      children: primaryChildren
  20416    };
  20417    var primaryChildFragment;
  20418    var fallbackChildFragment;
  20419
  20420    if ((mode & ConcurrentMode) === NoMode && progressedPrimaryFragment !== null) {
  20421      // In legacy mode, we commit the primary tree as if it successfully
  20422      // completed, even though it's in an inconsistent state.
  20423      primaryChildFragment = progressedPrimaryFragment;
  20424      primaryChildFragment.childLanes = NoLanes;
  20425      primaryChildFragment.pendingProps = primaryChildProps;
  20426
  20427      if ( workInProgress.mode & ProfileMode) {
  20428        // Reset the durations from the first pass so they aren't included in the
  20429        // final amounts. This seems counterintuitive, since we're intentionally
  20430        // not measuring part of the render phase, but this makes it match what we
  20431        // do in Concurrent Mode.
  20432        primaryChildFragment.actualDuration = 0;
  20433        primaryChildFragment.actualStartTime = -1;
  20434        primaryChildFragment.selfBaseDuration = 0;
  20435        primaryChildFragment.treeBaseDuration = 0;
  20436      }
  20437
  20438      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
  20439    } else {
  20440      primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, mode);
  20441      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null);
  20442    }
  20443
  20444    primaryChildFragment.return = workInProgress;
  20445    fallbackChildFragment.return = workInProgress;
  20446    primaryChildFragment.sibling = fallbackChildFragment;
  20447    workInProgress.child = primaryChildFragment;
  20448    return fallbackChildFragment;
  20449  }
  20450
  20451  function mountWorkInProgressOffscreenFiber(offscreenProps, mode, renderLanes) {
  20452    // The props argument to `createFiberFromOffscreen` is `any` typed, so we use
  20453    // this wrapper function to constrain it.
  20454    return createFiberFromOffscreen(offscreenProps, mode, NoLanes, null);
  20455  }
  20456
  20457  function updateWorkInProgressOffscreenFiber(current, offscreenProps) {
  20458    // The props argument to `createWorkInProgress` is `any` typed, so we use this
  20459    // wrapper function to constrain it.
  20460    return createWorkInProgress(current, offscreenProps);
  20461  }
  20462
  20463  function updateSuspensePrimaryChildren(current, workInProgress, primaryChildren, renderLanes) {
  20464    var currentPrimaryChildFragment = current.child;
  20465    var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
  20466    var primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, {
  20467      mode: 'visible',
  20468      children: primaryChildren
  20469    });
  20470
  20471    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  20472      primaryChildFragment.lanes = renderLanes;
  20473    }
  20474
  20475    primaryChildFragment.return = workInProgress;
  20476    primaryChildFragment.sibling = null;
  20477
  20478    if (currentFallbackChildFragment !== null) {
  20479      // Delete the fallback child fragment
  20480      var deletions = workInProgress.deletions;
  20481
  20482      if (deletions === null) {
  20483        workInProgress.deletions = [currentFallbackChildFragment];
  20484        workInProgress.flags |= ChildDeletion;
  20485      } else {
  20486        deletions.push(currentFallbackChildFragment);
  20487      }
  20488    }
  20489
  20490    workInProgress.child = primaryChildFragment;
  20491    return primaryChildFragment;
  20492  }
  20493
  20494  function updateSuspenseFallbackChildren(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
  20495    var mode = workInProgress.mode;
  20496    var currentPrimaryChildFragment = current.child;
  20497    var currentFallbackChildFragment = currentPrimaryChildFragment.sibling;
  20498    var primaryChildProps = {
  20499      mode: 'hidden',
  20500      children: primaryChildren
  20501    };
  20502    var primaryChildFragment;
  20503
  20504    if ( // In legacy mode, we commit the primary tree as if it successfully
  20505    // completed, even though it's in an inconsistent state.
  20506    (mode & ConcurrentMode) === NoMode && // Make sure we're on the second pass, i.e. the primary child fragment was
  20507    // already cloned. In legacy mode, the only case where this isn't true is
  20508    // when DevTools forces us to display a fallback; we skip the first render
  20509    // pass entirely and go straight to rendering the fallback. (In Concurrent
  20510    // Mode, SuspenseList can also trigger this scenario, but this is a legacy-
  20511    // only codepath.)
  20512    workInProgress.child !== currentPrimaryChildFragment) {
  20513      var progressedPrimaryFragment = workInProgress.child;
  20514      primaryChildFragment = progressedPrimaryFragment;
  20515      primaryChildFragment.childLanes = NoLanes;
  20516      primaryChildFragment.pendingProps = primaryChildProps;
  20517
  20518      if ( workInProgress.mode & ProfileMode) {
  20519        // Reset the durations from the first pass so they aren't included in the
  20520        // final amounts. This seems counterintuitive, since we're intentionally
  20521        // not measuring part of the render phase, but this makes it match what we
  20522        // do in Concurrent Mode.
  20523        primaryChildFragment.actualDuration = 0;
  20524        primaryChildFragment.actualStartTime = -1;
  20525        primaryChildFragment.selfBaseDuration = currentPrimaryChildFragment.selfBaseDuration;
  20526        primaryChildFragment.treeBaseDuration = currentPrimaryChildFragment.treeBaseDuration;
  20527      } // The fallback fiber was added as a deletion during the first pass.
  20528      // However, since we're going to remain on the fallback, we no longer want
  20529      // to delete it.
  20530
  20531
  20532      workInProgress.deletions = null;
  20533    } else {
  20534      primaryChildFragment = updateWorkInProgressOffscreenFiber(currentPrimaryChildFragment, primaryChildProps); // Since we're reusing a current tree, we need to reuse the flags, too.
  20535      // (We don't do this in legacy mode, because in legacy mode we don't re-use
  20536      // the current tree; see previous branch.)
  20537
  20538      primaryChildFragment.subtreeFlags = currentPrimaryChildFragment.subtreeFlags & StaticMask;
  20539    }
  20540
  20541    var fallbackChildFragment;
  20542
  20543    if (currentFallbackChildFragment !== null) {
  20544      fallbackChildFragment = createWorkInProgress(currentFallbackChildFragment, fallbackChildren);
  20545    } else {
  20546      fallbackChildFragment = createFiberFromFragment(fallbackChildren, mode, renderLanes, null); // Needs a placement effect because the parent (the Suspense boundary) already
  20547      // mounted but this is a new fiber.
  20548
  20549      fallbackChildFragment.flags |= Placement;
  20550    }
  20551
  20552    fallbackChildFragment.return = workInProgress;
  20553    primaryChildFragment.return = workInProgress;
  20554    primaryChildFragment.sibling = fallbackChildFragment;
  20555    workInProgress.child = primaryChildFragment;
  20556    return fallbackChildFragment;
  20557  }
  20558
  20559  function retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, recoverableError) {
  20560    // Falling back to client rendering. Because this has performance
  20561    // implications, it's considered a recoverable error, even though the user
  20562    // likely won't observe anything wrong with the UI.
  20563    //
  20564    // The error is passed in as an argument to enforce that every caller provide
  20565    // a custom message, or explicitly opt out (currently the only path that opts
  20566    // out is legacy mode; every concurrent path provides an error).
  20567    if (recoverableError !== null) {
  20568      queueHydrationError(recoverableError);
  20569    } // This will add the old fiber to the deletion list
  20570
  20571
  20572    reconcileChildFibers(workInProgress, current.child, null, renderLanes); // We're now not suspended nor dehydrated.
  20573
  20574    var nextProps = workInProgress.pendingProps;
  20575    var primaryChildren = nextProps.children;
  20576    var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Needs a placement effect because the parent (the Suspense boundary) already
  20577    // mounted but this is a new fiber.
  20578
  20579    primaryChildFragment.flags |= Placement;
  20580    workInProgress.memoizedState = null;
  20581    return primaryChildFragment;
  20582  }
  20583
  20584  function mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, primaryChildren, fallbackChildren, renderLanes) {
  20585    var fiberMode = workInProgress.mode;
  20586    var primaryChildProps = {
  20587      mode: 'visible',
  20588      children: primaryChildren
  20589    };
  20590    var primaryChildFragment = mountWorkInProgressOffscreenFiber(primaryChildProps, fiberMode);
  20591    var fallbackChildFragment = createFiberFromFragment(fallbackChildren, fiberMode, renderLanes, null); // Needs a placement effect because the parent (the Suspense
  20592    // boundary) already mounted but this is a new fiber.
  20593
  20594    fallbackChildFragment.flags |= Placement;
  20595    primaryChildFragment.return = workInProgress;
  20596    fallbackChildFragment.return = workInProgress;
  20597    primaryChildFragment.sibling = fallbackChildFragment;
  20598    workInProgress.child = primaryChildFragment;
  20599
  20600    if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
  20601      // We will have dropped the effect list which contains the
  20602      // deletion. We need to reconcile to delete the current child.
  20603      reconcileChildFibers(workInProgress, current.child, null, renderLanes);
  20604    }
  20605
  20606    return fallbackChildFragment;
  20607  }
  20608
  20609  function mountDehydratedSuspenseComponent(workInProgress, suspenseInstance, renderLanes) {
  20610    // During the first pass, we'll bail out and not drill into the children.
  20611    // Instead, we'll leave the content in place and try to hydrate it later.
  20612    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  20613      {
  20614        error('Cannot hydrate Suspense in legacy mode. Switch from ' + 'ReactDOM.hydrate(element, container) to ' + 'ReactDOMClient.hydrateRoot(container, <App />)' + '.render(element) or remove the Suspense components from ' + 'the server rendered components.');
  20615      }
  20616
  20617      workInProgress.lanes = laneToLanes(SyncLane);
  20618    } else if (isSuspenseInstanceFallback(suspenseInstance)) {
  20619      // This is a client-only boundary. Since we won't get any content from the server
  20620      // for this, we need to schedule that at a higher priority based on when it would
  20621      // have timed out. In theory we could render it in this pass but it would have the
  20622      // wrong priority associated with it and will prevent hydration of parent path.
  20623      // Instead, we'll leave work left on it to render it in a separate commit.
  20624      // TODO This time should be the time at which the server rendered response that is
  20625      // a parent to this boundary was displayed. However, since we currently don't have
  20626      // a protocol to transfer that time, we'll just estimate it by using the current
  20627      // time. This will mean that Suspense timeouts are slightly shifted to later than
  20628      // they should be.
  20629      // Schedule a normal pri update to render this content.
  20630      workInProgress.lanes = laneToLanes(DefaultHydrationLane);
  20631    } else {
  20632      // We'll continue hydrating the rest at offscreen priority since we'll already
  20633      // be showing the right content coming from the server, it is no rush.
  20634      workInProgress.lanes = laneToLanes(OffscreenLane);
  20635    }
  20636
  20637    return null;
  20638  }
  20639
  20640  function updateDehydratedSuspenseComponent(current, workInProgress, didSuspend, nextProps, suspenseInstance, suspenseState, renderLanes) {
  20641    if (!didSuspend) {
  20642      // This is the first render pass. Attempt to hydrate.
  20643      // We should never be hydrating at this point because it is the first pass,
  20644      // but after we've already committed once.
  20645      warnIfHydrating();
  20646
  20647      if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  20648        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, // TODO: When we delete legacy mode, we should make this error argument
  20649        // required — every concurrent mode path that causes hydration to
  20650        // de-opt to client rendering should have an error message.
  20651        null);
  20652      }
  20653
  20654      if (isSuspenseInstanceFallback(suspenseInstance)) {
  20655        // This boundary is in a permanent fallback state. In this case, we'll never
  20656        // get an update and we'll never be able to hydrate the final content. Let's just try the
  20657        // client side render instead.
  20658        var digest, message, stack;
  20659
  20660        {
  20661          var _getSuspenseInstanceF = getSuspenseInstanceFallbackErrorDetails(suspenseInstance);
  20662
  20663          digest = _getSuspenseInstanceF.digest;
  20664          message = _getSuspenseInstanceF.message;
  20665          stack = _getSuspenseInstanceF.stack;
  20666        }
  20667
  20668        var error;
  20669
  20670        if (message) {
  20671          // eslint-disable-next-line react-internal/prod-error-codes
  20672          error = new Error(message);
  20673        } else {
  20674          error = new Error('The server could not finish this Suspense boundary, likely ' + 'due to an error during server rendering. Switched to ' + 'client rendering.');
  20675        }
  20676
  20677        var capturedValue = createCapturedValue(error, digest, stack);
  20678        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, capturedValue);
  20679      }
  20680      // any context has changed, we need to treat is as if the input might have changed.
  20681
  20682
  20683      var hasContextChanged = includesSomeLane(renderLanes, current.childLanes);
  20684
  20685      if (didReceiveUpdate || hasContextChanged) {
  20686        // This boundary has changed since the first render. This means that we are now unable to
  20687        // hydrate it. We might still be able to hydrate it using a higher priority lane.
  20688        var root = getWorkInProgressRoot();
  20689
  20690        if (root !== null) {
  20691          var attemptHydrationAtLane = getBumpedLaneForHydration(root, renderLanes);
  20692
  20693          if (attemptHydrationAtLane !== NoLane && attemptHydrationAtLane !== suspenseState.retryLane) {
  20694            // Intentionally mutating since this render will get interrupted. This
  20695            // is one of the very rare times where we mutate the current tree
  20696            // during the render phase.
  20697            suspenseState.retryLane = attemptHydrationAtLane; // TODO: Ideally this would inherit the event time of the current render
  20698
  20699            var eventTime = NoTimestamp;
  20700            enqueueConcurrentRenderForLane(current, attemptHydrationAtLane);
  20701            scheduleUpdateOnFiber(root, current, attemptHydrationAtLane, eventTime);
  20702          }
  20703        } // If we have scheduled higher pri work above, this will probably just abort the render
  20704        // since we now have higher priority work, but in case it doesn't, we need to prepare to
  20705        // render something, if we time out. Even if that requires us to delete everything and
  20706        // skip hydration.
  20707        // Delay having to do this as long as the suspense timeout allows us.
  20708
  20709
  20710        renderDidSuspendDelayIfPossible();
  20711
  20712        var _capturedValue = createCapturedValue(new Error('This Suspense boundary received an update before it finished ' + 'hydrating. This caused the boundary to switch to client rendering. ' + 'The usual way to fix this is to wrap the original update ' + 'in startTransition.'));
  20713
  20714        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue);
  20715      } else if (isSuspenseInstancePending(suspenseInstance)) {
  20716        // This component is still pending more data from the server, so we can't hydrate its
  20717        // content. We treat it as if this component suspended itself. It might seem as if
  20718        // we could just try to render it client-side instead. However, this will perform a
  20719        // lot of unnecessary work and is unlikely to complete since it often will suspend
  20720        // on missing data anyway. Additionally, the server might be able to render more
  20721        // than we can on the client yet. In that case we'd end up with more fallback states
  20722        // on the client than if we just leave it alone. If the server times out or errors
  20723        // these should update this boundary to the permanent Fallback state instead.
  20724        // Mark it as having captured (i.e. suspended).
  20725        workInProgress.flags |= DidCapture; // Leave the child in place. I.e. the dehydrated fragment.
  20726
  20727        workInProgress.child = current.child; // Register a callback to retry this boundary once the server has sent the result.
  20728
  20729        var retry = retryDehydratedSuspenseBoundary.bind(null, current);
  20730        registerSuspenseInstanceRetry(suspenseInstance, retry);
  20731        return null;
  20732      } else {
  20733        // This is the first attempt.
  20734        reenterHydrationStateFromDehydratedSuspenseInstance(workInProgress, suspenseInstance, suspenseState.treeContext);
  20735        var primaryChildren = nextProps.children;
  20736        var primaryChildFragment = mountSuspensePrimaryChildren(workInProgress, primaryChildren); // Mark the children as hydrating. This is a fast path to know whether this
  20737        // tree is part of a hydrating tree. This is used to determine if a child
  20738        // node has fully mounted yet, and for scheduling event replaying.
  20739        // Conceptually this is similar to Placement in that a new subtree is
  20740        // inserted into the React tree here. It just happens to not need DOM
  20741        // mutations because it already exists.
  20742
  20743        primaryChildFragment.flags |= Hydrating;
  20744        return primaryChildFragment;
  20745      }
  20746    } else {
  20747      // This is the second render pass. We already attempted to hydrated, but
  20748      // something either suspended or errored.
  20749      if (workInProgress.flags & ForceClientRender) {
  20750        // Something errored during hydration. Try again without hydrating.
  20751        workInProgress.flags &= ~ForceClientRender;
  20752
  20753        var _capturedValue2 = createCapturedValue(new Error('There was an error while hydrating this Suspense boundary. ' + 'Switched to client rendering.'));
  20754
  20755        return retrySuspenseComponentWithoutHydrating(current, workInProgress, renderLanes, _capturedValue2);
  20756      } else if (workInProgress.memoizedState !== null) {
  20757        // Something suspended and we should still be in dehydrated mode.
  20758        // Leave the existing child in place.
  20759        workInProgress.child = current.child; // The dehydrated completion pass expects this flag to be there
  20760        // but the normal suspense pass doesn't.
  20761
  20762        workInProgress.flags |= DidCapture;
  20763        return null;
  20764      } else {
  20765        // Suspended but we should no longer be in dehydrated mode.
  20766        // Therefore we now have to render the fallback.
  20767        var nextPrimaryChildren = nextProps.children;
  20768        var nextFallbackChildren = nextProps.fallback;
  20769        var fallbackChildFragment = mountSuspenseFallbackAfterRetryWithoutHydrating(current, workInProgress, nextPrimaryChildren, nextFallbackChildren, renderLanes);
  20770        var _primaryChildFragment4 = workInProgress.child;
  20771        _primaryChildFragment4.memoizedState = mountSuspenseOffscreenState(renderLanes);
  20772        workInProgress.memoizedState = SUSPENDED_MARKER;
  20773        return fallbackChildFragment;
  20774      }
  20775    }
  20776  }
  20777
  20778  function scheduleSuspenseWorkOnFiber(fiber, renderLanes, propagationRoot) {
  20779    fiber.lanes = mergeLanes(fiber.lanes, renderLanes);
  20780    var alternate = fiber.alternate;
  20781
  20782    if (alternate !== null) {
  20783      alternate.lanes = mergeLanes(alternate.lanes, renderLanes);
  20784    }
  20785
  20786    scheduleContextWorkOnParentPath(fiber.return, renderLanes, propagationRoot);
  20787  }
  20788
  20789  function propagateSuspenseContextChange(workInProgress, firstChild, renderLanes) {
  20790    // Mark any Suspense boundaries with fallbacks as having work to do.
  20791    // If they were previously forced into fallbacks, they may now be able
  20792    // to unblock.
  20793    var node = firstChild;
  20794
  20795    while (node !== null) {
  20796      if (node.tag === SuspenseComponent) {
  20797        var state = node.memoizedState;
  20798
  20799        if (state !== null) {
  20800          scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
  20801        }
  20802      } else if (node.tag === SuspenseListComponent) {
  20803        // If the tail is hidden there might not be an Suspense boundaries
  20804        // to schedule work on. In this case we have to schedule it on the
  20805        // list itself.
  20806        // We don't have to traverse to the children of the list since
  20807        // the list will propagate the change when it rerenders.
  20808        scheduleSuspenseWorkOnFiber(node, renderLanes, workInProgress);
  20809      } else if (node.child !== null) {
  20810        node.child.return = node;
  20811        node = node.child;
  20812        continue;
  20813      }
  20814
  20815      if (node === workInProgress) {
  20816        return;
  20817      }
  20818
  20819      while (node.sibling === null) {
  20820        if (node.return === null || node.return === workInProgress) {
  20821          return;
  20822        }
  20823
  20824        node = node.return;
  20825      }
  20826
  20827      node.sibling.return = node.return;
  20828      node = node.sibling;
  20829    }
  20830  }
  20831
  20832  function findLastContentRow(firstChild) {
  20833    // This is going to find the last row among these children that is already
  20834    // showing content on the screen, as opposed to being in fallback state or
  20835    // new. If a row has multiple Suspense boundaries, any of them being in the
  20836    // fallback state, counts as the whole row being in a fallback state.
  20837    // Note that the "rows" will be workInProgress, but any nested children
  20838    // will still be current since we haven't rendered them yet. The mounted
  20839    // order may not be the same as the new order. We use the new order.
  20840    var row = firstChild;
  20841    var lastContentRow = null;
  20842
  20843    while (row !== null) {
  20844      var currentRow = row.alternate; // New rows can't be content rows.
  20845
  20846      if (currentRow !== null && findFirstSuspended(currentRow) === null) {
  20847        lastContentRow = row;
  20848      }
  20849
  20850      row = row.sibling;
  20851    }
  20852
  20853    return lastContentRow;
  20854  }
  20855
  20856  function validateRevealOrder(revealOrder) {
  20857    {
  20858      if (revealOrder !== undefined && revealOrder !== 'forwards' && revealOrder !== 'backwards' && revealOrder !== 'together' && !didWarnAboutRevealOrder[revealOrder]) {
  20859        didWarnAboutRevealOrder[revealOrder] = true;
  20860
  20861        if (typeof revealOrder === 'string') {
  20862          switch (revealOrder.toLowerCase()) {
  20863            case 'together':
  20864            case 'forwards':
  20865            case 'backwards':
  20866              {
  20867                error('"%s" is not a valid value for revealOrder on <SuspenseList />. ' + 'Use lowercase "%s" instead.', revealOrder, revealOrder.toLowerCase());
  20868
  20869                break;
  20870              }
  20871
  20872            case 'forward':
  20873            case 'backward':
  20874              {
  20875                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());
  20876
  20877                break;
  20878              }
  20879
  20880            default:
  20881              error('"%s" is not a supported revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
  20882
  20883              break;
  20884          }
  20885        } else {
  20886          error('%s is not a supported value for revealOrder on <SuspenseList />. ' + 'Did you mean "together", "forwards" or "backwards"?', revealOrder);
  20887        }
  20888      }
  20889    }
  20890  }
  20891
  20892  function validateTailOptions(tailMode, revealOrder) {
  20893    {
  20894      if (tailMode !== undefined && !didWarnAboutTailOptions[tailMode]) {
  20895        if (tailMode !== 'collapsed' && tailMode !== 'hidden') {
  20896          didWarnAboutTailOptions[tailMode] = true;
  20897
  20898          error('"%s" is not a supported value for tail on <SuspenseList />. ' + 'Did you mean "collapsed" or "hidden"?', tailMode);
  20899        } else if (revealOrder !== 'forwards' && revealOrder !== 'backwards') {
  20900          didWarnAboutTailOptions[tailMode] = true;
  20901
  20902          error('<SuspenseList tail="%s" /> is only valid if revealOrder is ' + '"forwards" or "backwards". ' + 'Did you mean to specify revealOrder="forwards"?', tailMode);
  20903        }
  20904      }
  20905    }
  20906  }
  20907
  20908  function validateSuspenseListNestedChild(childSlot, index) {
  20909    {
  20910      var isAnArray = isArray(childSlot);
  20911      var isIterable = !isAnArray && typeof getIteratorFn(childSlot) === 'function';
  20912
  20913      if (isAnArray || isIterable) {
  20914        var type = isAnArray ? 'array' : 'iterable';
  20915
  20916        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);
  20917
  20918        return false;
  20919      }
  20920    }
  20921
  20922    return true;
  20923  }
  20924
  20925  function validateSuspenseListChildren(children, revealOrder) {
  20926    {
  20927      if ((revealOrder === 'forwards' || revealOrder === 'backwards') && children !== undefined && children !== null && children !== false) {
  20928        if (isArray(children)) {
  20929          for (var i = 0; i < children.length; i++) {
  20930            if (!validateSuspenseListNestedChild(children[i], i)) {
  20931              return;
  20932            }
  20933          }
  20934        } else {
  20935          var iteratorFn = getIteratorFn(children);
  20936
  20937          if (typeof iteratorFn === 'function') {
  20938            var childrenIterator = iteratorFn.call(children);
  20939
  20940            if (childrenIterator) {
  20941              var step = childrenIterator.next();
  20942              var _i = 0;
  20943
  20944              for (; !step.done; step = childrenIterator.next()) {
  20945                if (!validateSuspenseListNestedChild(step.value, _i)) {
  20946                  return;
  20947                }
  20948
  20949                _i++;
  20950              }
  20951            }
  20952          } else {
  20953            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);
  20954          }
  20955        }
  20956      }
  20957    }
  20958  }
  20959
  20960  function initSuspenseListRenderState(workInProgress, isBackwards, tail, lastContentRow, tailMode) {
  20961    var renderState = workInProgress.memoizedState;
  20962
  20963    if (renderState === null) {
  20964      workInProgress.memoizedState = {
  20965        isBackwards: isBackwards,
  20966        rendering: null,
  20967        renderingStartTime: 0,
  20968        last: lastContentRow,
  20969        tail: tail,
  20970        tailMode: tailMode
  20971      };
  20972    } else {
  20973      // We can reuse the existing object from previous renders.
  20974      renderState.isBackwards = isBackwards;
  20975      renderState.rendering = null;
  20976      renderState.renderingStartTime = 0;
  20977      renderState.last = lastContentRow;
  20978      renderState.tail = tail;
  20979      renderState.tailMode = tailMode;
  20980    }
  20981  } // This can end up rendering this component multiple passes.
  20982  // The first pass splits the children fibers into two sets. A head and tail.
  20983  // We first render the head. If anything is in fallback state, we do another
  20984  // pass through beginWork to rerender all children (including the tail) with
  20985  // the force suspend context. If the first render didn't have anything in
  20986  // in fallback state. Then we render each row in the tail one-by-one.
  20987  // That happens in the completeWork phase without going back to beginWork.
  20988
  20989
  20990  function updateSuspenseListComponent(current, workInProgress, renderLanes) {
  20991    var nextProps = workInProgress.pendingProps;
  20992    var revealOrder = nextProps.revealOrder;
  20993    var tailMode = nextProps.tail;
  20994    var newChildren = nextProps.children;
  20995    validateRevealOrder(revealOrder);
  20996    validateTailOptions(tailMode, revealOrder);
  20997    validateSuspenseListChildren(newChildren, revealOrder);
  20998    reconcileChildren(current, workInProgress, newChildren, renderLanes);
  20999    var suspenseContext = suspenseStackCursor.current;
  21000    var shouldForceFallback = hasSuspenseContext(suspenseContext, ForceSuspenseFallback);
  21001
  21002    if (shouldForceFallback) {
  21003      suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
  21004      workInProgress.flags |= DidCapture;
  21005    } else {
  21006      var didSuspendBefore = current !== null && (current.flags & DidCapture) !== NoFlags;
  21007
  21008      if (didSuspendBefore) {
  21009        // If we previously forced a fallback, we need to schedule work
  21010        // on any nested boundaries to let them know to try to render
  21011        // again. This is the same as context updating.
  21012        propagateSuspenseContextChange(workInProgress, workInProgress.child, renderLanes);
  21013      }
  21014
  21015      suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
  21016    }
  21017
  21018    pushSuspenseContext(workInProgress, suspenseContext);
  21019
  21020    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  21021      // In legacy mode, SuspenseList doesn't work so we just
  21022      // use make it a noop by treating it as the default revealOrder.
  21023      workInProgress.memoizedState = null;
  21024    } else {
  21025      switch (revealOrder) {
  21026        case 'forwards':
  21027          {
  21028            var lastContentRow = findLastContentRow(workInProgress.child);
  21029            var tail;
  21030
  21031            if (lastContentRow === null) {
  21032              // The whole list is part of the tail.
  21033              // TODO: We could fast path by just rendering the tail now.
  21034              tail = workInProgress.child;
  21035              workInProgress.child = null;
  21036            } else {
  21037              // Disconnect the tail rows after the content row.
  21038              // We're going to render them separately later.
  21039              tail = lastContentRow.sibling;
  21040              lastContentRow.sibling = null;
  21041            }
  21042
  21043            initSuspenseListRenderState(workInProgress, false, // isBackwards
  21044            tail, lastContentRow, tailMode);
  21045            break;
  21046          }
  21047
  21048        case 'backwards':
  21049          {
  21050            // We're going to find the first row that has existing content.
  21051            // At the same time we're going to reverse the list of everything
  21052            // we pass in the meantime. That's going to be our tail in reverse
  21053            // order.
  21054            var _tail = null;
  21055            var row = workInProgress.child;
  21056            workInProgress.child = null;
  21057
  21058            while (row !== null) {
  21059              var currentRow = row.alternate; // New rows can't be content rows.
  21060
  21061              if (currentRow !== null && findFirstSuspended(currentRow) === null) {
  21062                // This is the beginning of the main content.
  21063                workInProgress.child = row;
  21064                break;
  21065              }
  21066
  21067              var nextRow = row.sibling;
  21068              row.sibling = _tail;
  21069              _tail = row;
  21070              row = nextRow;
  21071            } // TODO: If workInProgress.child is null, we can continue on the tail immediately.
  21072
  21073
  21074            initSuspenseListRenderState(workInProgress, true, // isBackwards
  21075            _tail, null, // last
  21076            tailMode);
  21077            break;
  21078          }
  21079
  21080        case 'together':
  21081          {
  21082            initSuspenseListRenderState(workInProgress, false, // isBackwards
  21083            null, // tail
  21084            null, // last
  21085            undefined);
  21086            break;
  21087          }
  21088
  21089        default:
  21090          {
  21091            // The default reveal order is the same as not having
  21092            // a boundary.
  21093            workInProgress.memoizedState = null;
  21094          }
  21095      }
  21096    }
  21097
  21098    return workInProgress.child;
  21099  }
  21100
  21101  function updatePortalComponent(current, workInProgress, renderLanes) {
  21102    pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
  21103    var nextChildren = workInProgress.pendingProps;
  21104
  21105    if (current === null) {
  21106      // Portals are special because we don't append the children during mount
  21107      // but at commit. Therefore we need to track insertions which the normal
  21108      // flow doesn't do during mount. This doesn't happen at the root because
  21109      // the root always starts with a "current" with a null child.
  21110      // TODO: Consider unifying this with how the root works.
  21111      workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderLanes);
  21112    } else {
  21113      reconcileChildren(current, workInProgress, nextChildren, renderLanes);
  21114    }
  21115
  21116    return workInProgress.child;
  21117  }
  21118
  21119  var hasWarnedAboutUsingNoValuePropOnContextProvider = false;
  21120
  21121  function updateContextProvider(current, workInProgress, renderLanes) {
  21122    var providerType = workInProgress.type;
  21123    var context = providerType._context;
  21124    var newProps = workInProgress.pendingProps;
  21125    var oldProps = workInProgress.memoizedProps;
  21126    var newValue = newProps.value;
  21127
  21128    {
  21129      if (!('value' in newProps)) {
  21130        if (!hasWarnedAboutUsingNoValuePropOnContextProvider) {
  21131          hasWarnedAboutUsingNoValuePropOnContextProvider = true;
  21132
  21133          error('The `value` prop is required for the `<Context.Provider>`. Did you misspell it or forget to pass it?');
  21134        }
  21135      }
  21136
  21137      var providerPropTypes = workInProgress.type.propTypes;
  21138
  21139      if (providerPropTypes) {
  21140        checkPropTypes(providerPropTypes, newProps, 'prop', 'Context.Provider');
  21141      }
  21142    }
  21143
  21144    pushProvider(workInProgress, context, newValue);
  21145
  21146    {
  21147      if (oldProps !== null) {
  21148        var oldValue = oldProps.value;
  21149
  21150        if (objectIs(oldValue, newValue)) {
  21151          // No change. Bailout early if children are the same.
  21152          if (oldProps.children === newProps.children && !hasContextChanged()) {
  21153            return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  21154          }
  21155        } else {
  21156          // The context value changed. Search for matching consumers and schedule
  21157          // them to update.
  21158          propagateContextChange(workInProgress, context, renderLanes);
  21159        }
  21160      }
  21161    }
  21162
  21163    var newChildren = newProps.children;
  21164    reconcileChildren(current, workInProgress, newChildren, renderLanes);
  21165    return workInProgress.child;
  21166  }
  21167
  21168  var hasWarnedAboutUsingContextAsConsumer = false;
  21169
  21170  function updateContextConsumer(current, workInProgress, renderLanes) {
  21171    var context = workInProgress.type; // The logic below for Context differs depending on PROD or DEV mode. In
  21172    // DEV mode, we create a separate object for Context.Consumer that acts
  21173    // like a proxy to Context. This proxy object adds unnecessary code in PROD
  21174    // so we use the old behaviour (Context.Consumer references Context) to
  21175    // reduce size and overhead. The separate object references context via
  21176    // a property called "_context", which also gives us the ability to check
  21177    // in DEV mode if this property exists or not and warn if it does not.
  21178
  21179    {
  21180      if (context._context === undefined) {
  21181        // This may be because it's a Context (rather than a Consumer).
  21182        // Or it may be because it's older React where they're the same thing.
  21183        // We only want to warn if we're sure it's a new React.
  21184        if (context !== context.Consumer) {
  21185          if (!hasWarnedAboutUsingContextAsConsumer) {
  21186            hasWarnedAboutUsingContextAsConsumer = true;
  21187
  21188            error('Rendering <Context> directly is not supported and will be removed in ' + 'a future major release. Did you mean to render <Context.Consumer> instead?');
  21189          }
  21190        }
  21191      } else {
  21192        context = context._context;
  21193      }
  21194    }
  21195
  21196    var newProps = workInProgress.pendingProps;
  21197    var render = newProps.children;
  21198
  21199    {
  21200      if (typeof render !== 'function') {
  21201        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.');
  21202      }
  21203    }
  21204
  21205    prepareToReadContext(workInProgress, renderLanes);
  21206    var newValue = readContext(context);
  21207
  21208    {
  21209      markComponentRenderStarted(workInProgress);
  21210    }
  21211
  21212    var newChildren;
  21213
  21214    {
  21215      ReactCurrentOwner$1.current = workInProgress;
  21216      setIsRendering(true);
  21217      newChildren = render(newValue);
  21218      setIsRendering(false);
  21219    }
  21220
  21221    {
  21222      markComponentRenderStopped();
  21223    } // React DevTools reads this flag.
  21224
  21225
  21226    workInProgress.flags |= PerformedWork;
  21227    reconcileChildren(current, workInProgress, newChildren, renderLanes);
  21228    return workInProgress.child;
  21229  }
  21230
  21231  function markWorkInProgressReceivedUpdate() {
  21232    didReceiveUpdate = true;
  21233  }
  21234
  21235  function resetSuspendedCurrentOnMountInLegacyMode(current, workInProgress) {
  21236    if ((workInProgress.mode & ConcurrentMode) === NoMode) {
  21237      if (current !== null) {
  21238        // A lazy component only mounts if it suspended inside a non-
  21239        // concurrent tree, in an inconsistent state. We want to treat it like
  21240        // a new mount, even though an empty version of it already committed.
  21241        // Disconnect the alternate pointers.
  21242        current.alternate = null;
  21243        workInProgress.alternate = null; // Since this is conceptually a new fiber, schedule a Placement effect
  21244
  21245        workInProgress.flags |= Placement;
  21246      }
  21247    }
  21248  }
  21249
  21250  function bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes) {
  21251    if (current !== null) {
  21252      // Reuse previous dependencies
  21253      workInProgress.dependencies = current.dependencies;
  21254    }
  21255
  21256    {
  21257      // Don't update "base" render times for bailouts.
  21258      stopProfilerTimerIfRunning();
  21259    }
  21260
  21261    markSkippedUpdateLanes(workInProgress.lanes); // Check if the children have any pending work.
  21262
  21263    if (!includesSomeLane(renderLanes, workInProgress.childLanes)) {
  21264      // The children don't have any work either. We can skip them.
  21265      // TODO: Once we add back resuming, we should check if the children are
  21266      // a work-in-progress set. If so, we need to transfer their effects.
  21267      {
  21268        return null;
  21269      }
  21270    } // This fiber doesn't have work, but its subtree does. Clone the child
  21271    // fibers and continue.
  21272
  21273
  21274    cloneChildFibers(current, workInProgress);
  21275    return workInProgress.child;
  21276  }
  21277
  21278  function remountFiber(current, oldWorkInProgress, newWorkInProgress) {
  21279    {
  21280      var returnFiber = oldWorkInProgress.return;
  21281
  21282      if (returnFiber === null) {
  21283        // eslint-disable-next-line react-internal/prod-error-codes
  21284        throw new Error('Cannot swap the root fiber.');
  21285      } // Disconnect from the old current.
  21286      // It will get deleted.
  21287
  21288
  21289      current.alternate = null;
  21290      oldWorkInProgress.alternate = null; // Connect to the new tree.
  21291
  21292      newWorkInProgress.index = oldWorkInProgress.index;
  21293      newWorkInProgress.sibling = oldWorkInProgress.sibling;
  21294      newWorkInProgress.return = oldWorkInProgress.return;
  21295      newWorkInProgress.ref = oldWorkInProgress.ref; // Replace the child/sibling pointers above it.
  21296
  21297      if (oldWorkInProgress === returnFiber.child) {
  21298        returnFiber.child = newWorkInProgress;
  21299      } else {
  21300        var prevSibling = returnFiber.child;
  21301
  21302        if (prevSibling === null) {
  21303          // eslint-disable-next-line react-internal/prod-error-codes
  21304          throw new Error('Expected parent to have a child.');
  21305        }
  21306
  21307        while (prevSibling.sibling !== oldWorkInProgress) {
  21308          prevSibling = prevSibling.sibling;
  21309
  21310          if (prevSibling === null) {
  21311            // eslint-disable-next-line react-internal/prod-error-codes
  21312            throw new Error('Expected to find the previous sibling.');
  21313          }
  21314        }
  21315
  21316        prevSibling.sibling = newWorkInProgress;
  21317      } // Delete the old fiber and place the new one.
  21318      // Since the old fiber is disconnected, we have to schedule it manually.
  21319
  21320
  21321      var deletions = returnFiber.deletions;
  21322
  21323      if (deletions === null) {
  21324        returnFiber.deletions = [current];
  21325        returnFiber.flags |= ChildDeletion;
  21326      } else {
  21327        deletions.push(current);
  21328      }
  21329
  21330      newWorkInProgress.flags |= Placement; // Restart work from the new fiber.
  21331
  21332      return newWorkInProgress;
  21333    }
  21334  }
  21335
  21336  function checkScheduledUpdateOrContext(current, renderLanes) {
  21337    // Before performing an early bailout, we must check if there are pending
  21338    // updates or context.
  21339    var updateLanes = current.lanes;
  21340
  21341    if (includesSomeLane(updateLanes, renderLanes)) {
  21342      return true;
  21343    } // No pending update, but because context is propagated lazily, we need
  21344
  21345    return false;
  21346  }
  21347
  21348  function attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes) {
  21349    // This fiber does not have any pending work. Bailout without entering
  21350    // the begin phase. There's still some bookkeeping we that needs to be done
  21351    // in this optimized path, mostly pushing stuff onto the stack.
  21352    switch (workInProgress.tag) {
  21353      case HostRoot:
  21354        pushHostRootContext(workInProgress);
  21355        var root = workInProgress.stateNode;
  21356
  21357        resetHydrationState();
  21358        break;
  21359
  21360      case HostComponent:
  21361        pushHostContext(workInProgress);
  21362        break;
  21363
  21364      case ClassComponent:
  21365        {
  21366          var Component = workInProgress.type;
  21367
  21368          if (isContextProvider(Component)) {
  21369            pushContextProvider(workInProgress);
  21370          }
  21371
  21372          break;
  21373        }
  21374
  21375      case HostPortal:
  21376        pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);
  21377        break;
  21378
  21379      case ContextProvider:
  21380        {
  21381          var newValue = workInProgress.memoizedProps.value;
  21382          var context = workInProgress.type._context;
  21383          pushProvider(workInProgress, context, newValue);
  21384          break;
  21385        }
  21386
  21387      case Profiler:
  21388        {
  21389          // Profiler should only call onRender when one of its descendants actually rendered.
  21390          var hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
  21391
  21392          if (hasChildWork) {
  21393            workInProgress.flags |= Update;
  21394          }
  21395
  21396          {
  21397            // Reset effect durations for the next eventual effect phase.
  21398            // These are reset during render to allow the DevTools commit hook a chance to read them,
  21399            var stateNode = workInProgress.stateNode;
  21400            stateNode.effectDuration = 0;
  21401            stateNode.passiveEffectDuration = 0;
  21402          }
  21403        }
  21404
  21405        break;
  21406
  21407      case SuspenseComponent:
  21408        {
  21409          var state = workInProgress.memoizedState;
  21410
  21411          if (state !== null) {
  21412            if (state.dehydrated !== null) {
  21413              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // We know that this component will suspend again because if it has
  21414              // been unsuspended it has committed as a resolved Suspense component.
  21415              // If it needs to be retried, it should have work scheduled on it.
  21416
  21417              workInProgress.flags |= DidCapture; // We should never render the children of a dehydrated boundary until we
  21418              // upgrade it. We return null instead of bailoutOnAlreadyFinishedWork.
  21419
  21420              return null;
  21421            } // If this boundary is currently timed out, we need to decide
  21422            // whether to retry the primary children, or to skip over it and
  21423            // go straight to the fallback. Check the priority of the primary
  21424            // child fragment.
  21425
  21426
  21427            var primaryChildFragment = workInProgress.child;
  21428            var primaryChildLanes = primaryChildFragment.childLanes;
  21429
  21430            if (includesSomeLane(renderLanes, primaryChildLanes)) {
  21431              // The primary children have pending work. Use the normal path
  21432              // to attempt to render the primary children again.
  21433              return updateSuspenseComponent(current, workInProgress, renderLanes);
  21434            } else {
  21435              // The primary child fragment does not have pending work marked
  21436              // on it
  21437              pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current)); // The primary children do not have pending work with sufficient
  21438              // priority. Bailout.
  21439
  21440              var child = bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  21441
  21442              if (child !== null) {
  21443                // The fallback children have pending work. Skip over the
  21444                // primary children and work on the fallback.
  21445                return child.sibling;
  21446              } else {
  21447                // Note: We can return `null` here because we already checked
  21448                // whether there were nested context consumers, via the call to
  21449                // `bailoutOnAlreadyFinishedWork` above.
  21450                return null;
  21451              }
  21452            }
  21453          } else {
  21454            pushSuspenseContext(workInProgress, setDefaultShallowSuspenseContext(suspenseStackCursor.current));
  21455          }
  21456
  21457          break;
  21458        }
  21459
  21460      case SuspenseListComponent:
  21461        {
  21462          var didSuspendBefore = (current.flags & DidCapture) !== NoFlags;
  21463
  21464          var _hasChildWork = includesSomeLane(renderLanes, workInProgress.childLanes);
  21465
  21466          if (didSuspendBefore) {
  21467            if (_hasChildWork) {
  21468              // If something was in fallback state last time, and we have all the
  21469              // same children then we're still in progressive loading state.
  21470              // Something might get unblocked by state updates or retries in the
  21471              // tree which will affect the tail. So we need to use the normal
  21472              // path to compute the correct tail.
  21473              return updateSuspenseListComponent(current, workInProgress, renderLanes);
  21474            } // If none of the children had any work, that means that none of
  21475            // them got retried so they'll still be blocked in the same way
  21476            // as before. We can fast bail out.
  21477
  21478
  21479            workInProgress.flags |= DidCapture;
  21480          } // If nothing suspended before and we're rendering the same children,
  21481          // then the tail doesn't matter. Anything new that suspends will work
  21482          // in the "together" mode, so we can continue from the state we had.
  21483
  21484
  21485          var renderState = workInProgress.memoizedState;
  21486
  21487          if (renderState !== null) {
  21488            // Reset to the "together" mode in case we've started a different
  21489            // update in the past but didn't complete it.
  21490            renderState.rendering = null;
  21491            renderState.tail = null;
  21492            renderState.lastEffect = null;
  21493          }
  21494
  21495          pushSuspenseContext(workInProgress, suspenseStackCursor.current);
  21496
  21497          if (_hasChildWork) {
  21498            break;
  21499          } else {
  21500            // If none of the children had any work, that means that none of
  21501            // them got retried so they'll still be blocked in the same way
  21502            // as before. We can fast bail out.
  21503            return null;
  21504          }
  21505        }
  21506
  21507      case OffscreenComponent:
  21508      case LegacyHiddenComponent:
  21509        {
  21510          // Need to check if the tree still needs to be deferred. This is
  21511          // almost identical to the logic used in the normal update path,
  21512          // so we'll just enter that. The only difference is we'll bail out
  21513          // at the next level instead of this one, because the child props
  21514          // have not changed. Which is fine.
  21515          // TODO: Probably should refactor `beginWork` to split the bailout
  21516          // path from the normal path. I'm tempted to do a labeled break here
  21517          // but I won't :)
  21518          workInProgress.lanes = NoLanes;
  21519          return updateOffscreenComponent(current, workInProgress, renderLanes);
  21520        }
  21521    }
  21522
  21523    return bailoutOnAlreadyFinishedWork(current, workInProgress, renderLanes);
  21524  }
  21525
  21526  function beginWork(current, workInProgress, renderLanes) {
  21527    {
  21528      if (workInProgress._debugNeedsRemount && current !== null) {
  21529        // This will restart the begin phase with a new fiber.
  21530        return remountFiber(current, workInProgress, createFiberFromTypeAndProps(workInProgress.type, workInProgress.key, workInProgress.pendingProps, workInProgress._debugOwner || null, workInProgress.mode, workInProgress.lanes));
  21531      }
  21532    }
  21533
  21534    if (current !== null) {
  21535      var oldProps = current.memoizedProps;
  21536      var newProps = workInProgress.pendingProps;
  21537
  21538      if (oldProps !== newProps || hasContextChanged() || ( // Force a re-render if the implementation changed due to hot reload:
  21539       workInProgress.type !== current.type )) {
  21540        // If props or context changed, mark the fiber as having performed work.
  21541        // This may be unset if the props are determined to be equal later (memo).
  21542        didReceiveUpdate = true;
  21543      } else {
  21544        // Neither props nor legacy context changes. Check if there's a pending
  21545        // update or context change.
  21546        var hasScheduledUpdateOrContext = checkScheduledUpdateOrContext(current, renderLanes);
  21547
  21548        if (!hasScheduledUpdateOrContext && // If this is the second pass of an error or suspense boundary, there
  21549        // may not be work scheduled on `current`, so we check for this flag.
  21550        (workInProgress.flags & DidCapture) === NoFlags) {
  21551          // No pending updates or context. Bail out now.
  21552          didReceiveUpdate = false;
  21553          return attemptEarlyBailoutIfNoScheduledUpdate(current, workInProgress, renderLanes);
  21554        }
  21555
  21556        if ((current.flags & ForceUpdateForLegacySuspense) !== NoFlags) {
  21557          // This is a special case that only exists for legacy mode.
  21558          // See https://github.com/facebook/react/pull/19216.
  21559          didReceiveUpdate = true;
  21560        } else {
  21561          // An update was scheduled on this fiber, but there are no new props
  21562          // nor legacy context. Set this to false. If an update queue or context
  21563          // consumer produces a changed value, it will set this to true. Otherwise,
  21564          // the component will assume the children have not changed and bail out.
  21565          didReceiveUpdate = false;
  21566        }
  21567      }
  21568    } else {
  21569      didReceiveUpdate = false;
  21570
  21571      if (getIsHydrating() && isForkedChild(workInProgress)) {
  21572        // Check if this child belongs to a list of muliple children in
  21573        // its parent.
  21574        //
  21575        // In a true multi-threaded implementation, we would render children on
  21576        // parallel threads. This would represent the beginning of a new render
  21577        // thread for this subtree.
  21578        //
  21579        // We only use this for id generation during hydration, which is why the
  21580        // logic is located in this special branch.
  21581        var slotIndex = workInProgress.index;
  21582        var numberOfForks = getForksAtLevel();
  21583        pushTreeId(workInProgress, numberOfForks, slotIndex);
  21584      }
  21585    } // Before entering the begin phase, clear pending update priority.
  21586    // TODO: This assumes that we're about to evaluate the component and process
  21587    // the update queue. However, there's an exception: SimpleMemoComponent
  21588    // sometimes bails out later in the begin phase. This indicates that we should
  21589    // move this assignment out of the common path and into each branch.
  21590
  21591
  21592    workInProgress.lanes = NoLanes;
  21593
  21594    switch (workInProgress.tag) {
  21595      case IndeterminateComponent:
  21596        {
  21597          return mountIndeterminateComponent(current, workInProgress, workInProgress.type, renderLanes);
  21598        }
  21599
  21600      case LazyComponent:
  21601        {
  21602          var elementType = workInProgress.elementType;
  21603          return mountLazyComponent(current, workInProgress, elementType, renderLanes);
  21604        }
  21605
  21606      case FunctionComponent:
  21607        {
  21608          var Component = workInProgress.type;
  21609          var unresolvedProps = workInProgress.pendingProps;
  21610          var resolvedProps = workInProgress.elementType === Component ? unresolvedProps : resolveDefaultProps(Component, unresolvedProps);
  21611          return updateFunctionComponent(current, workInProgress, Component, resolvedProps, renderLanes);
  21612        }
  21613
  21614      case ClassComponent:
  21615        {
  21616          var _Component = workInProgress.type;
  21617          var _unresolvedProps = workInProgress.pendingProps;
  21618
  21619          var _resolvedProps = workInProgress.elementType === _Component ? _unresolvedProps : resolveDefaultProps(_Component, _unresolvedProps);
  21620
  21621          return updateClassComponent(current, workInProgress, _Component, _resolvedProps, renderLanes);
  21622        }
  21623
  21624      case HostRoot:
  21625        return updateHostRoot(current, workInProgress, renderLanes);
  21626
  21627      case HostComponent:
  21628        return updateHostComponent(current, workInProgress, renderLanes);
  21629
  21630      case HostText:
  21631        return updateHostText(current, workInProgress);
  21632
  21633      case SuspenseComponent:
  21634        return updateSuspenseComponent(current, workInProgress, renderLanes);
  21635
  21636      case HostPortal:
  21637        return updatePortalComponent(current, workInProgress, renderLanes);
  21638
  21639      case ForwardRef:
  21640        {
  21641          var type = workInProgress.type;
  21642          var _unresolvedProps2 = workInProgress.pendingProps;
  21643
  21644          var _resolvedProps2 = workInProgress.elementType === type ? _unresolvedProps2 : resolveDefaultProps(type, _unresolvedProps2);
  21645
  21646          return updateForwardRef(current, workInProgress, type, _resolvedProps2, renderLanes);
  21647        }
  21648
  21649      case Fragment:
  21650        return updateFragment(current, workInProgress, renderLanes);
  21651
  21652      case Mode:
  21653        return updateMode(current, workInProgress, renderLanes);
  21654
  21655      case Profiler:
  21656        return updateProfiler(current, workInProgress, renderLanes);
  21657
  21658      case ContextProvider:
  21659        return updateContextProvider(current, workInProgress, renderLanes);
  21660
  21661      case ContextConsumer:
  21662        return updateContextConsumer(current, workInProgress, renderLanes);
  21663
  21664      case MemoComponent:
  21665        {
  21666          var _type2 = workInProgress.type;
  21667          var _unresolvedProps3 = workInProgress.pendingProps; // Resolve outer props first, then resolve inner props.
  21668
  21669          var _resolvedProps3 = resolveDefaultProps(_type2, _unresolvedProps3);
  21670
  21671          {
  21672            if (workInProgress.type !== workInProgress.elementType) {
  21673              var outerPropTypes = _type2.propTypes;
  21674
  21675              if (outerPropTypes) {
  21676                checkPropTypes(outerPropTypes, _resolvedProps3, // Resolved for outer only
  21677                'prop', getComponentNameFromType(_type2));
  21678              }
  21679            }
  21680          }
  21681
  21682          _resolvedProps3 = resolveDefaultProps(_type2.type, _resolvedProps3);
  21683          return updateMemoComponent(current, workInProgress, _type2, _resolvedProps3, renderLanes);
  21684        }
  21685
  21686      case SimpleMemoComponent:
  21687        {
  21688          return updateSimpleMemoComponent(current, workInProgress, workInProgress.type, workInProgress.pendingProps, renderLanes);
  21689        }
  21690
  21691      case IncompleteClassComponent:
  21692        {
  21693          var _Component2 = workInProgress.type;
  21694          var _unresolvedProps4 = workInProgress.pendingProps;
  21695
  21696          var _resolvedProps4 = workInProgress.elementType === _Component2 ? _unresolvedProps4 : resolveDefaultProps(_Component2, _unresolvedProps4);
  21697
  21698          return mountIncompleteClassComponent(current, workInProgress, _Component2, _resolvedProps4, renderLanes);
  21699        }
  21700
  21701      case SuspenseListComponent:
  21702        {
  21703          return updateSuspenseListComponent(current, workInProgress, renderLanes);
  21704        }
  21705
  21706      case ScopeComponent:
  21707        {
  21708
  21709          break;
  21710        }
  21711
  21712      case OffscreenComponent:
  21713        {
  21714          return updateOffscreenComponent(current, workInProgress, renderLanes);
  21715        }
  21716    }
  21717
  21718    throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
  21719  }
  21720
  21721  function markUpdate(workInProgress) {
  21722    // Tag the fiber with an update effect. This turns a Placement into
  21723    // a PlacementAndUpdate.
  21724    workInProgress.flags |= Update;
  21725  }
  21726
  21727  function markRef$1(workInProgress) {
  21728    workInProgress.flags |= Ref;
  21729
  21730    {
  21731      workInProgress.flags |= RefStatic;
  21732    }
  21733  }
  21734
  21735  var appendAllChildren;
  21736  var updateHostContainer;
  21737  var updateHostComponent$1;
  21738  var updateHostText$1;
  21739
  21740  {
  21741    // Mutation mode
  21742    appendAllChildren = function (parent, workInProgress, needsVisibilityToggle, isHidden) {
  21743      // We only have the top Fiber that was created but we need recurse down its
  21744      // children to find all the terminal nodes.
  21745      var node = workInProgress.child;
  21746
  21747      while (node !== null) {
  21748        if (node.tag === HostComponent || node.tag === HostText) {
  21749          appendInitialChild(parent, node.stateNode);
  21750        } else if (node.tag === HostPortal) ; else if (node.child !== null) {
  21751          node.child.return = node;
  21752          node = node.child;
  21753          continue;
  21754        }
  21755
  21756        if (node === workInProgress) {
  21757          return;
  21758        }
  21759
  21760        while (node.sibling === null) {
  21761          if (node.return === null || node.return === workInProgress) {
  21762            return;
  21763          }
  21764
  21765          node = node.return;
  21766        }
  21767
  21768        node.sibling.return = node.return;
  21769        node = node.sibling;
  21770      }
  21771    };
  21772
  21773    updateHostContainer = function (current, workInProgress) {// Noop
  21774    };
  21775
  21776    updateHostComponent$1 = function (current, workInProgress, type, newProps, rootContainerInstance) {
  21777      // If we have an alternate, that means this is an update and we need to
  21778      // schedule a side-effect to do the updates.
  21779      var oldProps = current.memoizedProps;
  21780
  21781      if (oldProps === newProps) {
  21782        // In mutation mode, this is sufficient for a bailout because
  21783        // we won't touch this node even if children changed.
  21784        return;
  21785      } // If we get updated because one of our children updated, we don't
  21786      // have newProps so we'll have to reuse them.
  21787      // TODO: Split the update API as separate for the props vs. children.
  21788      // Even better would be if children weren't special cased at all tho.
  21789
  21790
  21791      var instance = workInProgress.stateNode;
  21792      var currentHostContext = getHostContext(); // TODO: Experiencing an error where oldProps is null. Suggests a host
  21793      // component is hitting the resume path. Figure out why. Possibly
  21794      // related to `hidden`.
  21795
  21796      var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext); // TODO: Type this specific to this type of component.
  21797
  21798      workInProgress.updateQueue = updatePayload; // If the update payload indicates that there is a change or if there
  21799      // is a new ref we mark this as an update. All the work is done in commitWork.
  21800
  21801      if (updatePayload) {
  21802        markUpdate(workInProgress);
  21803      }
  21804    };
  21805
  21806    updateHostText$1 = function (current, workInProgress, oldText, newText) {
  21807      // If the text differs, mark it as an update. All the work in done in commitWork.
  21808      if (oldText !== newText) {
  21809        markUpdate(workInProgress);
  21810      }
  21811    };
  21812  }
  21813
  21814  function cutOffTailIfNeeded(renderState, hasRenderedATailFallback) {
  21815    if (getIsHydrating()) {
  21816      // If we're hydrating, we should consume as many items as we can
  21817      // so we don't leave any behind.
  21818      return;
  21819    }
  21820
  21821    switch (renderState.tailMode) {
  21822      case 'hidden':
  21823        {
  21824          // Any insertions at the end of the tail list after this point
  21825          // should be invisible. If there are already mounted boundaries
  21826          // anything before them are not considered for collapsing.
  21827          // Therefore we need to go through the whole tail to find if
  21828          // there are any.
  21829          var tailNode = renderState.tail;
  21830          var lastTailNode = null;
  21831
  21832          while (tailNode !== null) {
  21833            if (tailNode.alternate !== null) {
  21834              lastTailNode = tailNode;
  21835            }
  21836
  21837            tailNode = tailNode.sibling;
  21838          } // Next we're simply going to delete all insertions after the
  21839          // last rendered item.
  21840
  21841
  21842          if (lastTailNode === null) {
  21843            // All remaining items in the tail are insertions.
  21844            renderState.tail = null;
  21845          } else {
  21846            // Detach the insertion after the last node that was already
  21847            // inserted.
  21848            lastTailNode.sibling = null;
  21849          }
  21850
  21851          break;
  21852        }
  21853
  21854      case 'collapsed':
  21855        {
  21856          // Any insertions at the end of the tail list after this point
  21857          // should be invisible. If there are already mounted boundaries
  21858          // anything before them are not considered for collapsing.
  21859          // Therefore we need to go through the whole tail to find if
  21860          // there are any.
  21861          var _tailNode = renderState.tail;
  21862          var _lastTailNode = null;
  21863
  21864          while (_tailNode !== null) {
  21865            if (_tailNode.alternate !== null) {
  21866              _lastTailNode = _tailNode;
  21867            }
  21868
  21869            _tailNode = _tailNode.sibling;
  21870          } // Next we're simply going to delete all insertions after the
  21871          // last rendered item.
  21872
  21873
  21874          if (_lastTailNode === null) {
  21875            // All remaining items in the tail are insertions.
  21876            if (!hasRenderedATailFallback && renderState.tail !== null) {
  21877              // We suspended during the head. We want to show at least one
  21878              // row at the tail. So we'll keep on and cut off the rest.
  21879              renderState.tail.sibling = null;
  21880            } else {
  21881              renderState.tail = null;
  21882            }
  21883          } else {
  21884            // Detach the insertion after the last node that was already
  21885            // inserted.
  21886            _lastTailNode.sibling = null;
  21887          }
  21888
  21889          break;
  21890        }
  21891    }
  21892  }
  21893
  21894  function bubbleProperties(completedWork) {
  21895    var didBailout = completedWork.alternate !== null && completedWork.alternate.child === completedWork.child;
  21896    var newChildLanes = NoLanes;
  21897    var subtreeFlags = NoFlags;
  21898
  21899    if (!didBailout) {
  21900      // Bubble up the earliest expiration time.
  21901      if ( (completedWork.mode & ProfileMode) !== NoMode) {
  21902        // In profiling mode, resetChildExpirationTime is also used to reset
  21903        // profiler durations.
  21904        var actualDuration = completedWork.actualDuration;
  21905        var treeBaseDuration = completedWork.selfBaseDuration;
  21906        var child = completedWork.child;
  21907
  21908        while (child !== null) {
  21909          newChildLanes = mergeLanes(newChildLanes, mergeLanes(child.lanes, child.childLanes));
  21910          subtreeFlags |= child.subtreeFlags;
  21911          subtreeFlags |= child.flags; // When a fiber is cloned, its actualDuration is reset to 0. This value will
  21912          // only be updated if work is done on the fiber (i.e. it doesn't bailout).
  21913          // When work is done, it should bubble to the parent's actualDuration. If
  21914          // the fiber has not been cloned though, (meaning no work was done), then
  21915          // this value will reflect the amount of time spent working on a previous
  21916          // render. In that case it should not bubble. We determine whether it was
  21917          // cloned by comparing the child pointer.
  21918
  21919          actualDuration += child.actualDuration;
  21920          treeBaseDuration += child.treeBaseDuration;
  21921          child = child.sibling;
  21922        }
  21923
  21924        completedWork.actualDuration = actualDuration;
  21925        completedWork.treeBaseDuration = treeBaseDuration;
  21926      } else {
  21927        var _child = completedWork.child;
  21928
  21929        while (_child !== null) {
  21930          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child.lanes, _child.childLanes));
  21931          subtreeFlags |= _child.subtreeFlags;
  21932          subtreeFlags |= _child.flags; // Update the return pointer so the tree is consistent. This is a code
  21933          // smell because it assumes the commit phase is never concurrent with
  21934          // the render phase. Will address during refactor to alternate model.
  21935
  21936          _child.return = completedWork;
  21937          _child = _child.sibling;
  21938        }
  21939      }
  21940
  21941      completedWork.subtreeFlags |= subtreeFlags;
  21942    } else {
  21943      // Bubble up the earliest expiration time.
  21944      if ( (completedWork.mode & ProfileMode) !== NoMode) {
  21945        // In profiling mode, resetChildExpirationTime is also used to reset
  21946        // profiler durations.
  21947        var _treeBaseDuration = completedWork.selfBaseDuration;
  21948        var _child2 = completedWork.child;
  21949
  21950        while (_child2 !== null) {
  21951          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child2.lanes, _child2.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
  21952          // so we should bubble those up even during a bailout. All the other
  21953          // flags have a lifetime only of a single render + commit, so we should
  21954          // ignore them.
  21955
  21956          subtreeFlags |= _child2.subtreeFlags & StaticMask;
  21957          subtreeFlags |= _child2.flags & StaticMask;
  21958          _treeBaseDuration += _child2.treeBaseDuration;
  21959          _child2 = _child2.sibling;
  21960        }
  21961
  21962        completedWork.treeBaseDuration = _treeBaseDuration;
  21963      } else {
  21964        var _child3 = completedWork.child;
  21965
  21966        while (_child3 !== null) {
  21967          newChildLanes = mergeLanes(newChildLanes, mergeLanes(_child3.lanes, _child3.childLanes)); // "Static" flags share the lifetime of the fiber/hook they belong to,
  21968          // so we should bubble those up even during a bailout. All the other
  21969          // flags have a lifetime only of a single render + commit, so we should
  21970          // ignore them.
  21971
  21972          subtreeFlags |= _child3.subtreeFlags & StaticMask;
  21973          subtreeFlags |= _child3.flags & StaticMask; // Update the return pointer so the tree is consistent. This is a code
  21974          // smell because it assumes the commit phase is never concurrent with
  21975          // the render phase. Will address during refactor to alternate model.
  21976
  21977          _child3.return = completedWork;
  21978          _child3 = _child3.sibling;
  21979        }
  21980      }
  21981
  21982      completedWork.subtreeFlags |= subtreeFlags;
  21983    }
  21984
  21985    completedWork.childLanes = newChildLanes;
  21986    return didBailout;
  21987  }
  21988
  21989  function completeDehydratedSuspenseBoundary(current, workInProgress, nextState) {
  21990    if (hasUnhydratedTailNodes() && (workInProgress.mode & ConcurrentMode) !== NoMode && (workInProgress.flags & DidCapture) === NoFlags) {
  21991      warnIfUnhydratedTailNodes(workInProgress);
  21992      resetHydrationState();
  21993      workInProgress.flags |= ForceClientRender | Incomplete | ShouldCapture;
  21994      return false;
  21995    }
  21996
  21997    var wasHydrated = popHydrationState(workInProgress);
  21998
  21999    if (nextState !== null && nextState.dehydrated !== null) {
  22000      // We might be inside a hydration state the first time we're picking up this
  22001      // Suspense boundary, and also after we've reentered it for further hydration.
  22002      if (current === null) {
  22003        if (!wasHydrated) {
  22004          throw new Error('A dehydrated suspense component was completed without a hydrated node. ' + 'This is probably a bug in React.');
  22005        }
  22006
  22007        prepareToHydrateHostSuspenseInstance(workInProgress);
  22008        bubbleProperties(workInProgress);
  22009
  22010        {
  22011          if ((workInProgress.mode & ProfileMode) !== NoMode) {
  22012            var isTimedOutSuspense = nextState !== null;
  22013
  22014            if (isTimedOutSuspense) {
  22015              // Don't count time spent in a timed out Suspense subtree as part of the base duration.
  22016              var primaryChildFragment = workInProgress.child;
  22017
  22018              if (primaryChildFragment !== null) {
  22019                // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
  22020                workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
  22021              }
  22022            }
  22023          }
  22024        }
  22025
  22026        return false;
  22027      } else {
  22028        // We might have reentered this boundary to hydrate it. If so, we need to reset the hydration
  22029        // state since we're now exiting out of it. popHydrationState doesn't do that for us.
  22030        resetHydrationState();
  22031
  22032        if ((workInProgress.flags & DidCapture) === NoFlags) {
  22033          // This boundary did not suspend so it's now hydrated and unsuspended.
  22034          workInProgress.memoizedState = null;
  22035        } // If nothing suspended, we need to schedule an effect to mark this boundary
  22036        // as having hydrated so events know that they're free to be invoked.
  22037        // It's also a signal to replay events and the suspense callback.
  22038        // If something suspended, schedule an effect to attach retry listeners.
  22039        // So we might as well always mark this.
  22040
  22041
  22042        workInProgress.flags |= Update;
  22043        bubbleProperties(workInProgress);
  22044
  22045        {
  22046          if ((workInProgress.mode & ProfileMode) !== NoMode) {
  22047            var _isTimedOutSuspense = nextState !== null;
  22048
  22049            if (_isTimedOutSuspense) {
  22050              // Don't count time spent in a timed out Suspense subtree as part of the base duration.
  22051              var _primaryChildFragment = workInProgress.child;
  22052
  22053              if (_primaryChildFragment !== null) {
  22054                // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
  22055                workInProgress.treeBaseDuration -= _primaryChildFragment.treeBaseDuration;
  22056              }
  22057            }
  22058          }
  22059        }
  22060
  22061        return false;
  22062      }
  22063    } else {
  22064      // Successfully completed this tree. If this was a forced client render,
  22065      // there may have been recoverable errors during first hydration
  22066      // attempt. If so, add them to a queue so we can log them in the
  22067      // commit phase.
  22068      upgradeHydrationErrorsToRecoverable(); // Fall through to normal Suspense path
  22069
  22070      return true;
  22071    }
  22072  }
  22073
  22074  function completeWork(current, workInProgress, renderLanes) {
  22075    var newProps = workInProgress.pendingProps; // Note: This intentionally doesn't check if we're hydrating because comparing
  22076    // to the current tree provider fiber is just as fast and less error-prone.
  22077    // Ideally we would have a special version of the work loop only
  22078    // for hydration.
  22079
  22080    popTreeContext(workInProgress);
  22081
  22082    switch (workInProgress.tag) {
  22083      case IndeterminateComponent:
  22084      case LazyComponent:
  22085      case SimpleMemoComponent:
  22086      case FunctionComponent:
  22087      case ForwardRef:
  22088      case Fragment:
  22089      case Mode:
  22090      case Profiler:
  22091      case ContextConsumer:
  22092      case MemoComponent:
  22093        bubbleProperties(workInProgress);
  22094        return null;
  22095
  22096      case ClassComponent:
  22097        {
  22098          var Component = workInProgress.type;
  22099
  22100          if (isContextProvider(Component)) {
  22101            popContext(workInProgress);
  22102          }
  22103
  22104          bubbleProperties(workInProgress);
  22105          return null;
  22106        }
  22107
  22108      case HostRoot:
  22109        {
  22110          var fiberRoot = workInProgress.stateNode;
  22111          popHostContainer(workInProgress);
  22112          popTopLevelContextObject(workInProgress);
  22113          resetWorkInProgressVersions();
  22114
  22115          if (fiberRoot.pendingContext) {
  22116            fiberRoot.context = fiberRoot.pendingContext;
  22117            fiberRoot.pendingContext = null;
  22118          }
  22119
  22120          if (current === null || current.child === null) {
  22121            // If we hydrated, pop so that we can delete any remaining children
  22122            // that weren't hydrated.
  22123            var wasHydrated = popHydrationState(workInProgress);
  22124
  22125            if (wasHydrated) {
  22126              // If we hydrated, then we'll need to schedule an update for
  22127              // the commit side-effects on the root.
  22128              markUpdate(workInProgress);
  22129            } else {
  22130              if (current !== null) {
  22131                var prevState = current.memoizedState;
  22132
  22133                if ( // Check if this is a client root
  22134                !prevState.isDehydrated || // Check if we reverted to client rendering (e.g. due to an error)
  22135                (workInProgress.flags & ForceClientRender) !== NoFlags) {
  22136                  // Schedule an effect to clear this container at the start of the
  22137                  // next commit. This handles the case of React rendering into a
  22138                  // container with previous children. It's also safe to do for
  22139                  // updates too, because current.child would only be null if the
  22140                  // previous render was null (so the container would already
  22141                  // be empty).
  22142                  workInProgress.flags |= Snapshot; // If this was a forced client render, there may have been
  22143                  // recoverable errors during first hydration attempt. If so, add
  22144                  // them to a queue so we can log them in the commit phase.
  22145
  22146                  upgradeHydrationErrorsToRecoverable();
  22147                }
  22148              }
  22149            }
  22150          }
  22151
  22152          updateHostContainer(current, workInProgress);
  22153          bubbleProperties(workInProgress);
  22154
  22155          return null;
  22156        }
  22157
  22158      case HostComponent:
  22159        {
  22160          popHostContext(workInProgress);
  22161          var rootContainerInstance = getRootHostContainer();
  22162          var type = workInProgress.type;
  22163
  22164          if (current !== null && workInProgress.stateNode != null) {
  22165            updateHostComponent$1(current, workInProgress, type, newProps, rootContainerInstance);
  22166
  22167            if (current.ref !== workInProgress.ref) {
  22168              markRef$1(workInProgress);
  22169            }
  22170          } else {
  22171            if (!newProps) {
  22172              if (workInProgress.stateNode === null) {
  22173                throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
  22174              } // This can happen when we abort work.
  22175
  22176
  22177              bubbleProperties(workInProgress);
  22178              return null;
  22179            }
  22180
  22181            var currentHostContext = getHostContext(); // TODO: Move createInstance to beginWork and keep it on a context
  22182            // "stack" as the parent. Then append children as we go in beginWork
  22183            // or completeWork depending on whether we want to add them top->down or
  22184            // bottom->up. Top->down is faster in IE11.
  22185
  22186            var _wasHydrated = popHydrationState(workInProgress);
  22187
  22188            if (_wasHydrated) {
  22189              // TODO: Move this and createInstance step into the beginPhase
  22190              // to consolidate.
  22191              if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, currentHostContext)) {
  22192                // If changes to the hydrated node need to be applied at the
  22193                // commit-phase we mark this as such.
  22194                markUpdate(workInProgress);
  22195              }
  22196            } else {
  22197              var instance = createInstance(type, newProps, rootContainerInstance, currentHostContext, workInProgress);
  22198              appendAllChildren(instance, workInProgress, false, false);
  22199              workInProgress.stateNode = instance; // Certain renderers require commit-time effects for initial mount.
  22200              // (eg DOM renderer supports auto-focus for certain elements).
  22201              // Make sure such renderers get scheduled for later work.
  22202
  22203              if (finalizeInitialChildren(instance, type, newProps, rootContainerInstance)) {
  22204                markUpdate(workInProgress);
  22205              }
  22206            }
  22207
  22208            if (workInProgress.ref !== null) {
  22209              // If there is a ref on a host node we need to schedule a callback
  22210              markRef$1(workInProgress);
  22211            }
  22212          }
  22213
  22214          bubbleProperties(workInProgress);
  22215          return null;
  22216        }
  22217
  22218      case HostText:
  22219        {
  22220          var newText = newProps;
  22221
  22222          if (current && workInProgress.stateNode != null) {
  22223            var oldText = current.memoizedProps; // If we have an alternate, that means this is an update and we need
  22224            // to schedule a side-effect to do the updates.
  22225
  22226            updateHostText$1(current, workInProgress, oldText, newText);
  22227          } else {
  22228            if (typeof newText !== 'string') {
  22229              if (workInProgress.stateNode === null) {
  22230                throw new Error('We must have new props for new mounts. This error is likely ' + 'caused by a bug in React. Please file an issue.');
  22231              } // This can happen when we abort work.
  22232
  22233            }
  22234
  22235            var _rootContainerInstance = getRootHostContainer();
  22236
  22237            var _currentHostContext = getHostContext();
  22238
  22239            var _wasHydrated2 = popHydrationState(workInProgress);
  22240
  22241            if (_wasHydrated2) {
  22242              if (prepareToHydrateHostTextInstance(workInProgress)) {
  22243                markUpdate(workInProgress);
  22244              }
  22245            } else {
  22246              workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext, workInProgress);
  22247            }
  22248          }
  22249
  22250          bubbleProperties(workInProgress);
  22251          return null;
  22252        }
  22253
  22254      case SuspenseComponent:
  22255        {
  22256          popSuspenseContext(workInProgress);
  22257          var nextState = workInProgress.memoizedState; // Special path for dehydrated boundaries. We may eventually move this
  22258          // to its own fiber type so that we can add other kinds of hydration
  22259          // boundaries that aren't associated with a Suspense tree. In anticipation
  22260          // of such a refactor, all the hydration logic is contained in
  22261          // this branch.
  22262
  22263          if (current === null || current.memoizedState !== null && current.memoizedState.dehydrated !== null) {
  22264            var fallthroughToNormalSuspensePath = completeDehydratedSuspenseBoundary(current, workInProgress, nextState);
  22265
  22266            if (!fallthroughToNormalSuspensePath) {
  22267              if (workInProgress.flags & ShouldCapture) {
  22268                // Special case. There were remaining unhydrated nodes. We treat
  22269                // this as a mismatch. Revert to client rendering.
  22270                return workInProgress;
  22271              } else {
  22272                // Did not finish hydrating, either because this is the initial
  22273                // render or because something suspended.
  22274                return null;
  22275              }
  22276            } // Continue with the normal Suspense path.
  22277
  22278          }
  22279
  22280          if ((workInProgress.flags & DidCapture) !== NoFlags) {
  22281            // Something suspended. Re-render with the fallback children.
  22282            workInProgress.lanes = renderLanes; // Do not reset the effect list.
  22283
  22284            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
  22285              transferActualDuration(workInProgress);
  22286            } // Don't bubble properties in this case.
  22287
  22288
  22289            return workInProgress;
  22290          }
  22291
  22292          var nextDidTimeout = nextState !== null;
  22293          var prevDidTimeout = current !== null && current.memoizedState !== null;
  22294          // a passive effect, which is when we process the transitions
  22295
  22296
  22297          if (nextDidTimeout !== prevDidTimeout) {
  22298            // an effect to toggle the subtree's visibility. When we switch from
  22299            // fallback -> primary, the inner Offscreen fiber schedules this effect
  22300            // as part of its normal complete phase. But when we switch from
  22301            // primary -> fallback, the inner Offscreen fiber does not have a complete
  22302            // phase. So we need to schedule its effect here.
  22303            //
  22304            // We also use this flag to connect/disconnect the effects, but the same
  22305            // logic applies: when re-connecting, the Offscreen fiber's complete
  22306            // phase will handle scheduling the effect. It's only when the fallback
  22307            // is active that we have to do anything special.
  22308
  22309
  22310            if (nextDidTimeout) {
  22311              var _offscreenFiber2 = workInProgress.child;
  22312              _offscreenFiber2.flags |= Visibility; // TODO: This will still suspend a synchronous tree if anything
  22313              // in the concurrent tree already suspended during this render.
  22314              // This is a known bug.
  22315
  22316              if ((workInProgress.mode & ConcurrentMode) !== NoMode) {
  22317                // TODO: Move this back to throwException because this is too late
  22318                // if this is a large tree which is common for initial loads. We
  22319                // don't know if we should restart a render or not until we get
  22320                // this marker, and this is too late.
  22321                // If this render already had a ping or lower pri updates,
  22322                // and this is the first time we know we're going to suspend we
  22323                // should be able to immediately restart from within throwException.
  22324                var hasInvisibleChildContext = current === null && (workInProgress.memoizedProps.unstable_avoidThisFallback !== true || !enableSuspenseAvoidThisFallback);
  22325
  22326                if (hasInvisibleChildContext || hasSuspenseContext(suspenseStackCursor.current, InvisibleParentSuspenseContext)) {
  22327                  // If this was in an invisible tree or a new render, then showing
  22328                  // this boundary is ok.
  22329                  renderDidSuspend();
  22330                } else {
  22331                  // Otherwise, we're going to have to hide content so we should
  22332                  // suspend for longer if possible.
  22333                  renderDidSuspendDelayIfPossible();
  22334                }
  22335              }
  22336            }
  22337          }
  22338
  22339          var wakeables = workInProgress.updateQueue;
  22340
  22341          if (wakeables !== null) {
  22342            // Schedule an effect to attach a retry listener to the promise.
  22343            // TODO: Move to passive phase
  22344            workInProgress.flags |= Update;
  22345          }
  22346
  22347          bubbleProperties(workInProgress);
  22348
  22349          {
  22350            if ((workInProgress.mode & ProfileMode) !== NoMode) {
  22351              if (nextDidTimeout) {
  22352                // Don't count time spent in a timed out Suspense subtree as part of the base duration.
  22353                var primaryChildFragment = workInProgress.child;
  22354
  22355                if (primaryChildFragment !== null) {
  22356                  // $FlowFixMe Flow doesn't support type casting in combination with the -= operator
  22357                  workInProgress.treeBaseDuration -= primaryChildFragment.treeBaseDuration;
  22358                }
  22359              }
  22360            }
  22361          }
  22362
  22363          return null;
  22364        }
  22365
  22366      case HostPortal:
  22367        popHostContainer(workInProgress);
  22368        updateHostContainer(current, workInProgress);
  22369
  22370        if (current === null) {
  22371          preparePortalMount(workInProgress.stateNode.containerInfo);
  22372        }
  22373
  22374        bubbleProperties(workInProgress);
  22375        return null;
  22376
  22377      case ContextProvider:
  22378        // Pop provider fiber
  22379        var context = workInProgress.type._context;
  22380        popProvider(context, workInProgress);
  22381        bubbleProperties(workInProgress);
  22382        return null;
  22383
  22384      case IncompleteClassComponent:
  22385        {
  22386          // Same as class component case. I put it down here so that the tags are
  22387          // sequential to ensure this switch is compiled to a jump table.
  22388          var _Component = workInProgress.type;
  22389
  22390          if (isContextProvider(_Component)) {
  22391            popContext(workInProgress);
  22392          }
  22393
  22394          bubbleProperties(workInProgress);
  22395          return null;
  22396        }
  22397
  22398      case SuspenseListComponent:
  22399        {
  22400          popSuspenseContext(workInProgress);
  22401          var renderState = workInProgress.memoizedState;
  22402
  22403          if (renderState === null) {
  22404            // We're running in the default, "independent" mode.
  22405            // We don't do anything in this mode.
  22406            bubbleProperties(workInProgress);
  22407            return null;
  22408          }
  22409
  22410          var didSuspendAlready = (workInProgress.flags & DidCapture) !== NoFlags;
  22411          var renderedTail = renderState.rendering;
  22412
  22413          if (renderedTail === null) {
  22414            // We just rendered the head.
  22415            if (!didSuspendAlready) {
  22416              // This is the first pass. We need to figure out if anything is still
  22417              // suspended in the rendered set.
  22418              // If new content unsuspended, but there's still some content that
  22419              // didn't. Then we need to do a second pass that forces everything
  22420              // to keep showing their fallbacks.
  22421              // We might be suspended if something in this render pass suspended, or
  22422              // something in the previous committed pass suspended. Otherwise,
  22423              // there's no chance so we can skip the expensive call to
  22424              // findFirstSuspended.
  22425              var cannotBeSuspended = renderHasNotSuspendedYet() && (current === null || (current.flags & DidCapture) === NoFlags);
  22426
  22427              if (!cannotBeSuspended) {
  22428                var row = workInProgress.child;
  22429
  22430                while (row !== null) {
  22431                  var suspended = findFirstSuspended(row);
  22432
  22433                  if (suspended !== null) {
  22434                    didSuspendAlready = true;
  22435                    workInProgress.flags |= DidCapture;
  22436                    cutOffTailIfNeeded(renderState, false); // If this is a newly suspended tree, it might not get committed as
  22437                    // part of the second pass. In that case nothing will subscribe to
  22438                    // its thenables. Instead, we'll transfer its thenables to the
  22439                    // SuspenseList so that it can retry if they resolve.
  22440                    // There might be multiple of these in the list but since we're
  22441                    // going to wait for all of them anyway, it doesn't really matter
  22442                    // which ones gets to ping. In theory we could get clever and keep
  22443                    // track of how many dependencies remain but it gets tricky because
  22444                    // in the meantime, we can add/remove/change items and dependencies.
  22445                    // We might bail out of the loop before finding any but that
  22446                    // doesn't matter since that means that the other boundaries that
  22447                    // we did find already has their listeners attached.
  22448
  22449                    var newThenables = suspended.updateQueue;
  22450
  22451                    if (newThenables !== null) {
  22452                      workInProgress.updateQueue = newThenables;
  22453                      workInProgress.flags |= Update;
  22454                    } // Rerender the whole list, but this time, we'll force fallbacks
  22455                    // to stay in place.
  22456                    // Reset the effect flags before doing the second pass since that's now invalid.
  22457                    // Reset the child fibers to their original state.
  22458
  22459
  22460                    workInProgress.subtreeFlags = NoFlags;
  22461                    resetChildFibers(workInProgress, renderLanes); // Set up the Suspense Context to force suspense and immediately
  22462                    // rerender the children.
  22463
  22464                    pushSuspenseContext(workInProgress, setShallowSuspenseContext(suspenseStackCursor.current, ForceSuspenseFallback)); // Don't bubble properties in this case.
  22465
  22466                    return workInProgress.child;
  22467                  }
  22468
  22469                  row = row.sibling;
  22470                }
  22471              }
  22472
  22473              if (renderState.tail !== null && now() > getRenderTargetTime()) {
  22474                // We have already passed our CPU deadline but we still have rows
  22475                // left in the tail. We'll just give up further attempts to render
  22476                // the main content and only render fallbacks.
  22477                workInProgress.flags |= DidCapture;
  22478                didSuspendAlready = true;
  22479                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
  22480                // to get it started back up to attempt the next item. While in terms
  22481                // of priority this work has the same priority as this current render,
  22482                // it's not part of the same transition once the transition has
  22483                // committed. If it's sync, we still want to yield so that it can be
  22484                // painted. Conceptually, this is really the same as pinging.
  22485                // We can use any RetryLane even if it's the one currently rendering
  22486                // since we're leaving it behind on this node.
  22487
  22488                workInProgress.lanes = SomeRetryLane;
  22489              }
  22490            } else {
  22491              cutOffTailIfNeeded(renderState, false);
  22492            } // Next we're going to render the tail.
  22493
  22494          } else {
  22495            // Append the rendered row to the child list.
  22496            if (!didSuspendAlready) {
  22497              var _suspended = findFirstSuspended(renderedTail);
  22498
  22499              if (_suspended !== null) {
  22500                workInProgress.flags |= DidCapture;
  22501                didSuspendAlready = true; // Ensure we transfer the update queue to the parent so that it doesn't
  22502                // get lost if this row ends up dropped during a second pass.
  22503
  22504                var _newThenables = _suspended.updateQueue;
  22505
  22506                if (_newThenables !== null) {
  22507                  workInProgress.updateQueue = _newThenables;
  22508                  workInProgress.flags |= Update;
  22509                }
  22510
  22511                cutOffTailIfNeeded(renderState, true); // This might have been modified.
  22512
  22513                if (renderState.tail === null && renderState.tailMode === 'hidden' && !renderedTail.alternate && !getIsHydrating() // We don't cut it if we're hydrating.
  22514                ) {
  22515                    // We're done.
  22516                    bubbleProperties(workInProgress);
  22517                    return null;
  22518                  }
  22519              } else if ( // The time it took to render last row is greater than the remaining
  22520              // time we have to render. So rendering one more row would likely
  22521              // exceed it.
  22522              now() * 2 - renderState.renderingStartTime > getRenderTargetTime() && renderLanes !== OffscreenLane) {
  22523                // We have now passed our CPU deadline and we'll just give up further
  22524                // attempts to render the main content and only render fallbacks.
  22525                // The assumption is that this is usually faster.
  22526                workInProgress.flags |= DidCapture;
  22527                didSuspendAlready = true;
  22528                cutOffTailIfNeeded(renderState, false); // Since nothing actually suspended, there will nothing to ping this
  22529                // to get it started back up to attempt the next item. While in terms
  22530                // of priority this work has the same priority as this current render,
  22531                // it's not part of the same transition once the transition has
  22532                // committed. If it's sync, we still want to yield so that it can be
  22533                // painted. Conceptually, this is really the same as pinging.
  22534                // We can use any RetryLane even if it's the one currently rendering
  22535                // since we're leaving it behind on this node.
  22536
  22537                workInProgress.lanes = SomeRetryLane;
  22538              }
  22539            }
  22540
  22541            if (renderState.isBackwards) {
  22542              // The effect list of the backwards tail will have been added
  22543              // to the end. This breaks the guarantee that life-cycles fire in
  22544              // sibling order but that isn't a strong guarantee promised by React.
  22545              // Especially since these might also just pop in during future commits.
  22546              // Append to the beginning of the list.
  22547              renderedTail.sibling = workInProgress.child;
  22548              workInProgress.child = renderedTail;
  22549            } else {
  22550              var previousSibling = renderState.last;
  22551
  22552              if (previousSibling !== null) {
  22553                previousSibling.sibling = renderedTail;
  22554              } else {
  22555                workInProgress.child = renderedTail;
  22556              }
  22557
  22558              renderState.last = renderedTail;
  22559            }
  22560          }
  22561
  22562          if (renderState.tail !== null) {
  22563            // We still have tail rows to render.
  22564            // Pop a row.
  22565            var next = renderState.tail;
  22566            renderState.rendering = next;
  22567            renderState.tail = next.sibling;
  22568            renderState.renderingStartTime = now();
  22569            next.sibling = null; // Restore the context.
  22570            // TODO: We can probably just avoid popping it instead and only
  22571            // setting it the first time we go from not suspended to suspended.
  22572
  22573            var suspenseContext = suspenseStackCursor.current;
  22574
  22575            if (didSuspendAlready) {
  22576              suspenseContext = setShallowSuspenseContext(suspenseContext, ForceSuspenseFallback);
  22577            } else {
  22578              suspenseContext = setDefaultShallowSuspenseContext(suspenseContext);
  22579            }
  22580
  22581            pushSuspenseContext(workInProgress, suspenseContext); // Do a pass over the next row.
  22582            // Don't bubble properties in this case.
  22583
  22584            return next;
  22585          }
  22586
  22587          bubbleProperties(workInProgress);
  22588          return null;
  22589        }
  22590
  22591      case ScopeComponent:
  22592        {
  22593
  22594          break;
  22595        }
  22596
  22597      case OffscreenComponent:
  22598      case LegacyHiddenComponent:
  22599        {
  22600          popRenderLanes(workInProgress);
  22601          var _nextState = workInProgress.memoizedState;
  22602          var nextIsHidden = _nextState !== null;
  22603
  22604          if (current !== null) {
  22605            var _prevState = current.memoizedState;
  22606            var prevIsHidden = _prevState !== null;
  22607
  22608            if (prevIsHidden !== nextIsHidden && ( // LegacyHidden doesn't do any hiding — it only pre-renders.
  22609            !enableLegacyHidden )) {
  22610              workInProgress.flags |= Visibility;
  22611            }
  22612          }
  22613
  22614          if (!nextIsHidden || (workInProgress.mode & ConcurrentMode) === NoMode) {
  22615            bubbleProperties(workInProgress);
  22616          } else {
  22617            // Don't bubble properties for hidden children unless we're rendering
  22618            // at offscreen priority.
  22619            if (includesSomeLane(subtreeRenderLanes, OffscreenLane)) {
  22620              bubbleProperties(workInProgress);
  22621
  22622              {
  22623                // Check if there was an insertion or update in the hidden subtree.
  22624                // If so, we need to hide those nodes in the commit phase, so
  22625                // schedule a visibility effect.
  22626                if ( workInProgress.subtreeFlags & (Placement | Update)) {
  22627                  workInProgress.flags |= Visibility;
  22628                }
  22629              }
  22630            }
  22631          }
  22632          return null;
  22633        }
  22634
  22635      case CacheComponent:
  22636        {
  22637
  22638          return null;
  22639        }
  22640
  22641      case TracingMarkerComponent:
  22642        {
  22643
  22644          return null;
  22645        }
  22646    }
  22647
  22648    throw new Error("Unknown unit of work tag (" + workInProgress.tag + "). This error is likely caused by a bug in " + 'React. Please file an issue.');
  22649  }
  22650
  22651  function unwindWork(current, workInProgress, renderLanes) {
  22652    // Note: This intentionally doesn't check if we're hydrating because comparing
  22653    // to the current tree provider fiber is just as fast and less error-prone.
  22654    // Ideally we would have a special version of the work loop only
  22655    // for hydration.
  22656    popTreeContext(workInProgress);
  22657
  22658    switch (workInProgress.tag) {
  22659      case ClassComponent:
  22660        {
  22661          var Component = workInProgress.type;
  22662
  22663          if (isContextProvider(Component)) {
  22664            popContext(workInProgress);
  22665          }
  22666
  22667          var flags = workInProgress.flags;
  22668
  22669          if (flags & ShouldCapture) {
  22670            workInProgress.flags = flags & ~ShouldCapture | DidCapture;
  22671
  22672            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
  22673              transferActualDuration(workInProgress);
  22674            }
  22675
  22676            return workInProgress;
  22677          }
  22678
  22679          return null;
  22680        }
  22681
  22682      case HostRoot:
  22683        {
  22684          var root = workInProgress.stateNode;
  22685          popHostContainer(workInProgress);
  22686          popTopLevelContextObject(workInProgress);
  22687          resetWorkInProgressVersions();
  22688          var _flags = workInProgress.flags;
  22689
  22690          if ((_flags & ShouldCapture) !== NoFlags && (_flags & DidCapture) === NoFlags) {
  22691            // There was an error during render that wasn't captured by a suspense
  22692            // boundary. Do a second pass on the root to unmount the children.
  22693            workInProgress.flags = _flags & ~ShouldCapture | DidCapture;
  22694            return workInProgress;
  22695          } // We unwound to the root without completing it. Exit.
  22696
  22697
  22698          return null;
  22699        }
  22700
  22701      case HostComponent:
  22702        {
  22703          // TODO: popHydrationState
  22704          popHostContext(workInProgress);
  22705          return null;
  22706        }
  22707
  22708      case SuspenseComponent:
  22709        {
  22710          popSuspenseContext(workInProgress);
  22711          var suspenseState = workInProgress.memoizedState;
  22712
  22713          if (suspenseState !== null && suspenseState.dehydrated !== null) {
  22714            if (workInProgress.alternate === null) {
  22715              throw new Error('Threw in newly mounted dehydrated component. This is likely a bug in ' + 'React. Please file an issue.');
  22716            }
  22717
  22718            resetHydrationState();
  22719          }
  22720
  22721          var _flags2 = workInProgress.flags;
  22722
  22723          if (_flags2 & ShouldCapture) {
  22724            workInProgress.flags = _flags2 & ~ShouldCapture | DidCapture; // Captured a suspense effect. Re-render the boundary.
  22725
  22726            if ( (workInProgress.mode & ProfileMode) !== NoMode) {
  22727              transferActualDuration(workInProgress);
  22728            }
  22729
  22730            return workInProgress;
  22731          }
  22732
  22733          return null;
  22734        }
  22735
  22736      case SuspenseListComponent:
  22737        {
  22738          popSuspenseContext(workInProgress); // SuspenseList doesn't actually catch anything. It should've been
  22739          // caught by a nested boundary. If not, it should bubble through.
  22740
  22741          return null;
  22742        }
  22743
  22744      case HostPortal:
  22745        popHostContainer(workInProgress);
  22746        return null;
  22747
  22748      case ContextProvider:
  22749        var context = workInProgress.type._context;
  22750        popProvider(context, workInProgress);
  22751        return null;
  22752
  22753      case OffscreenComponent:
  22754      case LegacyHiddenComponent:
  22755        popRenderLanes(workInProgress);
  22756        return null;
  22757
  22758      case CacheComponent:
  22759
  22760        return null;
  22761
  22762      default:
  22763        return null;
  22764    }
  22765  }
  22766
  22767  function unwindInterruptedWork(current, interruptedWork, renderLanes) {
  22768    // Note: This intentionally doesn't check if we're hydrating because comparing
  22769    // to the current tree provider fiber is just as fast and less error-prone.
  22770    // Ideally we would have a special version of the work loop only
  22771    // for hydration.
  22772    popTreeContext(interruptedWork);
  22773
  22774    switch (interruptedWork.tag) {
  22775      case ClassComponent:
  22776        {
  22777          var childContextTypes = interruptedWork.type.childContextTypes;
  22778
  22779          if (childContextTypes !== null && childContextTypes !== undefined) {
  22780            popContext(interruptedWork);
  22781          }
  22782
  22783          break;
  22784        }
  22785
  22786      case HostRoot:
  22787        {
  22788          var root = interruptedWork.stateNode;
  22789          popHostContainer(interruptedWork);
  22790          popTopLevelContextObject(interruptedWork);
  22791          resetWorkInProgressVersions();
  22792          break;
  22793        }
  22794
  22795      case HostComponent:
  22796        {
  22797          popHostContext(interruptedWork);
  22798          break;
  22799        }
  22800
  22801      case HostPortal:
  22802        popHostContainer(interruptedWork);
  22803        break;
  22804
  22805      case SuspenseComponent:
  22806        popSuspenseContext(interruptedWork);
  22807        break;
  22808
  22809      case SuspenseListComponent:
  22810        popSuspenseContext(interruptedWork);
  22811        break;
  22812
  22813      case ContextProvider:
  22814        var context = interruptedWork.type._context;
  22815        popProvider(context, interruptedWork);
  22816        break;
  22817
  22818      case OffscreenComponent:
  22819      case LegacyHiddenComponent:
  22820        popRenderLanes(interruptedWork);
  22821        break;
  22822    }
  22823  }
  22824
  22825  var didWarnAboutUndefinedSnapshotBeforeUpdate = null;
  22826
  22827  {
  22828    didWarnAboutUndefinedSnapshotBeforeUpdate = new Set();
  22829  } // Used during the commit phase to track the state of the Offscreen component stack.
  22830  // Allows us to avoid traversing the return path to find the nearest Offscreen ancestor.
  22831  // Only used when enableSuspenseLayoutEffectSemantics is enabled.
  22832
  22833
  22834  var offscreenSubtreeIsHidden = false;
  22835  var offscreenSubtreeWasHidden = false;
  22836  var PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
  22837  var nextEffect = null; // Used for Profiling builds to track updaters.
  22838
  22839  var inProgressLanes = null;
  22840  var inProgressRoot = null;
  22841  function reportUncaughtErrorInDEV(error) {
  22842    // Wrapping each small part of the commit phase into a guarded
  22843    // callback is a bit too slow (https://github.com/facebook/react/pull/21666).
  22844    // But we rely on it to surface errors to DEV tools like overlays
  22845    // (https://github.com/facebook/react/issues/21712).
  22846    // As a compromise, rethrow only caught errors in a guard.
  22847    {
  22848      invokeGuardedCallback(null, function () {
  22849        throw error;
  22850      });
  22851      clearCaughtError();
  22852    }
  22853  }
  22854
  22855  var callComponentWillUnmountWithTimer = function (current, instance) {
  22856    instance.props = current.memoizedProps;
  22857    instance.state = current.memoizedState;
  22858
  22859    if ( current.mode & ProfileMode) {
  22860      try {
  22861        startLayoutEffectTimer();
  22862        instance.componentWillUnmount();
  22863      } finally {
  22864        recordLayoutEffectDuration(current);
  22865      }
  22866    } else {
  22867      instance.componentWillUnmount();
  22868    }
  22869  }; // Capture errors so they don't interrupt mounting.
  22870
  22871
  22872  function safelyCallCommitHookLayoutEffectListMount(current, nearestMountedAncestor) {
  22873    try {
  22874      commitHookEffectListMount(Layout, current);
  22875    } catch (error) {
  22876      captureCommitPhaseError(current, nearestMountedAncestor, error);
  22877    }
  22878  } // Capture errors so they don't interrupt unmounting.
  22879
  22880
  22881  function safelyCallComponentWillUnmount(current, nearestMountedAncestor, instance) {
  22882    try {
  22883      callComponentWillUnmountWithTimer(current, instance);
  22884    } catch (error) {
  22885      captureCommitPhaseError(current, nearestMountedAncestor, error);
  22886    }
  22887  } // Capture errors so they don't interrupt mounting.
  22888
  22889
  22890  function safelyCallComponentDidMount(current, nearestMountedAncestor, instance) {
  22891    try {
  22892      instance.componentDidMount();
  22893    } catch (error) {
  22894      captureCommitPhaseError(current, nearestMountedAncestor, error);
  22895    }
  22896  } // Capture errors so they don't interrupt mounting.
  22897
  22898
  22899  function safelyAttachRef(current, nearestMountedAncestor) {
  22900    try {
  22901      commitAttachRef(current);
  22902    } catch (error) {
  22903      captureCommitPhaseError(current, nearestMountedAncestor, error);
  22904    }
  22905  }
  22906
  22907  function safelyDetachRef(current, nearestMountedAncestor) {
  22908    var ref = current.ref;
  22909
  22910    if (ref !== null) {
  22911      if (typeof ref === 'function') {
  22912        var retVal;
  22913
  22914        try {
  22915          if (enableProfilerTimer && enableProfilerCommitHooks && current.mode & ProfileMode) {
  22916            try {
  22917              startLayoutEffectTimer();
  22918              retVal = ref(null);
  22919            } finally {
  22920              recordLayoutEffectDuration(current);
  22921            }
  22922          } else {
  22923            retVal = ref(null);
  22924          }
  22925        } catch (error) {
  22926          captureCommitPhaseError(current, nearestMountedAncestor, error);
  22927        }
  22928
  22929        {
  22930          if (typeof retVal === 'function') {
  22931            error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(current));
  22932          }
  22933        }
  22934      } else {
  22935        ref.current = null;
  22936      }
  22937    }
  22938  }
  22939
  22940  function safelyCallDestroy(current, nearestMountedAncestor, destroy) {
  22941    try {
  22942      destroy();
  22943    } catch (error) {
  22944      captureCommitPhaseError(current, nearestMountedAncestor, error);
  22945    }
  22946  }
  22947
  22948  var focusedInstanceHandle = null;
  22949  var shouldFireAfterActiveInstanceBlur = false;
  22950  function commitBeforeMutationEffects(root, firstChild) {
  22951    focusedInstanceHandle = prepareForCommit(root.containerInfo);
  22952    nextEffect = firstChild;
  22953    commitBeforeMutationEffects_begin(); // We no longer need to track the active instance fiber
  22954
  22955    var shouldFire = shouldFireAfterActiveInstanceBlur;
  22956    shouldFireAfterActiveInstanceBlur = false;
  22957    focusedInstanceHandle = null;
  22958    return shouldFire;
  22959  }
  22960
  22961  function commitBeforeMutationEffects_begin() {
  22962    while (nextEffect !== null) {
  22963      var fiber = nextEffect; // This phase is only used for beforeActiveInstanceBlur.
  22964
  22965      var child = fiber.child;
  22966
  22967      if ((fiber.subtreeFlags & BeforeMutationMask) !== NoFlags && child !== null) {
  22968        child.return = fiber;
  22969        nextEffect = child;
  22970      } else {
  22971        commitBeforeMutationEffects_complete();
  22972      }
  22973    }
  22974  }
  22975
  22976  function commitBeforeMutationEffects_complete() {
  22977    while (nextEffect !== null) {
  22978      var fiber = nextEffect;
  22979      setCurrentFiber(fiber);
  22980
  22981      try {
  22982        commitBeforeMutationEffectsOnFiber(fiber);
  22983      } catch (error) {
  22984        captureCommitPhaseError(fiber, fiber.return, error);
  22985      }
  22986
  22987      resetCurrentFiber();
  22988      var sibling = fiber.sibling;
  22989
  22990      if (sibling !== null) {
  22991        sibling.return = fiber.return;
  22992        nextEffect = sibling;
  22993        return;
  22994      }
  22995
  22996      nextEffect = fiber.return;
  22997    }
  22998  }
  22999
  23000  function commitBeforeMutationEffectsOnFiber(finishedWork) {
  23001    var current = finishedWork.alternate;
  23002    var flags = finishedWork.flags;
  23003
  23004    if ((flags & Snapshot) !== NoFlags) {
  23005      setCurrentFiber(finishedWork);
  23006
  23007      switch (finishedWork.tag) {
  23008        case FunctionComponent:
  23009        case ForwardRef:
  23010        case SimpleMemoComponent:
  23011          {
  23012            break;
  23013          }
  23014
  23015        case ClassComponent:
  23016          {
  23017            if (current !== null) {
  23018              var prevProps = current.memoizedProps;
  23019              var prevState = current.memoizedState;
  23020              var instance = finishedWork.stateNode; // We could update instance props and state here,
  23021              // but instead we rely on them being set during last render.
  23022              // TODO: revisit this when we implement resuming.
  23023
  23024              {
  23025                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
  23026                  if (instance.props !== finishedWork.memoizedProps) {
  23027                    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.', getComponentNameFromFiber(finishedWork) || 'instance');
  23028                  }
  23029
  23030                  if (instance.state !== finishedWork.memoizedState) {
  23031                    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.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
  23032                  }
  23033                }
  23034              }
  23035
  23036              var snapshot = instance.getSnapshotBeforeUpdate(finishedWork.elementType === finishedWork.type ? prevProps : resolveDefaultProps(finishedWork.type, prevProps), prevState);
  23037
  23038              {
  23039                var didWarnSet = didWarnAboutUndefinedSnapshotBeforeUpdate;
  23040
  23041                if (snapshot === undefined && !didWarnSet.has(finishedWork.type)) {
  23042                  didWarnSet.add(finishedWork.type);
  23043
  23044                  error('%s.getSnapshotBeforeUpdate(): A snapshot value (or null) ' + 'must be returned. You have returned undefined.', getComponentNameFromFiber(finishedWork));
  23045                }
  23046              }
  23047
  23048              instance.__reactInternalSnapshotBeforeUpdate = snapshot;
  23049            }
  23050
  23051            break;
  23052          }
  23053
  23054        case HostRoot:
  23055          {
  23056            {
  23057              var root = finishedWork.stateNode;
  23058              clearContainer(root.containerInfo);
  23059            }
  23060
  23061            break;
  23062          }
  23063
  23064        case HostComponent:
  23065        case HostText:
  23066        case HostPortal:
  23067        case IncompleteClassComponent:
  23068          // Nothing to do for these component types
  23069          break;
  23070
  23071        default:
  23072          {
  23073            throw new 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.');
  23074          }
  23075      }
  23076
  23077      resetCurrentFiber();
  23078    }
  23079  }
  23080
  23081  function commitHookEffectListUnmount(flags, finishedWork, nearestMountedAncestor) {
  23082    var updateQueue = finishedWork.updateQueue;
  23083    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
  23084
  23085    if (lastEffect !== null) {
  23086      var firstEffect = lastEffect.next;
  23087      var effect = firstEffect;
  23088
  23089      do {
  23090        if ((effect.tag & flags) === flags) {
  23091          // Unmount
  23092          var destroy = effect.destroy;
  23093          effect.destroy = undefined;
  23094
  23095          if (destroy !== undefined) {
  23096            {
  23097              if ((flags & Passive$1) !== NoFlags$1) {
  23098                markComponentPassiveEffectUnmountStarted(finishedWork);
  23099              } else if ((flags & Layout) !== NoFlags$1) {
  23100                markComponentLayoutEffectUnmountStarted(finishedWork);
  23101              }
  23102            }
  23103
  23104            {
  23105              if ((flags & Insertion) !== NoFlags$1) {
  23106                setIsRunningInsertionEffect(true);
  23107              }
  23108            }
  23109
  23110            safelyCallDestroy(finishedWork, nearestMountedAncestor, destroy);
  23111
  23112            {
  23113              if ((flags & Insertion) !== NoFlags$1) {
  23114                setIsRunningInsertionEffect(false);
  23115              }
  23116            }
  23117
  23118            {
  23119              if ((flags & Passive$1) !== NoFlags$1) {
  23120                markComponentPassiveEffectUnmountStopped();
  23121              } else if ((flags & Layout) !== NoFlags$1) {
  23122                markComponentLayoutEffectUnmountStopped();
  23123              }
  23124            }
  23125          }
  23126        }
  23127
  23128        effect = effect.next;
  23129      } while (effect !== firstEffect);
  23130    }
  23131  }
  23132
  23133  function commitHookEffectListMount(flags, finishedWork) {
  23134    var updateQueue = finishedWork.updateQueue;
  23135    var lastEffect = updateQueue !== null ? updateQueue.lastEffect : null;
  23136
  23137    if (lastEffect !== null) {
  23138      var firstEffect = lastEffect.next;
  23139      var effect = firstEffect;
  23140
  23141      do {
  23142        if ((effect.tag & flags) === flags) {
  23143          {
  23144            if ((flags & Passive$1) !== NoFlags$1) {
  23145              markComponentPassiveEffectMountStarted(finishedWork);
  23146            } else if ((flags & Layout) !== NoFlags$1) {
  23147              markComponentLayoutEffectMountStarted(finishedWork);
  23148            }
  23149          } // Mount
  23150
  23151
  23152          var create = effect.create;
  23153
  23154          {
  23155            if ((flags & Insertion) !== NoFlags$1) {
  23156              setIsRunningInsertionEffect(true);
  23157            }
  23158          }
  23159
  23160          effect.destroy = create();
  23161
  23162          {
  23163            if ((flags & Insertion) !== NoFlags$1) {
  23164              setIsRunningInsertionEffect(false);
  23165            }
  23166          }
  23167
  23168          {
  23169            if ((flags & Passive$1) !== NoFlags$1) {
  23170              markComponentPassiveEffectMountStopped();
  23171            } else if ((flags & Layout) !== NoFlags$1) {
  23172              markComponentLayoutEffectMountStopped();
  23173            }
  23174          }
  23175
  23176          {
  23177            var destroy = effect.destroy;
  23178
  23179            if (destroy !== undefined && typeof destroy !== 'function') {
  23180              var hookName = void 0;
  23181
  23182              if ((effect.tag & Layout) !== NoFlags) {
  23183                hookName = 'useLayoutEffect';
  23184              } else if ((effect.tag & Insertion) !== NoFlags) {
  23185                hookName = 'useInsertionEffect';
  23186              } else {
  23187                hookName = 'useEffect';
  23188              }
  23189
  23190              var addendum = void 0;
  23191
  23192              if (destroy === null) {
  23193                addendum = ' You returned null. If your effect does not require clean ' + 'up, return undefined (or nothing).';
  23194              } else if (typeof destroy.then === 'function') {
  23195                addendum = '\n\nIt looks like you wrote ' + hookName + '(async () => ...) or returned a Promise. ' + 'Instead, write the async function inside your effect ' + 'and call it immediately:\n\n' + hookName + '(() => {\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://reactjs.org/link/hooks-data-fetching';
  23196              } else {
  23197                addendum = ' You returned: ' + destroy;
  23198              }
  23199
  23200              error('%s must not return anything besides a function, ' + 'which is used for clean-up.%s', hookName, addendum);
  23201            }
  23202          }
  23203        }
  23204
  23205        effect = effect.next;
  23206      } while (effect !== firstEffect);
  23207    }
  23208  }
  23209
  23210  function commitPassiveEffectDurations(finishedRoot, finishedWork) {
  23211    {
  23212      // Only Profilers with work in their subtree will have an Update effect scheduled.
  23213      if ((finishedWork.flags & Update) !== NoFlags) {
  23214        switch (finishedWork.tag) {
  23215          case Profiler:
  23216            {
  23217              var passiveEffectDuration = finishedWork.stateNode.passiveEffectDuration;
  23218              var _finishedWork$memoize = finishedWork.memoizedProps,
  23219                  id = _finishedWork$memoize.id,
  23220                  onPostCommit = _finishedWork$memoize.onPostCommit; // This value will still reflect the previous commit phase.
  23221              // It does not get reset until the start of the next commit phase.
  23222
  23223              var commitTime = getCommitTime();
  23224              var phase = finishedWork.alternate === null ? 'mount' : 'update';
  23225
  23226              {
  23227                if (isCurrentUpdateNested()) {
  23228                  phase = 'nested-update';
  23229                }
  23230              }
  23231
  23232              if (typeof onPostCommit === 'function') {
  23233                onPostCommit(id, phase, passiveEffectDuration, commitTime);
  23234              } // Bubble times to the next nearest ancestor Profiler.
  23235              // After we process that Profiler, we'll bubble further up.
  23236
  23237
  23238              var parentFiber = finishedWork.return;
  23239
  23240              outer: while (parentFiber !== null) {
  23241                switch (parentFiber.tag) {
  23242                  case HostRoot:
  23243                    var root = parentFiber.stateNode;
  23244                    root.passiveEffectDuration += passiveEffectDuration;
  23245                    break outer;
  23246
  23247                  case Profiler:
  23248                    var parentStateNode = parentFiber.stateNode;
  23249                    parentStateNode.passiveEffectDuration += passiveEffectDuration;
  23250                    break outer;
  23251                }
  23252
  23253                parentFiber = parentFiber.return;
  23254              }
  23255
  23256              break;
  23257            }
  23258        }
  23259      }
  23260    }
  23261  }
  23262
  23263  function commitLayoutEffectOnFiber(finishedRoot, current, finishedWork, committedLanes) {
  23264    if ((finishedWork.flags & LayoutMask) !== NoFlags) {
  23265      switch (finishedWork.tag) {
  23266        case FunctionComponent:
  23267        case ForwardRef:
  23268        case SimpleMemoComponent:
  23269          {
  23270            if ( !offscreenSubtreeWasHidden) {
  23271              // At this point layout effects have already been destroyed (during mutation phase).
  23272              // This is done to prevent sibling component effects from interfering with each other,
  23273              // e.g. a destroy function in one component should never override a ref set
  23274              // by a create function in another component during the same commit.
  23275              if ( finishedWork.mode & ProfileMode) {
  23276                try {
  23277                  startLayoutEffectTimer();
  23278                  commitHookEffectListMount(Layout | HasEffect, finishedWork);
  23279                } finally {
  23280                  recordLayoutEffectDuration(finishedWork);
  23281                }
  23282              } else {
  23283                commitHookEffectListMount(Layout | HasEffect, finishedWork);
  23284              }
  23285            }
  23286
  23287            break;
  23288          }
  23289
  23290        case ClassComponent:
  23291          {
  23292            var instance = finishedWork.stateNode;
  23293
  23294            if (finishedWork.flags & Update) {
  23295              if (!offscreenSubtreeWasHidden) {
  23296                if (current === null) {
  23297                  // We could update instance props and state here,
  23298                  // but instead we rely on them being set during last render.
  23299                  // TODO: revisit this when we implement resuming.
  23300                  {
  23301                    if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
  23302                      if (instance.props !== finishedWork.memoizedProps) {
  23303                        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.', getComponentNameFromFiber(finishedWork) || 'instance');
  23304                      }
  23305
  23306                      if (instance.state !== finishedWork.memoizedState) {
  23307                        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.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
  23308                      }
  23309                    }
  23310                  }
  23311
  23312                  if ( finishedWork.mode & ProfileMode) {
  23313                    try {
  23314                      startLayoutEffectTimer();
  23315                      instance.componentDidMount();
  23316                    } finally {
  23317                      recordLayoutEffectDuration(finishedWork);
  23318                    }
  23319                  } else {
  23320                    instance.componentDidMount();
  23321                  }
  23322                } else {
  23323                  var prevProps = finishedWork.elementType === finishedWork.type ? current.memoizedProps : resolveDefaultProps(finishedWork.type, current.memoizedProps);
  23324                  var prevState = current.memoizedState; // We could update instance props and state here,
  23325                  // but instead we rely on them being set during last render.
  23326                  // TODO: revisit this when we implement resuming.
  23327
  23328                  {
  23329                    if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
  23330                      if (instance.props !== finishedWork.memoizedProps) {
  23331                        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.', getComponentNameFromFiber(finishedWork) || 'instance');
  23332                      }
  23333
  23334                      if (instance.state !== finishedWork.memoizedState) {
  23335                        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.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
  23336                      }
  23337                    }
  23338                  }
  23339
  23340                  if ( finishedWork.mode & ProfileMode) {
  23341                    try {
  23342                      startLayoutEffectTimer();
  23343                      instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
  23344                    } finally {
  23345                      recordLayoutEffectDuration(finishedWork);
  23346                    }
  23347                  } else {
  23348                    instance.componentDidUpdate(prevProps, prevState, instance.__reactInternalSnapshotBeforeUpdate);
  23349                  }
  23350                }
  23351              }
  23352            } // TODO: I think this is now always non-null by the time it reaches the
  23353            // commit phase. Consider removing the type check.
  23354
  23355
  23356            var updateQueue = finishedWork.updateQueue;
  23357
  23358            if (updateQueue !== null) {
  23359              {
  23360                if (finishedWork.type === finishedWork.elementType && !didWarnAboutReassigningProps) {
  23361                  if (instance.props !== finishedWork.memoizedProps) {
  23362                    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.', getComponentNameFromFiber(finishedWork) || 'instance');
  23363                  }
  23364
  23365                  if (instance.state !== finishedWork.memoizedState) {
  23366                    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.state`. ' + 'Please file an issue.', getComponentNameFromFiber(finishedWork) || 'instance');
  23367                  }
  23368                }
  23369              } // We could update instance props and state here,
  23370              // but instead we rely on them being set during last render.
  23371              // TODO: revisit this when we implement resuming.
  23372
  23373
  23374              commitUpdateQueue(finishedWork, updateQueue, instance);
  23375            }
  23376
  23377            break;
  23378          }
  23379
  23380        case HostRoot:
  23381          {
  23382            // TODO: I think this is now always non-null by the time it reaches the
  23383            // commit phase. Consider removing the type check.
  23384            var _updateQueue = finishedWork.updateQueue;
  23385
  23386            if (_updateQueue !== null) {
  23387              var _instance = null;
  23388
  23389              if (finishedWork.child !== null) {
  23390                switch (finishedWork.child.tag) {
  23391                  case HostComponent:
  23392                    _instance = getPublicInstance(finishedWork.child.stateNode);
  23393                    break;
  23394
  23395                  case ClassComponent:
  23396                    _instance = finishedWork.child.stateNode;
  23397                    break;
  23398                }
  23399              }
  23400
  23401              commitUpdateQueue(finishedWork, _updateQueue, _instance);
  23402            }
  23403
  23404            break;
  23405          }
  23406
  23407        case HostComponent:
  23408          {
  23409            var _instance2 = finishedWork.stateNode; // Renderers may schedule work to be done after host components are mounted
  23410            // (eg DOM renderer may schedule auto-focus for inputs and form controls).
  23411            // These effects should only be committed when components are first mounted,
  23412            // aka when there is no current/alternate.
  23413
  23414            if (current === null && finishedWork.flags & Update) {
  23415              var type = finishedWork.type;
  23416              var props = finishedWork.memoizedProps;
  23417              commitMount(_instance2, type, props);
  23418            }
  23419
  23420            break;
  23421          }
  23422
  23423        case HostText:
  23424          {
  23425            // We have no life-cycles associated with text.
  23426            break;
  23427          }
  23428
  23429        case HostPortal:
  23430          {
  23431            // We have no life-cycles associated with portals.
  23432            break;
  23433          }
  23434
  23435        case Profiler:
  23436          {
  23437            {
  23438              var _finishedWork$memoize2 = finishedWork.memoizedProps,
  23439                  onCommit = _finishedWork$memoize2.onCommit,
  23440                  onRender = _finishedWork$memoize2.onRender;
  23441              var effectDuration = finishedWork.stateNode.effectDuration;
  23442              var commitTime = getCommitTime();
  23443              var phase = current === null ? 'mount' : 'update';
  23444
  23445              {
  23446                if (isCurrentUpdateNested()) {
  23447                  phase = 'nested-update';
  23448                }
  23449              }
  23450
  23451              if (typeof onRender === 'function') {
  23452                onRender(finishedWork.memoizedProps.id, phase, finishedWork.actualDuration, finishedWork.treeBaseDuration, finishedWork.actualStartTime, commitTime);
  23453              }
  23454
  23455              {
  23456                if (typeof onCommit === 'function') {
  23457                  onCommit(finishedWork.memoizedProps.id, phase, effectDuration, commitTime);
  23458                } // Schedule a passive effect for this Profiler to call onPostCommit hooks.
  23459                // This effect should be scheduled even if there is no onPostCommit callback for this Profiler,
  23460                // because the effect is also where times bubble to parent Profilers.
  23461
  23462
  23463                enqueuePendingPassiveProfilerEffect(finishedWork); // Propagate layout effect durations to the next nearest Profiler ancestor.
  23464                // Do not reset these values until the next render so DevTools has a chance to read them first.
  23465
  23466                var parentFiber = finishedWork.return;
  23467
  23468                outer: while (parentFiber !== null) {
  23469                  switch (parentFiber.tag) {
  23470                    case HostRoot:
  23471                      var root = parentFiber.stateNode;
  23472                      root.effectDuration += effectDuration;
  23473                      break outer;
  23474
  23475                    case Profiler:
  23476                      var parentStateNode = parentFiber.stateNode;
  23477                      parentStateNode.effectDuration += effectDuration;
  23478                      break outer;
  23479                  }
  23480
  23481                  parentFiber = parentFiber.return;
  23482                }
  23483              }
  23484            }
  23485
  23486            break;
  23487          }
  23488
  23489        case SuspenseComponent:
  23490          {
  23491            commitSuspenseHydrationCallbacks(finishedRoot, finishedWork);
  23492            break;
  23493          }
  23494
  23495        case SuspenseListComponent:
  23496        case IncompleteClassComponent:
  23497        case ScopeComponent:
  23498        case OffscreenComponent:
  23499        case LegacyHiddenComponent:
  23500        case TracingMarkerComponent:
  23501          {
  23502            break;
  23503          }
  23504
  23505        default:
  23506          throw new 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.');
  23507      }
  23508    }
  23509
  23510    if ( !offscreenSubtreeWasHidden) {
  23511      {
  23512        if (finishedWork.flags & Ref) {
  23513          commitAttachRef(finishedWork);
  23514        }
  23515      }
  23516    }
  23517  }
  23518
  23519  function reappearLayoutEffectsOnFiber(node) {
  23520    // Turn on layout effects in a tree that previously disappeared.
  23521    // TODO (Offscreen) Check: flags & LayoutStatic
  23522    switch (node.tag) {
  23523      case FunctionComponent:
  23524      case ForwardRef:
  23525      case SimpleMemoComponent:
  23526        {
  23527          if ( node.mode & ProfileMode) {
  23528            try {
  23529              startLayoutEffectTimer();
  23530              safelyCallCommitHookLayoutEffectListMount(node, node.return);
  23531            } finally {
  23532              recordLayoutEffectDuration(node);
  23533            }
  23534          } else {
  23535            safelyCallCommitHookLayoutEffectListMount(node, node.return);
  23536          }
  23537
  23538          break;
  23539        }
  23540
  23541      case ClassComponent:
  23542        {
  23543          var instance = node.stateNode;
  23544
  23545          if (typeof instance.componentDidMount === 'function') {
  23546            safelyCallComponentDidMount(node, node.return, instance);
  23547          }
  23548
  23549          safelyAttachRef(node, node.return);
  23550          break;
  23551        }
  23552
  23553      case HostComponent:
  23554        {
  23555          safelyAttachRef(node, node.return);
  23556          break;
  23557        }
  23558    }
  23559  }
  23560
  23561  function hideOrUnhideAllChildren(finishedWork, isHidden) {
  23562    // Only hide or unhide the top-most host nodes.
  23563    var hostSubtreeRoot = null;
  23564
  23565    {
  23566      // We only have the top Fiber that was inserted but we need to recurse down its
  23567      // children to find all the terminal nodes.
  23568      var node = finishedWork;
  23569
  23570      while (true) {
  23571        if (node.tag === HostComponent) {
  23572          if (hostSubtreeRoot === null) {
  23573            hostSubtreeRoot = node;
  23574
  23575            try {
  23576              var instance = node.stateNode;
  23577
  23578              if (isHidden) {
  23579                hideInstance(instance);
  23580              } else {
  23581                unhideInstance(node.stateNode, node.memoizedProps);
  23582              }
  23583            } catch (error) {
  23584              captureCommitPhaseError(finishedWork, finishedWork.return, error);
  23585            }
  23586          }
  23587        } else if (node.tag === HostText) {
  23588          if (hostSubtreeRoot === null) {
  23589            try {
  23590              var _instance3 = node.stateNode;
  23591
  23592              if (isHidden) {
  23593                hideTextInstance(_instance3);
  23594              } else {
  23595                unhideTextInstance(_instance3, node.memoizedProps);
  23596              }
  23597            } catch (error) {
  23598              captureCommitPhaseError(finishedWork, finishedWork.return, error);
  23599            }
  23600          }
  23601        } else if ((node.tag === OffscreenComponent || node.tag === LegacyHiddenComponent) && node.memoizedState !== null && node !== finishedWork) ; else if (node.child !== null) {
  23602          node.child.return = node;
  23603          node = node.child;
  23604          continue;
  23605        }
  23606
  23607        if (node === finishedWork) {
  23608          return;
  23609        }
  23610
  23611        while (node.sibling === null) {
  23612          if (node.return === null || node.return === finishedWork) {
  23613            return;
  23614          }
  23615
  23616          if (hostSubtreeRoot === node) {
  23617            hostSubtreeRoot = null;
  23618          }
  23619
  23620          node = node.return;
  23621        }
  23622
  23623        if (hostSubtreeRoot === node) {
  23624          hostSubtreeRoot = null;
  23625        }
  23626
  23627        node.sibling.return = node.return;
  23628        node = node.sibling;
  23629      }
  23630    }
  23631  }
  23632
  23633  function commitAttachRef(finishedWork) {
  23634    var ref = finishedWork.ref;
  23635
  23636    if (ref !== null) {
  23637      var instance = finishedWork.stateNode;
  23638      var instanceToUse;
  23639
  23640      switch (finishedWork.tag) {
  23641        case HostComponent:
  23642          instanceToUse = getPublicInstance(instance);
  23643          break;
  23644
  23645        default:
  23646          instanceToUse = instance;
  23647      } // Moved outside to ensure DCE works with this flag
  23648
  23649      if (typeof ref === 'function') {
  23650        var retVal;
  23651
  23652        if ( finishedWork.mode & ProfileMode) {
  23653          try {
  23654            startLayoutEffectTimer();
  23655            retVal = ref(instanceToUse);
  23656          } finally {
  23657            recordLayoutEffectDuration(finishedWork);
  23658          }
  23659        } else {
  23660          retVal = ref(instanceToUse);
  23661        }
  23662
  23663        {
  23664          if (typeof retVal === 'function') {
  23665            error('Unexpected return value from a callback ref in %s. ' + 'A callback ref should not return a function.', getComponentNameFromFiber(finishedWork));
  23666          }
  23667        }
  23668      } else {
  23669        {
  23670          if (!ref.hasOwnProperty('current')) {
  23671            error('Unexpected ref object provided for %s. ' + 'Use either a ref-setter function or React.createRef().', getComponentNameFromFiber(finishedWork));
  23672          }
  23673        }
  23674
  23675        ref.current = instanceToUse;
  23676      }
  23677    }
  23678  }
  23679
  23680  function detachFiberMutation(fiber) {
  23681    // Cut off the return pointer to disconnect it from the tree.
  23682    // This enables us to detect and warn against state updates on an unmounted component.
  23683    // It also prevents events from bubbling from within disconnected components.
  23684    //
  23685    // Ideally, we should also clear the child pointer of the parent alternate to let this
  23686    // get GC:ed but we don't know which for sure which parent is the current
  23687    // one so we'll settle for GC:ing the subtree of this child.
  23688    // This child itself will be GC:ed when the parent updates the next time.
  23689    //
  23690    // Note that we can't clear child or sibling pointers yet.
  23691    // They're needed for passive effects and for findDOMNode.
  23692    // We defer those fields, and all other cleanup, to the passive phase (see detachFiberAfterEffects).
  23693    //
  23694    // Don't reset the alternate yet, either. We need that so we can detach the
  23695    // alternate's fields in the passive phase. Clearing the return pointer is
  23696    // sufficient for findDOMNode semantics.
  23697    var alternate = fiber.alternate;
  23698
  23699    if (alternate !== null) {
  23700      alternate.return = null;
  23701    }
  23702
  23703    fiber.return = null;
  23704  }
  23705
  23706  function detachFiberAfterEffects(fiber) {
  23707    var alternate = fiber.alternate;
  23708
  23709    if (alternate !== null) {
  23710      fiber.alternate = null;
  23711      detachFiberAfterEffects(alternate);
  23712    } // Note: Defensively using negation instead of < in case
  23713    // `deletedTreeCleanUpLevel` is undefined.
  23714
  23715
  23716    {
  23717      // Clear cyclical Fiber fields. This level alone is designed to roughly
  23718      // approximate the planned Fiber refactor. In that world, `setState` will be
  23719      // bound to a special "instance" object instead of a Fiber. The Instance
  23720      // object will not have any of these fields. It will only be connected to
  23721      // the fiber tree via a single link at the root. So if this level alone is
  23722      // sufficient to fix memory issues, that bodes well for our plans.
  23723      fiber.child = null;
  23724      fiber.deletions = null;
  23725      fiber.sibling = null; // The `stateNode` is cyclical because on host nodes it points to the host
  23726      // tree, which has its own pointers to children, parents, and siblings.
  23727      // The other host nodes also point back to fibers, so we should detach that
  23728      // one, too.
  23729
  23730      if (fiber.tag === HostComponent) {
  23731        var hostInstance = fiber.stateNode;
  23732
  23733        if (hostInstance !== null) {
  23734          detachDeletedInstance(hostInstance);
  23735        }
  23736      }
  23737
  23738      fiber.stateNode = null; // I'm intentionally not clearing the `return` field in this level. We
  23739      // already disconnect the `return` pointer at the root of the deleted
  23740      // subtree (in `detachFiberMutation`). Besides, `return` by itself is not
  23741      // cyclical — it's only cyclical when combined with `child`, `sibling`, and
  23742      // `alternate`. But we'll clear it in the next level anyway, just in case.
  23743
  23744      {
  23745        fiber._debugOwner = null;
  23746      }
  23747
  23748      {
  23749        // Theoretically, nothing in here should be necessary, because we already
  23750        // disconnected the fiber from the tree. So even if something leaks this
  23751        // particular fiber, it won't leak anything else
  23752        //
  23753        // The purpose of this branch is to be super aggressive so we can measure
  23754        // if there's any difference in memory impact. If there is, that could
  23755        // indicate a React leak we don't know about.
  23756        fiber.return = null;
  23757        fiber.dependencies = null;
  23758        fiber.memoizedProps = null;
  23759        fiber.memoizedState = null;
  23760        fiber.pendingProps = null;
  23761        fiber.stateNode = null; // TODO: Move to `commitPassiveUnmountInsideDeletedTreeOnFiber` instead.
  23762
  23763        fiber.updateQueue = null;
  23764      }
  23765    }
  23766  }
  23767
  23768  function getHostParentFiber(fiber) {
  23769    var parent = fiber.return;
  23770
  23771    while (parent !== null) {
  23772      if (isHostParent(parent)) {
  23773        return parent;
  23774      }
  23775
  23776      parent = parent.return;
  23777    }
  23778
  23779    throw new Error('Expected to find a host parent. This error is likely caused by a bug ' + 'in React. Please file an issue.');
  23780  }
  23781
  23782  function isHostParent(fiber) {
  23783    return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;
  23784  }
  23785
  23786  function getHostSibling(fiber) {
  23787    // We're going to search forward into the tree until we find a sibling host
  23788    // node. Unfortunately, if multiple insertions are done in a row we have to
  23789    // search past them. This leads to exponential search for the next sibling.
  23790    // TODO: Find a more efficient way to do this.
  23791    var node = fiber;
  23792
  23793    siblings: while (true) {
  23794      // If we didn't find anything, let's try the next sibling.
  23795      while (node.sibling === null) {
  23796        if (node.return === null || isHostParent(node.return)) {
  23797          // If we pop out of the root or hit the parent the fiber we are the
  23798          // last sibling.
  23799          return null;
  23800        }
  23801
  23802        node = node.return;
  23803      }
  23804
  23805      node.sibling.return = node.return;
  23806      node = node.sibling;
  23807
  23808      while (node.tag !== HostComponent && node.tag !== HostText && node.tag !== DehydratedFragment) {
  23809        // If it is not host node and, we might have a host node inside it.
  23810        // Try to search down until we find one.
  23811        if (node.flags & Placement) {
  23812          // If we don't have a child, try the siblings instead.
  23813          continue siblings;
  23814        } // If we don't have a child, try the siblings instead.
  23815        // We also skip portals because they are not part of this host tree.
  23816
  23817
  23818        if (node.child === null || node.tag === HostPortal) {
  23819          continue siblings;
  23820        } else {
  23821          node.child.return = node;
  23822          node = node.child;
  23823        }
  23824      } // Check if this host node is stable or about to be placed.
  23825
  23826
  23827      if (!(node.flags & Placement)) {
  23828        // Found it!
  23829        return node.stateNode;
  23830      }
  23831    }
  23832  }
  23833
  23834  function commitPlacement(finishedWork) {
  23835
  23836
  23837    var parentFiber = getHostParentFiber(finishedWork); // Note: these two variables *must* always be updated together.
  23838
  23839    switch (parentFiber.tag) {
  23840      case HostComponent:
  23841        {
  23842          var parent = parentFiber.stateNode;
  23843
  23844          if (parentFiber.flags & ContentReset) {
  23845            // Reset the text content of the parent before doing any insertions
  23846            resetTextContent(parent); // Clear ContentReset from the effect tag
  23847
  23848            parentFiber.flags &= ~ContentReset;
  23849          }
  23850
  23851          var before = getHostSibling(finishedWork); // We only have the top Fiber that was inserted but we need to recurse down its
  23852          // children to find all the terminal nodes.
  23853
  23854          insertOrAppendPlacementNode(finishedWork, before, parent);
  23855          break;
  23856        }
  23857
  23858      case HostRoot:
  23859      case HostPortal:
  23860        {
  23861          var _parent = parentFiber.stateNode.containerInfo;
  23862
  23863          var _before = getHostSibling(finishedWork);
  23864
  23865          insertOrAppendPlacementNodeIntoContainer(finishedWork, _before, _parent);
  23866          break;
  23867        }
  23868      // eslint-disable-next-line-no-fallthrough
  23869
  23870      default:
  23871        throw new Error('Invalid host parent fiber. This error is likely caused by a bug ' + 'in React. Please file an issue.');
  23872    }
  23873  }
  23874
  23875  function insertOrAppendPlacementNodeIntoContainer(node, before, parent) {
  23876    var tag = node.tag;
  23877    var isHost = tag === HostComponent || tag === HostText;
  23878
  23879    if (isHost) {
  23880      var stateNode = node.stateNode;
  23881
  23882      if (before) {
  23883        insertInContainerBefore(parent, stateNode, before);
  23884      } else {
  23885        appendChildToContainer(parent, stateNode);
  23886      }
  23887    } else if (tag === HostPortal) ; else {
  23888      var child = node.child;
  23889
  23890      if (child !== null) {
  23891        insertOrAppendPlacementNodeIntoContainer(child, before, parent);
  23892        var sibling = child.sibling;
  23893
  23894        while (sibling !== null) {
  23895          insertOrAppendPlacementNodeIntoContainer(sibling, before, parent);
  23896          sibling = sibling.sibling;
  23897        }
  23898      }
  23899    }
  23900  }
  23901
  23902  function insertOrAppendPlacementNode(node, before, parent) {
  23903    var tag = node.tag;
  23904    var isHost = tag === HostComponent || tag === HostText;
  23905
  23906    if (isHost) {
  23907      var stateNode = node.stateNode;
  23908
  23909      if (before) {
  23910        insertBefore(parent, stateNode, before);
  23911      } else {
  23912        appendChild(parent, stateNode);
  23913      }
  23914    } else if (tag === HostPortal) ; else {
  23915      var child = node.child;
  23916
  23917      if (child !== null) {
  23918        insertOrAppendPlacementNode(child, before, parent);
  23919        var sibling = child.sibling;
  23920
  23921        while (sibling !== null) {
  23922          insertOrAppendPlacementNode(sibling, before, parent);
  23923          sibling = sibling.sibling;
  23924        }
  23925      }
  23926    }
  23927  } // These are tracked on the stack as we recursively traverse a
  23928  // deleted subtree.
  23929  // TODO: Update these during the whole mutation phase, not just during
  23930  // a deletion.
  23931
  23932
  23933  var hostParent = null;
  23934  var hostParentIsContainer = false;
  23935
  23936  function commitDeletionEffects(root, returnFiber, deletedFiber) {
  23937    {
  23938      // We only have the top Fiber that was deleted but we need to recurse down its
  23939      // children to find all the terminal nodes.
  23940      // Recursively delete all host nodes from the parent, detach refs, clean
  23941      // up mounted layout effects, and call componentWillUnmount.
  23942      // We only need to remove the topmost host child in each branch. But then we
  23943      // still need to keep traversing to unmount effects, refs, and cWU. TODO: We
  23944      // could split this into two separate traversals functions, where the second
  23945      // one doesn't include any removeChild logic. This is maybe the same
  23946      // function as "disappearLayoutEffects" (or whatever that turns into after
  23947      // the layout phase is refactored to use recursion).
  23948      // Before starting, find the nearest host parent on the stack so we know
  23949      // which instance/container to remove the children from.
  23950      // TODO: Instead of searching up the fiber return path on every deletion, we
  23951      // can track the nearest host component on the JS stack as we traverse the
  23952      // tree during the commit phase. This would make insertions faster, too.
  23953      var parent = returnFiber;
  23954
  23955      findParent: while (parent !== null) {
  23956        switch (parent.tag) {
  23957          case HostComponent:
  23958            {
  23959              hostParent = parent.stateNode;
  23960              hostParentIsContainer = false;
  23961              break findParent;
  23962            }
  23963
  23964          case HostRoot:
  23965            {
  23966              hostParent = parent.stateNode.containerInfo;
  23967              hostParentIsContainer = true;
  23968              break findParent;
  23969            }
  23970
  23971          case HostPortal:
  23972            {
  23973              hostParent = parent.stateNode.containerInfo;
  23974              hostParentIsContainer = true;
  23975              break findParent;
  23976            }
  23977        }
  23978
  23979        parent = parent.return;
  23980      }
  23981
  23982      if (hostParent === null) {
  23983        throw new Error('Expected to find a host parent. This error is likely caused by ' + 'a bug in React. Please file an issue.');
  23984      }
  23985
  23986      commitDeletionEffectsOnFiber(root, returnFiber, deletedFiber);
  23987      hostParent = null;
  23988      hostParentIsContainer = false;
  23989    }
  23990
  23991    detachFiberMutation(deletedFiber);
  23992  }
  23993
  23994  function recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, parent) {
  23995    // TODO: Use a static flag to skip trees that don't have unmount effects
  23996    var child = parent.child;
  23997
  23998    while (child !== null) {
  23999      commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, child);
  24000      child = child.sibling;
  24001    }
  24002  }
  24003
  24004  function commitDeletionEffectsOnFiber(finishedRoot, nearestMountedAncestor, deletedFiber) {
  24005    onCommitUnmount(deletedFiber); // The cases in this outer switch modify the stack before they traverse
  24006    // into their subtree. There are simpler cases in the inner switch
  24007    // that don't modify the stack.
  24008
  24009    switch (deletedFiber.tag) {
  24010      case HostComponent:
  24011        {
  24012          if (!offscreenSubtreeWasHidden) {
  24013            safelyDetachRef(deletedFiber, nearestMountedAncestor);
  24014          } // Intentional fallthrough to next branch
  24015
  24016        }
  24017      // eslint-disable-next-line-no-fallthrough
  24018
  24019      case HostText:
  24020        {
  24021          // We only need to remove the nearest host child. Set the host parent
  24022          // to `null` on the stack to indicate that nested children don't
  24023          // need to be removed.
  24024          {
  24025            var prevHostParent = hostParent;
  24026            var prevHostParentIsContainer = hostParentIsContainer;
  24027            hostParent = null;
  24028            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24029            hostParent = prevHostParent;
  24030            hostParentIsContainer = prevHostParentIsContainer;
  24031
  24032            if (hostParent !== null) {
  24033              // Now that all the child effects have unmounted, we can remove the
  24034              // node from the tree.
  24035              if (hostParentIsContainer) {
  24036                removeChildFromContainer(hostParent, deletedFiber.stateNode);
  24037              } else {
  24038                removeChild(hostParent, deletedFiber.stateNode);
  24039              }
  24040            }
  24041          }
  24042
  24043          return;
  24044        }
  24045
  24046      case DehydratedFragment:
  24047        {
  24048          // Delete the dehydrated suspense boundary and all of its content.
  24049
  24050
  24051          {
  24052            if (hostParent !== null) {
  24053              if (hostParentIsContainer) {
  24054                clearSuspenseBoundaryFromContainer(hostParent, deletedFiber.stateNode);
  24055              } else {
  24056                clearSuspenseBoundary(hostParent, deletedFiber.stateNode);
  24057              }
  24058            }
  24059          }
  24060
  24061          return;
  24062        }
  24063
  24064      case HostPortal:
  24065        {
  24066          {
  24067            // When we go into a portal, it becomes the parent to remove from.
  24068            var _prevHostParent = hostParent;
  24069            var _prevHostParentIsContainer = hostParentIsContainer;
  24070            hostParent = deletedFiber.stateNode.containerInfo;
  24071            hostParentIsContainer = true;
  24072            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24073            hostParent = _prevHostParent;
  24074            hostParentIsContainer = _prevHostParentIsContainer;
  24075          }
  24076
  24077          return;
  24078        }
  24079
  24080      case FunctionComponent:
  24081      case ForwardRef:
  24082      case MemoComponent:
  24083      case SimpleMemoComponent:
  24084        {
  24085          if (!offscreenSubtreeWasHidden) {
  24086            var updateQueue = deletedFiber.updateQueue;
  24087
  24088            if (updateQueue !== null) {
  24089              var lastEffect = updateQueue.lastEffect;
  24090
  24091              if (lastEffect !== null) {
  24092                var firstEffect = lastEffect.next;
  24093                var effect = firstEffect;
  24094
  24095                do {
  24096                  var _effect = effect,
  24097                      destroy = _effect.destroy,
  24098                      tag = _effect.tag;
  24099
  24100                  if (destroy !== undefined) {
  24101                    if ((tag & Insertion) !== NoFlags$1) {
  24102                      safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
  24103                    } else if ((tag & Layout) !== NoFlags$1) {
  24104                      {
  24105                        markComponentLayoutEffectUnmountStarted(deletedFiber);
  24106                      }
  24107
  24108                      if ( deletedFiber.mode & ProfileMode) {
  24109                        startLayoutEffectTimer();
  24110                        safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
  24111                        recordLayoutEffectDuration(deletedFiber);
  24112                      } else {
  24113                        safelyCallDestroy(deletedFiber, nearestMountedAncestor, destroy);
  24114                      }
  24115
  24116                      {
  24117                        markComponentLayoutEffectUnmountStopped();
  24118                      }
  24119                    }
  24120                  }
  24121
  24122                  effect = effect.next;
  24123                } while (effect !== firstEffect);
  24124              }
  24125            }
  24126          }
  24127
  24128          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24129          return;
  24130        }
  24131
  24132      case ClassComponent:
  24133        {
  24134          if (!offscreenSubtreeWasHidden) {
  24135            safelyDetachRef(deletedFiber, nearestMountedAncestor);
  24136            var instance = deletedFiber.stateNode;
  24137
  24138            if (typeof instance.componentWillUnmount === 'function') {
  24139              safelyCallComponentWillUnmount(deletedFiber, nearestMountedAncestor, instance);
  24140            }
  24141          }
  24142
  24143          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24144          return;
  24145        }
  24146
  24147      case ScopeComponent:
  24148        {
  24149
  24150          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24151          return;
  24152        }
  24153
  24154      case OffscreenComponent:
  24155        {
  24156          if ( // TODO: Remove this dead flag
  24157           deletedFiber.mode & ConcurrentMode) {
  24158            // If this offscreen component is hidden, we already unmounted it. Before
  24159            // deleting the children, track that it's already unmounted so that we
  24160            // don't attempt to unmount the effects again.
  24161            // TODO: If the tree is hidden, in most cases we should be able to skip
  24162            // over the nested children entirely. An exception is we haven't yet found
  24163            // the topmost host node to delete, which we already track on the stack.
  24164            // But the other case is portals, which need to be detached no matter how
  24165            // deeply they are nested. We should use a subtree flag to track whether a
  24166            // subtree includes a nested portal.
  24167            var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
  24168            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || deletedFiber.memoizedState !== null;
  24169            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24170            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
  24171          } else {
  24172            recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24173          }
  24174
  24175          break;
  24176        }
  24177
  24178      default:
  24179        {
  24180          recursivelyTraverseDeletionEffects(finishedRoot, nearestMountedAncestor, deletedFiber);
  24181          return;
  24182        }
  24183    }
  24184  }
  24185
  24186  function commitSuspenseCallback(finishedWork) {
  24187    // TODO: Move this to passive phase
  24188    var newState = finishedWork.memoizedState;
  24189  }
  24190
  24191  function commitSuspenseHydrationCallbacks(finishedRoot, finishedWork) {
  24192
  24193    var newState = finishedWork.memoizedState;
  24194
  24195    if (newState === null) {
  24196      var current = finishedWork.alternate;
  24197
  24198      if (current !== null) {
  24199        var prevState = current.memoizedState;
  24200
  24201        if (prevState !== null) {
  24202          var suspenseInstance = prevState.dehydrated;
  24203
  24204          if (suspenseInstance !== null) {
  24205            commitHydratedSuspenseInstance(suspenseInstance);
  24206          }
  24207        }
  24208      }
  24209    }
  24210  }
  24211
  24212  function attachSuspenseRetryListeners(finishedWork) {
  24213    // If this boundary just timed out, then it will have a set of wakeables.
  24214    // For each wakeable, attach a listener so that when it resolves, React
  24215    // attempts to re-render the boundary in the primary (pre-timeout) state.
  24216    var wakeables = finishedWork.updateQueue;
  24217
  24218    if (wakeables !== null) {
  24219      finishedWork.updateQueue = null;
  24220      var retryCache = finishedWork.stateNode;
  24221
  24222      if (retryCache === null) {
  24223        retryCache = finishedWork.stateNode = new PossiblyWeakSet();
  24224      }
  24225
  24226      wakeables.forEach(function (wakeable) {
  24227        // Memoize using the boundary fiber to prevent redundant listeners.
  24228        var retry = resolveRetryWakeable.bind(null, finishedWork, wakeable);
  24229
  24230        if (!retryCache.has(wakeable)) {
  24231          retryCache.add(wakeable);
  24232
  24233          {
  24234            if (isDevToolsPresent) {
  24235              if (inProgressLanes !== null && inProgressRoot !== null) {
  24236                // If we have pending work still, associate the original updaters with it.
  24237                restorePendingUpdaters(inProgressRoot, inProgressLanes);
  24238              } else {
  24239                throw Error('Expected finished root and lanes to be set. This is a bug in React.');
  24240              }
  24241            }
  24242          }
  24243
  24244          wakeable.then(retry, retry);
  24245        }
  24246      });
  24247    }
  24248  } // This function detects when a Suspense boundary goes from visible to hidden.
  24249  function commitMutationEffects(root, finishedWork, committedLanes) {
  24250    inProgressLanes = committedLanes;
  24251    inProgressRoot = root;
  24252    setCurrentFiber(finishedWork);
  24253    commitMutationEffectsOnFiber(finishedWork, root);
  24254    setCurrentFiber(finishedWork);
  24255    inProgressLanes = null;
  24256    inProgressRoot = null;
  24257  }
  24258
  24259  function recursivelyTraverseMutationEffects(root, parentFiber, lanes) {
  24260    // Deletions effects can be scheduled on any fiber type. They need to happen
  24261    // before the children effects hae fired.
  24262    var deletions = parentFiber.deletions;
  24263
  24264    if (deletions !== null) {
  24265      for (var i = 0; i < deletions.length; i++) {
  24266        var childToDelete = deletions[i];
  24267
  24268        try {
  24269          commitDeletionEffects(root, parentFiber, childToDelete);
  24270        } catch (error) {
  24271          captureCommitPhaseError(childToDelete, parentFiber, error);
  24272        }
  24273      }
  24274    }
  24275
  24276    var prevDebugFiber = getCurrentFiber();
  24277
  24278    if (parentFiber.subtreeFlags & MutationMask) {
  24279      var child = parentFiber.child;
  24280
  24281      while (child !== null) {
  24282        setCurrentFiber(child);
  24283        commitMutationEffectsOnFiber(child, root);
  24284        child = child.sibling;
  24285      }
  24286    }
  24287
  24288    setCurrentFiber(prevDebugFiber);
  24289  }
  24290
  24291  function commitMutationEffectsOnFiber(finishedWork, root, lanes) {
  24292    var current = finishedWork.alternate;
  24293    var flags = finishedWork.flags; // The effect flag should be checked *after* we refine the type of fiber,
  24294    // because the fiber tag is more specific. An exception is any flag related
  24295    // to reconcilation, because those can be set on all fiber types.
  24296
  24297    switch (finishedWork.tag) {
  24298      case FunctionComponent:
  24299      case ForwardRef:
  24300      case MemoComponent:
  24301      case SimpleMemoComponent:
  24302        {
  24303          recursivelyTraverseMutationEffects(root, finishedWork);
  24304          commitReconciliationEffects(finishedWork);
  24305
  24306          if (flags & Update) {
  24307            try {
  24308              commitHookEffectListUnmount(Insertion | HasEffect, finishedWork, finishedWork.return);
  24309              commitHookEffectListMount(Insertion | HasEffect, finishedWork);
  24310            } catch (error) {
  24311              captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24312            } // Layout effects are destroyed during the mutation phase so that all
  24313            // destroy functions for all fibers are called before any create functions.
  24314            // This prevents sibling component effects from interfering with each other,
  24315            // e.g. a destroy function in one component should never override a ref set
  24316            // by a create function in another component during the same commit.
  24317
  24318
  24319            if ( finishedWork.mode & ProfileMode) {
  24320              try {
  24321                startLayoutEffectTimer();
  24322                commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
  24323              } catch (error) {
  24324                captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24325              }
  24326
  24327              recordLayoutEffectDuration(finishedWork);
  24328            } else {
  24329              try {
  24330                commitHookEffectListUnmount(Layout | HasEffect, finishedWork, finishedWork.return);
  24331              } catch (error) {
  24332                captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24333              }
  24334            }
  24335          }
  24336
  24337          return;
  24338        }
  24339
  24340      case ClassComponent:
  24341        {
  24342          recursivelyTraverseMutationEffects(root, finishedWork);
  24343          commitReconciliationEffects(finishedWork);
  24344
  24345          if (flags & Ref) {
  24346            if (current !== null) {
  24347              safelyDetachRef(current, current.return);
  24348            }
  24349          }
  24350
  24351          return;
  24352        }
  24353
  24354      case HostComponent:
  24355        {
  24356          recursivelyTraverseMutationEffects(root, finishedWork);
  24357          commitReconciliationEffects(finishedWork);
  24358
  24359          if (flags & Ref) {
  24360            if (current !== null) {
  24361              safelyDetachRef(current, current.return);
  24362            }
  24363          }
  24364
  24365          {
  24366            // TODO: ContentReset gets cleared by the children during the commit
  24367            // phase. This is a refactor hazard because it means we must read
  24368            // flags the flags after `commitReconciliationEffects` has already run;
  24369            // the order matters. We should refactor so that ContentReset does not
  24370            // rely on mutating the flag during commit. Like by setting a flag
  24371            // during the render phase instead.
  24372            if (finishedWork.flags & ContentReset) {
  24373              var instance = finishedWork.stateNode;
  24374
  24375              try {
  24376                resetTextContent(instance);
  24377              } catch (error) {
  24378                captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24379              }
  24380            }
  24381
  24382            if (flags & Update) {
  24383              var _instance4 = finishedWork.stateNode;
  24384
  24385              if (_instance4 != null) {
  24386                // Commit the work prepared earlier.
  24387                var newProps = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
  24388                // as the newProps. The updatePayload will contain the real change in
  24389                // this case.
  24390
  24391                var oldProps = current !== null ? current.memoizedProps : newProps;
  24392                var type = finishedWork.type; // TODO: Type the updateQueue to be specific to host components.
  24393
  24394                var updatePayload = finishedWork.updateQueue;
  24395                finishedWork.updateQueue = null;
  24396
  24397                if (updatePayload !== null) {
  24398                  try {
  24399                    commitUpdate(_instance4, updatePayload, type, oldProps, newProps, finishedWork);
  24400                  } catch (error) {
  24401                    captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24402                  }
  24403                }
  24404              }
  24405            }
  24406          }
  24407
  24408          return;
  24409        }
  24410
  24411      case HostText:
  24412        {
  24413          recursivelyTraverseMutationEffects(root, finishedWork);
  24414          commitReconciliationEffects(finishedWork);
  24415
  24416          if (flags & Update) {
  24417            {
  24418              if (finishedWork.stateNode === null) {
  24419                throw new Error('This should have a text node initialized. This error is likely ' + 'caused by a bug in React. Please file an issue.');
  24420              }
  24421
  24422              var textInstance = finishedWork.stateNode;
  24423              var newText = finishedWork.memoizedProps; // For hydration we reuse the update path but we treat the oldProps
  24424              // as the newProps. The updatePayload will contain the real change in
  24425              // this case.
  24426
  24427              var oldText = current !== null ? current.memoizedProps : newText;
  24428
  24429              try {
  24430                commitTextUpdate(textInstance, oldText, newText);
  24431              } catch (error) {
  24432                captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24433              }
  24434            }
  24435          }
  24436
  24437          return;
  24438        }
  24439
  24440      case HostRoot:
  24441        {
  24442          recursivelyTraverseMutationEffects(root, finishedWork);
  24443          commitReconciliationEffects(finishedWork);
  24444
  24445          if (flags & Update) {
  24446            {
  24447              if (current !== null) {
  24448                var prevRootState = current.memoizedState;
  24449
  24450                if (prevRootState.isDehydrated) {
  24451                  try {
  24452                    commitHydratedContainer(root.containerInfo);
  24453                  } catch (error) {
  24454                    captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24455                  }
  24456                }
  24457              }
  24458            }
  24459          }
  24460
  24461          return;
  24462        }
  24463
  24464      case HostPortal:
  24465        {
  24466          recursivelyTraverseMutationEffects(root, finishedWork);
  24467          commitReconciliationEffects(finishedWork);
  24468
  24469          return;
  24470        }
  24471
  24472      case SuspenseComponent:
  24473        {
  24474          recursivelyTraverseMutationEffects(root, finishedWork);
  24475          commitReconciliationEffects(finishedWork);
  24476          var offscreenFiber = finishedWork.child;
  24477
  24478          if (offscreenFiber.flags & Visibility) {
  24479            var offscreenInstance = offscreenFiber.stateNode;
  24480            var newState = offscreenFiber.memoizedState;
  24481            var isHidden = newState !== null; // Track the current state on the Offscreen instance so we can
  24482            // read it during an event
  24483
  24484            offscreenInstance.isHidden = isHidden;
  24485
  24486            if (isHidden) {
  24487              var wasHidden = offscreenFiber.alternate !== null && offscreenFiber.alternate.memoizedState !== null;
  24488
  24489              if (!wasHidden) {
  24490                // TODO: Move to passive phase
  24491                markCommitTimeOfFallback();
  24492              }
  24493            }
  24494          }
  24495
  24496          if (flags & Update) {
  24497            try {
  24498              commitSuspenseCallback(finishedWork);
  24499            } catch (error) {
  24500              captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24501            }
  24502
  24503            attachSuspenseRetryListeners(finishedWork);
  24504          }
  24505
  24506          return;
  24507        }
  24508
  24509      case OffscreenComponent:
  24510        {
  24511          var _wasHidden = current !== null && current.memoizedState !== null;
  24512
  24513          if ( // TODO: Remove this dead flag
  24514           finishedWork.mode & ConcurrentMode) {
  24515            // Before committing the children, track on the stack whether this
  24516            // offscreen subtree was already hidden, so that we don't unmount the
  24517            // effects again.
  24518            var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden;
  24519            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden || _wasHidden;
  24520            recursivelyTraverseMutationEffects(root, finishedWork);
  24521            offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
  24522          } else {
  24523            recursivelyTraverseMutationEffects(root, finishedWork);
  24524          }
  24525
  24526          commitReconciliationEffects(finishedWork);
  24527
  24528          if (flags & Visibility) {
  24529            var _offscreenInstance = finishedWork.stateNode;
  24530            var _newState = finishedWork.memoizedState;
  24531
  24532            var _isHidden = _newState !== null;
  24533
  24534            var offscreenBoundary = finishedWork; // Track the current state on the Offscreen instance so we can
  24535            // read it during an event
  24536
  24537            _offscreenInstance.isHidden = _isHidden;
  24538
  24539            {
  24540              if (_isHidden) {
  24541                if (!_wasHidden) {
  24542                  if ((offscreenBoundary.mode & ConcurrentMode) !== NoMode) {
  24543                    nextEffect = offscreenBoundary;
  24544                    var offscreenChild = offscreenBoundary.child;
  24545
  24546                    while (offscreenChild !== null) {
  24547                      nextEffect = offscreenChild;
  24548                      disappearLayoutEffects_begin(offscreenChild);
  24549                      offscreenChild = offscreenChild.sibling;
  24550                    }
  24551                  }
  24552                }
  24553              }
  24554            }
  24555
  24556            {
  24557              // TODO: This needs to run whenever there's an insertion or update
  24558              // inside a hidden Offscreen tree.
  24559              hideOrUnhideAllChildren(offscreenBoundary, _isHidden);
  24560            }
  24561          }
  24562
  24563          return;
  24564        }
  24565
  24566      case SuspenseListComponent:
  24567        {
  24568          recursivelyTraverseMutationEffects(root, finishedWork);
  24569          commitReconciliationEffects(finishedWork);
  24570
  24571          if (flags & Update) {
  24572            attachSuspenseRetryListeners(finishedWork);
  24573          }
  24574
  24575          return;
  24576        }
  24577
  24578      case ScopeComponent:
  24579        {
  24580
  24581          return;
  24582        }
  24583
  24584      default:
  24585        {
  24586          recursivelyTraverseMutationEffects(root, finishedWork);
  24587          commitReconciliationEffects(finishedWork);
  24588          return;
  24589        }
  24590    }
  24591  }
  24592
  24593  function commitReconciliationEffects(finishedWork) {
  24594    // Placement effects (insertions, reorders) can be scheduled on any fiber
  24595    // type. They needs to happen after the children effects have fired, but
  24596    // before the effects on this fiber have fired.
  24597    var flags = finishedWork.flags;
  24598
  24599    if (flags & Placement) {
  24600      try {
  24601        commitPlacement(finishedWork);
  24602      } catch (error) {
  24603        captureCommitPhaseError(finishedWork, finishedWork.return, error);
  24604      } // Clear the "placement" from effect tag so that we know that this is
  24605      // inserted, before any life-cycles like componentDidMount gets called.
  24606      // TODO: findDOMNode doesn't rely on this any more but isMounted does
  24607      // and isMounted is deprecated anyway so we should be able to kill this.
  24608
  24609
  24610      finishedWork.flags &= ~Placement;
  24611    }
  24612
  24613    if (flags & Hydrating) {
  24614      finishedWork.flags &= ~Hydrating;
  24615    }
  24616  }
  24617
  24618  function commitLayoutEffects(finishedWork, root, committedLanes) {
  24619    inProgressLanes = committedLanes;
  24620    inProgressRoot = root;
  24621    nextEffect = finishedWork;
  24622    commitLayoutEffects_begin(finishedWork, root, committedLanes);
  24623    inProgressLanes = null;
  24624    inProgressRoot = null;
  24625  }
  24626
  24627  function commitLayoutEffects_begin(subtreeRoot, root, committedLanes) {
  24628    // Suspense layout effects semantics don't change for legacy roots.
  24629    var isModernRoot = (subtreeRoot.mode & ConcurrentMode) !== NoMode;
  24630
  24631    while (nextEffect !== null) {
  24632      var fiber = nextEffect;
  24633      var firstChild = fiber.child;
  24634
  24635      if ( fiber.tag === OffscreenComponent && isModernRoot) {
  24636        // Keep track of the current Offscreen stack's state.
  24637        var isHidden = fiber.memoizedState !== null;
  24638        var newOffscreenSubtreeIsHidden = isHidden || offscreenSubtreeIsHidden;
  24639
  24640        if (newOffscreenSubtreeIsHidden) {
  24641          // The Offscreen tree is hidden. Skip over its layout effects.
  24642          commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
  24643          continue;
  24644        } else {
  24645          // TODO (Offscreen) Also check: subtreeFlags & LayoutMask
  24646          var current = fiber.alternate;
  24647          var wasHidden = current !== null && current.memoizedState !== null;
  24648          var newOffscreenSubtreeWasHidden = wasHidden || offscreenSubtreeWasHidden;
  24649          var prevOffscreenSubtreeIsHidden = offscreenSubtreeIsHidden;
  24650          var prevOffscreenSubtreeWasHidden = offscreenSubtreeWasHidden; // Traverse the Offscreen subtree with the current Offscreen as the root.
  24651
  24652          offscreenSubtreeIsHidden = newOffscreenSubtreeIsHidden;
  24653          offscreenSubtreeWasHidden = newOffscreenSubtreeWasHidden;
  24654
  24655          if (offscreenSubtreeWasHidden && !prevOffscreenSubtreeWasHidden) {
  24656            // This is the root of a reappearing boundary. Turn its layout effects
  24657            // back on.
  24658            nextEffect = fiber;
  24659            reappearLayoutEffects_begin(fiber);
  24660          }
  24661
  24662          var child = firstChild;
  24663
  24664          while (child !== null) {
  24665            nextEffect = child;
  24666            commitLayoutEffects_begin(child, // New root; bubble back up to here and stop.
  24667            root, committedLanes);
  24668            child = child.sibling;
  24669          } // Restore Offscreen state and resume in our-progress traversal.
  24670
  24671
  24672          nextEffect = fiber;
  24673          offscreenSubtreeIsHidden = prevOffscreenSubtreeIsHidden;
  24674          offscreenSubtreeWasHidden = prevOffscreenSubtreeWasHidden;
  24675          commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
  24676          continue;
  24677        }
  24678      }
  24679
  24680      if ((fiber.subtreeFlags & LayoutMask) !== NoFlags && firstChild !== null) {
  24681        firstChild.return = fiber;
  24682        nextEffect = firstChild;
  24683      } else {
  24684        commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes);
  24685      }
  24686    }
  24687  }
  24688
  24689  function commitLayoutMountEffects_complete(subtreeRoot, root, committedLanes) {
  24690    while (nextEffect !== null) {
  24691      var fiber = nextEffect;
  24692
  24693      if ((fiber.flags & LayoutMask) !== NoFlags) {
  24694        var current = fiber.alternate;
  24695        setCurrentFiber(fiber);
  24696
  24697        try {
  24698          commitLayoutEffectOnFiber(root, current, fiber, committedLanes);
  24699        } catch (error) {
  24700          captureCommitPhaseError(fiber, fiber.return, error);
  24701        }
  24702
  24703        resetCurrentFiber();
  24704      }
  24705
  24706      if (fiber === subtreeRoot) {
  24707        nextEffect = null;
  24708        return;
  24709      }
  24710
  24711      var sibling = fiber.sibling;
  24712
  24713      if (sibling !== null) {
  24714        sibling.return = fiber.return;
  24715        nextEffect = sibling;
  24716        return;
  24717      }
  24718
  24719      nextEffect = fiber.return;
  24720    }
  24721  }
  24722
  24723  function disappearLayoutEffects_begin(subtreeRoot) {
  24724    while (nextEffect !== null) {
  24725      var fiber = nextEffect;
  24726      var firstChild = fiber.child; // TODO (Offscreen) Check: flags & (RefStatic | LayoutStatic)
  24727
  24728      switch (fiber.tag) {
  24729        case FunctionComponent:
  24730        case ForwardRef:
  24731        case MemoComponent:
  24732        case SimpleMemoComponent:
  24733          {
  24734            if ( fiber.mode & ProfileMode) {
  24735              try {
  24736                startLayoutEffectTimer();
  24737                commitHookEffectListUnmount(Layout, fiber, fiber.return);
  24738              } finally {
  24739                recordLayoutEffectDuration(fiber);
  24740              }
  24741            } else {
  24742              commitHookEffectListUnmount(Layout, fiber, fiber.return);
  24743            }
  24744
  24745            break;
  24746          }
  24747
  24748        case ClassComponent:
  24749          {
  24750            // TODO (Offscreen) Check: flags & RefStatic
  24751            safelyDetachRef(fiber, fiber.return);
  24752            var instance = fiber.stateNode;
  24753
  24754            if (typeof instance.componentWillUnmount === 'function') {
  24755              safelyCallComponentWillUnmount(fiber, fiber.return, instance);
  24756            }
  24757
  24758            break;
  24759          }
  24760
  24761        case HostComponent:
  24762          {
  24763            safelyDetachRef(fiber, fiber.return);
  24764            break;
  24765          }
  24766
  24767        case OffscreenComponent:
  24768          {
  24769            // Check if this is a
  24770            var isHidden = fiber.memoizedState !== null;
  24771
  24772            if (isHidden) {
  24773              // Nested Offscreen tree is already hidden. Don't disappear
  24774              // its effects.
  24775              disappearLayoutEffects_complete(subtreeRoot);
  24776              continue;
  24777            }
  24778
  24779            break;
  24780          }
  24781      } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
  24782
  24783
  24784      if (firstChild !== null) {
  24785        firstChild.return = fiber;
  24786        nextEffect = firstChild;
  24787      } else {
  24788        disappearLayoutEffects_complete(subtreeRoot);
  24789      }
  24790    }
  24791  }
  24792
  24793  function disappearLayoutEffects_complete(subtreeRoot) {
  24794    while (nextEffect !== null) {
  24795      var fiber = nextEffect;
  24796
  24797      if (fiber === subtreeRoot) {
  24798        nextEffect = null;
  24799        return;
  24800      }
  24801
  24802      var sibling = fiber.sibling;
  24803
  24804      if (sibling !== null) {
  24805        sibling.return = fiber.return;
  24806        nextEffect = sibling;
  24807        return;
  24808      }
  24809
  24810      nextEffect = fiber.return;
  24811    }
  24812  }
  24813
  24814  function reappearLayoutEffects_begin(subtreeRoot) {
  24815    while (nextEffect !== null) {
  24816      var fiber = nextEffect;
  24817      var firstChild = fiber.child;
  24818
  24819      if (fiber.tag === OffscreenComponent) {
  24820        var isHidden = fiber.memoizedState !== null;
  24821
  24822        if (isHidden) {
  24823          // Nested Offscreen tree is still hidden. Don't re-appear its effects.
  24824          reappearLayoutEffects_complete(subtreeRoot);
  24825          continue;
  24826        }
  24827      } // TODO (Offscreen) Check: subtreeFlags & LayoutStatic
  24828
  24829
  24830      if (firstChild !== null) {
  24831        // This node may have been reused from a previous render, so we can't
  24832        // assume its return pointer is correct.
  24833        firstChild.return = fiber;
  24834        nextEffect = firstChild;
  24835      } else {
  24836        reappearLayoutEffects_complete(subtreeRoot);
  24837      }
  24838    }
  24839  }
  24840
  24841  function reappearLayoutEffects_complete(subtreeRoot) {
  24842    while (nextEffect !== null) {
  24843      var fiber = nextEffect; // TODO (Offscreen) Check: flags & LayoutStatic
  24844
  24845      setCurrentFiber(fiber);
  24846
  24847      try {
  24848        reappearLayoutEffectsOnFiber(fiber);
  24849      } catch (error) {
  24850        captureCommitPhaseError(fiber, fiber.return, error);
  24851      }
  24852
  24853      resetCurrentFiber();
  24854
  24855      if (fiber === subtreeRoot) {
  24856        nextEffect = null;
  24857        return;
  24858      }
  24859
  24860      var sibling = fiber.sibling;
  24861
  24862      if (sibling !== null) {
  24863        // This node may have been reused from a previous render, so we can't
  24864        // assume its return pointer is correct.
  24865        sibling.return = fiber.return;
  24866        nextEffect = sibling;
  24867        return;
  24868      }
  24869
  24870      nextEffect = fiber.return;
  24871    }
  24872  }
  24873
  24874  function commitPassiveMountEffects(root, finishedWork, committedLanes, committedTransitions) {
  24875    nextEffect = finishedWork;
  24876    commitPassiveMountEffects_begin(finishedWork, root, committedLanes, committedTransitions);
  24877  }
  24878
  24879  function commitPassiveMountEffects_begin(subtreeRoot, root, committedLanes, committedTransitions) {
  24880    while (nextEffect !== null) {
  24881      var fiber = nextEffect;
  24882      var firstChild = fiber.child;
  24883
  24884      if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && firstChild !== null) {
  24885        firstChild.return = fiber;
  24886        nextEffect = firstChild;
  24887      } else {
  24888        commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions);
  24889      }
  24890    }
  24891  }
  24892
  24893  function commitPassiveMountEffects_complete(subtreeRoot, root, committedLanes, committedTransitions) {
  24894    while (nextEffect !== null) {
  24895      var fiber = nextEffect;
  24896
  24897      if ((fiber.flags & Passive) !== NoFlags) {
  24898        setCurrentFiber(fiber);
  24899
  24900        try {
  24901          commitPassiveMountOnFiber(root, fiber, committedLanes, committedTransitions);
  24902        } catch (error) {
  24903          captureCommitPhaseError(fiber, fiber.return, error);
  24904        }
  24905
  24906        resetCurrentFiber();
  24907      }
  24908
  24909      if (fiber === subtreeRoot) {
  24910        nextEffect = null;
  24911        return;
  24912      }
  24913
  24914      var sibling = fiber.sibling;
  24915
  24916      if (sibling !== null) {
  24917        sibling.return = fiber.return;
  24918        nextEffect = sibling;
  24919        return;
  24920      }
  24921
  24922      nextEffect = fiber.return;
  24923    }
  24924  }
  24925
  24926  function commitPassiveMountOnFiber(finishedRoot, finishedWork, committedLanes, committedTransitions) {
  24927    switch (finishedWork.tag) {
  24928      case FunctionComponent:
  24929      case ForwardRef:
  24930      case SimpleMemoComponent:
  24931        {
  24932          if ( finishedWork.mode & ProfileMode) {
  24933            startPassiveEffectTimer();
  24934
  24935            try {
  24936              commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
  24937            } finally {
  24938              recordPassiveEffectDuration(finishedWork);
  24939            }
  24940          } else {
  24941            commitHookEffectListMount(Passive$1 | HasEffect, finishedWork);
  24942          }
  24943
  24944          break;
  24945        }
  24946    }
  24947  }
  24948
  24949  function commitPassiveUnmountEffects(firstChild) {
  24950    nextEffect = firstChild;
  24951    commitPassiveUnmountEffects_begin();
  24952  }
  24953
  24954  function commitPassiveUnmountEffects_begin() {
  24955    while (nextEffect !== null) {
  24956      var fiber = nextEffect;
  24957      var child = fiber.child;
  24958
  24959      if ((nextEffect.flags & ChildDeletion) !== NoFlags) {
  24960        var deletions = fiber.deletions;
  24961
  24962        if (deletions !== null) {
  24963          for (var i = 0; i < deletions.length; i++) {
  24964            var fiberToDelete = deletions[i];
  24965            nextEffect = fiberToDelete;
  24966            commitPassiveUnmountEffectsInsideOfDeletedTree_begin(fiberToDelete, fiber);
  24967          }
  24968
  24969          {
  24970            // A fiber was deleted from this parent fiber, but it's still part of
  24971            // the previous (alternate) parent fiber's list of children. Because
  24972            // children are a linked list, an earlier sibling that's still alive
  24973            // will be connected to the deleted fiber via its `alternate`:
  24974            //
  24975            //   live fiber
  24976            //   --alternate--> previous live fiber
  24977            //   --sibling--> deleted fiber
  24978            //
  24979            // We can't disconnect `alternate` on nodes that haven't been deleted
  24980            // yet, but we can disconnect the `sibling` and `child` pointers.
  24981            var previousFiber = fiber.alternate;
  24982
  24983            if (previousFiber !== null) {
  24984              var detachedChild = previousFiber.child;
  24985
  24986              if (detachedChild !== null) {
  24987                previousFiber.child = null;
  24988
  24989                do {
  24990                  var detachedSibling = detachedChild.sibling;
  24991                  detachedChild.sibling = null;
  24992                  detachedChild = detachedSibling;
  24993                } while (detachedChild !== null);
  24994              }
  24995            }
  24996          }
  24997
  24998          nextEffect = fiber;
  24999        }
  25000      }
  25001
  25002      if ((fiber.subtreeFlags & PassiveMask) !== NoFlags && child !== null) {
  25003        child.return = fiber;
  25004        nextEffect = child;
  25005      } else {
  25006        commitPassiveUnmountEffects_complete();
  25007      }
  25008    }
  25009  }
  25010
  25011  function commitPassiveUnmountEffects_complete() {
  25012    while (nextEffect !== null) {
  25013      var fiber = nextEffect;
  25014
  25015      if ((fiber.flags & Passive) !== NoFlags) {
  25016        setCurrentFiber(fiber);
  25017        commitPassiveUnmountOnFiber(fiber);
  25018        resetCurrentFiber();
  25019      }
  25020
  25021      var sibling = fiber.sibling;
  25022
  25023      if (sibling !== null) {
  25024        sibling.return = fiber.return;
  25025        nextEffect = sibling;
  25026        return;
  25027      }
  25028
  25029      nextEffect = fiber.return;
  25030    }
  25031  }
  25032
  25033  function commitPassiveUnmountOnFiber(finishedWork) {
  25034    switch (finishedWork.tag) {
  25035      case FunctionComponent:
  25036      case ForwardRef:
  25037      case SimpleMemoComponent:
  25038        {
  25039          if ( finishedWork.mode & ProfileMode) {
  25040            startPassiveEffectTimer();
  25041            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
  25042            recordPassiveEffectDuration(finishedWork);
  25043          } else {
  25044            commitHookEffectListUnmount(Passive$1 | HasEffect, finishedWork, finishedWork.return);
  25045          }
  25046
  25047          break;
  25048        }
  25049    }
  25050  }
  25051
  25052  function commitPassiveUnmountEffectsInsideOfDeletedTree_begin(deletedSubtreeRoot, nearestMountedAncestor) {
  25053    while (nextEffect !== null) {
  25054      var fiber = nextEffect; // Deletion effects fire in parent -> child order
  25055      // TODO: Check if fiber has a PassiveStatic flag
  25056
  25057      setCurrentFiber(fiber);
  25058      commitPassiveUnmountInsideDeletedTreeOnFiber(fiber, nearestMountedAncestor);
  25059      resetCurrentFiber();
  25060      var child = fiber.child; // TODO: Only traverse subtree if it has a PassiveStatic flag. (But, if we
  25061      // do this, still need to handle `deletedTreeCleanUpLevel` correctly.)
  25062
  25063      if (child !== null) {
  25064        child.return = fiber;
  25065        nextEffect = child;
  25066      } else {
  25067        commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot);
  25068      }
  25069    }
  25070  }
  25071
  25072  function commitPassiveUnmountEffectsInsideOfDeletedTree_complete(deletedSubtreeRoot) {
  25073    while (nextEffect !== null) {
  25074      var fiber = nextEffect;
  25075      var sibling = fiber.sibling;
  25076      var returnFiber = fiber.return;
  25077
  25078      {
  25079        // Recursively traverse the entire deleted tree and clean up fiber fields.
  25080        // This is more aggressive than ideal, and the long term goal is to only
  25081        // have to detach the deleted tree at the root.
  25082        detachFiberAfterEffects(fiber);
  25083
  25084        if (fiber === deletedSubtreeRoot) {
  25085          nextEffect = null;
  25086          return;
  25087        }
  25088      }
  25089
  25090      if (sibling !== null) {
  25091        sibling.return = returnFiber;
  25092        nextEffect = sibling;
  25093        return;
  25094      }
  25095
  25096      nextEffect = returnFiber;
  25097    }
  25098  }
  25099
  25100  function commitPassiveUnmountInsideDeletedTreeOnFiber(current, nearestMountedAncestor) {
  25101    switch (current.tag) {
  25102      case FunctionComponent:
  25103      case ForwardRef:
  25104      case SimpleMemoComponent:
  25105        {
  25106          if ( current.mode & ProfileMode) {
  25107            startPassiveEffectTimer();
  25108            commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
  25109            recordPassiveEffectDuration(current);
  25110          } else {
  25111            commitHookEffectListUnmount(Passive$1, current, nearestMountedAncestor);
  25112          }
  25113
  25114          break;
  25115        }
  25116    }
  25117  } // TODO: Reuse reappearLayoutEffects traversal here?
  25118
  25119
  25120  function invokeLayoutEffectMountInDEV(fiber) {
  25121    {
  25122      // We don't need to re-check StrictEffectsMode here.
  25123      // This function is only called if that check has already passed.
  25124      switch (fiber.tag) {
  25125        case FunctionComponent:
  25126        case ForwardRef:
  25127        case SimpleMemoComponent:
  25128          {
  25129            try {
  25130              commitHookEffectListMount(Layout | HasEffect, fiber);
  25131            } catch (error) {
  25132              captureCommitPhaseError(fiber, fiber.return, error);
  25133            }
  25134
  25135            break;
  25136          }
  25137
  25138        case ClassComponent:
  25139          {
  25140            var instance = fiber.stateNode;
  25141
  25142            try {
  25143              instance.componentDidMount();
  25144            } catch (error) {
  25145              captureCommitPhaseError(fiber, fiber.return, error);
  25146            }
  25147
  25148            break;
  25149          }
  25150      }
  25151    }
  25152  }
  25153
  25154  function invokePassiveEffectMountInDEV(fiber) {
  25155    {
  25156      // We don't need to re-check StrictEffectsMode here.
  25157      // This function is only called if that check has already passed.
  25158      switch (fiber.tag) {
  25159        case FunctionComponent:
  25160        case ForwardRef:
  25161        case SimpleMemoComponent:
  25162          {
  25163            try {
  25164              commitHookEffectListMount(Passive$1 | HasEffect, fiber);
  25165            } catch (error) {
  25166              captureCommitPhaseError(fiber, fiber.return, error);
  25167            }
  25168
  25169            break;
  25170          }
  25171      }
  25172    }
  25173  }
  25174
  25175  function invokeLayoutEffectUnmountInDEV(fiber) {
  25176    {
  25177      // We don't need to re-check StrictEffectsMode here.
  25178      // This function is only called if that check has already passed.
  25179      switch (fiber.tag) {
  25180        case FunctionComponent:
  25181        case ForwardRef:
  25182        case SimpleMemoComponent:
  25183          {
  25184            try {
  25185              commitHookEffectListUnmount(Layout | HasEffect, fiber, fiber.return);
  25186            } catch (error) {
  25187              captureCommitPhaseError(fiber, fiber.return, error);
  25188            }
  25189
  25190            break;
  25191          }
  25192
  25193        case ClassComponent:
  25194          {
  25195            var instance = fiber.stateNode;
  25196
  25197            if (typeof instance.componentWillUnmount === 'function') {
  25198              safelyCallComponentWillUnmount(fiber, fiber.return, instance);
  25199            }
  25200
  25201            break;
  25202          }
  25203      }
  25204    }
  25205  }
  25206
  25207  function invokePassiveEffectUnmountInDEV(fiber) {
  25208    {
  25209      // We don't need to re-check StrictEffectsMode here.
  25210      // This function is only called if that check has already passed.
  25211      switch (fiber.tag) {
  25212        case FunctionComponent:
  25213        case ForwardRef:
  25214        case SimpleMemoComponent:
  25215          {
  25216            try {
  25217              commitHookEffectListUnmount(Passive$1 | HasEffect, fiber, fiber.return);
  25218            } catch (error) {
  25219              captureCommitPhaseError(fiber, fiber.return, error);
  25220            }
  25221          }
  25222      }
  25223    }
  25224  }
  25225
  25226  var COMPONENT_TYPE = 0;
  25227  var HAS_PSEUDO_CLASS_TYPE = 1;
  25228  var ROLE_TYPE = 2;
  25229  var TEST_NAME_TYPE = 3;
  25230  var TEXT_TYPE = 4;
  25231
  25232  if (typeof Symbol === 'function' && Symbol.for) {
  25233    var symbolFor = Symbol.for;
  25234    COMPONENT_TYPE = symbolFor('selector.component');
  25235    HAS_PSEUDO_CLASS_TYPE = symbolFor('selector.has_pseudo_class');
  25236    ROLE_TYPE = symbolFor('selector.role');
  25237    TEST_NAME_TYPE = symbolFor('selector.test_id');
  25238    TEXT_TYPE = symbolFor('selector.text');
  25239  }
  25240  var commitHooks = [];
  25241  function onCommitRoot$1() {
  25242    {
  25243      commitHooks.forEach(function (commitHook) {
  25244        return commitHook();
  25245      });
  25246    }
  25247  }
  25248
  25249  var ReactCurrentActQueue = ReactSharedInternals.ReactCurrentActQueue;
  25250  function isLegacyActEnvironment(fiber) {
  25251    {
  25252      // Legacy mode. We preserve the behavior of React 17's act. It assumes an
  25253      // act environment whenever `jest` is defined, but you can still turn off
  25254      // spurious warnings by setting IS_REACT_ACT_ENVIRONMENT explicitly
  25255      // to false.
  25256      var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
  25257      typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined; // $FlowExpectedError - Flow doesn't know about jest
  25258
  25259      var jestIsDefined = typeof jest !== 'undefined';
  25260      return  jestIsDefined && isReactActEnvironmentGlobal !== false;
  25261    }
  25262  }
  25263  function isConcurrentActEnvironment() {
  25264    {
  25265      var isReactActEnvironmentGlobal = // $FlowExpectedError – Flow doesn't know about IS_REACT_ACT_ENVIRONMENT global
  25266      typeof IS_REACT_ACT_ENVIRONMENT !== 'undefined' ? IS_REACT_ACT_ENVIRONMENT : undefined;
  25267
  25268      if (!isReactActEnvironmentGlobal && ReactCurrentActQueue.current !== null) {
  25269        // TODO: Include link to relevant documentation page.
  25270        error('The current testing environment is not configured to support ' + 'act(...)');
  25271      }
  25272
  25273      return isReactActEnvironmentGlobal;
  25274    }
  25275  }
  25276
  25277  var ceil = Math.ceil;
  25278  var ReactCurrentDispatcher$2 = ReactSharedInternals.ReactCurrentDispatcher,
  25279      ReactCurrentOwner$2 = ReactSharedInternals.ReactCurrentOwner,
  25280      ReactCurrentBatchConfig$3 = ReactSharedInternals.ReactCurrentBatchConfig,
  25281      ReactCurrentActQueue$1 = ReactSharedInternals.ReactCurrentActQueue;
  25282  var NoContext =
  25283  /*             */
  25284  0;
  25285  var BatchedContext =
  25286  /*               */
  25287  1;
  25288  var RenderContext =
  25289  /*                */
  25290  2;
  25291  var CommitContext =
  25292  /*                */
  25293  4;
  25294  var RootInProgress = 0;
  25295  var RootFatalErrored = 1;
  25296  var RootErrored = 2;
  25297  var RootSuspended = 3;
  25298  var RootSuspendedWithDelay = 4;
  25299  var RootCompleted = 5;
  25300  var RootDidNotComplete = 6; // Describes where we are in the React execution stack
  25301
  25302  var executionContext = NoContext; // The root we're working on
  25303
  25304  var workInProgressRoot = null; // The fiber we're working on
  25305
  25306  var workInProgress = null; // The lanes we're rendering
  25307
  25308  var workInProgressRootRenderLanes = NoLanes; // Stack that allows components to change the render lanes for its subtree
  25309  // This is a superset of the lanes we started working on at the root. The only
  25310  // case where it's different from `workInProgressRootRenderLanes` is when we
  25311  // enter a subtree that is hidden and needs to be unhidden: Suspense and
  25312  // Offscreen component.
  25313  //
  25314  // Most things in the work loop should deal with workInProgressRootRenderLanes.
  25315  // Most things in begin/complete phases should deal with subtreeRenderLanes.
  25316
  25317  var subtreeRenderLanes = NoLanes;
  25318  var subtreeRenderLanesCursor = createCursor(NoLanes); // Whether to root completed, errored, suspended, etc.
  25319
  25320  var workInProgressRootExitStatus = RootInProgress; // A fatal error, if one is thrown
  25321
  25322  var workInProgressRootFatalError = null; // "Included" lanes refer to lanes that were worked on during this render. It's
  25323  // slightly different than `renderLanes` because `renderLanes` can change as you
  25324  // enter and exit an Offscreen tree. This value is the combination of all render
  25325  // lanes for the entire render phase.
  25326
  25327  var workInProgressRootIncludedLanes = NoLanes; // The work left over by components that were visited during this render. Only
  25328  // includes unprocessed updates, not work in bailed out children.
  25329
  25330  var workInProgressRootSkippedLanes = NoLanes; // Lanes that were updated (in an interleaved event) during this render.
  25331
  25332  var workInProgressRootInterleavedUpdatedLanes = NoLanes; // Lanes that were updated during the render phase (*not* an interleaved event).
  25333
  25334  var workInProgressRootPingedLanes = NoLanes; // Errors that are thrown during the render phase.
  25335
  25336  var workInProgressRootConcurrentErrors = null; // These are errors that we recovered from without surfacing them to the UI.
  25337  // We will log them once the tree commits.
  25338
  25339  var workInProgressRootRecoverableErrors = null; // The most recent time we committed a fallback. This lets us ensure a train
  25340  // model where we don't commit new loading states in too quick succession.
  25341
  25342  var globalMostRecentFallbackTime = 0;
  25343  var FALLBACK_THROTTLE_MS = 500; // The absolute time for when we should start giving up on rendering
  25344  // more and prefer CPU suspense heuristics instead.
  25345
  25346  var workInProgressRootRenderTargetTime = Infinity; // How long a render is supposed to take before we start following CPU
  25347  // suspense heuristics and opt out of rendering more content.
  25348
  25349  var RENDER_TIMEOUT_MS = 500;
  25350  var workInProgressTransitions = null;
  25351
  25352  function resetRenderTimer() {
  25353    workInProgressRootRenderTargetTime = now() + RENDER_TIMEOUT_MS;
  25354  }
  25355
  25356  function getRenderTargetTime() {
  25357    return workInProgressRootRenderTargetTime;
  25358  }
  25359  var hasUncaughtError = false;
  25360  var firstUncaughtError = null;
  25361  var legacyErrorBoundariesThatAlreadyFailed = null; // Only used when enableProfilerNestedUpdateScheduledHook is true;
  25362  var rootDoesHavePassiveEffects = false;
  25363  var rootWithPendingPassiveEffects = null;
  25364  var pendingPassiveEffectsLanes = NoLanes;
  25365  var pendingPassiveProfilerEffects = [];
  25366  var pendingPassiveTransitions = null; // Use these to prevent an infinite loop of nested updates
  25367
  25368  var NESTED_UPDATE_LIMIT = 50;
  25369  var nestedUpdateCount = 0;
  25370  var rootWithNestedUpdates = null;
  25371  var isFlushingPassiveEffects = false;
  25372  var didScheduleUpdateDuringPassiveEffects = false;
  25373  var NESTED_PASSIVE_UPDATE_LIMIT = 50;
  25374  var nestedPassiveUpdateCount = 0;
  25375  var rootWithPassiveNestedUpdates = null; // If two updates are scheduled within the same event, we should treat their
  25376  // event times as simultaneous, even if the actual clock time has advanced
  25377  // between the first and second call.
  25378
  25379  var currentEventTime = NoTimestamp;
  25380  var currentEventTransitionLane = NoLanes;
  25381  var isRunningInsertionEffect = false;
  25382  function getWorkInProgressRoot() {
  25383    return workInProgressRoot;
  25384  }
  25385  function requestEventTime() {
  25386    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
  25387      // We're inside React, so it's fine to read the actual time.
  25388      return now();
  25389    } // We're not inside React, so we may be in the middle of a browser event.
  25390
  25391
  25392    if (currentEventTime !== NoTimestamp) {
  25393      // Use the same start time for all updates until we enter React again.
  25394      return currentEventTime;
  25395    } // This is the first update since React yielded. Compute a new start time.
  25396
  25397
  25398    currentEventTime = now();
  25399    return currentEventTime;
  25400  }
  25401  function requestUpdateLane(fiber) {
  25402    // Special cases
  25403    var mode = fiber.mode;
  25404
  25405    if ((mode & ConcurrentMode) === NoMode) {
  25406      return SyncLane;
  25407    } else if ( (executionContext & RenderContext) !== NoContext && workInProgressRootRenderLanes !== NoLanes) {
  25408      // This is a render phase update. These are not officially supported. The
  25409      // old behavior is to give this the same "thread" (lanes) as
  25410      // whatever is currently rendering. So if you call `setState` on a component
  25411      // that happens later in the same render, it will flush. Ideally, we want to
  25412      // remove the special case and treat them as if they came from an
  25413      // interleaved event. Regardless, this pattern is not officially supported.
  25414      // This behavior is only a fallback. The flag only exists until we can roll
  25415      // out the setState warning, since existing code might accidentally rely on
  25416      // the current behavior.
  25417      return pickArbitraryLane(workInProgressRootRenderLanes);
  25418    }
  25419
  25420    var isTransition = requestCurrentTransition() !== NoTransition;
  25421
  25422    if (isTransition) {
  25423      if ( ReactCurrentBatchConfig$3.transition !== null) {
  25424        var transition = ReactCurrentBatchConfig$3.transition;
  25425
  25426        if (!transition._updatedFibers) {
  25427          transition._updatedFibers = new Set();
  25428        }
  25429
  25430        transition._updatedFibers.add(fiber);
  25431      } // The algorithm for assigning an update to a lane should be stable for all
  25432      // updates at the same priority within the same event. To do this, the
  25433      // inputs to the algorithm must be the same.
  25434      //
  25435      // The trick we use is to cache the first of each of these inputs within an
  25436      // event. Then reset the cached values once we can be sure the event is
  25437      // over. Our heuristic for that is whenever we enter a concurrent work loop.
  25438
  25439
  25440      if (currentEventTransitionLane === NoLane) {
  25441        // All transitions within the same event are assigned the same lane.
  25442        currentEventTransitionLane = claimNextTransitionLane();
  25443      }
  25444
  25445      return currentEventTransitionLane;
  25446    } // Updates originating inside certain React methods, like flushSync, have
  25447    // their priority set by tracking it with a context variable.
  25448    //
  25449    // The opaque type returned by the host config is internally a lane, so we can
  25450    // use that directly.
  25451    // TODO: Move this type conversion to the event priority module.
  25452
  25453
  25454    var updateLane = getCurrentUpdatePriority();
  25455
  25456    if (updateLane !== NoLane) {
  25457      return updateLane;
  25458    } // This update originated outside React. Ask the host environment for an
  25459    // appropriate priority, based on the type of event.
  25460    //
  25461    // The opaque type returned by the host config is internally a lane, so we can
  25462    // use that directly.
  25463    // TODO: Move this type conversion to the event priority module.
  25464
  25465
  25466    var eventLane = getCurrentEventPriority();
  25467    return eventLane;
  25468  }
  25469
  25470  function requestRetryLane(fiber) {
  25471    // This is a fork of `requestUpdateLane` designed specifically for Suspense
  25472    // "retries" — a special update that attempts to flip a Suspense boundary
  25473    // from its placeholder state to its primary/resolved state.
  25474    // Special cases
  25475    var mode = fiber.mode;
  25476
  25477    if ((mode & ConcurrentMode) === NoMode) {
  25478      return SyncLane;
  25479    }
  25480
  25481    return claimNextRetryLane();
  25482  }
  25483
  25484  function scheduleUpdateOnFiber(root, fiber, lane, eventTime) {
  25485    checkForNestedUpdates();
  25486
  25487    {
  25488      if (isRunningInsertionEffect) {
  25489        error('useInsertionEffect must not schedule updates.');
  25490      }
  25491    }
  25492
  25493    {
  25494      if (isFlushingPassiveEffects) {
  25495        didScheduleUpdateDuringPassiveEffects = true;
  25496      }
  25497    } // Mark that the root has a pending update.
  25498
  25499
  25500    markRootUpdated(root, lane, eventTime);
  25501
  25502    if ((executionContext & RenderContext) !== NoLanes && root === workInProgressRoot) {
  25503      // This update was dispatched during the render phase. This is a mistake
  25504      // if the update originates from user space (with the exception of local
  25505      // hook updates, which are handled differently and don't reach this
  25506      // function), but there are some internal React features that use this as
  25507      // an implementation detail, like selective hydration.
  25508      warnAboutRenderPhaseUpdatesInDEV(fiber); // Track lanes that were updated during the render phase
  25509    } else {
  25510      // This is a normal update, scheduled from outside the render phase. For
  25511      // example, during an input event.
  25512      {
  25513        if (isDevToolsPresent) {
  25514          addFiberToLanesMap(root, fiber, lane);
  25515        }
  25516      }
  25517
  25518      warnIfUpdatesNotWrappedWithActDEV(fiber);
  25519
  25520      if (root === workInProgressRoot) {
  25521        // Received an update to a tree that's in the middle of rendering. Mark
  25522        // that there was an interleaved update work on this root. Unless the
  25523        // `deferRenderPhaseUpdateToNextBatch` flag is off and this is a render
  25524        // phase update. In that case, we don't treat render phase updates as if
  25525        // they were interleaved, for backwards compat reasons.
  25526        if ( (executionContext & RenderContext) === NoContext) {
  25527          workInProgressRootInterleavedUpdatedLanes = mergeLanes(workInProgressRootInterleavedUpdatedLanes, lane);
  25528        }
  25529
  25530        if (workInProgressRootExitStatus === RootSuspendedWithDelay) {
  25531          // The root already suspended with a delay, which means this render
  25532          // definitely won't finish. Since we have a new update, let's mark it as
  25533          // suspended now, right before marking the incoming update. This has the
  25534          // effect of interrupting the current render and switching to the update.
  25535          // TODO: Make sure this doesn't override pings that happen while we've
  25536          // already started rendering.
  25537          markRootSuspended$1(root, workInProgressRootRenderLanes);
  25538        }
  25539      }
  25540
  25541      ensureRootIsScheduled(root, eventTime);
  25542
  25543      if (lane === SyncLane && executionContext === NoContext && (fiber.mode & ConcurrentMode) === NoMode && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
  25544      !( ReactCurrentActQueue$1.isBatchingLegacy)) {
  25545        // Flush the synchronous work now, unless we're already working or inside
  25546        // a batch. This is intentionally inside scheduleUpdateOnFiber instead of
  25547        // scheduleCallbackForFiber to preserve the ability to schedule a callback
  25548        // without immediately flushing it. We only do this for user-initiated
  25549        // updates, to preserve historical behavior of legacy mode.
  25550        resetRenderTimer();
  25551        flushSyncCallbacksOnlyInLegacyMode();
  25552      }
  25553    }
  25554  }
  25555  function scheduleInitialHydrationOnRoot(root, lane, eventTime) {
  25556    // This is a special fork of scheduleUpdateOnFiber that is only used to
  25557    // schedule the initial hydration of a root that has just been created. Most
  25558    // of the stuff in scheduleUpdateOnFiber can be skipped.
  25559    //
  25560    // The main reason for this separate path, though, is to distinguish the
  25561    // initial children from subsequent updates. In fully client-rendered roots
  25562    // (createRoot instead of hydrateRoot), all top-level renders are modeled as
  25563    // updates, but hydration roots are special because the initial render must
  25564    // match what was rendered on the server.
  25565    var current = root.current;
  25566    current.lanes = lane;
  25567    markRootUpdated(root, lane, eventTime);
  25568    ensureRootIsScheduled(root, eventTime);
  25569  }
  25570  function isUnsafeClassRenderPhaseUpdate(fiber) {
  25571    // Check if this is a render phase update. Only called by class components,
  25572    // which special (deprecated) behavior for UNSAFE_componentWillReceive props.
  25573    return (// TODO: Remove outdated deferRenderPhaseUpdateToNextBatch experiment. We
  25574      // decided not to enable it.
  25575       (executionContext & RenderContext) !== NoContext
  25576    );
  25577  } // Use this function to schedule a task for a root. There's only one task per
  25578  // root; if a task was already scheduled, we'll check to make sure the priority
  25579  // of the existing task is the same as the priority of the next level that the
  25580  // root has work on. This function is called on every update, and right before
  25581  // exiting a task.
  25582
  25583  function ensureRootIsScheduled(root, currentTime) {
  25584    var existingCallbackNode = root.callbackNode; // Check if any lanes are being starved by other work. If so, mark them as
  25585    // expired so we know to work on those next.
  25586
  25587    markStarvedLanesAsExpired(root, currentTime); // Determine the next lanes to work on, and their priority.
  25588
  25589    var nextLanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
  25590
  25591    if (nextLanes === NoLanes) {
  25592      // Special case: There's nothing to work on.
  25593      if (existingCallbackNode !== null) {
  25594        cancelCallback$1(existingCallbackNode);
  25595      }
  25596
  25597      root.callbackNode = null;
  25598      root.callbackPriority = NoLane;
  25599      return;
  25600    } // We use the highest priority lane to represent the priority of the callback.
  25601
  25602
  25603    var newCallbackPriority = getHighestPriorityLane(nextLanes); // Check if there's an existing task. We may be able to reuse it.
  25604
  25605    var existingCallbackPriority = root.callbackPriority;
  25606
  25607    if (existingCallbackPriority === newCallbackPriority && // Special case related to `act`. If the currently scheduled task is a
  25608    // Scheduler task, rather than an `act` task, cancel it and re-scheduled
  25609    // on the `act` queue.
  25610    !( ReactCurrentActQueue$1.current !== null && existingCallbackNode !== fakeActCallbackNode)) {
  25611      {
  25612        // If we're going to re-use an existing task, it needs to exist.
  25613        // Assume that discrete update microtasks are non-cancellable and null.
  25614        // TODO: Temporary until we confirm this warning is not fired.
  25615        if (existingCallbackNode == null && existingCallbackPriority !== SyncLane) {
  25616          error('Expected scheduled callback to exist. This error is likely caused by a bug in React. Please file an issue.');
  25617        }
  25618      } // The priority hasn't changed. We can reuse the existing task. Exit.
  25619
  25620
  25621      return;
  25622    }
  25623
  25624    if (existingCallbackNode != null) {
  25625      // Cancel the existing callback. We'll schedule a new one below.
  25626      cancelCallback$1(existingCallbackNode);
  25627    } // Schedule a new callback.
  25628
  25629
  25630    var newCallbackNode;
  25631
  25632    if (newCallbackPriority === SyncLane) {
  25633      // Special case: Sync React callbacks are scheduled on a special
  25634      // internal queue
  25635      if (root.tag === LegacyRoot) {
  25636        if ( ReactCurrentActQueue$1.isBatchingLegacy !== null) {
  25637          ReactCurrentActQueue$1.didScheduleLegacyUpdate = true;
  25638        }
  25639
  25640        scheduleLegacySyncCallback(performSyncWorkOnRoot.bind(null, root));
  25641      } else {
  25642        scheduleSyncCallback(performSyncWorkOnRoot.bind(null, root));
  25643      }
  25644
  25645      {
  25646        // Flush the queue in a microtask.
  25647        if ( ReactCurrentActQueue$1.current !== null) {
  25648          // Inside `act`, use our internal `act` queue so that these get flushed
  25649          // at the end of the current scope even when using the sync version
  25650          // of `act`.
  25651          ReactCurrentActQueue$1.current.push(flushSyncCallbacks);
  25652        } else {
  25653          scheduleMicrotask(function () {
  25654            // In Safari, appending an iframe forces microtasks to run.
  25655            // https://github.com/facebook/react/issues/22459
  25656            // We don't support running callbacks in the middle of render
  25657            // or commit so we need to check against that.
  25658            if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
  25659              // Note that this would still prematurely flush the callbacks
  25660              // if this happens outside render or commit phase (e.g. in an event).
  25661              flushSyncCallbacks();
  25662            }
  25663          });
  25664        }
  25665      }
  25666
  25667      newCallbackNode = null;
  25668    } else {
  25669      var schedulerPriorityLevel;
  25670
  25671      switch (lanesToEventPriority(nextLanes)) {
  25672        case DiscreteEventPriority:
  25673          schedulerPriorityLevel = ImmediatePriority;
  25674          break;
  25675
  25676        case ContinuousEventPriority:
  25677          schedulerPriorityLevel = UserBlockingPriority;
  25678          break;
  25679
  25680        case DefaultEventPriority:
  25681          schedulerPriorityLevel = NormalPriority;
  25682          break;
  25683
  25684        case IdleEventPriority:
  25685          schedulerPriorityLevel = IdlePriority;
  25686          break;
  25687
  25688        default:
  25689          schedulerPriorityLevel = NormalPriority;
  25690          break;
  25691      }
  25692
  25693      newCallbackNode = scheduleCallback$1(schedulerPriorityLevel, performConcurrentWorkOnRoot.bind(null, root));
  25694    }
  25695
  25696    root.callbackPriority = newCallbackPriority;
  25697    root.callbackNode = newCallbackNode;
  25698  } // This is the entry point for every concurrent task, i.e. anything that
  25699  // goes through Scheduler.
  25700
  25701
  25702  function performConcurrentWorkOnRoot(root, didTimeout) {
  25703    {
  25704      resetNestedUpdateFlag();
  25705    } // Since we know we're in a React event, we can clear the current
  25706    // event time. The next update will compute a new event time.
  25707
  25708
  25709    currentEventTime = NoTimestamp;
  25710    currentEventTransitionLane = NoLanes;
  25711
  25712    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
  25713      throw new Error('Should not already be working.');
  25714    } // Flush any pending passive effects before deciding which lanes to work on,
  25715    // in case they schedule additional work.
  25716
  25717
  25718    var originalCallbackNode = root.callbackNode;
  25719    var didFlushPassiveEffects = flushPassiveEffects();
  25720
  25721    if (didFlushPassiveEffects) {
  25722      // Something in the passive effect phase may have canceled the current task.
  25723      // Check if the task node for this root was changed.
  25724      if (root.callbackNode !== originalCallbackNode) {
  25725        // The current task was canceled. Exit. We don't need to call
  25726        // `ensureRootIsScheduled` because the check above implies either that
  25727        // there's a new task, or that there's no remaining work on this root.
  25728        return null;
  25729      }
  25730    } // Determine the next lanes to work on, using the fields stored
  25731    // on the root.
  25732
  25733
  25734    var lanes = getNextLanes(root, root === workInProgressRoot ? workInProgressRootRenderLanes : NoLanes);
  25735
  25736    if (lanes === NoLanes) {
  25737      // Defensive coding. This is never expected to happen.
  25738      return null;
  25739    } // We disable time-slicing in some cases: if the work has been CPU-bound
  25740    // for too long ("expired" work, to prevent starvation), or we're in
  25741    // sync-updates-by-default mode.
  25742    // TODO: We only check `didTimeout` defensively, to account for a Scheduler
  25743    // bug we're still investigating. Once the bug in Scheduler is fixed,
  25744    // we can remove this, since we track expiration ourselves.
  25745
  25746
  25747    var shouldTimeSlice = !includesBlockingLane(root, lanes) && !includesExpiredLane(root, lanes) && ( !didTimeout);
  25748    var exitStatus = shouldTimeSlice ? renderRootConcurrent(root, lanes) : renderRootSync(root, lanes);
  25749
  25750    if (exitStatus !== RootInProgress) {
  25751      if (exitStatus === RootErrored) {
  25752        // If something threw an error, try rendering one more time. We'll
  25753        // render synchronously to block concurrent data mutations, and we'll
  25754        // includes all pending updates are included. If it still fails after
  25755        // the second attempt, we'll give up and commit the resulting tree.
  25756        var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
  25757
  25758        if (errorRetryLanes !== NoLanes) {
  25759          lanes = errorRetryLanes;
  25760          exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
  25761        }
  25762      }
  25763
  25764      if (exitStatus === RootFatalErrored) {
  25765        var fatalError = workInProgressRootFatalError;
  25766        prepareFreshStack(root, NoLanes);
  25767        markRootSuspended$1(root, lanes);
  25768        ensureRootIsScheduled(root, now());
  25769        throw fatalError;
  25770      }
  25771
  25772      if (exitStatus === RootDidNotComplete) {
  25773        // The render unwound without completing the tree. This happens in special
  25774        // cases where need to exit the current render without producing a
  25775        // consistent tree or committing.
  25776        //
  25777        // This should only happen during a concurrent render, not a discrete or
  25778        // synchronous update. We should have already checked for this when we
  25779        // unwound the stack.
  25780        markRootSuspended$1(root, lanes);
  25781      } else {
  25782        // The render completed.
  25783        // Check if this render may have yielded to a concurrent event, and if so,
  25784        // confirm that any newly rendered stores are consistent.
  25785        // TODO: It's possible that even a concurrent render may never have yielded
  25786        // to the main thread, if it was fast enough, or if it expired. We could
  25787        // skip the consistency check in that case, too.
  25788        var renderWasConcurrent = !includesBlockingLane(root, lanes);
  25789        var finishedWork = root.current.alternate;
  25790
  25791        if (renderWasConcurrent && !isRenderConsistentWithExternalStores(finishedWork)) {
  25792          // A store was mutated in an interleaved event. Render again,
  25793          // synchronously, to block further mutations.
  25794          exitStatus = renderRootSync(root, lanes); // We need to check again if something threw
  25795
  25796          if (exitStatus === RootErrored) {
  25797            var _errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
  25798
  25799            if (_errorRetryLanes !== NoLanes) {
  25800              lanes = _errorRetryLanes;
  25801              exitStatus = recoverFromConcurrentError(root, _errorRetryLanes); // We assume the tree is now consistent because we didn't yield to any
  25802              // concurrent events.
  25803            }
  25804          }
  25805
  25806          if (exitStatus === RootFatalErrored) {
  25807            var _fatalError = workInProgressRootFatalError;
  25808            prepareFreshStack(root, NoLanes);
  25809            markRootSuspended$1(root, lanes);
  25810            ensureRootIsScheduled(root, now());
  25811            throw _fatalError;
  25812          }
  25813        } // We now have a consistent tree. The next step is either to commit it,
  25814        // or, if something suspended, wait to commit it after a timeout.
  25815
  25816
  25817        root.finishedWork = finishedWork;
  25818        root.finishedLanes = lanes;
  25819        finishConcurrentRender(root, exitStatus, lanes);
  25820      }
  25821    }
  25822
  25823    ensureRootIsScheduled(root, now());
  25824
  25825    if (root.callbackNode === originalCallbackNode) {
  25826      // The task node scheduled for this root is the same one that's
  25827      // currently executed. Need to return a continuation.
  25828      return performConcurrentWorkOnRoot.bind(null, root);
  25829    }
  25830
  25831    return null;
  25832  }
  25833
  25834  function recoverFromConcurrentError(root, errorRetryLanes) {
  25835    // If an error occurred during hydration, discard server response and fall
  25836    // back to client side render.
  25837    // Before rendering again, save the errors from the previous attempt.
  25838    var errorsFromFirstAttempt = workInProgressRootConcurrentErrors;
  25839
  25840    if (isRootDehydrated(root)) {
  25841      // The shell failed to hydrate. Set a flag to force a client rendering
  25842      // during the next attempt. To do this, we call prepareFreshStack now
  25843      // to create the root work-in-progress fiber. This is a bit weird in terms
  25844      // of factoring, because it relies on renderRootSync not calling
  25845      // prepareFreshStack again in the call below, which happens because the
  25846      // root and lanes haven't changed.
  25847      //
  25848      // TODO: I think what we should do is set ForceClientRender inside
  25849      // throwException, like we do for nested Suspense boundaries. The reason
  25850      // it's here instead is so we can switch to the synchronous work loop, too.
  25851      // Something to consider for a future refactor.
  25852      var rootWorkInProgress = prepareFreshStack(root, errorRetryLanes);
  25853      rootWorkInProgress.flags |= ForceClientRender;
  25854
  25855      {
  25856        errorHydratingContainer(root.containerInfo);
  25857      }
  25858    }
  25859
  25860    var exitStatus = renderRootSync(root, errorRetryLanes);
  25861
  25862    if (exitStatus !== RootErrored) {
  25863      // Successfully finished rendering on retry
  25864      // The errors from the failed first attempt have been recovered. Add
  25865      // them to the collection of recoverable errors. We'll log them in the
  25866      // commit phase.
  25867      var errorsFromSecondAttempt = workInProgressRootRecoverableErrors;
  25868      workInProgressRootRecoverableErrors = errorsFromFirstAttempt; // The errors from the second attempt should be queued after the errors
  25869      // from the first attempt, to preserve the causal sequence.
  25870
  25871      if (errorsFromSecondAttempt !== null) {
  25872        queueRecoverableErrors(errorsFromSecondAttempt);
  25873      }
  25874    }
  25875
  25876    return exitStatus;
  25877  }
  25878
  25879  function queueRecoverableErrors(errors) {
  25880    if (workInProgressRootRecoverableErrors === null) {
  25881      workInProgressRootRecoverableErrors = errors;
  25882    } else {
  25883      workInProgressRootRecoverableErrors.push.apply(workInProgressRootRecoverableErrors, errors);
  25884    }
  25885  }
  25886
  25887  function finishConcurrentRender(root, exitStatus, lanes) {
  25888    switch (exitStatus) {
  25889      case RootInProgress:
  25890      case RootFatalErrored:
  25891        {
  25892          throw new Error('Root did not complete. This is a bug in React.');
  25893        }
  25894      // Flow knows about invariant, so it complains if I add a break
  25895      // statement, but eslint doesn't know about invariant, so it complains
  25896      // if I do. eslint-disable-next-line no-fallthrough
  25897
  25898      case RootErrored:
  25899        {
  25900          // We should have already attempted to retry this tree. If we reached
  25901          // this point, it errored again. Commit it.
  25902          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
  25903          break;
  25904        }
  25905
  25906      case RootSuspended:
  25907        {
  25908          markRootSuspended$1(root, lanes); // We have an acceptable loading state. We need to figure out if we
  25909          // should immediately commit it or wait a bit.
  25910
  25911          if (includesOnlyRetries(lanes) && // do not delay if we're inside an act() scope
  25912          !shouldForceFlushFallbacksInDEV()) {
  25913            // This render only included retries, no updates. Throttle committing
  25914            // retries so that we don't show too many loading states too quickly.
  25915            var msUntilTimeout = globalMostRecentFallbackTime + FALLBACK_THROTTLE_MS - now(); // Don't bother with a very short suspense time.
  25916
  25917            if (msUntilTimeout > 10) {
  25918              var nextLanes = getNextLanes(root, NoLanes);
  25919
  25920              if (nextLanes !== NoLanes) {
  25921                // There's additional work on this root.
  25922                break;
  25923              }
  25924
  25925              var suspendedLanes = root.suspendedLanes;
  25926
  25927              if (!isSubsetOfLanes(suspendedLanes, lanes)) {
  25928                // We should prefer to render the fallback of at the last
  25929                // suspended level. Ping the last suspended level to try
  25930                // rendering it again.
  25931                // FIXME: What if the suspended lanes are Idle? Should not restart.
  25932                var eventTime = requestEventTime();
  25933                markRootPinged(root, suspendedLanes);
  25934                break;
  25935              } // The render is suspended, it hasn't timed out, and there's no
  25936              // lower priority work to do. Instead of committing the fallback
  25937              // immediately, wait for more data to arrive.
  25938
  25939
  25940              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), msUntilTimeout);
  25941              break;
  25942            }
  25943          } // The work expired. Commit immediately.
  25944
  25945
  25946          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
  25947          break;
  25948        }
  25949
  25950      case RootSuspendedWithDelay:
  25951        {
  25952          markRootSuspended$1(root, lanes);
  25953
  25954          if (includesOnlyTransitions(lanes)) {
  25955            // This is a transition, so we should exit without committing a
  25956            // placeholder and without scheduling a timeout. Delay indefinitely
  25957            // until we receive more data.
  25958            break;
  25959          }
  25960
  25961          if (!shouldForceFlushFallbacksInDEV()) {
  25962            // This is not a transition, but we did trigger an avoided state.
  25963            // Schedule a placeholder to display after a short delay, using the Just
  25964            // Noticeable Difference.
  25965            // TODO: Is the JND optimization worth the added complexity? If this is
  25966            // the only reason we track the event time, then probably not.
  25967            // Consider removing.
  25968            var mostRecentEventTime = getMostRecentEventTime(root, lanes);
  25969            var eventTimeMs = mostRecentEventTime;
  25970            var timeElapsedMs = now() - eventTimeMs;
  25971
  25972            var _msUntilTimeout = jnd(timeElapsedMs) - timeElapsedMs; // Don't bother with a very short suspense time.
  25973
  25974
  25975            if (_msUntilTimeout > 10) {
  25976              // Instead of committing the fallback immediately, wait for more data
  25977              // to arrive.
  25978              root.timeoutHandle = scheduleTimeout(commitRoot.bind(null, root, workInProgressRootRecoverableErrors, workInProgressTransitions), _msUntilTimeout);
  25979              break;
  25980            }
  25981          } // Commit the placeholder.
  25982
  25983
  25984          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
  25985          break;
  25986        }
  25987
  25988      case RootCompleted:
  25989        {
  25990          // The work completed. Ready to commit.
  25991          commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions);
  25992          break;
  25993        }
  25994
  25995      default:
  25996        {
  25997          throw new Error('Unknown root exit status.');
  25998        }
  25999    }
  26000  }
  26001
  26002  function isRenderConsistentWithExternalStores(finishedWork) {
  26003    // Search the rendered tree for external store reads, and check whether the
  26004    // stores were mutated in a concurrent event. Intentionally using an iterative
  26005    // loop instead of recursion so we can exit early.
  26006    var node = finishedWork;
  26007
  26008    while (true) {
  26009      if (node.flags & StoreConsistency) {
  26010        var updateQueue = node.updateQueue;
  26011
  26012        if (updateQueue !== null) {
  26013          var checks = updateQueue.stores;
  26014
  26015          if (checks !== null) {
  26016            for (var i = 0; i < checks.length; i++) {
  26017              var check = checks[i];
  26018              var getSnapshot = check.getSnapshot;
  26019              var renderedValue = check.value;
  26020
  26021              try {
  26022                if (!objectIs(getSnapshot(), renderedValue)) {
  26023                  // Found an inconsistent store.
  26024                  return false;
  26025                }
  26026              } catch (error) {
  26027                // If `getSnapshot` throws, return `false`. This will schedule
  26028                // a re-render, and the error will be rethrown during render.
  26029                return false;
  26030              }
  26031            }
  26032          }
  26033        }
  26034      }
  26035
  26036      var child = node.child;
  26037
  26038      if (node.subtreeFlags & StoreConsistency && child !== null) {
  26039        child.return = node;
  26040        node = child;
  26041        continue;
  26042      }
  26043
  26044      if (node === finishedWork) {
  26045        return true;
  26046      }
  26047
  26048      while (node.sibling === null) {
  26049        if (node.return === null || node.return === finishedWork) {
  26050          return true;
  26051        }
  26052
  26053        node = node.return;
  26054      }
  26055
  26056      node.sibling.return = node.return;
  26057      node = node.sibling;
  26058    } // Flow doesn't know this is unreachable, but eslint does
  26059    // eslint-disable-next-line no-unreachable
  26060
  26061
  26062    return true;
  26063  }
  26064
  26065  function markRootSuspended$1(root, suspendedLanes) {
  26066    // When suspending, we should always exclude lanes that were pinged or (more
  26067    // rarely, since we try to avoid it) updated during the render phase.
  26068    // TODO: Lol maybe there's a better way to factor this besides this
  26069    // obnoxiously named function :)
  26070    suspendedLanes = removeLanes(suspendedLanes, workInProgressRootPingedLanes);
  26071    suspendedLanes = removeLanes(suspendedLanes, workInProgressRootInterleavedUpdatedLanes);
  26072    markRootSuspended(root, suspendedLanes);
  26073  } // This is the entry point for synchronous tasks that don't go
  26074  // through Scheduler
  26075
  26076
  26077  function performSyncWorkOnRoot(root) {
  26078    {
  26079      syncNestedUpdateFlag();
  26080    }
  26081
  26082    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
  26083      throw new Error('Should not already be working.');
  26084    }
  26085
  26086    flushPassiveEffects();
  26087    var lanes = getNextLanes(root, NoLanes);
  26088
  26089    if (!includesSomeLane(lanes, SyncLane)) {
  26090      // There's no remaining sync work left.
  26091      ensureRootIsScheduled(root, now());
  26092      return null;
  26093    }
  26094
  26095    var exitStatus = renderRootSync(root, lanes);
  26096
  26097    if (root.tag !== LegacyRoot && exitStatus === RootErrored) {
  26098      // If something threw an error, try rendering one more time. We'll render
  26099      // synchronously to block concurrent data mutations, and we'll includes
  26100      // all pending updates are included. If it still fails after the second
  26101      // attempt, we'll give up and commit the resulting tree.
  26102      var errorRetryLanes = getLanesToRetrySynchronouslyOnError(root);
  26103
  26104      if (errorRetryLanes !== NoLanes) {
  26105        lanes = errorRetryLanes;
  26106        exitStatus = recoverFromConcurrentError(root, errorRetryLanes);
  26107      }
  26108    }
  26109
  26110    if (exitStatus === RootFatalErrored) {
  26111      var fatalError = workInProgressRootFatalError;
  26112      prepareFreshStack(root, NoLanes);
  26113      markRootSuspended$1(root, lanes);
  26114      ensureRootIsScheduled(root, now());
  26115      throw fatalError;
  26116    }
  26117
  26118    if (exitStatus === RootDidNotComplete) {
  26119      throw new Error('Root did not complete. This is a bug in React.');
  26120    } // We now have a consistent tree. Because this is a sync render, we
  26121    // will commit it even if something suspended.
  26122
  26123
  26124    var finishedWork = root.current.alternate;
  26125    root.finishedWork = finishedWork;
  26126    root.finishedLanes = lanes;
  26127    commitRoot(root, workInProgressRootRecoverableErrors, workInProgressTransitions); // Before exiting, make sure there's a callback scheduled for the next
  26128    // pending level.
  26129
  26130    ensureRootIsScheduled(root, now());
  26131    return null;
  26132  }
  26133
  26134  function flushRoot(root, lanes) {
  26135    if (lanes !== NoLanes) {
  26136      markRootEntangled(root, mergeLanes(lanes, SyncLane));
  26137      ensureRootIsScheduled(root, now());
  26138
  26139      if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
  26140        resetRenderTimer();
  26141        flushSyncCallbacks();
  26142      }
  26143    }
  26144  }
  26145  function batchedUpdates$1(fn, a) {
  26146    var prevExecutionContext = executionContext;
  26147    executionContext |= BatchedContext;
  26148
  26149    try {
  26150      return fn(a);
  26151    } finally {
  26152      executionContext = prevExecutionContext; // If there were legacy sync updates, flush them at the end of the outer
  26153      // most batchedUpdates-like method.
  26154
  26155      if (executionContext === NoContext && // Treat `act` as if it's inside `batchedUpdates`, even in legacy mode.
  26156      !( ReactCurrentActQueue$1.isBatchingLegacy)) {
  26157        resetRenderTimer();
  26158        flushSyncCallbacksOnlyInLegacyMode();
  26159      }
  26160    }
  26161  }
  26162  function discreteUpdates(fn, a, b, c, d) {
  26163    var previousPriority = getCurrentUpdatePriority();
  26164    var prevTransition = ReactCurrentBatchConfig$3.transition;
  26165
  26166    try {
  26167      ReactCurrentBatchConfig$3.transition = null;
  26168      setCurrentUpdatePriority(DiscreteEventPriority);
  26169      return fn(a, b, c, d);
  26170    } finally {
  26171      setCurrentUpdatePriority(previousPriority);
  26172      ReactCurrentBatchConfig$3.transition = prevTransition;
  26173
  26174      if (executionContext === NoContext) {
  26175        resetRenderTimer();
  26176      }
  26177    }
  26178  } // Overload the definition to the two valid signatures.
  26179  // Warning, this opts-out of checking the function body.
  26180
  26181  // eslint-disable-next-line no-redeclare
  26182  function flushSync(fn) {
  26183    // In legacy mode, we flush pending passive effects at the beginning of the
  26184    // next event, not at the end of the previous one.
  26185    if (rootWithPendingPassiveEffects !== null && rootWithPendingPassiveEffects.tag === LegacyRoot && (executionContext & (RenderContext | CommitContext)) === NoContext) {
  26186      flushPassiveEffects();
  26187    }
  26188
  26189    var prevExecutionContext = executionContext;
  26190    executionContext |= BatchedContext;
  26191    var prevTransition = ReactCurrentBatchConfig$3.transition;
  26192    var previousPriority = getCurrentUpdatePriority();
  26193
  26194    try {
  26195      ReactCurrentBatchConfig$3.transition = null;
  26196      setCurrentUpdatePriority(DiscreteEventPriority);
  26197
  26198      if (fn) {
  26199        return fn();
  26200      } else {
  26201        return undefined;
  26202      }
  26203    } finally {
  26204      setCurrentUpdatePriority(previousPriority);
  26205      ReactCurrentBatchConfig$3.transition = prevTransition;
  26206      executionContext = prevExecutionContext; // Flush the immediate callbacks that were scheduled during this batch.
  26207      // Note that this will happen even if batchedUpdates is higher up
  26208      // the stack.
  26209
  26210      if ((executionContext & (RenderContext | CommitContext)) === NoContext) {
  26211        flushSyncCallbacks();
  26212      }
  26213    }
  26214  }
  26215  function isAlreadyRendering() {
  26216    // Used by the renderer to print a warning if certain APIs are called from
  26217    // the wrong context.
  26218    return  (executionContext & (RenderContext | CommitContext)) !== NoContext;
  26219  }
  26220  function pushRenderLanes(fiber, lanes) {
  26221    push(subtreeRenderLanesCursor, subtreeRenderLanes, fiber);
  26222    subtreeRenderLanes = mergeLanes(subtreeRenderLanes, lanes);
  26223    workInProgressRootIncludedLanes = mergeLanes(workInProgressRootIncludedLanes, lanes);
  26224  }
  26225  function popRenderLanes(fiber) {
  26226    subtreeRenderLanes = subtreeRenderLanesCursor.current;
  26227    pop(subtreeRenderLanesCursor, fiber);
  26228  }
  26229
  26230  function prepareFreshStack(root, lanes) {
  26231    root.finishedWork = null;
  26232    root.finishedLanes = NoLanes;
  26233    var timeoutHandle = root.timeoutHandle;
  26234
  26235    if (timeoutHandle !== noTimeout) {
  26236      // The root previous suspended and scheduled a timeout to commit a fallback
  26237      // state. Now that we have additional work, cancel the timeout.
  26238      root.timeoutHandle = noTimeout; // $FlowFixMe Complains noTimeout is not a TimeoutID, despite the check above
  26239
  26240      cancelTimeout(timeoutHandle);
  26241    }
  26242
  26243    if (workInProgress !== null) {
  26244      var interruptedWork = workInProgress.return;
  26245
  26246      while (interruptedWork !== null) {
  26247        var current = interruptedWork.alternate;
  26248        unwindInterruptedWork(current, interruptedWork);
  26249        interruptedWork = interruptedWork.return;
  26250      }
  26251    }
  26252
  26253    workInProgressRoot = root;
  26254    var rootWorkInProgress = createWorkInProgress(root.current, null);
  26255    workInProgress = rootWorkInProgress;
  26256    workInProgressRootRenderLanes = subtreeRenderLanes = workInProgressRootIncludedLanes = lanes;
  26257    workInProgressRootExitStatus = RootInProgress;
  26258    workInProgressRootFatalError = null;
  26259    workInProgressRootSkippedLanes = NoLanes;
  26260    workInProgressRootInterleavedUpdatedLanes = NoLanes;
  26261    workInProgressRootPingedLanes = NoLanes;
  26262    workInProgressRootConcurrentErrors = null;
  26263    workInProgressRootRecoverableErrors = null;
  26264    finishQueueingConcurrentUpdates();
  26265
  26266    {
  26267      ReactStrictModeWarnings.discardPendingWarnings();
  26268    }
  26269
  26270    return rootWorkInProgress;
  26271  }
  26272
  26273  function handleError(root, thrownValue) {
  26274    do {
  26275      var erroredWork = workInProgress;
  26276
  26277      try {
  26278        // Reset module-level state that was set during the render phase.
  26279        resetContextDependencies();
  26280        resetHooksAfterThrow();
  26281        resetCurrentFiber(); // TODO: I found and added this missing line while investigating a
  26282        // separate issue. Write a regression test using string refs.
  26283
  26284        ReactCurrentOwner$2.current = null;
  26285
  26286        if (erroredWork === null || erroredWork.return === null) {
  26287          // Expected to be working on a non-root fiber. This is a fatal error
  26288          // because there's no ancestor that can handle it; the root is
  26289          // supposed to capture all errors that weren't caught by an error
  26290          // boundary.
  26291          workInProgressRootExitStatus = RootFatalErrored;
  26292          workInProgressRootFatalError = thrownValue; // Set `workInProgress` to null. This represents advancing to the next
  26293          // sibling, or the parent if there are no siblings. But since the root
  26294          // has no siblings nor a parent, we set it to null. Usually this is
  26295          // handled by `completeUnitOfWork` or `unwindWork`, but since we're
  26296          // intentionally not calling those, we need set it here.
  26297          // TODO: Consider calling `unwindWork` to pop the contexts.
  26298
  26299          workInProgress = null;
  26300          return;
  26301        }
  26302
  26303        if (enableProfilerTimer && erroredWork.mode & ProfileMode) {
  26304          // Record the time spent rendering before an error was thrown. This
  26305          // avoids inaccurate Profiler durations in the case of a
  26306          // suspended render.
  26307          stopProfilerTimerIfRunningAndRecordDelta(erroredWork, true);
  26308        }
  26309
  26310        if (enableSchedulingProfiler) {
  26311          markComponentRenderStopped();
  26312
  26313          if (thrownValue !== null && typeof thrownValue === 'object' && typeof thrownValue.then === 'function') {
  26314            var wakeable = thrownValue;
  26315            markComponentSuspended(erroredWork, wakeable, workInProgressRootRenderLanes);
  26316          } else {
  26317            markComponentErrored(erroredWork, thrownValue, workInProgressRootRenderLanes);
  26318          }
  26319        }
  26320
  26321        throwException(root, erroredWork.return, erroredWork, thrownValue, workInProgressRootRenderLanes);
  26322        completeUnitOfWork(erroredWork);
  26323      } catch (yetAnotherThrownValue) {
  26324        // Something in the return path also threw.
  26325        thrownValue = yetAnotherThrownValue;
  26326
  26327        if (workInProgress === erroredWork && erroredWork !== null) {
  26328          // If this boundary has already errored, then we had trouble processing
  26329          // the error. Bubble it to the next boundary.
  26330          erroredWork = erroredWork.return;
  26331          workInProgress = erroredWork;
  26332        } else {
  26333          erroredWork = workInProgress;
  26334        }
  26335
  26336        continue;
  26337      } // Return to the normal work loop.
  26338
  26339
  26340      return;
  26341    } while (true);
  26342  }
  26343
  26344  function pushDispatcher() {
  26345    var prevDispatcher = ReactCurrentDispatcher$2.current;
  26346    ReactCurrentDispatcher$2.current = ContextOnlyDispatcher;
  26347
  26348    if (prevDispatcher === null) {
  26349      // The React isomorphic package does not include a default dispatcher.
  26350      // Instead the first renderer will lazily attach one, in order to give
  26351      // nicer error messages.
  26352      return ContextOnlyDispatcher;
  26353    } else {
  26354      return prevDispatcher;
  26355    }
  26356  }
  26357
  26358  function popDispatcher(prevDispatcher) {
  26359    ReactCurrentDispatcher$2.current = prevDispatcher;
  26360  }
  26361
  26362  function markCommitTimeOfFallback() {
  26363    globalMostRecentFallbackTime = now();
  26364  }
  26365  function markSkippedUpdateLanes(lane) {
  26366    workInProgressRootSkippedLanes = mergeLanes(lane, workInProgressRootSkippedLanes);
  26367  }
  26368  function renderDidSuspend() {
  26369    if (workInProgressRootExitStatus === RootInProgress) {
  26370      workInProgressRootExitStatus = RootSuspended;
  26371    }
  26372  }
  26373  function renderDidSuspendDelayIfPossible() {
  26374    if (workInProgressRootExitStatus === RootInProgress || workInProgressRootExitStatus === RootSuspended || workInProgressRootExitStatus === RootErrored) {
  26375      workInProgressRootExitStatus = RootSuspendedWithDelay;
  26376    } // Check if there are updates that we skipped tree that might have unblocked
  26377    // this render.
  26378
  26379
  26380    if (workInProgressRoot !== null && (includesNonIdleWork(workInProgressRootSkippedLanes) || includesNonIdleWork(workInProgressRootInterleavedUpdatedLanes))) {
  26381      // Mark the current render as suspended so that we switch to working on
  26382      // the updates that were skipped. Usually we only suspend at the end of
  26383      // the render phase.
  26384      // TODO: We should probably always mark the root as suspended immediately
  26385      // (inside this function), since by suspending at the end of the render
  26386      // phase introduces a potential mistake where we suspend lanes that were
  26387      // pinged or updated while we were rendering.
  26388      markRootSuspended$1(workInProgressRoot, workInProgressRootRenderLanes);
  26389    }
  26390  }
  26391  function renderDidError(error) {
  26392    if (workInProgressRootExitStatus !== RootSuspendedWithDelay) {
  26393      workInProgressRootExitStatus = RootErrored;
  26394    }
  26395
  26396    if (workInProgressRootConcurrentErrors === null) {
  26397      workInProgressRootConcurrentErrors = [error];
  26398    } else {
  26399      workInProgressRootConcurrentErrors.push(error);
  26400    }
  26401  } // Called during render to determine if anything has suspended.
  26402  // Returns false if we're not sure.
  26403
  26404  function renderHasNotSuspendedYet() {
  26405    // If something errored or completed, we can't really be sure,
  26406    // so those are false.
  26407    return workInProgressRootExitStatus === RootInProgress;
  26408  }
  26409
  26410  function renderRootSync(root, lanes) {
  26411    var prevExecutionContext = executionContext;
  26412    executionContext |= RenderContext;
  26413    var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
  26414    // and prepare a fresh one. Otherwise we'll continue where we left off.
  26415
  26416    if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
  26417      {
  26418        if (isDevToolsPresent) {
  26419          var memoizedUpdaters = root.memoizedUpdaters;
  26420
  26421          if (memoizedUpdaters.size > 0) {
  26422            restorePendingUpdaters(root, workInProgressRootRenderLanes);
  26423            memoizedUpdaters.clear();
  26424          } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
  26425          // If we bailout on this work, we'll move them back (like above).
  26426          // It's important to move them now in case the work spawns more work at the same priority with different updaters.
  26427          // That way we can keep the current update and future updates separate.
  26428
  26429
  26430          movePendingFibersToMemoized(root, lanes);
  26431        }
  26432      }
  26433
  26434      workInProgressTransitions = getTransitionsForLanes();
  26435      prepareFreshStack(root, lanes);
  26436    }
  26437
  26438    {
  26439      markRenderStarted(lanes);
  26440    }
  26441
  26442    do {
  26443      try {
  26444        workLoopSync();
  26445        break;
  26446      } catch (thrownValue) {
  26447        handleError(root, thrownValue);
  26448      }
  26449    } while (true);
  26450
  26451    resetContextDependencies();
  26452    executionContext = prevExecutionContext;
  26453    popDispatcher(prevDispatcher);
  26454
  26455    if (workInProgress !== null) {
  26456      // This is a sync render, so we should have finished the whole tree.
  26457      throw new Error('Cannot commit an incomplete root. This error is likely caused by a ' + 'bug in React. Please file an issue.');
  26458    }
  26459
  26460    {
  26461      markRenderStopped();
  26462    } // Set this to null to indicate there's no in-progress render.
  26463
  26464
  26465    workInProgressRoot = null;
  26466    workInProgressRootRenderLanes = NoLanes;
  26467    return workInProgressRootExitStatus;
  26468  } // The work loop is an extremely hot path. Tell Closure not to inline it.
  26469
  26470  /** @noinline */
  26471
  26472
  26473  function workLoopSync() {
  26474    // Already timed out, so perform work without checking if we need to yield.
  26475    while (workInProgress !== null) {
  26476      performUnitOfWork(workInProgress);
  26477    }
  26478  }
  26479
  26480  function renderRootConcurrent(root, lanes) {
  26481    var prevExecutionContext = executionContext;
  26482    executionContext |= RenderContext;
  26483    var prevDispatcher = pushDispatcher(); // If the root or lanes have changed, throw out the existing stack
  26484    // and prepare a fresh one. Otherwise we'll continue where we left off.
  26485
  26486    if (workInProgressRoot !== root || workInProgressRootRenderLanes !== lanes) {
  26487      {
  26488        if (isDevToolsPresent) {
  26489          var memoizedUpdaters = root.memoizedUpdaters;
  26490
  26491          if (memoizedUpdaters.size > 0) {
  26492            restorePendingUpdaters(root, workInProgressRootRenderLanes);
  26493            memoizedUpdaters.clear();
  26494          } // At this point, move Fibers that scheduled the upcoming work from the Map to the Set.
  26495          // If we bailout on this work, we'll move them back (like above).
  26496          // It's important to move them now in case the work spawns more work at the same priority with different updaters.
  26497          // That way we can keep the current update and future updates separate.
  26498
  26499
  26500          movePendingFibersToMemoized(root, lanes);
  26501        }
  26502      }
  26503
  26504      workInProgressTransitions = getTransitionsForLanes();
  26505      resetRenderTimer();
  26506      prepareFreshStack(root, lanes);
  26507    }
  26508
  26509    {
  26510      markRenderStarted(lanes);
  26511    }
  26512
  26513    do {
  26514      try {
  26515        workLoopConcurrent();
  26516        break;
  26517      } catch (thrownValue) {
  26518        handleError(root, thrownValue);
  26519      }
  26520    } while (true);
  26521
  26522    resetContextDependencies();
  26523    popDispatcher(prevDispatcher);
  26524    executionContext = prevExecutionContext;
  26525
  26526
  26527    if (workInProgress !== null) {
  26528      // Still work remaining.
  26529      {
  26530        markRenderYielded();
  26531      }
  26532
  26533      return RootInProgress;
  26534    } else {
  26535      // Completed the tree.
  26536      {
  26537        markRenderStopped();
  26538      } // Set this to null to indicate there's no in-progress render.
  26539
  26540
  26541      workInProgressRoot = null;
  26542      workInProgressRootRenderLanes = NoLanes; // Return the final exit status.
  26543
  26544      return workInProgressRootExitStatus;
  26545    }
  26546  }
  26547  /** @noinline */
  26548
  26549
  26550  function workLoopConcurrent() {
  26551    // Perform work until Scheduler asks us to yield
  26552    while (workInProgress !== null && !shouldYield()) {
  26553      performUnitOfWork(workInProgress);
  26554    }
  26555  }
  26556
  26557  function performUnitOfWork(unitOfWork) {
  26558    // The current, flushed, state of this fiber is the alternate. Ideally
  26559    // nothing should rely on this, but relying on it here means that we don't
  26560    // need an additional field on the work in progress.
  26561    var current = unitOfWork.alternate;
  26562    setCurrentFiber(unitOfWork);
  26563    var next;
  26564
  26565    if ( (unitOfWork.mode & ProfileMode) !== NoMode) {
  26566      startProfilerTimer(unitOfWork);
  26567      next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
  26568      stopProfilerTimerIfRunningAndRecordDelta(unitOfWork, true);
  26569    } else {
  26570      next = beginWork$1(current, unitOfWork, subtreeRenderLanes);
  26571    }
  26572
  26573    resetCurrentFiber();
  26574    unitOfWork.memoizedProps = unitOfWork.pendingProps;
  26575
  26576    if (next === null) {
  26577      // If this doesn't spawn new work, complete the current work.
  26578      completeUnitOfWork(unitOfWork);
  26579    } else {
  26580      workInProgress = next;
  26581    }
  26582
  26583    ReactCurrentOwner$2.current = null;
  26584  }
  26585
  26586  function completeUnitOfWork(unitOfWork) {
  26587    // Attempt to complete the current unit of work, then move to the next
  26588    // sibling. If there are no more siblings, return to the parent fiber.
  26589    var completedWork = unitOfWork;
  26590
  26591    do {
  26592      // The current, flushed, state of this fiber is the alternate. Ideally
  26593      // nothing should rely on this, but relying on it here means that we don't
  26594      // need an additional field on the work in progress.
  26595      var current = completedWork.alternate;
  26596      var returnFiber = completedWork.return; // Check if the work completed or if something threw.
  26597
  26598      if ((completedWork.flags & Incomplete) === NoFlags) {
  26599        setCurrentFiber(completedWork);
  26600        var next = void 0;
  26601
  26602        if ( (completedWork.mode & ProfileMode) === NoMode) {
  26603          next = completeWork(current, completedWork, subtreeRenderLanes);
  26604        } else {
  26605          startProfilerTimer(completedWork);
  26606          next = completeWork(current, completedWork, subtreeRenderLanes); // Update render duration assuming we didn't error.
  26607
  26608          stopProfilerTimerIfRunningAndRecordDelta(completedWork, false);
  26609        }
  26610
  26611        resetCurrentFiber();
  26612
  26613        if (next !== null) {
  26614          // Completing this fiber spawned new work. Work on that next.
  26615          workInProgress = next;
  26616          return;
  26617        }
  26618      } else {
  26619        // This fiber did not complete because something threw. Pop values off
  26620        // the stack without entering the complete phase. If this is a boundary,
  26621        // capture values if possible.
  26622        var _next = unwindWork(current, completedWork); // Because this fiber did not complete, don't reset its lanes.
  26623
  26624
  26625        if (_next !== null) {
  26626          // If completing this work spawned new work, do that next. We'll come
  26627          // back here again.
  26628          // Since we're restarting, remove anything that is not a host effect
  26629          // from the effect tag.
  26630          _next.flags &= HostEffectMask;
  26631          workInProgress = _next;
  26632          return;
  26633        }
  26634
  26635        if ( (completedWork.mode & ProfileMode) !== NoMode) {
  26636          // Record the render duration for the fiber that errored.
  26637          stopProfilerTimerIfRunningAndRecordDelta(completedWork, false); // Include the time spent working on failed children before continuing.
  26638
  26639          var actualDuration = completedWork.actualDuration;
  26640          var child = completedWork.child;
  26641
  26642          while (child !== null) {
  26643            actualDuration += child.actualDuration;
  26644            child = child.sibling;
  26645          }
  26646
  26647          completedWork.actualDuration = actualDuration;
  26648        }
  26649
  26650        if (returnFiber !== null) {
  26651          // Mark the parent fiber as incomplete and clear its subtree flags.
  26652          returnFiber.flags |= Incomplete;
  26653          returnFiber.subtreeFlags = NoFlags;
  26654          returnFiber.deletions = null;
  26655        } else {
  26656          // We've unwound all the way to the root.
  26657          workInProgressRootExitStatus = RootDidNotComplete;
  26658          workInProgress = null;
  26659          return;
  26660        }
  26661      }
  26662
  26663      var siblingFiber = completedWork.sibling;
  26664
  26665      if (siblingFiber !== null) {
  26666        // If there is more work to do in this returnFiber, do that next.
  26667        workInProgress = siblingFiber;
  26668        return;
  26669      } // Otherwise, return to the parent
  26670
  26671
  26672      completedWork = returnFiber; // Update the next thing we're working on in case something throws.
  26673
  26674      workInProgress = completedWork;
  26675    } while (completedWork !== null); // We've reached the root.
  26676
  26677
  26678    if (workInProgressRootExitStatus === RootInProgress) {
  26679      workInProgressRootExitStatus = RootCompleted;
  26680    }
  26681  }
  26682
  26683  function commitRoot(root, recoverableErrors, transitions) {
  26684    // TODO: This no longer makes any sense. We already wrap the mutation and
  26685    // layout phases. Should be able to remove.
  26686    var previousUpdateLanePriority = getCurrentUpdatePriority();
  26687    var prevTransition = ReactCurrentBatchConfig$3.transition;
  26688
  26689    try {
  26690      ReactCurrentBatchConfig$3.transition = null;
  26691      setCurrentUpdatePriority(DiscreteEventPriority);
  26692      commitRootImpl(root, recoverableErrors, transitions, previousUpdateLanePriority);
  26693    } finally {
  26694      ReactCurrentBatchConfig$3.transition = prevTransition;
  26695      setCurrentUpdatePriority(previousUpdateLanePriority);
  26696    }
  26697
  26698    return null;
  26699  }
  26700
  26701  function commitRootImpl(root, recoverableErrors, transitions, renderPriorityLevel) {
  26702    do {
  26703      // `flushPassiveEffects` will call `flushSyncUpdateQueue` at the end, which
  26704      // means `flushPassiveEffects` will sometimes result in additional
  26705      // passive effects. So we need to keep flushing in a loop until there are
  26706      // no more pending effects.
  26707      // TODO: Might be better if `flushPassiveEffects` did not automatically
  26708      // flush synchronous work at the end, to avoid factoring hazards like this.
  26709      flushPassiveEffects();
  26710    } while (rootWithPendingPassiveEffects !== null);
  26711
  26712    flushRenderPhaseStrictModeWarningsInDEV();
  26713
  26714    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
  26715      throw new Error('Should not already be working.');
  26716    }
  26717
  26718    var finishedWork = root.finishedWork;
  26719    var lanes = root.finishedLanes;
  26720
  26721    {
  26722      markCommitStarted(lanes);
  26723    }
  26724
  26725    if (finishedWork === null) {
  26726
  26727      {
  26728        markCommitStopped();
  26729      }
  26730
  26731      return null;
  26732    } else {
  26733      {
  26734        if (lanes === NoLanes) {
  26735          error('root.finishedLanes should not be empty during a commit. This is a ' + 'bug in React.');
  26736        }
  26737      }
  26738    }
  26739
  26740    root.finishedWork = null;
  26741    root.finishedLanes = NoLanes;
  26742
  26743    if (finishedWork === root.current) {
  26744      throw new Error('Cannot commit the same tree as before. This error is likely caused by ' + 'a bug in React. Please file an issue.');
  26745    } // commitRoot never returns a continuation; it always finishes synchronously.
  26746    // So we can clear these now to allow a new callback to be scheduled.
  26747
  26748
  26749    root.callbackNode = null;
  26750    root.callbackPriority = NoLane; // Update the first and last pending times on this root. The new first
  26751    // pending time is whatever is left on the root fiber.
  26752
  26753    var remainingLanes = mergeLanes(finishedWork.lanes, finishedWork.childLanes);
  26754    markRootFinished(root, remainingLanes);
  26755
  26756    if (root === workInProgressRoot) {
  26757      // We can reset these now that they are finished.
  26758      workInProgressRoot = null;
  26759      workInProgress = null;
  26760      workInProgressRootRenderLanes = NoLanes;
  26761    } // If there are pending passive effects, schedule a callback to process them.
  26762    // Do this as early as possible, so it is queued before anything else that
  26763    // might get scheduled in the commit phase. (See #16714.)
  26764    // TODO: Delete all other places that schedule the passive effect callback
  26765    // They're redundant.
  26766
  26767
  26768    if ((finishedWork.subtreeFlags & PassiveMask) !== NoFlags || (finishedWork.flags & PassiveMask) !== NoFlags) {
  26769      if (!rootDoesHavePassiveEffects) {
  26770        rootDoesHavePassiveEffects = true;
  26771        // to store it in pendingPassiveTransitions until they get processed
  26772        // We need to pass this through as an argument to commitRoot
  26773        // because workInProgressTransitions might have changed between
  26774        // the previous render and commit if we throttle the commit
  26775        // with setTimeout
  26776
  26777        pendingPassiveTransitions = transitions;
  26778        scheduleCallback$1(NormalPriority, function () {
  26779          flushPassiveEffects(); // This render triggered passive effects: release the root cache pool
  26780          // *after* passive effects fire to avoid freeing a cache pool that may
  26781          // be referenced by a node in the tree (HostRoot, Cache boundary etc)
  26782
  26783          return null;
  26784        });
  26785      }
  26786    } // Check if there are any effects in the whole tree.
  26787    // TODO: This is left over from the effect list implementation, where we had
  26788    // to check for the existence of `firstEffect` to satisfy Flow. I think the
  26789    // only other reason this optimization exists is because it affects profiling.
  26790    // Reconsider whether this is necessary.
  26791
  26792
  26793    var subtreeHasEffects = (finishedWork.subtreeFlags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
  26794    var rootHasEffect = (finishedWork.flags & (BeforeMutationMask | MutationMask | LayoutMask | PassiveMask)) !== NoFlags;
  26795
  26796    if (subtreeHasEffects || rootHasEffect) {
  26797      var prevTransition = ReactCurrentBatchConfig$3.transition;
  26798      ReactCurrentBatchConfig$3.transition = null;
  26799      var previousPriority = getCurrentUpdatePriority();
  26800      setCurrentUpdatePriority(DiscreteEventPriority);
  26801      var prevExecutionContext = executionContext;
  26802      executionContext |= CommitContext; // Reset this to null before calling lifecycles
  26803
  26804      ReactCurrentOwner$2.current = null; // The commit phase is broken into several sub-phases. We do a separate pass
  26805      // of the effect list for each phase: all mutation effects come before all
  26806      // layout effects, and so on.
  26807      // The first phase a "before mutation" phase. We use this phase to read the
  26808      // state of the host tree right before we mutate it. This is where
  26809      // getSnapshotBeforeUpdate is called.
  26810
  26811      var shouldFireAfterActiveInstanceBlur = commitBeforeMutationEffects(root, finishedWork);
  26812
  26813      {
  26814        // Mark the current commit time to be shared by all Profilers in this
  26815        // batch. This enables them to be grouped later.
  26816        recordCommitTime();
  26817      }
  26818
  26819
  26820      commitMutationEffects(root, finishedWork, lanes);
  26821
  26822      resetAfterCommit(root.containerInfo); // The work-in-progress tree is now the current tree. This must come after
  26823      // the mutation phase, so that the previous tree is still current during
  26824      // componentWillUnmount, but before the layout phase, so that the finished
  26825      // work is current during componentDidMount/Update.
  26826
  26827      root.current = finishedWork; // The next phase is the layout phase, where we call effects that read
  26828
  26829      {
  26830        markLayoutEffectsStarted(lanes);
  26831      }
  26832
  26833      commitLayoutEffects(finishedWork, root, lanes);
  26834
  26835      {
  26836        markLayoutEffectsStopped();
  26837      }
  26838      // opportunity to paint.
  26839
  26840
  26841      requestPaint();
  26842      executionContext = prevExecutionContext; // Reset the priority to the previous non-sync value.
  26843
  26844      setCurrentUpdatePriority(previousPriority);
  26845      ReactCurrentBatchConfig$3.transition = prevTransition;
  26846    } else {
  26847      // No effects.
  26848      root.current = finishedWork; // Measure these anyway so the flamegraph explicitly shows that there were
  26849      // no effects.
  26850      // TODO: Maybe there's a better way to report this.
  26851
  26852      {
  26853        recordCommitTime();
  26854      }
  26855    }
  26856
  26857    var rootDidHavePassiveEffects = rootDoesHavePassiveEffects;
  26858
  26859    if (rootDoesHavePassiveEffects) {
  26860      // This commit has passive effects. Stash a reference to them. But don't
  26861      // schedule a callback until after flushing layout work.
  26862      rootDoesHavePassiveEffects = false;
  26863      rootWithPendingPassiveEffects = root;
  26864      pendingPassiveEffectsLanes = lanes;
  26865    } else {
  26866
  26867      {
  26868        nestedPassiveUpdateCount = 0;
  26869        rootWithPassiveNestedUpdates = null;
  26870      }
  26871    } // Read this again, since an effect might have updated it
  26872
  26873
  26874    remainingLanes = root.pendingLanes; // Check if there's remaining work on this root
  26875    // TODO: This is part of the `componentDidCatch` implementation. Its purpose
  26876    // is to detect whether something might have called setState inside
  26877    // `componentDidCatch`. The mechanism is known to be flawed because `setState`
  26878    // inside `componentDidCatch` is itself flawed — that's why we recommend
  26879    // `getDerivedStateFromError` instead. However, it could be improved by
  26880    // checking if remainingLanes includes Sync work, instead of whether there's
  26881    // any work remaining at all (which would also include stuff like Suspense
  26882    // retries or transitions). It's been like this for a while, though, so fixing
  26883    // it probably isn't that urgent.
  26884
  26885    if (remainingLanes === NoLanes) {
  26886      // If there's no remaining work, we can clear the set of already failed
  26887      // error boundaries.
  26888      legacyErrorBoundariesThatAlreadyFailed = null;
  26889    }
  26890
  26891    {
  26892      if (!rootDidHavePassiveEffects) {
  26893        commitDoubleInvokeEffectsInDEV(root.current, false);
  26894      }
  26895    }
  26896
  26897    onCommitRoot(finishedWork.stateNode, renderPriorityLevel);
  26898
  26899    {
  26900      if (isDevToolsPresent) {
  26901        root.memoizedUpdaters.clear();
  26902      }
  26903    }
  26904
  26905    {
  26906      onCommitRoot$1();
  26907    } // Always call this before exiting `commitRoot`, to ensure that any
  26908    // additional work on this root is scheduled.
  26909
  26910
  26911    ensureRootIsScheduled(root, now());
  26912
  26913    if (recoverableErrors !== null) {
  26914      // There were errors during this render, but recovered from them without
  26915      // needing to surface it to the UI. We log them here.
  26916      var onRecoverableError = root.onRecoverableError;
  26917
  26918      for (var i = 0; i < recoverableErrors.length; i++) {
  26919        var recoverableError = recoverableErrors[i];
  26920        var componentStack = recoverableError.stack;
  26921        var digest = recoverableError.digest;
  26922        onRecoverableError(recoverableError.value, {
  26923          componentStack: componentStack,
  26924          digest: digest
  26925        });
  26926      }
  26927    }
  26928
  26929    if (hasUncaughtError) {
  26930      hasUncaughtError = false;
  26931      var error$1 = firstUncaughtError;
  26932      firstUncaughtError = null;
  26933      throw error$1;
  26934    } // If the passive effects are the result of a discrete render, flush them
  26935    // synchronously at the end of the current task so that the result is
  26936    // immediately observable. Otherwise, we assume that they are not
  26937    // order-dependent and do not need to be observed by external systems, so we
  26938    // can wait until after paint.
  26939    // TODO: We can optimize this by not scheduling the callback earlier. Since we
  26940    // currently schedule the callback in multiple places, will wait until those
  26941    // are consolidated.
  26942
  26943
  26944    if (includesSomeLane(pendingPassiveEffectsLanes, SyncLane) && root.tag !== LegacyRoot) {
  26945      flushPassiveEffects();
  26946    } // Read this again, since a passive effect might have updated it
  26947
  26948
  26949    remainingLanes = root.pendingLanes;
  26950
  26951    if (includesSomeLane(remainingLanes, SyncLane)) {
  26952      {
  26953        markNestedUpdateScheduled();
  26954      } // Count the number of times the root synchronously re-renders without
  26955      // finishing. If there are too many, it indicates an infinite update loop.
  26956
  26957
  26958      if (root === rootWithNestedUpdates) {
  26959        nestedUpdateCount++;
  26960      } else {
  26961        nestedUpdateCount = 0;
  26962        rootWithNestedUpdates = root;
  26963      }
  26964    } else {
  26965      nestedUpdateCount = 0;
  26966    } // If layout work was scheduled, flush it now.
  26967
  26968
  26969    flushSyncCallbacks();
  26970
  26971    {
  26972      markCommitStopped();
  26973    }
  26974
  26975    return null;
  26976  }
  26977
  26978  function flushPassiveEffects() {
  26979    // Returns whether passive effects were flushed.
  26980    // TODO: Combine this check with the one in flushPassiveEFfectsImpl. We should
  26981    // probably just combine the two functions. I believe they were only separate
  26982    // in the first place because we used to wrap it with
  26983    // `Scheduler.runWithPriority`, which accepts a function. But now we track the
  26984    // priority within React itself, so we can mutate the variable directly.
  26985    if (rootWithPendingPassiveEffects !== null) {
  26986      var renderPriority = lanesToEventPriority(pendingPassiveEffectsLanes);
  26987      var priority = lowerEventPriority(DefaultEventPriority, renderPriority);
  26988      var prevTransition = ReactCurrentBatchConfig$3.transition;
  26989      var previousPriority = getCurrentUpdatePriority();
  26990
  26991      try {
  26992        ReactCurrentBatchConfig$3.transition = null;
  26993        setCurrentUpdatePriority(priority);
  26994        return flushPassiveEffectsImpl();
  26995      } finally {
  26996        setCurrentUpdatePriority(previousPriority);
  26997        ReactCurrentBatchConfig$3.transition = prevTransition; // Once passive effects have run for the tree - giving components a
  26998      }
  26999    }
  27000
  27001    return false;
  27002  }
  27003  function enqueuePendingPassiveProfilerEffect(fiber) {
  27004    {
  27005      pendingPassiveProfilerEffects.push(fiber);
  27006
  27007      if (!rootDoesHavePassiveEffects) {
  27008        rootDoesHavePassiveEffects = true;
  27009        scheduleCallback$1(NormalPriority, function () {
  27010          flushPassiveEffects();
  27011          return null;
  27012        });
  27013      }
  27014    }
  27015  }
  27016
  27017  function flushPassiveEffectsImpl() {
  27018    if (rootWithPendingPassiveEffects === null) {
  27019      return false;
  27020    } // Cache and clear the transitions flag
  27021
  27022
  27023    var transitions = pendingPassiveTransitions;
  27024    pendingPassiveTransitions = null;
  27025    var root = rootWithPendingPassiveEffects;
  27026    var lanes = pendingPassiveEffectsLanes;
  27027    rootWithPendingPassiveEffects = null; // TODO: This is sometimes out of sync with rootWithPendingPassiveEffects.
  27028    // Figure out why and fix it. It's not causing any known issues (probably
  27029    // because it's only used for profiling), but it's a refactor hazard.
  27030
  27031    pendingPassiveEffectsLanes = NoLanes;
  27032
  27033    if ((executionContext & (RenderContext | CommitContext)) !== NoContext) {
  27034      throw new Error('Cannot flush passive effects while already rendering.');
  27035    }
  27036
  27037    {
  27038      isFlushingPassiveEffects = true;
  27039      didScheduleUpdateDuringPassiveEffects = false;
  27040    }
  27041
  27042    {
  27043      markPassiveEffectsStarted(lanes);
  27044    }
  27045
  27046    var prevExecutionContext = executionContext;
  27047    executionContext |= CommitContext;
  27048    commitPassiveUnmountEffects(root.current);
  27049    commitPassiveMountEffects(root, root.current, lanes, transitions); // TODO: Move to commitPassiveMountEffects
  27050
  27051    {
  27052      var profilerEffects = pendingPassiveProfilerEffects;
  27053      pendingPassiveProfilerEffects = [];
  27054
  27055      for (var i = 0; i < profilerEffects.length; i++) {
  27056        var _fiber = profilerEffects[i];
  27057        commitPassiveEffectDurations(root, _fiber);
  27058      }
  27059    }
  27060
  27061    {
  27062      markPassiveEffectsStopped();
  27063    }
  27064
  27065    {
  27066      commitDoubleInvokeEffectsInDEV(root.current, true);
  27067    }
  27068
  27069    executionContext = prevExecutionContext;
  27070    flushSyncCallbacks();
  27071
  27072    {
  27073      // If additional passive effects were scheduled, increment a counter. If this
  27074      // exceeds the limit, we'll fire a warning.
  27075      if (didScheduleUpdateDuringPassiveEffects) {
  27076        if (root === rootWithPassiveNestedUpdates) {
  27077          nestedPassiveUpdateCount++;
  27078        } else {
  27079          nestedPassiveUpdateCount = 0;
  27080          rootWithPassiveNestedUpdates = root;
  27081        }
  27082      } else {
  27083        nestedPassiveUpdateCount = 0;
  27084      }
  27085
  27086      isFlushingPassiveEffects = false;
  27087      didScheduleUpdateDuringPassiveEffects = false;
  27088    } // TODO: Move to commitPassiveMountEffects
  27089
  27090
  27091    onPostCommitRoot(root);
  27092
  27093    {
  27094      var stateNode = root.current.stateNode;
  27095      stateNode.effectDuration = 0;
  27096      stateNode.passiveEffectDuration = 0;
  27097    }
  27098
  27099    return true;
  27100  }
  27101
  27102  function isAlreadyFailedLegacyErrorBoundary(instance) {
  27103    return legacyErrorBoundariesThatAlreadyFailed !== null && legacyErrorBoundariesThatAlreadyFailed.has(instance);
  27104  }
  27105  function markLegacyErrorBoundaryAsFailed(instance) {
  27106    if (legacyErrorBoundariesThatAlreadyFailed === null) {
  27107      legacyErrorBoundariesThatAlreadyFailed = new Set([instance]);
  27108    } else {
  27109      legacyErrorBoundariesThatAlreadyFailed.add(instance);
  27110    }
  27111  }
  27112
  27113  function prepareToThrowUncaughtError(error) {
  27114    if (!hasUncaughtError) {
  27115      hasUncaughtError = true;
  27116      firstUncaughtError = error;
  27117    }
  27118  }
  27119
  27120  var onUncaughtError = prepareToThrowUncaughtError;
  27121
  27122  function captureCommitPhaseErrorOnRoot(rootFiber, sourceFiber, error) {
  27123    var errorInfo = createCapturedValueAtFiber(error, sourceFiber);
  27124    var update = createRootErrorUpdate(rootFiber, errorInfo, SyncLane);
  27125    var root = enqueueUpdate(rootFiber, update, SyncLane);
  27126    var eventTime = requestEventTime();
  27127
  27128    if (root !== null) {
  27129      markRootUpdated(root, SyncLane, eventTime);
  27130      ensureRootIsScheduled(root, eventTime);
  27131    }
  27132  }
  27133
  27134  function captureCommitPhaseError(sourceFiber, nearestMountedAncestor, error$1) {
  27135    {
  27136      reportUncaughtErrorInDEV(error$1);
  27137      setIsRunningInsertionEffect(false);
  27138    }
  27139
  27140    if (sourceFiber.tag === HostRoot) {
  27141      // Error was thrown at the root. There is no parent, so the root
  27142      // itself should capture it.
  27143      captureCommitPhaseErrorOnRoot(sourceFiber, sourceFiber, error$1);
  27144      return;
  27145    }
  27146
  27147    var fiber = null;
  27148
  27149    {
  27150      fiber = nearestMountedAncestor;
  27151    }
  27152
  27153    while (fiber !== null) {
  27154      if (fiber.tag === HostRoot) {
  27155        captureCommitPhaseErrorOnRoot(fiber, sourceFiber, error$1);
  27156        return;
  27157      } else if (fiber.tag === ClassComponent) {
  27158        var ctor = fiber.type;
  27159        var instance = fiber.stateNode;
  27160
  27161        if (typeof ctor.getDerivedStateFromError === 'function' || typeof instance.componentDidCatch === 'function' && !isAlreadyFailedLegacyErrorBoundary(instance)) {
  27162          var errorInfo = createCapturedValueAtFiber(error$1, sourceFiber);
  27163          var update = createClassErrorUpdate(fiber, errorInfo, SyncLane);
  27164          var root = enqueueUpdate(fiber, update, SyncLane);
  27165          var eventTime = requestEventTime();
  27166
  27167          if (root !== null) {
  27168            markRootUpdated(root, SyncLane, eventTime);
  27169            ensureRootIsScheduled(root, eventTime);
  27170          }
  27171
  27172          return;
  27173        }
  27174      }
  27175
  27176      fiber = fiber.return;
  27177    }
  27178
  27179    {
  27180      // TODO: Until we re-land skipUnmountedBoundaries (see #20147), this warning
  27181      // will fire for errors that are thrown by destroy functions inside deleted
  27182      // trees. What it should instead do is propagate the error to the parent of
  27183      // the deleted tree. In the meantime, do not add this warning to the
  27184      // allowlist; this is only for our internal use.
  27185      error('Internal React error: Attempted to capture a commit phase error ' + 'inside a detached tree. This indicates a bug in React. Likely ' + 'causes include deleting the same fiber more than once, committing an ' + 'already-finished tree, or an inconsistent return pointer.\n\n' + 'Error message:\n\n%s', error$1);
  27186    }
  27187  }
  27188  function pingSuspendedRoot(root, wakeable, pingedLanes) {
  27189    var pingCache = root.pingCache;
  27190
  27191    if (pingCache !== null) {
  27192      // The wakeable resolved, so we no longer need to memoize, because it will
  27193      // never be thrown again.
  27194      pingCache.delete(wakeable);
  27195    }
  27196
  27197    var eventTime = requestEventTime();
  27198    markRootPinged(root, pingedLanes);
  27199    warnIfSuspenseResolutionNotWrappedWithActDEV(root);
  27200
  27201    if (workInProgressRoot === root && isSubsetOfLanes(workInProgressRootRenderLanes, pingedLanes)) {
  27202      // Received a ping at the same priority level at which we're currently
  27203      // rendering. We might want to restart this render. This should mirror
  27204      // the logic of whether or not a root suspends once it completes.
  27205      // TODO: If we're rendering sync either due to Sync, Batched or expired,
  27206      // we should probably never restart.
  27207      // If we're suspended with delay, or if it's a retry, we'll always suspend
  27208      // so we can always restart.
  27209      if (workInProgressRootExitStatus === RootSuspendedWithDelay || workInProgressRootExitStatus === RootSuspended && includesOnlyRetries(workInProgressRootRenderLanes) && now() - globalMostRecentFallbackTime < FALLBACK_THROTTLE_MS) {
  27210        // Restart from the root.
  27211        prepareFreshStack(root, NoLanes);
  27212      } else {
  27213        // Even though we can't restart right now, we might get an
  27214        // opportunity later. So we mark this render as having a ping.
  27215        workInProgressRootPingedLanes = mergeLanes(workInProgressRootPingedLanes, pingedLanes);
  27216      }
  27217    }
  27218
  27219    ensureRootIsScheduled(root, eventTime);
  27220  }
  27221
  27222  function retryTimedOutBoundary(boundaryFiber, retryLane) {
  27223    // The boundary fiber (a Suspense component or SuspenseList component)
  27224    // previously was rendered in its fallback state. One of the promises that
  27225    // suspended it has resolved, which means at least part of the tree was
  27226    // likely unblocked. Try rendering again, at a new lanes.
  27227    if (retryLane === NoLane) {
  27228      // TODO: Assign this to `suspenseState.retryLane`? to avoid
  27229      // unnecessary entanglement?
  27230      retryLane = requestRetryLane(boundaryFiber);
  27231    } // TODO: Special case idle priority?
  27232
  27233
  27234    var eventTime = requestEventTime();
  27235    var root = enqueueConcurrentRenderForLane(boundaryFiber, retryLane);
  27236
  27237    if (root !== null) {
  27238      markRootUpdated(root, retryLane, eventTime);
  27239      ensureRootIsScheduled(root, eventTime);
  27240    }
  27241  }
  27242
  27243  function retryDehydratedSuspenseBoundary(boundaryFiber) {
  27244    var suspenseState = boundaryFiber.memoizedState;
  27245    var retryLane = NoLane;
  27246
  27247    if (suspenseState !== null) {
  27248      retryLane = suspenseState.retryLane;
  27249    }
  27250
  27251    retryTimedOutBoundary(boundaryFiber, retryLane);
  27252  }
  27253  function resolveRetryWakeable(boundaryFiber, wakeable) {
  27254    var retryLane = NoLane; // Default
  27255
  27256    var retryCache;
  27257
  27258    switch (boundaryFiber.tag) {
  27259      case SuspenseComponent:
  27260        retryCache = boundaryFiber.stateNode;
  27261        var suspenseState = boundaryFiber.memoizedState;
  27262
  27263        if (suspenseState !== null) {
  27264          retryLane = suspenseState.retryLane;
  27265        }
  27266
  27267        break;
  27268
  27269      case SuspenseListComponent:
  27270        retryCache = boundaryFiber.stateNode;
  27271        break;
  27272
  27273      default:
  27274        throw new Error('Pinged unknown suspense boundary type. ' + 'This is probably a bug in React.');
  27275    }
  27276
  27277    if (retryCache !== null) {
  27278      // The wakeable resolved, so we no longer need to memoize, because it will
  27279      // never be thrown again.
  27280      retryCache.delete(wakeable);
  27281    }
  27282
  27283    retryTimedOutBoundary(boundaryFiber, retryLane);
  27284  } // Computes the next Just Noticeable Difference (JND) boundary.
  27285  // The theory is that a person can't tell the difference between small differences in time.
  27286  // Therefore, if we wait a bit longer than necessary that won't translate to a noticeable
  27287  // difference in the experience. However, waiting for longer might mean that we can avoid
  27288  // showing an intermediate loading state. The longer we have already waited, the harder it
  27289  // is to tell small differences in time. Therefore, the longer we've already waited,
  27290  // the longer we can wait additionally. At some point we have to give up though.
  27291  // We pick a train model where the next boundary commits at a consistent schedule.
  27292  // These particular numbers are vague estimates. We expect to adjust them based on research.
  27293
  27294  function jnd(timeElapsed) {
  27295    return timeElapsed < 120 ? 120 : timeElapsed < 480 ? 480 : timeElapsed < 1080 ? 1080 : timeElapsed < 1920 ? 1920 : timeElapsed < 3000 ? 3000 : timeElapsed < 4320 ? 4320 : ceil(timeElapsed / 1960) * 1960;
  27296  }
  27297
  27298  function checkForNestedUpdates() {
  27299    if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
  27300      nestedUpdateCount = 0;
  27301      rootWithNestedUpdates = null;
  27302      throw new 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.');
  27303    }
  27304
  27305    {
  27306      if (nestedPassiveUpdateCount > NESTED_PASSIVE_UPDATE_LIMIT) {
  27307        nestedPassiveUpdateCount = 0;
  27308        rootWithPassiveNestedUpdates = null;
  27309
  27310        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.');
  27311      }
  27312    }
  27313  }
  27314
  27315  function flushRenderPhaseStrictModeWarningsInDEV() {
  27316    {
  27317      ReactStrictModeWarnings.flushLegacyContextWarning();
  27318
  27319      {
  27320        ReactStrictModeWarnings.flushPendingUnsafeLifecycleWarnings();
  27321      }
  27322    }
  27323  }
  27324
  27325  function commitDoubleInvokeEffectsInDEV(fiber, hasPassiveEffects) {
  27326    {
  27327      // TODO (StrictEffects) Should we set a marker on the root if it contains strict effects
  27328      // so we don't traverse unnecessarily? similar to subtreeFlags but just at the root level.
  27329      // Maybe not a big deal since this is DEV only behavior.
  27330      setCurrentFiber(fiber);
  27331      invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectUnmountInDEV);
  27332
  27333      if (hasPassiveEffects) {
  27334        invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectUnmountInDEV);
  27335      }
  27336
  27337      invokeEffectsInDev(fiber, MountLayoutDev, invokeLayoutEffectMountInDEV);
  27338
  27339      if (hasPassiveEffects) {
  27340        invokeEffectsInDev(fiber, MountPassiveDev, invokePassiveEffectMountInDEV);
  27341      }
  27342
  27343      resetCurrentFiber();
  27344    }
  27345  }
  27346
  27347  function invokeEffectsInDev(firstChild, fiberFlags, invokeEffectFn) {
  27348    {
  27349      // We don't need to re-check StrictEffectsMode here.
  27350      // This function is only called if that check has already passed.
  27351      var current = firstChild;
  27352      var subtreeRoot = null;
  27353
  27354      while (current !== null) {
  27355        var primarySubtreeFlag = current.subtreeFlags & fiberFlags;
  27356
  27357        if (current !== subtreeRoot && current.child !== null && primarySubtreeFlag !== NoFlags) {
  27358          current = current.child;
  27359        } else {
  27360          if ((current.flags & fiberFlags) !== NoFlags) {
  27361            invokeEffectFn(current);
  27362          }
  27363
  27364          if (current.sibling !== null) {
  27365            current = current.sibling;
  27366          } else {
  27367            current = subtreeRoot = current.return;
  27368          }
  27369        }
  27370      }
  27371    }
  27372  }
  27373
  27374  var didWarnStateUpdateForNotYetMountedComponent = null;
  27375  function warnAboutUpdateOnNotYetMountedFiberInDEV(fiber) {
  27376    {
  27377      if ((executionContext & RenderContext) !== NoContext) {
  27378        // We let the other warning about render phase updates deal with this one.
  27379        return;
  27380      }
  27381
  27382      if (!(fiber.mode & ConcurrentMode)) {
  27383        return;
  27384      }
  27385
  27386      var tag = fiber.tag;
  27387
  27388      if (tag !== IndeterminateComponent && tag !== HostRoot && tag !== ClassComponent && tag !== FunctionComponent && tag !== ForwardRef && tag !== MemoComponent && tag !== SimpleMemoComponent) {
  27389        // Only warn for user-defined components, not internal ones like Suspense.
  27390        return;
  27391      } // We show the whole stack but dedupe on the top component's name because
  27392      // the problematic code almost always lies inside that component.
  27393
  27394
  27395      var componentName = getComponentNameFromFiber(fiber) || 'ReactComponent';
  27396
  27397      if (didWarnStateUpdateForNotYetMountedComponent !== null) {
  27398        if (didWarnStateUpdateForNotYetMountedComponent.has(componentName)) {
  27399          return;
  27400        }
  27401
  27402        didWarnStateUpdateForNotYetMountedComponent.add(componentName);
  27403      } else {
  27404        didWarnStateUpdateForNotYetMountedComponent = new Set([componentName]);
  27405      }
  27406
  27407      var previousFiber = current;
  27408
  27409      try {
  27410        setCurrentFiber(fiber);
  27411
  27412        error("Can't perform a React state update on a component that hasn't mounted yet. " + 'This indicates that you have a side-effect in your render function that ' + 'asynchronously later calls tries to update the component. Move this work to ' + 'useEffect instead.');
  27413      } finally {
  27414        if (previousFiber) {
  27415          setCurrentFiber(fiber);
  27416        } else {
  27417          resetCurrentFiber();
  27418        }
  27419      }
  27420    }
  27421  }
  27422  var beginWork$1;
  27423
  27424  {
  27425    var dummyFiber = null;
  27426
  27427    beginWork$1 = function (current, unitOfWork, lanes) {
  27428      // If a component throws an error, we replay it again in a synchronously
  27429      // dispatched event, so that the debugger will treat it as an uncaught
  27430      // error See ReactErrorUtils for more information.
  27431      // Before entering the begin phase, copy the work-in-progress onto a dummy
  27432      // fiber. If beginWork throws, we'll use this to reset the state.
  27433      var originalWorkInProgressCopy = assignFiberPropertiesInDEV(dummyFiber, unitOfWork);
  27434
  27435      try {
  27436        return beginWork(current, unitOfWork, lanes);
  27437      } catch (originalError) {
  27438        if (didSuspendOrErrorWhileHydratingDEV() || originalError !== null && typeof originalError === 'object' && typeof originalError.then === 'function') {
  27439          // Don't replay promises.
  27440          // Don't replay errors if we are hydrating and have already suspended or handled an error
  27441          throw originalError;
  27442        } // Keep this code in sync with handleError; any changes here must have
  27443        // corresponding changes there.
  27444
  27445
  27446        resetContextDependencies();
  27447        resetHooksAfterThrow(); // Don't reset current debug fiber, since we're about to work on the
  27448        // same fiber again.
  27449        // Unwind the failed stack frame
  27450
  27451        unwindInterruptedWork(current, unitOfWork); // Restore the original properties of the fiber.
  27452
  27453        assignFiberPropertiesInDEV(unitOfWork, originalWorkInProgressCopy);
  27454
  27455        if ( unitOfWork.mode & ProfileMode) {
  27456          // Reset the profiler timer.
  27457          startProfilerTimer(unitOfWork);
  27458        } // Run beginWork again.
  27459
  27460
  27461        invokeGuardedCallback(null, beginWork, null, current, unitOfWork, lanes);
  27462
  27463        if (hasCaughtError()) {
  27464          var replayError = clearCaughtError();
  27465
  27466          if (typeof replayError === 'object' && replayError !== null && replayError._suppressLogging && typeof originalError === 'object' && originalError !== null && !originalError._suppressLogging) {
  27467            // If suppressed, let the flag carry over to the original error which is the one we'll rethrow.
  27468            originalError._suppressLogging = true;
  27469          }
  27470        } // We always throw the original error in case the second render pass is not idempotent.
  27471        // This can happen if a memoized function or CommonJS module doesn't throw after first invocation.
  27472
  27473
  27474        throw originalError;
  27475      }
  27476    };
  27477  }
  27478
  27479  var didWarnAboutUpdateInRender = false;
  27480  var didWarnAboutUpdateInRenderForAnotherComponent;
  27481
  27482  {
  27483    didWarnAboutUpdateInRenderForAnotherComponent = new Set();
  27484  }
  27485
  27486  function warnAboutRenderPhaseUpdatesInDEV(fiber) {
  27487    {
  27488      if (isRendering && !getIsUpdatingOpaqueValueInRenderPhaseInDEV()) {
  27489        switch (fiber.tag) {
  27490          case FunctionComponent:
  27491          case ForwardRef:
  27492          case SimpleMemoComponent:
  27493            {
  27494              var renderingComponentName = workInProgress && getComponentNameFromFiber(workInProgress) || 'Unknown'; // Dedupe by the rendering component because it's the one that needs to be fixed.
  27495
  27496              var dedupeKey = renderingComponentName;
  27497
  27498              if (!didWarnAboutUpdateInRenderForAnotherComponent.has(dedupeKey)) {
  27499                didWarnAboutUpdateInRenderForAnotherComponent.add(dedupeKey);
  27500                var setStateComponentName = getComponentNameFromFiber(fiber) || 'Unknown';
  27501
  27502                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://reactjs.org/link/setstate-in-render', setStateComponentName, renderingComponentName, renderingComponentName);
  27503              }
  27504
  27505              break;
  27506            }
  27507
  27508          case ClassComponent:
  27509            {
  27510              if (!didWarnAboutUpdateInRender) {
  27511                error('Cannot update during an existing state transition (such as ' + 'within `render`). Render methods should be a pure ' + 'function of props and state.');
  27512
  27513                didWarnAboutUpdateInRender = true;
  27514              }
  27515
  27516              break;
  27517            }
  27518        }
  27519      }
  27520    }
  27521  }
  27522
  27523  function restorePendingUpdaters(root, lanes) {
  27524    {
  27525      if (isDevToolsPresent) {
  27526        var memoizedUpdaters = root.memoizedUpdaters;
  27527        memoizedUpdaters.forEach(function (schedulingFiber) {
  27528          addFiberToLanesMap(root, schedulingFiber, lanes);
  27529        }); // This function intentionally does not clear memoized updaters.
  27530        // Those may still be relevant to the current commit
  27531        // and a future one (e.g. Suspense).
  27532      }
  27533    }
  27534  }
  27535  var fakeActCallbackNode = {};
  27536
  27537  function scheduleCallback$1(priorityLevel, callback) {
  27538    {
  27539      // If we're currently inside an `act` scope, bypass Scheduler and push to
  27540      // the `act` queue instead.
  27541      var actQueue = ReactCurrentActQueue$1.current;
  27542
  27543      if (actQueue !== null) {
  27544        actQueue.push(callback);
  27545        return fakeActCallbackNode;
  27546      } else {
  27547        return scheduleCallback(priorityLevel, callback);
  27548      }
  27549    }
  27550  }
  27551
  27552  function cancelCallback$1(callbackNode) {
  27553    if ( callbackNode === fakeActCallbackNode) {
  27554      return;
  27555    } // In production, always call Scheduler. This function will be stripped out.
  27556
  27557
  27558    return cancelCallback(callbackNode);
  27559  }
  27560
  27561  function shouldForceFlushFallbacksInDEV() {
  27562    // Never force flush in production. This function should get stripped out.
  27563    return  ReactCurrentActQueue$1.current !== null;
  27564  }
  27565
  27566  function warnIfUpdatesNotWrappedWithActDEV(fiber) {
  27567    {
  27568      if (fiber.mode & ConcurrentMode) {
  27569        if (!isConcurrentActEnvironment()) {
  27570          // Not in an act environment. No need to warn.
  27571          return;
  27572        }
  27573      } else {
  27574        // Legacy mode has additional cases where we suppress a warning.
  27575        if (!isLegacyActEnvironment()) {
  27576          // Not in an act environment. No need to warn.
  27577          return;
  27578        }
  27579
  27580        if (executionContext !== NoContext) {
  27581          // Legacy mode doesn't warn if the update is batched, i.e.
  27582          // batchedUpdates or flushSync.
  27583          return;
  27584        }
  27585
  27586        if (fiber.tag !== FunctionComponent && fiber.tag !== ForwardRef && fiber.tag !== SimpleMemoComponent) {
  27587          // For backwards compatibility with pre-hooks code, legacy mode only
  27588          // warns for updates that originate from a hook.
  27589          return;
  27590        }
  27591      }
  27592
  27593      if (ReactCurrentActQueue$1.current === null) {
  27594        var previousFiber = current;
  27595
  27596        try {
  27597          setCurrentFiber(fiber);
  27598
  27599          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://reactjs.org/link/wrap-tests-with-act', getComponentNameFromFiber(fiber));
  27600        } finally {
  27601          if (previousFiber) {
  27602            setCurrentFiber(fiber);
  27603          } else {
  27604            resetCurrentFiber();
  27605          }
  27606        }
  27607      }
  27608    }
  27609  }
  27610
  27611  function warnIfSuspenseResolutionNotWrappedWithActDEV(root) {
  27612    {
  27613      if (root.tag !== LegacyRoot && isConcurrentActEnvironment() && ReactCurrentActQueue$1.current === null) {
  27614        error('A suspended resource finished loading inside a test, but the event ' + 'was not wrapped in act(...).\n\n' + 'When testing, code that resolves suspended data should be wrapped ' + 'into act(...):\n\n' + 'act(() => {\n' + '  /* finish loading suspended data */\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://reactjs.org/link/wrap-tests-with-act');
  27615      }
  27616    }
  27617  }
  27618
  27619  function setIsRunningInsertionEffect(isRunning) {
  27620    {
  27621      isRunningInsertionEffect = isRunning;
  27622    }
  27623  }
  27624
  27625  /* eslint-disable react-internal/prod-error-codes */
  27626  var resolveFamily = null; // $FlowFixMe Flow gets confused by a WeakSet feature check below.
  27627
  27628  var failedBoundaries = null;
  27629  var setRefreshHandler = function (handler) {
  27630    {
  27631      resolveFamily = handler;
  27632    }
  27633  };
  27634  function resolveFunctionForHotReloading(type) {
  27635    {
  27636      if (resolveFamily === null) {
  27637        // Hot reloading is disabled.
  27638        return type;
  27639      }
  27640
  27641      var family = resolveFamily(type);
  27642
  27643      if (family === undefined) {
  27644        return type;
  27645      } // Use the latest known implementation.
  27646
  27647
  27648      return family.current;
  27649    }
  27650  }
  27651  function resolveClassForHotReloading(type) {
  27652    // No implementation differences.
  27653    return resolveFunctionForHotReloading(type);
  27654  }
  27655  function resolveForwardRefForHotReloading(type) {
  27656    {
  27657      if (resolveFamily === null) {
  27658        // Hot reloading is disabled.
  27659        return type;
  27660      }
  27661
  27662      var family = resolveFamily(type);
  27663
  27664      if (family === undefined) {
  27665        // Check if we're dealing with a real forwardRef. Don't want to crash early.
  27666        if (type !== null && type !== undefined && typeof type.render === 'function') {
  27667          // ForwardRef is special because its resolved .type is an object,
  27668          // but it's possible that we only have its inner render function in the map.
  27669          // If that inner render function is different, we'll build a new forwardRef type.
  27670          var currentRender = resolveFunctionForHotReloading(type.render);
  27671
  27672          if (type.render !== currentRender) {
  27673            var syntheticType = {
  27674              $$typeof: REACT_FORWARD_REF_TYPE,
  27675              render: currentRender
  27676            };
  27677
  27678            if (type.displayName !== undefined) {
  27679              syntheticType.displayName = type.displayName;
  27680            }
  27681
  27682            return syntheticType;
  27683          }
  27684        }
  27685
  27686        return type;
  27687      } // Use the latest known implementation.
  27688
  27689
  27690      return family.current;
  27691    }
  27692  }
  27693  function isCompatibleFamilyForHotReloading(fiber, element) {
  27694    {
  27695      if (resolveFamily === null) {
  27696        // Hot reloading is disabled.
  27697        return false;
  27698      }
  27699
  27700      var prevType = fiber.elementType;
  27701      var nextType = element.type; // If we got here, we know types aren't === equal.
  27702
  27703      var needsCompareFamilies = false;
  27704      var $$typeofNextType = typeof nextType === 'object' && nextType !== null ? nextType.$$typeof : null;
  27705
  27706      switch (fiber.tag) {
  27707        case ClassComponent:
  27708          {
  27709            if (typeof nextType === 'function') {
  27710              needsCompareFamilies = true;
  27711            }
  27712
  27713            break;
  27714          }
  27715
  27716        case FunctionComponent:
  27717          {
  27718            if (typeof nextType === 'function') {
  27719              needsCompareFamilies = true;
  27720            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
  27721              // We don't know the inner type yet.
  27722              // We're going to assume that the lazy inner type is stable,
  27723              // and so it is sufficient to avoid reconciling it away.
  27724              // We're not going to unwrap or actually use the new lazy type.
  27725              needsCompareFamilies = true;
  27726            }
  27727
  27728            break;
  27729          }
  27730
  27731        case ForwardRef:
  27732          {
  27733            if ($$typeofNextType === REACT_FORWARD_REF_TYPE) {
  27734              needsCompareFamilies = true;
  27735            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
  27736              needsCompareFamilies = true;
  27737            }
  27738
  27739            break;
  27740          }
  27741
  27742        case MemoComponent:
  27743        case SimpleMemoComponent:
  27744          {
  27745            if ($$typeofNextType === REACT_MEMO_TYPE) {
  27746              // TODO: if it was but can no longer be simple,
  27747              // we shouldn't set this.
  27748              needsCompareFamilies = true;
  27749            } else if ($$typeofNextType === REACT_LAZY_TYPE) {
  27750              needsCompareFamilies = true;
  27751            }
  27752
  27753            break;
  27754          }
  27755
  27756        default:
  27757          return false;
  27758      } // Check if both types have a family and it's the same one.
  27759
  27760
  27761      if (needsCompareFamilies) {
  27762        // Note: memo() and forwardRef() we'll compare outer rather than inner type.
  27763        // This means both of them need to be registered to preserve state.
  27764        // If we unwrapped and compared the inner types for wrappers instead,
  27765        // then we would risk falsely saying two separate memo(Foo)
  27766        // calls are equivalent because they wrap the same Foo function.
  27767        var prevFamily = resolveFamily(prevType);
  27768
  27769        if (prevFamily !== undefined && prevFamily === resolveFamily(nextType)) {
  27770          return true;
  27771        }
  27772      }
  27773
  27774      return false;
  27775    }
  27776  }
  27777  function markFailedErrorBoundaryForHotReloading(fiber) {
  27778    {
  27779      if (resolveFamily === null) {
  27780        // Hot reloading is disabled.
  27781        return;
  27782      }
  27783
  27784      if (typeof WeakSet !== 'function') {
  27785        return;
  27786      }
  27787
  27788      if (failedBoundaries === null) {
  27789        failedBoundaries = new WeakSet();
  27790      }
  27791
  27792      failedBoundaries.add(fiber);
  27793    }
  27794  }
  27795  var scheduleRefresh = function (root, update) {
  27796    {
  27797      if (resolveFamily === null) {
  27798        // Hot reloading is disabled.
  27799        return;
  27800      }
  27801
  27802      var staleFamilies = update.staleFamilies,
  27803          updatedFamilies = update.updatedFamilies;
  27804      flushPassiveEffects();
  27805      flushSync(function () {
  27806        scheduleFibersWithFamiliesRecursively(root.current, updatedFamilies, staleFamilies);
  27807      });
  27808    }
  27809  };
  27810  var scheduleRoot = function (root, element) {
  27811    {
  27812      if (root.context !== emptyContextObject) {
  27813        // Super edge case: root has a legacy _renderSubtree context
  27814        // but we don't know the parentComponent so we can't pass it.
  27815        // Just ignore. We'll delete this with _renderSubtree code path later.
  27816        return;
  27817      }
  27818
  27819      flushPassiveEffects();
  27820      flushSync(function () {
  27821        updateContainer(element, root, null, null);
  27822      });
  27823    }
  27824  };
  27825
  27826  function scheduleFibersWithFamiliesRecursively(fiber, updatedFamilies, staleFamilies) {
  27827    {
  27828      var alternate = fiber.alternate,
  27829          child = fiber.child,
  27830          sibling = fiber.sibling,
  27831          tag = fiber.tag,
  27832          type = fiber.type;
  27833      var candidateType = null;
  27834
  27835      switch (tag) {
  27836        case FunctionComponent:
  27837        case SimpleMemoComponent:
  27838        case ClassComponent:
  27839          candidateType = type;
  27840          break;
  27841
  27842        case ForwardRef:
  27843          candidateType = type.render;
  27844          break;
  27845      }
  27846
  27847      if (resolveFamily === null) {
  27848        throw new Error('Expected resolveFamily to be set during hot reload.');
  27849      }
  27850
  27851      var needsRender = false;
  27852      var needsRemount = false;
  27853
  27854      if (candidateType !== null) {
  27855        var family = resolveFamily(candidateType);
  27856
  27857        if (family !== undefined) {
  27858          if (staleFamilies.has(family)) {
  27859            needsRemount = true;
  27860          } else if (updatedFamilies.has(family)) {
  27861            if (tag === ClassComponent) {
  27862              needsRemount = true;
  27863            } else {
  27864              needsRender = true;
  27865            }
  27866          }
  27867        }
  27868      }
  27869
  27870      if (failedBoundaries !== null) {
  27871        if (failedBoundaries.has(fiber) || alternate !== null && failedBoundaries.has(alternate)) {
  27872          needsRemount = true;
  27873        }
  27874      }
  27875
  27876      if (needsRemount) {
  27877        fiber._debugNeedsRemount = true;
  27878      }
  27879
  27880      if (needsRemount || needsRender) {
  27881        var _root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  27882
  27883        if (_root !== null) {
  27884          scheduleUpdateOnFiber(_root, fiber, SyncLane, NoTimestamp);
  27885        }
  27886      }
  27887
  27888      if (child !== null && !needsRemount) {
  27889        scheduleFibersWithFamiliesRecursively(child, updatedFamilies, staleFamilies);
  27890      }
  27891
  27892      if (sibling !== null) {
  27893        scheduleFibersWithFamiliesRecursively(sibling, updatedFamilies, staleFamilies);
  27894      }
  27895    }
  27896  }
  27897
  27898  var findHostInstancesForRefresh = function (root, families) {
  27899    {
  27900      var hostInstances = new Set();
  27901      var types = new Set(families.map(function (family) {
  27902        return family.current;
  27903      }));
  27904      findHostInstancesForMatchingFibersRecursively(root.current, types, hostInstances);
  27905      return hostInstances;
  27906    }
  27907  };
  27908
  27909  function findHostInstancesForMatchingFibersRecursively(fiber, types, hostInstances) {
  27910    {
  27911      var child = fiber.child,
  27912          sibling = fiber.sibling,
  27913          tag = fiber.tag,
  27914          type = fiber.type;
  27915      var candidateType = null;
  27916
  27917      switch (tag) {
  27918        case FunctionComponent:
  27919        case SimpleMemoComponent:
  27920        case ClassComponent:
  27921          candidateType = type;
  27922          break;
  27923
  27924        case ForwardRef:
  27925          candidateType = type.render;
  27926          break;
  27927      }
  27928
  27929      var didMatch = false;
  27930
  27931      if (candidateType !== null) {
  27932        if (types.has(candidateType)) {
  27933          didMatch = true;
  27934        }
  27935      }
  27936
  27937      if (didMatch) {
  27938        // We have a match. This only drills down to the closest host components.
  27939        // There's no need to search deeper because for the purpose of giving
  27940        // visual feedback, "flashing" outermost parent rectangles is sufficient.
  27941        findHostInstancesForFiberShallowly(fiber, hostInstances);
  27942      } else {
  27943        // If there's no match, maybe there will be one further down in the child tree.
  27944        if (child !== null) {
  27945          findHostInstancesForMatchingFibersRecursively(child, types, hostInstances);
  27946        }
  27947      }
  27948
  27949      if (sibling !== null) {
  27950        findHostInstancesForMatchingFibersRecursively(sibling, types, hostInstances);
  27951      }
  27952    }
  27953  }
  27954
  27955  function findHostInstancesForFiberShallowly(fiber, hostInstances) {
  27956    {
  27957      var foundHostInstances = findChildHostInstancesForFiberShallowly(fiber, hostInstances);
  27958
  27959      if (foundHostInstances) {
  27960        return;
  27961      } // If we didn't find any host children, fallback to closest host parent.
  27962
  27963
  27964      var node = fiber;
  27965
  27966      while (true) {
  27967        switch (node.tag) {
  27968          case HostComponent:
  27969            hostInstances.add(node.stateNode);
  27970            return;
  27971
  27972          case HostPortal:
  27973            hostInstances.add(node.stateNode.containerInfo);
  27974            return;
  27975
  27976          case HostRoot:
  27977            hostInstances.add(node.stateNode.containerInfo);
  27978            return;
  27979        }
  27980
  27981        if (node.return === null) {
  27982          throw new Error('Expected to reach root first.');
  27983        }
  27984
  27985        node = node.return;
  27986      }
  27987    }
  27988  }
  27989
  27990  function findChildHostInstancesForFiberShallowly(fiber, hostInstances) {
  27991    {
  27992      var node = fiber;
  27993      var foundHostInstances = false;
  27994
  27995      while (true) {
  27996        if (node.tag === HostComponent) {
  27997          // We got a match.
  27998          foundHostInstances = true;
  27999          hostInstances.add(node.stateNode); // There may still be more, so keep searching.
  28000        } else if (node.child !== null) {
  28001          node.child.return = node;
  28002          node = node.child;
  28003          continue;
  28004        }
  28005
  28006        if (node === fiber) {
  28007          return foundHostInstances;
  28008        }
  28009
  28010        while (node.sibling === null) {
  28011          if (node.return === null || node.return === fiber) {
  28012            return foundHostInstances;
  28013          }
  28014
  28015          node = node.return;
  28016        }
  28017
  28018        node.sibling.return = node.return;
  28019        node = node.sibling;
  28020      }
  28021    }
  28022
  28023    return false;
  28024  }
  28025
  28026  var hasBadMapPolyfill;
  28027
  28028  {
  28029    hasBadMapPolyfill = false;
  28030
  28031    try {
  28032      var nonExtensibleObject = Object.preventExtensions({});
  28033      /* eslint-disable no-new */
  28034
  28035      new Map([[nonExtensibleObject, null]]);
  28036      new Set([nonExtensibleObject]);
  28037      /* eslint-enable no-new */
  28038    } catch (e) {
  28039      // TODO: Consider warning about bad polyfills
  28040      hasBadMapPolyfill = true;
  28041    }
  28042  }
  28043
  28044  function FiberNode(tag, pendingProps, key, mode) {
  28045    // Instance
  28046    this.tag = tag;
  28047    this.key = key;
  28048    this.elementType = null;
  28049    this.type = null;
  28050    this.stateNode = null; // Fiber
  28051
  28052    this.return = null;
  28053    this.child = null;
  28054    this.sibling = null;
  28055    this.index = 0;
  28056    this.ref = null;
  28057    this.pendingProps = pendingProps;
  28058    this.memoizedProps = null;
  28059    this.updateQueue = null;
  28060    this.memoizedState = null;
  28061    this.dependencies = null;
  28062    this.mode = mode; // Effects
  28063
  28064    this.flags = NoFlags;
  28065    this.subtreeFlags = NoFlags;
  28066    this.deletions = null;
  28067    this.lanes = NoLanes;
  28068    this.childLanes = NoLanes;
  28069    this.alternate = null;
  28070
  28071    {
  28072      // Note: The following is done to avoid a v8 performance cliff.
  28073      //
  28074      // Initializing the fields below to smis and later updating them with
  28075      // double values will cause Fibers to end up having separate shapes.
  28076      // This behavior/bug has something to do with Object.preventExtension().
  28077      // Fortunately this only impacts DEV builds.
  28078      // Unfortunately it makes React unusably slow for some applications.
  28079      // To work around this, initialize the fields below with doubles.
  28080      //
  28081      // Learn more about this here:
  28082      // https://github.com/facebook/react/issues/14365
  28083      // https://bugs.chromium.org/p/v8/issues/detail?id=8538
  28084      this.actualDuration = Number.NaN;
  28085      this.actualStartTime = Number.NaN;
  28086      this.selfBaseDuration = Number.NaN;
  28087      this.treeBaseDuration = Number.NaN; // It's okay to replace the initial doubles with smis after initialization.
  28088      // This won't trigger the performance cliff mentioned above,
  28089      // and it simplifies other profiler code (including DevTools).
  28090
  28091      this.actualDuration = 0;
  28092      this.actualStartTime = -1;
  28093      this.selfBaseDuration = 0;
  28094      this.treeBaseDuration = 0;
  28095    }
  28096
  28097    {
  28098      // This isn't directly used but is handy for debugging internals:
  28099      this._debugSource = null;
  28100      this._debugOwner = null;
  28101      this._debugNeedsRemount = false;
  28102      this._debugHookTypes = null;
  28103
  28104      if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {
  28105        Object.preventExtensions(this);
  28106      }
  28107    }
  28108  } // This is a constructor function, rather than a POJO constructor, still
  28109  // please ensure we do the following:
  28110  // 1) Nobody should add any instance methods on this. Instance methods can be
  28111  //    more difficult to predict when they get optimized and they are almost
  28112  //    never inlined properly in static compilers.
  28113  // 2) Nobody should rely on `instanceof Fiber` for type testing. We should
  28114  //    always know when it is a fiber.
  28115  // 3) We might want to experiment with using numeric keys since they are easier
  28116  //    to optimize in a non-JIT environment.
  28117  // 4) We can easily go from a constructor to a createFiber object literal if that
  28118  //    is faster.
  28119  // 5) It should be easy to port this to a C struct and keep a C implementation
  28120  //    compatible.
  28121
  28122
  28123  var createFiber = function (tag, pendingProps, key, mode) {
  28124    // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
  28125    return new FiberNode(tag, pendingProps, key, mode);
  28126  };
  28127
  28128  function shouldConstruct$1(Component) {
  28129    var prototype = Component.prototype;
  28130    return !!(prototype && prototype.isReactComponent);
  28131  }
  28132
  28133  function isSimpleFunctionComponent(type) {
  28134    return typeof type === 'function' && !shouldConstruct$1(type) && type.defaultProps === undefined;
  28135  }
  28136  function resolveLazyComponentTag(Component) {
  28137    if (typeof Component === 'function') {
  28138      return shouldConstruct$1(Component) ? ClassComponent : FunctionComponent;
  28139    } else if (Component !== undefined && Component !== null) {
  28140      var $$typeof = Component.$$typeof;
  28141
  28142      if ($$typeof === REACT_FORWARD_REF_TYPE) {
  28143        return ForwardRef;
  28144      }
  28145
  28146      if ($$typeof === REACT_MEMO_TYPE) {
  28147        return MemoComponent;
  28148      }
  28149    }
  28150
  28151    return IndeterminateComponent;
  28152  } // This is used to create an alternate fiber to do work on.
  28153
  28154  function createWorkInProgress(current, pendingProps) {
  28155    var workInProgress = current.alternate;
  28156
  28157    if (workInProgress === null) {
  28158      // We use a double buffering pooling technique because we know that we'll
  28159      // only ever need at most two versions of a tree. We pool the "other" unused
  28160      // node that we're free to reuse. This is lazily created to avoid allocating
  28161      // extra objects for things that are never updated. It also allow us to
  28162      // reclaim the extra memory if needed.
  28163      workInProgress = createFiber(current.tag, pendingProps, current.key, current.mode);
  28164      workInProgress.elementType = current.elementType;
  28165      workInProgress.type = current.type;
  28166      workInProgress.stateNode = current.stateNode;
  28167
  28168      {
  28169        // DEV-only fields
  28170        workInProgress._debugSource = current._debugSource;
  28171        workInProgress._debugOwner = current._debugOwner;
  28172        workInProgress._debugHookTypes = current._debugHookTypes;
  28173      }
  28174
  28175      workInProgress.alternate = current;
  28176      current.alternate = workInProgress;
  28177    } else {
  28178      workInProgress.pendingProps = pendingProps; // Needed because Blocks store data on type.
  28179
  28180      workInProgress.type = current.type; // We already have an alternate.
  28181      // Reset the effect tag.
  28182
  28183      workInProgress.flags = NoFlags; // The effects are no longer valid.
  28184
  28185      workInProgress.subtreeFlags = NoFlags;
  28186      workInProgress.deletions = null;
  28187
  28188      {
  28189        // We intentionally reset, rather than copy, actualDuration & actualStartTime.
  28190        // This prevents time from endlessly accumulating in new commits.
  28191        // This has the downside of resetting values for different priority renders,
  28192        // But works for yielding (the common case) and should support resuming.
  28193        workInProgress.actualDuration = 0;
  28194        workInProgress.actualStartTime = -1;
  28195      }
  28196    } // Reset all effects except static ones.
  28197    // Static effects are not specific to a render.
  28198
  28199
  28200    workInProgress.flags = current.flags & StaticMask;
  28201    workInProgress.childLanes = current.childLanes;
  28202    workInProgress.lanes = current.lanes;
  28203    workInProgress.child = current.child;
  28204    workInProgress.memoizedProps = current.memoizedProps;
  28205    workInProgress.memoizedState = current.memoizedState;
  28206    workInProgress.updateQueue = current.updateQueue; // Clone the dependencies object. This is mutated during the render phase, so
  28207    // it cannot be shared with the current fiber.
  28208
  28209    var currentDependencies = current.dependencies;
  28210    workInProgress.dependencies = currentDependencies === null ? null : {
  28211      lanes: currentDependencies.lanes,
  28212      firstContext: currentDependencies.firstContext
  28213    }; // These will be overridden during the parent's reconciliation
  28214
  28215    workInProgress.sibling = current.sibling;
  28216    workInProgress.index = current.index;
  28217    workInProgress.ref = current.ref;
  28218
  28219    {
  28220      workInProgress.selfBaseDuration = current.selfBaseDuration;
  28221      workInProgress.treeBaseDuration = current.treeBaseDuration;
  28222    }
  28223
  28224    {
  28225      workInProgress._debugNeedsRemount = current._debugNeedsRemount;
  28226
  28227      switch (workInProgress.tag) {
  28228        case IndeterminateComponent:
  28229        case FunctionComponent:
  28230        case SimpleMemoComponent:
  28231          workInProgress.type = resolveFunctionForHotReloading(current.type);
  28232          break;
  28233
  28234        case ClassComponent:
  28235          workInProgress.type = resolveClassForHotReloading(current.type);
  28236          break;
  28237
  28238        case ForwardRef:
  28239          workInProgress.type = resolveForwardRefForHotReloading(current.type);
  28240          break;
  28241      }
  28242    }
  28243
  28244    return workInProgress;
  28245  } // Used to reuse a Fiber for a second pass.
  28246
  28247  function resetWorkInProgress(workInProgress, renderLanes) {
  28248    // This resets the Fiber to what createFiber or createWorkInProgress would
  28249    // have set the values to before during the first pass. Ideally this wouldn't
  28250    // be necessary but unfortunately many code paths reads from the workInProgress
  28251    // when they should be reading from current and writing to workInProgress.
  28252    // We assume pendingProps, index, key, ref, return are still untouched to
  28253    // avoid doing another reconciliation.
  28254    // Reset the effect flags but keep any Placement tags, since that's something
  28255    // that child fiber is setting, not the reconciliation.
  28256    workInProgress.flags &= StaticMask | Placement; // The effects are no longer valid.
  28257
  28258    var current = workInProgress.alternate;
  28259
  28260    if (current === null) {
  28261      // Reset to createFiber's initial values.
  28262      workInProgress.childLanes = NoLanes;
  28263      workInProgress.lanes = renderLanes;
  28264      workInProgress.child = null;
  28265      workInProgress.subtreeFlags = NoFlags;
  28266      workInProgress.memoizedProps = null;
  28267      workInProgress.memoizedState = null;
  28268      workInProgress.updateQueue = null;
  28269      workInProgress.dependencies = null;
  28270      workInProgress.stateNode = null;
  28271
  28272      {
  28273        // Note: We don't reset the actualTime counts. It's useful to accumulate
  28274        // actual time across multiple render passes.
  28275        workInProgress.selfBaseDuration = 0;
  28276        workInProgress.treeBaseDuration = 0;
  28277      }
  28278    } else {
  28279      // Reset to the cloned values that createWorkInProgress would've.
  28280      workInProgress.childLanes = current.childLanes;
  28281      workInProgress.lanes = current.lanes;
  28282      workInProgress.child = current.child;
  28283      workInProgress.subtreeFlags = NoFlags;
  28284      workInProgress.deletions = null;
  28285      workInProgress.memoizedProps = current.memoizedProps;
  28286      workInProgress.memoizedState = current.memoizedState;
  28287      workInProgress.updateQueue = current.updateQueue; // Needed because Blocks store data on type.
  28288
  28289      workInProgress.type = current.type; // Clone the dependencies object. This is mutated during the render phase, so
  28290      // it cannot be shared with the current fiber.
  28291
  28292      var currentDependencies = current.dependencies;
  28293      workInProgress.dependencies = currentDependencies === null ? null : {
  28294        lanes: currentDependencies.lanes,
  28295        firstContext: currentDependencies.firstContext
  28296      };
  28297
  28298      {
  28299        // Note: We don't reset the actualTime counts. It's useful to accumulate
  28300        // actual time across multiple render passes.
  28301        workInProgress.selfBaseDuration = current.selfBaseDuration;
  28302        workInProgress.treeBaseDuration = current.treeBaseDuration;
  28303      }
  28304    }
  28305
  28306    return workInProgress;
  28307  }
  28308  function createHostRootFiber(tag, isStrictMode, concurrentUpdatesByDefaultOverride) {
  28309    var mode;
  28310
  28311    if (tag === ConcurrentRoot) {
  28312      mode = ConcurrentMode;
  28313
  28314      if (isStrictMode === true) {
  28315        mode |= StrictLegacyMode;
  28316
  28317        {
  28318          mode |= StrictEffectsMode;
  28319        }
  28320      }
  28321    } else {
  28322      mode = NoMode;
  28323    }
  28324
  28325    if ( isDevToolsPresent) {
  28326      // Always collect profile timings when DevTools are present.
  28327      // This enables DevTools to start capturing timing at any point–
  28328      // Without some nodes in the tree having empty base times.
  28329      mode |= ProfileMode;
  28330    }
  28331
  28332    return createFiber(HostRoot, null, null, mode);
  28333  }
  28334  function createFiberFromTypeAndProps(type, // React$ElementType
  28335  key, pendingProps, owner, mode, lanes) {
  28336    var fiberTag = IndeterminateComponent; // The resolved type is set if we know what the final type will be. I.e. it's not lazy.
  28337
  28338    var resolvedType = type;
  28339
  28340    if (typeof type === 'function') {
  28341      if (shouldConstruct$1(type)) {
  28342        fiberTag = ClassComponent;
  28343
  28344        {
  28345          resolvedType = resolveClassForHotReloading(resolvedType);
  28346        }
  28347      } else {
  28348        {
  28349          resolvedType = resolveFunctionForHotReloading(resolvedType);
  28350        }
  28351      }
  28352    } else if (typeof type === 'string') {
  28353      fiberTag = HostComponent;
  28354    } else {
  28355      getTag: switch (type) {
  28356        case REACT_FRAGMENT_TYPE:
  28357          return createFiberFromFragment(pendingProps.children, mode, lanes, key);
  28358
  28359        case REACT_STRICT_MODE_TYPE:
  28360          fiberTag = Mode;
  28361          mode |= StrictLegacyMode;
  28362
  28363          if ( (mode & ConcurrentMode) !== NoMode) {
  28364            // Strict effects should never run on legacy roots
  28365            mode |= StrictEffectsMode;
  28366          }
  28367
  28368          break;
  28369
  28370        case REACT_PROFILER_TYPE:
  28371          return createFiberFromProfiler(pendingProps, mode, lanes, key);
  28372
  28373        case REACT_SUSPENSE_TYPE:
  28374          return createFiberFromSuspense(pendingProps, mode, lanes, key);
  28375
  28376        case REACT_SUSPENSE_LIST_TYPE:
  28377          return createFiberFromSuspenseList(pendingProps, mode, lanes, key);
  28378
  28379        case REACT_OFFSCREEN_TYPE:
  28380          return createFiberFromOffscreen(pendingProps, mode, lanes, key);
  28381
  28382        case REACT_LEGACY_HIDDEN_TYPE:
  28383
  28384        // eslint-disable-next-line no-fallthrough
  28385
  28386        case REACT_SCOPE_TYPE:
  28387
  28388        // eslint-disable-next-line no-fallthrough
  28389
  28390        case REACT_CACHE_TYPE:
  28391
  28392        // eslint-disable-next-line no-fallthrough
  28393
  28394        case REACT_TRACING_MARKER_TYPE:
  28395
  28396        // eslint-disable-next-line no-fallthrough
  28397
  28398        case REACT_DEBUG_TRACING_MODE_TYPE:
  28399
  28400        // eslint-disable-next-line no-fallthrough
  28401
  28402        default:
  28403          {
  28404            if (typeof type === 'object' && type !== null) {
  28405              switch (type.$$typeof) {
  28406                case REACT_PROVIDER_TYPE:
  28407                  fiberTag = ContextProvider;
  28408                  break getTag;
  28409
  28410                case REACT_CONTEXT_TYPE:
  28411                  // This is a consumer
  28412                  fiberTag = ContextConsumer;
  28413                  break getTag;
  28414
  28415                case REACT_FORWARD_REF_TYPE:
  28416                  fiberTag = ForwardRef;
  28417
  28418                  {
  28419                    resolvedType = resolveForwardRefForHotReloading(resolvedType);
  28420                  }
  28421
  28422                  break getTag;
  28423
  28424                case REACT_MEMO_TYPE:
  28425                  fiberTag = MemoComponent;
  28426                  break getTag;
  28427
  28428                case REACT_LAZY_TYPE:
  28429                  fiberTag = LazyComponent;
  28430                  resolvedType = null;
  28431                  break getTag;
  28432              }
  28433            }
  28434
  28435            var info = '';
  28436
  28437            {
  28438              if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {
  28439                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.';
  28440              }
  28441
  28442              var ownerName = owner ? getComponentNameFromFiber(owner) : null;
  28443
  28444              if (ownerName) {
  28445                info += '\n\nCheck the render method of `' + ownerName + '`.';
  28446              }
  28447            }
  28448
  28449            throw new 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));
  28450          }
  28451      }
  28452    }
  28453
  28454    var fiber = createFiber(fiberTag, pendingProps, key, mode);
  28455    fiber.elementType = type;
  28456    fiber.type = resolvedType;
  28457    fiber.lanes = lanes;
  28458
  28459    {
  28460      fiber._debugOwner = owner;
  28461    }
  28462
  28463    return fiber;
  28464  }
  28465  function createFiberFromElement(element, mode, lanes) {
  28466    var owner = null;
  28467
  28468    {
  28469      owner = element._owner;
  28470    }
  28471
  28472    var type = element.type;
  28473    var key = element.key;
  28474    var pendingProps = element.props;
  28475    var fiber = createFiberFromTypeAndProps(type, key, pendingProps, owner, mode, lanes);
  28476
  28477    {
  28478      fiber._debugSource = element._source;
  28479      fiber._debugOwner = element._owner;
  28480    }
  28481
  28482    return fiber;
  28483  }
  28484  function createFiberFromFragment(elements, mode, lanes, key) {
  28485    var fiber = createFiber(Fragment, elements, key, mode);
  28486    fiber.lanes = lanes;
  28487    return fiber;
  28488  }
  28489
  28490  function createFiberFromProfiler(pendingProps, mode, lanes, key) {
  28491    {
  28492      if (typeof pendingProps.id !== 'string') {
  28493        error('Profiler must specify an "id" of type `string` as a prop. Received the type `%s` instead.', typeof pendingProps.id);
  28494      }
  28495    }
  28496
  28497    var fiber = createFiber(Profiler, pendingProps, key, mode | ProfileMode);
  28498    fiber.elementType = REACT_PROFILER_TYPE;
  28499    fiber.lanes = lanes;
  28500
  28501    {
  28502      fiber.stateNode = {
  28503        effectDuration: 0,
  28504        passiveEffectDuration: 0
  28505      };
  28506    }
  28507
  28508    return fiber;
  28509  }
  28510
  28511  function createFiberFromSuspense(pendingProps, mode, lanes, key) {
  28512    var fiber = createFiber(SuspenseComponent, pendingProps, key, mode);
  28513    fiber.elementType = REACT_SUSPENSE_TYPE;
  28514    fiber.lanes = lanes;
  28515    return fiber;
  28516  }
  28517  function createFiberFromSuspenseList(pendingProps, mode, lanes, key) {
  28518    var fiber = createFiber(SuspenseListComponent, pendingProps, key, mode);
  28519    fiber.elementType = REACT_SUSPENSE_LIST_TYPE;
  28520    fiber.lanes = lanes;
  28521    return fiber;
  28522  }
  28523  function createFiberFromOffscreen(pendingProps, mode, lanes, key) {
  28524    var fiber = createFiber(OffscreenComponent, pendingProps, key, mode);
  28525    fiber.elementType = REACT_OFFSCREEN_TYPE;
  28526    fiber.lanes = lanes;
  28527    var primaryChildInstance = {
  28528      isHidden: false
  28529    };
  28530    fiber.stateNode = primaryChildInstance;
  28531    return fiber;
  28532  }
  28533  function createFiberFromText(content, mode, lanes) {
  28534    var fiber = createFiber(HostText, content, null, mode);
  28535    fiber.lanes = lanes;
  28536    return fiber;
  28537  }
  28538  function createFiberFromHostInstanceForDeletion() {
  28539    var fiber = createFiber(HostComponent, null, null, NoMode);
  28540    fiber.elementType = 'DELETED';
  28541    return fiber;
  28542  }
  28543  function createFiberFromDehydratedFragment(dehydratedNode) {
  28544    var fiber = createFiber(DehydratedFragment, null, null, NoMode);
  28545    fiber.stateNode = dehydratedNode;
  28546    return fiber;
  28547  }
  28548  function createFiberFromPortal(portal, mode, lanes) {
  28549    var pendingProps = portal.children !== null ? portal.children : [];
  28550    var fiber = createFiber(HostPortal, pendingProps, portal.key, mode);
  28551    fiber.lanes = lanes;
  28552    fiber.stateNode = {
  28553      containerInfo: portal.containerInfo,
  28554      pendingChildren: null,
  28555      // Used by persistent updates
  28556      implementation: portal.implementation
  28557    };
  28558    return fiber;
  28559  } // Used for stashing WIP properties to replay failed work in DEV.
  28560
  28561  function assignFiberPropertiesInDEV(target, source) {
  28562    if (target === null) {
  28563      // This Fiber's initial properties will always be overwritten.
  28564      // We only use a Fiber to ensure the same hidden class so DEV isn't slow.
  28565      target = createFiber(IndeterminateComponent, null, null, NoMode);
  28566    } // This is intentionally written as a list of all properties.
  28567    // We tried to use Object.assign() instead but this is called in
  28568    // the hottest path, and Object.assign() was too slow:
  28569    // https://github.com/facebook/react/issues/12502
  28570    // This code is DEV-only so size is not a concern.
  28571
  28572
  28573    target.tag = source.tag;
  28574    target.key = source.key;
  28575    target.elementType = source.elementType;
  28576    target.type = source.type;
  28577    target.stateNode = source.stateNode;
  28578    target.return = source.return;
  28579    target.child = source.child;
  28580    target.sibling = source.sibling;
  28581    target.index = source.index;
  28582    target.ref = source.ref;
  28583    target.pendingProps = source.pendingProps;
  28584    target.memoizedProps = source.memoizedProps;
  28585    target.updateQueue = source.updateQueue;
  28586    target.memoizedState = source.memoizedState;
  28587    target.dependencies = source.dependencies;
  28588    target.mode = source.mode;
  28589    target.flags = source.flags;
  28590    target.subtreeFlags = source.subtreeFlags;
  28591    target.deletions = source.deletions;
  28592    target.lanes = source.lanes;
  28593    target.childLanes = source.childLanes;
  28594    target.alternate = source.alternate;
  28595
  28596    {
  28597      target.actualDuration = source.actualDuration;
  28598      target.actualStartTime = source.actualStartTime;
  28599      target.selfBaseDuration = source.selfBaseDuration;
  28600      target.treeBaseDuration = source.treeBaseDuration;
  28601    }
  28602
  28603    target._debugSource = source._debugSource;
  28604    target._debugOwner = source._debugOwner;
  28605    target._debugNeedsRemount = source._debugNeedsRemount;
  28606    target._debugHookTypes = source._debugHookTypes;
  28607    return target;
  28608  }
  28609
  28610  function FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError) {
  28611    this.tag = tag;
  28612    this.containerInfo = containerInfo;
  28613    this.pendingChildren = null;
  28614    this.current = null;
  28615    this.pingCache = null;
  28616    this.finishedWork = null;
  28617    this.timeoutHandle = noTimeout;
  28618    this.context = null;
  28619    this.pendingContext = null;
  28620    this.callbackNode = null;
  28621    this.callbackPriority = NoLane;
  28622    this.eventTimes = createLaneMap(NoLanes);
  28623    this.expirationTimes = createLaneMap(NoTimestamp);
  28624    this.pendingLanes = NoLanes;
  28625    this.suspendedLanes = NoLanes;
  28626    this.pingedLanes = NoLanes;
  28627    this.expiredLanes = NoLanes;
  28628    this.mutableReadLanes = NoLanes;
  28629    this.finishedLanes = NoLanes;
  28630    this.entangledLanes = NoLanes;
  28631    this.entanglements = createLaneMap(NoLanes);
  28632    this.identifierPrefix = identifierPrefix;
  28633    this.onRecoverableError = onRecoverableError;
  28634
  28635    {
  28636      this.mutableSourceEagerHydrationData = null;
  28637    }
  28638
  28639    {
  28640      this.effectDuration = 0;
  28641      this.passiveEffectDuration = 0;
  28642    }
  28643
  28644    {
  28645      this.memoizedUpdaters = new Set();
  28646      var pendingUpdatersLaneMap = this.pendingUpdatersLaneMap = [];
  28647
  28648      for (var _i = 0; _i < TotalLanes; _i++) {
  28649        pendingUpdatersLaneMap.push(new Set());
  28650      }
  28651    }
  28652
  28653    {
  28654      switch (tag) {
  28655        case ConcurrentRoot:
  28656          this._debugRootType = hydrate ? 'hydrateRoot()' : 'createRoot()';
  28657          break;
  28658
  28659        case LegacyRoot:
  28660          this._debugRootType = hydrate ? 'hydrate()' : 'render()';
  28661          break;
  28662      }
  28663    }
  28664  }
  28665
  28666  function createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, // TODO: We have several of these arguments that are conceptually part of the
  28667  // host config, but because they are passed in at runtime, we have to thread
  28668  // them through the root constructor. Perhaps we should put them all into a
  28669  // single type, like a DynamicHostConfig that is defined by the renderer.
  28670  identifierPrefix, onRecoverableError, transitionCallbacks) {
  28671    var root = new FiberRootNode(containerInfo, tag, hydrate, identifierPrefix, onRecoverableError);
  28672    // stateNode is any.
  28673
  28674
  28675    var uninitializedFiber = createHostRootFiber(tag, isStrictMode);
  28676    root.current = uninitializedFiber;
  28677    uninitializedFiber.stateNode = root;
  28678
  28679    {
  28680      var _initialState = {
  28681        element: initialChildren,
  28682        isDehydrated: hydrate,
  28683        cache: null,
  28684        // not enabled yet
  28685        transitions: null,
  28686        pendingSuspenseBoundaries: null
  28687      };
  28688      uninitializedFiber.memoizedState = _initialState;
  28689    }
  28690
  28691    initializeUpdateQueue(uninitializedFiber);
  28692    return root;
  28693  }
  28694
  28695  var ReactVersion = '18.2.0';
  28696
  28697  function createPortal(children, containerInfo, // TODO: figure out the API for cross-renderer implementation.
  28698  implementation) {
  28699    var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
  28700
  28701    {
  28702      checkKeyStringCoercion(key);
  28703    }
  28704
  28705    return {
  28706      // This tag allow us to uniquely identify this as a React Portal
  28707      $$typeof: REACT_PORTAL_TYPE,
  28708      key: key == null ? null : '' + key,
  28709      children: children,
  28710      containerInfo: containerInfo,
  28711      implementation: implementation
  28712    };
  28713  }
  28714
  28715  var didWarnAboutNestedUpdates;
  28716  var didWarnAboutFindNodeInStrictMode;
  28717
  28718  {
  28719    didWarnAboutNestedUpdates = false;
  28720    didWarnAboutFindNodeInStrictMode = {};
  28721  }
  28722
  28723  function getContextForSubtree(parentComponent) {
  28724    if (!parentComponent) {
  28725      return emptyContextObject;
  28726    }
  28727
  28728    var fiber = get(parentComponent);
  28729    var parentContext = findCurrentUnmaskedContext(fiber);
  28730
  28731    if (fiber.tag === ClassComponent) {
  28732      var Component = fiber.type;
  28733
  28734      if (isContextProvider(Component)) {
  28735        return processChildContext(fiber, Component, parentContext);
  28736      }
  28737    }
  28738
  28739    return parentContext;
  28740  }
  28741
  28742  function findHostInstanceWithWarning(component, methodName) {
  28743    {
  28744      var fiber = get(component);
  28745
  28746      if (fiber === undefined) {
  28747        if (typeof component.render === 'function') {
  28748          throw new Error('Unable to find node on an unmounted component.');
  28749        } else {
  28750          var keys = Object.keys(component).join(',');
  28751          throw new Error("Argument appears to not be a ReactComponent. Keys: " + keys);
  28752        }
  28753      }
  28754
  28755      var hostFiber = findCurrentHostFiber(fiber);
  28756
  28757      if (hostFiber === null) {
  28758        return null;
  28759      }
  28760
  28761      if (hostFiber.mode & StrictLegacyMode) {
  28762        var componentName = getComponentNameFromFiber(fiber) || 'Component';
  28763
  28764        if (!didWarnAboutFindNodeInStrictMode[componentName]) {
  28765          didWarnAboutFindNodeInStrictMode[componentName] = true;
  28766          var previousFiber = current;
  28767
  28768          try {
  28769            setCurrentFiber(hostFiber);
  28770
  28771            if (fiber.mode & StrictLegacyMode) {
  28772              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://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
  28773            } else {
  28774              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://reactjs.org/link/strict-mode-find-node', methodName, methodName, componentName);
  28775            }
  28776          } finally {
  28777            // Ideally this should reset to previous but this shouldn't be called in
  28778            // render and there's another warning for that anyway.
  28779            if (previousFiber) {
  28780              setCurrentFiber(previousFiber);
  28781            } else {
  28782              resetCurrentFiber();
  28783            }
  28784          }
  28785        }
  28786      }
  28787
  28788      return hostFiber.stateNode;
  28789    }
  28790  }
  28791
  28792  function createContainer(containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
  28793    var hydrate = false;
  28794    var initialChildren = null;
  28795    return createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
  28796  }
  28797  function createHydrationContainer(initialChildren, // TODO: Remove `callback` when we delete legacy mode.
  28798  callback, containerInfo, tag, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError, transitionCallbacks) {
  28799    var hydrate = true;
  28800    var root = createFiberRoot(containerInfo, tag, hydrate, initialChildren, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError); // TODO: Move this to FiberRoot constructor
  28801
  28802    root.context = getContextForSubtree(null); // Schedule the initial render. In a hydration root, this is different from
  28803    // a regular update because the initial render must match was was rendered
  28804    // on the server.
  28805    // NOTE: This update intentionally doesn't have a payload. We're only using
  28806    // the update to schedule work on the root fiber (and, for legacy roots, to
  28807    // enqueue the callback if one is provided).
  28808
  28809    var current = root.current;
  28810    var eventTime = requestEventTime();
  28811    var lane = requestUpdateLane(current);
  28812    var update = createUpdate(eventTime, lane);
  28813    update.callback = callback !== undefined && callback !== null ? callback : null;
  28814    enqueueUpdate(current, update, lane);
  28815    scheduleInitialHydrationOnRoot(root, lane, eventTime);
  28816    return root;
  28817  }
  28818  function updateContainer(element, container, parentComponent, callback) {
  28819    {
  28820      onScheduleRoot(container, element);
  28821    }
  28822
  28823    var current$1 = container.current;
  28824    var eventTime = requestEventTime();
  28825    var lane = requestUpdateLane(current$1);
  28826
  28827    {
  28828      markRenderScheduled(lane);
  28829    }
  28830
  28831    var context = getContextForSubtree(parentComponent);
  28832
  28833    if (container.context === null) {
  28834      container.context = context;
  28835    } else {
  28836      container.pendingContext = context;
  28837    }
  28838
  28839    {
  28840      if (isRendering && current !== null && !didWarnAboutNestedUpdates) {
  28841        didWarnAboutNestedUpdates = true;
  28842
  28843        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.', getComponentNameFromFiber(current) || 'Unknown');
  28844      }
  28845    }
  28846
  28847    var update = createUpdate(eventTime, lane); // Caution: React DevTools currently depends on this property
  28848    // being called "element".
  28849
  28850    update.payload = {
  28851      element: element
  28852    };
  28853    callback = callback === undefined ? null : callback;
  28854
  28855    if (callback !== null) {
  28856      {
  28857        if (typeof callback !== 'function') {
  28858          error('render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);
  28859        }
  28860      }
  28861
  28862      update.callback = callback;
  28863    }
  28864
  28865    var root = enqueueUpdate(current$1, update, lane);
  28866
  28867    if (root !== null) {
  28868      scheduleUpdateOnFiber(root, current$1, lane, eventTime);
  28869      entangleTransitions(root, current$1, lane);
  28870    }
  28871
  28872    return lane;
  28873  }
  28874  function getPublicRootInstance(container) {
  28875    var containerFiber = container.current;
  28876
  28877    if (!containerFiber.child) {
  28878      return null;
  28879    }
  28880
  28881    switch (containerFiber.child.tag) {
  28882      case HostComponent:
  28883        return getPublicInstance(containerFiber.child.stateNode);
  28884
  28885      default:
  28886        return containerFiber.child.stateNode;
  28887    }
  28888  }
  28889  function attemptSynchronousHydration$1(fiber) {
  28890    switch (fiber.tag) {
  28891      case HostRoot:
  28892        {
  28893          var root = fiber.stateNode;
  28894
  28895          if (isRootDehydrated(root)) {
  28896            // Flush the first scheduled "update".
  28897            var lanes = getHighestPriorityPendingLanes(root);
  28898            flushRoot(root, lanes);
  28899          }
  28900
  28901          break;
  28902        }
  28903
  28904      case SuspenseComponent:
  28905        {
  28906          flushSync(function () {
  28907            var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  28908
  28909            if (root !== null) {
  28910              var eventTime = requestEventTime();
  28911              scheduleUpdateOnFiber(root, fiber, SyncLane, eventTime);
  28912            }
  28913          }); // If we're still blocked after this, we need to increase
  28914          // the priority of any promises resolving within this
  28915          // boundary so that they next attempt also has higher pri.
  28916
  28917          var retryLane = SyncLane;
  28918          markRetryLaneIfNotHydrated(fiber, retryLane);
  28919          break;
  28920        }
  28921    }
  28922  }
  28923
  28924  function markRetryLaneImpl(fiber, retryLane) {
  28925    var suspenseState = fiber.memoizedState;
  28926
  28927    if (suspenseState !== null && suspenseState.dehydrated !== null) {
  28928      suspenseState.retryLane = higherPriorityLane(suspenseState.retryLane, retryLane);
  28929    }
  28930  } // Increases the priority of thenables when they resolve within this boundary.
  28931
  28932
  28933  function markRetryLaneIfNotHydrated(fiber, retryLane) {
  28934    markRetryLaneImpl(fiber, retryLane);
  28935    var alternate = fiber.alternate;
  28936
  28937    if (alternate) {
  28938      markRetryLaneImpl(alternate, retryLane);
  28939    }
  28940  }
  28941  function attemptContinuousHydration$1(fiber) {
  28942    if (fiber.tag !== SuspenseComponent) {
  28943      // We ignore HostRoots here because we can't increase
  28944      // their priority and they should not suspend on I/O,
  28945      // since you have to wrap anything that might suspend in
  28946      // Suspense.
  28947      return;
  28948    }
  28949
  28950    var lane = SelectiveHydrationLane;
  28951    var root = enqueueConcurrentRenderForLane(fiber, lane);
  28952
  28953    if (root !== null) {
  28954      var eventTime = requestEventTime();
  28955      scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  28956    }
  28957
  28958    markRetryLaneIfNotHydrated(fiber, lane);
  28959  }
  28960  function attemptHydrationAtCurrentPriority$1(fiber) {
  28961    if (fiber.tag !== SuspenseComponent) {
  28962      // We ignore HostRoots here because we can't increase
  28963      // their priority other than synchronously flush it.
  28964      return;
  28965    }
  28966
  28967    var lane = requestUpdateLane(fiber);
  28968    var root = enqueueConcurrentRenderForLane(fiber, lane);
  28969
  28970    if (root !== null) {
  28971      var eventTime = requestEventTime();
  28972      scheduleUpdateOnFiber(root, fiber, lane, eventTime);
  28973    }
  28974
  28975    markRetryLaneIfNotHydrated(fiber, lane);
  28976  }
  28977  function findHostInstanceWithNoPortals(fiber) {
  28978    var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
  28979
  28980    if (hostFiber === null) {
  28981      return null;
  28982    }
  28983
  28984    return hostFiber.stateNode;
  28985  }
  28986
  28987  var shouldErrorImpl = function (fiber) {
  28988    return null;
  28989  };
  28990
  28991  function shouldError(fiber) {
  28992    return shouldErrorImpl(fiber);
  28993  }
  28994
  28995  var shouldSuspendImpl = function (fiber) {
  28996    return false;
  28997  };
  28998
  28999  function shouldSuspend(fiber) {
  29000    return shouldSuspendImpl(fiber);
  29001  }
  29002  var overrideHookState = null;
  29003  var overrideHookStateDeletePath = null;
  29004  var overrideHookStateRenamePath = null;
  29005  var overrideProps = null;
  29006  var overridePropsDeletePath = null;
  29007  var overridePropsRenamePath = null;
  29008  var scheduleUpdate = null;
  29009  var setErrorHandler = null;
  29010  var setSuspenseHandler = null;
  29011
  29012  {
  29013    var copyWithDeleteImpl = function (obj, path, index) {
  29014      var key = path[index];
  29015      var updated = isArray(obj) ? obj.slice() : assign({}, obj);
  29016
  29017      if (index + 1 === path.length) {
  29018        if (isArray(updated)) {
  29019          updated.splice(key, 1);
  29020        } else {
  29021          delete updated[key];
  29022        }
  29023
  29024        return updated;
  29025      } // $FlowFixMe number or string is fine here
  29026
  29027
  29028      updated[key] = copyWithDeleteImpl(obj[key], path, index + 1);
  29029      return updated;
  29030    };
  29031
  29032    var copyWithDelete = function (obj, path) {
  29033      return copyWithDeleteImpl(obj, path, 0);
  29034    };
  29035
  29036    var copyWithRenameImpl = function (obj, oldPath, newPath, index) {
  29037      var oldKey = oldPath[index];
  29038      var updated = isArray(obj) ? obj.slice() : assign({}, obj);
  29039
  29040      if (index + 1 === oldPath.length) {
  29041        var newKey = newPath[index]; // $FlowFixMe number or string is fine here
  29042
  29043        updated[newKey] = updated[oldKey];
  29044
  29045        if (isArray(updated)) {
  29046          updated.splice(oldKey, 1);
  29047        } else {
  29048          delete updated[oldKey];
  29049        }
  29050      } else {
  29051        // $FlowFixMe number or string is fine here
  29052        updated[oldKey] = copyWithRenameImpl( // $FlowFixMe number or string is fine here
  29053        obj[oldKey], oldPath, newPath, index + 1);
  29054      }
  29055
  29056      return updated;
  29057    };
  29058
  29059    var copyWithRename = function (obj, oldPath, newPath) {
  29060      if (oldPath.length !== newPath.length) {
  29061        warn('copyWithRename() expects paths of the same length');
  29062
  29063        return;
  29064      } else {
  29065        for (var i = 0; i < newPath.length - 1; i++) {
  29066          if (oldPath[i] !== newPath[i]) {
  29067            warn('copyWithRename() expects paths to be the same except for the deepest key');
  29068
  29069            return;
  29070          }
  29071        }
  29072      }
  29073
  29074      return copyWithRenameImpl(obj, oldPath, newPath, 0);
  29075    };
  29076
  29077    var copyWithSetImpl = function (obj, path, index, value) {
  29078      if (index >= path.length) {
  29079        return value;
  29080      }
  29081
  29082      var key = path[index];
  29083      var updated = isArray(obj) ? obj.slice() : assign({}, obj); // $FlowFixMe number or string is fine here
  29084
  29085      updated[key] = copyWithSetImpl(obj[key], path, index + 1, value);
  29086      return updated;
  29087    };
  29088
  29089    var copyWithSet = function (obj, path, value) {
  29090      return copyWithSetImpl(obj, path, 0, value);
  29091    };
  29092
  29093    var findHook = function (fiber, id) {
  29094      // For now, the "id" of stateful hooks is just the stateful hook index.
  29095      // This may change in the future with e.g. nested hooks.
  29096      var currentHook = fiber.memoizedState;
  29097
  29098      while (currentHook !== null && id > 0) {
  29099        currentHook = currentHook.next;
  29100        id--;
  29101      }
  29102
  29103      return currentHook;
  29104    }; // Support DevTools editable values for useState and useReducer.
  29105
  29106
  29107    overrideHookState = function (fiber, id, path, value) {
  29108      var hook = findHook(fiber, id);
  29109
  29110      if (hook !== null) {
  29111        var newState = copyWithSet(hook.memoizedState, path, value);
  29112        hook.memoizedState = newState;
  29113        hook.baseState = newState; // We aren't actually adding an update to the queue,
  29114        // because there is no update we can add for useReducer hooks that won't trigger an error.
  29115        // (There's no appropriate action type for DevTools overrides.)
  29116        // As a result though, React will see the scheduled update as a noop and bailout.
  29117        // Shallow cloning props works as a workaround for now to bypass the bailout check.
  29118
  29119        fiber.memoizedProps = assign({}, fiber.memoizedProps);
  29120        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29121
  29122        if (root !== null) {
  29123          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29124        }
  29125      }
  29126    };
  29127
  29128    overrideHookStateDeletePath = function (fiber, id, path) {
  29129      var hook = findHook(fiber, id);
  29130
  29131      if (hook !== null) {
  29132        var newState = copyWithDelete(hook.memoizedState, path);
  29133        hook.memoizedState = newState;
  29134        hook.baseState = newState; // We aren't actually adding an update to the queue,
  29135        // because there is no update we can add for useReducer hooks that won't trigger an error.
  29136        // (There's no appropriate action type for DevTools overrides.)
  29137        // As a result though, React will see the scheduled update as a noop and bailout.
  29138        // Shallow cloning props works as a workaround for now to bypass the bailout check.
  29139
  29140        fiber.memoizedProps = assign({}, fiber.memoizedProps);
  29141        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29142
  29143        if (root !== null) {
  29144          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29145        }
  29146      }
  29147    };
  29148
  29149    overrideHookStateRenamePath = function (fiber, id, oldPath, newPath) {
  29150      var hook = findHook(fiber, id);
  29151
  29152      if (hook !== null) {
  29153        var newState = copyWithRename(hook.memoizedState, oldPath, newPath);
  29154        hook.memoizedState = newState;
  29155        hook.baseState = newState; // We aren't actually adding an update to the queue,
  29156        // because there is no update we can add for useReducer hooks that won't trigger an error.
  29157        // (There's no appropriate action type for DevTools overrides.)
  29158        // As a result though, React will see the scheduled update as a noop and bailout.
  29159        // Shallow cloning props works as a workaround for now to bypass the bailout check.
  29160
  29161        fiber.memoizedProps = assign({}, fiber.memoizedProps);
  29162        var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29163
  29164        if (root !== null) {
  29165          scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29166        }
  29167      }
  29168    }; // Support DevTools props for function components, forwardRef, memo, host components, etc.
  29169
  29170
  29171    overrideProps = function (fiber, path, value) {
  29172      fiber.pendingProps = copyWithSet(fiber.memoizedProps, path, value);
  29173
  29174      if (fiber.alternate) {
  29175        fiber.alternate.pendingProps = fiber.pendingProps;
  29176      }
  29177
  29178      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29179
  29180      if (root !== null) {
  29181        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29182      }
  29183    };
  29184
  29185    overridePropsDeletePath = function (fiber, path) {
  29186      fiber.pendingProps = copyWithDelete(fiber.memoizedProps, path);
  29187
  29188      if (fiber.alternate) {
  29189        fiber.alternate.pendingProps = fiber.pendingProps;
  29190      }
  29191
  29192      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29193
  29194      if (root !== null) {
  29195        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29196      }
  29197    };
  29198
  29199    overridePropsRenamePath = function (fiber, oldPath, newPath) {
  29200      fiber.pendingProps = copyWithRename(fiber.memoizedProps, oldPath, newPath);
  29201
  29202      if (fiber.alternate) {
  29203        fiber.alternate.pendingProps = fiber.pendingProps;
  29204      }
  29205
  29206      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29207
  29208      if (root !== null) {
  29209        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29210      }
  29211    };
  29212
  29213    scheduleUpdate = function (fiber) {
  29214      var root = enqueueConcurrentRenderForLane(fiber, SyncLane);
  29215
  29216      if (root !== null) {
  29217        scheduleUpdateOnFiber(root, fiber, SyncLane, NoTimestamp);
  29218      }
  29219    };
  29220
  29221    setErrorHandler = function (newShouldErrorImpl) {
  29222      shouldErrorImpl = newShouldErrorImpl;
  29223    };
  29224
  29225    setSuspenseHandler = function (newShouldSuspendImpl) {
  29226      shouldSuspendImpl = newShouldSuspendImpl;
  29227    };
  29228  }
  29229
  29230  function findHostInstanceByFiber(fiber) {
  29231    var hostFiber = findCurrentHostFiber(fiber);
  29232
  29233    if (hostFiber === null) {
  29234      return null;
  29235    }
  29236
  29237    return hostFiber.stateNode;
  29238  }
  29239
  29240  function emptyFindFiberByHostInstance(instance) {
  29241    return null;
  29242  }
  29243
  29244  function getCurrentFiberForDevTools() {
  29245    return current;
  29246  }
  29247
  29248  function injectIntoDevTools(devToolsConfig) {
  29249    var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;
  29250    var ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;
  29251    return injectInternals({
  29252      bundleType: devToolsConfig.bundleType,
  29253      version: devToolsConfig.version,
  29254      rendererPackageName: devToolsConfig.rendererPackageName,
  29255      rendererConfig: devToolsConfig.rendererConfig,
  29256      overrideHookState: overrideHookState,
  29257      overrideHookStateDeletePath: overrideHookStateDeletePath,
  29258      overrideHookStateRenamePath: overrideHookStateRenamePath,
  29259      overrideProps: overrideProps,
  29260      overridePropsDeletePath: overridePropsDeletePath,
  29261      overridePropsRenamePath: overridePropsRenamePath,
  29262      setErrorHandler: setErrorHandler,
  29263      setSuspenseHandler: setSuspenseHandler,
  29264      scheduleUpdate: scheduleUpdate,
  29265      currentDispatcherRef: ReactCurrentDispatcher,
  29266      findHostInstanceByFiber: findHostInstanceByFiber,
  29267      findFiberByHostInstance: findFiberByHostInstance || emptyFindFiberByHostInstance,
  29268      // React Refresh
  29269      findHostInstancesForRefresh:  findHostInstancesForRefresh ,
  29270      scheduleRefresh:  scheduleRefresh ,
  29271      scheduleRoot:  scheduleRoot ,
  29272      setRefreshHandler:  setRefreshHandler ,
  29273      // Enables DevTools to append owner stacks to error messages in DEV mode.
  29274      getCurrentFiber:  getCurrentFiberForDevTools ,
  29275      // Enables DevTools to detect reconciler version rather than renderer version
  29276      // which may not match for third party renderers.
  29277      reconcilerVersion: ReactVersion
  29278    });
  29279  }
  29280
  29281  /* global reportError */
  29282
  29283  var defaultOnRecoverableError = typeof reportError === 'function' ? // In modern browsers, reportError will dispatch an error event,
  29284  // emulating an uncaught JavaScript error.
  29285  reportError : function (error) {
  29286    // In older browsers and test environments, fallback to console.error.
  29287    // eslint-disable-next-line react-internal/no-production-logging
  29288    console['error'](error);
  29289  };
  29290
  29291  function ReactDOMRoot(internalRoot) {
  29292    this._internalRoot = internalRoot;
  29293  }
  29294
  29295  ReactDOMHydrationRoot.prototype.render = ReactDOMRoot.prototype.render = function (children) {
  29296    var root = this._internalRoot;
  29297
  29298    if (root === null) {
  29299      throw new Error('Cannot update an unmounted root.');
  29300    }
  29301
  29302    {
  29303      if (typeof arguments[1] === 'function') {
  29304        error('render(...): does not support the second callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
  29305      } else if (isValidContainer(arguments[1])) {
  29306        error('You passed a container to the second argument of root.render(...). ' + "You don't need to pass it again since you already passed it to create the root.");
  29307      } else if (typeof arguments[1] !== 'undefined') {
  29308        error('You passed a second argument to root.render(...) but it only accepts ' + 'one argument.');
  29309      }
  29310
  29311      var container = root.containerInfo;
  29312
  29313      if (container.nodeType !== COMMENT_NODE) {
  29314        var hostInstance = findHostInstanceWithNoPortals(root.current);
  29315
  29316        if (hostInstance) {
  29317          if (hostInstance.parentNode !== container) {
  29318            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.");
  29319          }
  29320        }
  29321      }
  29322    }
  29323
  29324    updateContainer(children, root, null, null);
  29325  };
  29326
  29327  ReactDOMHydrationRoot.prototype.unmount = ReactDOMRoot.prototype.unmount = function () {
  29328    {
  29329      if (typeof arguments[0] === 'function') {
  29330        error('unmount(...): does not support a callback argument. ' + 'To execute a side effect after rendering, declare it in a component body with useEffect().');
  29331      }
  29332    }
  29333
  29334    var root = this._internalRoot;
  29335
  29336    if (root !== null) {
  29337      this._internalRoot = null;
  29338      var container = root.containerInfo;
  29339
  29340      {
  29341        if (isAlreadyRendering()) {
  29342          error('Attempted to synchronously unmount a root while React was already ' + 'rendering. React cannot finish unmounting the root until the ' + 'current render has completed, which may lead to a race condition.');
  29343        }
  29344      }
  29345
  29346      flushSync(function () {
  29347        updateContainer(null, root, null, null);
  29348      });
  29349      unmarkContainerAsRoot(container);
  29350    }
  29351  };
  29352
  29353  function createRoot(container, options) {
  29354    if (!isValidContainer(container)) {
  29355      throw new Error('createRoot(...): Target container is not a DOM element.');
  29356    }
  29357
  29358    warnIfReactDOMContainerInDEV(container);
  29359    var isStrictMode = false;
  29360    var concurrentUpdatesByDefaultOverride = false;
  29361    var identifierPrefix = '';
  29362    var onRecoverableError = defaultOnRecoverableError;
  29363    var transitionCallbacks = null;
  29364
  29365    if (options !== null && options !== undefined) {
  29366      {
  29367        if (options.hydrate) {
  29368          warn('hydrate through createRoot is deprecated. Use ReactDOMClient.hydrateRoot(container, <App />) instead.');
  29369        } else {
  29370          if (typeof options === 'object' && options !== null && options.$$typeof === REACT_ELEMENT_TYPE) {
  29371            error('You passed a JSX element to createRoot. You probably meant to ' + 'call root.render instead. ' + 'Example usage:\n\n' + '  let root = createRoot(domContainer);\n' + '  root.render(<App />);');
  29372          }
  29373        }
  29374      }
  29375
  29376      if (options.unstable_strictMode === true) {
  29377        isStrictMode = true;
  29378      }
  29379
  29380      if (options.identifierPrefix !== undefined) {
  29381        identifierPrefix = options.identifierPrefix;
  29382      }
  29383
  29384      if (options.onRecoverableError !== undefined) {
  29385        onRecoverableError = options.onRecoverableError;
  29386      }
  29387
  29388      if (options.transitionCallbacks !== undefined) {
  29389        transitionCallbacks = options.transitionCallbacks;
  29390      }
  29391    }
  29392
  29393    var root = createContainer(container, ConcurrentRoot, null, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
  29394    markContainerAsRoot(root.current, container);
  29395    var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
  29396    listenToAllSupportedEvents(rootContainerElement);
  29397    return new ReactDOMRoot(root);
  29398  }
  29399
  29400  function ReactDOMHydrationRoot(internalRoot) {
  29401    this._internalRoot = internalRoot;
  29402  }
  29403
  29404  function scheduleHydration(target) {
  29405    if (target) {
  29406      queueExplicitHydrationTarget(target);
  29407    }
  29408  }
  29409
  29410  ReactDOMHydrationRoot.prototype.unstable_scheduleHydration = scheduleHydration;
  29411  function hydrateRoot(container, initialChildren, options) {
  29412    if (!isValidContainer(container)) {
  29413      throw new Error('hydrateRoot(...): Target container is not a DOM element.');
  29414    }
  29415
  29416    warnIfReactDOMContainerInDEV(container);
  29417
  29418    {
  29419      if (initialChildren === undefined) {
  29420        error('Must provide initial children as second argument to hydrateRoot. ' + 'Example usage: hydrateRoot(domContainer, <App />)');
  29421      }
  29422    } // For now we reuse the whole bag of options since they contain
  29423    // the hydration callbacks.
  29424
  29425
  29426    var hydrationCallbacks = options != null ? options : null; // TODO: Delete this option
  29427
  29428    var mutableSources = options != null && options.hydratedSources || null;
  29429    var isStrictMode = false;
  29430    var concurrentUpdatesByDefaultOverride = false;
  29431    var identifierPrefix = '';
  29432    var onRecoverableError = defaultOnRecoverableError;
  29433
  29434    if (options !== null && options !== undefined) {
  29435      if (options.unstable_strictMode === true) {
  29436        isStrictMode = true;
  29437      }
  29438
  29439      if (options.identifierPrefix !== undefined) {
  29440        identifierPrefix = options.identifierPrefix;
  29441      }
  29442
  29443      if (options.onRecoverableError !== undefined) {
  29444        onRecoverableError = options.onRecoverableError;
  29445      }
  29446    }
  29447
  29448    var root = createHydrationContainer(initialChildren, null, container, ConcurrentRoot, hydrationCallbacks, isStrictMode, concurrentUpdatesByDefaultOverride, identifierPrefix, onRecoverableError);
  29449    markContainerAsRoot(root.current, container); // This can't be a comment node since hydration doesn't work on comment nodes anyway.
  29450
  29451    listenToAllSupportedEvents(container);
  29452
  29453    if (mutableSources) {
  29454      for (var i = 0; i < mutableSources.length; i++) {
  29455        var mutableSource = mutableSources[i];
  29456        registerMutableSourceForHydration(root, mutableSource);
  29457      }
  29458    }
  29459
  29460    return new ReactDOMHydrationRoot(root);
  29461  }
  29462  function isValidContainer(node) {
  29463    return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || !disableCommentsAsDOMContainers  ));
  29464  } // TODO: Remove this function which also includes comment nodes.
  29465  // We only use it in places that are currently more relaxed.
  29466
  29467  function isValidContainerLegacy(node) {
  29468    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 '));
  29469  }
  29470
  29471  function warnIfReactDOMContainerInDEV(container) {
  29472    {
  29473      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
  29474        error('createRoot(): Creating roots directly with 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 using a container element created ' + 'for your app.');
  29475      }
  29476
  29477      if (isContainerMarkedAsRoot(container)) {
  29478        if (container._reactRootContainer) {
  29479          error('You are calling ReactDOMClient.createRoot() on a container that was previously ' + 'passed to ReactDOM.render(). This is not supported.');
  29480        } else {
  29481          error('You are calling ReactDOMClient.createRoot() on a container that ' + 'has already been passed to createRoot() before. Instead, call ' + 'root.render() on the existing root instead if you want to update it.');
  29482        }
  29483      }
  29484    }
  29485  }
  29486
  29487  var ReactCurrentOwner$3 = ReactSharedInternals.ReactCurrentOwner;
  29488  var topLevelUpdateWarnings;
  29489
  29490  {
  29491    topLevelUpdateWarnings = function (container) {
  29492      if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {
  29493        var hostInstance = findHostInstanceWithNoPortals(container._reactRootContainer.current);
  29494
  29495        if (hostInstance) {
  29496          if (hostInstance.parentNode !== container) {
  29497            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.');
  29498          }
  29499        }
  29500      }
  29501
  29502      var isRootRenderedBySomeReact = !!container._reactRootContainer;
  29503      var rootEl = getReactRootElementInContainer(container);
  29504      var hasNonRootReactChild = !!(rootEl && getInstanceFromNode(rootEl));
  29505
  29506      if (hasNonRootReactChild && !isRootRenderedBySomeReact) {
  29507        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.');
  29508      }
  29509
  29510      if (container.nodeType === ELEMENT_NODE && container.tagName && container.tagName.toUpperCase() === 'BODY') {
  29511        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.');
  29512      }
  29513    };
  29514  }
  29515
  29516  function getReactRootElementInContainer(container) {
  29517    if (!container) {
  29518      return null;
  29519    }
  29520
  29521    if (container.nodeType === DOCUMENT_NODE) {
  29522      return container.documentElement;
  29523    } else {
  29524      return container.firstChild;
  29525    }
  29526  }
  29527
  29528  function noopOnRecoverableError() {// This isn't reachable because onRecoverableError isn't called in the
  29529    // legacy API.
  29530  }
  29531
  29532  function legacyCreateRootFromDOMContainer(container, initialChildren, parentComponent, callback, isHydrationContainer) {
  29533    if (isHydrationContainer) {
  29534      if (typeof callback === 'function') {
  29535        var originalCallback = callback;
  29536
  29537        callback = function () {
  29538          var instance = getPublicRootInstance(root);
  29539          originalCallback.call(instance);
  29540        };
  29541      }
  29542
  29543      var root = createHydrationContainer(initialChildren, callback, container, LegacyRoot, null, // hydrationCallbacks
  29544      false, // isStrictMode
  29545      false, // concurrentUpdatesByDefaultOverride,
  29546      '', // identifierPrefix
  29547      noopOnRecoverableError);
  29548      container._reactRootContainer = root;
  29549      markContainerAsRoot(root.current, container);
  29550      var rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
  29551      listenToAllSupportedEvents(rootContainerElement);
  29552      flushSync();
  29553      return root;
  29554    } else {
  29555      // First clear any existing content.
  29556      var rootSibling;
  29557
  29558      while (rootSibling = container.lastChild) {
  29559        container.removeChild(rootSibling);
  29560      }
  29561
  29562      if (typeof callback === 'function') {
  29563        var _originalCallback = callback;
  29564
  29565        callback = function () {
  29566          var instance = getPublicRootInstance(_root);
  29567
  29568          _originalCallback.call(instance);
  29569        };
  29570      }
  29571
  29572      var _root = createContainer(container, LegacyRoot, null, // hydrationCallbacks
  29573      false, // isStrictMode
  29574      false, // concurrentUpdatesByDefaultOverride,
  29575      '', // identifierPrefix
  29576      noopOnRecoverableError);
  29577
  29578      container._reactRootContainer = _root;
  29579      markContainerAsRoot(_root.current, container);
  29580
  29581      var _rootContainerElement = container.nodeType === COMMENT_NODE ? container.parentNode : container;
  29582
  29583      listenToAllSupportedEvents(_rootContainerElement); // Initial mount should not be batched.
  29584
  29585      flushSync(function () {
  29586        updateContainer(initialChildren, _root, parentComponent, callback);
  29587      });
  29588      return _root;
  29589    }
  29590  }
  29591
  29592  function warnOnInvalidCallback$1(callback, callerName) {
  29593    {
  29594      if (callback !== null && typeof callback !== 'function') {
  29595        error('%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);
  29596      }
  29597    }
  29598  }
  29599
  29600  function legacyRenderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {
  29601    {
  29602      topLevelUpdateWarnings(container);
  29603      warnOnInvalidCallback$1(callback === undefined ? null : callback, 'render');
  29604    }
  29605
  29606    var maybeRoot = container._reactRootContainer;
  29607    var root;
  29608
  29609    if (!maybeRoot) {
  29610      // Initial mount
  29611      root = legacyCreateRootFromDOMContainer(container, children, parentComponent, callback, forceHydrate);
  29612    } else {
  29613      root = maybeRoot;
  29614
  29615      if (typeof callback === 'function') {
  29616        var originalCallback = callback;
  29617
  29618        callback = function () {
  29619          var instance = getPublicRootInstance(root);
  29620          originalCallback.call(instance);
  29621        };
  29622      } // Update
  29623
  29624
  29625      updateContainer(children, root, parentComponent, callback);
  29626    }
  29627
  29628    return getPublicRootInstance(root);
  29629  }
  29630
  29631  function findDOMNode(componentOrElement) {
  29632    {
  29633      var owner = ReactCurrentOwner$3.current;
  29634
  29635      if (owner !== null && owner.stateNode !== null) {
  29636        var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;
  29637
  29638        if (!warnedAboutRefsInRender) {
  29639          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.', getComponentNameFromType(owner.type) || 'A component');
  29640        }
  29641
  29642        owner.stateNode._warnedAboutRefsInRender = true;
  29643      }
  29644    }
  29645
  29646    if (componentOrElement == null) {
  29647      return null;
  29648    }
  29649
  29650    if (componentOrElement.nodeType === ELEMENT_NODE) {
  29651      return componentOrElement;
  29652    }
  29653
  29654    {
  29655      return findHostInstanceWithWarning(componentOrElement, 'findDOMNode');
  29656    }
  29657  }
  29658  function hydrate(element, container, callback) {
  29659    {
  29660      error('ReactDOM.hydrate is no longer supported in React 18. Use hydrateRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
  29661    }
  29662
  29663    if (!isValidContainerLegacy(container)) {
  29664      throw new Error('Target container is not a DOM element.');
  29665    }
  29666
  29667    {
  29668      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
  29669
  29670      if (isModernRoot) {
  29671        error('You are calling ReactDOM.hydrate() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call hydrateRoot(container, element)?');
  29672      }
  29673    } // TODO: throw or warn if we couldn't hydrate?
  29674
  29675
  29676    return legacyRenderSubtreeIntoContainer(null, element, container, true, callback);
  29677  }
  29678  function render(element, container, callback) {
  29679    {
  29680      error('ReactDOM.render is no longer supported in React 18. Use createRoot ' + 'instead. Until you switch to the new API, your app will behave as ' + "if it's running React 17. Learn " + 'more: https://reactjs.org/link/switch-to-createroot');
  29681    }
  29682
  29683    if (!isValidContainerLegacy(container)) {
  29684      throw new Error('Target container is not a DOM element.');
  29685    }
  29686
  29687    {
  29688      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
  29689
  29690      if (isModernRoot) {
  29691        error('You are calling ReactDOM.render() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. ' + 'Did you mean to call root.render(element)?');
  29692      }
  29693    }
  29694
  29695    return legacyRenderSubtreeIntoContainer(null, element, container, false, callback);
  29696  }
  29697  function unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
  29698    {
  29699      error('ReactDOM.unstable_renderSubtreeIntoContainer() is no longer supported ' + 'in React 18. Consider using a portal instead. Until you switch to ' + "the createRoot API, your app will behave as if it's running React " + '17. Learn more: https://reactjs.org/link/switch-to-createroot');
  29700    }
  29701
  29702    if (!isValidContainerLegacy(containerNode)) {
  29703      throw new Error('Target container is not a DOM element.');
  29704    }
  29705
  29706    if (parentComponent == null || !has(parentComponent)) {
  29707      throw new Error('parentComponent must be a valid React Component');
  29708    }
  29709
  29710    return legacyRenderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);
  29711  }
  29712  function unmountComponentAtNode(container) {
  29713    if (!isValidContainerLegacy(container)) {
  29714      throw new Error('unmountComponentAtNode(...): Target container is not a DOM element.');
  29715    }
  29716
  29717    {
  29718      var isModernRoot = isContainerMarkedAsRoot(container) && container._reactRootContainer === undefined;
  29719
  29720      if (isModernRoot) {
  29721        error('You are calling ReactDOM.unmountComponentAtNode() on a container that was previously ' + 'passed to ReactDOMClient.createRoot(). This is not supported. Did you mean to call root.unmount()?');
  29722      }
  29723    }
  29724
  29725    if (container._reactRootContainer) {
  29726      {
  29727        var rootEl = getReactRootElementInContainer(container);
  29728        var renderedByDifferentReact = rootEl && !getInstanceFromNode(rootEl);
  29729
  29730        if (renderedByDifferentReact) {
  29731          error("unmountComponentAtNode(): The node you're attempting to unmount " + 'was rendered by another copy of React.');
  29732        }
  29733      } // Unmount should not be batched.
  29734
  29735
  29736      flushSync(function () {
  29737        legacyRenderSubtreeIntoContainer(null, null, container, false, function () {
  29738          // $FlowFixMe This should probably use `delete container._reactRootContainer`
  29739          container._reactRootContainer = null;
  29740          unmarkContainerAsRoot(container);
  29741        });
  29742      }); // If you call unmountComponentAtNode twice in quick succession, you'll
  29743      // get `true` twice. That's probably fine?
  29744
  29745      return true;
  29746    } else {
  29747      {
  29748        var _rootEl = getReactRootElementInContainer(container);
  29749
  29750        var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode(_rootEl)); // Check if the container itself is a React root node.
  29751
  29752        var isContainerReactRoot = container.nodeType === ELEMENT_NODE && isValidContainerLegacy(container.parentNode) && !!container.parentNode._reactRootContainer;
  29753
  29754        if (hasNonRootReactChild) {
  29755          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.');
  29756        }
  29757      }
  29758
  29759      return false;
  29760    }
  29761  }
  29762
  29763  setAttemptSynchronousHydration(attemptSynchronousHydration$1);
  29764  setAttemptContinuousHydration(attemptContinuousHydration$1);
  29765  setAttemptHydrationAtCurrentPriority(attemptHydrationAtCurrentPriority$1);
  29766  setGetCurrentUpdatePriority(getCurrentUpdatePriority);
  29767  setAttemptHydrationAtPriority(runWithPriority);
  29768
  29769  {
  29770    if (typeof Map !== 'function' || // $FlowIssue Flow incorrectly thinks Map has no prototype
  29771    Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || // $FlowIssue Flow incorrectly thinks Set has no prototype
  29772    Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {
  29773      error('React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. https://reactjs.org/link/react-polyfills');
  29774    }
  29775  }
  29776
  29777  setRestoreImplementation(restoreControlledState$3);
  29778  setBatchingImplementation(batchedUpdates$1, discreteUpdates, flushSync);
  29779
  29780  function createPortal$1(children, container) {
  29781    var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
  29782
  29783    if (!isValidContainer(container)) {
  29784      throw new Error('Target container is not a DOM element.');
  29785    } // TODO: pass ReactDOM portal implementation as third argument
  29786    // $FlowFixMe The Flow type is opaque but there's no way to actually create it.
  29787
  29788
  29789    return createPortal(children, container, null, key);
  29790  }
  29791
  29792  function renderSubtreeIntoContainer(parentComponent, element, containerNode, callback) {
  29793    return unstable_renderSubtreeIntoContainer(parentComponent, element, containerNode, callback);
  29794  }
  29795
  29796  var Internals = {
  29797    usingClientEntryPoint: false,
  29798    // Keep in sync with ReactTestUtils.js.
  29799    // This is an array for better minification.
  29800    Events: [getInstanceFromNode, getNodeFromInstance, getFiberCurrentPropsFromNode, enqueueStateRestore, restoreStateIfNeeded, batchedUpdates$1]
  29801  };
  29802
  29803  function createRoot$1(container, options) {
  29804    {
  29805      if (!Internals.usingClientEntryPoint && !true) {
  29806        error('You are importing createRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
  29807      }
  29808    }
  29809
  29810    return createRoot(container, options);
  29811  }
  29812
  29813  function hydrateRoot$1(container, initialChildren, options) {
  29814    {
  29815      if (!Internals.usingClientEntryPoint && !true) {
  29816        error('You are importing hydrateRoot from "react-dom" which is not supported. ' + 'You should instead import it from "react-dom/client".');
  29817      }
  29818    }
  29819
  29820    return hydrateRoot(container, initialChildren, options);
  29821  } // Overload the definition to the two valid signatures.
  29822  // Warning, this opts-out of checking the function body.
  29823
  29824
  29825  // eslint-disable-next-line no-redeclare
  29826  function flushSync$1(fn) {
  29827    {
  29828      if (isAlreadyRendering()) {
  29829        error('flushSync was called from inside a lifecycle method. React cannot ' + 'flush when React is already rendering. Consider moving this call to ' + 'a scheduler task or micro task.');
  29830      }
  29831    }
  29832
  29833    return flushSync(fn);
  29834  }
  29835  var foundDevTools = injectIntoDevTools({
  29836    findFiberByHostInstance: getClosestInstanceFromNode,
  29837    bundleType:  1 ,
  29838    version: ReactVersion,
  29839    rendererPackageName: 'react-dom'
  29840  });
  29841
  29842  {
  29843    if (!foundDevTools && canUseDOM && window.top === window.self) {
  29844      // If we're in Chrome or Firefox, provide a download link if not installed.
  29845      if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {
  29846        var protocol = window.location.protocol; // Don't warn in exotic cases like chrome-extension://.
  29847
  29848        if (/^(https?|file):$/.test(protocol)) {
  29849          // eslint-disable-next-line react-internal/no-production-logging
  29850          console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://reactjs.org/link/react-devtools' + (protocol === 'file:' ? '\nYou might need to use a local HTTP server (instead of file://): ' + 'https://reactjs.org/link/react-devtools-faq' : ''), 'font-weight:bold');
  29851        }
  29852      }
  29853    }
  29854  }
  29855
  29856  exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED = Internals;
  29857  exports.createPortal = createPortal$1;
  29858  exports.createRoot = createRoot$1;
  29859  exports.findDOMNode = findDOMNode;
  29860  exports.flushSync = flushSync$1;
  29861  exports.hydrate = hydrate;
  29862  exports.hydrateRoot = hydrateRoot$1;
  29863  exports.render = render;
  29864  exports.unmountComponentAtNode = unmountComponentAtNode;
  29865  exports.unstable_batchedUpdates = batchedUpdates$1;
  29866  exports.unstable_renderSubtreeIntoContainer = renderSubtreeIntoContainer;
  29867  exports.version = ReactVersion;
  29868
  29869})));