func main() {
	sph := tt.WGS1984()
	rdr := csv.NewReader(os.Stdin)

	xsum, ysum, zsum := 0.0, 0.0, 0.0
	blkcount, popcount := 0, 0

	for rec, err := rdr.Read(); err == nil; rec, err = rdr.Read() {
		slat, slon := rec[1], rec[2]
		spop := rec[3]
		lat, econv := strconv.ParseFloat(slat, 64)
		if econv != nil {
			log.Fatal(econv)
		}
		lon, econv := strconv.ParseFloat(slon, 64)
		if econv != nil {
			log.Fatal(econv)
		}
		pop, econv := strconv.Atoi(spop)
		if econv != nil {
			log.Fatal(econv)
		}

		xyz := sph.Geocentric(tt.LatLon(lat, lon), 0.0)
		blkcount++
		popcount += pop
		xsum += float64(pop) * xyz[0]
		ysum += float64(pop) * xyz[1]
		zsum += float64(pop) * xyz[2]
	}

	xsum /= float64(popcount)
	ysum /= float64(popcount)
	zsum /= float64(popcount)

	latlonm, _ := sph.GeocentricInv(tt.Vec{xsum, ysum, zsum})

	fmt.Printf("%d,%d,%.6f,%.6f\n", popcount, blkcount, latlonm.Lat(), latlonm.Lon())
}
func main() {
	sph := tt.WGS1984()
	rdr := csv.NewReader(os.Stdin)
	ps := make([]tt.Vec, 0, 10000)
	ws := make([]float64, 0, 10000)

	blkcount, popcount := 0, 0

	for rec, err := rdr.Read(); err == nil; rec, err = rdr.Read() {
		slat, slon := rec[1], rec[2]
		spop := rec[3]
		lat, econv := strconv.ParseFloat(slat, 64)
		if econv != nil {
			log.Fatal(econv)
		}
		lon, econv := strconv.ParseFloat(slon, 64)
		if econv != nil {
			log.Fatal(econv)
		}
		pop, econv := strconv.Atoi(spop)
		if econv != nil {
			log.Fatal(econv)
		}

		xyz := sph.Geocentric(tt.LatLon(lat, lon), 0.0)
		blkcount++
		popcount += pop

		ps = append(ps, xyz)
		ws = append(ws, float64(pop))
	}

	median := tt.MedianVecW(ps, ws)
	latlonm, _ := sph.GeocentricInv(median)

	fmt.Printf("%d,%d,%.6f,%.6f\n", popcount, blkcount, latlonm.Lat(), latlonm.Lon())
}
func main() {
	scn := bufio.NewScanner(os.Stdin)
	rec := make([]string, 0)
	for scn.Scan() {
		rec = append(rec, scn.Text())
	}

	p := make([]tt.LL, len(rec))
	for i := range p {
		ri := strings.Split(rec[i], ",")
		slat, slon := ri[5], ri[6]
		var deg, min, sec float64
		var econv error

		deg, econv = strconv.ParseFloat(slat[0:2], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		min, econv = strconv.ParseFloat(slat[2:4], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		sec, econv = strconv.ParseFloat(slat[4:6], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		lat := deg + min/60.0 + sec/3600.0
		if strings.HasSuffix(slat, "S") {
			lat = -lat
		}

		deg, econv = strconv.ParseFloat(slon[0:3], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		min, econv = strconv.ParseFloat(slon[3:5], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		sec, econv = strconv.ParseFloat(slon[5:7], 64)
		if econv != nil {
			log.Fatal(econv)
		}
		lon := deg + min/60.0 + sec/3600.0
		if strings.HasSuffix(slon, "W") {
			lon = -lon
		}

		p[i] = tt.LatLon(lat, lon)
	}

	runtime.GOMAXPROCS(runtime.NumCPU())
	v := make(tt.Vector, len(p))
	sph := tt.WGS1984()
	for i, c := range p {
		tt.ParAndoyer(0, sph, c, p, v)
		onenorm := v.SumAbs()
		fmt.Print(rec[i], ",", onenorm)
		fmt.Println()
	}
}