Draw the South Korean flag When I stumbled upon this question I remembered that I had also once seen precise rules for the construction of the South Korean flag. And this is quite a different construction.



Source: Wikipedia

So you're to draw an exact construction of this one now!

Specification

You can render the flag to file or screen using vector or raster graphics. If your output is rasterised, your image must have dimensions of 450x300 pixels or more.

All length ratios and positions need to be exactly as shown in the following diagram:



Source: Wikipedia

Note that the centres of the two small circles align with the diagonal.

For the colours, you must use the following palette:


White: #FFFFFF
Black: #000000
Red: #C60C30
Blue: #003478


The black boundary must not be drawn unless your drawing system does not let you specify a 3:2 canvas for technical reasons (otherwise, you should use a 3:2 canvas and the flag should fill all of it). If you do need to add the boundary, it may be arbitrarily thick - the flag should be considered strictly inside the black boundary. Any other helping lines or length indicators must not be drawn. I.e., the flag should appear exactly as in the first image.

Scoring

This is code golf, so the shortest answer (in bytes) wins.

As a word of warning, using existing compression (like embedding a compressed GIF) falls into several standard loopholes.
Python + Pycairo, 371 370 366 bytes



from cairo import*
p=3.141593
c=Context(SVGSurface("F",12,8))
C=c.set_source_rgb;R=c.rectangle;T=c.rotate;F=c.fill
C(1,1,1);R(0,0,12,8);F()
c.translate(6,4);T(.588);b=3188
for o in[(0,.2,.47),(.77,.05,.19)]*2:C(*o);i=b/2%2;b+=1;c.arc(i,0,2-i,0,p+i*p);F();T(p)
C(0,0,0)
for x in(p,1.966)*2:
 for y in.5,0,1:
    for z in-1,1:R(3+y,-z,1./3,z*(2.75+b%2)/3);F()
    b/=2
 T(x)


Outputs a tiny SVG file named F.