   findMatchCandidates: (keystrokeArray) ->
     partialMatchCandidates = []
     exactMatchCandidates = []
+    keydownExactMatchCandidates = []
 
     for binding in @keyBindings when binding.enabled
       doesMatch = keystrokesMatch(binding.keystrokeArray, keystrokeArray)

    # keystroke.
    if partialMatches.length > 0
      event.preventDefault()
      enableTimeout = (
        @pendingStateTimeoutHandle? or
        foundMatch or
        characterForKeyboardEvent(@queuedKeyboardEvents[0])?
      )

      @enterPendingState(partialMatches, enableTimeout)
      @emitter.emit 'did-partially-match-binding', {
        keystrokes,
        eventType: event.type,
        partiallyMatchedBindings: partialMatches,
        keyboardEventTarget: target
      }
    else
      @emitter.emit 'did-fail-to-match-binding', {
        keystrokes,
        eventType: event.type,
        keyboardEventTarget: target
      }
      if @pendingPartialMatches?
        @terminatePendingState()
      else
        # Some of the queued keyboard events might have inserted characters had
        # we not prevented their default action. If we're replaying a keystroke
        # whose default action was prevented and no binding is matched, we'll
        # simulate the text input event that was previously prevented to insert
        # the missing characters.
        @simulateTextInput(event) if event.defaultPrevented

        @clearQueuedKeystrokes()

  # Public: Translate a keydown event to a keystroke string.
  #

        exactMatchCandidates.push(binding)
      else if doesMatch is 'partial'
        partialMatchCandidates.push(binding)
      else if doesMatch is 'keydownExact'
        partialMatchCandidates.push(binding)
        keydownExactMatchCandidates.push(binding)
    {partialMatchCandidates, keydownExactMatchCandidates, exactMatchCandidates}

  # Determine which of the given bindings have selectors matching the target or
  # one of its ancestors. This is used by {::handleKeyboardEvent} to determine
