'use strict'; 
 | 
var call = require('../internals/function-call'); 
 | 
var create = require('../internals/object-create'); 
 | 
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); 
 | 
var defineBuiltIns = require('../internals/define-built-ins'); 
 | 
var wellKnownSymbol = require('../internals/well-known-symbol'); 
 | 
var InternalStateModule = require('../internals/internal-state'); 
 | 
var getMethod = require('../internals/get-method'); 
 | 
var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; 
 | 
var createIterResultObject = require('../internals/create-iter-result-object'); 
 | 
var iteratorClose = require('../internals/iterator-close'); 
 | 
  
 | 
var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 
 | 
var ITERATOR_HELPER = 'IteratorHelper'; 
 | 
var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; 
 | 
var setInternalState = InternalStateModule.set; 
 | 
  
 | 
var createIteratorProxyPrototype = function (IS_ITERATOR) { 
 | 
  var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); 
 | 
  
 | 
  return defineBuiltIns(create(IteratorPrototype), { 
 | 
    next: function next() { 
 | 
      var state = getInternalState(this); 
 | 
      // for simplification: 
 | 
      //   for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject` 
 | 
      //   for `%IteratorHelperPrototype%.next` - just a value 
 | 
      if (IS_ITERATOR) return state.nextHandler(); 
 | 
      if (state.done) return createIterResultObject(undefined, true); 
 | 
      try { 
 | 
        var result = state.nextHandler(); 
 | 
        return state.returnHandlerResult ? result : createIterResultObject(result, state.done); 
 | 
      } catch (error) { 
 | 
        state.done = true; 
 | 
        throw error; 
 | 
      } 
 | 
    }, 
 | 
    'return': function () { 
 | 
      var state = getInternalState(this); 
 | 
      var iterator = state.iterator; 
 | 
      state.done = true; 
 | 
      if (IS_ITERATOR) { 
 | 
        var returnMethod = getMethod(iterator, 'return'); 
 | 
        return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); 
 | 
      } 
 | 
      if (state.inner) try { 
 | 
        iteratorClose(state.inner.iterator, 'normal'); 
 | 
      } catch (error) { 
 | 
        return iteratorClose(iterator, 'throw', error); 
 | 
      } 
 | 
      if (iterator) iteratorClose(iterator, 'normal'); 
 | 
      return createIterResultObject(undefined, true); 
 | 
    } 
 | 
  }); 
 | 
}; 
 | 
  
 | 
var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); 
 | 
var IteratorHelperPrototype = createIteratorProxyPrototype(false); 
 | 
  
 | 
createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); 
 | 
  
 | 
module.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) { 
 | 
  var IteratorProxy = function Iterator(record, state) { 
 | 
    if (state) { 
 | 
      state.iterator = record.iterator; 
 | 
      state.next = record.next; 
 | 
    } else state = record; 
 | 
    state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; 
 | 
    state.returnHandlerResult = !!RETURN_HANDLER_RESULT; 
 | 
    state.nextHandler = nextHandler; 
 | 
    state.counter = 0; 
 | 
    state.done = false; 
 | 
    setInternalState(this, state); 
 | 
  }; 
 | 
  
 | 
  IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; 
 | 
  
 | 
  return IteratorProxy; 
 | 
}; 
 |