UNPKG

@jahands/typeid

Version:
2 lines 59.2 kB
var b=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$/i;function q(e){return typeof e=="string"&&b.test(e)}var S=q;var a=[];for(v=0;v<256;++v)a.push((v+256).toString(16).slice(1));var v;function y(e,r=0){return(a[e[r+0]]+a[e[r+1]]+a[e[r+2]]+a[e[r+3]]+"-"+a[e[r+4]]+a[e[r+5]]+"-"+a[e[r+6]]+a[e[r+7]]+"-"+a[e[r+8]]+a[e[r+9]]+"-"+a[e[r+10]]+a[e[r+11]]+a[e[r+12]]+a[e[r+13]]+a[e[r+14]]+a[e[r+15]]).toLowerCase()}function C(e,r=0){var t=y(e,r);if(!S(t))throw TypeError("Stringified UUID is invalid");return t}var c=C;var m,L=new Uint8Array(16);function I(){if(!m&&(m=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(L)}var D=null,T=null,x=0;function R(e,r,t){e=e||{};var f=r&&t||0,i=r||new Uint8Array(16),u=e.random||(e.rng||I)(),h=e.msecs!==void 0?e.msecs:Date.now(),d=e.seq!==void 0?e.seq:null,l=T,s=D;return h>x&&e.msecs===void 0&&(x=h,d!==null&&(l=null,s=null)),d!==null&&(d>2147483647&&(d=2147483647),l=d>>>19&4095,s=d&524287),(l===null||s===null)&&(l=u[6]&127,l=l<<8|u[7],s=u[8]&63,s=s<<8|u[9],s=s<<5|u[10]>>>3),h+1e4>x&&d===null?++s>524287&&(s=0,++l>4095&&(l=0,x++)):x=h,T=l,D=s,i[f++]=x/1099511627776&255,i[f++]=x/4294967296&255,i[f++]=x/16777216&255,i[f++]=x/65536&255,i[f++]=x/256&255,i[f++]=x&255,i[f++]=l>>>4&15|112,i[f++]=l&255,i[f++]=s>>>13&63|128,i[f++]=s>>>5&255,i[f++]=s<<3&255|u[10]&7,i[f++]=u[11],i[f++]=u[12],i[f++]=u[13],i[f++]=u[14],i[f++]=u[15],r||y(i)}var E=R;function A(e){let r,t=new Uint8Array(16);return t[0]=(r=parseInt(e.slice(0,8),16))>>>24,t[1]=r>>>16&255,t[2]=r>>>8&255,t[3]=r&255,t[4]=(r=parseInt(e.slice(9,13),16))>>>8,t[5]=r&255,t[6]=(r=parseInt(e.slice(14,18),16))>>>8,t[7]=r&255,t[8]=(r=parseInt(e.slice(19,23),16))>>>8,t[9]=r&255,t[10]=(r=parseInt(e.slice(24,36),16))/1099511627776&255,t[11]=r/4294967296&255,t[12]=r>>>24&255,t[13]=r>>>16&255,t[14]=r>>>8&255,t[15]=r&255,t}var o="0123456789abcdefghjkmnpqrstvwxyz",n=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,1,2,3,4,5,6,7,8,9,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,10,11,12,13,14,15,16,17,255,18,19,255,20,21,255,22,23,24,25,26,255,27,28,29,30,31,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]);function p(e){let r=new Array(26).fill("");if(e.length!==16)throw new Error(`Invalid length. Expected 16 bytes, got ${e.length}. Input: ${e}`);return r[0]=o[(e[0]&224)>>5],r[1]=o[e[0]&31],r[2]=o[(e[1]&248)>>3],r[3]=o[(e[1]&7)<<2|(e[2]&192)>>6],r[4]=o[(e[2]&62)>>1],r[5]=o[(e[2]&1)<<4|(e[3]&240)>>4],r[6]=o[(e[3]&15)<<1|(e[4]&128)>>7],r[7]=o[(e[4]&124)>>2],r[8]=o[(e[4]&3)<<3|(e[5]&224)>>5],r[9]=o[e[5]&31],r[10]=o[(e[6]&248)>>3],r[11]=o[(e[6]&7)<<2|(e[7]&192)>>6],r[12]=o[(e[7]&62)>>1],r[13]=o[(e[7]&1)<<4|(e[8]&240)>>4],r[14]=o[(e[8]&15)<<1|(e[9]&128)>>7],r[15]=o[(e[9]&124)>>2],r[16]=o[(e[9]&3)<<3|(e[10]&224)>>5],r[17]=o[e[10]&31],r[18]=o[(e[11]&248)>>3],r[19]=o[(e[11]&7)<<2|(e[12]&192)>>6],r[20]=o[(e[12]&62)>>1],r[21]=o[(e[12]&1)<<4|(e[13]&240)>>4],r[22]=o[(e[13]&15)<<1|(e[14]&128)>>7],r[23]=o[(e[14]&124)>>2],r[24]=o[(e[14]&3)<<3|(e[15]&224)>>5],r[25]=o[e[15]&31],r.join("")}function $(e){if(e.length!==26)throw new Error(`Invalid length. Expected 26 bytes, got ${e.length}. Input: ${e}`);let t=new TextEncoder().encode(e);if(n[t[0]]===255||n[t[1]]===255||n[t[2]]===255||n[t[3]]===255||n[t[4]]===255||n[t[5]]===255||n[t[6]]===255||n[t[7]]===255||n[t[8]]===255||n[t[9]]===255||n[t[10]]===255||n[t[11]]===255||n[t[12]]===255||n[t[13]]===255||n[t[14]]===255||n[t[15]]===255||n[t[16]]===255||n[t[17]]===255||n[t[18]]===255||n[t[19]]===255||n[t[20]]===255||n[t[21]]===255||n[t[22]]===255||n[t[23]]===255||n[t[24]]===255||n[t[25]]===255)throw new Error("Invalid base32 character");let f=new Uint8Array(16);return f[0]=n[t[0]]<<5|n[t[1]],f[1]=n[t[2]]<<3|n[t[3]]>>2,f[2]=(n[t[3]]&3)<<6|n[t[4]]<<1|n[t[5]]>>4,f[3]=(n[t[5]]&15)<<4|n[t[6]]>>1,f[4]=(n[t[6]]&1)<<7|n[t[7]]<<2|n[t[8]]>>3,f[5]=(n[t[8]]&7)<<5|n[t[9]],f[6]=n[t[10]]<<3|n[t[11]]>>2,f[7]=(n[t[11]]&3)<<6|n[t[12]]<<1|n[t[13]]>>4,f[8]=(n[t[13]]&15)<<4|n[t[14]]>>1,f[9]=(n[t[14]]&1)<<7|n[t[15]]<<2|n[t[16]]>>3,f[10]=(n[t[16]]&7)<<5|n[t[17]],f[11]=n[t[18]]<<3|n[t[19]]>>2,f[12]=(n[t[19]]&3)<<6|n[t[20]]<<1|n[t[21]]>>4,f[13]=(n[t[21]]&15)<<4|n[t[22]]>>1,f[14]=(n[t[22]]&1)<<7|n[t[23]]<<2|n[t[24]]>>3,f[15]=(n[t[24]]&7)<<5|n[t[25]],f}function V(e){if(e.length>63)return!1;let r,t,f;for(t=0,f=e.length;t<f;t+=1){r=e.charCodeAt(t);let i=r>96&&r<123,u=r===95;if((t===0||t===f-1)&&!i||!(i||u))return!1}return!0}var B=class extends Error{constructor(e){super(`Invalid prefix "${e}". Must be at most 63 ASCII letters [a-z_]`),this.name="InvalidPrefixError"}},M=class extends Error{constructor(e,r){super(`Invalid TypeId. Prefix mismatch. Expected ${e}, got ${r}`),this.name="PrefixMismatchError"}},j=class extends Error{constructor(e){super(`Invalid TypeId. Prefix cannot be empty when there's a separator: ${e}`),this.name="EmptyPrefixError"}},_=class extends Error{constructor(e){super(`Invalid length. Suffix should have 26 characters, got ${e}`),this.name="InvalidSuffixLengthError"}},H=class extends Error{constructor(e){super(`Invalid suffix. First character "${e}" must be in the range [0-7]`),this.name="InvalidSuffixCharacterError"}},O=class extends Error{constructor(e,r){super(`Cannot convert TypeID of type ${e} to type ${r}`),this.name="TypeIDConversionError"}};function P(e="",r=""){if(!V(e))throw new B(e);let t;if(r)t=r;else{let f=new Uint8Array(16);E(void 0,f),t=p(f)}if(t.length!==26)throw new _(t.length);if(t[0]>"7")throw new H(t[0]);return $(t),e===""?t:`${e}_${t}`}function z(e,r){let t,f,i=e.lastIndexOf("_");if(i===-1)t="",f=e;else if(t=e.substring(0,i),f=e.substring(i+1),!t)throw new j(e);if(!f)throw new _(0);if(r&&t!==r)throw new M(r,t);return P(t,f)}function f5(e){return{prefix:U(e),suffix:w(e)}}function U(e){let r=e.lastIndexOf("_");return r===-1?"":e.substring(0,r)}function w(e){let r=e.lastIndexOf("_");return r===-1?e:e.substring(r+1)}function X(e){return $(w(e))}function o5(e){return c(X(e))}function i5(e,r){let t=p(r);return e?`${e}_${t}`:t}function a5(e,r){let t=p(A(e));return r?`${r}_${t}`:t}var g=class{constructor(e,r=""){this.prefix=e,this.suffix=r;let t=P(e,r);this.prefix=U(t),this.suffix=w(t)}getType(){return this.prefix}getSuffix(){return this.suffix}asType(e){let r=this;if(r.prefix!==e)throw new O(r.prefix,e);return r}toUUIDBytes(){return $(this.suffix)}toUUID(){return c(this.toUUIDBytes())}toString(){return this.prefix===""?this.suffix:`${this.prefix}_${this.suffix}`}static fromString(e,r){let t=z(e,r);return new g(U(t),w(t))}static fromUUIDBytes(e,r){let t=p(r);return new g(e,t)}static fromUUID(e,r){let t=p(A(r));return new g(e,t)}};function s5(e="",r=""){return new g(e,r)}export{g as TypeID,z as fromString,a5 as fromUUID,i5 as fromUUIDBytes,w as getSuffix,U as getType,f5 as parseTypeId,o5 as toUUID,X as toUUIDBytes,s5 as typeid,P as typeidUnboxed}; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMTAuMC4wL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMTAuMC4wL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3V1aWRAMTAuMC4wL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwgIi4uLy4uLy4uL25vZGVfbW9kdWxlcy8ucG5wbS91dWlkQDEwLjAuMC9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdXVpZEAxMC4wLjAvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92Ny5qcyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZWlkLWpzQDEuMi4wL25vZGVfbW9kdWxlcy90eXBlaWQtanMvc3JjL3R5cGVpZC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZWlkLWpzQDEuMi4wL25vZGVfbW9kdWxlcy90eXBlaWQtanMvc3JjL3BhcnNlX3V1aWQudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3R5cGVpZC1qc0AxLjIuMC9ub2RlX21vZHVsZXMvdHlwZWlkLWpzL3NyYy9iYXNlMzIudHMiLCAiLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3R5cGVpZC1qc0AxLjIuMC9ub2RlX21vZHVsZXMvdHlwZWlkLWpzL3NyYy91bmJveGVkL3R5cGVpZC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZWlkLWpzQDEuMi4wL25vZGVfbW9kdWxlcy90eXBlaWQtanMvc3JjL3ByZWZpeC50cyIsICIuLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vdHlwZWlkLWpzQDEuMi4wL25vZGVfbW9kdWxlcy90eXBlaWQtanMvc3JjL3VuYm94ZWQvZXJyb3IudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtOF1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwfGZmZmZmZmZmLWZmZmYtZmZmZi1mZmZmLWZmZmZmZmZmZmZmZikkL2k7IiwgImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcbmZ1bmN0aW9uIHZhbGlkYXRlKHV1aWQpIHtcbiAgcmV0dXJuIHR5cGVvZiB1dWlkID09PSAnc3RyaW5nJyAmJiBSRUdFWC50ZXN0KHV1aWQpO1xufVxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwgImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG52YXIgYnl0ZVRvSGV4ID0gW107XG5mb3IgKHZhciBpID0gMDsgaSA8IDI1NjsgKytpKSB7XG4gIGJ5dGVUb0hleC5wdXNoKChpICsgMHgxMDApLnRvU3RyaW5nKDE2KS5zbGljZSgxKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5zYWZlU3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgLy9cbiAgLy8gTm90ZSB0byBmdXR1cmUtc2VsZjogTm8sIHlvdSBjYW4ndCByZW1vdmUgdGhlIGB0b0xvd2VyQ2FzZSgpYCBjYWxsLlxuICAvLyBSRUY6IGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZC9wdWxsLzY3NyNpc3N1ZWNvbW1lbnQtMTc1NzM1MTM1MVxuICByZXR1cm4gKGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDJdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgM11dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDVdXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA3XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDhdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMV1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxM11dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAxNV1dKS50b0xvd2VyQ2FzZSgpO1xufVxuZnVuY3Rpb24gc3RyaW5naWZ5KGFyciwgb2Zmc2V0ID0gMCkge1xuICB2YXIgdXVpZCA9IHVuc2FmZVN0cmluZ2lmeShhcnIsIG9mZnNldCk7XG4gIC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5naWZpZWQgVVVJRCBpcyBpbnZhbGlkJyk7XG4gIH1cbiAgcmV0dXJuIHV1aWQ7XG59XG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwgIi8vIFVuaXF1ZSBJRCBjcmVhdGlvbiByZXF1aXJlcyBhIGhpZ2ggcXVhbGl0eSByYW5kb20gIyBnZW5lcmF0b3IuIEluIHRoZSBicm93c2VyIHdlIHRoZXJlZm9yZVxuLy8gcmVxdWlyZSB0aGUgY3J5cHRvIEFQSSBhbmQgZG8gbm90IHN1cHBvcnQgYnVpbHQtaW4gZmFsbGJhY2sgdG8gbG93ZXIgcXVhbGl0eSByYW5kb20gbnVtYmVyXG4vLyBnZW5lcmF0b3JzIChsaWtlIE1hdGgucmFuZG9tKCkpLlxuXG52YXIgZ2V0UmFuZG9tVmFsdWVzO1xudmFyIHJuZHM4ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm5nKCkge1xuICAvLyBsYXp5IGxvYWQgc28gdGhhdCBlbnZpcm9ubWVudHMgdGhhdCBuZWVkIHRvIHBvbHlmaWxsIGhhdmUgYSBjaGFuY2UgdG8gZG8gc29cbiAgaWYgKCFnZXRSYW5kb21WYWx1ZXMpIHtcbiAgICAvLyBnZXRSYW5kb21WYWx1ZXMgbmVlZHMgdG8gYmUgaW52b2tlZCBpbiBhIGNvbnRleHQgd2hlcmUgXCJ0aGlzXCIgaXMgYSBDcnlwdG8gaW1wbGVtZW50YXRpb24uXG4gICAgZ2V0UmFuZG9tVmFsdWVzID0gdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKTtcbiAgICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCcpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ2V0UmFuZG9tVmFsdWVzKHJuZHM4KTtcbn0iLCAiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgeyB1bnNhZmVTdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbi8qKlxuICogVVVJRCBWNyAtIFVuaXggRXBvY2ggdGltZS1iYXNlZCBVVUlEXG4gKlxuICogVGhlIElFVEYgaGFzIHB1Ymxpc2hlZCBSRkM5NTYyLCBpbnRyb2R1Y2luZyAzIG5ldyBVVUlEIHZlcnNpb25zICg2LDcsOCkuIFRoaXNcbiAqIGltcGxlbWVudGF0aW9uIG9mIFY3IGlzIGJhc2VkIG9uIHRoZSBhY2NlcHRlZCwgdGhvdWdoIG5vdCB5ZXQgYXBwcm92ZWQsXG4gKiByZXZpc2lvbnMuXG4gKlxuICogUkZDIDk1NjI6aHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCBVbml2ZXJzYWxseSBVbmlxdWVcbiAqIElEZW50aWZpZXJzIChVVUlEcylcblxuICpcbiAqIFNhbXBsZSBWNyB2YWx1ZTpcbiAqIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NTYyLmh0bWwjbmFtZS1leGFtcGxlLW9mLWEtdXVpZHY3LXZhbHVlXG4gKlxuICogTW9ub3RvbmljIEJpdCBMYXlvdXQ6IFJGQyByZmM5NTYyLjYuMiBNZXRob2QgMSwgRGVkaWNhdGVkIENvdW50ZXIgQml0cyByZWY6XG4gKiAgICAgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzk1NjIuaHRtbCNzZWN0aW9uLTYuMi01LjFcbiAqXG4gKiAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMgMCAxIDIgMyA0IDUgNlxuICogICA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxXG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKiAgfCAgICAgICAgICB1bml4X3RzX21zICAgICAgICAgICB8ICB2ZXIgIHwgICAgICAgIHNlcV9oaSAgICAgICAgIHxcbiAqICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstK1xuICogIHx2YXJ8ICAgICAgICAgICAgICAgc2VxX2xvdyAgICAgICAgICAgICAgIHwgICAgICAgIHJhbmQgICAgICAgICB8XG4gKiAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLStcbiAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rXG4gKlxuICogc2VxIGlzIGEgMzEgYml0IHNlcmlhbGl6ZWQgY291bnRlcjsgY29tcHJpc2VkIG9mIDEyIGJpdCBzZXFfaGkgYW5kIDE5IGJpdFxuICogc2VxX2xvdywgYW5kIHJhbmRvbWx5IGluaXRpYWxpemVkIHVwb24gdGltZXN0YW1wIGNoYW5nZS4gMzEgYml0IGNvdW50ZXIgc2l6ZVxuICogd2FzIHNlbGVjdGVkIGFzIGFueSBiaXR3aXNlIG9wZXJhdGlvbnMgaW4gbm9kZSBhcmUgZG9uZSBhcyBfc2lnbmVkXyAzMiBiaXRcbiAqIGludHMuIHdlIGV4Y2x1ZGUgdGhlIHNpZ24gYml0LlxuICovXG5cbnZhciBfc2VxTG93ID0gbnVsbDtcbnZhciBfc2VxSGlnaCA9IG51bGw7XG52YXIgX21zZWNzID0gMDtcbmZ1bmN0aW9uIHY3KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIGluaXRpYWxpemUgYnVmZmVyIGFuZCBwb2ludGVyXG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgLy8gcm5kcyBpcyBVaW50OEFycmF5KDE2KSBmaWxsZWQgd2l0aCByYW5kb20gYnl0ZXNcbiAgdmFyIHJuZHMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gIC8vIG1pbGxpc2Vjb25kcyBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwXG4gIHZhciBtc2VjcyA9IG9wdGlvbnMubXNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubXNlY3MgOiBEYXRlLm5vdygpO1xuXG4gIC8vIHNlcSBpcyB1c2VyIHByb3ZpZGVkIDMxIGJpdCBjb3VudGVyXG4gIHZhciBzZXEgPSBvcHRpb25zLnNlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zZXEgOiBudWxsO1xuXG4gIC8vIGluaXRpYWxpemUgbG9jYWwgc2VxIGhpZ2gvbG93IHBhcnRzXG4gIHZhciBzZXFIaWdoID0gX3NlcUhpZ2g7XG4gIHZhciBzZXFMb3cgPSBfc2VxTG93O1xuXG4gIC8vIGNoZWNrIGlmIGNsb2NrIGhhcyBhZHZhbmNlZCBhbmQgdXNlciBoYXMgbm90IHByb3ZpZGVkIG1zZWNzXG4gIGlmIChtc2VjcyA+IF9tc2VjcyAmJiBvcHRpb25zLm1zZWNzID09PSB1bmRlZmluZWQpIHtcbiAgICBfbXNlY3MgPSBtc2VjcztcblxuICAgIC8vIHVubGVzcyB1c2VyIHByb3ZpZGVkIHNlcSwgcmVzZXQgc2VxIHBhcnRzXG4gICAgaWYgKHNlcSAhPT0gbnVsbCkge1xuICAgICAgc2VxSGlnaCA9IG51bGw7XG4gICAgICBzZXFMb3cgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHdlIGhhdmUgYSB1c2VyIHByb3ZpZGVkIHNlcVxuICBpZiAoc2VxICE9PSBudWxsKSB7XG4gICAgLy8gdHJpbSBwcm92aWRlZCBzZXEgdG8gMzEgYml0cyBvZiB2YWx1ZSwgYXZvaWRpbmcgb3ZlcmZsb3dcbiAgICBpZiAoc2VxID4gMHg3ZmZmZmZmZikge1xuICAgICAgc2VxID0gMHg3ZmZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBzcGxpdCBwcm92aWRlZCBzZXEgaW50byBoaWdoL2xvdyBwYXJ0c1xuICAgIHNlcUhpZ2ggPSBzZXEgPj4+IDE5ICYgMHhmZmY7XG4gICAgc2VxTG93ID0gc2VxICYgMHg3ZmZmZjtcbiAgfVxuXG4gIC8vIHJhbmRvbWx5IGluaXRpYWxpemUgc2VxXG4gIGlmIChzZXFIaWdoID09PSBudWxsIHx8IHNlcUxvdyA9PT0gbnVsbCkge1xuICAgIHNlcUhpZ2ggPSBybmRzWzZdICYgMHg3ZjtcbiAgICBzZXFIaWdoID0gc2VxSGlnaCA8PCA4IHwgcm5kc1s3XTtcbiAgICBzZXFMb3cgPSBybmRzWzhdICYgMHgzZjsgLy8gcGFkIGZvciB2YXJcbiAgICBzZXFMb3cgPSBzZXFMb3cgPDwgOCB8IHJuZHNbOV07XG4gICAgc2VxTG93ID0gc2VxTG93IDw8IDUgfCBybmRzWzEwXSA+Pj4gMztcbiAgfVxuXG4gIC8vIGluY3JlbWVudCBzZXEgaWYgd2l0aGluIG1zZWNzIHdpbmRvd1xuICBpZiAobXNlY3MgKyAxMDAwMCA+IF9tc2VjcyAmJiBzZXEgPT09IG51bGwpIHtcbiAgICBpZiAoKytzZXFMb3cgPiAweDdmZmZmKSB7XG4gICAgICBzZXFMb3cgPSAwO1xuICAgICAgaWYgKCsrc2VxSGlnaCA+IDB4ZmZmKSB7XG4gICAgICAgIHNlcUhpZ2ggPSAwO1xuXG4gICAgICAgIC8vIGluY3JlbWVudCBpbnRlcm5hbCBfbXNlY3MuIHRoaXMgYWxsb3dzIHVzIHRvIGNvbnRpbnVlIGluY3JlbWVudGluZ1xuICAgICAgICAvLyB3aGlsZSBzdGF5aW5nIG1vbm90b25pYy4gTm90ZSwgb25jZSB3ZSBoaXQgMTBrIG1pbGxpc2Vjb25kcyBiZXlvbmQgc3lzdGVtXG4gICAgICAgIC8vIGNsb2NrLCB3ZSB3aWxsIHJlc2V0IGJyZWFraW5nIG1vbm90b25pY2l0eSAoYWZ0ZXIgKDJeMzEpKjEwMDAwIGdlbmVyYXRpb25zKVxuICAgICAgICBfbXNlY3MrKztcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gcmVzZXR0aW5nOyB3ZSBoYXZlIGFkdmFuY2VkIG1vcmUgdGhhblxuICAgIC8vIDEwayBtaWxsaXNlY29uZHMgYmV5b25kIHN5c3RlbSBjbG9ja1xuICAgIF9tc2VjcyA9IG1zZWNzO1xuICB9XG4gIF9zZXFIaWdoID0gc2VxSGlnaDtcbiAgX3NlcUxvdyA9IHNlcUxvdztcblxuICAvLyBbYnl0ZXMgMC01XSA0OCBiaXRzIG9mIGxvY2FsIHRpbWVzdGFtcFxuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgLyAweDEwMDAwICYgMHhmZjtcbiAgYltpKytdID0gX21zZWNzIC8gMHgxMDAgJiAweGZmO1xuICBiW2krK10gPSBfbXNlY3MgJiAweGZmO1xuXG4gIC8vIFtieXRlIDZdIC0gc2V0IDQgYml0cyBvZiB2ZXJzaW9uICg3KSB3aXRoIGZpcnN0IDQgYml0cyBzZXFfaGlcbiAgYltpKytdID0gc2VxSGlnaCA+Pj4gNCAmIDB4MGYgfCAweDcwO1xuXG4gIC8vIFtieXRlIDddIHJlbWFpbmluZyA4IGJpdHMgb2Ygc2VxX2hpXG4gIGJbaSsrXSA9IHNlcUhpZ2ggJiAweGZmO1xuXG4gIC8vIFtieXRlIDhdIC0gdmFyaWFudCAoMiBiaXRzKSwgZmlyc3QgNiBiaXRzIHNlcV9sb3dcbiAgYltpKytdID0gc2VxTG93ID4+PiAxMyAmIDB4M2YgfCAweDgwO1xuXG4gIC8vIFtieXRlIDldIDggYml0cyBzZXFfbG93XG4gIGJbaSsrXSA9IHNlcUxvdyA+Pj4gNSAmIDB4ZmY7XG5cbiAgLy8gW2J5dGUgMTBdIHJlbWFpbmluZyA1IGJpdHMgc2VxX2xvdywgMyBiaXRzIHJhbmRvbVxuICBiW2krK10gPSBzZXFMb3cgPDwgMyAmIDB4ZmYgfCBybmRzWzEwXSAmIDB4MDc7XG5cbiAgLy8gW2J5dGVzIDExLTE1XSBhbHdheXMgcmFuZG9tXG4gIGJbaSsrXSA9IHJuZHNbMTFdO1xuICBiW2krK10gPSBybmRzWzEyXTtcbiAgYltpKytdID0gcm5kc1sxM107XG4gIGJbaSsrXSA9IHJuZHNbMTRdO1xuICBiW2krK10gPSBybmRzWzE1XTtcbiAgcmV0dXJuIGJ1ZiB8fCB1bnNhZmVTdHJpbmdpZnkoYik7XG59XG5leHBvcnQgZGVmYXVsdCB2NzsiLCAiaW1wb3J0IHsgc3RyaW5naWZ5IH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB7IHBhcnNlVVVJRCB9IGZyb20gXCIuL3BhcnNlX3V1aWRcIjtcbmltcG9ydCB7IGVuY29kZSwgZGVjb2RlIH0gZnJvbSBcIi4vYmFzZTMyXCI7XG5pbXBvcnQge1xuICB0eXBlaWRVbmJveGVkLFxuICBnZXRTdWZmaXgsXG4gIGdldFR5cGUsXG4gIGZyb21TdHJpbmcsXG59IGZyb20gXCIuL3VuYm94ZWQvdHlwZWlkXCI7XG5pbXBvcnQgeyBUeXBlSURDb252ZXJzaW9uRXJyb3IgfSBmcm9tIFwiLi91bmJveGVkL2Vycm9yXCI7XG5cbmV4cG9ydCBjbGFzcyBUeXBlSUQ8Y29uc3QgVCBleHRlbmRzIHN0cmluZz4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHByZWZpeDogVCwgcHJpdmF0ZSBzdWZmaXg6IHN0cmluZyA9IFwiXCIpIHtcbiAgICBjb25zdCB0eXBlSWRSYXcgPSB0eXBlaWRVbmJveGVkKHByZWZpeCwgc3VmZml4KTtcblxuICAgIHRoaXMucHJlZml4ID0gZ2V0VHlwZSh0eXBlSWRSYXcpO1xuICAgIHRoaXMuc3VmZml4ID0gZ2V0U3VmZml4KHR5cGVJZFJhdyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VHlwZSgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5wcmVmaXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VmZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc3VmZml4O1xuICB9XG5cbiAgcHVibGljIGFzVHlwZTxjb25zdCBVIGV4dGVuZHMgc3RyaW5nPihwcmVmaXg6IFUpOiBUeXBlSUQ8VT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzIGFzIHVua25vd24gYXMgVHlwZUlEPFU+O1xuICAgIGlmIChzZWxmLnByZWZpeCAhPT0gcHJlZml4KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUlEQ29udmVyc2lvbkVycm9yKHNlbGYucHJlZml4LCBwcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIHB1YmxpYyB0b1VVSURCeXRlcygpOiBVaW50OEFycmF5IHtcbiAgICByZXR1cm4gZGVjb2RlKHRoaXMuc3VmZml4KTtcbiAgfVxuXG4gIHB1YmxpYyB0b1VVSUQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3RyaW5naWZ5KHRoaXMudG9VVUlEQnl0ZXMoKSk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKTogVCBleHRlbmRzIFwiXCIgPyBzdHJpbmcgOiBgJHtUfV8ke3N0cmluZ31gIHtcbiAgICBpZiAodGhpcy5wcmVmaXggPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLnN1ZmZpeCBhcyBUIGV4dGVuZHMgXCJcIiA/IHN0cmluZyA6IGAke1R9XyR7c3RyaW5nfWA7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnByZWZpeH1fJHt0aGlzLnN1ZmZpeH1gIGFzIFQgZXh0ZW5kcyBcIlwiID8gc3RyaW5nIDogYCR7VH1fJHtzdHJpbmd9YDtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tU3RyaW5nPGNvbnN0IFQgZXh0ZW5kcyBzdHJpbmc+KFxuICAgIHN0cjogc3RyaW5nLFxuICAgIHByZWZpeD86IFRcbiAgKTogVHlwZUlEPFQ+IHtcbiAgICBjb25zdCB0eXBlSWRSYXcgPSBmcm9tU3RyaW5nKHN0ciwgcHJlZml4KTtcblxuICAgIHJldHVybiBuZXcgVHlwZUlEPFQ+KGdldFR5cGUodHlwZUlkUmF3KSBhcyBULCBnZXRTdWZmaXgodHlwZUlkUmF3KSk7XG4gIH1cblxuICBzdGF0aWMgZnJvbVVVSURCeXRlczxjb25zdCBUIGV4dGVuZHMgc3RyaW5nPihcbiAgICBwcmVmaXg6IFQsXG4gICAgYnl0ZXM6IFVpbnQ4QXJyYXlcbiAgKTogVHlwZUlEPFQ+IHtcbiAgICBjb25zdCBzdWZmaXggPSBlbmNvZGUoYnl0ZXMpO1xuICAgIHJldHVybiBuZXcgVHlwZUlEKHByZWZpeCwgc3VmZml4KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tVVVJRDxjb25zdCBUIGV4dGVuZHMgc3RyaW5nPihwcmVmaXg6IFQsIHV1aWQ6IHN0cmluZyk6IFR5cGVJRDxUPiB7XG4gICAgY29uc3Qgc3VmZml4ID0gZW5jb2RlKHBhcnNlVVVJRCh1dWlkKSk7XG4gICAgcmV0dXJuIG5ldyBUeXBlSUQocHJlZml4LCBzdWZmaXgpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0eXBlaWQ8VCBleHRlbmRzIHN0cmluZz4oKTogVHlwZUlEPFwiXCI+O1xuZXhwb3J0IGZ1bmN0aW9uIHR5cGVpZDxUIGV4dGVuZHMgc3RyaW5nPihwcmVmaXg6IFQpOiBUeXBlSUQ8VD47XG5leHBvcnQgZnVuY3Rpb24gdHlwZWlkPFQgZXh0ZW5kcyBzdHJpbmc+KHByZWZpeDogVCwgc3VmZml4OiBzdHJpbmcpOiBUeXBlSUQ8VD47XG5leHBvcnQgZnVuY3Rpb24gdHlwZWlkPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICBwcmVmaXg6IFQgPSBcIlwiIGFzIFQsXG4gIHN1ZmZpeDogc3RyaW5nID0gXCJcIlxuKTogVHlwZUlEPFQ+IHtcbiAgcmV0dXJuIG5ldyBUeXBlSUQocHJlZml4LCBzdWZmaXgpO1xufVxuIiwgIi8qIGVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVVVSUQodXVpZDogc3RyaW5nKSB7XG4gIGxldCB2O1xuICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheSgxNik7XG5cbiAgLy8gQmxvY2sgMVxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSAodiA+Pj4gMTYpICYgMHhmZjtcbiAgYXJyWzJdID0gKHYgPj4+IDgpICYgMHhmZjtcbiAgYXJyWzNdID0gdiAmIDB4ZmY7XG5cbiAgLy8gQmxvY2sgMlxuICBhcnJbNF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoOSwgMTMpLCAxNikpID4+PiA4O1xuICBhcnJbNV0gPSB2ICYgMHhmZjtcblxuICAvLyBCbG9jayAzXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjtcblxuICAvLyBCbG9jayA0XG4gIGFycls4XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxOSwgMjMpLCAxNikpID4+PiA4O1xuICBhcnJbOV0gPSB2ICYgMHhmZjtcblxuICAvLyBCbG9jayA1XG4gIGFyclsxMF0gPSAoKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDI0LCAzNiksIDE2KSkgLyAweDEwMDAwMDAwMDAwKSAmIDB4ZmY7XG4gIGFyclsxMV0gPSAodiAvIDB4MTAwMDAwMDAwKSAmIDB4ZmY7XG4gIGFyclsxMl0gPSAodiA+Pj4gMjQpICYgMHhmZjtcbiAgYXJyWzEzXSA9ICh2ID4+PiAxNikgJiAweGZmO1xuICBhcnJbMTRdID0gKHYgPj4+IDgpICYgMHhmZjtcbiAgYXJyWzE1XSA9IHYgJiAweGZmO1xuXG4gIHJldHVybiBhcnI7XG59XG4iLCAiLyogZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSAqL1xuY29uc3QgYWxwaGFiZXQ6IHN0cmluZyA9IFwiMDEyMzQ1Njc4OWFiY2RlZmdoamttbnBxcnN0dnd4eXpcIjtcblxuLy8gRGVjb2RpbmcgdGFibGVcbmNvbnN0IGRlYzogVWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KFtcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMyxcbiAgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCxcbiAgMHgxMSwgMHhmZiwgMHgxMiwgMHgxMywgMHhmZiwgMHgxNCwgMHgxNSwgMHhmZiwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSxcbiAgMHhmZiwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbiAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZixcbl0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlKHNyYzogVWludDhBcnJheSk6IHN0cmluZyB7XG4gIGNvbnN0IGRzdDogc3RyaW5nW10gPSBuZXcgQXJyYXkoMjYpLmZpbGwoXCJcIik7XG5cbiAgaWYgKHNyYy5sZW5ndGggIT09IDE2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgbGVuZ3RoLiBFeHBlY3RlZCAxNiBieXRlcywgZ290ICR7c3JjLmxlbmd0aH0uIElucHV0OiAke3NyY31gXG4gICAgKTtcbiAgfVxuXG4gIC8vIDEwIGJ5dGUgdGltZXN0YW1wXG4gIGRzdFswXSA9IGFscGhhYmV0WyhzcmNbMF0gJiAyMjQpID4+IDVdO1xuICBkc3RbMV0gPSBhbHBoYWJldFtzcmNbMF0gJiAzMV07XG4gIGRzdFsyXSA9IGFscGhhYmV0WyhzcmNbMV0gJiAyNDgpID4+IDNdO1xuICBkc3RbM10gPSBhbHBoYWJldFsoKHNyY1sxXSAmIDcpIDw8IDIpIHwgKChzcmNbMl0gJiAxOTIpID4+IDYpXTtcbiAgZHN0WzRdID0gYWxwaGFiZXRbKHNyY1syXSAmIDYyKSA+PiAxXTtcbiAgZHN0WzVdID0gYWxwaGFiZXRbKChzcmNbMl0gJiAxKSA8PCA0KSB8ICgoc3JjWzNdICYgMjQwKSA+PiA0KV07XG4gIGRzdFs2XSA9IGFscGhhYmV0Wygoc3JjWzNdICYgMTUpIDw8IDEpIHwgKChzcmNbNF0gJiAxMjgpID4+IDcpXTtcbiAgZHN0WzddID0gYWxwaGFiZXRbKHNyY1s0XSAmIDEyNCkgPj4gMl07XG4gIGRzdFs4XSA9IGFscGhhYmV0Wygoc3JjWzRdICYgMykgPDwgMykgfCAoKHNyY1s1XSAmIDIyNCkgPj4gNSldO1xuICBkc3RbOV0gPSBhbHBoYWJldFtzcmNbNV0gJiAzMV07XG5cbiAgLy8gMTYgYnl0ZXMgb2YgcmFuZG9tbmVzc1xuICBkc3RbMTBdID0gYWxwaGFiZXRbKHNyY1s2XSAmIDI0OCkgPj4gM107XG4gIGRzdFsxMV0gPSBhbHBoYWJldFsoKHNyY1s2XSAmIDcpIDw8IDIpIHwgKChzcmNbN10gJiAxOTIpID4+IDYpXTtcbiAgZHN0WzEyXSA9IGFscGhhYmV0WyhzcmNbN10gJiA2MikgPj4gMV07XG4gIGRzdFsxM10gPSBhbHBoYWJldFsoKHNyY1s3XSAmIDEpIDw8IDQpIHwgKChzcmNbOF0gJiAyNDApID4+IDQpXTtcbiAgZHN0WzE0XSA9IGFscGhhYmV0Wygoc3JjWzhdICYgMTUpIDw8IDEpIHwgKChzcmNbOV0gJiAxMjgpID4+IDcpXTtcbiAgZHN0WzE1XSA9IGFscGhhYmV0WyhzcmNbOV0gJiAxMjQpID4+IDJdO1xuICBkc3RbMTZdID0gYWxwaGFiZXRbKChzcmNbOV0gJiAzKSA8PCAzKSB8ICgoc3JjWzEwXSAmIDIyNCkgPj4gNSldO1xuICBkc3RbMTddID0gYWxwaGFiZXRbc3JjWzEwXSAmIDMxXTtcbiAgZHN0WzE4XSA9IGFscGhhYmV0WyhzcmNbMTFdICYgMjQ4KSA+PiAzXTtcbiAgZHN0WzE5XSA9IGFscGhhYmV0Wygoc3JjWzExXSAmIDcpIDw8IDIpIHwgKChzcmNbMTJdICYgMTkyKSA+PiA2KV07XG4gIGRzdFsyMF0gPSBhbHBoYWJldFsoc3JjWzEyXSAmIDYyKSA+PiAxXTtcbiAgZHN0WzIxXSA9IGFscGhhYmV0Wygoc3JjWzEyXSAmIDEpIDw8IDQpIHwgKChzcmNbMTNdICYgMjQwKSA+PiA0KV07XG4gIGRzdFsyMl0gPSBhbHBoYWJldFsoKHNyY1sxM10gJiAxNSkgPDwgMSkgfCAoKHNyY1sxNF0gJiAxMjgpID4+IDcpXTtcbiAgZHN0WzIzXSA9IGFscGhhYmV0WyhzcmNbMTRdICYgMTI0KSA+PiAyXTtcbiAgZHN0WzI0XSA9IGFscGhhYmV0Wygoc3JjWzE0XSAmIDMpIDw8IDMpIHwgKChzcmNbMTVdICYgMjI0KSA+PiA1KV07XG4gIGRzdFsyNV0gPSBhbHBoYWJldFtzcmNbMTVdICYgMzFdO1xuXG4gIHJldHVybiBkc3Quam9pbihcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZShzOiBzdHJpbmcpOiBVaW50OEFycmF5IHtcbiAgaWYgKHMubGVuZ3RoICE9PSAyNikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGxlbmd0aC4gRXhwZWN0ZWQgMjYgYnl0ZXMsIGdvdCAke3MubGVuZ3RofS4gSW5wdXQ6ICR7c31gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbiAgY29uc3QgdjogVWludDhBcnJheSA9IGVuY29kZXIuZW5jb2RlKHMpO1xuXG4gIC8vIENoZWNrIGlmIGFsbCB0aGUgY2hhcmFjdGVycyBhcmUgcGFydCBvZiB0aGUgZXhwZWN0ZWQgYmFzZTMyIGNoYXJhY3RlciBzZXQuXG4gIGlmIChcbiAgICBkZWNbdlswXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsxXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsyXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlszXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls0XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls1XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls2XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls3XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls4XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdls5XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsxMF1dID09PSAweGZmIHx8XG4gICAgZGVjW3ZbMTFdXSA9PT0gMHhmZiB8fFxuICAgIGRlY1t2WzEyXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsxM11dID09PSAweGZmIHx8XG4gICAgZGVjW3ZbMTRdXSA9PT0gMHhmZiB8fFxuICAgIGRlY1t2WzE1XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsxNl1dID09PSAweGZmIHx8XG4gICAgZGVjW3ZbMTddXSA9PT0gMHhmZiB8fFxuICAgIGRlY1t2WzE4XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsxOV1dID09PSAweGZmIHx8XG4gICAgZGVjW3ZbMjBdXSA9PT0gMHhmZiB8fFxuICAgIGRlY1t2WzIxXV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsyMl1dID09PSAweGZmIHx8XG4gICAgZGVjW3ZbMjNdXSA9PT0gMHhmZiB8fFxuICAgIGRlY1t2WzI0XV0gPT09IDB4ZmYgfHxcbiAgICBkZWNbdlsyNV1dID09PSAweGZmXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYmFzZTMyIGNoYXJhY3RlclwiKTtcbiAgfVxuXG4gIGNvbnN0IGlkID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuXG4gIC8vIDYgYnl0ZXMgdGltZXN0YW1wICg0OCBiaXRzKVxuICBpZFswXSA9IChkZWNbdlswXV0gPDwgNSkgfCBkZWNbdlsxXV07XG4gIGlkWzFdID0gKGRlY1t2WzJdXSA8PCAzKSB8IChkZWNbdlszXV0gPj4gMik7XG4gIGlkWzJdID0gKChkZWNbdlszXV0gJiAzKSA8PCA2KSB8IChkZWNbdls0XV0gPDwgMSkgfCAoZGVjW3ZbNV1dID4+IDQpO1xuICBpZFszXSA9ICgoZGVjW3ZbNV1dICYgMTUpIDw8IDQpIHwgKGRlY1t2WzZdXSA+PiAxKTtcbiAgaWRbNF0gPSAoKGRlY1t2WzZdXSAmIDEpIDw8IDcpIHwgKGRlY1t2WzddXSA8PCAyKSB8IChkZWNbdls4XV0gPj4gMyk7XG4gIGlkWzVdID0gKChkZWNbdls4XV0gJiA3KSA8PCA1KSB8IGRlY1t2WzldXTtcblxuICAvLyAxMCBieXRlcyBvZiBlbnRyb3B5ICg4MCBiaXRzKVxuICBpZFs2XSA9IChkZWNbdlsxMF1dIDw8IDMpIHwgKGRlY1t2WzExXV0gPj4gMik7XG4gIGlkWzddID0gKChkZWNbdlsxMV1dICYgMykgPDwgNikgfCAoZGVjW3ZbMTJdXSA8PCAxKSB8IChkZWNbdlsxM11dID4+IDQpO1xuICBpZFs4XSA9ICgoZGVjW3ZbMTNdXSAmIDE1KSA8PCA0KSB8IChkZWNbdlsxNF1dID4+IDEpO1xuICBpZFs5XSA9ICgoZGVjW3ZbMTRdXSAmIDEpIDw8IDcpIHwgKGRlY1t2WzE1XV0gPDwgMikgfCAoZGVjW3ZbMTZdXSA+PiAzKTtcbiAgaWRbMTBdID0gKChkZWNbdlsxNl1dICYgNykgPDwgNSkgfCBkZWNbdlsxN11dO1xuICBpZFsxMV0gPSAoZGVjW3ZbMThdXSA8PCAzKSB8IChkZWNbdlsxOV1dID4+IDIpO1xuICBpZFsxMl0gPSAoKGRlY1t2WzE5XV0gJiAzKSA8PCA2KSB8IChkZWNbdlsyMF1dIDw8IDEpIHwgKGRlY1t2WzIxXV0gPj4gNCk7XG4gIGlkWzEzXSA9ICgoZGVjW3ZbMjFdXSAmIDE1KSA8PCA0KSB8IChkZWNbdlsyMl1dID4+IDEpO1xuICBpZFsxNF0gPSAoKGRlY1t2WzIyXV0gJiAxKSA8PCA3KSB8IChkZWNbdlsyM11dIDw8IDIpIHwgKGRlY1t2WzI0XV0gPj4gMyk7XG4gIGlkWzE1XSA9ICgoZGVjW3ZbMjRdXSAmIDcpIDw8IDUpIHwgZGVjW3ZbMjVdXTtcblxuICByZXR1cm4gaWQ7XG59XG4iLCAiaW1wb3J0IHsgc3RyaW5naWZ5LCB2NyB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgeyBwYXJzZVVVSUQgfSBmcm9tIFwiLi4vcGFyc2VfdXVpZFwiO1xuaW1wb3J0IHsgZW5jb2RlLCBkZWNvZGUgfSBmcm9tIFwiLi4vYmFzZTMyXCI7XG5pbXBvcnQgeyBpc1ZhbGlkUHJlZml4IH0gZnJvbSBcIi4uL3ByZWZpeFwiO1xuaW1wb3J0IHtcbiAgRW1wdHlQcmVmaXhFcnJvcixcbiAgSW52YWxpZFByZWZpeEVycm9yLFxuICBJbnZhbGlkU3VmZml4Q2hhcmFjdGVyRXJyb3IsXG4gIEludmFsaWRTdWZmaXhMZW5ndGhFcnJvcixcbiAgUHJlZml4TWlzbWF0Y2hFcnJvcixcbn0gZnJvbSBcIi4vZXJyb3JcIjtcblxuZXhwb3J0IHR5cGUgVHlwZUlkPFQ+ID0gc3RyaW5nICYgeyBfX3R5cGU6IFQgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIHR5cGVpZFVuYm94ZWQ8VCBleHRlbmRzIHN0cmluZz4oXG4gIHByZWZpeDogVCA9IFwiXCIgYXMgVCxcbiAgc3VmZml4OiBzdHJpbmcgPSBcIlwiXG4pOiBUeXBlSWQ8VD4ge1xuICBpZiAoIWlzVmFsaWRQcmVmaXgocHJlZml4KSkge1xuICAgIHRocm93IG5ldyBJbnZhbGlkUHJlZml4RXJyb3IocHJlZml4KTtcbiAgfVxuXG4gIGxldCBmaW5hbFN1ZmZpeDogc3RyaW5nO1xuICBpZiAoc3VmZml4KSB7XG4gICAgZmluYWxTdWZmaXggPSBzdWZmaXg7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICAgIHY3KHVuZGVmaW5lZCwgYnVmZmVyKTtcbiAgICBmaW5hbFN1ZmZpeCA9IGVuY29kZShidWZmZXIpO1xuICB9XG5cbiAgaWYgKGZpbmFsU3VmZml4Lmxlbmd0aCAhPT0gMjYpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFN1ZmZpeExlbmd0aEVycm9yKGZpbmFsU3VmZml4Lmxlbmd0aCk7XG4gIH1cblxuICBpZiAoZmluYWxTdWZmaXhbMF0gPiBcIjdcIikge1xuICAgIHRocm93IG5ldyBJbnZhbGlkU3VmZml4Q2hhcmFjdGVyRXJyb3IoZmluYWxTdWZmaXhbMF0pO1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgdGhlIHN1ZmZpeCBieSBkZWNvZGluZyBpdC4gSWYgaXQncyBpbnZhbGlkLCBhbiBlcnJvciB3aWxsIGJlIHRocm93bi5cbiAgZGVjb2RlKGZpbmFsU3VmZml4KTtcblxuICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGZpbmFsU3VmZml4IGFzIFR5cGVJZDxUPjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYCR7cHJlZml4fV8ke2ZpbmFsU3VmZml4fWAgYXMgVHlwZUlkPFQ+O1xuICB9XG59XG5cbi8qKlxuICogQ29uc3RydWN0cyBhIFR5cGVJZCBmcm9tIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBvcHRpb25hbGx5IHZhbGlkYXRpbmcgYWdhaW5zdCBhIHByb3ZpZGVkIHByZWZpeC5cbiAqIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSBpbnB1dCBgdHlwZUlkYCBzdHJpbmcgYnkgYW4gdW5kZXJzY29yZSBgX2AgdG8gc2VwYXJhdGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LlxuICogSWYgdGhlIGB0eXBlSWRgIGNvbnRhaW5zIG5vIHVuZGVyc2NvcmUsIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBzdWZmaXggd2l0aCBhbiBlbXB0eSBwcmVmaXguXG4gKiBJZiBhIGBwcmVmaXhgIGlzIHByb3ZpZGVkLCBpdCBtdXN0IG1hdGNoIHRoZSBwcmVmaXggcGFydCBvZiB0aGUgYHR5cGVJZGAsIG9yIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZUlkIC0gVGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgVHlwZUlkIHRvIGJlIHBhcnNlZC5cbiAqIEBwYXJhbSB7VH0gW3ByZWZpeF0gLSBBbiBvcHRpb25hbCBwcmVmaXggdG8gdmFsaWRhdGUgYWdhaW5zdCB0aGUgcHJlZml4IGluIHRoZSBgdHlwZUlkYC5cbiAqIEByZXR1cm5zIHtUeXBlSWQ8VD59IEEgbmV3IFR5cGVJZCBpbnN0YW5jZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBwYXJzZWQgYHR5cGVJZGAuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGB0eXBlSWRgIGZvcm1hdCBpcyBpbnZhbGlkLCB0aGUgcHJlZml4IGlzIGVtcHR5IHdoZW4gdGhlcmUncyBhIHNlcGFyYXRvcixcbiAqICAgICAgICAgICAgICAgICBvciB0aGVyZSdzIGEgcHJlZml4IG1pc21hdGNoIHdoZW4gYSBgcHJlZml4YCBpcyBwcm92aWRlZC5cbiAqIEB0ZW1wbGF0ZSBUIC0gQSBzdHJpbmcgbGl0ZXJhbCB0eXBlIHRoYXQgZXh0ZW5kcyBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU3RyaW5nPFQgZXh0ZW5kcyBzdHJpbmc+KFxuICB0eXBlSWQ6IHN0cmluZyxcbiAgcHJlZml4PzogVFxuKTogVHlwZUlkPFQ+IHtcbiAgbGV0IHA7XG4gIGxldCBzO1xuXG4gIGNvbnN0IHVuZGVyc2NvcmVJbmRleCA9IHR5cGVJZC5sYXN0SW5kZXhPZihcIl9cIik7XG4gIGlmICh1bmRlcnNjb3JlSW5kZXggPT09IC0xKSB7XG4gICAgcCA9IFwiXCIgYXMgVDtcbiAgICBzID0gdHlwZUlkO1xuICB9IGVsc2Uge1xuICAgIHAgPSB0eXBlSWQuc3Vic3RyaW5nKDAsIHVuZGVyc2NvcmVJbmRleCkgYXMgVDtcbiAgICBzID0gdHlwZUlkLnN1YnN0cmluZyh1bmRlcnNjb3JlSW5kZXggKyAxKTtcblxuICAgIGlmICghcCkge1xuICAgICAgdGhyb3cgbmV3IEVtcHR5UHJlZml4RXJyb3IodHlwZUlkKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXMpIHtcbiAgICB0aHJvdyBuZXcgSW52YWxpZFN1ZmZpeExlbmd0aEVycm9yKDApO1xuICB9XG5cbiAgaWYgKHByZWZpeCAmJiBwICE9PSBwcmVmaXgpIHtcbiAgICB0aHJvdyBuZXcgUHJlZml4TWlzbWF0Y2hFcnJvcihwcmVmaXgsIHApO1xuICB9XG5cbiAgcmV0dXJuIHR5cGVpZFVuYm94ZWQocCwgcyk7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgVHlwZUlkIHN0cmluZyBpbnRvIGl0cyBwcmVmaXggYW5kIHN1ZmZpeCBjb21wb25lbnRzLlxuICpcbiAqIEBwYXJhbSB7VHlwZUlkPFQ+fSB0eXBlSWQgLSBUaGUgVHlwZUlkIHN0cmluZyB0byBwYXJzZS5cbiAqIEByZXR1cm5zIHt7IHByZWZpeDogVDsgc3VmZml4OiBzdHJpbmcgfX0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHByZWZpeCBhbmQgc3VmZml4IG9mIHRoZSBUeXBlSWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIFR5cGVJZCBmb3JtYXQgaXMgaW52YWxpZCAobm90IGV4YWN0bHkgdHdvIHBhcnRzIHNlcGFyYXRlZCBieSBhbiB1bmRlcnNjb3JlKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRm9yIGEgdmFsaWQgVHlwZUlkICdleGFtcGxlXzAwMDQxMDYxMDUwcjNnZzI4YTFjNjB0M2dmJ1xuICogY29uc3QgeyBwcmVmaXgsIHN1ZmZpeCB9ID0gcGFyc2VUeXBlSWQoJ2V4YW1wbGVfMDAwNDEwNjEwNTByM2dnMjhhMWM2MHQzZ2YnKTtcbiAqIGNvbnNvbGUubG9nKHByZWZpeCk7IC8vICdleGFtcGxlJ1xuICogY29uc29sZS5sb2coc3VmZml4KTsgLy8gJzAwMDQxMDYxMDUwcjNnZzI4YTFjNjB0M2dmJ1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvd3MgYW4gZXJyb3IgZm9yIGludmFsaWQgVHlwZUlkIGZvcm1hdFxuICogdHJ5IHtcbiAqICAgcGFyc2VUeXBlSWQoJ2ludmFsaWRUeXBlSWQnKTtcbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSk7IC8vICdJbnZhbGlkIFR5cGVJZCBmb3JtYXQ6IGludmFsaWRUeXBlSWQnXG4gKiB9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVR5cGVJZDxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdHlwZUlkOiBUeXBlSWQ8VD5cbik6IHsgcHJlZml4OiBUOyBzdWZmaXg6IHN0cmluZyB9IHtcbiAgcmV0dXJuIHsgcHJlZml4OiBnZXRUeXBlKHR5cGVJZCksIHN1ZmZpeDogZ2V0U3VmZml4KHR5cGVJZCkgfTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHByZWZpeCBmcm9tIGEgVHlwZUlkLlxuICpcbiAqIEBwYXJhbSB7VHlwZUlkPFQ+fSB0eXBlSWQgLSBUaGUgVHlwZUlkIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgcHJlZml4LlxuICogQHJldHVybnMge1R9IFRoZSBwcmVmaXggb2YgdGhlIFR5cGVJZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGU8VCBleHRlbmRzIHN0cmluZz4odHlwZUlkOiBUeXBlSWQ8VD4pOiBUIHtcbiAgY29uc3QgdW5kZXJzY29yZUluZGV4ID0gdHlwZUlkLmxhc3RJbmRleE9mKFwiX1wiKTtcbiAgaWYgKHVuZGVyc2NvcmVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gXCJcIiBhcyBUO1xuICB9XG4gIHJldHVybiB0eXBlSWQuc3Vic3RyaW5nKDAsIHVuZGVyc2NvcmVJbmRleCkgYXMgVDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHN1ZmZpeCBmcm9tIGEgVHlwZUlkLlxuICpcbiAqIEBwYXJhbSB7VHlwZUlkPFQ+fSB0eXBlSWQgLSBUaGUgVHlwZUlkIGZyb20gd2hpY2ggdG8gZXh0cmFjdCB0aGUgc3VmZml4LlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHN1ZmZpeCBvZiB0aGUgVHlwZUlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VmZml4PFQgZXh0ZW5kcyBzdHJpbmc+KHR5cGVJZDogVHlwZUlkPFQ+KTogc3RyaW5nIHtcbiAgY29uc3QgdW5kZXJzY29yZUluZGV4ID0gdHlwZUlkLmxhc3RJbmRleE9mKFwiX1wiKTtcbiAgaWYgKHVuZGVyc2NvcmVJbmRleCA9PT0gLTEpIHtcbiAgICByZXR1cm4gdHlwZUlkO1xuICB9XG4gIHJldHVybiB0eXBlSWQuc3Vic3RyaW5nKHVuZGVyc2NvcmVJbmRleCArIDEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9VVUlEQnl0ZXM8VCBleHRlbmRzIHN0cmluZz4odHlwZUlkOiBUeXBlSWQ8VD4pOiBVaW50OEFycmF5IHtcbiAgcmV0dXJuIGRlY29kZShnZXRTdWZmaXgodHlwZUlkKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1VVSUQ8VCBleHRlbmRzIHN0cmluZz4odHlwZUlkOiBUeXBlSWQ8VD4pIHtcbiAgcmV0dXJuIHN0cmluZ2lmeSh0b1VVSURCeXRlcyh0eXBlSWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21VVUlEQnl0ZXMoXG4gIHByZWZpeDogc3RyaW5nLFxuICBieXRlczogVWludDhBcnJheVxuKTogVHlwZUlkPHR5cGVvZiBwcmVmaXg+IHtcbiAgY29uc3Qgc3VmZml4ID0gZW5jb2RlKGJ5dGVzKTtcbiAgcmV0dXJuIHByZWZpeFxuICAgID8gKGAke3ByZWZpeH1fJHtzdWZmaXh9YCBhcyBUeXBlSWQ8dHlwZW9mIHByZWZpeD4pXG4gICAgOiAoc3VmZml4IGFzIFR5cGVJZDx0eXBlb2YgcHJlZml4Pik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVVVJRDxUIGV4dGVuZHMgc3RyaW5nPihcbiAgdXVpZDogc3RyaW5nLFxuICBwcmVmaXg/OiBUXG4pOiBUeXBlSWQ8VD4ge1xuICBjb25zdCBzdWZmaXggPSBlbmNvZGUocGFyc2VVVUlEKHV1aWQpKTtcbiAgcmV0dXJuIHByZWZpeCA/IChgJHtwcmVmaXh9XyR7c3VmZml4fWAgYXMgVHlwZUlkPFQ+KSA6IChzdWZmaXggYXMgVHlwZUlkPFQ+KTtcbn1cbiIsICJleHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByZWZpeChzdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc3RyLmxlbmd0aCA+IDYzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IGNvZGU7XG4gIGxldCBpO1xuICBsZXQgbGVuO1xuXG4gIGZvciAoaSA9IDAsIGxlbiA9IHN0ci5sZW5ndGg7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICBjb25zdCBpc0xvd2VyQXRvWiA9IGNvZGUgPiA5NiAmJiBjb2RlIDwgMTIzO1xuICAgIGNvbnN0IGlzVW5kZXJzY29yZSA9IGNvZGUgPT09IDk1O1xuXG4gICAgLy8gZmlyc3QgYW5kIGxhc3QgY2hhciBvZiBwcmVmaXggY2FuIG9ubHkgYmUgW2Etel1cbiAgICBpZiAoKGkgPT09IDAgfHwgaSA9PT0gbGVuIC0gMSkgJiYgIWlzTG93ZXJBdG9aKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCEoaXNMb3dlckF0b1ogfHwgaXNVbmRlcnNjb3JlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbiIsICJleHBvcnQgY2xhc3MgSW52YWxpZFByZWZpeEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZykge1xuICAgIHN1cGVyKGBJbnZhbGlkIHByZWZpeCBcIiR7cHJlZml4fVwiLiBNdXN0IGJlIGF0IG1vc3QgNjMgQVNDSUkgbGV0dGVycyBbYS16X11gKTtcbiAgICB0aGlzLm5hbWUgPSBcIkludmFsaWRQcmVmaXhFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmVmaXhNaXNtYXRjaEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihleHBlY3RlZDogc3RyaW5nLCBhY3R1YWw6IHN0cmluZykge1xuICAgIHN1cGVyKGBJbnZhbGlkIFR5cGVJZC4gUHJlZml4IG1pc21hdGNoLiBFeHBlY3RlZCAke2V4cGVjdGVkfSwgZ290ICR7YWN0dWFsfWApO1xuICAgIHRoaXMubmFtZSA9IFwiUHJlZml4TWlzbWF0Y2hFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbXB0eVByZWZpeEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih0eXBlSWQ6IHN0cmluZykge1xuICAgIHN1cGVyKGBJbnZhbGlkIFR5cGVJZC4gUHJlZml4IGNhbm5vdCBiZSBlbXB0eSB3aGVuIHRoZXJlJ3MgYSBzZXBhcmF0b3I6ICR7dHlwZUlkfWApO1xuICAgIHRoaXMubmFtZSA9IFwiRW1wdHlQcmVmaXhFcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnZhbGlkU3VmZml4TGVuZ3RoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGxlbmd0aDogbnVtYmVyKSB7XG4gICAgc3VwZXIoYEludmFsaWQgbGVuZ3RoLiBTdWZmaXggc2hvdWxkIGhhdmUgMjYgY2hhcmFjdGVycywgZ290ICR7bGVuZ3RofWApO1xuICAgIHRoaXMubmFtZSA9IFwiSW52YWxpZFN1ZmZpeExlbmd0aEVycm9yXCI7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRTdWZmaXhDaGFyYWN0ZXJFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZmlyc3RDaGFyOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgSW52YWxpZCBzdWZmaXguIEZpcnN0IGNoYXJhY3RlciBcIiR7Zmlyc3RDaGFyfVwiIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLTddYCk7XG4gICAgdGhpcy5uYW1lID0gXCJJbnZhbGlkU3VmZml4Q2hhcmFjdGVyRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHlwZUlEQ29udmVyc2lvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihhY3R1YWxQcmVmaXg6IHN0cmluZywgZXhwZWN0ZWRQcmVmaXg6IHN0cmluZykge1xuICAgIHN1cGVyKGBDYW5ub3QgY29udmVydCBUeXBlSUQgb2YgdHlwZSAke2FjdHVhbFByZWZpeH0gdG8gdHlwZSAke2V4cGVjdGVkUHJlZml4fWApO1xuICAgIHRoaXMubmFtZSA9IFwiVHlwZUlEQ29udmVyc2lvbkVycm9yXCI7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQUFBLElBQU9BLEVBQVEsMkpDQ2YsU0FBU0MsRUFBU0MsRUFBTSxDQUN0QixPQUFPLE9BQU9BLEdBQVMsVUFBWUMsRUFBTSxLQUFLRCxDQUFJLENBQ3BELENBQ0EsSUFBT0UsRUFBUUgsRUNFZixJQUFJSSxFQUFZLENBQUMsRUFDakIsSUFBU0MsRUFBSSxFQUFHQSxFQUFJLElBQUssRUFBRUEsRUFDekJELEVBQVUsTUFBTUMsRUFBSSxLQUFPLFNBQVMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBRHpDLElBQUFBLEVBR0YsU0FBU0MsRUFBZ0JDLEVBQUtDLEVBQVMsRUFBRyxDQU0vQyxPQUFRSixFQUFVRyxFQUFJQyxFQUFTLENBQUMsQ0FBQyxFQUFJSixFQUFVRyxFQUFJ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LEVBQUksU0FBU0QsRUFBSyxNQUFNLEdBQUksRUFBRSxFQUFHLEVBQUUsS0FBTyxFQUNwREUsRUFBSSxDQUFDLEVBQUlELEVBQUksSUFHYkMsRUFBSSxFQUFFLEdBQU1ELEVBQUksU0FBU0QsRUFBSyxNQUFNLEdBQUksRUFBRSxFQUFHLEVBQUUsR0FBSyxjQUFpQixJQUNyRUUsRUFBSSxFQUFFLEVBQUtELEVBQUksV0FBZSxJQUM5QkMsRUFBSSxFQUFFLEVBQUtELElBQU0sR0FBTSxJQUN2QkMsRUFBSSxFQUFFLEVBQUtELElBQU0sR0FBTSxJQUN2QkMsRUFBSSxFQUFFLEVBQUtELElBQU0sRUFBSyxJQUN0QkMsRUFBSSxFQUFFLEVBQUlELEVBQUksSUFFUEMsQ0FDVCxDQy9CQSxJQUFNQyxFQUFtQixtQ0FHbkJDLEVBQWtCLElBQUksV0FBVyxDQUNyQyxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxFQUFNLEVBQU0sRUFBTSxFQUN4RSxFQUFNLEVBQU0sRUFBTSxFQUFNLEVBQU0sRUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxHQUFNLEdBQU0sR0FBTSxHQUFNLEdBQU0sR0FBTSxHQUN4RSxHQUFNLElBQU0sR0FBTSxHQUFNLElBQU0sR0FBTSxHQUFNLElBQU0sR0FBTSxHQUFNLEdBQU0sR0FBTSxHQUN4RSxJQUFNLEdBQU0sR0FBTSxHQUFNLEdBQU0sR0FBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUN4RSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sSUFBTSxJQUFNLElBQU0sR0FDbEQsQ0FBQyxFQUVNLFNBQVNDLEVBQU9DLEVBQXlCLENBQzlDLElBQU1DLEVBQWdCLElBQUksTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBRTNDLEdBQUlELEVBQUksU0FBVyxHQUNqQixNQUFNLElBQUksTUFDUiwwQ0FBMENBLEVBQUksTUFBQSxZQUFrQkEsQ0FBQSxFQUNsRSxFQUlGLE9BQUFDLEVBQUksQ0FBQyxFQUFJSixHQUFVRyxFQUFJLENBQUMsRUFBSSxNQUFRLENBQUMsRUFDckNDLEVBQUksQ0FBQyxFQUFJSixFQUFTRyxFQUFJLENBQUMsRUFBSSxFQUFFLEVBQzdCQyxFQUFJLENBQUMsRUFBSUosR0FBVUcsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFDLEVBQ3JDQyxFQUFJLENBQUMsRUFBSUosR0FBV0csRUFBSSxDQUFDLEVBQUksSUFBTSxHQUFPQSxFQUFJLENBQUMsRUFBSSxNQUFRLENBQUUsRUFDN0RDLEVBQUksQ0FBQyxFQUFJSixHQUFVRyxFQUFJLENBQUMsRUFBSSxLQUFPLENBQUMsRUFDcENDLEVBQUksQ0FBQyxFQUFJSixHQUFXRyxFQUFJLENBQUMsRUFBSSxJQUFNLEdBQU9BLEVBQUksQ0FBQyxFQUFJLE1BQVEsQ0FBRSxFQUM3REMsRUFBSSxDQUFDLEVBQUlKLEdBQVdHLEVBQUksQ0FBQyxFQUFJLEtBQU8sR0FBT0EsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFFLEVBQzlEQyxFQUFJLENBQUMsRUFBSUosR0FBVUcsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFDLEVBQ3JDQyxFQUFJLENBQUMsRUFBSUosR0FBV0csRUFBSSxDQUFDLEVBQUksSUFBTSxHQUFPQSxFQUFJLENBQUMsRUFBSSxNQUFRLENBQUUsRUFDN0RDLEVBQUksQ0FBQyxFQUFJSixFQUFTRyxFQUFJLENBQUMsRUFBSSxFQUFFLEVBRzdCQyxFQUFJLEVBQUUsRUFBSUosR0FBVUcsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFDLEVBQ3RDQyxFQUFJLEVBQUUsRUFBSUosR0FBV0csRUFBSSxDQUFDLEVBQUksSUFBTSxHQUFPQSxFQUFJLENBQUMsRUFBSSxNQUFRLENBQUUsRUFDOURDLEVBQUksRUFBRSxFQUFJSixHQUFVRyxFQUFJLENBQUMsRUFBSSxLQUFPLENBQUMsRUFDckNDLEVBQUksRUFBRSxFQUFJSixHQUFXRyxFQUFJLENBQUMsRUFBSSxJQUFNLEdBQU9BLEVBQUksQ0FBQyxFQUFJLE1BQVEsQ0FBRSxFQUM5REMsRUFBSSxFQUFFLEVBQUlKLEdBQVdHLEVBQUksQ0FBQyxFQUFJLEtBQU8sR0FBT0EsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFFLEVBQy9EQyxFQUFJLEVBQUUsRUFBSUosR0FBVUcsRUFBSSxDQUFDLEVBQUksTUFBUSxDQUFDLEVBQ3RDQyxFQUFJLEVBQUUsRUFBSUosR0FBV0csRUFBSSxDQUFDLEVBQUksSUFBTSxHQUFPQSxFQUFJLEVBQUUsRUFBSSxNQUFRLENBQUUsRUFDL0RDLEVBQUksRUFBRSxFQUFJSixFQUFTRyxFQUFJLEVBQUUsRUFBSSxFQUFFLEVBQy9CQyxFQUFJLEVBQUUsRUFBSUosR0FBVUcsRUFBSSxFQUFFLEVBQUksTUFBUSxDQUFDLEVBQ3ZDQyxFQUFJLEVBQUUsRUFBSUosR0FBV0csRUFBSSxFQUFFLEVBQUksSUFBTSxHQUFPQSxFQUFJLEVBQUUsRUFBSSxNQUFRLENBQUUsRUFDaEVDLEVBQUksRUFBRSxFQUFJSixHQUFVRyxFQUFJLEVBQUUsRUFBSSxLQUFPLENBQUMsRUFDdENDLEVBQUksRUFBRSxFQUFJSixHQUFXRyxFQUFJLEVBQUUsRUFBSSxJQUFNLEdBQU9BLEVBQUksRUFBRSxFQUFJLE1BQVEsQ0FBRSxFQUNoRUMsRUFBSSxFQUFFLEVBQUlKLEdBQVdHLEVBQUksRUFBRSxFQUFJLEtBQU8sR0FBT0EsRUFBSSxFQUFFLEVBQUksTUFBUSxDQUFFLEVBQ2pFQyxFQUFJLEVBQUUsRUFBSUosR0FBVUcsRUFBSSxFQUFFLEVBQUksTUFBUSxDQUFDLEVBQ3ZDQyxFQUFJLEVBQUUsRUFBSUosR0FBV0csRUFBSSxFQUFFLEVBQUksSUFBTSxHQUFPQSxFQUFJLEVBQUUsRUFBSSxNQUFRLENBQUUsRUFDaEVDLEVBQUksRUFBRSxFQUFJSixFQUFTRyxFQUFJLEVBQUUsRUFBSSxFQUFFLEVBRXhCQyxFQUFJLEtBQUssRUFBRSxDQUNwQixDQUVPLFNBQVNDLEVBQU9DLEVBQXVCLENBQzVDLEdBQUlBLEVBQUUsU0FBVyxHQUNmLE1BQU0sSUFBSSxNQUNSLDBDQUEwQ0EsRUFBRSxNQUFBLFlBQWtCQSxDQUFBLEVBQ2hFLEVBSUYsSUFBTVIsRUFEVSxJQUFJLFlBQVksRUFDRixPQUFPUSxDQUFDLEVBR3RDLEdBQ0VMLEVBQUlILEVBQUUsQ0FBQyxDQUFD