@datagrok/peptides 1.17.21 → 1.17.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/dist/111.js +1 -1
- package/dist/111.js.map +1 -0
- package/dist/216.js +1 -1
- package/dist/216.js.map +1 -0
- package/dist/501.js +1 -1
- package/dist/501.js.map +1 -0
- package/dist/603.js +1 -1
- package/dist/603.js.map +1 -0
- package/dist/682.js +1 -1
- package/dist/682.js.map +1 -0
- package/dist/705.js +1 -1
- package/dist/705.js.map +1 -0
- package/dist/778.js +1 -1
- package/dist/778.js.map +1 -0
- package/dist/795.js +1 -1
- package/dist/795.js.map +1 -0
- package/dist/950.js +1 -1
- package/dist/950.js.map +1 -0
- package/dist/package-test.js +2 -2
- package/dist/package-test.js.map +1 -0
- package/dist/package.js +2 -2
- package/dist/package.js.map +1 -0
- package/package.json +1 -1
- package/src/viewers/cluster-max-activity-viewer.ts +3 -1
- package/src/viewers/logo-summary.ts +4 -1
- package/src/widgets/mutation-cliffs.ts +3 -0
- package/tsconfig.json +3 -3
- package/webpack.config.js +1 -1
package/dist/795.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
var peptides;(()=>{"use strict";var e,n={m:{},u:e=>e+".js"};n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var a=r.length-1;a>-1&&(!e||!/^http(s?):/.test(e));)e=r[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),n.b=self.location+"",function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(e||(e={}));const t={[e.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[e.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var r;!function(e){e.HAMMING="Hamming",e.EUCLIDEAN="Euclidean",e.MANHATTAN="Manhattan",e.TANIMOTO="Tanimoto",e.LEVENSTEIN="Levenshtein",e.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",e.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",e.SOKAL="Sokal",e.COSINE="Cosine",e.ASYMMETRIC="Asymmetric",e.Difference="Difference",e.OneHot="One-Hot"}(r||(r={}));const a={[r.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[r.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[r.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[r.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[r.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[r.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[r.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[r.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[r.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[r.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[r.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[r.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},i={[r.HAMMING]:e=>Math.ceil(e/30),[r.EUCLIDEAN]:e=>Math.ceil(e/30),[r.MANHATTAN]:e=>Math.ceil(e/30),[r.TANIMOTO]:e=>Math.ceil(e/60),[r.SOKAL]:e=>Math.ceil(e/60),[r.COSINE]:e=>Math.ceil(e/60),[r.ASYMMETRIC]:e=>Math.ceil(e/60),[r.LEVENSTEIN]:e=>Math.ceil(e*e/60),[r.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[r.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[r.Difference]:e=>1,[r.OneHot]:e=>Math.ceil(e/40)},o={STRING:new Set([r.HAMMING,r.LEVENSTEIN,r.NEEDLEMAN_WUNSCH,r.MONOMER_CHEMICAL_DISTANCE,r.OneHot]),UINT32ARRAY:new Set([r.HAMMING,r.EUCLIDEAN,r.MANHATTAN,r.MONOMER_CHEMICAL_DISTANCE,r.LEVENSTEIN,r.NEEDLEMAN_WUNSCH,r.TANIMOTO,r.COSINE,r.SOKAL,r.ASYMMETRIC,r.OneHot,r.Difference]),INT32ARRAY:new Set([r.EUCLIDEAN,r.MANHATTAN,r.OneHot,r.Difference]),FLOAT32ARRAY:new Set([r.EUCLIDEAN,r.MANHATTAN,r.Difference]),NUMBER:new Set([r.EUCLIDEAN,r.MANHATTAN,r.Difference]),BITARRAY:new Set([r.TANIMOTO,r.COSINE,r.SOKAL,r.ASYMMETRIC])};var s=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{l(r.next(e))}catch(e){i(e)}}function s(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}l((r=r.apply(e,n||[])).next())}))};let l=null,u=null;function f(){return s(this,void 0,void 0,(function*(){if(!l&&(l=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==l))return null;let e=!1;if(u&&(u.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!u||e){const e=1e9,n=l.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return u=yield l.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),u}catch(e){return console.error("Failed to create device with required limits",e),u=yield l.requestDevice(),u}}return u}))}var c,d;function h(n,t=.8,a,s,l,u){return c=this,d=void 0,p=function*(){const c=yield f();if(!c)return null;const d=Object.values(r);if(a.some((e=>!d.includes(e))))throw new Error("Invalid distance metrics provided: "+a.join(", "));if(!Object.values(e).includes(s))throw new Error("Invalid aggregation function provided: "+s);const h=1-t;if(u.length!==n.length||u.length!==a.length||u.length!==l.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(n.some((e=>e.length!==n[0].length)))throw new Error("All entry lists must be the same length");const p=n.length,g=n[0].length,y=n.map(((e,n)=>function(e,n=r.HAMMING,t,a={gapOpenPenalty:1,gapExtensionPenalty:.6}){var s,l;let u=null;const f=e.some((e=>"string"==typeof e))?(u="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(u="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(u="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(u="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(u="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(u="INT32ARRAY",e):void 0;if(!f||!u)throw new Error("Invalid entry type, could not determine entry type from input list");const c=f[0]instanceof Int32Array?"INT32ARRAY":f[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",d=new Uint32Array(f.map((e=>e.length)));if(!o[u]||!o[u].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${u}'`);const h=d.reduce(((e,n)=>Math.max(e,n)),0),m=i[n](h),p="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new p(f.length*h);f.forEach(((e,n)=>{g.set(e,n*h)}));let y="",w=0,A="FLOAT32ARRAY",b=null;if(n===r.NEEDLEMAN_WUNSCH||n===r.MONOMER_CHEMICAL_DISTANCE){let e=a.scoringMatrix&&a.alphabetIndexes?Object.keys(a.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!a.alphabetIndexes||!a.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);a.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),a.alphabetIndexes={};for(let e=0;e<a.scoringMatrix.length;e++)a.scoringMatrix[e][e]=1,a.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),r=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)r[n][n]=1;const i=a.alphabetIndexes;for(const e of Object.keys(i))for(const n of Object.keys(i))e!==n&&(r[e.charCodeAt(0)][n.charCodeAt(0)]=a.scoringMatrix[i[e]][i[n]]);w=2+n,A="FLOAT32ARRAY",b=new Float32Array(w),b[0]=null!==(s=a.gapOpenPenalty)&&void 0!==s?s:1,b[1]=null!==(l=a.gapExtensionPenalty)&&void 0!==l?l:.6;let o=2;for(let e=0;e<r.length;e++)b.set(r[e],o),o+=r[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===r.Difference){if(!a.range||"number"!=typeof a.range||a.range<=0){const e=g.reduce(((e,n)=>Math.min(e,n)),g[0]),n=g.reduce(((e,n)=>Math.max(e,n)),g[0]);a.range=n-e}a.range<=0&&(a.range=1),w=1,A="FLOAT32ARRAY",b=new Float32Array([a.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",I=`data${t}: array<array<${x}, ${h}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:h,arraySizes:d,complexity:m,suppInfoBuffer:b,suppInfoSize:w,suppInfoType:A,suppInfoStructWgsl:y,entryType:u,dataTypeWGSL:x,dataStructWgsl:I,EncodedArrayConstructor:p}}(e,a[n],n,u[n])));if(0===p)throw new Error("No columns provided. Please provide at least one column of data.");1===p&&(s=e.MANHATTAN);let w=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),A=!1;w&&""!=w.trim()||(A=!0,w="\ndummy: f32\n");const b=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(p*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const I=1e4,E=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),C=10*v,B=g*(g-1)/2,S=Math.ceil(B/I),U=c.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${S} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${g}>, ${p}>,\n // the weights for each entry\n weights: array<f32, ${p}>,\n // the data for each entry\n ${b} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${w}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${A?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${C} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${g}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${g}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${h}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${g}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(a,y.map((e=>e.maxEntryLen)),h,s)}\n\n\n `}),L=c.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:U,entryPoint:"calcSparseMatrix"}}),P=new Uint32Array(I),T=new Uint32Array(I),R=new Uint32Array(I),O=new Uint32Array(I),_=Math.floor(B/I);let k=0,D=1;console.time("GPUthreadStarts");for(let e=0;e<I;e++){const n=9999===e?B-1:(e+1)*_,t=g-2-Math.floor(Math.sqrt(-8*n+4*g*(g-1)-7)/2-.5),r=n-g*t+Math.floor((t+1)*(t+2)/2);P[e]=D,T[e]=k,R[e]=r,O[e]=t,k=t,D=r}console.timeEnd("GPUthreadStarts");const j=4e4+g*p+p+y.reduce(((e,n)=>e+n.sourceArraySize),0),$=y.reduce(((e,n)=>e+n.suppInfoSize),0),G=1e6,z=j*Uint32Array.BYTES_PER_ELEMENT;let Y=z;const F=15&z;0!==F&&(Y+=16-F);const H=c.createBuffer({label:"compute info buffer",size:Y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),K=H.getMappedRange();let W=0;new Uint32Array(K,W,I).set(P),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(T),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(R),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(O),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,p).set(l),W+=p*Float32Array.BYTES_PER_ELEMENT;for(const e of y){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(K,W,t).set(e.flatSourceArray),W+=t*n.BYTES_PER_ELEMENT}H.unmap();const q=$*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const J=c.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),Q=J.getMappedRange();let Z=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(Q,Z,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Z+=e.suppInfoBuffer.byteLength);0===Z&&new Uint32Array(Q,0,4).set([1,1,1,1]),J.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15ⅇ0!==te&&(ne+=16-te);const re=c.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=c.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:L.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:J}},{binding:2,resource:{buffer:re}}]}),ie=c.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],le=[];let ue=!1;for(;!ue;){const e=c.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(L),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();c.queue.submit([t]),yield c.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,G);a+=G*Float32Array.BYTES_PER_ELEMENT;const l=new Uint32Array(r,a,I);a+=I*Uint32Array.BYTES_PER_ELEMENT,ue=new Uint32Array(r,a,I).every((e=>1===e));const u=l.reduce(((e,n)=>e+n),0),f=new Uint32Array(u),d=new Uint32Array(u),h=new Float32Array(u);let m=0;for(let e=0;e<l.length;e++){const n=l[e];0!==n&&(f.set(i.subarray(e*E,e*E+n),m),d.set(o.subarray(e*E,e*E+n),m),h.set(s.subarray(e*E,e*E+n),m),m+=n)}oe.push(f),se.push(d),le.push(h),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),he=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),he.set(le[e],me),me+=oe[e].length;return H.destroy(),J.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:he}},new((h=void 0)||(h=Promise))((function(e,n){function t(e){try{a(p.next(e))}catch(e){n(e)}}function r(e){try{a(p.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof h?a:new h((function(e){e(a)}))).then(t,r)}a((p=p.apply(c,d||[])).next())}));var c,d,h,p}function m(e,n,r,i){return e.map(((e,t)=>`\n fn distanceScript${t}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${t}[aIndex];\n let b = computeInfo.data${t}[bIndex];\n let maxDistance: f32 = ${r};\n ${a[e](n[t],t)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${t[i](e.length)}\n }\n \n `}(d=c||(c={})).EUCLIDEAN="EUCLIDEAN",d.MANHATTAN="MANHATTAN";const p=e=>null==e;function g(e,n,t,r){if(t>e[e.length-1])return;const a=e.findIndex((e=>t<e));e.pop(),e.splice(a,0,t),n.pop(),n.splice(a,0,r)}class y{constructor(){this._workerCount=Math.max(navigator.hardwareConcurrency-2,1)}async calcMultiColumn(e,t,r,a=[{}],i=[1],o=c.EUCLIDEAN){const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=e[0].length>2e4?await this.getMinimalThreshold(e,t,a,i,o):0;r<u&&(console.log(`using threshold ${u}`),r=u),a.forEach(((e,n)=>a[n].threshold=r));const f=new Array(this._workerCount),d=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(111),n.b))));for(let n=0;n<this._workerCount;n++)f[n]=new Promise(((u,f)=>{const c=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=c&&u({i:new Int32Array(0),j:new Int32Array(0),distance:new Float32Array(0),idx:n}),d[n].postMessage({values:e,startIdx:c,endIdx:h,threshold:r,fnNames:t,opts:a,weights:i,aggregationMethod:o}),d[n].onmessage=({data:{error:e,i:t,j:r,distance:a}})=>{e?(d[n].terminate(),f(e)):(d[n].terminate(),u({i:t,j:r,distance:a,idx:n}))}}));const h=await Promise.all(f),m=h.reduce(((e,n)=>e+n.i.length),0),p=new Int32Array(m),g=new Int32Array(m),y=new Float32Array(m);let w=0;for(const e of h)p.set(e.i,w),g.set(e.j,w),y.set(e.distance,w),w+=e.i.length;return{i:p,j:g,distance:y}}async calc(e,n,t,r={}){return await this.calcMultiColumn([e],[n],t,[r],[1])}async getKNN(e,n,t=15,r={}){return await this.multiColumnKNN([e],[n],t,[r],[1])}async getThresholdKNN(e,n,t=.8,r={}){return await this.multiColumnThresholdKnn([e],[n],t,[r],[1])}async multiColumnThresholdKnn(e,t,r=.8,a,i,o=c.EUCLIDEAN){if(e.length!==t.length||e.length!==a.length||e.length!==i.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=new Array(this._workerCount),f=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(603),n.b))));for(let n=0;n<this._workerCount;n++)u[n]=new Promise(((u,c)=>{const d=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=d&&u({knnDistances:new Array(0),knnIndexes:new Array(0)}),f[n].postMessage({values:e,startIdx:d,endIdx:h,fnNames:t,opts:a,threshold:r,weights:i,aggregationMethod:o}),f[n].onmessage=({data:{error:e,knnDistances:t,knnIndexes:r}})=>{e?(f[n].terminate(),c(e)):(f[n].terminate(),u({knnDistances:t,knnIndexes:r}))}}));const d=await Promise.all(u),h=new Int32Array(e[0].length);for(const n of d)for(let t=0;t<e[0].length;++t)h[t]+=n.knnIndexes[t]?.length??0;const m={knnDistances:new Array(e[0].length).fill(null).map(((e,n)=>new Array(h[n]))),knnIndexes:new Array(e[0].length).fill(null).map(((e,n)=>new Array(h[n])))};for(const n of d)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)m.knnDistances[t][h[t]-1]=n.knnDistances[t][e],m.knnIndexes[t][h[t]-1]=n.knnIndexes[t][e],h[t]-=1;return m}async multiColumnKNN(e,t,r=15,a,i,o=c.EUCLIDEAN){if(e.length!==t.length||e.length!==a.length||e.length!==i.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=new Array(this._workerCount),f=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(950),n.b))));for(let n=0;n<this._workerCount;n++)u[n]=new Promise(((u,c)=>{const d=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=d&&u({knnDistances:new Array(0),knnIndexes:new Array(0)}),f[n].postMessage({values:e,startIdx:d,endIdx:h,fnNames:t,opts:a,nNeighbours:r,weights:i,aggregationMethod:o}),f[n].onmessage=({data:{error:e,knnDistances:t,knnIndexes:r}})=>{e?(f[n].terminate(),c(e)):(f[n].terminate(),u({knnDistances:t,knnIndexes:r}))}}));const d=await Promise.all(u),h={knnDistances:new Array(e[0].length).fill(null).map((()=>new Array(r).fill(99999))),knnIndexes:new Array(e[0].length).fill(null).map((()=>new Array(r).fill(-1)))};for(const n of d)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)g(h.knnDistances[t],h.knnIndexes[t],n.knnDistances[t][e],n.knnIndexes[t][e]);return h}async getSampleDistances(e,t,r=[],a,i=c.EUCLIDEAN){const o=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(778),n.b))));try{const n=e[0].length*(e[0].length-1)/2,s=Math.floor(n/this._workerCount),l=1e6,u=Math.max(Math.min(n/1e3,l),Math.min(n,l)),f=Math.floor(u/this._workerCount),c=new Array(this._workerCount);for(let l=0;l<this._workerCount;l++)c[l]=new Promise(((u,c)=>{const d=l*s,h=l===this._workerCount-1?n:(l+1)*s;o[l].postMessage({values:e,startIdx:d,endIdx:h,sampleLength:f,fnNames:t,opts:r,weights:a,aggregationMethod:i}),o[l].onmessage=({data:{error:e,distance:n}})=>{o[l].terminate(),e?c(e):u({distance:n})}}));const d=await Promise.all(c),h=d.reduce(((e,n)=>e+n.distance.length),0),m=new Float32Array(h);let p=0;for(const e of d)m.set(e.distance,p),p+=e.distance.length;return m.sort(),m}catch(e){return o?.forEach((e=>e?.terminate())),console.error(e),new Float32Array(1).fill(.5)}}async getMinimalThreshold(e,n,t=[],r,a=c.EUCLIDEAN){try{const i=e.length*(e.length-1)/2,o=await this.getSampleDistances(e,n,t,r,a);return 1-o[Math.floor(7e7/i*o.length)]}catch(e){return console.error(e),.5}}static calcSync(e,n,t,r){const a=[],i=[],o=[];let s=0,l=0,u=0;const f=e.length*(e.length-1)/2;for(;s<f;){const n=p(e[l])||p(e[u])?1:t(e[l],e[u]);1-n>=r&&(a.push(l),i.push(u),o.push(n)),s++,u++,u===e.length&&(l++,u=l+1)}return{i:new Int32Array(a),j:new Int32Array(i),distance:new Float32Array(o)}}}async function w(e,n,t){const r=e.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=e[o],l=e[s];n[r]?.[l]>=t&&(a.push(o),i.push(s))}return function(e,n,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const l=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],u=n[t],f=r[s]-r[u],c=a[s]-a[u];Math.abs(f)>=1&&(i[s]-=l*f,i[u]+=l*f),Math.abs(c)>=1&&(o[s]-=l*c,o[u]+=l*c)}for(let e=0;e<t.length;e++){const n=Math.sqrt(i[e]*i[e]+o[e]*o[e]);n>0&&(r[e]+=i[e]/n*l,a[e]+=o[e]/n*l)}}let s=r[0],l=a[0],u=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),l=Math.min(l,a[e]),u=Math.max(u,r[e]),f=Math.max(f,a[e]);let c=u-s,d=f-l;0===c&&(c=u);for(let e=0;e<t.length;e++)r[e]=(r[e]-s)/c/2+.5;0===d&&(d=f);for(let e=0;e<t.length;e++)a[e]=(a[e]-l)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}function A(e,n,t,r){return a=this,i=void 0,s=function*(){const a=r,i=Math.ceil(a/100),o=Math.ceil(Math.sqrt(i)),s=10*o,l=e.createShaderModule({label:"colwise-normalize",code:`\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(10, 10) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${s} + col;\n if (index >= ${r}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `}),u=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:l,entryPoint:"normalize"}}),f=e.createBuffer({label:"simmilarities info buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Float32Array(f.getMappedRange()).set(n),f.unmap();const c=e.createBuffer({label:"offsets info buffer",size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(c.getMappedRange()).set(t),c.unmap();const d=e.createBindGroup({layout:u.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),h=e.createCommandEncoder(),m=h.beginComputePass();m.setPipeline(u),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const p=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});h.copyBufferToBuffer(f,0,p,0,n.byteLength),e.queue.submit([h.finish()]),yield e.queue.onSubmittedWorkDone(),yield p.mapAsync(GPUMapMode.READ);const g=new Float32Array(p.getMappedRange());n.set(g),p.unmap(),f.destroy(),c.destroy(),p.destroy()},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{l(s.next(e))}catch(e){n(e)}}function r(e){try{l(s.throw(e))}catch(e){n(e)}}function l(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}l((s=s.apply(a,i||[])).next())}));var a,i,o,s}function b(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function x(e,n,t,r,a){return i=this,o=void 0,l=function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),l=10*s,u=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-u),c=new Float32Array(n.length),d=e.createShaderModule({label:"expand",code:`\n struct SparseKNN {\n knnSimilarities: array<f32, ${n.length}>,\n knnIndexes: array<u32, ${t.length}>,\n offsets: array<u32, ${r.length}>,\n rowIndexes: array<u32, ${t.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, 90000>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(10, 10) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${l} + col;\n if (index >= 90000) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${t.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${f}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `}),h=e.createComputePipeline({label:"expand compute pipeline",layout:"auto",compute:{module:d,entryPoint:"expand"}});let m=4*(n.length+t.length+r.length+t.length);const p=15&m;0!==p&&(m+=16-p);const g=e.createBuffer({label:"sparse knn buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),y=g.getMappedRange();new Float32Array(y,0,n.length).set(n),new Uint32Array(y,4*n.length,t.length).set(t),new Uint32Array(y,4*(n.length+t.length),r.length).set(r);const w=function(e){const n=new Uint32Array(e[e.length-1]);for(let t=0;t<e.length-1;t++)for(let r=e[t];r<e[t+1];r++)n[r]=t;return n}(r);new Uint32Array(y,4*(n.length+t.length+r.length),w.length).set(w),g.unmap();const A=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(A.getMappedRange()).set([0]),A.unmap();const b=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:h.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:b}},{binding:2,resource:{buffer:A}}]}),I=e.createBuffer({label:"out block buffer",size:b.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let n=0;n<Math.ceil(t.length/i);n++){const r=n*i,a=Math.min(i,t.length-r);e.queue.writeBuffer(A,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),l=o.beginComputePass({label:"expand compute pass"});l.setPipeline(h),l.setBindGroup(0,x),l.dispatchWorkgroups(s,s),l.end(),o.copyBufferToBuffer(b,0,I,0,I.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield I.mapAsync(GPUMapMode.READ);const u=new Float32Array(I.getMappedRange(),0,a);c.set(u,r),I.unmap()}return g.destroy(),A.destroy(),b.destroy(),I.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{a(l.next(e))}catch(e){n(e)}}function r(e){try{a(l.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof s?a:new s((function(e){e(a)}))).then(t,r)}a((l=l.apply(i,o||[])).next())}));var i,o,s,l}function I(e,n){const t=function(e,n){const t=new Uint32Array(n);for(let n=0;n<e.i.length;n++)t[e.i[n]]++,t[e.j[n]]++;for(let e=0;e<n;e++)t[e]++;return t}(e,n),r=function(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}(t),a=new Uint32Array(n).fill(1),i=new Uint32Array(2*e.i.length+n),o=new Float32Array(2*e.i.length+n);for(let e=0;e<n;e++)i[r[e]]=e,o[r[e]]=1;for(let n=0;n<e.i.length;n++){const t=e.i[n],s=e.j[n],l=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=l,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=l,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const E={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class M{constructor(e={}){this._options={...E,...e}}async transform(e,n){let t=this.toObjectForm(e);if(this._options.maxIterations>0){this.addLoops(t,n),this.normalize(t);for(let e=0;e<this._options.maxIterations;e++)t=this.expand(t,n),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,n);this.correctClusters(r);const o=await this.layout(r,t,n);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}async transformWebGPU(e,n){if(0===this._options.maxIterations)return this.transform(e,n);const t=await function(e,n,t=5,r=2){return a=this,i=void 0,s=function*(){const a=yield f();if(!a)throw new Error("no gpu device found");const i=I(e,n);yield A(a,i.KNNSimilarities,i.indexOffsets,n);let o=i;for(let e=0;e<t;e++){const e=yield x(a,o.KNNSimilarities,o.KNNIndexes,o.indexOffsets,n);b(e.KNNSimilarities,r),yield A(a,e.KNNSimilarities,e.indexOffsets,n),o=e}return o},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{l(s.next(e))}catch(e){n(e)}}function r(e){try{l(s.throw(e))}catch(e){n(e)}}function l(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}l((s=s.apply(a,i||[])).next())}));var a,i,o,s}(e,n,this._options.maxIterations,this._options.inflateFactor),r=this.csrToSparseObject(t,n),{clusters:a,is:i,js:o}=this.assignClusters(r,n);this.correctClusters(a);const s=await this.layout(a,r,n);return{clusters:a,embedX:s.embedX,embedY:s.embedY,is:i,js:o}}correctClusters(e){const n={};for(const t of e)n[t]||(n[t]=0),n[t]++;const t=Object.keys(n).map(Number).sort(((e,t)=>n[t]-n[e])),r={};t.forEach(((e,n)=>r[e]=n+1));for(let n=0;n<e.length;n++)e[n]=r[e[n]]}csrToSparseObject(e,n){const t=Math.floor(Math.max(Math.log10(n),2))+1,r=1/Math.pow(10,t),a={};for(let t=0;t<n;t++){a[t]={};for(let n=e.indexOffsets[t];n<e.indexOffsets[t+1];n++){const i=e.KNNIndexes[n];i<=t||e.KNNSimilarities[n]<r||(a[t][i]=e.KNNSimilarities[n])}}return a}async layout(e,n,t){const r=new Float32Array(t).fill(0),a=new Float32Array(t).fill(0),i={};e.forEach(((e,n)=>{i[e]||(i[e]=[]),i[e].push(n)}));let o=0;const s=Object.keys(i);s.sort(((e,n)=>i[n].length-i[e].length));let l=6,u=0;for(const e of s){const t=i[e],s=await w(t,n,.001);o===Math.ceil(l/1.5)&&(o=0,u+=5/l,l=Math.ceil(1.5*l));const f=o%l*5/l*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/l+f,a[t[e]]=5*s.embedY[e]/l+u;o++}return{embedX:r,embedY:a}}mergeClusters(e,n,t){const r=e[n],a=e[t];for(let n=0;n<e.length;n++)e[n]===a&&(e[n]=r)}assignClusters(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=Math.pow(10,i),s=new Array(n).fill(-1);for(const n of Object.keys(e))for(const i of Object.keys(e[n]))Math.round(e[n][i]*o)/o>0&&e[n][i]!==Number(n)&&Number(i)>Number(n)&&(r.push(Number(n)),a.push(Number(i)),-1!==s[Number(n)]&&-1!==s[Number(i)]?s[Number(n)]!==s[Number(i)]&&this.mergeClusters(s,Number(n),Number(i)):-1!==s[Number(n)]?s[Number(i)]=s[Number(n)]:-1!==s[Number(i)]?s[Number(n)]=s[Number(i)]:(t++,s[Number(n)]=t,s[Number(i)]=t));for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}assignClustersCSR(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=1/Math.pow(10,i),s=new Array(n).fill(-1),l=new Uint32Array(n+1);let u=0;l[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const l=e.KNNIndexes[n];l<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(l),u++,-1!==s[i]&&-1!==s[l]?s[i]!==s[l]&&this.mergeClusters(s,i,l):-1!==s[i]?s[l]=s[i]:-1!==s[l]?s[i]=s[l]:(t++,s[i]=t,s[l]=t))}l[i+1]=u}for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a),correctedOffsets:l}}toObjectForm(e){const n={};for(let t=0;t<e.i.length;t++)n[e.i[t]]||(n[e.i[t]]={}),n[e.i[t]][e.j[t]]=1-e.distance[t],n[e.j[t]]||(n[e.j[t]]={}),n[e.j[t]][e.i[t]]=1-e.distance[t];return n}addLoops(e,n){for(let t=0;t<n;t++)e[t]||(e[t]={}),e[t][t]=this._options.multFactor}normalize(e){for(const n of Object.keys(e)){const t=e[n];let r=0;for(const e of Object.keys(t))r+=t[e];if(0!==r)for(const a of Object.keys(t))e[n][a]/=r}}expand(e,n){const t={},r=Math.floor(Math.max(Math.log10(n),2))+1,a=Math.pow(10,r);for(let r=0;r<n;r++)if(e[r]){t[r]??(t[r]={});for(let i=r;i<n;i++){if(!e[r]?.[i])continue;const n=this.getExpandValue(e,r,i);Math.round(n*a)/a>0&&(t[r][i]=n,t[i]||(t[i]={}),t[i][r]=n)}}return t}inflate(e){for(const n of Object.keys(e)){const t=e[n];for(const r of Object.keys(t))e[n][r]=Math.pow(e[n][r],this._options.inflateFactor)}}getExpandValue(e,n,t){let r=0;const a=Object.keys(e[n]??{}),i=Object.keys(e[t]??{});for(const o of a)i.includes(o)&&(r+=e[n][o]*e[t][o]);return r}}onmessage=async e=>{const{data:n,threshold:t,weights:r,aggregationMethod:a,distanceFnArgs:i,distanceFns:o,maxIterations:s,useWebGPU:l,inflate:u}=e.data;console.time("sparse matrix");let f=null;if(l)try{f=await h(n,t/100,o,a,r,i)}catch(e){console.error(e)}f||(l&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),f=await(new y).calcMultiColumn(n,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const c=new M({maxIterations:s??5,inflateFactor:u??2});console.time("MCL");let d=null;if(l)try{d=await c.transformWebGPU(f,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}d||(d=await c.transform(f,n[0].length)),console.timeEnd("MCL"),postMessage({res:d})},peptides={}})();
|
|
2
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVFDLE1BQU0sK0VBQ2xCMFksUUFBZSxJQUFJbkwsR0FDZEksZ0JBQWdCa0IsRUFBTTJKLEVBQWFwWSxFQUFZLElBQUttWSxFQUFnQmhZLEVBQVN1TixJQUV0Ri9OLFFBQVFrSCxRQUFRLGlCQUVoQixNQUFNMFIsRUFBVSxJQUFJL0MsRUFBaUIsQ0FBRUgsY0FBZUEsR0FBaUIsRUFBR0MsY0FBZXJDLEdBQVcsSUFDcEd0VCxRQUFROEcsS0FBSyxPQUNiLElBQUl1SSxFQUFNLEtBQ1YsR0FBSXFKLEVBQ0EsSUFDSXJKLFFBQVl1SixFQUFRcEMsZ0JBQWdCbUMsRUFBUTdKLEVBQUssR0FBR3ZULE9BQ3hELENBQ0EsTUFBT2pCLEdBQ0gwRixRQUFRQyxNQUFNLHlEQUNkRCxRQUFRQyxNQUFNM0YsRUFDbEIsQ0FFQytVLElBQ0RBLFFBQVl1SixFQUFRN0MsVUFBVTRDLEVBQVE3SixFQUFLLEdBQUd2VCxTQUNsRHlFLFFBQVFrSCxRQUFRLE9BQ2hCMEgsWUFBWSxDQUFFUyxPQUFNLEUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1hZ2dyZWdhdGlvbi5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ydW50aW1lL2dsb2JhbCIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL2dldEdQVURldmljZS5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9zcGFyc2UtbWF0cml4L3dlYkdQVS1zcGFyc2UtbWF0cml4LmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC90eXBlcy5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9wcmVwcm9jZXNzaW5nL3dlYkdQVS1wcm9jZXNzLWluZm8uanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvZGlzdGFuY2UtbWF0cml4L3V0aWxzLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML2Jpby1sYXlvdXQuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML2NvbHdpc2Utbm9ybWFsaXplLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9pbmZsYXRlLWV4cGFuZC5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvdW1hcC91dGlscy5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9pcy1hbnktYXJyYXkvbGliLWVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWFyY292LWNsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML21jbC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gZXVjbGlkZWFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgZGlzdGFuY2VzW2ldICogZGlzdGFuY2VzW2ldICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNxcnQoc3VtKTtcbiAgICBgO1xufVxuO1xuZnVuY3Rpb24gbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgYWJzKGRpc3RhbmNlc1tpXSkgKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1NMQUdHUkVHQVRJT047XG4oZnVuY3Rpb24gKFdFQkdTTEFHR1JFR0FUSU9OKSB7XG4gICAgV0VCR1NMQUdHUkVHQVRJT05bXCJFVUNMSURFQU5cIl0gPSBcIkVVQ0xJREVBTlwiO1xuICAgIFdFQkdTTEFHR1JFR0FUSU9OW1wiTUFOSEFUVEFOXCJdID0gXCJNQU5IQVRUQU5cIjtcbn0pKFdFQkdTTEFHR1JFR0FUSU9OIHx8IChXRUJHU0xBR0dSRUdBVElPTiA9IHt9KSk7XG5leHBvcnQgY29uc3QgV0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlMgPSB7XG4gICAgW1dFQkdTTEFHR1JFR0FUSU9OLkVVQ0xJREVBTl06IGV1Y2xpZGVhbkFnZ3JlZ2F0aW9uV2dzbCxcbiAgICBbV0VCR1NMQUdHUkVHQVRJT04uTUFOSEFUVEFOXTogbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLWFnZ3JlZ2F0aW9uLmpzLm1hcCIsIi8vIFRoZSByZXF1aXJlIHNjb3BlXG52YXIgX193ZWJwYWNrX3JlcXVpcmVfXyA9IHt9O1xuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAoIXNjcmlwdFVybCB8fCAhL15odHRwKHM/KTovLnRlc3Qoc2NyaXB0VXJsKSkpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBzZWxmLmxvY2F0aW9uICsgXCJcIjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0Nzk1OiAxXG59O1xuXG4vLyBubyBjaHVuayBpbnN0YWxsIGZ1bmN0aW9uIG5lZWRlZFxuLy8gbm8gY2h1bmsgbG9hZGluZ1xuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0IiwiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLy8gaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3csIHRoZSB2YXJpYWJsZXMgYSBhbmQgYiBhcmUgYXNzdW1lZCB0byBiZSBhcnJheXMgb2YgdWludDMyL2YzMlxuLy92YWx1ZXMgd2hpY2ggYXJlIGluZmVyZWQgZnJvbSB0aGUgY29kZSB0aGlzIGNodW5rIGlzIGluamVjdGVkIGludG9cbi8vIGFsc28sIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXB1dGVJbmZvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4vLyBjb21wdXRlSW5mby5lbnRyeVNpemVzOiBhcnJheSBvZiBhcnJheXMgb2YgdTMyIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mIHRoZSBlbnRyaWVzXG4vLyBvdGhlciBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIHRoZSBkaXN0YW5jZSBmdW5jdGlvbiBzaG91bGQgYmUgaW5qZWN0ZWQgZnJvbSB0aGUgbWFpbiBzY3JpcHQgdGhhdCBjYWxscyB0aGlzIGZ1bmN0aW9uLFxuLy8gYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIHN1cHBsZW1lbnRhcnlJbmZvIHN0cnVjdFxuLy8gbGlrZSB0aGUgc2ltaWxhcml0eSBtYXRyaXggZm9yIG1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2UuXG4vLyB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24gc2hvdWxkIHJldHVybiBjb3JyZWN0IGJ1ZmZlciBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgdGhlIHN1cHBsZW1lbnRhcnlJbmZvLFxuLy8gZm9yIGV2ZXJ5IGVudHJ5IGxpc3Rcbi8vIHRoZSBtYXhEaXN0YW5jZSB2YXJpYWJsZSBpcyBhbHNvIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZVxuLy8gc2NvcGUgb2YgdGhlIGZ1bmN0aW9uLCBpbiBjYXNlIG9mIGtubiBpdCBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGxhc3QgcG9zdGlvbiBvZiBrbm4gb24gdGhpcyBpbmRleCxcbi8vIGluIGNhc2Ugb2Ygc3BhcnNlIG1hdHJpeCwgaXQgY2FuIGJlIGp1c3QgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGRpc3RhbmNlLlxuLy8gaGFtbWluZyBkaXN0YW5jZSBmb3Igc2VxdW5lbmNlcyBvZiB1aW50MzIgYXJyYXlzIG9mIG1heCBsZW5ndGggJHttYXhBcnJheVNpemV9XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVSGFtbWluZyhfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBzaXplRGlmZjogdTMyID0gbWF4TGVuZ3RoIC0gbWluTGVuZ3RoO1xuICBcbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKSAtIGYzMihzaXplRGlmZik7XG5cbiAgdmFyIGRpZmY6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHtfbWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgZGlmZiA9IGRpZmYgKyBmMzIoYVtpXSAhPSBiW2ldKTtcbiAgICAgIGlmIChkaWZmID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICAgIH1cbiAgfVxuICBkaWZmICs9IGYzMihzaXplRGlmZik7XG4gIHJldHVybiBkaWZmIC8gJHtfbWF4QXJyYXlTaXplfTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gaXQgaXMgYXNzdW1ldCB0aGF0IHN1cHBJbmZvIHN0cnVjdCBjb250YWlucyBjb3JyZWN0IG1hdHJpeCBjYWxsZWQgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0sIChzaW1pbGFyaXR5TWF0cml4MCwgc2ltaWxhcml0eU1hdHJpeDEsIGV0YylcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGJ5IHRoZSBnZXRQcm9jZXNzSW5mbyBmdW5jdGlvbi5cbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IHNpemVEaWZmOiB1MzIgPSBtYXhMZW5ndGggLSBtaW5MZW5ndGg7XG4gIFxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpIC0gZjMyKHNpemVEaWZmKTtcblxuICBsZXQgc2ltTWF0cml4ID0gJihzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSk7IC8vIHVzaW5nIHBvaW50ZXJzIG1ha2UgdGhpbmdzIGZhc3RlclxuICB2YXIgZGlmZjogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke19tYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICBkaWZmID0gZGlmZiArIDEuMCAtICgqc2ltTWF0cml4KVt1MzIoYVtpXSldW3UzMihiW2ldKV07XG4gICAgICBpZiAoZGlmZiA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gIH1cbiAgZGlmZiArPSBmMzIoc2l6ZURpZmYpO1xuICByZXR1cm4gZGlmZiAvICR7X21heEFycmF5U2l6ZX07XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTGV2ZW5zdGVpbihtYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcblxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpO1xuXG4gIC8vIHdlIHdpbGwgc3RvcmUgdHdvIGFycmF5cyBhcyBtYXRyaXggYW5kIHN3YXAgdGhlIHdvcmtpbmcgaW5kaWNlcyBwZXIgcGFzcy5cbiAgLy8gdGhpcyB3YXkgd2UgY2FuIHJlZHVjZSBtZW1vcnkgdXNhZ2UgcGVyIGNvbXB1dGF0aW9uIHRvIGp1c3QgTyhhTGVuZ3RoKVxuICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAvLyB0aGlzIHdpbGwgYmUgZ3VhcmFudGVlZCBieSBpdGVyYXRpb24sIGJ1dCB0aGUgYXJyYXkgc2l6ZXMgbXVzdCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIHdpbGwgdXNlIGEgZml4ZWQgc2l6ZSBvZiBtYXhBcnJheVNpemVcbiAgdmFyIGR5bmFtaWNQYXNzTWF0OiBhcnJheTxhcnJheTxmMzIsICR7bWF4QXJyYXlTaXplICsgMX11PiwgMj47IC8vIGluaXRpYWxpemUgdG8gMFxuICBcbiAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgdmFyIGN1ckluZGV4OiB1MzIgPSAxOyAvLyB3ZSB3aWxsIHN3YXAgdGhlc2UgaW5kaWNlcyBwZXIgcGFzc1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICBmb3IgKHZhciBpID0gMHU7IGkgPD0gYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVtpXSA9IGYzMihpKTtcbiAgfVxuXG4gIC8vIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xuICBmb3IgKHZhciBpID0gMXU7IGkgPD0gYkxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdWzBdID0gZjMyKGkpO1xuICAgICAgdmFyIG1pbkVudHJ5OiBmMzIgPSBmMzIobWF4TGVuZ3RoKTtcbiAgICAgIGxldCBwcmV2Um93ID0gJmR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF07XG4gICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgIGxldCBiTW9uID0gdTMyKGJbaSAtIDFdKTtcbiAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgdmFyIGNvc3Q6IGYzMiA9IGYzMihhW2ogLSAxXSAhPSBiTW9uKTtcbiAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgIG1pbihcbiAgICAgICAgICAgICAgICAoKnByZXZSb3cpW2pdICsgMS4wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICgqY3VyUm93KVtqIC0gMV0gKyAxLjAsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAoKnByZXZSb3cpW2ogLSAxXSArIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICgqY3VyUm93KVtqXSA9IHJlcztcbiAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgbWluRW50cnkgPSByZXM7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc3dhcCB0aGUgaW5kaWNlc1xuICAgICAgbGV0IHRlbXA6IHUzMiA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgY3VySW5kZXggPSB0ZW1wO1xuICAgICAgaWYgKG1pbkVudHJ5ID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1bYUxlbmd0aF0gLyBmMzIobWF4TGVuZ3RoKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gobWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gdmVyc2lvbiBvZiB0aGUgbGV2ZW5zaHRhaW4gd2hlcmUgdGhlIGNvc3Qgb2Ygc3Vic3RpdHV0aW9uIGlzIGN1c3RvbWl6YWJsZVxuICAgIC8vIGl0IGlzIGFzc3VtZXQgdGhhdCBzdXBwSW5mbyBzdHJ1Y3QgY29udGFpbnMgY29ycmVjdCBtYXRyaXggY2FsbGVkIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9LCAoc2ltaWxhcml0eU1hdHJpeDAsIHNpbWlsYXJpdHlNYXRyaXgxLCBldGMpXG4gICAgLy8gYW5kIGdhcE9wZW5QZW5hbHR5LCBnYXBFeHRlbnNpb25QZW5hbHR5XG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBieSB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24uXG4gICAgcmV0dXJuIGBcbiAgICAgIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gICAgICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICAgICAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICAgICAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBcbiAgICAgIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSk7XG4gICAgICAvLyB3ZSB3aWxsIHN0b3JlIHR3byBhcnJheXMgYXMgbWF0cml4IGFuZCBzd2FwIHRoZSB3b3JraW5nIGluZGljZXMgcGVyIHBhc3MuXG4gICAgICAvLyB0aGlzIHdheSB3ZSBjYW4gcmVkdWNlIG1lbW9yeSB1c2FnZSBwZXIgY29tcHV0YXRpb24gdG8ganVzdCBPKGFMZW5ndGgpXG4gICAgICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAgICAgLy8gdGhpcyB3aWxsIGJlIGd1YXJhbnRlZWQgYnkgaXRlcmF0aW9uLCBidXQgdGhlIGFycmF5IHNpemVzIG11c3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSB3aWxsIHVzZSBhIGZpeGVkIHNpemUgb2YgbWF4QXJyYXlTaXplXG4gICAgICB2YXIgZHluYW1pY1Bhc3NNYXQ6IGFycmF5PGFycmF5PGYzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+LCAyPjsgLy8gaW5pdGlhbGl6ZSB0byAwXG4gICAgICBcbiAgICAgIC8vIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvcGVyYXRpb24gbGVkIHRvIHRoZSBjdXJyZW50IGNlbGxcbiAgICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG4gICAgICB2YXIgdmVydGljYWxHYXBzOiBhcnJheTx1MzIsICR7bWF4QXJyYXlTaXplICsgMX11PjtcbiAgICAgIHZhciBob3Jpem9udGFsR2FwczogYXJyYXk8dTMyLCAke21heEFycmF5U2l6ZSArIDF9dT47XG5cbiAgICAgIGxldCBnYXBPcGVuUGVuYWx0eTogZjMyID0gc3VwcEluZm8uZ2FwT3BlblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgbGV0IGdhcEV4dGVuc2lvblBlbmFsdHk6IGYzMiA9IHN1cHBJbmZvLmdhcEV4dGVuc2lvblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgICAgIHZhciBjdXJJbmRleDogdTMyID0gMTsgLy8gd2Ugd2lsbCBzd2FwIHRoZXNlIGluZGljZXMgcGVyIHBhc3NcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDw9IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2ldID0gZ2FwT3BlblBlbmFsdHkgKyBmMzIoaSAtIDEpICogZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtjdXJJbmRleF1baV0gPSAwLjA7XG4gICAgICB9XG4gICAgICBkeW5hbWljUGFzc01hdFswXVswXSA9IDAuMDtcblxuICAgICAgbGV0IHNpbU1hdHJpeCA9ICZzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fTsgLy8gdXNpbmcgcG9pbnRlcnMgbWFrZSB0aGluZ3MgZmFzdGVyXG4gICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcbiAgICAgIGZvciAodmFyIGkgPSAxdTsgaSA8PSBiTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgbGV0IHByZXZSb3cgPSAmZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XTtcbiAgICAgICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgICAgICAoKmN1clJvdylbMF0gPSBnYXBPcGVuUGVuYWx0eSArIGYzMihpIC0gMSkgKiBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgIHZhciBtaW5FbnRyeTogZjMyID0gZjMyKG1heExlbmd0aCk7XG4gICAgICAgICAgbGV0IG1vbkIgPSB1MzIoYltpIC0gMV0pO1xuICAgICAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgICAgIGxldCBtb25BID0gdTMyKGFbaiAtIDFdKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGxldCBjb3N0OiBmMzIgPSAoKnByZXZSb3cpW2ogLSAxXSArIDFmIC0gKCpzaW1NYXRyaXgpW21vbkFdW21vbkJdO1xuICAgICAgICAgICAgICB2YXIgdG9wID0gKCpwcmV2Um93KVtqXTsgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsR2Fwc1tqXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcCArIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbGVmdCA9ICgqY3VyUm93KVtqIC0gMV07IC8vIGluc2VydGlvblxuICAgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID4gMCkge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgICAgICBtaW4oXG4gICAgICAgICAgICAgICAgICAgICAgdG9wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgKCpjdXJSb3cpW2pdID0gcmVzO1xuICAgICAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIG1pbkVudHJ5ID0gcmVzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZ2Fwc1xuICAgICAgICAgICAgICBpZiAocmVzID09IGNvc3QpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAxO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN3YXAgdGhlIGluZGljZXNcbiAgICAgICAgICBsZXQgdGVtcDogdTMyID0gcHJldkluZGV4O1xuICAgICAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgICAgIGN1ckluZGV4ID0gdGVtcDtcbiAgICAgICAgICBpZiAobWluRW50cnkgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2FMZW5ndGhdIC8gZjMyKG1heExlbmd0aCk7XG4gIFxuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUV1Y2xpZGVhbihtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIGRpc3Q6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgZGlzdCA9IGRpc3QgKyBmMzIoYVtpXSAtIGJbaV0pICogZjMyKGFbaV0gLSBiW2ldKTtcbiAgfVxuICByZXR1cm4gc3FydChkaXN0KTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNYW5oYXR0YW4obWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBkaXN0OiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgIGRpc3QgPSBkaXN0ICsgYWJzKGYzMihhW2ldIC0gYltpXSkpO1xuICB9XG4gIHJldHVybiBkaXN0O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU9uZUhvdERpc3RhbmNlKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBpZiAoYUxlbmd0aCAhPSBiTGVuZ3RoKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICBmb3IgKHZhciBpID0gMHU7IGkgPCBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgaWYoYVtpXSAhPSBiW2ldKSB7XG4gICAgICByZXR1cm4gMS4wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMC4wO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU51bWVyaWNEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gd2UgYXNzdW1lIHRoYXQgcmFuZ2Uke2VudHJ5SW5kZXh9IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3VwcGxlbWVudGFyeUluZm8gc3RydWN0XG4gICAgcmV0dXJuIGBcbiAgICBsZXQgcmFuZ2UgPSBzdXBwSW5mby5yYW5nZSR7ZW50cnlJbmRleH07XG4gICAgcmV0dXJuIGYzMihhYnMoZjMyKGFbMF0pIC0gZjMyKGJbMF0pKSAvIHJhbmdlKTtcbiAgYDtcbn1cbi8vIHRhbmltb3RvIGRpc3RhbmNlIGZvciB1aW50MzIgYXJyYXlzIG9mIGxlbmd0aCAke21heEFycmF5U2l6ZX1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVUYW5pbW90b0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuXG4gIGlmIChvbkJpdHNhID09IDB1ICYmIG9uQml0c2IgPT0gMHUpIHtcbiAgICAgIHJldHVybiAwLjA7XG4gIH1cblxuICBsZXQgdG90YWxPbkJpdHMgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cblxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsT25CaXRzIC0gY29tbW9uQml0cyk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQXN5bW1ldHJpY0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgbWluID0gbWluKG9uQml0c2EsIG9uQml0c2IpO1xuICBpZiAobWluID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKG1pbik7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQ29zaW5lQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG4gIGxldCB0b3RhbCA9IG9uQml0c2EgKiBvbkJpdHNiOyAvLyBwLnMuIGhlcmUgdG90YWwgaXMgdGFrZW4gYnkgbXVsdGlwbHlpbmdcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gc3FydChmMzIodG90YWwpKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVTb2thbEJpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgdG90YWwgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsICogMiAtIGNvbW1vbkJpdHMgKiAzKTtcbiAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1BVRElTVEFOQ0U7XG4oZnVuY3Rpb24gKFdFQkdQVURJU1RBTkNFKSB7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJIQU1NSU5HXCJdID0gXCJIYW1taW5nXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJFVUNMSURFQU5cIl0gPSBcIkV1Y2xpZGVhblwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTUFOSEFUVEFOXCJdID0gXCJNYW5oYXR0YW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIlRBTklNT1RPXCJdID0gXCJUYW5pbW90b1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTEVWRU5TVEVJTlwiXSA9IFwiTGV2ZW5zaHRlaW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk5FRURMRU1BTl9XVU5TQ0hcIl0gPSBcIk5lZWRsZW1hbm4tV3Vuc2NoXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXCJdID0gXCJNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJTT0tBTFwiXSA9IFwiU29rYWxcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkNPU0lORVwiXSA9IFwiQ29zaW5lXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJBU1lNTUVUUklDXCJdID0gXCJBc3ltbWV0cmljXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJEaWZmZXJlbmNlXCJdID0gXCJEaWZmZXJlbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJPbmVIb3RcIl0gPSBcIk9uZS1Ib3RcIjtcbn0pKFdFQkdQVURJU1RBTkNFIHx8IChXRUJHUFVESVNUQU5DRSA9IHt9KSk7XG5leHBvcnQgY29uc3Qgd2ViR1BVRnVuY3Rpb25zID0ge1xuICAgIFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HXTogd2ViR1BVSGFtbWluZyxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOXTogd2ViR1BVRXVjbGlkZWFuLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiB3ZWJHUFVNYW5oYXR0YW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPXTogd2ViR1BVVGFuaW1vdG9CaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTl06IHdlYkdQVUxldmVuc3RlaW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0hdOiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gsXG4gICAgW1dFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdOiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuU09LQUxdOiB3ZWJHUFVTb2thbEJpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5DT1NJTkVdOiB3ZWJHUFVDb3NpbmVCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IHdlYkdQVUFzeW1tZXRyaWNCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV06IHdlYkdQVU51bWVyaWNEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogd2ViR1BVT25lSG90RGlzdGFuY2Vcbn07XG5leHBvcnQgY29uc3QgZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHkgPSB7XG4gICAgW1dFQkdQVURJU1RBTkNFLkhBTU1JTkddOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UT106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLlNPS0FMXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQ09TSU5FXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplICogbWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAqIG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAyNSksXG4gICAgW1dFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdOiAoX21heEVudHJ5U2l6ZSkgPT4gMSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogKF9tYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChfbWF4RW50cnlTaXplIC8gNDApLFxufTtcbmV4cG9ydCBjb25zdCBUeXBlU3VwcG9ydGVkRGlzdGFuY2VzID0ge1xuICAgIFtcIlNUUklOR1wiIC8qIFdHUFVFTlRSWVRZUEUuU1RSSU5HICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTiwgV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCwgV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSwgV0VCR1BVRElTVEFOQ0UuT25lSG90XSksXG4gICAgW1wiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsIFdFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU4sIFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0gsIFdFQkdQVURJU1RBTkNFLlRBTklNT1RPLCBXRUJHUFVESVNUQU5DRS5DT1NJTkUsIFdFQkdQVURJU1RBTkNFLlNPS0FMLCBXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDLCBXRUJHUFVESVNUQU5DRS5PbmVIb3QsIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk9uZUhvdCwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJOVU1CRVJcIiAvKiBXR1BVRU5UUllUWVBFLk5VTUJFUiAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiQklUQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkJJVEFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE8sIFdFQkdQVURJU1RBTkNFLkNPU0lORSwgV0VCR1BVRElTVEFOQ0UuU09LQUwsIFdFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdKVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5sZXQgZ3B1QWRhcHRlciA9IG51bGw7XG5sZXQgZ3B1RGV2aWNlID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVEZXZpY2UoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvL3JlYXNvbjogb25seSBoZXJlIHdlIGdldCB0aGUgZ3B1QWRhcHRlclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICBncHVBZGFwdGVyID0geWllbGQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlcih7IHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnIH0pO1xuICAgICAgICAgICAgaWYgKGdwdUFkYXB0ZXIgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNMb3N0ID0gZmFsc2U7XG4gICAgICAgIGlmIChncHVEZXZpY2UpIHtcbiAgICAgICAgICAgIGdwdURldmljZS5sb3N0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzTG9zdCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwKSk7IC8vIHdhaXQgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgbG9zdFxuICAgICAgICB9XG4gICAgICAgIGlmICghZ3B1RGV2aWNlIHx8IGlzTG9zdCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRCdWZmZXJTaXplID0gMTAwMDAwMDAwMDsgLy8gfjEwMDBNQlxuICAgICAgICAgICAgY29uc3QgYWRhcHRlckxpbWl0cyA9IGdwdUFkYXB0ZXIubGltaXRzO1xuICAgICAgICAgICAgY29uc3QgYnVmZmZlclNpemVMaW1pdCA9IGFkYXB0ZXJMaW1pdHMubWF4QnVmZmVyU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXJTaXplTGltaXQgPSBhZGFwdGVyTGltaXRzLm1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ3B1RGV2aWNlID0geWllbGQgZ3B1QWRhcHRlci5yZXF1ZXN0RGV2aWNlKHsgcmVxdWlyZWRMaW1pdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEJ1ZmZlclNpemU6IE1hdGgubWluKGJ1ZmZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemU6IE1hdGgubWluKHN0b3JhZ2VCdWZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgfSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGRldmljZSB3aXRoIHJlcXVpcmVkIGxpbWl0cycsIGUpO1xuICAgICAgICAgICAgICAgIGdwdURldmljZSA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdERldmljZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVBZGFwdGVyRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvLyByZWFzb246IG9ubHkgaGVyZSB3ZSBnZXQgdGhlIGdwdUFkYXB0ZXJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZ3B1QWRhcHRlciA9IHlpZWxkIG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGlmIChncHVBZGFwdGVyID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdEFkYXB0ZXJJbmZvKCk7XG4gICAgICAgIGlmICghaW5mbylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBvdXRTdHJpbmcgPSByZXBsYWNlRW1wdHlTdHJpbmcoaW5mby5kZXNjcmlwdGlvbiwgcmVwbGFjZUVtcHR5U3RyaW5nKGluZm8udmVuZG9yLCAnTm8gR1BVIGRlc2NyaXB0aW9uIGF2YWlsYWJsZScpKTtcbiAgICAgICAgcmV0dXJuIG91dFN0cmluZztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VFbXB0eVN0cmluZyhzdHIsIHJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuICFzdHIgfHwgc3RyID09ICcnID8gcmVwbGFjZW1lbnQgOiBzdHI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRHUFVEZXZpY2UuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBXRUJHU0xBR0dSRUdBVElPTiwgV0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlMsIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtYWdncmVnYXRpb24nO1xuaW1wb3J0IHsgV0VCR1BVRElTVEFOQ0UsIHdlYkdQVUZ1bmN0aW9ucywgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMnO1xuaW1wb3J0IHsgd2ViR1BVUHJvY2Vzc0luZm8gfSBmcm9tICcuLi9wcmVwcm9jZXNzaW5nL3dlYkdQVS1wcm9jZXNzLWluZm8nO1xuaW1wb3J0IHsgZ2V0R1BVRGV2aWNlIH0gZnJvbSAnLi4vZ2V0R1BVRGV2aWNlJztcbi8qKiBnZW5lcmF0ZSBzcGFyc2UgbWF0cml4IGJhc2VkIG9uIGxpc3Qgb2YgbGlzdHMgb2YgZW50cmllcy5cbiAqICB0aGVzZSBlbnRyaWVzIGFyZSBlYWNoIGVuY29kZWQgYXMgVWludDMyQXJyYXkgb3IgRkxPQVQzMkFycmF5IChkZXBlbmRpbmcgb24gdGhlaXIgdHlwZSkuXG4gKiBmb3IgZXhhbXBsZSwgc2VxdWVuY2VzIHdvdWxkIGJlIGVuY29kZWQgYXMgVWludDMyQXJyYXkgYmFzZWQgb24gY2hhciBjb2RlIG9mIHRoZSBsZXR0ZXIgYXQgZWFjaCBwb3NpdGlvbi5cbiAqIFs2NSwgNjYsIDY3LCA2OCwgNjldIHdvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgNSBsZXR0ZXJzLlxuICogZm9yIGNoZW1pY2FsIGZpbmdlcnByaW50cywgaXQgd291bGQgYmUgYSBiaW5hcnkgYXJyYXkgb2YgMHMgYW5kIDFzLFxuICogcmVwcmVzZW50ZWQgYXMgVWludDMyQXJyYXkoX2RhdGEgcHJvcGVydHkgb2YgREcgYml0YXJyYXkpLlxuICpcbiAqIEJlIHdhcmUgdGhhdCBzaXplIG9mIGVudHJ5TGlzdCwgZGlzdGFuY2VNZXRyaWNzLCB3ZWlnaHRzIGFuZCBvcHRpb25zIG11c3QgYmUgdGhlIHNhbWUuXG4gKiBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucyBmb3IgZW50cmllcyBpLCBwYXNzIGFuIGVtcHR5IG9iamVjdC5cbiAqIGZvciBub3cgb3B0aW9ucyBhcmUgbmVlZGVkIGZvclxuICogbmVlZGxlbWFuLXd1bnNjaCBhbmQgbW9ub21lciBjaGVtaWNhbCBkaXN0YW5jZXM6IHNlZSB7QGxpbmsgQmlvRGlzdGFuY2VGbk9wdGlvbnN9IGFzIGZvciBob3cgaXQgc2hvdWxkIGJlIHBhc3NlZFxuICogbnVtZXJpYyBkaXN0YW5jZXMgKERpZmZlcmVuY2UpOiB7cmFuZ2U6IG51bWJlcn0gd2hlcmUgcmFuZ2UgaXMgdGhlIHJhbmdlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGNvbHVtbiAobWF4IC0gbWluKS5cbiAqIGluIGJvdGggY2FzZXMsIGlmIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgdGhleSB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4KGVudHJ5TGlzdCwgLy8gbGlzdCBvZiBsaXN0cyBvZiBlbnRyaWVzLCBmb3IgbXVsdGlwbGUgY29sdW1uc1xudGhyZXNob2xkID0gMC44LCAvLyBzaW1pbGFyaXR5IHRocmVzaG9sZCwgYmUgd2FyZSB0aGF0IGlmIHlvdSB1c2UgdG9vIHNtYWxsIHRocmVzaG9sZCwgdGhlcmUgbWlnaHQgYmUgbWVtb3J5IG92ZXJmbG93Li4uXG5kaXN0YW5jZU1ldHJpY3MsIC8vIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGVhY2ggY29sdW1uXG5hZ2dyZWdhdGlvbkZ1bmN0aW9uLCAvLyBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGRpc3RhbmNlc1xud2VpZ2h0cywgLy8gd2VpZ2h0cyBmb3IgZWFjaCBjb2x1bW5cbm9wdGlvbnMgLy8gc3VwcGxlbWVudGFyeSBvcHRpb25zIGZvciBlYWNoIGNvbHVtblxuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGV2aWNlID0geWllbGQgZ2V0R1BVRGV2aWNlKCk7XG4gICAgICAgIGlmICghZGV2aWNlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGlmIG5vIGRldmljZSwgcmV0dXJuIG51bGwsIGFzIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB3aXRob3V0IGl0LlxuICAgICAgICBjb25zdCBhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MgPSBPYmplY3QudmFsdWVzKFdFQkdQVURJU1RBTkNFKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlTWV0cmljcy5zb21lKChtZXRyaWMpID0+ICFhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MuaW5jbHVkZXMobWV0cmljKSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGlzdGFuY2UgbWV0cmljcyBwcm92aWRlZDogJyArIGRpc3RhbmNlTWV0cmljcy5qb2luKCcsICcpKTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRpb25GdW5jdGlvbnMgPSBPYmplY3QudmFsdWVzKFdFQkdTTEFHR1JFR0FUSU9OKTtcbiAgICAgICAgaWYgKCFhdmFpbGFibGVBZ2dyZWdhdGlvbkZ1bmN0aW9ucy5pbmNsdWRlcyhhZ2dyZWdhdGlvbkZ1bmN0aW9uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBwcm92aWRlZDogJyArIGFnZ3JlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBtYXhEaXN0YW5jZSA9IDEgLSB0aHJlc2hvbGQ7IC8vIG1heGltdW0gZGlzdGFuY2VcbiAgICAgICAgLy8gZmlyc3QsIGNoZWNrIHRoYXQgYWxsIHRoZSBzdXBwbGVtZW50YXJ5IG9wdGlvbnMgYXJlIHByb3ZpZGVkIGFuZCBhcmUgdGhlIHNhbWUgbGVuZ3RoOlxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggIT09IGVudHJ5TGlzdC5sZW5ndGggfHxcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoICE9PSBkaXN0YW5jZU1ldHJpY3MubGVuZ3RoIHx8XG4gICAgICAgICAgICBvcHRpb25zLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9ucywgd2VpZ3RocyBhbmQgZGlzdGFuY2UgZnVuY3Rpb25zIG11c3QgYmUgcHJvdmlkZWQgZm9yIGVhY2ggY29sdW1uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGVudHJ5IGxpc3RzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChsaXN0KSA9PiBsaXN0Lmxlbmd0aCAhPT0gZW50cnlMaXN0WzBdLmxlbmd0aCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBlbnRyeSBsaXN0cyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgICBjb25zdCBudW1PZkNvbHVtbnMgPSBlbnRyeUxpc3QubGVuZ3RoOyAvLyBudW1iZXIgb2YgY29sdW1uc1xuICAgICAgICBjb25zdCBsaXN0U2l6ZSA9IGVudHJ5TGlzdFswXS5sZW5ndGg7IC8vIHNpemUgb2YgZWFjaCBsaXN0IChvciBjb2x1bW4pXG4gICAgICAgIGNvbnN0IHByb2Nlc3NJbmZvID0gZW50cnlMaXN0Lm1hcCgoZW50cnksIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3ZWJHUFVQcm9jZXNzSW5mbyhlbnRyeSwgZGlzdGFuY2VNZXRyaWNzW2ldLCBpLCBvcHRpb25zW2ldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChudW1PZkNvbHVtbnMgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sdW1ucyBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIGNvbHVtbiBvZiBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1PZkNvbHVtbnMgPT09IDEpXG4gICAgICAgICAgICBhZ2dyZWdhdGlvbkZ1bmN0aW9uID0gV0VCR1NMQUdHUkVHQVRJT04uTUFOSEFUVEFOOyAvLyBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAgICAgLy8gY29tYmluZSBhbGwgc3RydWN0IHR5cGVzIGludG8gb25lIHRvIHB1dCBpbnRvIHRoZSBzdXBwSW5mbyBzdHJ1Y3QuXG4gICAgICAgIGxldCBzdXBwSW5mb1dnc2wgPSBwcm9jZXNzSW5mb1xuICAgICAgICAgICAgLm1hcCgoaW5mbykgPT4gaW5mby5zdXBwSW5mb1N0cnVjdFdnc2wpXG4gICAgICAgICAgICAuZmlsdGVyKCh3Z3NsKSA9PiAhIXdnc2wgJiYgd2dzbCAhPSAnJylcbiAgICAgICAgICAgIC5qb2luKCcsXFxuJyk7XG4gICAgICAgIC8vIHN0cnVjdHVyZXMgaW4gd2dzbCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1lbWJlciwgc28gaWYgd2UgaGF2ZSBubyBzdHJ1Y3R1cmVzLCB3ZSBuZWVkIHRvIGFkZCBhIGR1bW15IG9uZVxuICAgICAgICBsZXQgbmVlZHNEdW1teSA9IGZhbHNlO1xuICAgICAgICBpZiAoIXN1cHBJbmZvV2dzbCB8fCBzdXBwSW5mb1dnc2wudHJpbSgpID09ICcnKSB7XG4gICAgICAgICAgICBuZWVkc0R1bW15ID0gdHJ1ZTtcbiAgICAgICAgICAgIHN1cHBJbmZvV2dzbCA9ICdcXG5kdW1teTogZjMyXFxuJztcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21iaW5lIGFsbCBkYXRhIHdnc2wgc3RydWN0IGNvZGUgaW50byBvbmVcbiAgICAgICAgY29uc3QgZGF0YVdnc2wgPSBwcm9jZXNzSW5mby5tYXAoKGluZm8pID0+IGluZm8uZGF0YVN0cnVjdFdnc2wpLmZpbHRlcigod2dzbCkgPT4gISF3Z3NsICYmIHdnc2wgIT0gJycpLmpvaW4oJyxcXG4nKTtcbiAgICAgICAgLy8gY29tYmluZSBhbGwgYXJyYXkgc2l6ZXMgaW50byBvbmUgYXJyYXkgKGVhc2llciBmb3Igc2V0dGluZylcbiAgICAgICAgY29uc3QgYXJyYXlTaXplcyA9IG5ldyBVaW50MzJBcnJheShudW1PZkNvbHVtbnMgKiBsaXN0U2l6ZSk7XG4gICAgICAgIHByb2Nlc3NJbmZvLmZvckVhY2goKGluZm8sIGkpID0+IHtcbiAgICAgICAgICAgIGFycmF5U2l6ZXMuc2V0KGluZm8uYXJyYXlTaXplcywgaSAqIGxpc3RTaXplKTtcbiAgICAgICAgfSk7IC8vIGFycmF5LmZsYXQgaXMgbm90IGFzIG9wdGltaXplZCBhcyB0aGlzXG4gICAgICAgIC8vIGlmIHdlIHRyeSB0byBtYXAgbGFyZ2UgYXJyYXlzIGRpcmVjdGx5IGZyb20gR1BVLCBzb21ldGltZXMsIGRldmljZSBkaXNjb25uZWN0cy4gc28gd2UgbmVlZCB0byBkbyBpdCBpbiBjaHVua3MsIGEgZ29vZCBudW1iZXJcbiAgICAgICAgLy8gd2UgZm91bmQgaXMgMTAwMDAuIFNvIHdlIHdpbGwgcGVyZm9ybSBjb21wdXRhdGlvbnMgaW4gY2h1bmtzIG9mIDEwMDAwLiBtZWFuaW5nIHRoYXQgd2Ugd2lsbCBkaXNwYXRjaCAxMDAwMCB0aHJlYWRzIGF0IGEgdGltZS5cbiAgICAgICAgY29uc3QgbnVtT2ZUaHJlYWRzID0gMTAwMDA7XG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBjb21wbGV4aXR5IG9mIHRoZSBhbGdvcml0aG0sIGFzIHRoZSAxMDAgaXMgbG93IGVuYXVnaCBudW1iZXIsIHdoaWNoIGlzIGxpbWl0ZWQgYnkgbWVtb3J5IHVzYWdlLlxuICAgICAgICBjb25zdCBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkID0gMTAwOyAvLyBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXIgdGhyZWFkIChudW1iZXIgb2YgcGFpciBjb21wYXJpc29ucylcbiAgICAgICAgY29uc3QgY29tYmluZWRDb21wbGV4aXR5ID0gcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5jb21wbGV4aXR5LCAwKTsgLy8gY29tYmluZWQgY29tcGxleGl0eSBvZiBhbGwgdGhlIGNvbHVtbnNcbiAgICAgICAgY29uc3QgbWF4SXRlcmF0aW9uc1BlclRocmVhZCA9IE1hdGguY2VpbCgxMDAwMCAvIGNvbWJpbmVkQ29tcGxleGl0eSk7IC8vIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyIHRocmVhZFxuICAgICAgICBjb25zdCB3b3JrR3JvdXBEaXZpc2lvbiA9IDEwOyAvLyBob3cgbWFueSB0aHJlYWRzIGluc2lkZSBvZiBvbmUgd29ya2dyb3VwIGRpbWVuc2lvbiAoaW4gdGhpcyBjYXNlIDEwICogMTAgdGhyZWFkcyBwZXIgd29ya2dyb3VwKVxuICAgICAgICBjb25zdCB0aHJlYWRzUGVyV29ya2dyb3VwID0gd29ya0dyb3VwRGl2aXNpb24gKiB3b3JrR3JvdXBEaXZpc2lvbjtcbiAgICAgICAgY29uc3Qgd29ya2dyb3Vwc0RpbSA9IE1hdGguY2VpbChNYXRoLnNxcnQoTWF0aC5jZWlsKG51bU9mVGhyZWFkcyAvIHRocmVhZHNQZXJXb3JrZ3JvdXApKSk7IC8vIGhvdyBtYW55IHdvcmtncm91cHMgcGVyIDJkIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBnbG9iYWxUaHJlYWREaW1TaXplID0gd29ya2dyb3Vwc0RpbSAqIHdvcmtHcm91cERpdmlzaW9uOyAvLyBob3cgbWFueSB0aHJlYWRzIHBlciAyZCBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplID0gbGlzdFNpemUgKiAobGlzdFNpemUgLSAxKSAvIDI7IC8vIHNpemUgb2YgdGhlIGNvbmRlbnNlZCBkaXN0YW5jZSBtYXRyaXgsIHRoaXMgbWFueSBjb21wYXJpc29ucyB3aWxsIGJlIG1hZGUuXG4gICAgICAgIGNvbnN0IGRtQ2h1bmtTaXplUGVyVGhyZWFkID0gTWF0aC5jZWlsKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIG51bU9mVGhyZWFkcyk7IC8vIGhvdyBtYW55IGNvbXBhcmlzb25zIHBlciB0aHJlYWRcbiAgICAgICAgY29uc3QgbW9kdWxlID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG4gICAgICAgICAgICBsYWJlbDogJ1NwYXJzZSBtYXRyaXggY29tcHV0ZSBzaGFkZXInLFxuICAgICAgICAgICAgY29kZTogYFxuICAgIC8vIGVhY2ggdGhyZWFkIHdpbGwgcGVyZm9ybSAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9IGl0ZXJhdGlvbnMgYXQgb25lIHRpbWUsIGNvbXBhcmluZyAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9IHBhaXJzIG9mIGVudHJpZXMuXG4gICAgLy8gaW4gdG90YWwsIGVhY2ggdGhyZWFkIHdpbGwgcGVyZm9ybSBhdCBtb3N0ICR7ZG1DaHVua1NpemVQZXJUaHJlYWR9IGNvbXBhcmlzb25zLlxuICAgIC8vIGZpcnN0IGlzIHRoZSByZXN1bHQgc3RydWN0LCBjb250YWluaW5nIGlzLCBqcywgYW5kIGRpc3RhbmNlcy4gZWFjaCBhcnJheSB3aXRoIGxlbmd0aCBvZiAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9LFxuICAgIC8vIGFuZCBhbHNvIGludGVnZXIgZm9yIGhvdyBtYW55IHBhaXJzIHdlcmUgZm91bmQgdG8gYmUgYmVsb3cgdGhyZXNob2xkLlxuICAgIHN0cnVjdCBTcGFyc2VSZXN1bHQge1xuICAgICAgaTogYXJyYXk8YXJyYXk8dTMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGo6IGFycmF5PGFycmF5PHUzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBkaXN0YW5jZXM6IGFycmF5PGFycmF5PGYzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBmb3VuZDogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZG9uZTogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+XG4gICAgfVxuICAgIC8vIHN0cnVjdCBmb3IgdGhlIGRhdGFcbiAgICBzdHJ1Y3QgQ29tcHV0ZUluZm8ge1xuICAgICAgLy8gc3RhcnQgYXQgY29scyBhbmQgcm93cywgYW5kIGVuZCBhdCBjb2xzIGFuZCByb3dzIGZvciBlYWNoIHRocmVhZCwgdGhlc2Ugd2lsbCBiZSBjYWxjdWxhdGVkIG9uIGNwdSBhbmQgcGFzc2VkIHRvIGdwdS5cbiAgICAgIHN0YXJ0QXRDb2xzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBzdGFydEF0Um93czogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZW5kQXRDb2xzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBlbmRBdFJvd3M6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcblxuICAgICAgLy8gdGhlIEFDVFVBTExZIHNpemVzIG9mIGVhY2ggZW50cnlcbiAgICAgIGVudHJ5U2l6ZXM6IGFycmF5PGFycmF5PHUzMiwgJHtsaXN0U2l6ZX0+LCAke251bU9mQ29sdW1uc30+LFxuICAgICAgLy8gdGhlIHdlaWdodHMgZm9yIGVhY2ggZW50cnlcbiAgICAgIHdlaWdodHM6IGFycmF5PGYzMiwgJHtudW1PZkNvbHVtbnN9PixcbiAgICAgIC8vIHRoZSBkYXRhIGZvciBlYWNoIGVudHJ5XG4gICAgICAke2RhdGFXZ3NsfSAvLyBhbiBleGFtcGxlIG9mIHRoZSBkYXRhV2dzbCB3b3VsZCBiZTpcbiAgICAgIC8vZGF0YTA6IGFycmF5PGFycmF5PHUzMiwyMD4sMTAwPixcbiAgICAgIC8vZGF0YTE6IGFycmF5PGFycmF5PHUzMiwyMD4sMTAwPlxuICAgIH1cblxuICAgIC8vIHN0cnVjdCBmb3IgdGhlIHN1cHBsZW1lbnRhcnkgaW5mb3JtYXRpb25cbiAgICBzdHJ1Y3QgU3VwcEluZm8ge1xuICAgICAgLy8gc3RydWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBzdXBwbGVtZW50YXJ5IGluZm8sIGxpa2Ugc2NvcmluZyBtYXRyaXgsIGFscGhhYmV0IGluZGV4ZXMsIHJhbmdlLCBldGMuXG4gICAgICAke3N1cHBJbmZvV2dzbH1cbiAgICB9O1xuXG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBjb21wdXRlSW5mbzogQ29tcHV0ZUluZm87XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBzdXBwSW5mbzogU3VwcEluZm87XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiByZXN1bHRzOiBTcGFyc2VSZXN1bHQ7XG4gICAgQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCR7d29ya0dyb3VwRGl2aXNpb259LCAke3dvcmtHcm91cERpdmlzaW9ufSkgZm4gY2FsY1NwYXJzZU1hdHJpeChcbiAgICAgIEBidWlsdGluKGdsb2JhbF9pbnZvY2F0aW9uX2lkKSBpZDogdmVjMzx1MzI+XG4gICAgKSB7XG4gICAgICAke25lZWRzRHVtbXkgPyBgbGV0IG90aGVyRHVtbXkgPSBzdXBwSW5mby5kdW1teSAqIDI7YCA6ICcnfSAvLyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdXBwSW5mbyBpcyBub3Qgb3B0aW1pemVkIG91dFxuICAgICAgbGV0IHRocmVhZENvbCA9IGlkLng7XG4gICAgICBsZXQgdGhyZWFkUm93ID0gaWQueTtcbiAgICAgIGxldCBsaW5lYXJJbmRleCA9IHRocmVhZFJvdyAqICR7Z2xvYmFsVGhyZWFkRGltU2l6ZX0gKyB0aHJlYWRDb2w7XG4gICAgICBpZiAobGluZWFySW5kZXggPj0gJHtudW1PZlRocmVhZHN9KSB7XG4gICAgICAgIHJldHVybjsgLy8gaWYgd2UgYXJlIG91dCBvZiBib3VuZHMsIHJldHVyblxuICAgICAgfSAgICAgIFxuICAgICAgdmFyIHN0YXJ0QXRDb2w6IHUzMiA9IGNvbXB1dGVJbmZvLnN0YXJ0QXRDb2xzW2xpbmVhckluZGV4XTtcbiAgICAgIHZhciBzdGFydEF0Um93OiB1MzIgPSBjb21wdXRlSW5mby5zdGFydEF0Um93c1tsaW5lYXJJbmRleF07XG4gICAgICBsZXQgZW5kQXRDb2w6IHUzMiA9IG1pbihjb21wdXRlSW5mby5lbmRBdENvbHNbbGluZWFySW5kZXhdLCAke2xpc3RTaXplfXUpO1xuICAgICAgbGV0IGVuZEF0Um93OiB1MzIgPSBtaW4oY29tcHV0ZUluZm8uZW5kQXRSb3dzW2xpbmVhckluZGV4XSwgJHtsaXN0U2l6ZX11KTtcbiAgICAgIGxldCBpcyA9ICZyZXN1bHRzLmlbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGpzID0gJnJlc3VsdHMualtsaW5lYXJJbmRleF07XG4gICAgICBsZXQgZGlzdGFuY2VzID0gJnJlc3VsdHMuZGlzdGFuY2VzW2xpbmVhckluZGV4XTtcbiAgICAgIHJlc3VsdHMuZm91bmRbbGluZWFySW5kZXhdID0gMDsgLy8gaW5pdGlhbGl6ZSB0aGUgZm91bmQgY291bnRlclxuICAgICAgdmFyIGZvdW5kOiB1MzIgPSAwO1xuICAgICAgaWYgKHJlc3VsdHMuZG9uZVtsaW5lYXJJbmRleF0gPiAwKSB7XG4gICAgICAgIHJldHVybjsgLy8gaWYgd2UgYXJlIGRvbmUsIHJldHVyblxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAke21heEl0ZXJhdGlvbnNQZXJUaHJlYWR9OyBpKyspIHtcbiAgICAgICAgaWYgKHN0YXJ0QXRDb2wgPj0gZW5kQXRDb2wgJiYgc3RhcnRBdFJvdyA+PSBlbmRBdFJvdykge1xuICAgICAgICAgIHJlc3VsdHMuZG9uZVtsaW5lYXJJbmRleF0gPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCA+PSAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpc3QgPSBjb21iaW5lZERpc3RhbmNlKHN0YXJ0QXRDb2wsIHN0YXJ0QXRSb3cpO1xuICAgICAgICBpZiAoZGlzdCA8PSAke21heERpc3RhbmNlfSkge1xuICAgICAgICAgICgqaXMpW2ZvdW5kXSA9IHN0YXJ0QXRDb2w7XG4gICAgICAgICAgKCpqcylbZm91bmRdID0gc3RhcnRBdFJvdztcbiAgICAgICAgICAoKmRpc3RhbmNlcylbZm91bmRdID0gZGlzdDtcbiAgICAgICAgICBmb3VuZCA9IGZvdW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydEF0Q29sID0gc3RhcnRBdENvbCArIDE7XG4gICAgICAgIGlmIChzdGFydEF0Q29sID49ICR7bGlzdFNpemV9dSkge1xuICAgICAgICAgIHN0YXJ0QXRSb3cgKz0gMTtcbiAgICAgICAgICBzdGFydEF0Q29sID0gc3RhcnRBdFJvdyArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdHMuZm91bmRbbGluZWFySW5kZXhdID0gZm91bmQ7XG4gICAgICAvLyB1cGRhdGUgdGhlIHN0YXJ0QXRDb2xzIGFuZCBzdGFydEF0Um93c1xuICAgICAgY29tcHV0ZUluZm8uc3RhcnRBdENvbHNbbGluZWFySW5kZXhdID0gc3RhcnRBdENvbDtcbiAgICAgIGNvbXB1dGVJbmZvLnN0YXJ0QXRSb3dzW2xpbmVhckluZGV4XSA9IHN0YXJ0QXRSb3c7XG5cbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGRpc3RhbmNlIHNjcmlwdCBmb3IgZWFjaCBkaXN0YW5jZSBtZXRyaWMgYW5kIHRoZW4gY29tYmluZSB0aGVtIGludG8gb25lXG4gICAgJHtnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0KGRpc3RhbmNlTWV0cmljcywgcHJvY2Vzc0luZm8ubWFwKChpbmZvKSA9PiBpbmZvLm1heEVudHJ5TGVuKSwgbWF4RGlzdGFuY2UsIGFnZ3JlZ2F0aW9uRnVuY3Rpb24pfVxuXG5cbiAgICBgXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXBlbGluZSA9IGRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe1xuICAgICAgICAgICAgbGFiZWw6ICdzcGFyc2UgbWF0cml4IGNvbXB1dGUgcGlwZWxpbmUnLFxuICAgICAgICAgICAgbGF5b3V0OiAnYXV0bycsXG4gICAgICAgICAgICBjb21wdXRlOiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdjYWxjU3BhcnNlTWF0cml4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRDb2xzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0QXRSb3dzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGVuZEF0Q29scyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBlbmRBdFJvd3MgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBudW1PZlRocmVhZHMpOyAvLyBzaXplIG9mIHRoZSBjaHVuayBwZXIgdGhyZWFkIChpbiB0b3RhbClcbiAgICAgICAgbGV0IHN0YXJ0Um93ID0gMDtcbiAgICAgICAgbGV0IHN0YXJ0Q29sID0gMTtcbiAgICAgICAgY29uc29sZS50aW1lKCdHUFV0aHJlYWRTdGFydHMnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZlRocmVhZHM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaSA9PT0gbnVtT2ZUaHJlYWRzIC0gMSA/IGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAtIDEgOiAoaSArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgLy8gZmFuY3kgZm9ybXVsYXMgdG8gY2FsY3VsYXRlIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMgZm9yIHRoZSBjb25kZW5zZWQgZGlzdGFuY2UgbWF0cml4IGZvciBlYWNoIHRocmVhZCBzdGFydFxuICAgICAgICAgICAgY29uc3QgZW5kUm93ID0gbGlzdFNpemUgLSAyIC0gTWF0aC5mbG9vcihNYXRoLnNxcnQoLTggKiBlbmRJZHggKyA0ICogbGlzdFNpemUgKiAobGlzdFNpemUgLSAxKSAtIDcpIC8gMiAtIDAuNSk7XG4gICAgICAgICAgICBjb25zdCBlbmRDb2wgPSBlbmRJZHggLSBsaXN0U2l6ZSAqIGVuZFJvdyArIE1hdGguZmxvb3IoKGVuZFJvdyArIDEpICogKGVuZFJvdyArIDIpIC8gMik7XG4gICAgICAgICAgICBzdGFydEF0Q29sc1tpXSA9IHN0YXJ0Q29sO1xuICAgICAgICAgICAgc3RhcnRBdFJvd3NbaV0gPSBzdGFydFJvdztcbiAgICAgICAgICAgIGVuZEF0Q29sc1tpXSA9IGVuZENvbDtcbiAgICAgICAgICAgIGVuZEF0Um93c1tpXSA9IGVuZFJvdztcbiAgICAgICAgICAgIHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICAvLyBjb25zdCBzdGFydFJvdyA9IHZhbHVlc1swXS5sZW5ndGggLSAyIC0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIC8vICAgTWF0aC5zcXJ0KC04ICogc3RhcnRJZHggKyA0ICogdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgLy8gY29uc3Qgc3RhcnRDb2wgPSBzdGFydElkeCAtIHZhbHVlc1swXS5sZW5ndGggKiBzdGFydFJvdyArIE1hdGguZmxvb3IoKHN0YXJ0Um93ICsgMSkgKiAoc3RhcnRSb3cgKyAyKSAvIDIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnR1BVdGhyZWFkU3RhcnRzJyk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIGNvbXB1dGVJbmZvIGJ1ZmZlclxuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSA9IG51bU9mVGhyZWFkcyAqIDQgKyAvLyBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgICAgICBsaXN0U2l6ZSAqIG51bU9mQ29sdW1ucyArIC8vIGVudHJ5U2l6ZXNcbiAgICAgICAgICAgIG51bU9mQ29sdW1ucyArIC8vIHdlaWdodHNcbiAgICAgICAgICAgIHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc291cmNlQXJyYXlTaXplLCAwKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgc3VwcEluZm8gYnVmZmVyXG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyMzJTaXplID0gcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5zdXBwSW5mb1NpemUsIDApO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSByZXN1bHRzIGJ1ZmZlclxuICAgICAgICBjb25zdCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgPSBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICogbnVtT2ZUaHJlYWRzO1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyMzJTaXplID0gMyAqIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSArIG51bU9mVGhyZWFkcyArIG51bU9mVGhyZWFkczsgLy8gaSwgaiwgZGlzdGFuY2VzLCBmb3VuZCwgZG9uZVxuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgb24gdGhlIEdQVSB0byBob2xkIGNvbXB1dGVJbmZvXG4gICAgICAgIC8vIGJld2FyZSB0aGF0IHN0cnVjdCBtdXN0IGJlIHBhZGRlZCB0byAxNiBieXRlcywgc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHN0cnVjdCBpbiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXJTaXplID0gY29tcHV0ZUluZm9CdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSA9IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3QgcmVtYWluZGVyID0gY29tcHV0ZUluZm9CdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSArPSAxNiAtIHJlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ2NvbXB1dGUgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyID0gY29tcHV0ZUluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTsgLy8gZ2V0IGZ1bGwgYnVmZmVyXG4gICAgICAgIC8vIGR5bmFtaWMgb2Zmc2V0IGZvciB0aGUgY29tcHV0ZUluZm8gYnVmZmVyXG4gICAgICAgIGxldCBjb21wdXRlSW5mb09mZlNldCA9IDA7XG4gICAgICAgIC8vIGZpcnN0IHdyaXRlIHRoZSBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRDb2xzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgc3RhcnRBdENvbHNCdWZmZXJWaWV3LnNldChzdGFydEF0Q29scyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3Qgc3RhcnRBdFJvd3NCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBzdGFydEF0Um93c0J1ZmZlclZpZXcuc2V0KHN0YXJ0QXRSb3dzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBlbmRBdENvbHNCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBlbmRBdENvbHNCdWZmZXJWaWV3LnNldChlbmRBdENvbHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGVuZEF0Um93c0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGVuZEF0Um93c0J1ZmZlclZpZXcuc2V0KGVuZEF0Um93cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGUgZW50cnlTaXplc1xuICAgICAgICBjb25zdCBlbnRyeVNpemVzVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgYXJyYXlTaXplcy5sZW5ndGgpO1xuICAgICAgICBlbnRyeVNpemVzVmlldy5zZXQoYXJyYXlTaXplcyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IGFycmF5U2l6ZXMubGVuZ3RoICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICAvLyB0aGVuIHdyaXRlIHRoZSB3ZWlnaHRzXG4gICAgICAgIGNvbnN0IHdlaWdodHNWaWV3ID0gbmV3IEZsb2F0MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZDb2x1bW5zKTtcbiAgICAgICAgd2VpZ2h0c1ZpZXcuc2V0KHdlaWdodHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZkNvbHVtbnMgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBkYXRhIGl0c2VsZlxuICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgcHJvY2Vzc0luZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IEFycmF5Q29uc3RydWN0b3IgPSBpbmZvLkVuY29kZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gaW5mby5zb3VyY2VBcnJheVNpemU7XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBjaHVua1NpemUpOyAvL25ldyBBcnJheUNvbnN0cnVjdG9yKGNvbXB1dGVJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKGNvbXB1dGVJbmZvT2ZmU2V0LCBjaHVua0J5dGVTaXplKSk7XG4gICAgICAgICAgICBkYXRhVmlldy5zZXQoaW5mby5mbGF0U291cmNlQXJyYXkpO1xuICAgICAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gY2h1bmtTaXplICogQXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICBjb21wdXRlSW5mb0J1ZmZlci51bm1hcCgpO1xuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgb24gdGhlIEdQVSB0byBob2xkIHN1cHBJbmZvXG4gICAgICAgIC8vIHNhbWUgaGVyZSwgd2UgbmVlZCB0byBwYWQgdGhlIHNpemUgb2YgdGhlIHN0cnVjdCB0byAxNiBieXRlc1xuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlclNpemUgPSBzdXBwSW5mb0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplID0gc3VwcEluZm9CdWZmZXJTaXplO1xuICAgICAgICBjb25zdCBzdXBwSW5mb1JlbWFpbmRlciA9IHN1cHBJbmZvQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChzdXBwSW5mb1JlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSArPSAxNiAtIHN1cHBJbmZvUmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplID0gTWF0aC5tYXgocGFkZGVkU3VwcEluZm9CdWZmZXJTaXplLCAxNik7XG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3N1cHAgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyID0gc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTsgLy8gZ2V0IGZ1bGwgYnVmZmVyXG4gICAgICAgIGxldCBzdXBwSW5mb09mZlNldCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaW5mbyBvZiBwcm9jZXNzSW5mbykge1xuICAgICAgICAgICAgaWYgKGluZm8uc3VwcEluZm9CdWZmZXIgJiYgaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoID4gMCAmJiBpbmZvLnN1cHBJbmZvU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBBcnJheUNvbnN0cnVjdG9yID0gaW5mby5zdXBwSW5mb1R5cGUgPT09IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovID8gVWludDMyQXJyYXkgOiBGbG9hdDMyQXJyYXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VwcEluZm9WaWV3ID0gbmV3IEFycmF5Q29uc3RydWN0b3IobWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciwgc3VwcEluZm9PZmZTZXQsIGluZm8uc3VwcEluZm9CdWZmZXIubGVuZ3RoKTsgLy9uZXcgQXJyYXlDb25zdHJ1Y3RvcihzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZShzdXBwSW5mb09mZlNldCwgaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgc3VwcEluZm9WaWV3LnNldChpbmZvLnN1cHBJbmZvQnVmZmVyKTtcbiAgICAgICAgICAgICAgICBzdXBwSW5mb09mZlNldCArPSBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGg7IC8vIGluZm8uc3VwcEluZm9CdWZmZXIubGVuZ3RoICogQXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcEluZm9PZmZTZXQgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGR1bW15VmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyLCAwLCA0KTsgLy9uZXcgVWludDMyQXJyYXkoc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoMCwgMTYpKTtcbiAgICAgICAgICAgIGR1bW15Vmlldy5zZXQoWzEsIDEsIDEsIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBwSW5mb0J1ZmZlci51bm1hcCgpO1xuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgZm9yIHRoZSByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXJTaXplID0gcmVzdWx0c0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUgPSByZXN1bHRzQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0c1JlbWFpbmRlciA9IHJlc3VsdHNCdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHJlc3VsdHNSZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSArPSAxNiAtIHJlc3VsdHNSZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdHMgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXR1cCBhIGJpbmRHcm91cCB0byB0ZWxsIHRoZSBzaGFkZXIgd2hpY2hcbiAgICAgICAgLy8gYnVmZmVyIHRvIHVzZSBmb3IgdGhlIGNvbXB1dGF0aW9uXG4gICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICAgICAgbGFiZWw6ICdiaW5kR3JvdXAgZm9yIHNwYXJzZSBtYXRyaXggYnVmZmVyJyxcbiAgICAgICAgICAgIGxheW91dDogcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAgICAgZW50cmllczogW1xuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMCwgcmVzb3VyY2U6IHsgYnVmZmVyOiBjb21wdXRlSW5mb0J1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAxLCByZXNvdXJjZTogeyBidWZmZXI6IHN1cHBJbmZvQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDIsIHJlc291cmNlOiB7IGJ1ZmZlcjogcmVzdWx0c0J1ZmZlciB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgLy9jb25zdCBwYWlyQ29tcGFyaXNvbnNQZXJQYXNzID0gbWF4SXRlcmF0aW9uc1BlclRocmVhZCAqIG51bU9mVGhyZWFkcztcbiAgICAgICAgLy9jb25zdCBwYXNzZXMgPSBNYXRoLmNlaWwoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gcGFpckNvbXBhcmlzb25zUGVyUGFzcyk7XG4gICAgICAgIC8vIHdlIHdpbGwgZGlzdHBhdGNoIHRoaXMgbWFueSBwYXNzZXMgdG8gdGhlIEdQVSwgYW5kIGl0IHdpbGwgaGFuZGxlIGluZGV4ZXMgYWxsIGJ5IGl0c2VsZi5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBjb3BpZWQgdGhlIHN0YXJ0L2VuZCBpbmZvcm1hdGlvbiB0byBpdCwgc28gaXQgd2lsbCBrbm93IHdoZXJlIHRvIHN0YXJ0IGFuZCBlbmQgb24gZWFjaCBwYXNzLlxuICAgICAgICBjb25zdCByZXN1bHRzT3V0QnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdHMgb3V0IGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiByZXN1bHRzQnVmZmVyLnNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUQgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdElzID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdEpzID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdERpc3RhbmNlcyA9IFtdO1xuICAgICAgICAvL2xldCBjb21iaW5lZEZvdW5kID0gMDtcbiAgICAgICAgbGV0IGlzQWxsRG9uZSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoIWlzQWxsRG9uZSkge1xuICAgICAgICAgICAgLy8gRW5jb2RlIGNvbW1hbmRzIHRvIGRvIHRoZSBjb21wdXRhdGlvblxuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdkaXN0YW5jZSBlbmNvZGVyJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcGFzcyA9IGVuY29kZXIuYmVnaW5Db21wdXRlUGFzcyh7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdkaXN0YW5jZSBjb21wdXRlIHBhc3MnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXNzLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgICAgIHBhc3Muc2V0QmluZEdyb3VwKDAsIGJpbmRHcm91cCk7XG4gICAgICAgICAgICBwYXNzLmRpc3BhdGNoV29ya2dyb3Vwcyh3b3JrZ3JvdXBzRGltLCB3b3JrZ3JvdXBzRGltKTtcbiAgICAgICAgICAgIHBhc3MuZW5kKCk7XG4gICAgICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihyZXN1bHRzQnVmZmVyLCAwLCByZXN1bHRzT3V0QnVmZmVyLCAwLCByZXN1bHRzT3V0QnVmZmVyLnNpemUpO1xuICAgICAgICAgICAgLy8gRmluaXNoIGVuY29kaW5nIGFuZCBzdWJtaXQgdGhlIGNvbW1hbmRzXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kQnVmZmVyID0gZW5jb2Rlci5maW5pc2goKTtcbiAgICAgICAgICAgIGRldmljZS5xdWV1ZS5zdWJtaXQoW2NvbW1hbmRCdWZmZXJdKTtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc3VsdHNcbiAgICAgICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgICAgICB5aWVsZCByZXN1bHRzT3V0QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzT3V0QXJyYXlCdWZmZXIgPSByZXN1bHRzT3V0QnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7XG4gICAgICAgICAgICAvLyByZWFkIHRoZSByZXN1bHRzXG4gICAgICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNJID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0ogPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRm91bmQgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRG9uZSA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgICAgIGlzQWxsRG9uZSA9IHJlc3VsdHNEb25lLmV2ZXJ5KChkKSA9PiBkID09PSAxKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsUmVzdWx0cyA9IHJlc3VsdHNGb3VuZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkSSA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWRKID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZERpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGxldCBjb21iaW5lZE9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCByZXNJID0gMDsgcmVzSSA8IHJlc3VsdHNGb3VuZC5sZW5ndGg7IHJlc0krKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gcmVzdWx0c0ZvdW5kW3Jlc0ldO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29tYmluZWRJLnNldChyZXN1bHRzSS5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZEouc2V0KHJlc3VsdHNKLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkRGlzdGFuY2VzLnNldChyZXN1bHRzRGlzdGFuY2VzLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkT2Zmc2V0ICs9IGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0SXMucHVzaChjb21iaW5lZEkpO1xuICAgICAgICAgICAgcmVzdWx0SnMucHVzaChjb21iaW5lZEopO1xuICAgICAgICAgICAgcmVzdWx0RGlzdGFuY2VzLnB1c2goY29tYmluZWREaXN0YW5jZXMpO1xuICAgICAgICAgICAgcmVzdWx0c091dEJ1ZmZlci51bm1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHJlc3VsdElzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIubGVuZ3RoLCAwKTtcbiAgICAgICAgY29uc3QgZmluYWxJID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsSiA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBjb25zdCBmaW5hbERpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgbGV0IGZpbmFsT2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRJcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmluYWxJLnNldChyZXN1bHRJc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxKLnNldChyZXN1bHRKc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxEaXN0YW5jZXMuc2V0KHJlc3VsdERpc3RhbmNlc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxPZmZzZXQgKz0gcmVzdWx0SXNbaV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzIHJ1bGUgbWFuZGF0ZXMsIGRlc3Ryb3kgYWxsIGJ1ZmZlcnMuXG4gICAgICAgIGNvbXB1dGVJbmZvQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwcEluZm9CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmVzdWx0c091dEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiB7IGk6IGZpbmFsSSwgajogZmluYWxKLCBkaXN0YW5jZTogZmluYWxEaXN0YW5jZXMgfTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldENvbWJpbmVkRGlzdGFuY2VTY3JpcHQoZGlzdGFuY2VNZXRyaWNzLCBtYXhFbnRyeUxlbnMsIG1heERpc3RhbmNlLCBhZ2dyZWdhdGlvbikge1xuICAgIGNvbnN0IGRpc3RhbmNlV2dzbHMgPSBkaXN0YW5jZU1ldHJpY3MubWFwKChtZXRyaWMsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgZm4gZGlzdGFuY2VTY3JpcHQke2l9KGFJbmRleDogdTMyLCBiSW5kZXg6IHUzMikgLT4gZjMyIHtcbiAgICAgICAgICBsZXQgYSA9IGNvbXB1dGVJbmZvLmRhdGEke2l9W2FJbmRleF07XG4gICAgICAgICAgbGV0IGIgPSBjb21wdXRlSW5mby5kYXRhJHtpfVtiSW5kZXhdO1xuICAgICAgICAgIGxldCBtYXhEaXN0YW5jZTogZjMyID0gJHttYXhEaXN0YW5jZX07XG4gICAgICAgICAgJHt3ZWJHUFVGdW5jdGlvbnNbbWV0cmljXShtYXhFbnRyeUxlbnNbaV0sIGkpfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0pO1xuICAgIGNvbnN0IGFsbERpc3RhbmNlU2NyaXB0cyA9IGRpc3RhbmNlV2dzbHMuam9pbignXFxuJyk7XG4gICAgY29uc3QgY29tYmluZURpc3RhbmNlc1NjcmlwdCA9IGBcbiAgICAgIGZuIGNvbWJpbmVkRGlzdGFuY2UoYUluZGV4OiB1MzIsIGJJbmRleDogdTMyKSAtPiBmMzIge1xuICAgICAgICB2YXIgZGlzdGFuY2VzOiBhcnJheTxmMzIsICR7ZGlzdGFuY2VNZXRyaWNzLmxlbmd0aH0+O1xuICAgICAgICAke2Rpc3RhbmNlTWV0cmljcy5tYXAoKF8sIGkpID0+IGBkaXN0YW5jZXNbJHtpfV0gPSBkaXN0YW5jZVNjcmlwdCR7aX0oYUluZGV4LCBiSW5kZXgpO2ApLmpvaW4oJ1xcbicpfVxuICAgICAgICAke1dFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TW2FnZ3JlZ2F0aW9uXShkaXN0YW5jZU1ldHJpY3MubGVuZ3RoKX1cbiAgICAgIH1cbiAgICBcbiAgICBgO1xuICAgIHJldHVybiBhbGxEaXN0YW5jZVNjcmlwdHMgKyAnXFxuJyArIGNvbWJpbmVEaXN0YW5jZXNTY3JpcHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtc3BhcnNlLW1hdHJpeC5qcy5tYXAiLCJleHBvcnQgdmFyIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzO1xuKGZ1bmN0aW9uIChEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcykge1xuICAgIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzW1wiRVVDTElERUFOXCJdID0gXCJFVUNMSURFQU5cIjtcbiAgICBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc1tcIk1BTkhBVFRBTlwiXSA9IFwiTUFOSEFUVEFOXCI7XG59KShEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB8fCAoRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgPSB7fSkpO1xuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZEhsd1pYTXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMGVYQmxjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeE5RVUZOTEVOQlFVNHNTVUZCV1N3d1FrRkhWRHRCUVVoSUxGZEJRVmtzTUVKQlFUQkNPMGxCUTJ4RExIRkVRVUYxUWl4RFFVRkJPMGxCUTNaQ0xIRkVRVUYxUWl4RFFVRkJPMEZCUTNwQ0xFTkJRVU1zUlVGSVV5d3dRa0ZCTUVJc1MwRkJNVUlzTUVKQlFUQkNMRkZCUjI1RE8wRkJRVUVzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbVY0Y0c5eWRDQmxiblZ0SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6SUh0Y2JpQWdJQ0JGVlVOTVNVUkZRVTRnUFNBblJWVkRURWxFUlVGT0p5eGNiaUFnSUNCTlFVNUlRVlJVUVU0Z1BTQW5UVUZPU0VGVVZFRk9KeXhjYmlBZ2ZUdGNibHh1Wlhod2IzSjBJSFI1Y0dVZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkNBOUlHdGxlVzltSUhSNWNHVnZaaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtjenRjYmlKZGZRPT0iLCIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgeyBkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSwgVHlwZVN1cHBvcnRlZERpc3RhbmNlcywgV0VCR1BVRElTVEFOQ0UgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVVByb2Nlc3NJbmZvKGVudHJ5TGlzdCwgZGlzdGFuY2VNZXRyaWMgPSBXRUJHUFVESVNUQU5DRS5IQU1NSU5HLCBlbnRyeUluZGV4LCAvLyBpbmRleCBvZiB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBvZiBsaXN0cyB0aGF0IHdlIHdhbnQgdG8gcHJvY2Vzc1xub3B0aW9ucyA9IHsgZ2FwT3BlblBlbmFsdHk6IDEuMCwgZ2FwRXh0ZW5zaW9uUGVuYWx0eTogMC42IH0pIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBlbnRyeVR5cGUgPSBudWxsO1xuICAgIGNvbnN0IGVuY29kZWRMaXN0ID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiB0eXBlb2YgZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIlNUUklOR1wiIC8qIFdHUFVFTlRSWVRZUEUuU1RSSU5HICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBuZXcgVWludDMyQXJyYXkoZW50cnkuc3BsaXQoJycpLm1hcCgoYykgPT4gYy5jaGFyQ29kZUF0KDApKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gdHlwZW9mIGUgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJOVU1CRVJcIiAvKiBXR1BVRU5UUllUWVBFLk5VTUJFUiAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gbmV3IEZsb2F0MzJBcnJheShbZW50cnldKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeUxpc3RbMF0gPT0gJ29iamVjdCcgJiYgZW50cnlMaXN0LnNvbWUoKGUpID0+ICdfZGF0YScgaW4gZSAmJiAnX2xlbmd0aCcgaW4gZSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiQklUQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkJJVEFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5fZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgVWludDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgSW50MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gZW50cnlMaXN0IGFzIFVpbnQzMkFycmF5W107XG4gICAgfSkoKTtcbiAgICBpZiAoIWVuY29kZWRMaXN0IHx8ICFlbnRyeVR5cGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbnRyeSB0eXBlLCBjb3VsZCBub3QgZGV0ZXJtaW5lIGVudHJ5IHR5cGUgZnJvbSBpbnB1dCBsaXN0Jyk7XG4gICAgY29uc3QgZW5jb2RlZExpc3RUeXBlID0gZW5jb2RlZExpc3RbMF0gaW5zdGFuY2VvZiBJbnQzMkFycmF5ID8gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovIDpcbiAgICAgICAgZW5jb2RlZExpc3RbMF0gaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgPyBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovIDogXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi87XG4gICAgLy8gc2l6ZXMgb2YgZWFjaCBlbnRyaWVzIG1pZ2h0IGRpZmZlciwgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoYXQgZm9yIHNvbWUgZGlzdGFuY2UgbWV0cmljcywgbGlrZSBoYW1taW5nIGZvciBleGFtcGxlXG4gICAgY29uc3QgYXJyYXlTaXplcyA9IG5ldyBVaW50MzJBcnJheShlbmNvZGVkTGlzdC5tYXAoKGFycikgPT4gYXJyLmxlbmd0aCkpO1xuICAgIGlmICghVHlwZVN1cHBvcnRlZERpc3RhbmNlc1tlbnRyeVR5cGVdIHx8ICFUeXBlU3VwcG9ydGVkRGlzdGFuY2VzW2VudHJ5VHlwZV0uaGFzKGRpc3RhbmNlTWV0cmljKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXN0YW5jZSBtZXRyaWMgJyR7ZGlzdGFuY2VNZXRyaWN9JyBub3Qgc3VwcG9ydGVkIGZvciBlbnRyeSB0eXBlICcke2VudHJ5VHlwZX0nYCk7XG4gICAgY29uc3QgbWF4RW50cnlMZW4gPSBhcnJheVNpemVzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgIC8vIGdldCB0aGUgY29tcGxleGl0eSBvZiB1c2VkIGFsZ29yaXRobVxuICAgIGNvbnN0IGNvbXBsZXhpdHkgPSBkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eVtkaXN0YW5jZU1ldHJpY10obWF4RW50cnlMZW4pO1xuICAgIGNvbnN0IEVuY29kZWRBcnJheUNvbnN0cnVjdG9yID0gZW5jb2RlZExpc3RUeXBlID09PSBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi8gPyBJbnQzMkFycmF5IDpcbiAgICAgICAgKGVuY29kZWRMaXN0VHlwZSA9PT0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLyA/IEZsb2F0MzJBcnJheSA6IFVpbnQzMkFycmF5KTtcbiAgICBjb25zdCBmbGF0U291cmNlQXJyYXkgPSBuZXcgRW5jb2RlZEFycmF5Q29uc3RydWN0b3IoZW5jb2RlZExpc3QubGVuZ3RoICogbWF4RW50cnlMZW4pO1xuICAgIC8vIHdoZW4gc2V0dGluZywgd2UgbmVlZCB0byBzZXQgZWFjaCBhcnJheSBhdCBhIHNwZWNpZmljIG9mZnNldCwgd2hpY2ggaXMgY29udHJvbGxlZCBieSBtYXhBcnJheUxlbiBiZWNhdXNlIGVhY2ggYXJyYXkgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuXG4gICAgLy8gdGhpcyB3YXkgd2Ugd2lsbCBnZXQgY29ycmVjdCBtYXRyaXggcmVwcmVzZW50YXRpb24gaW4gdGhlIGNvbXB1dGUgc2hhZGVyXG4gICAgZW5jb2RlZExpc3QuZm9yRWFjaCgoc2VxLCBpKSA9PiB7XG4gICAgICAgIGZsYXRTb3VyY2VBcnJheS5zZXQoc2VxLCBpICogbWF4RW50cnlMZW4pO1xuICAgIH0pO1xuICAgIC8vIE5CISBhbGwgdGhpcyBiZWZvcmUgdGhlIGxpbmUgd2FzIGdlbmVyaWMsIG5vdyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBzb21lIHNwZWNpZmljIHRoaW5ncyBmb3Igc29tZSBzcGVjaWZpYyBkaXN0YW5jZSBtZXRyaWNzXG4gICAgLy8gaW5pdGlhbGl6ZSBzdXBwIGluZm8gbGluZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHNoYWRlcjtcbiAgICBsZXQgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gJyc7IC8vIHRoZSBjb2RlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IG9mIHN1cHBJbmZvXG4gICAgbGV0IHN1cHBJbmZvU2l6ZSA9IDA7XG4gICAgbGV0IHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgbGV0IHN1cHBJbmZvQnVmZmVyID0gbnVsbDtcbiAgICBpZiAoZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0ggfHwgZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UpIHtcbiAgICAgICAgbGV0IG1heE1vbm9tZXJJbmRleCA9IG9wdGlvbnMuc2NvcmluZ01hdHJpeCAmJiBvcHRpb25zLmFscGhhYmV0SW5kZXhlcyA/XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmFscGhhYmV0SW5kZXhlcykucmVkdWNlKChwcmV2LCBuKSA9PiBNYXRoLm1heChwcmV2LCBuLmNoYXJDb2RlQXQoMCkpLCAwKSA6IC0xO1xuICAgICAgICAvLyBnZW5lcmF0ZSBkZWZhdWx0IHNpbWlsYXJpdHkgbWF0cml4IGlmIGl0IGlzIG5vdCBwcm92aWRlZFxuICAgICAgICBpZiAoIW9wdGlvbnMuYWxwaGFiZXRJbmRleGVzIHx8ICFvcHRpb25zLnNjb3JpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdFNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRTb3VyY2VBcnJheVtpXSA+IG1heE1vbm9tZXJJbmRleClcbiAgICAgICAgICAgICAgICAgICAgbWF4TW9ub21lckluZGV4ID0gZmxhdFNvdXJjZUFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4ID1cbiAgICAgICAgICAgICAgICBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwoMCkpO1xuICAgICAgICAgICAgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5zY29yaW5nTWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4W2ldW2ldID0gMTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFscGhhYmV0SW5kZXhlc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eU1hdHJpeFNpemUgPSAobWF4TW9ub21lckluZGV4ICsgMSkgKiAobWF4TW9ub21lckluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4ID0gbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBGbG9hdDMyQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkpO1xuICAgICAgICAvLyBzZXQgZGlhZ29uYWwgdG8gMVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heE1vbm9tZXJJbmRleCArIDE7IGkrKylcbiAgICAgICAgICAgIHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldW2ldID0gMTtcbiAgICAgICAgY29uc3QgYWxwaGFiZXRJbmRleGVzID0gb3B0aW9ucy5hbHBoYWJldEluZGV4ZXM7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFscGhhYmV0SW5kZXhlcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhhbHBoYWJldEluZGV4ZXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0ga2V5MilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhba2V5LmNoYXJDb2RlQXQoMCldW2tleTIuY2hhckNvZGVBdCgwKV0gPVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXhbYWxwaGFiZXRJbmRleGVzW2tleV1dW2FscGhhYmV0SW5kZXhlc1trZXkyXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gbWVtb3J5IGxheW91dCwgd2Ugd2lsbCBoYXZlIDIgZmxvYXQzMiBzIGZvciBnYXBPcGVuIGFuZCBnYXBFeHRlbnNpb24gcGVuYWx0aWVzLCBhbmQgdGhlbiBmMzIgYXJyYXk8YXJyYXk8ZjMyPj4gZm9yIHNpbWlsYXJpdHkgbWF0cml4LlxuICAgICAgICAvLyBiZWNhdXNlIG9mIHByaW1pdGl2ZXMsIHRoZXJlIHdpbGwgYmUgbm8gcGFkZGluZywgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aGUgc2l6ZSBkaXJlY3RseVxuICAgICAgICBzdXBwSW5mb1NpemUgPSAyICsgc2ltaWxhcml0eU1hdHJpeFNpemU7XG4gICAgICAgIHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShzdXBwSW5mb1NpemUpO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlclswXSA9IChfYSA9IG9wdGlvbnMuZ2FwT3BlblBlbmFsdHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEuMDtcbiAgICAgICAgc3VwcEluZm9CdWZmZXJbMV0gPSAoX2IgPSBvcHRpb25zLmdhcEV4dGVuc2lvblBlbmFsdHkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAuNjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1cHBJbmZvQnVmZmVyLnNldCh0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gYFxuICAgICAgICAgICAgZ2FwT3BlblBlbmFsdHkke2VudHJ5SW5kZXh9OiBmMzIsXG4gICAgICAgICAgICBnYXBFeHRlbnNpb25QZW5hbHR5JHtlbnRyeUluZGV4fTogZjMyLFxuICAgICAgICAgICAgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH06IGFycmF5PGFycmF5PGYzMiwgJHttYXhNb25vbWVySW5kZXggKyAxfT4sICR7bWF4TW9ub21lckluZGV4ICsgMX0+YDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2UpIHtcbiAgICAgICAgLy8gZm9yIGRpZmZlcmVuY2UsIHdlIG5lZWQgcmFuZ2Ugb2YgdmFsdWVzIGZvciBub3JtYWxpemF0aW9uIG9mIHRoZSBkaWZmZXJlbmNlXG4gICAgICAgIGlmICghb3B0aW9ucy5yYW5nZSB8fCB0eXBlb2Ygb3B0aW9ucy5yYW5nZSAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5yYW5nZSA8PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBtaW4gPSBmbGF0U291cmNlQXJyYXkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSwgZmxhdFNvdXJjZUFycmF5WzBdKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IGZsYXRTb3VyY2VBcnJheS5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCBmbGF0U291cmNlQXJyYXlbMF0pO1xuICAgICAgICAgICAgb3B0aW9ucy5yYW5nZSA9IG1heCAtIG1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yYW5nZSA8PSAwKVxuICAgICAgICAgICAgb3B0aW9ucy5yYW5nZSA9IDEuMDsgLy8gdGhpcyBtZWFucyB0aGF0IGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLCBhbmQgYWxsIGRpc3RhbmNlcyB3aWxsIHByb2R1Y2UgMC5cbiAgICAgICAgc3VwcEluZm9TaXplID0gMTtcbiAgICAgICAgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgc3VwcEluZm9CdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KFtvcHRpb25zLnJhbmdlXSk7XG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCA9IGBcbiAgICAgICAgICAgIHJhbmdlJHtlbnRyeUluZGV4fTogZjMyYDtcbiAgICB9XG4gICAgY29uc3QgZGF0YVR5cGVXR1NMID0gZmxhdFNvdXJjZUFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSA/ICdpMzInIDogKGZsYXRTb3VyY2VBcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSA/ICdmMzInIDogJ3UzMicpO1xuICAgIGNvbnN0IGRhdGFTdHJ1Y3RXZ3NsID0gYGRhdGEke2VudHJ5SW5kZXh9OiBhcnJheTxhcnJheTwke2RhdGFUeXBlV0dTTH0sICR7bWF4RW50cnlMZW59PiwgJHtlbmNvZGVkTGlzdC5sZW5ndGh9PmA7XG4gICAgLy8gZm9yIG5vdywgb3RoZXIgZGlzdGFuY2VzIGRvIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGF0XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmxhdFNvdXJjZUFycmF5LFxuICAgICAgICBzb3VyY2VBcnJheVNpemU6IGZsYXRTb3VyY2VBcnJheS5sZW5ndGgsXG4gICAgICAgIG1heEVudHJ5TGVuLFxuICAgICAgICBhcnJheVNpemVzLFxuICAgICAgICBjb21wbGV4aXR5LFxuICAgICAgICBzdXBwSW5mb0J1ZmZlcixcbiAgICAgICAgc3VwcEluZm9TaXplLFxuICAgICAgICBzdXBwSW5mb1R5cGU6IHN1cHBJbmZvVHlwZSxcbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsLFxuICAgICAgICBlbnRyeVR5cGUsXG4gICAgICAgIGRhdGFUeXBlV0dTTCxcbiAgICAgICAgZGF0YVN0cnVjdFdnc2wsXG4gICAgICAgIEVuY29kZWRBcnJheUNvbnN0cnVjdG9yXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1wcm9jZXNzLWluZm8uanMubWFwIiwiaW1wb3J0IHsgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgfSBmcm9tICcuL3R5cGVzJztcbmV4cG9ydCBjb25zdCBpc05pbCA9ICh4KSA9PiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDtcbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRTbWFsbGVyKGRpc3RhbmNlc0FyLCBpbmRleGVzLCBudW0sIGluZGV4KSB7XG4gICAgaWYgKG51bSA+IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aCAtIDFdKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA8IHYpO1xuICAgIGRpc3RhbmNlc0FyLnBvcCgpO1xuICAgIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgICBpbmRleGVzLnBvcCgpO1xuICAgIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0TGFyZ2VyKGRpc3RhbmNlc0FyLCBpbmRleGVzLCBudW0sIGluZGV4KSB7XG4gICAgaWYgKG51bSA8IGRpc3RhbmNlc0FyW2Rpc3RhbmNlc0FyLmxlbmd0aCAtIDFdKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSBkaXN0YW5jZXNBci5maW5kSW5kZXgoKHYpID0+IG51bSA+IHYpO1xuICAgIGRpc3RhbmNlc0FyLnBvcCgpO1xuICAgIGRpc3RhbmNlc0FyLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgbnVtKTtcbiAgICBpbmRleGVzLnBvcCgpO1xuICAgIGluZGV4ZXMuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBpbmRleCk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdncmVnYXRpb25GdW5jdGlvbihhZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0cykge1xuICAgIHN3aXRjaCAoYWdncmVnYXRpb25NZXRob2QpIHtcbiAgICAgICAgY2FzZSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5NQU5IQVRUQU46XG4gICAgICAgICAgICByZXR1cm4gKHZzKSA9PiB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArIHZhbCAqIHdlaWdodHNbaWR4XSwgMCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gKHZzKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXVjbGlkZWFuXG4gICAgICAgICAgICAgICAgY29uc3Qgc3VtID0gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyAodmFsICogd2VpZ2h0c1tpZHhdKSAqKiAyLCAwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHN1bSk7XG4gICAgICAgICAgICB9O1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRYUnBiSE11YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SjFkR2xzY3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3hQUVVGUExFVkJRVFJDTERCQ1FVRXdRaXhGUVVGRExFMUJRVTBzVTBGQlV5eERRVUZETzBGQlJUbEZMRTFCUVUwc1EwRkJReXhOUVVGTkxFdEJRVXNzUjBGQlJ5eERRVUZETEVOQlFVMHNSVUZCUlN4RlFVRkZMRU5CUVVNc1EwRkJReXhMUVVGTExFbEJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NVMEZCVXl4RFFVRkRPMEZCUlM5RUxFMUJRVTBzVlVGQlZTeGhRVUZoTEVOQlFVTXNWMEZCY1VJc1JVRkJSU3hQUVVGcFFpeEZRVUZGTEVkQlFWY3NSVUZCUlN4TFFVRmhPMGxCUTJoSExFbEJRVWtzUjBGQlJ5eEhRVUZITEZkQlFWY3NRMEZCUXl4WFFVRlhMRU5CUVVNc1RVRkJUU3hIUVVGRExFTkJRVU1zUTBGQlF6dFJRVU42UXl4UFFVRlBPMGxCUlZRc1RVRkJUU3hYUVVGWExFZEJRVWNzVjBGQlZ5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUXpGRUxGZEJRVmNzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTnNRaXhYUVVGWExFTkJRVU1zVFVGQlRTeERRVUZETEZkQlFWY3NSVUZCUlN4RFFVRkRMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03U1VGRGVFTXNUMEZCVHl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8wbEJRMlFzVDBGQlR5eERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzBGQlEzaERMRU5CUVVNN1FVRkZSQ3hOUVVGTkxGVkJRVlVzV1VGQldTeERRVUZETEZkQlFYRkNMRVZCUVVVc1QwRkJhVUlzUlVGQlJTeEhRVUZYTEVWQlFVVXNTMEZCWVR0SlFVTXZSaXhKUVVGSkxFZEJRVWNzUjBGQlJ5eFhRVUZYTEVOQlFVTXNWMEZCVnl4RFFVRkRMRTFCUVUwc1IwRkJReXhEUVVGRExFTkJRVU03VVVGRGVrTXNUMEZCVHp0SlFVVlVMRTFCUVUwc1YwRkJWeXhIUVVGSExGZEJRVmNzUTBGQlF5eFRRVUZUTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTXhSQ3hYUVVGWExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdTVUZEYkVJc1YwRkJWeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXl4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRE8wbEJRM2hETEU5QlFVOHNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVOa0xFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNWMEZCVnl4RlFVRkZMRU5CUVVNc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dEJRVU40UXl4RFFVRkRPMEZCUlVRc1RVRkJUU3hWUVVGVkxITkNRVUZ6UWl4RFFVTndReXhwUWtGQk5FTXNSVUZCUlN4UFFVRnBRanRKUVVVdlJDeFJRVUZSTEdsQ1FVRnBRaXhGUVVGRkxFTkJRVU03VVVGRE1VSXNTMEZCU3l3d1FrRkJNRUlzUTBGQlF5eFRRVUZUTzFsQlEzWkRMRTlCUVU4c1EwRkJReXhGUVVGWkxFVkJRVVVzUlVGQlJTeERRVUZETEVWQlFVVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGNrWTdXVUZEUlN4UFFVRlBMRU5CUVVNc1JVRkJXU3hGUVVGRkxFVkJRVVU3WjBKQlEzUkNMRmxCUVZrN1owSkJRMW9zVFVGQlRTeEhRVUZITEVkQlFVY3NSVUZCUlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRVZCUVVVc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF5eEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVNM1JTeFBRVUZQTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRGVFSXNRMEZCUXl4RFFVRkRPMGxCUTA0c1EwRkJRenRCUVVOSUxFTkJRVU1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTBScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFzSUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6ZlNCbWNtOXRJQ2N1TDNSNWNHVnpKenRjYmx4dVpYaHdiM0owSUdOdmJuTjBJR2x6VG1sc0lEMGdLSGc2SUdGdWVTa2dQVDRnZUNBOVBUMGdiblZzYkNCOGZDQjRJRDA5UFNCMWJtUmxabWx1WldRN1hHNWNibVY0Y0c5eWRDQm1kVzVqZEdsdmJpQnBibk5sY25SVGJXRnNiR1Z5S0dScGMzUmhibU5sYzBGeU9pQnVkVzFpWlhKYlhTd2dhVzVrWlhobGN6b2diblZ0WW1WeVcxMHNJRzUxYlRvZ2JuVnRZbVZ5TENCcGJtUmxlRG9nYm5WdFltVnlLU0I3WEc0Z0lHbG1JQ2h1ZFcwZ1BpQmthWE4wWVc1alpYTkJjbHRrYVhOMFlXNWpaWE5CY2k1c1pXNW5kR2d0TVYwcFhHNGdJQ0FnY21WMGRYSnVPMXh1WEc0Z0lHTnZibk4wSUc1bGQxQnZjMmwwYVc5dUlEMGdaR2x6ZEdGdVkyVnpRWEl1Wm1sdVpFbHVaR1Y0S0NoMktTQTlQaUJ1ZFcwZ1BDQjJLVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjRzl3S0NrN1hHNGdJR1JwYzNSaGJtTmxjMEZ5TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2diblZ0S1R0Y2JpQWdhVzVrWlhobGN5NXdiM0FvS1R0Y2JpQWdhVzVrWlhobGN5NXpjR3hwWTJVb2JtVjNVRzl6YVhScGIyNHNJREFzSUdsdVpHVjRLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHbHVjMlZ5ZEV4aGNtZGxjaWhrYVhOMFlXNWpaWE5CY2pvZ2JuVnRZbVZ5VzEwc0lHbHVaR1Y0WlhNNklHNTFiV0psY2x0ZExDQnVkVzA2SUc1MWJXSmxjaXdnYVc1a1pYZzZJRzUxYldKbGNpa2dlMXh1SUNCcFppQW9iblZ0SUR3Z1pHbHpkR0Z1WTJWelFYSmJaR2x6ZEdGdVkyVnpRWEl1YkdWdVozUm9MVEZkS1Z4dUlDQWdJSEpsZEhWeWJqdGNibHh1SUNCamIyNXpkQ0J1WlhkUWIzTnBkR2x2YmlBOUlHUnBjM1JoYm1ObGMwRnlMbVpwYm1SSmJtUmxlQ2dvZGlrZ1BUNGdiblZ0SUQ0Z2RpazdYRzRnSUdScGMzUmhibU5sYzBGeUxuQnZjQ2dwTzF4dUlDQmthWE4wWVc1alpYTkJjaTV6Y0d4cFkyVW9ibVYzVUc5emFYUnBiMjRzSURBc0lHNTFiU2s3WEc0Z0lHbHVaR1Y0WlhNdWNHOXdLQ2s3WEc0Z0lHbHVaR1Y0WlhNdWMzQnNhV05sS0c1bGQxQnZjMmwwYVc5dUxDQXdMQ0JwYm1SbGVDazdYRzU5WEc1Y2JtVjRjRzl5ZENCbWRXNWpkR2x2YmlCblpYUkJaMmR5WldkaGRHbHZia1oxYm1OMGFXOXVLRnh1SUNCaFoyZHlaV2RoZEdsdmJrMWxkR2h2WkRvZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkN3Z2QyVnBaMmgwY3pvZ2JuVnRZbVZ5VzExY2JpazZJQ2gyWVd4MVpYTTZJRzUxYldKbGNsdGRLU0E5UGlCdWRXMWlaWElnZTF4dUlDQnpkMmwwWTJnZ0tHRm5aM0psWjJGMGFXOXVUV1YwYUc5a0tTQjdYRzRnSUNBZ1kyRnpaU0JFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtjeTVOUVU1SVFWUlVRVTQ2WEc0Z0lDQWdJQ0J5WlhSMWNtNGdLSFp6T2lCdWRXMWlaWEpiWFNrZ1BUNGdkbk11Y21Wa2RXTmxLQ2hoWTJNc0lIWmhiQ3dnYVdSNEtTQTlQaUJoWTJNZ0t5QjJZV3dnS2lCM1pXbG5hSFJ6VzJsa2VGMHNJREFwTzF4dUlDQWdJR1JsWm1GMWJIUTZYRzRnSUNBZ0lDQnlaWFIxY200Z0tIWnpPaUJ1ZFcxaVpYSmJYU2tnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQXZMeUJsZFdOc2FXUmxZVzVjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjM1Z0SUQwZ2RuTXVjbVZrZFdObEtDaGhZMk1zSUhaaGJDd2dhV1I0S1NBOVBpQmhZMk1nS3lBb2RtRnNJQ29nZDJWcFoyaDBjMXRwWkhoZEtTQXFLaUF5TENBd0tUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlFMWhkR2d1YzNGeWRDaHpkVzBwTzF4dUlDQWdJQ0FnZlR0Y2JpQWdmVnh1ZlZ4dUlsMTkiLCJpbXBvcnQgeyBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgaW5zZXJ0U21hbGxlciwgaXNOaWwgfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBjbGFzcyBTcGFyc2VNYXRyaXhTZXJ2aWNlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyQ291bnQgPSBNYXRoLm1heChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSAtIDIsIDEpO1xuICAgIH1cbiAgICBhc3luYyBjYWxjTXVsdGlDb2x1bW4odmFsdWVzLCBmbk5hbWVzLCB0aHJlc2hvbGQsIG9wdHMgPSBbe31dLCB3ZWlnaHRzID0gWzFdLCBhZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IG1pblRocmVzaG9sZCA9IHZhbHVlc1swXS5sZW5ndGggPiAyMDAwMCA/XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCkgOiAwO1xuICAgICAgICBpZiAodGhyZXNob2xkIDwgbWluVGhyZXNob2xkKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgdXNpbmcgdGhyZXNob2xkICR7bWluVGhyZXNob2xkfWApO1xuICAgICAgICAgICAgdGhyZXNob2xkID0gbWluVGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIG9wdHMuZm9yRWFjaCgoXywgaSkgPT4gb3B0c1tpXVsndGhyZXNob2xkJ10gPSB0aHJlc2hvbGQpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL3NwYXJzZS1tYXRyaXgtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoeyBpOiBuZXcgSW50MzJBcnJheSgwKSwgajogbmV3IEludDMyQXJyYXkoMCksIGRpc3RhbmNlOiBuZXcgRmxvYXQzMkFycmF5KDApLCBpZHggfSk7XG4gICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHsgdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCB0aHJlc2hvbGQsIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kIH0pO1xuICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoeyBkYXRhOiB7IGVycm9yLCBpLCBqLCBkaXN0YW5jZSB9IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7IGksIGosIGRpc3RhbmNlLCBpZHggfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5pLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGkgPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGogPSBuZXcgSW50MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICAvLyBzZXR0aW5nIHRoZSByZXN1bHRzXG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGkuc2V0KHJlcy5pLCBvZmZzZXQpO1xuICAgICAgICAgICAgai5zZXQocmVzLmosIG9mZnNldCk7XG4gICAgICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICAgICAgb2Zmc2V0ICs9IHJlcy5pLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBpLCBqLCBkaXN0YW5jZSB9O1xuICAgIH1cbiAgICBhc3luYyBjYWxjKHZhbHVlcywgZm5OYW1lLCB0aHJlc2hvbGQsIG9wdHMgPSB7fSkge1xuICAgICAgICAvL3NpemUgb2YgZnVsbCBtYXRyaXhcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2FsY011bHRpQ29sdW1uKFt2YWx1ZXNdLCBbZm5OYW1lXSwgdGhyZXNob2xkLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuICAgIGFzeW5jIGdldEtOTih2YWx1ZXMsIGZuTmFtZSwgbk5laWdoYm91cnMgPSAxNSwgb3B0cyA9IHt9KSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLm11bHRpQ29sdW1uS05OKFt2YWx1ZXNdLCBbZm5OYW1lXSwgbk5laWdoYm91cnMsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG4gICAgYXN5bmMgZ2V0VGhyZXNob2xkS05OKHZhbHVlcywgZm5OYW1lLCB0aHJlc2hvbGQgPSAwLjgsIG9wdHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tdWx0aUNvbHVtblRocmVzaG9sZEtubihbdmFsdWVzXSwgW2ZuTmFtZV0sIHRocmVzaG9sZCwgW29wdHNdLCBbMV0pO1xuICAgIH1cbiAgICBhc3luYyBtdWx0aUNvbHVtblRocmVzaG9sZEtubih2YWx1ZXMsIGZuTmFtZXMsIHRocmVzaG9sZCA9IDAuOCwgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi10aHJlc2hvbGQtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgICAgIHByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaWR4ID09PSB0aGlzLl93b3JrZXJDb3VudCAtIDEgPyBtYXRTaXplIDogKGlkeCArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgIGlmIChlbmRJZHggPD0gc3RhcnRJZHgpXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoeyBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSgwKSwga25uSW5kZXhlczogbmV3IEFycmF5KDApIH0pO1xuICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7IHZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgZm5OYW1lcywgb3B0cywgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHsgZGF0YTogeyBlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzIH0gfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGtublNpemVzID0gbmV3IEludDMyQXJyYXkodmFsdWVzWzBdLmxlbmd0aCk7XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgIGtublNpemVzW2ldICs9IHJlcy5rbm5JbmRleGVzW2ldPy5sZW5ndGggPz8gMDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrbm5SZXMgPSB7XG4gICAgICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoXywgaSkgPT4gbmV3IEFycmF5KGtublNpemVzW2ldKSksXG4gICAgICAgICAgICBrbm5JbmRleGVzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheShrbm5TaXplc1tpXSkpXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGtublJlcy5rbm5EaXN0YW5jZXNbaV1ba25uU2l6ZXNbaV0gLSAxXSA9IHJlcy5rbm5EaXN0YW5jZXNbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGtublJlcy5rbm5JbmRleGVzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uSW5kZXhlc1tpXVtqXTtcbiAgICAgICAgICAgICAgICAgICAga25uU2l6ZXNbaV0gLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtublJlcztcbiAgICB9XG4gICAgYXN5bmMgbXVsdGlDb2x1bW5LTk4odmFsdWVzLCBmbk5hbWVzLCBuTmVpZ2hib3VycyA9IDE1LCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCAhPT0gZm5OYW1lcy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gb3B0cy5sZW5ndGggfHwgdmFsdWVzLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhbHVlcywgZGlzdGFuY2UgZnVuY3Rpb25zLCBvcHRpb25zIGFuZCB3ZWlnaHRzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICAgICAgaWYgKHZhbHVlcy5zb21lKCh2KSA9PiB2Lmxlbmd0aCAhPT0gdmFsdWVzWzBdLmxlbmd0aCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FsbCB2YWx1ZXMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICBjb25zdCBjaHVua1NpemUgPSBNYXRoLmZsb29yKG1hdFNpemUgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHByb21pc2VzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3Qgd29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudClcbiAgICAgICAgICAgIC5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4va25uLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKSB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2UoeyB2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGZuTmFtZXMsIG9wdHMsIG5OZWlnaGJvdXJzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHsgZGF0YTogeyBlcnJvciwga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzIH0gfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdFdvcmtlcihlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsga25uRGlzdGFuY2VzLCBrbm5JbmRleGVzIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGtublJlcyA9IHtcbiAgICAgICAgICAgIGtubkRpc3RhbmNlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheShuTmVpZ2hib3VycykuZmlsbCg5OTk5OSkpLFxuICAgICAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheShuTmVpZ2hib3VycykuZmlsbCgtMSkpXG4gICAgICAgIH07XG4gICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzWzBdLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMua25uRGlzdGFuY2VzW2ldPy5sZW5ndGggPz8gMDsgKytqKVxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRTbWFsbGVyKGtublJlcy5rbm5EaXN0YW5jZXNbaV0sIGtublJlcy5rbm5JbmRleGVzW2ldLCByZXMua25uRGlzdGFuY2VzW2ldW2pdLCByZXMua25uSW5kZXhlc1tpXVtqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtublJlcztcbiAgICB9XG4gICAgYXN5bmMgZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cyA9IFtdLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCA9IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLkVVQ0xJREVBTikge1xuICAgICAgICBjb25zdCB0aHJlc2hvbGRXb3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KS5maWxsKG51bGwpXG4gICAgICAgICAgICAubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXRocmVzaG9sZC13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtYXRTaXplID0gdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLyAyO1xuICAgICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICAgICAgY29uc3QgbWF4U2FtcGxlU2l6ZSA9IDEwMDAwMDA7XG4gICAgICAgICAgICBjb25zdCBzYW1wbGVTaXNlID0gTWF0aC5tYXgoTWF0aC5taW4obWF0U2l6ZSAvIDEwMDAsIG1heFNhbXBsZVNpemUpLCBNYXRoLm1pbihtYXRTaXplLCBtYXhTYW1wbGVTaXplKSk7XG4gICAgICAgICAgICBjb25zdCB0ZXN0U2V0U2l6ZVBlcldvcmtlciA9IE1hdGguZmxvb3Ioc2FtcGxlU2lzZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICAgIGNvbnN0IHRQcm9taXNlcyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCB0aGlzLl93b3JrZXJDb3VudDsgaWR4KyspIHtcbiAgICAgICAgICAgICAgICB0UHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJZHggPSBpZHggKiBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkV29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczogdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBzYW1wbGVMZW5ndGg6IHRlc3RTZXRTaXplUGVyV29ya2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2RcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5vbm1lc3NhZ2UgPSAoeyBkYXRhOiB7IGVycm9yLCBkaXN0YW5jZSB9IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoeyBkaXN0YW5jZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbCh0UHJvbWlzZXMpO1xuICAgICAgICAgICAgY29uc3QgZnVsbFNpemUgPSByZXN1bHRzLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbC5kaXN0YW5jZS5sZW5ndGgsIDApO1xuICAgICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxTaXplKTtcbiAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXMgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlLnNldChyZXMuZGlzdGFuY2UsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHJlcy5kaXN0YW5jZS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0YW5jZS5zb3J0KCk7XG4gICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnM/LmZvckVhY2goKHcpID0+IHc/LnRlcm1pbmF0ZSgpKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheSgxKS5maWxsKDAuNSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZ2V0TWluaW1hbFRocmVzaG9sZCh2YWx1ZXMsIGZuTmFtZXMsIG9wdHMgPSBbXSwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgICAgLy9XZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgbWluaW1hbCB0aHJlc2hvbGQgZmlyc3QsXG4gICAgICAgIC8vaW4gb3JkZXIgdG8gZ2V0IG1hdHJpeCBzdWNoIHRoYXQgaXQgZG9lcyBub3QgZXhjZWVkIHRoZSBtYXhpbXVtIHNpemUgb2YgMUdCXG4gICAgICAgIC8vd2UgaGF2ZSAzIHJldHVybiBhcnJheXMsIGVhY2ggNCBiaXRlcyBwZXIgZWxlbWVudCwgc28gaWYgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbWF0cml4IGlzIDFHQixcbiAgICAgICAgY29uc3QgbWF4U3BhcnNlTWF0cml4U2l6ZSA9IDcwMDAwMDAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gYXdhaXQgdGhpcy5nZXRTYW1wbGVEaXN0YW5jZXModmFsdWVzLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCk7XG4gICAgICAgICAgICBjb25zdCBmcmFjdGlvbkluZGV4ID0gTWF0aC5mbG9vcihtYXhTcGFyc2VNYXRyaXhTaXplIC8gbWF0U2l6ZSAqIGRpc3RhbmNlLmxlbmd0aCk7XG4gICAgICAgICAgICBjb25zdCB0aHJlc2hvbGQgPSAxIC0gZGlzdGFuY2VbZnJhY3Rpb25JbmRleF07XG4gICAgICAgICAgICAvLyB0aHJlc2hvbGQgPSBNYXRoLm1heCh0aHJlc2hvbGQsIDAuMyk7XG4gICAgICAgICAgICByZXR1cm4gdGhyZXNob2xkO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgcmV0dXJuIDAuNTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY2FsY1N5bmModmFsdWVzLCBmbk5hbWUsIGRpc3RhbmNlRm4sIHRocmVzaG9sZCkge1xuICAgICAgICBjb25zdCBpID0gW107XG4gICAgICAgIGNvbnN0IGogPSBbXTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VzID0gW107XG4gICAgICAgIGxldCBjbnQgPSAwO1xuICAgICAgICBsZXQgbWkgPSAwO1xuICAgICAgICBsZXQgbWogPSAwO1xuICAgICAgICBjb25zdCBmdWxsU2l6ZSA9IHZhbHVlcy5sZW5ndGggKiAodmFsdWVzLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgd2hpbGUgKGNudCA8IGZ1bGxTaXplKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHZhbHVlID0gc2VxMUxpc3RbbWldICYmIHNlcTFMaXN0W21qXSA/IGhhbW1pbmcoc2VxMUxpc3RbbWldLCBzZXExTGlzdFttal0pIDogMDtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gIWlzTmlsKHZhbHVlc1ttaV0pICYmICFpc05pbCh2YWx1ZXNbbWpdKSA/XG4gICAgICAgICAgICAgICAgZGlzdGFuY2VGbih2YWx1ZXNbbWldLCB2YWx1ZXNbbWpdKSA6IDE7XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gMSAtIHZhbHVlO1xuICAgICAgICAgICAgaWYgKHNpbWlsYXJpdHkgPj0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgaS5wdXNoKG1pKTtcbiAgICAgICAgICAgICAgICBqLnB1c2gobWopO1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNudCsrO1xuICAgICAgICAgICAgbWorKztcbiAgICAgICAgICAgIGlmIChtaiA9PT0gdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1pKys7XG4gICAgICAgICAgICAgICAgbWogPSBtaSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaUFycmF5ID0gbmV3IEludDMyQXJyYXkoaSk7XG4gICAgICAgIGNvbnN0IGpBcnJheSA9IG5ldyBJbnQzMkFycmF5KGopO1xuICAgICAgICBjb25zdCBkaXN0YW5jZUFycmF5ID0gbmV3IEZsb2F0MzJBcnJheShkaXN0YW5jZXMpO1xuICAgICAgICByZXR1cm4geyBpOiBpQXJyYXksIGo6IGpBcnJheSwgZGlzdGFuY2U6IGRpc3RhbmNlQXJyYXkgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2ljM0JoY25ObExXMWhkSEpwZUMxelpYSjJhV05sTG1weklpd2ljMjkxY21ObFVtOXZkQ0k2SWlJc0luTnZkWEpqWlhNaU9sc2ljM0JoY25ObExXMWhkSEpwZUMxelpYSjJhV05sTG5SeklsMHNJbTVoYldWeklqcGJYU3dpYldGd2NHbHVaM01pT2lKQlFVTkJMRTlCUVU4c1JVRkJORUlzTUVKQlFUQkNMRVZCUVVNc1RVRkJUU3hUUVVGVExFTkJRVU03UVVGRE9VVXNUMEZCVHl4RlFVRkRMR0ZCUVdFc1JVRkJSU3hMUVVGTExFVkJRVU1zVFVGQlRTeFRRVUZUTEVOQlFVTTdRVUZoTjBNc1RVRkJUU3hQUVVGUExHMUNRVUZ0UWp0SlFVVTFRanRSUVVORkxFbEJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhUUVVGVExFTkJRVU1zYlVKQlFXMUNMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzSkZMRU5CUVVNN1NVRkZUU3hMUVVGTExFTkJRVU1zWlVGQlpTeERRVUZETEUxQlFXOUNMRVZCUVVVc1QwRkJkVUlzUlVGRGVFVXNVMEZCYVVJc1JVRkJSU3hQUVVFMlFpeERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRlZCUVc5Q0xFTkJRVU1zUTBGQlF5eERRVUZETEVWQlF6ZEZMRzlDUVVFclF5d3dRa0ZCTUVJc1EwRkJReXhUUVVGVE8xRkJSVzVHTEUxQlFVMHNUMEZCVHl4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNNVJDeE5RVUZOTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFOUJRVThzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkZNVVFzVFVGQlRTeFpRVUZaTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eExRVUZOTEVOQlFVTXNRMEZCUXp0WlFVTTVReXhOUVVGTkxFbEJRVWtzUTBGQlF5eHRRa0ZCYlVJc1EwRkJReXhOUVVGTkxFVkJRVVVzVDBGQlR5eEZRVUZGTEVsQlFVa3NSVUZCUlN4UFFVRlBMRVZCUVVVc2FVSkJRV2xDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM2hHTEVsQlFVa3NVMEZCVXl4SFFVRkhMRmxCUVZrc1JVRkJSU3hEUVVGRE8xbEJRemRDTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc2JVSkJRVzFDTEZsQlFWa3NSVUZCUlN4RFFVRkRMRU5CUVVNN1dVRkRMME1zVTBGQlV5eEhRVUZITEZsQlFWa3NRMEZCUXp0UlFVTXpRaXhEUVVGRE8xRkJRMFFzU1VGQlNTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhYUVVGWExFTkJRVU1zUjBGQlJ5eFRRVUZUTEVOQlFVTXNRMEZCUXp0UlFVTjZSQ3hOUVVGTkxGRkJRVkVzUjBGRFdpeEpRVUZKTEV0QlFVc3NRMEZCT0VJc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFGQlJUVkVMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNN1lVRkRla01zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRWRCUVVjc1EwRkJReXgzUWtGQmQwSXNSVUZCUlN4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjRSaXhMUVVGTExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSVUZCUlN4SFFVRkhMRWRCUVVjc1NVRkJTU3hEUVVGRExGbEJRVmtzUlVGQlJTeEhRVUZITEVWQlFVVXNSVUZCUlN4RFFVRkRPMWxCUTJwRUxGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExHRkJRV0VzUlVGQlJTeFpRVUZaTEVWQlFVVXNSVUZCUlR0blFrRkRNVVFzVFVGQlRTeFJRVUZSTEVkQlFVY3NSMEZCUnl4SFFVRkhMRk5CUVZNc1EwRkJRenRuUWtGRGFrTXNUVUZCVFN4TlFVRk5MRWRCUVVjc1IwRkJSeXhMUVVGTExFbEJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExGTkJRVk1zUTBGQlF6dG5Ra0ZETDBVc1NVRkJTU3hOUVVGTkxFbEJRVWtzVVVGQlVUdHZRa0ZEY0VJc1lVRkJZU3hEUVVGRExFVkJRVU1zUTBGQlF5eEZRVUZGTEVsQlFVa3NWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEpRVUZKTEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hSUVVGUkxFVkJRVVVzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1IwRkJSeXhGUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVjc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4RlFVRkRMRTFCUVUwc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeEZRVUZGTEZOQlFWTXNSVUZCUlN4UFFVRlBMRVZCUVVVc1NVRkJTU3hGUVVGRkxFOUJRVThzUlVGQlJTeHBRa0ZCYVVJc1JVRkJReXhEUVVGRExFTkJRVU03WjBKQlF6TkhMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFRRVUZUTEVkQlFVY3NRMEZCUXl4RlFVRkRMRWxCUVVrc1JVRkJSU3hGUVVGRExFdEJRVXNzUlVGQlJTeERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRkZCUVZFc1JVRkJReXhGUVVGRExFVkJRVkVzUlVGQlJUdHZRa0ZEYWtVc1NVRkJTU3hMUVVGTExFVkJRVVVzUTBGQlF6dDNRa0ZEVml4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdkMEpCUTNwQ0xGbEJRVmtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0dlFrRkRkRUlzUTBGQlF6dDVRa0ZCVFN4RFFVRkRPM2RDUVVOT0xFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4VFFVRlRMRVZCUVVVc1EwRkJRenQzUWtGRGVrSXNZVUZCWVN4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeFJRVUZSTEVWQlFVVXNSMEZCUnl4RlFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRGRrTXNRMEZCUXp0blFrRkRTQ3hEUVVGRExFTkJRVU03V1VGRFNpeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTk1MRU5CUVVNN1VVRkZSQ3hOUVVGTkxFOUJRVThzUjBGQlJ5eE5RVUZOTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03VVVGRE5VTXNUVUZCVFN4UlFVRlJMRWRCUVVjc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU55UlN4TlFVRk5MRU5CUVVNc1IwRkJSeXhKUVVGSkxGVkJRVlVzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0UlFVTnVReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eEpRVUZKTEZWQlFWVXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRSUVVOdVF5eE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRmxCUVZrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dFJRVU0xUXl4SlFVRkpMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRFppeHpRa0ZCYzBJN1VVRkRkRUlzUzBGQlN5eE5RVUZOTEVkQlFVY3NTVUZCU1N4UFFVRlBMRVZCUVVVc1EwRkJRenRaUVVNeFFpeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTTdXVUZEY2tJc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RlFVRkZMRTFCUVUwc1EwRkJReXhEUVVGRE8xbEJRM0pDTEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXp0WlFVTnVReXhOUVVGTkxFbEJRVWtzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNN1VVRkRla0lzUTBGQlF6dFJRVU5FTEU5QlFVOHNSVUZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxGRkJRVkVzUlVGQlF5eERRVUZETzBsQlF6RkNMRU5CUVVNN1NVRkZUU3hMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZKTEUxQlFXZENMRVZCUVVVc1RVRkJiMElzUlVGQlJTeFRRVUZwUWl4RlFVRkZMRTlCUVRKQ0xFVkJRVVU3VVVGRE0wY3NjVUpCUVhGQ08xRkJRM0pDTEU5QlFVOHNUVUZCVFN4SlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hUUVVGVExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRGFFWXNRMEZCUXp0SlFVVk5MRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRMnBDTEUxQlFXdENMRVZCUVVVc1RVRkJiMElzUlVGQlJTeGpRVUZ6UWl4RlFVRkZMRVZCUVVVc1QwRkJNa0lzUlVGQlJUdFJRVVZxUnl4UFFVRlBMRTFCUVUwc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFVkJRVVVzVjBGQlZ5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEycEdMRU5CUVVNN1NVRkZUU3hMUVVGTExFTkJRVU1zWlVGQlpTeERRVU14UWl4TlFVRnJRaXhGUVVGRkxFMUJRVzlDTEVWQlFVVXNXVUZCYjBJc1IwRkJSeXhGUVVGRkxFOUJRVEpDTEVWQlFVVTdVVUZGYUVjc1QwRkJUeXhOUVVGTkxFbEJRVWtzUTBGQlF5eDFRa0ZCZFVJc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1UwRkJVeXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM2hHTEVOQlFVTTdTVUZGVFN4TFFVRkxMRU5CUVVNc2RVSkJRWFZDTEVOQlFVTXNUVUZCZVVJc1JVRkJSU3hQUVVGMVFpeEZRVUZGTEZsQlFXOUNMRWRCUVVjc1JVRkRPVWNzU1VGQk1FSXNSVUZCUlN4UFFVRnBRaXhGUVVNM1F5eHZRa0ZCSzBNc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0UlFVVnVSaXhKUVVGSkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJTU3hOUVVGTkxFTkJRVU1zVFVGQlRTeExRVUZMTEVsQlFVa3NRMEZCUXl4TlFVRk5MRWxCUVVrc1RVRkJUU3hEUVVGRExFMUJRVTBzUzBGQlN5eFBRVUZQTEVOQlFVTXNUVUZCVFR0WlFVTjJSeXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEc5R1FVRnZSaXhEUVVGRExFTkJRVU03VVVGRmVFY3NTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hMUVVGTExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNN1dVRkRia1FzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl3clEwRkJLME1zUTBGQlF5eERRVUZETzFGQlJXNUZMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU01UkN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE1VUXNUVUZCVFN4UlFVRlJMRWRCUTFvc1NVRkJTU3hMUVVGTExFTkJRWEZDTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenRSUVVOdVJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETzJGQlEzcERMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNkMEpCUVhkQ0xFVkJRVVVzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGVFWXNTMEZCU3l4SlFVRkpMRWRCUVVjc1IwRkJSeXhEUVVGRExFVkJRVVVzUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4WlFVRlpMRVZCUVVVc1IwRkJSeXhGUVVGRkxFVkJRVVVzUTBGQlF6dFpRVU5xUkN4UlFVRlJMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeFBRVUZQTEVOQlFVTXNRMEZCUXl4aFFVRmhMRVZCUVVVc1dVRkJXU3hGUVVGRkxFVkJRVVU3WjBKQlF6RkVMRTFCUVUwc1VVRkJVU3hIUVVGSExFZEJRVWNzUjBGQlJ5eFRRVUZUTEVOQlFVTTdaMEpCUTJwRExFMUJRVTBzVFVGQlRTeEhRVUZITEVkQlFVY3NTMEZCU3l4SlFVRkpMRU5CUVVNc1dVRkJXU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4VFFVRlRMRU5CUVVNN1owSkJReTlGTEVsQlFVa3NUVUZCVFN4SlFVRkpMRkZCUVZFN2IwSkJRM0JDTEdGQlFXRXNRMEZCUXl4RlFVRkRMRmxCUVZrc1JVRkJSU3hKUVVGSkxFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4VlFVRlZMRVZCUVVVc1NVRkJTU3hMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVONFJTeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1YwRkJWeXhEUVVGRExFVkJRVU1zVFVGQlRTeEZRVUZGTEZGQlFWRXNSVUZCUlN4TlFVRk5MRVZCUVVVc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRNMGNzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRk5CUVZNc1IwRkJSeXhEUVVGRExFVkJRVU1zU1VGQlNTeEZRVUZGTEVWQlFVTXNTMEZCU3l4RlFVRkZMRmxCUVZrc1JVRkJSU3hWUVVGVkxFVkJRVU1zUlVGQlF5eEZRVUZSTEVWQlFVVTdiMEpCUXpORkxFbEJRVWtzUzBGQlN5eEZRVUZGTEVOQlFVTTdkMEpCUTFZc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRPM2RDUVVONlFpeFpRVUZaTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN2IwSkJRM1JDTEVOQlFVTTdlVUpCUVUwc1EwRkJRenQzUWtGRFRpeFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1UwRkJVeXhGUVVGRkxFTkJRVU03ZDBKQlEzcENMR0ZCUVdFc1EwRkJReXhGUVVGRExGbEJRVmtzUlVGQlJTeFZRVUZWTEVWQlFVTXNRMEZCUXl4RFFVRkRPMjlDUVVNMVF5eERRVUZETzJkQ1FVTklMRU5CUVVNc1EwRkJRenRaUVVOS0xFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEwd3NRMEZCUXp0UlFVVkVMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRSUVVNMVF5eE5RVUZOTEZGQlFWRXNSMEZCUnl4SlFVRkpMRlZCUVZVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1VVRkRiRVFzUzBGQlN5eE5RVUZOTEVkQlFVY3NTVUZCU1N4UFFVRlBMRVZCUVVVc1EwRkJRenRaUVVNeFFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU03WjBKQlEzWkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFMUJRVTBzU1VGQlNTeERRVUZETEVOQlFVTTdVVUZEYkVRc1EwRkJRenRSUVVORUxFMUJRVTBzVFVGQlRTeEhRVUZqTzFsQlEzaENMRmxCUVZrc1JVRkJSU3hKUVVGSkxFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1MwRkJTeXhEUVVGVExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJ4SExGVkJRVlVzUlVGQlJTeEpRVUZKTEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExFbEJRVWtzUzBGQlN5eERRVUZUTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xTkJRVU1zUTBGQlF6dFJRVU53Unl4TFFVRkxMRTFCUVUwc1IwRkJSeXhKUVVGSkxFOUJRVThzUlVGQlJTeERRVUZETzFsQlF6RkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEZRVUZGTEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNN1owSkJRekZETEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFMUJRVTBzU1VGQlNTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJRenR2UWtGRE1VUXNUVUZCVFN4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZEYWtVc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0dlFrRkROMFFzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJRenRuUWtGRGJrSXNRMEZCUXp0WlFVTklMRU5CUVVNN1VVRkRTQ3hEUVVGRE8xRkJRMFFzVDBGQlR5eE5RVUZOTEVOQlFVTTdTVUZEYUVJc1EwRkJRenRKUVVWTkxFdEJRVXNzUTBGQlF5eGpRVUZqTEVOQlFVTXNUVUZCZVVJc1JVRkJSU3hQUVVGMVFpeEZRVUZGTEdOQlFYTkNMRVZCUVVVc1JVRkRkRWNzU1VGQk1FSXNSVUZCUlN4UFFVRnBRaXhGUVVNM1F5eHZRa0ZCSzBNc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0UlFVVnVSaXhKUVVGSkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJTU3hOUVVGTkxFTkJRVU1zVFVGQlRTeExRVUZMTEVsQlFVa3NRMEZCUXl4TlFVRk5MRWxCUVVrc1RVRkJUU3hEUVVGRExFMUJRVTBzUzBGQlN5eFBRVUZQTEVOQlFVTXNUVUZCVFR0WlFVTjJSeXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEc5R1FVRnZSaXhEUVVGRExFTkJRVU03VVVGRmVFY3NTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hMUVVGTExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNN1dVRkRia1FzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl3clEwRkJLME1zUTBGQlF5eERRVUZETzFGQlJXNUZMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU01UkN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE1VUXNUVUZCVFN4UlFVRlJMRWRCUTFvc1NVRkJTU3hMUVVGTExFTkJRWEZDTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenRSUVVOdVJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETzJGQlEzcERMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNZMEZCWXl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXpsRkxFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZMRU5CUVVNN1dVRkRha1FzVVVGQlVTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRWxCUVVrc1QwRkJUeXhEUVVGRExFTkJRVU1zWVVGQllTeEZRVUZGTEZsQlFWa3NSVUZCUlN4RlFVRkZPMmRDUVVNeFJDeE5RVUZOTEZGQlFWRXNSMEZCUnl4SFFVRkhMRWRCUVVjc1UwRkJVeXhEUVVGRE8yZENRVU5xUXl4TlFVRk5MRTFCUVUwc1IwRkJSeXhIUVVGSExFdEJRVXNzU1VGQlNTeERRVUZETEZsQlFWa3NSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVWNzVTBGQlV5eERRVUZETzJkQ1FVTXZSU3hKUVVGSkxFMUJRVTBzU1VGQlNTeFJRVUZSTzI5Q1FVTndRaXhoUVVGaExFTkJRVU1zUlVGQlF5eFpRVUZaTEVWQlFVVXNTVUZCU1N4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzVlVGQlZTeEZRVUZGTEVsQlFVa3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEZUVVc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4RlFVRkRMRTFCUVUwc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeEZRVUZGTEU5QlFVOHNSVUZCUlN4SlFVRkpMRVZCUVVVc1YwRkJWeXhGUVVGRkxFOUJRVThzUlVGQlJTeHBRa0ZCYVVJc1JVRkJReXhEUVVGRExFTkJRVU03WjBKQlF6ZEhMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFRRVUZUTEVkQlFVY3NRMEZCUXl4RlFVRkRMRWxCUVVrc1JVRkJSU3hGUVVGRExFdEJRVXNzUlVGQlJTeFpRVUZaTEVWQlFVVXNWVUZCVlN4RlFVRkRMRVZCUVVNc1JVRkJVU3hGUVVGRk8yOUNRVU16UlN4SlFVRkpMRXRCUVVzc1JVRkJSU3hEUVVGRE8zZENRVU5XTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dDNRa0ZEZWtJc1dVRkJXU3hEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzI5Q1FVTjBRaXhEUVVGRE8zbENRVUZOTEVOQlFVTTdkMEpCUTA0c1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRPM2RDUVVONlFpeGhRVUZoTEVOQlFVTXNSVUZCUXl4WlFVRlpMRVZCUVVVc1ZVRkJWU3hGUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZETlVNc1EwRkJRenRuUWtGRFNDeERRVUZETEVOQlFVTTdXVUZEU2l4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOTUxFTkJRVU03VVVGRlJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4TlFVRk5MRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZETlVNc1RVRkJUU3hOUVVGTkxFZEJRV003V1VGRGVFSXNXVUZCV1N4RlFVRkZMRWxCUVVrc1MwRkJTeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRExFbEJRVWtzUzBGQlN5eERRVUZUTEZkQlFWY3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF6dFpRVU14Unl4VlFVRlZMRVZCUVVVc1NVRkJTU3hMUVVGTExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU1zU1VGQlNTeExRVUZMTEVOQlFWTXNWMEZCVnl4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVMEZCUXl4RFFVRkRPMUZCUTNwSExFdEJRVXNzVFVGQlRTeEhRVUZITEVsQlFVa3NUMEZCVHl4RlFVRkZMRU5CUVVNN1dVRkRNVUlzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1JVRkJSU3hEUVVGRExFVkJRVVVzUTBGQlF6dG5Ra0ZETVVNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU03YjBKQlEzWkVMR0ZCUVdFc1EwRkJReXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRTFCUVUwc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4SFFVRkhMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRPVWNzUTBGQlF6dFJRVU5JTEVOQlFVTTdVVUZEUkN4UFFVRlBMRTFCUVUwc1EwRkJRenRKUVVOb1FpeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMR3RDUVVGclFpeERRVUZETEUxQlFXOUNMRVZCUTJ4RUxFOUJRWFZDTEVWQlFVVXNUMEZCTmtJc1JVRkJSU3hGUVVGRkxFOUJRV2xDTEVWQlF6TkZMRzlDUVVFclF5d3dRa0ZCTUVJc1EwRkJReXhUUVVGVE8xRkJRMjVHTEUxQlFVMHNaMEpCUVdkQ0xFZEJRVWNzU1VGQlNTeExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTTdZVUZETjBRc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1IwRkJSeXhEUVVGRExHdERRVUZyUXl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUlhaR0xFbEJRVWtzUTBGQlF6dFpRVU5JTEUxQlFVMHNUMEZCVHl4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRaUVVNNVJDeE5RVUZOTEZOQlFWTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFOUJRVThzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1dVRkRNVVFzVFVGQlRTeGhRVUZoTEVkQlFVY3NUMEZCVXl4RFFVRkRPMWxCUTJoRExFMUJRVTBzVlVGQlZTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFBRVUZQTEVkQlFVY3NTVUZCU1N4RlFVRkZMR0ZCUVdFc1EwRkJReXhGUVVGRkxFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNUMEZCVHl4RlFVRkZMR0ZCUVdFc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGRrY3NUVUZCVFN4dlFrRkJiMElzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRlZCUVZVc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdXVUZEZUVVc1RVRkJUU3hUUVVGVExFZEJRVWNzU1VGQlNTeExRVUZMTEVOQlFXOURMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dFpRVVZzUml4TFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NTVUZCU1N4RFFVRkRMRmxCUVZrc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETzJkQ1FVTnFSQ3hUUVVGVExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4UFFVRlBMRU5CUVVNc1EwRkJReXhoUVVGaExFVkJRVVVzV1VGQldTeEZRVUZGTEVWQlFVVTdiMEpCUXpORUxFMUJRVTBzVVVGQlVTeEhRVUZITEVkQlFVY3NSMEZCUnl4VFFVRlRMRU5CUVVNN2IwSkJRMnBETEUxQlFVMHNUVUZCVFN4SFFVRkhMRWRCUVVjc1MwRkJTeXhKUVVGSkxFTkJRVU1zV1VGQldTeEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1IwRkJSeXhUUVVGVExFTkJRVU03YjBKQlF5OUZMR2RDUVVGblFpeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJRenQzUWtGRGFFTXNUVUZCVFN4RlFVRkZMRTFCUVUwc1JVRkJSU3hSUVVGUkxFVkJRVVVzVFVGQlRTeEZRVUZGTEZsQlFWa3NSVUZCUlN4dlFrRkJiMEk3ZDBKQlEzQkZMRTlCUVU4c1JVRkJSU3hKUVVGSkxFVkJRVVVzVDBGQlR5eEZRVUZGTEdsQ1FVRnBRanR4UWtGRE1VTXNRMEZCUXl4RFFVRkRPMjlDUVVOSUxHZENRVUZuUWl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExGTkJRVk1zUjBGQlJ5eERRVUZETEVWQlFVTXNTVUZCU1N4RlFVRkZMRVZCUVVNc1MwRkJTeXhGUVVGRkxGRkJRVkVzUlVGQlF5eEZRVUZETEVWQlFWRXNSVUZCUlR0M1FrRkRjRVVzWjBKQlFXZENMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVTBGQlV5eEZRVUZGTEVOQlFVTTdkMEpCUTJ4RExFbEJRVWtzUzBGQlN6czBRa0ZCUlN4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03T3pSQ1FVTTNRaXhoUVVGaExFTkJRVU1zUlVGQlF5eFJRVUZSTEVWQlFVTXNRMEZCUXl4RFFVRkRPMjlDUVVNNVFpeERRVUZETEVOQlFVTTdaMEpCUTBvc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRFRDeERRVUZETzFsQlJVUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1RVRkJUU3hQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEZOQlFWTXNRMEZCUXl4RFFVRkRPMWxCUXpkRExFMUJRVTBzVVVGQlVTeEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUjBGQlJ5eEZRVUZGTEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1IwRkJSeXhEUVVGRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkROVVVzVFVGQlRTeFJRVUZSTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU03V1VGRE5VTXNTVUZCU1N4TlFVRk5MRWRCUVVjc1EwRkJReXhEUVVGRE8xbEJRMllzUzBGQlN5eE5RVUZOTEVkQlFVY3NTVUZCU1N4UFFVRlBMRVZCUVVVc1EwRkJRenRuUWtGRE1VSXNVVUZCVVN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zVVVGQlVTeEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRPMmRDUVVOdVF5eE5RVUZOTEVsQlFVa3NSMEZCUnl4RFFVRkRMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU03V1VGRGFFTXNRMEZCUXp0WlFVTkVMRkZCUVZFc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF6dFpRVVZvUWl4UFFVRlBMRkZCUVZFc1EwRkJRenRSUVVOc1FpeERRVUZETzFGQlFVTXNUMEZCVHl4RFFVRkRMRVZCUVVVc1EwRkJRenRaUVVOWUxHZENRVUZuUWl4RlFVRkZMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4RlFVRkZMRk5CUVZNc1JVRkJSU3hEUVVGRExFTkJRVU03V1VGRGFrUXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU5xUWl4UFFVRlBMRWxCUVVrc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOMlF5eERRVUZETzBsQlEwZ3NRMEZCUXp0SlFVVlBMRXRCUVVzc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4TlFVRnZRaXhGUVVOd1JDeFBRVUYxUWl4RlFVRkZMRTlCUVRaQ0xFVkJRVVVzUlVGQlJTeFBRVUZwUWl4RlFVTXpSU3h2UWtGQkswTXNNRUpCUVRCQ0xFTkJRVU1zVTBGQlV6dFJRVU51Uml4dFJFRkJiVVE3VVVGRGJrUXNOa1ZCUVRaRk8xRkJRemRGTEdsSFFVRnBSenRSUVVOcVJ5eE5RVUZOTEcxQ1FVRnRRaXhIUVVGSExGRkJRVlVzUTBGQlF6dFJRVU4yUXl4SlFVRkpMRU5CUVVNN1dVRkRTQ3hOUVVGTkxFOUJRVThzUjBGQlJ5eE5RVUZOTEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRlRVFzVFVGQlRTeFJRVUZSTEVkQlFVY3NUVUZCVFN4SlFVRkpMRU5CUVVNc2EwSkJRV3RDTEVOQlFVTXNUVUZCVFN4RlFVRkZMRTlCUVU4c1JVRkJSU3hKUVVGSkxFVkJRVVVzVDBGQlR5eEZRVUZGTEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03V1VGRGJFY3NUVUZCVFN4aFFVRmhMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eHRRa0ZCYlVJc1IwRkJSeXhQUVVGUExFZEJRVWNzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMWxCUTJ4R0xFMUJRVTBzVTBGQlV5eEhRVUZITEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03V1VGRE9VTXNkME5CUVhkRE8xbEJRM2hETEU5QlFVOHNVMEZCVXl4RFFVRkRPMUZCUTI1Q0xFTkJRVU03VVVGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPMWxCUTFnc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTnFRaXhQUVVGUExFZEJRVWNzUTBGQlF6dFJRVU5pTEVOQlFVTTdTVUZEU0N4RFFVRkRPMGxCUlUwc1RVRkJUU3hEUVVGRExGRkJRVkVzUTBGRGNFSXNUVUZCSzBJc1JVRkJSU3hOUVVGdlFpeEZRVUZGTEZWQlFXOUNMRVZCUVVVc1UwRkJhVUk3VVVGRk9VWXNUVUZCVFN4RFFVRkRMRWRCUVdFc1JVRkJSU3hEUVVGRE8xRkJRM1pDTEUxQlFVMHNRMEZCUXl4SFFVRmhMRVZCUVVVc1EwRkJRenRSUVVOMlFpeE5RVUZOTEZOQlFWTXNSMEZCWVN4RlFVRkZMRU5CUVVNN1VVRkRMMElzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTFvc1NVRkJTU3hGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzFGQlExZ3NTVUZCU1N4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRMWdzVFVGQlRTeFJRVUZSTEVkQlFVY3NUVUZCVFN4RFFVRkRMRTFCUVUwc1IwRkJSeXhEUVVGRExFMUJRVTBzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM3BFTEU5QlFVOHNSMEZCUnl4SFFVRkhMRkZCUVZFc1JVRkJSU3hEUVVGRE8xbEJRM1JDTEhWR1FVRjFSanRaUVVOMlJpeE5RVUZOTEV0QlFVc3NSMEZCUnl4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOMFJDeFZRVUZWTEVOQlFVTXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFMUJRVTBzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03V1VGRGVrTXNUVUZCVFN4VlFVRlZMRWRCUVVjc1EwRkJReXhIUVVGSExFdEJRVXNzUTBGQlF6dFpRVU0zUWl4SlFVRkpMRlZCUVZVc1NVRkJTU3hUUVVGVExFVkJRVVVzUTBGQlF6dG5Ra0ZETlVJc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXp0blFrRkRXQ3hEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRPMmRDUVVOWUxGTkJRVk1zUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRlRUlzUTBGQlF6dFpRVU5FTEVkQlFVY3NSVUZCUlN4RFFVRkRPMWxCUTA0c1JVRkJSU3hGUVVGRkxFTkJRVU03V1VGRFRDeEpRVUZKTEVWQlFVVXNTMEZCU3l4TlFVRk5MRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU03WjBKQlEzcENMRVZCUVVVc1JVRkJSU3hEUVVGRE8yZENRVU5NTEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1EwRkJReXhEUVVGRE8xbEJRMlFzUTBGQlF6dFJRVU5JTEVOQlFVTTdVVUZGUkN4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTnFReXhOUVVGTkxFMUJRVTBzUjBGQlJ5eEpRVUZKTEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOcVF5eE5RVUZOTEdGQlFXRXNSMEZCUnl4SlFVRkpMRmxCUVZrc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFJRVVZzUkN4UFFVRlBMRVZCUVVNc1EwRkJReXhGUVVGRkxFMUJRVTBzUlVGQlJTeERRVUZETEVWQlFVVXNUVUZCVFN4RlFVRkZMRkZCUVZFc1JVRkJSU3hoUVVGaExFVkJRVU1zUTBGQlF6dEpRVU42UkN4RFFVRkRPME5CUTBvaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UwdHViM2R1VFdWMGNtbGpjMzBnWm5KdmJTQW5MaTR2ZEhsd1pXUXRiV1YwY21samN5YzdYRzVwYlhCdmNuUWdlMFJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUXNJRVJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUnpmU0JtY205dElDY3VMM1I1Y0dWekp6dGNibWx0Y0c5eWRDQjdhVzV6WlhKMFUyMWhiR3hsY2l3Z2FYTk9hV3g5SUdaeWIyMGdKeTR2ZFhScGJITW5PMXh1WEc1bGVIQnZjblFnZEhsd1pTQlRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUWdQU0I3WEc0Z0lHazZJRWx1ZERNeVFYSnlZWGtnZkNCVmFXNTBNekpCY25KaGVTeGNiaUFnYWpvZ1NXNTBNekpCY25KaGVTQjhJRlZwYm5Rek1rRnljbUY1TEZ4dUlDQmthWE4wWVc1alpUb2dSbXh2WVhRek1rRnljbUY1TEZ4dUlDQnBaSGcvT2lCdWRXMWlaWEpjYm4wN1hHNWNibVY0Y0c5eWRDQjBlWEJsSUV0dWJsSmxjM1ZzZENBOUlIdGNiaUFnYTI1dVJHbHpkR0Z1WTJWek9pQnVkVzFpWlhKYlhWdGRMRnh1SUNCcmJtNUpibVJsZUdWek9pQnVkVzFpWlhKYlhWdGRYRzU5WEc1bGVIQnZjblFnWTJ4aGMzTWdVM0JoY25ObFRXRjBjbWw0VTJWeWRtbGpaU0I3WEc0Z0lDQWdjSEpwZG1GMFpTQmZkMjl5YTJWeVEyOTFiblE2SUc1MWJXSmxjanRjYmlBZ0lDQmpiMjV6ZEhKMVkzUnZjaWdwSUh0Y2JpQWdJQ0FnSUhSb2FYTXVYM2R2Y210bGNrTnZkVzUwSUQwZ1RXRjBhQzV0WVhnb2JtRjJhV2RoZEc5eUxtaGhjbVIzWVhKbFEyOXVZM1Z5Y21WdVkza2dMU0F5TENBeEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCd2RXSnNhV01nWVhONWJtTWdZMkZzWTAxMWJIUnBRMjlzZFcxdUtIWmhiSFZsY3pvZ1FYSnlZWGs4WVc1NVcxMCtMQ0JtYms1aGJXVnpPaUJMYm05M2JrMWxkSEpwWTNOYlhTeGNiaUFnSUNBZ0lIUm9jbVZ6YUc5c1pEb2diblZ0WW1WeUxDQnZjSFJ6T2lCN1cxODZJSE4wY21sdVoxMDZJR0Z1ZVgxYlhTQTlJRnQ3ZlYwc0lIZGxhV2RvZEhNNklHNTFiV0psY2x0ZElEMGdXekZkTEZ4dUlDQWdJQ0FnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlE2SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFnUFNCRWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrY3k1RlZVTk1TVVJGUVU1Y2JpQWdJQ0FwSUh0Y2JpQWdJQ0FnSUdOdmJuTjBJRzFoZEZOcGVtVWdQU0IyWVd4MVpYTmJNRjB1YkdWdVozUm9JQ29nS0haaGJIVmxjMXN3WFM1c1pXNW5kR2dnTFNBeEtTQXZJREk3WEc0Z0lDQWdJQ0JqYjI1emRDQmphSFZ1YTFOcGVtVWdQU0JOWVhSb0xtWnNiMjl5S0cxaGRGTnBlbVVnTHlCMGFHbHpMbDkzYjNKclpYSkRiM1Z1ZENrN1hHNWNiaUFnSUNBZ0lHTnZibk4wSUcxcGJsUm9jbVZ6YUc5c1pDQTlJSFpoYkhWbGMxc3dYUzVzWlc1bmRHZ2dQaUF5TUY4d01EQWdQMXh1SUNBZ0lDQWdJQ0JoZDJGcGRDQjBhR2x6TG1kbGRFMXBibWx0WVd4VWFISmxjMmh2YkdRb2RtRnNkV1Z6TENCbWJrNWhiV1Z6TENCdmNIUnpMQ0IzWldsbmFIUnpMQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ2tnT2lBd08xeHVJQ0FnSUNBZ2FXWWdLSFJvY21WemFHOXNaQ0E4SUcxcGJsUm9jbVZ6YUc5c1pDa2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emIyeGxMbXh2WnloZ2RYTnBibWNnZEdoeVpYTm9iMnhrSUNSN2JXbHVWR2h5WlhOb2IyeGtmV0FwTzF4dUlDQWdJQ0FnSUNCMGFISmxjMmh2YkdRZ1BTQnRhVzVVYUhKbGMyaHZiR1E3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J2Y0hSekxtWnZja1ZoWTJnb0tGOHNJR2twSUQwK0lHOXdkSE5iYVYxYkozUm9jbVZ6YUc5c1pDZGRJRDBnZEdoeVpYTm9iMnhrS1R0Y2JpQWdJQ0FnSUdOdmJuTjBJSEJ5YjIxcGMyVnpJRDFjYmlBZ0lDQWdJQ0FnYm1WM0lFRnljbUY1UEZCeWIyMXBjMlU4VTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwUGo0b2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RcE8xeHVYRzRnSUNBZ0lDQmpiMjV6ZENCM2IzSnJaWEp6SUQwZ2JtVjNJRUZ5Y21GNUtIUm9hWE11WDNkdmNtdGxja052ZFc1MEtWeHVJQ0FnSUNBZ0lDQXVabWxzYkNodWRXeHNLUzV0WVhBb0tDa2dQVDRnYm1WM0lGZHZjbXRsY2lodVpYY2dWVkpNS0NjdUwzTndZWEp6WlMxdFlYUnlhWGd0ZDI5eWEyVnlKeXdnYVcxd2IzSjBMbTFsZEdFdWRYSnNLU2twTzF4dUlDQWdJQ0FnWm05eUlDaHNaWFFnYVdSNElEMGdNRHNnYVdSNElEd2dkR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUTdJR2xrZUNzcktTQjdYRzRnSUNBZ0lDQWdJSEJ5YjIxcGMyVnpXMmxrZUYwZ1BTQnVaWGNnVUhKdmJXbHpaU2dvY21WemIyeDJaVmR2Y210bGNpd2djbVZxWldOMFYyOXlhMlZ5S1NBOVBpQjdYRzRnSUNBZ0lDQWdJQ0FnWTI5dWMzUWdjM1JoY25SSlpIZ2dQU0JwWkhnZ0tpQmphSFZ1YTFOcGVtVTdYRzRnSUNBZ0lDQWdJQ0FnWTI5dWMzUWdaVzVrU1dSNElEMGdhV1I0SUQwOVBTQjBhR2x6TGw5M2IzSnJaWEpEYjNWdWRDQXRJREVnUHlCdFlYUlRhWHBsSURvZ0tHbGtlQ0FySURFcElDb2dZMmgxYm10VGFYcGxPMXh1SUNBZ0lDQWdJQ0FnSUdsbUlDaGxibVJKWkhnZ1BEMGdjM1JoY25SSlpIZ3BYRzRnSUNBZ0lDQWdJQ0FnSUNCeVpYTnZiSFpsVjI5eWEyVnlLSHRwT2lCdVpYY2dTVzUwTXpKQmNuSmhlU2d3S1N3Z2Fqb2dibVYzSUVsdWRETXlRWEp5WVhrb01Da3NJR1JwYzNSaGJtTmxPaUJ1WlhjZ1JteHZZWFF6TWtGeWNtRjVLREFwTENCcFpIaDlLVHRjYmlBZ0lDQWdJQ0FnSUNCM2IzSnJaWEp6VzJsa2VGMHVjRzl6ZEUxbGMzTmhaMlVvZTNaaGJIVmxjeXdnYzNSaGNuUkpaSGdzSUdWdVpFbGtlQ3dnZEdoeVpYTm9iMnhrTENCbWJrNWhiV1Z6TENCdmNIUnpMQ0IzWldsbmFIUnpMQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaSDBwTzF4dUlDQWdJQ0FnSUNBZ0lIZHZjbXRsY25OYmFXUjRYUzV2Ym0xbGMzTmhaMlVnUFNBb2UyUmhkR0U2SUh0bGNuSnZjaXdnYVN3Z2Fpd2daR2x6ZEdGdVkyVjlmU2s2SUhadmFXUWdQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSGR2Y210bGNuTmJhV1I0WFM1MFpYSnRhVzVoZEdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnFaV04wVjI5eWEyVnlLR1Z5Y205eUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSGR2Y210bGNuTmJhV1I0WFM1MFpYSnRhVzVoZEdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpiMngyWlZkdmNtdGxjaWg3YVN3Z2Fpd2daR2x6ZEdGdVkyVXNJR2xrZUgwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCamIyNXpkQ0J5WlhOMWJIUnpJRDBnWVhkaGFYUWdVSEp2YldselpTNWhiR3dvY0hKdmJXbHpaWE1wTzF4dUlDQWdJQ0FnWTI5dWMzUWdablZzYkZOcGVtVWdQU0J5WlhOMWJIUnpMbkpsWkhWalpTZ29ZV05qTENCMllXd3BJRDArSUdGall5QXJJSFpoYkM1cExteGxibWQwYUN3Z01DazdYRzRnSUNBZ0lDQmpiMjV6ZENCcElEMGdibVYzSUVsdWRETXlRWEp5WVhrb1puVnNiRk5wZW1VcE8xeHVJQ0FnSUNBZ1kyOXVjM1FnYWlBOUlHNWxkeUJKYm5Rek1rRnljbUY1S0daMWJHeFRhWHBsS1R0Y2JpQWdJQ0FnSUdOdmJuTjBJR1JwYzNSaGJtTmxJRDBnYm1WM0lFWnNiMkYwTXpKQmNuSmhlU2htZFd4c1UybDZaU2s3WEc0Z0lDQWdJQ0JzWlhRZ2IyWm1jMlYwSUQwZ01EdGNiaUFnSUNBZ0lDOHZJSE5sZEhScGJtY2dkR2hsSUhKbGMzVnNkSE5jYmlBZ0lDQWdJR1p2Y2lBb1kyOXVjM1FnY21WeklHOW1JSEpsYzNWc2RITXBJSHRjYmlBZ0lDQWdJQ0FnYVM1elpYUW9jbVZ6TG1rc0lHOW1abk5sZENrN1hHNGdJQ0FnSUNBZ0lHb3VjMlYwS0hKbGN5NXFMQ0J2Wm1aelpYUXBPMXh1SUNBZ0lDQWdJQ0JrYVhOMFlXNWpaUzV6WlhRb2NtVnpMbVJwYzNSaGJtTmxMQ0J2Wm1aelpYUXBPMXh1SUNBZ0lDQWdJQ0J2Wm1aelpYUWdLejBnY21Wekxta3ViR1Z1WjNSb08xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2NtVjBkWEp1SUh0cExDQnFMQ0JrYVhOMFlXNWpaWDA3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjSFZpYkdsaklHRnplVzVqSUdOaGJHTThWRDRvZG1Gc2RXVnpPaUJCY25KaGVUeFVQaXdnWm01T1lXMWxPaUJMYm05M2JrMWxkSEpwWTNNc0lIUm9jbVZ6YUc5c1pEb2diblZ0WW1WeUxDQnZjSFJ6T2lCN1cxODZJSE4wY21sdVoxMDZJR0Z1ZVgwZ1BTQjdmU2tnZTF4dUlDQWdJQ0FnTHk5emFYcGxJRzltSUdaMWJHd2diV0YwY21sNFhHNGdJQ0FnSUNCeVpYUjFjbTRnWVhkaGFYUWdkR2hwY3k1allXeGpUWFZzZEdsRGIyeDFiVzRvVzNaaGJIVmxjMTBzSUZ0bWJrNWhiV1ZkTENCMGFISmxjMmh2YkdRc0lGdHZjSFJ6WFN3Z1d6RmRLVHRjYmlBZ0lDQjlYRzVjYmlBZ0lDQndkV0pzYVdNZ1lYTjVibU1nWjJWMFMwNU9LRnh1SUNBZ0lDQWdkbUZzZFdWek9pQkJjbkpoZVR4aGJuaytMQ0JtYms1aGJXVTZJRXR1YjNkdVRXVjBjbWxqY3l3Z2JrNWxhV2RvWW05MWNuTTZJRzUxYldKbGNpQTlJREUxTENCdmNIUnpPaUI3VzE4NklITjBjbWx1WjEwNklHRnVlWDBnUFNCN2ZWeHVJQ0FnSUNrZ2UxeHVJQ0FnSUNBZ2NtVjBkWEp1SUdGM1lXbDBJSFJvYVhNdWJYVnNkR2xEYjJ4MWJXNUxUazRvVzNaaGJIVmxjMTBzSUZ0bWJrNWhiV1ZkTENCdVRtVnBaMmhpYjNWeWN5d2dXMjl3ZEhOZExDQmJNVjBwTzF4dUlDQWdJSDFjYmx4dUlDQWdJSEIxWW14cFl5QmhjM2x1WXlCblpYUlVhSEpsYzJodmJHUkxUazRvWEc0Z0lDQWdJQ0IyWVd4MVpYTTZJRUZ5Y21GNVBHRnVlVDRzSUdadVRtRnRaVG9nUzI1dmQyNU5aWFJ5YVdOekxDQjBhSEpsYzJodmJHUTZJRzUxYldKbGNpQTlJREF1T0N3Z2IzQjBjem9nZTF0Zk9pQnpkSEpwYm1kZE9pQmhibmw5SUQwZ2UzMWNiaUFnSUNBcElIdGNiaUFnSUNBZ0lISmxkSFZ5YmlCaGQyRnBkQ0IwYUdsekxtMTFiSFJwUTI5c2RXMXVWR2h5WlhOb2IyeGtTMjV1S0Z0MllXeDFaWE5kTENCYlptNU9ZVzFsWFN3Z2RHaHlaWE5vYjJ4a0xDQmJiM0IwYzEwc0lGc3hYU2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjSFZpYkdsaklHRnplVzVqSUcxMWJIUnBRMjlzZFcxdVZHaHlaWE5vYjJ4a1MyNXVLSFpoYkhWbGN6b2dRWEp5WVhrOFFYSnlZWGs4WVc1NVBqNHNJR1p1VG1GdFpYTTZJRXR1YjNkdVRXVjBjbWxqYzF0ZExDQjBhSEpsYzJodmJHUTZJRzUxYldKbGNpQTlJREF1T0N4Y2JpQWdJQ0FnSUc5d2RITTZJSHRiWHpvZ2MzUnlhVzVuWFRvZ1lXNTVmVnRkTENCM1pXbG5hSFJ6T2lCdWRXMWlaWEpiWFN4Y2JpQWdJQ0FnSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrT2lCRWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrSUQwZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkhNdVJWVkRURWxFUlVGT1hHNGdJQ0FnS1NCN1hHNGdJQ0FnSUNCcFppQW9kbUZzZFdWekxteGxibWQwYUNBaFBUMGdabTVPWVcxbGN5NXNaVzVuZEdnZ2ZId2dkbUZzZFdWekxteGxibWQwYUNBaFBUMGdiM0IwY3k1c1pXNW5kR2dnZkh3Z2RtRnNkV1Z6TG14bGJtZDBhQ0FoUFQwZ2QyVnBaMmgwY3k1c1pXNW5kR2dwWEc0Z0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduZG1Gc2RXVnpMQ0JrYVhOMFlXNWpaU0JtZFc1amRHbHZibk1zSUc5d2RHbHZibk1nWVc1a0lIZGxhV2RvZEhNZ1lYSnlZWGx6SUhOb2IzVnNaQ0JvWVhabElIUm9aU0J6WVcxbElHeGxibWQwYUNjcE8xeHVYRzRnSUNBZ0lDQnBaaUFvZG1Gc2RXVnpMbk52YldVb0tIWXBJRDArSUhZdWJHVnVaM1JvSUNFOVBTQjJZV3gxWlhOYk1GMHViR1Z1WjNSb0tTbGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZGhiR3dnZG1Gc2RXVnpJR0Z5Y21GNWN5QnphRzkxYkdRZ2FHRjJaU0IwYUdVZ2MyRnRaU0JzWlc1bmRHZ25LVHRjYmx4dUlDQWdJQ0FnWTI5dWMzUWdiV0YwVTJsNlpTQTlJSFpoYkhWbGMxc3dYUzVzWlc1bmRHZ2dLaUFvZG1Gc2RXVnpXekJkTG14bGJtZDBhQ0F0SURFcElDOGdNanRjYmlBZ0lDQWdJR052Ym5OMElHTm9kVzVyVTJsNlpTQTlJRTFoZEdndVpteHZiM0lvYldGMFUybDZaU0F2SUhSb2FYTXVYM2R2Y210bGNrTnZkVzUwS1R0Y2JpQWdJQ0FnSUdOdmJuTjBJSEJ5YjIxcGMyVnpJRDFjYmlBZ0lDQWdJQ0FnYm1WM0lFRnljbUY1UEZCeWIyMXBjMlU4UzI1dVVtVnpkV3gwUGo0b2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RcE8xeHVJQ0FnSUNBZ1kyOXVjM1FnZDI5eWEyVnljeUE5SUc1bGR5QkJjbkpoZVNoMGFHbHpMbDkzYjNKclpYSkRiM1Z1ZENsY2JpQWdJQ0FnSUNBZ0xtWnBiR3dvYm5Wc2JDa3ViV0Z3S0NncElEMCtJRzVsZHlCWGIzSnJaWElvYm1WM0lGVlNUQ2duTGk5cmJtNHRkR2h5WlhOb2IyeGtMWGR2Y210bGNpY3NJR2x0Y0c5eWRDNXRaWFJoTG5WeWJDa3BLVHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR2xrZUNBOUlEQTdJR2xrZUNBOElIUm9hWE11WDNkdmNtdGxja052ZFc1ME95QnBaSGdyS3lrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl0YVhObGMxdHBaSGhkSUQwZ2JtVjNJRkJ5YjIxcGMyVW9LSEpsYzI5c2RtVlhiM0pyWlhJc0lISmxhbVZqZEZkdmNtdGxjaWtnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElITjBZWEowU1dSNElEMGdhV1I0SUNvZ1kyaDFibXRUYVhwbE8xeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElHVnVaRWxrZUNBOUlHbGtlQ0E5UFQwZ2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RZ0xTQXhJRDhnYldGMFUybDZaU0E2SUNocFpIZ2dLeUF4S1NBcUlHTm9kVzVyVTJsNlpUdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1pXNWtTV1I0SUR3OUlITjBZWEowU1dSNEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemIyeDJaVmR2Y210bGNpaDdhMjV1UkdsemRHRnVZMlZ6T2lCdVpYY2dRWEp5WVhrb01Da3NJR3R1YmtsdVpHVjRaWE02SUc1bGR5QkJjbkpoZVNnd0tYMHBPMXh1SUNBZ0lDQWdJQ0FnSUhkdmNtdGxjbk5iYVdSNFhTNXdiM04wVFdWemMyRm5aU2g3ZG1Gc2RXVnpMQ0J6ZEdGeWRFbGtlQ3dnWlc1a1NXUjRMQ0JtYms1aGJXVnpMQ0J2Y0hSekxDQjBhSEpsYzJodmJHUXNJSGRsYVdkb2RITXNJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtmU2s3WEc0Z0lDQWdJQ0FnSUNBZ2QyOXlhMlZ5YzF0cFpIaGRMbTl1YldWemMyRm5aU0E5SUNoN1pHRjBZVG9nZTJWeWNtOXlMQ0JyYm01RWFYTjBZVzVqWlhNc0lHdHVia2x1WkdWNFpYTjlmU2s2SUhadmFXUWdQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWeWNtOXlLU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSGR2Y210bGNuTmJhV1I0WFM1MFpYSnRhVzVoZEdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnFaV04wVjI5eWEyVnlLR1Z5Y205eUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSGR2Y210bGNuTmJhV1I0WFM1MFpYSnRhVzVoZEdVb0tUdGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2NtVnpiMngyWlZkdmNtdGxjaWg3YTI1dVJHbHpkR0Z1WTJWekxDQnJibTVKYm1SbGVHVnpmU2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQWdJQ0FnZlR0Y2JpQWdJQ0FnSUNBZ2ZTazdYRzRnSUNBZ0lDQjlYRzVjYmlBZ0lDQWdJR052Ym5OMElISmxjM1ZzZEhNZ1BTQmhkMkZwZENCUWNtOXRhWE5sTG1Gc2JDaHdjbTl0YVhObGN5azdYRzRnSUNBZ0lDQmpiMjV6ZENCcmJtNVRhWHBsY3lBOUlHNWxkeUJKYm5Rek1rRnljbUY1S0haaGJIVmxjMXN3WFM1c1pXNW5kR2dwTzF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCeVpYTWdiMllnY21WemRXeDBjeWtnZTF4dUlDQWdJQ0FnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElIWmhiSFZsYzFzd1hTNXNaVzVuZEdnN0lDc3JhU2xjYmlBZ0lDQWdJQ0FnSUNCcmJtNVRhWHBsYzF0cFhTQXJQU0J5WlhNdWEyNXVTVzVrWlhobGMxdHBYVDh1YkdWdVozUm9JRDgvSURBN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnSUNCamIyNXpkQ0JyYm01U1pYTTZJRXR1YmxKbGMzVnNkQ0E5SUh0Y2JpQWdJQ0FnSUNBZ2EyNXVSR2x6ZEdGdVkyVnpPaUJ1WlhjZ1FYSnlZWGtvZG1Gc2RXVnpXekJkTG14bGJtZDBhQ2t1Wm1sc2JDaHVkV3hzS1M1dFlYQW9LRjhzSUdrcElEMCtJRzVsZHlCQmNuSmhlVHh1ZFcxaVpYSStLR3R1YmxOcGVtVnpXMmxkS1Nrc1hHNGdJQ0FnSUNBZ0lHdHVia2x1WkdWNFpYTTZJRzVsZHlCQmNuSmhlU2gyWVd4MVpYTmJNRjB1YkdWdVozUm9LUzVtYVd4c0tHNTFiR3dwTG0xaGNDZ29YeXdnYVNrZ1BUNGdibVYzSUVGeWNtRjVQRzUxYldKbGNqNG9hMjV1VTJsNlpYTmJhVjBwS1gwN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElISmxjeUJ2WmlCeVpYTjFiSFJ6S1NCN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkbUZzZFdWeld6QmRMbXhsYm1kMGFEc2dLeXRwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdabTl5SUNoc1pYUWdhaUE5SURBN0lHb2dQQ0J5WlhNdWEyNXVSR2x6ZEdGdVkyVnpXMmxkUHk1c1pXNW5kR2dnUHo4Z01Ec2dLeXRxS1NCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JyYm01U1pYTXVhMjV1UkdsemRHRnVZMlZ6VzJsZFcydHVibE5wZW1WelcybGRJQzBnTVYwZ1BTQnlaWE11YTI1dVJHbHpkR0Z1WTJWelcybGRXMnBkTzF4dUlDQWdJQ0FnSUNBZ0lDQWdhMjV1VW1WekxtdHVia2x1WkdWNFpYTmJhVjFiYTI1dVUybDZaWE5iYVYwZ0xTQXhYU0E5SUhKbGN5NXJibTVKYm1SbGVHVnpXMmxkVzJwZE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnYTI1dVUybDZaWE5iYVYwZ0xUMGdNVHRjYmlBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lISmxkSFZ5YmlCcmJtNVNaWE03WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjSFZpYkdsaklHRnplVzVqSUcxMWJIUnBRMjlzZFcxdVMwNU9LSFpoYkhWbGN6b2dRWEp5WVhrOFFYSnlZWGs4WVc1NVBqNHNJR1p1VG1GdFpYTTZJRXR1YjNkdVRXVjBjbWxqYzF0ZExDQnVUbVZwWjJoaWIzVnljem9nYm5WdFltVnlJRDBnTVRVc1hHNGdJQ0FnSUNCdmNIUnpPaUI3VzE4NklITjBjbWx1WjEwNklHRnVlWDFiWFN3Z2QyVnBaMmgwY3pvZ2JuVnRZbVZ5VzEwc1hHNGdJQ0FnSUNCaFoyZHlaV2RoZEdsdmJrMWxkR2h2WkRvZ1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkNBOUlFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSekxrVlZRMHhKUkVWQlRseHVJQ0FnSUNrZ2UxeHVJQ0FnSUNBZ2FXWWdLSFpoYkhWbGN5NXNaVzVuZEdnZ0lUMDlJR1p1VG1GdFpYTXViR1Z1WjNSb0lIeDhJSFpoYkhWbGN5NXNaVzVuZEdnZ0lUMDlJRzl3ZEhNdWJHVnVaM1JvSUh4OElIWmhiSFZsY3k1c1pXNW5kR2dnSVQwOUlIZGxhV2RvZEhNdWJHVnVaM1JvS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjNaaGJIVmxjeXdnWkdsemRHRnVZMlVnWm5WdVkzUnBiMjV6TENCdmNIUnBiMjV6SUdGdVpDQjNaV2xuYUhSeklHRnljbUY1Y3lCemFHOTFiR1FnYUdGMlpTQjBhR1VnYzJGdFpTQnNaVzVuZEdnbktUdGNibHh1SUNBZ0lDQWdhV1lnS0haaGJIVmxjeTV6YjIxbEtDaDJLU0E5UGlCMkxteGxibWQwYUNBaFBUMGdkbUZzZFdWeld6QmRMbXhsYm1kMGFDa3BYRzRnSUNBZ0lDQWdJSFJvY205M0lHNWxkeUJGY25KdmNpZ25ZV3hzSUhaaGJIVmxjeUJoY25KaGVYTWdjMmh2ZFd4a0lHaGhkbVVnZEdobElITmhiV1VnYkdWdVozUm9KeWs3WEc1Y2JpQWdJQ0FnSUdOdmJuTjBJRzFoZEZOcGVtVWdQU0IyWVd4MVpYTmJNRjB1YkdWdVozUm9JQ29nS0haaGJIVmxjMXN3WFM1c1pXNW5kR2dnTFNBeEtTQXZJREk3WEc0Z0lDQWdJQ0JqYjI1emRDQmphSFZ1YTFOcGVtVWdQU0JOWVhSb0xtWnNiMjl5S0cxaGRGTnBlbVVnTHlCMGFHbHpMbDkzYjNKclpYSkRiM1Z1ZENrN1hHNGdJQ0FnSUNCamIyNXpkQ0J3Y205dGFYTmxjeUE5WEc0Z0lDQWdJQ0FnSUc1bGR5QkJjbkpoZVR4UWNtOXRhWE5sUEV0dWJsSmxjM1ZzZEQ0K0tIUm9hWE11WDNkdmNtdGxja052ZFc1MEtUdGNiaUFnSUNBZ0lHTnZibk4wSUhkdmNtdGxjbk1nUFNCdVpYY2dRWEp5WVhrb2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RcFhHNGdJQ0FnSUNBZ0lDNW1hV3hzS0c1MWJHd3BMbTFoY0Nnb0tTQTlQaUJ1WlhjZ1YyOXlhMlZ5S0c1bGR5QlZVa3dvSnk0dmEyNXVMWGR2Y210bGNpY3NJR2x0Y0c5eWRDNXRaWFJoTG5WeWJDa3BLVHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR2xrZUNBOUlEQTdJR2xrZUNBOElIUm9hWE11WDNkdmNtdGxja052ZFc1ME95QnBaSGdyS3lrZ2UxeHVJQ0FnSUNBZ0lDQndjbTl0YVhObGMxdHBaSGhkSUQwZ2JtVjNJRkJ5YjIxcGMyVW9LSEpsYzI5c2RtVlhiM0pyWlhJc0lISmxhbVZqZEZkdmNtdGxjaWtnUFQ0Z2UxeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElITjBZWEowU1dSNElEMGdhV1I0SUNvZ1kyaDFibXRUYVhwbE8xeHVJQ0FnSUNBZ0lDQWdJR052Ym5OMElHVnVaRWxrZUNBOUlHbGtlQ0E5UFQwZ2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RZ0xTQXhJRDhnYldGMFUybDZaU0E2SUNocFpIZ2dLeUF4S1NBcUlHTm9kVzVyVTJsNlpUdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1pXNWtTV1I0SUR3OUlITjBZWEowU1dSNEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnY21WemIyeDJaVmR2Y210bGNpaDdhMjV1UkdsemRHRnVZMlZ6T2lCdVpYY2dRWEp5WVhrb01Da3NJR3R1YmtsdVpHVjRaWE02SUc1bGR5QkJjbkpoZVNnd0tYMHBPMXh1SUNBZ0lDQWdJQ0FnSUhkdmNtdGxjbk5iYVdSNFhTNXdiM04wVFdWemMyRm5aU2g3ZG1Gc2RXVnpMQ0J6ZEdGeWRFbGtlQ3dnWlc1a1NXUjRMQ0JtYms1aGJXVnpMQ0J2Y0hSekxDQnVUbVZwWjJoaWIzVnljeXdnZDJWcFoyaDBjeXdnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlI5S1R0Y2JpQWdJQ0FnSUNBZ0lDQjNiM0pyWlhKelcybGtlRjB1YjI1dFpYTnpZV2RsSUQwZ0tIdGtZWFJoT2lCN1pYSnliM0lzSUd0dWJrUnBjM1JoYm1ObGN5d2dhMjV1U1c1a1pYaGxjMzE5S1RvZ2RtOXBaQ0E5UGlCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JwWmlBb1pYSnliM0lwSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZDI5eWEyVnljMXRwWkhoZExuUmxjbTFwYm1GMFpTZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaV3BsWTNSWGIzSnJaWElvWlhKeWIzSXBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnZDI5eWEyVnljMXRwWkhoZExuUmxjbTFwYm1GMFpTZ3BPMXh1SUNBZ0lDQWdJQ0FnSUNBZ0lDQnlaWE52YkhabFYyOXlhMlZ5S0h0cmJtNUVhWE4wWVc1alpYTXNJR3R1YmtsdVpHVjRaWE45S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnSUNCOU8xeHVJQ0FnSUNBZ0lDQjlLVHRjYmlBZ0lDQWdJSDFjYmx4dUlDQWdJQ0FnWTI5dWMzUWdjbVZ6ZFd4MGN5QTlJR0YzWVdsMElGQnliMjFwYzJVdVlXeHNLSEJ5YjIxcGMyVnpLVHRjYmlBZ0lDQWdJR052Ym5OMElHdHVibEpsY3pvZ1MyNXVVbVZ6ZFd4MElEMGdlMXh1SUNBZ0lDQWdJQ0JyYm01RWFYTjBZVzVqWlhNNklHNWxkeUJCY25KaGVTaDJZV3gxWlhOYk1GMHViR1Z1WjNSb0tTNW1hV3hzS0c1MWJHd3BMbTFoY0Nnb0tTQTlQaUJ1WlhjZ1FYSnlZWGs4Ym5WdFltVnlQaWh1VG1WcFoyaGliM1Z5Y3lrdVptbHNiQ2c1T1RrNU9Ta3BMRnh1SUNBZ0lDQWdJQ0JyYm01SmJtUmxlR1Z6T2lCdVpYY2dRWEp5WVhrb2RtRnNkV1Z6V3pCZExteGxibWQwYUNrdVptbHNiQ2h1ZFd4c0tTNXRZWEFvS0NrZ1BUNGdibVYzSUVGeWNtRjVQRzUxYldKbGNqNG9iazVsYVdkb1ltOTFjbk1wTG1acGJHd29MVEVwS1gwN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElISmxjeUJ2WmlCeVpYTjFiSFJ6S1NCN1hHNGdJQ0FnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkbUZzZFdWeld6QmRMbXhsYm1kMGFEc2dLeXRwS1NCN1hHNGdJQ0FnSUNBZ0lDQWdabTl5SUNoc1pYUWdhaUE5SURBN0lHb2dQQ0J5WlhNdWEyNXVSR2x6ZEdGdVkyVnpXMmxkUHk1c1pXNW5kR2dnUHo4Z01Ec2dLeXRxS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdhVzV6WlhKMFUyMWhiR3hsY2locmJtNVNaWE11YTI1dVJHbHpkR0Z1WTJWelcybGRMQ0JyYm01U1pYTXVhMjV1U1c1a1pYaGxjMXRwWFN3Z2NtVnpMbXR1YmtScGMzUmhibU5sYzF0cFhWdHFYU3dnY21WekxtdHVia2x1WkdWNFpYTmJhVjFiYWwwcE8xeHVJQ0FnSUNBZ0lDQjlYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQnlaWFIxY200Z2EyNXVVbVZ6TzF4dUlDQWdJSDFjYmx4dUlDQWdJSEIxWW14cFl5QmhjM2x1WXlCblpYUlRZVzF3YkdWRWFYTjBZVzVqWlhNb2RtRnNkV1Z6T2lCQmNuSmhlVHhoYm5sYlhUNHNYRzRnSUNBZ0lDQm1iazVoYldWek9pQkxibTkzYmsxbGRISnBZM05iWFN3Z2IzQjBjem9nZTF0Zk9pQnpkSEpwYm1kZE9pQmhibmw5VzEwZ1BTQmJYU3dnZDJWcFoyaDBjem9nYm5WdFltVnlXMTBzWEc0Z0lDQWdJQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaRG9nUkdsemRHRnVZMlZCWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ0E5SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGtWVlEweEpSRVZCVGlrNklGQnliMjFwYzJVOFJteHZZWFF6TWtGeWNtRjVQaUI3WEc0Z0lDQWdJQ0JqYjI1emRDQjBhSEpsYzJodmJHUlhiM0pyWlhKeklEMGdibVYzSUVGeWNtRjVLSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBLUzVtYVd4c0tHNTFiR3dwWEc0Z0lDQWdJQ0FnSUM1dFlYQW9LQ2tnUFQ0Z2JtVjNJRmR2Y210bGNpaHVaWGNnVlZKTUtDY3VMM053WVhKelpTMXRZWFJ5YVhndGRHaHlaWE5vYjJ4a0xYZHZjbXRsY2ljc0lHbHRjRzl5ZEM1dFpYUmhMblZ5YkNrcEtUdGNibHh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYldGMFUybDZaU0E5SUhaaGJIVmxjMXN3WFM1c1pXNW5kR2dnS2lBb2RtRnNkV1Z6V3pCZExteGxibWQwYUNBdElERXBJQzhnTWp0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnWTJoMWJtdFRhWHBsSUQwZ1RXRjBhQzVtYkc5dmNpaHRZWFJUYVhwbElDOGdkR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUXBPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnRZWGhUWVcxd2JHVlRhWHBsSUQwZ01WOHdNREJmTURBd08xeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCellXMXdiR1ZUYVhObElEMGdUV0YwYUM1dFlYZ29UV0YwYUM1dGFXNG9iV0YwVTJsNlpTQXZJREV3TURBc0lHMWhlRk5oYlhCc1pWTnBlbVVwTENCTllYUm9MbTFwYmlodFlYUlRhWHBsTENCdFlYaFRZVzF3YkdWVGFYcGxLU2s3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJSFJsYzNSVFpYUlRhWHBsVUdWeVYyOXlhMlZ5SUQwZ1RXRjBhQzVtYkc5dmNpaHpZVzF3YkdWVGFYTmxJQzhnZEdocGN5NWZkMjl5YTJWeVEyOTFiblFwTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0IwVUhKdmJXbHpaWE1nUFNCdVpYY2dRWEp5WVhrOFVISnZiV2x6WlR4N1pHbHpkR0Z1WTJVNklFWnNiMkYwTXpKQmNuSmhlWDArUGloMGFHbHpMbDkzYjNKclpYSkRiM1Z1ZENrN1hHNWNiaUFnSUNBZ0lDQWdabTl5SUNoc1pYUWdhV1I0SUQwZ01Ec2dhV1I0SUR3Z2RHaHBjeTVmZDI5eWEyVnlRMjkxYm5RN0lHbGtlQ3NyS1NCN1hHNGdJQ0FnSUNBZ0lDQWdkRkJ5YjIxcGMyVnpXMmxrZUYwZ1BTQnVaWGNnVUhKdmJXbHpaU2dvY21WemIyeDJaVmR2Y210bGNpd2djbVZxWldOMFYyOXlhMlZ5S1NBOVBpQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J6ZEdGeWRFbGtlQ0E5SUdsa2VDQXFJR05vZFc1clUybDZaVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnZibk4wSUdWdVpFbGtlQ0E5SUdsa2VDQTlQVDBnZEdocGN5NWZkMjl5YTJWeVEyOTFiblFnTFNBeElEOGdiV0YwVTJsNlpTQTZJQ2hwWkhnZ0t5QXhLU0FxSUdOb2RXNXJVMmw2WlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJSFJvY21WemFHOXNaRmR2Y210bGNuTmJhV1I0WFM1d2IzTjBUV1Z6YzJGblpTaDdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIWmhiSFZsY3pvZ2RtRnNkV1Z6TENCemRHRnlkRWxrZUN3Z1pXNWtTV1I0TENCellXMXdiR1ZNWlc1bmRHZzZJSFJsYzNSVFpYUlRhWHBsVUdWeVYyOXlhMlZ5TEZ4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0JtYms1aGJXVnpMQ0J2Y0hSekxDQjNaV2xuYUhSekxDQmhaMmR5WldkaGRHbHZiazFsZEdodlpGeHVJQ0FnSUNBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUhKbGMyaHZiR1JYYjNKclpYSnpXMmxrZUYwdWIyNXRaWE56WVdkbElEMGdLSHRrWVhSaE9pQjdaWEp5YjNJc0lHUnBjM1JoYm1ObGZYMHBPaUIyYjJsa0lEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdkR2h5WlhOb2IyeGtWMjl5YTJWeWMxdHBaSGhkTG5SbGNtMXBibUYwWlNncE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCcFppQW9aWEp5YjNJcElISmxhbVZqZEZkdmNtdGxjaWhsY25KdmNpazdJR1ZzYzJWY2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnSUNCeVpYTnZiSFpsVjI5eWEyVnlLSHRrYVhOMFlXNWpaWDBwTzF4dUlDQWdJQ0FnSUNBZ0lDQWdmVHRjYmlBZ0lDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lDQWdmVnh1WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJSEpsYzNWc2RITWdQU0JoZDJGcGRDQlFjbTl0YVhObExtRnNiQ2gwVUhKdmJXbHpaWE1wTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JtZFd4c1UybDZaU0E5SUhKbGMzVnNkSE11Y21Wa2RXTmxLQ2hoWTJNc0lIWmhiQ2tnUFQ0Z1lXTmpJQ3NnZG1Gc0xtUnBjM1JoYm1ObExteGxibWQwYUN3Z01DazdYRzRnSUNBZ0lDQWdJR052Ym5OMElHUnBjM1JoYm1ObElEMGdibVYzSUVac2IyRjBNekpCY25KaGVTaG1kV3hzVTJsNlpTazdYRzRnSUNBZ0lDQWdJR3hsZENCdlptWnpaWFFnUFNBd08xeHVJQ0FnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJSEpsY3lCdlppQnlaWE4xYkhSektTQjdYRzRnSUNBZ0lDQWdJQ0FnWkdsemRHRnVZMlV1YzJWMEtISmxjeTVrYVhOMFlXNWpaU3dnYjJabWMyVjBLVHRjYmlBZ0lDQWdJQ0FnSUNCdlptWnpaWFFnS3owZ2NtVnpMbVJwYzNSaGJtTmxMbXhsYm1kMGFEdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JrYVhOMFlXNWpaUzV6YjNKMEtDazdYRzVjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJR1JwYzNSaGJtTmxPMXh1SUNBZ0lDQWdmU0JqWVhSamFDQW9aU2tnZTF4dUlDQWdJQ0FnSUNCMGFISmxjMmh2YkdSWGIzSnJaWEp6UHk1bWIzSkZZV05vS0NoM0tTQTlQaUIzUHk1MFpYSnRhVzVoZEdVb0tTazdYRzRnSUNBZ0lDQWdJR052Ym5OdmJHVXVaWEp5YjNJb1pTazdYRzRnSUNBZ0lDQWdJSEpsZEhWeWJpQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtERXBMbVpwYkd3b01DNDFLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzVjYmlBZ0lDQndjbWwyWVhSbElHRnplVzVqSUdkbGRFMXBibWx0WVd4VWFISmxjMmh2YkdRb2RtRnNkV1Z6T2lCQmNuSmhlVHhoYm5sYlhUNHNYRzRnSUNBZ0lDQm1iazVoYldWek9pQkxibTkzYmsxbGRISnBZM05iWFN3Z2IzQjBjem9nZTF0Zk9pQnpkSEpwYm1kZE9pQmhibmw5VzEwZ1BTQmJYU3dnZDJWcFoyaDBjem9nYm5WdFltVnlXMTBzWEc0Z0lDQWdJQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaRG9nUkdsemRHRnVZMlZCWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ0E5SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGtWVlEweEpSRVZCVGlrZ2UxeHVJQ0FnSUNBZ0x5OVhaU0J1WldWa0lIUnZJR05oYkdOMWJHRjBaU0IwYUdVZ2JXbHVhVzFoYkNCMGFISmxjMmh2YkdRZ1ptbHljM1FzWEc0Z0lDQWdJQ0F2TDJsdUlHOXlaR1Z5SUhSdklHZGxkQ0J0WVhSeWFYZ2djM1ZqYUNCMGFHRjBJR2wwSUdSdlpYTWdibTkwSUdWNFkyVmxaQ0IwYUdVZ2JXRjRhVzExYlNCemFYcGxJRzltSURGSFFseHVJQ0FnSUNBZ0x5OTNaU0JvWVhabElETWdjbVYwZFhKdUlHRnljbUY1Y3l3Z1pXRmphQ0EwSUdKcGRHVnpJSEJsY2lCbGJHVnRaVzUwTENCemJ5QnBaaUIwYUdVZ2JXRjRhVzExYlNCemFYcGxJRzltSUhSb1pTQnRZWFJ5YVhnZ2FYTWdNVWRDTEZ4dUlDQWdJQ0FnWTI5dWMzUWdiV0Y0VTNCaGNuTmxUV0YwY21sNFUybDZaU0E5SURjd1h6QXdNRjh3TURBN1hHNGdJQ0FnSUNCMGNua2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnRZWFJUYVhwbElEMGdkbUZzZFdWekxteGxibWQwYUNBcUlDaDJZV3gxWlhNdWJHVnVaM1JvSUMwZ01Ta2dMeUF5TzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JrYVhOMFlXNWpaU0E5SUdGM1lXbDBJSFJvYVhNdVoyVjBVMkZ0Y0d4bFJHbHpkR0Z1WTJWektIWmhiSFZsY3l3Z1ptNU9ZVzFsY3l3Z2IzQjBjeXdnZDJWcFoyaDBjeXdnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFwTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JtY21GamRHbHZia2x1WkdWNElEMGdUV0YwYUM1bWJHOXZjaWh0WVhoVGNHRnljMlZOWVhSeWFYaFRhWHBsSUM4Z2JXRjBVMmw2WlNBcUlHUnBjM1JoYm1ObExteGxibWQwYUNrN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUhSb2NtVnphRzlzWkNBOUlERWdMU0JrYVhOMFlXNWpaVnRtY21GamRHbHZia2x1WkdWNFhUdGNiaUFnSUNBZ0lDQWdMeThnZEdoeVpYTm9iMnhrSUQwZ1RXRjBhQzV0WVhnb2RHaHlaWE5vYjJ4a0xDQXdMak1wTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnZEdoeVpYTm9iMnhrTzF4dUlDQWdJQ0FnZlNCallYUmphQ0FvWlNrZ2UxeHVJQ0FnSUNBZ0lDQmpiMjV6YjJ4bExtVnljbTl5S0dVcE8xeHVJQ0FnSUNBZ0lDQnlaWFIxY200Z01DNDFPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lIMWNibHh1SUNBZ0lIQjFZbXhwWXlCemRHRjBhV01nWTJGc1kxTjVibU04VkQ0b1hHNGdJQ0FnSUNCMllXeDFaWE02SUVGeWNtRjVQRlErSUh3Z1FYSnlZWGxNYVd0bFBGUStMQ0JtYms1aGJXVTZJRXR1YjNkdVRXVjBjbWxqY3l3Z1pHbHpkR0Z1WTJWR2Jqb2dSblZ1WTNScGIyNHNJSFJvY21WemFHOXNaRG9nYm5WdFltVnlYRzRnSUNBZ0tTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCcE9pQnVkVzFpWlhKYlhTQTlJRnRkTzF4dUlDQWdJQ0FnWTI5dWMzUWdham9nYm5WdFltVnlXMTBnUFNCYlhUdGNiaUFnSUNBZ0lHTnZibk4wSUdScGMzUmhibU5sY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ0lDQWdJR3hsZENCamJuUWdQU0F3TzF4dUlDQWdJQ0FnYkdWMElHMXBJRDBnTUR0Y2JpQWdJQ0FnSUd4bGRDQnRhaUE5SURBN1hHNGdJQ0FnSUNCamIyNXpkQ0JtZFd4c1UybDZaU0E5SUhaaGJIVmxjeTVzWlc1bmRHZ2dLaUFvZG1Gc2RXVnpMbXhsYm1kMGFDQXRJREVwSUM4Z01qdGNiaUFnSUNBZ0lIZG9hV3hsSUNoamJuUWdQQ0JtZFd4c1UybDZaU2tnZTF4dUlDQWdJQ0FnSUNBdkwyTnZibk4wSUhaaGJIVmxJRDBnYzJWeE1VeHBjM1JiYldsZElDWW1JSE5sY1RGTWFYTjBXMjFxWFNBL0lHaGhiVzFwYm1jb2MyVnhNVXhwYzNSYmJXbGRMQ0J6WlhFeFRHbHpkRnR0YWwwcElEb2dNRHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdkbUZzZFdVZ1BTQWhhWE5PYVd3b2RtRnNkV1Z6VzIxcFhTa2dKaVlnSVdselRtbHNLSFpoYkhWbGMxdHRhbDBwSUQ5Y2JpQWdJQ0FnSUNBZ0lDQmthWE4wWVc1alpVWnVLSFpoYkhWbGMxdHRhVjBzSUhaaGJIVmxjMXR0YWwwcElEb2dNVHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjMmx0YVd4aGNtbDBlU0E5SURFZ0xTQjJZV3gxWlR0Y2JpQWdJQ0FnSUNBZ2FXWWdLSE5wYldsc1lYSnBkSGtnUGowZ2RHaHlaWE5vYjJ4a0tTQjdYRzRnSUNBZ0lDQWdJQ0FnYVM1d2RYTm9LRzFwS1R0Y2JpQWdJQ0FnSUNBZ0lDQnFMbkIxYzJnb2JXb3BPMXh1SUNBZ0lDQWdJQ0FnSUdScGMzUmhibU5sY3k1d2RYTm9LSFpoYkhWbEtUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0JqYm5Rckt6dGNiaUFnSUNBZ0lDQWdiV29yS3p0Y2JpQWdJQ0FnSUNBZ2FXWWdLRzFxSUQwOVBTQjJZV3gxWlhNdWJHVnVaM1JvS1NCN1hHNGdJQ0FnSUNBZ0lDQWdiV2tyS3p0Y2JpQWdJQ0FnSUNBZ0lDQnRhaUE5SUcxcElDc2dNVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCamIyNXpkQ0JwUVhKeVlYa2dQU0J1WlhjZ1NXNTBNekpCY25KaGVTaHBLVHRjYmlBZ0lDQWdJR052Ym5OMElHcEJjbkpoZVNBOUlHNWxkeUJKYm5Rek1rRnljbUY1S0dvcE8xeHVJQ0FnSUNBZ1kyOXVjM1FnWkdsemRHRnVZMlZCY25KaGVTQTlJRzVsZHlCR2JHOWhkRE15UVhKeVlYa29aR2x6ZEdGdVkyVnpLVHRjYmx4dUlDQWdJQ0FnY21WMGRYSnVJSHRwT2lCcFFYSnlZWGtzSUdvNklHcEJjbkpoZVN3Z1pHbHpkR0Z1WTJVNklHUnBjM1JoYm1ObFFYSnlZWGw5TzF4dUlDQWdJSDFjYm4xY2JpSmRmUT09IiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VPYmplY3QsIHRocmVzaG9sZCkge1xuICAgIGNvbnN0IG4gPSBjbHVzdGVyLmxlbmd0aDtcbiAgICBjb25zdCBpcyA9IFtdO1xuICAgIGNvbnN0IGpzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gY2x1c3RlcltpXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBjbHVzdGVyW2pdO1xuICAgICAgICAgICAgaWYgKHNwYXJzZU9iamVjdFthXT8uW2JdID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGlzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAganMucHVzaChqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpIHtcbiAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCkubWFwKCgpID0+IE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IDEwMDtcbiAgICBjb25zdCB4VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gICAgY29uc3QgeVZlbG9jaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRlbXBlcmF0dXJlID0gKDEgLSBpIC8gaXRlcmF0aW9ucyk7XG4gICAgICAgIHhWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgICAgIHlWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGlzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBpc1tpZHhdO1xuICAgICAgICAgICAgY29uc3QgYiA9IGpzW2lkeF07XG4gICAgICAgICAgICBjb25zdCBkeCA9IGVtYmVkWFthXSAtIGVtYmVkWFtiXTtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gZW1iZWRZW2FdIC0gZW1iZWRZW2JdO1xuICAgICAgICAgICAgLy8gICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZhY3RvciA9IChkaXN0YW5jZSAtIDEpIC8gZGlzdGFuY2U7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IG9mZnNldFggPSBkeCAqIGZhY3RvcjtcbiAgICAgICAgICAgIC8vICAgY29uc3Qgb2Zmc2V0WSA9IGR5ICogZmFjdG9yO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+PSAxKSB7XG4gICAgICAgICAgICAgICAgeFZlbG9jaXRpZXNbYV0gLT0gdGVtcGVyYXR1cmUgKiBkeDtcbiAgICAgICAgICAgICAgICB4VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR5KSA+PSAxKSB7XG4gICAgICAgICAgICAgICAgeVZlbG9jaXRpZXNbYV0gLT0gdGVtcGVyYXR1cmUgKiBkeTtcbiAgICAgICAgICAgICAgICB5VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICBlbWJlZFlbYV0gKz0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgLy8gICBlbWJlZFlbYl0gLT0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgdmVjU2l6ZSA9IE1hdGguc3FydCh4VmVsb2NpdGllc1tpZHhdICogeFZlbG9jaXRpZXNbaWR4XSArIHlWZWxvY2l0aWVzW2lkeF0gKiB5VmVsb2NpdGllc1tpZHhdKTtcbiAgICAgICAgICAgIGlmICh2ZWNTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGVtYmVkWFtpZHhdICs9IHhWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICAgICAgZW1iZWRZW2lkeF0gKz0geVZlbG9jaXRpZXNbaWR4XSAvIHZlY1NpemUgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBub3JtYWxpemVcbiAgICBsZXQgbWluWCA9IGVtYmVkWFswXTtcbiAgICBsZXQgbWluWSA9IGVtYmVkWVswXTtcbiAgICBsZXQgbWF4WCA9IGVtYmVkWFswXTtcbiAgICBsZXQgbWF4WSA9IGVtYmVkWVswXTtcbiAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtpZHhdKTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGVtYmVkWVtpZHhdKTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGVtYmVkWFtpZHhdKTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtpZHhdKTtcbiAgICB9XG4gICAgbGV0IHJhbmdlWCA9IG1heFggLSBtaW5YO1xuICAgIGxldCByYW5nZVkgPSBtYXhZIC0gbWluWTtcbiAgICBpZiAocmFuZ2VYID09PSAwKVxuICAgICAgICByYW5nZVggPSBtYXhYO1xuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICAgICAgZW1iZWRYW2lkeF0gPSAoZW1iZWRYW2lkeF0gLSBtaW5YKSAvIHJhbmdlWCAvIDIgKyAwLjU7XG4gICAgaWYgKHJhbmdlWSA9PT0gMClcbiAgICAgICAgcmFuZ2VZID0gbWF4WTtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgICAgIGVtYmVkWVtpZHhdID0gKGVtYmVkWVtpZHhdIC0gbWluWSkgLyByYW5nZVkgLyAyICsgMC41O1xuICAgIHJldHVybiB7IGVtYmVkWCwgZW1iZWRZIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lZbWx2TFd4aGVXOTFkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkltSnBieTFzWVhsdmRYUXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1RVRkJUU3hEUVVGRExFdEJRVXNzVlVGQlZTeFRRVUZUTEVOQlFVTXNUMEZCYVVJc1JVRkJSU3haUVVGblF5eEZRVUZGTEZOQlFXbENPMGxCUTNCSExFMUJRVTBzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNN1NVRkRla0lzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMGxCUTNoQ0xFMUJRVTBzUlVGQlJTeEhRVUZoTEVWQlFVVXNRMEZCUXp0SlFVTjRRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTTdVVUZETTBJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXp0WlFVTXZRaXhOUVVGTkxFTkJRVU1zUjBGQlJ5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRja0lzVFVGQlRTeERRVUZETEVkQlFVY3NUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRM0pDTEVsQlFVa3NXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NVMEZCVXl4RlFVRkZMRU5CUVVNN1owSkJRM1JETEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlExZ3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU5pTEVOQlFVTTdVVUZEU0N4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVORUxFOUJRVThzYlVKQlFXMUNMRU5CUVVNc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTTVReXhEUVVGRE8wRkJSVVFzVTBGQlV5eHRRa0ZCYlVJc1EwRkJReXhGUVVGWkxFVkJRVVVzUlVGQldTeEZRVUZGTEU5QlFXbENPMGxCUTNoRkxFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRkxFTkJRVU1zUTBGQlF6dEpRVU4wUml4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGbEJRVmtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNN1NVRkRkRVlzVFVGQlRTeFZRVUZWTEVkQlFVY3NSMEZCUnl4RFFVRkRPMGxCUTNaQ0xFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkROMFFzVFVGQlRTeFhRVUZYTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNM1JDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVlVGQlZTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNN1VVRkRjRU1zVFVGQlRTeFhRVUZYTEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExGVkJRVlVzUTBGQlF5eERRVUZETzFGQlEzcERMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VJc1YwRkJWeXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTndRaXhMUVVGTExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSVUZCUlN4SFFVRkhMRWRCUVVjc1JVRkJSU3hEUVVGRExFMUJRVTBzUlVGQlJTeEhRVUZITEVWQlFVVXNSVUZCUlN4RFFVRkRPMWxCUTNwRExFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRaUVVOc1FpeE5RVUZOTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRGJFSXNUVUZCVFN4RlFVRkZMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOcVF5eE5RVUZOTEVWQlFVVXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJwRExHMUVRVUZ0UkR0WlFVTnVSQ3c0UTBGQk9FTTdXVUZET1VNc2FVTkJRV2xETzFsQlEycERMR2xEUVVGcFF6dFpRVU5xUXl4SlFVRkpMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNN1owSkJRM1JDTEZkQlFWY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hYUVVGWExFZEJRVWNzUlVGQlJTeERRVUZETzJkQ1FVTnVReXhYUVVGWExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NWMEZCVnl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOeVF5eERRVUZETzFsQlEwUXNTVUZCU1N4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRPMmRDUVVOMFFpeFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1YwRkJWeXhIUVVGSExFVkJRVVVzUTBGQlF6dG5Ra0ZEYmtNc1YwRkJWeXhEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEZkQlFWY3NSMEZCUnl4RlFVRkZMRU5CUVVNN1dVRkRja01zUTBGQlF6dFpRVU5JTEhkRFFVRjNRenRaUVVONFF5eDNRMEZCZDBNN1VVRkRlRU1zUTBGQlF6dFJRVU5FTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU03V1VGRE9VTXNUVUZCVFN4UFFVRlBMRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eFhRVUZYTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEZkQlFWY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhYUVVGWExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTnlSeXhKUVVGSkxFOUJRVThzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXp0blFrRkRhRUlzVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRmRCUVZjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eFBRVUZQTEVkQlFVY3NWMEZCVnl4RFFVRkRPMmRDUVVONFJDeE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEU5QlFVOHNSMEZCUnl4WFFVRlhMRU5CUVVNN1dVRkRNVVFzUTBGQlF6dFJRVU5JTEVOQlFVTTdTVUZEU0N4RFFVRkRPMGxCUlVRc1dVRkJXVHRKUVVOYUxFbEJRVWtzU1VGQlNTeEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOeVFpeEpRVUZKTEVsQlFVa3NSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRGNrSXNTVUZCU1N4SlFVRkpMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzSkNMRWxCUVVrc1NVRkJTU3hIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTnlRaXhMUVVGTExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSVUZCUlN4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFMUJRVTBzUlVGQlJTeEhRVUZITEVWQlFVVXNSVUZCUlN4RFFVRkRPMUZCUXpsRExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTnVReXhKUVVGSkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRVZCUVVVc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEYmtNc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RlFVRkZMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEyNURMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU55UXl4RFFVRkRPMGxCUTBRc1NVRkJTU3hOUVVGTkxFZEJRVWNzU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXp0SlFVTjZRaXhKUVVGSkxFMUJRVTBzUjBGQlJ5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRPMGxCUTNwQ0xFbEJRVWtzVFVGQlRTeExRVUZMTEVOQlFVTTdVVUZEWkN4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRE8wbEJRMmhDTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSVHRSUVVNelF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1RVRkJUU3hIUVVGSExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdTVUZEZUVRc1NVRkJTU3hOUVVGTkxFdEJRVXNzUTBGQlF6dFJRVU5rTEUxQlFVMHNSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRhRUlzUzBGQlN5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhIUVVGSExFOUJRVThzUTBGQlF5eE5RVUZOTEVWQlFVVXNSMEZCUnl4RlFVRkZPMUZCUXpORExFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4TlFVRk5MRWRCUVVjc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF6dEpRVVY0UkN4UFFVRlBMRVZCUVVNc1RVRkJUU3hGUVVGRkxFMUJRVTBzUlVGQlF5eERRVUZETzBGQlF6RkNMRU5CUVVNaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UxTndZWEp6WlUxaGRISnBlRTlpYW1WamRIMGdabkp2YlNBbkxpOTBlWEJsY3ljN1hHNWNibVY0Y0c5eWRDQmhjM2x1WXlCbWRXNWpkR2x2YmlCaWFXOU1ZWGx2ZFhRb1kyeDFjM1JsY2pvZ2JuVnRZbVZ5VzEwc0lITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wTENCMGFISmxjMmh2YkdRNklHNTFiV0psY2lrZ2UxeHVJQ0JqYjI1emRDQnVJRDBnWTJ4MWMzUmxjaTVzWlc1bmRHZzdYRzRnSUdOdmJuTjBJR2x6T2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNCamIyNXpkQ0JxY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnVPeUJwS3lzcElIdGNiaUFnSUNCbWIzSWdLR3hsZENCcUlEMGdhU0FySURFN0lHb2dQQ0J1T3lCcUt5c3BJSHRjYmlBZ0lDQWdJR052Ym5OMElHRWdQU0JqYkhWemRHVnlXMmxkTzF4dUlDQWdJQ0FnWTI5dWMzUWdZaUE5SUdOc2RYTjBaWEpiYWwwN1hHNGdJQ0FnSUNCcFppQW9jM0JoY25ObFQySnFaV04wVzJGZFB5NWJZbDBnUGowZ2RHaHlaWE5vYjJ4a0tTQjdYRzRnSUNBZ0lDQWdJR2x6TG5CMWMyZ29hU2s3WEc0Z0lDQWdJQ0FnSUdwekxuQjFjMmdvYWlrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzRnSUhKbGRIVnliaUJuWlhSTVlYbHZkWFJGYldKbFpHUnBibWR6S0dsekxDQnFjeXdnWTJ4MWMzUmxjaWs3WEc1OVhHNWNibVoxYm1OMGFXOXVJR2RsZEV4aGVXOTFkRVZ0WW1Wa1pHbHVaM01vYVhNNklHNTFiV0psY2x0ZExDQnFjem9nYm5WdFltVnlXMTBzSUdOc2RYTjBaWEk2SUc1MWJXSmxjbHRkS1NCN1hHNGdJR052Ym5OMElHVnRZbVZrV0NBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1kyeDFjM1JsY2k1c1pXNW5kR2dwTG1acGJHd29NQ2t1YldGd0tDZ3BJRDArSUUxaGRHZ3VjbUZ1Wkc5dEtDa2dLaUF4TUNrN1hHNGdJR052Ym5OMElHVnRZbVZrV1NBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1kyeDFjM1JsY2k1c1pXNW5kR2dwTG1acGJHd29NQ2t1YldGd0tDZ3BJRDArSUUxaGRHZ3VjbUZ1Wkc5dEtDa2dLaUF4TUNrN1hHNGdJR052Ym5OMElHbDBaWEpoZEdsdmJuTWdQU0F4TURBN1hHNGdJR052Ym5OMElIaFdaV3h2WTJsMGFXVnpJRDBnYm1WM0lFWnNiMkYwTXpKQmNuSmhlU2hqYkhWemRHVnlMbXhsYm1kMGFDa3VabWxzYkNnd0tUdGNiaUFnWTI5dWMzUWdlVlpsYkc5amFYUnBaWE1nUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0dOc2RYTjBaWEl1YkdWdVozUm9LUzVtYVd4c0tEQXBPMXh1SUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHbDBaWEpoZEdsdmJuTTdJR2tyS3lrZ2UxeHVJQ0FnSUdOdmJuTjBJSFJsYlhCbGNtRjBkWEpsSUQwZ0tERWdMU0JwSUM4Z2FYUmxjbUYwYVc5dWN5azdYRzRnSUNBZ2VGWmxiRzlqYVhScFpYTXVabWxzYkNnd0tUdGNiaUFnSUNCNVZtVnNiMk5wZEdsbGN5NW1hV3hzS0RBcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJR2x6TG14bGJtZDBhRHNnYVdSNEt5c3BJSHRjYmlBZ0lDQWdJR052Ym5OMElHRWdQU0JwYzF0cFpIaGRPMXh1SUNBZ0lDQWdZMjl1YzNRZ1lpQTlJR3B6VzJsa2VGMDdYRzRnSUNBZ0lDQmpiMjV6ZENCa2VDQTlJR1Z0WW1Wa1dGdGhYU0F0SUdWdFltVmtXRnRpWFR0Y2JpQWdJQ0FnSUdOdmJuTjBJR1I1SUQwZ1pXMWlaV1JaVzJGZElDMGdaVzFpWldSWlcySmRPMXh1SUNBZ0lDQWdMeThnSUNCamIyNXpkQ0JrYVhOMFlXNWpaU0E5SUUxaGRHZ3VjM0Z5ZENoa2VDQXFJR1I0SUNzZ1pIa2dLaUJrZVNrN1hHNGdJQ0FnSUNBdkx5QWdJR052Ym5OMElHWmhZM1J2Y2lBOUlDaGthWE4wWVc1alpTQXRJREVwSUM4Z1pHbHpkR0Z1WTJVN1hHNGdJQ0FnSUNBdkx5QWdJR052Ym5OMElHOW1abk5sZEZnZ1BTQmtlQ0FxSUdaaFkzUnZjanRjYmlBZ0lDQWdJQzh2SUNBZ1kyOXVjM1FnYjJabWMyVjBXU0E5SUdSNUlDb2dabUZqZEc5eU8xeHVJQ0FnSUNBZ2FXWWdLRTFoZEdndVlXSnpLR1I0S1NBK1BTQXhLU0I3WEc0Z0lDQWdJQ0FnSUhoV1pXeHZZMmwwYVdWelcyRmRJQzA5SUhSbGJYQmxjbUYwZFhKbElDb2daSGc3WEc0Z0lDQWdJQ0FnSUhoV1pXeHZZMmwwYVdWelcySmRJQ3M5SUhSbGJYQmxjbUYwZFhKbElDb2daSGc3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JwWmlBb1RXRjBhQzVoWW5Nb1pIa3BJRDQ5SURFcElIdGNiaUFnSUNBZ0lDQWdlVlpsYkc5amFYUnBaWE5iWVYwZ0xUMGdkR1Z0Y0dWeVlYUjFjbVVnS2lCa2VUdGNiaUFnSUNBZ0lDQWdlVlpsYkc5amFYUnBaWE5iWWwwZ0t6MGdkR1Z0Y0dWeVlYUjFjbVVnS2lCa2VUdGNiaUFnSUNBZ0lIMWNiaUFnSUNBdkx5QWdJR1Z0WW1Wa1dWdGhYU0FyUFNCdlptWnpaWFJaSUNvZ2RHVnRjR1Z5WVhSMWNtVTdYRzRnSUNBZ0x5OGdJQ0JsYldKbFpGbGJZbDBnTFQwZ2IyWm1jMlYwV1NBcUlIUmxiWEJsY21GMGRYSmxPMXh1SUNBZ0lIMWNiaUFnSUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0JqYkhWemRHVnlMbXhsYm1kMGFEc2dhV1I0S3lzcElIdGNiaUFnSUNBZ0lHTnZibk4wSUhabFkxTnBlbVVnUFNCTllYUm9Mbk54Y25Rb2VGWmxiRzlqYVhScFpYTmJhV1I0WFNBcUlIaFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0t5QjVWbVZzYjJOcGRHbGxjMXRwWkhoZElDb2dlVlpsYkc5amFYUnBaWE5iYVdSNFhTazdYRzRnSUNBZ0lDQnBaaUFvZG1WalUybDZaU0ErSURBcElIdGNiaUFnSUNBZ0lDQWdaVzFpWldSWVcybGtlRjBnS3owZ2VGWmxiRzlqYVhScFpYTmJhV1I0WFNBdklIWmxZMU5wZW1VZ0tpQjBaVzF3WlhKaGRIVnlaVHRjYmlBZ0lDQWdJQ0FnWlcxaVpXUlpXMmxrZUYwZ0t6MGdlVlpsYkc5amFYUnBaWE5iYVdSNFhTQXZJSFpsWTFOcGVtVWdLaUIwWlcxd1pYSmhkSFZ5WlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNBdkx5QnViM0p0WVd4cGVtVmNiaUFnYkdWMElHMXBibGdnUFNCbGJXSmxaRmhiTUYwN1hHNGdJR3hsZENCdGFXNVpJRDBnWlcxaVpXUlpXekJkTzF4dUlDQnNaWFFnYldGNFdDQTlJR1Z0WW1Wa1dGc3dYVHRjYmlBZ2JHVjBJRzFoZUZrZ1BTQmxiV0psWkZsYk1GMDdYRzRnSUdadmNpQW9iR1YwSUdsa2VDQTlJREU3SUdsa2VDQThJR05zZFhOMFpYSXViR1Z1WjNSb095QnBaSGdyS3lrZ2UxeHVJQ0FnSUcxcGJsZ2dQU0JOWVhSb0xtMXBiaWh0YVc1WUxDQmxiV0psWkZoYmFXUjRYU2s3WEc0Z0lDQWdiV2x1V1NBOUlFMWhkR2d1YldsdUtHMXBibGtzSUdWdFltVmtXVnRwWkhoZEtUdGNiaUFnSUNCdFlYaFlJRDBnVFdGMGFDNXRZWGdvYldGNFdDd2daVzFpWldSWVcybGtlRjBwTzF4dUlDQWdJRzFoZUZrZ1BTQk5ZWFJvTG0xaGVDaHRZWGhaTENCbGJXSmxaRmxiYVdSNFhTazdYRzRnSUgxY2JpQWdiR1YwSUhKaGJtZGxXQ0E5SUcxaGVGZ2dMU0J0YVc1WU8xeHVJQ0JzWlhRZ2NtRnVaMlZaSUQwZ2JXRjRXU0F0SUcxcGJsazdYRzRnSUdsbUlDaHlZVzVuWlZnZ1BUMDlJREFwWEc0Z0lDQWdjbUZ1WjJWWUlEMGdiV0Y0V0R0Y2JpQWdabTl5SUNoc1pYUWdhV1I0SUQwZ01Ec2dhV1I0SUR3Z1kyeDFjM1JsY2k1c1pXNW5kR2c3SUdsa2VDc3JLVnh1SUNBZ0lHVnRZbVZrV0Z0cFpIaGRJRDBnS0dWdFltVmtXRnRwWkhoZElDMGdiV2x1V0NrZ0x5QnlZVzVuWlZnZ0x5QXlJQ3NnTUM0MU8xeHVJQ0JwWmlBb2NtRnVaMlZaSUQwOVBTQXdLVnh1SUNBZ0lISmhibWRsV1NBOUlHMWhlRms3WEc0Z0lHWnZjaUFvYkdWMElHbGtlQ0E5SURBN0lHbGtlQ0E4SUdOc2RYTjBaWEl1YkdWdVozUm9PeUJwWkhnckt5bGNiaUFnSUNCbGJXSmxaRmxiYVdSNFhTQTlJQ2hsYldKbFpGbGJhV1I0WFNBdElHMXBibGtwSUM4Z2NtRnVaMlZaSUM4Z01pQXJJREF1TlR0Y2JseHVJQ0J5WlhSMWNtNGdlMlZ0WW1Wa1dDd2daVzFpWldSWmZUdGNibjFjYmlKZGZRPT0iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogY29sd2lzZSBub3JtYWxpemUgdGhlIGtubiBzaW1pbGFyaXRpZXNcbiAqIEJFIFdBUkUsIG1vZGlmaWVzIHRoZSBpbnB1dCBhcnJheSBpbiBwbGFjZVxuICogQHBhcmFtIGRldmljZVxuICogQHBhcmFtIGtublNpbWlsYXJpdGllc1xuICogQHBhcmFtIG9mZnNldHNcbiAqIEBwYXJhbSBuUm93c1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSBuUm93cztcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnY29sd2lzZS1ub3JtYWxpemUnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IGtublNpbWlsYXJpdGllcyA6IGFycmF5PGYzMj47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZD4gb2Zmc2V0cyA6IGFycmF5PHUzMj47XG4gICAgICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cFRocmVhZHNQZXJEaW19LCAke3dvcmtHcm91cFRocmVhZHNQZXJEaW19KSBmbiBub3JtYWxpemUoXG4gICAgICAgICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPixcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC54O1xuICAgICAgICAgICAgbGV0IGNvbCA9IGlkLnk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByb3cgKiAke3RocmVhZHNQZXJEaW19ICsgY29sO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49ICR7blJvd3N9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luID0gb2Zmc2V0c1tpbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0RW5kID0gb2Zmc2V0c1tpbmRleCArIDFdO1xuICAgICAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXRFbmQgLSBvZmZzZXRCZWdpbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldEJlZ2luOyBpIDwgb2Zmc2V0RW5kOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBrbm5TaW1pbGFyaXRpZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VtID4gMC4wKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBvZmZzZXRCZWdpbjsgaSA8IG9mZnNldEVuZDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgICBrbm5TaW1pbGFyaXRpZXNbaV0gPSBrbm5TaW1pbGFyaXRpZXNbaV0gLyBzdW07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnaGFtbWluZyBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaW1taWxhcml0aWVzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NpbW1pbGFyaXRpZXMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZToga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc2ltbWlsYXJpdGllc0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQoa25uU2ltaWxhcml0aWVzKTtcbiAgICAgICAgc2ltbWlsYXJpdGllc0J1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ29mZnNldHMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogb2Zmc2V0cy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkob2Zmc2V0c0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQob2Zmc2V0cyk7XG4gICAgICAgIG9mZnNldHNCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHNpbW1pbGFyaXRpZXNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IG9mZnNldHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21tYW5kRW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2RlcigpO1xuICAgICAgICBjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3MoKTtcbiAgICAgICAgcGFzc0VuY29kZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICBwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZW5kKCk7XG4gICAgICAgIGNvbnN0IG91dFNpbWlsYXJpdHlCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IHNpbWlsYXJpdHkgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IGtublNpbWlsYXJpdGllcy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb21tYW5kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoc2ltbWlsYXJpdGllc0J1ZmZlciwgMCwgb3V0U2ltaWxhcml0eUJ1ZmZlciwgMCwga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kRW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICB5aWVsZCBvdXRTaW1pbGFyaXR5QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShvdXRTaW1pbGFyaXR5QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xuICAgICAgICBrbm5TaW1pbGFyaXRpZXMuc2V0KGFycmF5QnVmZmVyKTtcbiAgICAgICAgb3V0U2ltaWxhcml0eUJ1ZmZlci51bm1hcCgpO1xuICAgICAgICBzaW1taWxhcml0aWVzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgb2Zmc2V0c0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dFNpbWlsYXJpdHlCdWZmZXIuZGVzdHJveSgpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sd2lzZS1ub3JtYWxpemUuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIGluZmxhdGlvbiBvcGVyYXRvciBpbiBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbGF0ZShrbm5TaW1pbGFyaXRpZXMsIGZhY3RvciA9IDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtublNpbWlsYXJpdGllcy5sZW5ndGg7IGkrKylcbiAgICAgICAga25uU2ltaWxhcml0aWVzW2ldID0gTWF0aC5wb3coa25uU2ltaWxhcml0aWVzW2ldLCBmYWN0b3IpO1xufVxuZnVuY3Rpb24gZ2V0Um93SW5kZXhlcyhvZmZzZXRzKSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQzMkFycmF5KG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gb2Zmc2V0c1tpXTsgaiA8IG9mZnNldHNbaSArIDFdOyBqKyspXG4gICAgICAgICAgICByZXNbal0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbG9va2luZyBhdCBhbHJlYWR5IHplcm9lZCBvdXQgdmFsdWVzLCBhbmQgb25seSBsb29rcyBhdCBsaXZlIGNlbGxzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZE5vUmV2aXZlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBrbm5JbmRleGVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSA5MDAwMDtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIC8vIG1pbmltdW0gdmFsdWUgYWZ0ZXIgZXhwYW5zaW9uLlxuICAgICAgICBjb25zdCBwcnVuZVZhbHVlID0gTWF0aC5wb3coMTAsIC1vcmRlcik7XG4gICAgICAgIGNvbnN0IG91dEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoa25uU2ltaWxhcml0aWVzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBzdHJ1Y3QgU3BhcnNlS05OIHtcbiAgICAgICAgICAgIGtublNpbWlsYXJpdGllczogYXJyYXk8ZjMyLCAke2tublNpbWlsYXJpdGllcy5sZW5ndGh9PixcbiAgICAgICAgICAgIGtubkluZGV4ZXM6IGFycmF5PHUzMiwgJHtrbm5JbmRleGVzLmxlbmd0aH0+LFxuICAgICAgICAgICAgb2Zmc2V0czogYXJyYXk8dTMyLCAke29mZnNldHMubGVuZ3RofT4sXG4gICAgICAgICAgICByb3dJbmRleGVzOiBhcnJheTx1MzIsICR7a25uSW5kZXhlcy5sZW5ndGh9PixcbiAgICAgICAgfVxuXG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3BhcnNlS05OOiBTcGFyc2VLTk47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gcmVzdWx0U2ltQmxvY2s6IGFycmF5PGYzMiwgJHtuZWVkZWRUaHJlYWRzfT47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygyKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3RhcnRBdDogdTMyO1xuICAgICAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSwgJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSkgZm4gZXhwYW5kKFxuICAgICAgICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj4sXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY29sID0gaWQueDtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC55O1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcm93ICogJHt0aHJlYWRzUGVyRGltfSArIGNvbDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAke25lZWRlZFRocmVhZHN9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHdvcmtpbmdJbmRleCA9IGluZGV4ICsgc3RhcnRBdDtcbiAgICAgICAgICAgIGlmICh3b3JraW5nSW5kZXggPj0gJHtrbm5JbmRleGVzLmxlbmd0aH0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByb3dJZHggPSBzcGFyc2VLTk4ucm93SW5kZXhlc1t3b3JraW5nSW5kZXhdO1xuICAgICAgICAgICAgbGV0IGNvbElkeCA9IHNwYXJzZUtOTi5rbm5JbmRleGVzW3dvcmtpbmdJbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0QmVnaW5Sb3cgPSBzcGFyc2VLTk4ub2Zmc2V0c1tyb3dJZHhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEVuZFJvdyA9IHNwYXJzZUtOTi5vZmZzZXRzW3Jvd0lkeCArIDFdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luQ29sID0gc3BhcnNlS05OLm9mZnNldHNbY29sSWR4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbmRDb2wgPSBzcGFyc2VLTk4ub2Zmc2V0c1tjb2xJZHggKyAxXTtcbiAgICAgICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0QmVnaW5Sb3c7IGkgPCBvZmZzZXRFbmRSb3c7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IG9mZnNldEJlZ2luQ29sOyBqIDwgb2Zmc2V0RW5kQ29sOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJzZUtOTi5rbm5JbmRleGVzW2ldID09IHNwYXJzZUtOTi5rbm5JbmRleGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBzcGFyc2VLTk4ua25uU2ltaWxhcml0aWVzW2ldICogc3BhcnNlS05OLmtublNpbWlsYXJpdGllc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1bSA+ICR7cHJ1bmVWYWx1ZX0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRTaW1CbG9ja1tpbmRleF0gPSBzdW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFNpbUJsb2NrW2luZGV4XSA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdleHBhbmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSA9IGtublNpbWlsYXJpdGllcy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aCArIG9mZnNldHMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGg7XG4gICAgICAgIGxldCBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSA9IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSAqIDQ7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplICYgMTU7XG4gICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSArPSAxNiAtIHJlbWFpbmRlcjtcbiAgICAgICAgY29uc3Qgc3BhcnNlS05OQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NwYXJzZSBrbm4gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzcGFyc2VLTk5BcnJheUJ1ZmZlciA9IHNwYXJzZUtOTkJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgICAgICAvLyBzZXQgc2ltaWxhcml0aWVzXG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIDAsIGtublNpbWlsYXJpdGllcy5sZW5ndGgpLnNldChrbm5TaW1pbGFyaXRpZXMpO1xuICAgICAgICAvLyBzZXQgaW5kZXhlc1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIGtublNpbWlsYXJpdGllcy5sZW5ndGggKiA0LCBrbm5JbmRleGVzLmxlbmd0aCkuc2V0KGtubkluZGV4ZXMpO1xuICAgICAgICAvLyBzZXQgb2Zmc2V0c1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGgpICogNCwgb2Zmc2V0cy5sZW5ndGgpLnNldChvZmZzZXRzKTtcbiAgICAgICAgLy8gc2V0IHJvdyBpbmRleGVzXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBnZXRSb3dJbmRleGVzKG9mZnNldHMpO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGggKyBvZmZzZXRzLmxlbmd0aCkgKiA0LCByb3dJbmRleGVzLmxlbmd0aCkuc2V0KHJvd0luZGV4ZXMpO1xuICAgICAgICBzcGFyc2VLTk5CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3RhcnQgZW5kIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiA0LFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3RhcnRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KFswXSk7XG4gICAgICAgIHN0YXJ0QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEJsb2NrQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdCBibG9jayBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogbmVlZGVkVGhyZWFkcyAqIDQsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3BhcnNlS05OQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDEsIHJlc291cmNlOiB7IGJ1ZmZlcjogcmVzdWx0QmxvY2tCdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMiwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzdGFydEJ1ZmZlciB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3V0QmxvY2tCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IGJsb2NrIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiByZXN1bHRCbG9ja0J1ZmZlci5zaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1RcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKGtubkluZGV4ZXMubGVuZ3RoIC8gbmVlZGVkVGhyZWFkcyk7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogbmVlZGVkVGhyZWFkcztcbiAgICAgICAgICAgIGNvbnN0IGN1ckxlbmd0aCA9IE1hdGgubWluKG5lZWRlZFRocmVhZHMsIGtubkluZGV4ZXMubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0YXJ0QnVmZmVyLCAwLCBuZXcgVWludDMyQXJyYXkoW3N0YXJ0XSkpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQgZW5jb2RlcicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhc3MgPSBlbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3Moe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kIGNvbXB1dGUgcGFzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhc3Muc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICAgICAgcGFzcy5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgICAgIHBhc3MuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgICAgIHBhc3MuZW5kKCk7XG4gICAgICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihyZXN1bHRCbG9ja0J1ZmZlciwgMCwgb3V0QmxvY2tCdWZmZXIsIDAsIG91dEJsb2NrQnVmZmVyLnNpemUpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbZW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ29uU3VibWl0dGVkV29ya0RvbmUnKTtcbiAgICAgICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZUVuZCgnb25TdWJtaXR0ZWRXb3JrRG9uZScpO1xuICAgICAgICAgICAgeWllbGQgb3V0QmxvY2tCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgICAgIGNvbnN0IG91dEJsb2NrID0gbmV3IEZsb2F0MzJBcnJheShvdXRCbG9ja0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpLCAwLCBjdXJMZW5ndGgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ2ZpbGxvdXQnKTtcbiAgICAgICAgICAgIG91dEtOTlNpbWlsYXJpdGllcy5zZXQob3V0QmxvY2ssIHN0YXJ0KTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lRW5kKCdmaWxsb3V0Jyk7XG4gICAgICAgICAgICBvdXRCbG9ja0J1ZmZlci51bm1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3lcbiAgICAgICAgc3BhcnNlS05OQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgc3RhcnRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRCbG9ja0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dEJsb2NrQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHsgS05OSW5kZXhlczoga25uSW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRLTk5TaW1pbGFyaXRpZXMsIGluZGV4T2Zmc2V0czogb2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5mbGF0ZS1leHBhbmQuanMubWFwIiwiaW1wb3J0IHsgdG9PZmZzZXRGb3JtIH0gZnJvbSAnLi4vdW1hcC91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50MzJBcnJheShuUm93cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbc3BhcnNlTWF0cml4LmlbaV1dKys7XG4gICAgICAgIHJlc1tzcGFyc2VNYXRyaXgualtpXV0rKztcbiAgICB9XG4gICAgLy8gYWRkIGxvb3BzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKVxuICAgICAgICByZXNbaV0rKztcbiAgICByZXR1cm4gcmVzO1xufVxuLyoqXG4gKiBCRSBXQVJFLCB0aGlzIGZ1bmN0aW9uIGlzIG1lbnQgZm9yIGhhbGYgc3BhcnNlIG1hdHJpY2VzIG9ubHkhISFcbiAqIEBwYXJhbSBzcGFyc2VNYXRyaXhcbiAqIEBwYXJhbSBuUm93c1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0oc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IG9jY3VyZW5jZUNvdW50ID0gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgY29uc3Qgb2Zmc2V0Rm9ybSA9IHRvT2Zmc2V0Rm9ybShvY2N1cmVuY2VDb3VudCk7XG4gICAgY29uc3QgaW5zZXJ0Q291bnRlciA9IG5ldyBVaW50MzJBcnJheShuUm93cykuZmlsbCgxKTsgLy8gZm9yIGNvdW50aW5nIGhvdyBtYW55IHRoaW5ncyB3ZSBpbnNlcnRlZCBpbnRvIHRoZSBrbm4gYXJyYXlzLlxuICAgIC8vIHdlIGluaXRpYWxpemUgdGhlc2UgY291bnRlcnMgdG8gb25lIGJlY2F1c2UgZmlyc3Qgd2UgaW5zZXJ0IHRoZSBzZWxmIGxvb3BzXG4gICAgLy8gZG9udCBiZSBjb25mdXNlZCBieSB0aGUgbmFtZSBrbm4sIGsgaGVyZSBpcyB2YXJpYWJsZSwgaXRzIGp1c3QgdGhlIHRoaW5nIHRoYXQgaW4gdGhpcyBmb3JtLCB3ZSBrbm93IHRoYXQgYXQgaW5kZXggaVxuICAgIC8vIHdlIGhhdmUgc29tZSBrKHZhcmlhYmxlKSBhbW1vdW50IG9mIHNwYXJzZSBuZWlnYm91cnNcbiAgICAvLyB3ZSBrbm93IGZvciBhIGZhY3QgdGhhdCBzcGFyc2UgbWF0cml4IHdpbGwgbm90IGNvbnRhaW4gYW55IGR1cGxpY2F0ZXMsIHdlIGFkZCBuUm93cyB0byBhY2NvdW50IGZvciBzZWxmIGxvb3BzXG4gICAgY29uc3QgS05OSW5kZXhlcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICAgIGNvbnN0IEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmkubGVuZ3RoICogMiArIG5Sb3dzKTtcbiAgICAvLyBpbnNlcnQgc2VsZiBsb29wcyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBvZmZzZXRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW2ldXSA9IGk7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2ldXSA9IDE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgICAgIGNvbnN0IGNvbCA9IHNwYXJzZU1hdHJpeC5qW2ldO1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW3Jvd10gKyBpbnNlcnRDb3VudGVyW3Jvd11dID0gY29sO1xuICAgICAgICBLTk5TaW1pbGFyaXRpZXNbb2Zmc2V0Rm9ybVtyb3ddICsgaW5zZXJ0Q291bnRlcltyb3ddXSA9IHNpbWlsYXJpdHk7XG4gICAgICAgIGluc2VydENvdW50ZXJbcm93XSsrO1xuICAgICAgICBLTk5JbmRleGVzW29mZnNldEZvcm1bY29sXSArIGluc2VydENvdW50ZXJbY29sXV0gPSByb3c7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2NvbF0gKyBpbnNlcnRDb3VudGVyW2NvbF1dID0gc2ltaWxhcml0eTtcbiAgICAgICAgaW5zZXJ0Q291bnRlcltjb2xdKys7XG4gICAgfVxuICAgIHJldHVybiB7IEtOTkluZGV4ZXMsIEtOTlNpbWlsYXJpdGllcywgaW5kZXhPZmZzZXRzOiBvZmZzZXRGb3JtIH07XG59XG5leHBvcnQgZnVuY3Rpb24ga25uVG9TcGFyc2VGb3JtKGtubkluZGV4ZXMsIGtublNpbXMpIHtcbiAgICBjb25zdCBsZW5ndGhzID0ga25uSW5kZXhlcy5tYXAoKHgpID0+IHgubGVuZ3RoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbmd0aHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IHRvT2Zmc2V0Rm9ybShsZW5ndGhzKTtcbiAgICBjb25zdCBvdXRJbmRleGVzID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICBjb25zdCBvdXRTaW1zID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5JbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dEluZGV4ZXMuc2V0KGtubkluZGV4ZXNbaV0sIG9mZnNldHNbaV0pO1xuICAgICAgICBvdXRTaW1zLnNldChrbm5TaW1zW2ldLCBvZmZzZXRzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgS05OSW5kZXhlczogb3V0SW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRTaW1zLCBpbmRleE9mZnNldHM6IG9mZnNldHMgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgbGV2ZW5iZXJnTWFycXVhcmR0IH0gZnJvbSAnbWwtbGV2ZW5iZXJnLW1hcnF1YXJkdCc7XG5leHBvcnQgZnVuY3Rpb24gbGluZWFyKHgxLCB4Miwgbikge1xuICAgIGNvbnN0IHN0ZXAgPSAoeDIgLSB4MSkgLyAobiAtIDEpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB4MSArIHN0ZXAgKiBpKTtcbn1cbi8qKlxuICogRml0IGEsIGIgcGFyYW1zIGZvciB0aGUgZGlmZmVyZW50aWFibGUgY3VydmUgdXNlZCBpbiBsb3dlclxuICogZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBjb21wbGV4IGNvbnN0cnVjdGlvbi4gV2Ugd2FudCB0aGVcbiAqIHNtb290aCBjdXJ2ZSAoZnJvbSBhIHByZS1kZWZpbmVkIGZhbWlseSB3aXRoIHNpbXBsZSBncmFkaWVudCkgdGhhdFxuICogYmVzdCBtYXRjaGVzIGFuIG9mZnNldCBleHBvbmVudGlhbCBkZWNheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBQlBhcmFtcyhzcHJlYWQsIG1pbkRpc3QpIHtcbiAgICBjb25zdCBjdXJ2ZSA9IChbYSwgYl0pID0+ICh4KSA9PiB7XG4gICAgICAgIHJldHVybiAxLjAgLyAoMS4wICsgYSAqIE1hdGgucG93KHgsICgyICogYikpKTtcbiAgICB9O1xuICAgIGNvbnN0IHh2ID0gbGluZWFyKDAsIHNwcmVhZCAqIDMsIDMwMClcbiAgICAgICAgLm1hcCgodmFsKSA9PiAodmFsIDwgbWluRGlzdCA/IDEuMCA6IHZhbCkpO1xuICAgIGNvbnN0IHl2ID0gbmV3IEFycmF5KHh2Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZ3RlID0geHZbaW5kZXhdID49IG1pbkRpc3Q7XG4gICAgICAgIHJldHVybiBndGUgPyBNYXRoLmV4cCgtKHh2W2luZGV4XSAtIG1pbkRpc3QpIC8gc3ByZWFkKSA6IHZhbDtcbiAgICB9KTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gWzAuNSwgMC41XTtcbiAgICBjb25zdCBkYXRhID0geyB4OiB4diwgeTogeXYgfTtcbiAgICAvLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBhbGdvcml0aG0gKGZyb20gZ2l0aHViIGV4YW1wbGUpXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGFtcGluZzogMS41LFxuICAgICAgICBpbml0aWFsVmFsdWVzLFxuICAgICAgICBncmFkaWVudERpZmZlcmVuY2U6IDEwZS0yLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiAxMDAsXG4gICAgICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgY29uc3QgeyBwYXJhbWV0ZXJWYWx1ZXMgfSA9IGxldmVuYmVyZ01hcnF1YXJkdChkYXRhLCBjdXJ2ZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgW2EsIGJdID0gcGFyYW1ldGVyVmFsdWVzO1xuICAgIHJldHVybiB7IGEsIGIgfTtcbn1cbi8qKlxuICogaGV1cmlzdGljIGZvciBudW1iZXIgb2YgZXBvY2hzIG9mIHVtYXAsIGRpZmZlcnMgZnJvbSBjcHUgdmVyc2lvbiwgYmVjYXVzZSBvZiB0aGUgd2F5IGdwdSBwYXNzZXMgZGF0YVxuICogQHBhcmFtIGVudHJ5TGVuIG51bWJlciBvZiBlbnRyaWVzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TkVwb2NocyhlbnRyeUxlbikge1xuICAgIC8vXG4gICAgY29uc3QgbGVuZ3RoID0gZW50cnlMZW47XG4gICAgaWYgKGxlbmd0aCA8PSAyNTAwKVxuICAgICAgICByZXR1cm4gMTAwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNTAwMClcbiAgICAgICAgcmV0dXJuIDgwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNzUwMClcbiAgICAgICAgcmV0dXJuIDY1MDtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiA0MDA7XG59XG4vKiogIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgYXJyYXkgb2Ygc2l6ZXMgdG8gb2Zmc2V0IGZvcm0gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b09mZnNldEZvcm0oYXIpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDMyQXJyYXkoYXIubGVuZ3RoICsgMSk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCArPSBhcltpXTtcbiAgICB9XG4gICAgcmVzW2FyLmxlbmd0aF0gPSBvZmZzZXQ7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKiBtdWx0aXBsaWVzIGZsYXQgcmVwcmVzZW50YXRpb24gb2Ygc3BhcnNlIGtubiBpbmZvIGJ5IHNjYWxhci5cbiAqIGFsc28gbm8gcG9pbnQgb2YgZG9pbmcgdGhpcyBvbiBncHUsIGNhbiBiZSBkb25lIG9uIGNwdSBwcmV0dHkgcXVpY2tseS5cbiAqIGlmIHRoZXJlIHdpbGwgYmUgbmVlZCBmb3IgaXQsIGl0IGNhbiBiZSBkb25lIG9uIGdwdSBhcyB3ZWxsIHZlcnkgdmVyeSBlYXNpbHkuXG4gKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyBhcnJheVxuICogQHBhcmFtIHNjYWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIodmFsdWVzLCBzY2FsYXIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdmFsdWVzW2ldID0gdmFsdWVzW2ldICogc2NhbGFyO1xufVxuLyoqXG4gKiBnZW5lcmF0ZSB0cmFuc3Bvc2Ugb2Yga25uIGZyb20gdGhlIHRyYW5zcG9zaXRpb24gaW5mbyB0YWtlbiBmcm9tIHNwYXJzZSBrbm4gaW5mb1xuICogdXNpbmcgdGhpcyBpbmZvcm1hdGlvbiBhdm9pZHMgYmlsbGlvbnMgb2YgYXJyYXkucHVzaCBjYWxscywgaXMgbXVjaCBjbGVhbmVyLCBhbGxvd3MgdHlwZWQgYXJyYXkgdXNlIGFuZCBpcyBmYXN0ZXIuXG4gKiBubyBwb2ludCBvZiBkb2luZyB0aGlzIG9uIGdwdSwgY2FuIGJlIGRvbmUgb24gY3B1IGFzIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGluZm8gbmVlZGVkLlxuICogQHBhcmFtIGtubkluZGV4ZXNcbiAqIEBwYXJhbSBrbm5EaXN0YW5jZXNcbiAqIEBwYXJhbSBrbm5TcGFyc2VJbmZvXG4gKiBAcGFyYW0ga25uU2l6ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUtOTihrbm5JbmRleGVzLCBrbm5EaXN0YW5jZXMsIGtublNwYXJzZUluZm8sIGtublNpemUgPSAxNSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG51bU9mRW50cmllcyA9IGtubkluZGV4ZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxsS25uRW50cnlTaXplID0ga25uU2l6ZSAqIG51bU9mRW50cmllcztcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlU2l6ZXMgPSBrbm5TcGFyc2VJbmZvLnJlc3VsdFRyYW5zcG9zZVNpemVzQXJyYXk7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZU9mZnNldHMgPSB0b09mZnNldEZvcm0odHJhbnNwb3NlU2l6ZXMpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQ29weSA9IG5ldyBVaW50MzJBcnJheSh0cmFuc3Bvc2VPZmZzZXRzLmxlbmd0aCk7XG4gICAgICAgIG9mZnNldHNDb3B5LnNldCh0cmFuc3Bvc2VPZmZzZXRzKTsgLy8gd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljIGluZGV4aW5nXG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZUtOTkluZGV4ZXMgPSBuZXcgSW50MzJBcnJheShmdWxsS25uRW50cnlTaXplKS5maWxsKDApO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VLTk5EaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxLbm5FbnRyeVNpemUpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZFbnRyaWVzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga25uU2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleCA9IGtubkluZGV4ZXNbaV1bal07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleE9mZnNldCA9IG9mZnNldHNDb3B5W290aGVySW5kZXhdO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkluZGV4ZXNbb3RoZXJJbmRleE9mZnNldF0gPSBpO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkRpc3RhbmNlc1tvdGhlckluZGV4T2Zmc2V0XSA9IGtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgICAgICBvZmZzZXRzQ29weVtvdGhlckluZGV4XSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRyYW5zcG9zZUtOTkluZGV4ZXMsIHRyYW5zcG9zZUtOTkRpc3RhbmNlcywgdHJhbnNwb3NlT2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGFuIEFycmF5IChhcnJheSBvciB0eXBlZCBhcnJheSwgZXhjZXB0IHRob3NlIHRoYXQgY29udGFpbiBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBPYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXkgb3IgYSB0eXBlZCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQW55QXJyYXkodmFsdWUpIHtcbiAgICBjb25zdCB0YWcgPSB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICByZXR1cm4gdGFnLmVuZHNXaXRoKCdBcnJheV0nKSAmJiAhdGFnLmluY2x1ZGVzKCdCaWcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGJpb0xheW91dCB9IGZyb20gJy4vYmlvLWxheW91dCc7XG5pbXBvcnQgeyBtYXJrb3ZDbHVzdGVyV2ViR1BVIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRNQ0xPcHRpb25zID0ge1xuICAgIGV4cGFuZEZhY3RvcjogMixcbiAgICBtYXhJdGVyYXRpb25zOiA1LFxuICAgIGluZmxhdGVGYWN0b3I6IDIsXG4gICAgbXVsdEZhY3RvcjogMSxcbn07XG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7IC4uLmRlZmF1bHRNQ0xPcHRpb25zLCAuLi5vcHRzIH07XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIC8vIHRlc3RXb3JrZXJNdWx0aXBseSgpO1xuICAgICAgICAvLyByZXR1cm4gbmV3IEludDMyQXJyYXkoblJvd3MpO1xuICAgICAgICBsZXQgc3BhcnNlT2JqZWN0ID0gdGhpcy50b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdCA9IHRoaXMuZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5mbGF0ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjbHVzdGVycywgaXMsIGpzIH0gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhjbHVzdGVycyk7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBlbWJlZFg6IGVtYmVkZGluZ3MuZW1iZWRYLCBlbWJlZFk6IGVtYmVkZGluZ3MuZW1iZWRZLCBpcywganMgfTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgICAgY29uc3QgbWNsUmVzID0gYXdhaXQgbWFya292Q2x1c3RlcldlYkdQVShzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMsIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHRoaXMuY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cyk7XG4gICAgICAgIGNvbnN0IHsgY2x1c3RlcnMsIGlzLCBqcyB9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgdGhpcy5sYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzIH07XG4gICAgfVxuICAgIGNvcnJlY3RDbHVzdGVycyhjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0gPSAwO1xuICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0rKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2JdIC0gY2x1c3RlclNpemVNYXBbYV0pO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIHNvcnRlZEluZGV4ZXMuZm9yRWFjaCgoY2x1c3RlcklkeCwgaSkgPT4gY2x1c3Rlck1hcFtjbHVzdGVySWR4XSA9IGkgKyAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0pIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGN1ckNsdXN0ZXIrKztcbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cykge1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gMSAvIE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8IG1pbk9yZGVyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBtY2xSZXMuS05OU2ltaWxhcml0aWVzW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gICAgfVxuICAgIGFzeW5jIGxheW91dChjbHVzdGVycywgc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIGNsdXN0ZXJzLmZvckVhY2goKGNsdXN0ZXIsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyXSlcbiAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdID0gW107XG4gICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zdCBuQ2x1c3RlcnMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKS5sZW5ndGg7XG4gICAgICAgIC8vIGNvbnN0IHBlclJvdyA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG5DbHVzdGVycykpO1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IHNvcnRlZENsdXN0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApO1xuICAgICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiXS5sZW5ndGggLSBjbHVzdGVyTWFwW2FdLmxlbmd0aCk7XG4gICAgICAgIGxldCBwZXJSb3cgPSA2O1xuICAgICAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJOYW1lIG9mIHNvcnRlZENsdXN0ZXJOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWVdO1xuICAgICAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxKTtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyTnVtID09PSBNYXRoLmNlaWwocGVyUm93IC8gMS41KSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICAgICAgICBwZXJSb3cgPSBNYXRoLmNlaWwocGVyUm93ICogMS41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0gJSBwZXJSb3cpICogbGF5b3V0U2l6ZSAvIHBlclJvdykgKiAxLjU7XG4gICAgICAgICAgICAvLyBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihjbHVzdGVyTnVtIC8gcGVyUm93KSAqIDI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYmVkZGluZ3MuZW1iZWRYLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRYW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFhbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgb2Zmc2V0WDtcbiAgICAgICAgICAgICAgICBlbWJlZFlbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWVtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgKyB5T2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVtYmVkWCwgZW1iZWRZIH07XG4gICAgfVxuICAgIG1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopIHtcbiAgICAgICAgY29uc3QgaUNsdXN0ZXIgPSBjbHVzdGVyc1tpXTtcbiAgICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjbHVzdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBpcyA9IFtdO1xuICAgICAgICBjb25zdCBqcyA9IFtdO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeFtpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChzcGFyc2VNYXRyaXhbaV1bal0gKiBtaW5PcmRlcikgLyBtaW5PcmRlciA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgc3BhcnNlTWF0cml4W2ldW2pdICE9PSBOdW1iZXIoaSkgJiYgTnVtYmVyKGopID4gTnVtYmVyKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzLnB1c2goTnVtYmVyKGkpKTtcbiAgICAgICAgICAgICAgICAgICAganMucHVzaChOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEgJiYgY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSBjbHVzdGVyc1tOdW1iZXIoaildKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgTnVtYmVyKGkpLCBOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaildID0gY2x1c3RlcnNbTnVtYmVyKGkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJzW051bWJlcihqKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcykgfTtcbiAgICB9XG4gICAgLyoqIHNhbWUgYXMgYXNzaWduIGNsdXN0ZXJzIGJ1dCB3b3JraW5nIG9uIHRoZSBsZXZlbCBvZiBDU1IgZm9ybWF0IHJldHVybmVkIGZyb20gd2ViR1BVICovXG4gICAgYXNzaWduQ2x1c3RlcnNDU1IobWNsUmVzLCBuUm93cykge1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IGlzID0gW107XG4gICAgICAgIGNvbnN0IGpzID0gW107XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBjb25zdCBjb3JyZWN0ZWRPZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KG5Sb3dzICsgMSk7XG4gICAgICAgIGxldCBvZmZzZXRDb3VudGVyID0gMDtcbiAgICAgICAgY29ycmVjdGVkT2Zmc2V0c1swXSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8PSBtaW5PcmRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICAgICAgICAgIG9mZnNldENvdW50ZXIrKztcbiAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IGNsdXN0ZXJzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbaV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJzW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3JyZWN0ZWRPZmZzZXRzW2kgKyAxXSA9IG9mZnNldENvdW50ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKSwgY29ycmVjdGVkT2Zmc2V0cyB9O1xuICAgIH1cbiAgICB0b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KSB7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV1bc3BhcnNlTWF0cml4LmlbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9ybWFsaXplKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzdW0gKz0gcm93W2pdO1xuICAgICAgICAgICAgaWYgKHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXVtqXSAvPSBzdW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRPYmplY3QgPSB7fTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXSA/PyAoZXhwYW5kZWRPYmplY3RbaV0gPSB7fSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5Sb3dzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXT8uW2pdKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaik7IC8vcHJ1bmluZyBzdGVwXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldW2pdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGFuZGVkT2JqZWN0W2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBhbmRlZE9iamVjdDtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBwcnVuZShyb3c6IFNwYXJzZU1hdHJpeE9iamVjdFtudW1iZXJdKSB7XG4gICAgLy8gfVxuICAgIGluZmxhdGUoc3BhcnNlT2JqZWN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBNYXRoLnBvdyhzcGFyc2VPYmplY3RbaV1bal0sIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKSB7XG4gICAgICAgIGxldCB2YWwgPSAwO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtpXSA/PyB7fSk7XG4gICAgICAgIGNvbnN0IG90aGVySW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtqXSA/PyB7fSk7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBjdXJyZW50SW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKG90aGVySW5kZXhlcy5pbmNsdWRlcyhrKSlcbiAgICAgICAgICAgICAgICB2YWwgKz0gc3BhcnNlT2JqZWN0W2ldW2tdICogc3BhcnNlT2JqZWN0W2pdW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldGeVkyOTJMV05zZFhOMFpYSXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKdFlYSmpiM1l0WTJ4MWMzUmxjaTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGRFFTeFBRVUZQTEVWQlFVTXNVMEZCVXl4RlFVRkRMRTFCUVUwc1kwRkJZeXhEUVVGRE8wRkJSM1pETEU5QlFVOHNSVUZCUXl4dFFrRkJiVUlzUlVGQlF5eE5RVUZOTEc5RVFVRnZSQ3hEUVVGRE8wRkJRM1pHTEUxQlFVMHNRMEZCUXl4TlFVRk5MR2xDUVVGcFFpeEhRVUZsTzBsQlF6TkRMRmxCUVZrc1JVRkJSU3hEUVVGRE8wbEJRMllzWVVGQllTeEZRVUZGTEVOQlFVTTdTVUZEYUVJc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNWVUZCVlN4RlFVRkZMRU5CUVVNN1EwRkRaQ3hEUVVGRE8wRkJSVVlzVFVGQlRTeFBRVUZQTEdkQ1FVRm5RanRKUVVjelFpeFpRVUZaTEU5QlFUUkNMRVZCUVVVN1VVRkRlRU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4RlFVRkRMRWRCUVVjc2FVSkJRV2xDTEVWQlFVVXNSMEZCUnl4SlFVRkpMRVZCUVVNc1EwRkJRenRKUVVOc1JDeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMRk5CUVZNc1EwRkJReXhaUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZEY0VVc2QwSkJRWGRDTzFGQlEzaENMR2REUVVGblF6dFJRVU5vUXl4SlFVRkpMRmxCUVZrc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUTI1RUxFbEJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU03V1VGRGNFTXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhaUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdXVUZEYmtNc1NVRkJTU3hEUVVGRExGTkJRVk1zUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0WlFVTTNRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRuUWtGRGNrUXNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMmRDUVVOb1JDeEpRVUZKTEVOQlFVTXNUMEZCVHl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8yZENRVU16UWl4SlFVRkpMRU5CUVVNc1UwRkJVeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFsQlF5OUNMRU5CUVVNN1VVRkRTQ3hEUVVGRE8xRkJRMFFzVFVGQlRTeEZRVUZETEZGQlFWRXNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRGNFVXNTVUZCU1N4RFFVRkRMR1ZCUVdVc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dFJRVU12UWl4TlFVRk5MRlZCUVZVc1IwRkJSeXhOUVVGTkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RlFVRkZMRmxCUVZrc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU53UlN4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRkxFMUJRVTBzUlVGQlJTeFZRVUZWTEVOQlFVTXNUVUZCVFN4RlFVRkZMRTFCUVUwc1JVRkJSU3hWUVVGVkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVWQlFVVXNSVUZCUlN4RlFVRkZMRVZCUVVNc1EwRkJRenRKUVVOc1JpeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMR1ZCUVdVc1EwRkJReXhaUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZETVVVc1NVRkJTU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEdGQlFXRXNTMEZCU3l4RFFVRkRPMWxCUTI1RExFOUJRVThzU1VGQlNTeERRVUZETEZOQlFWTXNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRk4wTXNUVUZCVFN4TlFVRk5MRWRCUVVjc1RVRkJUU3h0UWtGQmJVSXNRMEZEZEVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1JVRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEdGQlFXRXNRMEZET1VVc1EwRkJRenRSUVVOR0xFMUJRVTBzV1VGQldTeEhRVUZITEVsQlFVa3NRMEZCUXl4cFFrRkJhVUlzUTBGQlF5eE5RVUZOTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRNMFFzVFVGQlRTeEZRVUZETEZGQlFWRXNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRGNFVXNTVUZCU1N4RFFVRkRMR1ZCUVdVc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF6dFJRVU12UWl4TlFVRk5MRlZCUVZVc1IwRkJSeXhOUVVGTkxFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCVVN4RlFVRkZMRmxCUVZrc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU53UlN4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRkxFMUJRVTBzUlVGQlJTeFZRVUZWTEVOQlFVTXNUVUZCVFN4RlFVRkZMRTFCUVUwc1JVRkJSU3hWUVVGVkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVWQlFVVXNSVUZCUlN4RlFVRkZMRVZCUVVNc1EwRkJRenRKUVVOc1JpeERRVUZETzBsQlJVOHNaVUZCWlN4RFFVRkRMRkZCUVd0Q08xRkJRM2hETEUxQlFVMHNZMEZCWXl4SFFVRXdRaXhGUVVGRkxFTkJRVU03VVVGRGFrUXNTMEZCU3l4TlFVRk5MRTlCUVU4c1NVRkJTU3hSUVVGUkxFVkJRVVVzUTBGQlF6dFpRVU12UWl4SlFVRkpMRU5CUVVNc1kwRkJZeXhEUVVGRExFOUJRVThzUTBGQlF6dG5Ra0ZETVVJc1kwRkJZeXhEUVVGRExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTTVRaXhqUVVGakxFTkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVXNRMEZCUXp0UlFVTTFRaXhEUVVGRE8xRkJRMFFzVFVGQlRTeGhRVUZoTEVkQlFVY3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0JJTEUxQlFVMHNWVUZCVlN4SFFVRXdRaXhGUVVGRkxFTkJRVU03VVVGRE4wTXNZVUZCWVN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExGVkJRVlVzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRlZCUVZVc1EwRkJReXhWUVVGVkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla1VzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZPMWxCUTNSRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEZUVNc2MwSkJRWE5DTzFGQlEzUkNMRGhEUVVFNFF6dFJRVU01UXl4dlEwRkJiME03VVVGRGNFTXNORU5CUVRSRE8xRkJRelZETEdkRFFVRm5RenRSUVVOb1F5eHZRa0ZCYjBJN1VVRkRjRUlzWVVGQllUdFJRVU5pTERaRFFVRTJRenRSUVVNM1F5eE5RVUZOTzFGQlEwNHNTVUZCU1R0SlFVTk9MRU5CUVVNN1NVRkZUeXhwUWtGQmFVSXNRMEZCUXl4TlFVRjFRaXhGUVVGRkxFdEJRV0U3VVVGRE9VUXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUzBGQlN5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRE4wUXNUVUZCVFN4UlFVRlJMRWRCUVVjc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xRkJRM3BETEUxQlFVMHNXVUZCV1N4SFFVRjFRaXhGUVVGRkxFTkJRVU03VVVGRE5VTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEV0QlFVc3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRE8xbEJReTlDTEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGNrSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETzJkQ1FVTjZSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU12UWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUk8yOUNRVU5vUkN4VFFVRlRPMmRDUVVOWUxGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJwRUxFTkJRVU03VVVGRFNDeERRVUZETzFGQlEwUXNUMEZCVHl4WlFVRlpMRU5CUVVNN1NVRkRkRUlzUTBGQlF6dEpRVVZQTEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJhMElzUlVGQlJTeFpRVUZuUXl4RlFVRkZMRXRCUVdFN1VVRkRkRVlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXk5RExFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTXZReXhOUVVGTkxGVkJRVlVzUjBGQk5FSXNSVUZCUlN4RFFVRkRPMUZCUXk5RExGRkJRVkVzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU03WjBKQlEzUkNMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZETTBJc1ZVRkJWU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVNNVFpeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTklMRzlFUVVGdlJEdFJRVU53UkN4dFJFRkJiVVE3VVVGRGJrUXNTVUZCU1N4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRMjVDTEUxQlFVMHNhMEpCUVd0Q0xFZEJRVWNzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRSUVVOdVJDeHJRa0ZCYTBJc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRlZCUVZVc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0UlFVTTNSaXhKUVVGSkxFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZGWml4SlFVRkpMRTlCUVU4c1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRGFFSXNUVUZCVFN4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM0pDTEV0QlFVc3NUVUZCVFN4WFFVRlhMRWxCUVVrc2EwSkJRV3RDTEVWQlFVVXNRMEZCUXp0WlFVTTNReXhOUVVGTkxFOUJRVThzUjBGQlJ5eFZRVUZWTEVOQlFVTXNWMEZCYTBJc1EwRkJSU3hEUVVGRE8xbEJRMmhFTEUxQlFVMHNWVUZCVlN4SFFVRkhMRTFCUVUwc1UwRkJVeXhEUVVGRExFOUJRVThzUlVGQlJTeFpRVUZaTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1dVRkRha1VzU1VGQlNTeFZRVUZWTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFZEJRVWNzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXp0blFrRkRNME1zVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0blFrRkRaaXhQUVVGUExFbEJRVWtzVlVGQlZTeEhRVUZITEUxQlFVMHNRMEZCUXp0blFrRkRMMElzVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEyNURMRU5CUVVNN1dVRkRSQ3hOUVVGTkxFOUJRVThzUjBGQlJ5eERRVUZETEVOQlFVTXNWVUZCVlN4SFFVRkhMRTFCUVUwc1EwRkJReXhIUVVGSExGVkJRVlVzUjBGQlJ5eE5RVUZOTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNN1dVRkRjRVVzZFVSQlFYVkVPMWxCUlhaRUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRE8yZENRVU5zUkN4TlFVRk5MRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVkQlFVY3NUVUZCVFN4SFFVRkhMRTlCUVU4c1EwRkJRenRuUWtGRE1VVXNUVUZCVFN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVlVGQlZTeEhRVUZITEUxQlFVMHNSMEZCUnl4UFFVRlBMRU5CUVVNN1dVRkROVVVzUTBGQlF6dFpRVU5FTEZWQlFWVXNSVUZCUlN4RFFVRkRPMUZCUTJZc1EwRkJRenRSUVVORUxFOUJRVThzUlVGQlF5eE5RVUZOTEVWQlFVVXNUVUZCVFN4RlFVRkRMRU5CUVVNN1NVRkRNVUlzUTBGQlF6dEpRVVZQTEdGQlFXRXNRMEZCUXl4UlFVRnJRaXhGUVVGRkxFTkJRVk1zUlVGQlJTeERRVUZUTzFGQlF6VkVMRTFCUVUwc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTNRaXhOUVVGTkxGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkROMElzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRaUVVONlF5eEpRVUZKTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhSUVVGUk8yZENRVU14UWl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETzFGQlF6TkNMRU5CUVVNN1NVRkRTQ3hEUVVGRE8wbEJRMDBzWTBGQll5eERRVUZETEZsQlFXZERMRVZCUVVVc1MwRkJZVHRSUVVOdVJTeEpRVUZKTEZWQlFWVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRia0lzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMUZCUTNoQ0xFMUJRVTBzUlVGQlJTeEhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTjRRaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTNSQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU55UXl4TlFVRk5MRkZCUVZFc1IwRkJZU3hKUVVGSkxFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU55UkN4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVc1EwRkJRenRaUVVNeFF5eExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJRenRuUWtGRGNFUXNTVUZCU1N4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVkQlFVY3NRMEZCUXp0dlFrRkRlRVVzV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhMUVVGTExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNN2IwSkJRekZGTEVWQlFVVXNRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdiMEpCUTI1Q0xFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEyNUNMRWxCUVVrc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETzNkQ1FVTTNSQ3hKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPelJDUVVNM1F5eEpRVUZKTEVOQlFVTXNZVUZCWVN4RFFVRkRMRkZCUVZFc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEzWkVMRU5CUVVNN2VVSkJRVTBzU1VGQlNTeFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXp0M1FrRkRkRU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRE5VTXNRMEZCUXp0NVFrRkJUU3hKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETzNkQ1FVTjBReXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMjlDUVVNMVF5eERRVUZETzNsQ1FVRk5MRU5CUVVNN2QwSkJRMDRzVlVGQlZTeEZRVUZGTEVOQlFVTTdkMEpCUTJJc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1EwRkJRenQzUWtGRGFrTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNRMEZCUXp0dlFrRkRia01zUTBGQlF6dG5Ra0ZEU0N4RFFVRkRPMWxCUTBnc1EwRkJRenRSUVVOSUxFTkJRVU03VVVGRFJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRE8xbEJRM1pETEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTTdaMEpCUTNaQ0xGVkJRVlVzUlVGQlJ5eERRVUZETzJkQ1FVTmtMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdXVUZETTBJc1EwRkJRenRSUVVOSUxFTkJRVU03VVVGRFJDeFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1NVRkJTU3hYUVVGWExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVTXNRMEZCUXp0SlFVTjBSU3hEUVVGRE8wbEJSVVFzTUVaQlFUQkdPMGxCUTJ4R0xHbENRVUZwUWl4RFFVRkRMRTFCUVhWQ0xFVkJRVVVzUzBGQllUdFJRVU01UkN4SlFVRkpMRlZCUVZVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRGJrSXNUVUZCVFN4RlFVRkZMRWRCUVdFc1JVRkJSU3hEUVVGRE8xRkJRM2hDTEUxQlFVMHNSVUZCUlN4SFFVRmhMRVZCUVVVc1EwRkJRenRSUVVONFFpeE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNM1JDeE5RVUZOTEZGQlFWRXNSMEZCUnl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRla01zVFVGQlRTeFJRVUZSTEVkQlFXRXNTVUZCU1N4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRja1FzVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhKUVVGSkxGZEJRVmNzUTBGQlF5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRjRVFzU1VGQlNTeGhRVUZoTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTNSQ0xHZENRVUZuUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU40UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NTMEZCU3l4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU03V1VGREwwSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETzJkQ1FVTjZSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU12UWl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hSUVVGUk8yOUNRVU5xUkN4VFFVRlRPMmRDUVVOWUxFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRMWdzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRFdDeGhRVUZoTEVWQlFVVXNRMEZCUXp0blFrRkRhRUlzU1VGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU03YjBKQlF6ZERMRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNN2QwSkJRemRDTEVsQlFVa3NRMEZCUXl4aFFVRmhMRU5CUVVNc1VVRkJVU3hGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRka01zUTBGQlF6dHhRa0ZCVFN4SlFVRkpMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRPMjlDUVVNNVFpeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTTFRaXhEUVVGRE8zRkNRVUZOTEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTTdiMEpCUXpsQ0xGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlF6VkNMRU5CUVVNN2NVSkJRVTBzUTBGQlF6dHZRa0ZEVGl4VlFVRlZMRVZCUVVVc1EwRkJRenR2UWtGRFlpeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRE8yOUNRVU42UWl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETzJkQ1FVTXpRaXhEUVVGRE8xbEJRMGdzUTBGQlF6dFpRVU5FTEdkQ1FVRm5RaXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4aFFVRmhMRU5CUVVNN1VVRkRNVU1zUTBGQlF6dFJRVU5FTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU03V1VGRGRrTXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXp0blFrRkRka0lzVlVGQlZTeEZRVUZITEVOQlFVTTdaMEpCUTJRc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNRMEZCUXp0WlFVTXpRaXhEUVVGRE8xRkJRMGdzUTBGQlF6dFJRVU5FTEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFbEJRVWtzVjBGQlZ5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4blFrRkJaMElzUlVGQlF5eERRVUZETzBsQlEzaEdMRU5CUVVNN1NVRkZUU3haUVVGWkxFTkJRVU1zV1VGQlowTTdVVUZEYkVRc1RVRkJUU3haUVVGWkxFZEJRWGxETEVWQlFVVXNRMEZCUXp0UlFVTTVSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRaUVVNdlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTJ4RExGbEJRVmtzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzFsQlEzWkRMRmxCUVZrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhaUVVGWkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJ4R0xFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGRrTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRmxCUVZrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VZc1EwRkJRenRSUVVORUxFOUJRVThzV1VGQldTeERRVUZETzBsQlEzUkNMRU5CUVVNN1NVRkZUeXhSUVVGUkxFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUXpsRUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhMUVVGTExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXp0WlFVTXZRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRiRUlzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOMlFpeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4VlFVRlZMRU5CUVVNN1VVRkRhRVFzUTBGQlF6dEpRVU5JTEVOQlFVTTdTVUZGVHl4VFFVRlRMRU5CUVVNc1dVRkJaME03VVVGRGFFUXNTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4RlFVRkZMRU5CUVVNN1dVRkRNVU1zVFVGQlRTeEhRVUZITEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRE8xbEJRMjVETEVsQlFVa3NSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJRenRaUVVOYUxFdEJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03WjBKQlF6bENMRWRCUVVjc1NVRkJTU3hIUVVGSExFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTTdXVUZEZGtJc1NVRkJTU3hIUVVGSExFdEJRVXNzUTBGQlF6dG5Ra0ZCUlN4VFFVRlRPMWxCUTNoQ0xFdEJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03WjBKQlF6bENMRmxCUVZrc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZSTEVOQlFVTXNTVUZCU1N4SFFVRkhMRU5CUVVNN1VVRkROVU1zUTBGQlF6dEpRVU5JTEVOQlFVTTdTVUZGVHl4TlFVRk5MRU5CUVVNc1dVRkJaME1zUlVGQlJTeExRVUZoTzFGQlF6VkVMRTFCUVUwc1kwRkJZeXhIUVVGMVFpeEZRVUZGTEVOQlFVTTdVVUZET1VNc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZETjBRc1RVRkJUU3hSUVVGUkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRGNrTXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEV0QlFVc3NSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRE8xbEJReTlDTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRE8yZENRVU5zUWl4VFFVRlRPMWxCUTFnc0swSkJRU3RDTzFsQlF5OUNMR05CUVdNc1EwRkJReXhEUVVGRExFMUJRV2hDTEdOQlFXTXNRMEZCUXl4RFFVRkRMRWxCUVUwc1JVRkJSU3hGUVVGRE8xbEJRM3BDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eExRVUZMTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJRenRuUWtGREwwSXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXp0dlFrRkRka0lzVTBGQlV6dG5Ra0ZEV0N4TlFVRk5MRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zWTBGQll5eERRVUZETEZsQlFWa3NSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eGpRVUZqTzJkQ1FVTnVSU3hKUVVGSkxFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNSMEZCUnl4SFFVRkhMRkZCUVZFc1EwRkJReXhIUVVGSExGRkJRVkVzUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXp0dlFrRkRPVU1zWTBGQll5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF6dHZRa0ZETTBJc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTTdkMEpCUTNCQ0xHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN2IwSkJRM3BDTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdaMEpCUXpkQ0xFTkJRVU03V1VGRFNDeERRVUZETzFGQlEwZ3NRMEZCUXp0UlFVTkVMRTlCUVU4c1kwRkJZeXhEUVVGRE8wbEJRM2hDTEVOQlFVTTdTVUZGUkN4dFJFRkJiVVE3U1VGRmJrUXNTVUZCU1R0SlFVVkpMRTlCUVU4c1EwRkJReXhaUVVGblF6dFJRVU01UXl4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVc1EwRkJRenRaUVVNeFF5eE5RVUZOTEVkQlFVY3NSMEZCUnl4WlFVRlpMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU03V1VGRGJrTXNTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXp0blFrRkRPVUlzV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFTkJRVkVzUTBGQlF5eEZRVUZGTEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1lVRkJZU3hEUVVGRExFTkJRVU03VVVGREwwY3NRMEZCUXp0SlFVTklMRU5CUVVNN1NVRkZUeXhqUVVGakxFTkJRVU1zV1VGQlowTXNSVUZCUlN4RFFVRk5MRVZCUVVVc1EwRkJUVHRSUVVOeVJTeEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRXaXhOUVVGTkxHTkJRV01zUjBGQlJ5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTXNRMEZCUXp0UlFVTXhSQ3hOUVVGTkxGbEJRVmtzUjBGQlJ5eE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeEZRVUZGTEVOQlFVTXNRMEZCUXp0UlFVTjRSQ3hMUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEdOQlFXTXNSVUZCUlN4RFFVRkRPMWxCUXk5Q0xFbEJRVWtzV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRekZDTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlVTeERRVUZETEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETzFGQlEycEZMRU5CUVVNN1VVRkRSQ3hQUVVGUExFZEJRVWNzUTBGQlF6dEpRVU5pTEVOQlFVTTdRMEZEUmlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1UzQmhjbk5sVFdGMGNtbDRVbVZ6ZFd4MGZTQm1jbTl0SUNjdUxpOWthWE4wWVc1alpTMXRZWFJ5YVhndmMzQmhjbk5sTFcxaGRISnBlQzF6WlhKMmFXTmxKenRjYm1sdGNHOXlkQ0I3WW1sdlRHRjViM1YwZlNCbWNtOXRJQ2N1TDJKcGJ5MXNZWGx2ZFhRbk8xeHVhVzF3YjNKMElIdE5RMHhQY0hScGIyNXpMQ0JUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1I5SUdaeWIyMGdKeTR2ZEhsd1pYTW5PMXh1YVcxd2IzSjBJSHROUTB4UGNGSmxkSFZ5YmxSNWNHVjlJR1p5YjIwZ0owQmtZWFJoWjNKdmF5MXNhV0p5WVhKcFpYTXZiV0YwYUM5emNtTXZkMlZpUjFCVkwwMURUQzkwZVhCbGN5YzdYRzVwYlhCdmNuUWdlMjFoY210dmRrTnNkWE4wWlhKWFpXSkhVRlY5SUdaeWIyMGdKMEJrWVhSaFozSnZheTFzYVdKeVlYSnBaWE12YldGMGFDOXpjbU12ZDJWaVIxQlZMMDFEVEM5TlEwd3RkMlZpUjFCVkp6dGNibVY0Y0c5eWRDQmpiMjV6ZENCa1pXWmhkV3gwVFVOTVQzQjBhVzl1Y3pvZ1RVTk1UM0IwYVc5dWN5QTlJSHRjYmlBZ1pYaHdZVzVrUm1GamRHOXlPaUF5TEZ4dUlDQnRZWGhKZEdWeVlYUnBiMjV6T2lBMUxGeHVJQ0JwYm1ac1lYUmxSbUZqZEc5eU9pQXlMRnh1SUNCdGRXeDBSbUZqZEc5eU9pQXhMRnh1ZlR0Y2JseHVaWGh3YjNKMElHTnNZWE56SUUxRFRGTndZWEp6WlZKbFpIVmpaWElnZTF4dUlDQndjbWwyWVhSbElGOXZjSFJwYjI1ek9pQk5RMHhQY0hScGIyNXpPMXh1WEc0Z0lHTnZibk4wY25WamRHOXlLRzl3ZEhNNklGQmhjblJwWVd3OFRVTk1UM0IwYVc5dWN6NGdQU0I3ZlNrZ2UxeHVJQ0FnSUhSb2FYTXVYMjl3ZEdsdmJuTWdQU0I3TGk0dVpHVm1ZWFZzZEUxRFRFOXdkR2x2Ym5Nc0lDNHVMbTl3ZEhOOU8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHRnplVzVqSUhSeVlXNXpabTl5YlNoemNHRnljMlZOWVhSeWFYZzZJRk53WVhKelpVMWhkSEpwZUZKbGMzVnNkQ3dnYmxKdmQzTTZJRzUxYldKbGNpa2dlMXh1SUNBZ0lDOHZJSFJsYzNSWGIzSnJaWEpOZFd4MGFYQnNlU2dwTzF4dUlDQWdJQzh2SUhKbGRIVnliaUJ1WlhjZ1NXNTBNekpCY25KaGVTaHVVbTkzY3lrN1hHNGdJQ0FnYkdWMElITndZWEp6WlU5aWFtVmpkQ0E5SUhSb2FYTXVkRzlQWW1wbFkzUkdiM0p0S0hOd1lYSnpaVTFoZEhKcGVDazdYRzRnSUNBZ2FXWWdLSFJvYVhNdVgyOXdkR2x2Ym5NdWJXRjRTWFJsY21GMGFXOXVjeUErSURBcElIdGNiaUFnSUNBZ0lIUm9hWE11WVdSa1RHOXZjSE1vYzNCaGNuTmxUMkpxWldOMExDQnVVbTkzY3lrN1hHNGdJQ0FnSUNCMGFHbHpMbTV2Y20xaGJHbDZaU2h6Y0dGeWMyVlBZbXBsWTNRcE8xeHVJQ0FnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQjBhR2x6TGw5dmNIUnBiMjV6TG0xaGVFbDBaWEpoZEdsdmJuTTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ0lDQnpjR0Z5YzJWUFltcGxZM1FnUFNCMGFHbHpMbVY0Y0dGdVpDaHpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQWdJQ0FnZEdocGN5NXBibVpzWVhSbEtITndZWEp6WlU5aWFtVmpkQ2s3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVibTl5YldGc2FYcGxLSE53WVhKelpVOWlhbVZqZENrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJR052Ym5OMElIdGpiSFZ6ZEdWeWN5d2dhWE1zSUdwemZTQTlJSFJvYVhNdVlYTnphV2R1UTJ4MWMzUmxjbk1vYzNCaGNuTmxUMkpxWldOMExDQnVVbTkzY3lrN1hHNGdJQ0FnZEdocGN5NWpiM0p5WldOMFEyeDFjM1JsY25Nb1kyeDFjM1JsY25NcE8xeHVJQ0FnSUdOdmJuTjBJR1Z0WW1Wa1pHbHVaM01nUFNCaGQyRnBkQ0IwYUdsekxteGhlVzkxZENoamJIVnpkR1Z5Y3l3Z2MzQmhjbk5sVDJKcVpXTjBMQ0J1VW05M2N5azdYRzRnSUNBZ2NtVjBkWEp1SUh0amJIVnpkR1Z5Y3l3Z1pXMWlaV1JZT2lCbGJXSmxaR1JwYm1kekxtVnRZbVZrV0N3Z1pXMWlaV1JaT2lCbGJXSmxaR1JwYm1kekxtVnRZbVZrV1N3Z2FYTXNJR3B6ZlR0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCaGMzbHVZeUIwY21GdWMyWnZjbTFYWldKSFVGVW9jM0JoY25ObFRXRjBjbWw0T2lCVGNHRnljMlZOWVhSeWFYaFNaWE4xYkhRc0lHNVNiM2R6T2lCdWRXMWlaWElwSUh0Y2JpQWdJQ0JwWmlBb2RHaHBjeTVmYjNCMGFXOXVjeTV0WVhoSmRHVnlZWFJwYjI1eklEMDlQU0F3S1Z4dUlDQWdJQ0FnY21WMGRYSnVJSFJvYVhNdWRISmhibk5tYjNKdEtITndZWEp6WlUxaGRISnBlQ3dnYmxKdmQzTXBPMXh1WEc0Z0lDQWdZMjl1YzNRZ2JXTnNVbVZ6SUQwZ1lYZGhhWFFnYldGeWEyOTJRMngxYzNSbGNsZGxZa2RRVlNoY2JpQWdJQ0FnSUhOd1lYSnpaVTFoZEhKcGVDd2dibEp2ZDNNc0lIUm9hWE11WDI5d2RHbHZibk11YldGNFNYUmxjbUYwYVc5dWN5d2dkR2hwY3k1ZmIzQjBhVzl1Y3k1cGJtWnNZWFJsUm1GamRHOXlYRzRnSUNBZ0tUdGNiaUFnSUNCamIyNXpkQ0J6Y0dGeWMyVlBZbXBsWTNRZ1BTQjBhR2x6TG1OemNsUnZVM0JoY25ObFQySnFaV04wS0cxamJGSmxjeXdnYmxKdmQzTXBPMXh1SUNBZ0lHTnZibk4wSUh0amJIVnpkR1Z5Y3l3Z2FYTXNJR3B6ZlNBOUlIUm9hWE11WVhOemFXZHVRMngxYzNSbGNuTW9jM0JoY25ObFQySnFaV04wTENCdVVtOTNjeWs3WEc0Z0lDQWdkR2hwY3k1amIzSnlaV04wUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk1wTzF4dUlDQWdJR052Ym5OMElHVnRZbVZrWkdsdVozTWdQU0JoZDJGcGRDQjBhR2x6TG14aGVXOTFkQ2hqYkhWemRHVnljeXdnYzNCaGNuTmxUMkpxWldOMExDQnVVbTkzY3lrN1hHNGdJQ0FnY21WMGRYSnVJSHRqYkhWemRHVnljeXdnWlcxaVpXUllPaUJsYldKbFpHUnBibWR6TG1WdFltVmtXQ3dnWlcxaVpXUlpPaUJsYldKbFpHUnBibWR6TG1WdFltVmtXU3dnYVhNc0lHcHpmVHRjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnWTI5eWNtVmpkRU5zZFhOMFpYSnpLR05zZFhOMFpYSnpPaUJ1ZFcxaVpYSmJYU2tnZTF4dUlDQWdJR052Ym5OMElHTnNkWE4wWlhKVGFYcGxUV0Z3T2lCN1cxODZJRzUxYldKbGNsMDZJRzUxYldKbGNuMGdQU0I3ZlR0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdOc2RYTjBaWElnYjJZZ1kyeDFjM1JsY25NcElIdGNiaUFnSUNBZ0lHbG1JQ2doWTJ4MWMzUmxjbE5wZW1WTllYQmJZMngxYzNSbGNsMHBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSlRhWHBsVFdGd1cyTnNkWE4wWlhKZElEMGdNRHRjYmlBZ0lDQWdJR05zZFhOMFpYSlRhWHBsVFdGd1cyTnNkWE4wWlhKZEt5czdYRzRnSUNBZ2ZWeHVJQ0FnSUdOdmJuTjBJSE52Y25SbFpFbHVaR1Y0WlhNZ1BTQlBZbXBsWTNRdWEyVjVjeWhqYkhWemRHVnlVMmw2WlUxaGNDa3ViV0Z3S0U1MWJXSmxjaWt1YzI5eWRDZ29ZU3dnWWlrZ1BUNGdZMngxYzNSbGNsTnBlbVZOWVhCYllsMGdMU0JqYkhWemRHVnlVMmw2WlUxaGNGdGhYU2s3WEc0Z0lDQWdZMjl1YzNRZ1kyeDFjM1JsY2sxaGNEb2dlMXRmT2lCdWRXMWlaWEpkT2lCdWRXMWlaWEo5SUQwZ2UzMDdYRzRnSUNBZ2MyOXlkR1ZrU1c1a1pYaGxjeTVtYjNKRllXTm9LQ2hqYkhWemRHVnlTV1I0TENCcEtTQTlQaUJqYkhWemRHVnlUV0Z3VzJOc2RYTjBaWEpKWkhoZElEMGdhU0FySURFcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1kyeDFjM1JsY25NdWJHVnVaM1JvT3lCcEt5c3BYRzRnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY25OYmFWMWRPMXh1SUNBZ0lDOHZJR3hsZENCamRYSkRiSFZ6ZEdWeUlEMGdNVHRjYmlBZ0lDQXZMeUJtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdOc2RYTjBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0x5OGdJQ0JwWmlBb0lXTnNkWE4wWlhKTllYQmJZMngxYzNSbGNuTmJhVjFkS1NCN1hHNGdJQ0FnTHk4Z0lDQWdJR05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbk5iYVYxZElEMGdZM1Z5UTJ4MWMzUmxjanRjYmlBZ0lDQXZMeUFnSUNBZ1kyeDFjM1JsY25OYmFWMGdQU0JqZFhKRGJIVnpkR1Z5TzF4dUlDQWdJQzh2SUNBZ0lDQmpkWEpEYkhWemRHVnlLeXM3WEc0Z0lDQWdMeThnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQzh2SUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY25OYmFWMWRPMXh1SUNBZ0lDOHZJQ0FnZlZ4dUlDQWdJQzh2SUgxY2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ1kzTnlWRzlUY0dGeWMyVlBZbXBsWTNRb2JXTnNVbVZ6T2lCTlEweFBjRkpsZEhWeWJsUjVjR1VzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCdmNtUmxjaUE5SUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV0WVhnb1RXRjBhQzVzYjJjeE1DaHVVbTkzY3lrc0lESXBLU0FySURFN1hHNGdJQ0FnWTI5dWMzUWdiV2x1VDNKa1pYSWdQU0F4SUM4Z1RXRjBhQzV3YjNjb01UQXNJRzl5WkdWeUtUdGNiaUFnSUNCamIyNXpkQ0J6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDQTlJSHQ5TzF4dUlDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmxKdmQzTTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmxkSUQwZ2UzMDdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnJJRDBnYldOc1VtVnpMbWx1WkdWNFQyWm1jMlYwYzF0cFhUc2dheUE4SUcxamJGSmxjeTVwYm1SbGVFOW1abk5sZEhOYmFTQXJJREZkT3lCckt5c3BJSHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdhaUE5SUcxamJGSmxjeTVMVGs1SmJtUmxlR1Z6VzJ0ZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYWlBOFBTQnBJSHg4SUcxamJGSmxjeTVMVGs1VGFXMXBiR0Z5YVhScFpYTmJhMTBnUENCdGFXNVBjbVJsY2lsY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzJsZFcycGRJRDBnYldOc1VtVnpMa3RPVGxOcGJXbHNZWEpwZEdsbGMxdHJYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOd1lYSnpaVTlpYW1WamREdGNiaUFnZlZ4dVhHNGdJSEJ5YVhaaGRHVWdZWE41Ym1NZ2JHRjViM1YwS0dOc2RYTjBaWEp6T2lCdWRXMWlaWEpiWFN3Z2MzQmhjbk5sVFdGMGNtbDRPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCbGJXSmxaRmdnUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0c1U2IzZHpLUzVtYVd4c0tEQXBPMXh1SUNBZ0lHTnZibk4wSUdWdFltVmtXU0E5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvYmxKdmQzTXBMbVpwYkd3b01DazdYRzRnSUNBZ1kyOXVjM1FnWTJ4MWMzUmxjazFoY0RvZ2UxdGZPaUJ1ZFcxaVpYSmRPaUJ1ZFcxaVpYSmJYWDBnUFNCN2ZUdGNiaUFnSUNCamJIVnpkR1Z5Y3k1bWIzSkZZV05vS0NoamJIVnpkR1Z5TENCcEtTQTlQaUI3WEc0Z0lDQWdJQ0JwWmlBb0lXTnNkWE4wWlhKTllYQmJZMngxYzNSbGNsMHBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbDBnUFNCYlhUdGNiaUFnSUNBZ0lHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNsMHVjSFZ6YUNocEtUdGNiaUFnSUNCOUtUdGNiaUFnSUNBdkx5QmpiMjV6ZENCdVEyeDFjM1JsY25NZ1BTQlBZbXBsWTNRdWEyVjVjeWhqYkhWemRHVnlUV0Z3S1M1c1pXNW5kR2c3WEc0Z0lDQWdMeThnWTI5dWMzUWdjR1Z5VW05M0lEMGdUV0YwYUM1bWJHOXZjaWhOWVhSb0xuTnhjblFvYmtOc2RYTjBaWEp6S1NrN1hHNGdJQ0FnYkdWMElHTnNkWE4wWlhKT2RXMGdQU0F3TzF4dUlDQWdJR052Ym5OMElITnZjblJsWkVOc2RYTjBaWEpPWVcxbGN5QTlJRTlpYW1WamRDNXJaWGx6S0dOc2RYTjBaWEpOWVhBcE8xeHVJQ0FnSUhOdmNuUmxaRU5zZFhOMFpYSk9ZVzFsY3k1emIzSjBLQ2hoTENCaUtTQTlQaUJqYkhWemRHVnlUV0Z3VzJJZ1lYTWdZVzU1WFM1c1pXNW5kR2dnTFNCamJIVnpkR1Z5VFdGd1cyRWdZWE1nWVc1NVhTNXNaVzVuZEdncE8xeHVJQ0FnSUd4bGRDQndaWEpTYjNjZ1BTQTJPMXh1WEc0Z0lDQWdiR1YwSUhsUFptWnpaWFFnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR3hoZVc5MWRGTnBlbVVnUFNBMU8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ1kyeDFjM1JsY2s1aGJXVWdiMllnYzI5eWRHVmtRMngxYzNSbGNrNWhiV1Z6S1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JqYkhWemRHVnlJRDBnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5VG1GdFpTQmhjeUJoYm5sZElUdGNiaUFnSUNBZ0lHTnZibk4wSUdWdFltVmtaR2x1WjNNZ1BTQmhkMkZwZENCaWFXOU1ZWGx2ZFhRb1kyeDFjM1JsY2l3Z2MzQmhjbk5sVFdGMGNtbDRMQ0F3TGpBd01TazdYRzRnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjazUxYlNBOVBUMGdUV0YwYUM1alpXbHNLSEJsY2xKdmR5QXZJREV1TlNrcElIdGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnSUNBZ0lIbFBabVp6WlhRZ0t6MGdiR0Y1YjNWMFUybDZaU0F2SUhCbGNsSnZkenRjYmlBZ0lDQWdJQ0FnY0dWeVVtOTNJRDBnVFdGMGFDNWpaV2xzS0hCbGNsSnZkeUFxSURFdU5TazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmpiMjV6ZENCdlptWnpaWFJZSUQwZ0tDaGpiSFZ6ZEdWeVRuVnRJQ1VnY0dWeVVtOTNLU0FxSUd4aGVXOTFkRk5wZW1VZ0x5QndaWEpTYjNjcElDb2dNUzQxTzF4dUlDQWdJQ0FnTHk4Z1kyOXVjM1FnYjJabWMyVjBXU0E5SUUxaGRHZ3VabXh2YjNJb1kyeDFjM1JsY2s1MWJTQXZJSEJsY2xKdmR5a2dLaUF5TzF4dVhHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHVnRZbVZrWkdsdVozTXVaVzFpWldSWUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXRnRqYkhWemRHVnlXMmxkWFNBOUlHVnRZbVZrWkdsdVozTXVaVzFpWldSWVcybGRJQ29nYkdGNWIzVjBVMmw2WlNBdklIQmxjbEp2ZHlBcklHOW1abk5sZEZnN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV1Z0amJIVnpkR1Z5VzJsZFhTQTlJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUlpXMmxkSUNvZ2JHRjViM1YwVTJsNlpTQXZJSEJsY2xKdmR5QXJJSGxQWm1aelpYUTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmpiSFZ6ZEdWeVRuVnRLeXM3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCN1pXMWlaV1JZTENCbGJXSmxaRmw5TzF4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCdFpYSm5aVU5zZFhOMFpYSnpLR05zZFhOMFpYSnpPaUJ1ZFcxaVpYSmJYU3dnYVRvZ2JuVnRZbVZ5TENCcU9pQnVkVzFpWlhJcElIdGNiaUFnSUNCamIyNXpkQ0JwUTJ4MWMzUmxjaUE5SUdOc2RYTjBaWEp6VzJsZE8xeHVJQ0FnSUdOdmJuTjBJR3BEYkhWemRHVnlJRDBnWTJ4MWMzUmxjbk5iYWwwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYXlBOUlEQTdJR3NnUENCamJIVnpkR1Z5Y3k1c1pXNW5kR2c3SUdzckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0dOc2RYTjBaWEp6VzJ0ZElEMDlQU0JxUTJ4MWMzUmxjaWxjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iYTEwZ1BTQnBRMngxYzNSbGNqdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2NIVmliR2xqSUdGemMybG5ia05zZFhOMFpYSnpLSE53WVhKelpVMWhkSEpwZURvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMExDQnVVbTkzY3pvZ2JuVnRZbVZ5S1NCN1hHNGdJQ0FnYkdWMElHTnNkWE4wWlhKT2RXMGdQU0F3TzF4dUlDQWdJR052Ym5OMElHbHpPaUJ1ZFcxaVpYSmJYU0E5SUZ0ZE8xeHVJQ0FnSUdOdmJuTjBJR3B6T2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNBZ0lHTnZibk4wSUc5eVpHVnlJRDBnVFdGMGFDNW1iRzl2Y2loTllYUm9MbTFoZUNoTllYUm9MbXh2WnpFd0tHNVNiM2R6S1N3Z01pa3BJQ3NnTVR0Y2JpQWdJQ0JqYjI1emRDQnRhVzVQY21SbGNpQTlJRTFoZEdndWNHOTNLREV3TENCdmNtUmxjaWs3WEc0Z0lDQWdZMjl1YzNRZ1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZElEMGdibVYzSUVGeWNtRjVLRzVTYjNkektTNW1hV3hzS0MweEtUdGNiaUFnSUNCbWIzSWdLR052Ym5OMElHa2diMllnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVFdGMGNtbDRLU2tnZTF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCcUlHOW1JRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTFoZEhKcGVGdHBJR0Z6SUdGdWVWMHBLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaE5ZWFJvTG5KdmRXNWtLSE53WVhKelpVMWhkSEpwZUZ0cElHRnpJR0Z1ZVYxYmFpQmhjeUJoYm5sZElDb2diV2x1VDNKa1pYSXBJQzhnYldsdVQzSmtaWElnUGlBd0lDWW1YRzRnSUNBZ0lDQWdJQ0FnYzNCaGNuTmxUV0YwY21sNFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMGdJVDA5SUU1MWJXSmxjaWhwS1NBbUppQk9kVzFpWlhJb2Fpa2dQaUJPZFcxaVpYSW9hU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBjeTV3ZFhOb0tFNTFiV0psY2locEtTazdYRzRnSUNBZ0lDQWdJQ0FnYW5NdWNIVnphQ2hPZFcxaVpYSW9haWtwTzF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hqYkhWemRHVnljMXRPZFcxaVpYSW9hU2xkSUNFOVBTQXRNU0FtSmlCamJIVnpkR1Z5YzF0T2RXMWlaWElvYWlsZElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcwNTFiV0psY2locEtWMGdJVDA5SUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViV1Z5WjJWRGJIVnpkR1Z5Y3loamJIVnpkR1Z5Y3l3Z1RuVnRZbVZ5S0drcExDQk9kVzFpWlhJb2Fpa3BPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyeDFjM1JsY25OYlRuVnRZbVZ5S0drcFhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwZ1BTQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwZ1BTQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FpbGRPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVRuVnRLeXM3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRJRDBnWTJ4MWMzUmxjazUxYlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMDUxYldKbGNpaHFLVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQm1iM0lnS0d4bGRDQnBQVEE3SUdrZ1BDQmpiSFZ6ZEdWeWN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcybGRJRDA5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0SUNzck8xeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpPZFcwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjdZMngxYzNSbGNuTXNJR2x6T2lCdVpYY2dWV2x1ZERNeVFYSnlZWGtvYVhNcExDQnFjem9nYm1WM0lGVnBiblF6TWtGeWNtRjVLR3B6S1gwN1hHNGdJSDFjYmx4dUlDQXZLaW9nYzJGdFpTQmhjeUJoYzNOcFoyNGdZMngxYzNSbGNuTWdZblYwSUhkdmNtdHBibWNnYjI0Z2RHaGxJR3hsZG1Wc0lHOW1JRU5UVWlCbWIzSnRZWFFnY21WMGRYSnVaV1FnWm5KdmJTQjNaV0pIVUZVZ0tpOWNiaUFnY0hKcGRtRjBaU0JoYzNOcFoyNURiSFZ6ZEdWeWMwTlRVaWh0WTJ4U1pYTTZJRTFEVEU5d1VtVjBkWEp1Vkhsd1pTd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUd4bGRDQmpiSFZ6ZEdWeVRuVnRJRDBnTUR0Y2JpQWdJQ0JqYjI1emRDQnBjem9nYm5WdFltVnlXMTBnUFNCYlhUdGNiaUFnSUNCamIyNXpkQ0JxY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ0lDQmpiMjV6ZENCdmNtUmxjaUE5SUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV0WVhnb1RXRjBhQzVzYjJjeE1DaHVVbTkzY3lrc0lESXBLU0FySURFN1hHNGdJQ0FnWTI5dWMzUWdiV2x1VDNKa1pYSWdQU0F4SUM4Z1RXRjBhQzV3YjNjb01UQXNJRzl5WkdWeUtUdGNiaUFnSUNCamIyNXpkQ0JqYkhWemRHVnljem9nYm5WdFltVnlXMTBnUFNCdVpYY2dRWEp5WVhrb2JsSnZkM01wTG1acGJHd29MVEVwTzF4dUlDQWdJR052Ym5OMElHTnZjbkpsWTNSbFpFOW1abk5sZEhNZ1BTQnVaWGNnVldsdWRETXlRWEp5WVhrb2JsSnZkM01nS3lBeEtUdGNiaUFnSUNCc1pYUWdiMlptYzJWMFEyOTFiblJsY2lBOUlEQTdYRzRnSUNBZ1kyOXljbVZqZEdWa1QyWm1jMlYwYzFzd1hTQTlJREE3WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J1VW05M2N6c2dhU3NyS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcklEMGdiV05zVW1WekxtbHVaR1Y0VDJabWMyVjBjMXRwWFRzZ2F5QThJRzFqYkZKbGN5NXBibVJsZUU5bVpuTmxkSE5iYVNBcklERmRPeUJyS3lzcElIdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2FpQTlJRzFqYkZKbGN5NUxUazVKYm1SbGVHVnpXMnRkTzF4dUlDQWdJQ0FnSUNCcFppQW9haUE4UFNCcElIeDhJRzFqYkZKbGN5NUxUazVUYVcxcGJHRnlhWFJwWlhOYmExMGdQRDBnYldsdVQzSmtaWElwWEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lHbHpMbkIxYzJnb2FTazdYRzRnSUNBZ0lDQWdJR3B6TG5CMWMyZ29haWs3WEc0Z0lDQWdJQ0FnSUc5bVpuTmxkRU52ZFc1MFpYSXJLenRjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcybGRJQ0U5UFNBdE1TQW1KaUJqYkhWemRHVnljMXRxWFNBaFBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjbk5iYVYwZ0lUMDlJR05zZFhOMFpYSnpXMnBkS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dFpYSm5aVU5zZFhOMFpYSnpLR05zZFhOMFpYSnpMQ0JwTENCcUtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYkhWemRHVnljMXRwWFNBaFBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHFYU0E5SUdOc2RYTjBaWEp6VzJsZE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05zZFhOMFpYSnpXMnBkSUNFOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcybGRJRDBnWTJ4MWMzUmxjbk5iYWwwN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU3NyTzF4dUlDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcybGRJRDBnWTJ4MWMzUmxjazUxYlR0Y2JpQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHFYU0E5SUdOc2RYTjBaWEpPZFcwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHTnZjbkpsWTNSbFpFOW1abk5sZEhOYmFTQXJJREZkSUQwZ2IyWm1jMlYwUTI5MWJuUmxjanRjYmlBZ0lDQjlYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPeUJwSUR3Z1kyeDFjM1JsY25NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5YzF0cFhTQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU0FyS3p0Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYmFWMGdQU0JqYkhWemRHVnlUblZ0TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2UyTnNkWE4wWlhKekxDQnBjem9nYm1WM0lGVnBiblF6TWtGeWNtRjVLR2x6S1N3Z2FuTTZJRzVsZHlCVmFXNTBNekpCY25KaGVTaHFjeWtzSUdOdmNuSmxZM1JsWkU5bVpuTmxkSE45TzF4dUlDQjlYRzVjYmlBZ2NIVmliR2xqSUhSdlQySnFaV04wUm05eWJTaHpjR0Z5YzJWTllYUnlhWGc2SUZOd1lYSnpaVTFoZEhKcGVGSmxjM1ZzZENrNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDQjdYRzRnSUNBZ1kyOXVjM1FnYzNCaGNuTmxUMkpxWldOME9pQjdXMTg2SUc1MWJXSmxjbDA2SUh0Ylh6b2diblZ0WW1WeVhUb2diblZ0WW1WeWZYMGdQU0I3ZlR0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhOd1lYSnpaVTFoZEhKcGVDNXBMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9JWE53WVhKelpVOWlhbVZqZEZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYwcFhHNGdJQ0FnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnR6Y0dGeWMyVk5ZWFJ5YVhndWFWdHBYVjBnUFNCN2ZUdGNiaUFnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnR6Y0dGeWMyVk5ZWFJ5YVhndWFWdHBYVjFiYzNCaGNuTmxUV0YwY21sNExtcGJhVjFkSUQwZ01TQXRJSE53WVhKelpVMWhkSEpwZUM1a2FYTjBZVzVqWlZ0cFhUdGNiaUFnSUNBZ0lHbG1JQ2doYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVxVzJsZFhTbGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXFXMmxkWFNBOUlIdDlPMXh1SUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXFXMmxkWFZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYwZ1BTQXhJQzBnYzNCaGNuTmxUV0YwY21sNExtUnBjM1JoYm1ObFcybGRPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYzNCaGNuTmxUMkpxWldOME8xeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmhaR1JNYjI5d2N5aHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2JsSnZkM002SUc1MWJXSmxjaWtnZTF4dUlDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmxKdmQzTTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0Z6Y0dGeWMyVlBZbXBsWTNSYmFWMHBYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0cFhTQTlJSHQ5TzF4dUlDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFcybGRXMmxkSUQwZ2RHaHBjeTVmYjNCMGFXOXVjeTV0ZFd4MFJtRmpkRzl5TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnYm05eWJXRnNhWHBsS0hOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBLU0I3WEc0Z0lDQWdabTl5SUNoamIyNXpkQ0JwSUc5bUlFOWlhbVZqZEM1clpYbHpLSE53WVhKelpVOWlhbVZqZENrcElIdGNiaUFnSUNBZ0lHTnZibk4wSUhKdmR5QTlJSE53WVhKelpVOWlhbVZqZEZ0cElHRnpJR0Z1ZVYwN1hHNGdJQ0FnSUNCc1pYUWdjM1Z0SUQwZ01EdGNiaUFnSUNBZ0lHWnZjaUFvWTI5dWMzUWdhaUJ2WmlCUFltcGxZM1F1YTJWNWN5aHliM2NwS1Z4dUlDQWdJQ0FnSUNCemRXMGdLejBnY205M1cyb2dZWE1nWVc1NVhUdGNiaUFnSUNBZ0lHbG1JQ2h6ZFcwZ1BUMDlJREFwSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCcUlHOW1JRTlpYW1WamRDNXJaWGx6S0hKdmR5a3BYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0cElHRnpJR0Z1ZVYxYmFpQmhjeUJoYm5sZElDODlJSE4xYlR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUdWNGNHRnVaQ2h6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdOdmJuTjBJR1Y0Y0dGdVpHVmtUMkpxWldOME9pQlRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUWdQU0I3ZlR0Y2JpQWdJQ0JqYjI1emRDQnZjbVJsY2lBOUlFMWhkR2d1Wm14dmIzSW9UV0YwYUM1dFlYZ29UV0YwYUM1c2IyY3hNQ2h1VW05M2N5a3NJRElwS1NBcklERTdYRzRnSUNBZ1kyOXVjM1FnYldsdVQzSmtaWElnUFNCTllYUm9MbkJ2ZHlneE1Dd2diM0prWlhJcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JsSnZkM003SUdrckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGemNHRnljMlZQWW1wbFkzUmJhVjBwWEc0Z0lDQWdJQ0FnSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnTHk4Z1kyOXVjM1FnY205M0lEMGdjM0JoY25ObFQySnFaV04wVzJsZE8xeHVJQ0FnSUNBZ1pYaHdZVzVrWldSUFltcGxZM1JiYVYwZ1B6ODlJSHQ5TzF4dUlDQWdJQ0FnWm05eUlDaHNaWFFnYWlBOUlHazdJR29nUENCdVVtOTNjenNnYWlzcktTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaGMzQmhjbk5sVDJKcVpXTjBXMmxkUHk1YmFsMHBYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHbHVkV1U3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJSFpoYkNBOUlIUm9hWE11WjJWMFJYaHdZVzVrVm1Gc2RXVW9jM0JoY25ObFQySnFaV04wTENCcExDQnFLVHNnTHk5d2NuVnVhVzVuSUhOMFpYQmNiaUFnSUNBZ0lDQWdhV1lnS0UxaGRHZ3VjbTkxYm1Rb2RtRnNJQ29nYldsdVQzSmtaWElwSUM4Z2JXbHVUM0prWlhJZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pYaHdZVzVrWldSUFltcGxZM1JiYVYxYmFsMGdQU0IyWVd3N1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGVIQmhibVJsWkU5aWFtVmpkRnRxWFNsY2JpQWdJQ0FnSUNBZ0lDQWdJR1Y0Y0dGdVpHVmtUMkpxWldOMFcycGRJRDBnZTMwN1hHNGdJQ0FnSUNBZ0lDQWdaWGh3WVc1a1pXUlBZbXBsWTNSYmFsMWJhVjBnUFNCMllXdzdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdWNGNHRnVaR1ZrVDJKcVpXTjBPMXh1SUNCOVhHNWNiaUFnTHk4Z2NISnBkbUYwWlNCd2NuVnVaU2h5YjNjNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRGdHVkVzFpWlhKZEtTQjdYRzVjYmlBZ0x5OGdmVnh1WEc0Z0lIQnlhWFpoZEdVZ2FXNW1iR0YwWlNoemNHRnljMlZQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ2tnZTF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnYVNCdlppQlBZbXBsWTNRdWEyVjVjeWh6Y0dGeWMyVlBZbXBsWTNRcEtTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCeWIzY2dQU0J6Y0dGeWMyVlBZbXBsWTNSYmFTQmhjeUJoYm5sZE8xeHVJQ0FnSUNBZ1ptOXlJQ2hqYjI1emRDQnFJRzltSUU5aWFtVmpkQzVyWlhsektISnZkeWtwWEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMWJhaUJoY3lCaGJubGRJRDBnVFdGMGFDNXdiM2NvYzNCaGNuTmxUMkpxWldOMFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMHNJSFJvYVhNdVgyOXdkR2x2Ym5NdWFXNW1iR0YwWlVaaFkzUnZjaWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JuWlhSRmVIQmhibVJXWVd4MVpTaHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2FUb2dZVzU1TENCcU9pQmhibmtwSUh0Y2JpQWdJQ0JzWlhRZ2RtRnNJRDBnTUR0Y2JpQWdJQ0JqYjI1emRDQmpkWEp5Wlc1MFNXNWtaWGhsY3lBOUlFOWlhbVZqZEM1clpYbHpLSE53WVhKelpVOWlhbVZqZEZ0cFhTQS9QeUI3ZlNrN1hHNGdJQ0FnWTI5dWMzUWdiM1JvWlhKSmJtUmxlR1Z6SUQwZ1QySnFaV04wTG10bGVYTW9jM0JoY25ObFQySnFaV04wVzJwZElEOC9JSHQ5S1R0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdzZ2IyWWdZM1Z5Y21WdWRFbHVaR1Y0WlhNcElIdGNiaUFnSUNBZ0lHbG1JQ2h2ZEdobGNrbHVaR1Y0WlhNdWFXNWpiSFZrWlhNb2F5a3BYRzRnSUNBZ0lDQWdJSFpoYkNBclBTQnpjR0Z5YzJWUFltcGxZM1JiYVYxYmF5QmhjeUJoYm5sZElDb2djM0JoY25ObFQySnFaV04wVzJwZFcyc2dZWE1nWVc1NVhUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSFpoYkR0Y2JpQWdmVnh1ZlZ4dVhHNGlYWDA9IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgeyBnZXRHUFVEZXZpY2UgfSBmcm9tICcuLi9nZXRHUFVEZXZpY2UnO1xuaW1wb3J0IHsgc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlIH0gZnJvbSAnLi9jb2x3aXNlLW5vcm1hbGl6ZSc7XG5pbXBvcnQgeyBleHBhbmROb1Jldml2ZSwgaW5mbGF0ZSB9IGZyb20gJy4vaW5mbGF0ZS1leHBhbmQnO1xuaW1wb3J0IHsgdG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybSB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtvdkNsdXN0ZXJXZWJHUFUoc3BhcnNlTWF0cml4LCBuUm93cywgbWF4SXRlcmF0aW9ucyA9IDUsIGluZmxhdGVGYWN0b3IgPSAyKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGV2aWNlID0geWllbGQgZ2V0R1BVRGV2aWNlKCk7XG4gICAgICAgIGlmICghZGV2aWNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBncHUgZGV2aWNlIGZvdW5kJyk7XG4gICAgICAgIC8vIHNlbGYgbG9vcHMgYXJlIGFscmVhZHkgYWRkZWQgaGVyZVxuICAgICAgICBjb25zdCBzcGFyc2VLTk5Gb3JtID0gdG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgICAgLy8gZmlyc3QsIHdlIG5vcm1pbGl6ZSB0aGUgc2ltaWxhcml0aWVzXG4gICAgICAgIHlpZWxkIHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZShkZXZpY2UsIHNwYXJzZUtOTkZvcm0uS05OU2ltaWxhcml0aWVzLCBzcGFyc2VLTk5Gb3JtLmluZGV4T2Zmc2V0cywgblJvd3MpO1xuICAgICAgICBsZXQgcmVzID0gc3BhcnNlS05ORm9ybTtcbiAgICAgICAgLy8gdGhlbiB3ZSBleHBhbmQgdGhlIHNpbWlsYXJpdGllc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhjaGVja1NvcnRlZChyZXMuS05OSW5kZXhlcywgcmVzLmluZGV4T2Zmc2V0cykpO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kUmVzID0geWllbGQgZXhwYW5kTm9SZXZpdmUoZGV2aWNlLCByZXMuS05OU2ltaWxhcml0aWVzLCByZXMuS05OSW5kZXhlcywgcmVzLmluZGV4T2Zmc2V0cywgblJvd3MpO1xuICAgICAgICAgICAgLy8gdGhlbiB3ZSBpbmZsYXRlIHRoZSBzaW1pbGFyaXRpZXNcbiAgICAgICAgICAgIGluZmxhdGUoZXhwYW5kUmVzLktOTlNpbWlsYXJpdGllcywgaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgICAgICAvLyB0aGVuIHdlIG5vcm1pbGl6ZSB0aGUgc2ltaWxhcml0aWVzIGFnYWluXG4gICAgICAgICAgICB5aWVsZCBzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UoZGV2aWNlLCBleHBhbmRSZXMuS05OU2ltaWxhcml0aWVzLCBleHBhbmRSZXMuaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgICAgICByZXMgPSBleHBhbmRSZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1DTC13ZWJHUFUuanMubWFwIiwiaW1wb3J0IHsgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXggfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9zcGFyc2UtbWF0cml4L3dlYkdQVS1zcGFyc2UtbWF0cml4JztcbmltcG9ydCB7IFNwYXJzZU1hdHJpeFNlcnZpY2UgfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7IE1DTFNwYXJzZVJlZHVjZXIgfSBmcm9tICcuL21hcmNvdi1jbHVzdGVyJztcbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCwgZGlzdGFuY2VGbkFyZ3MsIGRpc3RhbmNlRm5zLCBtYXhJdGVyYXRpb25zLCB1c2VXZWJHUFUsIGluZmxhdGUgfSA9IGV2ZW50LmRhdGE7XG4gICAgY29uc29sZS50aW1lKCdzcGFyc2UgbWF0cml4Jyk7XG4gICAgbGV0IHNwYXJzZSA9IG51bGw7XG4gICAgaWYgKHVzZVdlYkdQVSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3BhcnNlID0gYXdhaXQgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoZGF0YSwgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZucywgYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMsIGRpc3RhbmNlRm5BcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXNwYXJzZSkgeyAvLyBmYWxzYmFjayB0byBDUFVcbiAgICAgICAgaWYgKHVzZVdlYkdQVSlcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dFQkdQVSBzcGFyc2UgbWF0cml4IGNhbGN1bGF0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgICAgICAgICAuY2FsY011bHRpQ29sdW1uKGRhdGEsIGRpc3RhbmNlRm5zLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5BcmdzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZUVuZCgnc3BhcnNlIG1hdHJpeCcpO1xuICAgIC8vY29uc3QgcmVzID0gYXdhaXQgbmV3IE1DTFNwYXJzZVJlZHVjZXIoe21heEl0ZXJhdGlvbnM6IG1heEl0ZXJhdGlvbnMgPz8gNX0pLnRyYW5zZm9ybShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICBjb25zdCByZWR1Y2VyID0gbmV3IE1DTFNwYXJzZVJlZHVjZXIoeyBtYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDUsIGluZmxhdGVGYWN0b3I6IGluZmxhdGUgPz8gMiB9KTtcbiAgICBjb25zb2xlLnRpbWUoJ01DTCcpO1xuICAgIGxldCByZXMgPSBudWxsO1xuICAgIGlmICh1c2VXZWJHUFUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcyA9IGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtV2ViR1BVKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlcylcbiAgICAgICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gICAgY29uc29sZS50aW1lRW5kKCdNQ0wnKTtcbiAgICBwb3N0TWVzc2FnZSh7IHJlcyB9KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2liV05zTFhkdmNtdGxjaTVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkltMWpiQzEzYjNKclpYSXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1QwRkJUeXhGUVVGRExEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc2QwVkJRWGRGTEVOQlFVTTdRVUZEYkVnc1QwRkJUeXhGUVVGeFFpeHRRa0ZCYlVJc1JVRkJReXhOUVVGTkxEQkRRVUV3UXl4RFFVRkRPMEZCUjJwSExFOUJRVThzUlVGQlF5eG5Ra0ZCWjBJc1JVRkJReXhOUVVGTkxHdENRVUZyUWl4RFFVRkRPMEZCUld4RUxGTkJRVk1zUjBGQlJ5eExRVUZMTEVWQlFVVXNTMEZCU3l4RlFVRkZMRVZCUVVVN1NVRkRNVUlzVFVGQlRTeEZRVUZETEVsQlFVa3NSVUZCUlN4VFFVRlRMRVZCUVVVc1QwRkJUeXhGUVVGRkxHbENRVUZwUWl4RlFVRkZMR05CUVdNc1JVRkJSU3hYUVVGWExFVkJRVVVzWVVGQllTeEZRVUZGTEZOQlFWTXNSVUZCUlN4UFFVRlBMRVZCUVVNc1IwRk5MMGNzUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXp0SlFVVm1MRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTTdTVUZET1VJc1NVRkJTU3hOUVVGTkxFZEJRVGhDTEVsQlFVa3NRMEZCUXp0SlFVTTNReXhKUVVGSkxGTkJRVk1zUlVGQlJTeERRVUZETzFGQlEyUXNTVUZCU1N4RFFVRkRPMWxCUTBnc1RVRkJUU3hIUVVGSExFMUJRVTBzTUVKQlFUQkNMRU5CUTNaRExFbEJRVWtzUlVGQlJTeFRRVUZUTEVkQlFVY3NSMEZCUnl4RlFVRkZMRmRCUVd0Q0xFVkJRVVVzYVVKQlFYZENMRVZCUVVVc1QwRkJUeXhGUVVGRkxHTkJRV01zUTBGQlF5eERRVUZETzFGQlEyeEhMRU5CUVVNN1VVRkJReXhQUVVGUExFTkJRVU1zUlVGQlJTeERRVUZETzFsQlExZ3NUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU51UWl4RFFVRkRPMGxCUTBnc1EwRkJRenRKUVVORUxFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RFFVRkRMR3RDUVVGclFqdFJRVU12UWl4SlFVRkpMRk5CUVZNN1dVRkRXQ3hQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETERaRlFVRTJSU3hEUVVGRExFTkJRVU03VVVGRkwwWXNUVUZCVFN4SFFVRkhMRTFCUVUwc1NVRkJTU3h0UWtGQmJVSXNSVUZCUlR0aFFVTnlReXhsUVVGbExFTkJRVU1zU1VGQlNTeEZRVUZGTEZkQlFWY3NSVUZCUlN4VFFVRlRMRWRCUVVjc1IwRkJSeXhGUVVGRkxHTkJRV01zUlVGQlJTeFBRVUZQTEVWQlFVVXNhVUpCUVdsQ0xFTkJRVU1zUTBGQlF6dEpRVU55Unl4RFFVRkRPMGxCUTBRc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eGxRVUZsTEVOQlFVTXNRMEZCUXp0SlFVVnFReXhuU0VGQlowZzdTVUZEYUVnc1RVRkJUU3hQUVVGUExFZEJRVWNzU1VGQlNTeG5Ra0ZCWjBJc1EwRkJReXhGUVVGRExHRkJRV0VzUlVGQlJTeGhRVUZoTEVsQlFVa3NRMEZCUXl4RlFVRkZMR0ZCUVdFc1JVRkJSU3hQUVVGUExFbEJRVWtzUTBGQlF5eEZRVUZETEVOQlFVTXNRMEZCUXp0SlFVTjJSeXhQUVVGUExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRPMGxCUTNCQ0xFbEJRVWtzUjBGQlJ5eEhRVUZSTEVsQlFVa3NRMEZCUXp0SlFVTndRaXhKUVVGSkxGTkJRVk1zUlVGQlJTeERRVUZETzFGQlEyUXNTVUZCU1N4RFFVRkRPMWxCUTBnc1IwRkJSeXhIUVVGSExFMUJRVTBzVDBGQlR5eERRVUZETEdWQlFXVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUXpsRUxFTkJRVU03VVVGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlN4RFFVRkRPMWxCUTFnc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eDFSRUZCZFVRc1EwRkJReXhEUVVGRE8xbEJRM1pGTEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGJrSXNRMEZCUXp0SlFVTklMRU5CUVVNN1NVRkRSQ3hKUVVGSkxFTkJRVU1zUjBGQlJ6dFJRVU5PTEVkQlFVY3NSMEZCUnl4TlFVRk5MRTlCUVU4c1EwRkJReXhUUVVGVExFTkJRVU1zVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dEpRVU40UkN4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETzBsQlJYWkNMRmRCUVZjc1EwRkJReXhGUVVGRExFZEJRVWNzUlVGQlF5eERRVUZETEVOQlFVTTdRVUZEY2tJc1EwRkJReXhEUVVGRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdHRkV3gwYVVOdmJGZGxZa2RRVlZOd1lYSnpaVTFoZEhKcGVIMGdabkp2YlNBblFHUmhkR0ZuY205ckxXeHBZbkpoY21sbGN5OXRZWFJvTDNOeVl5OTNaV0pIVUZVdmMzQmhjbk5sTFcxaGRISnBlQzkzWldKSFVGVXRjM0JoY25ObExXMWhkSEpwZUNjN1hHNXBiWEJ2Y25RZ2UxTndZWEp6WlUxaGRISnBlRkpsYzNWc2RDd2dVM0JoY25ObFRXRjBjbWw0VTJWeWRtbGpaWDBnWm5KdmJTQW5MaTR2WkdsemRHRnVZMlV0YldGMGNtbDRMM053WVhKelpTMXRZWFJ5YVhndGMyVnlkbWxqWlNjN1hHNXBiWEJ2Y25RZ2UwUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSOUlHWnliMjBnSnk0dUwyUnBjM1JoYm1ObExXMWhkSEpwZUM5MGVYQmxjeWM3WEc1cGJYQnZjblFnZTB0dWIzZHVUV1YwY21samMzMGdabkp2YlNBbkxpNHZkSGx3WldRdGJXVjBjbWxqY3ljN1hHNXBiWEJ2Y25RZ2UwMURURk53WVhKelpWSmxaSFZqWlhKOUlHWnliMjBnSnk0dmJXRnlZMjkyTFdOc2RYTjBaWEluTzF4dVhHNXZibTFsYzNOaFoyVWdQU0JoYzNsdVl5QW9aWFpsYm5RcElEMCtJSHRjYmlBZ1kyOXVjM1FnZTJSaGRHRXNJSFJvY21WemFHOXNaQ3dnZDJWcFoyaDBjeXdnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFzSUdScGMzUmhibU5sUm01QmNtZHpMQ0JrYVhOMFlXNWpaVVp1Y3l3Z2JXRjRTWFJsY21GMGFXOXVjeXdnZFhObFYyVmlSMUJWTENCcGJtWnNZWFJsZlRwY2JpQWdJSHRjYmlBZ0lDQmtZWFJoT2lCaGJubGJYVnRkTENCMGFISmxjMmh2YkdRNklHNTFiV0psY2l4Y2JpQWdJQ0IzWldsbmFIUnpPaUJ1ZFcxaVpYSmJYU3dnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlE2SUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFzWEc0Z0lDQWdaR2x6ZEdGdVkyVkdibk02SUV0dWIzZHVUV1YwY21samMxdGRMQ0JrYVhOMFlXNWpaVVp1UVhKbmN6b2dZVzU1VzEwc0lHMWhlRWwwWlhKaGRHbHZibk02SUc1MWJXSmxjaXhjYmlBZ0lDQjFjMlZYWldKSFVGVS9PaUJpYjI5c1pXRnVMQ0JwYm1ac1lYUmxQem9nYm5WdFltVnlYRzRnSUgwZ1BTQmxkbVZ1ZEM1a1lYUmhPMXh1WEc0Z0lHTnZibk52YkdVdWRHbHRaU2duYzNCaGNuTmxJRzFoZEhKcGVDY3BPMXh1SUNCc1pYUWdjM0JoY25ObE9pQlRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUWdmQ0J1ZFd4c0lEMGdiblZzYkR0Y2JpQWdhV1lnS0hWelpWZGxZa2RRVlNrZ2UxeHVJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQnpjR0Z5YzJVZ1BTQmhkMkZwZENCdGRXeDBhVU52YkZkbFlrZFFWVk53WVhKelpVMWhkSEpwZUNoY2JpQWdJQ0FnSUNBZ1pHRjBZU3dnZEdoeVpYTm9iMnhrSUM4Z01UQXdMQ0JrYVhOMFlXNWpaVVp1Y3lCaGN5QmhibmtzSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrSUdGeklHRnVlU3dnZDJWcFoyaDBjeXdnWkdsemRHRnVZMlZHYmtGeVozTXBPMXh1SUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJR052Ym5OdmJHVXVaWEp5YjNJb1pTazdYRzRnSUNBZ2ZWeHVJQ0I5WEc0Z0lHbG1JQ2doYzNCaGNuTmxLU0I3SUM4dklHWmhiSE5pWVdOcklIUnZJRU5RVlZ4dUlDQWdJR2xtSUNoMWMyVlhaV0pIVUZVcFhHNGdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLQ2RYUlVKSFVGVWdjM0JoY25ObElHMWhkSEpwZUNCallXeGpkV3hoZEdsdmJpQm1ZV2xzWldRc0lHWmhiR3hwYm1jZ1ltRmpheUIwYnlCRFVGVWdhVzF3YkdWdFpXNTBZWFJwYjI0bktUdGNibHh1SUNBZ0lITndZWEp6WlNBOUlHRjNZV2wwSUc1bGR5QlRjR0Z5YzJWTllYUnlhWGhUWlhKMmFXTmxLQ2xjYmlBZ0lDQWdJQzVqWVd4alRYVnNkR2xEYjJ4MWJXNG9aR0YwWVN3Z1pHbHpkR0Z1WTJWR2JuTXNJSFJvY21WemFHOXNaQ0F2SURFd01Dd2daR2x6ZEdGdVkyVkdia0Z5WjNNc0lIZGxhV2RvZEhNc0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a0tUdGNiaUFnZlZ4dUlDQmpiMjV6YjJ4bExuUnBiV1ZGYm1Rb0ozTndZWEp6WlNCdFlYUnlhWGduS1R0Y2JseHVJQ0F2TDJOdmJuTjBJSEpsY3lBOUlHRjNZV2wwSUc1bGR5Qk5RMHhUY0dGeWMyVlNaV1IxWTJWeUtIdHRZWGhKZEdWeVlYUnBiMjV6T2lCdFlYaEpkR1Z5WVhScGIyNXpJRDgvSURWOUtTNTBjbUZ1YzJadmNtMG9jM0JoY25ObExDQmtZWFJoV3pCZExteGxibWQwYUNrN1hHNGdJR052Ym5OMElISmxaSFZqWlhJZ1BTQnVaWGNnVFVOTVUzQmhjbk5sVW1Wa2RXTmxjaWg3YldGNFNYUmxjbUYwYVc5dWN6b2diV0Y0U1hSbGNtRjBhVzl1Y3lBL1B5QTFMQ0JwYm1ac1lYUmxSbUZqZEc5eU9pQnBibVpzWVhSbElEOC9JREo5S1R0Y2JpQWdZMjl1YzI5c1pTNTBhVzFsS0NkTlEwd25LVHRjYmlBZ2JHVjBJSEpsY3pvZ1lXNTVJRDBnYm5Wc2JEdGNiaUFnYVdZZ0tIVnpaVmRsWWtkUVZTa2dlMXh1SUNBZ0lIUnllU0I3WEc0Z0lDQWdJQ0J5WlhNZ1BTQmhkMkZwZENCeVpXUjFZMlZ5TG5SeVlXNXpabTl5YlZkbFlrZFFWU2h6Y0dGeWMyVXNJR1JoZEdGYk1GMHViR1Z1WjNSb0tUdGNiaUFnSUNCOUlHTmhkR05vSUNobEtTQjdYRzRnSUNBZ0lDQmpiMjV6YjJ4bExtVnljbTl5S0NkM1pXSkhVRlVnVFVOTUlHWmhhV3hsWkN3Z1ptRnNiR2x1WnlCaVlXTnJJSFJ2SUVOUVZTQnBiWEJzWlcxbGJuUmhkR2x2YmljcE8xeHVJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWhsS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnYVdZZ0tDRnlaWE1wWEc0Z0lDQWdjbVZ6SUQwZ1lYZGhhWFFnY21Wa2RXTmxjaTUwY21GdWMyWnZjbTBvYzNCaGNuTmxMQ0JrWVhSaFd6QmRMbXhsYm1kMGFDazdYRzRnSUdOdmJuTnZiR1V1ZEdsdFpVVnVaQ2duVFVOTUp5azdYRzVjYmlBZ2NHOXpkRTFsYzNOaFoyVW9lM0psYzMwcE8xeHVmVHRjYmlKZGZRPT0iXSwibmFtZXMiOlsiV0VCR1NMQUdHUkVHQVRJT04iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwiY2h1bmtJZCIsImciLCJnbG9iYWxUaGlzIiwidGhpcyIsIkZ1bmN0aW9uIiwiZSIsIndpbmRvdyIsIm8iLCJvYmoiLCJwcm9wIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic2NyaXB0VXJsIiwiaW1wb3J0U2NyaXB0cyIsImxvY2F0aW9uIiwiZG9jdW1lbnQiLCJjdXJyZW50U2NyaXB0Iiwic3JjIiwic2NyaXB0cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwibGVuZ3RoIiwiaSIsInRlc3QiLCJFcnJvciIsInJlcGxhY2UiLCJwIiwiYiIsInNlbGYiLCJXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUyIsIkVVQ0xJREVBTiIsImFycmF5U2l6ZSIsIk1BTkhBVFRBTiIsIldFQkdQVURJU1RBTkNFIiwid2ViR1BVRnVuY3Rpb25zIiwiSEFNTUlORyIsIl9tYXhBcnJheVNpemUiLCJlbnRyeUluZGV4IiwibWF4QXJyYXlTaXplIiwiX2VudHJ5SW5kZXgiLCJUQU5JTU9UTyIsIkxFVkVOU1RFSU4iLCJORUVETEVNQU5fV1VOU0NIIiwiTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSIsIlNPS0FMIiwiQ09TSU5FIiwiQVNZTU1FVFJJQyIsIkRpZmZlcmVuY2UiLCJPbmVIb3QiLCJkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSIsIm1heEVudHJ5U2l6ZSIsIk1hdGgiLCJjZWlsIiwiX21heEVudHJ5U2l6ZSIsIlR5cGVTdXBwb3J0ZWREaXN0YW5jZXMiLCJTZXQiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJncHVBZGFwdGVyIiwiZ3B1RGV2aWNlIiwiZ2V0R1BVRGV2aWNlIiwibmF2aWdhdG9yIiwiZ3B1IiwicmVxdWVzdEFkYXB0ZXIiLCJwb3dlclByZWZlcmVuY2UiLCJpc0xvc3QiLCJsb3N0IiwiciIsInNldFRpbWVvdXQiLCJyZXF1aXJlZEJ1ZmZlclNpemUiLCJhZGFwdGVyTGltaXRzIiwibGltaXRzIiwiYnVmZmZlclNpemVMaW1pdCIsIm1heEJ1ZmZlclNpemUiLCJzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0IiwibWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIiwicmVxdWVzdERldmljZSIsInJlcXVpcmVkTGltaXRzIiwibWluIiwiY29uc29sZSIsImVycm9yIiwiRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMiLCJtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeCIsImVudHJ5TGlzdCIsInRocmVzaG9sZCIsImRpc3RhbmNlTWV0cmljcyIsImFnZ3JlZ2F0aW9uRnVuY3Rpb24iLCJ3ZWlnaHRzIiwib3B0aW9ucyIsImRldmljZSIsImF2YWlsYWJsZURpc3RhbmNlTWV0cmljcyIsInZhbHVlcyIsInNvbWUiLCJtZXRyaWMiLCJpbmNsdWRlcyIsImpvaW4iLCJtYXhEaXN0YW5jZSIsImxpc3QiLCJudW1PZkNvbHVtbnMiLCJsaXN0U2l6ZSIsInByb2Nlc3NJbmZvIiwibWFwIiwiZW50cnkiLCJkaXN0YW5jZU1ldHJpYyIsImdhcE9wZW5QZW5hbHR5IiwiZ2FwRXh0ZW5zaW9uUGVuYWx0eSIsIl9hIiwiX2IiLCJlbnRyeVR5cGUiLCJlbmNvZGVkTGlzdCIsIlVpbnQzMkFycmF5Iiwic3BsaXQiLCJjIiwiY2hhckNvZGVBdCIsIkZsb2F0MzJBcnJheSIsIl9kYXRhIiwiSW50MzJBcnJheSIsImVuY29kZWRMaXN0VHlwZSIsImFycmF5U2l6ZXMiLCJhcnIiLCJoYXMiLCJtYXhFbnRyeUxlbiIsInJlZHVjZSIsImEiLCJtYXgiLCJjb21wbGV4aXR5IiwiRW5jb2RlZEFycmF5Q29uc3RydWN0b3IiLCJmbGF0U291cmNlQXJyYXkiLCJmb3JFYWNoIiwic2VxIiwic2V0Iiwic3VwcEluZm9TdHJ1Y3RXZ3NsIiwic3VwcEluZm9TaXplIiwic3VwcEluZm9UeXBlIiwic3VwcEluZm9CdWZmZXIiLCJtYXhNb25vbWVySW5kZXgiLCJzY29yaW5nTWF0cml4IiwiYWxwaGFiZXRJbmRleGVzIiwia2V5cyIsInByZXYiLCJuIiwiQXJyYXkiLCJmaWxsIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2ltaWxhcml0eU1hdHJpeFNpemUiLCJ0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeCIsImtleSIsImtleTIiLCJvZmZzZXQiLCJyYW5nZSIsImRhdGFUeXBlV0dTTCIsImRhdGFTdHJ1Y3RXZ3NsIiwic291cmNlQXJyYXlTaXplIiwid2ViR1BVUHJvY2Vzc0luZm8iLCJzdXBwSW5mb1dnc2wiLCJpbmZvIiwiZmlsdGVyIiwid2dzbCIsIm5lZWRzRHVtbXkiLCJ0cmltIiwiZGF0YVdnc2wiLCJudW1PZlRocmVhZHMiLCJzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkIiwiY29tYmluZWRDb21wbGV4aXR5IiwibWF4SXRlcmF0aW9uc1BlclRocmVhZCIsIndvcmtncm91cHNEaW0iLCJzcXJ0IiwiZ2xvYmFsVGhyZWFkRGltU2l6ZSIsImNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSIsImRtQ2h1bmtTaXplUGVyVGhyZWFkIiwibW9kdWxlIiwiY3JlYXRlU2hhZGVyTW9kdWxlIiwibGFiZWwiLCJjb2RlIiwiZ2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdCIsInBpcGVsaW5lIiwiY3JlYXRlQ29tcHV0ZVBpcGVsaW5lIiwibGF5b3V0IiwiY29tcHV0ZSIsImVudHJ5UG9pbnQiLCJzdGFydEF0Q29scyIsInN0YXJ0QXRSb3dzIiwiZW5kQXRDb2xzIiwiZW5kQXRSb3dzIiwiY2h1bmtTaXplIiwiZmxvb3IiLCJzdGFydFJvdyIsInN0YXJ0Q29sIiwidGltZSIsImVuZElkeCIsImVuZFJvdyIsImVuZENvbCIsInRpbWVFbmQiLCJjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSIsInN1cHBJbmZvQnVmZmVyMzJTaXplIiwic3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplIiwiY29tcHV0ZUluZm9CdWZmZXJTaXplIiwiQllURVNfUEVSX0VMRU1FTlQiLCJwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUiLCJyZW1haW5kZXIiLCJjb21wdXRlSW5mb0J1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsInNpemUiLCJ1c2FnZSIsIkdQVUJ1ZmZlclVzYWdlIiwiU1RPUkFHRSIsIkNPUFlfU1JDIiwiQ09QWV9EU1QiLCJtYXBwZWRBdENyZWF0aW9uIiwibWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciIsImdldE1hcHBlZFJhbmdlIiwiY29tcHV0ZUluZm9PZmZTZXQiLCJBcnJheUNvbnN0cnVjdG9yIiwidW5tYXAiLCJzdXBwSW5mb0J1ZmZlclNpemUiLCJwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUiLCJzdXBwSW5mb1JlbWFpbmRlciIsIm1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIiLCJzdXBwSW5mb09mZlNldCIsImJ5dGVMZW5ndGgiLCJyZXN1bHRzQnVmZmVyU2l6ZSIsInBhZGRlZFJlc3VsdHNCdWZmZXJTaXplIiwicmVzdWx0c1JlbWFpbmRlciIsInJlc3VsdHNCdWZmZXIiLCJiaW5kR3JvdXAiLCJjcmVhdGVCaW5kR3JvdXAiLCJnZXRCaW5kR3JvdXBMYXlvdXQiLCJlbnRyaWVzIiwiYmluZGluZyIsInJlc291cmNlIiwiYnVmZmVyIiwicmVzdWx0c091dEJ1ZmZlciIsIk1BUF9SRUFEIiwicmVzdWx0SXMiLCJyZXN1bHRKcyIsInJlc3VsdERpc3RhbmNlcyIsImlzQWxsRG9uZSIsImVuY29kZXIiLCJjcmVhdGVDb21tYW5kRW5jb2RlciIsInBhc3MiLCJiZWdpbkNvbXB1dGVQYXNzIiwic2V0UGlwZWxpbmUiLCJzZXRCaW5kR3JvdXAiLCJkaXNwYXRjaFdvcmtncm91cHMiLCJlbmQiLCJjb3B5QnVmZmVyVG9CdWZmZXIiLCJjb21tYW5kQnVmZmVyIiwiZmluaXNoIiwicXVldWUiLCJzdWJtaXQiLCJvblN1Ym1pdHRlZFdvcmtEb25lIiwibWFwQXN5bmMiLCJHUFVNYXBNb2RlIiwiUkVBRCIsInJlc3VsdHNPdXRBcnJheUJ1ZmZlciIsInJlc3VsdE9mZnNldCIsInJlc3VsdHNJIiwicmVzdWx0c0oiLCJyZXN1bHRzRGlzdGFuY2VzIiwicmVzdWx0c0ZvdW5kIiwiZXZlcnkiLCJkIiwidG90YWxSZXN1bHRzIiwiY29tYmluZWRJIiwiY29tYmluZWRKIiwiY29tYmluZWREaXN0YW5jZXMiLCJjb21iaW5lZE9mZnNldCIsInJlc0kiLCJmb3VuZCIsInN1YmFycmF5IiwicHVzaCIsInRvdGFsU2l6ZSIsImZpbmFsSSIsImZpbmFsSiIsImZpbmFsRGlzdGFuY2VzIiwiZmluYWxPZmZzZXQiLCJkZXN0cm95IiwiaiIsImRpc3RhbmNlIiwibWF4RW50cnlMZW5zIiwiYWdncmVnYXRpb24iLCJfIiwiaXNOaWwiLCJ4IiwiaW5zZXJ0U21hbGxlciIsImRpc3RhbmNlc0FyIiwiaW5kZXhlcyIsIm51bSIsImluZGV4IiwibmV3UG9zaXRpb24iLCJmaW5kSW5kZXgiLCJ2IiwicG9wIiwic3BsaWNlIiwiU3BhcnNlTWF0cml4U2VydmljZSIsImNvbnN0cnVjdG9yIiwiX3dvcmtlckNvdW50IiwiaGFyZHdhcmVDb25jdXJyZW5jeSIsImNhbGNNdWx0aUNvbHVtbiIsImZuTmFtZXMiLCJvcHRzIiwiYWdncmVnYXRpb25NZXRob2QiLCJtYXRTaXplIiwibWluVGhyZXNob2xkIiwiZ2V0TWluaW1hbFRocmVzaG9sZCIsImxvZyIsInByb21pc2VzIiwid29ya2VycyIsIldvcmtlciIsIlVSTCIsImlkeCIsInJlc29sdmVXb3JrZXIiLCJyZWplY3RXb3JrZXIiLCJzdGFydElkeCIsInBvc3RNZXNzYWdlIiwib25tZXNzYWdlIiwiZGF0YSIsInRlcm1pbmF0ZSIsInJlc3VsdHMiLCJhbGwiLCJmdWxsU2l6ZSIsImFjYyIsInZhbCIsInJlcyIsImNhbGMiLCJmbk5hbWUiLCJnZXRLTk4iLCJuTmVpZ2hib3VycyIsIm11bHRpQ29sdW1uS05OIiwiZ2V0VGhyZXNob2xkS05OIiwibXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4iLCJrbm5EaXN0YW5jZXMiLCJrbm5JbmRleGVzIiwia25uU2l6ZXMiLCJrbm5SZXMiLCJnZXRTYW1wbGVEaXN0YW5jZXMiLCJ0aHJlc2hvbGRXb3JrZXJzIiwibWF4U2FtcGxlU2l6ZSIsInNhbXBsZVNpc2UiLCJ0ZXN0U2V0U2l6ZVBlcldvcmtlciIsInRQcm9taXNlcyIsInNhbXBsZUxlbmd0aCIsInNvcnQiLCJ3IiwiY2FsY1N5bmMiLCJkaXN0YW5jZUZuIiwiZGlzdGFuY2VzIiwiY250IiwibWkiLCJtaiIsImFzeW5jIiwiYmlvTGF5b3V0IiwiY2x1c3RlciIsInNwYXJzZU9iamVjdCIsImlzIiwianMiLCJlbWJlZFgiLCJyYW5kb20iLCJlbWJlZFkiLCJ4VmVsb2NpdGllcyIsInlWZWxvY2l0aWVzIiwidGVtcGVyYXR1cmUiLCJkeCIsImR5IiwiYWJzIiwidmVjU2l6ZSIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJyYW5nZVgiLCJyYW5nZVkiLCJnZXRMYXlvdXRFbWJlZGRpbmdzIiwic3BhcnNlS05OTm9yYWxpemVDb2x3aXNlIiwia25uU2ltaWxhcml0aWVzIiwib2Zmc2V0cyIsIm5Sb3dzIiwibmVlZGVkVGhyZWFkcyIsIm5lZWRlZFdvcmtHcm91cHMiLCJ3b3JrR3JvdXBUaHJlYWRzUGVyRGltIiwid29ya0dyb3VwRGltIiwidGhyZWFkc1BlckRpbSIsInNpbW1pbGFyaXRpZXNCdWZmZXIiLCJvZmZzZXRzQnVmZmVyIiwiY29tbWFuZEVuY29kZXIiLCJwYXNzRW5jb2RlciIsIm91dFNpbWlsYXJpdHlCdWZmZXIiLCJhcnJheUJ1ZmZlciIsImluZmxhdGUiLCJmYWN0b3IiLCJwb3ciLCJleHBhbmROb1Jldml2ZSIsIm9yZGVyIiwibG9nMTAiLCJwcnVuZVZhbHVlIiwib3V0S05OU2ltaWxhcml0aWVzIiwic3BhcnNlS05OQnVmZmVyQnl0ZVNpemUiLCJzcGFyc2VLTk5CdWZmZXIiLCJzcGFyc2VLTk5BcnJheUJ1ZmZlciIsInJvd0luZGV4ZXMiLCJnZXRSb3dJbmRleGVzIiwic3RhcnRCdWZmZXIiLCJyZXN1bHRCbG9ja0J1ZmZlciIsIm91dEJsb2NrQnVmZmVyIiwic3RhcnQiLCJjdXJMZW5ndGgiLCJ3cml0ZUJ1ZmZlciIsIm91dEJsb2NrIiwiS05OSW5kZXhlcyIsIktOTlNpbWlsYXJpdGllcyIsImluZGV4T2Zmc2V0cyIsInRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0iLCJzcGFyc2VNYXRyaXgiLCJvY2N1cmVuY2VDb3VudCIsImNvdW50T2NjdXJhbmNlc0FkZExvb3BzIiwib2Zmc2V0Rm9ybSIsImFyIiwiaW5zZXJ0Q291bnRlciIsInJvdyIsImNvbCIsInNpbWlsYXJpdHkiLCJ0b1N0cmluZyIsImRlZmF1bHRNQ0xPcHRpb25zIiwiZXhwYW5kRmFjdG9yIiwibWF4SXRlcmF0aW9ucyIsImluZmxhdGVGYWN0b3IiLCJtdWx0RmFjdG9yIiwiTUNMU3BhcnNlUmVkdWNlciIsIl9vcHRpb25zIiwidHJhbnNmb3JtIiwidG9PYmplY3RGb3JtIiwiYWRkTG9vcHMiLCJub3JtYWxpemUiLCJleHBhbmQiLCJjbHVzdGVycyIsImFzc2lnbkNsdXN0ZXJzIiwiY29ycmVjdENsdXN0ZXJzIiwiZW1iZWRkaW5ncyIsInRyYW5zZm9ybVdlYkdQVSIsIm1jbFJlcyIsInNwYXJzZUtOTkZvcm0iLCJleHBhbmRSZXMiLCJtYXJrb3ZDbHVzdGVyV2ViR1BVIiwiY3NyVG9TcGFyc2VPYmplY3QiLCJjbHVzdGVyU2l6ZU1hcCIsInNvcnRlZEluZGV4ZXMiLCJOdW1iZXIiLCJjbHVzdGVyTWFwIiwiY2x1c3RlcklkeCIsIm1pbk9yZGVyIiwiayIsImNsdXN0ZXJOdW0iLCJzb3J0ZWRDbHVzdGVyTmFtZXMiLCJwZXJSb3ciLCJ5T2Zmc2V0IiwiY2x1c3Rlck5hbWUiLCJvZmZzZXRYIiwibWVyZ2VDbHVzdGVycyIsImlDbHVzdGVyIiwiakNsdXN0ZXIiLCJyb3VuZCIsImFzc2lnbkNsdXN0ZXJzQ1NSIiwiY29ycmVjdGVkT2Zmc2V0cyIsIm9mZnNldENvdW50ZXIiLCJzdW0iLCJleHBhbmRlZE9iamVjdCIsImdldEV4cGFuZFZhbHVlIiwiY3VycmVudEluZGV4ZXMiLCJvdGhlckluZGV4ZXMiLCJldmVudCIsImRpc3RhbmNlRm5BcmdzIiwiZGlzdGFuY2VGbnMiLCJ1c2VXZWJHUFUiLCJzcGFyc2UiLCJyZWR1Y2VyIl0sInNvdXJjZVJvb3QiOiIifQ==
|
|
2
|
+
//# sourceMappingURL=795.js.map
|