'use strict'; 
 | 
var bind = require('../internals/function-bind-context'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var IndexedObject = require('../internals/indexed-object'); 
 | 
var toObject = require('../internals/to-object'); 
 | 
var toPropertyKey = require('../internals/to-property-key'); 
 | 
var lengthOfArrayLike = require('../internals/length-of-array-like'); 
 | 
var objectCreate = require('../internals/object-create'); 
 | 
var arrayFromConstructorAndList = require('../internals/array-from-constructor-and-list'); 
 | 
  
 | 
var $Array = Array; 
 | 
var push = uncurryThis([].push); 
 | 
  
 | 
module.exports = function ($this, callbackfn, that, specificConstructor) { 
 | 
  var O = toObject($this); 
 | 
  var self = IndexedObject(O); 
 | 
  var boundFunction = bind(callbackfn, that); 
 | 
  var target = objectCreate(null); 
 | 
  var length = lengthOfArrayLike(self); 
 | 
  var index = 0; 
 | 
  var Constructor, key, value; 
 | 
  for (;length > index; index++) { 
 | 
    value = self[index]; 
 | 
    key = toPropertyKey(boundFunction(value, index, O)); 
 | 
    // in some IE versions, `hasOwnProperty` returns incorrect result on integer keys 
 | 
    // but since it's a `null` prototype object, we can safely use `in` 
 | 
    if (key in target) push(target[key], value); 
 | 
    else target[key] = [value]; 
 | 
  } 
 | 
  // TODO: Remove this block from `core-js@4` 
 | 
  if (specificConstructor) { 
 | 
    Constructor = specificConstructor(O); 
 | 
    if (Constructor !== $Array) { 
 | 
      for (key in target) target[key] = arrayFromConstructorAndList(Constructor, target[key]); 
 | 
    } 
 | 
  } return target; 
 | 
}; 
 |