| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 | 
							- 'use strict';
 
- const Reach = require('./reach');
 
- const internals = {};
 
- exports.keys = function (obj, options = {}) {
 
-     return options.symbols !== false ? Reflect.ownKeys(obj) : Object.getOwnPropertyNames(obj);  // Defaults to true
 
- };
 
- exports.store = function (source, keys) {
 
-     const storage = new Map();
 
-     for (let i = 0; i < keys.length; ++i) {
 
-         const key = keys[i];
 
-         const value = Reach(source, key);
 
-         if (typeof value === 'object' ||
 
-             typeof value === 'function') {
 
-             storage.set(key, value);
 
-             internals.reachSet(source, key, undefined);
 
-         }
 
-     }
 
-     return storage;
 
- };
 
- exports.restore = function (copy, source, storage) {
 
-     for (const [key, value] of storage) {
 
-         internals.reachSet(copy, key, value);
 
-         internals.reachSet(source, key, value);
 
-     }
 
- };
 
- internals.reachSet = function (obj, key, value) {
 
-     const path = Array.isArray(key) ? key : key.split('.');
 
-     let ref = obj;
 
-     for (let i = 0; i < path.length; ++i) {
 
-         const segment = path[i];
 
-         if (i + 1 === path.length) {
 
-             ref[segment] = value;
 
-         }
 
-         ref = ref[segment];
 
-     }
 
- };
 
 
  |