|  | @@ -1,22 +1,43 @@
 | 
	
		
			
				|  |  |  func isValid(code string) bool {
 | 
	
		
			
				|  |  |  	st := make([]string, 0)
 | 
	
		
			
				|  |  | -	for i, r := range code {
 | 
	
		
			
				|  |  | -		if 0 < i && len(st) == 0 {
 | 
	
		
			
				|  |  | +	for i := 0; i < len(code); i++ {
 | 
	
		
			
				|  |  | +		if 0 < i && len(st) == 0 { // Unmatched content
 | 
	
		
			
				|  |  |  			return false
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		if code[i:i+9] == "<![CDATA[" { // Parse cdata
 | 
	
		
			
				|  |  | -			i = strings.Index(code[i+8:], "]]>")
 | 
	
		
			
				|  |  | -			if i < 0 {
 | 
	
		
			
				|  |  | +		if strings.HasPrefix(code[i:], "<![CDATA[") { // Parse cdata
 | 
	
		
			
				|  |  | +			j := strings.Index(code[i+9:], "]]>")
 | 
	
		
			
				|  |  | +			if j < 0 {
 | 
	
		
			
				|  |  |  				return false
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | +			i += j + 11
 | 
	
		
			
				|  |  | +		} else if strings.HasPrefix(code[i:], "</") { // Parse end
 | 
	
		
			
				|  |  |  			i += 2
 | 
	
		
			
				|  |  | -		} else if code[i:i+2] == "</" {
 | 
	
		
			
				|  |  | -			name := 
 | 
	
		
			
				|  |  | -		} else if r == '<' {
 | 
	
		
			
				|  |  | -			
 | 
	
		
			
				|  |  | +			j := strings.Index(code[i:], ">")
 | 
	
		
			
				|  |  | +			if j < 0 {
 | 
	
		
			
				|  |  | +				return false
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			name := code[i : i+j]
 | 
	
		
			
				|  |  | +			if l := len(st); l == 0 || st[l-1] != name {
 | 
	
		
			
				|  |  | +				return false
 | 
	
		
			
				|  |  | +			} else {
 | 
	
		
			
				|  |  | +				st = st[:l-1]
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			i += j
 | 
	
		
			
				|  |  | +		} else if code[i] == '<' { // Parse begin
 | 
	
		
			
				|  |  | +			i += 1
 | 
	
		
			
				|  |  | +			j := strings.Index(code[i:], ">")
 | 
	
		
			
				|  |  | +			if j < 1 || 9 < j {
 | 
	
		
			
				|  |  | +				return false
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			name := code[i : i+j]
 | 
	
		
			
				|  |  | +			for _, r := range name {
 | 
	
		
			
				|  |  | +				if r < 'A' || 'Z' < r {
 | 
	
		
			
				|  |  | +					return false
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +			st = append(st, name)
 | 
	
		
			
				|  |  | +			i += j
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  	return len(st) == 0
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 |