Rebuilt html docs for Privoxy 3.0.8
[privoxy.git] / doc / webserver / user-manual / filter-file.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
2 <HTML
3 ><HEAD
4 ><TITLE
5 >Filter Files</TITLE
6 ><META
7 NAME="GENERATOR"
8 CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
9 REL="HOME"
10 TITLE="Privoxy 3.0.8 User Manual"
11 HREF="index.html"><LINK
12 REL="PREVIOUS"
13 TITLE="Actions Files"
14 HREF="actions-file.html"><LINK
15 REL="NEXT"
16 TITLE="Privoxy's Template Files"
17 HREF="templates.html"><LINK
18 REL="STYLESHEET"
19 TYPE="text/css"
20 HREF="../p_doc.css">
21 <LINK REL="STYLESHEET" TYPE="text/css" HREF="p_doc.css">
22 </head
23 ><BODY
24 CLASS="SECT1"
25 BGCOLOR="#EEEEEE"
26 TEXT="#000000"
27 LINK="#0000FF"
28 VLINK="#840084"
29 ALINK="#0000FF"
30 ><DIV
31 CLASS="NAVHEADER"
32 ><TABLE
33 SUMMARY="Header navigation table"
34 WIDTH="100%"
35 BORDER="0"
36 CELLPADDING="0"
37 CELLSPACING="0"
38 ><TR
39 ><TH
40 COLSPAN="3"
41 ALIGN="center"
42 >Privoxy 3.0.8 User Manual</TH
43 ></TR
44 ><TR
45 ><TD
46 WIDTH="10%"
47 ALIGN="left"
48 VALIGN="bottom"
49 ><A
50 HREF="actions-file.html"
51 ACCESSKEY="P"
52 >Prev</A
53 ></TD
54 ><TD
55 WIDTH="80%"
56 ALIGN="center"
57 VALIGN="bottom"
58 ></TD
59 ><TD
60 WIDTH="10%"
61 ALIGN="right"
62 VALIGN="bottom"
63 ><A
64 HREF="templates.html"
65 ACCESSKEY="N"
66 >Next</A
67 ></TD
68 ></TR
69 ></TABLE
70 ><HR
71 ALIGN="LEFT"
72 WIDTH="100%"></DIV
73 ><DIV
74 CLASS="SECT1"
75 ><H1
76 CLASS="SECT1"
77 ><A
78 NAME="FILTER-FILE"
79 >9. Filter Files</A
80 ></H1
81 ><P
82 > On-the-fly text substitutions need
83  to be defined in a <SPAN
84 CLASS="QUOTE"
85 >"filter file"</SPAN
86 >. Once defined, they 
87  can then be invoked as an <SPAN
88 CLASS="QUOTE"
89 >"action"</SPAN
90 >.</P
91 ><P
92 > <SPAN
93 CLASS="APPLICATION"
94 >Privoxy</SPAN
95 > supports three different filter actions:
96  <TT
97 CLASS="LITERAL"
98 ><A
99 HREF="actions-file.html#FILTER"
100 >filter</A
101 ></TT
102 > to
103  rewrite the content that is send to the client,
104  <TT
105 CLASS="LITERAL"
106 ><A
107 HREF="actions-file.html#CLIENT-HEADER-FILTER"
108 >client-header-filter</A
109 ></TT
110 >
111  to rewrite headers that are send by the client, and
112  <TT
113 CLASS="LITERAL"
114 ><A
115 HREF="actions-file.html#SERVER-HEADER-FILTER"
116 >server-header-filter</A
117 ></TT
118 >
119  to rewrite headers that are send by the server.</P
120 ><P
121 > <SPAN
122 CLASS="APPLICATION"
123 >Privoxy</SPAN
124 > also supports two tagger actions:
125  <TT
126 CLASS="LITERAL"
127 ><A
128 HREF="actions-file.html#CLIENT-HEADER-TAGGER"
129 >client-header-tagger</A
130 ></TT
131 >
132  and
133  <TT
134 CLASS="LITERAL"
135 ><A
136 HREF="actions-file.html#SERVER-HEADER-TAGGER"
137 >server-header-tagger</A
138 ></TT
139 >.
140  Taggers and filters use the same syntax in the filter files, the difference
141  is that taggers don't modify the text they are filtering, but use a rewritten
142  version of the filtered text as tag. The tags can then be used to change the
143  applying actions through sections with <A
144 HREF="actions-file.html#TAG-PATTERN"
145 >tag-patterns</A
146 >.</P
147 ><P
148 > Multiple filter files can be defined through the <TT
149 CLASS="LITERAL"
150 > <A
151 HREF="config.html#FILTERFILE"
152 >filterfile</A
153 ></TT
154 > config directive. The filters
155  as supplied by the developers are located in
156  <TT
157 CLASS="FILENAME"
158 >default.filter</TT
159 >. It is recommended that any locally
160  defined or modified filters go in a separately defined file such as
161  <TT
162 CLASS="FILENAME"
163 >user.filter</TT
164 >.
165  </P
166 ><P
167 > Common tasks for content filters are to eliminate common annoyances in
168  HTML and JavaScript, such as pop-up windows,
169  exit consoles, crippled windows without navigation tools, the
170  infamous &#60;BLINK&#62; tag etc, to suppress images with certain
171  width and height attributes (standard banner sizes or web-bugs),
172  or just to have fun.</P
173 ><P
174 > Enabled content filters are applied to any content whose
175  <SPAN
176 CLASS="QUOTE"
177 >"Content Type"</SPAN
178 > header is recognised as a sign
179  of text-based content, with the exception of <TT
180 CLASS="LITERAL"
181 >text/plain</TT
182 >.
183  Use the <A
184 HREF="actions-file.html#FORCE-TEXT-MODE"
185 >force-text-mode</A
186 > action
187  to also filter other content.</P
188 ><P
189 > Substitutions are made at the source level, so if you want to <SPAN
190 CLASS="QUOTE"
191 >"roll
192  your own"</SPAN
193 > filters, you should first be familiar with HTML syntax, 
194  and, of course, regular expressions.</P
195 ><P
196 > Just like the <A
197 HREF="actions-file.html"
198 >actions files</A
199 >, the
200  filter file is organized in sections, which are called <SPAN
201 CLASS="emphasis"
202 ><I
203 CLASS="EMPHASIS"
204 >filters</I
205 ></SPAN
206 >
207  here. Each filter consists of a heading line, that starts with one of the
208  <SPAN
209 CLASS="emphasis"
210 ><I
211 CLASS="EMPHASIS"
212 >keywords</I
213 ></SPAN
214 > <TT
215 CLASS="LITERAL"
216 >FILTER:</TT
217 >,
218  <TT
219 CLASS="LITERAL"
220 >CLIENT-HEADER-FILTER:</TT
221 > or <TT
222 CLASS="LITERAL"
223 >SERVER-HEADER-FILTER:</TT
224 >
225  followed by the filter's <SPAN
226 CLASS="emphasis"
227 ><I
228 CLASS="EMPHASIS"
229 >name</I
230 ></SPAN
231 >, and a short (one line) 
232  <SPAN
233 CLASS="emphasis"
234 ><I
235 CLASS="EMPHASIS"
236 >description</I
237 ></SPAN
238 > of what it does. Below that line
239  come the <SPAN
240 CLASS="emphasis"
241 ><I
242 CLASS="EMPHASIS"
243 >jobs</I
244 ></SPAN
245 >, i.e. lines that define the actual
246  text substitutions. By convention, the name of a filter
247  should describe what the filter <SPAN
248 CLASS="emphasis"
249 ><I
250 CLASS="EMPHASIS"
251 >eliminates</I
252 ></SPAN
253 >. The
254  comment is used in the <A
255 HREF="http://config.privoxy.org/"
256 TARGET="_top"
257 >web-based
258  user interface</A
259 >.</P
260 ><P
261 > Once a filter called <TT
262 CLASS="REPLACEABLE"
263 ><I
264 >name</I
265 ></TT
266 > has been defined
267  in the filter file, it can be invoked by using an action of the form
268  +<TT
269 CLASS="LITERAL"
270 ><A
271 HREF="actions-file.html#FILTER"
272 >filter</A
273 >{<TT
274 CLASS="REPLACEABLE"
275 ><I
276 >name</I
277 ></TT
278 >}</TT
279 >
280  in any <A
281 HREF="actions-file.html"
282 >actions file</A
283 >.</P
284 ><P
285 > Filter definitions start with a header line that contains the filter
286  type, the filter name and the filter description.
287  A content filter header line for a filter called <SPAN
288 CLASS="QUOTE"
289 >"foo"</SPAN
290 > could look
291  like this:</P
292 ><P
293 > <TABLE
294 BORDER="0"
295 BGCOLOR="#E0E0E0"
296 WIDTH="100%"
297 ><TR
298 ><TD
299 ><PRE
300 CLASS="SCREEN"
301 >FILTER: foo Replace all "foo" with "bar"</PRE
302 ></TD
303 ></TR
304 ></TABLE
305 ></P
306 ><P
307 > Below that line, and up to the next header line, come the jobs that
308  define what text replacements the filter executes. They are specified
309  in a syntax that imitates <A
310 HREF="http://www.perl.org/"
311 TARGET="_top"
312 >Perl</A
313 >'s
314  <TT
315 CLASS="LITERAL"
316 >s///</TT
317 > operator. If you are familiar with Perl, you
318  will find this to be quite intuitive, and may want to look at the
319  PCRS documentation for the subtle differences to Perl behaviour. Most
320  notably, the non-standard option letter <TT
321 CLASS="LITERAL"
322 >U</TT
323 > is supported,
324  which turns the default to ungreedy matching.</P
325 ><P
326 > If you are new to 
327   <A
328 HREF="http://en.wikipedia.org/wiki/Regular_expressions"
329 TARGET="_top"
330 ><SPAN
331 CLASS="QUOTE"
332 >"Regular
333   Expressions"</SPAN
334 ></A
335 >, you might want to take a look at
336  the <A
337 HREF="appendix.html#REGEX"
338 >Appendix on regular expressions</A
339 >, and
340  see the <A
341 HREF="http://perldoc.perl.org/perlre.html"
342 TARGET="_top"
343 >Perl
344  manual</A
345 > for
346  <A
347 HREF="http://perldoc.perl.org/perlop.html"
348 TARGET="_top"
349 >the 
350  <TT
351 CLASS="LITERAL"
352 >s///</TT
353 > operator's syntax</A
354 > and <A
355 HREF="http://perldoc.perl.org/perlre.html"
356 TARGET="_top"
357 >Perl-style regular
358  expressions</A
359 > in general.
360  The below examples might also help to get you started.</P
361 ><DIV
362 CLASS="SECT2"
363 ><H2
364 CLASS="SECT2"
365 ><A
366 NAME="AEN4616"
367 >9.1. Filter File Tutorial</A
368 ></H2
369 ><P
370 > Now, let's complete our <SPAN
371 CLASS="QUOTE"
372 >"foo"</SPAN
373 > content filter. We have already defined
374  the heading, but the jobs are still missing. Since all it does is to replace
375  <SPAN
376 CLASS="QUOTE"
377 >"foo"</SPAN
378 > with <SPAN
379 CLASS="QUOTE"
380 >"bar"</SPAN
381 >, there is only one (trivial) job
382  needed:</P
383 ><P
384 > <TABLE
385 BORDER="0"
386 BGCOLOR="#E0E0E0"
387 WIDTH="100%"
388 ><TR
389 ><TD
390 ><PRE
391 CLASS="SCREEN"
392 >s/foo/bar/</PRE
393 ></TD
394 ></TR
395 ></TABLE
396 ></P
397 ><P
398 > But wait! Didn't the comment say that <SPAN
399 CLASS="emphasis"
400 ><I
401 CLASS="EMPHASIS"
402 >all</I
403 ></SPAN
404 > occurrences
405  of <SPAN
406 CLASS="QUOTE"
407 >"foo"</SPAN
408 > should be replaced? Our current job will only take
409  care of the first <SPAN
410 CLASS="QUOTE"
411 >"foo"</SPAN
412 > on each page. For global substitution,
413  we'll need to add the <TT
414 CLASS="LITERAL"
415 >g</TT
416 > option:</P
417 ><P
418 > <TABLE
419 BORDER="0"
420 BGCOLOR="#E0E0E0"
421 WIDTH="100%"
422 ><TR
423 ><TD
424 ><PRE
425 CLASS="SCREEN"
426 >s/foo/bar/g</PRE
427 ></TD
428 ></TR
429 ></TABLE
430 ></P
431 ><P
432 > Our complete filter now looks like this:</P
433 ><P
434 > <TABLE
435 BORDER="0"
436 BGCOLOR="#E0E0E0"
437 WIDTH="100%"
438 ><TR
439 ><TD
440 ><PRE
441 CLASS="SCREEN"
442 >FILTER: foo Replace all "foo" with "bar"
443 s/foo/bar/g</PRE
444 ></TD
445 ></TR
446 ></TABLE
447 ></P
448 ><P
449 > Let's look at some real filters for more interesting examples. Here you see
450  a filter that protects against some common annoyances that arise from JavaScript
451  abuse. Let's look at its jobs one after the other:</P
452 ><P
453 > <TABLE
454 BORDER="0"
455 BGCOLOR="#E0E0E0"
456 WIDTH="100%"
457 ><TR
458 ><TD
459 ><PRE
460 CLASS="SCREEN"
461 >FILTER: js-annoyances Get rid of particularly annoying JavaScript abuse
462
463 # Get rid of JavaScript referrer tracking. Test page: http://www.randomoddness.com/untitled.htm
464 #
465 s|(&#60;script.*)document\.referrer(.*&#60;/script&#62;)|$1"Not Your Business!"$2|Usg</PRE
466 ></TD
467 ></TR
468 ></TABLE
469 ></P
470 ><P
471 > Following the header line and a comment, you see the job. Note that it uses
472  <TT
473 CLASS="LITERAL"
474 >|</TT
475 > as the delimiter instead of <TT
476 CLASS="LITERAL"
477 >/</TT
478 >, because
479  the pattern contains a forward slash, which would otherwise have to be escaped
480  by a backslash (<TT
481 CLASS="LITERAL"
482 >\</TT
483 >).</P
484 ><P
485 > Now, let's examine the pattern: it starts with the text <TT
486 CLASS="LITERAL"
487 >&#60;script.*</TT
488 >
489  enclosed in parentheses. Since the dot matches any character, and <TT
490 CLASS="LITERAL"
491 >*</TT
492 >
493  means: <SPAN
494 CLASS="QUOTE"
495 >"Match an arbitrary number of the element left of myself"</SPAN
496 >, this
497  matches <SPAN
498 CLASS="QUOTE"
499 >"&#60;script"</SPAN
500 >, followed by <SPAN
501 CLASS="emphasis"
502 ><I
503 CLASS="EMPHASIS"
504 >any</I
505 ></SPAN
506 > text, i.e.
507  it matches the whole page, from the start of the first &#60;script&#62; tag.</P
508 ><P
509 > That's more than we want, but the pattern continues: <TT
510 CLASS="LITERAL"
511 >document\.referrer</TT
512 >
513  matches only the exact string <SPAN
514 CLASS="QUOTE"
515 >"document.referrer"</SPAN
516 >. The dot needed to
517  be <SPAN
518 CLASS="emphasis"
519 ><I
520 CLASS="EMPHASIS"
521 >escaped</I
522 ></SPAN
523 >, i.e. preceded by a backslash, to take away its
524  special meaning as a joker, and make it just a regular dot. So far, the meaning is:
525  Match from the start of the first &#60;script&#62; tag in a the page, up to, and including,
526  the text <SPAN
527 CLASS="QUOTE"
528 >"document.referrer"</SPAN
529 >, if <SPAN
530 CLASS="emphasis"
531 ><I
532 CLASS="EMPHASIS"
533 >both</I
534 ></SPAN
535 > are present
536  in the page (and appear in that order).</P
537 ><P
538 > But there's still more pattern to go. The next element, again enclosed in parentheses,
539  is <TT
540 CLASS="LITERAL"
541 >.*&#60;/script&#62;</TT
542 >. You already know what <TT
543 CLASS="LITERAL"
544 >.*</TT
545 >
546  means, so the whole pattern translates to: Match from the start of the first  &#60;script&#62;
547  tag in a page to the end of the last &#60;script&#62; tag, provided that the text
548  <SPAN
549 CLASS="QUOTE"
550 >"document.referrer"</SPAN
551 > appears somewhere in between.</P
552 ><P
553 > This is still not the whole story, since we have ignored the options and the parentheses:
554  The portions of the page matched by sub-patterns that are enclosed in parentheses, will be
555  remembered and be available through the variables <TT
556 CLASS="LITERAL"
557 >$1, $2, ...</TT
558 > in
559  the substitute. The <TT
560 CLASS="LITERAL"
561 >U</TT
562 > option switches to ungreedy matching, which means
563  that the first <TT
564 CLASS="LITERAL"
565 >.*</TT
566 > in the pattern will only <SPAN
567 CLASS="QUOTE"
568 >"eat up"</SPAN
569 > all
570  text in between <SPAN
571 CLASS="QUOTE"
572 >"&#60;script"</SPAN
573 > and the <SPAN
574 CLASS="emphasis"
575 ><I
576 CLASS="EMPHASIS"
577 >first</I
578 ></SPAN
579 > occurrence
580  of <SPAN
581 CLASS="QUOTE"
582 >"document.referrer"</SPAN
583 >, and that the second <TT
584 CLASS="LITERAL"
585 >.*</TT
586 > will
587  only span the text up to the <SPAN
588 CLASS="emphasis"
589 ><I
590 CLASS="EMPHASIS"
591 >first</I
592 ></SPAN
593 > <SPAN
594 CLASS="QUOTE"
595 >"&#60;/script&#62;"</SPAN
596 >
597  tag. Furthermore, the <TT
598 CLASS="LITERAL"
599 >s</TT
600 > option says that the match may span
601  multiple lines in the page, and the <TT
602 CLASS="LITERAL"
603 >g</TT
604 > option again means that the
605  substitution is global.</P
606 ><P
607 > So, to summarize, the pattern means: Match all scripts that contain the text
608  <SPAN
609 CLASS="QUOTE"
610 >"document.referrer"</SPAN
611 >. Remember the parts of the script from
612  (and including) the start tag up to (and excluding) the string
613  <SPAN
614 CLASS="QUOTE"
615 >"document.referrer"</SPAN
616 > as <TT
617 CLASS="LITERAL"
618 >$1</TT
619 >, and the part following
620  that string, up to and including the closing tag, as <TT
621 CLASS="LITERAL"
622 >$2</TT
623 >.</P
624 ><P
625 > Now the pattern is deciphered, but wasn't this about substituting things? So
626  lets look at the substitute: <TT
627 CLASS="LITERAL"
628 >$1"Not Your Business!"$2</TT
629 > is
630  easy to read: The text remembered as <TT
631 CLASS="LITERAL"
632 >$1</TT
633 >, followed by 
634  <TT
635 CLASS="LITERAL"
636 >"Not Your Business!"</TT
637 > (<SPAN
638 CLASS="emphasis"
639 ><I
640 CLASS="EMPHASIS"
641 >including</I
642 ></SPAN
643 >
644  the quotation marks!), followed by the text remembered as <TT
645 CLASS="LITERAL"
646 >$2</TT
647 >.
648  This produces an exact copy of the original string, with the middle part
649  (the <SPAN
650 CLASS="QUOTE"
651 >"document.referrer"</SPAN
652 >) replaced by <TT
653 CLASS="LITERAL"
654 >"Not Your
655  Business!"</TT
656 >.</P
657 ><P
658 > The whole job now reads: Replace <SPAN
659 CLASS="QUOTE"
660 >"document.referrer"</SPAN
661 > by
662  <TT
663 CLASS="LITERAL"
664 >"Not Your Business!"</TT
665 > wherever it appears inside a
666  &#60;script&#62; tag. Note that this job won't break JavaScript syntax,
667  since both the original and the replacement are syntactically valid
668  string objects. The script just won't have access to the referrer
669  information anymore.</P
670 ><P
671 > We'll show you two other jobs from the JavaScript taming department, but
672  this time only point out the constructs of special interest:</P
673 ><P
674 > <TABLE
675 BORDER="0"
676 BGCOLOR="#E0E0E0"
677 WIDTH="100%"
678 ><TR
679 ><TD
680 ><PRE
681 CLASS="SCREEN"
682 ># The status bar is for displaying link targets, not pointless blahblah
683 #
684 s/window\.status\s*=\s*(['"]).*?\1/dUmMy=1/ig</PRE
685 ></TD
686 ></TR
687 ></TABLE
688 ></P
689 ><P
690 > <TT
691 CLASS="LITERAL"
692 >\s</TT
693 > stands for whitespace characters (space, tab, newline,
694  carriage return, form feed), so that <TT
695 CLASS="LITERAL"
696 >\s*</TT
697 > means: <SPAN
698 CLASS="QUOTE"
699 >"zero
700  or more whitespace"</SPAN
701 >. The <TT
702 CLASS="LITERAL"
703 >?</TT
704 > in <TT
705 CLASS="LITERAL"
706 >.*?</TT
707 >
708  makes this matching of arbitrary text ungreedy. (Note that the <TT
709 CLASS="LITERAL"
710 >U</TT
711 >
712  option is not set). The <TT
713 CLASS="LITERAL"
714 >['"]</TT
715 > construct means: <SPAN
716 CLASS="QUOTE"
717 >"a single
718  <SPAN
719 CLASS="emphasis"
720 ><I
721 CLASS="EMPHASIS"
722 >or</I
723 ></SPAN
724 > a double quote"</SPAN
725 >. Finally, <TT
726 CLASS="LITERAL"
727 >\1</TT
728 > is
729  a back-reference to the first parenthesis just like <TT
730 CLASS="LITERAL"
731 >$1</TT
732 > above,
733  with the difference that in the <SPAN
734 CLASS="emphasis"
735 ><I
736 CLASS="EMPHASIS"
737 >pattern</I
738 ></SPAN
739 >, a backslash indicates
740  a back-reference, whereas in the <SPAN
741 CLASS="emphasis"
742 ><I
743 CLASS="EMPHASIS"
744 >substitute</I
745 ></SPAN
746 >, it's the dollar.</P
747 ><P
748 > So what does this job do? It replaces assignments of single- or double-quoted
749  strings to the <SPAN
750 CLASS="QUOTE"
751 >"window.status"</SPAN
752 > object with a dummy assignment
753  (using a variable name that is hopefully odd enough not to conflict with
754  real variables in scripts). Thus, it catches many cases where e.g. pointless
755  descriptions are displayed in the status bar instead of the link target when
756  you move your mouse over links.</P
757 ><P
758 > <TABLE
759 BORDER="0"
760 BGCOLOR="#E0E0E0"
761 WIDTH="100%"
762 ><TR
763 ><TD
764 ><PRE
765 CLASS="SCREEN"
766 ># Kill OnUnload popups. Yummy. Test: http://www.zdnet.com/zdsubs/yahoo/tree/yfs.html
767 #
768 s/(&#60;body [^&#62;]*)onunload(.*&#62;)/$1never$2/iU</PRE
769 ></TD
770 ></TR
771 ></TABLE
772 ></P
773 ><P
774 > Including the
775  <A
776 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
777 TARGET="_top"
778 >OnUnload
779  event binding</A
780 > in the HTML DOM was a <SPAN
781 CLASS="emphasis"
782 ><I
783 CLASS="EMPHASIS"
784 >CRIME</I
785 ></SPAN
786 >.
787  When I close a browser window, I want it to close and die. Basta.
788  This job replaces the <SPAN
789 CLASS="QUOTE"
790 >"onunload"</SPAN
791 > attribute in
792  <SPAN
793 CLASS="QUOTE"
794 >"&#60;body&#62;"</SPAN
795 > tags with the dummy word <TT
796 CLASS="LITERAL"
797 >never</TT
798 >.
799  Note that the <TT
800 CLASS="LITERAL"
801 >i</TT
802 > option makes the pattern matching
803  case-insensitive. Also note that ungreedy matching alone doesn't always guarantee
804  a minimal match: In the first parenthesis, we had to use <TT
805 CLASS="LITERAL"
806 >[^&#62;]*</TT
807 >
808  instead of <TT
809 CLASS="LITERAL"
810 >.*</TT
811 > to prevent the match from exceeding the 
812  &#60;body&#62; tag if it doesn't contain <SPAN
813 CLASS="QUOTE"
814 >"OnUnload"</SPAN
815 >, but the page's
816  content does.</P
817 ><P
818 > The last example is from the fun department:</P
819 ><P
820 > <TABLE
821 BORDER="0"
822 BGCOLOR="#E0E0E0"
823 WIDTH="100%"
824 ><TR
825 ><TD
826 ><PRE
827 CLASS="SCREEN"
828 >FILTER: fun Fun text replacements
829
830 # Spice the daily news:
831 #
832 s/microsoft(?!\.com)/MicroSuck/ig</PRE
833 ></TD
834 ></TR
835 ></TABLE
836 ></P
837 ><P
838 > Note the <TT
839 CLASS="LITERAL"
840 >(?!\.com)</TT
841 > part (a so-called negative lookahead)
842  in the job's pattern, which means: Don't match, if the string 
843  <SPAN
844 CLASS="QUOTE"
845 >".com"</SPAN
846 > appears directly following <SPAN
847 CLASS="QUOTE"
848 >"microsoft"</SPAN
849 >
850  in the page. This prevents links to microsoft.com from being trashed, while
851  still replacing the word everywhere else.</P
852 ><P
853 > <TABLE
854 BORDER="0"
855 BGCOLOR="#E0E0E0"
856 WIDTH="100%"
857 ><TR
858 ><TD
859 ><PRE
860 CLASS="SCREEN"
861 ># Buzzword Bingo (example for extended regex syntax)
862 #
863 s* industry[ -]leading \
864 |  cutting[ -]edge \
865 |  customer[ -]focused \
866 |  market[ -]driven \
867 |  award[ -]winning # Comments are OK, too! \
868 |  high[ -]performance \
869 |  solutions[ -]based \
870 |  unmatched \
871 |  unparalleled \
872 |  unrivalled \
873 *&#60;font color="red"&#62;&#60;b&#62;BINGO!&#60;/b&#62;&#60;/font&#62; \
874 *igx</PRE
875 ></TD
876 ></TR
877 ></TABLE
878 ></P
879 ><P
880 > The <TT
881 CLASS="LITERAL"
882 >x</TT
883 > option in this job turns on extended syntax, and allows for
884  e.g. the liberal use of (non-interpreted!) whitespace for nicer formatting. </P
885 ><P
886 > You get the idea?</P
887 ></DIV
888 ><DIV
889 CLASS="SECT2"
890 ><H2
891 CLASS="SECT2"
892 ><A
893 NAME="PREDEFINED-FILTERS"
894 >9.2. The Pre-defined Filters</A
895 ></H2
896 ><P
897 >The distribution <TT
898 CLASS="FILENAME"
899 >default.filter</TT
900 > file contains a selection of
901 pre-defined filters for your convenience:</P
902 ><P
903 ></P
904 ><DIV
905 CLASS="VARIABLELIST"
906 ><DL
907 ><DT
908 ><SPAN
909 CLASS="emphasis"
910 ><I
911 CLASS="EMPHASIS"
912 >js-annoyances</I
913 ></SPAN
914 ></DT
915 ><DD
916 ><P
917 >    The purpose of this filter is to get rid of particularly annoying JavaScript abuse.
918     To that end, it
919    <P
920 ></P
921 ><UL
922 ><LI
923 ><P
924 >      replaces JavaScript references to the browser's referrer information
925       with the string "Not Your Business!". This compliments the <TT
926 CLASS="LITERAL"
927 ><A
928 HREF="actions-file.html#HIDE-REFERRER"
929 >hide-referrer</A
930 ></TT
931 > action on the content level.
932      </P
933 ></LI
934 ><LI
935 ><P
936 >      removes the bindings to the DOM's
937       <A
938 HREF="http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-eventgroupings-htmlevents"
939 TARGET="_top"
940 >unload
941       event</A
942 > which we feel has no right to exist and is responsible for most <SPAN
943 CLASS="QUOTE"
944 >"exit consoles"</SPAN
945 >, i.e.
946       nasty windows that pop up when you close another one.
947      </P
948 ></LI
949 ><LI
950 ><P
951 >      removes code that causes new windows to be opened with undesired properties, such as being
952       full-screen, non-resizeable, without location, status or menu bar etc.
953      </P
954 ></LI
955 ></UL
956 >
957    </P
958 ><P
959 >    Use with caution. This is an aggressive filter, and can break sites that 
960     rely heavily on JavaScript.
961    </P
962 ></DD
963 ><DT
964 ><SPAN
965 CLASS="emphasis"
966 ><I
967 CLASS="EMPHASIS"
968 >js-events</I
969 ></SPAN
970 ></DT
971 ><DD
972 ><P
973 >    This is a very radical measure. It removes virtually all JavaScript event bindings, which
974     means that scripts can not react to user actions such as mouse movements or clicks, window
975     resizing etc, anymore. Use with caution!
976    </P
977 ><P
978 >    We <SPAN
979 CLASS="emphasis"
980 ><I
981 CLASS="EMPHASIS"
982 >strongly discourage</I
983 ></SPAN
984 > using this filter as a default since it breaks
985     many legitimate scripts. It is meant for use only on extra-nasty sites (should you really
986     need to go there).
987    </P
988 ></DD
989 ><DT
990 ><SPAN
991 CLASS="emphasis"
992 ><I
993 CLASS="EMPHASIS"
994 >html-annoyances</I
995 ></SPAN
996 ></DT
997 ><DD
998 ><P
999 >    This filter will undo many common instances of HTML based abuse.
1000    </P
1001 ><P
1002 >    The <TT
1003 CLASS="LITERAL"
1004 >BLINK</TT
1005 > and <TT
1006 CLASS="LITERAL"
1007 >MARQUEE</TT
1008 > tags 
1009     are neutralized (yeah baby!), and browser windows will be created as
1010     resizeable (as of course they should be!), and will have location,
1011     scroll and menu bars -- even if specified otherwise.
1012    </P
1013 ></DD
1014 ><DT
1015 ><SPAN
1016 CLASS="emphasis"
1017 ><I
1018 CLASS="EMPHASIS"
1019 >content-cookies</I
1020 ></SPAN
1021 ></DT
1022 ><DD
1023 ><P
1024 >    Most cookies are set in the HTTP dialog, where they can be intercepted
1025     by the
1026     <TT
1027 CLASS="LITERAL"
1028 ><A
1029 HREF="actions-file.html#CRUNCH-INCOMING-COOKIES"
1030 >crunch-incoming-cookies</A
1031 ></TT
1032 >
1033     and <TT
1034 CLASS="LITERAL"
1035 ><A
1036 HREF="actions-file.html#CRUNCH-OUTGOING-COOKIES"
1037 >crunch-outgoing-cookies</A
1038 ></TT
1039 >
1040     actions. But web sites increasingly make use of HTML meta tags and JavaScript
1041     to sneak cookies to the browser on the content level.
1042    </P
1043 ><P
1044 >    This filter disables most HTML and JavaScript code that reads or sets
1045     cookies. It cannot detect all clever uses of these types of code, so it 
1046     should not be relied on as an absolute fix. Use it wherever you would also
1047     use the cookie crunch actions. 
1048    </P
1049 ></DD
1050 ><DT
1051 ><SPAN
1052 CLASS="emphasis"
1053 ><I
1054 CLASS="EMPHASIS"
1055 >refresh tags</I
1056 ></SPAN
1057 ></DT
1058 ><DD
1059 ><P
1060 >    Disable any refresh tags if the interval is greater than nine seconds (so 
1061     that redirections done via refresh tags are not destroyed). This is useful 
1062     for dial-on-demand setups, or for those who find this HTML feature
1063     annoying.
1064    </P
1065 ></DD
1066 ><DT
1067 ><SPAN
1068 CLASS="emphasis"
1069 ><I
1070 CLASS="EMPHASIS"
1071 >unsolicited-popups</I
1072 ></SPAN
1073 ></DT
1074 ><DD
1075 ><P
1076 >    This filter attempts to prevent only <SPAN
1077 CLASS="QUOTE"
1078 >"unsolicited"</SPAN
1079 > pop-up 
1080     windows from opening, yet still allow pop-up windows that the user 
1081     has explicitly chosen to open. It was added in version 3.0.1, 
1082     as an improvement over earlier such filters.
1083    </P
1084 ><P
1085 >    Technical note: The filter works by redefining the window.open JavaScript
1086     function to a dummy function, <TT
1087 CLASS="LITERAL"
1088 >PrivoxyWindowOpen()</TT
1089 >,
1090     during the loading and rendering phase of each HTML page access, and
1091     restoring the function afterward.
1092    </P
1093 ><P
1094 >    This is recommended only for browsers that cannot perform this function
1095     reliably themselves. And be aware that some sites require such windows 
1096     in order to function normally. Use with caution.
1097    </P
1098 ></DD
1099 ><DT
1100 ><SPAN
1101 CLASS="emphasis"
1102 ><I
1103 CLASS="EMPHASIS"
1104 >all-popups</I
1105 ></SPAN
1106 ></DT
1107 ><DD
1108 ><P
1109 >    Attempt to prevent <SPAN
1110 CLASS="emphasis"
1111 ><I
1112 CLASS="EMPHASIS"
1113 >all</I
1114 ></SPAN
1115 > pop-up windows from opening.
1116     Note this should be used with even more discretion than the above, since
1117     it is more likely to break some sites that require pop-ups for normal
1118     usage. Use with caution.
1119    </P
1120 ></DD
1121 ><DT
1122 ><SPAN
1123 CLASS="emphasis"
1124 ><I
1125 CLASS="EMPHASIS"
1126 >img-reorder</I
1127 ></SPAN
1128 ></DT
1129 ><DD
1130 ><P
1131 >    This is a helper filter that has no value if used alone. It makes the
1132     <TT
1133 CLASS="LITERAL"
1134 >banners-by-size</TT
1135 > and <TT
1136 CLASS="LITERAL"
1137 >banners-by-link</TT
1138 >
1139     (see below) filters more effective and should be enabled together with them.
1140    </P
1141 ></DD
1142 ><DT
1143 ><SPAN
1144 CLASS="emphasis"
1145 ><I
1146 CLASS="EMPHASIS"
1147 >banners-by-size</I
1148 ></SPAN
1149 ></DT
1150 ><DD
1151 ><P
1152 >    This filter removes image tags purely based on what size they are. Fortunately 
1153     for us, many ads and banner images tend to conform to certain standardized
1154     sizes, which makes this filter quite effective for ad stripping purposes.
1155    </P
1156 ><P
1157 >    Occasionally this filter will cause false positives on images that are not ads,
1158     but just happen to be of one of the standard banner sizes.
1159    </P
1160 ><P
1161 >    Recommended only for those who require extreme ad blocking. The default 
1162     block rules should catch 95+% of all ads <SPAN
1163 CLASS="emphasis"
1164 ><I
1165 CLASS="EMPHASIS"
1166 >without</I
1167 ></SPAN
1168 > this filter enabled.
1169    </P
1170 ></DD
1171 ><DT
1172 ><SPAN
1173 CLASS="emphasis"
1174 ><I
1175 CLASS="EMPHASIS"
1176 >banners-by-link</I
1177 ></SPAN
1178 ></DT
1179 ><DD
1180 ><P
1181 >    This is an experimental filter that attempts to kill any banners if 
1182     their URLs seem to point to known or suspected click trackers. It is currently
1183     not of much value and is not recommended for use by default.
1184    </P
1185 ></DD
1186 ><DT
1187 ><SPAN
1188 CLASS="emphasis"
1189 ><I
1190 CLASS="EMPHASIS"
1191 >webbugs</I
1192 ></SPAN
1193 ></DT
1194 ><DD
1195 ><P
1196 >    Webbugs are small, invisible images (technically 1X1 GIF images), that 
1197     are used to track users across websites, and collect information on them.
1198     As an HTML page is loaded by the browser, an embedded image tag causes the
1199     browser to contact a third-party site, disclosing the tracking information
1200     through the requested URL and/or cookies for that third-party domain, without
1201     the user ever becoming aware of the interaction with the third-party site.
1202     HTML-ized spam also uses a similar technique to verify email addresses.
1203    </P
1204 ><P
1205 >    This filter removes the HTML code that loads such <SPAN
1206 CLASS="QUOTE"
1207 >"webbugs"</SPAN
1208 >.
1209    </P
1210 ></DD
1211 ><DT
1212 ><SPAN
1213 CLASS="emphasis"
1214 ><I
1215 CLASS="EMPHASIS"
1216 >tiny-textforms</I
1217 ></SPAN
1218 ></DT
1219 ><DD
1220 ><P
1221 >    A rather special-purpose filter that can be used to enlarge textareas (those
1222     multi-line text boxes in web forms) and turn off hard word wrap in them. 
1223     It was written for the sourceforge.net tracker system where such boxes are
1224     a nuisance, but it can be handy on other sites, too.
1225    </P
1226 ><P
1227 >    It is not recommended to use this filter as a default.
1228    </P
1229 ></DD
1230 ><DT
1231 ><SPAN
1232 CLASS="emphasis"
1233 ><I
1234 CLASS="EMPHASIS"
1235 >jumping-windows</I
1236 ></SPAN
1237 ></DT
1238 ><DD
1239 ><P
1240 >    Many consider windows that move, or resize themselves to be abusive. This filter
1241     neutralizes the related JavaScript code. Note that some sites might not display
1242     or behave as intended when using this filter. Use with caution.
1243    </P
1244 ></DD
1245 ><DT
1246 ><SPAN
1247 CLASS="emphasis"
1248 ><I
1249 CLASS="EMPHASIS"
1250 >frameset-borders</I
1251 ></SPAN
1252 ></DT
1253 ><DD
1254 ><P
1255 >    Some web designers seem to assume that everyone in the world will view their
1256     web sites using the same browser brand and version, screen resolution etc,
1257     because only that assumption could explain why they'd use static frame sizes,
1258     yet prevent their frames from being resized by the user, should they be too
1259     small to show their whole content.
1260    </P
1261 ><P
1262 >    This filter removes the related HTML code. It should only be applied to sites
1263     which need it.
1264    </P
1265 ></DD
1266 ><DT
1267 ><SPAN
1268 CLASS="emphasis"
1269 ><I
1270 CLASS="EMPHASIS"
1271 >demoronizer</I
1272 ></SPAN
1273 ></DT
1274 ><DD
1275 ><P
1276 >    Many Microsoft products that generate HTML use non-standard extensions (read:
1277     violations) of the ISO 8859-1 aka Latin-1 character set. This can cause those
1278     HTML documents to display with errors on standard-compliant platforms. 
1279    </P
1280 ><P
1281 >    This filter translates the MS-only characters into Latin-1 equivalents. 
1282     It is not necessary when using MS products, and will cause corruption of  
1283     all documents that use 8-bit character sets other than Latin-1. It's mostly
1284     worthwhile for Europeans on non-MS platforms, if weird garbage characters
1285     sometimes appear on some pages, or user agents that don't correct for this on 
1286     the fly.
1287  
1288    </P
1289 ></DD
1290 ><DT
1291 ><SPAN
1292 CLASS="emphasis"
1293 ><I
1294 CLASS="EMPHASIS"
1295 >shockwave-flash</I
1296 ></SPAN
1297 ></DT
1298 ><DD
1299 ><P
1300 >    A filter for shockwave haters. As the name suggests, this filter strips code
1301     out of web pages that is used to embed shockwave flash objects. 
1302    </P
1303 ><P
1304 >   </P
1305 ></DD
1306 ><DT
1307 ><SPAN
1308 CLASS="emphasis"
1309 ><I
1310 CLASS="EMPHASIS"
1311 >quicktime-kioskmode</I
1312 ></SPAN
1313 ></DT
1314 ><DD
1315 ><P
1316 >    Change HTML code that embeds Quicktime objects so that kioskmode, which
1317     prevents saving, is disabled.
1318    </P
1319 ></DD
1320 ><DT
1321 ><SPAN
1322 CLASS="emphasis"
1323 ><I
1324 CLASS="EMPHASIS"
1325 >fun</I
1326 ></SPAN
1327 ></DT
1328 ><DD
1329 ><P
1330 >    Text replacements for subversive browsing fun. Make fun of your favorite
1331     Monopolist or play buzzword bingo.
1332    </P
1333 ></DD
1334 ><DT
1335 ><SPAN
1336 CLASS="emphasis"
1337 ><I
1338 CLASS="EMPHASIS"
1339 >crude-parental</I
1340 ></SPAN
1341 ></DT
1342 ><DD
1343 ><P
1344 >    A demonstration-only filter that shows how <SPAN
1345 CLASS="APPLICATION"
1346 >Privoxy</SPAN
1347 >
1348     can be used to delete web content on a keyword basis.
1349    </P
1350 ></DD
1351 ><DT
1352 ><SPAN
1353 CLASS="emphasis"
1354 ><I
1355 CLASS="EMPHASIS"
1356 >ie-exploits</I
1357 ></SPAN
1358 ></DT
1359 ><DD
1360 ><P
1361 >    An experimental collection of text replacements to disable malicious HTML and JavaScript
1362     code that exploits known security holes in Internet Explorer.
1363    </P
1364 ><P
1365 >    Presently, it only protects against Nimda and a cross-site scripting bug, and
1366     would need active maintenance to provide more substantial protection.
1367    </P
1368 ></DD
1369 ><DT
1370 ><SPAN
1371 CLASS="emphasis"
1372 ><I
1373 CLASS="EMPHASIS"
1374 >site-specifics</I
1375 ></SPAN
1376 ></DT
1377 ><DD
1378 ><P
1379 >    Some web sites have very specific problems, the cure for which doesn't apply
1380     anywhere else, or could even cause damage on other sites.
1381    </P
1382 ><P
1383 >    This is a collection of such site-specific cures which should only be applied
1384     to the sites they were intended for, which is what the supplied
1385     <TT
1386 CLASS="FILENAME"
1387 >default.action</TT
1388 > file does. Users shouldn't need to change
1389     anything regarding this filter.
1390    </P
1391 ></DD
1392 ><DT
1393 ><SPAN
1394 CLASS="emphasis"
1395 ><I
1396 CLASS="EMPHASIS"
1397 >google</I
1398 ></SPAN
1399 ></DT
1400 ><DD
1401 ><P
1402 >    A CSS based block for Google text ads. Also removes a width limitation
1403     and the toolbar advertisement.
1404    </P
1405 ></DD
1406 ><DT
1407 ><SPAN
1408 CLASS="emphasis"
1409 ><I
1410 CLASS="EMPHASIS"
1411 >yahoo</I
1412 ></SPAN
1413 ></DT
1414 ><DD
1415 ><P
1416 >    Another CSS based block, this time for Yahoo text ads. And removes 
1417     a width limitation as well.
1418    </P
1419 ></DD
1420 ><DT
1421 ><SPAN
1422 CLASS="emphasis"
1423 ><I
1424 CLASS="EMPHASIS"
1425 >msn</I
1426 ></SPAN
1427 ></DT
1428 ><DD
1429 ><P
1430 >    Another CSS based block, this time for MSN text ads. And removes 
1431     tracking URLs, as well as a width limitation.
1432    </P
1433 ></DD
1434 ><DT
1435 ><SPAN
1436 CLASS="emphasis"
1437 ><I
1438 CLASS="EMPHASIS"
1439 >blogspot</I
1440 ></SPAN
1441 ></DT
1442 ><DD
1443 ><P
1444 >    Cleans up some Blogspot blogs. Read the fine print before using this one!
1445    </P
1446 ><P
1447 >    This filter also intentionally removes some navigation stuff and sets the
1448     page width to 100%. As a result, some rounded <SPAN
1449 CLASS="QUOTE"
1450 >"corners"</SPAN
1451 > would
1452     appear to early or not at all and as fixing this would require a browser
1453     that understands background-size (CSS3), they are removed instead.
1454    </P
1455 ></DD
1456 ><DT
1457 ><SPAN
1458 CLASS="emphasis"
1459 ><I
1460 CLASS="EMPHASIS"
1461 >xml-to-html</I
1462 ></SPAN
1463 ></DT
1464 ><DD
1465 ><P
1466 >    Server-header filter to change the Content-Type from xml to html.
1467    </P
1468 ></DD
1469 ><DT
1470 ><SPAN
1471 CLASS="emphasis"
1472 ><I
1473 CLASS="EMPHASIS"
1474 >html-to-xml</I
1475 ></SPAN
1476 ></DT
1477 ><DD
1478 ><P
1479 >    Server-header filter to change the Content-Type from html to xml.
1480    </P
1481 ></DD
1482 ><DT
1483 ><SPAN
1484 CLASS="emphasis"
1485 ><I
1486 CLASS="EMPHASIS"
1487 >no-ping</I
1488 ></SPAN
1489 ></DT
1490 ><DD
1491 ><P
1492 >    Removes the non-standard <TT
1493 CLASS="LITERAL"
1494 >ping</TT
1495 > attribute from
1496     anchor and area HTML tags.
1497    </P
1498 ></DD
1499 ><DT
1500 ><SPAN
1501 CLASS="emphasis"
1502 ><I
1503 CLASS="EMPHASIS"
1504 >hide-tor-exit-notation</I
1505 ></SPAN
1506 ></DT
1507 ><DD
1508 ><P
1509 >    Client-header filter to remove the <B
1510 CLASS="COMMAND"
1511 >Tor</B
1512 > exit node notation
1513     found in Host and Referer headers.
1514    </P
1515 ><P
1516 >    If <SPAN
1517 CLASS="APPLICATION"
1518 >Privoxy</SPAN
1519 > and <B
1520 CLASS="COMMAND"
1521 >Tor</B
1522 > are chained and <SPAN
1523 CLASS="APPLICATION"
1524 >Privoxy</SPAN
1525 >
1526     is configured to use socks4a, one can use <SPAN
1527 CLASS="QUOTE"
1528 >"http://www.example.org.foobar.exit/"</SPAN
1529 >
1530     to access the host <SPAN
1531 CLASS="QUOTE"
1532 >"www.example.org"</SPAN
1533 > through the
1534     <B
1535 CLASS="COMMAND"
1536 >Tor</B
1537 > exit node <SPAN
1538 CLASS="QUOTE"
1539 >"foobar"</SPAN
1540 >.
1541    </P
1542 ><P
1543 >    As the HTTP client isn't aware of this notation, it treats the
1544     whole string <SPAN
1545 CLASS="QUOTE"
1546 >"www.example.org.foobar.exit"</SPAN
1547 > as host and uses it
1548     for the <SPAN
1549 CLASS="QUOTE"
1550 >"Host"</SPAN
1551 > and <SPAN
1552 CLASS="QUOTE"
1553 >"Referer"</SPAN
1554 > headers. From the
1555     server's point of view the resulting headers are invalid and can cause problems.
1556    </P
1557 ><P
1558 >    An invalid <SPAN
1559 CLASS="QUOTE"
1560 >"Referer"</SPAN
1561 > header can trigger <SPAN
1562 CLASS="QUOTE"
1563 >"hot-linking"</SPAN
1564 >
1565     protections, an invalid <SPAN
1566 CLASS="QUOTE"
1567 >"Host"</SPAN
1568 > header will make it impossible for
1569     the server to find the right vhost (several domains hosted on the same IP address).
1570    </P
1571 ><P
1572 >    This client-header filter removes the <SPAN
1573 CLASS="QUOTE"
1574 >"foo.exit"</SPAN
1575 > part in those headers
1576     to prevent the mentioned problems. Note that it only modifies
1577     the HTTP headers, it doesn't make it impossible for the server
1578     to detect your <B
1579 CLASS="COMMAND"
1580 >Tor</B
1581 > exit node based on the IP address
1582     the request is coming from.
1583    </P
1584 ></DD
1585 ></DL
1586 ></DIV
1587 ></DIV
1588 ></DIV
1589 ><DIV
1590 CLASS="NAVFOOTER"
1591 ><HR
1592 ALIGN="LEFT"
1593 WIDTH="100%"><TABLE
1594 SUMMARY="Footer navigation table"
1595 WIDTH="100%"
1596 BORDER="0"
1597 CELLPADDING="0"
1598 CELLSPACING="0"
1599 ><TR
1600 ><TD
1601 WIDTH="33%"
1602 ALIGN="left"
1603 VALIGN="top"
1604 ><A
1605 HREF="actions-file.html"
1606 ACCESSKEY="P"
1607 >Prev</A
1608 ></TD
1609 ><TD
1610 WIDTH="34%"
1611 ALIGN="center"
1612 VALIGN="top"
1613 ><A
1614 HREF="index.html"
1615 ACCESSKEY="H"
1616 >Home</A
1617 ></TD
1618 ><TD
1619 WIDTH="33%"
1620 ALIGN="right"
1621 VALIGN="top"
1622 ><A
1623 HREF="templates.html"
1624 ACCESSKEY="N"
1625 >Next</A
1626 ></TD
1627 ></TR
1628 ><TR
1629 ><TD
1630 WIDTH="33%"
1631 ALIGN="left"
1632 VALIGN="top"
1633 >Actions Files</TD
1634 ><TD
1635 WIDTH="34%"
1636 ALIGN="center"
1637 VALIGN="top"
1638 >&nbsp;</TD
1639 ><TD
1640 WIDTH="33%"
1641 ALIGN="right"
1642 VALIGN="top"
1643 >Privoxy's Template Files</TD
1644 ></TR
1645 ></TABLE
1646 ></DIV
1647 ></BODY
1648 ></HTML
1649 >