UNPKG

@pixiebrix/jq-web

Version:

a hack that makes jq run in the browser with emscripten.

1 lines 1.75 MB
var jq=function(A){var B=void 0!==(A=A||{})?A:{},e=!1,Q=[],a="",r=[],g=[],w=[];function C(A){for(var B=new Uint8Array(A),e="",Q=0;Q<B.length;++Q)e+=String.fromCharCode(B[Q]);return decodeURIComponent(escape(e))}B=Object.assign({noInitialRun:!0,noExitRuntime:!0,onRuntimeInitialized:function(){e=!0,Q.forEach(function(A){A()})},preRun:function(){LA.init(function(){return r.length?r.pop():a?(r=function(A){for(var B=[],e=unescape(encodeURIComponent(A)),Q=0;Q<e.length;Q++)B.push(e.charCodeAt(Q));return B}(a),a="",r.push(null),r.reverse(),r.pop()):null},function(A){A&&g.push(A)},function(A){A&&w.push(A)})}},B);var c,i={};for(c in B)B.hasOwnProperty(c)&&(i[c]=B[c]);var f,E=[],s="./this.program",k=function(A,B){throw B},b=!1,D=!1,o=!1;b="object"==typeof window,D="function"==typeof importScripts,o="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,f=!b&&!o&&!D;var n,I,t,u,G="";o?(G=D?require("path").dirname(G)+"/":__dirname+"/",n=function(A,B){var e=WA(A);return e?B?e:e.toString():(t||(t=require("fs")),u||(u=require("path")),A=u.normalize(A),t.readFileSync(A,B?null:"utf8"))},I=function(A){var B=n(A,!0);return B.buffer||(B=new Uint8Array(B)),Y(B.buffer),B},process.argv.length>1&&(s=process.argv[1].replace(/\\/g,"/")),E=process.argv.slice(2),process.on("uncaughtException",function(A){if(!(A instanceof $A))throw A}),process.on("unhandledRejection",gA),k=function(A){process.exit(A)},B.inspect=function(){return"[Emscripten Module object]"}):f?("undefined"!=typeof read&&(n=function(A){var B=WA(A);return B?zA(B):read(A)}),I=function(A){var B;return(B=WA(A))?B:"function"==typeof readbuffer?new Uint8Array(readbuffer(A)):(Y("object"==typeof(B=read(A,"binary"))),B)},"undefined"!=typeof scriptArgs?E=scriptArgs:void 0!==arguments&&(E=arguments),"function"==typeof quit&&(k=function(A){quit(A)}),"undefined"!=typeof print&&("undefined"==typeof console&&(console={}),console.log=print,console.warn=console.error="undefined"!=typeof printErr?printErr:print)):(b||D)&&(D?G=self.location.href:document.currentScript&&(G=document.currentScript.src),G=0!==G.indexOf("blob:")?G.substr(0,G.lastIndexOf("/")+1):"",n=function(A){try{var B=new XMLHttpRequest;return B.open("GET",A,!1),B.send(null),B.responseText}catch(B){var e=WA(A);if(e)return zA(e);throw B}},D&&(I=function(A){try{var B=new XMLHttpRequest;return B.open("GET",A,!1),B.responseType="arraybuffer",B.send(null),new Uint8Array(B.response)}catch(B){var e=WA(A);if(e)return e;throw B}}),function(A,B,e){var Q=new XMLHttpRequest;Q.open("GET",A,!0),Q.responseType="arraybuffer",Q.onload=function(){if(200==Q.status||0==Q.status&&Q.response)B(Q.response);else{var a=WA(A);a?B(a.buffer):e()}},Q.onerror=e,Q.send(null)});var L,M=B.print||console.log.bind(console),l=B.printErr||console.warn.bind(console);for(c in i)i.hasOwnProperty(c)&&(B[c]=i[c]);i=null,B.arguments&&(E=B.arguments),B.thisProgram&&(s=B.thisProgram),B.quit&&(k=B.quit),B.wasmBinary&&(L=B.wasmBinary),B.noExitRuntime&&B.noExitRuntime;var N,v={Memory:function(A){return{buffer:new ArrayBuffer(65536*A.initial),grow:function(A){return _A(A)}}},Table:function(A){var B=new Array(A.initial);return B.grow=function(A){B.length>=177&&gA("Unable to grow wasm table. Use a higher value for RESERVED_FUNCTION_POINTERS or set ALLOW_TABLE_GROWTH."),B.push(null)},B.set=function(A,e){B[A]=e},B.get=function(A){return B[A]},B},Module:function(A){return{}},Instance:function(A,B){return{exports:function(A,B,e){var Q=new ArrayBuffer(8),a=new Int32Array(Q),r=(new Float32Array(Q),new Float64Array(Q));function g(A){return a[A]}function w(A,B){a[A]=B}function C(){return r[0]}function c(A){r[0]=A}function i(){return"function"==typeof setTempRet0&&setTempRet0(a[1]),a[0]}function f(A,B){a[0]=A,a[1]=B}for(var E=new Uint8Array(123),s=25;s>=0;--s)E[48+s]=52+s,E[65+s]=s,E[97+s]=26+s;function k(A,B,e){var Q,a,r=0,g=B,w=e.length,C=B+(3*w>>2);for("="==e[w-2]&&--C,"="==e[w-1]&&--C;r<w;r+=4,g+=3)Q=E[e.charCodeAt(r+1)],a=E[e.charCodeAt(r+2)],A[g]=E[e.charCodeAt(r)]<<2|Q>>4,g+1<C&&(A[g+1]=Q<<4|a>>2),g+2<C&&(A[g+2]=a<<6|E[e.charCodeAt(r+3)])}E[43]=62,E[47]=63;var b=new Uint8Array(B.buffer);return k(b,1024,"bWFsbG9jACUqc1twYXJhbXM6IABvcGNvZGVfZGVzY3JpYmUob3ApLT5sZW5ndGggPT0gMQBkZWYgaGFsdF9lcnJvcjogaGFsdF9lcnJvcig1KTsKZGVmIGVycm9yOiBlcnJvciguKTsKZGVmIG1hcChmKTogWy5bXSB8IGZdOwpkZWYgc2VsZWN0KGYpOiBpZiBmIHRoZW4gLiBlbHNlIGVtcHR5IGVuZDsKZGVmIHNvcnRfYnkoZik6IF9zb3J0X2J5X2ltcGwobWFwKFtmXSkpOwpkZWYgZ3JvdXBfYnkoZik6IF9ncm91cF9ieV9pbXBsKG1hcChbZl0pKTsKZGVmIHVuaXF1ZTogZ3JvdXBfYnkoLikgfCBtYXAoLlswXSk7CmRlZiB1bmlxdWVfYnkoZik6IGdyb3VwX2J5KGYpIHwgbWFwKC5bMF0pOwpkZWYgbWF4X2J5KGYpOiBfbWF4X2J5X2ltcGwobWFwKFtmXSkpOwpkZWYgbWluX2J5KGYpOiBfbWluX2J5X2ltcGwobWFwKFtmXSkpOwpkZWYgYWRkOiByZWR1Y2UgLltdIGFzICR4IChudWxsOyAuICsgJHgpOwpkZWYgZGVsKGYpOiBkZWxwYXRocyhbcGF0aChmKV0pOwpkZWYgX2Fzc2lnbihwYXRoczsgdmFsdWUpOiB2YWx1ZSBhcyAkdiB8IHJlZHVjZSBwYXRoKHBhdGhzKSBhcyAkcCAoLjsgc2V0cGF0aCgkcDsgJHYpKTsKZGVmIF9tb2RpZnkocGF0aHM7IHVwZGF0ZSk6IHJlZHVjZSBwYXRoKHBhdGhzKSBhcyAkcCAoLjsgbGFiZWwgJG91dCB8IChzZXRwYXRoKCRwOyBnZXRwYXRoKCRwKSB8IHVwZGF0ZSkgfCAuLCBicmVhayAkb3V0KSwgZGVscGF0aHMoWyRwXSkpOwpkZWYgbWFwX3ZhbHVlcyhmKTogLltdIHw9IGY7CgojIHJlY3Vyc2UKZGVmIHJlY3Vyc2UoZik6IGRlZiByOiAuLCAoZiB8IHIpOyByOwpkZWYgcmVjdXJzZShmOyBjb25kKTogZGVmIHI6IC4sIChmIHwgc2VsZWN0KGNvbmQpIHwgcik7IHI7CmRlZiByZWN1cnNlOiByZWN1cnNlKC5bXT8pOwpkZWYgcmVjdXJzZV9kb3duOiByZWN1cnNlOwoKZGVmIHRvX2VudHJpZXM6IFtrZXlzX3Vuc29ydGVkW10gYXMgJGsgfCB7a2V5OiAkaywgdmFsdWU6IC5bJGtdfV07CmRlZiBmcm9tX2VudHJpZXM6IG1hcCh7KC5rZXkgLy8gLktleSAvLyAubmFtZSAvLyAuTmFtZSk6IChpZiBoYXMoInZhbHVlIikgdGhlbiAudmFsdWUgZWxzZSAuVmFsdWUgZW5kKX0pIHwgYWRkIHwgLi8vPXt9OwpkZWYgd2l0aF9lbnRyaWVzKGYpOiB0b19lbnRyaWVzIHwgbWFwKGYpIHwgZnJvbV9lbnRyaWVzOwpkZWYgcmV2ZXJzZTogWy5bbGVuZ3RoIC0gMSAtIHJhbmdlKDA7bGVuZ3RoKV1dOwpkZWYgaW5kaWNlcygkaSk6IGlmIHR5cGUgPT0gImFycmF5IiBhbmQgKCRpfHR5cGUpID09ICJhcnJheSIgdGhlbiAuWyRpXQogIGVsaWYgdHlwZSA9PSAiYXJyYXkiIHRoZW4gLltbJGldXQogIGVsaWYgdHlwZSA9PSAic3RyaW5nIiBhbmQgKCRpfHR5cGUpID09ICJzdHJpbmciIHRoZW4gX3N0cmluZGljZXMoJGkpCiAgZWxzZSAuWyRpXSBlbmQ7CmRlZiBpbmRleCgkaSk6ICAgaW5kaWNlcygkaSkgfCAuWzBdOyAgICAgICAjIFRPRE86IG9wdGltaXplCmRlZiByaW5kZXgoJGkpOiAgaW5kaWNlcygkaSkgfCAuWy0xOl1bMF07ICAjIFRPRE86IG9wdGltaXplCmRlZiBwYXRoczogcGF0aChyZWN1cnNlKGlmICh0eXBlfC4gPT0gImFycmF5IiBvciAuID09ICJvYmplY3QiKSB0aGVuIC5bXSBlbHNlIGVtcHR5IGVuZCkpfHNlbGVjdChsZW5ndGggPiAwKTsKZGVmIHBhdGhzKG5vZGVfZmlsdGVyKTogLiBhcyAkZG90fHBhdGhzfHNlbGVjdCguIGFzICRwfCRkb3R8Z2V0cGF0aCgkcCl8bm9kZV9maWx0ZXIpOwpkZWYgYW55KGdlbmVyYXRvcjsgY29uZGl0aW9uKToKICAgICAgICBbbGFiZWwgJG91dCB8IGZvcmVhY2ggZ2VuZXJhdG9yIGFzICRpCiAgICAgICAgICAgICAgICAgKGZhbHNlOwogICAgICAgICAgICAgICAgICBpZiAuIHRoZW4gYnJlYWsgJG91dCBlbGlmICRpIHwgY29uZGl0aW9uIHRoZW4gdHJ1ZSBlbHNlIC4gZW5kOwogICAgICAgICAgICAgICAgICBpZiAuIHRoZW4gLiBlbHNlIGVtcHR5IGVuZCldIHwgbGVuZ3RoID09IDE7CmRlZiBhbnkoY29uZGl0aW9uKTogYW55KC5bXTsgY29uZGl0aW9uKTsKZGVmIGFueTogYW55KC4pOwpkZWYgYWxsKGdlbmVyYXRvcjsgY29uZGl0aW9uKToKICAgICAgICBbbGFiZWwgJG91dCB8IGZvcmVhY2ggZ2VuZXJhdG9yIGFzICRpCiAgICAgICAgICAgICAgICAgKHRydWU7CiAgICAgICAgICAgICAgICAgIGlmIC58bm90IHRoZW4gYnJlYWsgJG91dCBlbGlmICRpIHwgY29uZGl0aW9uIHRoZW4gLiBlbHNlIGZhbHNlIGVuZDsKICAgICAgICAgICAgICAgICAgaWYgLnxub3QgdGhlbiAuIGVsc2UgZW1wdHkgZW5kKV0gfCBsZW5ndGggPT0gMDsKZGVmIGFsbChjb25kaXRpb24pOiBhbGwoLltdOyBjb25kaXRpb24pOwpkZWYgYWxsOiBhbGwoLik7CmRlZiBpc2Zpbml0ZTogdHlwZSA9PSAibnVtYmVyIiBhbmQgKGlzaW5maW5pdGUgfCBub3QpOwpkZWYgYXJyYXlzOiBzZWxlY3QodHlwZSA9PSAiYXJyYXkiKTsKZGVmIG9iamVjdHM6IHNlbGVjdCh0eXBlID09ICJvYmplY3QiKTsKZGVmIGl0ZXJhYmxlczogYXJyYXlzLCBvYmplY3RzOwpkZWYgYm9vbGVhbnM6IHNlbGVjdCh0eXBlID09ICJib29sZWFuIik7CmRlZiBudW1iZXJzOiBzZWxlY3QodHlwZSA9PSAibnVtYmVyIik7CmRlZiBub3JtYWxzOiBzZWxlY3QoaXNub3JtYWwpOwpkZWYgZmluaXRlczogc2VsZWN0KGlzZmluaXRlKTsKZGVmIHN0cmluZ3M6IHNlbGVjdCh0eXBlID09ICJzdHJpbmciKTsKZGVmIG51bGxzOiBzZWxlY3QodHlwZSA9PSAibnVsbCIpOwpkZWYgdmFsdWVzOiBzZWxlY3QoLiAhPSBudWxsKTsKZGVmIHNjYWxhcnM6IHNlbGVjdCguID09IG51bGwgb3IgLiA9PSB0cnVlIG9yIC4gPT0gZmFsc2Ugb3IgdHlwZSA9PSAibnVtYmVyIiBvciB0eXBlID09ICJzdHJpbmciKTsKZGVmIHNjYWxhcnNfb3JfZW1wdHk6IHNlbGVjdCguID09IG51bGwgb3IgLiA9PSB0cnVlIG9yIC4gPT0gZmFsc2Ugb3IgdHlwZSA9PSAibnVtYmVyIiBvciB0eXBlID09ICJzdHJpbmciIG9yICgodHlwZT09ImFycmF5IiBvciB0eXBlPT0ib2JqZWN0IikgYW5kIGxlbmd0aD09MCkpOwpkZWYgbGVhZl9wYXRoczogcGF0aHMoc2NhbGFycyk7CmRlZiBqb2luKCR4KTogcmVkdWNlIC5bXSBhcyAkaSAobnVsbDsKICAgICAgICAgICAgKGlmIC49PW51bGwgdGhlbiAiIiBlbHNlIC4rJHggZW5kKSArCiAgICAgICAgICAgICgkaSB8IGlmIHR5cGU9PSJib29sZWFuIiBvciB0eXBlPT0ibnVtYmVyIiB0aGVuIHRvc3RyaW5nIGVsc2UgLi8vIiIgZW5kKQogICAgICAgICkgLy8gIiI7CmRlZiBfZmxhdHRlbigkeCk6IHJlZHVjZSAuW10gYXMgJGkgKFtdOyBpZiAkaSB8IHR5cGUgPT0gImFycmF5IiBhbmQgJHggIT0gMCB0aGVuIC4gKyAoJGkgfCBfZmxhdHRlbigkeC0xKSkgZWxzZSAuICsgWyRpXSBlbmQpOwpkZWYgZmxhdHRlbigkeCk6IGlmICR4IDwgMCB0aGVuIGVycm9yKCJmbGF0dGVuIGRlcHRoIG11c3Qgbm90IGJlIG5lZ2F0aXZlIikgZWxzZSBfZmxhdHRlbigkeCkgZW5kOwpkZWYgZmxhdHRlbjogX2ZsYXR0ZW4oLTEpOwpkZWYgcmFuZ2UoJHgpOiByYW5nZSgwOyR4KTsKZGVmIGZyb21kYXRlaXNvODYwMTogc3RycHRpbWUoIiVZLSVtLSVkVCVIOiVNOiVTWiIpfG1rdGltZTsKZGVmIHRvZGF0ZWlzbzg2MDE6IHN0cmZ0aW1lKCIlWS0lbS0lZFQlSDolTTolU1oiKTsKZGVmIGZyb21kYXRlOiBmcm9tZGF0ZWlzbzg2MDE7CmRlZiB0b2RhdGU6IHRvZGF0ZWlzbzg2MDE7CmRlZiBtYXRjaChyZTsgbW9kZSk6IF9tYXRjaF9pbXBsKHJlOyBtb2RlOyBmYWxzZSl8LltdOwpkZWYgbWF0Y2goJHZhbCk6ICgkdmFsfHR5cGUpIGFzICR2dCB8IGlmICR2dCA9PSAic3RyaW5nIiB0aGVuIG1hdGNoKCR2YWw7IG51bGwpCiAgIGVsaWYgJHZ0ID09ICJhcnJheSIgYW5kICgkdmFsIHwgbGVuZ3RoKSA+IDEgdGhlbiBtYXRjaCgkdmFsWzBdOyAkdmFsWzFdKQogICBlbGlmICR2dCA9PSAiYXJyYXkiIGFuZCAoJHZhbCB8IGxlbmd0aCkgPiAwIHRoZW4gbWF0Y2goJHZhbFswXTsgbnVsbCkKICAgZWxzZSBlcnJvciggJHZ0ICsgIiBub3QgYSBzdHJpbmcgb3IgYXJyYXkiKSBlbmQ7CmRlZiB0ZXN0KHJlOyBtb2RlKTogX21hdGNoX2ltcGwocmU7IG1vZGU7IHRydWUpOwpkZWYgdGVzdCgkdmFsKTogKCR2YWx8dHlwZSkgYXMgJHZ0IHwgaWYgJHZ0ID09ICJzdHJpbmciIHRoZW4gdGVzdCgkdmFsOyBudWxsKQogICBlbGlmICR2dCA9PSAiYXJyYXkiIGFuZCAoJHZhbCB8IGxlbmd0aCkgPiAxIHRoZW4gdGVzdCgkdmFsWzBdOyAkdmFsWzFdKQogICBlbGlmICR2dCA9PSAiYXJyYXkiIGFuZCAoJHZhbCB8IGxlbmd0aCkgPiAwIHRoZW4gdGVzdCgkdmFsWzBdOyBudWxsKQogICBlbHNlIGVycm9yKCAkdnQgKyAiIG5vdCBhIHN0cmluZyBvciBhcnJheSIpIGVuZDsKZGVmIGNhcHR1cmUocmU7IG1vZHMpOiBtYXRjaChyZTsgbW9kcykgfCByZWR1Y2UgKCAuY2FwdHVyZXMgfCAuW10gfCBzZWxlY3QoLm5hbWUgIT0gbnVsbCkgfCB7ICgubmFtZSkgOiAuc3RyaW5nIH0gKSBhcyAkcGFpciAoe307IC4gKyAkcGFpcik7CmRlZiBjYXB0dXJlKCR2YWwpOiAoJHZhbHx0eXBlKSBhcyAkdnQgfCBpZiAkdnQgPT0gInN0cmluZyIgdGhlbiBjYXB0dXJlKCR2YWw7IG51bGwpCiAgIGVsaWYgJHZ0ID09ICJhcnJheSIgYW5kICgkdmFsIHwgbGVuZ3RoKSA+IDEgdGhlbiBjYXB0dXJlKCR2YWxbMF07ICR2YWxbMV0pCiAgIGVsaWYgJHZ0ID09ICJhcnJheSIgYW5kICgkdmFsIHwgbGVuZ3RoKSA+IDAgdGhlbiBjYXB0dXJlKCR2YWxbMF07IG51bGwpCiAgIGVsc2UgZXJyb3IoICR2dCArICIgbm90IGEgc3RyaW5nIG9yIGFycmF5IikgZW5kOwpkZWYgc2NhbihyZSk6CiAgbWF0Y2gocmU7ICJnIikKICB8ICBpZiAoLmNhcHR1cmVzfGxlbmd0aCA+IDApCiAgICAgIHRoZW4gWyAuY2FwdHVyZXMgfCAuW10gfCAuc3RyaW5nIF0KICAgICAgZWxzZSAuc3RyaW5nCiAgICAgIGVuZCA7CiMKIyBJZiBpbnB1dCBpcyBhbiBhcnJheSwgdGhlbiBlbWl0IGEgc3RyZWFtIG9mIHN1Y2Nlc3NpdmUgc3ViYXJyYXlzIG9mIGxlbmd0aCBuIChvciBsZXNzKSwKIyBhbmQgc2ltaWxhcmx5IGZvciBzdHJpbmdzLgpkZWYgX253aXNlKGE7ICRuKTogaWYgYXxsZW5ndGggPD0gJG4gdGhlbiBhIGVsc2UgYVswOiRuXSAsIF9ud2lzZShhWyRuOl07ICRuKSBlbmQ7CmRlZiBfbndpc2UoJG4pOiBfbndpc2UoLjsgJG4pOwojCiMgc3BsaXRzLzEgcHJvZHVjZXMgYSBzdHJlYW07IHNwbGl0LzEgaXMgcmV0YWluZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCmRlZiBzcGxpdHMoJHJlOyBmbGFncyk6IC4gYXMgJHMKIyAgIyBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvZiAiZyIgYXJlIGFjY2VwdGFibGUKICB8IFsgbWF0Y2goJHJlOyAiZyIgKyBmbGFncykgfCAoLm9mZnNldCwgLm9mZnNldCArIC5sZW5ndGgpIF0KICB8IFswXSArIC4gK1skc3xsZW5ndGhdCiAgfCBfbndpc2UoMikKICB8ICRzWy5bMF06LlsxXSBdIDsKZGVmIHNwbGl0cygkcmUpOiBzcGxpdHMoJHJlOyBudWxsKTsKIwojIHNwbGl0IGVtaXRzIGFuIGFycmF5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CmRlZiBzcGxpdCgkcmU7IGZsYWdzKTogWyBzcGxpdHMoJHJlOyBmbGFncykgXTsKIwojIElmIHMgY29udGFpbnMgY2FwdHVyZSB2YXJpYWJsZXMsIHRoZW4gY3JlYXRlIGEgY2FwdHVyZSBvYmplY3QgYW5kIHBpcGUgaXQgdG8gcwpkZWYgc3ViKCRyZTsgcyk6CiAgLiBhcyAkaW4KICB8IFttYXRjaCgkcmUpXQogIHwgaWYgbGVuZ3RoID09IDAgdGhlbiAkaW4KICAgIGVsc2UgLlswXQogICAgfCAuIGFzICRyCiMgICMgY3JlYXRlIHRoZSAiY2FwdHVyZSIgb2JqZWN0OgogICAgfCByZWR1Y2UgKCAkciB8IC5jYXB0dXJlcyB8IC5bXSB8IHNlbGVjdCgubmFtZSAhPSBudWxsKSB8IHsgKC5uYW1lKSA6IC5zdHJpbmcgfSApIGFzICRwYWlyCiAgICAgICAgKHt9OyAuICsgJHBhaXIpCiAgICB8ICRpblswOiRyLm9mZnNldF0gKyBzICsgJGluWyRyLm9mZnNldCskci5sZW5ndGg6XQogICAgZW5kIDsKIwojIElmIHMgY29udGFpbnMgY2FwdHVyZSB2YXJpYWJsZXMsIHRoZW4gY3JlYXRlIGEgY2FwdHVyZSBvYmplY3QgYW5kIHBpcGUgaXQgdG8gcwpkZWYgc3ViKCRyZTsgczsgZmxhZ3MpOgogIGRlZiBzdWJnOiBbZXhwbG9kZVtdIHwgc2VsZWN0KC4gIT0gMTAzKV0gfCBpbXBsb2RlOwogICMgImZsYSIgc2hvdWxkIGJlIGZsYWdzIHdpdGggYWxsIG9jY3VycmVuY2VzIG9mIGcgcmVtb3ZlZDsgZ3Mgc2hvdWxkIGJlIG5vbi1uaWwgaWYgZmxhZ3MgaGFzIGEgZwogIGRlZiBzdWIxKGZsYTsgZ3MpOgogICAgZGVmIG15c3ViOgogICAgICAuIGFzICRpbgogICAgICB8IFttYXRjaCgkcmU7IGZsYSldCiAgICAgIHwgaWYgbGVuZ3RoID09IDAgdGhlbiAkaW4KICAgICAgICBlbHNlIC5bMF0gYXMgJGVkaXQKICAgICAgICB8ICgkZWRpdCB8IC5vZmZzZXQgKyAubGVuZ3RoKSBhcyAkbGVuCiAgICAgICAgIyBjcmVhdGUgdGhlICJjYXB0dXJlIiBvYmplY3Q6CiAgICAgICAgfCByZWR1Y2UgKCAkZWRpdCB8IC5jYXB0dXJlcyB8IC5bXSB8IHNlbGVjdCgubmFtZSAhPSBudWxsKSB8IHsgKC5uYW1lKSA6IC5zdHJpbmcgfSApIGFzICRwYWlyCiAgICAgICAgICAgICh7fTsgLiArICRwYWlyKQogICAgICAgIHwgJGluWzA6JGVkaXQub2Zmc2V0XQogICAgICAgICAgKyBzCiAgICAgICAgICArICgkaW5bJGxlbjpdIHwgaWYgbGVuZ3RoID4gMCBhbmQgZ3MgdGhlbiBteXN1YiBlbHNlIC4gZW5kKQogICAgICAgIGVuZCA7CiAgICBteXN1YiA7CiAgICAoZmxhZ3MgfCBpbmRleCgiZyIpKSBhcyAkZ3MKICAgIHwgKGZsYWdzIHwgaWYgJGdzIHRoZW4gc3ViZyBlbHNlIC4gZW5kKSBhcyAkZmxhCiAgICB8IHN1YjEoJGZsYTsgJGdzKTsKIwpkZWYgc3ViKCRyZTsgcyk6IHN1YigkcmU7IHM7ICIiKTsKIyByZXBlYXRlZCBzdWJzdGl0dXRpb24gb2YgcmUgKHdoaWNoIG1heSBjb250YWluIG5hbWVkIGNhcHR1cmVzKQpkZWYgZ3N1YigkcmU7IHM7IGZsYWdzKTogc3ViKCRyZTsgczsgZmxhZ3MgKyAiZyIpOwpkZWYgZ3N1YigkcmU7IHMpOiBzdWIoJHJlOyBzOyAiZyIpOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgcmFuZ2UvMywgd2l0aCBhIGBieWAgZXhwcmVzc2lvbiBhcmd1bWVudApkZWYgcmFuZ2UoJGluaXQ7ICR1cHRvOyAkYnkpOgogICAgZGVmIF9yYW5nZToKICAgICAgICBpZiAoJGJ5ID4gMCBhbmQgLiA8ICR1cHRvKSBvciAoJGJ5IDwgMCBhbmQgLiA+ICR1cHRvKSB0aGVuIC4sICgoLiskYnkpfF9yYW5nZSkgZWxzZSAuIGVuZDsKICAgIGlmICRieSA9PSAwIHRoZW4gJGluaXQgZWxzZSAkaW5pdHxfcmFuZ2UgZW5kIHwgc2VsZWN0KCgkYnkgPiAwIGFuZCAuIDwgJHVwdG8pIG9yICgkYnkgPCAwIGFuZCAuID4gJHVwdG8pKTsKIyBnZW5lcmljIGl0ZXJhdG9yL2dlbmVyYXRvcgpkZWYgd2hpbGUoY29uZDsgdXBkYXRlKToKICAgICBkZWYgX3doaWxlOgogICAgICAgICBpZiBjb25kIHRoZW4gLiwgKHVwZGF0ZSB8IF93aGlsZSkgZWxzZSBlbXB0eSBlbmQ7CiAgICAgX3doaWxlOwpkZWYgdW50aWwoY29uZDsgbmV4dCk6CiAgICAgZGVmIF91bnRpbDoKICAgICAgICAgaWYgY29uZCB0aGVuIC4gZWxzZSAobmV4dHxfdW50aWwpIGVuZDsKICAgICBfdW50aWw7CmRlZiBsaW1pdCgkbjsgZXhwKToKICBpZiAkbiA8IDAgdGhlbiBleHAKICBlbHNlIGxhYmVsICRvdXQgfCBmb3JlYWNoIGV4cCBhcyAkaXRlbSAoJG47IC4tMTsgJGl0ZW0sIGlmIC4gPD0gMCB0aGVuIGJyZWFrICRvdXQgZWxzZSBlbXB0eSBlbmQpCiAgZW5kOwpkZWYgaXNlbXB0eShnKTogMCA9PSAoKGxhYmVsICRnbyB8IGcgfCAoMSwgYnJlYWsgJGdvKSkgLy8gMCk7CmRlZiBmaXJzdChnKTogbGFiZWwgJG91dCB8IGcgfCAuLCBicmVhayAkb3V0OwpkZWYgbGFzdChnKTogcmVkdWNlIGcgYXMgJGl0ZW0gKG51bGw7ICRpdGVtKTsKZGVmIG50aCgkbjsgZyk6IGlmICRuIDwgMCB0aGVuIGVycm9yKCJudGggZG9lc24ndCBzdXBwb3J0IG5lZ2F0aXZlIGluZGljZXMiKSBlbHNlIGxhc3QobGltaXQoJG4gKyAxOyBnKSkgZW5kOwpkZWYgZmlyc3Q6IC5bMF07CmRlZiBsYXN0OiAuWy0xXTsKZGVmIG50aCgkbik6IC5bJG5dOwpkZWYgY29tYmluYXRpb25zOgogICAgaWYgbGVuZ3RoID09IDAgdGhlbiBbXSBlbHNlCiAgICAgICAgLlswXVtdIGFzICR4CiAgICAgICAgICB8ICguWzE6XSB8IGNvbWJpbmF0aW9ucykgYXMgJHkKICAgICAgICAgIHwgWyR4XSArICR5CiAgICBlbmQ7CmRlZiBjb21iaW5hdGlvbnMobik6CiAgICAuIGFzICRkb3QKICAgICAgfCBbcmFuZ2UobikgfCAkZG90XQogICAgICB8IGNvbWJpbmF0aW9uczsKIyB0cmFuc3Bvc2UgYSBwb3NzaWJseSBqYWdnZWQgbWF0cml4LCBxdWlja2x5OwojIHJvd3MgYXJlIHBhZGRlZCB3aXRoIG51bGxzIHNvIHRoZSByZXN1bHQgaXMgYWx3YXlzIHJlY3Rhbmd1bGFyLgpkZWYgdHJhbnNwb3NlOgogIGlmIC4gPT0gW10gdGhlbiBbXQogIGVsc2UgLiBhcyAkaW4KICB8IChtYXAobGVuZ3RoKSB8IG1heCkgYXMgJG1heAogIHwgbGVuZ3RoIGFzICRsZW5ndGgKICB8IHJlZHVjZSByYW5nZSgwOyAkbWF4KSBhcyAkagogICAgICAoW107IC4gKyBbcmVkdWNlIHJhbmdlKDA7JGxlbmd0aCkgYXMgJGkgKFtdOyAuICsgWyAkaW5bJGldWyRqXSBdICldICkKCSAgICAgICAgZW5kOwpkZWYgaW4oeHMpOiAuIGFzICR4IHwgeHMgfCBoYXMoJHgpOwpkZWYgaW5zaWRlKHhzKTogLiBhcyAkeCB8IHhzIHwgY29udGFpbnMoJHgpOwpkZWYgaW5wdXQ6IF9pbnB1dDsKZGVmIHJlcGVhdChleHApOgogICAgIGRlZiBfcmVwZWF0OgogICAgICAgICBleHAsIF9yZXBlYXQ7CiAgICAgX3JlcGVhdDsKZGVmIGlucHV0czogdHJ5IHJlcGVhdChfaW5wdXQpIGNhdGNoIGlmIC49PSJicmVhayIgdGhlbiBlbXB0eSBlbHNlIC58ZXJyb3IgZW5kOwojIGxpa2UgcnVieSdzIGRvd25jYXNlIC0gb25seSBjaGFyYWN0ZXJzIEEgdG8gWiBhcmUgYWZmZWN0ZWQKZGVmIGFzY2lpX2Rvd25jYXNlOgogIGV4cGxvZGUgfCBtYXAoIGlmIDY1IDw9IC4gYW5kIC4gPD0gOTAgdGhlbiAuICsgMzIgIGVsc2UgLiBlbmQpIHwgaW1wbG9kZTsKIyBsaWtlIHJ1YnkncyB1cGNhc2UgLSBvbmx5IGNoYXJhY3RlcnMgYSB0byB6IGFyZSBhZmZlY3RlZApkZWYgYXNjaWlfdXBjYXNlOgogIGV4cGxvZGUgfCBtYXAoIGlmIDk3IDw9IC4gYW5kIC4gPD0gMTIyIHRoZW4gLiAtIDMyICBlbHNlIC4gZW5kKSB8IGltcGxvZGU7CgojIFN0cmVhbWluZyB1dGlsaXRpZXMKZGVmIHRydW5jYXRlX3N0cmVhbShzdHJlYW0pOgogIC4gYXMgJG4gfCBudWxsIHwgc3RyZWFtIHwgLiBhcyAkaW5wdXQgfCBpZiAoLlswXXxsZW5ndGgpID4gJG4gdGhlbiBzZXRwYXRoKFswXTskaW5wdXRbMF1bJG46XSkgZWxzZSBlbXB0eSBlbmQ7CmRlZiBmcm9tc3RyZWFtKGkpOgogIGZvcmVhY2ggaSBhcyAkaXRlbSAoCiAgICBbbnVsbCxmYWxzZSxudWxsLGZhbHNlXTsKICAgIGlmICgkaXRlbVswXXxsZW5ndGgpID09IDAgdGhlbiBbbnVsbCxmYWxzZSwuWzJdLC5bM11dCiAgICBlbGlmICgkaXRlbXxsZW5ndGgpID09IDEgYW5kICgkaXRlbVswXXxsZW5ndGgpIDwgMiB0aGVuIFtudWxsLGZhbHNlLC5bMF0sLlsxXV0KICAgIGVsc2UgLiBlbmQgfAogICAgLiBhcyAkc3RhdGUgfAogICAgaWYgKCRpdGVtfGxlbmd0aCkgPiAxIGFuZCAoJGl0ZW1bMF18bGVuZ3RoKSA+IDAgdGhlbgogICAgICBbLlswXXxzZXRwYXRoKCgkaXRlbXwuWzBdKTsgKCRpdGVtfC5bMV0pKSwKICAgICAgdHJ1ZSwKICAgICAgJHN0YXRlWzJdLAogICAgICAkc3RhdGVbM11dCiAgICBlbHNlIC4KICAgIGVuZDsKICAgIGlmICgkaXRlbVswXXxsZW5ndGgpID09IDEgYW5kICgkaXRlbXxsZW5ndGggPT0gMSkgYW5kIC5bM10gdGhlbiAuWzJdIGVsc2UgZW1wdHkgZW5kLAogICAgaWYgKCRpdGVtWzBdfGxlbmd0aCkgPT0gMCB0aGVuICRpdGVtWzFdIGVsc2UgZW1wdHkgZW5kCiAgICApOwpkZWYgdG9zdHJlYW06CiAge3N0cmluZzp0cnVlLG51bWJlcjp0cnVlLGJvb2xlYW46dHJ1ZSxudWxsOnRydWV9IGFzICRsZWFmX3R5cGVzIHwKICAuIGFzICRkb3QgfAogIGlmICRsZWFmX3R5cGVzWyRkb3R8dHlwZV0gb3IgbGVuZ3RoPT0wIHRoZW4gW1tdLCRkb3RdCiAgZWxzZQogICAgIyBXZSByZWFsbHkgbmVlZCBhIF9zdHJlYW1pbmdfIGZvcm0gb2YgYGtleXNgLgogICAgIyBXZSBjYW4gdXNlIGByYW5nZWAgZm9yIGFycmF5cywgYnV0IG5vdCBmb3Igb2JqZWN0cy4KICAgIGtleXNfdW5zb3J0ZWQgYXMgJGtleXMgfAogICAgJGtleXNbLTFdIGFzICRsYXN0fAogICAgKCgjIGZvciBlYWNoIGtleQogICAgICAka2V5c1tdIHwgLiBhcyAka2V5IHwKICAgICAgJGRvdFska2V5XSB8IC4gYXMgJGRvdCB8CiAgICAgICMgcmVjdXJzZSBvbiBlYWNoIGtleS92YWx1ZQogICAgICB0b3N0cmVhbXwuWzBdfD1bJGtleV0rLiksCiAgICAgIyB0aGVuIGFkZCB0aGUgY2xvc2luZyBtYXJrZXIKICAgICBbWyRsYXN0XV0pCiAgZW5kOwoKCiMgQXNzdW1pbmcgdGhlIGlucHV0IGFycmF5IGlzIHNvcnRlZCwgYnNlYXJjaC8xIHJldHVybnMKIyB0aGUgaW5kZXggb2YgdGhlIHRhcmdldCBpZiB0aGUgdGFyZ2V0IGlzIGluIHRoZSBpbnB1dCBhcnJheTsgYW5kIG90aGVyd2lzZQojICAoLTEgLSBpeCksIHdoZXJlIGl4IGlzIHRoZSBpbnNlcnRpb24gcG9pbnQgdGhhdCB3b3VsZCBsZWF2ZSB0aGUgYXJyYXkgc29ydGVkLgojIElmIHRoZSBpbnB1dCBpcyBub3Qgc29ydGVkLCBic2VhcmNoIHdpbGwgdGVybWluYXRlIGJ1dCB3aXRoIGlycmVsZXZhbnQgcmVzdWx0cy4KZGVmIGJzZWFyY2godGFyZ2V0KToKICBpZiBsZW5ndGggPT0gMCB0aGVuIC0xCiAgZWxpZiBsZW5ndGggPT0gMSB0aGVuCiAgICAgaWYgdGFyZ2V0ID09IC5bMF0gdGhlbiAwIGVsaWYgdGFyZ2V0IDwgLlswXSB0aGVuIC0xIGVsc2UgLTIgZW5kCiAgZWxzZSAuIGFzICRpbgogICAgIyBzdGF0ZSB2YXJpYWJsZTogW3N0YXJ0LCBlbmQsIGFuc3dlcl0KICAgICMgd2hlcmUgc3RhcnQgYW5kIGVuZCBhcmUgdGhlIHVwcGVyIGFuZCBsb3dlciBvZmZzZXRzIHRvIHVzZS4KICAgIHwgWzAsIGxlbmd0aC0xLCBudWxsXQogICAgfCB1bnRpbCggLlswXSA+IC5bMV0gOwogICAgICAgICAgICAgaWYgLlsyXSAhPSBudWxsIHRoZW4gKC5bMV0gPSAtMSkgICAgICAgICAgICAgICAjIGkuZS4gYnJlYWsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgKCAoICguWzFdICsgLlswXSkgLyAyICkgfCBmbG9vciApIGFzICRtaWQKICAgICAgICAgICAgICAgfCAkaW5bJG1pZF0gYXMgJG1vbmtleQogICAgICAgICAgICAgICB8IGlmICRtb25rZXkgPT0gdGFyZ2V0ICB0aGVuICguWzJdID0gJG1pZCkgICAjIHN1Y2Nlc3MKICAgICAgICAgICAgICAgICBlbGlmIC5bMF0gPT0gLlsxXSAgICAgdGhlbiAoLlsxXSA9IC0xKSAgICAgIyBmYWlsdXJlCiAgICAgICAgICAgICAgICAgZWxpZiAkbW9ua2V5IDwgdGFyZ2V0IHRoZW4gKC5bMF0gPSAoJG1pZCArIDEpKQogICAgICAgICAgICAgICAgIGVsc2UgKC5bMV0gPSAoJG1pZCAtIDEpKQogICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgZW5kICkKICAgIHwgaWYgLlsyXSA9PSBudWxsIHRoZW4gICAgICAgICAgIyBjb21wdXRlIHRoZSBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgaWYgJGluWyAuWzBdIF0gPCB0YXJnZXQgdGhlbiAoLTIgLS5bMF0pCiAgICAgICAgIGVsc2UgKC0xIC0uWzBdKQogICAgICAgICBlbmQKICAgICAgZWxzZSAuWzJdCiAgICAgIGVuZAogIGVuZDsKCiMgQXBwbHkgZiB0byBjb21wb3NpdGUgZW50aXRpZXMgcmVjdXJzaXZlbHksIGFuZCB0byBhdG9tcwpkZWYgd2FsayhmKToKICAuIGFzICRpbgogIHwgaWYgdHlwZSA9PSAib2JqZWN0IiB0aGVuCiAgICAgIHJlZHVjZSBrZXlzX3Vuc29ydGVkW10gYXMgJGtleQogICAgICAgICgge307IC4gKyB7ICgka2V5KTogICgkaW5bJGtleV0gfCB3YWxrKGYpKSB9ICkgfCBmCiAgZWxpZiB0eXBlID09ICJhcnJheSIgdGhlbiBtYXAoIHdhbGsoZikgKSB8IGYKICBlbHNlIGYKICBlbmQ7CgojIFNRTC1pc2ggb3BlcmF0b3JzIGhlcmU6CmRlZiBJTkRFWChzdHJlYW07IGlkeF9leHByKToKICByZWR1Y2Ugc3RyZWFtIGFzICRyb3cgKHt9OwogICAgLlskcm93fGlkeF9leHByfAogICAgICBpZiB0eXBlICE9ICJzdHJpbmciIHRoZW4gdG9qc29uCiAgICAgIGVsc2UgLgogICAgICBlbmRdIHw9ICRyb3cpOwpkZWYgSU5ERVgoaWR4X2V4cHIpOiBJTkRFWCguW107IGlkeF9leHByKTsKZGVmIEpPSU4oJGlkeDsgaWR4X2V4cHIpOgogIFsuW10gfCBbLiwgJGlkeFtpZHhfZXhwcl1dXTsKZGVmIEpPSU4oJGlkeDsgc3RyZWFtOyBpZHhfZXhwcik6CiAgc3RyZWFtIHwgWy4sICRpZHhbaWR4X2V4cHJdXTsKZGVmIEpPSU4oJGlkeDsgc3RyZWFtOyBpZHhfZXhwcjsgam9pbl9leHByKToKICBzdHJlYW0gfCBbLiwgJGlkeFtpZHhfZXhwcl1dIHwgam9pbl9leHByOwpkZWYgSU4ocyk6IHJlZHVjZSAoZmlyc3Qoc2VsZWN0KC4gPT0gcykpIHwgdHJ1ZSkgYXMgJHYgKGZhbHNlOyBpZiAuIG9yICR2IHRoZW4gdHJ1ZSBlbHNlIGZhbHNlIGVuZCk7CmRlZiBJTihzcmM7IHMpOiByZWR1Y2UgKHNyY3xJTihzKSkgYXMgJHYgKGZhbHNlOyBpZiAuIG9yICR2IHRoZW4gdHJ1ZSBlbHNlIGZhbHNlIGVuZCk7CmRlZiBleHAxMDogIkVycm9yOiBleHAxMC8wIG5vdCBmb3VuZCBhdCBidWlsZCB0aW1lInxlcnJvcjtkZWYgZ2FtbWE6ICJFcnJvcjogZ2FtbWEvMCBub3QgZm91bmQgYXQgYnVpbGQgdGltZSJ8ZXJyb3I7ZGVmIHBvdzEwOiAiRXJyb3I6IHBvdzEwLzAgbm90IGZvdW5kIGF0IGJ1aWxkIHRpbWUifGVycm9yO2RlZiBtb2RmOiAiRXJyb3I6IG1vZGYvMCBub3QgZm91bmQgZm91bmQgYXQgYnVpbGQgdGltZSJ8ZXJyb3I7ZGVmIGxnYW1tYV9yOiAiRXJyb3I6IGxnYW1tYV9yLzAgbm90IGZvdW5kIGZvdW5kIGF0IGJ1aWxkIHRpbWUifGVycm9yOwBqdl9pc192YWxpZCh2YWwpAHIAPGludmFsaWQ+AGVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5CgBTdGFydCBhbmQgZW5kIGluZGljZXMgb2YgYW4gYXJyYXkgc2xpY2UgbXVzdCBiZSBudW1iZXJzAENvdWxkIG5vdCBvcGVuICVzOiAlcwBuZgBtaW4gPD0gc3RhcnQALmpxAHBvcyA8IGwtPmxlbmd0aABqdl9nZXRfa2luZChwYXRoKSA9PSBKVl9LSU5EX1NUUklORwAiJS4qcyIAdW5leHBlY3RlZABtaXNtYXRjaABdAFlvdSBkaWRuJ3QgY2FsbCBvbmlnX2luaXRpYWxpemUoKSBleHBsaWNpdGx5AABBbG51bQBVUy1BU0NJSQAAVVRGLTgALS0AAHNyYy9jb21waWxlLmMAIW5lcnJvcnMAc3JjL2V4ZWN1dGUuYwBmb3BlbgBudWxsAFN0YXJ0IGFuZCBlbmQgaW5kaWNlcyBvZiBhbiBzdHJpbmcgc2xpY2UgbXVzdCBiZSBudW1iZXJzAEl0J3MgYSBkaXJlY3RvcnkAaW5pdHkAKHAtPmN1cnJfYnVmID09IDAgfHwgcC0+Y3Vycl9idWZfcG9zID09IHAtPmN1cnJfYnVmX2xlbmd0aCkgJiYgInByZXZpb3VzIGJ1ZmZlciBub3QgZXhoYXVzdGVkIgAwMTIzNDU2Nzg5OwBzcmMvanZfdW5pY29kZS5jAGRlcHMAc3JjL2xvY2ZpbGUuYwBzcmMvdXRpbC5jAGZsZXggc2Nhbm5lciBqYW1tZWQAanE6IGVycm9yOiAlcyAoVW5peCBzaGVsbCBxdW90aW5nIGlzc3Vlcz8pAG5vIHN1cHBvcnQgaW4gdGhpcyBjb25maWd1cmF0aW9uAHJlZ3VsYXIgZXhwcmVzc2lvbiBoYXMgJyVzJyB3aXRob3V0IGVzY2FwZQBBbHBoYQBuAC1MIHRha2VzIGEgcGFyYW1ldGVyOiAoZS5nLiAtTCAvc2VhcmNoL3BhdGggb3IgLUwvc2VhcmNoL3BhdGgpCgBwYXJhbXMAb3Bjb2RlX2Rlc2NyaWJlKExPQURLKS0+ZmxhZ3MgJiBPUF9IQVNfQ09OU1RBTlQAc3JjL2J1aWx0aW4uYwAwAGpxAGJvb2xlYW4AQ2Fubm90IGluZGV4ICVzIHdpdGggc3RyaW5nICIlcyIAcgBhbgBzcmMvanZfcGFyc2UuYwAAaW4gPD0gZW5kAE1vZHVsZSBzZWFyY2ggcGF0aCBtdXN0IGJlIGFuIGFycmF5AGxpbmUtMSA8IGwtPm5saW5lcwAlcy8lcwBmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZABqcTogZXJyb3I6ICVzAGZhaWwgdG8gbWVtb3J5IGFsbG9jYXRpb24AWwBCbGFuawB6AHNsdXJwACwgAChvcGNvZGVfZGVzY3JpYmUoU1RPUkVfR0xPQkFMKS0+ZmxhZ3MgJiAoT1BfSEFTX0NPTlNUQU5UIHwgT1BfSEFTX1ZBUklBQkxFIHwgT1BfSEFTX0JJTkRJTkcpKSA9PSAoT1BfSEFTX0NPTlNUQU5UIHwgT1BfSEFTX1ZBUklBQkxFIHwgT1BfSEFTX0JJTkRJTkcpAEhPTUUAcGF0aF9sZW4gPj0gMABzcmMvanFfdGVzdC5jAG51bWJlcgBDYW5ub3QgaW5kZXggJXMgd2l0aCAlcwAATWFsZm9ybWVkIEJPTQAbWzE7MzBtAGxlbmd0aCA+IDAATW9kdWxlIHBhdGggbXVzdCBiZSBhIHN0cmluZwBqcTogZXJyb3I6ICVzCjx1bmtub3duIGxvY2F0aW9uPgBDb3VsZCBub3QgZXhwYW5kICVzLiAoJXMpAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBqcV95eV9jcmVhdGVfYnVmZmVyKCkASW52YWxpZCBsaXRlcmFsAG1hdGNoLXN0YWNrIGxpbWl0IG92ZXIALQBDbnRybAB6enp6AHJhdy1vdXRwdXQAJXMAb3Bjb2RlX2Rlc2NyaWJlKFBVU0hLX1VOREVSKS0+ZmxhZ3MgJiBPUF9IQVNfQ09OU1RBTlQALy5qcQBwYXRoX2xlbiA9PSAwAEpRX0xJQlJBUllfUEFUSABzdHJpbmcAMCA8PSBzdGFydCAmJiBzdGFydCA8PSBlbmQgJiYgZW5kIDw9IGFycmF5X2xlbgBFcnJvciByZWFkaW5nIGZyb20gJXMAb3V0cHV0IHByb2R1Y2VkABtbMDszOW0AY29kZXBvaW50ID49IDAgJiYgY29kZXBvaW50IDw9IDB4MTBGRkZGACVzIGF0ICVzLCBsaW5lICVkOgolLipzJSpzAEhPTUUAb3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIGpxX3l5X3NjYW5fYnVmZmVyKCkATW9kdWxlIG1ldGFkYXRhIG11c3QgYmUgY29uc3RhbnQAcGFyc2UgZGVwdGggbGltaXQgb3ZlcgBjaGFyYWN0ZXIgY2xhc3MgaGFzICclcycgd2l0aG91dCBlc2NhcGUARGlnaXQAbW4AY29tcGFjdC1vdXRwdXQAYmxvY2tfaXNfY29uc3QoYikAPGJ1aWx0aW4+AGpxLT5lcnJfY2IAVGVzdGluZyAnJXMnIGF0IGxpbmUgbnVtYmVyICV1CgBhcnJheQBzcmMvanZfYXV4LmMAJXMgYXQgbGluZSAlZCwgY29sdW1uICVkIChuZWVkIFJTIHRvIHJlc3luYykAG1swOzMybQBvdXQgLSBzdGFydCA9PSBqdnBfdXRmOF9lbmNvZGVfbGVuZ3RoKGNvZGVwb2ludCkAJXMvJXMlcwAAQ291bGQgbm90IGZpbmQgaG9tZSBkaXJlY3RvcnkuAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiBqcV95eV9zY2FuX2J5dGVzKCkAUG9zc2libHkgdW50ZXJtaW5hdGVkICdpZicgc3RhdGVtZW50AHVuZGVmaW5lZCB0eXBlIChidWcpAGFsbnVtAEdyYXBoAGNuAGNvbG9yLW91dHB1dABuYW1lAG9wY29kZV9kZXNjcmliZShvcCktPmZsYWdzICYgT1BfSEFTX0JSQU5DSABlbXB0eQBwYwAqKiogVGVzdCBwcm9ncmFtIGNvbXBpbGVkIHRoYXQgc2hvdWxkIG5vdCBoYXZlIGF0IGxpbmUgJXU6ICVzCgBvYmplY3QAQSBzbGljZSBvZiBhbiBhcnJheSBjYW4gb25seSBiZSBhc3NpZ25lZCBhbm90aGVyIGFycmF5ACVzIGF0IGxpbmUgJWQsIGNvbHVtbiAlZAAbWzE7MzltACVzLyVzLyVzJXMAbGluZSA8IGwtPm5saW5lcwAhanZfaXNfdmFsaWQoc3RhdGUtPnNsdXJwZWQpAGJhZCBidWZmZXIgaW4ganFfeXlfc2Nhbl9ieXRlcygpAFBvc3NpYmx5IHVudGVybWluYXRlZCAndHJ5JyBzdGF0ZW1lbnQAaW50ZXJuYWwgcGFyc2VyIGVycm9yIChidWcpAGFscGhhAExvd2VyAGNpAG1vbm9jaHJvbWUtb3V0cHV0ACUqcyVzOiVkOgoAdGFyZ2V0Lmxhc3QAbm90AGp2X2dldF9raW5kKGpxLT5lcnJvcikgPT0gSlZfS0lORF9OVUxMACoqKiBFcnJvbmVvdXMgdGVzdCBwcm9ncmFtIGZhaWxlZCB3aXRoIHdyb25nIG1lc3NhZ2UgKCVzKSBhdCBsaW5lICV1OiAlcwoAMCAmJiAiaW52YWxpZCBraW5kIgBDYW5ub3QgdXBkYXRlIGZpZWxkIGF0ICVzIGluZGV4IG9mICVzAHAtPmN1cnJfYnVmX3BvcyA9PSBwLT5jdXJyX2J1Zl9sZW5ndGgAPHNraXBwZWQ6IHRvbyBkZWVwPgBqcS9tYWluAABqcV95eXNldF9saW5lbm8gY2FsbGVkIHdpdGggbm8gYnVmZmVyACpsYWJlbC0lcwBzdGFjayBlcnJvciAoYnVnKQBibGFuawBQcmludABtAGFzY2lpLW91dHB1dAAlMDRkIABibG9ja19pc19zaW5nbGUoYikAcGF0aAAqKiogVGVzdCBwcm9ncmFtIGZhaWxlZCB0byBjb21waWxlIGF0IGxpbmUgJXU6ICVzCgBzcmMvanYuYwBqdl9pc192YWxpZCh0KQBVbmZpbmlzaGVkIGFiYW5kb25lZCB0ZXh0IGF0IEVPRiBhdCBsaW5lICVkLCBjb2x1bW4gJWQAPGludmFsaWQ6AG1vZHVsZSBub3QgZm91bmQ6ICVzICglcykAY2IgPT0ganFfdXRpbF9pbnB1dF9uZXh0X2lucHV0X2NiAGpxX3l5c2V0X2NvbHVtbiBjYWxsZWQgd2l0aCBubyBidWZmZXIAX2Fzc2lnbgB1bmRlZmluZWQgYnl0ZWNvZGUgKGJ1ZykAY250cmwAUHVuY3QAYwB1bmJ1ZmZlcmVkACAlczolZABvcGNvZGVfZGVzY3JpYmUoYi5maXJzdC0+b3ApLT5mbGFncyAmIE9QX0hBU19CUkFOQ0gAYXJnAGp2X2dldF9raW5kKGludikgPT0gSlZfS0lORF9JTlZBTElEAGp2X2lzX3ZhbGlkKGspAFVuZmluaXNoZWQgc3RyaW5nIGF0IEVPRiBhdCBsaW5lICVkLCBjb2x1bW4gJWQAPgBtb2R1bGUgbm90IGZvdW5kOiAlcwBmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkAF9tb2RpZnkAdW5leHBlY3RlZCBieXRlY29kZSAoYnVnKQBkaWdpdABTcGFjZQBpbm1hbmljaGFlYW4Ac29ydC1rZXlzAF4lZABvcGNvZGVfZGVzY3JpYmUob3ApLT5mbGFncyAmIE9QX0hBU19CSU5ESU5HAHJhbmdldmFyACB8IABqdl9nZXRfa2luZChqKSA9PSBKVl9LSU5EX05VTUJFUgBDYW5ub3QgY2hlY2sgd2hldGhlciAlcyBoYXMgYSAlcyBrZXkAJXMgYXQgRU9GIGF0IGxpbmUgJWQsIGNvbHVtbiAlZAA8aW52YWxpZD4AanZfZ2V0X2tpbmQoc2VhcmNoX3BhdGgpID09IEpWX0tJTkRfQVJSQVkAPHVua25vd24+AGZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3cAX25lZ2F0ZQBkZWZhdWx0IG11bHRpYnl0ZS1lbmNvZGluZyBpcyBub3Qgc2V0dGVkAGdyYXBoAFVwcGVyAG1hbmkAcmF3LWlucHV0ACAlcwBvcGNvZGVfZGVzY3JpYmUob3ApLT5mbGFncyAmIE9QX0hBU19WQVJJQUJMRQByYW5nZXN0YXJ0ACB8fCAAKioqIElucHV0IGlzIGludmFsaWQgb24gbGluZSAldTogJXMKAGp2X2dldF9raW5kKGopID09IEpWX0tJTkRfQVJSQVkAUGF0aCBtdXN0IGJlIHNwZWNpZmllZCBhcyBhbiBhcnJheQBVbmZpbmlzaGVkIEpTT04gdGVybSBhdCBFT0YgYXQgbGluZSAlZCwgY29sdW1uICVkADAgJiYgIkludmFsaWQgdmFsdWUiAHNyYy9saW5rZXIuYwAlczolbHUAaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZABEaXZpc2lvbiBieSB6ZXJvPwBjYW4ndCBjb252ZXJ0IHRvIHdpZGUtY2hhciBvbiBzcGVjaWZpZWQgbXVsdGlieXRlLWVuY29kaW5nAGxvd2VyAFhEaWdpdABtYwBudWxsLWlucHV0ACAlMDRkAGJsb2NrX2lzX3NpbmdsZShiaW5kZXIpAHN0YXJ0AAk8YmFja3RyYWNraW5nPgAqKiogRXhwZWN0ZWQgcmVzdWx0IGlzIGludmFsaWQgb24gbGluZSAldTogJXMKAE91dCBvZiBib3VuZHMgbmVnYXRpdmUgYXJyYXkgaW5kZXgAUGF0aHMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYW4gYXJyYXkAUG90ZW50aWFsbHkgdHJ1bmNhdGVkIHRvcC1sZXZlbCBudW1lcmljIHZhbHVlIGF0IEVPRiBhdCBsaW5lICVkLCBjb2x1bW4gJWQAc3JjL2p2X3ByaW50LmMALgBVbmtub3duIGlucHV0IGZpbGVuYW1lAG91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9nZXRfbmV4dF9idWZmZXIoKQBSZW1haW5kZXIgYnkgemVybz8AZmFpbCB0byBpbml0aWFsaXplAHByaW50AEFTQ0lJAGNjAGZyb20tZmlsZQA6OgBlbmQAKioqIEluc3VmZmljaWVudCByZXN1bHRzIGZvciB0ZXN0IGF0IGxpbmUgbnVtYmVyICV1OiAlcwoAanZfZ2V0X2tpbmQoYSkgPT0gSlZfS0lORF9BUlJBWQBQYXRoIG11c3QgYmUgc3BlY2lmaWVkIGFzIGFycmF5LCBub3QgJXMAVW5leHBlY3RlZCBleHRyYSBKU09OIHZhbHVlcwBudWxsACRPUklHSU4vAFVua25vd24gaW5wdXQgbGluZSBudW1iZXIAb3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIGpxX3l5ZW5zdXJlX2J1ZmZlcl9zdGFjaygpAE1vZHVsZSBtZXRhZGF0YSBtdXN0IGJlIGFuIG9iamVjdABpbnZhbGlkIGFyZ3VtZW50AHB1bmN0AFdvcmQAcWFhaQBqb2luLW91dHB1dABsb2NhbHMAYmxvY2tfaGFzX29ubHlfYmluZGVycyhiaW5kZXIsIGJpbmRmbGFncykAcmFuZ2UAMCAmJiAiaW52YWxpZCBpbnN0cnVjdGlvbiIAKioqIEV4cGVjdGVkIABqdl9nZXRfa2luZChiKSA9PSBKVl9LSU5EX0FSUkFZADAgJiYgImp2X2tleXMgcGFzc2VkIHNvbWV0aGluZyBuZWl0aGVyIG9iamVjdCBub3IgYXJyYXkiAEV4cGVjdGVkIEpTT04gdmFsdWUAZmFsc2UAJXMvJXMAanE6IGVycm9yOiBDb3VsZCBub3Qgb3BlbiBmaWxlICVzOiAlcwoAb3V0IG9mIG1lbW9yeSBleHBhbmRpbmcgc3RhcnQtY29uZGl0aW9uIHN0YWNrAEltcG9ydCBwYXRoIG11c3QgYmUgY29uc3RhbnQAZW5kIHBhdHRlcm4gYXQgbGVmdCBicmFjZQBzcGFjZQBxYWFjAHRhYgAgJCVzOiVkACVzLyVpAGFjb3MAanZfaXNfdmFsaWQodikALCBidXQgZ290IABqdl9nZXRfa2luZChqKSA9PSBKVl9LSU5EX1NUUklORwAwICYmICJpbnZhbGlkIGtpbmQgcGFzc2VkIHRvIGp2X2NtcCIAJXMgKHdoaWxlIHBhcnNpbmcgJyVzJykAdHJ1ZQAlcwBJbnB1dCBlcnJvcjogJXMKAHN0YXJ0LWNvbmRpdGlvbiBzdGFjayB1bmRlcmZsb3cAAGVuZCBwYXR0ZXJuIGF0IGxlZnQgYnJhY2tldAB1cHBlcgBpbmNoYW0AaW5kZW50ACAlZABtZXRhZGF0YQBhY29zaABfX2pxACBmb3IgdGVzdCBhdCBsaW5lIG51bWJlciAldTogJXMKAGp2X2dldF9raW5kKGspID09IEpWX0tJTkRfU1RSSU5HAGp2X2dldF9raW5kKG9iamVjdHMpID09IEpWX0tJTkRfQVJSQVkAUG90ZW50aWFsbHkgdHJ1bmNhdGVkIHRvcC1sZXZlbCBudW1lcmljIHZhbHVlAFtdAE1vZHVsZXMgbXVzdCBiZSBuYW1lZCBieSByZWxhdGl2ZSBwYXRocyB1c2luZyAnLycsIG5vdCAnXCcgKCVzKQAtACVzCgB0ZXh0AGVtcHR5IGNoYXItY2xhc3MAeGRpZ2l0AG1hbmRhaWMAJXM6IC0taW5kZW50IHRha2VzIG9uZSBwYXJhbWV0ZXIKAExPQURLAGFzAGFzaW4AanEtPnN1YmV4cF9uZXN0ID4gMABqdl9lcXVhbChqdl9jb3B5KGV4cGVjdGVkKSwganZfY29weShyZXBhcnNlZCkpAGp2X2dldF9raW5kKHNlcCkgPT0gSlZfS0lORF9TVFJJTkcAanZfZ2V0X2tpbmQoa2V5cykgPT0gSlZfS0lORF9BUlJBWQBUcnVuY2F0ZWQgdmFsdWUAWwAvADxzdGRpbj4AcmVjdXJzZQBwcmVtYXR1cmUgZW5kIG9mIGNoYXItY2xhc3MAYXNjaWkAc20AJXM6IC0taW5kZW50IHRha2VzIGEgbnVtYmVyIGJldHdlZW4gLTEgYW5kIDcKAERVUABpc19kYXRhAGFzaW5oAGp2X2dldF9raW5kKCp2YXIpID09IEpWX0tJTkRfQVJSQVkAKioqIFN1cGVyZmx1b3VzIHJlc3VsdDogAGp2X2FycmF5X2xlbmd0aChqdl9jb3B5KG9iamVjdHMpKSA9PSBqdl9hcnJheV9sZW5ndGgoanZfY29weShrZXlzKSkAIWp2X2lzX3ZhbGlkKCpvdXQpACwKAC4uAHIAc3JjL2xleGVyLmwAZXJyb3IAZW5kIHBhdHRlcm4gYXQgZXNjYXBlAHdvcmQAc2MAc2VxAERVUE4AcmVscGF0aABhdGFuAGp2X2dldF9raW5kKG9ianYpID09IEpWX0tJTkRfT0JKRUNUACBmb3IgdGVzdCBhdCBsaW5lIG51bWJlciAldSwgJXMKAABzdGFydAAsAFJlbGF0aXZlIHBhdGhzIHRvIG1vZHVsZXMgbWF5IG5vdCB0cmF2ZXJzZSB0byBwYXJlbnQgZGlyZWN0b3JpZXMgKCVzKQBzdGF0ZQBicmVhayByZXF1aXJlcyBhIGxhYmVsIHRvIGJyZWFrIHRvAGVuZCBwYXR0ZXJuIGF0IG1ldGEAOl0AY2FucwBzdHJlYW0ARFVQMgBibG9ja19pc19zaW5nbGUoaW1wb3J0KSAmJiBpbXBvcnQuZmlyc3QtPm9wID09IERFUFMAYXRhbjIAQ2Fubm90IHVzZSAlcyAoJXMpIGFzIG9iamVjdCBrZXkAJWQgb2YgJWQgdGVzdHMgcGFzc2VkICglZCBtYWxmb3JtZWQpCgBsZW4gPj0gMABlbmQAcC0+dG9rZW5wb3MgPD0gcC0+dG9rZW5sZW4Ae30AbW9kdWxlIG5hbWVzIG11c3Qgbm90IGhhdmUgZXF1YWwgY29uc2VjdXRpdmUgY29tcG9uZW50czogJXMAdHJ5IC5bImZpZWxkIl0gaW5zdGVhZCBvZiAuZmllbGQgZm9yIHVudXN1YWxseSBuYW1lZCBmaWVsZHMAZW5kIHBhdHRlcm4gYXQgY29udHJvbAByZWR1bmRhbnQgbmVzdGVkIHJlcGVhdCBvcGVyYXRvcgBhc2NpaQBzdHJlYW0tZXJyb3JzAFBVU0hLX1VOREVSAGJsb2NrX2lzX2NvbnN0KG1ldGFkYXRhKSAmJiBibG9ja19jb25zdF9raW5kKG1ldGFkYXRhKSA9PSBKVl9LSU5EX09CSkVDVABhdGFuaABSYW5nZSBib3VuZHMgbXVzdCBiZSBudW1lcmljAGp2X2dldF9raW5kKG4pID09IEpWX0tJTkRfTlVNQkVSADAgPD0gc3RhcnQgJiYgc3RhcnQgPD0gZW5kICYmIGVuZCA8PSBsZW4AcC0+dG9rZW5wb3MgPCBwLT50b2tlbmxlbgAbWzBtAGlzX2RhdGEAZmlsZQBpbnZhbGlkIG1ldGEtY29kZSBzeW50YXgAbmVzdGVkIHJlcGVhdCBvcGVyYXRvciAlcyBhbmQgJXMgd2FzIHJlcGxhY2VkIHdpdGggJyVzJwBpbnNhbWFyaXRhbgBleGl0LXN0YXR1cwBQT1AAQGxhbWJkYQBjYnJ0AFYlZCA9IAAlJUZBSUwgSUdOT1JFIE1TRwoAMCA8PSBzdGFydCAmJiBzdGFydCA8PSBlbmQgJiYgZW5kIDw9IGxlbgBqdl9hcnJheV9sZW5ndGgoanZfYXJyYXlfZ2V0KGp2X2NvcHkocGF0aHMpLCBpKSkgPiBzdGFydABFeHBlY3RlZCBhIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcwAbWzM0OzFtAHJhdwBsaW5lAGludmFsaWQgY29udHJvbC1jb2RlIHN5bnRheAA/AGluY3VuZWlmb3JtAGFyZ3MATE9BRFYAY29sbGVjdABjb3MAICglZCkKAGpxOiBlcnJvcgBJbnZhbGlkIFVURi04IHN0cmluZwBDYW5ub3QgZGVsZXRlICVzIGVsZW1lbnQgb2YgYXJyYXkAJzonIG5vdCBhcyBwYXJ0IG9mIGFuIG9iamVjdAA6IAByZWxwYXRoAGZhbHNlAGNoYXItY2xhc3MgdmFsdWUgYXQgZW5kIG9mIHJhbmdlACoAcwBqc29uYXJncwBMT0FEVk4AcmVkdWNlAGNvc2gASW52YWxpZCBwYXRoIGV4cHJlc3Npb24gd2l0aCByZXN1bHQgJXMAJXMAanZfZ2V0X2tpbmQob2JqZWN0KSA9PSBKVl9LSU5EX09CSkVDVABDYW5ub3QgZGVsZXRlICVzIGZpZWxkIG9mIG9iamVjdABFeHBlY3RlZCBzdHJpbmcga2V5IGJlZm9yZSAnOicAOgBhcwB0cnVlAGNoYXItY2xhc3MgdmFsdWUgYXQgc3RhcnQgb2YgcmFuZ2UAKwBpbmFybWVuaWFuAGFyZwBTVE9SRVYAZm9yZWFjaABleHAASW52YWxpZCBwYXRoIGV4cHJlc3Npb24gbmVhciBhdHRlbXB0IHRvIGFjY2VzcyBlbGVtZW50ICVzIG9mICVzAHsiYSc6IjEyIn0AanZfZ2V0X2tpbmQoa2V5KSA9PSBKVl9LSU5EX1NUUklORwBDYW5ub3QgZGVsZXRlIGZpZWxkcyBmcm9tICVzAE9iamVjdCBrZXlzIG11c3QgYmUgc3RyaW5ncwBqdl9nZXRfa2luZChzdHIpID09IEpWX0tJTkRfU1RSSU5HACFqdl9pc192YWxpZChhcykgfHwganZfZ2V0X2tpbmQoYXMpID09IEpWX0tJTkRfU1RSSU5HAG51bGwAdW5tYXRjaGVkIHJhbmdlIHNwZWNpZmllciBpbiBjaGFyLWNsYXNzAD8/AHpzACVzOiAtLWFyZyB0YWtlcyB0d28gcGFyYW1ldGVycyAoZS5nLiAtLWFyZyB2YXJuYW1lIHZhbHVlKQoAU1RPUkVfR0xPQkFMAGZvdW5kAGV4cDIASW52YWxpZCBwYXRoIGV4cHJlc3Npb24gbmVhciBhdHRlbXB0IHRvIGl0ZXJhdGUgdGhyb3VnaCAlcwBqdl9nZXRfa2luZCh2KSA9PSBKVl9LSU5EX0lOVkFMSUQAanZfZ2V0X2tpbmQoYSkgPT0gSlZfS0lORF9PQkpFQ1QAJzonIHNob3VsZCBmb2xsb3cgYSBrZXkAYyAhPSAtMQBzZWFyY2gATWF5IG5lZWQgcGFyZW50aGVzZXMgYXJvdW5kIG9iamVjdCBrZXkgZXhwcmVzc2lvbgB0YXJnZXQgb2YgcmVwZWF0IG9wZXJhdG9yIGlzIG5vdCBzcGVjaWZpZWQAKj8AY3MAYXJnanNvbgBJTkRFWABsZWZ0LmZpcnN0LT5vcCA9PSBEVVAAZmxvb3IAb3Bjb2RlID09IEVBQ0ggfHwgb3Bjb2RlID09IEVBQ0hfT1BUAEV4cGVjdGVkIHNlcGFyYXRvciBiZXR3ZWVuIHZhbHVlcyBhdCBsaW5lIDEsIGNvbHVtbiA5ICh3aGlsZSBwYXJzaW5nICd7ImEnOiIxMiJ9JykAanZfZ2V0X2tpbmQoYikgPT0gSlZfS0lORF9PQkpFQ1QARXhwZWN0ZWQgdmFsdWUgYmVmb3JlICcsJwBcdSUwNHgALmpzb24AYXMAdGFyZ2V0IG9mIHJlcGVhdCBvcGVyYXRvciBpcyBpbnZhbGlkACs/AG1lACVzOiAtLWFyZ2pzb24gdGFrZXMgdHdvIHBhcmFtZXRlcnMgKGUuZy4gLS1hcmdqc29uIHZhcm5hbWUgdGV4dCkKAElOREVYX09QVABsZWZ0LmZpcnN0LT5uZXh0ICE9IE5VTEwAaHlwb3QAQ2Fubm90IGl0ZXJhdGUgb3ZlciAlcyAoJXMpAHN0cmNtcChqdl9zdHJpbmdfdmFsdWUodiksICJFeHBlY3RlZCBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMgYXQgbGluZSAxLCBjb2x1bW4gOSAod2hpbGUgcGFyc2luZyAne1wiYSc6XCIxMlwifScpIikgPT0gMABpdGVyICE9IElURVJfRklOSVNIRUQAJywnIG5vdCBhcyBwYXJ0IG9mIGFuIG9iamVjdCBvciBhcnJheQBcdSUwNHhcdSUwNHgAanE6IGVycm9yOiAlcwoAZGVmAG5lc3RlZCByZXBlYXQgb3BlcmF0b3IAAGluY29tbW9uaW5kaWNudW1iZXJmb3JtcwAlczogaW52YWxpZCBKU09OIHRleHQgcGFzc2VkIHRvIC0tYXJnanNvbgoARUFDSABsZWZ0LmZpcnN0LT5uZXh0LT5vcCA9PSBTVUJFWFBfQkVHSU4AajAARnVuY3Rpb24gdGFrZXMgdG9vIG1hbnkgYXJndW1lbnRzAGp2X2dldF9raW5kKGEpID09IEpWX0tJTkRfQVJSQVkAanZfZ2V0X2tpbmQoanZwX29iamVjdF9nZXRfc2xvdChvYmplY3QsaXRlciktPnN0cmluZykgPT0gSlZfS0lORF9TVFJJTkcAayA9PSBKVl9LSU5EX05VTEwAdW5rbm93biBlcnJvcgBtb2R1bGUAdW5tYXRjaGVkIGNsb3NlIHBhcmVudGhlc2lzACsgYW5kID8/AGluYXZlc3RhbgBhcmdmaWxlAEVBQ0hfT1BUAGxlZnQuZmlyc3QtPm5leHQtPm5leHQtPm9wID09IExPQURLAGoxAGpxLT5zdGtfdG9wID09IGZyYW1lX2N1cnJlbnQoanEpLT5yZXRkYXRhAGp2X2FycmF5X2xlbmd0aChqdl9jb3B5KGEpKSA9PSAwAGp2X2dldF9raW5kKHMpID09IEpWX0tJTkRfU1RSSU5HAE9iamVjdHMgbXVzdCBjb25zaXN0IG9mIGtleTp2YWx1ZSBwYWlycwBqcTogZXJyb3IgbG9hZGluZyBkYXRhIGZpbGUgJXM6ICVzCgBpbXBvcnQAZW5kIHBhdHRlcm4gd2l0aCB1bm1hdGNoZWQgcGFyZW50aGVzaXMAKz8gYW5kID8AaW50aGFpAHJhd2ZpbGUARk9SSwBfZXF1YWwAbG9nAGpxOiBlcnJvcjogb3V0IG9mIG1lbW9yeQoAanZfYXJyYXlfbGVuZ3RoKGp2X2NvcHkoYSkpID09IDEAVW5tYXRjaGVkICddJyBhdCB0aGUgdG9wLWxldmVsAGluY2x1ZGUAZW5kIHBhdHRlcm4gaW4gZ3JvdXAAaW5pcGFleHRlbnNpb25zAHNsdXJwZmlsZQBGT1JLX09QVABvYmplY3QAbG9nMTAAanE6IGVycm9yOiAlcwBqdl9udW1iZXJfdmFsdWUoanZfYXJyYXlfZ2V0KGp2X2NvcHkoYSksIDApKSA9PSA0MgBFeHBlY3RlZCBhbm90aGVyIGFycmF5IGVsZW1lbnQAaWYAdW5kZWZpbmVkIGdyb3VwIG9wdGlvbgBpbml0aWFscHVuY3R1YXRpb24AJXM6IC0tJXMgdGFrZXMgdHdvIHBhcmFtZXRlcnMgKGUuZy4gLS0lcyB2YXJuYW1lIGZpbGVuYW1lKQoASlVNUABfX2pxAGxvZzIAanZfZ2V0X2tpbmQoYXJncykgPT0gSlZfS0lORF9BUlJBWSB8fCBqdl9nZXRfa2luZChhcmdzKSA9PSBKVl9LSU5EX09CSkVDVABqdl9lcXVhbChqdl9jb3B5KGEpLCBqdl9jb3B5KGEpKQAhanZfaXNfdmFsaWQocC0+bmV4dCkAdGhlbgBpbnZhbGlkIFBPU0lYIGJyYWNrZXQgdHlwZQBpbmFuY2llbnRzeW1ib2xzACVzOiBCYWQgSlNPTiBpbiAtLSVzICVzICVzOiAlcwoASlVNUF9GAGVycm9yAHBvdwA8dG9wLWxldmVsPgBqdl9lcXVhbChqdl9jb3B5KGEyKSwganZfY29weShhMikpAFVubWF0Y2hlZCAnXScgaW4gdGhlIG1pZGRsZSBvZiBhbiBvYmplY3QAZWxzZQBpbnZhbGlkIHBhdHRlcm4gaW4gbG9vay1iZWhpbmQAaW50aGFhbmEAZGVidWctZHVtcC1kaXNhc20AQkFDS1RSQUNLAG5hbWUAcmVtYWluZGVyAGpxOiAlZCBjb21waWxlICVzAGp2X2VxdWFsKGp2X2NvcHkoYSksIGp2X2NvcHkoYTIpKQBpICsganZwX2FycmF5X29mZnNldChhKSA8IGFycmF5LT5sZW5ndGgAVW5tYXRjaGVkICd9JyBhdCB0aGUgdG9wLWxldmVsAGVsaWYAaW52YWxpZCByZXBlYXQgcmFuZ2Uge2xvd2VyLHVwcGVyfQBjZgBkZWJ1Zy10cmFjZT1hbGwAQVBQRU5EAGJjLT5nbG9iYWxzLT5uY2Z1bmN0aW9ucyA9PSBuY2Z1bmMAc2luAGVycm9ycwBqdl9lcXVhbChqdl9jb3B5KGEyKSwganZfY29weShhKSkARXhwZWN0ZWQgYW5vdGhlciBrZXk6dmFsdWUgcGFpcgByZWR1Y2UAdG9vIGJpZyBudW1iZXIAaW5jdW5laWZvcm1udW1iZXJzYW5kcHVuY3R1YXRpb24AZGVidWctdHJhY2UASU5TRVJUAHNpbmgAZXJyb3IAIWp2X2VxdWFsKGp2X2NvcHkoYSksIGp2X2NvcHkoYTIpKQBjLT5jb3VudCA+IDAAVW5tYXRjaGVkICd9JyBpbiB0aGUgbWlkZGxlIG9mIGFuIGFycmF5AGZvcmVhY2gAdG9vIGJpZyBudW1iZXIgZm9yIHJlcGVhdCByYW5nZQBtdGVpAGhlbHAAUkFOR0UAIWEtPm5leHQAc3FydABKUV9PUklHSU4AIWp2X2VxdWFsKGp2X2NvcHkoYTIpLCBqdl9jb3B5KGEpKQBvdXQgPCBzLT5kYXRhICsgbWF4bGVuZ3RoAE1pc3NpbmcgdmFsdWUgaW4ga2V5OnZhbHVlIHBhaXIAZW5kAHVwcGVyIGlzIHNtYWxsZXIgdGhhbiBsb3dlciBpbiByZXBlYXQgcmFuZ2UAaW5zcGVjaWFscwB2ZXJzaW9uAFNVQkVYUF9CRUdJTgAhYi0+cHJldgB0YW4AUFJPR1JBTV9PUklHSU4AanZfZ2V0X3JlZmNudChhKSA9PSAxAGp2X2dldF9raW5kKGEpID09IEpWX0tJTkRfU1RSSU5HAEV4cGVjdGVkIGFub3RoZXIga2V5LXZhbHVlIHBhaXIAYW5kAGVtcHR5IHJhbmdlIGluIGNoYXIgY2xhc3MAaW5tdXNpY2Fsc3ltYm9scwBqcS0lcwoAU1VCRVhQX0VORAAob3Bjb2RlX2Rlc2NyaWJlKGJpbmRlci5maXJzdC0+b3ApLT5mbGFncyAmIGJpbmRmbGFncykgPT0gKGJpbmRmbGFncyAmIH5PUF9CSU5EX1dJTERDQVJEKQB0YW5oAEpRX0xJQlJBUllfUEFUSABqdl9hcnJheV9sZW5ndGgoanZfY29weShhKSkgPT0gMgBzLT5hbGxvY19sZW5ndGggPj0ganZwX3N0cmluZ19sZW5ndGgocykAVW5tYXRjaGVkICd9JwBvcgBtaXNtYXRjaCBtdWx0aWJ5dGUgY29kZSBsZW5ndGggaW4gY2hhci1jbGFzcyByYW5nZQBpbm1pc2NlbGxhbmVvdXNtYXRoZW1hdGljYWxzeW1ib2xzYQBIRUFELTM0MWE1ZmMtZGlydHkAUEFUSF9CRUdJTgBiaW5kZXIuZmlyc3QtPnN5bWJvbAB0Z2FtbWEAanZfZ2V0X2tpbmQoYXR0cnMpID09IEpWX0tJTkRfT0JKRUNUAGp2X2dldF9raW5kKHN1YmFycmF5KSA9PSBKVl9LSU5EX0FSUkFZAHNpemUgPiAwICYmIChzaXplICYgKHNpemUgLSAxKSkgPT0gMABFeGNlZWRzIGRlcHRoIGxpbWl0IGZvciBwYXJzaW5nAHRyeQB0b28gbWFueSBtdWx0aWJ5dGUgY29kZSByYW5nZXMgYXJlIHNwZWNpZmllZABsbQBydW4tdGVzdHMAUEFUSF9FTkQAYmluZGVyLmZpcnN0LT5ib3VuZF9ieSA9PSAwIHx8IGJpbmRlci5maXJzdC0+Ym91bmRfYnkgPT0gYmluZGVyLmZpcnN0AHkwACFqcS0+aGFsdGVkAGp2X2FycmF5X2xlbmd0aChqdl9jb3B5KHN1YmFycmF5KSkgPT0gMQBqdl9nZXRfa2luZChvKSA9PSBKVl9LSU5EX09CSkVDVABFeHBlY3RlZCBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMAY2F0Y2gAdG9vIHNob3J0IG11bHRpYnl0ZSBjb2RlIHN0cmluZwBsaW5hACVzOiBVbmtub3duIG9wdGlvbiAlcwoAQ0FMTF9CVUlMVElOAGJyZWFrX2Rpc3RhbmNlID49IDAAeTEAanEtPmN1cnJfZnJhbWUAanZfbnVtYmVyX3ZhbHVlKGp2X2FycmF5X2dldChqdl9jb3B5KHN1YmFycmF5KSwgMCkpID09IDQyACFqdnBfb2JqZWN0X2ZpbmRfc2xvdCgqb2JqZWN0LCBrZXksIGJ1Y2tldCkAcC0+c3RhY2twb3MgPiAxICYmIGp2X2dldF9raW5kKHAtPnN0YWNrW3AtPnN0YWNrcG9zLTJdKSA9PSBKVl9LSU5EX09CSkVDVABsYWJlbAB0b28gYmlnIGJhY2tyZWYgbnVtYmVyAGxjAEpRX0NPTE9SUwBDQUxMX0pRACphbm9ubGFiZWwAam4AZnAtPnJldGFkZHIgPj0gYmMtPmNvZGUgJiYgZnAtPnJldGFkZHIgPCBiYy0+Y29kZSArIGJjLT5jb2RlbGVuAGp2X2dldF9raW5kKHN1YjIpID09IEpWX0tJTkRfQVJSQVkAc2xvdABVbm1hdGNoZWQgJ10nAGJyZWFrAGludmFsaWQgYmFja3JlZiBudW1iZXIvbmFtZQBpbmx5Y2lhbgBGYWlsZWQgdG8gc2V0ICRKUV9DT0xPUlMKAFJFVABpLT5vcCA9PSBDTE9TVVJFX1BBUkFNAHluAGZwLT5yZXRhZGRyID09IDAAanZfYXJyYXlfbGVuZ3RoKGp2X2NvcHkoc3ViMikpID09IDIAanZwX3JlZmNudF91bnNoYXJlZChuZXdfb2JqZWN0LnUucHRyKQBwLT5zdGFja3BvcyA8PSBwLT5zdGFja2xlbgBfX2xvY19fAG51bWJlcmVkIGJhY2tyZWYvY2FsbCBpcyBub3QgYWxsb3dlZC4gKHVzZSBuYW1lKQBsYW5hAH4vLmpxAFRBSUxfQ0FMTF9KUQAwICYmICJVbmtub3duIGZ1bmN0aW9uIHR5cGUiAGNlaWwAanZfbnVtYmVyX3ZhbHVlKGp2X2FycmF5X2dldChqdl9jb3B5KHN1YjIpLCAwKSkgPT0gNDIAanZwX3JlZmNudF91bnNoYXJlZChvYmplY3QudS5wdHIpAHAtPnN0YWNrcG9zIDwgcC0+c3RhY2tsZW4Ac3ludGF4IGVycm9yAHRvbyBtYW55IGNhcHR1cmVzAGludGFpeHVhbmppbmdzeW1ib2xzACRPUklHSU4vLi4vbGliL2pxAENMT1NVUkVfUEFSQU0AdmFycyAhPSBOVUxMAGNvcHlzaWduAHZhciA8IGZyLT5iYy0+bmxvY2FscwBqdl9udW1iZXJfdmFsdWUoanZfYXJyYXlfZ2V0KGp2X2NvcHkoc3ViMiksIDEpKSA9PSAxOQAhanZwX29iamVjdF9maW5kX3Nsb3QobmV3X29iamVjdCwgc2xvdC0+c3RyaW5nLCBuZXdfYnVja2V0KQBFeHBlY3RlZCBlc2NhcGUgY2hhcmFjdGVyIGF0IGVuZCBvZiBzdHJpbmcARXJyb3I6IGRpc2NhcmRpbmcAdG9vIGJpZyB3aWRlLWNoYXIgdmFsdWUAaW5teWFubWFyZXh0ZW5kZWRhACRPUklHSU4vbGliAENMT1NVUkVfUkVGAGp2X2dldF9raW5kKCp2YXJzKSA9PSBKVl9LSU5EX09CSkVDVABkcmVtAG4yID09IG4xICsgMQBiZWZvcmUgPT0gYWZ0ZXIAbmV3X3Nsb3QASW52YWxpZCBcdVhYWFggZXNjYXBlAEVycm9yOiBwb3BwaW5nAHRvbyBsb25nIHdpZGUtY2hhciB2YWx1ZQBhbG51bQBKUV9MSUJSQVJZX1BBVEgAQ0xPU1VSRV9DUkVBVEUAY3VyciA9PSBiLmxhc3QAZXJmAHN1YmZuX2lkeCA8IGZyLT5iYy0+bnN1YmZ1bmN0aW9ucwBqdl9hcnJheV9sZW5ndGgoanZfY29weShhMykpID09IDMAc2xvdCA9PSAtMSB8fCAoc2xvdCA+PSAwICYmIHNsb3QgPCBqdnBfb2JqZWN0X3NpemUob2JqZWN0KSkASW52YWxpZCBjaGFyYWN0ZXJzIGluIFx1WFhYWCBlc2NhcGUAbWVtb3J5IGV4aGF1c3RlZABpbnZhbGlkIGNvZGUgcG9pbnQgdmFsdWUAc3Rlcm0ARXJyb3I6IG91dCBvZiBtZW1vcnkKAENMT1NVUkVfQ1JFQVRFX0MAY3Vyci0+b3AgIT0gQ0xPU1VSRV9SRUYgJiYgY3Vyci0+b3AgIT0gQ0xPU1VSRV9QQVJBTQBlcmZjAGp2X251bWJlcl92YWx1ZShqdl9hcnJheV9nZXQoanZfY29weShhMyksIDApKSA9PSA0MgBJbnZhbGlkIFx1WFhYWFx1WFhYWCBzdXJyb2dhdGUgcGFpciBlc2NhcGUAQ2xlYW51cDogZGlzY2FyZGluZyBsb29rYWhlYWQAZ3JvdXAgbmFtZSBpcyBlbXB0eQBpbnRhaXRoYW0ASlFfT1JJR0lOAFRPUABjdXJyLT5ib3VuZF9ieSA9PSBjdXJyAGV4cG0xAGNsb3N1cmUgPCBmci0+YmMtPm5jbG9zdXJlcwBqdl9hcnJheV9sZW5ndGgoanZfYXJyYXlfZ2V0KGp2X2NvcHkoYTMpLCAxKSkgPT0gMQBqdl9nZXRfa2luZChiKSA9PSBKVl9LSU5EX1NUUklORwBJbnZhbGlkIGVzY2FwZQBDbGVhbnVwOiBwb3BwaW5nAGludmFsaWQgZ3JvdXAgbmFtZSA8JW4+AGludHJhbnNwb3J0YW5kbWFwc3ltYm9scwBWRVJTSU9OX0RJUgBDTE9TVVJFX1BBUkFNX1JFR1VMQVIAZnVuY3Rpb24gY29tcGlsZWQgdG8gJWQgYnl0ZXMgd2hpY2ggaXMgdG9vIGxvbmcAZmFicwBuYXJncyA9PSBuZXdfZnJhbWUtPmJjLT5uY2xvc3VyZXMAanZfbnVtYmVyX3ZhbHVlKGp2X2FycmF5X2dldChqdl9jb3B5KGEzKSwgMikpID09IDE5AEludmFsaWQgc3RyaW5nOiBjb250cm9sIGNoYXJhY3RlcnMgZnJvbSBVKzAwMDAgdGhyb3VnaCBVKzAwMUYgbXVzdCBiZSBlc2NhcGVkAGpxOiBlcnJvcjogbGlicmFyeSBzaG91bGQgb25seSBoYXZlIGZ1bmN0aW9uIGRlZmluaXRpb25zLCBub3QgYSBtYWluIGV4cHJlc3Npb24AaW52YWxpZCBjaGFyIGluIGdyb3VwIG5hbWUgPCVuPgB0YWlsZQAlLipzLW1hc3RlcgBERVBTAGxvY2FscwBmZGltACVzCgBqdl9hcnJheV9sZW5ndGgoanZfY29weShhNCkpID09IDEAdHJ1ZQBibG9ja19oYXNfb25seV9iaW5kZXJzX2FuZF9pbXBvcnRzKCphbnN3ZXIsIE9QX0lTX0NBTExfUFNFVURPKQB1bmRlZmluZWQgbmFtZSA8JW4+IHJlZmVyZW5jZQBpbm1hbGF5YWxhbQAuAE1PRFVMRU1FVEEAcGFyYW0tPm9wID09IENMT1NVUkVfUEFSQU0AZm1hAGpxLT5zdGtfdG9wID09IDAAanZfYXJyYXlfbGVuZ3RoKGp2X2NvcHkoYTQpKSA9PSAyAGZhbHNlAHNyYy9wYXJzZXIueQB1bmRlZmluZWQgZ3JvdXAgPCVuPiByZWZlcmVuY2UAaW5taXNjZWxsYW5lb3Vzc3ltYm9scwAlczogJXMKAEdFTkxBQkVMAHBhcmFtLT5ib3VuZF9ieSA9PSBwYXJhbQBmbWF4AGpxLT5mb3JrX3RvcCA9PSAwAGp2X2FycmF5X2xlbmd0aChqdl9jb3B5KGE1KSkgPT0gMgBudWxsAHRtcABtdWx0aXBsZXggZGVmaW5lZCBuYW1lIDwlbj4AaW5jb250cm9scGljdHVyZXMAUFJPR1JBTV9PUklHSU4AREVTVFJVQ1RVUkVfQUxUAHBhcmFtcwBmbWluAGpxLT5jdXJyX2ZyYW1lID09IDAAanZfYXJyYXlfbGVuZ3RoKGp2X2FycmF5X2dldChqdl9jb3B5KGEpLCAxKSkgPT0gMQBJbnZhbGlkIGxpdGVyYWwAX3BsdXMAbXVsdGlwbGV4IGRlZmluaXRpb24gbmFtZSA8JW4+IGNhbGwAaW5taXNjZWxsYW5lb3Vzc3ltYm9sc2FuZGFycm93cwBwb3NpdGlvbmFsAFNUT1JFVk4AY3Vyci0+Ym91bmRfYnktPm9wID09IENMT1NVUkVfQ1JFQVRFX0MAZm1vZABmb28ASW52YWxpZCBudW1lcmljIGxpdGVyYWwAX21pbnVzAG5ldmVyIGVuZGluZyByZWN1cnNpb24AaW5saW5lYXJhAG5hbWVkACNJTlZBTElEACFjdXJyLT5hcmdsaXN0LmZpcnN0AGxnYW1tYQBzLT5saW1pdCA9PSAwICYmICJzdGFjayBmcmVlZCB3aGlsZSBub3QgZW1wdHkiAGp2X2VxdWFsKGp2X3N0cmluZygiZm9vIiksIGp2X3N0cmluZ19zaXplZCgiZm9vIiwgMykpAF9tdWx0aXBseQBncm91cCBudW1iZXIgaXMgdG9vIGJpZyBmb3IgY2FwdHVyZSBoaXN0b3J5AGlubWlzY2VsbGFuZW91c3N5bWJvbHNhbmRwaWN0b2dyYXBocwBBUkdTACUqcwBjdXJyLT5ib3VuZF9ieS0+b3AgPT0gQ0xPU1VSRV9DUkVBVEUgfHwgY3Vyci0+Ym91bmRfYnktPm9wID09IENMT1NVUkVfUEFSQU0AbG9nMXAAc3JjL2V4ZWNfc3RhY2suaABqdl9zdHJpbmdfbGVuZ3RoX2J5dGVzKGp2X2NvcHkoc2hvcnRzdHIpKSA9PSAoaW50KXN0cmxlbihuYXN0eSkAX2RpdmlkZQBpbnZhbGlkIGNoYXJhY3RlciBwcm9wZXJ0eSBuYW1lIHslbn0Ac2luaGFsYQAtAGN1cnItPmltbS50YXJnZXQtPmJ5dGVjb2RlX3BvcyAhPSAtMQBuZWFyYnlpbnQAbmFtZQBqdl9lcXVhbChqdl9jb3B5KGExKSwganZfY29weShhMikpAF9lcXVhbABpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIG9wdGlvbnMAZXh0AHBhcnNlIGVycm9yOiAlcwoAY3Vyci0+aW1tLnRhcmdldC0+Ynl0ZWNvZGVfcG9zID4gcG9zAG5leHRhZnRlcgB2YWx1ZQBqdl9lcXVhbChqdl9jb3B5KGEyKSwganZfY29weShhMSkpAF9ub3RlcXVhbABsaWJyYXJ5IGlzIG5vdCBpbml0aWFsaXplZABsYXRuAGlnbm9yaW5nIHBhcnNlIGVycm9yOiAlcwoAMCAmJiAiY29kZWdlbiBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgb3BlcmF0aW9uIgBuZXh0dG93YXJkACFqdl9lcXVhbChqdl9jb3B5KGExKSwganZfY29weShiKSkAX2xlc3MAdW5kZWZpbmVkIGVycm9yIGNvZGUAbGF0aW4ARXJyb3I6IHdyaXRpbmcgb3V0cHV0IGZhaWxlZDogJXMKAEVOVgByaW50AGp2X3N0cmluZ19oYXNoKGp2X2NvcHkoYTEpKSA9PSBqdl9zdHJpbmdfaGFzaChqdl9jb3B5KGExKSkAX2dyZWF0ZXIALi4uAGl0YWwAanEgLSBjb21tYW5kbGluZSBKU09OIHByb2Nlc3NvciBbdmVyc2lvbiAlc10KClVzYWdlOgklcyBbb3B0aW9uc10gPGpxIGZpbHRlcj4gW2ZpbGUuLi5dCgklcyBbb3B0aW9uc10gLS1hcmdzIDxqcSBmaWx0ZXI+IFtzdHJpbmdzLi4uXQoJJXMgW29wdGlvbnNdIC0tanNvbmFyZ3MgPGpxIGZpbHRlcj4gW0pTT05fVEVYVFMuLi5dCgpqcSBpcyBhIHRvb2wgZm9yIHByb2Nlc3NpbmcgSlNPTiBpbnB1dHMsIGFwcGx5aW5nIHRoZSBnaXZlbiBmaWx0ZXIgdG8KaXRzIEpTT04gdGV4dCBpbnB1dHMgYW5kIHByb2R1Y2luZyB0aGUgZmlsdGVyJ3MgcmVzdWx0cyBhcyBKU09OIG9uCnN0YW5kYXJkIG91dHB1dC4KClRoZSBzaW1wbGVzdCBmaWx0ZXIgaXMgLiwgd2hpY2ggY29waWVzIGpxJ3MgaW5wdXQgdG8gaXRzIG91dHB1dAp1bm1vZGlmaWVkIChleGNlcHQgZm9yIGZvcm1hdHRpbmcsIGJ1dCBub3RlIHRoYXQgSUVFRTc1NCBpcyB1c2VkCmZvciBudW1iZXIgcmVwcmVzZW50YXRpb24gaW50ZXJuYWxseSwgd2l0aCBhbGwgdGhhdCB0aGF0IGltcGxpZXMpLgoKRm9yIG1vcmUgYWR2YW5jZWQgZmlsdGVycyBzZWUgdGhlIGpxKDEpIG1hbnBhZ2UgKCJtYW4ganEiKQphbmQvb3IgaHR0cHM6Ly9zdGVkb2xhbi5naXRodWIuaW8vanEKCkV4YW1wbGU6CgoJJCBlY2hvICd7ImZvbyI6IDB9JyB8IGpxIC4KCXsKCQkiZm9vIjogMAoJfQoKAGpxOiBlcnJvcjogYnJlYWsgdXNlZCBvdXRzaWRlIGxhYmVsZWQgY29udHJvbCBzdHJ1Y3R1cmUAcm91bmQAanZfc3RyaW5nX2hhc2goanZfY29weShhMSkpID09IGp2X3N0cmluZ19oYXNoKGp2X2NvcHkoYTIpKQBfbGVzc2VxAGludGFtaWwARm9yIGEgbGlzdGluZyBvZiBvcHRpb25zLCB1c2UgJXMgLS1oZWxwLgoAanE6IGVycm9yOiAkJXMgaXMgbm90IGRlZmluZWQAc2NhbGIAanZfc3RyaW5nX2hhc2goanZfY29weShiKSkgIT0ganZfc3RyaW5nX2hhc2goanZfY29weShhMSkpAF9ncmVhdGVyZXEAJTAyeABpbm11bHRhbmkAU29tZSBvZiB0aGUgb3B0aW9ucyBpbmNsdWRlOgogIC1jICAgICAgICAgICAgICAgY29tcGFjdCBpbnN0ZWFkIG9mIHByZXR0eS1wcmludGVkIG91dHB1dDsKICAtbiAgICAgICAgICAgICAgIHVzZSBgbnVsbGAgYXMgdGhlIHNpbmdsZSBpbnB1dCB2YWx1ZTsKICAtZSAgICAgICAgICAgICAgIHNldCB0aGUgZXhpdCBzdGF0dXMgY29kZSBiYXNlZCBvbiB0aGUgb3V0cHV0OwogIC1zICAgICAgICAgICAgICAgcmVhZCAoc2x1cnApIGFsbCBpbnB1dHMgaW50byBhbiBhcnJheTsgYXBwbHkgZmlsdGVyIHRvIGl0OwogIC1yICAgICAgICAgICAgICAgb3V0cHV0IHJhdyBzdHJpbmdzLCBub3QgSlNPTiB0ZXh0czsKICAtUiAgICAgICAgICAgICAgIHJlYWQgcmF3IHN0cmluZ3MsIG5vdCBKU09OIHRleHRzOwogIC1DICAgICAgICAgICAgICAgY29sb3JpemUgSlNPTjsKICAtTSAgICAgICAgICAgICAgIG1vbm9jaHJvbWUgKGRvbid0IGNvbG9yaXplIEpTT04pOwogIC1TICAgICAgICAgICAgICAgc29ydCBrZXlzIG9mIG9iamVjdHMgb24gb3V0cHV0OwogIC0tdGFiICAgICAgICAgICAgdXNlIHRhYnMgZm9yIGluZGVudGF0aW9uOwogIC0tYXJnIGEgdiAgICAgICAgc2V0IHZhcmlhYmxlICRhIHRvIHZhbHVlIDx2PjsKICAtLWFyZ2pzb24gYSB2ICAgIHNldCB2YXJpYWJsZSAkYSB0byBKU09OIHZhbHVlIDx2PjsKICAtLXNsdXJwZmlsZSBhIGYgIHNldCB2YXJpYWJsZSAkYSB0byBhbiBhcnJheSBvZiBKU09OIHRleHRzIHJlYWQgZnJvbSA8Zj47CiAgLS1yYXdmaWxlIGEgZiAgICBzZXQgdmFyaWFibGUgJGEgdG8gYSBzdHJpbmcgY29uc2lzdGluZyBvZiB0aGUgY29udGVudHMgb2YgPGY+OwogIC0tYXJncyAgICAgICAgICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgc3RyaW5nIGFyZ3VtZW50cywgbm90IGZpbGVzOwogIC0tanNvbmFyZ3MgICAgICAgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgSlNPTiBhcmd1bWVudHMsIG5vdCBmaWxlczsKICAtLSAgICAgICAgICAgICAgIHRlcm1pbmF0ZXMgYXJndW1lbnQgcHJvY2Vzc2luZzsKCk5hbWVkIGFyZ3VtZW50cyBhcmUgYWxzbyBhdmFpbGFibGUgYXMgJEFSR1MubmFtZWRbXSwgd2hpbGUKcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIGF2YWlsYWJsZSBhcyAkQVJHUy5wb3NpdGlvbmFsW10uCgpTZWUgdGhlIG1hbnBhZ2UgZm9yIG1vcmUgb3B0aW9ucy4KAGpxOiBlcnJvcjogJXMvJWQgaXMgbm90IGRlZmluZWQAc2NhbGJsbgBoZWxsbzQyIQBmdW5jbmFtZQBceCUwMngAdGFtbABVc2UgJXMgLS1oZWxwIGZvciBoZWxwIHdpdGggY29tbWFuZC1saW5lIG9wdGlvbnMsCgBvcGNvZGVfZGVzY3JpYmUoaS0+b3ApLT5mbGFncyAmIE9QX0lTX0NBTExfUFNFVURPAHNpZ25pZmljYW5kAGhlbGxvJWQlcwBmb3JtYXQAaW5ydW5pYwBvciBzZWUgdGhlIGpxIG1hbnBhZ2UsIG9yIG9ubGluZSBkb2NzICBhdCBodHRwczovL3N0ZWRvbGFuLmdpdGh1Yi5pby9qcQoAMCAmJiAiVW5rbm93biB0eXBlIG9mIHBhcmFtZXRlciIAdHJ1bmMAIQBzdGFydABpbmNhcmlhbgAjIQBpLT5vcCA9PSBDTE9TVVJFX0NSRUFURQBsZGV4cABqdl9lcXVhbChqdl9zdHJpbmcoImhlbGxvNDIhIiksIGp2X3N0cmluZ19mbXQoImhlbGxvJWQlcyIsIDQyLCAiISIpKQBDYW5ub3QgdXNlICVzICglcykgYXMgb2JqZWN0IGtleQBhcm1uAERFQlVHOgBjdXJyLT5vcCA9PSBDQUxMX0pRAGZyZXhwAGp2X3N0cmluZ19sZW5ndGhfYnl0ZXMoanZfY29weShzdHIpKSA9PSBzaXplb2YoYmlnKSAtIDEAc3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzAGFybWkAJXMKAGJjICYmIGJjID09IHRhcmdldC0+Y29tcGlsZWQAX21pbnVzAGp2X251bWJlcl92YWx1ZShqdl9vYmplY3RfZ2V0KGp2X2NvcHkobzEpLCBqdl9zdHJpbmcoImZvbyIpKSkgPT0gNDIAc3ludGF4IGVycm9yLCB1bmV4cGVjdGVkICVzLCBleHBlY3RpbmcgJXMgb3IgJXMgb3IgJXMAYXJtZW5pYW4AanE6IGVycm9yIChhdCAlcyk6ICVzCgBfbXVsdGlwbHkAanZfbnVtYmVyX3ZhbHVlKGp2X29iamVjdF9nZXQoanZfY29weShvMSksIGp2X3N0cmluZygiYmFyIikpKSA9PSAyNABzeW50YXggZXJyb3IsIHVuZXhwZWN0ZWQgJXMsIGV4cGVjdGluZyAlcyBvciAlcyBvciAlcyBvciAlcwBpbm15YW5tYXIAanE6IGVycm9yIChhdCAlcykgKG5vdCBhIHN0cmluZyk6ICVzCgBfZGl2aWRlAGp2X251bWJlcl92YWx1ZShqdl9vYmplY3RfZ2V0KGp2X2NvcHkobzIpLCBqdl9zdHJpbmcoImZvbyIpKSkgPT0gNDIwACRlbmQAaW5jeXJpbGxpYw=="),k(b,34340,"oU4AAAIAAAACAAAAAQAAAAEAAAABAAAAr08AAAAAAAABAAAAAQAAAAIAAAACAAAAkFAAAAAAAAABAAAAAQAAAAIAAAADAAAAglEAAAAAAAABAAAAAgAAAAMAAAAEAAAA91IAAAIAAAACAAAAAQAAAAIAAAAFAAAATlQAAAAAAAABAAAAAQAAAAAAAAAGAAAAP1UAAAQEAAADAAAAAQAAAAEAAAAHAAAA9VUAAAQEAAADAAAAAQAAAAEAAAAIAAAA1lYAAAQEAAADAAAAAQAAAAAAAAAJAAAAV1gAAIYEAAAE"),k(b,34576,"CgAAAH9ZAAAAAAAAAQAAAAIAAAABAAAACwAAANFaAAAAAAAAAQAAAAIAAAABAAAADAAAAEdcAAAAAAAAAQAAAAEAAAABAAAADQAAAFxdAAAAAAAAAQAAAAEAAAABAAAADgAAAIpeAAAIAAAAAg=="),k(b,34696,"DwAAACtfAAAIAAAAAg=="),k(b,34720,"EAAAAApgAAAIAAAAAg=="),k(b,34744,"EQAAAOtgAAAIAAAAAgAAAAEAAAAAAAAAEgAAAJNhAAAAAAAAAQ=="),k(b,34792,"EwAAAGJiAAAEBAAAAwAAAAEAAAAAAAAAFAAAABxjAAAAAAAAAQAAAAQAAAACAAAAFQAAALhjAAAEBAAAAwAAAAEAAAABAAAAFgAAAHZkAAAAAAAAAQAAAAEAAAACAAAAFwAAACxlAAAAAAAAAQAAAAIAAAACAAAAGAAAAGpmAAAAAAAAAQAAAAEAAAACAAAAGQAAAGBnAAAAAAAAAQAAAAIAAAABAAAAGgAAAGtoAAAgBAAAAwAAAP////8BAAAAGwAAAHhpAADABAAABAAAAAEAAAABAAAAHAAAAElqAAAAAAAAAQAAAAEAAAABAAAAHQAAACFrAADABAAABAAAAAEAAAABAAAAHgAAAAhsAACABA=="),k(b,35080,"HwAAAChtAACABAAAAg=="),k(b,35104,"IAAAANhtAACABA=="),k(b,35128,"IQAAAORuAACABA=="),k(b,35152,"IgAAANRvAAAAAAAAAQ=="),k(b,35176,"IwAAAMJwAACABA=="),k(b,35200,"JAAAADNyAAACAAAAAg=="),k(b,35224,"JQAAANpyAAACAAAAAg=="),k(b,35248,"JgAAAIhzAAAAAAAAAQAAAAAAAAABAAAAJwAAACl0AAAIAAAAAg=="),k(b,35296,"KAAAAPB0AAAEBAAAAwAAAAEAAAAAAAAA/////251"),k(b,35344,"XQAJPGhhbHRlZD4ARGlzYXNzZW1ibHk6AAAAAP////////////////////9nZW5fb3Bfc2ltcGxlAGdlbl9jb25zdABn