diff --git a/README.md b/README.md
deleted file mode 100644
index ec96530..0000000
--- a/README.md
+++ /dev/null
@@ -1,11 +0,0 @@
-Интеграционное тестирование
-============
-
-#### Домашнее задание
-
-Написать валидатор e-mail адреса который будет вызываться всякий раз на нажатие клавиши в поле ввода.
-Если введенное в инпут значение не валидно - нужно добавить полю ввода рамку красного цвета.
-Если введенное значение корректный e-mail адрес - нужно добавить рамку зеленого цвета.
-Если значение отсутствует, то рамку рисовать не нужно.
-
-Протестировать поведение этого контрола интеграционно, любым понравившимся вам инструментом (CasperJS, karma, protractor, ...)
diff --git a/currency.html b/currency.html
deleted file mode 100644
index 7a3099d..0000000
--- a/currency.html
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
- URL encoded
-
-
-from
-
-to
-
-
-
-
-
\ No newline at end of file
diff --git a/currency.js b/currency.js
deleted file mode 100644
index 97027ed..0000000
--- a/currency.js
+++ /dev/null
@@ -1,14 +0,0 @@
-var express = require('express');
-var app = express();
-
-app.get('/currency', function (req, res) {
- setTimeout(function () {
- res.json({rate: 0.031});
- }, 100);
-});
-
-app.get('/', function (req, res) {
- res.sendfile('./currency.html');
-});
-
-app.listen(3000);
\ No newline at end of file
diff --git a/images/acync.gif b/images/acync.gif
deleted file mode 100644
index 80ad346..0000000
Binary files a/images/acync.gif and /dev/null differ
diff --git a/images/casperjs.png b/images/casperjs.png
deleted file mode 100644
index 32a337d..0000000
Binary files a/images/casperjs.png and /dev/null differ
diff --git a/images/demoTime.jpg b/images/demoTime.jpg
deleted file mode 100644
index 497ac40..0000000
Binary files a/images/demoTime.jpg and /dev/null differ
diff --git a/images/demo_time.jpg b/images/demo_time.jpg
deleted file mode 100644
index 15419e6..0000000
Binary files a/images/demo_time.jpg and /dev/null differ
diff --git a/images/karma.png b/images/karma.png
deleted file mode 100644
index 15a7419..0000000
Binary files a/images/karma.png and /dev/null differ
diff --git a/images/main.jpg b/images/main.jpg
deleted file mode 100644
index be735aa..0000000
Binary files a/images/main.jpg and /dev/null differ
diff --git a/images/protractor-logo.png b/images/protractor-logo.png
deleted file mode 100644
index 5cc59f5..0000000
Binary files a/images/protractor-logo.png and /dev/null differ
diff --git a/images/protractor_components.png b/images/protractor_components.png
deleted file mode 100644
index a8107f6..0000000
Binary files a/images/protractor_components.png and /dev/null differ
diff --git a/images/takeAPhoto.jpg b/images/takeAPhoto.jpg
deleted file mode 100644
index 22f98b8..0000000
Binary files a/images/takeAPhoto.jpg and /dev/null differ
diff --git a/images/take_a_photo.jpg b/images/take_a_photo.jpg
deleted file mode 100644
index 085fcc9..0000000
Binary files a/images/take_a_photo.jpg and /dev/null differ
diff --git a/images/yandex_lang_ru.svg b/images/yandex_lang_ru.svg
deleted file mode 100644
index 07f7200..0000000
--- a/images/yandex_lang_ru.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/index.css b/index.css
new file mode 100644
index 0000000..ea565b4
--- /dev/null
+++ b/index.css
@@ -0,0 +1,41 @@
+@import url(http://fonts.googleapis.com/css?family=Roboto:100);
+
+body
+{
+ background: #34495e;
+ color: white;
+ font-family: 'Roboto';
+}
+
+.form_flat
+{
+ background: #9b59b6;
+ margin: 25px auto;
+ width: 50%;
+ padding: 2em;
+ position: relative;
+ font-family: 'Roboto';
+}
+
+form input[type=text]
+{
+ font-family: 'Roboto';
+ width: 100%;
+ height: 40px;
+ margin-bottom: 10px;
+ padding-left: 15px;
+ background: #fff;
+ outline: none;
+ margin: 0;
+}
+
+.auth_ok
+{
+ border: 3px solid #2ecc71;
+ color: black;
+}
+
+.auth_error
+{
+ border: 3px solid #e74c3c;
+}
diff --git a/index.html b/index.html
old mode 100755
new mode 100644
index 738e210..9875c43
--- a/index.html
+++ b/index.html
@@ -1,393 +1,22 @@
-
-
-
- Testable code
-
-
-
-
-
-
-
-
-
-
-
- Интеграционное тестирование
- Сергей Жигалов
-
-
-
-
-
-
-
-
-
-
Интеграционное тестирование
-
-
С ергей Жигалов
-
Курс разработки интерфейсов, 2014 г.
-
-
-
-
-
- Призраки и приведения
-
-
-
-
-
-
-
-
-
-
-
-
- CasperJS API
-
- The casper module
- The clientutils module
- The colorizer module
- The mouse module
- The tester module
- The utils module
-
-
-
-
- CasperJS API
-
- The casper module
- The clientutils module
- The colorizer module
- The mouse module
- The tester module
- The utils module
-
-
-
-
- CasperJS casper
-
- http://docs.casperjs.org/en/latest/modules/casper.html
- start(String url[, Function then])
- thenOpen(String location[, mixed options])
- click(String selector)
- back()
- forward()
- getElementAttribute(String selector, String attribute)
- run(fn onComplete[, int time])
- ...
-
-
-
-
- CasperJS run
-
- casperjs selftest
- WebStorm
- casperjs test.js
-
-
-
-
- DEMO 01
-
-
-
-
- CasperJS tester
-
- assert(Boolean condition[, String message])
- assertEquals(mixed testValue, mixed expected[, String message])s
- assertExists(String selector[, String message])
- assertTitle(String expected[, String message])
- assertVisible(String selector[, String message])
- assertSelectorHasText(String selector, String text[, String message])
- ...
-
-
-
-
- DEMO 02 && DEMO 03
-
-
-
-
- capture
-
-
-
-
- CasperJS capture
-
- capture(String targetFilepath, [Object clipRect, Object imgOptions])
- clipRect: { top: 0, left: 0, width: 800, height: 600 }
- imgOptions: { format: 'jpg', quality: 75 }
- // bmp, jpg, jpeg, png, ppm, tiff, xbm and xpm
-
-
- captureBase64(String format[, Mixed area])
- String: area is a CSS3 selector string
- clipRect: { top: 0, left: 0, width: 800, height: 600 }
-
-
-
-
- DEMO 04
-
-
-
-
- Асинхронность
-
-
-
-
- CasperJS wait
-
- wait(Number timeout[, Function then])
- waitFor(Function testFx[, Function then, Function onTimeout, Number timeout, Object details])
- waitForAlert(Function then[, Function onTimeout, Number timeout])
- waitForUrl(String|RegExp url[, Function then, Function onTimeout, Number timeout])
- waitForSelector(String selector[, Function then, Function onTimeout, Number timeout])
- waitUntilVisible(String selector[, Function then, Function onTimeout, Number timeout])
- ...
-
-
-
-
- DEMO 05
-
-
-
-
-
-
-
-
-
-
- Karma Install
-
- $ npm install karma --save-dev
- $ npm install karma-mocha --save-dev
- $ npm install karma-chai karma-chai-plugins --save-dev
- $ npm install karma-chrome-launcher --save-dev
- $ npm install karma-... --save-dev
- $ npm install -g karma-cli
-
-
-
-
- Karma Config
-
- basePath: ''
- frameworks: ['mocha', 'chai'],
- files: [ 'test/*.test.js' ]
- autoWatch: true
- browsers: ['Chrome']
- ...
- $ karma init my.conf.js
-
-
-
-
- Karma Run
-
- karma start my.conf.js
-
-
-
-
- DEMO 01
-
-
-
-
-
-
-
-
-
-
- Protractor How it works
-
-
-
-
- Protractor Install
-
- $ npm install -g protractor
- $ webdriver-manager update
- $ webdriver-manager start
- $ npm install -g mocha
- $ npm install chai
- $ npm install chai-as-promised
-
-
-
-
-
-
- Protractor chai
-
-var chai = require('chai');
-var chaiAsPromised = require('chai-as-promised');
-
-chai.use(chaiAsPromised);
-var expect = chai.expect;
-
-
-
-expect(browser.getTitle()).to.eventually .equal('URL encoded');
-
-
-
-
- Protractor Config
-
-{
- seleniumAddress: 'http://localhost:4444/wd/hub',
- specs: [ 'test/*.test.js' ],
- framework: 'mocha',
- mochaOpts: { reporter: 'spec', timeout: 4000 },
- capabilities: { 'browserName': 'chrome', 'version': 'ANY' },
- baseUrl: 'http://localhost:63342'
-}
-
-
-
-
- Protractor Browser
-
-browser.get(destination, opt_timeout)
-browser.sleep(timeout)
-browser.back()
-browser.forward()
-browser.refresh()
-browser.getCookie(name)
-...
-
-
-
-
- DEMO 02
-
-
-
-
- Protractor Angular
-
- browser.ignoreSynchronization = true;
-
-
-
-
- DEMO 03
-
-
-
-
- Protractor Locators
-
-by.css('.myclass')
-by.id('myid')
-by.tagName('div')
-element(by.css('some-css')).element(by.tagName('tag-within-css'));
-
-
-
-
- Protractor Actions
-
-var el = element(locator);
-
-el.isPresent();
-el.isDisplayed();
-el.click();
-el.sendKeys('my text');
-el.clear();
-el.getAttribute('value');
-el.getText().then(function(text) {
- console.log(text);
-});
-
-
-
-
- DEMO 04
-
-
-
-
- Protractor wait
-
-browser.wait(fn, timeout, opt_message)
-
-
-
-
- DEMO 05
-
-
-
-
-
-
-
-
-
-
- DEMO 06
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+ form validation
+
+
+
+
+
+
+
+
+
+
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..49d5375
--- /dev/null
+++ b/index.js
@@ -0,0 +1,32 @@
+/** Email check application
+ *
+ * @param {DOM element} elem
+ */
+var Checker = function(elem) {
+ elem.onkeyup = function(evt) {
+ evt.preventDefault();
+ var isValid = isValidEmail(this.value);
+ if(this.value.length === 0) {
+ elem.className = "";
+ } else {
+ if(isValid) {
+ elem.className = "auth_ok";
+ } else {
+ elem.className = "auth_error";
+ }
+ }
+ };
+
+ elem.onpaste = elem.onkeyup;
+ elem.onchange = elem.onkeyup;
+
+ var isValidEmail = function(email) {
+ var atpos = email.indexOf("@");
+ var dotpos = email.lastIndexOf(".");
+ if(atpos < 1 || dotpos < atpos + 2 || dotpos + 2 >= email.length) {
+ return false;
+ } else {
+ return true;
+ }
+ };
+};
diff --git a/js/highlight.min.js b/js/highlight.min.js
deleted file mode 100644
index dfcf7c9..0000000
--- a/js/highlight.min.js
+++ /dev/null
@@ -1 +0,0 @@
-var hljs=new function(){function l(o){return o.replace(/&/gm,"&").replace(//gm,">")}function b(p){for(var o=p.firstChild;o;o=o.nextSibling){if(o.nodeName=="CODE"){return o}if(!(o.nodeType==3&&o.nodeValue.match(/\s+/))){break}}}function h(p,o){return Array.prototype.map.call(p.childNodes,function(q){if(q.nodeType==3){return o?q.nodeValue.replace(/\n/g,""):q.nodeValue}if(q.nodeName=="BR"){return"\n"}return h(q,o)}).join("")}function a(q){var p=(q.className+" "+q.parentNode.className).split(/\s+/);p=p.map(function(r){return r.replace(/^language-/,"")});for(var o=0;o"}while(x.length||v.length){var u=t().splice(0,1)[0];y+=l(w.substr(p,u.offset-p));p=u.offset;if(u.event=="start"){y+=s(u.node);r.push(u.node)}else{if(u.event=="stop"){var o,q=r.length;do{q--;o=r[q];y+=(""+o.nodeName.toLowerCase()+">")}while(o!=u.node);r.splice(q,1);while(q'+L[0]+""}else{r+=L[0]}N=A.lR.lastIndex;L=A.lR.exec(K)}return r+K.substr(N)}function z(){if(A.sL&&!e[A.sL]){return l(w)}var r=A.sL?d(A.sL,w):g(w);if(A.r>0){v+=r.keyword_count;B+=r.r}return''+r.value+" "}function J(){return A.sL!==undefined?z():G()}function I(L,r){var K=L.cN?'':"";if(L.rB){x+=K;w=""}else{if(L.eB){x+=l(r)+K;w=""}else{x+=K;w=r}}A=Object.create(L,{parent:{value:A}});B+=L.r}function C(K,r){w+=K;if(r===undefined){x+=J();return 0}var L=o(r,A);if(L){x+=J();I(L,r);return L.rB?0:r.length}var M=s(A,r);if(M){if(!(M.rE||M.eE)){w+=r}x+=J();do{if(A.cN){x+=" "}A=A.parent}while(A!=M.parent);if(M.eE){x+=l(r)}w="";if(M.starts){I(M.starts,"")}return M.rE?0:r.length}if(t(r,A)){throw"Illegal"}w+=r;return r.length||1}var F=e[D];f(F);var A=F;var w="";var B=0;var v=0;var x="";try{var u,q,p=0;while(true){A.t.lastIndex=p;u=A.t.exec(E);if(!u){break}q=C(E.substr(p,u.index-p),u[0]);p=u.index+q}C(E.substr(p));return{r:B,keyword_count:v,value:x,language:D}}catch(H){if(H=="Illegal"){return{r:0,keyword_count:0,value:l(E)}}else{throw H}}}function g(s){var o={keyword_count:0,r:0,value:l(s)};var q=o;for(var p in e){if(!e.hasOwnProperty(p)){continue}var r=d(p,s);r.language=p;if(r.keyword_count+r.r>q.keyword_count+q.r){q=r}if(r.keyword_count+r.r>o.keyword_count+o.r){q=o;o=r}}if(q.language){o.second_best=q}return o}function i(q,p,o){if(p){q=q.replace(/^((<[^>]+>|\t)+)/gm,function(r,v,u,t){return v.replace(/\t/g,p)})}if(o){q=q.replace(/\n/g," ")}return q}function m(r,u,p){var v=h(r,p);var t=a(r);if(t=="no-highlight"){return}var w=t?d(t,v):g(v);t=w.language;var o=c(r);if(o.length){var q=document.createElement("pre");q.innerHTML=w.value;w.value=j(o,c(q),v)}w.value=i(w.value,u,p);var s=r.className;if(!s.match("(\\s|^)(language-)?"+t+"(\\s|$)")){s=s?(s+" "+t):t}r.innerHTML=w.value;r.className=s;r.result={language:t,kw:w.keyword_count,re:w.r};if(w.second_best){r.second_best={language:w.second_best.language,kw:w.second_best.keyword_count,re:w.second_best.r}}}function n(){if(n.called){return}n.called=true;Array.prototype.map.call(document.getElementsByTagName("pre"),b).filter(Boolean).forEach(function(o){m(o,hljs.tabReplace)})}function k(){window.addEventListener("DOMContentLoaded",n,false);window.addEventListener("load",n,false)}var e={};this.LANGUAGES=e;this.highlight=d;this.highlightAuto=g;this.fixMarkup=i;this.highlightBlock=m;this.initHighlighting=n;this.initHighlightingOnLoad=k;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|\\.|-|-=|/|/=|:|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE],r:0};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE],r:0};this.CLCM={cN:"comment",b:"//",e:"$"};this.CBLCLM={cN:"comment",b:"/\\*",e:"\\*/"};this.HCM={cN:"comment",b:"#",e:"$"};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.inherit=function(q,r){var o={};for(var p in q){o[p]=q[p]}if(r){for(var p in r){o[p]=r[p]}}return o}}();hljs.LANGUAGES.bash=function(a){var g="true false";var e="if then else elif fi for break continue while in do done echo exit return set declare";var c={cN:"variable",b:"\\$[a-zA-Z0-9_#]+"};var b={cN:"variable",b:"\\${([^}]|\\\\})+}"};var h={cN:"string",b:'"',e:'"',i:"\\n",c:[a.BE,c,b],r:0};var d={cN:"string",b:"'",e:"'",c:[{b:"''"}],r:0};var f={cN:"test_condition",b:"",e:"",c:[h,d,c,b],k:{literal:g},r:0};return{k:{keyword:e,literal:g},c:[{cN:"shebang",b:"(#!\\/bin\\/bash)|(#!\\/bin\\/sh)",r:10},c,b,a.HCM,h,d,a.inherit(f,{b:"\\[ ",e:" \\]",r:0}),a.inherit(f,{b:"\\[\\[ ",e:" \\]\\]"})]}}(hljs);hljs.LANGUAGES.cs=function(a){return{k:"abstract as base bool break byte case catch char checked class const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long namespace new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while ascending descending from get group into join let orderby partial select set value var where yield",c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",b:"///|"},{cN:"xmlDocTag",b:"?",e:">"}]},a.CLCM,a.CBLCLM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},a.ASM,a.QSM,a.CNM]}}(hljs);hljs.LANGUAGES.ruby=function(e){var a="[a-zA-Z_][a-zA-Z0-9_]*(\\!|\\?)?";var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var g={keyword:"and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include"};var c={cN:"yardoctag",b:"@[A-Za-z]+"};var k=[{cN:"comment",b:"#",e:"$",c:[c]},{cN:"comment",b:"^\\=begin",e:"^\\=end",c:[c],r:10},{cN:"comment",b:"^__END__",e:"\\n$"}];var d={cN:"subst",b:"#\\{",e:"}",l:a,k:g};var i=[e.BE,d];var b=[{cN:"string",b:"'",e:"'",c:i,r:0},{cN:"string",b:'"',e:'"',c:i,r:0},{cN:"string",b:"%[qw]?\\(",e:"\\)",c:i},{cN:"string",b:"%[qw]?\\[",e:"\\]",c:i},{cN:"string",b:"%[qw]?{",e:"}",c:i},{cN:"string",b:"%[qw]?<",e:">",c:i,r:10},{cN:"string",b:"%[qw]?/",e:"/",c:i,r:10},{cN:"string",b:"%[qw]?%",e:"%",c:i,r:10},{cN:"string",b:"%[qw]?-",e:"-",c:i,r:10},{cN:"string",b:"%[qw]?\\|",e:"\\|",c:i,r:10}];var h={cN:"function",bWK:true,e:" |$|;",k:"def",c:[{cN:"title",b:j,l:a,k:g},{cN:"params",b:"\\(",e:"\\)",l:a,k:g}].concat(k)};var f=k.concat(b.concat([{cN:"class",bWK:true,e:"$|;",k:"class module",c:[{cN:"title",b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?",r:0},{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+e.IR+"::)?"+e.IR}]}].concat(k)},h,{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:":",c:b.concat([{b:j}]),r:0},{cN:"symbol",b:a+":",r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"number",b:"\\?\\w"},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+e.RSR+")\\s*",c:k.concat([{cN:"regexp",b:"/",e:"/[a-z]*",i:"\\n",c:[e.BE,d]}]),r:0}]));d.c=f;h.c[1].c=f;return{l:a,k:g,c:f}}(hljs);hljs.LANGUAGES.diff=function(a){return{c:[{cN:"chunk",b:"^\\@\\@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +\\@\\@$",r:10},{cN:"chunk",b:"^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$",r:10},{cN:"chunk",b:"^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$",r:10},{cN:"header",b:"Index: ",e:"$"},{cN:"header",b:"=====",e:"=====$"},{cN:"header",b:"^\\-\\-\\-",e:"$"},{cN:"header",b:"^\\*{3} ",e:"$"},{cN:"header",b:"^\\+\\+\\+",e:"$"},{cN:"header",b:"\\*{5}",e:"\\*{5}$"},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}}(hljs);hljs.LANGUAGES.javascript=function(a){return{k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class extends",literal:"true false null undefined NaN Infinity"},c:[a.ASM,a.QSM,a.CLCM,a.CBLCLM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBLCLM,{cN:"regexp",b:"/",e:"/[gim]*",i:"\\n",c:[{b:"\\\\/"}]},{b:"<",e:">;",sL:"xml"}],r:0},{cN:"function",bWK:true,e:"{",k:"function",c:[{cN:"title",b:"[A-Za-z$_][0-9A-Za-z$_]*"},{cN:"params",b:"\\(",e:"\\)",c:[a.CLCM,a.CBLCLM],i:"[\"'\\(]"}],i:"\\[|%"}]}}(hljs);hljs.LANGUAGES.css=function(a){var b={cN:"function",b:a.IR+"\\(",e:"\\)",c:[a.NM,a.ASM,a.QSM]};return{cI:true,i:"[=/|']",c:[a.CBLCLM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",eE:true,k:"import page media charset",c:[b,a.ASM,a.QSM,a.NM]},{cN:"tag",b:a.IR,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBLCLM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[b,a.NM,a.QSM,a.ASM,a.CBLCLM,{cN:"hexcolor",b:"\\#[0-9A-F]+"},{cN:"important",b:"!important"}]}}]}]}]}}(hljs);hljs.LANGUAGES.xml=function(a){var c="[A-Za-z0-9\\._:-]+";var b={eW:true,c:[{cN:"attribute",b:c,r:0},{b:'="',rB:true,e:'"',c:[{cN:"value",b:'"',eW:true}]},{b:"='",rB:true,e:"'",c:[{cN:"value",b:"'",eW:true}]},{b:"=",c:[{cN:"value",b:"[^\\s/>]+"}]}]};return{cI:true,c:[{cN:"pi",b:"<\\?",e:"\\?>",r:10},{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"",rE:true,sL:"css"}},{cN:"tag",b:"
-
-