// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package json

import (
	
	
)

// foldName returns a folded string such that foldName(x) == foldName(y)
// is identical to bytes.EqualFold(x, y).
func foldName( []byte) []byte {
	// This is inlinable to take advantage of "function outlining".
	var  [32]byte // large enough for most JSON names
	return appendFoldedName([:0], )
}

func appendFoldedName(,  []byte) []byte {
	for  := 0;  < len(); {
		// Handle single-byte ASCII.
		if  := [];  < utf8.RuneSelf {
			if 'a' <=  &&  <= 'z' {
				 -= 'a' - 'A'
			}
			 = append(, )
			++
			continue
		}
		// Handle multi-byte Unicode.
		,  := utf8.DecodeRune([:])
		 = utf8.AppendRune(, foldRune())
		 += 
	}
	return 
}

// foldRune is returns the smallest rune for all runes in the same fold set.
func foldRune( rune) rune {
	for {
		 := unicode.SimpleFold()
		if  <=  {
			return 
		}
		 = 
	}
}