'use strict'; 
 | 
/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */ 
 | 
/* eslint-disable regexp/no-useless-quantifier -- testing */ 
 | 
var call = require('../internals/function-call'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var toString = require('../internals/to-string'); 
 | 
var regexpFlags = require('../internals/regexp-flags'); 
 | 
var stickyHelpers = require('../internals/regexp-sticky-helpers'); 
 | 
var shared = require('../internals/shared'); 
 | 
var create = require('../internals/object-create'); 
 | 
var getInternalState = require('../internals/internal-state').get; 
 | 
var UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all'); 
 | 
var UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg'); 
 | 
  
 | 
var nativeReplace = shared('native-string-replace', String.prototype.replace); 
 | 
var nativeExec = RegExp.prototype.exec; 
 | 
var patchedExec = nativeExec; 
 | 
var charAt = uncurryThis(''.charAt); 
 | 
var indexOf = uncurryThis(''.indexOf); 
 | 
var replace = uncurryThis(''.replace); 
 | 
var stringSlice = uncurryThis(''.slice); 
 | 
  
 | 
var UPDATES_LAST_INDEX_WRONG = (function () { 
 | 
  var re1 = /a/; 
 | 
  var re2 = /b*/g; 
 | 
  call(nativeExec, re1, 'a'); 
 | 
  call(nativeExec, re2, 'a'); 
 | 
  return re1.lastIndex !== 0 || re2.lastIndex !== 0; 
 | 
})(); 
 | 
  
 | 
var UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET; 
 | 
  
 | 
// nonparticipating capturing group, copied from es5-shim's String#split patch. 
 | 
var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; 
 | 
  
 | 
var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG; 
 | 
  
 | 
if (PATCH) { 
 | 
  patchedExec = function exec(string) { 
 | 
    var re = this; 
 | 
    var state = getInternalState(re); 
 | 
    var str = toString(string); 
 | 
    var raw = state.raw; 
 | 
    var result, reCopy, lastIndex, match, i, object, group; 
 | 
  
 | 
    if (raw) { 
 | 
      raw.lastIndex = re.lastIndex; 
 | 
      result = call(patchedExec, raw, str); 
 | 
      re.lastIndex = raw.lastIndex; 
 | 
      return result; 
 | 
    } 
 | 
  
 | 
    var groups = state.groups; 
 | 
    var sticky = UNSUPPORTED_Y && re.sticky; 
 | 
    var flags = call(regexpFlags, re); 
 | 
    var source = re.source; 
 | 
    var charsAdded = 0; 
 | 
    var strCopy = str; 
 | 
  
 | 
    if (sticky) { 
 | 
      flags = replace(flags, 'y', ''); 
 | 
      if (indexOf(flags, 'g') === -1) { 
 | 
        flags += 'g'; 
 | 
      } 
 | 
  
 | 
      strCopy = stringSlice(str, re.lastIndex); 
 | 
      // Support anchored sticky behavior. 
 | 
      if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\n')) { 
 | 
        source = '(?: ' + source + ')'; 
 | 
        strCopy = ' ' + strCopy; 
 | 
        charsAdded++; 
 | 
      } 
 | 
      // ^(? + rx + ) is needed, in combination with some str slicing, to 
 | 
      // simulate the 'y' flag. 
 | 
      reCopy = new RegExp('^(?:' + source + ')', flags); 
 | 
    } 
 | 
  
 | 
    if (NPCG_INCLUDED) { 
 | 
      reCopy = new RegExp('^' + source + '$(?!\\s)', flags); 
 | 
    } 
 | 
    if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex; 
 | 
  
 | 
    match = call(nativeExec, sticky ? reCopy : re, strCopy); 
 | 
  
 | 
    if (sticky) { 
 | 
      if (match) { 
 | 
        match.input = stringSlice(match.input, charsAdded); 
 | 
        match[0] = stringSlice(match[0], charsAdded); 
 | 
        match.index = re.lastIndex; 
 | 
        re.lastIndex += match[0].length; 
 | 
      } else re.lastIndex = 0; 
 | 
    } else if (UPDATES_LAST_INDEX_WRONG && match) { 
 | 
      re.lastIndex = re.global ? match.index + match[0].length : lastIndex; 
 | 
    } 
 | 
    if (NPCG_INCLUDED && match && match.length > 1) { 
 | 
      // Fix browsers whose `exec` methods don't consistently return `undefined` 
 | 
      // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/ 
 | 
      call(nativeReplace, match[0], reCopy, function () { 
 | 
        for (i = 1; i < arguments.length - 2; i++) { 
 | 
          if (arguments[i] === undefined) match[i] = undefined; 
 | 
        } 
 | 
      }); 
 | 
    } 
 | 
  
 | 
    if (match && groups) { 
 | 
      match.groups = object = create(null); 
 | 
      for (i = 0; i < groups.length; i++) { 
 | 
        group = groups[i]; 
 | 
        object[group[0]] = match[group[1]]; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    return match; 
 | 
  }; 
 | 
} 
 | 
  
 | 
module.exports = patchedExec; 
 |