'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var getBuiltIn = require('../internals/get-built-in'); 
 | 
var apply = require('../internals/function-apply'); 
 | 
var call = require('../internals/function-call'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var fails = require('../internals/fails'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var isSymbol = require('../internals/is-symbol'); 
 | 
var arraySlice = require('../internals/array-slice'); 
 | 
var getReplacerFunction = require('../internals/get-json-replacer-function'); 
 | 
var NATIVE_SYMBOL = require('../internals/symbol-constructor-detection'); 
 | 
  
 | 
var $String = String; 
 | 
var $stringify = getBuiltIn('JSON', 'stringify'); 
 | 
var exec = uncurryThis(/./.exec); 
 | 
var charAt = uncurryThis(''.charAt); 
 | 
var charCodeAt = uncurryThis(''.charCodeAt); 
 | 
var replace = uncurryThis(''.replace); 
 | 
var numberToString = uncurryThis(1.0.toString); 
 | 
  
 | 
var tester = /[\uD800-\uDFFF]/g; 
 | 
var low = /^[\uD800-\uDBFF]$/; 
 | 
var hi = /^[\uDC00-\uDFFF]$/; 
 | 
  
 | 
var WRONG_SYMBOLS_CONVERSION = !NATIVE_SYMBOL || fails(function () { 
 | 
  var symbol = getBuiltIn('Symbol')('stringify detection'); 
 | 
  // MS Edge converts symbol values to JSON as {} 
 | 
  return $stringify([symbol]) !== '[null]' 
 | 
    // WebKit converts symbol values to JSON as null 
 | 
    || $stringify({ a: symbol }) !== '{}' 
 | 
    // V8 throws on boxed symbols 
 | 
    || $stringify(Object(symbol)) !== '{}'; 
 | 
}); 
 | 
  
 | 
// https://github.com/tc39/proposal-well-formed-stringify 
 | 
var ILL_FORMED_UNICODE = fails(function () { 
 | 
  return $stringify('\uDF06\uD834') !== '"\\udf06\\ud834"' 
 | 
    || $stringify('\uDEAD') !== '"\\udead"'; 
 | 
}); 
 | 
  
 | 
var stringifyWithSymbolsFix = function (it, replacer) { 
 | 
  var args = arraySlice(arguments); 
 | 
  var $replacer = getReplacerFunction(replacer); 
 | 
  if (!isCallable($replacer) && (it === undefined || isSymbol(it))) return; // IE8 returns string on undefined 
 | 
  args[1] = function (key, value) { 
 | 
    // some old implementations (like WebKit) could pass numbers as keys 
 | 
    if (isCallable($replacer)) value = call($replacer, this, $String(key), value); 
 | 
    if (!isSymbol(value)) return value; 
 | 
  }; 
 | 
  return apply($stringify, null, args); 
 | 
}; 
 | 
  
 | 
var fixIllFormed = function (match, offset, string) { 
 | 
  var prev = charAt(string, offset - 1); 
 | 
  var next = charAt(string, offset + 1); 
 | 
  if ((exec(low, match) && !exec(hi, next)) || (exec(hi, match) && !exec(low, prev))) { 
 | 
    return '\\u' + numberToString(charCodeAt(match, 0), 16); 
 | 
  } return match; 
 | 
}; 
 | 
  
 | 
if ($stringify) { 
 | 
  // `JSON.stringify` method 
 | 
  // https://tc39.es/ecma262/#sec-json.stringify 
 | 
  $({ target: 'JSON', stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE }, { 
 | 
    // eslint-disable-next-line no-unused-vars -- required for `.length` 
 | 
    stringify: function stringify(it, replacer, space) { 
 | 
      var args = arraySlice(arguments); 
 | 
      var result = apply(WRONG_SYMBOLS_CONVERSION ? stringifyWithSymbolsFix : $stringify, null, args); 
 | 
      return ILL_FORMED_UNICODE && typeof result == 'string' ? replace(result, tester, fixIllFormed) : result; 
 | 
    } 
 | 
  }); 
 | 
} 
 |