Skip to content

Instantly share code, notes, and snippets.

@hoehrmann
Created May 29, 2013 22:10
Show Gist options
  • Save hoehrmann/5674243 to your computer and use it in GitHub Desktop.
Save hoehrmann/5674243 to your computer and use it in GitHub Desktop.
This parses CSS style sheets into an abstract syntax tree, serializes the tree as XML document trying to maintain information such as line and column position of individual style sheet parts, in order to exploit existing XML validation utilities, like RELAX NG schemas, to validate style sheets. Originally http://lists.w3.org/Archives/Public/www-…
default namespace = "http://xmlns.bjoern.hoehrmann.de/css2xml/0.1/"
start = stylesheet
stylesheet = element stylesheet {
ruleset*
}
#######################################################################
# Basic data types, http://www.w3.org/TR/CSS21/syndata.html#values
#######################################################################
# Notes:
#
# Commas, slashes and such are stored in @the_operator
# and @unary_op; these are a bit more difficult to handle
# here so we ignore them for now;
#
#
# Libcroco can't currently distinguish between 1.0 and 1;
#
integer.type = number.type
#
#
#
number.type =
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "1" }, # TERM_NUMBER
element number {
number.common-attrs,
attribute type { "1" }, # NUM_GENERIC
xsd:double
}
}
# zero; this disallowes 0.0 which would be a legal
# length, should use a regex pattern
length.type |=
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "1" }, # TERM_NUMBER
element number {
number.common-attrs,
attribute type { "1" }, # NUM_GENERIC
"0"
}
}
# a generic length
length.type |=
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "1" }, # TERM_NUMBER
element number {
number.common-attrs,
length.types,
xsd:double # this probably allows NaN; it should not
}
}
# see http://www.freespiders.org/projects/libcroco/docs/apidoc/0.5/cr-num_8h.html#a29
# also http://www.freespiders.org/projects/libcroco/docs/apidoc/0.5/cr-term_8h.html#a35
# em
length.types |=
attribute type { "2" }
# ex
length.types |=
attribute type { "3" }
# px
length.types |=
attribute type { "4" }
# in
length.types |=
attribute type { "5" }
# cm
length.types |=
attribute type { "6" }
# mm
length.types |=
attribute type { "7" }
# pt
length.types |=
attribute type { "8" }
# pc
length.types |=
attribute type { "9" }
percentage.type =
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "1" }, # TERM_NUMBER
element number {
number.common-attrs,
attribute type { "17" }, # NUM_PERCENTAGE
xsd:double # this probably allows NaN; it should not
}
}
string.type =
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "3" }, # TERM_STRING
element string {
string.common-attrs,
text
}
}
identifier.type =
element term {
term.common-attrs,
attribute unary_op { "0" }, #
attribute the_operator { "0" }, #
attribute type { "4" }, # TERM_IDENT
element string {
string.common-attrs,
text # not quite, should be regex .+
}
}
#######################################################################
ruleset = element ruleset { selectors, property* }
selectors = element selectors { selector+ }
selector = element selector { location-attrs, simple+ }
simple =
element simple {
location-attrs,
attribute combinator { xsd:int },
attribute type_mask { xsd:int },
empty
}
property = properties
location-attrs =
attribute byte_offset { xsd:int }?,
attribute line { xsd:int }?,
attribute column { xsd:int }?
property.common-attrs =
location-attrs,
attribute important { xsd:boolean }?
term.common-attrs =
location-attrs,
attribute string { text }?
number.common-attrs =
location-attrs
string.common-attrs =
location-attrs
properties |=
element property {
property.common-attrs,
attribute name { "margin" },
element terms {
length.type,length.type?,length.type?,length.type?
}
}
#include <stdlib.h>
#include <libcroco.h>
#include <libxml/tree.h>
#include <libxml/xmlsave.h>
#include <assert.h>
#define C2XNS "http://xmlns.bjoern.hoehrmann.de/css2xml/0.1/"
typedef struct
{
xmlDocPtr document; /* XML document */
xmlNodePtr current; /* current node */
xmlNsPtr ns;
} C2XConv;
/**/
C2XConv* c2xconv_new()
{
C2XConv* c2x = (C2XConv*)malloc(sizeof(C2XConv));
if (!c2x)
{
}
c2x->document = NULL;
c2x->current = NULL;
c2x->ns = NULL;
return c2x;
}
void c2xconv_xml_node_add_prop_num(xmlNodePtr node, xmlChar* name, glong value)
{
/* this is insane... */
GString* v1 = g_string_new_len(NULL, 0);
gchar* v2;
g_string_printf(v1, "%ld", value);
v2 = g_string_free(v1, FALSE);
xmlSetProp(node, name, v2);
g_free(v2);
}
void c2xconv_xml_node_add_prop_crstring(xmlNodePtr node, xmlChar* name, CRString* value)
{
gchar* v2;
if (!value)
return;
v2 = cr_string_dup2(value);
xmlSetProp(node, name, v2);
g_free(v2);
}
void c2xconv_xml_node_add_text_child_num(xmlNodePtr node, gdouble value)
{
/* this is insane... */
GString* v1 = g_string_new_len(NULL, 0);
gchar* v2;
if ((gdouble)(value - (glong)value))
{
g_string_printf(v1, "%.3f", value);
}
else
{
g_string_printf(v1, "%ld", (glong)value);
}
v2 = g_string_free(v1, FALSE);
xmlAddChild(node, xmlNewText(v2));
g_free(v2);
}
void c2xconv_add_location_to_node(C2XConv* c2x, xmlNodePtr node, CRParsingLocation* loc)
{
if (!loc)
return;
c2xconv_xml_node_add_prop_num(node, "byte_offset", loc->byte_offset);
c2xconv_xml_node_add_prop_num(node, "line", loc->line);
c2xconv_xml_node_add_prop_num(node, "column", loc->column);
}
void c2xconv_additional_selector_to_node(C2XConv* c2x, xmlNodePtr node, CRAdditionalSel* add)
{
CRAdditionalSel* cur;
for (cur = add; cur; cur = cur->next)
{
xmlNodePtr with = xmlNewNode(c2x->ns, "with");
xmlChar* name = NULL;
gchar* content = NULL;
xmlNodePtr inner = NULL;
c2xconv_xml_node_add_prop_num(with, "type", cur->type);
switch (cur->type)
{
case CLASS_ADD_SELECTOR:
name = "class";
content = g_strndup(cur->content.class_name->stryng->str,
cur->content.class_name->stryng->len);
break;
case ID_ADD_SELECTOR:
name = "id";
content = g_strndup(cur->content.class_name->stryng->str,
cur->content.class_name->stryng->len);
break;
case PSEUDO_CLASS_ADD_SELECTOR:
name = "pseudo";
break;
case ATTRIBUTE_ADD_SELECTOR:
name = "attribute";
break;
default:
break;
}
if (!name)
continue;
inner = xmlNewNode(c2x->ns, name);
xmlAddChild(with, inner);
if (cur->type == PSEUDO_CLASS_ADD_SELECTOR)
{
c2xconv_xml_node_add_prop_crstring(inner, "extra", cur->content.pseudo->extra);
c2xconv_xml_node_add_prop_crstring(inner, "name", cur->content.pseudo->name);
c2xconv_xml_node_add_prop_num(inner, "type", cur->content.pseudo->type);
c2xconv_add_location_to_node(c2x, inner, &cur->content.pseudo->location);
}
else if (cur->type == ATTRIBUTE_ADD_SELECTOR)
{
// cur->content.attr_sel->
}
else if (content)
{
xmlAddChild(inner, xmlNewText(content));
g_free(content);
content = NULL;
}
else
{
}
xmlAddChild(node, with);
}
}
void c2xconv_simple_selectors_to_node(C2XConv* c2x, xmlNodePtr node, CRSimpleSel* simple)
{
CRSimpleSel* cur = NULL;
for (cur = simple; cur; cur = cur->next)
{
xmlNodePtr snode = xmlNewNode(c2x->ns, "simple");
xmlAddChild(node, snode);
c2xconv_add_location_to_node(c2x, snode, &cur->location);
c2xconv_xml_node_add_prop_num(snode, "combinator", cur->combinator);
c2xconv_xml_node_add_prop_num(snode, "type_mask", cur->type_mask);
if (cur->add_sel)
{
c2xconv_additional_selector_to_node(c2x, snode, cur->add_sel);
}
/* ... */
}
}
void c2xconv_crterm_to_node(C2XConv* c2x, xmlNodePtr node, CRTerm* term)
{
CRTerm* cur = NULL;
xmlNodePtr nterml = xmlNewNode(c2x->ns, "terms");
for (cur = term; cur; cur = cur->next)
{
guchar* term_string;
xmlNodePtr nterm = xmlNewNode(c2x->ns, "term");
xmlAddChild(nterml, nterm);
c2xconv_add_location_to_node(c2x, nterm, &cur->location);
c2xconv_xml_node_add_prop_num(nterm, "unary_op", cur->unary_op);
c2xconv_xml_node_add_prop_num(nterm, "the_operator", cur->the_operator);
c2xconv_xml_node_add_prop_num(nterm, "type", cur->type);
term_string = cr_term_one_to_string(cur);
if (term_string)
{
xmlSetProp(nterm, "string", term_string);
g_free(term_string);
term_string = NULL;
}
if (cur->type == TERM_RGB)
{
xmlNodePtr fnode = xmlNewNode(c2x->ns, "function");
xmlSetProp(fnode, "name", "rgb");
xmlAddChild(nterm, fnode);
}
else if (cur->type == TERM_URI)
{
xmlNodePtr fnode = xmlNewNode(c2x->ns, "function");
xmlSetProp(fnode, "name", "url");
xmlAddChild(nterm, fnode);
}
else if (cur->type == TERM_FUNCTION)
{
xmlNodePtr fnode = xmlNewNode(c2x->ns, "function");
xmlChar* name = NULL;
if (term->content.str)
{
name = g_strndup(term->content.str->stryng->str,
term->content.str->stryng->len);
}
xmlSetProp(fnode, "name", name);
g_free(name);
c2xconv_crterm_to_node(c2x, fnode, term->ext_content.func_param);
xmlAddChild(nterm, fnode);
}
else if (cur->type == TERM_NUMBER)
{
xmlNodePtr nnum = xmlNewNode(c2x->ns, "number");
CRNum* num = cur->content.num;
if (num)
{
c2xconv_add_location_to_node(c2x, nnum, &num->location);
c2xconv_xml_node_add_prop_num(nnum, "type", num->type);
c2xconv_xml_node_add_text_child_num(nnum, num->val);
}
xmlAddChild(nterm, nnum);
}
else if (cur->type == TERM_IDENT ||
cur->type == TERM_HASH ||
cur->type == TERM_STRING)
{
xmlNodePtr nv;
xmlChar* text = NULL;
xmlChar* name = NULL;
if (cur->type == TERM_IDENT) name = "ident";
if (cur->type == TERM_HASH) name = "hash";
if (cur->type == TERM_STRING) name = "string";
nv = xmlNewNode(c2x->ns, name);
if (cur->content.str)
{
text = g_strndup(cur->content.str->stryng->str,
cur->content.str->stryng->len);
}
xmlAddChild(nv, xmlNewText(text));
g_free(text);
xmlAddChild(nterm, nv);
}
else
{
/* unsupported type ... */
}
}
xmlAddChild(node, nterml);
}
static void unrecoverable_error(CRDocHandler* a_this)
{
printf("fatal error\n");
}
static void error(CRDocHandler* a_this)
{
printf("error\n");
}
static void property(CRDocHandler* a_this,
CRString * a_name,
CRTerm * a_expression,
gboolean a_important)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
xmlNodePtr prop = xmlNewNode(c2x->ns, "property");
c2xconv_xml_node_add_prop_crstring(prop, "name", a_name);
xmlSetProp(prop, "important", a_important ? "true" : "false");
c2xconv_add_location_to_node(c2x, prop, &a_name->location);
c2xconv_crterm_to_node(c2x, prop, a_expression);
xmlAddChild(c2x->current, prop);
}
static void end_selector(CRDocHandler* a_this,
CRSelector * a_selector_list)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
c2x->current = c2x->current->parent;
}
static void start_selector(CRDocHandler* a_this,
CRSelector * a_selector_list)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
xmlNodePtr ruleset;
xmlNodePtr selectors;
CRSelector* cur_selector = NULL;
ruleset = xmlNewNode(c2x->ns, "ruleset");
selectors = xmlNewNode(c2x->ns, "selectors");
xmlAddChild(ruleset, selectors);
xmlAddChild(c2x->current, ruleset);
c2x->current = ruleset;
for (cur_selector = a_selector_list; cur_selector; cur_selector = cur_selector->next)
{
xmlNodePtr selector = xmlNewNode(c2x->ns, "selector");
xmlNodePtr simple = xmlNewNode(c2x->ns, "simple");
c2xconv_add_location_to_node(c2x, selector, &cur_selector->location);
c2xconv_simple_selectors_to_node(c2x, selector, cur_selector->simple_sel);
xmlAddChild(selectors, selector);
}
}
static void start_font_face(CRDocHandler* a_this,
CRParsingLocation *a_location)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void end_font_face(CRDocHandler* a_this)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void end_document(CRDocHandler* a_this)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
c2x->current = NULL;
}
static void start_document(CRDocHandler* a_this)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
xmlNodePtr stylesheet;
c2x->document = xmlNewDoc("1.0");
stylesheet = xmlNewNode(c2x->ns, "stylesheet");
xmlDocSetRootElement(c2x->document, stylesheet);
c2x->ns = xmlNewNs(stylesheet, C2XNS, "c2x");
xmlSetNs(stylesheet, c2x->ns);
c2x->current = stylesheet;
}
static void charset(CRDocHandler* a_this,
CRString * a_charset,
CRParsingLocation *a_location)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void start_page(CRDocHandler* a_this,
CRString * a_page,
CRString * a_pseudo_page,
CRParsingLocation *a_location)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void end_page(CRDocHandler* a_this,
CRString * a_page,
CRString * a_pseudo_page)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void start_media(CRDocHandler* a_this,
GList * a_media_list,
CRParsingLocation *a_location)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void end_media(CRDocHandler* a_this,
GList * a_media_list)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void import_style(CRDocHandler* a_this,
GList * a_media_list,
CRString * a_uri,
CRString * a_uri_default_ns,
CRParsingLocation *a_location)
{
C2XConv* c2x = (C2XConv*)a_this->app_data;
}
static void c2x_print_error_handler(const gchar *string)
{
fprintf(stderr, "%s", string);
}
int main(void)
{
enum CRStatus status = CR_OK;
CRDocHandler*sac_handler = NULL;
CRParser *parser = NULL;
C2XConv* c2x = NULL;
g_set_printerr_handler(c2x_print_error_handler);
c2x = c2xconv_new();
sac_handler = cr_doc_handler_new();
if(!sac_handler)
{
}
parser = cr_parser_new_from_file("test.css", CR_UTF_8);
if(!parser)
{
}
/* ... */
sac_handler->start_document = start_document;
sac_handler->end_document = end_document;
sac_handler->start_selector = start_selector;
sac_handler->end_selector = end_selector;
sac_handler->property = property;
sac_handler->start_font_face = start_font_face;
sac_handler->end_font_face = end_font_face;
sac_handler->error = error;
sac_handler->unrecoverable_error = unrecoverable_error;
sac_handler->charset = charset;
sac_handler->start_page = start_page;
sac_handler->end_page = end_page;
sac_handler->start_media = start_media;
sac_handler->end_media = end_media;
sac_handler->import_style = import_style;
/* ... */
sac_handler->resolve_import = 0;
sac_handler->comment = NULL;
sac_handler->ignorable_at_rule = NULL;
sac_handler->import_style = NULL;
sac_handler->import_style_result = NULL;
sac_handler->namespace_declaration = NULL;
sac_handler->app_data = (void*)c2x;
cr_parser_set_sac_handler(parser, sac_handler);
cr_parser_parse(parser);
xmlIndentTreeOutput = 1;
xmlSaveFormatFile("-", c2x->document, 1);
xmlFreeDoc(c2x->document);
return EXIT_SUCCESS;
}
<?xml version="1.0"?>
<c2x:stylesheet xmlns:c2x="http://xmlns.bjoern.hoehrmann.de/css2xml/0.1/">
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="283" line="11" column="1">
<c2x:simple byte_offset="283" line="11" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="padding" important="false" byte_offset="292" line="12" column="3">
<c2x:terms>
<c2x:term byte_offset="301" line="12" column="12" unary_op="0" the_operator="0" type="1" string="2em">
<c2x:number byte_offset="301" line="12" column="12" type="2">2</c2x:number>
</c2x:term>
<c2x:term byte_offset="305" line="12" column="16" unary_op="0" the_operator="0" type="1" string=" 1em">
<c2x:number byte_offset="305" line="12" column="16" type="2">1</c2x:number>
</c2x:term>
<c2x:term byte_offset="309" line="12" column="20" unary_op="0" the_operator="0" type="1" string=" 2em">
<c2x:number byte_offset="309" line="12" column="20" type="2">2</c2x:number>
</c2x:term>
<c2x:term byte_offset="313" line="12" column="24" unary_op="0" the_operator="0" type="1" string=" 70px">
<c2x:number byte_offset="313" line="12" column="24" type="4">70</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="margin" important="false" byte_offset="321" line="13" column="3">
<c2x:terms>
<c2x:term byte_offset="329" line="13" column="11" unary_op="0" the_operator="0" type="1" string="0">
<c2x:number byte_offset="329" line="13" column="11" type="1">0</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="font-family" important="false" byte_offset="334" line="14" column="3">
<c2x:terms>
<c2x:term byte_offset="347" line="14" column="16" unary_op="0" the_operator="0" type="4" string="sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="color" important="false" byte_offset="361" line="15" column="3">
<c2x:terms>
<c2x:term byte_offset="368" line="15" column="10" unary_op="0" the_operator="0" type="4" string="black">
<c2x:ident>black</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background" important="false" byte_offset="377" line="16" column="3">
<c2x:terms>
<c2x:term byte_offset="389" line="16" column="15" unary_op="0" the_operator="0" type="4" string="white">
<c2x:ident>white</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background-position" important="false" byte_offset="398" line="17" column="3">
<c2x:terms>
<c2x:term byte_offset="419" line="17" column="24" unary_op="0" the_operator="0" type="4" string="top">
<c2x:ident>top</c2x:ident>
</c2x:term>
<c2x:term byte_offset="423" line="17" column="28" unary_op="0" the_operator="0" type="4" string=" left">
<c2x:ident>left</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background-attachment" important="false" byte_offset="431" line="18" column="3">
<c2x:terms>
<c2x:term byte_offset="454" line="18" column="26" unary_op="0" the_operator="0" type="4" string="fixed">
<c2x:ident>fixed</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background-repeat" important="false" byte_offset="463" line="19" column="3">
<c2x:terms>
<c2x:term byte_offset="482" line="19" column="22" unary_op="0" the_operator="0" type="4" string="no-repeat">
<c2x:ident>no-repeat</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="495" line="21" column="1">
<c2x:simple byte_offset="495" line="21" column="1" combinator="0" type_mask="0">
<c2x:with type="2">
<c2x:pseudo name="link" type="0" byte_offset="496" line="21" column="2"/>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="503" line="21" column="9">
<c2x:terms>
<c2x:term byte_offset="510" line="21" column="16" unary_op="0" the_operator="0" type="8" string="#00C">
<c2x:hash>00C</c2x:hash>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background" important="false" byte_offset="516" line="21" column="22">
<c2x:terms>
<c2x:term byte_offset="528" line="21" column="34" unary_op="0" the_operator="0" type="4" string="transparent">
<c2x:ident>transparent</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="542" line="22" column="1">
<c2x:simple byte_offset="542" line="22" column="1" combinator="0" type_mask="0">
<c2x:with type="2">
<c2x:pseudo name="visited" type="0" byte_offset="543" line="22" column="2"/>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="553" line="22" column="12">
<c2x:terms>
<c2x:term byte_offset="560" line="22" column="19" unary_op="0" the_operator="0" type="8" string="#609">
<c2x:hash>609</c2x:hash>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background" important="false" byte_offset="566" line="22" column="25">
<c2x:terms>
<c2x:term byte_offset="578" line="22" column="37" unary_op="0" the_operator="0" type="4" string="transparent">
<c2x:ident>transparent</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="592" line="23" column="1">
<c2x:simple byte_offset="592" line="23" column="1" combinator="0" type_mask="2">
<c2x:with type="2">
<c2x:pseudo name="active" type="0" byte_offset="594" line="23" column="3"/>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="603" line="23" column="12">
<c2x:terms>
<c2x:term byte_offset="610" line="23" column="19" unary_op="0" the_operator="0" type="8" string="#C00">
<c2x:hash>C00</c2x:hash>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background" important="false" byte_offset="616" line="23" column="25">
<c2x:terms>
<c2x:term byte_offset="628" line="23" column="37" unary_op="0" the_operator="0" type="4" string="transparent">
<c2x:ident>transparent</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="643" line="25" column="1">
<c2x:simple byte_offset="643" line="25" column="1" combinator="0" type_mask="2">
<c2x:with type="2">
<c2x:pseudo name="link" type="0" byte_offset="645" line="25" column="3"/>
</c2x:with>
</c2x:simple>
<c2x:simple byte_offset="650" line="25" column="8" combinator="1" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="655" line="25" column="13" combinator="0" type_mask="2">
<c2x:with type="2">
<c2x:pseudo name="visited" type="0" byte_offset="657" line="25" column="15"/>
</c2x:with>
</c2x:simple>
<c2x:simple byte_offset="665" line="25" column="23" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="border-style" important="false" byte_offset="671" line="25" column="29">
<c2x:terms>
<c2x:term byte_offset="685" line="25" column="43" unary_op="0" the_operator="0" type="4" string="none">
<c2x:ident>none</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="722" line="27" column="1">
<c2x:simple byte_offset="722" line="27" column="1" combinator="0" type_mask="2"/>
<c2x:simple byte_offset="724" line="27" column="3" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="730" line="27" column="9">
<c2x:terms>
<c2x:term byte_offset="737" line="27" column="16" unary_op="0" the_operator="0" type="4" string="white">
<c2x:ident>white</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="872" line="29" column="3">
<c2x:simple byte_offset="872" line="29" column="3" combinator="0" type_mask="2"/>
<c2x:simple byte_offset="874" line="29" column="5" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="880" line="29" column="11">
<c2x:terms>
<c2x:term byte_offset="887" line="29" column="18" unary_op="0" the_operator="0" type="4" string="inherit">
<c2x:ident>inherit</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="938" line="32" column="1">
<c2x:simple byte_offset="938" line="32" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="942" line="32" column="5" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font-family" important="false" byte_offset="960" line="33" column="3">
<c2x:terms>
<c2x:term byte_offset="973" line="33" column="16" unary_op="0" the_operator="0" type="4" string="sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="988" line="36" column="1">
<c2x:simple byte_offset="988" line="36" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="992" line="36" column="5" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="996" line="36" column="9" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1000" line="36" column="13" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1004" line="36" column="17" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1008" line="36" column="21" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="text-align" important="false" byte_offset="1013" line="36" column="26">
<c2x:terms>
<c2x:term byte_offset="1025" line="36" column="38" unary_op="0" the_operator="0" type="4" string="left">
<c2x:ident>left</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1092" line="38" column="1">
<c2x:simple byte_offset="1092" line="38" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1096" line="38" column="5" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1100" line="38" column="9" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="color" important="false" byte_offset="1105" line="38" column="14">
<c2x:terms>
<c2x:term byte_offset="1112" line="38" column="21" unary_op="0" the_operator="0" type="8" string="#005A9C">
<c2x:hash>005A9C</c2x:hash>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="background" important="false" byte_offset="1121" line="38" column="30">
<c2x:terms>
<c2x:term byte_offset="1133" line="38" column="42" unary_op="0" the_operator="0" type="4" string="white">
<c2x:ident>white</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1141" line="39" column="1">
<c2x:simple byte_offset="1141" line="39" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1146" line="39" column="6">
<c2x:terms>
<c2x:term byte_offset="1152" line="39" column="12" unary_op="0" the_operator="0" type="1" string="170%">
<c2x:number byte_offset="1152" line="39" column="12" type="17">170</c2x:number>
</c2x:term>
<c2x:term byte_offset="1157" line="39" column="17" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1170" line="40" column="1">
<c2x:simple byte_offset="1170" line="40" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1175" line="40" column="6">
<c2x:terms>
<c2x:term byte_offset="1181" line="40" column="12" unary_op="0" the_operator="0" type="1" string="140%">
<c2x:number byte_offset="1181" line="40" column="12" type="17">140</c2x:number>
</c2x:term>
<c2x:term byte_offset="1186" line="40" column="17" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1199" line="41" column="1">
<c2x:simple byte_offset="1199" line="41" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1204" line="41" column="6">
<c2x:terms>
<c2x:term byte_offset="1210" line="41" column="12" unary_op="0" the_operator="0" type="1" string="120%">
<c2x:number byte_offset="1210" line="41" column="12" type="17">120</c2x:number>
</c2x:term>
<c2x:term byte_offset="1215" line="41" column="17" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1228" line="42" column="1">
<c2x:simple byte_offset="1228" line="42" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1233" line="42" column="6">
<c2x:terms>
<c2x:term byte_offset="1239" line="42" column="12" unary_op="0" the_operator="0" type="4" string="bold">
<c2x:ident>bold</c2x:ident>
</c2x:term>
<c2x:term byte_offset="1244" line="42" column="17" unary_op="0" the_operator="0" type="1" string=" 100%">
<c2x:number byte_offset="1244" line="42" column="17" type="17">100</c2x:number>
</c2x:term>
<c2x:term byte_offset="1249" line="42" column="22" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1262" line="43" column="1">
<c2x:simple byte_offset="1262" line="43" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1267" line="43" column="6">
<c2x:terms>
<c2x:term byte_offset="1273" line="43" column="12" unary_op="0" the_operator="0" type="4" string="italic">
<c2x:ident>italic</c2x:ident>
</c2x:term>
<c2x:term byte_offset="1280" line="43" column="19" unary_op="0" the_operator="0" type="1" string=" 100%">
<c2x:number byte_offset="1280" line="43" column="19" type="17">100</c2x:number>
</c2x:term>
<c2x:term byte_offset="1285" line="43" column="24" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1298" line="44" column="1">
<c2x:simple byte_offset="1298" line="44" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font" important="false" byte_offset="1303" line="44" column="6">
<c2x:terms>
<c2x:term byte_offset="1309" line="44" column="12" unary_op="0" the_operator="0" type="4" string="small-caps">
<c2x:ident>small-caps</c2x:ident>
</c2x:term>
<c2x:term byte_offset="1320" line="44" column="23" unary_op="0" the_operator="0" type="1" string=" 100%">
<c2x:number byte_offset="1320" line="44" column="23" type="17">100</c2x:number>
</c2x:term>
<c2x:term byte_offset="1325" line="44" column="28" unary_op="0" the_operator="0" type="4" string=" sans-serif">
<c2x:ident>sans-serif</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1339" line="46" column="1">
<c2x:simple byte_offset="1339" line="46" column="1" combinator="0" type_mask="0">
<c2x:with type="1">
<c2x:class>hide</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="display" important="false" byte_offset="1347" line="46" column="9">
<c2x:terms>
<c2x:term byte_offset="1356" line="46" column="18" unary_op="0" the_operator="0" type="4" string="none">
<c2x:ident>none</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1364" line="48" column="1">
<c2x:simple byte_offset="1364" line="48" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>head</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="margin-bottom" important="false" byte_offset="1375" line="48" column="12">
<c2x:terms>
<c2x:term byte_offset="1390" line="48" column="27" unary_op="0" the_operator="0" type="1" string="1em">
<c2x:number byte_offset="1390" line="48" column="27" type="2">1</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1396" line="49" column="1">
<c2x:simple byte_offset="1396" line="49" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>head</c2x:class>
</c2x:with>
</c2x:simple>
<c2x:simple byte_offset="1405" line="49" column="10" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="margin-top" important="false" byte_offset="1410" line="49" column="15">
<c2x:terms>
<c2x:term byte_offset="1422" line="49" column="27" unary_op="0" the_operator="0" type="1" string="2em">
<c2x:number byte_offset="1422" line="49" column="27" type="2">2</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="clear" important="false" byte_offset="1427" line="49" column="32">
<c2x:terms>
<c2x:term byte_offset="1434" line="49" column="39" unary_op="0" the_operator="0" type="4" string="both">
<c2x:ident>both</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1441" line="50" column="1">
<c2x:simple byte_offset="1441" line="50" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>head</c2x:class>
</c2x:with>
</c2x:simple>
<c2x:simple byte_offset="1450" line="50" column="10" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="margin-left" important="false" byte_offset="1458" line="50" column="18">
<c2x:terms>
<c2x:term byte_offset="1471" line="50" column="31" unary_op="0" the_operator="0" type="1" string="2em">
<c2x:number byte_offset="1471" line="50" column="31" type="2">2</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="margin-top" important="false" byte_offset="1476" line="50" column="36">
<c2x:terms>
<c2x:term byte_offset="1488" line="50" column="48" unary_op="0" the_operator="0" type="1" string="2em">
<c2x:number byte_offset="1488" line="50" column="48" type="2">2</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1495" line="52" column="1">
<c2x:simple byte_offset="1495" line="52" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>copyright</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font-size" important="false" byte_offset="1509" line="52" column="15">
<c2x:terms>
<c2x:term byte_offset="1520" line="52" column="26" unary_op="0" the_operator="0" type="4" string="small">
<c2x:ident>small</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1528" line="53" column="1">
<c2x:simple byte_offset="1528" line="53" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>copyright</c2x:class>
</c2x:with>
</c2x:simple>
<c2x:simple byte_offset="1540" line="53" column="13" combinator="1" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font-size" important="false" byte_offset="1548" line="53" column="21">
<c2x:terms>
<c2x:term byte_offset="1559" line="53" column="32" unary_op="0" the_operator="0" type="4" string="small">
<c2x:ident>small</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1605" line="56" column="1">
<c2x:simple byte_offset="1605" line="56" column="1" combinator="0" type_mask="2">
<c2x:with type="16">
<c2x:attribute/>
</c2x:with>
<c2x:with type="2">
<c2x:pseudo name="hover" type="0" byte_offset="1613" line="56" column="9"/>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="background" important="false" byte_offset="1621" line="56" column="17">
<c2x:terms>
<c2x:term byte_offset="1633" line="56" column="29" unary_op="0" the_operator="0" type="8" string="#ffa">
<c2x:hash>ffa</c2x:hash>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1643" line="59" column="1">
<c2x:simple byte_offset="1643" line="59" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="margin-left" important="false" byte_offset="1649" line="59" column="7">
<c2x:terms>
<c2x:term byte_offset="1662" line="59" column="20" unary_op="0" the_operator="0" type="1" string="2em">
<c2x:number byte_offset="1662" line="59" column="20" type="2">2</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1725" line="66" column="1">
<c2x:simple byte_offset="1725" line="66" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1729" line="66" column="5" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="margin-top" important="false" byte_offset="1734" line="66" column="10">
<c2x:terms>
<c2x:term byte_offset="1746" line="66" column="22" unary_op="0" the_operator="0" type="1" string="0">
<c2x:number byte_offset="1746" line="66" column="22" type="1">0</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="margin-bottom" important="false" byte_offset="1749" line="66" column="25">
<c2x:terms>
<c2x:term byte_offset="1764" line="66" column="40" unary_op="0" the_operator="0" type="1" string="0">
<c2x:number byte_offset="1764" line="66" column="40" type="1">0</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1785" line="67" column="1">
<c2x:simple byte_offset="1785" line="67" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font-weight" important="false" byte_offset="1790" line="67" column="6">
<c2x:terms>
<c2x:term byte_offset="1803" line="67" column="19" unary_op="0" the_operator="0" type="4" string="bold">
<c2x:ident>bold</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1811" line="69" column="1">
<c2x:simple byte_offset="1811" line="69" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1816" line="69" column="6" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="font-family" important="false" byte_offset="1823" line="69" column="13">
<c2x:terms>
<c2x:term byte_offset="1836" line="69" column="26" unary_op="0" the_operator="0" type="4" string="monospace">
<c2x:ident>monospace</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1881" line="71" column="1">
<c2x:simple byte_offset="1881" line="71" column="1" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>toc</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="list-style" important="false" byte_offset="1892" line="72" column="3">
<c2x:terms>
<c2x:term byte_offset="1904" line="72" column="15" unary_op="0" the_operator="0" type="4" string="disc">
<c2x:ident>disc</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="list-style" important="false" byte_offset="1950" line="73" column="3">
<c2x:terms>
<c2x:term byte_offset="1962" line="73" column="15" unary_op="0" the_operator="0" type="4" string="none">
<c2x:ident>none</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="1990" line="77" column="3">
<c2x:simple byte_offset="1990" line="77" column="3" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1994" line="77" column="7" combinator="0" type_mask="2"/>
</c2x:selector>
<c2x:selector byte_offset="0" line="0" column="0">
<c2x:simple byte_offset="1998" line="77" column="11" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="stress" important="false" byte_offset="2003" line="77" column="16">
<c2x:terms>
<c2x:term byte_offset="2011" line="77" column="24" unary_op="0" the_operator="0" type="1" string="20">
<c2x:number byte_offset="2011" line="77" column="24" type="1">20</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="richness" important="false" byte_offset="2015" line="77" column="28">
<c2x:terms>
<c2x:term byte_offset="2025" line="77" column="38" unary_op="0" the_operator="0" type="1" string="90">
<c2x:number byte_offset="2025" line="77" column="38" type="1">90</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="2032" line="78" column="3">
<c2x:simple byte_offset="2032" line="78" column="3" combinator="0" type_mask="0">
<c2x:with type="1">
<c2x:class>hide</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="speak" important="false" byte_offset="2040" line="78" column="11">
<c2x:terms>
<c2x:term byte_offset="2047" line="78" column="18" unary_op="0" the_operator="0" type="4" string="none">
<c2x:ident>none</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="2056" line="79" column="3">
<c2x:simple byte_offset="2056" line="79" column="3" combinator="0" type_mask="2">
<c2x:with type="1">
<c2x:class>copyright</c2x:class>
</c2x:with>
</c2x:simple>
</c2x:selector>
</c2x:selectors>
<c2x:property name="volume" important="false" byte_offset="2070" line="79" column="17">
<c2x:terms>
<c2x:term byte_offset="2078" line="79" column="25" unary_op="0" the_operator="0" type="4" string="x-soft">
<c2x:ident>x-soft</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
<c2x:property name="speech-rate" important="false" byte_offset="2086" line="79" column="33">
<c2x:terms>
<c2x:term byte_offset="2099" line="79" column="46" unary_op="0" the_operator="0" type="4" string="x-fast">
<c2x:ident>x-fast</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="2110" line="80" column="3">
<c2x:simple byte_offset="2110" line="80" column="3" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="pause-before" important="false" byte_offset="2115" line="80" column="8">
<c2x:terms>
<c2x:term byte_offset="2129" line="80" column="22" unary_op="0" the_operator="0" type="1" string="20%">
<c2x:number byte_offset="2129" line="80" column="22" type="17">20</c2x:number>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="2137" line="81" column="3">
<c2x:simple byte_offset="2137" line="81" column="3" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="speak-punctuation" important="false" byte_offset="2143" line="81" column="9">
<c2x:terms>
<c2x:term byte_offset="2162" line="81" column="28" unary_op="0" the_operator="0" type="4" string="code">
<c2x:ident>code</c2x:ident>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
<c2x:ruleset>
<c2x:selectors>
<c2x:selector byte_offset="2175" line="86" column="1">
<c2x:simple byte_offset="2175" line="86" column="1" combinator="0" type_mask="2"/>
</c2x:selector>
</c2x:selectors>
<c2x:property name="background-image" important="false" byte_offset="2184" line="87" column="3">
<c2x:terms>
<c2x:term byte_offset="2202" line="87" column="21" unary_op="0" the_operator="0" type="5" string="url(http://www.w3.org/StyleSheets/TR/logo-WD)">
<c2x:function name="url"/>
</c2x:term>
</c2x:terms>
</c2x:property>
</c2x:ruleset>
</c2x:stylesheet>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment