function uninstall(clock, config) {
				let method, i, l;
				const installedHrTime = "_hrtime";
				const installedNextTick = "_nextTick";

				for (i = 0, l = clock.methods.length; i < l; i++) {
					method = clock.methods[i];
					if (method === "hrtime" && _global.process) {
						_global.process.hrtime = clock[installedHrTime];
					} else if (method === "nextTick" && _global.process) {
						_global.process.nextTick = clock[installedNextTick];
					} else if (method === "performance") {
						const originalPerfDescriptor = Object.getOwnPropertyDescriptor(
							clock,
							`_${method}`
						);
						if (
							originalPerfDescriptor &&
							originalPerfDescriptor.get &&
							!originalPerfDescriptor.set
						) {
							Object.defineProperty(
								_global,
								method,
								originalPerfDescriptor
							);
						} else if (originalPerfDescriptor.configurable) {
							_global[method] = clock[`_${method}`];
						}
					} else {
						if (_global[method] && _global[method].hadOwnProperty) {
							_global[method] = clock[`_${method}`];
						} else {
							try {
								delete _global[method];
							} catch (ignore) {
								/* eslint no-empty: "off" */
							}
						}
					}
				}

				if (config.shouldAdvanceTime === true) {
					_global.clearInterval(clock.attachedInterval);
				}

				// Prevent multiple executions which will completely remove these props
				clock.methods = [];

				// return pending timers, to enable checking what timers remained on uninstall
				if (!clock.timers) {
					return [];
				}
				return Object.keys(clock.timers).map(function mapper(key) {
					return clock.timers[key];
				});
			}
@param {Clock} clock
@param {Config} config
@returns {Timer[]}