UNPKG

@foxglove/sql.js

Version:

SQLite library with support for opening and writing databases, prepared statements, and more. This SQLite library is in pure javascript (compiled with emscripten).

100 lines (87 loc) 2.3 MB
// We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // In addition, When you use emcc's modularization, it still expects to export a global object called `Module`, // which is able to be used/called before the WASM is loaded. // The modularization below exports a promise that loads and resolves to the actual sql.js module. // That way, this module can't be used before the WASM is finished loading. // We are going to define a function that a user will call to start loading initializing our Sql.js library // However, that function might be called multiple times, and on subsequent calls, we don't actually want it to instantiate a new instance of the Module // Instead, we want to return the previously loaded module // TODO: Make this not declare a global if used in the browser var initSqlJsPromise = undefined; var initSqlJs = function (moduleConfig) { if (initSqlJsPromise){ return initSqlJsPromise; } // If we're here, we've never called this function before initSqlJsPromise = new Promise(function (resolveModule, reject) { // We are modularizing this manually because the current modularize setting in Emscripten has some issues: // https://github.com/kripken/emscripten/issues/5820 // The way to affect the loading of emcc compiled modules is to create a variable called `Module` and add // properties to it, like `preRun`, `postRun`, etc // We are using that to get notified when the WASM has finished loading. // Only then will we return our promise // If they passed in a moduleConfig object, use that // Otherwise, initialize Module to the empty object var Module = typeof moduleConfig !== 'undefined' ? moduleConfig : {}; // EMCC only allows for a single onAbort function (not an array of functions) // So if the user defined their own onAbort function, we remember it and call it var originalOnAbortFunction = Module['onAbort']; Module['onAbort'] = function (errorThatCausedAbort) { reject(new Error(errorThatCausedAbort)); if (originalOnAbortFunction){ originalOnAbortFunction(errorThatCausedAbort); } }; Module['postRun'] = Module['postRun'] || []; Module['postRun'].push(function () { // When Emscripted calls postRun, this promise resolves with the built Module resolveModule(Module); }); // There is a section of code in the emcc-generated code below that looks like this: // (Note that this is lowercase `module`) // if (typeof module !== 'undefined') { // module['exports'] = Module; // } // When that runs, it's going to overwrite our own modularization export efforts in shell-post.js! // The only way to tell emcc not to emit it is to pass the MODULARIZE=1 or MODULARIZE_INSTANCE=1 flags, // but that carries with it additional unnecessary baggage/bugs we don't want either. // So, we have three options: // 1) We undefine `module` // 2) We remember what `module['exports']` was at the beginning of this function and we restore it later // 3) We write a script to remove those lines of code as part of the Make process. // // Since those are the only lines of code that care about module, we will undefine it. It's the most straightforward // of the options, and has the side effect of reducing emcc's efforts to modify the module if its output were to change in the future. // That's a nice side effect since we're handling the modularization efforts ourselves module = undefined; // The emcc-generated code and shell-post.js code goes below, // meaning that all of it runs inside of this promise. If anything throws an exception, our promise will abort var f;f||(f=typeof Module !== 'undefined' ? Module : {});null; f.onRuntimeInitialized=function(){function a(h,m){this.Qa=h;this.db=m;this.Oa=1;this.nb=[]}function b(h,m){this.db=m;m=aa(h)+1;this.eb=ba(m);if(null===this.eb)throw Error("Unable to allocate memory for the SQL string");ea(h,k,this.eb,m);this.kb=this.eb;this.$a=this.rb=null}function c(h){h=h||{};this.filename="dbfile_"+(4294967295*Math.random()>>>0);null!=h.data?fa(this.filename,h.data):h.file?(h=h.file,n.gb||(n.gb=new FileReaderSync),n.createNode(ha,this.filename,n.Za,0,h,h.lastModifiedDate)):(h instanceof Array||h instanceof Uint8Array)&&fa(this.filename,h);this.handleError(g(this.filename,d));this.db=q(d,"i32");mc(this.db);this.hb={};this.Wa={}}var d=v(4),e=f.cwrap,g=e("sqlite3_open","number",["string","number"]),l=e("sqlite3_close_v2","number",["number"]),p=e("sqlite3_exec","number",["number","string","number","number","number"]),w=e("sqlite3_changes","number",["number"]),u=e("sqlite3_prepare_v2","number",["number","string","number","number","number"]),D=e("sqlite3_sql","string",["number"]),K=e("sqlite3_normalized_sql", "string",["number"]),ca=e("sqlite3_prepare_v2","number",["number","number","number","number","number"]),nc=e("sqlite3_bind_text","number",["number","number","number","number","number"]),ub=e("sqlite3_bind_blob","number",["number","number","number","number","number"]),oc=e("sqlite3_bind_double","number",["number","number","number"]),pc=e("sqlite3_bind_int","number",["number","number","number"]),qc=e("sqlite3_bind_parameter_index","number",["number","string"]),rc=e("sqlite3_step","number",["number"]), sc=e("sqlite3_errmsg","string",["number"]),tc=e("sqlite3_column_count","number",["number"]),uc=e("sqlite3_data_count","number",["number"]),vc=e("sqlite3_column_double","number",["number","number"]),vb=e("sqlite3_column_text","string",["number","number"]),wc=e("sqlite3_column_blob","number",["number","number"]),xc=e("sqlite3_column_bytes","number",["number","number"]),yc=e("sqlite3_column_type","number",["number","number"]),zc=e("sqlite3_column_name","string",["number","number"]),Ac=e("sqlite3_reset", "number",["number"]),Bc=e("sqlite3_clear_bindings","number",["number"]),Cc=e("sqlite3_finalize","number",["number"]),Dc=e("sqlite3_create_function_v2","number","number string number number number number number number number".split(" ")),Ec=e("sqlite3_value_type","number",["number"]),Fc=e("sqlite3_value_bytes","number",["number"]),Gc=e("sqlite3_value_text","string",["number"]),Hc=e("sqlite3_value_blob","number",["number"]),Ic=e("sqlite3_value_double","number",["number"]),Jc=e("sqlite3_result_double", "",["number","number"]),wb=e("sqlite3_result_null","",["number"]),Kc=e("sqlite3_result_text","",["number","string","number","number"]),Lc=e("sqlite3_result_blob","",["number","number","number","number"]),Mc=e("sqlite3_result_int","",["number","number"]),xb=e("sqlite3_result_error","",["number","string","number"]),mc=e("RegisterExtensionFunctions","number",["number"]);a.prototype.bind=function(h){if(!this.Qa)throw"Statement closed";this.reset();return Array.isArray(h)?this.Hb(h):null!=h&&"object"=== typeof h?this.Ib(h):!0};a.prototype.step=function(){if(!this.Qa)throw"Statement closed";this.Oa=1;var h=rc(this.Qa);switch(h){case 100:return!0;case 101:return!1;default:throw this.db.handleError(h);}};a.prototype.Db=function(h){null==h&&(h=this.Oa,this.Oa+=1);return vc(this.Qa,h)};a.prototype.Kb=function(h){null==h&&(h=this.Oa,this.Oa+=1);h=vb(this.Qa,h);if("function"!==typeof BigInt)throw Error("BigInt is not supported");return BigInt(h)};a.prototype.Lb=function(h){null==h&&(h=this.Oa,this.Oa+= 1);return vb(this.Qa,h)};a.prototype.getBlob=function(h){null==h&&(h=this.Oa,this.Oa+=1);var m=xc(this.Qa,h);h=wc(this.Qa,h);for(var t=new Uint8Array(m),r=0;r<m;r+=1)t[r]=x[h+r];return t};a.prototype.get=function(h,m){m=m||{};null!=h&&this.bind(h)&&this.step();h=[];for(var t=uc(this.Qa),r=0;r<t;r+=1)switch(yc(this.Qa,r)){case 1:var C=m.useBigInt?this.Kb(r):this.Db(r);h.push(C);break;case 2:h.push(this.Db(r));break;case 3:h.push(this.Lb(r));break;case 4:h.push(this.getBlob(r));break;default:h.push(null)}return h}; a.prototype.getColumnNames=function(){for(var h=[],m=tc(this.Qa),t=0;t<m;t+=1)h.push(zc(this.Qa,t));return h};a.prototype.getAsObject=function(h,m){h=this.get(h,m);m=this.getColumnNames();for(var t={},r=0;r<m.length;r+=1)t[m[r]]=h[r];return t};a.prototype.getSQL=function(){return D(this.Qa)};a.prototype.getNormalizedSQL=function(){return K(this.Qa)};a.prototype.run=function(h){null!=h&&this.bind(h);this.step();return this.reset()};a.prototype.xb=function(h,m){null==m&&(m=this.Oa,this.Oa+=1);h=ia(h); var t=ja(h);this.nb.push(t);this.db.handleError(nc(this.Qa,m,t,h.length-1,0))};a.prototype.Gb=function(h,m){null==m&&(m=this.Oa,this.Oa+=1);var t=ja(h);this.nb.push(t);this.db.handleError(ub(this.Qa,m,t,h.length,0))};a.prototype.wb=function(h,m){null==m&&(m=this.Oa,this.Oa+=1);this.db.handleError((h===(h|0)?pc:oc)(this.Qa,m,h))};a.prototype.Jb=function(h){null==h&&(h=this.Oa,this.Oa+=1);ub(this.Qa,h,0,0,0)};a.prototype.yb=function(h,m){null==m&&(m=this.Oa,this.Oa+=1);switch(typeof h){case "string":this.xb(h, m);return;case "number":this.wb(h,m);return;case "bigint":this.xb(h.toString(),m);return;case "boolean":this.wb(h+0,m);return;case "object":if(null===h){this.Jb(m);return}if(null!=h.length){this.Gb(h,m);return}}throw"Wrong API use : tried to bind a value of an unknown type ("+h+").";};a.prototype.Ib=function(h){var m=this;Object.keys(h).forEach(function(t){var r=qc(m.Qa,t);0!==r&&m.yb(h[t],r)});return!0};a.prototype.Hb=function(h){for(var m=0;m<h.length;m+=1)this.yb(h[m],m+1);return!0};a.prototype.reset= function(){this.freemem();return 0===Bc(this.Qa)&&0===Ac(this.Qa)};a.prototype.freemem=function(){for(var h;void 0!==(h=this.nb.pop());)ka(h)};a.prototype.free=function(){this.freemem();var h=0===Cc(this.Qa);delete this.db.hb[this.Qa];this.Qa=0;return h};b.prototype.next=function(){if(null===this.eb)return{done:!0};null!==this.$a&&(this.$a.free(),this.$a=null);if(!this.db.db)throw this.pb(),Error("Database closed");var h=ma(),m=v(4);na(d);na(m);try{this.db.handleError(ca(this.db.db,this.kb,-1,d,m)); this.kb=q(m,"i32");var t=q(d,"i32");if(0===t)return this.pb(),{done:!0};this.$a=new a(t,this.db);this.db.hb[t]=this.$a;return{value:this.$a,done:!1}}catch(r){throw this.rb=y(this.kb),this.pb(),r;}finally{oa(h)}};b.prototype.pb=function(){ka(this.eb);this.eb=null};b.prototype.getRemainingSQL=function(){return null!==this.rb?this.rb:y(this.kb)};"function"===typeof Symbol&&"symbol"===typeof Symbol.iterator&&(b.prototype[Symbol.iterator]=function(){return this});c.prototype.run=function(h,m){if(!this.db)throw"Database closed"; if(m){h=this.prepare(h,m);try{h.step()}finally{h.free()}}else this.handleError(p(this.db,h,0,0,d));return this};c.prototype.exec=function(h,m,t){if(!this.db)throw"Database closed";var r=ma(),C=null;try{var V=aa(h)+1,H=v(V);ea(h,x,H,V);var la=H;var da=v(4);for(h=[];0!==q(la,"i8");){na(d);na(da);this.handleError(ca(this.db,la,-1,d,da));var E=q(d,"i32");la=q(da,"i32");if(0!==E){V=null;C=new a(E,this);for(null!=m&&C.bind(m);C.step();)null===V&&(V={columns:C.getColumnNames(),values:[]},h.push(V)),V.values.push(C.get(null, t));C.free()}}return h}catch(O){throw C&&C.free(),O;}finally{oa(r)}};c.prototype.each=function(h,m,t,r,C){"function"===typeof m&&(r=t,t=m,m=void 0);h=this.prepare(h,m);try{for(;h.step();)t(h.getAsObject(null,C))}finally{h.free()}if("function"===typeof r)return r()};c.prototype.prepare=function(h,m){na(d);this.handleError(u(this.db,h,-1,d,0));h=q(d,"i32");if(0===h)throw"Nothing to prepare";var t=new a(h,this);null!=m&&t.bind(m);return this.hb[h]=t};c.prototype.iterateStatements=function(h){return new b(h, this)};c.prototype["export"]=function(){Object.values(this.hb).forEach(function(m){m.free()});Object.values(this.Wa).forEach(pa);this.Wa={};this.handleError(l(this.db));var h=qa(this.filename);this.handleError(g(this.filename,d));this.db=q(d,"i32");return h};c.prototype.close=function(){null!==this.db&&(Object.values(this.hb).forEach(function(h){h.free()}),Object.values(this.Wa).forEach(pa),this.Wa={},this.handleError(l(this.db)),ra("/"+this.filename),this.db=null)};c.prototype.handleError=function(h){if(0=== h)return null;h=sc(this.db);throw Error(h);};c.prototype.getRowsModified=function(){return w(this.db)};c.prototype.create_function=function(h,m){Object.prototype.hasOwnProperty.call(this.Wa,h)&&(pa(this.Wa[h]),delete this.Wa[h]);var t=sa(function(r,C,V){for(var H,la=[],da=0;da<C;da+=1){var E=q(V+4*da,"i32"),O=Ec(E);if(1===O||2===O)E=Ic(E);else if(3===O)E=Gc(E);else if(4===O){O=E;E=Fc(O);O=Hc(O);for(var Ab=new Uint8Array(E),Fa=0;Fa<E;Fa+=1)Ab[Fa]=x[O+Fa];E=Ab}else E=null;la.push(E)}try{H=m.apply(null, la)}catch(Pc){xb(r,Pc,-1);return}switch(typeof H){case "boolean":Mc(r,H?1:0);break;case "number":Jc(r,H);break;case "string":Kc(r,H,-1,-1);break;case "object":null===H?wb(r):null!=H.length?(C=ja(H),Lc(r,C,H.length,-1),ka(C)):xb(r,"Wrong API use : tried to return a value of an unknown type ("+H+").",-1);break;default:wb(r)}});this.Wa[h]=t;this.handleError(Dc(this.db,h,m.length,1,0,t,0,0,0));return this};f.Database=c};var ta={},z;for(z in f)f.hasOwnProperty(z)&&(ta[z]=f[z]); var ua="./this.program",va="object"===typeof window,wa="function"===typeof importScripts,xa="object"===typeof process&&"object"===typeof process.versions&&"string"===typeof process.versions.node,A="",ya,za,Aa,Ba,Ca; if(xa)A=wa?require("path").dirname(A)+"/":__dirname+"/",ya=function(a,b){var c=Da(a);if(c)return b?c:c.toString();Ba||(Ba=require("fs"));Ca||(Ca=require("path"));a=Ca.normalize(a);return Ba.readFileSync(a,b?null:"utf8")},Aa=function(a){a=ya(a,!0);a.buffer||(a=new Uint8Array(a));assert(a.buffer);return a},za=function(a,b,c){var d=Da(a);d&&b(d);Ba||(Ba=require("fs"));Ca||(Ca=require("path"));a=Ca.normalize(a);Ba.readFile(a,function(e,g){e?c(e):b(g.buffer)})},1<process.argv.length&&(ua=process.argv[1].replace(/\\/g, "/")),process.argv.slice(2),"undefined"!==typeof module&&(module.exports=f),f.inspect=function(){return"[Emscripten Module object]"};else if(va||wa)wa?A=self.location.href:"undefined"!==typeof document&&document.currentScript&&(A=document.currentScript.src),A=0!==A.indexOf("blob:")?A.substr(0,A.lastIndexOf("/")+1):"",ya=function(a){try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.send(null);return b.responseText}catch(e){if(a=Da(a)){b=[];for(var c=0;c<a.length;c++){var d=a[c];255<d&&(Ea&&assert(!1, "Character code "+d+" ("+String.fromCharCode(d)+") at offset "+c+" not in 0x00-0xFF."),d&=255);b.push(String.fromCharCode(d))}return b.join("")}throw e;}},wa&&(Aa=function(a){try{var b=new XMLHttpRequest;b.open("GET",a,!1);b.responseType="arraybuffer";b.send(null);return new Uint8Array(b.response)}catch(c){if(a=Da(a))return a;throw c;}}),za=function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,!0);d.responseType="arraybuffer";d.onload=function(){if(200==d.status||0==d.status&&d.response)b(d.response); else{var e=Da(a);e?b(e.buffer):c()}};d.onerror=c;d.send(null)};var Ga=f.print||console.log.bind(console),B=f.printErr||console.warn.bind(console);for(z in ta)ta.hasOwnProperty(z)&&(f[z]=ta[z]);ta=null;f.thisProgram&&(ua=f.thisProgram);var Ha=[],Ia;function pa(a){Ia.delete(F.get(a));Ha.push(a)} function sa(a){if(!Ia){Ia=new WeakMap;for(var b=0;b<F.length;b++){var c=F.get(b);c&&Ia.set(c,b)}}if(Ia.has(a))a=Ia.get(a);else{if(Ha.length)b=Ha.pop();else{try{F.grow(1)}catch(d){if(!(d instanceof RangeError))throw d;throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.";}b=F.length-1}try{F.set(b,a)}catch(d){if(!(d instanceof TypeError))throw d;F.set(b,a)}Ia.set(a,b);a=b}return a}var Ja;f.wasmBinary&&(Ja=f.wasmBinary);var noExitRuntime=f.noExitRuntime||!0; function Ka(){this.buffer=new ArrayBuffer(La/65536*65536)}function Ma(){this.exports=( // EMSCRIPTEN_START_ASM function instantiate(Ra){function e(f){f.grow=function(b){var a=this.length;this.length=this.length+b;return a};f.set=function(c,d){this[c]=d};f.get=function(c){return this[c]};return f}var g;var h=new Uint8Array(123);for(var c=25;c>=0;--c){h[48+c]=52+c;h[65+c]=c;h[97+c]=26+c}h[43]=62;h[47]=63;function n(o,p,q){var i,j,c=0,k=p,l=q.length,m=p+(l*3>>2)-(q[l-2]=="=")-(q[l-1]=="=");for(;c<l;c+=4){i=h[q.charCodeAt(c+1)];j=h[q.charCodeAt(c+2)];o[k++]=h[q.charCodeAt(c)]<<2|i>>4;if(k<m)o[k++]=i<<4|j>>2;if(k<m)o[k++]=j<<6|h[q.charCodeAt(c+3)]}}function r(s){n(g,1024,"My4zNi4wAHt9ACVzLiV6AFJlYWxBZmZpbml0eQBidXN5AHRlbXBfc3RvcmVfZGlyZWN0b3J5AG5vdCBhIHdyaXRhYmxlIGRpcmVjdG9yeQBvcGVuRGlyZWN0b3J5AHNocmlua19tZW1vcnkAb3V0IG9mIG1lbW9yeQBmYWlsZWQgdG8gYWxsb2NhdGUgJXUgYnl0ZXMgb2YgbWVtb3J5AEludENvcHkAU0NvcHkAVkRlc3Ryb3kATXVsdGlwbHkAcXVlcnlfb25seQB1bmxpa2VseQB0YWJsZSAiJXMiIGhhcyBtb3JlIHRoYW4gb25lIHByaW1hcnkga2V5AGZvcmVpZ24ga2V5AGpzb25fZ3JvdXBfYXJyYXkAanNvbl9hcnJheQBqdWxpYW5kYXkAZnRzNGF1eAB1bml4AHNxbGl0ZV9yZW5hbWVfcXVvdGVmaXgAcHJlZml4AExJS0Ugb3IgR0xPQiBwYXR0ZXJuIHRvbyBjb21wbGV4AGhleABjaGFyaW5kZXgAT3BlbkF1dG9pbmRleABhdXRvbWF0aWNfaW5kZXgAYXV0by1pbmRleABvcnBoYW4gaW5kZXgARHJvcEluZGV4AGlkeABSZW9wZW5JZHgAcGN4AG1heABNZW1NYXgAJTAyeAAweAAgRlJPTSAnJXEnLiclcSVzJyBBUyB4AENSRUFURSBUQUJMRSB4AHJ3AHBzb3cAaW1wbGllc19ub25udWxsX3JvdwBub3cAaW50ZWdlciBvdmVyZmxvdwBwYXJzZXIgc3RhY2sgb3ZlcmZsb3cAd2luZG93AENobmdDbnRSb3cAUmVzdWx0Um93AElmTnVsbFJvdwBuZXcAbm8gc3VjaCB2aWV3AGNhbm5vdCBtb2RpZnkgJXMgYmVjYXVzZSBpdCBpcyBhIHZpZXcAQ2Fubm90IGFkZCBhIGNvbHVtbiB0byBhIHZpZXcAY2Fubm90IFVQU0VSVCBhIHZpZXcAUHJldgBzdGRldgAgJWxsdQAlYyV1AHN1YnF1ZXJ5XyV1ACUuKno6JXUARnJhZ21lbnRhdGlvbiBvZiAlZCBieXRlcyByZXBvcnRlZCBhcyAlZCBvbiBwYWdlICV1AE11bHRpcGxlIHVzZXMgZm9yIGJ5dGUgJXUgb2YgcGFnZSAldQBTVUJRVUVSWSAldQB1bmFibGUgdG8gdXNlIGZ1bmN0aW9uICVzIGluIHRoZSByZXF1ZXN0ZWQgY29udGV4dABTb3J0ZXJOZXh0AFZOZXh0AGluY29tcGxldGUgaW5wdXQAYnVzeV90aW1lb3V0AGxvY2FsaG9zdABjYW5ub3QgZHJvcCBjb2x1bW4gIiVzIjogbm8gb3RoZXIgY29sdW1ucyBleGlzdABwZXJzaXN0AGZvcmVpZ25fa2V5X2xpc3QAaW5kZXhfbGlzdABmdW5jdGlvbl9saXN0AGNvbGxhdGlvbl9saXN0AGRhdGFiYXNlX2xpc3QAbW9kdWxlX2xpc3QAcHJhZ21hX2xpc3QAc2V0IGxpc3QAc3FsaXRlX3JlbmFtZV90ZXN0AFJvd1NldFRlc3QAU2VxdWVuY2VUZXN0AGZhc3QATGFzdABDYXN0AHNxcnQAU29ydGVyU29ydABqc29uX2luc2VydABJZHhJbnNlcnQAU29ydGVySW5zZXJ0AHJlc3RhcnQAY290AEJpdE5vdABJZk5vdABQYWdlY291bnQAZnJlZWxpc3RfY291bnQAbWF4X3BhZ2VfY291bnQAUmVzZXRDb3VudAB3YWxfYXV0b2NoZWNrcG9pbnQAd2FsX2NoZWNrcG9pbnQAQ2hlY2twb2ludABTYXZlcG9pbnQAYSBDSEVDSyBjb25zdHJhaW50ACVzT04gQ09ORkxJQ1QgY2xhdXNlIGRvZXMgbm90IG1hdGNoIGFueSBQUklNQVJZIEtFWSBvciBVTklRVUUgY29uc3RyYWludABDdXJzb3JIaW50AF9jb250ZW50AHBhcmVudABESVNUSU5DVCBhZ2dyZWdhdGVzIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBhcmd1bWVudABjb21tZW50AEFQSSBjYWxsZWQgd2l0aCBmaW5hbGl6ZWQgcHJlcGFyZWQgc3RhdGVtZW50AEFQSSBjYWxsZWQgd2l0aCBOVUxMIHByZXBhcmVkIHN0YXRlbWVudABNYXhQZ2NudABkZWZhdWx0IHZhbHVlIG9mIGNvbHVtbiBbJXNdIGlzIG5vdCBjb25zdGFudABNdXN0QmVJbnQAQ2Fubm90IGFkZCBhIGNvbHVtbiB3aXRoIG5vbi1jb25zdGFudCBkZWZhdWx0AEhhbHQAc3RhdF9pbml0AEluaXQAQXV0b0NvbW1pdABhbmFseXNpc19saW1pdABzb2Z0X2hlYXBfbGltaXQAaGFyZF9oZWFwX2xpbWl0AGpvdXJuYWxfc2l6ZV9saW1pdABPZmZzZXRMaW1pdABTZWVrSGl0AE9OIGNsYXVzZSByZWZlcmVuY2VzIHRhYmxlcyB0byBpdHMgcmlnaHQAU2hpZnRSaWdodABoZ2h0AFNoaWZ0TGVmdABPZmZzZXQAanNvbl9zZXQAdG9vIG1hbnkgY29sdW1ucyBpbiByZXN1bHQgc2V0ACVyIE9SREVSIEJZIHRlcm0gZG9lcyBub3QgbWF0Y2ggYW55IGNvbHVtbiBpbiB0aGUgcmVzdWx0IHNldABzbmlwcGV0AHN0YXRfZ2V0AHNxbGl0ZV9jb21waWxlb3B0aW9uX2dldABOb0NvbmZsaWN0AGpzb25fZ3JvdXBfb2JqZWN0AGpzb25fb2JqZWN0AGpzb25fZXh0cmFjdABTdWJ0cmFjdABsc3RhdABmc3RhdAAlc19zdGF0AHRibCxpZHgsc3RhdAB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdABncm91cF9jb25jYXQAQ29uY2F0AEx0AEd0AGRlZmVyX2ZvcmVpZ25fa2V5cwBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb3dlZCBpbiB2aWV3cwBzdGF0dXMAc3luY2hyb25vdXMAaW5kZXggJXMgYWxyZWFkeSBleGlzdHMAb3V0cHV0IGZpbGUgYWxyZWFkeSBleGlzdHMAdHJpZ2dlciAlVCBhbHJlYWR5IGV4aXN0cwB0YWJsZSAlVCBhbHJlYWR5IGV4aXN0cwBOb3RFeGlzdHMAaWdub3JlX2NoZWNrX2NvbnN0cmFpbnRzAENIRUNLIGNvbnN0cmFpbnRzAGV4cHJlc3Npb25zIHByb2hpYml0ZWQgaW4gUFJJTUFSWSBLRVkgYW5kIFVOSVFVRSBjb25zdHJhaW50cwBqc29uX29iamVjdCgpIHJlcXVpcmVzIGFuIGV2ZW4gbnVtYmVyIG9mIGFyZ3VtZW50cwBqc29uXyVzKCkgbmVlZHMgYW4gb2RkIG51bWJlciBvZiBhcmd1bWVudHMAJXNfc2VnbWVudHMAdW5hYmxlIHRvIGRlbGV0ZS9tb2RpZnkgdXNlci1mdW5jdGlvbiBkdWUgdG8gYWN0aXZlIHN0YXRlbWVudHMAdW5hYmxlIHRvIGRlbGV0ZS9tb2RpZnkgY29sbGF0aW9uIHNlcXVlbmNlIGR1ZSB0byBhY3RpdmUgc3RhdGVtZW50cwBvZmZzZXRzAHJldmVyc2VfdW5vcmRlcmVkX3NlbGVjdHMAaWlzc3Nzc3MAaXNzAHVuY29tcHJlc3MAY2Fubm90IG9wZW4gc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IHJlbGVhc2Ugc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IGNvbW1pdCB0cmFuc2FjdGlvbiAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCBWQUNVVU0gLSBTUUwgc3RhdGVtZW50cyBpbiBwcm9ncmVzcwBhY2Nlc3MAcGFyYW1ldGVycwByZWN1cnNpdmVfdHJpZ2dlcnMAdGhlIElOREVYRUQgQlkgY2xhdXNlIGlzIG5vdCBhbGxvd2VkIG9uIFVQREFURSBvciBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAdGhlIE5PVCBJTkRFWEVEIGNsYXVzZSBpcyBub3QgYWxsb3dlZCBvbiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAHF1YWxpZmllZCB0YWJsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgb24gSU5TRVJULCBVUERBVEUsIGFuZCBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAQ2hpbGQgcGFnZSBkZXB0aCBkaWZmZXJzAHVuYWJsZSB0byBjbG9zZSBkdWUgdG8gdW5maW5hbGl6ZWQgc3RhdGVtZW50cyBvciB1bmZpbmlzaGVkIGJhY2t1cHMAYWNvcwBJZlBvcwBjb21waWxlX29wdGlvbnMARElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucwBGSUxURVIgY2xhdXNlIG1heSBvbmx5IGJlIHVzZWQgd2l0aCBhZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucwBub24tZGV0ZXJtaW5pc3RpYyBmdW5jdGlvbnMAaW5kZXggZXhwcmVzc2lvbnMAU0VMRUNUcyB0byB0aGUgbGVmdCBhbmQgcmlnaHQgb2YgJXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJlc3VsdCBjb2x1bW5zAHZpcnR1YWwgdGFibGVzIGNhbm5vdCB1c2UgY29tcHV0ZWQgY29sdW1ucwBnZW5lcmF0ZWQgY29sdW1ucwB0YWJsZSAlcyBoYXMgJWQgdmFsdWVzIGZvciAlZCBjb2x1bW5zAHJhZGlhbnMAYWxsIFZBTFVFUyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHRlcm1zAGVtcHR5X3Jlc3VsdF9jYWxsYmFja3MATG9hZEFuYWx5c2lzAGZsZ3MAZmxhZ3MAdmZzACVkIGNvbHVtbnMgYXNzaWduZWQgJWQgdmFsdWVzAEpTT04gY2Fubm90IGhvbGQgQkxPQiB2YWx1ZXMAZmFpbGVkIG1lbW9yeSByZXNpemUgJXUgdG8gJXUgYnl0ZXMAcGFydGlhbCBpbmRleCBXSEVSRSBjbGF1c2VzAHNob3J0X2NvbHVtbl9uYW1lcwBmdWxsX2NvbHVtbl9uYW1lcwB1bmFibGUgdG8gb3BlbiBhIHRlbXBvcmFyeSBkYXRhYmFzZSBmaWxlIGZvciBzdG9yaW5nIHRlbXBvcmFyeSB0YWJsZXMAY2Fubm90IGNyZWF0ZSB0cmlnZ2VycyBvbiB2aXJ0dWFsIHRhYmxlcwAlcyBSRVRVUk5JTkcgaXMgbm90IGF2YWlsYWJsZSBvbiB2aXJ0dWFsIHRhYmxlcwBjYW5ub3Qgam9pbiB1c2luZyBjb2x1bW4gJXMgLSBjb2x1bW4gbm90IHByZXNlbnQgaW4gYm90aCB0YWJsZXMAQVVUT0lOQ1JFTUVOVCBub3QgYWxsb3dlZCBvbiBXSVRIT1VUIFJPV0lEIHRhYmxlcwAlcyBjYW5ub3QgdXNlIHZhcmlhYmxlcwB0b28gbWFueSBTUUwgdmFyaWFibGVzAHN1YnF1ZXJpZXMAY2Fubm90IHVzZSB3aW5kb3cgZnVuY3Rpb25zIGluIHJlY3Vyc2l2ZSBxdWVyaWVzAGNvdW50X2NoYW5nZXMAdG90YWxfY2hhbmdlcwBkZWdyZWVzAFJFVFVSTklORyBtYXkgbm90IHVzZSAiVEFCTEUuKiIgd2lsZGNhcmRzAHRocmVhZHMAYWJzAC4lLipzAENSRUFURSAlcyAlLipzAENSRUFURSVzIElOREVYICUuKnMAaW52YWxpZCB1cmkgYXV0aG9yaXR5OiAlLipzAHVua25vd24gdGFibGUgb3B0aW9uOiAlLipzAG5vIHN1Y2ggZnVuY3Rpb246ICUuKnMAJS4qcyVzACwlcyVzJXMAU0NBTiAlcyVzJXMAaGV4IGxpdGVyYWwgdG9vIGJpZzogJXMlcwBzcWxpdGVfYWx0ZXJ0YWJfJXMAU0NBTiAlZCBDT05TVEFOVCBST1clcwAlUSVzACBWSVJUVUFMIFRBQkxFIElOREVYICVkOiVzACVzOiAlcy4lcy4lcwBOVUxMIHZhbHVlIGluICVzLiVzACVzOiAlcy4lcwBubyBzdWNoIHRhYmxlIGNvbHVtbjogJXMuJXMAJS4xOHMtJXMAdXNlIERST1AgVklFVyB0byBkZWxldGUgdmlldyAlcwBpbGxlZ2FsIGZpcnN0IGFyZ3VtZW50IHRvICVzAG1pc3VzZSBvZiBhbGlhc2VkIHdpbmRvdyBmdW5jdGlvbiAlcwB0b28gbWFueSBjb2x1bW5zIG9uICVzAHRvbyBtYW55IGNvbHVtbnMgaW4gJXMAJXMgcHJvaGliaXRlZCBpbiAlcwBDSEVDSyBjb25zdHJhaW50IGZhaWxlZCBpbiAlcwBub24tZGV0ZXJtaW5pc3RpYyB1c2Ugb2YgJXMoKSBpbiAlcwByZWNvdmVyZWQgJWQgcGFnZXMgZnJvbSAlcwBtaXN1c2Ugb2YgYWxpYXNlZCBhZ2dyZWdhdGUgJXMAJXMgJVQgY2Fubm90IHJlZmVyZW5jZSBvYmplY3RzIGluIGRhdGFiYXNlICVzAGNhbm5vdCBkZXRhY2ggZGF0YWJhc2UgJXMAYSBKT0lOIGNsYXVzZSBpcyByZXF1aXJlZCBiZWZvcmUgJXMAY2Fubm90IG9wZW4gdmFsdWUgb2YgdHlwZSAlcwBjYW5ub3QgZnN0YXQgZGIgZmlsZSAlcwByZWNvdmVyZWQgJWQgZnJhbWVzIGZyb20gV0FMIGZpbGUgJXMAUFJJTUFSWSBLRVkgbWlzc2luZyBvbiB0YWJsZSAlcwB1c2UgRFJPUCBUQUJMRSB0byBkZWxldGUgdGFibGUgJXMAU0VMRUNUICVzIE9SREVSIEJZIHJvd2lkICVzAFNFTEVDVCAlcyBXSEVSRSByb3dpZCBCRVRXRUVOICVsbGQgQU5EICVsbGQgT1JERVIgQlkgcm93aWQgJXMAdGhlcmUgaXMgYWxyZWFkeSBhbiBpbmRleCBuYW1lZCAlcwB0YWJsZSAlUyBoYXMgbm8gY29sdW1uIG5hbWVkICVzAHRoZXJlIGlzIGFscmVhZHkgYSB0YWJsZSBuYW1lZCAlcwBzdGF0ZW1lbnQgYWJvcnRzIGF0ICVkOiBbJXNdICVzAENPVkVSSU5HIElOREVYICVzAFNFTEVDVCAlcwB1bnN1cHBvcnRlZCB1c2Ugb2YgTlVMTFMgJXMAVVNFIFRFTVAgQi1UUkVFIEZPUiAlcwAtLSBUUklHR0VSICVzACV6OiAlcwByZWN1cnNpdmUgcmVmZXJlbmNlIGluIGEgc3VicXVlcnk6ICVzAHZ0YWJsZSBjb25zdHJ1Y3RvciBjYWxsZWQgcmVjdXJzaXZlbHk6ICVzAG5vIHN1Y2ggaW5kZXg6ICVzAG5vIHN1Y2ggd2luZG93OiAlcwBjYW5ub3Qgb3ZlcnJpZGUgJXMgb2Ygd2luZG93OiAlcwBjYW5ub3Qgb3BlbiB2aWV3OiAlcwBubyBzdWNoIHNhdmVwb2ludDogJXMAbm8gc3VjaCB2ZnM6ICVzAG11bHRpcGxlIHJlY3Vyc2l2ZSByZWZlcmVuY2VzOiAlcwBlcnJvciBpbiAlcyAlcyVzJXM6ICVzAGVycm9yIGluICVzICVzIGFmdGVyICVzOiAlcwB1bmtub3duIHRva2VuaXplcjogJXMAZXJyb3IgcGFyc2luZyBwcmVmaXggcGFyYW1ldGVyOiAlcwB1bnJlY29nbml6ZWQgcGFyYW1ldGVyOiAlcwB1bnJlY29nbml6ZWQgb3JkZXI6ICVzAHVucmVjb2duaXplZCBtYXRjaGluZm86ICVzAG5vdCBhdXRob3JpemVkIHRvIHVzZSBmdW5jdGlvbjogJXMAbm8gc3VjaCBjb2x1bW46ICVzAGZpbGUgcmVuYW1lZCB3aGlsZSBvcGVuOiAlcwBmaWxlIHVubGlua2VkIHdoaWxlIG9wZW46ICVzAHVuc3VwcG9ydGVkIGVuY29kaW5nOiAlcwBjYW5ub3QgbGltaXQgV0FMIHNpemU6ICVzAE1KIGRlbGV0ZTogJXMAdGFyZ2V0IG9iamVjdC9hbGlhcyBtYXkgbm90IGFwcGVhciBpbiBGUk9NIGNsYXVzZTogJXMAb2JqZWN0IG5hbWUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogJXMAdW5rbm93biBkYXRhYmFzZTogJXMAdW5hYmxlIHRvIG9wZW4gZGF0YWJhc2U6ICVzAG5vIHN1Y2ggZGF0YWJhc2U6ICVzAHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciB0YWJsZSBvciBpbmRleCB3aXRoIHRoaXMgbmFtZTogJXMAZHVwbGljYXRlIGNvbHVtbiBuYW1lOiAlcwBkdXBsaWNhdGUgV0lUSCB0YWJsZSBuYW1lOiAlcwBubyBzdWNoIG1vZHVsZTogJXMAbXVsdGlwbGUgbGlua3MgdG8gZmlsZTogJXMAY2Fubm90IG9wZW4gdmlydHVhbCB0YWJsZTogJXMAbm8gc3VjaCB0YWJsZTogJXMAbXVsdGlwbGUgcmVmZXJlbmNlcyB0byByZWN1cnNpdmUgdGFibGU6ICVzAG5vIHN1Y2ggJXMgbW9kZTogJXMATUogY29sbGlkZTogJXMAbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6ICVzAGNpcmN1bGFyIHJlZmVyZW5jZTogJXMAY2Fubm90IG9wZW4gdGFibGUgd2l0aG91dCByb3dpZDogJXMAJXMgbW9kZSBub3QgYWxsb3dlZDogJXMAdnRhYmxlIGNvbnN0cnVjdG9yIGZhaWxlZDogJXMAYXV0b21hdGljIGV4dGVuc2lvbiBsb2FkaW5nIGZhaWxlZDogJXMAZGF0YWJhc2UgdGFibGUgaXMgbG9ja2VkOiAlcwBkYXRhYmFzZSBzY2hlbWEgaXMgbG9ja2VkOiAlcwB2dGFibGUgY29uc3RydWN0b3IgZGlkIG5vdCBkZWNsYXJlIHNjaGVtYTogJXMAYWJvcnQgYXQgJWQgaW4gWyVzXTogJXMALS0gJXMAJXogLSAlcwBvc191bml4LmM6JWQ6ICglZCkgJXMoJXMpIC0gJXMAaG91cgByaWdodHN0cgBsZWZ0c3RyAGluc3RyAHN1YnN0cgBleHByX2ltcGxpZXNfZXhwcgBpbnZhbGlkIGFyZ3VtZW50cyB0byBmdHM0YXV4IGNvbnN0cnVjdG9yAG1pc3NpbmcgJXMgcGFyYW1ldGVyIGluIGZ0czQgY29uc3RydWN0b3IAdGhlICIuIiBvcGVyYXRvcgBmdHMzY3Vyc29yAG5lYXIgIiVUIjogc3ludGF4IGVycm9yAHVua25vd24gZXJyb3IAZG9tYWluIGVycm9yAG5vdCBhbiBlcnJvcgBTUUwgbG9naWMgZXJyb3IAZGlzayBJL08gZXJyb3IAZmxvb3IAcm1kaXIAbWtkaXIAc2VnZGlyAGZ0czNfdG9rZW5pemVyAHVua25vd24gdG9rZW5pemVyAHBvd2VyAGxvd2VyAHNxbGl0ZV90ZW1wX21hc3RlcgBzcWxpdGVfbWFzdGVyAHBvcnRlcgBSZXNldFNvcnRlcgBGa0NvdW50ZXIAQVBJIGNhbGwgd2l0aCAlcyBkYXRhYmFzZSBjb25uZWN0aW9uIHBvaW50ZXIAc3RyZmlsdGVyAFZGaWx0ZXIARVNDQVBFIGV4cHJlc3Npb24gbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIAdXBwZXIAcHJvcGVyAElmU21hbGxlcgBjYW5ub3QgdXNlIFJFVFVSTklORyBpbiBhIHRyaWdnZXIARHJvcFRyaWdnZXIAc2Vjb25kIGFyZ3VtZW50IHRvIG50aF92YWx1ZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcgBhcmd1bWVudCBvZiBudGlsZSBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcgBmcmFtZSBzdGFydGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyAGZyYW1lIGVuZGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyAEludGVnZXIAUm93aWQgJWxsZCBvdXQgb2Ygb3JkZXIAUmVtYWluZGVyAGZyYW1lIHN0YXJ0aW5nIG9mZnNldCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcgBmcmFtZSBlbmRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyAGFkZHIAcGFkcgBjaGFyAHllYXIAQ2xlYXIAQml0T3IAc2VxAENvbGxTZXEARWxzZUVxAHJlZ2V4cABPcGVuRHVwAE5vb3AASnVtcAAvdXNyL3RtcAAvdmFyL3RtcAB0ZW1wAGN1cnJlbnRfdGltZXN0YW1wAEFnZ1N0ZXAAbW9kZVN0ZXAAdmFyaWFuY2VTdGVwAG11bm1hcABtbWFwAG1yZW1hcAB2dGFiOiVwAEdvdG8AaW50bwBpbmNyZW1lbnRhbF92YWN1dW0gZW5hYmxlZCB3aXRoIGEgbWF4IHJvb3RwYWdlIG9mIHplcm8ASWZOb3RaZXJvAERlY3JKdW1wWmVybwBGa0lmWmVybwBzZXFubwBpbmRleF94aW5mbwB0YWJsZV94aW5mbwBtYXRjaGluZm8AaW5kZXhfaW5mbwB0YWJsZV9pbmZvAE9wZW5Qc2V1ZG8AZmNob3duAFJldHVybgBqc29uAG5vIHF1ZXJ5IHNvbHV0aW9uAGluZGV4IGNvcnJ1cHRpb24AZGF0YWJhc2UgY29ycnVwdGlvbgBmcmVlIHNwYWNlIGNvcnJ1cHRpb24AdW5rbm93biBjb2x1bW4gIiVzIiBpbiBmb3JlaWduIGtleSBkZWZpbml0aW9uACVzLnhCZXN0SW5kZXggbWFsZnVuY3Rpb24AYXV0aG9yaXplciBtYWxmdW5jdGlvbgAlLipzKCkgbWF5IG5vdCBiZSB1c2VkIGFzIGEgd2luZG93IGZ1bmN0aW9uACclcycgaXMgbm90IGEgZnVuY3Rpb24ARnVuY3Rpb24AY2Fubm90IHN0YXJ0IGEgdHJhbnNhY3Rpb24gd2l0aGluIGEgdHJhbnNhY3Rpb24AY2Fubm90IGNoYW5nZSAlcyB3YWwgbW9kZSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uAHRlbXBvcmFyeSBzdG9yYWdlIGNhbm5vdCBiZSBjaGFuZ2VkIGZyb20gd2l0aGluIGEgdHJhbnNhY3Rpb24AY2Fubm90IFZBQ1VVTSBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uAFNhZmV0eSBsZXZlbCBtYXkgbm90IGJlIGNoYW5nZWQgaW5zaWRlIGEgdHJhbnNhY3Rpb24AVHJhbnNhY3Rpb24AUGVybXV0YXRpb24AdW5rbm93biBvcGVyYXRpb24AdW5zdXBwb3J0ZWQgZnJhbWUgc3BlY2lmaWNhdGlvbgBSQU5HRSB3aXRoIG9mZnNldCBQUkVDRURJTkcvRk9MTE9XSU5HIHJlcXVpcmVzIG9uZSBPUkRFUiBCWSBleHByZXNzaW9uAHRvbyBtYW55IGxldmVscyBvZiB0cmlnZ2VyIHJlY3Vyc2lvbgB1c2VyX3ZlcnNpb24Ac3FsaXRlX3ZlcnNpb24AZGF0YV92ZXJzaW9uAHNjaGVtYV92ZXJzaW9uAHNxbGl0ZV9kcm9wX2NvbHVtbgBzcWxpdGVfcmVuYW1lX2NvbHVtbgBhZnRlciBkcm9wIGNvbHVtbgBubyBzdWNoIGNvbHVtbgBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1nZW5lcmF0ZWQgY29sdW1uAGNhbm5vdCB1c2UgREVGQVVMVCBvbiBhIGdlbmVyYXRlZCBjb2x1bW4AQ2Fubm90IGFkZCBhIFBSSU1BUlkgS0VZIGNvbHVtbgBDYW5ub3QgYWRkIGEgVU5JUVVFIGNvbHVtbgBjYW5ub3QgYWRkIGEgU1RPUkVEIGNvbHVtbgBWQ29sdW1uAGJ1aWx0aW4AYXNpbgBjYW5ub3QgaGF2ZSBib3RoIE9OIGFuZCBVU0lORyBjbGF1c2VzIGluIHRoZSBzYW1lIGpvaW4AYXQgbW9zdCAlZCB0YWJsZXMgaW4gYSBqb2luAG1pbgBvcmlnaW4AVkJlZ2luAG1haW4ARXhwbGFpbgBzaWduAG9wZW4ASWZOb3RPcGVuAFNvcnRlck9wZW4AVk9wZW4AaGlkZGVuAGF0YW4AbWVkaWFuAFNlZWtTY2FuAGF1dG9fdmFjdXVtAGluY3JlbWVudGFsX3ZhY3V1bQBJbmNyVmFjdXVtAHN1bQBkcm9wIGNvbHVtbiBmcm9tAC9kZXYvdXJhbmRvbQBBZGRJbW0AcnRyaW0AbHRyaW0AcmVhZG9ubHlfc2htACVzLXNobQBSQUlTRSgpIG1heSBvbmx5IGJlIHVzZWQgd2l0aGluIGEgdHJpZ2dlci1wcm9ncmFtAFByb2dyYW0AUGFyYW0AZmNudGwAaW9jdGwAbG9ja2luZyBwcm90b2NvbABub3RudWxsAGlmbnVsbAAvZGV2L251bGwAZGF0YWJhc2Ugb3IgZGlzayBpcyBmdWxsAE5vdE51bGwAU29mdE51bGwASXNOdWxsAFplcm9Pck51bGwASGFsdElmTnVsbABjb2xsAGNhY2hlX3NwaWxsAFJvd0NlbGwAY2VpbABkZXRhaWwAcGFkbAB1bml4LWV4Y2wAdGJsAHdhbAB0b3RhbABpbmNyZW1lbnRhbABPcGVuRXBoZW1lcmFsAEFnZ0ZpbmFsAG5vcm1hbABJbmRleCBhbHJlYWR5IG9wdGltYWwAcGFydGlhbAByZWFsAFJlYWwAcGsAb2sAdW5saW5rAHJlYWRsaW5rAEZpbmlzaFNlZWsARGVmZXJyZWRTZWVrAG5vbG9jawBDdXJzb3JVbmxvY2sAYmxvY2sAJXMubG9jawBDdXJzb3JMb2NrAFRhYmxlTG9jawBpbnRlZ3JpdHlfY2hlY2sAZm9yZWlnbl9rZXlfY2hlY2sAcXVpY2tfY2hlY2sAY2VsbF9zaXplX2NoZWNrAGludGVncml0eS1jaGVjawBJbnRlZ3JpdHlDawBpc3Npc2kAaXNpc2kAcGkAc2lzc2lpAGlzc2lzaWkAY290aABtb250aABqc29uX2FycmF5X2xlbmd0aABvdmVyZmxvdyBsaXN0IGxlbmd0aAB3ZHRoAHN0YXRfcHVzaABhY29zaABhc2luaABhdGFuaABqc29uX3BhdGNoAGRhdGF0eXBlIG1pc21hdGNoAGFyZ3VtZW50IHR5cGUgbWlzbWF0Y2gAYWJicmV2aWF0ZWQgcXVlcnkgYWxnb3JpdGhtIHNlYXJjaAB1bml4ZXBvY2gAc3FsaXRlX2F0dGFjaABzcWxpdGVfZGV0YWNoAGpzb25fZWFjaABhdmcAbmFyZwBzcWxpdGVfbG9nAHN0YXRlbWVudCB0b28gbG9uZwBjYW5ub3Qgb3BlbiAlcyBjb2x1bW4gZm9yIHdyaXRpbmcAc3Vic3RyaW5nAFN0cmluZwBzcWxpdGVfcmV0dXJuaW5nAGVuY29kaW5nAHN0cmluZyBvciBibG9iIHRvbyBiaWcAUmVsZWFzZVJlZwAlLjE2ZwAlIS4xNWcAcHJpbnRmAHR5cGVvZgBtb2Rlb2YAb3V0IG9mAHJlbmFtZSBjb2x1bW5zIG9mAG51bGxpZgBpaWYAb2ZmADAxMjM0NTY3ODlhYmNkZWYASWYAJTA2LjNmACUuKmYAZ2V0cGFnZXNpemUAZG9jc2l6ZQBtbWFwX3NpemUAZGVmYXVsdF9jYWNoZV9zaXplAFBSQUdNQSAlUS5wYWdlX3NpemUAZnRzM3Rva2VuaXplAG9wdGltaXplAGpzb25fcmVtb3ZlAE1vdmUAY2Fubm90IGNvbW1pdCAtIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQBjYW5ub3Qgcm9sbGJhY2sgLSBubyB0cmFuc2FjdGlvbiBpcyBhY3RpdmUAZXhjbHVzaXZlAHRydWUASXNUcnVlAHVuaXF1ZQBkZmx0X3ZhbHVlAENhbm5vdCBhZGQgYSBSRUZFUkVOQ0VTIGNvbHVtbiB3aXRoIG5vbi1OVUxMIGRlZmF1bHQgdmFsdWUAQWdnVmFsdWUAbWludXRlAGpzb25fcXVvdGUAcHdyaXRlAE9wZW5Xcml0ZQBvbl9kZWxldGUAc2VjdXJlX2RlbGV0ZQBJZHhEZWxldGUAcHJpdmF0ZQBhZ2dyZWdhdGUAVkNyZWF0ZQBvbl91cGRhdGUAVlVwZGF0ZQBjdXJyZW50X2RhdGUAZmFsbG9jYXRlAGZ0cnVuY2F0ZQByZXBsaWNhdGUAYmFkIHBhcmFtZXRlciBvciBvdGhlciBBUEkgbWlzdXNlAHRvbyBtYW55IHRlcm1zIGluICVzIEJZIGNsYXVzZQB0b28gbWFueSB0ZXJtcyBpbiBPUkRFUiBCWSBjbGF1c2UAYWdncmVnYXRlIGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgaW4gdGhlIEdST1VQIEJZIGNsYXVzZQBQQVJUSVRJT04gY2xhdXNlAGEgTkFUVVJBTCBqb2luIG1heSBub3QgaGF2ZSBhbiBPTiBvciBVU0lORyBjbGF1c2UAZGF0YWJhc2UgJXMgaXMgYWxyZWFkeSBpbiB1c2UAQWdnSW52ZXJzZQByZXZlcnNlAGNsb3NlAENsb3NlAGZhbHNlAGF0dGVtcHQgdG8gd3JpdGUgYSByZWFkb25seSBkYXRhYmFzZQBjb3JydXB0IGRhdGFiYXNlAGF0dGFjaGVkIGRhdGFiYXNlcyBtdXN0IHVzZSB0aGUgc2FtZSB0ZXh0IGVuY29kaW5nIGFzIG1haW4gZGF0YWJhc2UAZmlsZSBpcyBub3QgYSBkYXRhYmFzZQB0ZW1wX3N0b3JlACVzIGNsYXVzZSBzaG91bGQgY29tZSBhZnRlciAlcyBub3QgYmVmb3JlAEV4cGlyZQBzcXVhcmUAZXhwcl9jb21wYXJlAFNvcnRlckNvbXBhcmUAanNvbl90eXBlAElmTm9Ib3BlAHVuaXgtbm9uZQBJbml0Q29yb3V0aW5lAEVuZENvcm91dGluZQBsb2NhbHRpbWUAc3RyZnRpbWUAZGF0ZXRpbWUAY3VycmVudF90aW1lAGFmdGVyIHJlbmFtZQBub24tdGV4dCBmaWxlbmFtZQBWUmVuYW1lAGFtYmlndW91cyBjb2x1bW4gbmFtZQB0ZW1wb3JhcnkgdHJpZ2dlciBtYXkgbm90IGhhdmUgcXVhbGlmaWVkIG5hbWUAc2ltcGxlAGxvd2VyX3F1YXJ0aWxlAHVwcGVyX3F1YXJ0aWxlAHVuaXgtZG90ZmlsZQBjYW5ub3Qgb3BlbiBmaWxlAHVuYWJsZSB0byBvcGVuIGRhdGFiYXNlIGZpbGUAaW1tdXRhYmxlAEFib3J0YWJsZQBsZWdhY3lfYWx0ZXJfdGFibGUAc3FsaXRlX3JlbmFtZV90YWJsZQBjYW5ub3QgY3JlYXRlIHRyaWdnZXIgb24gc3lzdGVtIHRhYmxlAHZpcnR1YWwgdGFibGUAbm8gc3VjaCB0YWJsZQBudW1iZXIgb2YgY29sdW1ucyBpbiBmb3JlaWduIGtleSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUAbG9jYWwgdGltZSB1bmF2YWlsYWJsZQBhbm90aGVyIHJvdyBhdmFpbGFibGUAbm8gbW9yZSByb3dzIGF2YWlsYWJsZQBWYXJpYWJsZQBEcm9wVGFibGUAdXRmMTZsZQBVVEYxNmxlAFVURi0xNmxlAGNhc2Vfc2Vuc2l0aXZlX2xpa2UAU2V0Q29va2llAFJlYWRDb29raWUAY2FjaGUAY29sdW1uIGluZGV4IG91dCBvZiByYW5nZQBub3RpZmljYXRpb24gbWVzc2FnZQB3YXJuaW5nIG1lc3NhZ2UAaW52YWxpZCByb290cGFnZQBFeHRlbmRzIG9mZiBlbmQgb2YgcGFnZQBqc29uX3RyZWUAQ3JlYXRlQnRyZWUAam91cm5hbF9tb2RlAGxvY2tpbmdfbW9kZQBvcGNvZGUAdW5pY29kZQBKb3VybmFsTW9kZQBEaXZpZGUAY29hbGVzY2UAc3FsaXRlX3NlcXVlbmNlAFNlcXVlbmNlAGRpZmZlcmVuY2UAdmFyaWFuY2UAT25jZQBUcmFjZQBqc29uX3JlcGxhY2UAdXRmMTZiZQBVVEYxNmJlAFVURi0xNmJlAE5lAExlAEdlADIwYzoyMGUAMjBiOjIwZQAlIS4yMGUAZ2V0Y3dkAE1ha2VSZWNvcmQAdGhzdG5kcmQAbGlrZWxpaG9vZABmY2htb2QAcm91bmQATm90Rm91bmQAc2Vjb25kAFJld2luZABTZWVrRW5kAEJpdEFuZABvbGQAJWxsZCAlbGxkAG5vIHN1Y2ggcm93aWQ6ICVsbGQAcmVidWlsZABZaWVsZABsYXN0X2luc2VydF9yb3dpZAAlcy5yb3dpZABTRUxFQ1QqRlJPTSIldyIuJXMgT1JERVIgQlkgcm93aWQAU0VMRUNUKkZST00iJXciLiVzIFdIRVJFICVzIE9SREVSIEJZIHJvd2lkAElkeFJvd2lkAE5ld1Jvd2lkAFNlZWtSb3dpZABnZXRldWlkAGludmFsaWQAanNvbl92YWxpZABma2lkAF9fbGFuZ2lkACV6LCBsYW5naWQAbGFuZ3VhZ2VpZABkb2NpZABhcHBsaWNhdGlvbl9pZABzcWxpdGVfc291cmNlX2lkAG5vdCBhdXRob3JpemVkAEluZGV4IG9wdGltaXplZABub3RpbmRleGVkAHVuYWJsZSB0byBpZGVudGlmeSB0aGUgb2JqZWN0IHRvIGJlIHJlaW5kZXhlZAB2aWV3cyBtYXkgbm90IGJlIGluZGV4ZWQAdmlydHVhbCB0YWJsZXMgbWF5IG5vdCBiZSBpbmRleGVkAHRhYmxlICVzIG1heSBub3QgYmUgaW5kZXhlZAByZWFkX3VuY29tbWl0dGVkAFJJR0hUIGFuZCBGVUxMIE9VVEVSIEpPSU5zIGFyZSBub3QgY3VycmVudGx5IHN1cHBvcnRlZAByZWN1cnNpdmUgYWdncmVnYXRlIHF1ZXJpZXMgbm90IHN1cHBvcnRlZABxdWVyeSBhYm9ydGVkAHJvd3MgaW5zZXJ0ZWQAaW50ZXJydXB0ZWQAY2hlY2twb2ludGVkAGFjY2VzcyB0byAleiBpcyBwcm9oaWJpdGVkAGFjY2VzcyB0byB2aWV3ICIlcyIgcHJvaGliaXRlZAByb3dzIGRlbGV0ZWQAcm93cyB1cGRhdGVkAG5vdHVzZWQAcm93IHZhbHVlIG1pc3VzZWQAc3FsaXRlX2NvbXBpbGVvcHRpb25fdXNlZABQYWdlICVkIGlzIG5ldmVyIHVzZWQAQ29sdW1uc1VzZWQAdmlydHVhbCB0YWJsZXMgbWF5IG5vdCBiZSBhbHRlcmVkAHZpZXcgJXMgbWF5IG5vdCBiZSBhbHRlcmVkAHRhYmxlICVzIG1heSBub3QgYmUgYWx0ZXJlZABzaGFyZWQAaW5kZXggYXNzb2NpYXRlZCB3aXRoIFVOSVFVRSBvciBQUklNQVJZIEtFWSBjb25zdHJhaW50IGNhbm5vdCBiZSBkcm9wcGVkAHRhYmxlICVzIG1heSBub3QgYmUgZHJvcHBlZAB2aWV3ICVzIGlzIGNpcmN1bGFybHkgZGVmaW5lZAB1bm9wZW5lZABkYXRhYmFzZSBkaXNrIGltYWdlIGlzIG1hbGZvcm1lZAAlcyBjb25zdHJhaW50IGZhaWxlZABGT1JFSUdOIEtFWSBjb25zdHJhaW50IGZhaWxlZABsYXJnZSBmaWxlIHN1cHBvcnQgaXMgZGlzYWJsZWQAZnRzM3Rva2VuaXplIGRpc2FibGVkAGRhdGFiYXNlICVzIGlzIGxvY2tlZABkYXRhYmFzZSBpcyBsb2NrZWQAZGF0YWJhc2UgdGFibGUgaXMgbG9ja2VkAGF1dGhvcml6YXRpb24gZGVuaWVkAGFjY2VzcyBwZXJtaXNzaW9uIGRlbmllZAB0YWJsZSAlUyBoYXMgJWQgY29sdW1ucyBidXQgJWQgdmFsdWVzIHdlcmUgc3VwcGxpZWQAdGVtcG9yYXJ5IHRhYmxlIG5hbWUgbXVzdCBiZSB1bnF1YWxpZmllZAB0YWJsZSAlcyBtYXkgbm90IGJlIG1vZGlmaWVkAGNvbmZsaWN0aW5nIE9OIENPTkZMSUNUIGNsYXVzZXMgc3BlY2lmaWVkAG5vIHRhYmxlcyBzcGVjaWZpZWQAZGF0YWJhc2UgaXMgYWxyZWFkeSBhdHRhY2hlZABkYXRhYmFzZSBzY2hlbWEgaGFzIGNoYW5nZWQAZXhjbHVkZWQAUG9pbnRlciBtYXAgcGFnZSAlZCBpcyByZWZlcmVuY2VkAFJvd1NldEFkZABwcmVhZABSb3dTZXRSZWFkAE9wZW5SZWFkACUwNGQAJTAzZAAlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZAAlMDRkLSUwMmQtJTAyZAA0MGYtMjFhLTIxZABzcWxpdGVfc3RhdCVkAGNvbHVtbiVkAHNxbGl0ZV9hdXRvaW5kZXhfJXNfJWQAdmFyaWFibGUgbnVtYmVyIG11c3QgYmUgYmV0d2VlbiA/MSBhbmQgPyVkAEZhaWxlZCB0byByZWFkIHB0cm1hcCBrZXk9JWQAdW5hYmxlIHRvIGdldCB0aGUgcGFnZS4gZXJyb3IgY29kZT0lZABPZmZzZXQgJWQgb3V0IG9mIHJhbmdlICVkLi4lZABrKCVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCByb290cGFnZT0lZCBXSEVSRSAjJWQgQU5EIHJvb3RwYWdlPSMlZABVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgdHlwZT0nJXMnLCBuYW1lPSVRLCB0YmxfbmFtZT0lUSwgcm9vdHBhZ2U9IyVkLCBzcWw9JVEgV0hFUkUgcm93aWQ9IyVkAFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCB0eXBlPSd0YWJsZScsIG5hbWU9JVEsIHRibF9uYW1lPSVRLCByb290cGFnZT0wLCBzcWw9JVEgV0hFUkUgcm93aWQ9IyVkAHRvbyBtYW55IGF0dGFjaGVkIGRhdGFiYXNlcyAtIG1heCAlZAB0b28gbWFueSBhcmd1bWVudHMgb24gJXMoKSAtIG1heCAlZABleHBlY3RlZCAlZCBjb2x1bW5zIGZvciAnJXMnIGJ1dCBnb3QgJWQAYXR0ZW1wdCB0byBvcGVuICIlcyIgYXMgZmlsZSBkZXNjcmlwdG9yICVkAGludmFsaWQgcGFnZSBudW1iZXIgJWQAZmFpbGVkIHRvIGdldCBwYWdlICVkADJuZCByZWZlcmVuY2UgdG8gcGFnZSAlZABmcmVlbGlzdCBsZWFmIGNvdW50IHRvbyBiaWcgb24gcGFnZSAlZABidHJlZUluaXRQYWdlKCkgcmV0dXJucyBlcnJvciBjb2RlICVkACVzIGlzICVkIGJ1dCBzaG91bGQgYmUgJWQAJXIgJXMgQlkgdGVybSBvdXQgb2YgcmFuZ2UgLSBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAlZABzdWItc2VsZWN0IHJldHVybnMgJWQgY29sdW1ucyAtIGV4cGVjdGVkICVkACVzTElTVCBTVUJRVUVSWSAlZABSRVVTRSBMSVNUIFNVQlFVRVJZICVkACVzU0NBTEFSIFNVQlFVRVJZICVkAFJFVVNFIFNVQlFVRVJZICVkAElOREVYICVkAHRvbyBtYW55IEZST00gY2xhdXNlIHRlcm1zLCBtYXg6ICVkAHJ3YwB1dGMAZGVzYwBhc2MAY2hlY2twb2ludF9mdWxsZnN5bmMAZnVsbF9mc3luYwBjaGFyaW5kZXhGdW5jAHNxcnRGdW5jAGNvdEZ1bmMAcmlnaHRGdW5jAGxlZnRGdW5jAGFjb3NGdW5jAGZsb29yRnVuYwBwb3dlckZ1bmMAc3RyZmlsdGVyRnVuYwBwcm9wZXJGdW5jAHBhZHJGdW5jAGV4cEZ1bmMAYXNpbkZ1bmMAc2lnbkZ1bmMAYXRhbkZ1bmMAY2VpbEZ1bmMAcGFkbEZ1bmMAY290aEZ1bmMAYWNvc2hGdW5jAGFzaW5oRnVuYwBhdGFuaEZ1bmMAbG9nRnVuYwByYWQyZGVnRnVuYwByZXZlcnNlRnVuYwBQdXJlRnVuYwBzcXVhcmVGdW5jAGRpZmZlcmVuY2VGdW5jAGRlZzJyYWRGdW5jAHBhZGNGdW5jAGF0bjJGdW5jAGxvZzEwRnVuYwBlbmMAMT09YXJnYwBTcWxFeGVjAHBhZGMAJS40YyVzJS4xNmMAc3FsaXRlLXNyYy9zcWxpdGUtYW1hbGdhbWF0aW9uLTMzNjAwMDAvZXh0ZW5zaW9uLWZ1bmN0aW9ucy5jACVzL2V0aWxxc18lbGx4JWMAdW5yZWNvZ25pemVkIG1hdGNoaW5mbyByZXF1ZXN0OiAlYwBHb3N1YgBnbG9iAHplcm9ibG9iAHJhbmRvbWJsb2IAQmxvYgBtZW1kYgBBVFRBQ0ggJVEgQVMgdmFjdXVtX2RiAFJvd0RhdGEAU29ydGVyRGF0YQBzcWxpdGVfdGVtcF9zY2hlbWEAc3FsaXRlX3NjaGVtYQB3cml0YWJsZV9zY2hlbWEAdHJ1c3RlZF9zY2hlbWEAY29ycnVwdCBzY2hlbWEAUGFyc2VTY2hlbWEAc3FsaXRlXwBwcmFnbWFfAFNRTElURV8AX1JPV0lEXwAlcyBhdCBsaW5lICVkIG9mIFslLjEwc10AYmluZCBvbiBhIGJ1c3kgcHJlcGFyZWQgc3RhdGVtZW50OiBbJXNdAG1hbGZvcm1lZCBNQVRDSCBleHByZXNzaW9uOiBbJXNdAFslZF0AW10AWzBdAExFRlQtTU9TVCBTVUJRVUVSWQBDT01QT1VORCBRVUVSWQBnZW5lcmF0ZWQgY29sdW1ucyBjYW5ub3QgYmUgcGFydCBvZiB0aGUgUFJJTUFSWSBLRVkAQVVUT0lOQ1JFTUVOVCBpcyBvbmx5IGFsbG93ZWQgb24gYW4gSU5URUdFUiBQUklNQVJZIEtFWQBkb2NpZCBJTlRFR0VSIFBSSU1BUlkgS0VZAEZPUkVJR04gS0VZAFJJR0hUIFBBUlQgT0YgT1JERVIgQlkAR1JPVVAgQlkAaWlzWABpc2lYAEFVVE9NQVRJQyBQQVJUSUFMIENPVkVSSU5HIElOREVYAEFVVE9NQVRJQyBDT1ZFUklORyBJTkRFWAAtbWolMDZYOSUwMlgAU0NBTiBDT05TVEFOVCBST1cAVklFVwBqc29uX29iamVjdCgpIGxhYmVscyBtdXN0IGJlIFRFWFQARklSU1QATEFTVABFWENFUFQATk9UACBJTlQASWR4TFQAU2Vla0xUAFNFVCBERUZBVUxUAENPTU1JVABMSU1JVABSSUdIVABJZHhHVABTZWVrR1QATEVGVABESVNUSU5DVABSRVNUUklDVABJTlRFUlNFQ1QAdG9vIG1hbnkgdGVybXMgaW4gY29tcG91bmQgU0VMRUNUAHVua25vd24gb3IgdW5zdXBwb3J0ZWQgam9pbiB0eXBlOiAlVCAlVCVzJVQALSVUAHRvbyBtYW55IGFyZ3VtZW50cyBvbiBmdW5jdGlvbiAlVAB1bmtub3duIGRhdGFiYXNlICVUAGZvcmVpZ24ga2V5IG9uICVzIHNob3VsZCByZWZlcmVuY2Ugb25seSBvbmUgY29sdW1uIG9mIHRhYmxlICVUAENSRUFURSBWSVJUVUFMIFRBQkxFICVUAElOUwBFTkFCTEVfRlRTM19QQVJFTlRIRVNJUwBESVNBQkxFX0xGUwAlcyAlUwBubyBzdWNoIGluZGV4OiAlUwBjYW5ub3QgY3JlYXRlICVzIHRyaWdnZXIgb24gdmlldzogJVMAbm8gc3VjaCB0cmlnZ2VyOiAlUwBjYW5ub3QgY3JlYXRlIElOU1RFQUQgT0YgdHJpZ2dlciBvbiB0YWJsZTogJVMATUFURVJJQUxJWkUgJSFTAENPLVJPVVRJTkUgJSFTAFVTSU5HIElOREVYICVzIEZPUiBJTi1PUEVSQVRPUgBVU0lORyBST1dJRCBTRUFSQ0ggT04gVEFCTEUgJXMgRk9SIElOLU9QRVJBVE9SAE1VTFRJLUlOREVYIE9SAFNRTElURV9UTVBESVIAQUZURVIASU5URUdFUgBPUkRFUgBORUFSAERFTEVURSBGUk9NICVRLiVzIFdIRVJFICVzPSVRAG5hbWU9JVEgQU5EIHNxbD0lUQBERUxFVEUgRlJPTSAlUS5zcWxpdGVfc2VxdWVuY2UgV0hFUkUgbmFtZT0lUQAsIHguJVEAU0VMRUNUICogRlJPTSAlUS4lUQBVUERBVEUgIiV3Ii5zcWxpdGVfc2VxdWVuY2Ugc2V0IG5hbWUgPSAlUSBXSEVSRSBuYW1lID0gJVEAVVBEQVRFICIldyIuc3FsaXRlX21hc3RlciBTRVQgc3FsID0gcHJpbnRmKCclJS4lZHMsICcsc3FsKSB8fCAlUSB8fCBzdWJzdHIoc3FsLDErbGVuZ3RoKHByaW50ZignJSUuJWRzJyxzcWwpKSkgV0hFUkUgdHlwZSA9ICd0YWJsZScgQU5EIG5hbWUgPSAlUQBTRVRVUABHUk9VUABSRUNVUlNJVkUgU1RFUABOYU4AbWFsZm9ybWVkIEpTT04ATk8gQUNUSU9OAE9NSVRfTE9BRF9FWFRFTlNJT04AVU5JT04AQkVHSU4ALGFyZyBISURERU4ALHNjaGVtYSBISURERU4AU0NBTgAgTlVNAFJUUklNAENhbm5vdCBhZGQgYSBOT1QgTlVMTCBjb2x1bW4gd2l0aCBkZWZhdWx0IHZhbHVlIE5VTEwATk9UIE5VTEwAU0VUIE5VTEwAU0VMRUNUIDEgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQ9PyBBTkQgYmxvY2sgSVMgTlVMTABVTklPTiBBTEwAIFJFQUwAQ0hFQ0sAYWJvcnQgZHVlIHRvIFJPTExCQUNLAE1BVENIAFNFQVJDSABhIEdST1VQIEJZIGNsYXVzZSBpcyByZXF1aXJlZCBiZWZvcmUgSEFWSU5HAFVTSU5HAEVOQUJMRV9OT1JNQUxJWkUAIFVOSVFVRQBERUxFVEUAVVBEQVRFAFJFTEVBU0UATk9DQVNFAEJFRk9SRQBDUkUATk9ORQBJZHhMRQBTZWVrTEUAVEFCTEUAMTZMRQBJZHhHRQBTZWVrR0UAJXMgVVNJTkcgVEVNUCBCLVRSRUUAQ0FTQ0FERQAxNkJFAEFORABST1dJRABPSUQAREVTQwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IE9SREVSIEJZIGlkeCBBU0MAU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgP09SREVSIEJZIGxldmVsIERFU0MsIGlkeCBBU0MAU0VMRUNUIGxldmVsLCBpZHgsIGVuZF9ibG9jayBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPyBPUkRFUiBCWSBsZXZlbCBERVNDLCBpZHggQVNDAFNFTEVDVCBpZHggRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbD0/IE9SREVSIEJZIDEgQVNDAFNZU1RFTV9NQUxMT0MAQkJCAFVQREFURSBPUiBGQUlMICVRLiclcV9zZWdkaXInIFNFVCBsZXZlbD0tMSxpZHg9PyBXSEVSRSBsZXZlbD0/IEFORCBpZHg9PwBVUERBVEUgJVEuJyVxX3NlZ2RpcicgU0VUIGlkeCA9ID8gV0hFUkUgbGV2ZWw9PyBBTkQgaWR4PT8AJXM9PwBTRUxFQ1QgJXMgV0hFUkUgcm93aWQ9PwBTRUxFQ1Qgc2l6ZSBGUk9NICVRLiclcV9kb2NzaXplJyBXSEVSRSBkb2NpZD0/AFNFTEVDVCB2YWx1ZSBGUk9NICVRLiclcV9zdGF0JyBXSEVSRSBpZD0/AD8sPyw/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBTRUxFQ1QgbWF4KGxldmVsKSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQgQkVUV0VFTiA/IEFORCA/AFVQREFURSAlUS4nJXFfc2VnZGlyJyBTRVQgc3RhcnRfYmxvY2sgPSA/LCByb290ID0gP1dIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IEFORCBpZHggPSA/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8AU0VMRUNUIGNvdW50KCopIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/AFNFTEVDVCAlcyBXSEVSRSByb3dpZCA9ID8AREVMRVRFIEZST00gJVEuJyVxX2NvbnRlbnQnIFdIRVJFIHJvd2lkID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfZG9jc2l6ZScgV0hFUkUgZG9jaWQgPSA/ACwgPwA8ZXhwcj4APGI+ADxiPi4uLjwvYj4Ac2VwYXJhdG9ycz0AdG9rZW5jaGFycz0AYXV0b21lcmdlPQA+PyBBTkQgcm93aWQ8AElOU0VSVCBJTlRPICVRLnNxbGl0ZV9tYXN0ZXIgVkFMVUVTKCdpbmRleCcsJVEsJVEsIyVkLCVRKTsAQ1JFQVRFIFRBQkxFICVRLiclcV9zZWdtZW50cycoYmxvY2tpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBibG9jayBCTE9CKTsAQ1JFQVRFIFRBQkxFICVRLiclcV9kb2NzaXplJyhkb2NpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLCBzaXplIEJMT0IpOwBDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyAlUS4nJXFfc3RhdCcoaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgdmFsdWUgQkxPQik7AENSRUFURSBUQUJMRSAlUS4nJXFfc2VnZGlyJyhsZXZlbCBJTlRFR0VSLGlkeCBJTlRFR0VSLHN0YXJ0X2Jsb2NrIElOVEVHRVIsbGVhdmVzX2VuZF9ibG9jayBJTlRFR0VSLGVuZF9ibG9jayBJTlRFR0VSLHJvb3QgQkxPQixQUklNQVJZIEtFWShsZXZlbCwgaWR4KSk7AFVQREFURSAlUS5zcWxpdGVfbWFzdGVyIFNFVCB0YmxfbmFtZSA9ICVRLCBuYW1lID0gQ0FTRSBXSEVOIHR5cGU9J3RhYmxlJyBUSEVOICVRIFdIRU4gbmFtZSBMSUtFICdzcWxpdGVYX2F1dG9pbmRleCUlJyBFU0NBUEUgJ1gnICAgICAgQU5EIHR5cGU9J2luZGV4JyBUSEVOICdzcWxpdGVfYXV0b2luZGV4XycgfHwgJVEgfHwgc3Vic3RyKG5hbWUsJWQrMTgpIEVMU0UgbmFtZSBFTkQgV0hFUkUgdGJsX25hbWU9JVEgQ09MTEFURSBub2Nhc2UgQU5EICh0eXBlPSd0YWJsZScgT1IgdHlwZT0naW5kZXgnIE9SIHR5cGU9J3RyaWdnZXInKTsARFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX3NlZ21lbnRzJztEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfc2VnZGlyJztEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfZG9jc2l6ZSc7RFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX3N0YXQnOyVzIERST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9jb250ZW50JzsAQUxURVIgVEFCTEUgJVEuJyVxX2NvbnRlbnQnICBSRU5BTUUgVE8gJyVxX2NvbnRlbnQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc3RhdCcgIFJFTkFNRSBUTyAnJXFfc3RhdCc7AEFMVEVSIFRBQkxFICVRLiclcV9zZWdtZW50cycgUkVOQU1FIFRPICclcV9zZWdtZW50cyc7AEFMVEVSIFRBQkxFICVRLiclcV9zZWdkaXInICAgUkVOQU1FIFRPICclcV9zZWdkaXInOwBBTFRFUiBUQUJMRSAlUS4nJXFfZG9jc2l6ZScgIFJFTkFNRSBUTyAnJXFfZG9jc2l6ZSc7ADptZW1vcnk6AGZpbGU6AFN0cmluZzgAdXRmOABVVEY4AFVURi04AFVURjE2AFVURi0xNgBwNQAyMDIxLTA2LTE4IDE4OjM2OjM5IDVjOWE2YzA2ODcxY2I5ZmU0MjgxNGFmOWMwMzllYjZkYTU0MjdhNmVjMjhmMTg3YWY3ZWJmYjYyZWFmYTY2ZTUAdG9vIG1hbnkgcmVmZXJlbmNlcyB0byAiJXMiOiBtYXggNjU1MzUAc3FsaXRlX3N0YXQ0AGZ0czQAcDQASW50NjQAcHdyaXRlNjQAcHJlYWQ2NABzcWxpdGVfc3RhdDMAU0FWRVBPSU5UIGZ0czMAUk9MTEJBQ0sgVE8gZnRzMwBSRUxFQVNFIGZ0czMAcDMARU5BQkxFX0ZUUzMAcDIAYXRuMgBhdGFuMgByZW1vdmVfZGlhY3JpdGljcz0yAGFyZ2M9PTMgfHxhcmdjPT0yAFNFTEVDVCB0YmwsaWR4LHN0YXQgRlJPTSAlUS5zcWxpdGVfc3RhdDEAQWdnU3RlcDEARU5BQkxFX0pTT04xAHJlbW92ZV9kaWFjcml0aWNzPTEAYXJnYz09MQB1bmljb2RlNjEAVVBEQVRFIE9SIEZBSUwgJVEuJyVxX3NlZ2RpcicgU0VUIGxldmVsPT8gV0hFUkUgbGV2ZWw9LTEAU0VMRUNUIGxldmVsLCBjb3VudCgqKSBBUyBjbnQgRlJPTSAlUS4nJXFfc2VnZGlyJyAgIEdST1VQIEJZIGxldmVsIEhBVklORyBjbnQ+PT8gIE9SREVSIEJZIChsZXZlbCAlJSAxMDI0KSBBU0MsIDIgREVTQyBMSU1JVCAxAFNFTEVDVCAoU0VMRUNUIG1heChpZHgpIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/KSArIDEAU0VMRUNUJ0lOU0VSVCBJTlRPIHZhY3V1bV9kYi4nfHxxdW90ZShuYW1lKXx8JyBTRUxFQ1QqRlJPTSIldyIuJ3x8cXVvdGUobmFtZSlGUk9NIHZhY3V1bV9kYi5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J3RhYmxlJ0FORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAFNFTEVDVCBzcWwgRlJPTSAiJXciLnNxbGl0ZV9zY2hlbWEgV0hFUkUgdHlwZT0ndGFibGUnQU5EIG5hbWU8PidzcWxpdGVfc2VxdWVuY2UnIEFORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAHJlbW92ZV9kaWFjcml0aWNzPTAAVEhSRUFEU0FGRT0wADkyMjMzNzIwMzY4NTQ3NzU4MABsb2cxMAA/MDAwAHNlY29uZCBhcmd1bWVudCB0byBsaWtlbGlob29kKCkgbXVzdCBiZSBhIGNvbnN0YW50IGJldHdlZW4gMC4wIGFuZCAxLjAAQ09NUElMRVI9Y2xhbmctMTQuMC4wAC9wcm9jL3NlbGYvZmQvACVRLgBOLgAtLQAsAG5vc2tpcHNjYW4qAHVub3JkZXJlZCoAc3o9WzAtOV0qAENSRUFURSBUQUJMRSB4KHR5cGUgdGV4dCxuYW1lIHRleHQsdGJsX25hbWUgdGV4dCxyb290cGFnZSBpbnQsc3FsIHRleHQpAENSRUFURSBUQUJMRSAlUS4lcyglcykAYXV0b21hdGljIGluZGV4IG9uICVzKCVzKQBBTlkoJXMpAElOU0VSVCBJTlRPICVRLiclcV9jb250ZW50JyBWQUxVRVMoJXMpAENSRUFURSBUQUJMRSAlUS4nJXFfY29udGVudCcoJXMpAG1hbGZvcm1lZCBkYXRhYmFzZSBzY2hlbWEgKCVzKQBNRVJHRSAoJXMpAENSRUFURSBUQUJMRSAlUS5zcWxpdGVfc2VxdWVuY2UobmFtZSxzZXEpAENSRUFURSBUQUJMRSB4KGlucHV0LCB0b2tlbiwgc3RhcnQsIGVuZCwgcG9zaXRpb24pAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHNxbGl0ZV9kcm9wX2NvbHVtbiglZCwgc3FsLCAlZCkgV0hFUkUgKHR5cGU9PSd0YWJsZScgQU5EIHRibF9uYW1lPSVRIENPTExBVEUgbm9jYXNlKQBtZW1kYiglcCwlbGxkKQBCYWQgcHRyIG1hcCBlbnRyeSBrZXk9JWQgZXhwZWN0ZWQ9KCVkLCVkKSBnb3Q9KCVkLCVkKQAlcyglZCkAemVyb2Jsb2IoJWQpAG1heCByb290cGFnZSAoJWQpIGRpc2FncmVlcyB3aXRoIGhlYWRlciAoJWQpAEZUUyBleHByZXNzaW9uIHRyZWUgaXMgdG9vIGxhcmdlIChtYXhpbXVtIGRlcHRoICVkKQBFeHByZXNzaW9uIHRyZWUgaXMgdG9vIGxhcmdlIChtYXhpbXVtIGRlcHRoICVkKQAoYmxvYikAVVNFIFRFTVAgQi1UUkVFIEZPUiAlcyhESVNUSU5DVCkAQ1JFQVRFIFRBQkxFIHgoa2V5LHZhbHVlLHR5cGUsYXRvbSxpZCxwYXJlbnQsZnVsbGtleSxwYXRoLGpzb24gSElEREVOLHJvb3QgSElEREVOKQBDUkVBVEUgVEFCTEUgeCh0ZXJtLCBjb2wsIGRvY3VtZW50cywgb2NjdXJyZW5jZXMsIGxhbmd1YWdlaWQgSElEREVOKQBDUkVBVEUgVEFCTEUgeCglcyAlUSBISURERU4sIGRvY2lkIEhJRERFTiwgJVEgSElEREVOKQAoTlVMTCkAIFVTSU5HIElOVEVHRVIgUFJJTUFSWSBLRVkgKHJvd2lkJXM/KQBTRUxFQ1QgTk9UIEVYSVNUUyhTRUxFQ1QgZG9jaWQgRlJPTSAlUS4nJXFfY29udGVudCcgV0hFUkUgcm93aWQhPT8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfc2VnZGlyJyBWQUxVRVMoPyw/LD8sPyw/LD8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfc3RhdCcgVkFMVUVTKD8sPykAUkVQTEFDRSBJTlRPICVRLiclcV9kb2NzaXplJyBWQUxVRVMoPyw/KQAsJXMoPykAUkVQTEFDRSBJTlRPICVRLiclcV9zZWdtZW50cycoYmxvY2tpZCwgYmxvY2spIFZBTFVFUyg/LCA/KQBTRUxFQ1QgY29hbGVzY2UoKFNFTEVDVCBtYXgoYmxvY2tpZCkgRlJPTSAlUS4nJXFfc2VnbWVudHMnKSArIDEsIDEpAElOU0VSVCBJTlRPIHZhY3V1bV9kYi5zcWxpdGVfc2NoZW1hIFNFTEVDVCpGUk9NICIldyIuc3FsaXRlX3NjaGVtYSBXSEVSRSB0eXBlIElOKCd2aWV3JywndHJpZ2dlcicpIE9SKHR5cGU9J3RhYmxlJ0FORCByb290cGFnZT0wKQB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIHRvIGZ1bmN0aW9uIHNuaXBwZXQoKQBtaXN1c2Ugb2YgJXMgZnVuY3Rpb24gJS4qcygpAHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgdG8gZnVuY3Rpb24gJS4qcygpAEZJTFRFUiBtYXkgbm90IGJlIHVzZWQgd2l0aCBub24tYWdncmVnYXRlICUuKnMoKQB1bnNhZmUgdXNlIG9mICVzKCkAdW5rbm93biBmdW5jdGlvbjogJXMoKQBtaXN1c2Ugb2YgYWdncmVnYXRlOiAlcygpAFVQREFURSB0ZW1wLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHNxbGl0ZV9yZW5hbWVfY29sdW1uKHNxbCwgdHlwZSwgbmFtZSwgJVEsICVRLCAlZCwgJVEsICVkLCAxKSBXSEVSRSB0eXBlIElOICgndHJpZ2dlcicsICd2aWV3JykAVVBEQVRFIHNxbGl0ZV90ZW1wX3NjaGVtYSBTRVQgc3FsID0gc3FsaXRlX3JlbmFtZV90YWJsZSglUSwgdHlwZSwgbmFtZSwgc3FsLCAlUSwgJVEsIDEpLCB0YmxfbmFtZSA9IENBU0UgV0hFTiB0YmxfbmFtZT0lUSBDT0xMQVRFIG5vY2FzZSBBTkQgICBzcWxpdGVfcmVuYW1lX3Rlc3QoJVEsIHNxbCwgdHlwZSwgbmFtZSwgMSwgJ2FmdGVyIHJlbmFtZScsIDApIFRIRU4gJVEgRUxTRSB0YmxfbmFtZSBFTkQgV0hFUkUgdHlwZSBJTiAoJ3ZpZXcnLCAndHJpZ2dlcicpACwlcyh4LidjJWQlcScpAElOU0VSVCBJTlRPICVRLnNxbGl0ZV9tYXN0ZXIgVkFMVUVTKCd0cmlnZ2VyJywlUSwlUSwwLCdDUkVBVEUgVFJJR0dFUiAlcScpAFNFTEVDVCAyICogdG90YWwoMSArIGxlYXZlc19lbmRfYmxvY2sgLSBzdGFydF9ibG9jaykgICBGUk9NIChTRUxFQ1QgKiBGUk9NICVRLiclcV9zZWdkaXInICAgICAgICAgV0hFUkUgbGV2ZWwgPSA/IE9SREVSIEJZIGlkeCBBU0MgTElNSVQgPyAgKQAKKQAgKABTRUxFQ1Qgc3FsIEZST00gIiV3Ii5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J2luZGV4JwBERUxFVEUgRlJPTSAlUS5zcWxpdGVfbWFzdGVyIFdIRVJFIG5hbWU9JVEgQU5EIHR5cGU9J2luZGV4JwBuYW1lPSclcScgQU5EIHR5cGU9J2luZGV4JwBERUxFVEUgRlJPTSAlUS4nJXFfY29udGVudCcAREVMRVRFIEZST00gJVEuJyVxX3N0YXQnAERFTEVURSBGUk9NICVRLiclcV9zZWdtZW50cycAREVMRVRFIEZST00gJVEuJyVxX3NlZ2RpcicAU0VMRUNUID8gVU5JT04gU0VMRUNUIGxldmVsIC8gKDEwMjQgKiA/KSBGUk9NICVRLiclcV9zZWdkaXInAFNFTEVDVCBtYXgoIGxldmVsICUlIDEwMjQgKSBGUk9NICVRLiclcV9zZWdkaXInAERFTEVURSBGUk9NICVRLnNxbGl0ZV9tYXN0ZXIgV0hFUkUgbmFtZT0lUSBBTkQgdHlwZT0ndHJpZ2dlcicAREVMRVRFIEZST00gJVEuc3FsaXRlX21hc3RlciBXSEVSRSB0YmxfbmFtZT0lUSBhbmQgdHlwZSE9J3RyaWdnZXInAHRibF9uYW1lPSclcScgQU5EIHR5cGUhPSd0cmlnZ2VyJwAnJS4qcScAJXosICdjJWQlcScAdHlwZT0ndHJpZ2dlcicgQU5EIG5hbWU9JyVxJwAsIHguJyVxJwBpbmRleCAnJXEnAEpTT04gcGF0aCBlcnJvciBuZWFyICclcScAREVMRVRFIEZST00gJVEuJyVxX2RvY3NpemUnAFVQREFURSAiJXciLnNxbGl0ZV9tYXN0ZXIgU0VUIHNxbCA9IHNxbGl0ZV9yZW5hbWVfdGFibGUoJVEsIHR5cGUsIG5hbWUsIHNxbCwgJVEsICVRLCAlZCkgV0hFUkUgKHR5cGUhPSdpbmRleCcgT1IgdGJsX25hbWU9JVEgQ09MTEFURSBub2Nhc2UpQU5EICAgbmFtZSBOT1QgTElLRSAnc3FsaXRlWF8lJScgRVNDQVBFICdYJwBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX2NvbHVtbihzcWwsIHR5cGUsIG5hbWUsICVRLCAlUSwgJWQsICVRL