From a6057fea31fc39df1a07d067826d8827675ba8ff Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Thu, 6 Apr 2017 14:21:34 -0400 Subject: [PATCH 001/189] In-toto layout wizard clean slate + flask scaffold This orphan branch marks the the clean slate for a new in-toto layout creation wizard, which will be based on UI mockups: https://github.com/in-toto/layout-web-tool/tree/editor-and-wizard-wip/mockups Isolated snippets and ideas from the pure layout editor (WIP) https://github.com/in-toto/layout-web-tool/tree/develop and the basic wizard plus editor (WIP) https://github.com/in-toto/layout-web-tool/tree/editor-and-wizard-wip might end up in this branch. If we want to have a single flask app with a wizard and a editor module, we should consider using blueprints: http://flask.pocoo.org/docs/0.12/blueprints/ This commit provides some basic Flask web scaffolding. --- .gitignore | 6 +++++ LICENSE | 21 ++++++++++++++++++ README.md | 6 +++++ __init__.py | 0 requirements.txt | 2 ++ static/css/main.css | 12 ++++++++++ static/js/jquery-3.1.1.min.js | 4 ++++ static/js/main.js | 0 templates/base.html | 13 +++++++++++ wizard.py | 41 +++++++++++++++++++++++++++++++++++ wizard.wsgi | 5 +++++ 11 files changed, 110 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 __init__.py create mode 100644 requirements.txt create mode 100644 static/css/main.css create mode 100644 static/js/jquery-3.1.1.min.js create mode 100644 static/js/main.js create mode 100644 templates/base.html create mode 100644 wizard.py create mode 100644 wizard.wsgi diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ae046e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +in-toto \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..de5cb5a --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 in-toto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6c8a8be --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +# in-toto Layout Creation Wizard + +A Flask based web app to guide project owners to through the generation of +an in-toto layout. + +Mockups can be found in the [`editor-and-wizard-wip` sibling branch](https://github.com/in-toto/layout-web-tool/tree/editor-and-wizard-wip/mockups). \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b54e6b6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Flask +-e git://github.com/in-toto/in-toto.git@artifact-rules#egg=in-toto \ No newline at end of file diff --git a/static/css/main.css b/static/css/main.css new file mode 100644 index 0000000..b193bfd --- /dev/null +++ b/static/css/main.css @@ -0,0 +1,12 @@ +html, body, div, p, span { + margin: 0; + border: 0; + padding: 0; + background-color: transparent; + letter-spacing: 0.5pt; + font-size: 10pt; + vertical-align: baseline; + text-decoration: none; + color: #3d4a5c; + font-family: 'Calibri', 'Myriad Pro', 'Lucida Grande', 'Lucida Sans', Verdana, sans-serif; +} diff --git a/static/js/jquery-3.1.1.min.js b/static/js/jquery-3.1.1.min.js new file mode 100644 index 0000000..4c5be4c --- /dev/null +++ b/static/js/jquery-3.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + + + + + diff --git a/wizard.py b/wizard.py new file mode 100644 index 0000000..345df6e --- /dev/null +++ b/wizard.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python + +""" + + wizard.py + + + Lukas Puehringer + + + April 06, 2017 + + + See LICENSE for licensing information. + + + Flask web app that provides a wizard to guide through an in-toto + software supply chain layout creation. + +""" + + + +from flask import (Flask, render_template, session, redirect, url_for, request, + flash, send_from_directory, abort, jsonify) + +app = Flask(__name__, static_url_path="", instance_relative_config=True) + +app.config.update(dict( + DEBUG=True, + SECRET_KEY="do not use the development key in production!!!" +)) + +# Supply a config file at "instance/config.py" that carries +# e.g. your deployment secret key +app.config.from_pyfile("config.py") + + +if __name__ == "__main__": + app.run() diff --git a/wizard.wsgi b/wizard.wsgi new file mode 100644 index 0000000..acbf0b7 --- /dev/null +++ b/wizard.wsgi @@ -0,0 +1,5 @@ +activate_this = "~/.virtualenvs/wizard/bin/activate_this.py" +execfile(activate_this, dict(__file__=activate_this)) +import sys +sys.path.insert(0, "~/wizard") +from wizard import app as application From 87377e572712344c42282d992b6c01117aa0e5cb Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Thu, 6 Apr 2017 16:25:49 -0400 Subject: [PATCH 002/189] Adds basic view and template for every wizard page --- templates/authorizing.html | 14 +++++ templates/base.html | 12 +++- templates/building.html | 14 +++++ templates/chaining.html | 14 +++++ templates/guarantees.html | 13 +++++ templates/packaging.html | 14 +++++ templates/quality.html | 14 +++++ templates/software_supply_chain.html | 14 +++++ templates/start.html | 18 ++++++ templates/versioning.html | 19 ++++++ templates/wrap_up.html | 14 +++++ wizard.py | 86 ++++++++++++++++++++++++++++ 12 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 templates/authorizing.html create mode 100644 templates/building.html create mode 100644 templates/chaining.html create mode 100644 templates/guarantees.html create mode 100644 templates/packaging.html create mode 100644 templates/quality.html create mode 100644 templates/software_supply_chain.html create mode 100644 templates/start.html create mode 100644 templates/versioning.html create mode 100644 templates/wrap_up.html diff --git a/templates/authorizing.html b/templates/authorizing.html new file mode 100644 index 0000000..de6f3dc --- /dev/null +++ b/templates/authorizing.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +6. Who is authorized to do what in you project? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index 1ab8589..d3cbbd5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -8,6 +8,16 @@ - +
+

+ {% block head %}{% endblock %} +

+
+
+ {% block content %}{% endblock %} +
+
+ {% block links %}{% endblock %} +
diff --git a/templates/building.html b/templates/building.html new file mode 100644 index 0000000..3c700a9 --- /dev/null +++ b/templates/building.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +2. Do you build your software? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/chaining.html b/templates/chaining.html new file mode 100644 index 0000000..c6b2795 --- /dev/null +++ b/templates/chaining.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +7. Let's link the steps of your supply chain together! +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/guarantees.html b/templates/guarantees.html new file mode 100644 index 0000000..efb56af --- /dev/null +++ b/templates/guarantees.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block head %} +Your security guarantees +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous +{% endblock %} \ No newline at end of file diff --git a/templates/packaging.html b/templates/packaging.html new file mode 100644 index 0000000..c47e564 --- /dev/null +++ b/templates/packaging.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +4. How do you package your software? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/quality.html b/templates/quality.html new file mode 100644 index 0000000..bcc5c90 --- /dev/null +++ b/templates/quality.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +3. How do you assure your software's quality? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/software_supply_chain.html b/templates/software_supply_chain.html new file mode 100644 index 0000000..189bcb2 --- /dev/null +++ b/templates/software_supply_chain.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +5. Is this what your software supply chain looks like? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/start.html b/templates/start.html new file mode 100644 index 0000000..da0fd66 --- /dev/null +++ b/templates/start.html @@ -0,0 +1,18 @@ +{% extends "base.html" %} + +{% block head %} +Secure your software with in-toto +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, + quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo + consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse + cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non + proident, sunt in culpa qui officia deserunt mollit anim id est laborum. +{% endblock %} + +{% block links %} + Next +{% endblock %} diff --git a/templates/versioning.html b/templates/versioning.html new file mode 100644 index 0000000..7b5663d --- /dev/null +++ b/templates/versioning.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% block head %} +1. Where does your code live? +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. + +

What version control system do you use?

+ {% for item in range(20) %} + {{ loop.index }} + {% endfor %} +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/templates/wrap_up.html b/templates/wrap_up.html new file mode 100644 index 0000000..625e979 --- /dev/null +++ b/templates/wrap_up.html @@ -0,0 +1,14 @@ +{% extends "base.html" %} +{% block head %} +8. Contratulations, you have created an in-toto software supply chain layout! +{% endblock %} + +{% block content %} + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua. +{% endblock %} + +{% block links %} + Previous + Next +{% endblock %} \ No newline at end of file diff --git a/wizard.py b/wizard.py index 345df6e..ba4988d 100644 --- a/wizard.py +++ b/wizard.py @@ -36,6 +36,92 @@ # e.g. your deployment secret key app.config.from_pyfile("config.py") +@app.route("/") +def start(): + """Step 0. + Wizard entry point, static landing page. """ + return render_template("start.html") + + +@app.route("/versioning") +def versioning(): + """Step 1. + Enter information about version control system. """ + return render_template("versioning.html") + + +@app.route("/building") +def building(): + """Step 2. + Enter information about building. """ + return render_template("building.html") + + +@app.route("/quality") +def quality_management(): + """Step 3. + Enter information about quality management. """ + return render_template("quality.html") + + +@app.route("/packaging") +def packaging(): + """Step 4. + Enter information about packaging. """ + return render_template("packaging.html") + + +@app.route("/software-supply-chain") +def software_supply_chain(): + """Step 5. + Visualize and edit software supply chain. """ + return render_template("software_supply_chain.html") + + +@app.route("/authorizing") +def authorizing(): + """Step 6. + Functionary keys upload and keys dropzone. """ + return render_template("authorizing.html") + + +@app.route("/authorizing/upload") +def ajax_upload_key(): + """Ajax upload functionary keys. """ + pass + + +@app.route("/chaining") +def chaining(): + """Step 7. + Dry run snippet and link metadata upload. """ + return render_template("chaining.html") + + +@app.route("/chaining/upload") +def ajax_upload_link(): + """Ajax upload link metadata. """ + pass + + +@app.route("/wrap-up") +def wrap_up(): + """Step 8. + Explain what to do with generated layout. + - Download layout + - Create project owner key (keygen snippet) + - Sign layout (signing snippet) + - Per functionary commands (in-toto-run snippet) + - Release instructions ?? + """ + return render_template("wrap_up.html") + + +@app.route("/guarantees") +def guarantees(): + """ Show what the software supply chain protects against and give advice for + more guarantees. """ + return render_template("guarantees.html") if __name__ == "__main__": app.run() From 5fc57ba8d8c0dff21f2d5d7e905b8ec06ef66b2f Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Thu, 6 Apr 2017 18:03:10 -0400 Subject: [PATCH 003/189] Adds basic "option group" to versioning template An option group consists of an image (e.g. a logo), a name and an input type (radio or checkbox depending on whether multiple options are possible or not). If a user picks an option a form will be opened to add additional information for that option. An option can be for example a particular version control system, or a build command. The opened form will be pre-populated with the appropriate command. The user can then customize or change the command associated with that option. --- static/css/main.css | 30 ++++++++++++++++++++++++++++++ templates/versioning.html | 8 +++++--- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/static/css/main.css b/static/css/main.css index b193bfd..7cf1e4e 100644 --- a/static/css/main.css +++ b/static/css/main.css @@ -10,3 +10,33 @@ html, body, div, p, span { color: #3d4a5c; font-family: 'Calibri', 'Myriad Pro', 'Lucida Grande', 'Lucida Sans', Verdana, sans-serif; } + +label.option-group { + width: 100px; + display: inline-block; + border: 1px solid lightgrey; + margin: 0; + padding: 0; +} + +label.option-group > img { + display: block; + margin: 10px auto; + height: 50px; +} + +label.option-group > span { + display: block; + text-align: center; + padding: 10px +} + +label.option-group > input { + display:none; +} + +label.option-group > input:checked ~ span { + font-weight: bolder; + background-color: lightgrey; +} + diff --git a/templates/versioning.html b/templates/versioning.html index 7b5663d..055592f 100644 --- a/templates/versioning.html +++ b/templates/versioning.html @@ -8,9 +8,11 @@ tempor incididunt ut labore et dolore magna aliqua.

What version control system do you use?

- {% for item in range(20) %} - {{ loop.index }} - {% endfor %} + {% for item in range(20) %}{% endfor %} {% endblock %} {% block links %} From 37b02e43fd5eb17d283aa5418a864521f85c5393 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Fri, 21 Apr 2017 18:28:49 -0400 Subject: [PATCH 004/189] Adds SASS/SCSS support SASS (Syntactically Awesome Stylesheets)[1] is a CSS preprocessor which makes writing CSS a lot easier, especially when including frontend frameworks (e.g. Bootstrap). This commit - replaces the main .css file with an empty .scss file, which will be compiled into .css (plus source map -> your browser's developer tools will need them). - adds the python scss compiler (libsass) to requirements.txt - adds a flask middleware to wizard.py to re-compile scss on each request. Alternatively, you can run a sass watcher in the project root, which will automatically compile on change. This is very useful when mapping files in your browser's developer console -> no need to refresh: ``` gem install sass sass --watch static/scss/main.scss:static/css/main.scss.css ``` [1] http://sass-lang.com/ --- requirements.txt | 3 ++- static/css/.keep | 0 static/css/main.css | 42 ------------------------------------------ static/scss/main.scss | 0 templates/base.html | 2 +- wizard.py | 8 ++++++-- 6 files changed, 9 insertions(+), 46 deletions(-) create mode 100644 static/css/.keep delete mode 100644 static/css/main.css create mode 100644 static/scss/main.scss diff --git a/requirements.txt b/requirements.txt index b54e6b6..c47642a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ Flask --e git://github.com/in-toto/in-toto.git@artifact-rules#egg=in-toto \ No newline at end of file +-e git://github.com/in-toto/in-toto.git@artifact-rules#egg=in-toto +libsass \ No newline at end of file diff --git a/static/css/.keep b/static/css/.keep new file mode 100644 index 0000000..e69de29 diff --git a/static/css/main.css b/static/css/main.css deleted file mode 100644 index 7cf1e4e..0000000 --- a/static/css/main.css +++ /dev/null @@ -1,42 +0,0 @@ -html, body, div, p, span { - margin: 0; - border: 0; - padding: 0; - background-color: transparent; - letter-spacing: 0.5pt; - font-size: 10pt; - vertical-align: baseline; - text-decoration: none; - color: #3d4a5c; - font-family: 'Calibri', 'Myriad Pro', 'Lucida Grande', 'Lucida Sans', Verdana, sans-serif; -} - -label.option-group { - width: 100px; - display: inline-block; - border: 1px solid lightgrey; - margin: 0; - padding: 0; -} - -label.option-group > img { - display: block; - margin: 10px auto; - height: 50px; -} - -label.option-group > span { - display: block; - text-align: center; - padding: 10px -} - -label.option-group > input { - display:none; -} - -label.option-group > input:checked ~ span { - font-weight: bolder; - background-color: lightgrey; -} - diff --git a/static/scss/main.scss b/static/scss/main.scss new file mode 100644 index 0000000..e69de29 diff --git a/templates/base.html b/templates/base.html index d3cbbd5..c24bf07 100644 --- a/templates/base.html +++ b/templates/base.html @@ -4,7 +4,7 @@ In-Toto Layout Wizard - + diff --git a/wizard.py b/wizard.py index ba4988d..4ff4832 100644 --- a/wizard.py +++ b/wizard.py @@ -20,13 +20,17 @@ """ - - from flask import (Flask, render_template, session, redirect, url_for, request, flash, send_from_directory, abort, jsonify) +from sassutils.wsgi import SassMiddleware app = Flask(__name__, static_url_path="", instance_relative_config=True) +# Automatically compile scss on each request +app.wsgi_app = SassMiddleware(app.wsgi_app, { + app.name: ('static/scss', 'static/css', '/css') +}) + app.config.update(dict( DEBUG=True, SECRET_KEY="do not use the development key in production!!!" From de866f88a3cf9f00d57778770c860218092a4bd5 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Fri, 21 Apr 2017 18:35:07 -0400 Subject: [PATCH 005/189] Adds Boostrap frontend framework (v4 alpha) - Adds package.json to install Bootstrap 4 (alpha) (use `npm install`) - Adds Boostrap HTML scaffolding - Import Boostrap scss sources in main scss (we'll probably remove some of them later) - Adds JS links to CDN (tempfix -> need to find a way to import them from node_modules, e.g. using `gulp`) - Adds node_modules to .gitignore --- .gitignore | 3 ++- package.json | 22 ++++++++++++++++++++ static/scss/main.scss | 47 +++++++++++++++++++++++++++++++++++++++++++ templates/base.html | 19 +++++++++++------ 4 files changed, 84 insertions(+), 7 deletions(-) create mode 100644 package.json diff --git a/.gitignore b/.gitignore index 8ae046e..02ceffa 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ __pycache__/ *.py[cod] *$py.class -in-toto \ No newline at end of file +in-toto +node_modules diff --git a/package.json b/package.json new file mode 100644 index 0000000..62b8250 --- /dev/null +++ b/package.json @@ -0,0 +1,22 @@ +{ + "name": "layout-tool", + "version": "1.0.0", + "description": "", + "main": "main.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/in-toto/layout-web-tool.git" + }, + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/in-toto/layout-web-tool/issues" + }, + "homepage": "https://github.com/in-toto/layout-web-tool#readme", + "dependencies": { + "boostrap": ">=4.0.0-alpha.6" + } +} diff --git a/static/scss/main.scss b/static/scss/main.scss index e69de29..6c6903c 100644 --- a/static/scss/main.scss +++ b/static/scss/main.scss @@ -0,0 +1,47 @@ +// Core variables and mixins +@import '../../node_modules/bootstrap/scss/variables'; +@import '../../node_modules/bootstrap/scss/mixins'; +@import '../../node_modules/bootstrap/scss/custom'; + +// Reset and dependencies +@import '../../node_modules/bootstrap/scss/normalize'; +@import '../../node_modules/bootstrap/scss/print'; + +// Core CSS +@import '../../node_modules/bootstrap/scss/reboot'; +@import '../../node_modules/bootstrap/scss/type'; +@import '../../node_modules/bootstrap/scss/images'; +@import '../../node_modules/bootstrap/scss/code'; +@import '../../node_modules/bootstrap/scss/grid'; +@import '../../node_modules/bootstrap/scss/tables'; +@import '../../node_modules/bootstrap/scss/forms'; +@import '../../node_modules/bootstrap/scss/buttons'; + +// Components +@import '../../node_modules/bootstrap/scss/transitions'; +@import '../../node_modules/bootstrap/scss/dropdown'; +@import '../../node_modules/bootstrap/scss/button-group'; +@import '../../node_modules/bootstrap/scss/input-group'; +@import '../../node_modules/bootstrap/scss/custom-forms'; +@import '../../node_modules/bootstrap/scss/nav'; +@import '../../node_modules/bootstrap/scss/navbar'; +@import '../../node_modules/bootstrap/scss/card'; +@import '../../node_modules/bootstrap/scss/breadcrumb'; +@import '../../node_modules/bootstrap/scss/pagination'; +@import '../../node_modules/bootstrap/scss/badge'; +@import '../../node_modules/bootstrap/scss/jumbotron'; +@import '../../node_modules/bootstrap/scss/alert'; +@import '../../node_modules/bootstrap/scss/progress'; +@import '../../node_modules/bootstrap/scss/media'; +@import '../../node_modules/bootstrap/scss/list-group'; +@import '../../node_modules/bootstrap/scss/responsive-embed'; +@import '../../node_modules/bootstrap/scss/close'; + +// Components w/ JavaScript +@import '../../node_modules/bootstrap/scss/modal'; +@import '../../node_modules/bootstrap/scss/tooltip'; +@import '../../node_modules/bootstrap/scss/popover'; +@import '../../node_modules/bootstrap/scss/carousel'; + +// Utility classes +@import '../../node_modules/bootstrap/scss/utilities'; \ No newline at end of file diff --git a/templates/base.html b/templates/base.html index c24bf07..d0f1221 100644 --- a/templates/base.html +++ b/templates/base.html @@ -1,10 +1,12 @@ - - - In-Toto Layout Wizard - - - + + + + + + + In-Toto Layout Wizard + @@ -19,5 +21,10 @@

{% block links %}{% endblock %}
+ + {# REPLACE THIS WITH LOCAL stuff#} + + + From ec0298bd9fae4fb1109ed40d14aec2c845ddbfcd Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Fri, 21 Apr 2017 18:39:40 -0400 Subject: [PATCH 006/189] Adds dummy boostrap progress bar (WIP) --- templates/base.html | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/templates/base.html b/templates/base.html index d0f1221..35fc343 100644 --- a/templates/base.html +++ b/templates/base.html @@ -10,16 +10,20 @@ -
-

+
+
+
+
+
+
+
+

{% block head %}{% endblock %} -

-
-
+

{% block content %}{% endblock %} -
-
- {% block links %}{% endblock %} +
+ {% block links %}{% endblock %} +
{# REPLACE THIS WITH LOCAL stuff#} From d8ebd83307422f5e11e8bdae4932231544895506 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Fri, 21 Apr 2017 18:40:50 -0400 Subject: [PATCH 007/189] Rewrites basic option groups using Bootstrap/SCSS This commit rewrites the basic option groups (c.f. 5de29f0cadc84d) using bootstrap grid layout and form classes in scss. Note that bootstrap classes are not written in HTML but rather included (e.g.: @extend .row) with custom classes using scss. --- static/scss/main.scss | 81 ++++++++++++++++++++++++++++++++++++++- templates/versioning.html | 50 +++++++++++++++++++----- 2 files changed, 121 insertions(+), 10 deletions(-) diff --git a/static/scss/main.scss b/static/scss/main.scss index 6c6903c..94d6aae 100644 --- a/static/scss/main.scss +++ b/static/scss/main.scss @@ -1,3 +1,10 @@ +$font-size-h1: 1.75rem !default; +$font-size-h2: 1.25rem !default; +$font-size-h3: 1rem !default; +$font-size-base: 0.85rem !default; + +$wizard-blue: #67798d; + // Core variables and mixins @import '../../node_modules/bootstrap/scss/variables'; @import '../../node_modules/bootstrap/scss/mixins'; @@ -44,4 +51,76 @@ @import '../../node_modules/bootstrap/scss/carousel'; // Utility classes -@import '../../node_modules/bootstrap/scss/utilities'; \ No newline at end of file +@import '../../node_modules/bootstrap/scss/utilities'; + +.head { + background: $wizard-blue; + height: 100px; +} + +.opt-row { + @extend .row; + @extend .no-gutters; + + .opt-cell { + @extend .col; + border: 1px solid lightgrey; + + &:first-child { + border-left-width: 2px; + } + + &:last-child { + border-right-width: 2px; + } + padding: 5px 0; + + &:hover { + background-color: lightgrey; + } + + // &.active:after { + &:hover:after { + left: 50%; + margin: 5px -8px; + content: ' '; + position: absolute; + width: 16px; + height: 16px; + background: url("data:image/svg+xml;utf8,") no-repeat; + } + + .opt-check { + @extend .form-check; + @extend .text-center; + margin: 5px 0; + + label { + @extend .form-check-label; + } + + input { + @extend .form-check-input; + } + } + + .opt-logo { + margin: 5px 0; + @extend .text-center; + + img { + width: 30px; + height: 30px; + &:before { + content: ' '; + position: absolute; + width: inherit; + height: inherit; + background: url("data:image/svg+xml;utf8, ") no-repeat; + } + } + } + } +} + + diff --git a/templates/versioning.html b/templates/versioning.html index 055592f..0a258fb 100644 --- a/templates/versioning.html +++ b/templates/versioning.html @@ -1,20 +1,52 @@ {% extends "base.html" %} + {% block head %} 1. Where does your code live? {% endblock %} {% block content %} - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua. - -

What version control system do you use?

- {% for item in range(20) %}{% endfor %} +

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod + tempor incididunt ut labore et dolore magna aliqua.

+ +

What version control system do you use?

+ +
+ {% for item in range(6) %} +
+ +
+ +
+
+ + {% endfor %} +
+ + +
+
+ +
+ +
+
+
+
+ +
+
+ + +
+ {% endblock %} + {% block links %} Previous Next From bcb456ba66c98fce05074275ff9bcb61a5162d67 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Mon, 1 May 2017 17:14:39 -0400 Subject: [PATCH 008/189] Override bootstrap's blue with wizard blue --- static/scss/main.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/static/scss/main.scss b/static/scss/main.scss index 94d6aae..22e8113 100644 --- a/static/scss/main.scss +++ b/static/scss/main.scss @@ -4,6 +4,7 @@ $font-size-h3: 1rem !default; $font-size-base: 0.85rem !default; $wizard-blue: #67798d; +$blue: $wizard-blue; // Core variables and mixins @import '../../node_modules/bootstrap/scss/variables'; From febd8b570986f6ff9264902803a3fee15e9e1dd4 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Mon, 1 May 2017 17:16:12 -0400 Subject: [PATCH 009/189] Adds dummy rows + recessed form in versioning page - Adds dummy opt-rows to see how this will look like. - Adds style for recess effect (this is where the forms will go), effect mostly taken from boostrap 3's "well". - Updates forms to align with bootstrap 4 --- static/scss/main.scss | 7 ++++++ templates/versioning.html | 50 ++++++++++++++++----------------------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/static/scss/main.scss b/static/scss/main.scss index 22e8113..29b3ede 100644 --- a/static/scss/main.scss +++ b/static/scss/main.scss @@ -125,3 +125,10 @@ $blue: $wizard-blue; } + +.recess { + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + padding: 30px; + @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); +} \ No newline at end of file diff --git a/templates/versioning.html b/templates/versioning.html index 0a258fb..ff20d3b 100644 --- a/templates/versioning.html +++ b/templates/versioning.html @@ -9,44 +9,34 @@ tempor incididunt ut labore et dolore magna aliqua.

What version control system do you use?

- -
- {% for item in range(6) %} -
- -
- + {% for item in range(3) %} +
+ {% for item in range(6) %} +
+ +
+ +
+ {% endfor %}
- - {% endfor %} -
- - -
-
- -
- +
+
+

How do you fetch your repo?

+
+
-
-
- -
-
- -
+ {% endfor %} {% endblock %} - {% block links %} Previous Next From 1d02fc69cb5bfe615bf417fa9bcc937938164451 Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Wed, 3 May 2017 14:29:04 -0400 Subject: [PATCH 010/189] Minor base.html changes - Removes topmost horizontal ruler and adds margin to progress bar - Removes links inheritance block (might be re-added after UI proto- typing) - Exchanges slim jquery with regular jquery CDN link (for fadeIn) --- templates/base.html | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/templates/base.html b/templates/base.html index 35fc343..f82a417 100644 --- a/templates/base.html +++ b/templates/base.html @@ -12,8 +12,7 @@
-
-
+

@@ -21,14 +20,18 @@

{% block head %}{% endblock %}

{% block content %}{% endblock %} -
- {% block links %}{% endblock %} -
{# REPLACE THIS WITH LOCAL stuff#} - + {# #} + + + + From 65e20657e56b280a8aee9256708f8530e0d1c65b Mon Sep 17 00:00:00 2001 From: Lukas Puehringer Date: Wed, 3 May 2017 14:32:19 -0400 Subject: [PATCH 011/189] Finishes basic versioning page UI Basic versioning page consists of a grid for predefined options (currently dummy options) with radio buttons and a form (input field) that expands below the option. Additionally, there is a button to add a custom VCS commands (currently not limited to one - this should probably be changed). Expand/collapse and show/hide is performed using custom JS. The look and feel for this page probably won't change a lot but the code structure could be more elegant, (e.g. not one .row per "row"). Also I went back to style using bootstrap classes in the HTML instead of extending custom classes in SCSS - while this makes the HTML more convoluted, it is easier for me during prototyping (trying out bootstrap classes). --- static/js/main.js | 51 ++++++++++++++++++++++++ static/scss/main.scss | 47 ++++++++--------------- templates/versioning.html | 81 ++++++++++++++++++++++++++++----------- 3 files changed, 125 insertions(+), 54 deletions(-) diff --git a/static/js/main.js b/static/js/main.js index e69de29..41827dc 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -0,0 +1,51 @@ +$(function() { + + // Initialize option form container collapsibles + // https://v4-alpha.getbootstrap.com/components/collapse/ + $(".opt-form-cont").collapse({ + toggle: false, + }); + + // Show/Hide/Toggle forms and toggle "active"class + $(".opt-cell").on("click", function(evt) { + var opt_form_cont = "#" + $(this).data("target"); + + // Hide all others + $(".opt-form-cont").not(opt_form_cont).collapse("hide") + $(".opt-cell").not(this).removeClass("active") + + // If the checkbox is checked we always show (leave shown) + // and hide (leave hidden) if unchecked. + if (evt.target.type == "checkbox") { + if (evt.target.checked) { + $(opt_form_cont).collapse("show"); + $(this).addClass("active"); + + } else { + $(opt_form_cont).collapse("hide"); + $(this).removeClass("active"); + } + // If something other than a checkbox is clicked we just toggle + } else { + $(opt_form_cont).collapse("toggle"); + $(this).toggleClass("active"); + } + }); + + + $("#add-cmd").on("click", function(evt){ + $(".opt-form.template") + .clone() + .appendTo("#custom-cmd-container") + .slideDown(function(){ + $(this).removeClass("template"); + }) + + }); + + $(document).on("click", "button.rm-cmd", function(evt) { + $(this).closest(".opt-form").slideUp(function(){ + $(this).remove(); + }); + }); +}); \ No newline at end of file diff --git a/static/scss/main.scss b/static/scss/main.scss index 29b3ede..bc3ec79 100644 --- a/static/scss/main.scss +++ b/static/scss/main.scss @@ -60,55 +60,37 @@ $blue: $wizard-blue; } .opt-row { - @extend .row; - @extend .no-gutters; - .opt-cell { - @extend .col; border: 1px solid lightgrey; + margin-bottom: -1px; + padding: 5px 0; - &:first-child { - border-left-width: 2px; + &:not(:last-child) { + margin-right: -1px; } - &:last-child { - border-right-width: 2px; + &.active, &:hover { + background-color: #f5f5f5; } - padding: 5px 0; - &:hover { - background-color: lightgrey; - } - - // &.active:after { - &:hover:after { + &.active:after { left: 50%; margin: 5px -8px; content: ' '; position: absolute; width: 16px; height: 16px; - background: url("data:image/svg+xml;utf8,") no-repeat; + z-index: 2; + background: url("data:image/svg+xml;utf8,") no-repeat; } .opt-check { - @extend .form-check; - @extend .text-center; margin: 5px 0; - label { - @extend .form-check-label; - } - - input { - @extend .form-check-input; - } } .opt-logo { margin: 5px 0; - @extend .text-center; - img { width: 30px; height: 30px; @@ -124,11 +106,14 @@ $blue: $wizard-blue; } } - - -.recess { +.opt-form { background-color: #f5f5f5; border: 1px solid #e3e3e3; - padding: 30px; + margin-top: 1px; + padding: 20px 30px 5px; @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); +} + +.template { + display: none; } \ No newline at end of file diff --git a/templates/versioning.html b/templates/versioning.html index ff20d3b..3f167c4 100644 --- a/templates/versioning.html +++ b/templates/versioning.html @@ -1,43 +1,78 @@ {% extends "base.html" %} {% block head %} -1. Where does your code live? +Where does your code live? {% endblock %} {% block content %}

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod - tempor incididunt ut labore et dolore magna aliqua.

- -

What version control system do you use?

- {% for item in range(3) %} -
- {% for item in range(6) %} -
-