text: /* @flow */
  
  /**
   * Runtime helper for resolving raw children VNodes into a slot object.
   */
  export function resolveSlots(
    children: ?Array<VNode>,
    context: ?Component,
  ): { [key: string]: Array<VNode> } {
    const slots = {}
    if (!children) {
      return slots
    }
    const defaultSlot = []
    let name, child
    for (let i = 0, l = children.length; i < l; i++) {
      child = children[i]
      // named slots should only be respected if the vnode was rendered in the
      // same context.
      if (
        (child.context === context || child.functionalContext === context) &&
        child.data &&
        (name = child.data.slot)
      ) {
        const slot = slots[name] || (slots[name] = [])
        if (child.tag === 'template') {
          slot.push.apply(slot, child.children)
        } else {
          slot.push(child)
        }
      } else {
        defaultSlot.push(child)
      }
    }
    // ignore whitespace
    if (!defaultSlot.every(isWhitespace)) {
      slots.default = defaultSlot
    }
    return slots
  }
  
  function isWhitespace(node: VNode): boolean {
    return node.isComment || node.text === ' '
  }
  
  export function resolveScopedSlots(
    fns: Array<[string, Function]>,
  ): { [key: string]: Function } {
    const res = {}
    for (let i = 0; i < fns.length; i++) {
      res[fns[i][0]] = fns[i][1]
    }
    return res
  }
  