| 'use strict'; | 
| var isCallable = require('../internals/is-callable'); | 
| var definePropertyModule = require('../internals/object-define-property'); | 
| var makeBuiltIn = require('../internals/make-built-in'); | 
| var defineGlobalProperty = require('../internals/define-global-property'); | 
|   | 
| module.exports = function (O, key, value, options) { | 
|   if (!options) options = {}; | 
|   var simple = options.enumerable; | 
|   var name = options.name !== undefined ? options.name : key; | 
|   if (isCallable(value)) makeBuiltIn(value, name, options); | 
|   if (options.global) { | 
|     if (simple) O[key] = value; | 
|     else defineGlobalProperty(key, value); | 
|   } else { | 
|     try { | 
|       if (!options.unsafe) delete O[key]; | 
|       else if (O[key]) simple = true; | 
|     } catch (error) { /* empty */ } | 
|     if (simple) O[key] = value; | 
|     else definePropertyModule.f(O, key, { | 
|       value: value, | 
|       enumerable: false, | 
|       configurable: !options.nonConfigurable, | 
|       writable: !options.nonWritable | 
|     }); | 
|   } return O; | 
| }; |