MPE Home Metamath Proof Explorer < Previous   Next >
Nearby theorems
Mirrors  >  Home  >  MPE Home  >  Th. List  >  pt1hmeo Structured version   Unicode version

Theorem pt1hmeo 20433
Description: The canonical homeomorphism from a topological product on a singleton to the topology of the factor. (Contributed by Mario Carneiro, 3-Feb-2015.)
Hypotheses
Ref Expression
pt1hmeo.j  |-  K  =  ( Xt_ `  { <. A ,  J >. } )
pt1hmeo.a  |-  ( ph  ->  A  e.  V )
pt1hmeo.r  |-  ( ph  ->  J  e.  (TopOn `  X ) )
Assertion
Ref Expression
pt1hmeo  |-  ( ph  ->  ( x  e.  X  |->  { <. A ,  x >. } )  e.  ( J Homeo K ) )
Distinct variable groups:    x, A    x, J    x, K    ph, x    x, X
Allowed substitution hint:    V( x)

Proof of Theorem pt1hmeo
Dummy variables  k 
y are mutually distinct and distinct from all other variables.
StepHypRef Expression
1 fconstmpt 5052 . . . . 5  |-  ( { A }  X.  {
x } )  =  ( k  e.  { A }  |->  x )
2 pt1hmeo.a . . . . . . 7  |-  ( ph  ->  A  e.  V )
32adantr 465 . . . . . 6  |-  ( (
ph  /\  x  e.  X )  ->  A  e.  V )
4 sneq 4042 . . . . . . . . 9  |-  ( k  =  A  ->  { k }  =  { A } )
54xpeq1d 5031 . . . . . . . 8  |-  ( k  =  A  ->  ( { k }  X.  { x } )  =  ( { A }  X.  { x }
) )
6 opeq1 4219 . . . . . . . . 9  |-  ( k  =  A  ->  <. k ,  x >.  =  <. A ,  x >. )
76sneqd 4044 . . . . . . . 8  |-  ( k  =  A  ->  { <. k ,  x >. }  =  { <. A ,  x >. } )
85, 7eqeq12d 2479 . . . . . . 7  |-  ( k  =  A  ->  (
( { k }  X.  { x }
)  =  { <. k ,  x >. }  <->  ( { A }  X.  { x } )  =  { <. A ,  x >. } ) )
9 vex 3112 . . . . . . . 8  |-  k  e. 
_V
10 vex 3112 . . . . . . . 8  |-  x  e. 
_V
119, 10xpsn 6074 . . . . . . 7  |-  ( { k }  X.  {
x } )  =  { <. k ,  x >. }
128, 11vtoclg 3167 . . . . . 6  |-  ( A  e.  V  ->  ( { A }  X.  {
x } )  =  { <. A ,  x >. } )
133, 12syl 16 . . . . 5  |-  ( (
ph  /\  x  e.  X )  ->  ( { A }  X.  {
x } )  =  { <. A ,  x >. } )
141, 13syl5eqr 2512 . . . 4  |-  ( (
ph  /\  x  e.  X )  ->  (
k  e.  { A }  |->  x )  =  { <. A ,  x >. } )
1514mpteq2dva 4543 . . 3  |-  ( ph  ->  ( x  e.  X  |->  ( k  e.  { A }  |->  x ) )  =  ( x  e.  X  |->  { <. A ,  x >. } ) )
16 pt1hmeo.j . . . 4  |-  K  =  ( Xt_ `  { <. A ,  J >. } )
17 pt1hmeo.r . . . 4  |-  ( ph  ->  J  e.  (TopOn `  X ) )
18 snex 4697 . . . . 5  |-  { A }  e.  _V
1918a1i 11 . . . 4  |-  ( ph  ->  { A }  e.  _V )
20 f1osng 5860 . . . . . . 7  |-  ( ( A  e.  V  /\  J  e.  (TopOn `  X
) )  ->  { <. A ,  J >. } : { A } -1-1-onto-> { J } )
212, 17, 20syl2anc 661 . . . . . 6  |-  ( ph  ->  { <. A ,  J >. } : { A }
-1-1-onto-> { J } )
22 f1of 5822 . . . . . 6  |-  ( {
<. A ,  J >. } : { A } -1-1-onto-> { J }  ->  { <. A ,  J >. } : { A } --> { J } )
2321, 22syl 16 . . . . 5  |-  ( ph  ->  { <. A ,  J >. } : { A }
--> { J } )
24 topontop 19554 . . . . . . 7  |-  ( J  e.  (TopOn `  X
)  ->  J  e.  Top )
2517, 24syl 16 . . . . . 6  |-  ( ph  ->  J  e.  Top )
2625snssd 4177 . . . . 5  |-  ( ph  ->  { J }  C_  Top )
2723, 26fssd 5746 . . . 4  |-  ( ph  ->  { <. A ,  J >. } : { A }
--> Top )
2817cnmptid 20288 . . . . . 6  |-  ( ph  ->  ( x  e.  X  |->  x )  e.  ( J  Cn  J ) )
2928adantr 465 . . . . 5  |-  ( (
ph  /\  k  e.  { A } )  -> 
( x  e.  X  |->  x )  e.  ( J  Cn  J ) )
30 elsni 4057 . . . . . . . 8  |-  ( k  e.  { A }  ->  k  =  A )
3130fveq2d 5876 . . . . . . 7  |-  ( k  e.  { A }  ->  ( { <. A ,  J >. } `  k
)  =  ( {
<. A ,  J >. } `
 A ) )
32 fvsng 6106 . . . . . . . 8  |-  ( ( A  e.  V  /\  J  e.  (TopOn `  X
) )  ->  ( { <. A ,  J >. } `  A )  =  J )
332, 17, 32syl2anc 661 . . . . . . 7  |-  ( ph  ->  ( { <. A ,  J >. } `  A
)  =  J )
3431, 33sylan9eqr 2520 . . . . . 6  |-  ( (
ph  /\  k  e.  { A } )  -> 
( { <. A ,  J >. } `  k
)  =  J )
3534oveq2d 6312 . . . . 5  |-  ( (
ph  /\  k  e.  { A } )  -> 
( J  Cn  ( { <. A ,  J >. } `  k ) )  =  ( J  Cn  J ) )
3629, 35eleqtrrd 2548 . . . 4  |-  ( (
ph  /\  k  e.  { A } )  -> 
( x  e.  X  |->  x )  e.  ( J  Cn  ( {
<. A ,  J >. } `
 k ) ) )
3716, 17, 19, 27, 36ptcn 20254 . . 3  |-  ( ph  ->  ( x  e.  X  |->  ( k  e.  { A }  |->  x ) )  e.  ( J  Cn  K ) )
3815, 37eqeltrrd 2546 . 2  |-  ( ph  ->  ( x  e.  X  |->  { <. A ,  x >. } )  e.  ( J  Cn  K ) )
39 simprr 757 . . . . . . . . 9  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
y  =  { <. A ,  x >. } )
4014adantrr 716 . . . . . . . . 9  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( k  e.  { A }  |->  x )  =  { <. A ,  x >. } )
4139, 40eqtr4d 2501 . . . . . . . 8  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
y  =  ( k  e.  { A }  |->  x ) )
42 simprl 756 . . . . . . . . . . 11  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  ->  x  e.  X )
4342adantr 465 . . . . . . . . . 10  |-  ( ( ( ph  /\  (
x  e.  X  /\  y  =  { <. A ,  x >. } ) )  /\  k  e.  { A } )  ->  x  e.  X )
44 eqid 2457 . . . . . . . . . 10  |-  ( k  e.  { A }  |->  x )  =  ( k  e.  { A }  |->  x )
4543, 44fmptd 6056 . . . . . . . . 9  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( k  e.  { A }  |->  x ) : { A } --> X )
46 toponmax 19556 . . . . . . . . . . . 12  |-  ( J  e.  (TopOn `  X
)  ->  X  e.  J )
4717, 46syl 16 . . . . . . . . . . 11  |-  ( ph  ->  X  e.  J )
4847adantr 465 . . . . . . . . . 10  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  ->  X  e.  J )
49 elmapg 7451 . . . . . . . . . 10  |-  ( ( X  e.  J  /\  { A }  e.  _V )  ->  ( ( k  e.  { A }  |->  x )  e.  ( X  ^m  { A } )  <->  ( k  e.  { A }  |->  x ) : { A }
--> X ) )
5048, 18, 49sylancl 662 . . . . . . . . 9  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( ( k  e. 
{ A }  |->  x )  e.  ( X  ^m  { A }
)  <->  ( k  e. 
{ A }  |->  x ) : { A }
--> X ) )
5145, 50mpbird 232 . . . . . . . 8  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( k  e.  { A }  |->  x )  e.  ( X  ^m  { A } ) )
5241, 51eqeltrd 2545 . . . . . . 7  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
y  e.  ( X  ^m  { A }
) )
5339fveq1d 5874 . . . . . . . 8  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( y `  A
)  =  ( {
<. A ,  x >. } `
 A ) )
542adantr 465 . . . . . . . . 9  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  ->  A  e.  V )
55 fvsng 6106 . . . . . . . . 9  |-  ( ( A  e.  V  /\  x  e.  X )  ->  ( { <. A ,  x >. } `  A
)  =  x )
5654, 42, 55syl2anc 661 . . . . . . . 8  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( { <. A ,  x >. } `  A
)  =  x )
5753, 56eqtr2d 2499 . . . . . . 7  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  ->  x  =  ( y `  A ) )
5852, 57jca 532 . . . . . 6  |-  ( (
ph  /\  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )  -> 
( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )
59 simprr 757 . . . . . . . 8  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  x  =  ( y `  A ) )
60 simprl 756 . . . . . . . . . 10  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  y  e.  ( X  ^m  { A } ) )
6147adantr 465 . . . . . . . . . . 11  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  X  e.  J
)
62 elmapg 7451 . . . . . . . . . . 11  |-  ( ( X  e.  J  /\  { A }  e.  _V )  ->  ( y  e.  ( X  ^m  { A } )  <->  y : { A } --> X ) )
6361, 18, 62sylancl 662 . . . . . . . . . 10  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  ( y  e.  ( X  ^m  { A } )  <->  y : { A } --> X ) )
6460, 63mpbid 210 . . . . . . . . 9  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  y : { A } --> X )
65 snidg 4058 . . . . . . . . . . 11  |-  ( A  e.  V  ->  A  e.  { A } )
662, 65syl 16 . . . . . . . . . 10  |-  ( ph  ->  A  e.  { A } )
6766adantr 465 . . . . . . . . 9  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  A  e.  { A } )
6864, 67ffvelrnd 6033 . . . . . . . 8  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  ( y `  A )  e.  X
)
6959, 68eqeltrd 2545 . . . . . . 7  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  x  e.  X
)
702adantr 465 . . . . . . . . . . 11  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  A  e.  V
)
714feq2d 5724 . . . . . . . . . . . 12  |-  ( k  =  A  ->  (
y : { k } --> X  <->  y : { A } --> X ) )
72 fveq2 5872 . . . . . . . . . . . . . 14  |-  ( k  =  A  ->  (
y `  k )  =  ( y `  A ) )
7372eleq1d 2526 . . . . . . . . . . . . 13  |-  ( k  =  A  ->  (
( y `  k
)  e.  X  <->  ( y `  A )  e.  X
) )
74 id 22 . . . . . . . . . . . . . . . 16  |-  ( k  =  A  ->  k  =  A )
7574, 72opeq12d 4227 . . . . . . . . . . . . . . 15  |-  ( k  =  A  ->  <. k ,  ( y `  k ) >.  =  <. A ,  ( y `  A ) >. )
7675sneqd 4044 . . . . . . . . . . . . . 14  |-  ( k  =  A  ->  { <. k ,  ( y `  k ) >. }  =  { <. A ,  ( y `  A )
>. } )
7776eqeq2d 2471 . . . . . . . . . . . . 13  |-  ( k  =  A  ->  (
y  =  { <. k ,  ( y `  k ) >. }  <->  y  =  { <. A ,  ( y `  A )
>. } ) )
7873, 77anbi12d 710 . . . . . . . . . . . 12  |-  ( k  =  A  ->  (
( ( y `  k )  e.  X  /\  y  =  { <. k ,  ( y `
 k ) >. } )  <->  ( (
y `  A )  e.  X  /\  y  =  { <. A ,  ( y `  A )
>. } ) ) )
799fsn2 6072 . . . . . . . . . . . 12  |-  ( y : { k } --> X  <->  ( ( y `
 k )  e.  X  /\  y  =  { <. k ,  ( y `  k )
>. } ) )
8071, 78, 79vtoclbg 3168 . . . . . . . . . . 11  |-  ( A  e.  V  ->  (
y : { A }
--> X  <->  ( ( y `
 A )  e.  X  /\  y  =  { <. A ,  ( y `  A )
>. } ) ) )
8170, 80syl 16 . . . . . . . . . 10  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  ( y : { A } --> X  <->  ( (
y `  A )  e.  X  /\  y  =  { <. A ,  ( y `  A )
>. } ) ) )
8264, 81mpbid 210 . . . . . . . . 9  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  ( ( y `
 A )  e.  X  /\  y  =  { <. A ,  ( y `  A )
>. } ) )
8382simprd 463 . . . . . . . 8  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  y  =  { <. A ,  ( y `
 A ) >. } )
8459opeq2d 4226 . . . . . . . . 9  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  <. A ,  x >.  =  <. A ,  ( y `  A )
>. )
8584sneqd 4044 . . . . . . . 8  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  { <. A ,  x >. }  =  { <. A ,  ( y `
 A ) >. } )
8683, 85eqtr4d 2501 . . . . . . 7  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  y  =  { <. A ,  x >. } )
8769, 86jca 532 . . . . . 6  |-  ( (
ph  /\  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) )  ->  ( x  e.  X  /\  y  =  { <. A ,  x >. } ) )
8858, 87impbida 832 . . . . 5  |-  ( ph  ->  ( ( x  e.  X  /\  y  =  { <. A ,  x >. } )  <->  ( y  e.  ( X  ^m  { A } )  /\  x  =  ( y `  A ) ) ) )
8988mptcnv 5415 . . . 4  |-  ( ph  ->  `' ( x  e.  X  |->  { <. A ,  x >. } )  =  ( y  e.  ( X  ^m  { A } )  |->  ( y `
 A ) ) )
90 xpsng 6073 . . . . . . . . . . 11  |-  ( ( A  e.  V  /\  J  e.  (TopOn `  X
) )  ->  ( { A }  X.  { J } )  =  { <. A ,  J >. } )
912, 17, 90syl2anc 661 . . . . . . . . . 10  |-  ( ph  ->  ( { A }  X.  { J } )  =  { <. A ,  J >. } )
9291eqcomd 2465 . . . . . . . . 9  |-  ( ph  ->  { <. A ,  J >. }  =  ( { A }  X.  { J } ) )
9392fveq2d 5876 . . . . . . . 8  |-  ( ph  ->  ( Xt_ `  { <. A ,  J >. } )  =  ( Xt_ `  ( { A }  X.  { J } ) ) )
9416, 93syl5eq 2510 . . . . . . 7  |-  ( ph  ->  K  =  ( Xt_ `  ( { A }  X.  { J } ) ) )
95 eqid 2457 . . . . . . . . 9  |-  ( Xt_ `  ( { A }  X.  { J } ) )  =  ( Xt_ `  ( { A }  X.  { J } ) )
9695pttoponconst 20224 . . . . . . . 8  |-  ( ( { A }  e.  _V  /\  J  e.  (TopOn `  X ) )  -> 
( Xt_ `  ( { A }  X.  { J } ) )  e.  (TopOn `  ( X  ^m  { A } ) ) )
9719, 17, 96syl2anc 661 . . . . . . 7  |-  ( ph  ->  ( Xt_ `  ( { A }  X.  { J } ) )  e.  (TopOn `  ( X  ^m  { A } ) ) )
9894, 97eqeltrd 2545 . . . . . 6  |-  ( ph  ->  K  e.  (TopOn `  ( X  ^m  { A } ) ) )
99 toponuni 19555 . . . . . 6  |-  ( K  e.  (TopOn `  ( X  ^m  { A }
) )  ->  ( X  ^m  { A }
)  =  U. K
)
10098, 99syl 16 . . . . 5  |-  ( ph  ->  ( X  ^m  { A } )  =  U. K )
101100mpteq1d 4538 . . . 4  |-  ( ph  ->  ( y  e.  ( X  ^m  { A } )  |->  ( y `
 A ) )  =  ( y  e. 
U. K  |->  ( y `
 A ) ) )
10289, 101eqtrd 2498 . . 3  |-  ( ph  ->  `' ( x  e.  X  |->  { <. A ,  x >. } )  =  ( y  e.  U. K  |->  ( y `  A ) ) )
103 eqid 2457 . . . . . 6  |-  U. K  =  U. K
104103, 16ptpjcn 20238 . . . . 5  |-  ( ( { A }  e.  _V  /\  { <. A ,  J >. } : { A } --> Top  /\  A  e. 
{ A } )  ->  ( y  e. 
U. K  |->  ( y `
 A ) )  e.  ( K  Cn  ( { <. A ,  J >. } `  A ) ) )
10519, 27, 66, 104syl3anc 1228 . . . 4  |-  ( ph  ->  ( y  e.  U. K  |->  ( y `  A ) )  e.  ( K  Cn  ( { <. A ,  J >. } `  A ) ) )
10633oveq2d 6312 . . . 4  |-  ( ph  ->  ( K  Cn  ( { <. A ,  J >. } `  A ) )  =  ( K  Cn  J ) )
107105, 106eleqtrd 2547 . . 3  |-  ( ph  ->  ( y  e.  U. K  |->  ( y `  A ) )  e.  ( K  Cn  J
) )
108102, 107eqeltrd 2545 . 2  |-  ( ph  ->  `' ( x  e.  X  |->  { <. A ,  x >. } )  e.  ( K  Cn  J
) )
109 ishmeo 20386 . 2  |-  ( ( x  e.  X  |->  {
<. A ,  x >. } )  e.  ( J
Homeo K )  <->  ( (
x  e.  X  |->  {
<. A ,  x >. } )  e.  ( J  Cn  K )  /\  `' ( x  e.  X  |->  { <. A ,  x >. } )  e.  ( K  Cn  J
) ) )
11038, 108, 109sylanbrc 664 1  |-  ( ph  ->  ( x  e.  X  |->  { <. A ,  x >. } )  e.  ( J Homeo K ) )
Colors of variables: wff setvar class
Syntax hints:    -> wi 4    <-> wb 184    /\ wa 369    = wceq 1395    e. wcel 1819   _Vcvv 3109   {csn 4032   <.cop 4038   U.cuni 4251    |-> cmpt 4515    X. cxp 5006   `'ccnv 5007   -->wf 5590   -1-1-onto->wf1o 5593   ` cfv 5594  (class class class)co 6296    ^m cmap 7438   Xt_cpt 14856   Topctop 19521  TopOnctopon 19522    Cn ccn 19852   Homeochmeo 20380
This theorem was proved from axioms:  ax-mp 5  ax-1 6  ax-2 7  ax-3 8  ax-gen 1619  ax-4 1632  ax-5 1705  ax-6 1748  ax-7 1791  ax-8 1821  ax-9 1823  ax-10 1838  ax-11 1843  ax-12 1855  ax-13 2000  ax-ext 2435  ax-rep 4568  ax-sep 4578  ax-nul 4586  ax-pow 4634  ax-pr 4695  ax-un 6591
This theorem depends on definitions:  df-bi 185  df-or 370  df-an 371  df-3or 974  df-3an 975  df-tru 1398  df-ex 1614  df-nf 1618  df-sb 1741  df-eu 2287  df-mo 2288  df-clab 2443  df-cleq 2449  df-clel 2452  df-nfc 2607  df-ne 2654  df-ral 2812  df-rex 2813  df-reu 2814  df-rab 2816  df-v 3111  df-sbc 3328  df-csb 3431  df-dif 3474  df-un 3476  df-in 3478  df-ss 3485  df-pss 3487  df-nul 3794  df-if 3945  df-pw 4017  df-sn 4033  df-pr 4035  df-tp 4037  df-op 4039  df-uni 4252  df-int 4289  df-iun 4334  df-iin 4335  df-br 4457  df-opab 4516  df-mpt 4517  df-tr 4551  df-eprel 4800  df-id 4804  df-po 4809  df-so 4810  df-fr 4847  df-we 4849  df-ord 4890  df-on 4891  df-lim 4892  df-suc 4893  df-xp 5014  df-rel 5015  df-cnv 5016  df-co 5017  df-dm 5018  df-rn 5019  df-res 5020  df-ima 5021  df-iota 5557  df-fun 5596  df-fn 5597  df-f 5598  df-f1 5599  df-fo 5600  df-f1o 5601  df-fv 5602  df-ov 6299  df-oprab 6300  df-mpt2 6301  df-om 6700  df-1st 6799  df-2nd 6800  df-recs 7060  df-rdg 7094  df-1o 7148  df-oadd 7152  df-er 7329  df-map 7440  df-ixp 7489  df-en 7536  df-dom 7537  df-fin 7539  df-fi 7889  df-topgen 14861  df-pt 14862  df-top 19526  df-bases 19528  df-topon 19529  df-cn 19855  df-cnp 19856  df-hmeo 20382
This theorem is referenced by:  xpstopnlem1  20436  ptcmpfi  20440
  Copyright terms: Public domain W3C validator