@datagrok/eda 1.1.21 → 1.1.23

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/dist/231.js ADDED
@@ -0,0 +1,2 @@
1
+ var eda;(()=>{"use strict";var e,n,t={9295:(e,n,t)=>{var r;!function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}));const a={[r.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 `},[r.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 i;!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"}(i||(i={}));const o={[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.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 `},[i.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[i.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 `}},s={[i.HAMMING]:e=>Math.ceil(e/30),[i.EUCLIDEAN]:e=>Math.ceil(e/30),[i.MANHATTAN]:e=>Math.ceil(e/30),[i.TANIMOTO]:e=>Math.ceil(e/60),[i.SOKAL]:e=>Math.ceil(e/60),[i.COSINE]:e=>Math.ceil(e/60),[i.ASYMMETRIC]:e=>Math.ceil(e/60),[i.LEVENSTEIN]:e=>Math.ceil(e*e/60),[i.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[i.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[i.Difference]:e=>1,[i.OneHot]:e=>Math.ceil(e/40)},u={STRING:new Set([i.HAMMING,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.MONOMER_CHEMICAL_DISTANCE,i.OneHot]),UINT32ARRAY:new Set([i.HAMMING,i.EUCLIDEAN,i.MANHATTAN,i.MONOMER_CHEMICAL_DISTANCE,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC,i.OneHot,i.Difference]),INT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.OneHot,i.Difference]),FLOAT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),NUMBER:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),BITARRAY:new Set([i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC])};var l=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};let f=null,c=null;function d(){return l(this,void 0,void 0,(function*(){if(!f&&(f=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==f))return null;let e=!1;if(c&&(c.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!c||e){const e=1e9,n=f.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return c=yield f.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),c}catch(e){return console.error("Failed to create device with required limits",e),c=yield f.requestDevice(),c}}return c}))}function p(e,n=.8,t,a,o,l){return f=this,c=void 0,h=function*(){const f=yield d();if(!f)return null;const c=Object.values(i);if(t.some((e=>!c.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(r).includes(a))throw new Error("Invalid aggregation function provided: "+a);const p=1-n;if(l.length!==e.length||l.length!==t.length||l.length!==o.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const h=e.length,g=e[0].length,y=e.map(((e,n)=>function(e,n=i.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var a,o;let l=null;const f=e.some((e=>"string"==typeof e))?(l="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(l="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(l="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(l="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(l="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(l="INT32ARRAY",e):void 0;if(!f||!l)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(!u[l]||!u[l].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${l}'`);const p=d.reduce(((e,n)=>Math.max(e,n)),0),m=s[n](p),h="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new h(f.length*p);f.forEach(((e,n)=>{g.set(e,n*p)}));let y="",A=0,b="FLOAT32ARRAY",w=null;if(n===i.NEEDLEMAN_WUNSCH||n===i.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),i=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)i[n][n]=1;const s=r.alphabetIndexes;for(const e of Object.keys(s))for(const n of Object.keys(s))e!==n&&(i[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[s[e]][s[n]]);A=2+n,b="FLOAT32ARRAY",w=new Float32Array(A),w[0]=null!==(a=r.gapOpenPenalty)&&void 0!==a?a:1,w[1]=null!==(o=r.gapExtensionPenalty)&&void 0!==o?o:.6;let u=2;for(let e=0;e<i.length;e++)w.set(i[e],u),u+=i[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===i.Difference){if(!r.range||"number"!=typeof r.range||r.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]);r.range=n-e}r.range<=0&&(r.range=1),A=1,b="FLOAT32ARRAY",w=new Float32Array([r.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",E=`data${t}: array<array<${x}, ${p}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:p,arraySizes:d,complexity:m,suppInfoBuffer:w,suppInfoSize:A,suppInfoType:b,suppInfoStructWgsl:y,entryType:l,dataTypeWGSL:x,dataStructWgsl:E,EncodedArrayConstructor:h}}(e,t[n],n,l[n])));if(0===h)throw new Error("No columns provided. Please provide at least one column of data.");1===h&&(a=r.MANHATTAN);let A=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),b=!1;A&&""!=A.trim()||(b=!0,A="\ndummy: f32\n");const w=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(h*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const E=1e4,I=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),B=10*v,S=g*(g-1)/2,U=Math.ceil(S/E),C=f.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 ${U} 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}>, ${h}>,\n // the weights for each entry\n weights: array<f32, ${h}>,\n // the data for each entry\n ${w} // 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 ${A}\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 ${b?"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 * ${B} + 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 <= ${p}) {\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(t,y.map((e=>e.maxEntryLen)),p,a)}\n\n\n `}),O=f.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:C,entryPoint:"calcSparseMatrix"}}),L=new Uint32Array(E),P=new Uint32Array(E),R=new Uint32Array(E),T=new Uint32Array(E),_=Math.floor(S/E);let j=0,$=1;console.time("GPUthreadStarts");for(let e=0;e<E;e++){const n=9999===e?S-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);L[e]=$,P[e]=j,R[e]=r,T[e]=t,j=t,$=r}console.timeEnd("GPUthreadStarts");const G=4e4+g*h+h+y.reduce(((e,n)=>e+n.sourceArraySize),0),D=y.reduce(((e,n)=>e+n.suppInfoSize),0),z=1e6,k=G*Uint32Array.BYTES_PER_ELEMENT;let Y=k;const F=15&k;0!==F&&(Y+=16-F);const H=f.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,E).set(L),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(P),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(R),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(T),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,h).set(o),W+=h*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=D*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const Z=f.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),J=Z.getMappedRange();let Q=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(J,Q,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Q+=e.suppInfoBuffer.byteLength);0===Q&&new Uint32Array(J,0,4).set([1,1,1,1]),Z.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15&ee;0!==te&&(ne+=16-te);const re=f.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=f.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:O.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:Z}},{binding:2,resource:{buffer:re}}]}),ie=f.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],ue=[];let le=!1;for(;!le;){const e=f.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(O),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();f.queue.submit([t]),yield f.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,z);a+=z*Float32Array.BYTES_PER_ELEMENT;const u=new Uint32Array(r,a,E);a+=E*Uint32Array.BYTES_PER_ELEMENT,le=new Uint32Array(r,a,E).every((e=>1===e));const l=u.reduce(((e,n)=>e+n),0),c=new Uint32Array(l),d=new Uint32Array(l),p=new Float32Array(l);let m=0;for(let e=0;e<u.length;e++){const n=u[e];0!==n&&(c.set(i.subarray(e*I,e*I+n),m),d.set(o.subarray(e*I,e*I+n),m),p.set(s.subarray(e*I,e*I+n),m),m+=n)}oe.push(c),se.push(d),ue.push(p),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),pe=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),pe.set(ue[e],me),me+=oe[e].length;return H.destroy(),Z.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:pe}},new((p=void 0)||(p=Promise))((function(e,n){function t(e){try{a(h.next(e))}catch(e){n(e)}}function r(e){try{a(h.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof p?a:new p((function(e){e(a)}))).then(t,r)}a((h=h.apply(f,c||[])).next())}));var f,c,p,h}function m(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = ${t};\n ${o[e](n[r],r)}\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 ${a[r](e.length)}\n }\n \n `}var h=t(2590);async function g(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],u=e[s];n[r]?.[u]>=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 u=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],l=n[t],f=r[s]-r[l],c=a[s]-a[l];Math.abs(f)>=1&&(i[s]-=u*f,i[l]+=u*f),Math.abs(c)>=1&&(o[s]-=u*c,o[l]+=u*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*u,a[e]+=o[e]/n*u)}}let s=r[0],u=a[0],l=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),u=Math.min(u,a[e]),l=Math.max(l,r[e]),f=Math.max(f,a[e]);let c=l-s,d=f-u;0===c&&(c=l);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]-u)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}function y(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,u=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 `}),l=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:u,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:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),p=e.createCommandEncoder(),m=p.beginComputePass();m.setPipeline(l),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const h=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});p.copyBufferToBuffer(f,0,h,0,n.byteLength),e.queue.submit([p.finish()]),yield e.queue.onSubmittedWorkDone(),yield h.mapAsync(GPUMapMode.READ);const g=new Float32Array(h.getMappedRange());n.set(g),h.unmap(),f.destroy(),c.destroy(),h.destroy()},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function r(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}u((s=s.apply(a,i||[])).next())}));var a,i,o,s}function A(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function b(e,n,t,r,a){return i=this,o=void 0,u=function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),u=10*s,l=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-l),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 * ${u} + 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 `}),p=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 h=15&m;0!==h&&(m+=16-h);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 A=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),A.length).set(A),g.unmap();const b=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(b.getMappedRange()).set([0]),b.unmap();const w=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:w}},{binding:2,resource:{buffer:b}}]}),E=e.createBuffer({label:"out block buffer",size:w.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(b,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),u=o.beginComputePass({label:"expand compute pass"});u.setPipeline(p),u.setBindGroup(0,x),u.dispatchWorkgroups(s,s),u.end(),o.copyBufferToBuffer(w,0,E,0,E.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield E.mapAsync(GPUMapMode.READ);const l=new Float32Array(E.getMappedRange(),0,a);c.set(l,r),E.unmap()}return g.destroy(),b.destroy(),w.destroy(),E.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{a(u.next(e))}catch(e){n(e)}}function r(e){try{a(u.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((u=u.apply(i,o||[])).next())}));var i,o,s,u}function w(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],u=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=u,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=u,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const x={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class E{constructor(e={}){this._options={...x,...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){return r=this,a=void 0,o=function*(){const r=yield d();if(!r)throw new Error("no gpu device found");const a=w(e,n);yield y(r,a.KNNSimilarities,a.indexOffsets,n);let i=a;for(let e=0;e<t;e++){const e=yield b(r,i.KNNSimilarities,i.KNNIndexes,i.indexOffsets,n);A(e.KNNSimilarities,2),yield y(r,e.KNNSimilarities,e.indexOffsets,n),i=e}return i},new((i=void 0)||(i=Promise))((function(e,n){function t(e){try{u(o.next(e))}catch(e){n(e)}}function s(e){try{u(o.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof i?r:new i((function(e){e(r)}))).then(t,s)}u((o=o.apply(r,a||[])).next())}));var r,a,i,o}(e,n,this._options.maxIterations),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[e]-n[t])),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 u=6,l=0;for(const e of s){const t=i[e],s=await g(t,n,.001);o===Math.ceil(u/1.5)&&(o=0,l+=5/u,u=Math.ceil(1.5*u));const f=o%u*5/u*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/u+f,a[t[e]]=5*s.embedY[e]/u+l;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),u=new Uint32Array(n+1);let l=0;u[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const u=e.KNNIndexes[n];u<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(u),l++,-1!==s[i]&&-1!==s[u]?s[i]!==s[u]&&this.mergeClusters(s,i,u):-1!==s[i]?s[u]=s[i]:-1!==s[u]?s[i]=s[u]:(t++,s[i]=t,s[u]=t))}u[i+1]=l}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:u}}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:u}=e.data;console.time("sparse matrix");let l=null;if(u)try{l=await p(n,t/100,o,a,r,i)}catch(e){console.error(e)}l||(u&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),l=await(new h._).calcMultiColumn(n,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const f=new E({maxIterations:s??5});console.time("MCL");let c=null;if(u)try{c=await f.transformWebGPU(l,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}c||(c=await f.transform(l,n[0].length)),console.timeEnd("MCL"),postMessage({res:c})}},6814:(e,n,t)=>{t.d(n,{cZ:()=>a,kK:()=>r}),t(7862);const r=e=>null==e;function a(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)}}},r={};function a(e){var n=r[e];if(void 0!==n)return n.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,a),i.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[590],(()=>a(9295)));return a.O(e)},e=[],a.O=(n,t,r,i)=>{if(!t){var o=1/0;for(f=0;f<e.length;f++){for(var[t,r,i]=e[f],s=!0,u=0;u<t.length;u++)(!1&i||o>=i)&&Object.keys(a.O).every((e=>a.O[e](t[u])))?t.splice(u--,1):(s=!1,i<o&&(o=i));if(s){e.splice(f--,1);var l=r();void 0!==l&&(n=l)}}return n}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[t,r,i]},a.d=(e,n)=>{for(var t in n)a.o(n,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((n,t)=>(a.f[t](e,n),n)),[])),a.u=e=>e+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var n=a.g.document;if(!e&&n&&(n.currentScript&&(e=n.currentScript.src),!e)){var t=n.getElementsByTagName("script");if(t.length)for(var r=t.length-1;r>-1&&!e;)e=t[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=self.location+"";var e={231:1};a.f.i=(n,t)=>{e[n]||importScripts(a.p+a.u(n))};var n=self.webpackChunkeda=self.webpackChunkeda||[],t=n.push.bind(n);n.push=n=>{var[r,i,o]=n;for(var s in i)a.o(i,s)&&(a.m[s]=i[s]);for(o&&o(a);r.length;)e[r.pop()]=1;t(n)}})(),n=a.x,a.x=()=>a.e(590).then(n);var i=a.x();eda=i})();
2
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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c0MsRUFBYUMsR0FBV3ZFLEVBQ3ZDLElBQUksSUFBSXdCLEtBQVk4QyxFQUNoQi9DLEVBQW9CZSxFQUFFZ0MsRUFBYTlDLEtBQ3JDRCxFQUFvQk0sRUFBRUwsR0FBWThDLEVBQVk5QyxJQUloRCxJQURHK0MsR0FBU0EsRUFBUWhELEdBQ2RTLEVBQVM3VixRQUNkK1gsRUFBZ0JsQyxFQUFTWixPQUFTLEVBQ25DZ0QsRUFBMkJwRSxFQUFLLEMsS3ZCbkI3QnBaLEVBQU8yYSxFQUFvQlosRUFDL0JZLEVBQW9CWixFQUFJLElBQ2hCWSxFQUFvQm5ZLEVBQUUsS0FBS0ksS0FBSzVDLEd3QkR4QyxJQUFJa2IsRUFBc0JQLEVBQW9CWixJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9zdGFydHVwIGNodW5rIGRlcGVuZGVuY2llcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtYWdncmVnYXRpb24uanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcy5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvZ2V0R1BVRGV2aWNlLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9zcGFyc2UtbWF0cml4L3dlYkdQVS1zcGFyc2UtbWF0cml4LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9wcmVwcm9jZXNzaW5nL3dlYkdQVS1wcm9jZXNzLWluZm8uanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9iaW8tbGF5b3V0LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvY29sd2lzZS1ub3JtYWxpemUuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9pbmZsYXRlLWV4cGFuZC5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML3V0aWxzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS91bWFwL3V0aWxzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvbm9kZV9tb2R1bGVzL2lzLWFueS1hcnJheS9saWItZXNtL2luZGV4LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWFyY292LWNsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9NQ0wtd2ViR1BVLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWNsLXdvcmtlci5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvZGlzdGFuY2UtbWF0cml4L3V0aWxzLmpzIiwid2VicGFjazovL2VkYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZW5zdXJlIGNodW5rIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvaW1wb3J0U2NyaXB0cyBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3N0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRlZmVycmVkID0gW107XG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8gPSAocmVzdWx0LCBjaHVua0lkcywgZm4sIHByaW9yaXR5KSA9PiB7XG5cdGlmKGNodW5rSWRzKSB7XG5cdFx0cHJpb3JpdHkgPSBwcmlvcml0eSB8fCAwO1xuXHRcdGZvcih2YXIgaSA9IGRlZmVycmVkLmxlbmd0aDsgaSA+IDAgJiYgZGVmZXJyZWRbaSAtIDFdWzJdID4gcHJpb3JpdHk7IGktLSkgZGVmZXJyZWRbaV0gPSBkZWZlcnJlZFtpIC0gMV07XG5cdFx0ZGVmZXJyZWRbaV0gPSBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV07XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhciBub3RGdWxmaWxsZWQgPSBJbmZpbml0eTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV0gPSBkZWZlcnJlZFtpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNodW5rSWRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoKHByaW9yaXR5ICYgMSA9PT0gMCB8fCBub3RGdWxmaWxsZWQgPj0gcHJpb3JpdHkpICYmIE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uTykuZXZlcnkoKGtleSkgPT4gKF9fd2VicGFja19yZXF1aXJlX18uT1trZXldKGNodW5rSWRzW2pdKSkpKSB7XG5cdFx0XHRcdGNodW5rSWRzLnNwbGljZShqLS0sIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmKHByaW9yaXR5IDwgbm90RnVsZmlsbGVkKSBub3RGdWxmaWxsZWQgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZC5zcGxpY2UoaS0tLCAxKVxuXHRcdFx0dmFyIHIgPSBmbigpO1xuXHRcdFx0aWYgKHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gcjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwidmFyIG5leHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLng7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnggPSAoKSA9PiB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmUoNTkwKS50aGVuKG5leHQpO1xufTsiLCJmdW5jdGlvbiBldWNsaWRlYW5BZ2dyZWdhdGlvbldnc2woYXJyYXlTaXplKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHthcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyBkaXN0YW5jZXNbaV0gKiBkaXN0YW5jZXNbaV0gKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3FydChzdW0pO1xuICAgIGA7XG59XG47XG5mdW5jdGlvbiBtYW5oYXR0YW5BZ2dyZWdhdGlvbldnc2woYXJyYXlTaXplKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHthcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyBhYnMoZGlzdGFuY2VzW2ldKSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICBgO1xufVxuZXhwb3J0IHZhciBXRUJHU0xBR0dSRUdBVElPTjtcbihmdW5jdGlvbiAoV0VCR1NMQUdHUkVHQVRJT04pIHtcbiAgICBXRUJHU0xBR0dSRUdBVElPTltcIkVVQ0xJREVBTlwiXSA9IFwiRVVDTElERUFOXCI7XG4gICAgV0VCR1NMQUdHUkVHQVRJT05bXCJNQU5IQVRUQU5cIl0gPSBcIk1BTkhBVFRBTlwiO1xufSkoV0VCR1NMQUdHUkVHQVRJT04gfHwgKFdFQkdTTEFHR1JFR0FUSU9OID0ge30pKTtcbmV4cG9ydCBjb25zdCBXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUyA9IHtcbiAgICBbV0VCR1NMQUdHUkVHQVRJT04uRVVDTElERUFOXTogZXVjbGlkZWFuQWdncmVnYXRpb25XZ3NsLFxuICAgIFtXRUJHU0xBR0dSRUdBVElPTi5NQU5IQVRUQU5dOiBtYW5oYXR0YW5BZ2dyZWdhdGlvbldnc2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtYWdncmVnYXRpb24uanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLy8gaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3csIHRoZSB2YXJpYWJsZXMgYSBhbmQgYiBhcmUgYXNzdW1lZCB0byBiZSBhcnJheXMgb2YgdWludDMyL2YzMlxuLy92YWx1ZXMgd2hpY2ggYXJlIGluZmVyZWQgZnJvbSB0aGUgY29kZSB0aGlzIGNodW5rIGlzIGluamVjdGVkIGludG9cbi8vIGFsc28sIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXB1dGVJbmZvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4vLyBjb21wdXRlSW5mby5lbnRyeVNpemVzOiBhcnJheSBvZiBhcnJheXMgb2YgdTMyIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mIHRoZSBlbnRyaWVzXG4vLyBvdGhlciBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIHRoZSBkaXN0YW5jZSBmdW5jdGlvbiBzaG91bGQgYmUgaW5qZWN0ZWQgZnJvbSB0aGUgbWFpbiBzY3JpcHQgdGhhdCBjYWxscyB0aGlzIGZ1bmN0aW9uLFxuLy8gYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIHN1cHBsZW1lbnRhcnlJbmZvIHN0cnVjdFxuLy8gbGlrZSB0aGUgc2ltaWxhcml0eSBtYXRyaXggZm9yIG1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2UuXG4vLyB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24gc2hvdWxkIHJldHVybiBjb3JyZWN0IGJ1ZmZlciBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgdGhlIHN1cHBsZW1lbnRhcnlJbmZvLFxuLy8gZm9yIGV2ZXJ5IGVudHJ5IGxpc3Rcbi8vIHRoZSBtYXhEaXN0YW5jZSB2YXJpYWJsZSBpcyBhbHNvIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZVxuLy8gc2NvcGUgb2YgdGhlIGZ1bmN0aW9uLCBpbiBjYXNlIG9mIGtubiBpdCBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGxhc3QgcG9zdGlvbiBvZiBrbm4gb24gdGhpcyBpbmRleCxcbi8vIGluIGNhc2Ugb2Ygc3BhcnNlIG1hdHJpeCwgaXQgY2FuIGJlIGp1c3QgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGRpc3RhbmNlLlxuLy8gaGFtbWluZyBkaXN0YW5jZSBmb3Igc2VxdW5lbmNlcyBvZiB1aW50MzIgYXJyYXlzIG9mIG1heCBsZW5ndGggJHttYXhBcnJheVNpemV9XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVSGFtbWluZyhfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBzaXplRGlmZjogdTMyID0gbWF4TGVuZ3RoIC0gbWluTGVuZ3RoO1xuICBcbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKSAtIGYzMihzaXplRGlmZik7XG5cbiAgdmFyIGRpZmY6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHtfbWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgZGlmZiA9IGRpZmYgKyBmMzIoYVtpXSAhPSBiW2ldKTtcbiAgICAgIGlmIChkaWZmID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICAgIH1cbiAgfVxuICBkaWZmICs9IGYzMihzaXplRGlmZik7XG4gIHJldHVybiBkaWZmIC8gJHtfbWF4QXJyYXlTaXplfTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gaXQgaXMgYXNzdW1ldCB0aGF0IHN1cHBJbmZvIHN0cnVjdCBjb250YWlucyBjb3JyZWN0IG1hdHJpeCBjYWxsZWQgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0sIChzaW1pbGFyaXR5TWF0cml4MCwgc2ltaWxhcml0eU1hdHJpeDEsIGV0YylcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGJ5IHRoZSBnZXRQcm9jZXNzSW5mbyBmdW5jdGlvbi5cbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IHNpemVEaWZmOiB1MzIgPSBtYXhMZW5ndGggLSBtaW5MZW5ndGg7XG4gIFxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpIC0gZjMyKHNpemVEaWZmKTtcblxuICBsZXQgc2ltTWF0cml4ID0gJihzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSk7IC8vIHVzaW5nIHBvaW50ZXJzIG1ha2UgdGhpbmdzIGZhc3RlclxuICB2YXIgZGlmZjogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke19tYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICBkaWZmID0gZGlmZiArIDEuMCAtICgqc2ltTWF0cml4KVt1MzIoYVtpXSldW3UzMihiW2ldKV07XG4gICAgICBpZiAoZGlmZiA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gIH1cbiAgZGlmZiArPSBmMzIoc2l6ZURpZmYpO1xuICByZXR1cm4gZGlmZiAvICR7X21heEFycmF5U2l6ZX07XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTGV2ZW5zdGVpbihtYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcblxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpO1xuXG4gIC8vIHdlIHdpbGwgc3RvcmUgdHdvIGFycmF5cyBhcyBtYXRyaXggYW5kIHN3YXAgdGhlIHdvcmtpbmcgaW5kaWNlcyBwZXIgcGFzcy5cbiAgLy8gdGhpcyB3YXkgd2UgY2FuIHJlZHVjZSBtZW1vcnkgdXNhZ2UgcGVyIGNvbXB1dGF0aW9uIHRvIGp1c3QgTyhhTGVuZ3RoKVxuICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAvLyB0aGlzIHdpbGwgYmUgZ3VhcmFudGVlZCBieSBpdGVyYXRpb24sIGJ1dCB0aGUgYXJyYXkgc2l6ZXMgbXVzdCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIHdpbGwgdXNlIGEgZml4ZWQgc2l6ZSBvZiBtYXhBcnJheVNpemVcbiAgdmFyIGR5bmFtaWNQYXNzTWF0OiBhcnJheTxhcnJheTxmMzIsICR7bWF4QXJyYXlTaXplICsgMX11PiwgMj47IC8vIGluaXRpYWxpemUgdG8gMFxuICBcbiAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgdmFyIGN1ckluZGV4OiB1MzIgPSAxOyAvLyB3ZSB3aWxsIHN3YXAgdGhlc2UgaW5kaWNlcyBwZXIgcGFzc1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICBmb3IgKHZhciBpID0gMHU7IGkgPD0gYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVtpXSA9IGYzMihpKTtcbiAgfVxuXG4gIC8vIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xuICBmb3IgKHZhciBpID0gMXU7IGkgPD0gYkxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdWzBdID0gZjMyKGkpO1xuICAgICAgdmFyIG1pbkVudHJ5OiBmMzIgPSBmMzIobWF4TGVuZ3RoKTtcbiAgICAgIGxldCBwcmV2Um93ID0gJmR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF07XG4gICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgIGxldCBiTW9uID0gdTMyKGJbaSAtIDFdKTtcbiAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgdmFyIGNvc3Q6IGYzMiA9IGYzMihhW2ogLSAxXSAhPSBiTW9uKTtcbiAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgIG1pbihcbiAgICAgICAgICAgICAgICAoKnByZXZSb3cpW2pdICsgMS4wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICgqY3VyUm93KVtqIC0gMV0gKyAxLjAsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAoKnByZXZSb3cpW2ogLSAxXSArIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICgqY3VyUm93KVtqXSA9IHJlcztcbiAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgbWluRW50cnkgPSByZXM7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc3dhcCB0aGUgaW5kaWNlc1xuICAgICAgbGV0IHRlbXA6IHUzMiA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgY3VySW5kZXggPSB0ZW1wO1xuICAgICAgaWYgKG1pbkVudHJ5ID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1bYUxlbmd0aF0gLyBmMzIobWF4TGVuZ3RoKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gobWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gdmVyc2lvbiBvZiB0aGUgbGV2ZW5zaHRhaW4gd2hlcmUgdGhlIGNvc3Qgb2Ygc3Vic3RpdHV0aW9uIGlzIGN1c3RvbWl6YWJsZVxuICAgIC8vIGl0IGlzIGFzc3VtZXQgdGhhdCBzdXBwSW5mbyBzdHJ1Y3QgY29udGFpbnMgY29ycmVjdCBtYXRyaXggY2FsbGVkIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9LCAoc2ltaWxhcml0eU1hdHJpeDAsIHNpbWlsYXJpdHlNYXRyaXgxLCBldGMpXG4gICAgLy8gYW5kIGdhcE9wZW5QZW5hbHR5LCBnYXBFeHRlbnNpb25QZW5hbHR5XG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBieSB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24uXG4gICAgcmV0dXJuIGBcbiAgICAgIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gICAgICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICAgICAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICAgICAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBcbiAgICAgIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSk7XG4gICAgICAvLyB3ZSB3aWxsIHN0b3JlIHR3byBhcnJheXMgYXMgbWF0cml4IGFuZCBzd2FwIHRoZSB3b3JraW5nIGluZGljZXMgcGVyIHBhc3MuXG4gICAgICAvLyB0aGlzIHdheSB3ZSBjYW4gcmVkdWNlIG1lbW9yeSB1c2FnZSBwZXIgY29tcHV0YXRpb24gdG8ganVzdCBPKGFMZW5ndGgpXG4gICAgICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAgICAgLy8gdGhpcyB3aWxsIGJlIGd1YXJhbnRlZWQgYnkgaXRlcmF0aW9uLCBidXQgdGhlIGFycmF5IHNpemVzIG11c3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSB3aWxsIHVzZSBhIGZpeGVkIHNpemUgb2YgbWF4QXJyYXlTaXplXG4gICAgICB2YXIgZHluYW1pY1Bhc3NNYXQ6IGFycmF5PGFycmF5PGYzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+LCAyPjsgLy8gaW5pdGlhbGl6ZSB0byAwXG4gICAgICBcbiAgICAgIC8vIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvcGVyYXRpb24gbGVkIHRvIHRoZSBjdXJyZW50IGNlbGxcbiAgICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG4gICAgICB2YXIgdmVydGljYWxHYXBzOiBhcnJheTx1MzIsICR7bWF4QXJyYXlTaXplICsgMX11PjtcbiAgICAgIHZhciBob3Jpem9udGFsR2FwczogYXJyYXk8dTMyLCAke21heEFycmF5U2l6ZSArIDF9dT47XG5cbiAgICAgIGxldCBnYXBPcGVuUGVuYWx0eTogZjMyID0gc3VwcEluZm8uZ2FwT3BlblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgbGV0IGdhcEV4dGVuc2lvblBlbmFsdHk6IGYzMiA9IHN1cHBJbmZvLmdhcEV4dGVuc2lvblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgICAgIHZhciBjdXJJbmRleDogdTMyID0gMTsgLy8gd2Ugd2lsbCBzd2FwIHRoZXNlIGluZGljZXMgcGVyIHBhc3NcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDw9IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2ldID0gZ2FwT3BlblBlbmFsdHkgKyBmMzIoaSAtIDEpICogZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtjdXJJbmRleF1baV0gPSAwLjA7XG4gICAgICB9XG4gICAgICBkeW5hbWljUGFzc01hdFswXVswXSA9IDAuMDtcblxuICAgICAgbGV0IHNpbU1hdHJpeCA9ICZzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fTsgLy8gdXNpbmcgcG9pbnRlcnMgbWFrZSB0aGluZ3MgZmFzdGVyXG4gICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcbiAgICAgIGZvciAodmFyIGkgPSAxdTsgaSA8PSBiTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgbGV0IHByZXZSb3cgPSAmZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XTtcbiAgICAgICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgICAgICAoKmN1clJvdylbMF0gPSBnYXBPcGVuUGVuYWx0eSArIGYzMihpIC0gMSkgKiBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgIHZhciBtaW5FbnRyeTogZjMyID0gZjMyKG1heExlbmd0aCk7XG4gICAgICAgICAgbGV0IG1vbkIgPSB1MzIoYltpIC0gMV0pO1xuICAgICAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgICAgIGxldCBtb25BID0gdTMyKGFbaiAtIDFdKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGxldCBjb3N0OiBmMzIgPSAoKnByZXZSb3cpW2ogLSAxXSArIDFmIC0gKCpzaW1NYXRyaXgpW21vbkFdW21vbkJdO1xuICAgICAgICAgICAgICB2YXIgdG9wID0gKCpwcmV2Um93KVtqXTsgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsR2Fwc1tqXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcCArIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbGVmdCA9ICgqY3VyUm93KVtqIC0gMV07IC8vIGluc2VydGlvblxuICAgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID4gMCkge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgICAgICBtaW4oXG4gICAgICAgICAgICAgICAgICAgICAgdG9wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgKCpjdXJSb3cpW2pdID0gcmVzO1xuICAgICAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIG1pbkVudHJ5ID0gcmVzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZ2Fwc1xuICAgICAgICAgICAgICBpZiAocmVzID09IGNvc3QpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAxO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN3YXAgdGhlIGluZGljZXNcbiAgICAgICAgICBsZXQgdGVtcDogdTMyID0gcHJldkluZGV4O1xuICAgICAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgICAgIGN1ckluZGV4ID0gdGVtcDtcbiAgICAgICAgICBpZiAobWluRW50cnkgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2FMZW5ndGhdIC8gZjMyKG1heExlbmd0aCk7XG4gIFxuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUV1Y2xpZGVhbihtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIGRpc3Q6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgZGlzdCA9IGRpc3QgKyBmMzIoYVtpXSAtIGJbaV0pICogZjMyKGFbaV0gLSBiW2ldKTtcbiAgfVxuICByZXR1cm4gc3FydChkaXN0KTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNYW5oYXR0YW4obWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBkaXN0OiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgIGRpc3QgPSBkaXN0ICsgYWJzKGYzMihhW2ldIC0gYltpXSkpO1xuICB9XG4gIHJldHVybiBkaXN0O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU9uZUhvdERpc3RhbmNlKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBpZiAoYUxlbmd0aCAhPSBiTGVuZ3RoKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICBmb3IgKHZhciBpID0gMHU7IGkgPCBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgaWYoYVtpXSAhPSBiW2ldKSB7XG4gICAgICByZXR1cm4gMS4wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMC4wO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU51bWVyaWNEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gd2UgYXNzdW1lIHRoYXQgcmFuZ2Uke2VudHJ5SW5kZXh9IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3VwcGxlbWVudGFyeUluZm8gc3RydWN0XG4gICAgcmV0dXJuIGBcbiAgICBsZXQgcmFuZ2UgPSBzdXBwSW5mby5yYW5nZSR7ZW50cnlJbmRleH07XG4gICAgcmV0dXJuIGYzMihhYnMoZjMyKGFbMF0pIC0gZjMyKGJbMF0pKSAvIHJhbmdlKTtcbiAgYDtcbn1cbi8vIHRhbmltb3RvIGRpc3RhbmNlIGZvciB1aW50MzIgYXJyYXlzIG9mIGxlbmd0aCAke21heEFycmF5U2l6ZX1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVUYW5pbW90b0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuXG4gIGlmIChvbkJpdHNhID09IDB1ICYmIG9uQml0c2IgPT0gMHUpIHtcbiAgICAgIHJldHVybiAwLjA7XG4gIH1cblxuICBsZXQgdG90YWxPbkJpdHMgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cblxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsT25CaXRzIC0gY29tbW9uQml0cyk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQXN5bW1ldHJpY0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgbWluID0gbWluKG9uQml0c2EsIG9uQml0c2IpO1xuICBpZiAobWluID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKG1pbik7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQ29zaW5lQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG4gIGxldCB0b3RhbCA9IG9uQml0c2EgKiBvbkJpdHNiOyAvLyBwLnMuIGhlcmUgdG90YWwgaXMgdGFrZW4gYnkgbXVsdGlwbHlpbmdcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gc3FydChmMzIodG90YWwpKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVTb2thbEJpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgdG90YWwgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsICogMiAtIGNvbW1vbkJpdHMgKiAzKTtcbiAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1BVRElTVEFOQ0U7XG4oZnVuY3Rpb24gKFdFQkdQVURJU1RBTkNFKSB7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJIQU1NSU5HXCJdID0gXCJIYW1taW5nXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJFVUNMSURFQU5cIl0gPSBcIkV1Y2xpZGVhblwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTUFOSEFUVEFOXCJdID0gXCJNYW5oYXR0YW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIlRBTklNT1RPXCJdID0gXCJUYW5pbW90b1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTEVWRU5TVEVJTlwiXSA9IFwiTGV2ZW5zaHRlaW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk5FRURMRU1BTl9XVU5TQ0hcIl0gPSBcIk5lZWRsZW1hbm4tV3Vuc2NoXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXCJdID0gXCJNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJTT0tBTFwiXSA9IFwiU29rYWxcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkNPU0lORVwiXSA9IFwiQ29zaW5lXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJBU1lNTUVUUklDXCJdID0gXCJBc3ltbWV0cmljXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJEaWZmZXJlbmNlXCJdID0gXCJEaWZmZXJlbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJPbmVIb3RcIl0gPSBcIk9uZS1Ib3RcIjtcbn0pKFdFQkdQVURJU1RBTkNFIHx8IChXRUJHUFVESVNUQU5DRSA9IHt9KSk7XG5leHBvcnQgY29uc3Qgd2ViR1BVRnVuY3Rpb25zID0ge1xuICAgIFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HXTogd2ViR1BVSGFtbWluZyxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOXTogd2ViR1BVRXVjbGlkZWFuLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiB3ZWJHUFVNYW5oYXR0YW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPXTogd2ViR1BVVGFuaW1vdG9CaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTl06IHdlYkdQVUxldmVuc3RlaW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0hdOiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gsXG4gICAgW1dFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdOiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuU09LQUxdOiB3ZWJHUFVTb2thbEJpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5DT1NJTkVdOiB3ZWJHUFVDb3NpbmVCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IHdlYkdQVUFzeW1tZXRyaWNCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV06IHdlYkdQVU51bWVyaWNEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogd2ViR1BVT25lSG90RGlzdGFuY2Vcbn07XG5leHBvcnQgY29uc3QgZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHkgPSB7XG4gICAgW1dFQkdQVURJU1RBTkNFLkhBTU1JTkddOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UT106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLlNPS0FMXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQ09TSU5FXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplICogbWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAqIG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAyNSksXG4gICAgW1dFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdOiAoX21heEVudHJ5U2l6ZSkgPT4gMSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogKF9tYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChfbWF4RW50cnlTaXplIC8gNDApLFxufTtcbmV4cG9ydCBjb25zdCBUeXBlU3VwcG9ydGVkRGlzdGFuY2VzID0ge1xuICAgIFtcIlNUUklOR1wiIC8qIFdHUFVFTlRSWVRZUEUuU1RSSU5HICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTiwgV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCwgV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSwgV0VCR1BVRElTVEFOQ0UuT25lSG90XSksXG4gICAgW1wiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsIFdFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU4sIFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0gsIFdFQkdQVURJU1RBTkNFLlRBTklNT1RPLCBXRUJHUFVESVNUQU5DRS5DT1NJTkUsIFdFQkdQVURJU1RBTkNFLlNPS0FMLCBXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDLCBXRUJHUFVESVNUQU5DRS5PbmVIb3QsIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk9uZUhvdCwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJOVU1CRVJcIiAvKiBXR1BVRU5UUllUWVBFLk5VTUJFUiAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiQklUQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkJJVEFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE8sIFdFQkdQVURJU1RBTkNFLkNPU0lORSwgV0VCR1BVRElTVEFOQ0UuU09LQUwsIFdFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdKVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5sZXQgZ3B1QWRhcHRlciA9IG51bGw7XG5sZXQgZ3B1RGV2aWNlID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVEZXZpY2UoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvL3JlYXNvbjogb25seSBoZXJlIHdlIGdldCB0aGUgZ3B1QWRhcHRlclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICBncHVBZGFwdGVyID0geWllbGQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlcih7IHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnIH0pO1xuICAgICAgICAgICAgaWYgKGdwdUFkYXB0ZXIgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNMb3N0ID0gZmFsc2U7XG4gICAgICAgIGlmIChncHVEZXZpY2UpIHtcbiAgICAgICAgICAgIGdwdURldmljZS5sb3N0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzTG9zdCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwKSk7IC8vIHdhaXQgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgbG9zdFxuICAgICAgICB9XG4gICAgICAgIGlmICghZ3B1RGV2aWNlIHx8IGlzTG9zdCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRCdWZmZXJTaXplID0gMTAwMDAwMDAwMDsgLy8gfjEwMDBNQlxuICAgICAgICAgICAgY29uc3QgYWRhcHRlckxpbWl0cyA9IGdwdUFkYXB0ZXIubGltaXRzO1xuICAgICAgICAgICAgY29uc3QgYnVmZmZlclNpemVMaW1pdCA9IGFkYXB0ZXJMaW1pdHMubWF4QnVmZmVyU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXJTaXplTGltaXQgPSBhZGFwdGVyTGltaXRzLm1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ3B1RGV2aWNlID0geWllbGQgZ3B1QWRhcHRlci5yZXF1ZXN0RGV2aWNlKHsgcmVxdWlyZWRMaW1pdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEJ1ZmZlclNpemU6IE1hdGgubWluKGJ1ZmZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemU6IE1hdGgubWluKHN0b3JhZ2VCdWZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgfSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGRldmljZSB3aXRoIHJlcXVpcmVkIGxpbWl0cycsIGUpO1xuICAgICAgICAgICAgICAgIGdwdURldmljZSA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdERldmljZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVBZGFwdGVyRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvLyByZWFzb246IG9ubHkgaGVyZSB3ZSBnZXQgdGhlIGdwdUFkYXB0ZXJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZ3B1QWRhcHRlciA9IHlpZWxkIG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGlmIChncHVBZGFwdGVyID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdEFkYXB0ZXJJbmZvKCk7XG4gICAgICAgIHJldHVybiBpbmZvLmRlc2NyaXB0aW9uO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0R1BVRGV2aWNlLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgV0VCR1NMQUdHUkVHQVRJT04sIFdFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TLCB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLWFnZ3JlZ2F0aW9uJztcbmltcG9ydCB7IFdFQkdQVURJU1RBTkNFLCB3ZWJHUFVGdW5jdGlvbnMsIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzJztcbmltcG9ydCB7IHdlYkdQVVByb2Nlc3NJbmZvIH0gZnJvbSAnLi4vcHJlcHJvY2Vzc2luZy93ZWJHUFUtcHJvY2Vzcy1pbmZvJztcbmltcG9ydCB7IGdldEdQVURldmljZSB9IGZyb20gJy4uL2dldEdQVURldmljZSc7XG4vKiogZ2VuZXJhdGUgc3BhcnNlIG1hdHJpeCBiYXNlZCBvbiBsaXN0IG9mIGxpc3RzIG9mIGVudHJpZXMuXG4gKiAgdGhlc2UgZW50cmllcyBhcmUgZWFjaCBlbmNvZGVkIGFzIFVpbnQzMkFycmF5IG9yIEZMT0FUMzJBcnJheSAoZGVwZW5kaW5nIG9uIHRoZWlyIHR5cGUpLlxuICogZm9yIGV4YW1wbGUsIHNlcXVlbmNlcyB3b3VsZCBiZSBlbmNvZGVkIGFzIFVpbnQzMkFycmF5IGJhc2VkIG9uIGNoYXIgY29kZSBvZiB0aGUgbGV0dGVyIGF0IGVhY2ggcG9zaXRpb24uXG4gKiBbNjUsIDY2LCA2NywgNjgsIDY5XSB3b3VsZCBiZSBhIHNlcXVlbmNlIG9mIDUgbGV0dGVycy5cbiAqIGZvciBjaGVtaWNhbCBmaW5nZXJwcmludHMsIGl0IHdvdWxkIGJlIGEgYmluYXJ5IGFycmF5IG9mIDBzIGFuZCAxcyxcbiAqIHJlcHJlc2VudGVkIGFzIFVpbnQzMkFycmF5KF9kYXRhIHByb3BlcnR5IG9mIERHIGJpdGFycmF5KS5cbiAqXG4gKiBCZSB3YXJlIHRoYXQgc2l6ZSBvZiBlbnRyeUxpc3QsIGRpc3RhbmNlTWV0cmljcywgd2VpZ2h0cyBhbmQgb3B0aW9ucyBtdXN0IGJlIHRoZSBzYW1lLlxuICogaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMgZm9yIGVudHJpZXMgaSwgcGFzcyBhbiBlbXB0eSBvYmplY3QuXG4gKiBmb3Igbm93IG9wdGlvbnMgYXJlIG5lZWRlZCBmb3JcbiAqIG5lZWRsZW1hbi13dW5zY2ggYW5kIG1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2VzOiBzZWUge0BsaW5rIEJpb0Rpc3RhbmNlRm5PcHRpb25zfSBhcyBmb3IgaG93IGl0IHNob3VsZCBiZSBwYXNzZWRcbiAqIG51bWVyaWMgZGlzdGFuY2VzIChEaWZmZXJlbmNlKToge3JhbmdlOiBudW1iZXJ9IHdoZXJlIHJhbmdlIGlzIHRoZSByYW5nZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBjb2x1bW4gKG1heCAtIG1pbikuXG4gKiBpbiBib3RoIGNhc2VzLCBpZiBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQsIHRoZXkgd2lsbCBiZSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChlbnRyeUxpc3QsIC8vIGxpc3Qgb2YgbGlzdHMgb2YgZW50cmllcywgZm9yIG11bHRpcGxlIGNvbHVtbnNcbnRocmVzaG9sZCA9IDAuOCwgLy8gc2ltaWxhcml0eSB0aHJlc2hvbGQsIGJlIHdhcmUgdGhhdCBpZiB5b3UgdXNlIHRvbyBzbWFsbCB0aHJlc2hvbGQsIHRoZXJlIG1pZ2h0IGJlIG1lbW9yeSBvdmVyZmxvdy4uLlxuZGlzdGFuY2VNZXRyaWNzLCAvLyBkaXN0YW5jZSBtZXRyaWNzIGZvciBlYWNoIGNvbHVtblxuYWdncmVnYXRpb25GdW5jdGlvbiwgLy8gYWdncmVnYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBkaXN0YW5jZXNcbndlaWdodHMsIC8vIHdlaWdodHMgZm9yIGVhY2ggY29sdW1uXG5vcHRpb25zIC8vIHN1cHBsZW1lbnRhcnkgb3B0aW9ucyBmb3IgZWFjaCBjb2x1bW5cbikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRldmljZSA9IHlpZWxkIGdldEdQVURldmljZSgpO1xuICAgICAgICBpZiAoIWRldmljZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBpZiBubyBkZXZpY2UsIHJldHVybiBudWxsLCBhcyB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aG91dCBpdC5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlRGlzdGFuY2VNZXRyaWNzID0gT2JqZWN0LnZhbHVlcyhXRUJHUFVESVNUQU5DRSk7XG4gICAgICAgIGlmIChkaXN0YW5jZU1ldHJpY3Muc29tZSgobWV0cmljKSA9PiAhYXZhaWxhYmxlRGlzdGFuY2VNZXRyaWNzLmluY2x1ZGVzKG1ldHJpYykpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIG1ldHJpY3MgcHJvdmlkZWQ6ICcgKyBkaXN0YW5jZU1ldHJpY3Muam9pbignLCAnKSk7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZ3JlZ2F0aW9uRnVuY3Rpb25zID0gT2JqZWN0LnZhbHVlcyhXRUJHU0xBR0dSRUdBVElPTik7XG4gICAgICAgIGlmICghYXZhaWxhYmxlQWdncmVnYXRpb25GdW5jdGlvbnMuaW5jbHVkZXMoYWdncmVnYXRpb25GdW5jdGlvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWdncmVnYXRpb24gZnVuY3Rpb24gcHJvdmlkZWQ6ICcgKyBhZ2dyZWdhdGlvbkZ1bmN0aW9uKTtcbiAgICAgICAgY29uc3QgbWF4RGlzdGFuY2UgPSAxIC0gdGhyZXNob2xkOyAvLyBtYXhpbXVtIGRpc3RhbmNlXG4gICAgICAgIC8vIGZpcnN0LCBjaGVjayB0aGF0IGFsbCB0aGUgc3VwcGxlbWVudGFyeSBvcHRpb25zIGFyZSBwcm92aWRlZCBhbmQgYXJlIHRoZSBzYW1lIGxlbmd0aDpcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoICE9PSBlbnRyeUxpc3QubGVuZ3RoIHx8XG4gICAgICAgICAgICBvcHRpb25zLmxlbmd0aCAhPT0gZGlzdGFuY2VNZXRyaWNzLmxlbmd0aCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbnMsIHdlaWd0aHMgYW5kIGRpc3RhbmNlIGZ1bmN0aW9ucyBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGNvbHVtbicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBlbnRyeSBsaXN0cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgobGlzdCkgPT4gbGlzdC5sZW5ndGggIT09IGVudHJ5TGlzdFswXS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgZW50cnkgbGlzdHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICAgICAgY29uc3QgbnVtT2ZDb2x1bW5zID0gZW50cnlMaXN0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGNvbHVtbnNcbiAgICAgICAgY29uc3QgbGlzdFNpemUgPSBlbnRyeUxpc3RbMF0ubGVuZ3RoOyAvLyBzaXplIG9mIGVhY2ggbGlzdCAob3IgY29sdW1uKVxuICAgICAgICBjb25zdCBwcm9jZXNzSW5mbyA9IGVudHJ5TGlzdC5tYXAoKGVudHJ5LCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2ViR1BVUHJvY2Vzc0luZm8oZW50cnksIGRpc3RhbmNlTWV0cmljc1tpXSwgaSwgb3B0aW9uc1tpXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobnVtT2ZDb2x1bW5zID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbHVtbnMgcHJvdmlkZWQuIFBsZWFzZSBwcm92aWRlIGF0IGxlYXN0IG9uZSBjb2x1bW4gb2YgZGF0YS4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtT2ZDb2x1bW5zID09PSAxKVxuICAgICAgICAgICAgYWdncmVnYXRpb25GdW5jdGlvbiA9IFdFQkdTTEFHR1JFR0FUSU9OLk1BTkhBVFRBTjsgLy8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIHN0cnVjdCB0eXBlcyBpbnRvIG9uZSB0byBwdXQgaW50byB0aGUgc3VwcEluZm8gc3RydWN0LlxuICAgICAgICBsZXQgc3VwcEluZm9XZ3NsID0gcHJvY2Vzc0luZm9cbiAgICAgICAgICAgIC5tYXAoKGluZm8pID0+IGluZm8uc3VwcEluZm9TdHJ1Y3RXZ3NsKVxuICAgICAgICAgICAgLmZpbHRlcigod2dzbCkgPT4gISF3Z3NsICYmIHdnc2wgIT0gJycpXG4gICAgICAgICAgICAuam9pbignLFxcbicpO1xuICAgICAgICAvLyBzdHJ1Y3R1cmVzIGluIHdnc2wgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZW1iZXIsIHNvIGlmIHdlIGhhdmUgbm8gc3RydWN0dXJlcywgd2UgbmVlZCB0byBhZGQgYSBkdW1teSBvbmVcbiAgICAgICAgbGV0IG5lZWRzRHVtbXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFzdXBwSW5mb1dnc2wgfHwgc3VwcEluZm9XZ3NsLnRyaW0oKSA9PSAnJykge1xuICAgICAgICAgICAgbmVlZHNEdW1teSA9IHRydWU7XG4gICAgICAgICAgICBzdXBwSW5mb1dnc2wgPSAnXFxuZHVtbXk6IGYzMlxcbic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29tYmluZSBhbGwgZGF0YSB3Z3NsIHN0cnVjdCBjb2RlIGludG8gb25lXG4gICAgICAgIGNvbnN0IGRhdGFXZ3NsID0gcHJvY2Vzc0luZm8ubWFwKChpbmZvKSA9PiBpbmZvLmRhdGFTdHJ1Y3RXZ3NsKS5maWx0ZXIoKHdnc2wpID0+ICEhd2dzbCAmJiB3Z3NsICE9ICcnKS5qb2luKCcsXFxuJyk7XG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIGFycmF5IHNpemVzIGludG8gb25lIGFycmF5IChlYXNpZXIgZm9yIHNldHRpbmcpXG4gICAgICAgIGNvbnN0IGFycmF5U2l6ZXMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZDb2x1bW5zICogbGlzdFNpemUpO1xuICAgICAgICBwcm9jZXNzSW5mby5mb3JFYWNoKChpbmZvLCBpKSA9PiB7XG4gICAgICAgICAgICBhcnJheVNpemVzLnNldChpbmZvLmFycmF5U2l6ZXMsIGkgKiBsaXN0U2l6ZSk7XG4gICAgICAgIH0pOyAvLyBhcnJheS5mbGF0IGlzIG5vdCBhcyBvcHRpbWl6ZWQgYXMgdGhpc1xuICAgICAgICAvLyBpZiB3ZSB0cnkgdG8gbWFwIGxhcmdlIGFycmF5cyBkaXJlY3RseSBmcm9tIEdQVSwgc29tZXRpbWVzLCBkZXZpY2UgZGlzY29ubmVjdHMuIHNvIHdlIG5lZWQgdG8gZG8gaXQgaW4gY2h1bmtzLCBhIGdvb2QgbnVtYmVyXG4gICAgICAgIC8vIHdlIGZvdW5kIGlzIDEwMDAwLiBTbyB3ZSB3aWxsIHBlcmZvcm0gY29tcHV0YXRpb25zIGluIGNodW5rcyBvZiAxMDAwMC4gbWVhbmluZyB0aGF0IHdlIHdpbGwgZGlzcGF0Y2ggMTAwMDAgdGhyZWFkcyBhdCBhIHRpbWUuXG4gICAgICAgIGNvbnN0IG51bU9mVGhyZWFkcyA9IDEwMDAwO1xuICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgY29tcGxleGl0eSBvZiB0aGUgYWxnb3JpdGhtLCBhcyB0aGUgMTAwIGlzIGxvdyBlbmF1Z2ggbnVtYmVyLCB3aGljaCBpcyBsaW1pdGVkIGJ5IG1lbW9yeSB1c2FnZS5cbiAgICAgICAgY29uc3Qgc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCA9IDEwMDsgLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyIHRocmVhZCAobnVtYmVyIG9mIHBhaXIgY29tcGFyaXNvbnMpXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQ29tcGxleGl0eSA9IHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuY29tcGxleGl0eSwgMCk7IC8vIGNvbWJpbmVkIGNvbXBsZXhpdHkgb2YgYWxsIHRoZSBjb2x1bW5zXG4gICAgICAgIGNvbnN0IG1heEl0ZXJhdGlvbnNQZXJUaHJlYWQgPSBNYXRoLmNlaWwoMTAwMDAgLyBjb21iaW5lZENvbXBsZXhpdHkpOyAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciB0aHJlYWRcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGl2aXNpb24gPSAxMDsgLy8gaG93IG1hbnkgdGhyZWFkcyBpbnNpZGUgb2Ygb25lIHdvcmtncm91cCBkaW1lbnNpb24gKGluIHRoaXMgY2FzZSAxMCAqIDEwIHRocmVhZHMgcGVyIHdvcmtncm91cClcbiAgICAgICAgY29uc3QgdGhyZWFkc1Blcldvcmtncm91cCA9IHdvcmtHcm91cERpdmlzaW9uICogd29ya0dyb3VwRGl2aXNpb247XG4gICAgICAgIGNvbnN0IHdvcmtncm91cHNEaW0gPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KE1hdGguY2VpbChudW1PZlRocmVhZHMgLyB0aHJlYWRzUGVyV29ya2dyb3VwKSkpOyAvLyBob3cgbWFueSB3b3JrZ3JvdXBzIHBlciAyZCBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgZ2xvYmFsVGhyZWFkRGltU2l6ZSA9IHdvcmtncm91cHNEaW0gKiB3b3JrR3JvdXBEaXZpc2lvbjsgLy8gaG93IG1hbnkgdGhyZWFkcyBwZXIgMmQgZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSA9IGxpc3RTaXplICogKGxpc3RTaXplIC0gMSkgLyAyOyAvLyBzaXplIG9mIHRoZSBjb25kZW5zZWQgZGlzdGFuY2UgbWF0cml4LCB0aGlzIG1hbnkgY29tcGFyaXNvbnMgd2lsbCBiZSBtYWRlLlxuICAgICAgICBjb25zdCBkbUNodW5rU2l6ZVBlclRocmVhZCA9IE1hdGguY2VpbChjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBudW1PZlRocmVhZHMpOyAvLyBob3cgbWFueSBjb21wYXJpc29ucyBwZXIgdGhyZWFkXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdTcGFyc2UgbWF0cml4IGNvbXB1dGUgc2hhZGVyJyxcbiAgICAgICAgICAgIGNvZGU6IGBcbiAgICAvLyBlYWNoIHRocmVhZCB3aWxsIHBlcmZvcm0gJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSBpdGVyYXRpb25zIGF0IG9uZSB0aW1lLCBjb21wYXJpbmcgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSBwYWlycyBvZiBlbnRyaWVzLlxuICAgIC8vIGluIHRvdGFsLCBlYWNoIHRocmVhZCB3aWxsIHBlcmZvcm0gYXQgbW9zdCAke2RtQ2h1bmtTaXplUGVyVGhyZWFkfSBjb21wYXJpc29ucy5cbiAgICAvLyBmaXJzdCBpcyB0aGUgcmVzdWx0IHN0cnVjdCwgY29udGFpbmluZyBpcywganMsIGFuZCBkaXN0YW5jZXMuIGVhY2ggYXJyYXkgd2l0aCBsZW5ndGggb2YgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSxcbiAgICAvLyBhbmQgYWxzbyBpbnRlZ2VyIGZvciBob3cgbWFueSBwYWlycyB3ZXJlIGZvdW5kIHRvIGJlIGJlbG93IHRocmVzaG9sZC5cbiAgICBzdHJ1Y3QgU3BhcnNlUmVzdWx0IHtcbiAgICAgIGk6IGFycmF5PGFycmF5PHUzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBqOiBhcnJheTxhcnJheTx1MzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZGlzdGFuY2VzOiBhcnJheTxhcnJheTxmMzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZm91bmQ6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGRvbmU6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PlxuICAgIH1cbiAgICAvLyBzdHJ1Y3QgZm9yIHRoZSBkYXRhXG4gICAgc3RydWN0IENvbXB1dGVJbmZvIHtcbiAgICAgIC8vIHN0YXJ0IGF0IGNvbHMgYW5kIHJvd3MsIGFuZCBlbmQgYXQgY29scyBhbmQgcm93cyBmb3IgZWFjaCB0aHJlYWQsIHRoZXNlIHdpbGwgYmUgY2FsY3VsYXRlZCBvbiBjcHUgYW5kIHBhc3NlZCB0byBncHUuXG4gICAgICBzdGFydEF0Q29sczogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgc3RhcnRBdFJvd3M6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGVuZEF0Q29sczogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZW5kQXRSb3dzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG5cbiAgICAgIC8vIHRoZSBBQ1RVQUxMWSBzaXplcyBvZiBlYWNoIGVudHJ5XG4gICAgICBlbnRyeVNpemVzOiBhcnJheTxhcnJheTx1MzIsICR7bGlzdFNpemV9PiwgJHtudW1PZkNvbHVtbnN9PixcbiAgICAgIC8vIHRoZSB3ZWlnaHRzIGZvciBlYWNoIGVudHJ5XG4gICAgICB3ZWlnaHRzOiBhcnJheTxmMzIsICR7bnVtT2ZDb2x1bW5zfT4sXG4gICAgICAvLyB0aGUgZGF0YSBmb3IgZWFjaCBlbnRyeVxuICAgICAgJHtkYXRhV2dzbH0gLy8gYW4gZXhhbXBsZSBvZiB0aGUgZGF0YVdnc2wgd291bGQgYmU6XG4gICAgICAvL2RhdGEwOiBhcnJheTxhcnJheTx1MzIsMjA+LDEwMD4sXG4gICAgICAvL2RhdGExOiBhcnJheTxhcnJheTx1MzIsMjA+LDEwMD5cbiAgICB9XG5cbiAgICAvLyBzdHJ1Y3QgZm9yIHRoZSBzdXBwbGVtZW50YXJ5IGluZm9ybWF0aW9uXG4gICAgc3RydWN0IFN1cHBJbmZvIHtcbiAgICAgIC8vIHN0cnVjdCBjb250YWluaW5nIGFsbCB0aGUgc3VwcGxlbWVudGFyeSBpbmZvLCBsaWtlIHNjb3JpbmcgbWF0cml4LCBhbHBoYWJldCBpbmRleGVzLCByYW5nZSwgZXRjLlxuICAgICAgJHtzdXBwSW5mb1dnc2x9XG4gICAgfTtcblxuICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gY29tcHV0ZUluZm86IENvbXB1dGVJbmZvO1xuICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3VwcEluZm86IFN1cHBJbmZvO1xuICAgIEBncm91cCgwKSBAYmluZGluZygyKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gcmVzdWx0czogU3BhcnNlUmVzdWx0O1xuICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cERpdmlzaW9ufSwgJHt3b3JrR3JvdXBEaXZpc2lvbn0pIGZuIGNhbGNTcGFyc2VNYXRyaXgoXG4gICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPlxuICAgICkge1xuICAgICAgJHtuZWVkc0R1bW15ID8gYGxldCBvdGhlckR1bW15ID0gc3VwcEluZm8uZHVtbXkgKiAyO2AgOiAnJ30gLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3VwcEluZm8gaXMgbm90IG9wdGltaXplZCBvdXRcbiAgICAgIGxldCB0aHJlYWRDb2wgPSBpZC54O1xuICAgICAgbGV0IHRocmVhZFJvdyA9IGlkLnk7XG4gICAgICBsZXQgbGluZWFySW5kZXggPSB0aHJlYWRSb3cgKiAke2dsb2JhbFRocmVhZERpbVNpemV9ICsgdGhyZWFkQ29sO1xuICAgICAgaWYgKGxpbmVhckluZGV4ID49ICR7bnVtT2ZUaHJlYWRzfSkge1xuICAgICAgICByZXR1cm47IC8vIGlmIHdlIGFyZSBvdXQgb2YgYm91bmRzLCByZXR1cm5cbiAgICAgIH0gICAgICBcbiAgICAgIHZhciBzdGFydEF0Q29sOiB1MzIgPSBjb21wdXRlSW5mby5zdGFydEF0Q29sc1tsaW5lYXJJbmRleF07XG4gICAgICB2YXIgc3RhcnRBdFJvdzogdTMyID0gY29tcHV0ZUluZm8uc3RhcnRBdFJvd3NbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGVuZEF0Q29sOiB1MzIgPSBtaW4oY29tcHV0ZUluZm8uZW5kQXRDb2xzW2xpbmVhckluZGV4XSwgJHtsaXN0U2l6ZX11KTtcbiAgICAgIGxldCBlbmRBdFJvdzogdTMyID0gbWluKGNvbXB1dGVJbmZvLmVuZEF0Um93c1tsaW5lYXJJbmRleF0sICR7bGlzdFNpemV9dSk7XG4gICAgICBsZXQgaXMgPSAmcmVzdWx0cy5pW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBqcyA9ICZyZXN1bHRzLmpbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGRpc3RhbmNlcyA9ICZyZXN1bHRzLmRpc3RhbmNlc1tsaW5lYXJJbmRleF07XG4gICAgICByZXN1bHRzLmZvdW5kW2xpbmVhckluZGV4XSA9IDA7IC8vIGluaXRpYWxpemUgdGhlIGZvdW5kIGNvdW50ZXJcbiAgICAgIHZhciBmb3VuZDogdTMyID0gMDtcbiAgICAgIGlmIChyZXN1bHRzLmRvbmVbbGluZWFySW5kZXhdID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGlmIHdlIGFyZSBkb25lLCByZXR1cm5cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJHttYXhJdGVyYXRpb25zUGVyVGhyZWFkfTsgaSsrKSB7XG4gICAgICAgIGlmIChzdGFydEF0Q29sID49IGVuZEF0Q29sICYmIHN0YXJ0QXRSb3cgPj0gZW5kQXRSb3cpIHtcbiAgICAgICAgICByZXN1bHRzLmRvbmVbbGluZWFySW5kZXhdID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPj0gJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaXN0ID0gY29tYmluZWREaXN0YW5jZShzdGFydEF0Q29sLCBzdGFydEF0Um93KTtcbiAgICAgICAgaWYgKGRpc3QgPD0gJHttYXhEaXN0YW5jZX0pIHtcbiAgICAgICAgICAoKmlzKVtmb3VuZF0gPSBzdGFydEF0Q29sO1xuICAgICAgICAgICgqanMpW2ZvdW5kXSA9IHN0YXJ0QXRSb3c7XG4gICAgICAgICAgKCpkaXN0YW5jZXMpW2ZvdW5kXSA9IGRpc3Q7XG4gICAgICAgICAgZm91bmQgPSBmb3VuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRBdENvbCA9IHN0YXJ0QXRDb2wgKyAxO1xuICAgICAgICBpZiAoc3RhcnRBdENvbCA+PSAke2xpc3RTaXplfXUpIHtcbiAgICAgICAgICBzdGFydEF0Um93ICs9IDE7XG4gICAgICAgICAgc3RhcnRBdENvbCA9IHN0YXJ0QXRSb3cgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRzLmZvdW5kW2xpbmVhckluZGV4XSA9IGZvdW5kO1xuICAgICAgLy8gdXBkYXRlIHRoZSBzdGFydEF0Q29scyBhbmQgc3RhcnRBdFJvd3NcbiAgICAgIGNvbXB1dGVJbmZvLnN0YXJ0QXRDb2xzW2xpbmVhckluZGV4XSA9IHN0YXJ0QXRDb2w7XG4gICAgICBjb21wdXRlSW5mby5zdGFydEF0Um93c1tsaW5lYXJJbmRleF0gPSBzdGFydEF0Um93O1xuXG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBkaXN0YW5jZSBzY3JpcHQgZm9yIGVhY2ggZGlzdGFuY2UgbWV0cmljIGFuZCB0aGVuIGNvbWJpbmUgdGhlbSBpbnRvIG9uZVxuICAgICR7Z2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdChkaXN0YW5jZU1ldHJpY3MsIHByb2Nlc3NJbmZvLm1hcCgoaW5mbykgPT4gaW5mby5tYXhFbnRyeUxlbiksIG1heERpc3RhbmNlLCBhZ2dyZWdhdGlvbkZ1bmN0aW9uKX1cblxuXG4gICAgYFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3BhcnNlIG1hdHJpeCBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnY2FsY1NwYXJzZU1hdHJpeCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICBjb25zdCBzdGFydEF0Q29scyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBzdGFydEF0Um93cyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBlbmRBdENvbHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgZW5kQXRSb3dzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gbnVtT2ZUaHJlYWRzKTsgLy8gc2l6ZSBvZiB0aGUgY2h1bmsgcGVyIHRocmVhZCAoaW4gdG90YWwpXG4gICAgICAgIGxldCBzdGFydFJvdyA9IDA7XG4gICAgICAgIGxldCBzdGFydENvbCA9IDE7XG4gICAgICAgIGNvbnNvbGUudGltZSgnR1BVdGhyZWFkU3RhcnRzJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZUaHJlYWRzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGkgPT09IG51bU9mVGhyZWFkcyAtIDEgPyBjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLSAxIDogKGkgKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIC8vIGZhbmN5IGZvcm11bGFzIHRvIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBpbmRpY2VzIGZvciB0aGUgY29uZGVuc2VkIGRpc3RhbmNlIG1hdHJpeCBmb3IgZWFjaCB0aHJlYWQgc3RhcnRcbiAgICAgICAgICAgIGNvbnN0IGVuZFJvdyA9IGxpc3RTaXplIC0gMiAtIE1hdGguZmxvb3IoTWF0aC5zcXJ0KC04ICogZW5kSWR4ICsgNCAqIGxpc3RTaXplICogKGxpc3RTaXplIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgY29uc3QgZW5kQ29sID0gZW5kSWR4IC0gbGlzdFNpemUgKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgc3RhcnRBdENvbHNbaV0gPSBzdGFydENvbDtcbiAgICAgICAgICAgIHN0YXJ0QXRSb3dzW2ldID0gc3RhcnRSb3c7XG4gICAgICAgICAgICBlbmRBdENvbHNbaV0gPSBlbmRDb2w7XG4gICAgICAgICAgICBlbmRBdFJvd3NbaV0gPSBlbmRSb3c7XG4gICAgICAgICAgICBzdGFydFJvdyA9IGVuZFJvdztcbiAgICAgICAgICAgIHN0YXJ0Q29sID0gZW5kQ29sO1xuICAgICAgICAgICAgLy8gY29uc3Qgc3RhcnRSb3cgPSB2YWx1ZXNbMF0ubGVuZ3RoIC0gMiAtIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAvLyAgIE1hdGguc3FydCgtOCAqIHN0YXJ0SWR4ICsgNCAqIHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgIC8vIGNvbnN0IHN0YXJ0Q29sID0gc3RhcnRJZHggLSB2YWx1ZXNbMF0ubGVuZ3RoICogc3RhcnRSb3cgKyBNYXRoLmZsb29yKChzdGFydFJvdyArIDEpICogKHN0YXJ0Um93ICsgMikgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ0dQVXRocmVhZFN0YXJ0cycpO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSBjb21wdXRlSW5mbyBidWZmZXJcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXIzMlNpemUgPSBudW1PZlRocmVhZHMgKiA0ICsgLy8gc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICAgICAgbGlzdFNpemUgKiBudW1PZkNvbHVtbnMgKyAvLyBlbnRyeVNpemVzXG4gICAgICAgICAgICBudW1PZkNvbHVtbnMgKyAvLyB3ZWlnaHRzXG4gICAgICAgICAgICBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLnNvdXJjZUFycmF5U2l6ZSwgMCk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIHN1cHBJbmZvIGJ1ZmZlclxuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlcjMyU2l6ZSA9IHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc3VwcEluZm9TaXplLCAwKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgcmVzdWx0cyBidWZmZXJcbiAgICAgICAgY29uc3Qgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplID0gc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCAqIG51bU9mVGhyZWFkcztcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlcjMyU2l6ZSA9IDMgKiBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKyBudW1PZlRocmVhZHMgKyBudW1PZlRocmVhZHM7IC8vIGksIGosIGRpc3RhbmNlcywgZm91bmQsIGRvbmVcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIG9uIHRoZSBHUFUgdG8gaG9sZCBjb21wdXRlSW5mb1xuICAgICAgICAvLyBiZXdhcmUgdGhhdCBzdHJ1Y3QgbXVzdCBiZSBwYWRkZWQgdG8gMTYgYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgaW4gMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZSA9IGNvbXB1dGVJbmZvQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUgPSBjb21wdXRlSW5mb0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUgKz0gMTYgLSByZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdjb21wdXRlIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciA9IGNvbXB1dGVJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7IC8vIGdldCBmdWxsIGJ1ZmZlclxuICAgICAgICAvLyBkeW5hbWljIG9mZnNldCBmb3IgdGhlIGNvbXB1dGVJbmZvIGJ1ZmZlclxuICAgICAgICBsZXQgY29tcHV0ZUluZm9PZmZTZXQgPSAwO1xuICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICBjb25zdCBzdGFydEF0Q29sc0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIHN0YXJ0QXRDb2xzQnVmZmVyVmlldy5zZXQoc3RhcnRBdENvbHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRSb3dzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgc3RhcnRBdFJvd3NCdWZmZXJWaWV3LnNldChzdGFydEF0Um93cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgZW5kQXRDb2xzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgZW5kQXRDb2xzQnVmZmVyVmlldy5zZXQoZW5kQXRDb2xzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBlbmRBdFJvd3NCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBlbmRBdFJvd3NCdWZmZXJWaWV3LnNldChlbmRBdFJvd3MpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIC8vIHRoZW4gd3JpdGUgdGhlIGVudHJ5U2l6ZXNcbiAgICAgICAgY29uc3QgZW50cnlTaXplc1ZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIGFycmF5U2l6ZXMubGVuZ3RoKTtcbiAgICAgICAgZW50cnlTaXplc1ZpZXcuc2V0KGFycmF5U2l6ZXMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBhcnJheVNpemVzLmxlbmd0aCAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGUgd2VpZ2h0c1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmlldyA9IG5ldyBGbG9hdDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mQ29sdW1ucyk7XG4gICAgICAgIHdlaWdodHNWaWV3LnNldCh3ZWlnaHRzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZDb2x1bW5zICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgZGF0YSBpdHNlbGZcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIHByb2Nlc3NJbmZvKSB7XG4gICAgICAgICAgICBjb25zdCBBcnJheUNvbnN0cnVjdG9yID0gaW5mby5FbmNvZGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGluZm8uc291cmNlQXJyYXlTaXplO1xuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgY2h1bmtTaXplKTsgLy9uZXcgQXJyYXlDb25zdHJ1Y3Rvcihjb21wdXRlSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZShjb21wdXRlSW5mb09mZlNldCwgY2h1bmtCeXRlU2l6ZSkpO1xuICAgICAgICAgICAgZGF0YVZpZXcuc2V0KGluZm8uZmxhdFNvdXJjZUFycmF5KTtcbiAgICAgICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IGNodW5rU2l6ZSAqIEFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UgYXJlIGRvbmUgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgY29tcHV0ZUluZm9CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIG9uIHRoZSBHUFUgdG8gaG9sZCBzdXBwSW5mb1xuICAgICAgICAvLyBzYW1lIGhlcmUsIHdlIG5lZWQgdG8gcGFkIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgdG8gMTYgYnl0ZXNcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXJTaXplID0gc3VwcEluZm9CdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSA9IHN1cHBJbmZvQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3Qgc3VwcEluZm9SZW1haW5kZXIgPSBzdXBwSW5mb0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAoc3VwcEluZm9SZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgKz0gMTYgLSBzdXBwSW5mb1JlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSA9IE1hdGgubWF4KHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSwgMTYpO1xuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdzdXBwIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciA9IHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7IC8vIGdldCBmdWxsIGJ1ZmZlclxuICAgICAgICBsZXQgc3VwcEluZm9PZmZTZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgcHJvY2Vzc0luZm8pIHtcbiAgICAgICAgICAgIGlmIChpbmZvLnN1cHBJbmZvQnVmZmVyICYmIGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aCA+IDAgJiYgaW5mby5zdXBwSW5mb1NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgQXJyYXlDb25zdHJ1Y3RvciA9IGluZm8uc3VwcEluZm9UeXBlID09PSBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLyA/IFVpbnQzMkFycmF5IDogRmxvYXQzMkFycmF5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cHBJbmZvVmlldyA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIsIHN1cHBJbmZvT2ZmU2V0LCBpbmZvLnN1cHBJbmZvQnVmZmVyLmxlbmd0aCk7IC8vbmV3IEFycmF5Q29uc3RydWN0b3Ioc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2Uoc3VwcEluZm9PZmZTZXQsIGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIHN1cHBJbmZvVmlldy5zZXQoaW5mby5zdXBwSW5mb0J1ZmZlcik7XG4gICAgICAgICAgICAgICAgc3VwcEluZm9PZmZTZXQgKz0gaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoOyAvLyBpbmZvLnN1cHBJbmZvQnVmZmVyLmxlbmd0aCAqIEFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBJbmZvT2ZmU2V0ID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBkdW1teVZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciwgMCwgNCk7IC8vbmV3IFVpbnQzMkFycmF5KHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKDAsIDE2KSk7XG4gICAgICAgICAgICBkdW1teVZpZXcuc2V0KFsxLCAxLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwcEluZm9CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgcmVzdWx0c1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyU2l6ZSA9IHJlc3VsdHNCdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplID0gcmVzdWx0c0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHJlc3VsdHNSZW1haW5kZXIgPSByZXN1bHRzQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChyZXN1bHRzUmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUgKz0gMTYgLSByZXN1bHRzUmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdyZXN1bHRzIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2V0dXAgYSBiaW5kR3JvdXAgdG8gdGVsbCB0aGUgc2hhZGVyIHdoaWNoXG4gICAgICAgIC8vIGJ1ZmZlciB0byB1c2UgZm9yIHRoZSBjb21wdXRhdGlvblxuICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtcbiAgICAgICAgICAgIGxhYmVsOiAnYmluZEdyb3VwIGZvciBzcGFyc2UgbWF0cml4IGJ1ZmZlcicsXG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlcjogY29tcHV0ZUluZm9CdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMSwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzdXBwSW5mb0J1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAyLCByZXNvdXJjZTogeyBidWZmZXI6IHJlc3VsdHNCdWZmZXIgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vY29uc3QgcGFpckNvbXBhcmlzb25zUGVyUGFzcyA9IG1heEl0ZXJhdGlvbnNQZXJUaHJlYWQgKiBudW1PZlRocmVhZHM7XG4gICAgICAgIC8vY29uc3QgcGFzc2VzID0gTWF0aC5jZWlsKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIHBhaXJDb21wYXJpc29uc1BlclBhc3MpO1xuICAgICAgICAvLyB3ZSB3aWxsIGRpc3RwYXRjaCB0aGlzIG1hbnkgcGFzc2VzIHRvIHRoZSBHUFUsIGFuZCBpdCB3aWxsIGhhbmRsZSBpbmRleGVzIGFsbCBieSBpdHNlbGYuXG4gICAgICAgIC8vIHdlIGFscmVhZHkgY29waWVkIHRoZSBzdGFydC9lbmQgaW5mb3JtYXRpb24gdG8gaXQsIHNvIGl0IHdpbGwga25vdyB3aGVyZSB0byBzdGFydCBhbmQgZW5kIG9uIGVhY2ggcGFzcy5cbiAgICAgICAgY29uc3QgcmVzdWx0c091dEJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdyZXN1bHRzIG91dCBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcmVzdWx0c0J1ZmZlci5zaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHRJcyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHRKcyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHREaXN0YW5jZXMgPSBbXTtcbiAgICAgICAgLy9sZXQgY29tYmluZWRGb3VuZCA9IDA7XG4gICAgICAgIGxldCBpc0FsbERvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFpc0FsbERvbmUpIHtcbiAgICAgICAgICAgIC8vIEVuY29kZSBjb21tYW5kcyB0byBkbyB0aGUgY29tcHV0YXRpb25cbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGlzdGFuY2UgZW5jb2RlcicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhc3MgPSBlbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3Moe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGlzdGFuY2UgY29tcHV0ZSBwYXNzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFzcy5zZXRQaXBlbGluZShwaXBlbGluZSk7XG4gICAgICAgICAgICBwYXNzLnNldEJpbmRHcm91cCgwLCBiaW5kR3JvdXApO1xuICAgICAgICAgICAgcGFzcy5kaXNwYXRjaFdvcmtncm91cHMod29ya2dyb3Vwc0RpbSwgd29ya2dyb3Vwc0RpbSk7XG4gICAgICAgICAgICBwYXNzLmVuZCgpO1xuICAgICAgICAgICAgZW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIocmVzdWx0c0J1ZmZlciwgMCwgcmVzdWx0c091dEJ1ZmZlciwgMCwgcmVzdWx0c091dEJ1ZmZlci5zaXplKTtcbiAgICAgICAgICAgIC8vIEZpbmlzaCBlbmNvZGluZyBhbmQgc3VibWl0IHRoZSBjb21tYW5kc1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZEJ1ZmZlciA9IGVuY29kZXIuZmluaXNoKCk7XG4gICAgICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kQnVmZmVyXSk7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXN1bHRzXG4gICAgICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0c091dEJ1ZmZlci5tYXBBc3luYyhHUFVNYXBNb2RlLlJFQUQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c091dEFycmF5QnVmZmVyID0gcmVzdWx0c091dEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzdWx0c1xuICAgICAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzSSA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNKID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0Rpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0ZvdW5kID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0RvbmUgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgICAgICBpc0FsbERvbmUgPSByZXN1bHRzRG9uZS5ldmVyeSgoZCkgPT4gZCA9PT0gMSk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbFJlc3VsdHMgPSByZXN1bHRzRm91bmQucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZEkgPSBuZXcgVWludDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkSiA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWREaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBsZXQgY29tYmluZWRPZmZzZXQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzSSA9IDA7IHJlc0kgPCByZXN1bHRzRm91bmQubGVuZ3RoOyByZXNJKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IHJlc3VsdHNGb3VuZFtyZXNJXTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkSS5zZXQocmVzdWx0c0kuc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWRKLnNldChyZXN1bHRzSi5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZERpc3RhbmNlcy5zZXQocmVzdWx0c0Rpc3RhbmNlcy5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZE9mZnNldCArPSBmb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdElzLnB1c2goY29tYmluZWRJKTtcbiAgICAgICAgICAgIHJlc3VsdEpzLnB1c2goY29tYmluZWRKKTtcbiAgICAgICAgICAgIHJlc3VsdERpc3RhbmNlcy5wdXNoKGNvbWJpbmVkRGlzdGFuY2VzKTtcbiAgICAgICAgICAgIHJlc3VsdHNPdXRCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFNpemUgPSByZXN1bHRJcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSSA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBjb25zdCBmaW5hbEogPSBuZXcgVWludDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgY29uc3QgZmluYWxEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGxldCBmaW5hbE9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0SXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZpbmFsSS5zZXQocmVzdWx0SXNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsSi5zZXQocmVzdWx0SnNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsRGlzdGFuY2VzLnNldChyZXN1bHREaXN0YW5jZXNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsT2Zmc2V0ICs9IHJlc3VsdElzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcyBydWxlIG1hbmRhdGVzLCBkZXN0cm95IGFsbCBidWZmZXJzLlxuICAgICAgICBjb21wdXRlSW5mb0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmVzdWx0c0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJlc3VsdHNPdXRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXR1cm4geyBpOiBmaW5hbEksIGo6IGZpbmFsSiwgZGlzdGFuY2U6IGZpbmFsRGlzdGFuY2VzIH07XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0KGRpc3RhbmNlTWV0cmljcywgbWF4RW50cnlMZW5zLCBtYXhEaXN0YW5jZSwgYWdncmVnYXRpb24pIHtcbiAgICBjb25zdCBkaXN0YW5jZVdnc2xzID0gZGlzdGFuY2VNZXRyaWNzLm1hcCgobWV0cmljLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgIGZuIGRpc3RhbmNlU2NyaXB0JHtpfShhSW5kZXg6IHUzMiwgYkluZGV4OiB1MzIpIC0+IGYzMiB7XG4gICAgICAgICAgbGV0IGEgPSBjb21wdXRlSW5mby5kYXRhJHtpfVthSW5kZXhdO1xuICAgICAgICAgIGxldCBiID0gY29tcHV0ZUluZm8uZGF0YSR7aX1bYkluZGV4XTtcbiAgICAgICAgICBsZXQgbWF4RGlzdGFuY2U6IGYzMiA9ICR7bWF4RGlzdGFuY2V9O1xuICAgICAgICAgICR7d2ViR1BVRnVuY3Rpb25zW21ldHJpY10obWF4RW50cnlMZW5zW2ldLCBpKX1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9KTtcbiAgICBjb25zdCBhbGxEaXN0YW5jZVNjcmlwdHMgPSBkaXN0YW5jZVdnc2xzLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGNvbWJpbmVEaXN0YW5jZXNTY3JpcHQgPSBgXG4gICAgICBmbiBjb21iaW5lZERpc3RhbmNlKGFJbmRleDogdTMyLCBiSW5kZXg6IHUzMikgLT4gZjMyIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlczogYXJyYXk8ZjMyLCAke2Rpc3RhbmNlTWV0cmljcy5sZW5ndGh9PjtcbiAgICAgICAgJHtkaXN0YW5jZU1ldHJpY3MubWFwKChfLCBpKSA9PiBgZGlzdGFuY2VzWyR7aX1dID0gZGlzdGFuY2VTY3JpcHQke2l9KGFJbmRleCwgYkluZGV4KTtgKS5qb2luKCdcXG4nKX1cbiAgICAgICAgJHtXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OU1thZ2dyZWdhdGlvbl0oZGlzdGFuY2VNZXRyaWNzLmxlbmd0aCl9XG4gICAgICB9XG4gICAgXG4gICAgYDtcbiAgICByZXR1cm4gYWxsRGlzdGFuY2VTY3JpcHRzICsgJ1xcbicgKyBjb21iaW5lRGlzdGFuY2VzU2NyaXB0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLXNwYXJzZS1tYXRyaXguanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHksIFR5cGVTdXBwb3J0ZWREaXN0YW5jZXMsIFdFQkdQVURJU1RBTkNFIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzJztcbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVQcm9jZXNzSW5mbyhlbnRyeUxpc3QsIGRpc3RhbmNlTWV0cmljID0gV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgZW50cnlJbmRleCwgLy8gaW5kZXggb2YgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3Qgb2YgbGlzdHMgdGhhdCB3ZSB3YW50IHRvIHByb2Nlc3Ncbm9wdGlvbnMgPSB7IGdhcE9wZW5QZW5hbHR5OiAxLjAsIGdhcEV4dGVuc2lvblBlbmFsdHk6IDAuNiB9KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgZW50cnlUeXBlID0gbnVsbDtcbiAgICBjb25zdCBlbmNvZGVkTGlzdCA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJTVFJJTkdcIiAvKiBXR1BVRU5UUllUWVBFLlNUUklORyAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gbmV3IFVpbnQzMkFycmF5KGVudHJ5LnNwbGl0KCcnKS5tYXAoKGMpID0+IGMuY2hhckNvZGVBdCgwKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiTlVNQkVSXCIgLyogV0dQVUVOVFJZVFlQRS5OVU1CRVIgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IG5ldyBGbG9hdDMyQXJyYXkoW2VudHJ5XSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlMaXN0WzBdID09ICdvYmplY3QnICYmIGVudHJ5TGlzdC5zb21lKChlKSA9PiAnX2RhdGEnIGluIGUgJiYgJ19sZW5ndGgnIGluIGUpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIkJJVEFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5CSVRBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gZW50cnkuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIEludDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIGVudHJ5TGlzdCBhcyBVaW50MzJBcnJheVtdO1xuICAgIH0pKCk7XG4gICAgaWYgKCFlbmNvZGVkTGlzdCB8fCAhZW50cnlUeXBlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW50cnkgdHlwZSwgY291bGQgbm90IGRldGVybWluZSBlbnRyeSB0eXBlIGZyb20gaW5wdXQgbGlzdCcpO1xuICAgIGNvbnN0IGVuY29kZWRMaXN0VHlwZSA9IGVuY29kZWRMaXN0WzBdIGluc3RhbmNlb2YgSW50MzJBcnJheSA/IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLyA6XG4gICAgICAgIGVuY29kZWRMaXN0WzBdIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLyA6IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovO1xuICAgIC8vIHNpemVzIG9mIGVhY2ggZW50cmllcyBtaWdodCBkaWZmZXIsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGF0IGZvciBzb21lIGRpc3RhbmNlIG1ldHJpY3MsIGxpa2UgaGFtbWluZyBmb3IgZXhhbXBsZVxuICAgIGNvbnN0IGFycmF5U2l6ZXMgPSBuZXcgVWludDMyQXJyYXkoZW5jb2RlZExpc3QubWFwKChhcnIpID0+IGFyci5sZW5ndGgpKTtcbiAgICBpZiAoIVR5cGVTdXBwb3J0ZWREaXN0YW5jZXNbZW50cnlUeXBlXSB8fCAhVHlwZVN1cHBvcnRlZERpc3RhbmNlc1tlbnRyeVR5cGVdLmhhcyhkaXN0YW5jZU1ldHJpYykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzdGFuY2UgbWV0cmljICcke2Rpc3RhbmNlTWV0cmljfScgbm90IHN1cHBvcnRlZCBmb3IgZW50cnkgdHlwZSAnJHtlbnRyeVR5cGV9J2ApO1xuICAgIGNvbnN0IG1heEVudHJ5TGVuID0gYXJyYXlTaXplcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAvLyBnZXQgdGhlIGNvbXBsZXhpdHkgb2YgdXNlZCBhbGdvcml0aG1cbiAgICBjb25zdCBjb21wbGV4aXR5ID0gZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHlbZGlzdGFuY2VNZXRyaWNdKG1heEVudHJ5TGVuKTtcbiAgICBjb25zdCBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvciA9IGVuY29kZWRMaXN0VHlwZSA9PT0gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovID8gSW50MzJBcnJheSA6XG4gICAgICAgIChlbmNvZGVkTGlzdFR5cGUgPT09IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi8gPyBGbG9hdDMyQXJyYXkgOiBVaW50MzJBcnJheSk7XG4gICAgY29uc3QgZmxhdFNvdXJjZUFycmF5ID0gbmV3IEVuY29kZWRBcnJheUNvbnN0cnVjdG9yKGVuY29kZWRMaXN0Lmxlbmd0aCAqIG1heEVudHJ5TGVuKTtcbiAgICAvLyB3aGVuIHNldHRpbmcsIHdlIG5lZWQgdG8gc2V0IGVhY2ggYXJyYXkgYXQgYSBzcGVjaWZpYyBvZmZzZXQsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgbWF4QXJyYXlMZW4gYmVjYXVzZSBlYWNoIGFycmF5IG1pZ2h0IGhhdmUgZGlmZmVyZW50IHNpemVzLlxuICAgIC8vIHRoaXMgd2F5IHdlIHdpbGwgZ2V0IGNvcnJlY3QgbWF0cml4IHJlcHJlc2VudGF0aW9uIGluIHRoZSBjb21wdXRlIHNoYWRlclxuICAgIGVuY29kZWRMaXN0LmZvckVhY2goKHNlcSwgaSkgPT4ge1xuICAgICAgICBmbGF0U291cmNlQXJyYXkuc2V0KHNlcSwgaSAqIG1heEVudHJ5TGVuKTtcbiAgICB9KTtcbiAgICAvLyBOQiEgYWxsIHRoaXMgYmVmb3JlIHRoZSBsaW5lIHdhcyBnZW5lcmljLCBub3cgd2UgbmVlZCB0byBjYWxjdWxhdGUgc29tZSBzcGVjaWZpYyB0aGluZ3MgZm9yIHNvbWUgc3BlY2lmaWMgZGlzdGFuY2UgbWV0cmljc1xuICAgIC8vIGluaXRpYWxpemUgc3VwcCBpbmZvIGxpbmUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXI7XG4gICAgbGV0IHN1cHBJbmZvU3RydWN0V2dzbCA9ICcnOyAvLyB0aGUgY29kZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBvZiBzdXBwSW5mb1xuICAgIGxldCBzdXBwSW5mb1NpemUgPSAwO1xuICAgIGxldCBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgIGxldCBzdXBwSW5mb0J1ZmZlciA9IG51bGw7XG4gICAgaWYgKGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIIHx8IGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFKSB7XG4gICAgICAgIGxldCBtYXhNb25vbWVySW5kZXggPSBvcHRpb25zLnNjb3JpbmdNYXRyaXggJiYgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgP1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5hbHBoYWJldEluZGV4ZXMpLnJlZHVjZSgocHJldiwgbikgPT4gTWF0aC5tYXgocHJldiwgbi5jaGFyQ29kZUF0KDApKSwgMCkgOiAtMTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgZGVmYXVsdCBzaW1pbGFyaXR5IG1hdHJpeCBpZiBpdCBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKCFvcHRpb25zLmFscGhhYmV0SW5kZXhlcyB8fCAhb3B0aW9ucy5zY29yaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRTb3VyY2VBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChmbGF0U291cmNlQXJyYXlbaV0gPiBtYXhNb25vbWVySW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIG1heE1vbm9tZXJJbmRleCA9IGZsYXRTb3VyY2VBcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeCA9XG4gICAgICAgICAgICAgICAgbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKDApKTtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuc2NvcmluZ01hdHJpeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeFtpXVtpXSA9IDE7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXNbU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHlNYXRyaXhTaXplID0gKG1heE1vbm9tZXJJbmRleCArIDEpICogKG1heE1vbm9tZXJJbmRleCArIDEpO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeCA9IG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgRmxvYXQzMkFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpKTtcbiAgICAgICAgLy8gc2V0IGRpYWdvbmFsIHRvIDFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhNb25vbWVySW5kZXggKyAxOyBpKyspXG4gICAgICAgICAgICB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXVtpXSA9IDE7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0SW5kZXhlcyA9IG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhbHBoYWJldEluZGV4ZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXMoYWxwaGFiZXRJbmRleGVzKSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGtleTIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2tleS5jaGFyQ29kZUF0KDApXVtrZXkyLmNoYXJDb2RlQXQoMCldID1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1trZXldXVthbHBoYWJldEluZGV4ZXNba2V5Ml1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGluIG1lbW9yeSBsYXlvdXQsIHdlIHdpbGwgaGF2ZSAyIGZsb2F0MzIgcyBmb3IgZ2FwT3BlbiBhbmQgZ2FwRXh0ZW5zaW9uIHBlbmFsdGllcywgYW5kIHRoZW4gZjMyIGFycmF5PGFycmF5PGYzMj4+IGZvciBzaW1pbGFyaXR5IG1hdHJpeC5cbiAgICAgICAgLy8gYmVjYXVzZSBvZiBwcmltaXRpdmVzLCB0aGVyZSB3aWxsIGJlIG5vIHBhZGRpbmcsIHNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHNpemUgZGlyZWN0bHlcbiAgICAgICAgc3VwcEluZm9TaXplID0gMiArIHNpbWlsYXJpdHlNYXRyaXhTaXplO1xuICAgICAgICBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoc3VwcEluZm9TaXplKTtcbiAgICAgICAgc3VwcEluZm9CdWZmZXJbMF0gPSAoX2EgPSBvcHRpb25zLmdhcE9wZW5QZW5hbHR5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxLjA7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyWzFdID0gKF9iID0gb3B0aW9ucy5nYXBFeHRlbnNpb25QZW5hbHR5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLjY7XG4gICAgICAgIGxldCBvZmZzZXQgPSAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXBwSW5mb0J1ZmZlci5zZXQodHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV0sIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCA9IGBcbiAgICAgICAgICAgIGdhcE9wZW5QZW5hbHR5JHtlbnRyeUluZGV4fTogZjMyLFxuICAgICAgICAgICAgZ2FwRXh0ZW5zaW9uUGVuYWx0eSR7ZW50cnlJbmRleH06IGYzMixcbiAgICAgICAgICAgIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9OiBhcnJheTxhcnJheTxmMzIsICR7bWF4TW9ub21lckluZGV4ICsgMX0+LCAke21heE1vbm9tZXJJbmRleCArIDF9PmA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlKSB7XG4gICAgICAgIC8vIGZvciBkaWZmZXJlbmNlLCB3ZSBuZWVkIHJhbmdlIG9mIHZhbHVlcyBmb3Igbm9ybWFsaXphdGlvbiBvZiB0aGUgZGlmZmVyZW5jZVxuICAgICAgICBpZiAoIW9wdGlvbnMucmFuZ2UgfHwgdHlwZW9mIG9wdGlvbnMucmFuZ2UgIT09ICdudW1iZXInIHx8IG9wdGlvbnMucmFuZ2UgPD0gMCkge1xuICAgICAgICAgICAgY29uc3QgbWluID0gZmxhdFNvdXJjZUFycmF5LnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksIGZsYXRTb3VyY2VBcnJheVswXSk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBmbGF0U291cmNlQXJyYXkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgZmxhdFNvdXJjZUFycmF5WzBdKTtcbiAgICAgICAgICAgIG9wdGlvbnMucmFuZ2UgPSBtYXggLSBtaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmFuZ2UgPD0gMClcbiAgICAgICAgICAgIG9wdGlvbnMucmFuZ2UgPSAxLjA7IC8vIHRoaXMgbWVhbnMgdGhhdCBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZSwgYW5kIGFsbCBkaXN0YW5jZXMgd2lsbCBwcm9kdWNlIDAuXG4gICAgICAgIHN1cHBJbmZvU2l6ZSA9IDE7XG4gICAgICAgIHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShbb3B0aW9ucy5yYW5nZV0pO1xuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wgPSBgXG4gICAgICAgICAgICByYW5nZSR7ZW50cnlJbmRleH06IGYzMmA7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFUeXBlV0dTTCA9IGZsYXRTb3VyY2VBcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgPyAnaTMyJyA6IChmbGF0U291cmNlQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgPyAnZjMyJyA6ICd1MzInKTtcbiAgICBjb25zdCBkYXRhU3RydWN0V2dzbCA9IGBkYXRhJHtlbnRyeUluZGV4fTogYXJyYXk8YXJyYXk8JHtkYXRhVHlwZVdHU0x9LCAke21heEVudHJ5TGVufT4sICR7ZW5jb2RlZExpc3QubGVuZ3RofT5gO1xuICAgIC8vIGZvciBub3csIG90aGVyIGRpc3RhbmNlcyBkbyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc28gd2UgY2FuIHNraXAgdGhhdFxuICAgIHJldHVybiB7XG4gICAgICAgIGZsYXRTb3VyY2VBcnJheSxcbiAgICAgICAgc291cmNlQXJyYXlTaXplOiBmbGF0U291cmNlQXJyYXkubGVuZ3RoLFxuICAgICAgICBtYXhFbnRyeUxlbixcbiAgICAgICAgYXJyYXlTaXplcyxcbiAgICAgICAgY29tcGxleGl0eSxcbiAgICAgICAgc3VwcEluZm9CdWZmZXIsXG4gICAgICAgIHN1cHBJbmZvU2l6ZSxcbiAgICAgICAgc3VwcEluZm9UeXBlOiBzdXBwSW5mb1R5cGUsXG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCxcbiAgICAgICAgZW50cnlUeXBlLFxuICAgICAgICBkYXRhVHlwZVdHU0wsXG4gICAgICAgIGRhdGFTdHJ1Y3RXZ3NsLFxuICAgICAgICBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvclxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtcHJvY2Vzcy1pbmZvLmpzLm1hcCIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlT2JqZWN0LCB0aHJlc2hvbGQpIHtcbiAgICBjb25zdCBuID0gY2x1c3Rlci5sZW5ndGg7XG4gICAgY29uc3QgaXMgPSBbXTtcbiAgICBjb25zdCBqcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgY29uc3QgYSA9IGNsdXN0ZXJbaV07XG4gICAgICAgICAgICBjb25zdCBiID0gY2x1c3RlcltqXTtcbiAgICAgICAgICAgIGlmIChzcGFyc2VPYmplY3RbYV0/LltiXSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIGpzLnB1c2goaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldExheW91dEVtYmVkZGluZ3MoaXMsIGpzLCBjbHVzdGVyKTtcbn1cbmZ1bmN0aW9uIGdldExheW91dEVtYmVkZGluZ3MoaXMsIGpzLCBjbHVzdGVyKSB7XG4gICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKS5tYXAoKCkgPT4gTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAxMDA7XG4gICAgY29uc3QgeFZlbG9jaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHlWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICBjb25zdCB0ZW1wZXJhdHVyZSA9ICgxIC0gaSAvIGl0ZXJhdGlvbnMpO1xuICAgICAgICB4VmVsb2NpdGllcy5maWxsKDApO1xuICAgICAgICB5VmVsb2NpdGllcy5maWxsKDApO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gaXNbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBqc1tpZHhdO1xuICAgICAgICAgICAgY29uc3QgZHggPSBlbWJlZFhbYV0gLSBlbWJlZFhbYl07XG4gICAgICAgICAgICBjb25zdCBkeSA9IGVtYmVkWVthXSAtIGVtYmVkWVtiXTtcbiAgICAgICAgICAgIC8vICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgICAgICAgLy8gICBjb25zdCBmYWN0b3IgPSAoZGlzdGFuY2UgLSAxKSAvIGRpc3RhbmNlO1xuICAgICAgICAgICAgLy8gICBjb25zdCBvZmZzZXRYID0gZHggKiBmYWN0b3I7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IG9mZnNldFkgPSBkeSAqIGZhY3RvcjtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCkgPj0gMSkge1xuICAgICAgICAgICAgICAgIHhWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHg7XG4gICAgICAgICAgICAgICAgeFZlbG9jaXRpZXNbYl0gKz0gdGVtcGVyYXR1cmUgKiBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPj0gMSkge1xuICAgICAgICAgICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgICAgICAgICAgeVZlbG9jaXRpZXNbYl0gKz0gdGVtcGVyYXR1cmUgKiBkeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgZW1iZWRZW2FdICs9IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgIC8vICAgZW1iZWRZW2JdIC09IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZlY1NpemUgPSBNYXRoLnNxcnQoeFZlbG9jaXRpZXNbaWR4XSAqIHhWZWxvY2l0aWVzW2lkeF0gKyB5VmVsb2NpdGllc1tpZHhdICogeVZlbG9jaXRpZXNbaWR4XSk7XG4gICAgICAgICAgICBpZiAodmVjU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBlbWJlZFhbaWR4XSArPSB4VmVsb2NpdGllc1tpZHhdIC8gdmVjU2l6ZSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgICAgIGVtYmVkWVtpZHhdICs9IHlWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbm9ybWFsaXplXG4gICAgbGV0IG1pblggPSBlbWJlZFhbMF07XG4gICAgbGV0IG1pblkgPSBlbWJlZFlbMF07XG4gICAgbGV0IG1heFggPSBlbWJlZFhbMF07XG4gICAgbGV0IG1heFkgPSBlbWJlZFlbMF07XG4gICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBlbWJlZFhbaWR4XSk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbaWR4XSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFhbaWR4XSk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBlbWJlZFlbaWR4XSk7XG4gICAgfVxuICAgIGxldCByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgICBsZXQgcmFuZ2VZID0gbWF4WSAtIG1pblk7XG4gICAgaWYgKHJhbmdlWCA9PT0gMClcbiAgICAgICAgcmFuZ2VYID0gbWF4WDtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgICAgIGVtYmVkWFtpZHhdID0gKGVtYmVkWFtpZHhdIC0gbWluWCkgLyByYW5nZVggLyAyICsgMC41O1xuICAgIGlmIChyYW5nZVkgPT09IDApXG4gICAgICAgIHJhbmdlWSA9IG1heFk7XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKVxuICAgICAgICBlbWJlZFlbaWR4XSA9IChlbWJlZFlbaWR4XSAtIG1pblkpIC8gcmFuZ2VZIC8gMiArIDAuNTtcbiAgICByZXR1cm4geyBlbWJlZFgsIGVtYmVkWSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pWW1sdkxXeGhlVzkxZEM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbUpwYnkxc1lYbHZkWFF1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlJVRXNUVUZCVFN4RFFVRkRMRXRCUVVzc1ZVRkJWU3hUUVVGVExFTkJRVU1zVDBGQmFVSXNSVUZCUlN4WlFVRm5ReXhGUVVGRkxGTkJRV2xDTzBsQlEzQkhMRTFCUVUwc1EwRkJReXhIUVVGSExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTTdTVUZEZWtJc1RVRkJUU3hGUVVGRkxFZEJRV0VzUlVGQlJTeERRVUZETzBsQlEzaENMRTFCUVUwc1JVRkJSU3hIUVVGaExFVkJRVVVzUTBGQlF6dEpRVU40UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xRkJRekZDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxDTEUxQlFVMHNRMEZCUXl4SFFVRkhMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU55UWl4TlFVRk5MRU5CUVVNc1IwRkJSeXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEY2tJc1NVRkJTU3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hUUVVGVExFVkJRVVU3WjBKQlEzSkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTFnc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0aFFVTmFPMU5CUTBZN1MwRkRSanRKUVVORUxFOUJRVThzYlVKQlFXMUNMRU5CUVVNc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTTVReXhEUVVGRE8wRkJSVVFzVTBGQlV5eHRRa0ZCYlVJc1EwRkJReXhGUVVGWkxFVkJRVVVzUlVGQldTeEZRVUZGTEU5QlFXbENPMGxCUTNoRkxFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRkxFTkJRVU1zUTBGQlF6dEpRVU4wUml4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGbEJRVmtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNN1NVRkRkRVlzVFVGQlRTeFZRVUZWTEVkQlFVY3NSMEZCUnl4RFFVRkRPMGxCUTNaQ0xFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkROMFFzVFVGQlRTeFhRVUZYTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNM1JDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVlVGQlZTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUTI1RExFMUJRVTBzVjBGQlZ5eEhRVUZITEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zUTBGQlF6dFJRVU42UXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzQkNMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VJc1MwRkJTeXhKUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEVWQlFVVXNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJReXhOUVVGTkxFVkJRVVVzUjBGQlJ5eEZRVUZGTEVWQlFVVTdXVUZEZUVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJ4Q0xFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRaUVVOc1FpeE5RVUZOTEVWQlFVVXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJwRExFMUJRVTBzUlVGQlJTeEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYWtNc2JVUkJRVzFFTzFsQlEyNUVMRGhEUVVFNFF6dFpRVU01UXl4cFEwRkJhVU03V1VGRGFrTXNhVU5CUVdsRE8xbEJRMnBETEVsQlFVa3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVTdaMEpCUTNKQ0xGZEJRVmNzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4WFFVRlhMRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU51UXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzVjBGQlZ5eEhRVUZITEVWQlFVVXNRMEZCUXp0aFFVTndRenRaUVVORUxFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVU3WjBKQlEzSkNMRmRCUVZjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFhRVUZYTEVkQlFVY3NSVUZCUlN4RFFVRkRPMmRDUVVOdVF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1YwRkJWeXhIUVVGSExFVkJRVVVzUTBGQlF6dGhRVU53UXp0WlFVTklMSGREUVVGM1F6dFpRVU40UXl4M1EwRkJkME03VTBGRGRrTTdVVUZEUkN4TFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJUdFpRVU0zUXl4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhYUVVGWExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTNKSExFbEJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNSVUZCUlR0blFrRkRaaXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFOUJRVThzUjBGQlJ5eFhRVUZYTEVOQlFVTTdaMEpCUTNoRUxFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4WFFVRlhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzVDBGQlR5eEhRVUZITEZkQlFWY3NRMEZCUXp0aFFVTjZSRHRUUVVOR08wdEJRMFk3U1VGRlJDeFpRVUZaTzBsQlExb3NTVUZCU1N4SlFVRkpMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzSkNMRWxCUVVrc1NVRkJTU3hIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTnlRaXhKUVVGSkxFbEJRVWtzUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRja0lzU1VGQlNTeEpRVUZKTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pDTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRk8xRkJRemRETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUlVGQlJTeE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOdVF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFVkJRVVVzVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRia01zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTI1RExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTndRenRKUVVORUxFbEJRVWtzVFVGQlRTeEhRVUZITEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRla0lzU1VGQlNTeE5RVUZOTEVkQlFVY3NTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRKUVVONlFpeEpRVUZKTEUxQlFVMHNTMEZCU3l4RFFVRkRPMUZCUTJRc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF6dEpRVU5vUWl4TFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVU3VVVGRE0wTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFMUJRVTBzUjBGQlJ5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRPMGxCUTNoRUxFbEJRVWtzVFVGQlRTeExRVUZMTEVOQlFVTTdVVUZEWkN4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRE8wbEJRMmhDTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSVHRSUVVNelF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1RVRkJUU3hIUVVGSExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdTVUZGZUVRc1QwRkJUeXhGUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVTXNRMEZCUXp0QlFVTXhRaXhEUVVGRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdFRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUjlJR1p5YjIwZ0p5NHZkSGx3WlhNbk8xeHVYRzVsZUhCdmNuUWdZWE41Ym1NZ1puVnVZM1JwYjI0Z1ltbHZUR0Y1YjNWMEtHTnNkWE4wWlhJNklHNTFiV0psY2x0ZExDQnpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2RHaHlaWE5vYjJ4a09pQnVkVzFpWlhJcElIdGNiaUFnWTI5dWMzUWdiaUE5SUdOc2RYTjBaWEl1YkdWdVozUm9PMXh1SUNCamIyNXpkQ0JwY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ1kyOXVjM1FnYW5NNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dianNnYVNzcktTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FpQTlJR2tnS3lBeE95QnFJRHdnYmpzZ2Fpc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmhJRDBnWTJ4MWMzUmxjbHRwWFR0Y2JpQWdJQ0FnSUdOdmJuTjBJR0lnUFNCamJIVnpkR1Z5VzJwZE8xeHVJQ0FnSUNBZ2FXWWdLSE53WVhKelpVOWlhbVZqZEZ0aFhUOHVXMkpkSUQ0OUlIUm9jbVZ6YUc5c1pDa2dlMXh1SUNBZ0lDQWdJQ0JwY3k1d2RYTm9LR2twTzF4dUlDQWdJQ0FnSUNCcWN5NXdkWE5vS0dvcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnWjJWMFRHRjViM1YwUlcxaVpXUmthVzVuY3locGN5d2dhbk1zSUdOc2RYTjBaWElwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJuWlhSTVlYbHZkWFJGYldKbFpHUnBibWR6S0dsek9pQnVkVzFpWlhKYlhTd2dhbk02SUc1MWJXSmxjbHRkTENCamJIVnpkR1Z5T2lCdWRXMWlaWEpiWFNrZ2UxeHVJQ0JqYjI1emRDQmxiV0psWkZnZ1BTQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtHTnNkWE4wWlhJdWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29LU0E5UGlCTllYUm9MbkpoYm1SdmJTZ3BJQ29nTVRBcE8xeHVJQ0JqYjI1emRDQmxiV0psWkZrZ1BTQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtHTnNkWE4wWlhJdWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29LU0E5UGlCTllYUm9MbkpoYm1SdmJTZ3BJQ29nTVRBcE8xeHVJQ0JqYjI1emRDQnBkR1Z5WVhScGIyNXpJRDBnTVRBd08xeHVJQ0JqYjI1emRDQjRWbVZzYjJOcGRHbGxjeUE5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvWTJ4MWMzUmxjaTVzWlc1bmRHZ3BMbVpwYkd3b01DazdYRzRnSUdOdmJuTjBJSGxXWld4dlkybDBhV1Z6SUQwZ2JtVjNJRVpzYjJGME16SkJjbkpoZVNoamJIVnpkR1Z5TG14bGJtZDBhQ2t1Wm1sc2JDZ3dLVHRjYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnBkR1Z5WVhScGIyNXpPeUJwS3lzcElIdGNiaUFnSUNCamIyNXpkQ0IwWlcxd1pYSmhkSFZ5WlNBOUlDZ3hJQzBnYVNBdklHbDBaWEpoZEdsdmJuTXBPMXh1SUNBZ0lIaFdaV3h2WTJsMGFXVnpMbVpwYkd3b01DazdYRzRnSUNBZ2VWWmxiRzlqYVhScFpYTXVabWxzYkNnd0tUdGNiaUFnSUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0JwY3k1c1pXNW5kR2c3SUdsa2VDc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmhJRDBnYVhOYmFXUjRYVHRjYmlBZ0lDQWdJR052Ym5OMElHSWdQU0JxYzF0cFpIaGRPMXh1SUNBZ0lDQWdZMjl1YzNRZ1pIZ2dQU0JsYldKbFpGaGJZVjBnTFNCbGJXSmxaRmhiWWwwN1hHNGdJQ0FnSUNCamIyNXpkQ0JrZVNBOUlHVnRZbVZrV1Z0aFhTQXRJR1Z0WW1Wa1dWdGlYVHRjYmlBZ0lDQWdJQzh2SUNBZ1kyOXVjM1FnWkdsemRHRnVZMlVnUFNCTllYUm9Mbk54Y25Rb1pIZ2dLaUJrZUNBcklHUjVJQ29nWkhrcE8xeHVJQ0FnSUNBZ0x5OGdJQ0JqYjI1emRDQm1ZV04wYjNJZ1BTQW9aR2x6ZEdGdVkyVWdMU0F4S1NBdklHUnBjM1JoYm1ObE8xeHVJQ0FnSUNBZ0x5OGdJQ0JqYjI1emRDQnZabVp6WlhSWUlEMGdaSGdnS2lCbVlXTjBiM0k3WEc0Z0lDQWdJQ0F2THlBZ0lHTnZibk4wSUc5bVpuTmxkRmtnUFNCa2VTQXFJR1poWTNSdmNqdGNiaUFnSUNBZ0lHbG1JQ2hOWVhSb0xtRmljeWhrZUNrZ1BqMGdNU2tnZTF4dUlDQWdJQ0FnSUNCNFZtVnNiMk5wZEdsbGMxdGhYU0F0UFNCMFpXMXdaWEpoZEhWeVpTQXFJR1I0TzF4dUlDQWdJQ0FnSUNCNFZtVnNiMk5wZEdsbGMxdGlYU0FyUFNCMFpXMXdaWEpoZEhWeVpTQXFJR1I0TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYVdZZ0tFMWhkR2d1WVdKektHUjVLU0ErUFNBeEtTQjdYRzRnSUNBZ0lDQWdJSGxXWld4dlkybDBhV1Z6VzJGZElDMDlJSFJsYlhCbGNtRjBkWEpsSUNvZ1pIazdYRzRnSUNBZ0lDQWdJSGxXWld4dlkybDBhV1Z6VzJKZElDczlJSFJsYlhCbGNtRjBkWEpsSUNvZ1pIazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0x5OGdJQ0JsYldKbFpGbGJZVjBnS3owZ2IyWm1jMlYwV1NBcUlIUmxiWEJsY21GMGRYSmxPMXh1SUNBZ0lDOHZJQ0FnWlcxaVpXUlpXMkpkSUMwOUlHOW1abk5sZEZrZ0tpQjBaVzF3WlhKaGRIVnlaVHRjYmlBZ0lDQjlYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FXUjRJRDBnTURzZ2FXUjRJRHdnWTJ4MWMzUmxjaTVzWlc1bmRHZzdJR2xrZUNzcktTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCMlpXTlRhWHBsSUQwZ1RXRjBhQzV6Y1hKMEtIaFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0tpQjRWbVZzYjJOcGRHbGxjMXRwWkhoZElDc2dlVlpsYkc5amFYUnBaWE5iYVdSNFhTQXFJSGxXWld4dlkybDBhV1Z6VzJsa2VGMHBPMXh1SUNBZ0lDQWdhV1lnS0habFkxTnBlbVVnUGlBd0tTQjdYRzRnSUNBZ0lDQWdJR1Z0WW1Wa1dGdHBaSGhkSUNzOUlIaFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0x5QjJaV05UYVhwbElDb2dkR1Z0Y0dWeVlYUjFjbVU3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXVnRwWkhoZElDczlJSGxXWld4dlkybDBhV1Z6VzJsa2VGMGdMeUIyWldOVGFYcGxJQ29nZEdWdGNHVnlZWFIxY21VN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdibTl5YldGc2FYcGxYRzRnSUd4bGRDQnRhVzVZSUQwZ1pXMWlaV1JZV3pCZE8xeHVJQ0JzWlhRZ2JXbHVXU0E5SUdWdFltVmtXVnN3WFR0Y2JpQWdiR1YwSUcxaGVGZ2dQU0JsYldKbFpGaGJNRjA3WEc0Z0lHeGxkQ0J0WVhoWklEMGdaVzFpWldSWld6QmRPMXh1SUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F4T3lCcFpIZ2dQQ0JqYkhWemRHVnlMbXhsYm1kMGFEc2dhV1I0S3lzcElIdGNiaUFnSUNCdGFXNVlJRDBnVFdGMGFDNXRhVzRvYldsdVdDd2daVzFpWldSWVcybGtlRjBwTzF4dUlDQWdJRzFwYmxrZ1BTQk5ZWFJvTG0xcGJpaHRhVzVaTENCbGJXSmxaRmxiYVdSNFhTazdYRzRnSUNBZ2JXRjRXQ0E5SUUxaGRHZ3ViV0Y0S0cxaGVGZ3NJR1Z0WW1Wa1dGdHBaSGhkS1R0Y2JpQWdJQ0J0WVhoWklEMGdUV0YwYUM1dFlYZ29iV0Y0V1N3Z1pXMWlaV1JaVzJsa2VGMHBPMXh1SUNCOVhHNGdJR3hsZENCeVlXNW5aVmdnUFNCdFlYaFlJQzBnYldsdVdEdGNiaUFnYkdWMElISmhibWRsV1NBOUlHMWhlRmtnTFNCdGFXNVpPMXh1SUNCcFppQW9jbUZ1WjJWWUlEMDlQU0F3S1Z4dUlDQWdJSEpoYm1kbFdDQTlJRzFoZUZnN1hHNGdJR1p2Y2lBb2JHVjBJR2xrZUNBOUlEQTdJR2xrZUNBOElHTnNkWE4wWlhJdWJHVnVaM1JvT3lCcFpIZ3JLeWxjYmlBZ0lDQmxiV0psWkZoYmFXUjRYU0E5SUNobGJXSmxaRmhiYVdSNFhTQXRJRzFwYmxncElDOGdjbUZ1WjJWWUlDOGdNaUFySURBdU5UdGNiaUFnYVdZZ0tISmhibWRsV1NBOVBUMGdNQ2xjYmlBZ0lDQnlZVzVuWlZrZ1BTQnRZWGhaTzF4dUlDQm1iM0lnS0d4bGRDQnBaSGdnUFNBd095QnBaSGdnUENCamJIVnpkR1Z5TG14bGJtZDBhRHNnYVdSNEt5c3BYRzRnSUNBZ1pXMWlaV1JaVzJsa2VGMGdQU0FvWlcxaVpXUlpXMmxrZUYwZ0xTQnRhVzVaS1NBdklISmhibWRsV1NBdklESWdLeUF3TGpVN1hHNWNiaUFnY21WMGRYSnVJSHRsYldKbFpGZ3NJR1Z0WW1Wa1dYMDdYRzU5WEc0aVhYMD0iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogY29sd2lzZSBub3JtYWxpemUgdGhlIGtubiBzaW1pbGFyaXRpZXNcbiAqIEJFIFdBUkUsIG1vZGlmaWVzIHRoZSBpbnB1dCBhcnJheSBpbiBwbGFjZVxuICogQHBhcmFtIGRldmljZVxuICogQHBhcmFtIGtublNpbWlsYXJpdGllc1xuICogQHBhcmFtIG9mZnNldHNcbiAqIEBwYXJhbSBuUm93c1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSBuUm93cztcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnY29sd2lzZS1ub3JtYWxpemUnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IGtublNpbWlsYXJpdGllcyA6IGFycmF5PGYzMj47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZD4gb2Zmc2V0cyA6IGFycmF5PHUzMj47XG4gICAgICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cFRocmVhZHNQZXJEaW19LCAke3dvcmtHcm91cFRocmVhZHNQZXJEaW19KSBmbiBub3JtYWxpemUoXG4gICAgICAgICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPixcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC54O1xuICAgICAgICAgICAgbGV0IGNvbCA9IGlkLnk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByb3cgKiAke3RocmVhZHNQZXJEaW19ICsgY29sO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49ICR7blJvd3N9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luID0gb2Zmc2V0c1tpbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0RW5kID0gb2Zmc2V0c1tpbmRleCArIDFdO1xuICAgICAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXRFbmQgLSBvZmZzZXRCZWdpbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldEJlZ2luOyBpIDwgb2Zmc2V0RW5kOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBrbm5TaW1pbGFyaXRpZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VtID4gMC4wKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBvZmZzZXRCZWdpbjsgaSA8IG9mZnNldEVuZDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgICBrbm5TaW1pbGFyaXRpZXNbaV0gPSBrbm5TaW1pbGFyaXRpZXNbaV0gLyBzdW07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnaGFtbWluZyBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaW1taWxhcml0aWVzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NpbW1pbGFyaXRpZXMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZToga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc2ltbWlsYXJpdGllc0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQoa25uU2ltaWxhcml0aWVzKTtcbiAgICAgICAgc2ltbWlsYXJpdGllc0J1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ29mZnNldHMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogb2Zmc2V0cy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkob2Zmc2V0c0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQob2Zmc2V0cyk7XG4gICAgICAgIG9mZnNldHNCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHNpbW1pbGFyaXRpZXNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IG9mZnNldHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21tYW5kRW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2RlcigpO1xuICAgICAgICBjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3MoKTtcbiAgICAgICAgcGFzc0VuY29kZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICBwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZW5kKCk7XG4gICAgICAgIGNvbnN0IG91dFNpbWlsYXJpdHlCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IHNpbWlsYXJpdHkgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IGtublNpbWlsYXJpdGllcy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb21tYW5kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoc2ltbWlsYXJpdGllc0J1ZmZlciwgMCwgb3V0U2ltaWxhcml0eUJ1ZmZlciwgMCwga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kRW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICB5aWVsZCBvdXRTaW1pbGFyaXR5QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShvdXRTaW1pbGFyaXR5QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xuICAgICAgICBrbm5TaW1pbGFyaXRpZXMuc2V0KGFycmF5QnVmZmVyKTtcbiAgICAgICAgb3V0U2ltaWxhcml0eUJ1ZmZlci51bm1hcCgpO1xuICAgICAgICBzaW1taWxhcml0aWVzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgb2Zmc2V0c0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dFNpbWlsYXJpdHlCdWZmZXIuZGVzdHJveSgpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sd2lzZS1ub3JtYWxpemUuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIGluZmxhdGlvbiBvcGVyYXRvciBpbiBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbGF0ZShrbm5TaW1pbGFyaXRpZXMsIGZhY3RvciA9IDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtublNpbWlsYXJpdGllcy5sZW5ndGg7IGkrKylcbiAgICAgICAga25uU2ltaWxhcml0aWVzW2ldID0gTWF0aC5wb3coa25uU2ltaWxhcml0aWVzW2ldLCBmYWN0b3IpO1xufVxuZnVuY3Rpb24gZ2V0Um93SW5kZXhlcyhvZmZzZXRzKSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQzMkFycmF5KG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gb2Zmc2V0c1tpXTsgaiA8IG9mZnNldHNbaSArIDFdOyBqKyspXG4gICAgICAgICAgICByZXNbal0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbG9va2luZyBhdCBhbHJlYWR5IHplcm9lZCBvdXQgdmFsdWVzLCBhbmQgb25seSBsb29rcyBhdCBsaXZlIGNlbGxzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZE5vUmV2aXZlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBrbm5JbmRleGVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSA5MDAwMDtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIC8vIG1pbmltdW0gdmFsdWUgYWZ0ZXIgZXhwYW5zaW9uLlxuICAgICAgICBjb25zdCBwcnVuZVZhbHVlID0gTWF0aC5wb3coMTAsIC1vcmRlcik7XG4gICAgICAgIGNvbnN0IG91dEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoa25uU2ltaWxhcml0aWVzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBzdHJ1Y3QgU3BhcnNlS05OIHtcbiAgICAgICAgICAgIGtublNpbWlsYXJpdGllczogYXJyYXk8ZjMyLCAke2tublNpbWlsYXJpdGllcy5sZW5ndGh9PixcbiAgICAgICAgICAgIGtubkluZGV4ZXM6IGFycmF5PHUzMiwgJHtrbm5JbmRleGVzLmxlbmd0aH0+LFxuICAgICAgICAgICAgb2Zmc2V0czogYXJyYXk8dTMyLCAke29mZnNldHMubGVuZ3RofT4sXG4gICAgICAgICAgICByb3dJbmRleGVzOiBhcnJheTx1MzIsICR7a25uSW5kZXhlcy5sZW5ndGh9PixcbiAgICAgICAgfVxuXG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3BhcnNlS05OOiBTcGFyc2VLTk47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gcmVzdWx0U2ltQmxvY2s6IGFycmF5PGYzMiwgJHtuZWVkZWRUaHJlYWRzfT47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygyKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3RhcnRBdDogdTMyO1xuICAgICAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSwgJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSkgZm4gZXhwYW5kKFxuICAgICAgICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj4sXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY29sID0gaWQueDtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC55O1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcm93ICogJHt0aHJlYWRzUGVyRGltfSArIGNvbDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAke25lZWRlZFRocmVhZHN9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHdvcmtpbmdJbmRleCA9IGluZGV4ICsgc3RhcnRBdDtcbiAgICAgICAgICAgIGlmICh3b3JraW5nSW5kZXggPj0gJHtrbm5JbmRleGVzLmxlbmd0aH0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByb3dJZHggPSBzcGFyc2VLTk4ucm93SW5kZXhlc1t3b3JraW5nSW5kZXhdO1xuICAgICAgICAgICAgbGV0IGNvbElkeCA9IHNwYXJzZUtOTi5rbm5JbmRleGVzW3dvcmtpbmdJbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0QmVnaW5Sb3cgPSBzcGFyc2VLTk4ub2Zmc2V0c1tyb3dJZHhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEVuZFJvdyA9IHNwYXJzZUtOTi5vZmZzZXRzW3Jvd0lkeCArIDFdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luQ29sID0gc3BhcnNlS05OLm9mZnNldHNbY29sSWR4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbmRDb2wgPSBzcGFyc2VLTk4ub2Zmc2V0c1tjb2xJZHggKyAxXTtcbiAgICAgICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0QmVnaW5Sb3c7IGkgPCBvZmZzZXRFbmRSb3c7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IG9mZnNldEJlZ2luQ29sOyBqIDwgb2Zmc2V0RW5kQ29sOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJzZUtOTi5rbm5JbmRleGVzW2ldID09IHNwYXJzZUtOTi5rbm5JbmRleGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBzcGFyc2VLTk4ua25uU2ltaWxhcml0aWVzW2ldICogc3BhcnNlS05OLmtublNpbWlsYXJpdGllc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1bSA+ICR7cHJ1bmVWYWx1ZX0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRTaW1CbG9ja1tpbmRleF0gPSBzdW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFNpbUJsb2NrW2luZGV4XSA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdleHBhbmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSA9IGtublNpbWlsYXJpdGllcy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aCArIG9mZnNldHMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGg7XG4gICAgICAgIGxldCBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSA9IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSAqIDQ7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplICYgMTU7XG4gICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSArPSAxNiAtIHJlbWFpbmRlcjtcbiAgICAgICAgY29uc3Qgc3BhcnNlS05OQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NwYXJzZSBrbm4gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzcGFyc2VLTk5BcnJheUJ1ZmZlciA9IHNwYXJzZUtOTkJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgICAgICAvLyBzZXQgc2ltaWxhcml0aWVzXG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIDAsIGtublNpbWlsYXJpdGllcy5sZW5ndGgpLnNldChrbm5TaW1pbGFyaXRpZXMpO1xuICAgICAgICAvLyBzZXQgaW5kZXhlc1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIGtublNpbWlsYXJpdGllcy5sZW5ndGggKiA0LCBrbm5JbmRleGVzLmxlbmd0aCkuc2V0KGtubkluZGV4ZXMpO1xuICAgICAgICAvLyBzZXQgb2Zmc2V0c1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGgpICogNCwgb2Zmc2V0cy5sZW5ndGgpLnNldChvZmZzZXRzKTtcbiAgICAgICAgLy8gc2V0IHJvdyBpbmRleGVzXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBnZXRSb3dJbmRleGVzKG9mZnNldHMpO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGggKyBvZmZzZXRzLmxlbmd0aCkgKiA0LCByb3dJbmRleGVzLmxlbmd0aCkuc2V0KHJvd0luZGV4ZXMpO1xuICAgICAgICBzcGFyc2VLTk5CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3RhcnQgZW5kIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiA0LFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3RhcnRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KFswXSk7XG4gICAgICAgIHN0YXJ0QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEJsb2NrQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdCBibG9jayBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogbmVlZGVkVGhyZWFkcyAqIDQsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3BhcnNlS05OQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDEsIHJlc291cmNlOiB7IGJ1ZmZlcjogcmVzdWx0QmxvY2tCdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMiwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzdGFydEJ1ZmZlciB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3V0QmxvY2tCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IGJsb2NrIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiByZXN1bHRCbG9ja0J1ZmZlci5zaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1RcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKGtubkluZGV4ZXMubGVuZ3RoIC8gbmVlZGVkVGhyZWFkcyk7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogbmVlZGVkVGhyZWFkcztcbiAgICAgICAgICAgIGNvbnN0IGN1ckxlbmd0aCA9IE1hdGgubWluKG5lZWRlZFRocmVhZHMsIGtubkluZGV4ZXMubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0YXJ0QnVmZmVyLCAwLCBuZXcgVWludDMyQXJyYXkoW3N0YXJ0XSkpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQgZW5jb2RlcicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhc3MgPSBlbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3Moe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kIGNvbXB1dGUgcGFzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhc3Muc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICAgICAgcGFzcy5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgICAgIHBhc3MuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgICAgIHBhc3MuZW5kKCk7XG4gICAgICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihyZXN1bHRCbG9ja0J1ZmZlciwgMCwgb3V0QmxvY2tCdWZmZXIsIDAsIG91dEJsb2NrQnVmZmVyLnNpemUpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbZW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ29uU3VibWl0dGVkV29ya0RvbmUnKTtcbiAgICAgICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZUVuZCgnb25TdWJtaXR0ZWRXb3JrRG9uZScpO1xuICAgICAgICAgICAgeWllbGQgb3V0QmxvY2tCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgICAgIGNvbnN0IG91dEJsb2NrID0gbmV3IEZsb2F0MzJBcnJheShvdXRCbG9ja0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpLCAwLCBjdXJMZW5ndGgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ2ZpbGxvdXQnKTtcbiAgICAgICAgICAgIG91dEtOTlNpbWlsYXJpdGllcy5zZXQob3V0QmxvY2ssIHN0YXJ0KTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lRW5kKCdmaWxsb3V0Jyk7XG4gICAgICAgICAgICBvdXRCbG9ja0J1ZmZlci51bm1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3lcbiAgICAgICAgc3BhcnNlS05OQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgc3RhcnRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRCbG9ja0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dEJsb2NrQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHsgS05OSW5kZXhlczoga25uSW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRLTk5TaW1pbGFyaXRpZXMsIGluZGV4T2Zmc2V0czogb2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5mbGF0ZS1leHBhbmQuanMubWFwIiwiaW1wb3J0IHsgdG9PZmZzZXRGb3JtIH0gZnJvbSAnLi4vdW1hcC91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50MzJBcnJheShuUm93cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbc3BhcnNlTWF0cml4LmlbaV1dKys7XG4gICAgICAgIHJlc1tzcGFyc2VNYXRyaXgualtpXV0rKztcbiAgICB9XG4gICAgLy8gYWRkIGxvb3BzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKVxuICAgICAgICByZXNbaV0rKztcbiAgICByZXR1cm4gcmVzO1xufVxuLyoqXG4gKiBCRSBXQVJFLCB0aGlzIGZ1bmN0aW9uIGlzIG1lbnQgZm9yIGhhbGYgc3BhcnNlIG1hdHJpY2VzIG9ubHkhISFcbiAqIEBwYXJhbSBzcGFyc2VNYXRyaXhcbiAqIEBwYXJhbSBuUm93c1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0oc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IG9jY3VyZW5jZUNvdW50ID0gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgY29uc3Qgb2Zmc2V0Rm9ybSA9IHRvT2Zmc2V0Rm9ybShvY2N1cmVuY2VDb3VudCk7XG4gICAgY29uc3QgaW5zZXJ0Q291bnRlciA9IG5ldyBVaW50MzJBcnJheShuUm93cykuZmlsbCgxKTsgLy8gZm9yIGNvdW50aW5nIGhvdyBtYW55IHRoaW5ncyB3ZSBpbnNlcnRlZCBpbnRvIHRoZSBrbm4gYXJyYXlzLlxuICAgIC8vIHdlIGluaXRpYWxpemUgdGhlc2UgY291bnRlcnMgdG8gb25lIGJlY2F1c2UgZmlyc3Qgd2UgaW5zZXJ0IHRoZSBzZWxmIGxvb3BzXG4gICAgLy8gZG9udCBiZSBjb25mdXNlZCBieSB0aGUgbmFtZSBrbm4sIGsgaGVyZSBpcyB2YXJpYWJsZSwgaXRzIGp1c3QgdGhlIHRoaW5nIHRoYXQgaW4gdGhpcyBmb3JtLCB3ZSBrbm93IHRoYXQgYXQgaW5kZXggaVxuICAgIC8vIHdlIGhhdmUgc29tZSBrKHZhcmlhYmxlKSBhbW1vdW50IG9mIHNwYXJzZSBuZWlnYm91cnNcbiAgICAvLyB3ZSBrbm93IGZvciBhIGZhY3QgdGhhdCBzcGFyc2UgbWF0cml4IHdpbGwgbm90IGNvbnRhaW4gYW55IGR1cGxpY2F0ZXMsIHdlIGFkZCBuUm93cyB0byBhY2NvdW50IGZvciBzZWxmIGxvb3BzXG4gICAgY29uc3QgS05OSW5kZXhlcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICAgIGNvbnN0IEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmkubGVuZ3RoICogMiArIG5Sb3dzKTtcbiAgICAvLyBpbnNlcnQgc2VsZiBsb29wcyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBvZmZzZXRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW2ldXSA9IGk7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2ldXSA9IDE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgICAgIGNvbnN0IGNvbCA9IHNwYXJzZU1hdHJpeC5qW2ldO1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW3Jvd10gKyBpbnNlcnRDb3VudGVyW3Jvd11dID0gY29sO1xuICAgICAgICBLTk5TaW1pbGFyaXRpZXNbb2Zmc2V0Rm9ybVtyb3ddICsgaW5zZXJ0Q291bnRlcltyb3ddXSA9IHNpbWlsYXJpdHk7XG4gICAgICAgIGluc2VydENvdW50ZXJbcm93XSsrO1xuICAgICAgICBLTk5JbmRleGVzW29mZnNldEZvcm1bY29sXSArIGluc2VydENvdW50ZXJbY29sXV0gPSByb3c7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2NvbF0gKyBpbnNlcnRDb3VudGVyW2NvbF1dID0gc2ltaWxhcml0eTtcbiAgICAgICAgaW5zZXJ0Q291bnRlcltjb2xdKys7XG4gICAgfVxuICAgIHJldHVybiB7IEtOTkluZGV4ZXMsIEtOTlNpbWlsYXJpdGllcywgaW5kZXhPZmZzZXRzOiBvZmZzZXRGb3JtIH07XG59XG5leHBvcnQgZnVuY3Rpb24ga25uVG9TcGFyc2VGb3JtKGtubkluZGV4ZXMsIGtublNpbXMpIHtcbiAgICBjb25zdCBsZW5ndGhzID0ga25uSW5kZXhlcy5tYXAoKHgpID0+IHgubGVuZ3RoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbmd0aHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IHRvT2Zmc2V0Rm9ybShsZW5ndGhzKTtcbiAgICBjb25zdCBvdXRJbmRleGVzID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICBjb25zdCBvdXRTaW1zID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5JbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dEluZGV4ZXMuc2V0KGtubkluZGV4ZXNbaV0sIG9mZnNldHNbaV0pO1xuICAgICAgICBvdXRTaW1zLnNldChrbm5TaW1zW2ldLCBvZmZzZXRzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgS05OSW5kZXhlczogb3V0SW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRTaW1zLCBpbmRleE9mZnNldHM6IG9mZnNldHMgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgbGV2ZW5iZXJnTWFycXVhcmR0IH0gZnJvbSAnbWwtbGV2ZW5iZXJnLW1hcnF1YXJkdCc7XG5leHBvcnQgZnVuY3Rpb24gbGluZWFyKHgxLCB4Miwgbikge1xuICAgIGNvbnN0IHN0ZXAgPSAoeDIgLSB4MSkgLyAobiAtIDEpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB4MSArIHN0ZXAgKiBpKTtcbn1cbi8qKlxuICogRml0IGEsIGIgcGFyYW1zIGZvciB0aGUgZGlmZmVyZW50aWFibGUgY3VydmUgdXNlZCBpbiBsb3dlclxuICogZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBjb21wbGV4IGNvbnN0cnVjdGlvbi4gV2Ugd2FudCB0aGVcbiAqIHNtb290aCBjdXJ2ZSAoZnJvbSBhIHByZS1kZWZpbmVkIGZhbWlseSB3aXRoIHNpbXBsZSBncmFkaWVudCkgdGhhdFxuICogYmVzdCBtYXRjaGVzIGFuIG9mZnNldCBleHBvbmVudGlhbCBkZWNheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBQlBhcmFtcyhzcHJlYWQsIG1pbkRpc3QpIHtcbiAgICBjb25zdCBjdXJ2ZSA9IChbYSwgYl0pID0+ICh4KSA9PiB7XG4gICAgICAgIHJldHVybiAxLjAgLyAoMS4wICsgYSAqIE1hdGgucG93KHgsICgyICogYikpKTtcbiAgICB9O1xuICAgIGNvbnN0IHh2ID0gbGluZWFyKDAsIHNwcmVhZCAqIDMsIDMwMClcbiAgICAgICAgLm1hcCgodmFsKSA9PiAodmFsIDwgbWluRGlzdCA/IDEuMCA6IHZhbCkpO1xuICAgIGNvbnN0IHl2ID0gbmV3IEFycmF5KHh2Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZ3RlID0geHZbaW5kZXhdID49IG1pbkRpc3Q7XG4gICAgICAgIHJldHVybiBndGUgPyBNYXRoLmV4cCgtKHh2W2luZGV4XSAtIG1pbkRpc3QpIC8gc3ByZWFkKSA6IHZhbDtcbiAgICB9KTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gWzAuNSwgMC41XTtcbiAgICBjb25zdCBkYXRhID0geyB4OiB4diwgeTogeXYgfTtcbiAgICAvLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBhbGdvcml0aG0gKGZyb20gZ2l0aHViIGV4YW1wbGUpXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGFtcGluZzogMS41LFxuICAgICAgICBpbml0aWFsVmFsdWVzLFxuICAgICAgICBncmFkaWVudERpZmZlcmVuY2U6IDEwZS0yLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiAxMDAsXG4gICAgICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgY29uc3QgeyBwYXJhbWV0ZXJWYWx1ZXMgfSA9IGxldmVuYmVyZ01hcnF1YXJkdChkYXRhLCBjdXJ2ZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgW2EsIGJdID0gcGFyYW1ldGVyVmFsdWVzO1xuICAgIHJldHVybiB7IGEsIGIgfTtcbn1cbi8qKlxuICogaGV1cmlzdGljIGZvciBudW1iZXIgb2YgZXBvY2hzIG9mIHVtYXAsIGRpZmZlcnMgZnJvbSBjcHUgdmVyc2lvbiwgYmVjYXVzZSBvZiB0aGUgd2F5IGdwdSBwYXNzZXMgZGF0YVxuICogQHBhcmFtIGVudHJ5TGVuIG51bWJlciBvZiBlbnRyaWVzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TkVwb2NocyhlbnRyeUxlbikge1xuICAgIC8vXG4gICAgY29uc3QgbGVuZ3RoID0gZW50cnlMZW47XG4gICAgaWYgKGxlbmd0aCA8PSAyNTAwKVxuICAgICAgICByZXR1cm4gMTAwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNTAwMClcbiAgICAgICAgcmV0dXJuIDgwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNzUwMClcbiAgICAgICAgcmV0dXJuIDY1MDtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiA0MDA7XG59XG4vKiogIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgYXJyYXkgb2Ygc2l6ZXMgdG8gb2Zmc2V0IGZvcm0gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b09mZnNldEZvcm0oYXIpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDMyQXJyYXkoYXIubGVuZ3RoICsgMSk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCArPSBhcltpXTtcbiAgICB9XG4gICAgcmVzW2FyLmxlbmd0aF0gPSBvZmZzZXQ7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKiBtdWx0aXBsaWVzIGZsYXQgcmVwcmVzZW50YXRpb24gb2Ygc3BhcnNlIGtubiBpbmZvIGJ5IHNjYWxhci5cbiAqIGFsc28gbm8gcG9pbnQgb2YgZG9pbmcgdGhpcyBvbiBncHUsIGNhbiBiZSBkb25lIG9uIGNwdSBwcmV0dHkgcXVpY2tseS5cbiAqIGlmIHRoZXJlIHdpbGwgYmUgbmVlZCBmb3IgaXQsIGl0IGNhbiBiZSBkb25lIG9uIGdwdSBhcyB3ZWxsIHZlcnkgdmVyeSBlYXNpbHkuXG4gKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyBhcnJheVxuICogQHBhcmFtIHNjYWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIodmFsdWVzLCBzY2FsYXIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdmFsdWVzW2ldID0gdmFsdWVzW2ldICogc2NhbGFyO1xufVxuLyoqXG4gKiBnZW5lcmF0ZSB0cmFuc3Bvc2Ugb2Yga25uIGZyb20gdGhlIHRyYW5zcG9zaXRpb24gaW5mbyB0YWtlbiBmcm9tIHNwYXJzZSBrbm4gaW5mb1xuICogdXNpbmcgdGhpcyBpbmZvcm1hdGlvbiBhdm9pZHMgYmlsbGlvbnMgb2YgYXJyYXkucHVzaCBjYWxscywgaXMgbXVjaCBjbGVhbmVyLCBhbGxvd3MgdHlwZWQgYXJyYXkgdXNlIGFuZCBpcyBmYXN0ZXIuXG4gKiBubyBwb2ludCBvZiBkb2luZyB0aGlzIG9uIGdwdSwgY2FuIGJlIGRvbmUgb24gY3B1IGFzIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGluZm8gbmVlZGVkLlxuICogQHBhcmFtIGtubkluZGV4ZXNcbiAqIEBwYXJhbSBrbm5EaXN0YW5jZXNcbiAqIEBwYXJhbSBrbm5TcGFyc2VJbmZvXG4gKiBAcGFyYW0ga25uU2l6ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUtOTihrbm5JbmRleGVzLCBrbm5EaXN0YW5jZXMsIGtublNwYXJzZUluZm8sIGtublNpemUgPSAxNSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG51bU9mRW50cmllcyA9IGtubkluZGV4ZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxsS25uRW50cnlTaXplID0ga25uU2l6ZSAqIG51bU9mRW50cmllcztcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlU2l6ZXMgPSBrbm5TcGFyc2VJbmZvLnJlc3VsdFRyYW5zcG9zZVNpemVzQXJyYXk7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZU9mZnNldHMgPSB0b09mZnNldEZvcm0odHJhbnNwb3NlU2l6ZXMpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQ29weSA9IG5ldyBVaW50MzJBcnJheSh0cmFuc3Bvc2VPZmZzZXRzLmxlbmd0aCk7XG4gICAgICAgIG9mZnNldHNDb3B5LnNldCh0cmFuc3Bvc2VPZmZzZXRzKTsgLy8gd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljIGluZGV4aW5nXG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZUtOTkluZGV4ZXMgPSBuZXcgSW50MzJBcnJheShmdWxsS25uRW50cnlTaXplKS5maWxsKDApO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VLTk5EaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxLbm5FbnRyeVNpemUpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZFbnRyaWVzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga25uU2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleCA9IGtubkluZGV4ZXNbaV1bal07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleE9mZnNldCA9IG9mZnNldHNDb3B5W290aGVySW5kZXhdO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkluZGV4ZXNbb3RoZXJJbmRleE9mZnNldF0gPSBpO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkRpc3RhbmNlc1tvdGhlckluZGV4T2Zmc2V0XSA9IGtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgICAgICBvZmZzZXRzQ29weVtvdGhlckluZGV4XSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRyYW5zcG9zZUtOTkluZGV4ZXMsIHRyYW5zcG9zZUtOTkRpc3RhbmNlcywgdHJhbnNwb3NlT2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGFuIEFycmF5IChhcnJheSBvciB0eXBlZCBhcnJheSwgZXhjZXB0IHRob3NlIHRoYXQgY29udGFpbiBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBPYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXkgb3IgYSB0eXBlZCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQW55QXJyYXkodmFsdWUpIHtcbiAgICBjb25zdCB0YWcgPSB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICByZXR1cm4gdGFnLmVuZHNXaXRoKCdBcnJheV0nKSAmJiAhdGFnLmluY2x1ZGVzKCdCaWcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGJpb0xheW91dCB9IGZyb20gJy4vYmlvLWxheW91dCc7XG5pbXBvcnQgeyBtYXJrb3ZDbHVzdGVyV2ViR1BVIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRNQ0xPcHRpb25zID0ge1xuICAgIGV4cGFuZEZhY3RvcjogMixcbiAgICBtYXhJdGVyYXRpb25zOiA1LFxuICAgIGluZmxhdGVGYWN0b3I6IDIsXG4gICAgbXVsdEZhY3RvcjogMSxcbn07XG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7IC4uLmRlZmF1bHRNQ0xPcHRpb25zLCAuLi5vcHRzIH07XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIC8vIHRlc3RXb3JrZXJNdWx0aXBseSgpO1xuICAgICAgICAvLyByZXR1cm4gbmV3IEludDMyQXJyYXkoblJvd3MpO1xuICAgICAgICBsZXQgc3BhcnNlT2JqZWN0ID0gdGhpcy50b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdCA9IHRoaXMuZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5mbGF0ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjbHVzdGVycywgaXMsIGpzIH0gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhjbHVzdGVycyk7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBlbWJlZFg6IGVtYmVkZGluZ3MuZW1iZWRYLCBlbWJlZFk6IGVtYmVkZGluZ3MuZW1iZWRZLCBpcywganMgfTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgICAgY29uc3QgbWNsUmVzID0gYXdhaXQgbWFya292Q2x1c3RlcldlYkdQVShzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMpO1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB0aGlzLmNzclRvU3BhcnNlT2JqZWN0KG1jbFJlcywgblJvd3MpO1xuICAgICAgICBjb25zdCB7IGNsdXN0ZXJzLCBpcywganMgfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKGNsdXN0ZXJzKTtcbiAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IHRoaXMubGF5b3V0KGNsdXN0ZXJzLCBzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGVtYmVkWDogZW1iZWRkaW5ncy5lbWJlZFgsIGVtYmVkWTogZW1iZWRkaW5ncy5lbWJlZFksIGlzLCBqcyB9O1xuICAgIH1cbiAgICBjb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpIHtcbiAgICAgICAgY29uc3QgY2x1c3RlclNpemVNYXAgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICAgICAgICBpZiAoIWNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKVxuICAgICAgICAgICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdID0gMDtcbiAgICAgICAgICAgIGNsdXN0ZXJTaXplTWFwW2NsdXN0ZXJdKys7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc29ydGVkSW5kZXhlcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJTaXplTWFwKS5tYXAoTnVtYmVyKS5zb3J0KChhLCBiKSA9PiBjbHVzdGVyU2l6ZU1hcFthXSAtIGNsdXN0ZXJTaXplTWFwW2JdKTtcbiAgICAgICAgY29uc3QgY2x1c3Rlck1hcCA9IHt9O1xuICAgICAgICBzb3J0ZWRJbmRleGVzLmZvckVhY2goKGNsdXN0ZXJJZHgsIGkpID0+IGNsdXN0ZXJNYXBbY2x1c3RlcklkeF0gPSBpICsgMSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dO1xuICAgICAgICAvLyBsZXQgY3VyQ2x1c3RlciA9IDE7XG4gICAgICAgIC8vIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgLy8gICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dKSB7XG4gICAgICAgIC8vICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXSA9IGN1ckNsdXN0ZXI7XG4gICAgICAgIC8vICAgICBjbHVzdGVyc1tpXSA9IGN1ckNsdXN0ZXI7XG4gICAgICAgIC8vICAgICBjdXJDbHVzdGVyKys7XG4gICAgICAgIC8vICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyB9XG4gICAgfVxuICAgIGNzclRvU3BhcnNlT2JqZWN0KG1jbFJlcywgblJvd3MpIHtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IDEgLyBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV0gPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSBtY2xSZXMuaW5kZXhPZmZzZXRzW2ldOyBrIDwgbWNsUmVzLmluZGV4T2Zmc2V0c1tpICsgMV07IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGogPSBtY2xSZXMuS05OSW5kZXhlc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPCBtaW5PcmRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhc3luYyBsYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgZW1iZWRZID0gbmV3IEZsb2F0MzJBcnJheShuUm93cykuZmlsbCgwKTtcbiAgICAgICAgY29uc3QgY2x1c3Rlck1hcCA9IHt9O1xuICAgICAgICBjbHVzdGVycy5mb3JFYWNoKChjbHVzdGVyLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsdXN0ZXJNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXSA9IFtdO1xuICAgICAgICAgICAgY2x1c3Rlck1hcFtjbHVzdGVyXS5wdXNoKGkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY29uc3QgbkNsdXN0ZXJzID0gT2JqZWN0LmtleXMoY2x1c3Rlck1hcCkubGVuZ3RoO1xuICAgICAgICAvLyBjb25zdCBwZXJSb3cgPSBNYXRoLmZsb29yKE1hdGguc3FydChuQ2x1c3RlcnMpKTtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBzb3J0ZWRDbHVzdGVyTmFtZXMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKTtcbiAgICAgICAgc29ydGVkQ2x1c3Rlck5hbWVzLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJNYXBbYl0ubGVuZ3RoIC0gY2x1c3Rlck1hcFthXS5sZW5ndGgpO1xuICAgICAgICBsZXQgcGVyUm93ID0gNjtcbiAgICAgICAgbGV0IHlPZmZzZXQgPSAwO1xuICAgICAgICBjb25zdCBsYXlvdXRTaXplID0gNTtcbiAgICAgICAgZm9yIChjb25zdCBjbHVzdGVyTmFtZSBvZiBzb3J0ZWRDbHVzdGVyTmFtZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXIgPSBjbHVzdGVyTWFwW2NsdXN0ZXJOYW1lXTtcbiAgICAgICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlTWF0cml4LCAwLjAwMSk7XG4gICAgICAgICAgICBpZiAoY2x1c3Rlck51bSA9PT0gTWF0aC5jZWlsKHBlclJvdyAvIDEuNSkpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgICAgICAgICB5T2Zmc2V0ICs9IGxheW91dFNpemUgLyBwZXJSb3c7XG4gICAgICAgICAgICAgICAgcGVyUm93ID0gTWF0aC5jZWlsKHBlclJvdyAqIDEuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBvZmZzZXRYID0gKChjbHVzdGVyTnVtICUgcGVyUm93KSAqIGxheW91dFNpemUgLyBwZXJSb3cpICogMS41O1xuICAgICAgICAgICAgLy8gY29uc3Qgb2Zmc2V0WSA9IE1hdGguZmxvb3IoY2x1c3Rlck51bSAvIHBlclJvdykgKiAyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbWJlZGRpbmdzLmVtYmVkWC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGVtYmVkWFtjbHVzdGVyW2ldXSA9IGVtYmVkZGluZ3MuZW1iZWRYW2ldICogbGF5b3V0U2l6ZSAvIHBlclJvdyArIG9mZnNldFg7XG4gICAgICAgICAgICAgICAgZW1iZWRZW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFlbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgeU9mZnNldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBlbWJlZFgsIGVtYmVkWSB9O1xuICAgIH1cbiAgICBtZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKSB7XG4gICAgICAgIGNvbnN0IGlDbHVzdGVyID0gY2x1c3RlcnNbaV07XG4gICAgICAgIGNvbnN0IGpDbHVzdGVyID0gY2x1c3RlcnNbal07XG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgY2x1c3RlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1trXSA9PT0gakNsdXN0ZXIpXG4gICAgICAgICAgICAgICAgY2x1c3RlcnNba10gPSBpQ2x1c3RlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3NpZ25DbHVzdGVycyhzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIGxldCBjbHVzdGVyTnVtID0gMDtcbiAgICAgICAgY29uc3QgaXMgPSBbXTtcbiAgICAgICAgY29uc3QganMgPSBbXTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhzcGFyc2VNYXRyaXhbaV0pKSB7XG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQoc3BhcnNlTWF0cml4W2ldW2pdICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwICYmXG4gICAgICAgICAgICAgICAgICAgIHNwYXJzZU1hdHJpeFtpXVtqXSAhPT0gTnVtYmVyKGkpICYmIE51bWJlcihqKSA+IE51bWJlcihpKSkge1xuICAgICAgICAgICAgICAgICAgICBpcy5wdXNoKE51bWJlcihpKSk7XG4gICAgICAgICAgICAgICAgICAgIGpzLnB1c2goTnVtYmVyKGopKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xICYmIGNsdXN0ZXJzW051bWJlcihqKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gY2x1c3RlcnNbTnVtYmVyKGopXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIE51bWJlcihpKSwgTnVtYmVyKGopKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGopXSA9IGNsdXN0ZXJzW051bWJlcihpKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihpKV0gPSBjbHVzdGVyc1tOdW1iZXIoaildO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaildID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgaXM6IG5ldyBVaW50MzJBcnJheShpcyksIGpzOiBuZXcgVWludDMyQXJyYXkoanMpIH07XG4gICAgfVxuICAgIC8qKiBzYW1lIGFzIGFzc2lnbiBjbHVzdGVycyBidXQgd29ya2luZyBvbiB0aGUgbGV2ZWwgb2YgQ1NSIGZvcm1hdCByZXR1cm5lZCBmcm9tIHdlYkdQVSAqL1xuICAgIGFzc2lnbkNsdXN0ZXJzQ1NSKG1jbFJlcywgblJvd3MpIHtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBpcyA9IFtdO1xuICAgICAgICBjb25zdCBqcyA9IFtdO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gMSAvIE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IGNsdXN0ZXJzID0gbmV3IEFycmF5KG5Sb3dzKS5maWxsKC0xKTtcbiAgICAgICAgY29uc3QgY29ycmVjdGVkT2Zmc2V0cyA9IG5ldyBVaW50MzJBcnJheShuUm93cyArIDEpO1xuICAgICAgICBsZXQgb2Zmc2V0Q291bnRlciA9IDA7XG4gICAgICAgIGNvcnJlY3RlZE9mZnNldHNbMF0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGsgPSBtY2xSZXMuaW5kZXhPZmZzZXRzW2ldOyBrIDwgbWNsUmVzLmluZGV4T2Zmc2V0c1tpICsgMV07IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGogPSBtY2xSZXMuS05OSW5kZXhlc1trXTtcbiAgICAgICAgICAgICAgICBpZiAoaiA8PSBpIHx8IG1jbFJlcy5LTk5TaW1pbGFyaXRpZXNba10gPD0gbWluT3JkZXIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGlzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAganMucHVzaChqKTtcbiAgICAgICAgICAgICAgICBvZmZzZXRDb3VudGVyKys7XG4gICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSAmJiBjbHVzdGVyc1tqXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldICE9PSBjbHVzdGVyc1tqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgaSwgaik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW2ldICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJzW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tqXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tqXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29ycmVjdGVkT2Zmc2V0c1tpICsgMV0gPSBvZmZzZXRDb3VudGVyO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcyksIGNvcnJlY3RlZE9mZnNldHMgfTtcbiAgICB9XG4gICAgdG9PYmplY3RGb3JtKHNwYXJzZU1hdHJpeCkge1xuICAgICAgICBjb25zdCBzcGFyc2VPYmplY3QgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmlbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV1bc3BhcnNlTWF0cml4LmpbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5qW2ldXSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dW3NwYXJzZU1hdHJpeC5pW2ldXSA9IDEgLSBzcGFyc2VNYXRyaXguZGlzdGFuY2VbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwYXJzZU9iamVjdDtcbiAgICB9XG4gICAgYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2ldID0gdGhpcy5fb3B0aW9ucy5tdWx0RmFjdG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5vcm1hbGl6ZShzcGFyc2VPYmplY3QpIHtcbiAgICAgICAgZm9yIChjb25zdCBpIG9mIE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNwYXJzZU9iamVjdFtpXTtcbiAgICAgICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgICAgICAgICAgc3VtICs9IHJvd1tqXTtcbiAgICAgICAgICAgIGlmIChzdW0gPT09IDApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gLz0gc3VtO1xuICAgICAgICB9XG4gICAgfVxuICAgIGV4cGFuZChzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGNvbnN0IGV4cGFuZGVkT2JqZWN0ID0ge307XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSBNYXRoLnBvdygxMCwgb3JkZXIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGlmICghc3BhcnNlT2JqZWN0W2ldKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgLy8gY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgZXhwYW5kZWRPYmplY3RbaV0gPz8gKGV4cGFuZGVkT2JqZWN0W2ldID0ge30pO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGk7IGogPCBuUm93czsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0/LltqXSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5nZXRFeHBhbmRWYWx1ZShzcGFyc2VPYmplY3QsIGksIGopOyAvL3BydW5pbmcgc3RlcFxuICAgICAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKHZhbCAqIG1pbk9yZGVyKSAvIG1pbk9yZGVyID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXVtqXSA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBhbmRlZE9iamVjdFtqXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdID0ge307XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2pdW2ldID0gdmFsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhwYW5kZWRPYmplY3Q7XG4gICAgfVxuICAgIC8vIHByaXZhdGUgcHJ1bmUocm93OiBTcGFyc2VNYXRyaXhPYmplY3RbbnVtYmVyXSkge1xuICAgIC8vIH1cbiAgICBpbmZsYXRlKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHJvdykpXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldW2pdID0gTWF0aC5wb3coc3BhcnNlT2JqZWN0W2ldW2pdLCB0aGlzLl9vcHRpb25zLmluZmxhdGVGYWN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaikge1xuICAgICAgICBsZXQgdmFsID0gMDtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3RbaV0gPz8ge30pO1xuICAgICAgICBjb25zdCBvdGhlckluZGV4ZXMgPSBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3Rbal0gPz8ge30pO1xuICAgICAgICBmb3IgKGNvbnN0IGsgb2YgY3VycmVudEluZGV4ZXMpIHtcbiAgICAgICAgICAgIGlmIChvdGhlckluZGV4ZXMuaW5jbHVkZXMoaykpXG4gICAgICAgICAgICAgICAgdmFsICs9IHNwYXJzZU9iamVjdFtpXVtrXSAqIHNwYXJzZU9iamVjdFtqXVtrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWJXRnlZMjkyTFdOc2RYTjBaWEl1YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SnRZWEpqYjNZdFkyeDFjM1JsY2k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkRRU3hQUVVGUExFVkJRVU1zVTBGQlV5eEZRVUZETEUxQlFVMHNZMEZCWXl4RFFVRkRPMEZCUjNaRExFOUJRVThzUlVGQlF5eHRRa0ZCYlVJc1JVRkJReXhOUVVGTkxHOUVRVUZ2UkN4RFFVRkRPMEZCUTNaR0xFMUJRVTBzUTBGQlF5eE5RVUZOTEdsQ1FVRnBRaXhIUVVGbE8wbEJRek5ETEZsQlFWa3NSVUZCUlN4RFFVRkRPMGxCUTJZc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNZVUZCWVN4RlFVRkZMRU5CUVVNN1NVRkRhRUlzVlVGQlZTeEZRVUZGTEVOQlFVTTdRMEZEWkN4RFFVRkRPMEZCUlVZc1RVRkJUU3hQUVVGUExHZENRVUZuUWp0SlFVY3pRaXhaUVVGWkxFOUJRVFJDTEVWQlFVVTdVVUZEZUVNc1NVRkJTU3hEUVVGRExGRkJRVkVzUjBGQlJ5eEZRVUZETEVkQlFVY3NhVUpCUVdsQ0xFVkJRVVVzUjBGQlJ5eEpRVUZKTEVWQlFVTXNRMEZCUXp0SlFVTnNSQ3hEUVVGRE8wbEJSVTBzUzBGQlN5eERRVUZETEZOQlFWTXNRMEZCUXl4WlFVRm5ReXhGUVVGRkxFdEJRV0U3VVVGRGNFVXNkMEpCUVhkQ08xRkJRM2hDTEdkRFFVRm5RenRSUVVOb1F5eEpRVUZKTEZsQlFWa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETzFGQlEyNUVMRWxCUVVrc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVkQlFVY3NRMEZCUXl4RlFVRkZPMWxCUTI1RExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNXVUZCV1N4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xbEJRMjVETEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03V1VGRE4wSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1lVRkJZU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzJkQ1FVTndSQ3haUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEUxQlFVMHNRMEZCUXl4WlFVRlpMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03WjBKQlEyaEVMRWxCUVVrc1EwRkJReXhQUVVGUExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdaMEpCUXpOQ0xFbEJRVWtzUTBGQlF5eFRRVUZUTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1lVRkRPVUk3VTBGRFJqdFJRVU5FTEUxQlFVMHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzQkZMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTTdVVUZETDBJc1RVRkJUU3hWUVVGVkxFZEJRVWNzVFVGQlRTeEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVZFc1JVRkJSU3haUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VVc1QwRkJUeXhGUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hOUVVGTkxFVkJRVVVzVlVGQlZTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRExFTkJRVU03U1VGRGJFWXNRMEZCUXp0SlFVVk5MRXRCUVVzc1EwRkJReXhsUVVGbExFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUXpGRkxFbEJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRXRCUVVzc1EwRkJRenRaUVVOdVF5eFBRVUZQTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlJUZERMRTFCUVUwc1RVRkJUU3hIUVVGSExFMUJRVTBzYlVKQlFXMUNMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xRkJRek5HTEUxQlFVMHNXVUZCV1N4SFFVRkhMRWxCUVVrc1EwRkJReXhwUWtGQmFVSXNRMEZCUXl4TlFVRk5MRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRE0wUXNUVUZCVFN4RlFVRkRMRkZCUVZFc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMR05CUVdNc1EwRkJReXhaUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY0VVc1NVRkJTU3hEUVVGRExHVkJRV1VzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXp0UlFVTXZRaXhOUVVGTkxGVkJRVlVzUjBGQlJ5eE5RVUZOTEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJVU3hGUVVGRkxGbEJRVmtzUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVTndSU3hQUVVGUExFVkJRVU1zVVVGQlVTeEZRVUZGTEUxQlFVMHNSVUZCUlN4VlFVRlZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFMUJRVTBzUlVGQlJTeFZRVUZWTEVOQlFVTXNUVUZCVFN4RlFVRkZMRVZCUVVVc1JVRkJSU3hGUVVGRkxFVkJRVU1zUTBGQlF6dEpRVU5zUml4RFFVRkRPMGxCUlU4c1pVRkJaU3hEUVVGRExGRkJRV3RDTzFGQlEzaERMRTFCUVUwc1kwRkJZeXhIUVVFd1FpeEZRVUZGTEVOQlFVTTdVVUZEYWtRc1MwRkJTeXhOUVVGTkxFOUJRVThzU1VGQlNTeFJRVUZSTEVWQlFVVTdXVUZET1VJc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eFBRVUZQTEVOQlFVTTdaMEpCUXpGQ0xHTkJRV01zUTBGQlF5eFBRVUZQTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1dVRkRPVUlzWTBGQll5eERRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZMRU5CUVVNN1UwRkRNMEk3VVVGRFJDeE5RVUZOTEdGQlFXRXNSMEZCUnl4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhqUVVGakxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGNFZ3NUVUZCVFN4VlFVRlZMRWRCUVRCQ0xFVkJRVVVzUTBGQlF6dFJRVU0zUXl4aFFVRmhMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zVlVGQlZTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1ZVRkJWU3hEUVVGRExGVkJRVlVzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONlJTeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETEUxQlFVMHNSVUZCUlN4RFFVRkRMRVZCUVVVN1dVRkRkRU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjRReXh6UWtGQmMwSTdVVUZEZEVJc09FTkJRVGhETzFGQlF6bERMRzlEUVVGdlF6dFJRVU53UXl3MFEwRkJORU03VVVGRE5VTXNaME5CUVdkRE8xRkJRMmhETEc5Q1FVRnZRanRSUVVOd1FpeGhRVUZoTzFGQlEySXNOa05CUVRaRE8xRkJRemRETEUxQlFVMDdVVUZEVGl4SlFVRkpPMGxCUTA0c1EwRkJRenRKUVVWUExHbENRVUZwUWl4RFFVRkRMRTFCUVhWQ0xFVkJRVVVzUzBGQllUdFJRVU01UkN4TlFVRk5MRXRCUVVzc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU0zUkN4TlFVRk5MRkZCUVZFc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRVZCUVVVc1MwRkJTeXhEUVVGRExFTkJRVU03VVVGRGVrTXNUVUZCVFN4WlFVRlpMRWRCUVhWQ0xFVkJRVVVzUTBGQlF6dFJRVU0xUXl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NTMEZCU3l4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxDTEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRGNrSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdG5Ra0ZEZUVVc1RVRkJUU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGREwwSXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eGxRVUZsTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1VVRkJVVHR2UWtGRGFFUXNVMEZCVXp0blFrRkRXQ3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0aFFVTm9SRHRUUVVOR08xRkJRMFFzVDBGQlR5eFpRVUZaTEVOQlFVTTdTVUZEZEVJc1EwRkJRenRKUVVWUExFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNVVUZCYTBJc1JVRkJSU3haUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZEZEVZc1RVRkJUU3hOUVVGTkxFZEJRVWNzU1VGQlNTeFpRVUZaTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlF5OURMRTFCUVUwc1RVRkJUU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU12UXl4TlFVRk5MRlZCUVZVc1IwRkJORUlzUlVGQlJTeERRVUZETzFGQlF5OURMRkZCUVZFc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eFBRVUZQTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRPVUlzU1VGQlNTeERRVUZETEZWQlFWVXNRMEZCUXl4UFFVRlBMRU5CUVVNN1owSkJRM1JDTEZWQlFWVXNRMEZCUXl4UFFVRlBMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03V1VGRE0wSXNWVUZCVlN4RFFVRkRMRTlCUVU4c1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTVRaXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU5JTEc5RVFVRnZSRHRSUVVOd1JDeHRSRUZCYlVRN1VVRkRia1FzU1VGQlNTeFZRVUZWTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTI1Q0xFMUJRVTBzYTBKQlFXdENMRWRCUVVjc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVTnVSQ3hyUWtGQmEwSXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEZWQlFWVXNRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFJRVU0zUml4SlFVRkpMRTFCUVUwc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRlppeEpRVUZKTEU5QlFVOHNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRhRUlzVFVGQlRTeFZRVUZWTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTNKQ0xFdEJRVXNzVFVGQlRTeFhRVUZYTEVsQlFVa3NhMEpCUVd0Q0xFVkJRVVU3V1VGRE5VTXNUVUZCVFN4UFFVRlBMRWRCUVVjc1ZVRkJWU3hEUVVGRExGZEJRV3RDTEVOQlFVVXNRMEZCUXp0WlFVTm9SQ3hOUVVGTkxGVkJRVlVzUjBGQlJ5eE5RVUZOTEZOQlFWTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFsQlEycEZMRWxCUVVrc1ZVRkJWU3hMUVVGTExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRk8yZENRVU14UXl4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRE8yZENRVU5tTEU5QlFVOHNTVUZCU1N4VlFVRlZMRWRCUVVjc1RVRkJUU3hEUVVGRE8yZENRVU12UWl4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNN1lVRkRiRU03V1VGRFJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4RFFVRkRMRU5CUVVNc1ZVRkJWU3hIUVVGSExFMUJRVTBzUTBGQlF5eEhRVUZITEZWQlFWVXNSMEZCUnl4TlFVRk5MRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU03V1VGRGNFVXNkVVJCUVhWRU8xbEJSWFpFTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTXNUVUZCVFN4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdG5Ra0ZEYWtRc1RVRkJUU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4SFFVRkhMRTFCUVUwc1IwRkJSeXhQUVVGUExFTkJRVU03WjBKQlF6RkZMRTFCUVUwc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNSMEZCUnl4TlFVRk5MRWRCUVVjc1QwRkJUeXhEUVVGRE8yRkJRek5GTzFsQlEwUXNWVUZCVlN4RlFVRkZMRU5CUVVNN1UwRkRaRHRSUVVORUxFOUJRVThzUlVGQlF5eE5RVUZOTEVWQlFVVXNUVUZCVFN4RlFVRkRMRU5CUVVNN1NVRkRNVUlzUTBGQlF6dEpRVVZQTEdGQlFXRXNRMEZCUXl4UlFVRnJRaXhGUVVGRkxFTkJRVk1zUlVGQlJTeERRVUZUTzFGQlF6VkVMRTFCUVUwc1VVRkJVU3hIUVVGSExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTTNRaXhOUVVGTkxGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkROMElzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRlRU1zU1VGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1VVRkJVVHRuUWtGRE1VSXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF6dFRRVU14UWp0SlFVTklMRU5CUVVNN1NVRkRUU3hqUVVGakxFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUTI1RkxFbEJRVWtzVlVGQlZTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTnVRaXhOUVVGTkxFVkJRVVVzUjBGQllTeEZRVUZGTEVOQlFVTTdVVUZEZUVJc1RVRkJUU3hGUVVGRkxFZEJRV0VzUlVGQlJTeERRVUZETzFGQlEzaENMRTFCUVUwc1MwRkJTeXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEV0QlFVc3NRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFGQlF6ZEVMRTFCUVUwc1VVRkJVU3hIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8xRkJRM0pETEUxQlFVMHNVVUZCVVN4SFFVRmhMRWxCUVVrc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0pFTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNSVUZCUlR0WlFVTjZReXhMUVVGTExFMUJRVTBzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETEVWQlFVVTdaMEpCUTI1RUxFbEJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zUTBGQlVTeERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRWRCUVVjc1VVRkJVU3hIUVVGSExFTkJRVU03YjBKQlEzaEZMRmxCUVZrc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZSTEVOQlFVTXNTMEZCU3l4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJUdHZRa0ZEZWtVc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRGJrSXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0dlFrRkRia0lzU1VGQlNTeFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVsQlFVa3NVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPM2RDUVVNMVJDeEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE96UkNRVU0zUXl4SlFVRkpMRU5CUVVNc1lVRkJZU3hEUVVGRExGRkJRVkVzUlVGQlJTeE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdjVUpCUTNSRU8zbENRVUZOTEVsQlFVa3NVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPM2RDUVVOeVF5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8zRkNRVU16UXp0NVFrRkJUU3hKUVVGSkxGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJUdDNRa0ZEY2tNc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0eFFrRkRNME03ZVVKQlFVMDdkMEpCUTB3c1ZVRkJWU3hGUVVGRkxFTkJRVU03ZDBKQlEySXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNRMEZCUXp0M1FrRkRha01zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGVkJRVlVzUTBGQlF6dHhRa0ZEYkVNN2FVSkJRMFk3WVVGRFJqdFRRVU5HTzFGQlEwUXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRGRFTXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdaMEpCUTNSQ0xGVkJRVlVzUlVGQlJ5eERRVUZETzJkQ1FVTmtMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdZVUZETVVJN1UwRkRSanRSUVVORUxFOUJRVThzUlVGQlF5eFJRVUZSTEVWQlFVVXNSVUZCUlN4RlFVRkZMRWxCUVVrc1YwRkJWeXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVXNSVUZCUlN4SlFVRkpMRmRCUVZjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlF5eERRVUZETzBsQlEzUkZMRU5CUVVNN1NVRkZSQ3d3UmtGQk1FWTdTVUZEYkVZc2FVSkJRV2xDTEVOQlFVTXNUVUZCZFVJc1JVRkJSU3hMUVVGaE8xRkJRemxFTEVsQlFVa3NWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOdVFpeE5RVUZOTEVWQlFVVXNSMEZCWVN4RlFVRkZMRU5CUVVNN1VVRkRlRUlzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMUZCUTNoQ0xFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpkRUxFMUJRVTBzVVVGQlVTeEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0UlFVTjZReXhOUVVGTkxGRkJRVkVzUjBGQllTeEpRVUZKTEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTnlSQ3hOUVVGTkxHZENRVUZuUWl4SFFVRkhMRWxCUVVrc1YwRkJWeXhEUVVGRExFdEJRVXNzUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTndSQ3hKUVVGSkxHRkJRV0VzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZEZEVJc1owSkJRV2RDTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM2hDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eExRVUZMTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRPVUlzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TlFVRk5MRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSVHRuUWtGRGVFVXNUVUZCVFN4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRMMElzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NVVUZCVVR0dlFrRkRha1FzVTBGQlV6dG5Ra0ZEV0N4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTllMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTFnc1lVRkJZU3hGUVVGRkxFTkJRVU03WjBKQlEyaENMRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0dlFrRkROVU1zU1VGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF6dDNRa0ZETjBJc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eFJRVUZSTEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8ybENRVU4wUXp0eFFrRkJUU3hKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHR2UWtGRE4wSXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0cFFrRkRNMEk3Y1VKQlFVMHNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdiMEpCUXpkQ0xGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YVVKQlF6TkNPM0ZDUVVGTk8yOUNRVU5NTEZWQlFWVXNSVUZCUlN4RFFVRkRPMjlDUVVOaUxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNN2IwSkJRM3BDTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU03YVVKQlF6RkNPMkZCUTBZN1dVRkRSQ3huUWtGQlowSXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFZEJRVWNzWVVGQllTeERRVUZETzFOQlEzcERPMUZCUTBRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRkZCUVZFc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdXVUZEZEVNc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN1owSkJRM1JDTEZWQlFWVXNSVUZCUnl4RFFVRkRPMmRDUVVOa0xGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNN1lVRkRNVUk3VTBGRFJqdFJRVU5FTEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFbEJRVWtzVjBGQlZ5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4blFrRkJaMElzUlVGQlF5eERRVUZETzBsQlEzaEdMRU5CUVVNN1NVRkZUU3haUVVGWkxFTkJRVU1zV1VGQlowTTdVVUZEYkVRc1RVRkJUU3haUVVGWkxFZEJRWGxETEVWQlFVVXNRMEZCUXp0UlFVTTVSQ3hMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRPVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTnNReXhaUVVGWkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dFpRVU4yUXl4WlFVRlpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1dVRkJXU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTnNSaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEyeERMRmxCUVZrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8xbEJRM1pETEZsQlFWa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4WlFVRlpMRU5CUVVNc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFOQlEyNUdPMUZCUTBRc1QwRkJUeXhaUVVGWkxFTkJRVU03U1VGRGRFSXNRMEZCUXp0SlFVVlBMRkZCUVZFc1EwRkJReXhaUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZET1VRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdFpRVU01UWl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVJc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0WlFVTjJRaXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eFZRVUZWTEVOQlFVTTdVMEZETDBNN1NVRkRTQ3hEUVVGRE8wbEJSVThzVTBGQlV5eERRVUZETEZsQlFXZERPMUZCUTJoRUxFdEJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zUlVGQlJUdFpRVU42UXl4TlFVRk5MRWRCUVVjc1IwRkJSeXhaUVVGWkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTTdXVUZEYmtNc1NVRkJTU3hIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlExb3NTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXp0blFrRkRPVUlzUjBGQlJ5eEpRVUZKTEVkQlFVY3NRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJRenRaUVVOMlFpeEpRVUZKTEVkQlFVY3NTMEZCU3l4RFFVRkRPMmRDUVVGRkxGTkJRVk03V1VGRGVFSXNTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXp0blFrRkRPVUlzV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhKUVVGSkxFZEJRVWNzUTBGQlF6dFRRVU16UXp0SlFVTklMRU5CUVVNN1NVRkZUeXhOUVVGTkxFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUXpWRUxFMUJRVTBzWTBGQll5eEhRVUYxUWl4RlFVRkZMRU5CUVVNN1VVRkRPVU1zVFVGQlRTeExRVUZMTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkROMFFzVFVGQlRTeFJRVUZSTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEY2tNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdFpRVU01UWl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZEYkVJc1UwRkJVenRaUVVOWUxDdENRVUVyUWp0WlFVTXZRaXhqUVVGakxFTkJRVU1zUTBGQlF5eE5RVUZvUWl4alFVRmpMRU5CUVVNc1EwRkJReXhKUVVGTkxFVkJRVVVzUlVGQlF6dFpRVU42UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NTMEZCU3l4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8yZENRVU01UWl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMjlDUVVOMlFpeFRRVUZUTzJkQ1FVTllMRTFCUVUwc1IwRkJSeXhIUVVGSExFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTXNXVUZCV1N4RlFVRkZMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEdOQlFXTTdaMEpCUTI1RkxFbEJRVWtzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SFFVRkhMRWRCUVVjc1VVRkJVU3hEUVVGRExFZEJRVWNzVVVGQlVTeEhRVUZITEVOQlFVTXNSVUZCUlR0dlFrRkROME1zWTBGQll5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFZEJRVWNzUTBGQlF6dHZRa0ZETTBJc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTTdkMEpCUTNCQ0xHTkJRV01zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN2IwSkJRM3BDTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdhVUpCUXpWQ08yRkJRMFk3VTBGRFJqdFJRVU5FTEU5QlFVOHNZMEZCWXl4RFFVRkRPMGxCUTNoQ0xFTkJRVU03U1VGRlJDeHRSRUZCYlVRN1NVRkZia1FzU1VGQlNUdEpRVVZKTEU5QlFVOHNRMEZCUXl4WlFVRm5RenRSUVVNNVF5eExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVTdXVUZEZWtNc1RVRkJUU3hIUVVGSExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRPMWxCUTI1RExFdEJRVXNzVFVGQlRTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU03WjBKQlF6bENMRmxCUVZrc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZSTEVOQlFVTXNSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1JVRkJSU3hKUVVGSkxFTkJRVU1zVVVGQlVTeERRVUZETEdGQlFXRXNRMEZCUXl4RFFVRkRPMU5CUXpsSE8wbEJRMGdzUTBGQlF6dEpRVVZQTEdOQlFXTXNRMEZCUXl4WlFVRm5ReXhGUVVGRkxFTkJRVTBzUlVGQlJTeERRVUZOTzFGQlEzSkZMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU5hTEUxQlFVMHNZMEZCWXl4SFFVRkhMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJReXhEUVVGRE8xRkJRekZFTEUxQlFVMHNXVUZCV1N4SFFVRkhMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRVZCUVVVc1EwRkJReXhEUVVGRE8xRkJRM2hFTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1kwRkJZeXhGUVVGRk8xbEJRemxDTEVsQlFVa3NXVUZCV1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlF6RkNMRWRCUVVjc1NVRkJTU3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCVVN4RFFVRkRMRWRCUVVjc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRPMU5CUTJoRk8xRkJRMFFzVDBGQlR5eEhRVUZITEVOQlFVTTdTVUZEWWl4RFFVRkRPME5CUTBZaUxDSnpiM1Z5WTJWelEyOXVkR1Z1ZENJNld5SnBiWEJ2Y25RZ2UxTndZWEp6WlUxaGRISnBlRkpsYzNWc2RIMGdabkp2YlNBbkxpNHZaR2x6ZEdGdVkyVXRiV0YwY21sNEwzTndZWEp6WlMxdFlYUnlhWGd0YzJWeWRtbGpaU2M3WEc1cGJYQnZjblFnZTJKcGIweGhlVzkxZEgwZ1puSnZiU0FuTGk5aWFXOHRiR0Y1YjNWMEp6dGNibWx0Y0c5eWRDQjdUVU5NVDNCMGFXOXVjeXdnVTNCaGNuTmxUV0YwY21sNFQySnFaV04wZlNCbWNtOXRJQ2N1TDNSNWNHVnpKenRjYm1sdGNHOXlkQ0I3VFVOTVQzQlNaWFIxY201VWVYQmxmU0JtY205dElDZEFaR0YwWVdkeWIyc3RiR2xpY21GeWFXVnpMMjFoZEdndmMzSmpMM2RsWWtkUVZTOU5RMHd2ZEhsd1pYTW5PMXh1YVcxd2IzSjBJSHR0WVhKcmIzWkRiSFZ6ZEdWeVYyVmlSMUJWZlNCbWNtOXRJQ2RBWkdGMFlXZHliMnN0YkdsaWNtRnlhV1Z6TDIxaGRHZ3ZjM0pqTDNkbFlrZFFWUzlOUTB3dlRVTk1MWGRsWWtkUVZTYzdYRzVsZUhCdmNuUWdZMjl1YzNRZ1pHVm1ZWFZzZEUxRFRFOXdkR2x2Ym5NNklFMURURTl3ZEdsdmJuTWdQU0I3WEc0Z0lHVjRjR0Z1WkVaaFkzUnZjam9nTWl4Y2JpQWdiV0Y0U1hSbGNtRjBhVzl1Y3pvZ05TeGNiaUFnYVc1bWJHRjBaVVpoWTNSdmNqb2dNaXhjYmlBZ2JYVnNkRVpoWTNSdmNqb2dNU3hjYm4wN1hHNWNibVY0Y0c5eWRDQmpiR0Z6Y3lCTlEweFRjR0Z5YzJWU1pXUjFZMlZ5SUh0Y2JpQWdjSEpwZG1GMFpTQmZiM0IwYVc5dWN6b2dUVU5NVDNCMGFXOXVjenRjYmx4dUlDQmpiMjV6ZEhKMVkzUnZjaWh2Y0hSek9pQlFZWEowYVdGc1BFMURURTl3ZEdsdmJuTStJRDBnZTMwcElIdGNiaUFnSUNCMGFHbHpMbDl2Y0hScGIyNXpJRDBnZXk0dUxtUmxabUYxYkhSTlEweFBjSFJwYjI1ekxDQXVMaTV2Y0hSemZUdGNiaUFnZlZ4dVhHNGdJSEIxWW14cFl5QmhjM2x1WXlCMGNtRnVjMlp2Y20wb2MzQmhjbk5sVFdGMGNtbDRPaUJUY0dGeWMyVk5ZWFJ5YVhoU1pYTjFiSFFzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQXZMeUIwWlhOMFYyOXlhMlZ5VFhWc2RHbHdiSGtvS1R0Y2JpQWdJQ0F2THlCeVpYUjFjbTRnYm1WM0lFbHVkRE15UVhKeVlYa29ibEp2ZDNNcE8xeHVJQ0FnSUd4bGRDQnpjR0Z5YzJWUFltcGxZM1FnUFNCMGFHbHpMblJ2VDJKcVpXTjBSbTl5YlNoemNHRnljMlZOWVhSeWFYZ3BPMXh1SUNBZ0lHbG1JQ2gwYUdsekxsOXZjSFJwYjI1ekxtMWhlRWwwWlhKaGRHbHZibk1nUGlBd0tTQjdYRzRnSUNBZ0lDQjBhR2x6TG1Ga1pFeHZiM0J6S0hOd1lYSnpaVTlpYW1WamRDd2dibEp2ZDNNcE8xeHVJQ0FnSUNBZ2RHaHBjeTV1YjNKdFlXeHBlbVVvYzNCaGNuTmxUMkpxWldOMEtUdGNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dkR2hwY3k1ZmIzQjBhVzl1Y3k1dFlYaEpkR1Z5WVhScGIyNXpPeUJwS3lzcElIdGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wSUQwZ2RHaHBjeTVsZUhCaGJtUW9jM0JoY25ObFQySnFaV04wTENCdVVtOTNjeWs3WEc0Z0lDQWdJQ0FnSUhSb2FYTXVhVzVtYkdGMFpTaHpjR0Z5YzJWUFltcGxZM1FwTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbTV2Y20xaGJHbDZaU2h6Y0dGeWMyVlBZbXBsWTNRcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0JqYjI1emRDQjdZMngxYzNSbGNuTXNJR2x6TENCcWMzMGdQU0IwYUdsekxtRnpjMmxuYmtOc2RYTjBaWEp6S0hOd1lYSnpaVTlpYW1WamRDd2dibEp2ZDNNcE8xeHVJQ0FnSUhSb2FYTXVZMjl5Y21WamRFTnNkWE4wWlhKektHTnNkWE4wWlhKektUdGNiaUFnSUNCamIyNXpkQ0JsYldKbFpHUnBibWR6SUQwZ1lYZGhhWFFnZEdocGN5NXNZWGx2ZFhRb1kyeDFjM1JsY25Nc0lITndZWEp6WlU5aWFtVmpkQ3dnYmxKdmQzTXBPMXh1SUNBZ0lISmxkSFZ5YmlCN1kyeDFjM1JsY25Nc0lHVnRZbVZrV0RvZ1pXMWlaV1JrYVc1bmN5NWxiV0psWkZnc0lHVnRZbVZrV1RvZ1pXMWlaV1JrYVc1bmN5NWxiV0psWkZrc0lHbHpMQ0JxYzMwN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ1lYTjVibU1nZEhKaGJuTm1iM0p0VjJWaVIxQlZLSE53WVhKelpVMWhkSEpwZURvZ1UzQmhjbk5sVFdGMGNtbDRVbVZ6ZFd4MExDQnVVbTkzY3pvZ2JuVnRZbVZ5S1NCN1hHNGdJQ0FnYVdZZ0tIUm9hWE11WDI5d2RHbHZibk11YldGNFNYUmxjbUYwYVc5dWN5QTlQVDBnTUNsY2JpQWdJQ0FnSUhKbGRIVnliaUIwYUdsekxuUnlZVzV6Wm05eWJTaHpjR0Z5YzJWTllYUnlhWGdzSUc1U2IzZHpLVHRjYmx4dUlDQWdJR052Ym5OMElHMWpiRkpsY3lBOUlHRjNZV2wwSUcxaGNtdHZka05zZFhOMFpYSlhaV0pIVUZVb2MzQmhjbk5sVFdGMGNtbDRMQ0J1VW05M2N5d2dkR2hwY3k1ZmIzQjBhVzl1Y3k1dFlYaEpkR1Z5WVhScGIyNXpLVHRjYmlBZ0lDQmpiMjV6ZENCemNHRnljMlZQWW1wbFkzUWdQU0IwYUdsekxtTnpjbFJ2VTNCaGNuTmxUMkpxWldOMEtHMWpiRkpsY3l3Z2JsSnZkM01wTzF4dUlDQWdJR052Ym5OMElIdGpiSFZ6ZEdWeWN5d2dhWE1zSUdwemZTQTlJSFJvYVhNdVlYTnphV2R1UTJ4MWMzUmxjbk1vYzNCaGNuTmxUMkpxWldOMExDQnVVbTkzY3lrN1hHNGdJQ0FnZEdocGN5NWpiM0p5WldOMFEyeDFjM1JsY25Nb1kyeDFjM1JsY25NcE8xeHVJQ0FnSUdOdmJuTjBJR1Z0WW1Wa1pHbHVaM01nUFNCaGQyRnBkQ0IwYUdsekxteGhlVzkxZENoamJIVnpkR1Z5Y3l3Z2MzQmhjbk5sVDJKcVpXTjBMQ0J1VW05M2N5azdYRzRnSUNBZ2NtVjBkWEp1SUh0amJIVnpkR1Z5Y3l3Z1pXMWlaV1JZT2lCbGJXSmxaR1JwYm1kekxtVnRZbVZrV0N3Z1pXMWlaV1JaT2lCbGJXSmxaR1JwYm1kekxtVnRZbVZrV1N3Z2FYTXNJR3B6ZlR0Y2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ1kyOXljbVZqZEVOc2RYTjBaWEp6S0dOc2RYTjBaWEp6T2lCdWRXMWlaWEpiWFNrZ2UxeHVJQ0FnSUdOdmJuTjBJR05zZFhOMFpYSlRhWHBsVFdGd09pQjdXMTg2SUc1MWJXSmxjbDA2SUc1MWJXSmxjbjBnUFNCN2ZUdGNiaUFnSUNCbWIzSWdLR052Ym5OMElHTnNkWE4wWlhJZ2IyWWdZMngxYzNSbGNuTXBJSHRjYmlBZ0lDQWdJR2xtSUNnaFkyeDFjM1JsY2xOcGVtVk5ZWEJiWTJ4MWMzUmxjbDBwWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpUYVhwbFRXRndXMk5zZFhOMFpYSmRJRDBnTUR0Y2JpQWdJQ0FnSUdOc2RYTjBaWEpUYVhwbFRXRndXMk5zZFhOMFpYSmRLeXM3WEc0Z0lDQWdmVnh1SUNBZ0lHTnZibk4wSUhOdmNuUmxaRWx1WkdWNFpYTWdQU0JQWW1wbFkzUXVhMlY1Y3loamJIVnpkR1Z5VTJsNlpVMWhjQ2t1YldGd0tFNTFiV0psY2lrdWMyOXlkQ2dvWVN3Z1lpa2dQVDRnWTJ4MWMzUmxjbE5wZW1WTllYQmJZVjBnTFNCamJIVnpkR1Z5VTJsNlpVMWhjRnRpWFNrN1hHNGdJQ0FnWTI5dWMzUWdZMngxYzNSbGNrMWhjRG9nZTF0Zk9pQnVkVzFpWlhKZE9pQnVkVzFpWlhKOUlEMGdlMzA3WEc0Z0lDQWdjMjl5ZEdWa1NXNWtaWGhsY3k1bWIzSkZZV05vS0NoamJIVnpkR1Z5U1dSNExDQnBLU0E5UGlCamJIVnpkR1Z5VFdGd1cyTnNkWE4wWlhKSlpIaGRJRDBnYVNBcklERXBPMXh1SUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dZMngxYzNSbGNuTXViR1Z1WjNSb095QnBLeXNwWEc0Z0lDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNuTmJhVjFkTzF4dUlDQWdJQzh2SUd4bGRDQmpkWEpEYkhWemRHVnlJRDBnTVR0Y2JpQWdJQ0F2THlCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHTnNkWE4wWlhKekxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdMeThnSUNCcFppQW9JV05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbk5iYVYxZEtTQjdYRzRnSUNBZ0x5OGdJQ0FnSUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY25OYmFWMWRJRDBnWTNWeVEyeDFjM1JsY2p0Y2JpQWdJQ0F2THlBZ0lDQWdZMngxYzNSbGNuTmJhVjBnUFNCamRYSkRiSFZ6ZEdWeU8xeHVJQ0FnSUM4dklDQWdJQ0JqZFhKRGJIVnpkR1Z5S3lzN1hHNGdJQ0FnTHk4Z0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUM4dklDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNuTmJhVjFkTzF4dUlDQWdJQzh2SUNBZ2ZWeHVJQ0FnSUM4dklIMWNiaUFnZlZ4dVhHNGdJSEJ5YVhaaGRHVWdZM055Vkc5VGNHRnljMlZQWW1wbFkzUW9iV05zVW1Wek9pQk5RMHhQY0ZKbGRIVnlibFI1Y0dVc0lHNVNiM2R6T2lCdWRXMWlaWElwSUh0Y2JpQWdJQ0JqYjI1emRDQnZjbVJsY2lBOUlFMWhkR2d1Wm14dmIzSW9UV0YwYUM1dFlYZ29UV0YwYUM1c2IyY3hNQ2h1VW05M2N5a3NJRElwS1NBcklERTdYRzRnSUNBZ1kyOXVjM1FnYldsdVQzSmtaWElnUFNBeElDOGdUV0YwYUM1d2IzY29NVEFzSUc5eVpHVnlLVHRjYmlBZ0lDQmpiMjV6ZENCemNHRnljMlZQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ0E5SUh0OU8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JsSnZkM003SUdrckt5a2dlMXh1SUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzJsZElEMGdlMzA3WEc0Z0lDQWdJQ0JtYjNJZ0tHeGxkQ0JySUQwZ2JXTnNVbVZ6TG1sdVpHVjRUMlptYzJWMGMxdHBYVHNnYXlBOElHMWpiRkpsY3k1cGJtUmxlRTltWm5ObGRITmJhU0FySURGZE95QnJLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYWlBOUlHMWpiRkpsY3k1TFRrNUpibVJsZUdWelcydGRPMXh1SUNBZ0lDQWdJQ0JwWmlBb2FpQThQU0JwSUh4OElHMWpiRkpsY3k1TFRrNVRhVzFwYkdGeWFYUnBaWE5iYTEwZ1BDQnRhVzVQY21SbGNpbGNiaUFnSUNBZ0lDQWdJQ0JqYjI1MGFXNTFaVHRjYmlBZ0lDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFcybGRXMnBkSUQwZ2JXTnNVbVZ6TGt0T1RsTnBiV2xzWVhKcGRHbGxjMXRyWFR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlITndZWEp6WlU5aWFtVmpkRHRjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnWVhONWJtTWdiR0Y1YjNWMEtHTnNkWE4wWlhKek9pQnVkVzFpWlhKYlhTd2djM0JoY25ObFRXRjBjbWw0T2lCVGNHRnljMlZOWVhSeWFYaFBZbXBsWTNRc0lHNVNiM2R6T2lCdWRXMWlaWElwSUh0Y2JpQWdJQ0JqYjI1emRDQmxiV0psWkZnZ1BTQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtHNVNiM2R6S1M1bWFXeHNLREFwTzF4dUlDQWdJR052Ym5OMElHVnRZbVZrV1NBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb2JsSnZkM01wTG1acGJHd29NQ2s3WEc0Z0lDQWdZMjl1YzNRZ1kyeDFjM1JsY2sxaGNEb2dlMXRmT2lCdWRXMWlaWEpkT2lCdWRXMWlaWEpiWFgwZ1BTQjdmVHRjYmlBZ0lDQmpiSFZ6ZEdWeWN5NW1iM0pGWVdOb0tDaGpiSFZ6ZEdWeUxDQnBLU0E5UGlCN1hHNGdJQ0FnSUNCcFppQW9JV05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbDBwWEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY2wwZ1BTQmJYVHRjYmlBZ0lDQWdJR05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbDB1Y0hWemFDaHBLVHRjYmlBZ0lDQjlLVHRjYmlBZ0lDQXZMeUJqYjI1emRDQnVRMngxYzNSbGNuTWdQU0JQWW1wbFkzUXVhMlY1Y3loamJIVnpkR1Z5VFdGd0tTNXNaVzVuZEdnN1hHNGdJQ0FnTHk4Z1kyOXVjM1FnY0dWeVVtOTNJRDBnVFdGMGFDNW1iRzl2Y2loTllYUm9Mbk54Y25Rb2JrTnNkWE4wWlhKektTazdYRzRnSUNBZ2JHVjBJR05zZFhOMFpYSk9kVzBnUFNBd08xeHVJQ0FnSUdOdmJuTjBJSE52Y25SbFpFTnNkWE4wWlhKT1lXMWxjeUE5SUU5aWFtVmpkQzVyWlhsektHTnNkWE4wWlhKTllYQXBPMXh1SUNBZ0lITnZjblJsWkVOc2RYTjBaWEpPWVcxbGN5NXpiM0owS0NoaExDQmlLU0E5UGlCamJIVnpkR1Z5VFdGd1cySWdZWE1nWVc1NVhTNXNaVzVuZEdnZ0xTQmpiSFZ6ZEdWeVRXRndXMkVnWVhNZ1lXNTVYUzVzWlc1bmRHZ3BPMXh1SUNBZ0lHeGxkQ0J3WlhKU2IzY2dQU0EyTzF4dVhHNGdJQ0FnYkdWMElIbFBabVp6WlhRZ1BTQXdPMXh1SUNBZ0lHTnZibk4wSUd4aGVXOTFkRk5wZW1VZ1BTQTFPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdZMngxYzNSbGNrNWhiV1VnYjJZZ2MyOXlkR1ZrUTJ4MWMzUmxjazVoYldWektTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCamJIVnpkR1Z5SUQwZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeVRtRnRaU0JoY3lCaGJubGRJVHRjYmlBZ0lDQWdJR052Ym5OMElHVnRZbVZrWkdsdVozTWdQU0JoZDJGcGRDQmlhVzlNWVhsdmRYUW9ZMngxYzNSbGNpd2djM0JoY25ObFRXRjBjbWw0TENBd0xqQXdNU2s3WEc0Z0lDQWdJQ0JwWmlBb1kyeDFjM1JsY2s1MWJTQTlQVDBnVFdGMGFDNWpaV2xzS0hCbGNsSnZkeUF2SURFdU5Ta3BJSHRjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjazUxYlNBOUlEQTdYRzRnSUNBZ0lDQWdJSGxQWm1aelpYUWdLejBnYkdGNWIzVjBVMmw2WlNBdklIQmxjbEp2ZHp0Y2JpQWdJQ0FnSUNBZ2NHVnlVbTkzSUQwZ1RXRjBhQzVqWldsc0tIQmxjbEp2ZHlBcUlERXVOU2s3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JqYjI1emRDQnZabVp6WlhSWUlEMGdLQ2hqYkhWemRHVnlUblZ0SUNVZ2NHVnlVbTkzS1NBcUlHeGhlVzkxZEZOcGVtVWdMeUJ3WlhKU2IzY3BJQ29nTVM0MU8xeHVJQ0FnSUNBZ0x5OGdZMjl1YzNRZ2IyWm1jMlYwV1NBOUlFMWhkR2d1Wm14dmIzSW9ZMngxYzNSbGNrNTFiU0F2SUhCbGNsSnZkeWtnS2lBeU8xeHVYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUllMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV0Z0amJIVnpkR1Z5VzJsZFhTQTlJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUllXMmxkSUNvZ2JHRjViM1YwVTJsNlpTQXZJSEJsY2xKdmR5QXJJRzltWm5ObGRGZzdYRzRnSUNBZ0lDQWdJR1Z0WW1Wa1dWdGpiSFZ6ZEdWeVcybGRYU0E5SUdWdFltVmtaR2x1WjNNdVpXMWlaV1JaVzJsZElDb2diR0Y1YjNWMFUybDZaU0F2SUhCbGNsSnZkeUFySUhsUFptWnpaWFE3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0JqYkhWemRHVnlUblZ0S3lzN1hHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjdaVzFpWldSWUxDQmxiV0psWkZsOU8xeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQnRaWEpuWlVOc2RYTjBaWEp6S0dOc2RYTjBaWEp6T2lCdWRXMWlaWEpiWFN3Z2FUb2diblZ0WW1WeUxDQnFPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCcFEyeDFjM1JsY2lBOUlHTnNkWE4wWlhKelcybGRPMXh1SUNBZ0lHTnZibk4wSUdwRGJIVnpkR1Z5SUQwZ1kyeDFjM1JsY25OYmFsMDdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2F5QTlJREE3SUdzZ1BDQmpiSFZ6ZEdWeWN5NXNaVzVuZEdnN0lHc3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcydGRJRDA5UFNCcVEyeDFjM1JsY2lsY2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYmExMGdQU0JwUTJ4MWMzUmxjanRjYmlBZ0lDQjlYRzRnSUgxY2JpQWdjSFZpYkdsaklHRnpjMmxuYmtOc2RYTjBaWEp6S0hOd1lYSnpaVTFoZEhKcGVEb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBMQ0J1VW05M2N6b2diblZ0WW1WeUtTQjdYRzRnSUNBZ2JHVjBJR05zZFhOMFpYSk9kVzBnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR2x6T2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNBZ0lHTnZibk4wSUdwek9pQnVkVzFpWlhKYlhTQTlJRnRkTzF4dUlDQWdJR052Ym5OMElHOXlaR1Z5SUQwZ1RXRjBhQzVtYkc5dmNpaE5ZWFJvTG0xaGVDaE5ZWFJvTG14dlp6RXdLRzVTYjNkektTd2dNaWtwSUNzZ01UdGNiaUFnSUNCamIyNXpkQ0J0YVc1UGNtUmxjaUE5SUUxaGRHZ3VjRzkzS0RFd0xDQnZjbVJsY2lrN1hHNGdJQ0FnWTI5dWMzUWdZMngxYzNSbGNuTTZJRzUxYldKbGNsdGRJRDBnYm1WM0lFRnljbUY1S0c1U2IzZHpLUzVtYVd4c0tDMHhLVHRjYmlBZ0lDQm1iM0lnS0dOdmJuTjBJR2tnYjJZZ1QySnFaV04wTG10bGVYTW9jM0JoY25ObFRXRjBjbWw0S1NrZ2UxeHVJQ0FnSUNBZ1ptOXlJQ2hqYjI1emRDQnFJRzltSUU5aWFtVmpkQzVyWlhsektITndZWEp6WlUxaGRISnBlRnRwSUdGeklHRnVlVjBwS1NCN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hOWVhSb0xuSnZkVzVrS0hOd1lYSnpaVTFoZEhKcGVGdHBJR0Z6SUdGdWVWMWJhaUJoY3lCaGJubGRJQ29nYldsdVQzSmtaWElwSUM4Z2JXbHVUM0prWlhJZ1BpQXdJQ1ltWEc0Z0lDQWdJQ0FnSUNBZ2MzQmhjbk5sVFdGMGNtbDRXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBnSVQwOUlFNTFiV0psY2locEtTQW1KaUJPZFcxaVpYSW9haWtnUGlCT2RXMWlaWElvYVNrcElIdGNiaUFnSUNBZ0lDQWdJQ0JwY3k1d2RYTm9LRTUxYldKbGNpaHBLU2s3WEc0Z0lDQWdJQ0FnSUNBZ2FuTXVjSFZ6YUNoT2RXMWlaWElvYWlrcE8xeHVJQ0FnSUNBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5YzF0T2RXMWlaWElvYVNsZElDRTlQU0F0TVNBbUppQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FpbGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR05zZFhOMFpYSnpXMDUxYldKbGNpaHBLVjBnSVQwOUlHTnNkWE4wWlhKelcwNTFiV0psY2locUtWMHBYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIUm9hWE11YldWeVoyVkRiSFZ6ZEdWeWN5aGpiSFZ6ZEdWeWN5d2dUblZ0WW1WeUtHa3BMQ0JPZFcxaVpYSW9haWtwTzF4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9ZMngxYzNSbGNuTmJUblZ0WW1WeUtHa3BYU0FoUFQwZ0xURXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcwNTFiV0psY2locUtWMGdQU0JqYkhWemRHVnljMXRPZFcxaVpYSW9hU2xkTzF4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCcFppQW9ZMngxYzNSbGNuTmJUblZ0WW1WeUtHb3BYU0FoUFQwZ0xURXBJSHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcwNTFiV0psY2locEtWMGdQU0JqYkhWemRHVnljMXRPZFcxaVpYSW9haWxkTzF4dUlDQWdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0S3lzN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqYkhWemRHVnljMXRPZFcxaVpYSW9hU2xkSUQwZ1kyeDFjM1JsY2s1MWJUdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwZ1BTQmpiSFZ6ZEdWeVRuVnRPMXh1SUNBZ0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwUFRBN0lHa2dQQ0JqYkhWemRHVnljeTVzWlc1bmRHZzdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLR05zZFhOMFpYSnpXMmxkSUQwOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5VG5WdElDc3JPMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnljMXRwWFNBOUlHTnNkWE4wWlhKT2RXMDdYRzRnSUNBZ0lDQjlYRzRnSUNBZ2ZWeHVJQ0FnSUhKbGRIVnliaUI3WTJ4MWMzUmxjbk1zSUdsek9pQnVaWGNnVldsdWRETXlRWEp5WVhrb2FYTXBMQ0JxY3pvZ2JtVjNJRlZwYm5Rek1rRnljbUY1S0dwektYMDdYRzRnSUgxY2JseHVJQ0F2S2lvZ2MyRnRaU0JoY3lCaGMzTnBaMjRnWTJ4MWMzUmxjbk1nWW5WMElIZHZjbXRwYm1jZ2IyNGdkR2hsSUd4bGRtVnNJRzltSUVOVFVpQm1iM0p0WVhRZ2NtVjBkWEp1WldRZ1puSnZiU0IzWldKSFVGVWdLaTljYmlBZ2NISnBkbUYwWlNCaGMzTnBaMjVEYkhWemRHVnljME5UVWlodFkyeFNaWE02SUUxRFRFOXdVbVYwZFhKdVZIbHdaU3dnYmxKdmQzTTZJRzUxYldKbGNpa2dlMXh1SUNBZ0lHeGxkQ0JqYkhWemRHVnlUblZ0SUQwZ01EdGNiaUFnSUNCamIyNXpkQ0JwY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ0lDQmpiMjV6ZENCcWN6b2diblZ0WW1WeVcxMGdQU0JiWFR0Y2JpQWdJQ0JqYjI1emRDQnZjbVJsY2lBOUlFMWhkR2d1Wm14dmIzSW9UV0YwYUM1dFlYZ29UV0YwYUM1c2IyY3hNQ2h1VW05M2N5a3NJRElwS1NBcklERTdYRzRnSUNBZ1kyOXVjM1FnYldsdVQzSmtaWElnUFNBeElDOGdUV0YwYUM1d2IzY29NVEFzSUc5eVpHVnlLVHRjYmlBZ0lDQmpiMjV6ZENCamJIVnpkR1Z5Y3pvZ2JuVnRZbVZ5VzEwZ1BTQnVaWGNnUVhKeVlYa29ibEp2ZDNNcExtWnBiR3dvTFRFcE8xeHVJQ0FnSUdOdmJuTjBJR052Y25KbFkzUmxaRTltWm5ObGRITWdQU0J1WlhjZ1ZXbHVkRE15UVhKeVlYa29ibEp2ZDNNZ0t5QXhLVHRjYmlBZ0lDQnNaWFFnYjJabWMyVjBRMjkxYm5SbGNpQTlJREE3WEc0Z0lDQWdZMjl5Y21WamRHVmtUMlptYzJWMGMxc3dYU0E5SURBN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCdVVtOTNjenNnYVNzcktTQjdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnJJRDBnYldOc1VtVnpMbWx1WkdWNFQyWm1jMlYwYzF0cFhUc2dheUE4SUcxamJGSmxjeTVwYm1SbGVFOW1abk5sZEhOYmFTQXJJREZkT3lCckt5c3BJSHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdhaUE5SUcxamJGSmxjeTVMVGs1SmJtUmxlR1Z6VzJ0ZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYWlBOFBTQnBJSHg4SUcxamJGSmxjeTVMVGs1VGFXMXBiR0Z5YVhScFpYTmJhMTBnUEQwZ2JXbHVUM0prWlhJcFhHNGdJQ0FnSUNBZ0lDQWdZMjl1ZEdsdWRXVTdYRzRnSUNBZ0lDQWdJR2x6TG5CMWMyZ29hU2s3WEc0Z0lDQWdJQ0FnSUdwekxuQjFjMmdvYWlrN1hHNGdJQ0FnSUNBZ0lHOW1abk5sZEVOdmRXNTBaWElyS3p0Y2JpQWdJQ0FnSUNBZ2FXWWdLR05zZFhOMFpYSnpXMmxkSUNFOVBTQXRNU0FtSmlCamJIVnpkR1Z5YzF0cVhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb1kyeDFjM1JsY25OYmFWMGdJVDA5SUdOc2RYTjBaWEp6VzJwZEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnZEdocGN5NXRaWEpuWlVOc2RYTjBaWEp6S0dOc2RYTjBaWEp6TENCcExDQnFLVHRjYmlBZ0lDQWdJQ0FnZlNCbGJITmxJR2xtSUNoamJIVnpkR1Z5YzF0cFhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0JqYkhWemRHVnljMXRxWFNBOUlHTnNkWE4wWlhKelcybGRPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOc2RYTjBaWEp6VzJwZElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY25OYmFsMDdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjazUxYlNzck8xeHVJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY2s1MWJUdGNiaUFnSUNBZ0lDQWdJQ0JqYkhWemRHVnljMXRxWFNBOUlHTnNkWE4wWlhKT2RXMDdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR052Y25KbFkzUmxaRTltWm5ObGRITmJhU0FySURGZElEMGdiMlptYzJWMFEyOTFiblJsY2p0Y2JpQWdJQ0I5WEc0Z0lDQWdabTl5SUNoc1pYUWdhVDB3T3lCcElEd2dZMngxYzNSbGNuTXViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUdsbUlDaGpiSFZ6ZEdWeWMxdHBYU0E5UFQwZ0xURXBJSHRjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjazUxYlNBckt6dGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNuTmJhVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdJQ0J5WlhSMWNtNGdlMk5zZFhOMFpYSnpMQ0JwY3pvZ2JtVjNJRlZwYm5Rek1rRnljbUY1S0dsektTd2dhbk02SUc1bGR5QlZhVzUwTXpKQmNuSmhlU2hxY3lrc0lHTnZjbkpsWTNSbFpFOW1abk5sZEhOOU8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklIUnZUMkpxWldOMFJtOXliU2h6Y0dGeWMyVk5ZWFJ5YVhnNklGTndZWEp6WlUxaGRISnBlRkpsYzNWc2RDazZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ0I3WEc0Z0lDQWdZMjl1YzNRZ2MzQmhjbk5sVDJKcVpXTjBPaUI3VzE4NklHNTFiV0psY2wwNklIdGJYem9nYm5WdFltVnlYVG9nYm5WdFltVnlmWDBnUFNCN2ZUdGNiaUFnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElITndZWEp6WlUxaGRISnBlQzVwTG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvSVhOd1lYSnpaVTlpYW1WamRGdHpjR0Z5YzJWTllYUnlhWGd1YVZ0cFhWMHBYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYwZ1BTQjdmVHRjYmlBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYxYmMzQmhjbk5sVFdGMGNtbDRMbXBiYVYxZElEMGdNU0F0SUhOd1lYSnpaVTFoZEhKcGVDNWthWE4wWVc1alpWdHBYVHRjYmlBZ0lDQWdJR2xtSUNnaGMzQmhjbk5sVDJKcVpXTjBXM053WVhKelpVMWhkSEpwZUM1cVcybGRYU2xjYmlBZ0lDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVxVzJsZFhTQTlJSHQ5TzF4dUlDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVxVzJsZFhWdHpjR0Z5YzJWTllYUnlhWGd1YVZ0cFhWMGdQU0F4SUMwZ2MzQmhjbk5sVFdGMGNtbDRMbVJwYzNSaGJtTmxXMmxkTzF4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2MzQmhjbk5sVDJKcVpXTjBPMXh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JoWkdSTWIyOXdjeWh6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JsSnZkM003SUdrckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGemNHRnljMlZQWW1wbFkzUmJhVjBwWEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHBYU0E5SUh0OU8xeHVJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmxkVzJsZElEMGdkR2hwY3k1ZmIzQjBhVzl1Y3k1dGRXeDBSbUZqZEc5eU8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ2JtOXliV0ZzYVhwbEtITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wS1NCN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCcElHOW1JRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTlpYW1WamRDa3BJSHRjYmlBZ0lDQWdJR052Ym5OMElISnZkeUE5SUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMDdYRzRnSUNBZ0lDQnNaWFFnYzNWdElEMGdNRHRjYmlBZ0lDQWdJR1p2Y2lBb1kyOXVjM1FnYWlCdlppQlBZbXBsWTNRdWEyVjVjeWh5YjNjcEtWeHVJQ0FnSUNBZ0lDQnpkVzBnS3owZ2NtOTNXMm9nWVhNZ1lXNTVYVHRjYmlBZ0lDQWdJR2xtSUNoemRXMGdQVDA5SURBcElHTnZiblJwYm5WbE8xeHVJQ0FnSUNBZ1ptOXlJQ2hqYjI1emRDQnFJRzltSUU5aWFtVmpkQzVyWlhsektISnZkeWtwWEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMWJhaUJoY3lCaGJubGRJQzg5SUhOMWJUdGNiaUFnSUNCOVhHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHVjRjR0Z1WkNoemNHRnljMlZQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ3dnYmxKdmQzTTZJRzUxYldKbGNpa2dlMXh1SUNBZ0lHTnZibk4wSUdWNGNHRnVaR1ZrVDJKcVpXTjBPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FnUFNCN2ZUdGNiaUFnSUNCamIyNXpkQ0J2Y21SbGNpQTlJRTFoZEdndVpteHZiM0lvVFdGMGFDNXRZWGdvVFdGMGFDNXNiMmN4TUNodVVtOTNjeWtzSURJcEtTQXJJREU3WEc0Z0lDQWdZMjl1YzNRZ2JXbHVUM0prWlhJZ1BTQk5ZWFJvTG5CdmR5Z3hNQ3dnYjNKa1pYSXBPMXh1SUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dibEp2ZDNNN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tDRnpjR0Z5YzJWUFltcGxZM1JiYVYwcFhHNGdJQ0FnSUNBZ0lHTnZiblJwYm5WbE8xeHVJQ0FnSUNBZ0x5OGdZMjl1YzNRZ2NtOTNJRDBnYzNCaGNuTmxUMkpxWldOMFcybGRPMXh1SUNBZ0lDQWdaWGh3WVc1a1pXUlBZbXBsWTNSYmFWMGdQejg5SUh0OU8xeHVJQ0FnSUNBZ1ptOXlJQ2hzWlhRZ2FpQTlJR2s3SUdvZ1BDQnVVbTkzY3pzZ2Fpc3JLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDZ2hjM0JoY25ObFQySnFaV04wVzJsZFB5NWJhbDBwWEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUhaaGJDQTlJSFJvYVhNdVoyVjBSWGh3WVc1a1ZtRnNkV1VvYzNCaGNuTmxUMkpxWldOMExDQnBMQ0JxS1RzZ0x5OXdjblZ1YVc1bklITjBaWEJjYmlBZ0lDQWdJQ0FnYVdZZ0tFMWhkR2d1Y205MWJtUW9kbUZzSUNvZ2JXbHVUM0prWlhJcElDOGdiV2x1VDNKa1pYSWdQaUF3S1NCN1hHNGdJQ0FnSUNBZ0lDQWdaWGh3WVc1a1pXUlBZbXBsWTNSYmFWMWJhbDBnUFNCMllXdzdYRzRnSUNBZ0lDQWdJQ0FnYVdZZ0tDRmxlSEJoYm1SbFpFOWlhbVZqZEZ0cVhTbGNiaUFnSUNBZ0lDQWdJQ0FnSUdWNGNHRnVaR1ZrVDJKcVpXTjBXMnBkSUQwZ2UzMDdYRzRnSUNBZ0lDQWdJQ0FnWlhod1lXNWtaV1JQWW1wbFkzUmJhbDFiYVYwZ1BTQjJZV3c3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlHVjRjR0Z1WkdWa1QySnFaV04wTzF4dUlDQjlYRzVjYmlBZ0x5OGdjSEpwZG1GMFpTQndjblZ1WlNoeWIzYzZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkRnR1ZFcxaVpYSmRLU0I3WEc1Y2JpQWdMeThnZlZ4dVhHNGdJSEJ5YVhaaGRHVWdhVzVtYkdGMFpTaHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZENrZ2UxeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2FTQnZaaUJQWW1wbFkzUXVhMlY1Y3loemNHRnljMlZQWW1wbFkzUXBLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQnliM2NnUFNCemNHRnljMlZQWW1wbFkzUmJhU0JoY3lCaGJubGRPMXh1SUNBZ0lDQWdabTl5SUNoamIyNXpkQ0JxSUc5bUlFOWlhbVZqZEM1clpYbHpLSEp2ZHlrcFhHNGdJQ0FnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnRwSUdGeklHRnVlVjFiYWlCaGN5QmhibmxkSUQwZ1RXRjBhQzV3YjNjb2MzQmhjbk5sVDJKcVpXTjBXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBzSUhSb2FYTXVYMjl3ZEdsdmJuTXVhVzVtYkdGMFpVWmhZM1J2Y2lrN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCblpYUkZlSEJoYm1SV1lXeDFaU2h6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dhVG9nWVc1NUxDQnFPaUJoYm5rcElIdGNiaUFnSUNCc1pYUWdkbUZzSUQwZ01EdGNiaUFnSUNCamIyNXpkQ0JqZFhKeVpXNTBTVzVrWlhobGN5QTlJRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTlpYW1WamRGdHBYU0EvUHlCN2ZTazdYRzRnSUNBZ1kyOXVjM1FnYjNSb1pYSkpibVJsZUdWeklEMGdUMkpxWldOMExtdGxlWE1vYzNCaGNuTmxUMkpxWldOMFcycGRJRDgvSUh0OUtUdGNiaUFnSUNCbWIzSWdLR052Ym5OMElHc2diMllnWTNWeWNtVnVkRWx1WkdWNFpYTXBJSHRjYmlBZ0lDQWdJR2xtSUNodmRHaGxja2x1WkdWNFpYTXVhVzVqYkhWa1pYTW9heWtwWEc0Z0lDQWdJQ0FnSUhaaGJDQXJQU0J6Y0dGeWMyVlBZbXBsWTNSYmFWMWJheUJoY3lCaGJubGRJQ29nYzNCaGNuTmxUMkpxWldOMFcycGRXMnNnWVhNZ1lXNTVYVHRjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhaaGJEdGNiaUFnZlZ4dWZWeHVYRzRpWFgwPSIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgZ2V0R1BVRGV2aWNlIH0gZnJvbSAnLi4vZ2V0R1BVRGV2aWNlJztcbmltcG9ydCB7IHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZSB9IGZyb20gJy4vY29sd2lzZS1ub3JtYWxpemUnO1xuaW1wb3J0IHsgZXhwYW5kTm9SZXZpdmUsIGluZmxhdGUgfSBmcm9tICcuL2luZmxhdGUtZXhwYW5kJztcbmltcG9ydCB7IHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0gfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MsIG1heEl0ZXJhdGlvbnMgPSA1KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGV2aWNlID0geWllbGQgZ2V0R1BVRGV2aWNlKCk7XG4gICAgICAgIGlmICghZGV2aWNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBncHUgZGV2aWNlIGZvdW5kJyk7XG4gICAgICAgIC8vIHNlbGYgbG9vcHMgYXJlIGFscmVhZHkgYWRkZWQgaGVyZVxuICAgICAgICBjb25zdCBzcGFyc2VLTk5Gb3JtID0gdG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgICAgLy8gZmlyc3QsIHdlIG5vcm1pbGl6ZSB0aGUgc2ltaWxhcml0aWVzXG4gICAgICAgIHlpZWxkIHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZShkZXZpY2UsIHNwYXJzZUtOTkZvcm0uS05OU2ltaWxhcml0aWVzLCBzcGFyc2VLTk5Gb3JtLmluZGV4T2Zmc2V0cywgblJvd3MpO1xuICAgICAgICBsZXQgcmVzID0gc3BhcnNlS05ORm9ybTtcbiAgICAgICAgLy8gdGhlbiB3ZSBleHBhbmQgdGhlIHNpbWlsYXJpdGllc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhjaGVja1NvcnRlZChyZXMuS05OSW5kZXhlcywgcmVzLmluZGV4T2Zmc2V0cykpO1xuICAgICAgICAgICAgY29uc3QgZXhwYW5kUmVzID0geWllbGQgZXhwYW5kTm9SZXZpdmUoZGV2aWNlLCByZXMuS05OU2ltaWxhcml0aWVzLCByZXMuS05OSW5kZXhlcywgcmVzLmluZGV4T2Zmc2V0cywgblJvd3MpO1xuICAgICAgICAgICAgLy8gdGhlbiB3ZSBpbmZsYXRlIHRoZSBzaW1pbGFyaXRpZXNcbiAgICAgICAgICAgIGluZmxhdGUoZXhwYW5kUmVzLktOTlNpbWlsYXJpdGllcywgMik7XG4gICAgICAgICAgICAvLyB0aGVuIHdlIG5vcm1pbGl6ZSB0aGUgc2ltaWxhcml0aWVzIGFnYWluXG4gICAgICAgICAgICB5aWVsZCBzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UoZGV2aWNlLCBleHBhbmRSZXMuS05OU2ltaWxhcml0aWVzLCBleHBhbmRSZXMuaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgICAgICByZXMgPSBleHBhbmRSZXM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPU1DTC13ZWJHUFUuanMubWFwIiwiaW1wb3J0IHsgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXggfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9zcGFyc2UtbWF0cml4L3dlYkdQVS1zcGFyc2UtbWF0cml4JztcbmltcG9ydCB7IFNwYXJzZU1hdHJpeFNlcnZpY2UgfSBmcm9tICcuLi9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlJztcbmltcG9ydCB7IE1DTFNwYXJzZVJlZHVjZXIgfSBmcm9tICcuL21hcmNvdi1jbHVzdGVyJztcbm9ubWVzc2FnZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgIGNvbnN0IHsgZGF0YSwgdGhyZXNob2xkLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCwgZGlzdGFuY2VGbkFyZ3MsIGRpc3RhbmNlRm5zLCBtYXhJdGVyYXRpb25zLCB1c2VXZWJHUFUgfSA9IGV2ZW50LmRhdGE7XG4gICAgY29uc29sZS50aW1lKCdzcGFyc2UgbWF0cml4Jyk7XG4gICAgbGV0IHNwYXJzZSA9IG51bGw7XG4gICAgaWYgKHVzZVdlYkdQVSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3BhcnNlID0gYXdhaXQgbXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgoZGF0YSwgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZucywgYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMsIGRpc3RhbmNlRm5BcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXNwYXJzZSkgeyAvLyBmYWxzYmFjayB0byBDUFVcbiAgICAgICAgaWYgKHVzZVdlYkdQVSlcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dFQkdQVSBzcGFyc2UgbWF0cml4IGNhbGN1bGF0aW9uIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICBzcGFyc2UgPSBhd2FpdCBuZXcgU3BhcnNlTWF0cml4U2VydmljZSgpXG4gICAgICAgICAgICAuY2FsY011bHRpQ29sdW1uKGRhdGEsIGRpc3RhbmNlRm5zLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5BcmdzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCk7XG4gICAgfVxuICAgIGNvbnNvbGUudGltZUVuZCgnc3BhcnNlIG1hdHJpeCcpO1xuICAgIC8vY29uc3QgcmVzID0gYXdhaXQgbmV3IE1DTFNwYXJzZVJlZHVjZXIoe21heEl0ZXJhdGlvbnM6IG1heEl0ZXJhdGlvbnMgPz8gNX0pLnRyYW5zZm9ybShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICBjb25zdCByZWR1Y2VyID0gbmV3IE1DTFNwYXJzZVJlZHVjZXIoeyBtYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDUgfSk7XG4gICAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgICBsZXQgcmVzID0gbnVsbDtcbiAgICBpZiAodXNlV2ViR1BVKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignd2ViR1BVIE1DTCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXMpXG4gICAgICAgIHJlcyA9IGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG4gICAgcG9zdE1lc3NhZ2UoeyByZXMgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldOc0xYZHZjbXRsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbTFqYkMxM2IzSnJaWEl1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNUMEZCVHl4RlFVRkRMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNkMFZCUVhkRkxFTkJRVU03UVVGRGJFZ3NUMEZCVHl4RlFVRnhRaXh0UWtGQmJVSXNSVUZCUXl4TlFVRk5MREJEUVVFd1F5eERRVUZETzBGQlIycEhMRTlCUVU4c1JVRkJReXhuUWtGQlowSXNSVUZCUXl4TlFVRk5MR3RDUVVGclFpeERRVUZETzBGQlJXeEVMRk5CUVZNc1IwRkJSeXhMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTEVWQlFVVTdTVUZETVVJc1RVRkJUU3hGUVVGRExFbEJRVWtzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEdOQlFXTXNSVUZCUlN4WFFVRlhMRVZCUVVVc1lVRkJZU3hGUVVGRkxGTkJRVk1zUlVGQlF5eEhRVWRPTEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNN1NVRkZMMGNzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJRenRKUVVNNVFpeEpRVUZKTEUxQlFVMHNSMEZCT0VJc1NVRkJTU3hEUVVGRE8wbEJRemRETEVsQlFVa3NVMEZCVXl4RlFVRkZPMUZCUTJJc1NVRkJTVHRaUVVOR0xFMUJRVTBzUjBGQlJ5eE5RVUZOTERCQ1FVRXdRaXhEUVVOMlF5eEpRVUZKTEVWQlFVVXNVMEZCVXl4SFFVRkhMRWRCUVVjc1JVRkJSU3hYUVVGclFpeEZRVUZGTEdsQ1FVRjNRaXhGUVVGRkxFOUJRVThzUlVGQlJTeGpRVUZqTEVOQlFVTXNRMEZCUXp0VFFVTnFSenRSUVVGRExFOUJRVThzUTBGQlF5eEZRVUZGTzFsQlExWXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFRRVU5zUWp0TFFVTkdPMGxCUTBRc1NVRkJTU3hEUVVGRExFMUJRVTBzUlVGQlJTeEZRVUZGTEd0Q1FVRnJRanRSUVVNdlFpeEpRVUZKTEZOQlFWTTdXVUZEV0N4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExEWkZRVUUyUlN4RFFVRkRMRU5CUVVNN1VVRkZMMFlzVFVGQlRTeEhRVUZITEUxQlFVMHNTVUZCU1N4dFFrRkJiVUlzUlVGQlJUdGhRVU55UXl4bFFVRmxMRU5CUVVNc1NVRkJTU3hGUVVGRkxGZEJRVmNzUlVGQlJTeFRRVUZUTEVkQlFVY3NSMEZCUnl4RlFVRkZMR05CUVdNc1JVRkJSU3hQUVVGUExFVkJRVVVzYVVKQlFXbENMRU5CUVVNc1EwRkJRenRMUVVOd1J6dEpRVU5FTEU5QlFVOHNRMEZCUXl4UFFVRlBMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU03U1VGRmFrTXNaMGhCUVdkSU8wbEJRMmhJTEUxQlFVMHNUMEZCVHl4SFFVRkhMRWxCUVVrc1owSkJRV2RDTEVOQlFVTXNSVUZCUXl4aFFVRmhMRVZCUVVVc1lVRkJZU3hKUVVGSkxFTkJRVU1zUlVGQlF5eERRVUZETEVOQlFVTTdTVUZETVVVc1QwRkJUeXhEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0SlFVTndRaXhKUVVGSkxFZEJRVWNzUjBGQlVTeEpRVUZKTEVOQlFVTTdTVUZEY0VJc1NVRkJTU3hUUVVGVExFVkJRVVU3VVVGRFlpeEpRVUZKTzFsQlEwWXNSMEZCUnl4SFFVRkhMRTFCUVUwc1QwRkJUeXhEUVVGRExHVkJRV1VzUTBGQlF5eE5RVUZOTEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzFOQlF6ZEVPMUZCUVVNc1QwRkJUeXhEUVVGRExFVkJRVVU3V1VGRFZpeFBRVUZQTEVOQlFVTXNTMEZCU3l4RFFVRkRMSFZFUVVGMVJDeERRVUZETEVOQlFVTTdXVUZEZGtVc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0VFFVTnNRanRMUVVOR08wbEJRMFFzU1VGQlNTeERRVUZETEVkQlFVYzdVVUZEVGl4SFFVRkhMRWRCUVVjc1RVRkJUU3hQUVVGUExFTkJRVU1zVTBGQlV5eERRVUZETEUxQlFVMHNSVUZCUlN4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdTVUZEZUVRc1QwRkJUeXhEUVVGRExFOUJRVThzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0SlFVVjJRaXhYUVVGWExFTkJRVU1zUlVGQlF5eEhRVUZITEVWQlFVTXNRMEZCUXl4RFFVRkRPMEZCUTNKQ0xFTkJRVU1zUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdiWFZzZEdsRGIyeFhaV0pIVUZWVGNHRnljMlZOWVhSeWFYaDlJR1p5YjIwZ0owQmtZWFJoWjNKdmF5MXNhV0p5WVhKcFpYTXZiV0YwYUM5emNtTXZkMlZpUjFCVkwzTndZWEp6WlMxdFlYUnlhWGd2ZDJWaVIxQlZMWE53WVhKelpTMXRZWFJ5YVhnbk8xeHVhVzF3YjNKMElIdFRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUXNJRk53WVhKelpVMWhkSEpwZUZObGNuWnBZMlY5SUdaeWIyMGdKeTR1TDJScGMzUmhibU5sTFcxaGRISnBlQzl6Y0dGeWMyVXRiV0YwY21sNExYTmxjblpwWTJVbk8xeHVhVzF3YjNKMElIdEVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a2ZTQm1jbTl0SUNjdUxpOWthWE4wWVc1alpTMXRZWFJ5YVhndmRIbHdaWE1uTzF4dWFXMXdiM0owSUh0TGJtOTNiazFsZEhKcFkzTjlJR1p5YjIwZ0p5NHVMM1I1Y0dWa0xXMWxkSEpwWTNNbk8xeHVhVzF3YjNKMElIdE5RMHhUY0dGeWMyVlNaV1IxWTJWeWZTQm1jbTl0SUNjdUwyMWhjbU52ZGkxamJIVnpkR1Z5Snp0Y2JseHViMjV0WlhOellXZGxJRDBnWVhONWJtTWdLR1YyWlc1MEtTQTlQaUI3WEc0Z0lHTnZibk4wSUh0a1lYUmhMQ0IwYUhKbGMyaHZiR1FzSUhkbGFXZG9kSE1zSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrTENCa2FYTjBZVzVqWlVadVFYSm5jeXdnWkdsemRHRnVZMlZHYm5Nc0lHMWhlRWwwWlhKaGRHbHZibk1zSUhWelpWZGxZa2RRVlgwNlhHNGdJQ0I3WkdGMFlUb2dZVzU1VzExYlhTd2dkR2h5WlhOb2IyeGtPaUJ1ZFcxaVpYSXNYRzRnSUNBZ2QyVnBaMmgwY3pvZ2JuVnRZbVZ5VzEwc0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0xGeHVJQ0FnSUdScGMzUmhibU5sUm01ek9pQkxibTkzYmsxbGRISnBZM05iWFN3Z1pHbHpkR0Z1WTJWR2JrRnlaM002SUdGdWVWdGRMQ0J0WVhoSmRHVnlZWFJwYjI1ek9pQnVkVzFpWlhJc0lIVnpaVmRsWWtkUVZUODZJR0p2YjJ4bFlXNTlJRDBnWlhabGJuUXVaR0YwWVR0Y2JseHVJQ0JqYjI1emIyeGxMblJwYldVb0ozTndZWEp6WlNCdFlYUnlhWGduS1R0Y2JpQWdiR1YwSUhOd1lYSnpaVG9nVTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwSUh3Z2JuVnNiQ0E5SUc1MWJHdzdYRzRnSUdsbUlDaDFjMlZYWldKSFVGVXBJSHRjYmlBZ0lDQjBjbmtnZTF4dUlDQWdJQ0FnYzNCaGNuTmxJRDBnWVhkaGFYUWdiWFZzZEdsRGIyeFhaV0pIVUZWVGNHRnljMlZOWVhSeWFYZ29YRzRnSUNBZ0lDQWdJR1JoZEdFc0lIUm9jbVZ6YUc5c1pDQXZJREV3TUN3Z1pHbHpkR0Z1WTJWR2JuTWdZWE1nWVc1NUxDQmhaMmR5WldkaGRHbHZiazFsZEdodlpDQmhjeUJoYm5rc0lIZGxhV2RvZEhNc0lHUnBjM1JoYm1ObFJtNUJjbWR6S1R0Y2JpQWdJQ0I5SUdOaGRHTm9JQ2hsS1NCN1hHNGdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLR1VwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0JwWmlBb0lYTndZWEp6WlNrZ2V5QXZMeUJtWVd4elltRmpheUIwYnlCRFVGVmNiaUFnSUNCcFppQW9kWE5sVjJWaVIxQlZLVnh1SUNBZ0lDQWdZMjl1YzI5c1pTNWxjbkp2Y2lnblYwVkNSMUJWSUhOd1lYSnpaU0J0WVhSeWFYZ2dZMkZzWTNWc1lYUnBiMjRnWm1GcGJHVmtMQ0JtWVd4c2FXNW5JR0poWTJzZ2RHOGdRMUJWSUdsdGNHeGxiV1Z1ZEdGMGFXOXVKeWs3WEc1Y2JpQWdJQ0J6Y0dGeWMyVWdQU0JoZDJGcGRDQnVaWGNnVTNCaGNuTmxUV0YwY21sNFUyVnlkbWxqWlNncFhHNGdJQ0FnSUNBdVkyRnNZMDExYkhScFEyOXNkVzF1S0dSaGRHRXNJR1JwYzNSaGJtTmxSbTV6TENCMGFISmxjMmh2YkdRZ0x5QXhNREFzSUdScGMzUmhibU5sUm01QmNtZHpMQ0IzWldsbmFIUnpMQ0JoWjJkeVpXZGhkR2x2YmsxbGRHaHZaQ2s3WEc0Z0lIMWNiaUFnWTI5dWMyOXNaUzUwYVcxbFJXNWtLQ2R6Y0dGeWMyVWdiV0YwY21sNEp5azdYRzVjYmlBZ0x5OWpiMjV6ZENCeVpYTWdQU0JoZDJGcGRDQnVaWGNnVFVOTVUzQmhjbk5sVW1Wa2RXTmxjaWg3YldGNFNYUmxjbUYwYVc5dWN6b2diV0Y0U1hSbGNtRjBhVzl1Y3lBL1B5QTFmU2t1ZEhKaGJuTm1iM0p0S0hOd1lYSnpaU3dnWkdGMFlWc3dYUzVzWlc1bmRHZ3BPMXh1SUNCamIyNXpkQ0J5WldSMVkyVnlJRDBnYm1WM0lFMURURk53WVhKelpWSmxaSFZqWlhJb2UyMWhlRWwwWlhKaGRHbHZibk02SUcxaGVFbDBaWEpoZEdsdmJuTWdQejhnTlgwcE8xeHVJQ0JqYjI1emIyeGxMblJwYldVb0owMURUQ2NwTzF4dUlDQnNaWFFnY21Wek9pQmhibmtnUFNCdWRXeHNPMXh1SUNCcFppQW9kWE5sVjJWaVIxQlZLU0I3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUhKbGN5QTlJR0YzWVdsMElISmxaSFZqWlhJdWRISmhibk5tYjNKdFYyVmlSMUJWS0hOd1lYSnpaU3dnWkdGMFlWc3dYUzVzWlc1bmRHZ3BPMXh1SUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJR052Ym5OdmJHVXVaWEp5YjNJb0ozZGxZa2RRVlNCTlEwd2dabUZwYkdWa0xDQm1ZV3hzYVc1bklHSmhZMnNnZEc4Z1ExQlZJR2x0Y0d4bGJXVnVkR0YwYVc5dUp5azdYRzRnSUNBZ0lDQmpiMjV6YjJ4bExtVnljbTl5S0dVcE8xeHVJQ0FnSUgxY2JpQWdmVnh1SUNCcFppQW9JWEpsY3lsY2JpQWdJQ0J5WlhNZ1BTQmhkMkZwZENCeVpXUjFZMlZ5TG5SeVlXNXpabTl5YlNoemNHRnljMlVzSUdSaGRHRmJNRjB1YkdWdVozUm9LVHRjYmlBZ1kyOXVjMjlzWlM1MGFXMWxSVzVrS0NkTlEwd25LVHRjYmx4dUlDQndiM04wVFdWemMyRm5aU2g3Y21WemZTazdYRzU5TzF4dUlsMTkiLCJpbXBvcnQgeyBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcyB9IGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0IGNvbnN0IGlzTmlsID0gKHgpID0+IHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkO1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydFNtYWxsZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtID4gZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtIDwgdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpbnNlcnRMYXJnZXIoZGlzdGFuY2VzQXIsIGluZGV4ZXMsIG51bSwgaW5kZXgpIHtcbiAgICBpZiAobnVtIDwgZGlzdGFuY2VzQXJbZGlzdGFuY2VzQXIubGVuZ3RoIC0gMV0pXG4gICAgICAgIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpc3RhbmNlc0FyLmZpbmRJbmRleCgodikgPT4gbnVtID4gdik7XG4gICAgZGlzdGFuY2VzQXIucG9wKCk7XG4gICAgZGlzdGFuY2VzQXIuc3BsaWNlKG5ld1Bvc2l0aW9uLCAwLCBudW0pO1xuICAgIGluZGV4ZXMucG9wKCk7XG4gICAgaW5kZXhlcy5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRBZ2dyZWdhdGlvbkZ1bmN0aW9uKGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzKSB7XG4gICAgc3dpdGNoIChhZ2dyZWdhdGlvbk1ldGhvZCkge1xuICAgICAgICBjYXNlIERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzLk1BTkhBVFRBTjpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgdmFsICogd2VpZ2h0c1tpZHhdLCAwKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiAodnMpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBldWNsaWRlYW5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW0gPSB2cy5yZWR1Y2UoKGFjYywgdmFsLCBpZHgpID0+IGFjYyArICh2YWwgKiB3ZWlnaHRzW2lkeF0pICoqIDIsIDApO1xuICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoc3VtKTtcbiAgICAgICAgICAgIH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pZFhScGJITXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKMWRHbHNjeTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGQlFTeFBRVUZQTEVWQlFUUkNMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNVMEZCVXl4RFFVRkRPMEZCUlRsRkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eExRVUZMTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1UwRkJVeXhEUVVGRE8wRkJSUzlFTEUxQlFVMHNWVUZCVlN4aFFVRmhMRU5CUVVNc1YwRkJjVUlzUlVGQlJTeFBRVUZwUWl4RlFVRkZMRWRCUVZjc1JVRkJSU3hMUVVGaE8wbEJRMmhITEVsQlFVa3NSMEZCUnl4SFFVRkhMRmRCUVZjc1EwRkJReXhYUVVGWExFTkJRVU1zVFVGQlRTeEhRVUZETEVOQlFVTXNRMEZCUXp0UlFVTjZReXhQUVVGUE8wbEJSVlFzVFVGQlRTeFhRVUZYTEVkQlFVY3NWMEZCVnl4RFFVRkRMRk5CUVZNc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRekZFTEZkQlFWY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRKUVVOc1FpeFhRVUZYTEVOQlFVTXNUVUZCVFN4RFFVRkRMRmRCUVZjc1JVRkJSU3hEUVVGRExFVkJRVVVzUjBGQlJ5eERRVUZETEVOQlFVTTdTVUZEZUVNc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzBsQlEyUXNUMEZCVHl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMEZCUTNoRExFTkJRVU03UVVGRlJDeE5RVUZOTEZWQlFWVXNXVUZCV1N4RFFVRkRMRmRCUVhGQ0xFVkJRVVVzVDBGQmFVSXNSVUZCUlN4SFFVRlhMRVZCUVVVc1MwRkJZVHRKUVVNdlJpeEpRVUZKTEVkQlFVY3NSMEZCUnl4WFFVRlhMRU5CUVVNc1YwRkJWeXhEUVVGRExFMUJRVTBzUjBGQlF5eERRVUZETEVOQlFVTTdVVUZEZWtNc1QwRkJUenRKUVVWVUxFMUJRVTBzVjBGQlZ5eEhRVUZITEZkQlFWY3NRMEZCUXl4VFFVRlRMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNeFJDeFhRVUZYTEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1NVRkRiRUlzVjBGQlZ5eERRVUZETEUxQlFVMHNRMEZCUXl4WFFVRlhMRVZCUVVVc1EwRkJReXhGUVVGRkxFZEJRVWNzUTBGQlF5eERRVUZETzBsQlEzaERMRTlCUVU4c1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5rTEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNc1YwRkJWeXhGUVVGRkxFTkJRVU1zUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0QlFVTjRReXhEUVVGRE8wRkJSVVFzVFVGQlRTeFZRVUZWTEhOQ1FVRnpRaXhEUVVOd1F5eHBRa0ZCTkVNc1JVRkJSU3hQUVVGcFFqdEpRVVV2UkN4UlFVRlJMR2xDUVVGcFFpeEZRVUZGTzFGQlEzcENMRXRCUVVzc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0WlFVTjJReXhQUVVGUExFTkJRVU1zUlVGQldTeEZRVUZGTEVWQlFVVXNRMEZCUXl4RlFVRkZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4SFFVRkhMRVZCUVVVc1JVRkJSU3hEUVVGRExFZEJRVWNzUjBGQlJ5eEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzSkdPMWxCUTBVc1QwRkJUeXhEUVVGRExFVkJRVmtzUlVGQlJTeEZRVUZGTzJkQ1FVTjBRaXhaUVVGWk8yZENRVU5hTEUxQlFVMHNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGRE4wVXNUMEZCVHl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFsQlEzaENMRU5CUVVNc1EwRkJRenRMUVVOTU8wRkJRMGdzUTBGQlF5SXNJbk52ZFhKalpYTkRiMjUwWlc1MElqcGJJbWx0Y0c5eWRDQjdSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDd2dSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpITjlJR1p5YjIwZ0p5NHZkSGx3WlhNbk8xeHVYRzVsZUhCdmNuUWdZMjl1YzNRZ2FYTk9hV3dnUFNBb2VEb2dZVzU1S1NBOVBpQjRJRDA5UFNCdWRXeHNJSHg4SUhnZ1BUMDlJSFZ1WkdWbWFXNWxaRHRjYmx4dVpYaHdiM0owSUdaMWJtTjBhVzl1SUdsdWMyVnlkRk50WVd4c1pYSW9aR2x6ZEdGdVkyVnpRWEk2SUc1MWJXSmxjbHRkTENCcGJtUmxlR1Z6T2lCdWRXMWlaWEpiWFN3Z2JuVnRPaUJ1ZFcxaVpYSXNJR2x1WkdWNE9pQnVkVzFpWlhJcElIdGNiaUFnYVdZZ0tHNTFiU0ErSUdScGMzUmhibU5sYzBGeVcyUnBjM1JoYm1ObGMwRnlMbXhsYm1kMGFDMHhYU2xjYmlBZ0lDQnlaWFIxY200N1hHNWNiaUFnWTI5dWMzUWdibVYzVUc5emFYUnBiMjRnUFNCa2FYTjBZVzVqWlhOQmNpNW1hVzVrU1c1a1pYZ29LSFlwSUQwK0lHNTFiU0E4SUhZcE8xeHVJQ0JrYVhOMFlXNWpaWE5CY2k1d2IzQW9LVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjM0JzYVdObEtHNWxkMUJ2YzJsMGFXOXVMQ0F3TENCdWRXMHBPMXh1SUNCcGJtUmxlR1Z6TG5CdmNDZ3BPMXh1SUNCcGJtUmxlR1Z6TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2dhVzVrWlhncE8xeHVmVnh1WEc1bGVIQnZjblFnWm5WdVkzUnBiMjRnYVc1elpYSjBUR0Z5WjJWeUtHUnBjM1JoYm1ObGMwRnlPaUJ1ZFcxaVpYSmJYU3dnYVc1a1pYaGxjem9nYm5WdFltVnlXMTBzSUc1MWJUb2diblZ0WW1WeUxDQnBibVJsZURvZ2JuVnRZbVZ5S1NCN1hHNGdJR2xtSUNodWRXMGdQQ0JrYVhOMFlXNWpaWE5CY2x0a2FYTjBZVzVqWlhOQmNpNXNaVzVuZEdndE1WMHBYRzRnSUNBZ2NtVjBkWEp1TzF4dVhHNGdJR052Ym5OMElHNWxkMUJ2YzJsMGFXOXVJRDBnWkdsemRHRnVZMlZ6UVhJdVptbHVaRWx1WkdWNEtDaDJLU0E5UGlCdWRXMGdQaUIyS1R0Y2JpQWdaR2x6ZEdGdVkyVnpRWEl1Y0c5d0tDazdYRzRnSUdScGMzUmhibU5sYzBGeUxuTndiR2xqWlNodVpYZFFiM05wZEdsdmJpd2dNQ3dnYm5WdEtUdGNiaUFnYVc1a1pYaGxjeTV3YjNBb0tUdGNiaUFnYVc1a1pYaGxjeTV6Y0d4cFkyVW9ibVYzVUc5emFYUnBiMjRzSURBc0lHbHVaR1Y0S1R0Y2JuMWNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2RsZEVGblozSmxaMkYwYVc5dVJuVnVZM1JwYjI0b1hHNGdJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtPaUJFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtMQ0IzWldsbmFIUnpPaUJ1ZFcxaVpYSmJYVnh1S1RvZ0tIWmhiSFZsY3pvZ2JuVnRZbVZ5VzEwcElEMCtJRzUxYldKbGNpQjdYRzRnSUhOM2FYUmphQ0FvWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFwSUh0Y2JpQWdJQ0JqWVhObElFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSekxrMUJUa2hCVkZSQlRqcGNiaUFnSUNBZ0lISmxkSFZ5YmlBb2RuTTZJRzUxYldKbGNsdGRLU0E5UGlCMmN5NXlaV1IxWTJVb0tHRmpZeXdnZG1Gc0xDQnBaSGdwSUQwK0lHRmpZeUFySUhaaGJDQXFJSGRsYVdkb2RITmJhV1I0WFN3Z01DazdYRzRnSUNBZ1pHVm1ZWFZzZERwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUI3WEc0Z0lDQWdJQ0FnSUM4dklHVjFZMnhwWkdWaGJseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCemRXMGdQU0IyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJQ2gyWVd3Z0tpQjNaV2xuYUhSelcybGtlRjBwSUNvcUlESXNJREFwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnVFdGMGFDNXpjWEowS0hOMWJTazdYRzRnSUNBZ0lDQjlPMXh1SUNCOVhHNTlYRzRpWFgwPSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuLy8gdGhlIHN0YXJ0dXAgZnVuY3Rpb25cbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG5cdC8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFs1OTBdLCAoKSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXyg5Mjk1KSkpXG5cdF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLk8oX193ZWJwYWNrX2V4cG9ydHNfXyk7XG5cdHJldHVybiBfX3dlYnBhY2tfZXhwb3J0c19fO1xufTtcblxuIiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5mID0ge307XG4vLyBUaGlzIGZpbGUgY29udGFpbnMgb25seSB0aGUgZW50cnkgY2h1bmsuXG4vLyBUaGUgY2h1bmsgbG9hZGluZyBmdW5jdGlvbiBmb3IgYWRkaXRpb25hbCBjaHVua3Ncbl9fd2VicGFja19yZXF1aXJlX18uZSA9IChjaHVua0lkKSA9PiB7XG5cdHJldHVybiBQcm9taXNlLmFsbChPYmplY3Qua2V5cyhfX3dlYnBhY2tfcmVxdWlyZV9fLmYpLnJlZHVjZSgocHJvbWlzZXMsIGtleSkgPT4ge1xuXHRcdF9fd2VicGFja19yZXF1aXJlX18uZltrZXldKGNodW5rSWQsIHByb21pc2VzKTtcblx0XHRyZXR1cm4gcHJvbWlzZXM7XG5cdH0sIFtdKSk7XG59OyIsIi8vIFRoaXMgZnVuY3Rpb24gYWxsb3cgdG8gcmVmZXJlbmNlIGFzeW5jIGNodW5rcyBhbmQgc2libGluZyBjaHVua3MgZm9yIHRoZSBlbnRyeXBvaW50XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAhc2NyaXB0VXJsKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gc2VsZi5sb2NhdGlvbiArIFwiXCI7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImFscmVhZHkgbG9hZGVkXCJcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDIzMTogMVxufTtcblxuLy8gaW1wb3J0U2NyaXB0cyBjaHVuayBsb2FkaW5nXG52YXIgaW5zdGFsbENodW5rID0gKGRhdGEpID0+IHtcblx0dmFyIFtjaHVua0lkcywgbW9yZU1vZHVsZXMsIHJ1bnRpbWVdID0gZGF0YTtcblx0Zm9yKHZhciBtb2R1bGVJZCBpbiBtb3JlTW9kdWxlcykge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhtb3JlTW9kdWxlcywgbW9kdWxlSWQpKSB7XG5cdFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLm1bbW9kdWxlSWRdID0gbW9yZU1vZHVsZXNbbW9kdWxlSWRdO1xuXHRcdH1cblx0fVxuXHRpZihydW50aW1lKSBydW50aW1lKF9fd2VicGFja19yZXF1aXJlX18pO1xuXHR3aGlsZShjaHVua0lkcy5sZW5ndGgpXG5cdFx0aW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRzLnBvcCgpXSA9IDE7XG5cdHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uKGRhdGEpO1xufTtcbl9fd2VicGFja19yZXF1aXJlX18uZi5pID0gKGNodW5rSWQsIHByb21pc2VzKSA9PiB7XG5cdC8vIFwiMVwiIGlzIHRoZSBzaWduYWwgZm9yIFwiYWxyZWFkeSBsb2FkZWRcIlxuXHRpZighaW5zdGFsbGVkQ2h1bmtzW2NodW5rSWRdKSB7XG5cdFx0aWYodHJ1ZSkgeyAvLyBhbGwgY2h1bmtzIGhhdmUgSlNcblx0XHRcdGltcG9ydFNjcmlwdHMoX193ZWJwYWNrX3JlcXVpcmVfXy5wICsgX193ZWJwYWNrX3JlcXVpcmVfXy51KGNodW5rSWQpKTtcblx0XHR9XG5cdH1cbn07XG5cbnZhciBjaHVua0xvYWRpbmdHbG9iYWwgPSBzZWxmW1wid2VicGFja0NodW5rZWRhXCJdID0gc2VsZltcIndlYnBhY2tDaHVua2VkYVwiXSB8fCBbXTtcbnZhciBwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbiA9IGNodW5rTG9hZGluZ0dsb2JhbC5wdXNoLmJpbmQoY2h1bmtMb2FkaW5nR2xvYmFsKTtcbmNodW5rTG9hZGluZ0dsb2JhbC5wdXNoID0gaW5zdGFsbENodW5rO1xuXG4vLyBubyBITVJcblxuLy8gbm8gSE1SIG1hbmlmZXN0IiwiLy8gcnVuIHN0YXJ0dXBcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iXSwibmFtZXMiOlsiZGVmZXJyZWQiLCJuZXh0IiwiV0VCR1NMQUdHUkVHQVRJT04iLCJXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUyIsIkVVQ0xJREVBTiIsImFycmF5U2l6ZSIsIk1BTkhBVFRBTiIsIldFQkdQVURJU1RBTkNFIiwid2ViR1BVRnVuY3Rpb25zIiwiSEFNTUlORyIsIl9tYXhBcnJheVNpemUiLCJlbnRyeUluZGV4IiwibWF4QXJyYXlTaXplIiwiX2VudHJ5SW5kZXgiLCJUQU5JTU9UTyIsIkxFVkVOU1RFSU4iLCJORUVETEVNQU5fV1VOU0NIIiwiTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSIsIlNPS0FMIiwiQ09TSU5FIiwiQVNZTU1FVFJJQyIsIkRpZmZlcmVuY2UiLCJPbmVIb3QiLCJkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSIsIm1heEVudHJ5U2l6ZSIsIk1hdGgiLCJjZWlsIiwiX21heEVudHJ5U2l6ZSIsIlR5cGVTdXBwb3J0ZWREaXN0YW5jZXMiLCJTZXQiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJncHVBZGFwdGVyIiwiZ3B1RGV2aWNlIiwiZ2V0R1BVRGV2aWNlIiwidGhpcyIsIm5hdmlnYXRvciIsImdwdSIsInJlcXVlc3RBZGFwdGVyIiwicG93ZXJQcmVmZXJlbmNlIiwiaXNMb3N0IiwibG9zdCIsInIiLCJzZXRUaW1lb3V0IiwicmVxdWlyZWRCdWZmZXJTaXplIiwiYWRhcHRlckxpbWl0cyIsImxpbWl0cyIsImJ1ZmZmZXJTaXplTGltaXQiLCJtYXhCdWZmZXJTaXplIiwic3RvcmFnZUJ1ZmZlclNpemVMaW1pdCIsIm1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZSIsInJlcXVlc3REZXZpY2UiLCJyZXF1aXJlZExpbWl0cyIsIm1pbiIsImNvbnNvbGUiLCJlcnJvciIsIm11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4IiwiZW50cnlMaXN0IiwidGhyZXNob2xkIiwiZGlzdGFuY2VNZXRyaWNzIiwiYWdncmVnYXRpb25GdW5jdGlvbiIsIndlaWdodHMiLCJvcHRpb25zIiwiZGV2aWNlIiwiYXZhaWxhYmxlRGlzdGFuY2VNZXRyaWNzIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsIm1ldHJpYyIsImluY2x1ZGVzIiwiRXJyb3IiLCJqb2luIiwibWF4RGlzdGFuY2UiLCJsZW5ndGgiLCJsaXN0IiwibnVtT2ZDb2x1bW5zIiwibGlzdFNpemUiLCJwcm9jZXNzSW5mbyIsIm1hcCIsImVudHJ5IiwiaSIsImRpc3RhbmNlTWV0cmljIiwiZ2FwT3BlblBlbmFsdHkiLCJnYXBFeHRlbnNpb25QZW5hbHR5IiwiX2EiLCJfYiIsImVudHJ5VHlwZSIsImVuY29kZWRMaXN0IiwiVWludDMyQXJyYXkiLCJzcGxpdCIsImMiLCJjaGFyQ29kZUF0IiwiRmxvYXQzMkFycmF5IiwiX2RhdGEiLCJJbnQzMkFycmF5IiwiZW5jb2RlZExpc3RUeXBlIiwiYXJyYXlTaXplcyIsImFyciIsImhhcyIsIm1heEVudHJ5TGVuIiwicmVkdWNlIiwiYSIsImIiLCJtYXgiLCJjb21wbGV4aXR5IiwiRW5jb2RlZEFycmF5Q29uc3RydWN0b3IiLCJmbGF0U291cmNlQXJyYXkiLCJmb3JFYWNoIiwic2VxIiwic2V0Iiwic3VwcEluZm9TdHJ1Y3RXZ3NsIiwic3VwcEluZm9TaXplIiwic3VwcEluZm9UeXBlIiwic3VwcEluZm9CdWZmZXIiLCJtYXhNb25vbWVySW5kZXgiLCJzY29yaW5nTWF0cml4IiwiYWxwaGFiZXRJbmRleGVzIiwia2V5cyIsInByZXYiLCJuIiwiQXJyYXkiLCJmaWxsIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2ltaWxhcml0eU1hdHJpeFNpemUiLCJ0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeCIsImtleSIsImtleTIiLCJvZmZzZXQiLCJyYW5nZSIsImRhdGFUeXBlV0dTTCIsImRhdGFTdHJ1Y3RXZ3NsIiwic291cmNlQXJyYXlTaXplIiwid2ViR1BVUHJvY2Vzc0luZm8iLCJzdXBwSW5mb1dnc2wiLCJpbmZvIiwiZmlsdGVyIiwid2dzbCIsIm5lZWRzRHVtbXkiLCJ0cmltIiwiZGF0YVdnc2wiLCJudW1PZlRocmVhZHMiLCJzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkIiwiY29tYmluZWRDb21wbGV4aXR5IiwibWF4SXRlcmF0aW9uc1BlclRocmVhZCIsIndvcmtncm91cHNEaW0iLCJzcXJ0IiwiZ2xvYmFsVGhyZWFkRGltU2l6ZSIsImNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSIsImRtQ2h1bmtTaXplUGVyVGhyZWFkIiwibW9kdWxlIiwiY3JlYXRlU2hhZGVyTW9kdWxlIiwibGFiZWwiLCJjb2RlIiwiZ2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdCIsInBpcGVsaW5lIiwiY3JlYXRlQ29tcHV0ZVBpcGVsaW5lIiwibGF5b3V0IiwiY29tcHV0ZSIsImVudHJ5UG9pbnQiLCJzdGFydEF0Q29scyIsInN0YXJ0QXRSb3dzIiwiZW5kQXRDb2xzIiwiZW5kQXRSb3dzIiwiY2h1bmtTaXplIiwiZmxvb3IiLCJzdGFydFJvdyIsInN0YXJ0Q29sIiwidGltZSIsImVuZElkeCIsImVuZFJvdyIsImVuZENvbCIsInRpbWVFbmQiLCJjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSIsInN1cHBJbmZvQnVmZmVyMzJTaXplIiwic3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplIiwiY29tcHV0ZUluZm9CdWZmZXJTaXplIiwiQllURVNfUEVSX0VMRU1FTlQiLCJwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUiLCJyZW1haW5kZXIiLCJjb21wdXRlSW5mb0J1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsInNpemUiLCJ1c2FnZSIsIkdQVUJ1ZmZlclVzYWdlIiwiU1RPUkFHRSIsIkNPUFlfU1JDIiwiQ09QWV9EU1QiLCJtYXBwZWRBdENyZWF0aW9uIiwibWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciIsImdldE1hcHBlZFJhbmdlIiwiY29tcHV0ZUluZm9PZmZTZXQiLCJBcnJheUNvbnN0cnVjdG9yIiwidW5tYXAiLCJzdXBwSW5mb0J1ZmZlclNpemUiLCJwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUiLCJzdXBwSW5mb1JlbWFpbmRlciIsIm1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIiLCJzdXBwSW5mb09mZlNldCIsImJ5dGVMZW5ndGgiLCJyZXN1bHRzQnVmZmVyU2l6ZSIsInBhZGRlZFJlc3VsdHNCdWZmZXJTaXplIiwicmVzdWx0c1JlbWFpbmRlciIsInJlc3VsdHNCdWZmZXIiLCJiaW5kR3JvdXAiLCJjcmVhdGVCaW5kR3JvdXAiLCJnZXRCaW5kR3JvdXBMYXlvdXQiLCJlbnRyaWVzIiwiYmluZGluZyIsInJlc291cmNlIiwiYnVmZmVyIiwicmVzdWx0c091dEJ1ZmZlciIsIk1BUF9SRUFEIiwicmVzdWx0SXMiLCJyZXN1bHRKcyIsInJlc3VsdERpc3RhbmNlcyIsImlzQWxsRG9uZSIsImVuY29kZXIiLCJjcmVhdGVDb21tYW5kRW5jb2RlciIsInBhc3MiLCJiZWdpbkNvbXB1dGVQYXNzIiwic2V0UGlwZWxpbmUiLCJzZXRCaW5kR3JvdXAiLCJkaXNwYXRjaFdvcmtncm91cHMiLCJlbmQiLCJjb3B5QnVmZmVyVG9CdWZmZXIiLCJjb21tYW5kQnVmZmVyIiwiZmluaXNoIiwicXVldWUiLCJzdWJtaXQiLCJvblN1Ym1pdHRlZFdvcmtEb25lIiwibWFwQXN5bmMiLCJHUFVNYXBNb2RlIiwiUkVBRCIsInJlc3VsdHNPdXRBcnJheUJ1ZmZlciIsInJlc3VsdE9mZnNldCIsInJlc3VsdHNJIiwicmVzdWx0c0oiLCJyZXN1bHRzRGlzdGFuY2VzIiwicmVzdWx0c0ZvdW5kIiwiZXZlcnkiLCJkIiwidG90YWxSZXN1bHRzIiwiY29tYmluZWRJIiwiY29tYmluZWRKIiwiY29tYmluZWREaXN0YW5jZXMiLCJjb21iaW5lZE9mZnNldCIsInJlc0kiLCJmb3VuZCIsInN1YmFycmF5IiwicHVzaCIsInRvdGFsU2l6ZSIsImZpbmFsSSIsImZpbmFsSiIsImZpbmFsRGlzdGFuY2VzIiwiZmluYWxPZmZzZXQiLCJkZXN0cm95IiwiaiIsImRpc3RhbmNlIiwibWF4RW50cnlMZW5zIiwiYWdncmVnYXRpb24iLCJfIiwiYXN5bmMiLCJiaW9MYXlvdXQiLCJjbHVzdGVyIiwic3BhcnNlT2JqZWN0IiwiaXMiLCJqcyIsImVtYmVkWCIsInJhbmRvbSIsImVtYmVkWSIsInhWZWxvY2l0aWVzIiwieVZlbG9jaXRpZXMiLCJ0ZW1wZXJhdHVyZSIsImlkeCIsImR4IiwiZHkiLCJhYnMiLCJ2ZWNTaXplIiwibWluWCIsIm1pblkiLCJtYXhYIiwibWF4WSIsInJhbmdlWCIsInJhbmdlWSIsImdldExheW91dEVtYmVkZGluZ3MiLCJzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UiLCJrbm5TaW1pbGFyaXRpZXMiLCJvZmZzZXRzIiwiblJvd3MiLCJuZWVkZWRUaHJlYWRzIiwibmVlZGVkV29ya0dyb3VwcyIsIndvcmtHcm91cFRocmVhZHNQZXJEaW0iLCJ3b3JrR3JvdXBEaW0iLCJ0aHJlYWRzUGVyRGltIiwic2ltbWlsYXJpdGllc0J1ZmZlciIsIm9mZnNldHNCdWZmZXIiLCJjb21tYW5kRW5jb2RlciIsInBhc3NFbmNvZGVyIiwib3V0U2ltaWxhcml0eUJ1ZmZlciIsImFycmF5QnVmZmVyIiwiaW5mbGF0ZSIsImZhY3RvciIsInBvdyIsImV4cGFuZE5vUmV2aXZlIiwia25uSW5kZXhlcyIsIm9yZGVyIiwibG9nMTAiLCJwcnVuZVZhbHVlIiwib3V0S05OU2ltaWxhcml0aWVzIiwic3BhcnNlS05OQnVmZmVyQnl0ZVNpemUiLCJzcGFyc2VLTk5CdWZmZXIiLCJzcGFyc2VLTk5BcnJheUJ1ZmZlciIsInJvd0luZGV4ZXMiLCJyZXMiLCJnZXRSb3dJbmRleGVzIiwic3RhcnRCdWZmZXIiLCJyZXN1bHRCbG9ja0J1ZmZlciIsIm91dEJsb2NrQnVmZmVyIiwic3RhcnQiLCJjdXJMZW5ndGgiLCJ3cml0ZUJ1ZmZlciIsIm91dEJsb2NrIiwiS05OSW5kZXhlcyIsIktOTlNpbWlsYXJpdGllcyIsImluZGV4T2Zmc2V0cyIsInRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0iLCJzcGFyc2VNYXRyaXgiLCJvY2N1cmVuY2VDb3VudCIsImNvdW50T2NjdXJhbmNlc0FkZExvb3BzIiwib2Zmc2V0Rm9ybSIsImFyIiwiaW5zZXJ0Q291bnRlciIsInJvdyIsImNvbCIsInNpbWlsYXJpdHkiLCJwcm90b3R5cGUiLCJ0b1N0cmluZyIsImRlZmF1bHRNQ0xPcHRpb25zIiwiZXhwYW5kRmFjdG9yIiwibWF4SXRlcmF0aW9ucyIsImluZmxhdGVGYWN0b3IiLCJtdWx0RmFjdG9yIiwiTUNMU3BhcnNlUmVkdWNlciIsImNvbnN0cnVjdG9yIiwib3B0cyIsIl9vcHRpb25zIiwidG9PYmplY3RGb3JtIiwiYWRkTG9vcHMiLCJub3JtYWxpemUiLCJleHBhbmQiLCJjbHVzdGVycyIsImFzc2lnbkNsdXN0ZXJzIiwiY29ycmVjdENsdXN0ZXJzIiwiZW1iZWRkaW5ncyIsInRyYW5zZm9ybSIsIm1jbFJlcyIsInNwYXJzZUtOTkZvcm0iLCJleHBhbmRSZXMiLCJtYXJrb3ZDbHVzdGVyV2ViR1BVIiwiY3NyVG9TcGFyc2VPYmplY3QiLCJjbHVzdGVyU2l6ZU1hcCIsInNvcnRlZEluZGV4ZXMiLCJOdW1iZXIiLCJzb3J0IiwiY2x1c3Rlck1hcCIsImNsdXN0ZXJJZHgiLCJtaW5PcmRlciIsImsiLCJjbHVzdGVyTnVtIiwic29ydGVkQ2x1c3Rlck5hbWVzIiwicGVyUm93IiwieU9mZnNldCIsImNsdXN0ZXJOYW1lIiwib2Zmc2V0WCIsIm1lcmdlQ2x1c3RlcnMiLCJpQ2x1c3RlciIsImpDbHVzdGVyIiwicm91bmQiLCJhc3NpZ25DbHVzdGVyc0NTUiIsImNvcnJlY3RlZE9mZnNldHMiLCJvZmZzZXRDb3VudGVyIiwic3VtIiwiZXhwYW5kZWRPYmplY3QiLCJ2YWwiLCJnZXRFeHBhbmRWYWx1ZSIsImN1cnJlbnRJbmRleGVzIiwib3RoZXJJbmRleGVzIiwib25tZXNzYWdlIiwiZXZlbnQiLCJkYXRhIiwiYWdncmVnYXRpb25NZXRob2QiLCJkaXN0YW5jZUZuQXJncyIsImRpc3RhbmNlRm5zIiwidXNlV2ViR1BVIiwic3BhcnNlIiwiY2FsY011bHRpQ29sdW1uIiwicmVkdWNlciIsInRyYW5zZm9ybVdlYkdQVSIsInBvc3RNZXNzYWdlIiwiaXNOaWwiLCJ4IiwiaW5zZXJ0U21hbGxlciIsImRpc3RhbmNlc0FyIiwiaW5kZXhlcyIsIm51bSIsImluZGV4IiwibmV3UG9zaXRpb24iLCJmaW5kSW5kZXgiLCJ2IiwicG9wIiwic3BsaWNlIiwiX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsIm1vZHVsZUlkIiwiY2FjaGVkTW9kdWxlIiwidW5kZWZpbmVkIiwiZXhwb3J0cyIsIl9fd2VicGFja19tb2R1bGVzX18iLCJtIiwiX193ZWJwYWNrX2V4cG9ydHNfXyIsIk8iLCJjaHVua0lkcyIsImZuIiwicHJpb3JpdHkiLCJub3RGdWxmaWxsZWQiLCJJbmZpbml0eSIsImRlZmluaXRpb24iLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJlbnVtZXJhYmxlIiwiZ2V0IiwiZiIsImNodW5rSWQiLCJhbGwiLCJwcm9taXNlcyIsInUiLCJnIiwiZ2xvYmFsVGhpcyIsIkZ1bmN0aW9uIiwid2luZG93Iiwib2JqIiwicHJvcCIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNjcmlwdFVybCIsImltcG9ydFNjcmlwdHMiLCJsb2NhdGlvbiIsImRvY3VtZW50IiwiY3VycmVudFNjcmlwdCIsInNyYyIsInNjcmlwdHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInJlcGxhY2UiLCJwIiwic2VsZiIsImluc3RhbGxlZENodW5rcyIsImNodW5rTG9hZGluZ0dsb2JhbCIsInBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uIiwiYmluZCIsIm1vcmVNb2R1bGVzIiwicnVudGltZSJdLCJzb3VyY2VSb290IjoiIn0=