@datagrok/peptides 1.17.19 → 1.17.21

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/748.js DELETED
@@ -1,2 +0,0 @@
1
- var peptides;(()=>{"use strict";var e,n={m:{},u:e=>e+".js"};n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;n.g.importScripts&&(e=n.g.location+"");var t=n.g.document;if(!e&&t&&(t.currentScript&&(e=t.currentScript.src),!e)){var r=t.getElementsByTagName("script");if(r.length)for(var a=r.length-1;a>-1&&!e;)e=r[a--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),n.p=e})(),n.b=self.location+"",function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(e||(e={}));const t={[e.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[e.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var r;!function(e){e.HAMMING="Hamming",e.EUCLIDEAN="Euclidean",e.MANHATTAN="Manhattan",e.TANIMOTO="Tanimoto",e.LEVENSTEIN="Levenshtein",e.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",e.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",e.SOKAL="Sokal",e.COSINE="Cosine",e.ASYMMETRIC="Asymmetric",e.Difference="Difference",e.OneHot="One-Hot"}(r||(r={}));const a={[r.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[r.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[r.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[r.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[r.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[r.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[r.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[r.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[r.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[r.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[r.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[r.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},i={[r.HAMMING]:e=>Math.ceil(e/30),[r.EUCLIDEAN]:e=>Math.ceil(e/30),[r.MANHATTAN]:e=>Math.ceil(e/30),[r.TANIMOTO]:e=>Math.ceil(e/60),[r.SOKAL]:e=>Math.ceil(e/60),[r.COSINE]:e=>Math.ceil(e/60),[r.ASYMMETRIC]:e=>Math.ceil(e/60),[r.LEVENSTEIN]:e=>Math.ceil(e*e/60),[r.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[r.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[r.Difference]:e=>1,[r.OneHot]:e=>Math.ceil(e/40)},o={STRING:new Set([r.HAMMING,r.LEVENSTEIN,r.NEEDLEMAN_WUNSCH,r.MONOMER_CHEMICAL_DISTANCE,r.OneHot]),UINT32ARRAY:new Set([r.HAMMING,r.EUCLIDEAN,r.MANHATTAN,r.MONOMER_CHEMICAL_DISTANCE,r.LEVENSTEIN,r.NEEDLEMAN_WUNSCH,r.TANIMOTO,r.COSINE,r.SOKAL,r.ASYMMETRIC,r.OneHot,r.Difference]),INT32ARRAY:new Set([r.EUCLIDEAN,r.MANHATTAN,r.OneHot,r.Difference]),FLOAT32ARRAY:new Set([r.EUCLIDEAN,r.MANHATTAN,r.Difference]),NUMBER:new Set([r.EUCLIDEAN,r.MANHATTAN,r.Difference]),BITARRAY:new Set([r.TANIMOTO,r.COSINE,r.SOKAL,r.ASYMMETRIC])};var s=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{l(r.next(e))}catch(e){i(e)}}function s(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}l((r=r.apply(e,n||[])).next())}))};let l=null,u=null;function f(){return s(this,void 0,void 0,(function*(){if(!l&&(l=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==l))return null;let e=!1;if(u&&(u.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!u||e){const e=1e9,n=l.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return u=yield l.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),u}catch(e){return console.error("Failed to create device with required limits",e),u=yield l.requestDevice(),u}}return u}))}var c,d;function h(n,t=.8,a,s,l,u){return c=this,d=void 0,p=function*(){const c=yield f();if(!c)return null;const d=Object.values(r);if(a.some((e=>!d.includes(e))))throw new Error("Invalid distance metrics provided: "+a.join(", "));if(!Object.values(e).includes(s))throw new Error("Invalid aggregation function provided: "+s);const h=1-t;if(u.length!==n.length||u.length!==a.length||u.length!==l.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(n.some((e=>e.length!==n[0].length)))throw new Error("All entry lists must be the same length");const p=n.length,g=n[0].length,y=n.map(((e,n)=>function(e,n=r.HAMMING,t,a={gapOpenPenalty:1,gapExtensionPenalty:.6}){var s,l;let u=null;const f=e.some((e=>"string"==typeof e))?(u="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(u="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(u="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(u="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(u="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(u="INT32ARRAY",e):void 0;if(!f||!u)throw new Error("Invalid entry type, could not determine entry type from input list");const c=f[0]instanceof Int32Array?"INT32ARRAY":f[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",d=new Uint32Array(f.map((e=>e.length)));if(!o[u]||!o[u].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${u}'`);const h=d.reduce(((e,n)=>Math.max(e,n)),0),m=i[n](h),p="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new p(f.length*h);f.forEach(((e,n)=>{g.set(e,n*h)}));let y="",w=0,A="FLOAT32ARRAY",b=null;if(n===r.NEEDLEMAN_WUNSCH||n===r.MONOMER_CHEMICAL_DISTANCE){let e=a.scoringMatrix&&a.alphabetIndexes?Object.keys(a.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!a.alphabetIndexes||!a.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);a.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),a.alphabetIndexes={};for(let e=0;e<a.scoringMatrix.length;e++)a.scoringMatrix[e][e]=1,a.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),r=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)r[n][n]=1;const i=a.alphabetIndexes;for(const e of Object.keys(i))for(const n of Object.keys(i))e!==n&&(r[e.charCodeAt(0)][n.charCodeAt(0)]=a.scoringMatrix[i[e]][i[n]]);w=2+n,A="FLOAT32ARRAY",b=new Float32Array(w),b[0]=null!==(s=a.gapOpenPenalty)&&void 0!==s?s:1,b[1]=null!==(l=a.gapExtensionPenalty)&&void 0!==l?l:.6;let o=2;for(let e=0;e<r.length;e++)b.set(r[e],o),o+=r[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===r.Difference){if(!a.range||"number"!=typeof a.range||a.range<=0){const e=g.reduce(((e,n)=>Math.min(e,n)),g[0]),n=g.reduce(((e,n)=>Math.max(e,n)),g[0]);a.range=n-e}a.range<=0&&(a.range=1),w=1,A="FLOAT32ARRAY",b=new Float32Array([a.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",I=`data${t}: array<array<${x}, ${h}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:h,arraySizes:d,complexity:m,suppInfoBuffer:b,suppInfoSize:w,suppInfoType:A,suppInfoStructWgsl:y,entryType:u,dataTypeWGSL:x,dataStructWgsl:I,EncodedArrayConstructor:p}}(e,a[n],n,u[n])));if(0===p)throw new Error("No columns provided. Please provide at least one column of data.");1===p&&(s=e.MANHATTAN);let w=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),A=!1;w&&""!=w.trim()||(A=!0,w="\ndummy: f32\n");const b=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(p*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const I=1e4,E=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),C=10*v,B=g*(g-1)/2,S=Math.ceil(B/I),U=c.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${S} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${g}>, ${p}>,\n // the weights for each entry\n weights: array<f32, ${p}>,\n // the data for each entry\n ${b} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${w}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${A?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${C} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${g}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${g}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${h}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${g}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(a,y.map((e=>e.maxEntryLen)),h,s)}\n\n\n `}),L=c.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:U,entryPoint:"calcSparseMatrix"}}),P=new Uint32Array(I),T=new Uint32Array(I),R=new Uint32Array(I),O=new Uint32Array(I),_=Math.floor(B/I);let k=0,D=1;console.time("GPUthreadStarts");for(let e=0;e<I;e++){const n=9999===e?B-1:(e+1)*_,t=g-2-Math.floor(Math.sqrt(-8*n+4*g*(g-1)-7)/2-.5),r=n-g*t+Math.floor((t+1)*(t+2)/2);P[e]=D,T[e]=k,R[e]=r,O[e]=t,k=t,D=r}console.timeEnd("GPUthreadStarts");const j=4e4+g*p+p+y.reduce(((e,n)=>e+n.sourceArraySize),0),$=y.reduce(((e,n)=>e+n.suppInfoSize),0),G=1e6,z=j*Uint32Array.BYTES_PER_ELEMENT;let Y=z;const F=15&z;0!==F&&(Y+=16-F);const H=c.createBuffer({label:"compute info buffer",size:Y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),K=H.getMappedRange();let W=0;new Uint32Array(K,W,I).set(P),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(T),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(R),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,I).set(O),W+=I*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,p).set(l),W+=p*Float32Array.BYTES_PER_ELEMENT;for(const e of y){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(K,W,t).set(e.flatSourceArray),W+=t*n.BYTES_PER_ELEMENT}H.unmap();const q=$*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const J=c.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),Q=J.getMappedRange();let Z=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(Q,Z,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Z+=e.suppInfoBuffer.byteLength);0===Z&&new Uint32Array(Q,0,4).set([1,1,1,1]),J.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15&ee;0!==te&&(ne+=16-te);const re=c.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=c.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:L.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:J}},{binding:2,resource:{buffer:re}}]}),ie=c.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],le=[];let ue=!1;for(;!ue;){const e=c.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(L),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();c.queue.submit([t]),yield c.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,G);a+=G*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,G);a+=G*Float32Array.BYTES_PER_ELEMENT;const l=new Uint32Array(r,a,I);a+=I*Uint32Array.BYTES_PER_ELEMENT,ue=new Uint32Array(r,a,I).every((e=>1===e));const u=l.reduce(((e,n)=>e+n),0),f=new Uint32Array(u),d=new Uint32Array(u),h=new Float32Array(u);let m=0;for(let e=0;e<l.length;e++){const n=l[e];0!==n&&(f.set(i.subarray(e*E,e*E+n),m),d.set(o.subarray(e*E,e*E+n),m),h.set(s.subarray(e*E,e*E+n),m),m+=n)}oe.push(f),se.push(d),le.push(h),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),he=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),he.set(le[e],me),me+=oe[e].length;return H.destroy(),J.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:he}},new((h=void 0)||(h=Promise))((function(e,n){function t(e){try{a(p.next(e))}catch(e){n(e)}}function r(e){try{a(p.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof h?a:new h((function(e){e(a)}))).then(t,r)}a((p=p.apply(c,d||[])).next())}));var c,d,h,p}function m(e,n,r,i){return e.map(((e,t)=>`\n fn distanceScript${t}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${t}[aIndex];\n let b = computeInfo.data${t}[bIndex];\n let maxDistance: f32 = ${r};\n ${a[e](n[t],t)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${t[i](e.length)}\n }\n \n `}(d=c||(c={})).EUCLIDEAN="EUCLIDEAN",d.MANHATTAN="MANHATTAN";const p=e=>null==e;function g(e,n,t,r){if(t>e[e.length-1])return;const a=e.findIndex((e=>t<e));e.pop(),e.splice(a,0,t),n.pop(),n.splice(a,0,r)}class y{constructor(){this._workerCount=Math.max(navigator.hardwareConcurrency-2,1)}async calcMultiColumn(e,t,r,a=[{}],i=[1],o=c.EUCLIDEAN){const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=e[0].length>2e4?await this.getMinimalThreshold(e,t,a,i,o):0;r<u&&(console.log(`using threshold ${u}`),r=u),a.forEach(((e,n)=>a[n].threshold=r));const f=new Array(this._workerCount),d=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(23),n.b))));for(let n=0;n<this._workerCount;n++)f[n]=new Promise(((u,f)=>{const c=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=c&&u({i:new Int32Array(0),j:new Int32Array(0),distance:new Float32Array(0),idx:n}),d[n].postMessage({values:e,startIdx:c,endIdx:h,threshold:r,fnNames:t,opts:a,weights:i,aggregationMethod:o}),d[n].onmessage=({data:{error:e,i:t,j:r,distance:a}})=>{e?(d[n].terminate(),f(e)):(d[n].terminate(),u({i:t,j:r,distance:a,idx:n}))}}));const h=await Promise.all(f),m=h.reduce(((e,n)=>e+n.i.length),0),p=new Int32Array(m),g=new Int32Array(m),y=new Float32Array(m);let w=0;for(const e of h)p.set(e.i,w),g.set(e.j,w),y.set(e.distance,w),w+=e.i.length;return{i:p,j:g,distance:y}}async calc(e,n,t,r={}){return await this.calcMultiColumn([e],[n],t,[r],[1])}async getKNN(e,n,t=15,r={}){return await this.multiColumnKNN([e],[n],t,[r],[1])}async getThresholdKNN(e,n,t=.8,r={}){return await this.multiColumnThresholdKnn([e],[n],t,[r],[1])}async multiColumnThresholdKnn(e,t,r=.8,a,i,o=c.EUCLIDEAN){if(e.length!==t.length||e.length!==a.length||e.length!==i.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=new Array(this._workerCount),f=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(427),n.b))));for(let n=0;n<this._workerCount;n++)u[n]=new Promise(((u,c)=>{const d=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=d&&u({knnDistances:new Array(0),knnIndexes:new Array(0)}),f[n].postMessage({values:e,startIdx:d,endIdx:h,fnNames:t,opts:a,threshold:r,weights:i,aggregationMethod:o}),f[n].onmessage=({data:{error:e,knnDistances:t,knnIndexes:r}})=>{e?(f[n].terminate(),c(e)):(f[n].terminate(),u({knnDistances:t,knnIndexes:r}))}}));const d=await Promise.all(u),h=new Int32Array(e[0].length);for(const n of d)for(let t=0;t<e[0].length;++t)h[t]+=n.knnIndexes[t]?.length??0;const m={knnDistances:new Array(e[0].length).fill(null).map(((e,n)=>new Array(h[n]))),knnIndexes:new Array(e[0].length).fill(null).map(((e,n)=>new Array(h[n])))};for(const n of d)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)m.knnDistances[t][h[t]-1]=n.knnDistances[t][e],m.knnIndexes[t][h[t]-1]=n.knnIndexes[t][e],h[t]-=1;return m}async multiColumnKNN(e,t,r=15,a,i,o=c.EUCLIDEAN){if(e.length!==t.length||e.length!==a.length||e.length!==i.length)throw new Error("values, distance functions, options and weights arrays should have the same length");if(e.some((n=>n.length!==e[0].length)))throw new Error("all values arrays should have the same length");const s=e[0].length*(e[0].length-1)/2,l=Math.floor(s/this._workerCount),u=new Array(this._workerCount),f=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(282),n.b))));for(let n=0;n<this._workerCount;n++)u[n]=new Promise(((u,c)=>{const d=n*l,h=n===this._workerCount-1?s:(n+1)*l;h<=d&&u({knnDistances:new Array(0),knnIndexes:new Array(0)}),f[n].postMessage({values:e,startIdx:d,endIdx:h,fnNames:t,opts:a,nNeighbours:r,weights:i,aggregationMethod:o}),f[n].onmessage=({data:{error:e,knnDistances:t,knnIndexes:r}})=>{e?(f[n].terminate(),c(e)):(f[n].terminate(),u({knnDistances:t,knnIndexes:r}))}}));const d=await Promise.all(u),h={knnDistances:new Array(e[0].length).fill(null).map((()=>new Array(r).fill(99999))),knnIndexes:new Array(e[0].length).fill(null).map((()=>new Array(r).fill(-1)))};for(const n of d)for(let t=0;t<e[0].length;++t)for(let e=0;e<n.knnDistances[t]?.length;++e)g(h.knnDistances[t],h.knnIndexes[t],n.knnDistances[t][e],n.knnIndexes[t][e]);return h}async getSampleDistances(e,t,r=[],a,i=c.EUCLIDEAN){const o=new Array(this._workerCount).fill(null).map((()=>new Worker(new URL(n.p+n.u(40),n.b))));try{const n=e[0].length*(e[0].length-1)/2,s=Math.floor(n/this._workerCount),l=1e6,u=Math.max(Math.min(n/1e3,l),Math.min(n,l)),f=Math.floor(u/this._workerCount),c=new Array(this._workerCount);for(let l=0;l<this._workerCount;l++)c[l]=new Promise(((u,c)=>{const d=l*s,h=l===this._workerCount-1?n:(l+1)*s;o[l].postMessage({values:e,startIdx:d,endIdx:h,sampleLength:f,fnNames:t,opts:r,weights:a,aggregationMethod:i}),o[l].onmessage=({data:{error:e,distance:n}})=>{o[l].terminate(),e?c(e):u({distance:n})}}));const d=await Promise.all(c),h=d.reduce(((e,n)=>e+n.distance.length),0),m=new Float32Array(h);let p=0;for(const e of d)m.set(e.distance,p),p+=e.distance.length;return m.sort(),m}catch(e){return o?.forEach((e=>e?.terminate())),console.error(e),new Float32Array(1).fill(.5)}}async getMinimalThreshold(e,n,t=[],r,a=c.EUCLIDEAN){try{const i=e.length*(e.length-1)/2,o=await this.getSampleDistances(e,n,t,r,a);return 1-o[Math.floor(7e7/i*o.length)]}catch(e){return console.error(e),.5}}static calcSync(e,n,t,r){const a=[],i=[],o=[];let s=0,l=0,u=0;const f=e.length*(e.length-1)/2;for(;s<f;){const n=p(e[l])||p(e[u])?1:t(e[l],e[u]);1-n>=r&&(a.push(l),i.push(u),o.push(n)),s++,u++,u===e.length&&(l++,u=l+1)}return{i:new Int32Array(a),j:new Int32Array(i),distance:new Float32Array(o)}}}async function w(e,n,t){const r=e.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=e[o],l=e[s];n[r]?.[l]>=t&&(a.push(o),i.push(s))}return function(e,n,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const l=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],u=n[t],f=r[s]-r[u],c=a[s]-a[u];Math.abs(f)>=1&&(i[s]-=l*f,i[u]+=l*f),Math.abs(c)>=1&&(o[s]-=l*c,o[u]+=l*c)}for(let e=0;e<t.length;e++){const n=Math.sqrt(i[e]*i[e]+o[e]*o[e]);n>0&&(r[e]+=i[e]/n*l,a[e]+=o[e]/n*l)}}let s=r[0],l=a[0],u=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),l=Math.min(l,a[e]),u=Math.max(u,r[e]),f=Math.max(f,a[e]);let c=u-s,d=f-l;0===c&&(c=u);for(let e=0;e<t.length;e++)r[e]=(r[e]-s)/c/2+.5;0===d&&(d=f);for(let e=0;e<t.length;e++)a[e]=(a[e]-l)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}function A(e,n,t,r){return a=this,i=void 0,s=function*(){const a=r,i=Math.ceil(a/100),o=Math.ceil(Math.sqrt(i)),s=10*o,l=e.createShaderModule({label:"colwise-normalize",code:`\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(10, 10) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${s} + col;\n if (index >= ${r}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `}),u=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:l,entryPoint:"normalize"}}),f=e.createBuffer({label:"simmilarities info buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Float32Array(f.getMappedRange()).set(n),f.unmap();const c=e.createBuffer({label:"offsets info buffer",size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(c.getMappedRange()).set(t),c.unmap();const d=e.createBindGroup({layout:u.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),h=e.createCommandEncoder(),m=h.beginComputePass();m.setPipeline(u),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const p=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});h.copyBufferToBuffer(f,0,p,0,n.byteLength),e.queue.submit([h.finish()]),yield e.queue.onSubmittedWorkDone(),yield p.mapAsync(GPUMapMode.READ);const g=new Float32Array(p.getMappedRange());n.set(g),p.unmap(),f.destroy(),c.destroy(),p.destroy()},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{l(s.next(e))}catch(e){n(e)}}function r(e){try{l(s.throw(e))}catch(e){n(e)}}function l(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}l((s=s.apply(a,i||[])).next())}));var a,i,o,s}function b(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function x(e,n,t,r,a){return i=this,o=void 0,l=function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),l=10*s,u=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-u),c=new Float32Array(n.length),d=e.createShaderModule({label:"expand",code:`\n struct SparseKNN {\n knnSimilarities: array<f32, ${n.length}>,\n knnIndexes: array<u32, ${t.length}>,\n offsets: array<u32, ${r.length}>,\n rowIndexes: array<u32, ${t.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, 90000>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(10, 10) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${l} + col;\n if (index >= 90000) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${t.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${f}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `}),h=e.createComputePipeline({label:"expand compute pipeline",layout:"auto",compute:{module:d,entryPoint:"expand"}});let m=4*(n.length+t.length+r.length+t.length);const p=15&m;0!==p&&(m+=16-p);const g=e.createBuffer({label:"sparse knn buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),y=g.getMappedRange();new Float32Array(y,0,n.length).set(n),new Uint32Array(y,4*n.length,t.length).set(t),new Uint32Array(y,4*(n.length+t.length),r.length).set(r);const w=function(e){const n=new Uint32Array(e[e.length-1]);for(let t=0;t<e.length-1;t++)for(let r=e[t];r<e[t+1];r++)n[r]=t;return n}(r);new Uint32Array(y,4*(n.length+t.length+r.length),w.length).set(w),g.unmap();const A=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(A.getMappedRange()).set([0]),A.unmap();const b=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:h.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:b}},{binding:2,resource:{buffer:A}}]}),I=e.createBuffer({label:"out block buffer",size:b.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let n=0;n<Math.ceil(t.length/i);n++){const r=n*i,a=Math.min(i,t.length-r);e.queue.writeBuffer(A,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),l=o.beginComputePass({label:"expand compute pass"});l.setPipeline(h),l.setBindGroup(0,x),l.dispatchWorkgroups(s,s),l.end(),o.copyBufferToBuffer(b,0,I,0,I.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield I.mapAsync(GPUMapMode.READ);const u=new Float32Array(I.getMappedRange(),0,a);c.set(u,r),I.unmap()}return g.destroy(),A.destroy(),b.destroy(),I.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{a(l.next(e))}catch(e){n(e)}}function r(e){try{a(l.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof s?a:new s((function(e){e(a)}))).then(t,r)}a((l=l.apply(i,o||[])).next())}));var i,o,s,l}function I(e,n){const t=function(e,n){const t=new Uint32Array(n);for(let n=0;n<e.i.length;n++)t[e.i[n]]++,t[e.j[n]]++;for(let e=0;e<n;e++)t[e]++;return t}(e,n),r=function(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}(t),a=new Uint32Array(n).fill(1),i=new Uint32Array(2*e.i.length+n),o=new Float32Array(2*e.i.length+n);for(let e=0;e<n;e++)i[r[e]]=e,o[r[e]]=1;for(let n=0;n<e.i.length;n++){const t=e.i[n],s=e.j[n],l=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=l,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=l,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const E={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class M{constructor(e={}){this._options={...E,...e}}async transform(e,n){let t=this.toObjectForm(e);if(this._options.maxIterations>0){this.addLoops(t,n),this.normalize(t);for(let e=0;e<this._options.maxIterations;e++)t=this.expand(t,n),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,n);this.correctClusters(r);const o=await this.layout(r,t,n);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}async transformWebGPU(e,n){if(0===this._options.maxIterations)return this.transform(e,n);const t=await function(e,n,t=5,r=2){return a=this,i=void 0,s=function*(){const a=yield f();if(!a)throw new Error("no gpu device found");const i=I(e,n);yield A(a,i.KNNSimilarities,i.indexOffsets,n);let o=i;for(let e=0;e<t;e++){const e=yield x(a,o.KNNSimilarities,o.KNNIndexes,o.indexOffsets,n);b(e.KNNSimilarities,r),yield A(a,e.KNNSimilarities,e.indexOffsets,n),o=e}return o},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{l(s.next(e))}catch(e){n(e)}}function r(e){try{l(s.throw(e))}catch(e){n(e)}}function l(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}l((s=s.apply(a,i||[])).next())}));var a,i,o,s}(e,n,this._options.maxIterations,this._options.inflateFactor),r=this.csrToSparseObject(t,n),{clusters:a,is:i,js:o}=this.assignClusters(r,n);this.correctClusters(a);const s=await this.layout(a,r,n);return{clusters:a,embedX:s.embedX,embedY:s.embedY,is:i,js:o}}correctClusters(e){const n={};for(const t of e)n[t]||(n[t]=0),n[t]++;const t=Object.keys(n).map(Number).sort(((e,t)=>n[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 l=6,u=0;for(const e of s){const t=i[e],s=await w(t,n,.001);o===Math.ceil(l/1.5)&&(o=0,u+=5/l,l=Math.ceil(1.5*l));const f=o%l*5/l*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/l+f,a[t[e]]=5*s.embedY[e]/l+u;o++}return{embedX:r,embedY:a}}mergeClusters(e,n,t){const r=e[n],a=e[t];for(let n=0;n<e.length;n++)e[n]===a&&(e[n]=r)}assignClusters(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=Math.pow(10,i),s=new Array(n).fill(-1);for(const n of Object.keys(e))for(const i of Object.keys(e[n]))Math.round(e[n][i]*o)/o>0&&e[n][i]!==Number(n)&&Number(i)>Number(n)&&(r.push(Number(n)),a.push(Number(i)),-1!==s[Number(n)]&&-1!==s[Number(i)]?s[Number(n)]!==s[Number(i)]&&this.mergeClusters(s,Number(n),Number(i)):-1!==s[Number(n)]?s[Number(i)]=s[Number(n)]:-1!==s[Number(i)]?s[Number(n)]=s[Number(i)]:(t++,s[Number(n)]=t,s[Number(i)]=t));for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}assignClustersCSR(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=1/Math.pow(10,i),s=new Array(n).fill(-1),l=new Uint32Array(n+1);let u=0;l[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const l=e.KNNIndexes[n];l<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(l),u++,-1!==s[i]&&-1!==s[l]?s[i]!==s[l]&&this.mergeClusters(s,i,l):-1!==s[i]?s[l]=s[i]:-1!==s[l]?s[i]=s[l]:(t++,s[i]=t,s[l]=t))}l[i+1]=u}for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a),correctedOffsets:l}}toObjectForm(e){const n={};for(let t=0;t<e.i.length;t++)n[e.i[t]]||(n[e.i[t]]={}),n[e.i[t]][e.j[t]]=1-e.distance[t],n[e.j[t]]||(n[e.j[t]]={}),n[e.j[t]][e.i[t]]=1-e.distance[t];return n}addLoops(e,n){for(let t=0;t<n;t++)e[t]||(e[t]={}),e[t][t]=this._options.multFactor}normalize(e){for(const n of Object.keys(e)){const t=e[n];let r=0;for(const e of Object.keys(t))r+=t[e];if(0!==r)for(const a of Object.keys(t))e[n][a]/=r}}expand(e,n){const t={},r=Math.floor(Math.max(Math.log10(n),2))+1,a=Math.pow(10,r);for(let r=0;r<n;r++)if(e[r]){t[r]??(t[r]={});for(let i=r;i<n;i++){if(!e[r]?.[i])continue;const n=this.getExpandValue(e,r,i);Math.round(n*a)/a>0&&(t[r][i]=n,t[i]||(t[i]={}),t[i][r]=n)}}return t}inflate(e){for(const n of Object.keys(e)){const t=e[n];for(const r of Object.keys(t))e[n][r]=Math.pow(e[n][r],this._options.inflateFactor)}}getExpandValue(e,n,t){let r=0;const a=Object.keys(e[n]??{}),i=Object.keys(e[t]??{});for(const o of a)i.includes(o)&&(r+=e[n][o]*e[t][o]);return r}}onmessage=async e=>{const{data:n,threshold:t,weights:r,aggregationMethod:a,distanceFnArgs:i,distanceFns:o,maxIterations:s,useWebGPU:l,inflate:u}=e.data;console.time("sparse matrix");let f=null;if(l)try{f=await h(n,t/100,o,a,r,i)}catch(e){console.error(e)}f||(l&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),f=await(new y).calcMultiColumn(n,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const c=new M({maxIterations:s??5,inflateFactor:u??2});console.time("MCL");let d=null;if(l)try{d=await c.transformWebGPU(f,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}d||(d=await c.transform(f,n[0].length)),console.timeEnd("MCL"),postMessage({res:d})},peptides={}})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQWUsSUFBSW5MLEdBQ2RJLGdCQUFnQmtCLEVBQU0ySixFQUFhcFksRUFBWSxJQUFLbVksRUFBZ0JoWSxFQUFTdU4sSUFFdEYvTixRQUFRa0gsUUFBUSxpQkFFaEIsTUFBTTBSLEVBQVUsSUFBSS9DLEVBQWlCLENBQUVILGNBQWVBLEdBQWlCLEVBQUdDLGNBQWVyQyxHQUFXLElBQ3BHdFQsUUFBUThHLEtBQUssT0FDYixJQUFJdUksRUFBTSxLQUNWLEdBQUlxSixFQUNBLElBQ0lySixRQUFZdUosRUFBUXBDLGdCQUFnQm1DLEVBQVE3SixFQUFLLEdBQUd0VCxPQUN4RCxDQUNBLE1BQU9qQixHQUNIeUYsUUFBUUMsTUFBTSx5REFDZEQsUUFBUUMsTUFBTTFGLEVBQ2xCLENBRUM4VSxJQUNEQSxRQUFZdUosRUFBUTdDLFVBQVU0QyxFQUFRN0osRUFBSyxHQUFHdFQsU0FDbER3RSxRQUFRa0gsUUFBUSxPQUNoQjBILFlBQVksQ0FBRVMsT0FBTSxFIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtYWdncmVnYXRpb24uanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ydW50aW1lL2dldCBqYXZhc2NyaXB0IGNodW5rIGZpbGVuYW1lIiwid2VicGFjazovL3BlcHRpZGVzL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvcHVibGljUGF0aCIsIndlYnBhY2s6Ly9wZXB0aWRlcy93ZWJwYWNrL3J1bnRpbWUvaW1wb3J0U2NyaXB0cyBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcy5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9nZXRHUFVEZXZpY2UuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvc3BhcnNlLW1hdHJpeC93ZWJHUFUtc3BhcnNlLW1hdHJpeC5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9kaXN0YW5jZS1tYXRyaXgvdHlwZXMuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvcHJlcHJvY2Vzc2luZy93ZWJHUFUtcHJvY2Vzcy1pbmZvLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL2Rpc3RhbmNlLW1hdHJpeC91dGlscy5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9kaXN0YW5jZS1tYXRyaXgvc3BhcnNlLW1hdHJpeC1zZXJ2aWNlLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9iaW8tbGF5b3V0LmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9jb2x3aXNlLW5vcm1hbGl6ZS5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvaW5mbGF0ZS1leHBhbmQuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML3V0aWxzLmpzIiwid2VicGFjazovL3BlcHRpZGVzLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3VtYXAvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL25vZGVfbW9kdWxlcy9pcy1hbnktYXJyYXkvbGliLWVzbS9pbmRleC5qcyIsIndlYnBhY2s6Ly9wZXB0aWRlcy8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWFyY292LWNsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUuanMiLCJ3ZWJwYWNrOi8vcGVwdGlkZXMvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvTUNML21jbC13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gZXVjbGlkZWFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgZGlzdGFuY2VzW2ldICogZGlzdGFuY2VzW2ldICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNxcnQoc3VtKTtcbiAgICBgO1xufVxuO1xuZnVuY3Rpb24gbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsKGFycmF5U2l6ZSkge1xuICAgIHJldHVybiBgXG4gICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7YXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgICAgc3VtID0gc3VtICsgYWJzKGRpc3RhbmNlc1tpXSkgKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdW07XG4gICAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1NMQUdHUkVHQVRJT047XG4oZnVuY3Rpb24gKFdFQkdTTEFHR1JFR0FUSU9OKSB7XG4gICAgV0VCR1NMQUdHUkVHQVRJT05bXCJFVUNMSURFQU5cIl0gPSBcIkVVQ0xJREVBTlwiO1xuICAgIFdFQkdTTEFHR1JFR0FUSU9OW1wiTUFOSEFUVEFOXCJdID0gXCJNQU5IQVRUQU5cIjtcbn0pKFdFQkdTTEFHR1JFR0FUSU9OIHx8IChXRUJHU0xBR0dSRUdBVElPTiA9IHt9KSk7XG5leHBvcnQgY29uc3QgV0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlMgPSB7XG4gICAgW1dFQkdTTEFHR1JFR0FUSU9OLkVVQ0xJREVBTl06IGV1Y2xpZGVhbkFnZ3JlZ2F0aW9uV2dzbCxcbiAgICBbV0VCR1NMQUdHUkVHQVRJT04uTUFOSEFUVEFOXTogbWFuaGF0dGFuQWdncmVnYXRpb25XZ3NsXG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLWFnZ3JlZ2F0aW9uLmpzLm1hcCIsIi8vIFRoZSByZXF1aXJlIHNjb3BlXG52YXIgX193ZWJwYWNrX3JlcXVpcmVfXyA9IHt9O1xuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuIiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwidmFyIHNjcmlwdFVybDtcbmlmIChfX3dlYnBhY2tfcmVxdWlyZV9fLmcuaW1wb3J0U2NyaXB0cykgc2NyaXB0VXJsID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmxvY2F0aW9uICsgXCJcIjtcbnZhciBkb2N1bWVudCA9IF9fd2VicGFja19yZXF1aXJlX18uZy5kb2N1bWVudDtcbmlmICghc2NyaXB0VXJsICYmIGRvY3VtZW50KSB7XG5cdGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0KVxuXHRcdHNjcmlwdFVybCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuc3JjO1xuXHRpZiAoIXNjcmlwdFVybCkge1xuXHRcdHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJzY3JpcHRcIik7XG5cdFx0aWYoc2NyaXB0cy5sZW5ndGgpIHtcblx0XHRcdHZhciBpID0gc2NyaXB0cy5sZW5ndGggLSAxO1xuXHRcdFx0d2hpbGUgKGkgPiAtMSAmJiAhc2NyaXB0VXJsKSBzY3JpcHRVcmwgPSBzY3JpcHRzW2ktLV0uc3JjO1xuXHRcdH1cblx0fVxufVxuLy8gV2hlbiBzdXBwb3J0aW5nIGJyb3dzZXJzIHdoZXJlIGFuIGF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgeW91IG11c3Qgc3BlY2lmeSBhbiBvdXRwdXQucHVibGljUGF0aCBtYW51YWxseSB2aWEgY29uZmlndXJhdGlvblxuLy8gb3IgcGFzcyBhbiBlbXB0eSBzdHJpbmcgKFwiXCIpIGFuZCBzZXQgdGhlIF9fd2VicGFja19wdWJsaWNfcGF0aF9fIHZhcmlhYmxlIGZyb20geW91ciBjb2RlIHRvIHVzZSB5b3VyIG93biBsb2dpYy5cbmlmICghc2NyaXB0VXJsKSB0aHJvdyBuZXcgRXJyb3IoXCJBdXRvbWF0aWMgcHVibGljUGF0aCBpcyBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbnNjcmlwdFVybCA9IHNjcmlwdFVybC5yZXBsYWNlKC8jLiokLywgXCJcIikucmVwbGFjZSgvXFw/LiokLywgXCJcIikucmVwbGFjZSgvXFwvW15cXC9dKyQvLCBcIi9cIik7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnAgPSBzY3JpcHRVcmw7IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5iID0gc2VsZi5sb2NhdGlvbiArIFwiXCI7XG5cbi8vIG9iamVjdCB0byBzdG9yZSBsb2FkZWQgY2h1bmtzXG4vLyBcIjFcIiBtZWFucyBcImFscmVhZHkgbG9hZGVkXCJcbnZhciBpbnN0YWxsZWRDaHVua3MgPSB7XG5cdDc0ODogMVxufTtcblxuLy8gbm8gY2h1bmsgaW5zdGFsbCBmdW5jdGlvbiBuZWVkZWRcbi8vIG5vIGNodW5rIGxvYWRpbmdcblxuLy8gbm8gSE1SXG5cbi8vIG5vIEhNUiBtYW5pZmVzdCIsIi8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cbi8vIGluIGFsbCB0aGUgZnVuY3Rpb25zIGJlbG93LCB0aGUgdmFyaWFibGVzIGEgYW5kIGIgYXJlIGFzc3VtZWQgdG8gYmUgYXJyYXlzIG9mIHVpbnQzMi9mMzJcbi8vdmFsdWVzIHdoaWNoIGFyZSBpbmZlcmVkIGZyb20gdGhlIGNvZGUgdGhpcyBjaHVuayBpcyBpbmplY3RlZCBpbnRvXG4vLyBhbHNvLCB3ZSBoYXZlIGFjY2VzcyB0byBjb21wdXRlSW5mbyBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuLy8gY29tcHV0ZUluZm8uZW50cnlTaXplczogYXJyYXkgb2YgYXJyYXlzIG9mIHUzMiBjb250YWluaW5nIHRoZSBzaXplcyBvZiB0aGUgZW50cmllc1xuLy8gb3RoZXIgZmllbGRzIGFyZSBzcGVjaWZpYyB0byB0aGUgZGlzdGFuY2UgZnVuY3Rpb24gc2hvdWxkIGJlIGluamVjdGVkIGZyb20gdGhlIG1haW4gc2NyaXB0IHRoYXQgY2FsbHMgdGhpcyBmdW5jdGlvbixcbi8vIGFuZCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIHRoZSBzdXBwbGVtZW50YXJ5SW5mbyBzdHJ1Y3Rcbi8vIGxpa2UgdGhlIHNpbWlsYXJpdHkgbWF0cml4IGZvciBtb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlLlxuLy8gdGhlIGdldFByb2Nlc3NJbmZvIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gY29ycmVjdCBidWZmZXIgYWxsb2NhdGlvbiBtZWNoYW5pc20gZm9yIHRoZSBzdXBwbGVtZW50YXJ5SW5mbyxcbi8vIGZvciBldmVyeSBlbnRyeSBsaXN0XG4vLyB0aGUgbWF4RGlzdGFuY2UgdmFyaWFibGUgaXMgYWxzbyBhc3N1bWVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0aGVcbi8vIHNjb3BlIG9mIHRoZSBmdW5jdGlvbiwgaW4gY2FzZSBvZiBrbm4gaXQgaXMgdGhlIGRpc3RhbmNlIGluIHRoZSBsYXN0IHBvc3Rpb24gb2Yga25uIG9uIHRoaXMgaW5kZXgsXG4vLyBpbiBjYXNlIG9mIHNwYXJzZSBtYXRyaXgsIGl0IGNhbiBiZSBqdXN0IHRoZSB0aHJlc2hvbGQgZm9yIHRoZSBkaXN0YW5jZS5cbi8vIGhhbW1pbmcgZGlzdGFuY2UgZm9yIHNlcXVuZW5jZXMgb2YgdWludDMyIGFycmF5cyBvZiBtYXggbGVuZ3RoICR7bWF4QXJyYXlTaXplfVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUhhbW1pbmcoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gIGxldCBiTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2JJbmRleF07XG4gIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgc2l6ZURpZmY6IHUzMiA9IG1heExlbmd0aCAtIG1pbkxlbmd0aDtcbiAgXG4gIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSkgLSBmMzIoc2l6ZURpZmYpO1xuXG4gIHZhciBkaWZmOiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7X21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICAgIGRpZmYgPSBkaWZmICsgZjMyKGFbaV0gIT0gYltpXSk7XG4gICAgICBpZiAoZGlmZiA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gIH1cbiAgZGlmZiArPSBmMzIoc2l6ZURpZmYpO1xuICByZXR1cm4gZGlmZiAvICR7X21heEFycmF5U2l6ZX07XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTW9ub21lckNoZW1pY2FsRGlzdGFuY2UoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIGl0IGlzIGFzc3VtZXQgdGhhdCBzdXBwSW5mbyBzdHJ1Y3QgY29udGFpbnMgY29ycmVjdCBtYXRyaXggY2FsbGVkIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9LCAoc2ltaWxhcml0eU1hdHJpeDAsIHNpbWlsYXJpdHlNYXRyaXgxLCBldGMpXG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBieSB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24uXG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBzaXplRGlmZjogdTMyID0gbWF4TGVuZ3RoIC0gbWluTGVuZ3RoO1xuICBcbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKSAtIGYzMihzaXplRGlmZik7XG5cbiAgbGV0IHNpbU1hdHJpeCA9ICYoc3VwcEluZm8uc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0pOyAvLyB1c2luZyBwb2ludGVycyBtYWtlIHRoaW5ncyBmYXN0ZXJcbiAgdmFyIGRpZmY6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHtfbWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgZGlmZiA9IGRpZmYgKyAxLjAgLSAoKnNpbU1hdHJpeClbdTMyKGFbaV0pXVt1MzIoYltpXSldO1xuICAgICAgaWYgKGRpZmYgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgICAgfVxuICB9XG4gIGRpZmYgKz0gZjMyKHNpemVEaWZmKTtcbiAgcmV0dXJuIGRpZmYgLyAke19tYXhBcnJheVNpemV9O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUxldmVuc3RlaW4obWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG5cbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKTtcblxuICAvLyB3ZSB3aWxsIHN0b3JlIHR3byBhcnJheXMgYXMgbWF0cml4IGFuZCBzd2FwIHRoZSB3b3JraW5nIGluZGljZXMgcGVyIHBhc3MuXG4gIC8vIHRoaXMgd2F5IHdlIGNhbiByZWR1Y2UgbWVtb3J5IHVzYWdlIHBlciBjb21wdXRhdGlvbiB0byBqdXN0IE8oYUxlbmd0aClcbiAgLy8gdGhlIGdyaWQgd2lsbCBoYXZlIGFMZW5ndGggKyAxIGNvbHVtbnMgYW5kIGJMZW5ndGggKyAxIHJvd3NcbiAgLy8gdGhpcyB3aWxsIGJlIGd1YXJhbnRlZWQgYnkgaXRlcmF0aW9uLCBidXQgdGhlIGFycmF5IHNpemVzIG11c3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSB3aWxsIHVzZSBhIGZpeGVkIHNpemUgb2YgbWF4QXJyYXlTaXplXG4gIHZhciBkeW5hbWljUGFzc01hdDogYXJyYXk8YXJyYXk8ZjMyLCAke21heEFycmF5U2l6ZSArIDF9dT4sIDI+OyAvLyBpbml0aWFsaXplIHRvIDBcbiAgXG4gIHZhciBwcmV2SW5kZXg6IHUzMiA9IDA7XG4gIHZhciBjdXJJbmRleDogdTMyID0gMTsgLy8gd2Ugd2lsbCBzd2FwIHRoZXNlIGluZGljZXMgcGVyIHBhc3NcblxuICAvLyBpbml0aWFsaXplIHRoZSBmaXJzdCByb3dcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDw9IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1baV0gPSBmMzIoaSk7XG4gIH1cblxuICAvLyBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcbiAgZm9yICh2YXIgaSA9IDF1OyBpIDw9IGJMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgIGR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XVswXSA9IGYzMihpKTtcbiAgICAgIHZhciBtaW5FbnRyeTogZjMyID0gZjMyKG1heExlbmd0aCk7XG4gICAgICBsZXQgcHJldlJvdyA9ICZkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdO1xuICAgICAgbGV0IGN1clJvdyA9ICZkeW5hbWljUGFzc01hdFtjdXJJbmRleF07XG4gICAgICBsZXQgYk1vbiA9IHUzMihiW2kgLSAxXSk7XG4gICAgICBmb3IgKHZhciBqID0gMXU7IGogPD0gYUxlbmd0aDsgaiA9IGogKyAxdSkge1xuICAgICAgICAgIHZhciBjb3N0OiBmMzIgPSBmMzIoYVtqIC0gMV0gIT0gYk1vbik7XG4gICAgICAgICAgdmFyIHJlczogZjMyID0gbWluKFxuICAgICAgICAgICAgICBtaW4oXG4gICAgICAgICAgICAgICAgKCpwcmV2Um93KVtqXSArIDEuMCwgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgICAoKmN1clJvdylbaiAtIDFdICsgMS4wLCAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKCpwcmV2Um93KVtqIC0gMV0gKyBjb3N0IC8vIHN1YnN0aXR1dGlvblxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAoKmN1clJvdylbal0gPSByZXM7XG4gICAgICAgICAgaWYgKHJlcyA8IG1pbkVudHJ5KSB7XG4gICAgICAgICAgICAgIG1pbkVudHJ5ID0gcmVzO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIHN3YXAgdGhlIGluZGljZXNcbiAgICAgIGxldCB0ZW1wOiB1MzIgPSBwcmV2SW5kZXg7XG4gICAgICBwcmV2SW5kZXggPSBjdXJJbmRleDtcbiAgICAgIGN1ckluZGV4ID0gdGVtcDtcbiAgICAgIGlmIChtaW5FbnRyeSA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgIH1cbiAgfVxuXG4gIHJldHVybiBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2FMZW5ndGhdIC8gZjMyKG1heExlbmd0aCk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTmVlZGxlbWFuV3Vuc2NoKG1heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIHZlcnNpb24gb2YgdGhlIGxldmVuc2h0YWluIHdoZXJlIHRoZSBjb3N0IG9mIHN1YnN0aXR1dGlvbiBpcyBjdXN0b21pemFibGVcbiAgICAvLyBpdCBpcyBhc3N1bWV0IHRoYXQgc3VwcEluZm8gc3RydWN0IGNvbnRhaW5zIGNvcnJlY3QgbWF0cml4IGNhbGxlZCBzaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSwgKHNpbWlsYXJpdHlNYXRyaXgwLCBzaW1pbGFyaXR5TWF0cml4MSwgZXRjKVxuICAgIC8vIGFuZCBnYXBPcGVuUGVuYWx0eSwgZ2FwRXh0ZW5zaW9uUGVuYWx0eVxuICAgIC8vIHRoaXMgc2hvdWxkIGJlIGd1YXJhbnRlZWQgYnkgdGhlIGdldFByb2Nlc3NJbmZvIGZ1bmN0aW9uLlxuICAgIHJldHVybiBgXG4gICAgICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICAgICAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgICAgIGxldCBtYXhMZW5ndGg6IHUzMiA9IG1heChhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgICAgIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgXG4gICAgICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpO1xuICAgICAgLy8gd2Ugd2lsbCBzdG9yZSB0d28gYXJyYXlzIGFzIG1hdHJpeCBhbmQgc3dhcCB0aGUgd29ya2luZyBpbmRpY2VzIHBlciBwYXNzLlxuICAgICAgLy8gdGhpcyB3YXkgd2UgY2FuIHJlZHVjZSBtZW1vcnkgdXNhZ2UgcGVyIGNvbXB1dGF0aW9uIHRvIGp1c3QgTyhhTGVuZ3RoKVxuICAgICAgLy8gdGhlIGdyaWQgd2lsbCBoYXZlIGFMZW5ndGggKyAxIGNvbHVtbnMgYW5kIGJMZW5ndGggKyAxIHJvd3NcbiAgICAgIC8vIHRoaXMgd2lsbCBiZSBndWFyYW50ZWVkIGJ5IGl0ZXJhdGlvbiwgYnV0IHRoZSBhcnJheSBzaXplcyBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGUgdGltZSwgc28gd2Ugd2lsbCB1c2UgYSBmaXhlZCBzaXplIG9mIG1heEFycmF5U2l6ZVxuICAgICAgdmFyIGR5bmFtaWNQYXNzTWF0OiBhcnJheTxhcnJheTxmMzIsICR7bWF4QXJyYXlTaXplICsgMX11PiwgMj47IC8vIGluaXRpYWxpemUgdG8gMFxuICAgICAgXG4gICAgICAvLyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggb3BlcmF0aW9uIGxlZCB0byB0aGUgY3VycmVudCBjZWxsXG4gICAgICAvLyBpLmUuIHdoZXRoZXIgd2UgY2FtZSBmcm9tIHRoZSBsZWZ0LCB0b3Agb3IgZGlhZ29uYWwgdG8gYXNzaWduIGdhcCBvcGVuL2dhcCBleHRlbmQgcGVuYWx0eVxuICAgICAgdmFyIHZlcnRpY2FsR2FwczogYXJyYXk8dTMyLCAke21heEFycmF5U2l6ZSArIDF9dT47XG4gICAgICB2YXIgaG9yaXpvbnRhbEdhcHM6IGFycmF5PHUzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+O1xuXG4gICAgICBsZXQgZ2FwT3BlblBlbmFsdHk6IGYzMiA9IHN1cHBJbmZvLmdhcE9wZW5QZW5hbHR5JHtlbnRyeUluZGV4fTtcbiAgICAgIGxldCBnYXBFeHRlbnNpb25QZW5hbHR5OiBmMzIgPSBzdXBwSW5mby5nYXBFeHRlbnNpb25QZW5hbHR5JHtlbnRyeUluZGV4fTtcbiAgICAgIHZhciBwcmV2SW5kZXg6IHUzMiA9IDA7XG4gICAgICB2YXIgY3VySW5kZXg6IHUzMiA9IDE7IC8vIHdlIHdpbGwgc3dhcCB0aGVzZSBpbmRpY2VzIHBlciBwYXNzXG4gICAgICAvLyBpbml0aWFsaXplIHRoZSBmaXJzdCByb3dcbiAgICAgIGZvciAodmFyIGkgPSAwdTsgaSA8PSBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVtpXSA9IGdhcE9wZW5QZW5hbHR5ICsgZjMyKGkgLSAxKSAqIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdW2ldID0gMC4wO1xuICAgICAgfVxuICAgICAgZHluYW1pY1Bhc3NNYXRbMF1bMF0gPSAwLjA7XG5cbiAgICAgIGxldCBzaW1NYXRyaXggPSAmc3VwcEluZm8uc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH07IC8vIHVzaW5nIHBvaW50ZXJzIG1ha2UgdGhpbmdzIGZhc3RlclxuICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRoZSByb3dzXG4gICAgICBmb3IgKHZhciBpID0gMXU7IGkgPD0gYkxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgICAgIGxldCBwcmV2Um93ID0gJmR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF07XG4gICAgICAgICAgbGV0IGN1clJvdyA9ICZkeW5hbWljUGFzc01hdFtjdXJJbmRleF07XG4gICAgICAgICAgKCpjdXJSb3cpWzBdID0gZ2FwT3BlblBlbmFsdHkgKyBmMzIoaSAtIDEpICogZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICB2YXIgbWluRW50cnk6IGYzMiA9IGYzMihtYXhMZW5ndGgpO1xuICAgICAgICAgIGxldCBtb25CID0gdTMyKGJbaSAtIDFdKTtcbiAgICAgICAgICBmb3IgKHZhciBqID0gMXU7IGogPD0gYUxlbmd0aDsgaiA9IGogKyAxdSkge1xuICAgICAgICAgICAgICBsZXQgbW9uQSA9IHUzMihhW2ogLSAxXSk7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgICBsZXQgY29zdDogZjMyID0gKCpwcmV2Um93KVtqIC0gMV0gKyAxZiAtICgqc2ltTWF0cml4KVttb25BXVttb25CXTtcbiAgICAgICAgICAgICAgdmFyIHRvcCA9ICgqcHJldlJvdylbal07IC8vIGRlbGV0aW9uXG4gICAgICAgICAgICAgIGlmICh2ZXJ0aWNhbEdhcHNbal0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKyBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdG9wID0gdG9wICsgZ2FwT3BlblBlbmFsdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIGxlZnQgPSAoKmN1clJvdylbaiAtIDFdOyAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgaWYgKGhvcml6b250YWxHYXBzW2ogLSAxXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0ICsgZ2FwT3BlblBlbmFsdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFyIHJlczogZjMyID0gbWluKFxuICAgICAgICAgICAgICAgICAgbWluKFxuICAgICAgICAgICAgICAgICAgICAgIHRvcCwgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgICAgICAgICBsZWZ0LCAvLyBpbnNlcnRpb25cbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjb3N0IC8vIHN1YnN0aXR1dGlvblxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICgqY3VyUm93KVtqXSA9IHJlcztcbiAgICAgICAgICAgICAgaWYgKHJlcyA8IG1pbkVudHJ5KSB7XG4gICAgICAgICAgICAgICAgICBtaW5FbnRyeSA9IHJlcztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGdhcHNcbiAgICAgICAgICAgICAgaWYgKHJlcyA9PSBjb3N0KSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcyA9PSBsZWZ0KSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAxO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgdmVydGljYWxHYXBzW2pdID0gMTtcbiAgICAgICAgICAgICAgICAgIGhvcml6b250YWxHYXBzW2pdID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBzd2FwIHRoZSBpbmRpY2VzXG4gICAgICAgICAgbGV0IHRlbXA6IHUzMiA9IHByZXZJbmRleDtcbiAgICAgICAgICBwcmV2SW5kZXggPSBjdXJJbmRleDtcbiAgICAgICAgICBjdXJJbmRleCA9IHRlbXA7XG4gICAgICAgICAgaWYgKG1pbkVudHJ5ID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIDEuMDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVthTGVuZ3RoXSAvIGYzMihtYXhMZW5ndGgpO1xuICBcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVFdWNsaWRlYW4obWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBkaXN0OiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgIGRpc3QgPSBkaXN0ICsgZjMyKGFbaV0gLSBiW2ldKSAqIGYzMihhW2ldIC0gYltpXSk7XG4gIH1cbiAgcmV0dXJuIHNxcnQoZGlzdCk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTWFuaGF0dGFuKG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgZGlzdDogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX07IGkgPSBpICsgMXUpIHtcbiAgICBkaXN0ID0gZGlzdCArIGFicyhmMzIoYVtpXSAtIGJbaV0pKTtcbiAgfVxuICByZXR1cm4gZGlzdDtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVPbmVIb3REaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgaWYgKGFMZW5ndGggIT0gYkxlbmd0aCkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgIGlmKGFbaV0gIT0gYltpXSkge1xuICAgICAgcmV0dXJuIDEuMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIDAuMDtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVOdW1lcmljRGlzdGFuY2UoX21heEFycmF5U2l6ZSwgZW50cnlJbmRleCkge1xuICAgIC8vIHdlIGFzc3VtZSB0aGF0IHJhbmdlJHtlbnRyeUluZGV4fSBpcyBhdmFpbGFibGUgaW4gdGhlIHN1cHBsZW1lbnRhcnlJbmZvIHN0cnVjdFxuICAgIHJldHVybiBgXG4gICAgbGV0IHJhbmdlID0gc3VwcEluZm8ucmFuZ2Uke2VudHJ5SW5kZXh9O1xuICAgIHJldHVybiBmMzIoYWJzKGYzMihhWzBdKSAtIGYzMihiWzBdKSkgLyByYW5nZSk7XG4gIGA7XG59XG4vLyB0YW5pbW90byBkaXN0YW5jZSBmb3IgdWludDMyIGFycmF5cyBvZiBsZW5ndGggJHttYXhBcnJheVNpemV9XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVVGFuaW1vdG9CaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cblxuICBpZiAob25CaXRzYSA9PSAwdSAmJiBvbkJpdHNiID09IDB1KSB7XG4gICAgICByZXR1cm4gMC4wO1xuICB9XG5cbiAgbGV0IHRvdGFsT25CaXRzID0gb25CaXRzYSArIG9uQml0c2I7XG4gIHZhciBjb21tb25CaXRzOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgY29tbW9uQml0cyA9IGNvbW1vbkJpdHMgKyBjb3VudE9uZUJpdHMoYVtpXSAmIGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMih0b3RhbE9uQml0cyAtIGNvbW1vbkJpdHMpO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUFzeW1tZXRyaWNCaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cbiAgbGV0IG1pbiA9IG1pbihvbkJpdHNhLCBvbkJpdHNiKTtcbiAgaWYgKG1pbiA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMihtaW4pO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUNvc2luZUJpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgdG90YWwgPSBvbkJpdHNhICogb25CaXRzYjsgLy8gcC5zLiBoZXJlIHRvdGFsIGlzIHRha2VuIGJ5IG11bHRpcGx5aW5nXG4gIGlmICh0b3RhbCA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIHNxcnQoZjMyKHRvdGFsKSk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVU29rYWxCaXRBcnJheShtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIG9uQml0c2E6IHUzMiA9IDB1O1xuICB2YXIgb25CaXRzYjogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIG9uQml0c2EgPSBvbkJpdHNhICsgY291bnRPbmVCaXRzKGFbaV0pO1xuICAgICAgb25CaXRzYiA9IG9uQml0c2IgKyBjb3VudE9uZUJpdHMoYltpXSk7XG4gIH1cbiAgbGV0IHRvdGFsID0gb25CaXRzYSArIG9uQml0c2I7XG4gIGlmICh0b3RhbCA9PSAwdSkge1xuICAgIHJldHVybiAxLjA7XG4gIH1cbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cbiAgcmV0dXJuIDEuMCAtIGYzMihjb21tb25CaXRzKSAvIGYzMih0b3RhbCAqIDIgLSBjb21tb25CaXRzICogMyk7XG4gIGA7XG59XG5leHBvcnQgdmFyIFdFQkdQVURJU1RBTkNFO1xuKGZ1bmN0aW9uIChXRUJHUFVESVNUQU5DRSkge1xuICAgIFdFQkdQVURJU1RBTkNFW1wiSEFNTUlOR1wiXSA9IFwiSGFtbWluZ1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiRVVDTElERUFOXCJdID0gXCJFdWNsaWRlYW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk1BTkhBVFRBTlwiXSA9IFwiTWFuaGF0dGFuXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJUQU5JTU9UT1wiXSA9IFwiVGFuaW1vdG9cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkxFVkVOU1RFSU5cIl0gPSBcIkxldmVuc2h0ZWluXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJORUVETEVNQU5fV1VOU0NIXCJdID0gXCJOZWVkbGVtYW5uLVd1bnNjaFwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRVwiXSA9IFwiTW9ub21lciBjaGVtaWNhbCBkaXN0YW5jZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiU09LQUxcIl0gPSBcIlNva2FsXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJDT1NJTkVcIl0gPSBcIkNvc2luZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiQVNZTU1FVFJJQ1wiXSA9IFwiQXN5bW1ldHJpY1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiRGlmZmVyZW5jZVwiXSA9IFwiRGlmZmVyZW5jZVwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiT25lSG90XCJdID0gXCJPbmUtSG90XCI7XG59KShXRUJHUFVESVNUQU5DRSB8fCAoV0VCR1BVRElTVEFOQ0UgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IHdlYkdQVUZ1bmN0aW9ucyA9IHtcbiAgICBbV0VCR1BVRElTVEFOQ0UuSEFNTUlOR106IHdlYkdQVUhhbW1pbmcsXG4gICAgW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTl06IHdlYkdQVUV1Y2xpZGVhbixcbiAgICBbV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOXTogd2ViR1BVTWFuaGF0dGFuLFxuICAgIFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UT106IHdlYkdQVVRhbmltb3RvQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU5dOiB3ZWJHUFVMZXZlbnN0ZWluLFxuICAgIFtXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIXTogd2ViR1BVTmVlZGxlbWFuV3Vuc2NoLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXTogd2ViR1BVTW9ub21lckNoZW1pY2FsRGlzdGFuY2UsXG4gICAgW1dFQkdQVURJU1RBTkNFLlNPS0FMXTogd2ViR1BVU29rYWxCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQ09TSU5FXTogd2ViR1BVQ29zaW5lQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdOiB3ZWJHUFVBc3ltbWV0cmljQml0QXJyYXksXG4gICAgW1dFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdOiB3ZWJHUFVOdW1lcmljRGlzdGFuY2UsXG4gICAgW1dFQkdQVURJU1RBTkNFLk9uZUhvdF06IHdlYkdQVU9uZUhvdERpc3RhbmNlXG59O1xuZXhwb3J0IGNvbnN0IGRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5ID0ge1xuICAgIFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDMwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE9dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5TT0tBTF06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkNPU0lORV06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAqIG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSF06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgKiBtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMjUpLFxuICAgIFtXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXTogKF9tYXhFbnRyeVNpemUpID0+IDEsXG4gICAgW1dFQkdQVURJU1RBTkNFLk9uZUhvdF06IChfbWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwoX21heEVudHJ5U2l6ZSAvIDQwKSxcbn07XG5leHBvcnQgY29uc3QgVHlwZVN1cHBvcnRlZERpc3RhbmNlcyA9IHtcbiAgICBbXCJTVFJJTkdcIiAvKiBXR1BVRU5UUllUWVBFLlNUUklORyAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkhBTU1JTkcsIFdFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU4sIFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0gsIFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsIFdFQkdQVURJU1RBTkNFLk9uZUhvdF0pLFxuICAgIFtcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkhBTU1JTkcsIFdFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFLCBXRUJHUFVESVNUQU5DRS5MRVZFTlNURUlOLCBXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NILCBXRUJHUFVESVNUQU5DRS5UQU5JTU9UTywgV0VCR1BVRElTVEFOQ0UuQ09TSU5FLCBXRUJHUFVESVNUQU5DRS5TT0tBTCwgV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQywgV0VCR1BVRElTVEFOQ0UuT25lSG90LCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5PbmVIb3QsIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiTlVNQkVSXCIgLyogV0dQVUVOVFJZVFlQRS5OVU1CRVIgKi9dOiBuZXcgU2V0KFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU4sIFdFQkdQVURJU1RBTkNFLk1BTkhBVFRBTiwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIkJJVEFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5CSVRBUlJBWSAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPLCBXRUJHUFVESVNUQU5DRS5DT1NJTkUsIFdFQkdQVURJU1RBTkNFLlNPS0FMLCBXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDXSlcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xubGV0IGdwdUFkYXB0ZXIgPSBudWxsO1xubGV0IGdwdURldmljZSA9IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gZ2V0R1BVRGV2aWNlKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZ3B1QWRhcHRlcikge1xuICAgICAgICAgICAgLy9yZWFzb246IG9ubHkgaGVyZSB3ZSBnZXQgdGhlIGdwdUFkYXB0ZXJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZ3B1QWRhcHRlciA9IHlpZWxkIG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoeyBwb3dlclByZWZlcmVuY2U6ICdoaWdoLXBlcmZvcm1hbmNlJyB9KTtcbiAgICAgICAgICAgIGlmIChncHVBZGFwdGVyID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlzTG9zdCA9IGZhbHNlO1xuICAgICAgICBpZiAoZ3B1RGV2aWNlKSB7XG4gICAgICAgICAgICBncHVEZXZpY2UubG9zdC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc0xvc3QgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB5aWVsZCBuZXcgUHJvbWlzZSgocikgPT4gc2V0VGltZW91dChyLCAxMCkpOyAvLyB3YWl0IHRvIHNlZSBpZiB0aGUgZGV2aWNlIGlzIGxvc3RcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWdwdURldmljZSB8fCBpc0xvc3QpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVpcmVkQnVmZmVyU2l6ZSA9IDEwMDAwMDAwMDA7IC8vIH4xMDAwTUJcbiAgICAgICAgICAgIGNvbnN0IGFkYXB0ZXJMaW1pdHMgPSBncHVBZGFwdGVyLmxpbWl0cztcbiAgICAgICAgICAgIGNvbnN0IGJ1ZmZmZXJTaXplTGltaXQgPSBhZGFwdGVyTGltaXRzLm1heEJ1ZmZlclNpemU7XG4gICAgICAgICAgICBjb25zdCBzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0ID0gYWRhcHRlckxpbWl0cy5tYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGdwdURldmljZSA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdERldmljZSh7IHJlcXVpcmVkTGltaXRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhCdWZmZXJTaXplOiBNYXRoLm1pbihidWZmZmVyU2l6ZUxpbWl0LCByZXF1aXJlZEJ1ZmZlclNpemUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplOiBNYXRoLm1pbihzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0LCByZXF1aXJlZEJ1ZmZlclNpemUpXG4gICAgICAgICAgICAgICAgICAgIH0gfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugd2l0aCByZXF1aXJlZCBsaW1pdHMnLCBlKTtcbiAgICAgICAgICAgICAgICBncHVEZXZpY2UgPSB5aWVsZCBncHVBZGFwdGVyLnJlcXVlc3REZXZpY2UoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0R1BVQWRhcHRlckRlc2NyaXB0aW9uKCkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGlmICghZ3B1QWRhcHRlcikge1xuICAgICAgICAgICAgLy8gcmVhc29uOiBvbmx5IGhlcmUgd2UgZ2V0IHRoZSBncHVBZGFwdGVyXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXhcbiAgICAgICAgICAgIGdwdUFkYXB0ZXIgPSB5aWVsZCBuYXZpZ2F0b3IuZ3B1LnJlcXVlc3RBZGFwdGVyKCk7XG4gICAgICAgICAgICBpZiAoZ3B1QWRhcHRlciA9PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGluZm8gPSB5aWVsZCBncHVBZGFwdGVyLnJlcXVlc3RBZGFwdGVySW5mbygpO1xuICAgICAgICBpZiAoIWluZm8pXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3Qgb3V0U3RyaW5nID0gcmVwbGFjZUVtcHR5U3RyaW5nKGluZm8uZGVzY3JpcHRpb24sIHJlcGxhY2VFbXB0eVN0cmluZyhpbmZvLnZlbmRvciwgJ05vIEdQVSBkZXNjcmlwdGlvbiBhdmFpbGFibGUnKSk7XG4gICAgICAgIHJldHVybiBvdXRTdHJpbmc7XG4gICAgfSk7XG59XG5mdW5jdGlvbiByZXBsYWNlRW1wdHlTdHJpbmcoc3RyLCByZXBsYWNlbWVudCkge1xuICAgIHJldHVybiAhc3RyIHx8IHN0ciA9PSAnJyA/IHJlcGxhY2VtZW50IDogc3RyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2V0R1BVRGV2aWNlLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgV0VCR1NMQUdHUkVHQVRJT04sIFdFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TLCB9IGZyb20gJy4uL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLWFnZ3JlZ2F0aW9uJztcbmltcG9ydCB7IFdFQkdQVURJU1RBTkNFLCB3ZWJHUFVGdW5jdGlvbnMsIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzJztcbmltcG9ydCB7IHdlYkdQVVByb2Nlc3NJbmZvIH0gZnJvbSAnLi4vcHJlcHJvY2Vzc2luZy93ZWJHUFUtcHJvY2Vzcy1pbmZvJztcbmltcG9ydCB7IGdldEdQVURldmljZSB9IGZyb20gJy4uL2dldEdQVURldmljZSc7XG4vKiogZ2VuZXJhdGUgc3BhcnNlIG1hdHJpeCBiYXNlZCBvbiBsaXN0IG9mIGxpc3RzIG9mIGVudHJpZXMuXG4gKiAgdGhlc2UgZW50cmllcyBhcmUgZWFjaCBlbmNvZGVkIGFzIFVpbnQzMkFycmF5IG9yIEZMT0FUMzJBcnJheSAoZGVwZW5kaW5nIG9uIHRoZWlyIHR5cGUpLlxuICogZm9yIGV4YW1wbGUsIHNlcXVlbmNlcyB3b3VsZCBiZSBlbmNvZGVkIGFzIFVpbnQzMkFycmF5IGJhc2VkIG9uIGNoYXIgY29kZSBvZiB0aGUgbGV0dGVyIGF0IGVhY2ggcG9zaXRpb24uXG4gKiBbNjUsIDY2LCA2NywgNjgsIDY5XSB3b3VsZCBiZSBhIHNlcXVlbmNlIG9mIDUgbGV0dGVycy5cbiAqIGZvciBjaGVtaWNhbCBmaW5nZXJwcmludHMsIGl0IHdvdWxkIGJlIGEgYmluYXJ5IGFycmF5IG9mIDBzIGFuZCAxcyxcbiAqIHJlcHJlc2VudGVkIGFzIFVpbnQzMkFycmF5KF9kYXRhIHByb3BlcnR5IG9mIERHIGJpdGFycmF5KS5cbiAqXG4gKiBCZSB3YXJlIHRoYXQgc2l6ZSBvZiBlbnRyeUxpc3QsIGRpc3RhbmNlTWV0cmljcywgd2VpZ2h0cyBhbmQgb3B0aW9ucyBtdXN0IGJlIHRoZSBzYW1lLlxuICogaWYgdGhlcmUgYXJlIG5vIG9wdGlvbnMgZm9yIGVudHJpZXMgaSwgcGFzcyBhbiBlbXB0eSBvYmplY3QuXG4gKiBmb3Igbm93IG9wdGlvbnMgYXJlIG5lZWRlZCBmb3JcbiAqIG5lZWRsZW1hbi13dW5zY2ggYW5kIG1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2VzOiBzZWUge0BsaW5rIEJpb0Rpc3RhbmNlRm5PcHRpb25zfSBhcyBmb3IgaG93IGl0IHNob3VsZCBiZSBwYXNzZWRcbiAqIG51bWVyaWMgZGlzdGFuY2VzIChEaWZmZXJlbmNlKToge3JhbmdlOiBudW1iZXJ9IHdoZXJlIHJhbmdlIGlzIHRoZSByYW5nZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBjb2x1bW4gKG1heCAtIG1pbikuXG4gKiBpbiBib3RoIGNhc2VzLCBpZiBvcHRpb25zIGFyZSBub3QgcHJvdmlkZWQsIHRoZXkgd2lsbCBiZSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChlbnRyeUxpc3QsIC8vIGxpc3Qgb2YgbGlzdHMgb2YgZW50cmllcywgZm9yIG11bHRpcGxlIGNvbHVtbnNcbnRocmVzaG9sZCA9IDAuOCwgLy8gc2ltaWxhcml0eSB0aHJlc2hvbGQsIGJlIHdhcmUgdGhhdCBpZiB5b3UgdXNlIHRvbyBzbWFsbCB0aHJlc2hvbGQsIHRoZXJlIG1pZ2h0IGJlIG1lbW9yeSBvdmVyZmxvdy4uLlxuZGlzdGFuY2VNZXRyaWNzLCAvLyBkaXN0YW5jZSBtZXRyaWNzIGZvciBlYWNoIGNvbHVtblxuYWdncmVnYXRpb25GdW5jdGlvbiwgLy8gYWdncmVnYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBkaXN0YW5jZXNcbndlaWdodHMsIC8vIHdlaWdodHMgZm9yIGVhY2ggY29sdW1uXG5vcHRpb25zIC8vIHN1cHBsZW1lbnRhcnkgb3B0aW9ucyBmb3IgZWFjaCBjb2x1bW5cbikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRldmljZSA9IHlpZWxkIGdldEdQVURldmljZSgpO1xuICAgICAgICBpZiAoIWRldmljZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBpZiBubyBkZXZpY2UsIHJldHVybiBudWxsLCBhcyB3ZSBjYW5ub3QgZG8gYW55dGhpbmcgd2l0aG91dCBpdC5cbiAgICAgICAgY29uc3QgYXZhaWxhYmxlRGlzdGFuY2VNZXRyaWNzID0gT2JqZWN0LnZhbHVlcyhXRUJHUFVESVNUQU5DRSk7XG4gICAgICAgIGlmIChkaXN0YW5jZU1ldHJpY3Muc29tZSgobWV0cmljKSA9PiAhYXZhaWxhYmxlRGlzdGFuY2VNZXRyaWNzLmluY2x1ZGVzKG1ldHJpYykpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGRpc3RhbmNlIG1ldHJpY3MgcHJvdmlkZWQ6ICcgKyBkaXN0YW5jZU1ldHJpY3Muam9pbignLCAnKSk7XG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZUFnZ3JlZ2F0aW9uRnVuY3Rpb25zID0gT2JqZWN0LnZhbHVlcyhXRUJHU0xBR0dSRUdBVElPTik7XG4gICAgICAgIGlmICghYXZhaWxhYmxlQWdncmVnYXRpb25GdW5jdGlvbnMuaW5jbHVkZXMoYWdncmVnYXRpb25GdW5jdGlvbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYWdncmVnYXRpb24gZnVuY3Rpb24gcHJvdmlkZWQ6ICcgKyBhZ2dyZWdhdGlvbkZ1bmN0aW9uKTtcbiAgICAgICAgY29uc3QgbWF4RGlzdGFuY2UgPSAxIC0gdGhyZXNob2xkOyAvLyBtYXhpbXVtIGRpc3RhbmNlXG4gICAgICAgIC8vIGZpcnN0LCBjaGVjayB0aGF0IGFsbCB0aGUgc3VwcGxlbWVudGFyeSBvcHRpb25zIGFyZSBwcm92aWRlZCBhbmQgYXJlIHRoZSBzYW1lIGxlbmd0aDpcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoICE9PSBlbnRyeUxpc3QubGVuZ3RoIHx8XG4gICAgICAgICAgICBvcHRpb25zLmxlbmd0aCAhPT0gZGlzdGFuY2VNZXRyaWNzLmxlbmd0aCB8fFxuICAgICAgICAgICAgb3B0aW9ucy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ09wdGlvbnMsIHdlaWd0aHMgYW5kIGRpc3RhbmNlIGZ1bmN0aW9ucyBtdXN0IGJlIHByb3ZpZGVkIGZvciBlYWNoIGNvbHVtbicpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrIHRoYXQgYWxsIHRoZSBlbnRyeSBsaXN0cyBhcmUgdGhlIHNhbWUgbGVuZ3RoXG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgobGlzdCkgPT4gbGlzdC5sZW5ndGggIT09IGVudHJ5TGlzdFswXS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbGwgZW50cnkgbGlzdHMgbXVzdCBiZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICAgICAgY29uc3QgbnVtT2ZDb2x1bW5zID0gZW50cnlMaXN0Lmxlbmd0aDsgLy8gbnVtYmVyIG9mIGNvbHVtbnNcbiAgICAgICAgY29uc3QgbGlzdFNpemUgPSBlbnRyeUxpc3RbMF0ubGVuZ3RoOyAvLyBzaXplIG9mIGVhY2ggbGlzdCAob3IgY29sdW1uKVxuICAgICAgICBjb25zdCBwcm9jZXNzSW5mbyA9IGVudHJ5TGlzdC5tYXAoKGVudHJ5LCBpKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2ViR1BVUHJvY2Vzc0luZm8oZW50cnksIGRpc3RhbmNlTWV0cmljc1tpXSwgaSwgb3B0aW9uc1tpXSk7XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobnVtT2ZDb2x1bW5zID09PSAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGNvbHVtbnMgcHJvdmlkZWQuIFBsZWFzZSBwcm92aWRlIGF0IGxlYXN0IG9uZSBjb2x1bW4gb2YgZGF0YS4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVtT2ZDb2x1bW5zID09PSAxKVxuICAgICAgICAgICAgYWdncmVnYXRpb25GdW5jdGlvbiA9IFdFQkdTTEFHR1JFR0FUSU9OLk1BTkhBVFRBTjsgLy8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIHN0cnVjdCB0eXBlcyBpbnRvIG9uZSB0byBwdXQgaW50byB0aGUgc3VwcEluZm8gc3RydWN0LlxuICAgICAgICBsZXQgc3VwcEluZm9XZ3NsID0gcHJvY2Vzc0luZm9cbiAgICAgICAgICAgIC5tYXAoKGluZm8pID0+IGluZm8uc3VwcEluZm9TdHJ1Y3RXZ3NsKVxuICAgICAgICAgICAgLmZpbHRlcigod2dzbCkgPT4gISF3Z3NsICYmIHdnc2wgIT0gJycpXG4gICAgICAgICAgICAuam9pbignLFxcbicpO1xuICAgICAgICAvLyBzdHJ1Y3R1cmVzIGluIHdnc2wgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBtZW1iZXIsIHNvIGlmIHdlIGhhdmUgbm8gc3RydWN0dXJlcywgd2UgbmVlZCB0byBhZGQgYSBkdW1teSBvbmVcbiAgICAgICAgbGV0IG5lZWRzRHVtbXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKCFzdXBwSW5mb1dnc2wgfHwgc3VwcEluZm9XZ3NsLnRyaW0oKSA9PSAnJykge1xuICAgICAgICAgICAgbmVlZHNEdW1teSA9IHRydWU7XG4gICAgICAgICAgICBzdXBwSW5mb1dnc2wgPSAnXFxuZHVtbXk6IGYzMlxcbic7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY29tYmluZSBhbGwgZGF0YSB3Z3NsIHN0cnVjdCBjb2RlIGludG8gb25lXG4gICAgICAgIGNvbnN0IGRhdGFXZ3NsID0gcHJvY2Vzc0luZm8ubWFwKChpbmZvKSA9PiBpbmZvLmRhdGFTdHJ1Y3RXZ3NsKS5maWx0ZXIoKHdnc2wpID0+ICEhd2dzbCAmJiB3Z3NsICE9ICcnKS5qb2luKCcsXFxuJyk7XG4gICAgICAgIC8vIGNvbWJpbmUgYWxsIGFycmF5IHNpemVzIGludG8gb25lIGFycmF5IChlYXNpZXIgZm9yIHNldHRpbmcpXG4gICAgICAgIGNvbnN0IGFycmF5U2l6ZXMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZDb2x1bW5zICogbGlzdFNpemUpO1xuICAgICAgICBwcm9jZXNzSW5mby5mb3JFYWNoKChpbmZvLCBpKSA9PiB7XG4gICAgICAgICAgICBhcnJheVNpemVzLnNldChpbmZvLmFycmF5U2l6ZXMsIGkgKiBsaXN0U2l6ZSk7XG4gICAgICAgIH0pOyAvLyBhcnJheS5mbGF0IGlzIG5vdCBhcyBvcHRpbWl6ZWQgYXMgdGhpc1xuICAgICAgICAvLyBpZiB3ZSB0cnkgdG8gbWFwIGxhcmdlIGFycmF5cyBkaXJlY3RseSBmcm9tIEdQVSwgc29tZXRpbWVzLCBkZXZpY2UgZGlzY29ubmVjdHMuIHNvIHdlIG5lZWQgdG8gZG8gaXQgaW4gY2h1bmtzLCBhIGdvb2QgbnVtYmVyXG4gICAgICAgIC8vIHdlIGZvdW5kIGlzIDEwMDAwLiBTbyB3ZSB3aWxsIHBlcmZvcm0gY29tcHV0YXRpb25zIGluIGNodW5rcyBvZiAxMDAwMC4gbWVhbmluZyB0aGF0IHdlIHdpbGwgZGlzcGF0Y2ggMTAwMDAgdGhyZWFkcyBhdCBhIHRpbWUuXG4gICAgICAgIGNvbnN0IG51bU9mVGhyZWFkcyA9IDEwMDAwO1xuICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgY29tcGxleGl0eSBvZiB0aGUgYWxnb3JpdGhtLCBhcyB0aGUgMTAwIGlzIGxvdyBlbmF1Z2ggbnVtYmVyLCB3aGljaCBpcyBsaW1pdGVkIGJ5IG1lbW9yeSB1c2FnZS5cbiAgICAgICAgY29uc3Qgc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCA9IDEwMDsgLy8gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyIHRocmVhZCAobnVtYmVyIG9mIHBhaXIgY29tcGFyaXNvbnMpXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkQ29tcGxleGl0eSA9IHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuY29tcGxleGl0eSwgMCk7IC8vIGNvbWJpbmVkIGNvbXBsZXhpdHkgb2YgYWxsIHRoZSBjb2x1bW5zXG4gICAgICAgIGNvbnN0IG1heEl0ZXJhdGlvbnNQZXJUaHJlYWQgPSBNYXRoLmNlaWwoMTAwMDAgLyBjb21iaW5lZENvbXBsZXhpdHkpOyAvLyBtYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb25zIHBlciB0aHJlYWRcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGl2aXNpb24gPSAxMDsgLy8gaG93IG1hbnkgdGhyZWFkcyBpbnNpZGUgb2Ygb25lIHdvcmtncm91cCBkaW1lbnNpb24gKGluIHRoaXMgY2FzZSAxMCAqIDEwIHRocmVhZHMgcGVyIHdvcmtncm91cClcbiAgICAgICAgY29uc3QgdGhyZWFkc1Blcldvcmtncm91cCA9IHdvcmtHcm91cERpdmlzaW9uICogd29ya0dyb3VwRGl2aXNpb247XG4gICAgICAgIGNvbnN0IHdvcmtncm91cHNEaW0gPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KE1hdGguY2VpbChudW1PZlRocmVhZHMgLyB0aHJlYWRzUGVyV29ya2dyb3VwKSkpOyAvLyBob3cgbWFueSB3b3JrZ3JvdXBzIHBlciAyZCBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgZ2xvYmFsVGhyZWFkRGltU2l6ZSA9IHdvcmtncm91cHNEaW0gKiB3b3JrR3JvdXBEaXZpc2lvbjsgLy8gaG93IG1hbnkgdGhyZWFkcyBwZXIgMmQgZGltZW5zaW9uXG4gICAgICAgIGNvbnN0IGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSA9IGxpc3RTaXplICogKGxpc3RTaXplIC0gMSkgLyAyOyAvLyBzaXplIG9mIHRoZSBjb25kZW5zZWQgZGlzdGFuY2UgbWF0cml4LCB0aGlzIG1hbnkgY29tcGFyaXNvbnMgd2lsbCBiZSBtYWRlLlxuICAgICAgICBjb25zdCBkbUNodW5rU2l6ZVBlclRocmVhZCA9IE1hdGguY2VpbChjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBudW1PZlRocmVhZHMpOyAvLyBob3cgbWFueSBjb21wYXJpc29ucyBwZXIgdGhyZWFkXG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdTcGFyc2UgbWF0cml4IGNvbXB1dGUgc2hhZGVyJyxcbiAgICAgICAgICAgIGNvZGU6IGBcbiAgICAvLyBlYWNoIHRocmVhZCB3aWxsIHBlcmZvcm0gJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSBpdGVyYXRpb25zIGF0IG9uZSB0aW1lLCBjb21wYXJpbmcgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSBwYWlycyBvZiBlbnRyaWVzLlxuICAgIC8vIGluIHRvdGFsLCBlYWNoIHRocmVhZCB3aWxsIHBlcmZvcm0gYXQgbW9zdCAke2RtQ2h1bmtTaXplUGVyVGhyZWFkfSBjb21wYXJpc29ucy5cbiAgICAvLyBmaXJzdCBpcyB0aGUgcmVzdWx0IHN0cnVjdCwgY29udGFpbmluZyBpcywganMsIGFuZCBkaXN0YW5jZXMuIGVhY2ggYXJyYXkgd2l0aCBsZW5ndGggb2YgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSxcbiAgICAvLyBhbmQgYWxzbyBpbnRlZ2VyIGZvciBob3cgbWFueSBwYWlycyB3ZXJlIGZvdW5kIHRvIGJlIGJlbG93IHRocmVzaG9sZC5cbiAgICBzdHJ1Y3QgU3BhcnNlUmVzdWx0IHtcbiAgICAgIGk6IGFycmF5PGFycmF5PHUzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBqOiBhcnJheTxhcnJheTx1MzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZGlzdGFuY2VzOiBhcnJheTxhcnJheTxmMzIsICR7c3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZH0+LCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZm91bmQ6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGRvbmU6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PlxuICAgIH1cbiAgICAvLyBzdHJ1Y3QgZm9yIHRoZSBkYXRhXG4gICAgc3RydWN0IENvbXB1dGVJbmZvIHtcbiAgICAgIC8vIHN0YXJ0IGF0IGNvbHMgYW5kIHJvd3MsIGFuZCBlbmQgYXQgY29scyBhbmQgcm93cyBmb3IgZWFjaCB0aHJlYWQsIHRoZXNlIHdpbGwgYmUgY2FsY3VsYXRlZCBvbiBjcHUgYW5kIHBhc3NlZCB0byBncHUuXG4gICAgICBzdGFydEF0Q29sczogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgc3RhcnRBdFJvd3M6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGVuZEF0Q29sczogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZW5kQXRSb3dzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG5cbiAgICAgIC8vIHRoZSBBQ1RVQUxMWSBzaXplcyBvZiBlYWNoIGVudHJ5XG4gICAgICBlbnRyeVNpemVzOiBhcnJheTxhcnJheTx1MzIsICR7bGlzdFNpemV9PiwgJHtudW1PZkNvbHVtbnN9PixcbiAgICAgIC8vIHRoZSB3ZWlnaHRzIGZvciBlYWNoIGVudHJ5XG4gICAgICB3ZWlnaHRzOiBhcnJheTxmMzIsICR7bnVtT2ZDb2x1bW5zfT4sXG4gICAgICAvLyB0aGUgZGF0YSBmb3IgZWFjaCBlbnRyeVxuICAgICAgJHtkYXRhV2dzbH0gLy8gYW4gZXhhbXBsZSBvZiB0aGUgZGF0YVdnc2wgd291bGQgYmU6XG4gICAgICAvL2RhdGEwOiBhcnJheTxhcnJheTx1MzIsMjA+LDEwMD4sXG4gICAgICAvL2RhdGExOiBhcnJheTxhcnJheTx1MzIsMjA+LDEwMD5cbiAgICB9XG5cbiAgICAvLyBzdHJ1Y3QgZm9yIHRoZSBzdXBwbGVtZW50YXJ5IGluZm9ybWF0aW9uXG4gICAgc3RydWN0IFN1cHBJbmZvIHtcbiAgICAgIC8vIHN0cnVjdCBjb250YWluaW5nIGFsbCB0aGUgc3VwcGxlbWVudGFyeSBpbmZvLCBsaWtlIHNjb3JpbmcgbWF0cml4LCBhbHBoYWJldCBpbmRleGVzLCByYW5nZSwgZXRjLlxuICAgICAgJHtzdXBwSW5mb1dnc2x9XG4gICAgfTtcblxuICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gY29tcHV0ZUluZm86IENvbXB1dGVJbmZvO1xuICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3VwcEluZm86IFN1cHBJbmZvO1xuICAgIEBncm91cCgwKSBAYmluZGluZygyKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gcmVzdWx0czogU3BhcnNlUmVzdWx0O1xuICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cERpdmlzaW9ufSwgJHt3b3JrR3JvdXBEaXZpc2lvbn0pIGZuIGNhbGNTcGFyc2VNYXRyaXgoXG4gICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPlxuICAgICkge1xuICAgICAgJHtuZWVkc0R1bW15ID8gYGxldCBvdGhlckR1bW15ID0gc3VwcEluZm8uZHVtbXkgKiAyO2AgOiAnJ30gLy8ganVzdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3VwcEluZm8gaXMgbm90IG9wdGltaXplZCBvdXRcbiAgICAgIGxldCB0aHJlYWRDb2wgPSBpZC54O1xuICAgICAgbGV0IHRocmVhZFJvdyA9IGlkLnk7XG4gICAgICBsZXQgbGluZWFySW5kZXggPSB0aHJlYWRSb3cgKiAke2dsb2JhbFRocmVhZERpbVNpemV9ICsgdGhyZWFkQ29sO1xuICAgICAgaWYgKGxpbmVhckluZGV4ID49ICR7bnVtT2ZUaHJlYWRzfSkge1xuICAgICAgICByZXR1cm47IC8vIGlmIHdlIGFyZSBvdXQgb2YgYm91bmRzLCByZXR1cm5cbiAgICAgIH0gICAgICBcbiAgICAgIHZhciBzdGFydEF0Q29sOiB1MzIgPSBjb21wdXRlSW5mby5zdGFydEF0Q29sc1tsaW5lYXJJbmRleF07XG4gICAgICB2YXIgc3RhcnRBdFJvdzogdTMyID0gY29tcHV0ZUluZm8uc3RhcnRBdFJvd3NbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGVuZEF0Q29sOiB1MzIgPSBtaW4oY29tcHV0ZUluZm8uZW5kQXRDb2xzW2xpbmVhckluZGV4XSwgJHtsaXN0U2l6ZX11KTtcbiAgICAgIGxldCBlbmRBdFJvdzogdTMyID0gbWluKGNvbXB1dGVJbmZvLmVuZEF0Um93c1tsaW5lYXJJbmRleF0sICR7bGlzdFNpemV9dSk7XG4gICAgICBsZXQgaXMgPSAmcmVzdWx0cy5pW2xpbmVhckluZGV4XTtcbiAgICAgIGxldCBqcyA9ICZyZXN1bHRzLmpbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGRpc3RhbmNlcyA9ICZyZXN1bHRzLmRpc3RhbmNlc1tsaW5lYXJJbmRleF07XG4gICAgICByZXN1bHRzLmZvdW5kW2xpbmVhckluZGV4XSA9IDA7IC8vIGluaXRpYWxpemUgdGhlIGZvdW5kIGNvdW50ZXJcbiAgICAgIHZhciBmb3VuZDogdTMyID0gMDtcbiAgICAgIGlmIChyZXN1bHRzLmRvbmVbbGluZWFySW5kZXhdID4gMCkge1xuICAgICAgICByZXR1cm47IC8vIGlmIHdlIGFyZSBkb25lLCByZXR1cm5cbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgJHttYXhJdGVyYXRpb25zUGVyVGhyZWFkfTsgaSsrKSB7XG4gICAgICAgIGlmIChzdGFydEF0Q29sID49IGVuZEF0Q29sICYmIHN0YXJ0QXRSb3cgPj0gZW5kQXRSb3cpIHtcbiAgICAgICAgICByZXN1bHRzLmRvbmVbbGluZWFySW5kZXhdID0gMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmQgPj0gJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkaXN0ID0gY29tYmluZWREaXN0YW5jZShzdGFydEF0Q29sLCBzdGFydEF0Um93KTtcbiAgICAgICAgaWYgKGRpc3QgPD0gJHttYXhEaXN0YW5jZX0pIHtcbiAgICAgICAgICAoKmlzKVtmb3VuZF0gPSBzdGFydEF0Q29sO1xuICAgICAgICAgICgqanMpW2ZvdW5kXSA9IHN0YXJ0QXRSb3c7XG4gICAgICAgICAgKCpkaXN0YW5jZXMpW2ZvdW5kXSA9IGRpc3Q7XG4gICAgICAgICAgZm91bmQgPSBmb3VuZCArIDE7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRBdENvbCA9IHN0YXJ0QXRDb2wgKyAxO1xuICAgICAgICBpZiAoc3RhcnRBdENvbCA+PSAke2xpc3RTaXplfXUpIHtcbiAgICAgICAgICBzdGFydEF0Um93ICs9IDE7XG4gICAgICAgICAgc3RhcnRBdENvbCA9IHN0YXJ0QXRSb3cgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXN1bHRzLmZvdW5kW2xpbmVhckluZGV4XSA9IGZvdW5kO1xuICAgICAgLy8gdXBkYXRlIHRoZSBzdGFydEF0Q29scyBhbmQgc3RhcnRBdFJvd3NcbiAgICAgIGNvbXB1dGVJbmZvLnN0YXJ0QXRDb2xzW2xpbmVhckluZGV4XSA9IHN0YXJ0QXRDb2w7XG4gICAgICBjb21wdXRlSW5mby5zdGFydEF0Um93c1tsaW5lYXJJbmRleF0gPSBzdGFydEF0Um93O1xuXG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBkaXN0YW5jZSBzY3JpcHQgZm9yIGVhY2ggZGlzdGFuY2UgbWV0cmljIGFuZCB0aGVuIGNvbWJpbmUgdGhlbSBpbnRvIG9uZVxuICAgICR7Z2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdChkaXN0YW5jZU1ldHJpY3MsIHByb2Nlc3NJbmZvLm1hcCgoaW5mbykgPT4gaW5mby5tYXhFbnRyeUxlbiksIG1heERpc3RhbmNlLCBhZ2dyZWdhdGlvbkZ1bmN0aW9uKX1cblxuXG4gICAgYFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3BhcnNlIG1hdHJpeCBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnY2FsY1NwYXJzZU1hdHJpeCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICBjb25zdCBzdGFydEF0Q29scyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBzdGFydEF0Um93cyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBlbmRBdENvbHMgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgZW5kQXRSb3dzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gbnVtT2ZUaHJlYWRzKTsgLy8gc2l6ZSBvZiB0aGUgY2h1bmsgcGVyIHRocmVhZCAoaW4gdG90YWwpXG4gICAgICAgIGxldCBzdGFydFJvdyA9IDA7XG4gICAgICAgIGxldCBzdGFydENvbCA9IDE7XG4gICAgICAgIGNvbnNvbGUudGltZSgnR1BVdGhyZWFkU3RhcnRzJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZUaHJlYWRzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGkgPT09IG51bU9mVGhyZWFkcyAtIDEgPyBjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLSAxIDogKGkgKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgIC8vIGZhbmN5IGZvcm11bGFzIHRvIGNhbGN1bGF0ZSB0aGUgc3RhcnQgYW5kIGVuZCBpbmRpY2VzIGZvciB0aGUgY29uZGVuc2VkIGRpc3RhbmNlIG1hdHJpeCBmb3IgZWFjaCB0aHJlYWQgc3RhcnRcbiAgICAgICAgICAgIGNvbnN0IGVuZFJvdyA9IGxpc3RTaXplIC0gMiAtIE1hdGguZmxvb3IoTWF0aC5zcXJ0KC04ICogZW5kSWR4ICsgNCAqIGxpc3RTaXplICogKGxpc3RTaXplIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgY29uc3QgZW5kQ29sID0gZW5kSWR4IC0gbGlzdFNpemUgKiBlbmRSb3cgKyBNYXRoLmZsb29yKChlbmRSb3cgKyAxKSAqIChlbmRSb3cgKyAyKSAvIDIpO1xuICAgICAgICAgICAgc3RhcnRBdENvbHNbaV0gPSBzdGFydENvbDtcbiAgICAgICAgICAgIHN0YXJ0QXRSb3dzW2ldID0gc3RhcnRSb3c7XG4gICAgICAgICAgICBlbmRBdENvbHNbaV0gPSBlbmRDb2w7XG4gICAgICAgICAgICBlbmRBdFJvd3NbaV0gPSBlbmRSb3c7XG4gICAgICAgICAgICBzdGFydFJvdyA9IGVuZFJvdztcbiAgICAgICAgICAgIHN0YXJ0Q29sID0gZW5kQ29sO1xuICAgICAgICAgICAgLy8gY29uc3Qgc3RhcnRSb3cgPSB2YWx1ZXNbMF0ubGVuZ3RoIC0gMiAtIE1hdGguZmxvb3IoXG4gICAgICAgICAgICAvLyAgIE1hdGguc3FydCgtOCAqIHN0YXJ0SWR4ICsgNCAqIHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC0gNykgLyAyIC0gMC41KTtcbiAgICAgICAgICAgIC8vIGNvbnN0IHN0YXJ0Q29sID0gc3RhcnRJZHggLSB2YWx1ZXNbMF0ubGVuZ3RoICogc3RhcnRSb3cgKyBNYXRoLmZsb29yKChzdGFydFJvdyArIDEpICogKHN0YXJ0Um93ICsgMikgLyAyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ0dQVXRocmVhZFN0YXJ0cycpO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSBjb21wdXRlSW5mbyBidWZmZXJcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXIzMlNpemUgPSBudW1PZlRocmVhZHMgKiA0ICsgLy8gc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICAgICAgbGlzdFNpemUgKiBudW1PZkNvbHVtbnMgKyAvLyBlbnRyeVNpemVzXG4gICAgICAgICAgICBudW1PZkNvbHVtbnMgKyAvLyB3ZWlnaHRzXG4gICAgICAgICAgICBwcm9jZXNzSW5mby5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLnNvdXJjZUFycmF5U2l6ZSwgMCk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIHN1cHBJbmZvIGJ1ZmZlclxuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlcjMyU2l6ZSA9IHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc3VwcEluZm9TaXplLCAwKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgcmVzdWx0cyBidWZmZXJcbiAgICAgICAgY29uc3Qgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplID0gc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCAqIG51bU9mVGhyZWFkcztcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlcjMyU2l6ZSA9IDMgKiBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKyBudW1PZlRocmVhZHMgKyBudW1PZlRocmVhZHM7IC8vIGksIGosIGRpc3RhbmNlcywgZm91bmQsIGRvbmVcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIG9uIHRoZSBHUFUgdG8gaG9sZCBjb21wdXRlSW5mb1xuICAgICAgICAvLyBiZXdhcmUgdGhhdCBzdHJ1Y3QgbXVzdCBiZSBwYWRkZWQgdG8gMTYgYnl0ZXMsIHNvIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgaW4gMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZSA9IGNvbXB1dGVJbmZvQnVmZmVyMzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIGxldCBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUgPSBjb21wdXRlSW5mb0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUgKz0gMTYgLSByZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdjb21wdXRlIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciA9IGNvbXB1dGVJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7IC8vIGdldCBmdWxsIGJ1ZmZlclxuICAgICAgICAvLyBkeW5hbWljIG9mZnNldCBmb3IgdGhlIGNvbXB1dGVJbmZvIGJ1ZmZlclxuICAgICAgICBsZXQgY29tcHV0ZUluZm9PZmZTZXQgPSAwO1xuICAgICAgICAvLyBmaXJzdCB3cml0ZSB0aGUgc3RhcnRBdENvbHMsIHN0YXJ0QXRSb3dzLCBlbmRBdENvbHMsIGVuZEF0Um93c1xuICAgICAgICBjb25zdCBzdGFydEF0Q29sc0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIHN0YXJ0QXRDb2xzQnVmZmVyVmlldy5zZXQoc3RhcnRBdENvbHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRSb3dzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgc3RhcnRBdFJvd3NCdWZmZXJWaWV3LnNldChzdGFydEF0Um93cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgZW5kQXRDb2xzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgZW5kQXRDb2xzQnVmZmVyVmlldy5zZXQoZW5kQXRDb2xzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBlbmRBdFJvd3NCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBlbmRBdFJvd3NCdWZmZXJWaWV3LnNldChlbmRBdFJvd3MpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIC8vIHRoZW4gd3JpdGUgdGhlIGVudHJ5U2l6ZXNcbiAgICAgICAgY29uc3QgZW50cnlTaXplc1ZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIGFycmF5U2l6ZXMubGVuZ3RoKTtcbiAgICAgICAgZW50cnlTaXplc1ZpZXcuc2V0KGFycmF5U2l6ZXMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBhcnJheVNpemVzLmxlbmd0aCAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGUgd2VpZ2h0c1xuICAgICAgICBjb25zdCB3ZWlnaHRzVmlldyA9IG5ldyBGbG9hdDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mQ29sdW1ucyk7XG4gICAgICAgIHdlaWdodHNWaWV3LnNldCh3ZWlnaHRzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZDb2x1bW5zICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAvLyBmaW5hbGx5LCB3cml0ZSB0aGUgZGF0YSBpdHNlbGZcbiAgICAgICAgZm9yIChjb25zdCBpbmZvIG9mIHByb2Nlc3NJbmZvKSB7XG4gICAgICAgICAgICBjb25zdCBBcnJheUNvbnN0cnVjdG9yID0gaW5mby5FbmNvZGVkQXJyYXlDb25zdHJ1Y3RvcjtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IGluZm8uc291cmNlQXJyYXlTaXplO1xuICAgICAgICAgICAgY29uc3QgZGF0YVZpZXcgPSBuZXcgQXJyYXlDb25zdHJ1Y3RvcihtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgY2h1bmtTaXplKTsgLy9uZXcgQXJyYXlDb25zdHJ1Y3Rvcihjb21wdXRlSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZShjb21wdXRlSW5mb09mZlNldCwgY2h1bmtCeXRlU2l6ZSkpO1xuICAgICAgICAgICAgZGF0YVZpZXcuc2V0KGluZm8uZmxhdFNvdXJjZUFycmF5KTtcbiAgICAgICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IGNodW5rU2l6ZSAqIEFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2UgYXJlIGRvbmUgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgY29tcHV0ZUluZm9CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIG9uIHRoZSBHUFUgdG8gaG9sZCBzdXBwSW5mb1xuICAgICAgICAvLyBzYW1lIGhlcmUsIHdlIG5lZWQgdG8gcGFkIHRoZSBzaXplIG9mIHRoZSBzdHJ1Y3QgdG8gMTYgYnl0ZXNcbiAgICAgICAgY29uc3Qgc3VwcEluZm9CdWZmZXJTaXplID0gc3VwcEluZm9CdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSA9IHN1cHBJbmZvQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3Qgc3VwcEluZm9SZW1haW5kZXIgPSBzdXBwSW5mb0J1ZmZlclNpemUgJiAxNTsgLy8gY2hlY2sgaWYgdGhlIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxNlxuICAgICAgICBpZiAoc3VwcEluZm9SZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUgKz0gMTYgLSBzdXBwSW5mb1JlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSA9IE1hdGgubWF4KHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSwgMTYpO1xuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdzdXBwIGluZm8gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciA9IHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7IC8vIGdldCBmdWxsIGJ1ZmZlclxuICAgICAgICBsZXQgc3VwcEluZm9PZmZTZXQgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgcHJvY2Vzc0luZm8pIHtcbiAgICAgICAgICAgIGlmIChpbmZvLnN1cHBJbmZvQnVmZmVyICYmIGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aCA+IDAgJiYgaW5mby5zdXBwSW5mb1NpemUgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgQXJyYXlDb25zdHJ1Y3RvciA9IGluZm8uc3VwcEluZm9UeXBlID09PSBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLyA/IFVpbnQzMkFycmF5IDogRmxvYXQzMkFycmF5O1xuICAgICAgICAgICAgICAgIGNvbnN0IHN1cHBJbmZvVmlldyA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIsIHN1cHBJbmZvT2ZmU2V0LCBpbmZvLnN1cHBJbmZvQnVmZmVyLmxlbmd0aCk7IC8vbmV3IEFycmF5Q29uc3RydWN0b3Ioc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2Uoc3VwcEluZm9PZmZTZXQsIGluZm8uc3VwcEluZm9CdWZmZXIuYnl0ZUxlbmd0aCkpO1xuICAgICAgICAgICAgICAgIHN1cHBJbmZvVmlldy5zZXQoaW5mby5zdXBwSW5mb0J1ZmZlcik7XG4gICAgICAgICAgICAgICAgc3VwcEluZm9PZmZTZXQgKz0gaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoOyAvLyBpbmZvLnN1cHBJbmZvQnVmZmVyLmxlbmd0aCAqIEFycmF5Q29uc3RydWN0b3IuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN1cHBJbmZvT2ZmU2V0ID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBkdW1teVZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciwgMCwgNCk7IC8vbmV3IFVpbnQzMkFycmF5KHN1cHBJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKDAsIDE2KSk7XG4gICAgICAgICAgICBkdW1teVZpZXcuc2V0KFsxLCAxLCAxLCAxXSk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwcEluZm9CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgLy8gY3JlYXRlIGEgYnVmZmVyIGZvciB0aGUgcmVzdWx0c1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyU2l6ZSA9IHJlc3VsdHNCdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplID0gcmVzdWx0c0J1ZmZlclNpemU7XG4gICAgICAgIGNvbnN0IHJlc3VsdHNSZW1haW5kZXIgPSByZXN1bHRzQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChyZXN1bHRzUmVtYWluZGVyICE9PSAwKVxuICAgICAgICAgICAgcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUgKz0gMTYgLSByZXN1bHRzUmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgY29uc3QgcmVzdWx0c0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdyZXN1bHRzIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQ1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gU2V0dXAgYSBiaW5kR3JvdXAgdG8gdGVsbCB0aGUgc2hhZGVyIHdoaWNoXG4gICAgICAgIC8vIGJ1ZmZlciB0byB1c2UgZm9yIHRoZSBjb21wdXRhdGlvblxuICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtcbiAgICAgICAgICAgIGxhYmVsOiAnYmluZEdyb3VwIGZvciBzcGFyc2UgbWF0cml4IGJ1ZmZlcicsXG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlcjogY29tcHV0ZUluZm9CdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMSwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzdXBwSW5mb0J1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAyLCByZXNvdXJjZTogeyBidWZmZXI6IHJlc3VsdHNCdWZmZXIgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vY29uc3QgcGFpckNvbXBhcmlzb25zUGVyUGFzcyA9IG1heEl0ZXJhdGlvbnNQZXJUaHJlYWQgKiBudW1PZlRocmVhZHM7XG4gICAgICAgIC8vY29uc3QgcGFzc2VzID0gTWF0aC5jZWlsKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIHBhaXJDb21wYXJpc29uc1BlclBhc3MpO1xuICAgICAgICAvLyB3ZSB3aWxsIGRpc3RwYXRjaCB0aGlzIG1hbnkgcGFzc2VzIHRvIHRoZSBHUFUsIGFuZCBpdCB3aWxsIGhhbmRsZSBpbmRleGVzIGFsbCBieSBpdHNlbGYuXG4gICAgICAgIC8vIHdlIGFscmVhZHkgY29waWVkIHRoZSBzdGFydC9lbmQgaW5mb3JtYXRpb24gdG8gaXQsIHNvIGl0IHdpbGwga25vdyB3aGVyZSB0byBzdGFydCBhbmQgZW5kIG9uIGVhY2ggcGFzcy5cbiAgICAgICAgY29uc3QgcmVzdWx0c091dEJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdyZXN1bHRzIG91dCBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcmVzdWx0c0J1ZmZlci5zaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCByZXN1bHRJcyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHRKcyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHREaXN0YW5jZXMgPSBbXTtcbiAgICAgICAgLy9sZXQgY29tYmluZWRGb3VuZCA9IDA7XG4gICAgICAgIGxldCBpc0FsbERvbmUgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFpc0FsbERvbmUpIHtcbiAgICAgICAgICAgIC8vIEVuY29kZSBjb21tYW5kcyB0byBkbyB0aGUgY29tcHV0YXRpb25cbiAgICAgICAgICAgIGNvbnN0IGVuY29kZXIgPSBkZXZpY2UuY3JlYXRlQ29tbWFuZEVuY29kZXIoe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGlzdGFuY2UgZW5jb2RlcicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhc3MgPSBlbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3Moe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZGlzdGFuY2UgY29tcHV0ZSBwYXNzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFzcy5zZXRQaXBlbGluZShwaXBlbGluZSk7XG4gICAgICAgICAgICBwYXNzLnNldEJpbmRHcm91cCgwLCBiaW5kR3JvdXApO1xuICAgICAgICAgICAgcGFzcy5kaXNwYXRjaFdvcmtncm91cHMod29ya2dyb3Vwc0RpbSwgd29ya2dyb3Vwc0RpbSk7XG4gICAgICAgICAgICBwYXNzLmVuZCgpO1xuICAgICAgICAgICAgZW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIocmVzdWx0c0J1ZmZlciwgMCwgcmVzdWx0c091dEJ1ZmZlciwgMCwgcmVzdWx0c091dEJ1ZmZlci5zaXplKTtcbiAgICAgICAgICAgIC8vIEZpbmlzaCBlbmNvZGluZyBhbmQgc3VibWl0IHRoZSBjb21tYW5kc1xuICAgICAgICAgICAgY29uc3QgY29tbWFuZEJ1ZmZlciA9IGVuY29kZXIuZmluaXNoKCk7XG4gICAgICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kQnVmZmVyXSk7XG4gICAgICAgICAgICAvLyBSZWFkIHRoZSByZXN1bHRzXG4gICAgICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICAgICAgeWllbGQgcmVzdWx0c091dEJ1ZmZlci5tYXBBc3luYyhHUFVNYXBNb2RlLlJFQUQpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c091dEFycmF5QnVmZmVyID0gcmVzdWx0c091dEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzdWx0c1xuICAgICAgICAgICAgbGV0IHJlc3VsdE9mZnNldCA9IDA7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzSSA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNKID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0Rpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogRmxvYXQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0ZvdW5kID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0RvbmUgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgICAgICBpc0FsbERvbmUgPSByZXN1bHRzRG9uZS5ldmVyeSgoZCkgPT4gZCA9PT0gMSk7XG4gICAgICAgICAgICBjb25zdCB0b3RhbFJlc3VsdHMgPSByZXN1bHRzRm91bmQucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZEkgPSBuZXcgVWludDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkSiA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWREaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBsZXQgY29tYmluZWRPZmZzZXQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgcmVzSSA9IDA7IHJlc0kgPCByZXN1bHRzRm91bmQubGVuZ3RoOyByZXNJKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IHJlc3VsdHNGb3VuZFtyZXNJXTtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmQgPT09IDApXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkSS5zZXQocmVzdWx0c0kuc3ViYXJyYXkocmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQsIHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICsgZm91bmQpLCBjb21iaW5lZE9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29tYmluZWRKLnNldChyZXN1bHRzSi5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZERpc3RhbmNlcy5zZXQocmVzdWx0c0Rpc3RhbmNlcy5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZE9mZnNldCArPSBmb3VuZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdElzLnB1c2goY29tYmluZWRJKTtcbiAgICAgICAgICAgIHJlc3VsdEpzLnB1c2goY29tYmluZWRKKTtcbiAgICAgICAgICAgIHJlc3VsdERpc3RhbmNlcy5wdXNoKGNvbWJpbmVkRGlzdGFuY2VzKTtcbiAgICAgICAgICAgIHJlc3VsdHNPdXRCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbFNpemUgPSByZXN1bHRJcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLmxlbmd0aCwgMCk7XG4gICAgICAgIGNvbnN0IGZpbmFsSSA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBjb25zdCBmaW5hbEogPSBuZXcgVWludDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgY29uc3QgZmluYWxEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGxldCBmaW5hbE9mZnNldCA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0SXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGZpbmFsSS5zZXQocmVzdWx0SXNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsSi5zZXQocmVzdWx0SnNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsRGlzdGFuY2VzLnNldChyZXN1bHREaXN0YW5jZXNbaV0sIGZpbmFsT2Zmc2V0KTtcbiAgICAgICAgICAgIGZpbmFsT2Zmc2V0ICs9IHJlc3VsdElzW2ldLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcyBydWxlIG1hbmRhdGVzLCBkZXN0cm95IGFsbCBidWZmZXJzLlxuICAgICAgICBjb21wdXRlSW5mb0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmVzdWx0c0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJlc3VsdHNPdXRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXR1cm4geyBpOiBmaW5hbEksIGo6IGZpbmFsSiwgZGlzdGFuY2U6IGZpbmFsRGlzdGFuY2VzIH07XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0KGRpc3RhbmNlTWV0cmljcywgbWF4RW50cnlMZW5zLCBtYXhEaXN0YW5jZSwgYWdncmVnYXRpb24pIHtcbiAgICBjb25zdCBkaXN0YW5jZVdnc2xzID0gZGlzdGFuY2VNZXRyaWNzLm1hcCgobWV0cmljLCBpKSA9PiB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgIGZuIGRpc3RhbmNlU2NyaXB0JHtpfShhSW5kZXg6IHUzMiwgYkluZGV4OiB1MzIpIC0+IGYzMiB7XG4gICAgICAgICAgbGV0IGEgPSBjb21wdXRlSW5mby5kYXRhJHtpfVthSW5kZXhdO1xuICAgICAgICAgIGxldCBiID0gY29tcHV0ZUluZm8uZGF0YSR7aX1bYkluZGV4XTtcbiAgICAgICAgICBsZXQgbWF4RGlzdGFuY2U6IGYzMiA9ICR7bWF4RGlzdGFuY2V9O1xuICAgICAgICAgICR7d2ViR1BVRnVuY3Rpb25zW21ldHJpY10obWF4RW50cnlMZW5zW2ldLCBpKX1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9KTtcbiAgICBjb25zdCBhbGxEaXN0YW5jZVNjcmlwdHMgPSBkaXN0YW5jZVdnc2xzLmpvaW4oJ1xcbicpO1xuICAgIGNvbnN0IGNvbWJpbmVEaXN0YW5jZXNTY3JpcHQgPSBgXG4gICAgICBmbiBjb21iaW5lZERpc3RhbmNlKGFJbmRleDogdTMyLCBiSW5kZXg6IHUzMikgLT4gZjMyIHtcbiAgICAgICAgdmFyIGRpc3RhbmNlczogYXJyYXk8ZjMyLCAke2Rpc3RhbmNlTWV0cmljcy5sZW5ndGh9PjtcbiAgICAgICAgJHtkaXN0YW5jZU1ldHJpY3MubWFwKChfLCBpKSA9PiBgZGlzdGFuY2VzWyR7aX1dID0gZGlzdGFuY2VTY3JpcHQke2l9KGFJbmRleCwgYkluZGV4KTtgKS5qb2luKCdcXG4nKX1cbiAgICAgICAgJHtXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OU1thZ2dyZWdhdGlvbl0oZGlzdGFuY2VNZXRyaWNzLmxlbmd0aCl9XG4gICAgICB9XG4gICAgXG4gICAgYDtcbiAgICByZXR1cm4gYWxsRGlzdGFuY2VTY3JpcHRzICsgJ1xcbicgKyBjb21iaW5lRGlzdGFuY2VzU2NyaXB0O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d2ViR1BVLXNwYXJzZS1tYXRyaXguanMubWFwIiwiZXhwb3J0IHZhciBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcztcbihmdW5jdGlvbiAoRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMpIHtcbiAgICBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kc1tcIkVVQ0xJREVBTlwiXSA9IFwiRVVDTElERUFOXCI7XG4gICAgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHNbXCJNQU5IQVRUQU5cIl0gPSBcIk1BTkhBVFRBTlwiO1xufSkoRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgfHwgKERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzID0ge30pKTtcbjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsZXlKMlpYSnphVzl1SWpvekxDSm1hV3hsSWpvaWRIbHdaWE11YW5NaUxDSnpiM1Z5WTJWU2IyOTBJam9pSWl3aWMyOTFjbU5sY3lJNld5SjBlWEJsY3k1MGN5SmRMQ0p1WVcxbGN5STZXMTBzSW0xaGNIQnBibWR6SWpvaVFVRkJRU3hOUVVGTkxFTkJRVTRzU1VGQldTd3dRa0ZIVkR0QlFVaElMRmRCUVZrc01FSkJRVEJDTzBsQlEyeERMSEZFUVVGMVFpeERRVUZCTzBsQlEzWkNMSEZFUVVGMVFpeERRVUZCTzBGQlEzcENMRU5CUVVNc1JVRklVeXd3UWtGQk1FSXNTMEZCTVVJc01FSkJRVEJDTEZGQlIyNURPMEZCUVVFc1EwRkJReUlzSW5OdmRYSmpaWE5EYjI1MFpXNTBJanBiSW1WNGNHOXlkQ0JsYm5WdElFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJSeklIdGNiaUFnSUNCRlZVTk1TVVJGUVU0Z1BTQW5SVlZEVEVsRVJVRk9KeXhjYmlBZ0lDQk5RVTVJUVZSVVFVNGdQU0FuVFVGT1NFRlVWRUZPSnl4Y2JpQWdmVHRjYmx4dVpYaHdiM0owSUhSNWNHVWdSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDQTlJR3RsZVc5bUlIUjVjR1Z2WmlCRWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrY3p0Y2JpSmRmUT09IiwiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHksIFR5cGVTdXBwb3J0ZWREaXN0YW5jZXMsIFdFQkdQVURJU1RBTkNFIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtbXVsdGljb2wtZGlzdGFuY2VzJztcbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVQcm9jZXNzSW5mbyhlbnRyeUxpc3QsIGRpc3RhbmNlTWV0cmljID0gV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgZW50cnlJbmRleCwgLy8gaW5kZXggb2YgdGhlIGVudHJpZXMgaW4gdGhlIGxpc3Qgb2YgbGlzdHMgdGhhdCB3ZSB3YW50IHRvIHByb2Nlc3Ncbm9wdGlvbnMgPSB7IGdhcE9wZW5QZW5hbHR5OiAxLjAsIGdhcEV4dGVuc2lvblBlbmFsdHk6IDAuNiB9KSB7XG4gICAgdmFyIF9hLCBfYjtcbiAgICBsZXQgZW50cnlUeXBlID0gbnVsbDtcbiAgICBjb25zdCBlbmNvZGVkTGlzdCA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJTVFJJTkdcIiAvKiBXR1BVRU5UUllUWVBFLlNUUklORyAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gbmV3IFVpbnQzMkFycmF5KGVudHJ5LnNwbGl0KCcnKS5tYXAoKGMpID0+IGMuY2hhckNvZGVBdCgwKSkpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnlMaXN0LnNvbWUoKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJykpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiTlVNQkVSXCIgLyogV0dQVUVOVFJZVFlQRS5OVU1CRVIgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0Lm1hcCgoZW50cnkpID0+IG5ldyBGbG9hdDMyQXJyYXkoW2VudHJ5XSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnlMaXN0WzBdID09ICdvYmplY3QnICYmIGVudHJ5TGlzdC5zb21lKChlKSA9PiAnX2RhdGEnIGluIGUgJiYgJ19sZW5ndGgnIGluIGUpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIkJJVEFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5CSVRBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gZW50cnkuX2RhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gZSBpbnN0YW5jZW9mIEludDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi87XG4gICAgICAgICAgICByZXR1cm4gZW50cnlMaXN0O1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIGVudHJ5TGlzdCBhcyBVaW50MzJBcnJheVtdO1xuICAgIH0pKCk7XG4gICAgaWYgKCFlbmNvZGVkTGlzdCB8fCAhZW50cnlUeXBlKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZW50cnkgdHlwZSwgY291bGQgbm90IGRldGVybWluZSBlbnRyeSB0eXBlIGZyb20gaW5wdXQgbGlzdCcpO1xuICAgIGNvbnN0IGVuY29kZWRMaXN0VHlwZSA9IGVuY29kZWRMaXN0WzBdIGluc3RhbmNlb2YgSW50MzJBcnJheSA/IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLyA6XG4gICAgICAgIGVuY29kZWRMaXN0WzBdIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ID8gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLyA6IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovO1xuICAgIC8vIHNpemVzIG9mIGVhY2ggZW50cmllcyBtaWdodCBkaWZmZXIsIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGF0IGZvciBzb21lIGRpc3RhbmNlIG1ldHJpY3MsIGxpa2UgaGFtbWluZyBmb3IgZXhhbXBsZVxuICAgIGNvbnN0IGFycmF5U2l6ZXMgPSBuZXcgVWludDMyQXJyYXkoZW5jb2RlZExpc3QubWFwKChhcnIpID0+IGFyci5sZW5ndGgpKTtcbiAgICBpZiAoIVR5cGVTdXBwb3J0ZWREaXN0YW5jZXNbZW50cnlUeXBlXSB8fCAhVHlwZVN1cHBvcnRlZERpc3RhbmNlc1tlbnRyeVR5cGVdLmhhcyhkaXN0YW5jZU1ldHJpYykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzdGFuY2UgbWV0cmljICcke2Rpc3RhbmNlTWV0cmljfScgbm90IHN1cHBvcnRlZCBmb3IgZW50cnkgdHlwZSAnJHtlbnRyeVR5cGV9J2ApO1xuICAgIGNvbnN0IG1heEVudHJ5TGVuID0gYXJyYXlTaXplcy5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCAwKTtcbiAgICAvLyBnZXQgdGhlIGNvbXBsZXhpdHkgb2YgdXNlZCBhbGdvcml0aG1cbiAgICBjb25zdCBjb21wbGV4aXR5ID0gZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHlbZGlzdGFuY2VNZXRyaWNdKG1heEVudHJ5TGVuKTtcbiAgICBjb25zdCBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvciA9IGVuY29kZWRMaXN0VHlwZSA9PT0gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovID8gSW50MzJBcnJheSA6XG4gICAgICAgIChlbmNvZGVkTGlzdFR5cGUgPT09IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi8gPyBGbG9hdDMyQXJyYXkgOiBVaW50MzJBcnJheSk7XG4gICAgY29uc3QgZmxhdFNvdXJjZUFycmF5ID0gbmV3IEVuY29kZWRBcnJheUNvbnN0cnVjdG9yKGVuY29kZWRMaXN0Lmxlbmd0aCAqIG1heEVudHJ5TGVuKTtcbiAgICAvLyB3aGVuIHNldHRpbmcsIHdlIG5lZWQgdG8gc2V0IGVhY2ggYXJyYXkgYXQgYSBzcGVjaWZpYyBvZmZzZXQsIHdoaWNoIGlzIGNvbnRyb2xsZWQgYnkgbWF4QXJyYXlMZW4gYmVjYXVzZSBlYWNoIGFycmF5IG1pZ2h0IGhhdmUgZGlmZmVyZW50IHNpemVzLlxuICAgIC8vIHRoaXMgd2F5IHdlIHdpbGwgZ2V0IGNvcnJlY3QgbWF0cml4IHJlcHJlc2VudGF0aW9uIGluIHRoZSBjb21wdXRlIHNoYWRlclxuICAgIGVuY29kZWRMaXN0LmZvckVhY2goKHNlcSwgaSkgPT4ge1xuICAgICAgICBmbGF0U291cmNlQXJyYXkuc2V0KHNlcSwgaSAqIG1heEVudHJ5TGVuKTtcbiAgICB9KTtcbiAgICAvLyBOQiEgYWxsIHRoaXMgYmVmb3JlIHRoZSBsaW5lIHdhcyBnZW5lcmljLCBub3cgd2UgbmVlZCB0byBjYWxjdWxhdGUgc29tZSBzcGVjaWZpYyB0aGluZ3MgZm9yIHNvbWUgc3BlY2lmaWMgZGlzdGFuY2UgbWV0cmljc1xuICAgIC8vIGluaXRpYWxpemUgc3VwcCBpbmZvIGxpbmUgdGhhdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBmaW5hbCBzaGFkZXI7XG4gICAgbGV0IHN1cHBJbmZvU3RydWN0V2dzbCA9ICcnOyAvLyB0aGUgY29kZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHN0cnVjdCBvZiBzdXBwSW5mb1xuICAgIGxldCBzdXBwSW5mb1NpemUgPSAwO1xuICAgIGxldCBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgIGxldCBzdXBwSW5mb0J1ZmZlciA9IG51bGw7XG4gICAgaWYgKGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIIHx8IGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5NT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFKSB7XG4gICAgICAgIGxldCBtYXhNb25vbWVySW5kZXggPSBvcHRpb25zLnNjb3JpbmdNYXRyaXggJiYgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgP1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5hbHBoYWJldEluZGV4ZXMpLnJlZHVjZSgocHJldiwgbikgPT4gTWF0aC5tYXgocHJldiwgbi5jaGFyQ29kZUF0KDApKSwgMCkgOiAtMTtcbiAgICAgICAgLy8gZ2VuZXJhdGUgZGVmYXVsdCBzaW1pbGFyaXR5IG1hdHJpeCBpZiBpdCBpcyBub3QgcHJvdmlkZWRcbiAgICAgICAgaWYgKCFvcHRpb25zLmFscGhhYmV0SW5kZXhlcyB8fCAhb3B0aW9ucy5zY29yaW5nTWF0cml4KSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZsYXRTb3VyY2VBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChmbGF0U291cmNlQXJyYXlbaV0gPiBtYXhNb25vbWVySW5kZXgpXG4gICAgICAgICAgICAgICAgICAgIG1heE1vbm9tZXJJbmRleCA9IGZsYXRTb3VyY2VBcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeCA9XG4gICAgICAgICAgICAgICAgbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKDApKTtcbiAgICAgICAgICAgIG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzID0ge307XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMuc2NvcmluZ01hdHJpeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2NvcmluZ01hdHJpeFtpXVtpXSA9IDE7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXNbU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHlNYXRyaXhTaXplID0gKG1heE1vbm9tZXJJbmRleCArIDEpICogKG1heE1vbm9tZXJJbmRleCArIDEpO1xuICAgICAgICBjb25zdCB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeCA9IG5ldyBBcnJheShtYXhNb25vbWVySW5kZXggKyAxKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgRmxvYXQzMkFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpKTtcbiAgICAgICAgLy8gc2V0IGRpYWdvbmFsIHRvIDFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhNb25vbWVySW5kZXggKyAxOyBpKyspXG4gICAgICAgICAgICB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXVtpXSA9IDE7XG4gICAgICAgIGNvbnN0IGFscGhhYmV0SW5kZXhlcyA9IG9wdGlvbnMuYWxwaGFiZXRJbmRleGVzO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhbHBoYWJldEluZGV4ZXMpKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleTIgb2YgT2JqZWN0LmtleXMoYWxwaGFiZXRJbmRleGVzKSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IGtleTIpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2tleS5jaGFyQ29kZUF0KDApXVtrZXkyLmNoYXJDb2RlQXQoMCldID1cbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4W2FscGhhYmV0SW5kZXhlc1trZXldXVthbHBoYWJldEluZGV4ZXNba2V5Ml1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGluIG1lbW9yeSBsYXlvdXQsIHdlIHdpbGwgaGF2ZSAyIGZsb2F0MzIgcyBmb3IgZ2FwT3BlbiBhbmQgZ2FwRXh0ZW5zaW9uIHBlbmFsdGllcywgYW5kIHRoZW4gZjMyIGFycmF5PGFycmF5PGYzMj4+IGZvciBzaW1pbGFyaXR5IG1hdHJpeC5cbiAgICAgICAgLy8gYmVjYXVzZSBvZiBwcmltaXRpdmVzLCB0aGVyZSB3aWxsIGJlIG5vIHBhZGRpbmcsIHNvIHdlIGNhbiBjYWxjdWxhdGUgdGhlIHNpemUgZGlyZWN0bHlcbiAgICAgICAgc3VwcEluZm9TaXplID0gMiArIHNpbWlsYXJpdHlNYXRyaXhTaXplO1xuICAgICAgICBzdXBwSW5mb1R5cGUgPSBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkoc3VwcEluZm9TaXplKTtcbiAgICAgICAgc3VwcEluZm9CdWZmZXJbMF0gPSAoX2EgPSBvcHRpb25zLmdhcE9wZW5QZW5hbHR5KSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiAxLjA7XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyWzFdID0gKF9iID0gb3B0aW9ucy5nYXBFeHRlbnNpb25QZW5hbHR5KSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiAwLjY7XG4gICAgICAgIGxldCBvZmZzZXQgPSAyO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBzdXBwSW5mb0J1ZmZlci5zZXQodHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV0sIG9mZnNldCk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhbaV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCA9IGBcbiAgICAgICAgICAgIGdhcE9wZW5QZW5hbHR5JHtlbnRyeUluZGV4fTogZjMyLFxuICAgICAgICAgICAgZ2FwRXh0ZW5zaW9uUGVuYWx0eSR7ZW50cnlJbmRleH06IGYzMixcbiAgICAgICAgICAgIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9OiBhcnJheTxhcnJheTxmMzIsICR7bWF4TW9ub21lckluZGV4ICsgMX0+LCAke21heE1vbm9tZXJJbmRleCArIDF9PmA7XG4gICAgfVxuICAgIGVsc2UgaWYgKGRpc3RhbmNlTWV0cmljID09PSBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlKSB7XG4gICAgICAgIC8vIGZvciBkaWZmZXJlbmNlLCB3ZSBuZWVkIHJhbmdlIG9mIHZhbHVlcyBmb3Igbm9ybWFsaXphdGlvbiBvZiB0aGUgZGlmZmVyZW5jZVxuICAgICAgICBpZiAoIW9wdGlvbnMucmFuZ2UgfHwgdHlwZW9mIG9wdGlvbnMucmFuZ2UgIT09ICdudW1iZXInIHx8IG9wdGlvbnMucmFuZ2UgPD0gMCkge1xuICAgICAgICAgICAgY29uc3QgbWluID0gZmxhdFNvdXJjZUFycmF5LnJlZHVjZSgoYSwgYikgPT4gTWF0aC5taW4oYSwgYiksIGZsYXRTb3VyY2VBcnJheVswXSk7XG4gICAgICAgICAgICBjb25zdCBtYXggPSBmbGF0U291cmNlQXJyYXkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1heChhLCBiKSwgZmxhdFNvdXJjZUFycmF5WzBdKTtcbiAgICAgICAgICAgIG9wdGlvbnMucmFuZ2UgPSBtYXggLSBtaW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMucmFuZ2UgPD0gMClcbiAgICAgICAgICAgIG9wdGlvbnMucmFuZ2UgPSAxLjA7IC8vIHRoaXMgbWVhbnMgdGhhdCBhbGwgdmFsdWVzIGFyZSB0aGUgc2FtZSwgYW5kIGFsbCBkaXN0YW5jZXMgd2lsbCBwcm9kdWNlIDAuXG4gICAgICAgIHN1cHBJbmZvU2l6ZSA9IDE7XG4gICAgICAgIHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShbb3B0aW9ucy5yYW5nZV0pO1xuICAgICAgICBzdXBwSW5mb1N0cnVjdFdnc2wgPSBgXG4gICAgICAgICAgICByYW5nZSR7ZW50cnlJbmRleH06IGYzMmA7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFUeXBlV0dTTCA9IGZsYXRTb3VyY2VBcnJheSBpbnN0YW5jZW9mIEludDMyQXJyYXkgPyAnaTMyJyA6IChmbGF0U291cmNlQXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgPyAnZjMyJyA6ICd1MzInKTtcbiAgICBjb25zdCBkYXRhU3RydWN0V2dzbCA9IGBkYXRhJHtlbnRyeUluZGV4fTogYXJyYXk8YXJyYXk8JHtkYXRhVHlwZVdHU0x9LCAke21heEVudHJ5TGVufT4sICR7ZW5jb2RlZExpc3QubGVuZ3RofT5gO1xuICAgIC8vIGZvciBub3csIG90aGVyIGRpc3RhbmNlcyBkbyBub3QgcmVxdWlyZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgc28gd2UgY2FuIHNraXAgdGhhdFxuICAgIHJldHVybiB7XG4gICAgICAgIGZsYXRTb3VyY2VBcnJheSxcbiAgICAgICAgc291cmNlQXJyYXlTaXplOiBmbGF0U291cmNlQXJyYXkubGVuZ3RoLFxuICAgICAgICBtYXhFbnRyeUxlbixcbiAgICAgICAgYXJyYXlTaXplcyxcbiAgICAgICAgY29tcGxleGl0eSxcbiAgICAgICAgc3VwcEluZm9CdWZmZXIsXG4gICAgICAgIHN1cHBJbmZvU2l6ZSxcbiAgICAgICAgc3VwcEluZm9UeXBlOiBzdXBwSW5mb1R5cGUsXG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCxcbiAgICAgICAgZW50cnlUeXBlLFxuICAgICAgICBkYXRhVHlwZVdHU0wsXG4gICAgICAgIGRhdGFTdHJ1Y3RXZ3NsLFxuICAgICAgICBFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvclxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtcHJvY2Vzcy1pbmZvLmpzLm1hcCIsImltcG9ydCB7IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeCkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U21hbGxlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMpIHtcbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuTUFOSEFUVEFOOlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgKHZhbCAqIHdlaWdodHNbaWR4XSkgKiogMiwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUoxZEdsc2N5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVRSQ0xEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc1UwRkJVeXhEUVVGRE8wRkJSVGxGTEUxQlFVMHNRMEZCUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETzBGQlJTOUVMRTFCUVUwc1ZVRkJWU3hoUVVGaExFTkJRVU1zVjBGQmNVSXNSVUZCUlN4UFFVRnBRaXhGUVVGRkxFZEJRVmNzUlVGQlJTeExRVUZoTzBsQlEyaEhMRWxCUVVrc1IwRkJSeXhIUVVGSExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONlF5eFBRVUZQTzBsQlJWUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6RkVMRmRCUVZjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5zUWl4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1NVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMGxCUTJRc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM2hETEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1dVRkJXU3hEUVVGRExGZEJRWEZDTEVWQlFVVXNUMEZCYVVJc1JVRkJSU3hIUVVGWExFVkJRVVVzUzBGQllUdEpRVU12Uml4SlFVRkpMRWRCUVVjc1IwRkJSeXhYUVVGWExFTkJRVU1zVjBGQlZ5eERRVUZETEUxQlFVMHNSMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla01zVDBGQlR6dEpRVVZVTEUxQlFVMHNWMEZCVnl4SFFVRkhMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU14UkN4WFFVRlhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRGJFSXNWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUTNoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTmtMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFF5eERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMSE5DUVVGelFpeERRVU53UXl4cFFrRkJORU1zUlVGQlJTeFBRVUZwUWp0SlFVVXZSQ3hSUVVGUkxHbENRVUZwUWl4RlFVRkZPMUZCUTNwQ0xFdEJRVXNzTUVKQlFUQkNMRU5CUVVNc1UwRkJVenRaUVVOMlF5eFBRVUZQTEVOQlFVTXNSVUZCV1N4RlFVRkZMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNKR08xbEJRMFVzVDBGQlR5eERRVUZETEVWQlFWa3NSVUZCUlN4RlFVRkZPMmRDUVVOMFFpeFpRVUZaTzJkQ1FVTmFMRTFCUVUwc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBVc1QwRkJUeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTNoQ0xFTkJRVU1zUTBGQlF6dExRVU5NTzBGQlEwZ3NRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkN3Z1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkhOOUlHWnliMjBnSnk0dmRIbHdaWE1uTzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOT2FXd2dQU0FvZURvZ1lXNTVLU0E5UGlCNElEMDlQU0J1ZFd4c0lIeDhJSGdnUFQwOUlIVnVaR1ZtYVc1bFpEdGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x1YzJWeWRGTnRZV3hzWlhJb1pHbHpkR0Z1WTJWelFYSTZJRzUxYldKbGNsdGRMQ0JwYm1SbGVHVnpPaUJ1ZFcxaVpYSmJYU3dnYm5WdE9pQnVkVzFpWlhJc0lHbHVaR1Y0T2lCdWRXMWlaWElwSUh0Y2JpQWdhV1lnS0c1MWJTQStJR1JwYzNSaGJtTmxjMEZ5VzJScGMzUmhibU5sYzBGeUxteGxibWQwYUMweFhTbGNiaUFnSUNCeVpYUjFjbTQ3WEc1Y2JpQWdZMjl1YzNRZ2JtVjNVRzl6YVhScGIyNGdQU0JrYVhOMFlXNWpaWE5CY2k1bWFXNWtTVzVrWlhnb0tIWXBJRDArSUc1MWJTQThJSFlwTzF4dUlDQmthWE4wWVc1alpYTkJjaTV3YjNBb0tUdGNiaUFnWkdsemRHRnVZMlZ6UVhJdWMzQnNhV05sS0c1bGQxQnZjMmwwYVc5dUxDQXdMQ0J1ZFcwcE8xeHVJQ0JwYm1SbGVHVnpMbkJ2Y0NncE8xeHVJQ0JwYm1SbGVHVnpMbk53YkdsalpTaHVaWGRRYjNOcGRHbHZiaXdnTUN3Z2FXNWtaWGdwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzV6WlhKMFRHRnlaMlZ5S0dScGMzUmhibU5sYzBGeU9pQnVkVzFpWlhKYlhTd2dhVzVrWlhobGN6b2diblZ0WW1WeVcxMHNJRzUxYlRvZ2JuVnRZbVZ5TENCcGJtUmxlRG9nYm5WdFltVnlLU0I3WEc0Z0lHbG1JQ2h1ZFcwZ1BDQmthWE4wWVc1alpYTkJjbHRrYVhOMFlXNWpaWE5CY2k1c1pXNW5kR2d0TVYwcFhHNGdJQ0FnY21WMGRYSnVPMXh1WEc0Z0lHTnZibk4wSUc1bGQxQnZjMmwwYVc5dUlEMGdaR2x6ZEdGdVkyVnpRWEl1Wm1sdVpFbHVaR1Y0S0NoMktTQTlQaUJ1ZFcwZ1BpQjJLVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjRzl3S0NrN1hHNGdJR1JwYzNSaGJtTmxjMEZ5TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2diblZ0S1R0Y2JpQWdhVzVrWlhobGN5NXdiM0FvS1R0Y2JpQWdhVzVrWlhobGN5NXpjR3hwWTJVb2JtVjNVRzl6YVhScGIyNHNJREFzSUdsdVpHVjRLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZuWjNKbFoyRjBhVzl1Um5WdVkzUnBiMjRvWEc0Z0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0xDQjNaV2xuYUhSek9pQnVkVzFpWlhKYlhWeHVLVG9nS0haaGJIVmxjem9nYm5WdFltVnlXMTBwSUQwK0lHNTFiV0psY2lCN1hHNGdJSE4zYVhSamFDQW9ZV2RuY21WbllYUnBiMjVOWlhSb2IyUXBJSHRjYmlBZ0lDQmpZWE5sSUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGsxQlRraEJWRlJCVGpwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUIyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJSFpoYkNBcUlIZGxhV2RvZEhOYmFXUjRYU3dnTUNrN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSEpsZEhWeWJpQW9kbk02SUc1MWJXSmxjbHRkS1NBOVBpQjdYRzRnSUNBZ0lDQWdJQzh2SUdWMVkyeHBaR1ZoYmx4dUlDQWdJQ0FnSUNCamIyNXpkQ0J6ZFcwZ1BTQjJjeTV5WldSMVkyVW9LR0ZqWXl3Z2RtRnNMQ0JwWkhncElEMCtJR0ZqWXlBcklDaDJZV3dnS2lCM1pXbG5hSFJ6VzJsa2VGMHBJQ29xSURJc0lEQXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdUV0YwYUM1emNYSjBLSE4xYlNrN1hHNGdJQ0FnSUNCOU8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiaW1wb3J0IHsgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGluc2VydFNtYWxsZXIsIGlzTmlsIH0gZnJvbSAnLi91dGlscyc7XG5leHBvcnQgY2xhc3MgU3BhcnNlTWF0cml4U2VydmljZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX3dvcmtlckNvdW50ID0gTWF0aC5tYXgobmF2aWdhdG9yLmhhcmR3YXJlQ29uY3VycmVuY3kgLSAyLCAxKTtcbiAgICB9XG4gICAgYXN5bmMgY2FsY011bHRpQ29sdW1uKHZhbHVlcywgZm5OYW1lcywgdGhyZXNob2xkLCBvcHRzID0gW3t9XSwgd2VpZ2h0cyA9IFsxXSwgYWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBtaW5UaHJlc2hvbGQgPSB2YWx1ZXNbMF0ubGVuZ3RoID4gMjAwMDAgP1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRNaW5pbWFsVGhyZXNob2xkKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpIDogMDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCA8IG1pblRocmVzaG9sZCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYHVzaW5nIHRocmVzaG9sZCAke21pblRocmVzaG9sZH1gKTtcbiAgICAgICAgICAgIHRocmVzaG9sZCA9IG1pblRocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBvcHRzLmZvckVhY2goKF8sIGkpID0+IG9wdHNbaV1bJ3RocmVzaG9sZCddID0gdGhyZXNob2xkKTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9zcGFyc2UtbWF0cml4LXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsgaTogbmV3IEludDMyQXJyYXkoMCksIGo6IG5ldyBJbnQzMkFycmF5KDApLCBkaXN0YW5jZTogbmV3IEZsb2F0MzJBcnJheSgwKSwgaWR4IH0pO1xuICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7IHZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgdGhyZXNob2xkLCBmbk5hbWVzLCBvcHRzLCB3ZWlnaHRzLCBhZ2dyZWdhdGlvbk1ldGhvZCB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHsgZGF0YTogeyBlcnJvciwgaSwgaiwgZGlzdGFuY2UgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcnNbaWR4XS50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVXb3JrZXIoeyBpLCBqLCBkaXN0YW5jZSwgaWR4IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuaS5sZW5ndGgsIDApO1xuICAgICAgICBjb25zdCBpID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgICBjb25zdCBqID0gbmV3IEludDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgICBjb25zdCBkaXN0YW5jZSA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbFNpemUpO1xuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgLy8gc2V0dGluZyB0aGUgcmVzdWx0c1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBpLnNldChyZXMuaSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGouc2V0KHJlcy5qLCBvZmZzZXQpO1xuICAgICAgICAgICAgZGlzdGFuY2Uuc2V0KHJlcy5kaXN0YW5jZSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSByZXMuaS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaSwgaiwgZGlzdGFuY2UgfTtcbiAgICB9XG4gICAgYXN5bmMgY2FsYyh2YWx1ZXMsIGZuTmFtZSwgdGhyZXNob2xkLCBvcHRzID0ge30pIHtcbiAgICAgICAgLy9zaXplIG9mIGZ1bGwgbWF0cml4XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGNNdWx0aUNvbHVtbihbdmFsdWVzXSwgW2ZuTmFtZV0sIHRocmVzaG9sZCwgW29wdHNdLCBbMV0pO1xuICAgIH1cbiAgICBhc3luYyBnZXRLTk4odmFsdWVzLCBmbk5hbWUsIG5OZWlnaGJvdXJzID0gMTUsIG9wdHMgPSB7fSkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5tdWx0aUNvbHVtbktOTihbdmFsdWVzXSwgW2ZuTmFtZV0sIG5OZWlnaGJvdXJzLCBbb3B0c10sIFsxXSk7XG4gICAgfVxuICAgIGFzeW5jIGdldFRocmVzaG9sZEtOTih2YWx1ZXMsIGZuTmFtZSwgdGhyZXNob2xkID0gMC44LCBvcHRzID0ge30pIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4oW3ZhbHVlc10sIFtmbk5hbWVdLCB0aHJlc2hvbGQsIFtvcHRzXSwgWzFdKTtcbiAgICB9XG4gICAgYXN5bmMgbXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4odmFsdWVzLCBmbk5hbWVzLCB0aHJlc2hvbGQgPSAwLjgsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOKSB7XG4gICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoICE9PSBmbk5hbWVzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSBvcHRzLmxlbmd0aCB8fCB2YWx1ZXMubGVuZ3RoICE9PSB3ZWlnaHRzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmFsdWVzLCBkaXN0YW5jZSBmdW5jdGlvbnMsIG9wdGlvbnMgYW5kIHdlaWdodHMgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgICBpZiAodmFsdWVzLnNvbWUoKHYpID0+IHYubGVuZ3RoICE9PSB2YWx1ZXNbMF0ubGVuZ3RoKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYWxsIHZhbHVlcyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXNbMF0ubGVuZ3RoICogKHZhbHVlc1swXS5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCB3b3JrZXJzID0gbmV3IEFycmF5KHRoaXMuX3dvcmtlckNvdW50KVxuICAgICAgICAgICAgLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBXb3JrZXIobmV3IFVSTCgnLi9rbm4tdGhyZXNob2xkLXdvcmtlcicsIGltcG9ydC5tZXRhLnVybCkpKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICBwcm9taXNlc1tpZHhdID0gbmV3IFByb21pc2UoKHJlc29sdmVXb3JrZXIsIHJlamVjdFdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuZElkeCA9IGlkeCA9PT0gdGhpcy5fd29ya2VyQ291bnQgLSAxID8gbWF0U2l6ZSA6IChpZHggKyAxKSAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgICAgICBpZiAoZW5kSWR4IDw9IHN0YXJ0SWR4KVxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkoMCksIGtubkluZGV4ZXM6IG5ldyBBcnJheSgwKSB9KTtcbiAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0ucG9zdE1lc3NhZ2UoeyB2YWx1ZXMsIHN0YXJ0SWR4LCBlbmRJZHgsIGZuTmFtZXMsIG9wdHMsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgfSk7XG4gICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7IGRhdGE6IHsgZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlcyB9IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7IGtubkRpc3RhbmNlcywga25uSW5kZXhlcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBrbm5TaXplcyA9IG5ldyBJbnQzMkFycmF5KHZhbHVlc1swXS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSlcbiAgICAgICAgICAgICAgICBrbm5TaXplc1tpXSArPSByZXMua25uSW5kZXhlc1tpXT8ubGVuZ3RoID8/IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qga25uUmVzID0ge1xuICAgICAgICAgICAga25uRGlzdGFuY2VzOiBuZXcgQXJyYXkodmFsdWVzWzBdLmxlbmd0aCkuZmlsbChudWxsKS5tYXAoKF8sIGkpID0+IG5ldyBBcnJheShrbm5TaXplc1tpXSkpLFxuICAgICAgICAgICAga25uSW5kZXhlczogbmV3IEFycmF5KHZhbHVlc1swXS5sZW5ndGgpLmZpbGwobnVsbCkubWFwKChfLCBpKSA9PiBuZXcgQXJyYXkoa25uU2l6ZXNbaV0pKVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBrbm5SZXMua25uRGlzdGFuY2VzW2ldW2tublNpemVzW2ldIC0gMV0gPSByZXMua25uRGlzdGFuY2VzW2ldW2pdO1xuICAgICAgICAgICAgICAgICAgICBrbm5SZXMua25uSW5kZXhlc1tpXVtrbm5TaXplc1tpXSAtIDFdID0gcmVzLmtubkluZGV4ZXNbaV1bal07XG4gICAgICAgICAgICAgICAgICAgIGtublNpemVzW2ldIC09IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuICAgIGFzeW5jIG11bHRpQ29sdW1uS05OKHZhbHVlcywgZm5OYW1lcywgbk5laWdoYm91cnMgPSAxNSwgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggIT09IGZuTmFtZXMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IG9wdHMubGVuZ3RoIHx8IHZhbHVlcy5sZW5ndGggIT09IHdlaWdodHMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd2YWx1ZXMsIGRpc3RhbmNlIGZ1bmN0aW9ucywgb3B0aW9ucyBhbmQgd2VpZ2h0cyBhcnJheXMgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbGVuZ3RoJyk7XG4gICAgICAgIGlmICh2YWx1ZXMuc29tZSgodikgPT4gdi5sZW5ndGggIT09IHZhbHVlc1swXS5sZW5ndGgpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhbGwgdmFsdWVzIGFycmF5cyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBsZW5ndGgnKTtcbiAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihtYXRTaXplIC8gdGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICBjb25zdCBwcm9taXNlcyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgIGNvbnN0IHdvcmtlcnMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpXG4gICAgICAgICAgICAuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IFdvcmtlcihuZXcgVVJMKCcuL2tubi13b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKSk7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHRoaXMuX3dvcmtlckNvdW50OyBpZHgrKykge1xuICAgICAgICAgICAgcHJvbWlzZXNbaWR4XSA9IG5ldyBQcm9taXNlKChyZXNvbHZlV29ya2VyLCByZWplY3RXb3JrZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzdGFydElkeCA9IGlkeCAqIGNodW5rU2l6ZTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgaWYgKGVuZElkeCA8PSBzdGFydElkeClcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7IGtubkRpc3RhbmNlczogbmV3IEFycmF5KDApLCBrbm5JbmRleGVzOiBuZXcgQXJyYXkoMCkgfSk7XG4gICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnBvc3RNZXNzYWdlKHsgdmFsdWVzLCBzdGFydElkeCwgZW5kSWR4LCBmbk5hbWVzLCBvcHRzLCBuTmVpZ2hib3Vycywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgfSk7XG4gICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLm9ubWVzc2FnZSA9ICh7IGRhdGE6IHsgZXJyb3IsIGtubkRpc3RhbmNlcywga25uSW5kZXhlcyB9IH0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3RXb3JrZXIoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Vyc1tpZHhdLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVdvcmtlcih7IGtubkRpc3RhbmNlcywga25uSW5kZXhlcyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgICAgICBjb25zdCBrbm5SZXMgPSB7XG4gICAgICAgICAgICBrbm5EaXN0YW5jZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXkobk5laWdoYm91cnMpLmZpbGwoOTk5OTkpKSxcbiAgICAgICAgICAgIGtubkluZGV4ZXM6IG5ldyBBcnJheSh2YWx1ZXNbMF0ubGVuZ3RoKS5maWxsKG51bGwpLm1hcCgoKSA9PiBuZXcgQXJyYXkobk5laWdoYm91cnMpLmZpbGwoLTEpKVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlc1swXS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVzLmtubkRpc3RhbmNlc1tpXT8ubGVuZ3RoID8/IDA7ICsrailcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0U21hbGxlcihrbm5SZXMua25uRGlzdGFuY2VzW2ldLCBrbm5SZXMua25uSW5kZXhlc1tpXSwgcmVzLmtubkRpc3RhbmNlc1tpXVtqXSwgcmVzLmtubkluZGV4ZXNbaV1bal0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrbm5SZXM7XG4gICAgfVxuICAgIGFzeW5jIGdldFNhbXBsZURpc3RhbmNlcyh2YWx1ZXMsIGZuTmFtZXMsIG9wdHMgPSBbXSwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QgPSBEaXN0YW5jZUFnZ3JlZ2F0aW9uTWV0aG9kcy5FVUNMSURFQU4pIHtcbiAgICAgICAgY29uc3QgdGhyZXNob2xkV29ya2VycyA9IG5ldyBBcnJheSh0aGlzLl93b3JrZXJDb3VudCkuZmlsbChudWxsKVxuICAgICAgICAgICAgLm1hcCgoKSA9PiBuZXcgV29ya2VyKG5ldyBVUkwoJy4vc3BhcnNlLW1hdHJpeC10aHJlc2hvbGQtd29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbWF0U2l6ZSA9IHZhbHVlc1swXS5sZW5ndGggKiAodmFsdWVzWzBdLmxlbmd0aCAtIDEpIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGNodW5rU2l6ZSA9IE1hdGguZmxvb3IobWF0U2l6ZSAvIHRoaXMuX3dvcmtlckNvdW50KTtcbiAgICAgICAgICAgIGNvbnN0IG1heFNhbXBsZVNpemUgPSAxMDAwMDAwO1xuICAgICAgICAgICAgY29uc3Qgc2FtcGxlU2lzZSA9IE1hdGgubWF4KE1hdGgubWluKG1hdFNpemUgLyAxMDAwLCBtYXhTYW1wbGVTaXplKSwgTWF0aC5taW4obWF0U2l6ZSwgbWF4U2FtcGxlU2l6ZSkpO1xuICAgICAgICAgICAgY29uc3QgdGVzdFNldFNpemVQZXJXb3JrZXIgPSBNYXRoLmZsb29yKHNhbXBsZVNpc2UgLyB0aGlzLl93b3JrZXJDb3VudCk7XG4gICAgICAgICAgICBjb25zdCB0UHJvbWlzZXMgPSBuZXcgQXJyYXkodGhpcy5fd29ya2VyQ291bnQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgdGhpcy5fd29ya2VyQ291bnQ7IGlkeCsrKSB7XG4gICAgICAgICAgICAgICAgdFByb21pc2VzW2lkeF0gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZVdvcmtlciwgcmVqZWN0V29ya2VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gaWR4ICogY2h1bmtTaXplO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRJZHggPSBpZHggPT09IHRoaXMuX3dvcmtlckNvdW50IC0gMSA/IG1hdFNpemUgOiAoaWR4ICsgMSkgKiBjaHVua1NpemU7XG4gICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZFdvcmtlcnNbaWR4XS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHZhbHVlcywgc3RhcnRJZHgsIGVuZElkeCwgc2FtcGxlTGVuZ3RoOiB0ZXN0U2V0U2l6ZVBlcldvcmtlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuTmFtZXMsIG9wdHMsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0ub25tZXNzYWdlID0gKHsgZGF0YTogeyBlcnJvciwgZGlzdGFuY2UgfSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzW2lkeF0udGVybWluYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0V29ya2VyKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlV29ya2VyKHsgZGlzdGFuY2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwodFByb21pc2VzKTtcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxTaXplID0gcmVzdWx0cy5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwuZGlzdGFuY2UubGVuZ3RoLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gbmV3IEZsb2F0MzJBcnJheShmdWxsU2l6ZSk7XG4gICAgICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzIG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZS5zZXQocmVzLmRpc3RhbmNlLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgIG9mZnNldCArPSByZXMuZGlzdGFuY2UubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGlzdGFuY2Uuc29ydCgpO1xuICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJlc2hvbGRXb3JrZXJzPy5mb3JFYWNoKCh3KSA9PiB3Py50ZXJtaW5hdGUoKSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdDMyQXJyYXkoMSkuZmlsbCgwLjUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGdldE1pbmltYWxUaHJlc2hvbGQodmFsdWVzLCBmbk5hbWVzLCBvcHRzID0gW10sIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kID0gRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuRVVDTElERUFOKSB7XG4gICAgICAgIC8vV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIG1pbmltYWwgdGhyZXNob2xkIGZpcnN0LFxuICAgICAgICAvL2luIG9yZGVyIHRvIGdldCBtYXRyaXggc3VjaCB0aGF0IGl0IGRvZXMgbm90IGV4Y2VlZCB0aGUgbWF4aW11bSBzaXplIG9mIDFHQlxuICAgICAgICAvL3dlIGhhdmUgMyByZXR1cm4gYXJyYXlzLCBlYWNoIDQgYml0ZXMgcGVyIGVsZW1lbnQsIHNvIGlmIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG1hdHJpeCBpcyAxR0IsXG4gICAgICAgIGNvbnN0IG1heFNwYXJzZU1hdHJpeFNpemUgPSA3MDAwMDAwMDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG1hdFNpemUgPSB2YWx1ZXMubGVuZ3RoICogKHZhbHVlcy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IGF3YWl0IHRoaXMuZ2V0U2FtcGxlRGlzdGFuY2VzKHZhbHVlcywgZm5OYW1lcywgb3B0cywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25JbmRleCA9IE1hdGguZmxvb3IobWF4U3BhcnNlTWF0cml4U2l6ZSAvIG1hdFNpemUgKiBkaXN0YW5jZS5sZW5ndGgpO1xuICAgICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMSAtIGRpc3RhbmNlW2ZyYWN0aW9uSW5kZXhdO1xuICAgICAgICAgICAgLy8gdGhyZXNob2xkID0gTWF0aC5tYXgodGhyZXNob2xkLCAwLjMpO1xuICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZDtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgIHJldHVybiAwLjU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3RhdGljIGNhbGNTeW5jKHZhbHVlcywgZm5OYW1lLCBkaXN0YW5jZUZuLCB0aHJlc2hvbGQpIHtcbiAgICAgICAgY29uc3QgaSA9IFtdO1xuICAgICAgICBjb25zdCBqID0gW107XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlcyA9IFtdO1xuICAgICAgICBsZXQgY250ID0gMDtcbiAgICAgICAgbGV0IG1pID0gMDtcbiAgICAgICAgbGV0IG1qID0gMDtcbiAgICAgICAgY29uc3QgZnVsbFNpemUgPSB2YWx1ZXMubGVuZ3RoICogKHZhbHVlcy5sZW5ndGggLSAxKSAvIDI7XG4gICAgICAgIHdoaWxlIChjbnQgPCBmdWxsU2l6ZSkge1xuICAgICAgICAgICAgLy9jb25zdCB2YWx1ZSA9IHNlcTFMaXN0W21pXSAmJiBzZXExTGlzdFttal0gPyBoYW1taW5nKHNlcTFMaXN0W21pXSwgc2VxMUxpc3RbbWpdKSA6IDA7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICFpc05pbCh2YWx1ZXNbbWldKSAmJiAhaXNOaWwodmFsdWVzW21qXSkgP1xuICAgICAgICAgICAgICAgIGRpc3RhbmNlRm4odmFsdWVzW21pXSwgdmFsdWVzW21qXSkgOiAxO1xuICAgICAgICAgICAgY29uc3Qgc2ltaWxhcml0eSA9IDEgLSB2YWx1ZTtcbiAgICAgICAgICAgIGlmIChzaW1pbGFyaXR5ID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGkucHVzaChtaSk7XG4gICAgICAgICAgICAgICAgai5wdXNoKG1qKTtcbiAgICAgICAgICAgICAgICBkaXN0YW5jZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjbnQrKztcbiAgICAgICAgICAgIG1qKys7XG4gICAgICAgICAgICBpZiAobWogPT09IHZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBtaSsrO1xuICAgICAgICAgICAgICAgIG1qID0gbWkgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlBcnJheSA9IG5ldyBJbnQzMkFycmF5KGkpO1xuICAgICAgICBjb25zdCBqQXJyYXkgPSBuZXcgSW50MzJBcnJheShqKTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoZGlzdGFuY2VzKTtcbiAgICAgICAgcmV0dXJuIHsgaTogaUFycmF5LCBqOiBqQXJyYXksIGRpc3RhbmNlOiBkaXN0YW5jZUFycmF5IH07XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYzNCaGNuTmxMVzFoZEhKcGVDMXpaWEoyYVdObExtcHpJaXdpYzI5MWNtTmxVbTl2ZENJNklpSXNJbk52ZFhKalpYTWlPbHNpYzNCaGNuTmxMVzFoZEhKcGVDMXpaWEoyYVdObExuUnpJbDBzSW01aGJXVnpJanBiWFN3aWJXRndjR2x1WjNNaU9pSkJRVU5CTEU5QlFVOHNSVUZCTkVJc01FSkJRVEJDTEVWQlFVTXNUVUZCVFN4VFFVRlRMRU5CUVVNN1FVRkRPVVVzVDBGQlR5eEZRVUZETEdGQlFXRXNSVUZCUlN4TFFVRkxMRVZCUVVNc1RVRkJUU3hUUVVGVExFTkJRVU03UVVGaE4wTXNUVUZCVFN4UFFVRlBMRzFDUVVGdFFqdEpRVVUxUWp0UlFVTkZMRWxCUVVrc1EwRkJReXhaUVVGWkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4VFFVRlRMRU5CUVVNc2JVSkJRVzFDTEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pGTEVOQlFVTTdTVUZGVFN4TFFVRkxMRU5CUVVNc1pVRkJaU3hEUVVGRExFMUJRVzlDTEVWQlFVVXNUMEZCZFVJc1JVRkRlRVVzVTBGQmFVSXNSVUZCUlN4UFFVRTJRaXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEZWQlFXOUNMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRemRGTEc5Q1FVRXJReXd3UWtGQk1FSXNRMEZCUXl4VFFVRlRPMUZCUlc1R0xFMUJRVTBzVDBGQlR5eEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTVSQ3hOUVVGTkxGTkJRVk1zUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdVVUZGTVVRc1RVRkJUU3haUVVGWkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1IwRkJSeXhMUVVGTkxFTkJRVU1zUTBGQlF6dFpRVU01UXl4TlFVRk5MRWxCUVVrc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4TlFVRk5MRVZCUVVVc1QwRkJUeXhGUVVGRkxFbEJRVWtzUlVGQlJTeFBRVUZQTEVWQlFVVXNhVUpCUVdsQ0xFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNoR0xFbEJRVWtzVTBGQlV5eEhRVUZITEZsQlFWa3NSVUZCUlR0WlFVTTFRaXhQUVVGUExFTkJRVU1zUjBGQlJ5eERRVUZETEcxQ1FVRnRRaXhaUVVGWkxFVkJRVVVzUTBGQlF5eERRVUZETzFsQlF5OURMRk5CUVZNc1IwRkJSeXhaUVVGWkxFTkJRVU03VTBGRE1VSTdVVUZEUkN4SlFVRkpMRU5CUVVNc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXl4SFFVRkhMRk5CUVZNc1EwRkJReXhEUVVGRE8xRkJRM3BFTEUxQlFVMHNVVUZCVVN4SFFVTmFMRWxCUVVrc1MwRkJTeXhEUVVFNFFpeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1VVRkZOVVFzVFVGQlRTeFBRVUZQTEVkQlFVY3NTVUZCU1N4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF6dGhRVU42UXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUjBGQlJ5eERRVUZETEhkQ1FVRjNRaXhGUVVGRkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM2hHTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRk8xbEJRMmhFTEZGQlFWRXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhKUVVGSkxFOUJRVThzUTBGQlF5eERRVUZETEdGQlFXRXNSVUZCUlN4WlFVRlpMRVZCUVVVc1JVRkJSVHRuUWtGRE1VUXNUVUZCVFN4UlFVRlJMRWRCUVVjc1IwRkJSeXhIUVVGSExGTkJRVk1zUTBGQlF6dG5Ra0ZEYWtNc1RVRkJUU3hOUVVGTkxFZEJRVWNzUjBGQlJ5eExRVUZMTEVsQlFVa3NRMEZCUXl4WlFVRlpMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEZOQlFWTXNRMEZCUXp0blFrRkRMMFVzU1VGQlNTeE5RVUZOTEVsQlFVa3NVVUZCVVR0dlFrRkRjRUlzWVVGQllTeERRVUZETEVWQlFVTXNRMEZCUXl4RlFVRkZMRWxCUVVrc1ZVRkJWU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4SlFVRkpMRlZCUVZVc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeFJRVUZSTEVWQlFVVXNTVUZCU1N4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzUjBGQlJ5eEZRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRiRWNzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRmRCUVZjc1EwRkJReXhGUVVGRExFMUJRVTBzUlVGQlJTeFJRVUZSTEVWQlFVVXNUVUZCVFN4RlFVRkZMRk5CUVZNc1JVRkJSU3hQUVVGUExFVkJRVVVzU1VGQlNTeEZRVUZGTEU5QlFVOHNSVUZCUlN4cFFrRkJhVUlzUlVGQlF5eERRVUZETEVOQlFVTTdaMEpCUXpOSExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4VFFVRlRMRWRCUVVjc1EwRkJReXhGUVVGRExFbEJRVWtzUlVGQlJTeEZRVUZETEV0QlFVc3NSVUZCUlN4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxGRkJRVkVzUlVGQlF5eEZRVUZETEVWQlFWRXNSVUZCUlR0dlFrRkRha1VzU1VGQlNTeExRVUZMTEVWQlFVVTdkMEpCUTFRc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZOQlFWTXNSVUZCUlN4RFFVRkRPM2RDUVVONlFpeFpRVUZaTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN2NVSkJRM0pDTzNsQ1FVRk5PM2RDUVVOTUxFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4VFFVRlRMRVZCUVVVc1EwRkJRenQzUWtGRGVrSXNZVUZCWVN4RFFVRkRMRVZCUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeFJRVUZSTEVWQlFVVXNSMEZCUnl4RlFVRkRMRU5CUVVNc1EwRkJRenR4UWtGRGRFTTdaMEpCUTBnc1EwRkJReXhEUVVGRE8xbEJRMG9zUTBGQlF5eERRVUZETEVOQlFVTTdVMEZEU2p0UlFVVkVMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRSUVVNMVF5eE5RVUZOTEZGQlFWRXNSMEZCUnl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRM0pGTEUxQlFVMHNRMEZCUXl4SFFVRkhMRWxCUVVrc1ZVRkJWU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETzFGQlEyNURMRTFCUVUwc1EwRkJReXhIUVVGSExFbEJRVWtzVlVGQlZTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMUZCUTI1RExFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRkZCUVZFc1EwRkJReXhEUVVGRE8xRkJRelZETEVsQlFVa3NUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVObUxITkNRVUZ6UWp0UlFVTjBRaXhMUVVGTExFMUJRVTBzUjBGQlJ5eEpRVUZKTEU5QlFVOHNSVUZCUlR0WlFVTjZRaXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03V1VGRGNrSXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEZRVUZGTEUxQlFVMHNRMEZCUXl4RFFVRkRPMWxCUTNKQ0xGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RFFVRkRMRkZCUVZFc1JVRkJSU3hOUVVGTkxFTkJRVU1zUTBGQlF6dFpRVU51UXl4TlFVRk5MRWxCUVVrc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTTdVMEZEZUVJN1VVRkRSQ3hQUVVGUExFVkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4UlFVRlJMRVZCUVVNc1EwRkJRenRKUVVNeFFpeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJTU3hOUVVGblFpeEZRVUZGTEUxQlFXOUNMRVZCUVVVc1UwRkJhVUlzUlVGQlJTeFBRVUV5UWl4RlFVRkZPMUZCUXpOSExIRkNRVUZ4UWp0UlFVTnlRaXhQUVVGUExFMUJRVTBzU1VGQlNTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRTFCUVUwc1EwRkJReXhGUVVGRkxFTkJRVU1zVFVGQlRTeERRVUZETEVWQlFVVXNVMEZCVXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTJoR0xFTkJRVU03U1VGRlRTeExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVTnFRaXhOUVVGclFpeEZRVUZGTEUxQlFXOUNMRVZCUVVVc1kwRkJjMElzUlVGQlJTeEZRVUZGTEU5QlFUSkNMRVZCUVVVN1VVRkZha2NzVDBGQlR5eE5RVUZOTEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUlVGQlJTeERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRmRCUVZjc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOcVJpeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMR1ZCUVdVc1EwRkRNVUlzVFVGQmEwSXNSVUZCUlN4TlFVRnZRaXhGUVVGRkxGbEJRVzlDTEVkQlFVY3NSVUZCUlN4UFFVRXlRaXhGUVVGRk8xRkJSV2hITEU5QlFVOHNUVUZCVFN4SlFVRkpMRU5CUVVNc2RVSkJRWFZDTEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNc1JVRkJSU3hEUVVGRExFMUJRVTBzUTBGQlF5eEZRVUZGTEZOQlFWTXNSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTjRSaXhEUVVGRE8wbEJSVTBzUzBGQlN5eERRVUZETEhWQ1FVRjFRaXhEUVVGRExFMUJRWGxDTEVWQlFVVXNUMEZCZFVJc1JVRkJSU3haUVVGdlFpeEhRVUZITEVWQlF6bEhMRWxCUVRCQ0xFVkJRVVVzVDBGQmFVSXNSVUZETjBNc2IwSkJRU3RETERCQ1FVRXdRaXhEUVVGRExGTkJRVk03VVVGRmJrWXNTVUZCU1N4TlFVRk5MRU5CUVVNc1RVRkJUU3hMUVVGTExFOUJRVThzUTBGQlF5eE5RVUZOTEVsQlFVa3NUVUZCVFN4RFFVRkRMRTFCUVUwc1MwRkJTeXhKUVVGSkxFTkJRVU1zVFVGQlRTeEpRVUZKTEUxQlFVMHNRMEZCUXl4TlFVRk5MRXRCUVVzc1QwRkJUeXhEUVVGRExFMUJRVTA3V1VGRGRrY3NUVUZCVFN4SlFVRkpMRXRCUVVzc1EwRkJReXh2UmtGQmIwWXNRMEZCUXl4RFFVRkRPMUZCUlhoSExFbEJRVWtzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNTMEZCU3l4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETzFsQlEyNUVMRTFCUVUwc1NVRkJTU3hMUVVGTExFTkJRVU1zSzBOQlFTdERMRU5CUVVNc1EwRkJRenRSUVVWdVJTeE5RVUZOTEU5QlFVOHNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zVFVGQlRTeEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRPVVFzVFVGQlRTeFRRVUZUTEVkQlFVY3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhQUVVGUExFZEJRVWNzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUXpGRUxFMUJRVTBzVVVGQlVTeEhRVU5hTEVsQlFVa3NTMEZCU3l4RFFVRnhRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdVVUZEYmtRc1RVRkJUU3hQUVVGUExFZEJRVWNzU1VGQlNTeExRVUZMTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJRenRoUVVONlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRWxCUVVrc1IwRkJSeXhEUVVGRExIZENRVUYzUWl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNoR0xFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZPMWxCUTJoRUxGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExHRkJRV0VzUlVGQlJTeFpRVUZaTEVWQlFVVXNSVUZCUlR0blFrRkRNVVFzVFVGQlRTeFJRVUZSTEVkQlFVY3NSMEZCUnl4SFFVRkhMRk5CUVZNc1EwRkJRenRuUWtGRGFrTXNUVUZCVFN4TlFVRk5MRWRCUVVjc1IwRkJSeXhMUVVGTExFbEJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExGTkJRVk1zUTBGQlF6dG5Ra0ZETDBVc1NVRkJTU3hOUVVGTkxFbEJRVWtzVVVGQlVUdHZRa0ZEY0VJc1lVRkJZU3hEUVVGRExFVkJRVU1zV1VGQldTeEZRVUZGTEVsQlFVa3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxGVkJRVlVzUlVGQlJTeEpRVUZKTEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU03WjBKQlEzaEZMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFhRVUZYTEVOQlFVTXNSVUZCUXl4TlFVRk5MRVZCUVVVc1VVRkJVU3hGUVVGRkxFMUJRVTBzUlVGQlJTeFBRVUZQTEVWQlFVVXNTVUZCU1N4RlFVRkZMRk5CUVZNc1JVRkJSU3hQUVVGUExFVkJRVVVzYVVKQlFXbENMRVZCUVVNc1EwRkJReXhEUVVGRE8yZENRVU16Unl4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVTBGQlV5eEhRVUZITEVOQlFVTXNSVUZCUXl4SlFVRkpMRVZCUVVVc1JVRkJReXhMUVVGTExFVkJRVVVzV1VGQldTeEZRVUZGTEZWQlFWVXNSVUZCUXl4RlFVRkRMRVZCUVZFc1JVRkJSVHR2UWtGRE0wVXNTVUZCU1N4TFFVRkxMRVZCUVVVN2QwSkJRMVFzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRE8zZENRVU42UWl4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03Y1VKQlEzSkNPM2xDUVVGTk8zZENRVU5NTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dDNRa0ZEZWtJc1lVRkJZU3hEUVVGRExFVkJRVU1zV1VGQldTeEZRVUZGTEZWQlFWVXNSVUZCUXl4RFFVRkRMRU5CUVVNN2NVSkJRek5ETzJkQ1FVTklMRU5CUVVNc1EwRkJRenRaUVVOS0xFTkJRVU1zUTBGQlF5eERRVUZETzFOQlEwbzdVVUZGUkN4TlFVRk5MRTlCUVU4c1IwRkJSeXhOUVVGTkxFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkROVU1zVFVGQlRTeFJRVUZSTEVkQlFVY3NTVUZCU1N4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMUZCUTJ4RUxFdEJRVXNzVFVGQlRTeEhRVUZITEVsQlFVa3NUMEZCVHl4RlFVRkZPMWxCUTNwQ0xFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRVZCUVVVc1EwRkJRenRuUWtGRGRrTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFZEJRVWNzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1RVRkJUU3hKUVVGSkxFTkJRVU1zUTBGQlF6dFRRVU5xUkR0UlFVTkVMRTFCUVUwc1RVRkJUU3hIUVVGak8xbEJRM2hDTEZsQlFWa3NSVUZCUlN4SlFVRkpMRXRCUVVzc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJTeERRVUZETEVsQlFVa3NTMEZCU3l4RFFVRlRMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEyeEhMRlZCUVZVc1JVRkJSU3hKUVVGSkxFdEJRVXNzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWxCUVVrc1MwRkJTeXhEUVVGVExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMU5CUVVNc1EwRkJRenRSUVVOd1J5eExRVUZMTEUxQlFVMHNSMEZCUnl4SlFVRkpMRTlCUVU4c1JVRkJSVHRaUVVONlFpeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdG5Ra0ZEZWtNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWRCUVVjc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNUVUZCVFN4SlFVRkpMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zUlVGQlJUdHZRa0ZEZWtRc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0dlFrRkRha1VzVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRE4wUXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF6dHBRa0ZEYkVJN1lVRkRSanRUUVVOR08xRkJRMFFzVDBGQlR5eE5RVUZOTEVOQlFVTTdTVUZEYUVJc1EwRkJRenRKUVVWTkxFdEJRVXNzUTBGQlF5eGpRVUZqTEVOQlFVTXNUVUZCZVVJc1JVRkJSU3hQUVVGMVFpeEZRVUZGTEdOQlFYTkNMRVZCUVVVc1JVRkRkRWNzU1VGQk1FSXNSVUZCUlN4UFFVRnBRaXhGUVVNM1F5eHZRa0ZCSzBNc01FSkJRVEJDTEVOQlFVTXNVMEZCVXp0UlFVVnVSaXhKUVVGSkxFMUJRVTBzUTBGQlF5eE5RVUZOTEV0QlFVc3NUMEZCVHl4RFFVRkRMRTFCUVUwc1NVRkJTU3hOUVVGTkxFTkJRVU1zVFVGQlRTeExRVUZMTEVsQlFVa3NRMEZCUXl4TlFVRk5MRWxCUVVrc1RVRkJUU3hEUVVGRExFMUJRVTBzUzBGQlN5eFBRVUZQTEVOQlFVTXNUVUZCVFR0WlFVTjJSeXhOUVVGTkxFbEJRVWtzUzBGQlN5eERRVUZETEc5R1FVRnZSaXhEUVVGRExFTkJRVU03VVVGRmVFY3NTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hMUVVGTExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRU5CUVVNN1dVRkRia1FzVFVGQlRTeEpRVUZKTEV0QlFVc3NRMEZCUXl3clEwRkJLME1zUTBGQlF5eERRVUZETzFGQlJXNUZMRTFCUVUwc1QwRkJUeXhIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU01UkN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEU5QlFVOHNSMEZCUnl4SlFVRkpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03VVVGRE1VUXNUVUZCVFN4UlFVRlJMRWRCUTFvc1NVRkJTU3hMUVVGTExFTkJRWEZDTEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJRenRSUVVOdVJDeE5RVUZOTEU5QlFVOHNSMEZCUnl4SlFVRkpMRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETzJGQlEzcERMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTXNZMEZCWXl4RlFVRkZMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXpsRkxFdEJRVXNzU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RlFVRkZMRWRCUVVjc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RlFVRkZPMWxCUTJoRUxGRkJRVkVzUTBGQlF5eEhRVUZITEVOQlFVTXNSMEZCUnl4SlFVRkpMRTlCUVU4c1EwRkJReXhEUVVGRExHRkJRV0VzUlVGQlJTeFpRVUZaTEVWQlFVVXNSVUZCUlR0blFrRkRNVVFzVFVGQlRTeFJRVUZSTEVkQlFVY3NSMEZCUnl4SFFVRkhMRk5CUVZNc1EwRkJRenRuUWtGRGFrTXNUVUZCVFN4TlFVRk5MRWRCUVVjc1IwRkJSeXhMUVVGTExFbEJRVWtzUTBGQlF5eFpRVUZaTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExGTkJRVk1zUTBGQlF6dG5Ra0ZETDBVc1NVRkJTU3hOUVVGTkxFbEJRVWtzVVVGQlVUdHZRa0ZEY0VJc1lVRkJZU3hEUVVGRExFVkJRVU1zV1VGQldTeEZRVUZGTEVsQlFVa3NTMEZCU3l4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxGVkJRVlVzUlVGQlJTeEpRVUZKTEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJReXhEUVVGRExFTkJRVU03WjBKQlEzaEZMRTlCUVU4c1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eFhRVUZYTEVOQlFVTXNSVUZCUXl4TlFVRk5MRVZCUVVVc1VVRkJVU3hGUVVGRkxFMUJRVTBzUlVGQlJTeFBRVUZQTEVWQlFVVXNTVUZCU1N4RlFVRkZMRmRCUVZjc1JVRkJSU3hQUVVGUExFVkJRVVVzYVVKQlFXbENMRVZCUVVNc1EwRkJReXhEUVVGRE8yZENRVU0zUnl4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zVTBGQlV5eEhRVUZITEVOQlFVTXNSVUZCUXl4SlFVRkpMRVZCUVVVc1JVRkJReXhMUVVGTExFVkJRVVVzV1VGQldTeEZRVUZGTEZWQlFWVXNSVUZCUXl4RlFVRkRMRVZCUVZFc1JVRkJSVHR2UWtGRE0wVXNTVUZCU1N4TFFVRkxMRVZCUVVVN2QwSkJRMVFzVDBGQlR5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRk5CUVZNc1JVRkJSU3hEUVVGRE8zZENRVU42UWl4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03Y1VKQlEzSkNPM2xDUVVGTk8zZENRVU5NTEU5QlFVOHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhUUVVGVExFVkJRVVVzUTBGQlF6dDNRa0ZEZWtJc1lVRkJZU3hEUVVGRExFVkJRVU1zV1VGQldTeEZRVUZGTEZWQlFWVXNSVUZCUXl4RFFVRkRMRU5CUVVNN2NVSkJRek5ETzJkQ1FVTklMRU5CUVVNc1EwRkJRenRaUVVOS0xFTkJRVU1zUTBGQlF5eERRVUZETzFOQlEwbzdVVUZGUkN4TlFVRk5MRTlCUVU4c1IwRkJSeXhOUVVGTkxFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkROVU1zVFVGQlRTeE5RVUZOTEVkQlFXTTdXVUZEZUVJc1dVRkJXU3hGUVVGRkxFbEJRVWtzUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NTMEZCU3l4RFFVRlRMRmRCUVZjc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXp0WlFVTXhSeXhWUVVGVkxFVkJRVVVzU1VGQlNTeExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTXNTVUZCU1N4TFFVRkxMRU5CUVZNc1YwRkJWeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1UwRkJReXhEUVVGRE8xRkJRM3BITEV0QlFVc3NUVUZCVFN4SFFVRkhMRWxCUVVrc1QwRkJUeXhGUVVGRk8xbEJRM3BDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1RVRkJUU3hGUVVGRkxFVkJRVVVzUTBGQlF5eEZRVUZGTzJkQ1FVTjZReXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4TlFVRk5MRWxCUVVrc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF6dHZRa0ZEZGtRc1lVRkJZU3hEUVVGRExFMUJRVTBzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1RVRkJUU3hEUVVGRExGVkJRVlVzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4SFFVRkhMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRWRCUVVjc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRoUVVNM1J6dFRRVU5HTzFGQlEwUXNUMEZCVHl4TlFVRk5MRU5CUVVNN1NVRkRhRUlzUTBGQlF6dEpRVVZOTEV0QlFVc3NRMEZCUXl4clFrRkJhMElzUTBGQlF5eE5RVUZ2UWl4RlFVTnNSQ3hQUVVGMVFpeEZRVUZGTEU5QlFUWkNMRVZCUVVVc1JVRkJSU3hQUVVGcFFpeEZRVU16UlN4dlFrRkJLME1zTUVKQlFUQkNMRU5CUVVNc1UwRkJVenRSUVVOdVJpeE5RVUZOTEdkQ1FVRm5RaXhIUVVGSExFbEJRVWtzUzBGQlN5eERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETzJGQlF6ZEVMRWRCUVVjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4SlFVRkpMRWRCUVVjc1EwRkJReXhyUTBGQmEwTXNSVUZCUlN4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVVjJSaXhKUVVGSk8xbEJRMFlzVFVGQlRTeFBRVUZQTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUjBGQlJ5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUXpsRUxFMUJRVTBzVTBGQlV5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1QwRkJUeXhIUVVGSExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXp0WlFVTXhSQ3hOUVVGTkxHRkJRV0VzUjBGQlJ5eFBRVUZUTEVOQlFVTTdXVUZEYUVNc1RVRkJUU3hWUVVGVkxFZEJRVWNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFOUJRVThzUjBGQlJ5eEpRVUZKTEVWQlFVVXNZVUZCWVN4RFFVRkRMRVZCUVVVc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFBRVUZQTEVWQlFVVXNZVUZCWVN4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOMlJ5eE5RVUZOTEc5Q1FVRnZRaXhIUVVGSExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNWVUZCVlN4SFFVRkhMRWxCUVVrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF6dFpRVU40UlN4TlFVRk5MRk5CUVZNc1IwRkJSeXhKUVVGSkxFdEJRVXNzUTBGQmIwTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRE8xbEJSV3hHTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRk8yZENRVU5vUkN4VFFVRlRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzU1VGQlNTeFBRVUZQTEVOQlFVTXNRMEZCUXl4aFFVRmhMRVZCUVVVc1dVRkJXU3hGUVVGRkxFVkJRVVU3YjBKQlF6TkVMRTFCUVUwc1VVRkJVU3hIUVVGSExFZEJRVWNzUjBGQlJ5eFRRVUZUTEVOQlFVTTdiMEpCUTJwRExFMUJRVTBzVFVGQlRTeEhRVUZITEVkQlFVY3NTMEZCU3l4SlFVRkpMRU5CUVVNc1dVRkJXU3hIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUMEZCVHl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTXNSMEZCUnl4VFFVRlRMRU5CUVVNN2IwSkJReTlGTEdkQ1FVRm5RaXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEZkQlFWY3NRMEZCUXp0M1FrRkRhRU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4UlFVRlJMRVZCUVVVc1RVRkJUU3hGUVVGRkxGbEJRVmtzUlVGQlJTeHZRa0ZCYjBJN2QwSkJRM0JGTEU5QlFVOHNSVUZCUlN4SlFVRkpMRVZCUVVVc1QwRkJUeXhGUVVGRkxHbENRVUZwUWp0eFFrRkRNVU1zUTBGQlF5eERRVUZETzI5Q1FVTklMR2RDUVVGblFpeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRk5CUVZNc1IwRkJSeXhEUVVGRExFVkJRVU1zU1VGQlNTeEZRVUZGTEVWQlFVTXNTMEZCU3l4RlFVRkZMRkZCUVZFc1JVRkJReXhGUVVGRExFVkJRVkVzUlVGQlJUdDNRa0ZEY0VVc1owSkJRV2RDTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1UwRkJVeXhGUVVGRkxFTkJRVU03ZDBKQlEyeERMRWxCUVVrc1MwRkJTenMwUWtGQlJTeFpRVUZaTEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNN096UkNRVU0zUWl4aFFVRmhMRU5CUVVNc1JVRkJReXhSUVVGUkxFVkJRVU1zUTBGQlF5eERRVUZETzI5Q1FVTTVRaXhEUVVGRExFTkJRVU03WjBKQlEwb3NRMEZCUXl4RFFVRkRMRU5CUVVNN1lVRkRTanRaUVVWRUxFMUJRVTBzVDBGQlR5eEhRVUZITEUxQlFVMHNUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF6dFpRVU0zUXl4TlFVRk5MRkZCUVZFc1IwRkJSeXhQUVVGUExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVkQlFVY3NRMEZCUXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzFsQlF6VkZMRTFCUVUwc1VVRkJVU3hIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRPMWxCUXpWRExFbEJRVWtzVFVGQlRTeEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTm1MRXRCUVVzc1RVRkJUU3hIUVVGSExFbEJRVWtzVDBGQlR5eEZRVUZGTzJkQ1FVTjZRaXhSUVVGUkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NRMEZCUXl4UlFVRlJMRVZCUVVVc1RVRkJUU3hEUVVGRExFTkJRVU03WjBKQlEyNURMRTFCUVUwc1NVRkJTU3hIUVVGSExFTkJRVU1zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXp0aFFVTXZRanRaUVVORUxGRkJRVkVzUTBGQlF5eEpRVUZKTEVWQlFVVXNRMEZCUXp0WlFVVm9RaXhQUVVGUExGRkJRVkVzUTBGQlF6dFRRVU5xUWp0UlFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRk8xbEJRMVlzWjBKQlFXZENMRVZCUVVVc1QwRkJUeXhEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVWQlFVVXNRMEZCUXl4RFFVRkRMRVZCUVVVc1UwRkJVeXhGUVVGRkxFTkJRVU1zUTBGQlF6dFpRVU5xUkN4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFsQlEycENMRTlCUVU4c1NVRkJTU3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xTkJRM1JETzBsQlEwZ3NRMEZCUXp0SlFVVlBMRXRCUVVzc1EwRkJReXh0UWtGQmJVSXNRMEZCUXl4TlFVRnZRaXhGUVVOd1JDeFBRVUYxUWl4RlFVRkZMRTlCUVRaQ0xFVkJRVVVzUlVGQlJTeFBRVUZwUWl4RlFVTXpSU3h2UWtGQkswTXNNRUpCUVRCQ0xFTkJRVU1zVTBGQlV6dFJRVU51Uml4dFJFRkJiVVE3VVVGRGJrUXNOa1ZCUVRaRk8xRkJRemRGTEdsSFFVRnBSenRSUVVOcVJ5eE5RVUZOTEcxQ1FVRnRRaXhIUVVGSExGRkJRVlVzUTBGQlF6dFJRVU4yUXl4SlFVRkpPMWxCUTBZc1RVRkJUU3hQUVVGUExFZEJRVWNzVFVGQlRTeERRVUZETEUxQlFVMHNSMEZCUnl4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTNoRUxFMUJRVTBzVVVGQlVTeEhRVUZITEUxQlFVMHNTVUZCU1N4RFFVRkRMR3RDUVVGclFpeERRVUZETEUxQlFVMHNSVUZCUlN4UFFVRlBMRVZCUVVVc1NVRkJTU3hGUVVGRkxFOUJRVThzUlVGQlJTeHBRa0ZCYVVJc1EwRkJReXhEUVVGRE8xbEJRMnhITEUxQlFVMHNZVUZCWVN4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zYlVKQlFXMUNMRWRCUVVjc1QwRkJUeXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0WlFVTnNSaXhOUVVGTkxGTkJRVk1zUjBGQlJ5eERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xbEJRemxETEhkRFFVRjNRenRaUVVONFF5eFBRVUZQTEZOQlFWTXNRMEZCUXp0VFFVTnNRanRSUVVGRExFOUJRVThzUTBGQlF5eEZRVUZGTzFsQlExWXNUMEZCVHl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU5xUWl4UFFVRlBMRWRCUVVjc1EwRkJRenRUUVVOYU8wbEJRMGdzUTBGQlF6dEpRVVZOTEUxQlFVMHNRMEZCUXl4UlFVRlJMRU5CUTNCQ0xFMUJRU3RDTEVWQlFVVXNUVUZCYjBJc1JVRkJSU3hWUVVGdlFpeEZRVUZGTEZOQlFXbENPMUZCUlRsR0xFMUJRVTBzUTBGQlF5eEhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTjJRaXhOUVVGTkxFTkJRVU1zUjBGQllTeEZRVUZGTEVOQlFVTTdVVUZEZGtJc1RVRkJUU3hUUVVGVExFZEJRV0VzUlVGQlJTeERRVUZETzFGQlF5OUNMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU5hTEVsQlFVa3NSVUZCUlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOWUxFbEJRVWtzUlVGQlJTeEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTllMRTFCUVUwc1VVRkJVU3hIUVVGSExFMUJRVTBzUTBGQlF5eE5RVUZOTEVkQlFVY3NRMEZCUXl4TlFVRk5MRU5CUVVNc1RVRkJUU3hIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTjZSQ3hQUVVGUExFZEJRVWNzUjBGQlJ5eFJRVUZSTEVWQlFVVTdXVUZEY2tJc2RVWkJRWFZHTzFsQlEzWkdMRTFCUVUwc1MwRkJTeXhIUVVGSExFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEUxQlFVMHNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlEzUkVMRlZCUVZVc1EwRkJReXhOUVVGTkxFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNUVUZCVFN4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTjZReXhOUVVGTkxGVkJRVlVzUjBGQlJ5eERRVUZETEVkQlFVY3NTMEZCU3l4RFFVRkRPMWxCUXpkQ0xFbEJRVWtzVlVGQlZTeEpRVUZKTEZOQlFWTXNSVUZCUlR0blFrRkRNMElzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJRenRuUWtGRFdDeERRVUZETEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRE8yZENRVU5ZTEZOQlFWTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU03WVVGRGRrSTdXVUZEUkN4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOT0xFVkJRVVVzUlVGQlJTeERRVUZETzFsQlEwd3NTVUZCU1N4RlFVRkZMRXRCUVVzc1RVRkJUU3hEUVVGRExFMUJRVTBzUlVGQlJUdG5Ra0ZEZUVJc1JVRkJSU3hGUVVGRkxFTkJRVU03WjBKQlEwd3NSVUZCUlN4SFFVRkhMRVZCUVVVc1IwRkJSeXhEUVVGRExFTkJRVU03WVVGRFlqdFRRVU5HTzFGQlJVUXNUVUZCVFN4TlFVRk5MRWRCUVVjc1NVRkJTU3hWUVVGVkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEYWtNc1RVRkJUU3hOUVVGTkxFZEJRVWNzU1VGQlNTeFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRha01zVFVGQlRTeGhRVUZoTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1UwRkJVeXhEUVVGRExFTkJRVU03VVVGRmJFUXNUMEZCVHl4RlFVRkRMRU5CUVVNc1JVRkJSU3hOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEUxQlFVMHNSVUZCUlN4UlFVRlJMRVZCUVVVc1lVRkJZU3hGUVVGRExFTkJRVU03U1VGRGVrUXNRMEZCUXp0RFFVTktJaXdpYzI5MWNtTmxjME52Ym5SbGJuUWlPbHNpYVcxd2IzSjBJSHRMYm05M2JrMWxkSEpwWTNOOUlHWnliMjBnSnk0dUwzUjVjR1ZrTFcxbGRISnBZM01uTzF4dWFXMXdiM0owSUh0RWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrTENCRWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrYzMwZ1puSnZiU0FuTGk5MGVYQmxjeWM3WEc1cGJYQnZjblFnZTJsdWMyVnlkRk50WVd4c1pYSXNJR2x6VG1sc2ZTQm1jbTl0SUNjdUwzVjBhV3h6Snp0Y2JseHVaWGh3YjNKMElIUjVjR1VnVTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwSUQwZ2UxeHVJQ0JwT2lCSmJuUXpNa0Z5Y21GNUlId2dWV2x1ZERNeVFYSnlZWGtzWEc0Z0lHbzZJRWx1ZERNeVFYSnlZWGtnZkNCVmFXNTBNekpCY25KaGVTeGNiaUFnWkdsemRHRnVZMlU2SUVac2IyRjBNekpCY25KaGVTeGNiaUFnYVdSNFB6b2diblZ0WW1WeVhHNTlPMXh1WEc1bGVIQnZjblFnZEhsd1pTQkxibTVTWlhOMWJIUWdQU0I3WEc0Z0lHdHVia1JwYzNSaGJtTmxjem9nYm5WdFltVnlXMTFiWFN4Y2JpQWdhMjV1U1c1a1pYaGxjem9nYm5WdFltVnlXMTFiWFZ4dWZWeHVaWGh3YjNKMElHTnNZWE56SUZOd1lYSnpaVTFoZEhKcGVGTmxjblpwWTJVZ2UxeHVJQ0FnSUhCeWFYWmhkR1VnWDNkdmNtdGxja052ZFc1ME9pQnVkVzFpWlhJN1hHNGdJQ0FnWTI5dWMzUnlkV04wYjNJb0tTQjdYRzRnSUNBZ0lDQjBhR2x6TGw5M2IzSnJaWEpEYjNWdWRDQTlJRTFoZEdndWJXRjRLRzVoZG1sbllYUnZjaTVvWVhKa2QyRnlaVU52Ym1OMWNuSmxibU41SUMwZ01pd2dNU2s3WEc0Z0lDQWdmVnh1WEc0Z0lDQWdjSFZpYkdsaklHRnplVzVqSUdOaGJHTk5kV3gwYVVOdmJIVnRiaWgyWVd4MVpYTTZJRUZ5Y21GNVBHRnVlVnRkUGl3Z1ptNU9ZVzFsY3pvZ1MyNXZkMjVOWlhSeWFXTnpXMTBzWEc0Z0lDQWdJQ0IwYUhKbGMyaHZiR1E2SUc1MWJXSmxjaXdnYjNCMGN6b2dlMXRmT2lCemRISnBibWRkT2lCaGJubDlXMTBnUFNCYmUzMWRMQ0IzWldsbmFIUnpPaUJ1ZFcxaVpYSmJYU0E5SUZzeFhTeGNiaUFnSUNBZ0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0lEMGdSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpITXVSVlZEVEVsRVJVRk9YRzRnSUNBZ0tTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCdFlYUlRhWHBsSUQwZ2RtRnNkV1Z6V3pCZExteGxibWQwYUNBcUlDaDJZV3gxWlhOYk1GMHViR1Z1WjNSb0lDMGdNU2tnTHlBeU8xeHVJQ0FnSUNBZ1kyOXVjM1FnWTJoMWJtdFRhWHBsSUQwZ1RXRjBhQzVtYkc5dmNpaHRZWFJUYVhwbElDOGdkR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUXBPMXh1WEc0Z0lDQWdJQ0JqYjI1emRDQnRhVzVVYUhKbGMyaHZiR1FnUFNCMllXeDFaWE5iTUYwdWJHVnVaM1JvSUQ0Z01qQmZNREF3SUQ5Y2JpQWdJQ0FnSUNBZ1lYZGhhWFFnZEdocGN5NW5aWFJOYVc1cGJXRnNWR2h5WlhOb2IyeGtLSFpoYkhWbGN5d2dabTVPWVcxbGN5d2diM0IwY3l3Z2QyVnBaMmgwY3l3Z1lXZG5jbVZuWVhScGIyNU5aWFJvYjJRcElEb2dNRHRjYmlBZ0lDQWdJR2xtSUNoMGFISmxjMmh2YkdRZ1BDQnRhVzVVYUhKbGMyaHZiR1FwSUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjMjlzWlM1c2IyY29ZSFZ6YVc1bklIUm9jbVZ6YUc5c1pDQWtlMjFwYmxSb2NtVnphRzlzWkgxZ0tUdGNiaUFnSUNBZ0lDQWdkR2h5WlhOb2IyeGtJRDBnYldsdVZHaHlaWE5vYjJ4a08xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUNBZ2IzQjBjeTVtYjNKRllXTm9LQ2hmTENCcEtTQTlQaUJ2Y0hSelcybGRXeWQwYUhKbGMyaHZiR1FuWFNBOUlIUm9jbVZ6YUc5c1pDazdYRzRnSUNBZ0lDQmpiMjV6ZENCd2NtOXRhWE5sY3lBOVhHNGdJQ0FnSUNBZ0lHNWxkeUJCY25KaGVUeFFjbTl0YVhObFBGTndZWEp6WlUxaGRISnBlRkpsYzNWc2RENCtLSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBLVHRjYmx4dUlDQWdJQ0FnWTI5dWMzUWdkMjl5YTJWeWN5QTlJRzVsZHlCQmNuSmhlU2gwYUdsekxsOTNiM0pyWlhKRGIzVnVkQ2xjYmlBZ0lDQWdJQ0FnTG1acGJHd29iblZzYkNrdWJXRndLQ2dwSUQwK0lHNWxkeUJYYjNKclpYSW9ibVYzSUZWU1RDZ25MaTl6Y0dGeWMyVXRiV0YwY21sNExYZHZjbXRsY2ljc0lHbHRjRzl5ZEM1dFpYUmhMblZ5YkNrcEtUdGNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHbGtlQ0E5SURBN0lHbGtlQ0E4SUhSb2FYTXVYM2R2Y210bGNrTnZkVzUwT3lCcFpIZ3JLeWtnZTF4dUlDQWdJQ0FnSUNCd2NtOXRhWE5sYzF0cFpIaGRJRDBnYm1WM0lGQnliMjFwYzJVb0tISmxjMjlzZG1WWGIzSnJaWElzSUhKbGFtVmpkRmR2Y210bGNpa2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lHTnZibk4wSUhOMFlYSjBTV1I0SUQwZ2FXUjRJQ29nWTJoMWJtdFRhWHBsTzF4dUlDQWdJQ0FnSUNBZ0lHTnZibk4wSUdWdVpFbGtlQ0E5SUdsa2VDQTlQVDBnZEdocGN5NWZkMjl5YTJWeVEyOTFiblFnTFNBeElEOGdiV0YwVTJsNlpTQTZJQ2hwWkhnZ0t5QXhLU0FxSUdOb2RXNXJVMmw2WlR0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvWlc1a1NXUjRJRHc5SUhOMFlYSjBTV1I0S1Z4dUlDQWdJQ0FnSUNBZ0lDQWdjbVZ6YjJ4MlpWZHZjbXRsY2loN2FUb2dibVYzSUVsdWRETXlRWEp5WVhrb01Da3NJR282SUc1bGR5QkpiblF6TWtGeWNtRjVLREFwTENCa2FYTjBZVzVqWlRvZ2JtVjNJRVpzYjJGME16SkJjbkpoZVNnd0tTd2dhV1I0ZlNrN1hHNGdJQ0FnSUNBZ0lDQWdkMjl5YTJWeWMxdHBaSGhkTG5CdmMzUk5aWE56WVdkbEtIdDJZV3gxWlhNc0lITjBZWEowU1dSNExDQmxibVJKWkhnc0lIUm9jbVZ6YUc5c1pDd2dabTVPWVcxbGN5d2diM0IwY3l3Z2QyVnBaMmgwY3l3Z1lXZG5jbVZuWVhScGIyNU5aWFJvYjJSOUtUdGNiaUFnSUNBZ0lDQWdJQ0IzYjNKclpYSnpXMmxrZUYwdWIyNXRaWE56WVdkbElEMGdLSHRrWVhSaE9pQjdaWEp5YjNJc0lHa3NJR29zSUdScGMzUmhibU5sZlgwcE9pQjJiMmxrSUQwK0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2IzSnJaWEp6VzJsa2VGMHVkR1Z5YldsdVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYW1WamRGZHZjbXRsY2lobGNuSnZjaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2IzSnJaWEp6VzJsa2VGMHVkR1Z5YldsdVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzI5c2RtVlhiM0pyWlhJb2Uya3NJR29zSUdScGMzUmhibU5sTENCcFpIaDlLVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lDQWdJQ0I5TzF4dUlDQWdJQ0FnSUNCOUtUdGNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdZMjl1YzNRZ2NtVnpkV3gwY3lBOUlHRjNZV2wwSUZCeWIyMXBjMlV1WVd4c0tIQnliMjFwYzJWektUdGNiaUFnSUNBZ0lHTnZibk4wSUdaMWJHeFRhWHBsSUQwZ2NtVnpkV3gwY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzS1NBOVBpQmhZMk1nS3lCMllXd3VhUzVzWlc1bmRHZ3NJREFwTzF4dUlDQWdJQ0FnWTI5dWMzUWdhU0E5SUc1bGR5QkpiblF6TWtGeWNtRjVLR1oxYkd4VGFYcGxLVHRjYmlBZ0lDQWdJR052Ym5OMElHb2dQU0J1WlhjZ1NXNTBNekpCY25KaGVTaG1kV3hzVTJsNlpTazdYRzRnSUNBZ0lDQmpiMjV6ZENCa2FYTjBZVzVqWlNBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb1puVnNiRk5wZW1VcE8xeHVJQ0FnSUNBZ2JHVjBJRzltWm5ObGRDQTlJREE3WEc0Z0lDQWdJQ0F2THlCelpYUjBhVzVuSUhSb1pTQnlaWE4xYkhSelhHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElISmxjeUJ2WmlCeVpYTjFiSFJ6S1NCN1hHNGdJQ0FnSUNBZ0lHa3VjMlYwS0hKbGN5NXBMQ0J2Wm1aelpYUXBPMXh1SUNBZ0lDQWdJQ0JxTG5ObGRDaHlaWE11YWl3Z2IyWm1jMlYwS1R0Y2JpQWdJQ0FnSUNBZ1pHbHpkR0Z1WTJVdWMyVjBLSEpsY3k1a2FYTjBZVzVqWlN3Z2IyWm1jMlYwS1R0Y2JpQWdJQ0FnSUNBZ2IyWm1jMlYwSUNzOUlISmxjeTVwTG14bGJtZDBhRHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJSEpsZEhWeWJpQjdhU3dnYWl3Z1pHbHpkR0Z1WTJWOU8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhCMVlteHBZeUJoYzNsdVl5QmpZV3hqUEZRK0tIWmhiSFZsY3pvZ1FYSnlZWGs4VkQ0c0lHWnVUbUZ0WlRvZ1MyNXZkMjVOWlhSeWFXTnpMQ0IwYUhKbGMyaHZiR1E2SUc1MWJXSmxjaXdnYjNCMGN6b2dlMXRmT2lCemRISnBibWRkT2lCaGJubDlJRDBnZTMwcElIdGNiaUFnSUNBZ0lDOHZjMmw2WlNCdlppQm1kV3hzSUcxaGRISnBlRnh1SUNBZ0lDQWdjbVYwZFhKdUlHRjNZV2wwSUhSb2FYTXVZMkZzWTAxMWJIUnBRMjlzZFcxdUtGdDJZV3gxWlhOZExDQmJabTVPWVcxbFhTd2dkR2h5WlhOb2IyeGtMQ0JiYjNCMGMxMHNJRnN4WFNrN1hHNGdJQ0FnZlZ4dVhHNGdJQ0FnY0hWaWJHbGpJR0Z6ZVc1aklHZGxkRXRPVGloY2JpQWdJQ0FnSUhaaGJIVmxjem9nUVhKeVlYazhZVzU1UGl3Z1ptNU9ZVzFsT2lCTGJtOTNiazFsZEhKcFkzTXNJRzVPWldsbmFHSnZkWEp6T2lCdWRXMWlaWElnUFNBeE5Td2diM0IwY3pvZ2UxdGZPaUJ6ZEhKcGJtZGRPaUJoYm5sOUlEMGdlMzFjYmlBZ0lDQXBJSHRjYmlBZ0lDQWdJSEpsZEhWeWJpQmhkMkZwZENCMGFHbHpMbTExYkhScFEyOXNkVzF1UzA1T0tGdDJZV3gxWlhOZExDQmJabTVPWVcxbFhTd2diazVsYVdkb1ltOTFjbk1zSUZ0dmNIUnpYU3dnV3pGZEtUdGNiaUFnSUNCOVhHNWNiaUFnSUNCd2RXSnNhV01nWVhONWJtTWdaMlYwVkdoeVpYTm9iMnhrUzA1T0tGeHVJQ0FnSUNBZ2RtRnNkV1Z6T2lCQmNuSmhlVHhoYm5rK0xDQm1iazVoYldVNklFdHViM2R1VFdWMGNtbGpjeXdnZEdoeVpYTm9iMnhrT2lCdWRXMWlaWElnUFNBd0xqZ3NJRzl3ZEhNNklIdGJYem9nYzNSeWFXNW5YVG9nWVc1NWZTQTlJSHQ5WEc0Z0lDQWdLU0I3WEc0Z0lDQWdJQ0J5WlhSMWNtNGdZWGRoYVhRZ2RHaHBjeTV0ZFd4MGFVTnZiSFZ0YmxSb2NtVnphRzlzWkV0dWJpaGJkbUZzZFdWelhTd2dXMlp1VG1GdFpWMHNJSFJvY21WemFHOXNaQ3dnVzI5d2RITmRMQ0JiTVYwcE8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhCMVlteHBZeUJoYzNsdVl5QnRkV3gwYVVOdmJIVnRibFJvY21WemFHOXNaRXR1YmloMllXeDFaWE02SUVGeWNtRjVQRUZ5Y21GNVBHRnVlVDQrTENCbWJrNWhiV1Z6T2lCTGJtOTNiazFsZEhKcFkzTmJYU3dnZEdoeVpYTm9iMnhrT2lCdWRXMWlaWElnUFNBd0xqZ3NYRzRnSUNBZ0lDQnZjSFJ6T2lCN1cxODZJSE4wY21sdVoxMDZJR0Z1ZVgxYlhTd2dkMlZwWjJoMGN6b2diblZ0WW1WeVcxMHNYRzRnSUNBZ0lDQmhaMmR5WldkaGRHbHZiazFsZEdodlpEb2dSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDQTlJRVJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUnpMa1ZWUTB4SlJFVkJUbHh1SUNBZ0lDa2dlMXh1SUNBZ0lDQWdhV1lnS0haaGJIVmxjeTVzWlc1bmRHZ2dJVDA5SUdadVRtRnRaWE11YkdWdVozUm9JSHg4SUhaaGJIVmxjeTVzWlc1bmRHZ2dJVDA5SUc5d2RITXViR1Z1WjNSb0lIeDhJSFpoYkhWbGN5NXNaVzVuZEdnZ0lUMDlJSGRsYVdkb2RITXViR1Z1WjNSb0tWeHVJQ0FnSUNBZ0lDQjBhSEp2ZHlCdVpYY2dSWEp5YjNJb0ozWmhiSFZsY3l3Z1pHbHpkR0Z1WTJVZ1puVnVZM1JwYjI1ekxDQnZjSFJwYjI1eklHRnVaQ0IzWldsbmFIUnpJR0Z5Y21GNWN5QnphRzkxYkdRZ2FHRjJaU0IwYUdVZ2MyRnRaU0JzWlc1bmRHZ25LVHRjYmx4dUlDQWdJQ0FnYVdZZ0tIWmhiSFZsY3k1emIyMWxLQ2gyS1NBOVBpQjJMbXhsYm1kMGFDQWhQVDBnZG1Gc2RXVnpXekJkTG14bGJtZDBhQ2twWEc0Z0lDQWdJQ0FnSUhSb2NtOTNJRzVsZHlCRmNuSnZjaWduWVd4c0lIWmhiSFZsY3lCaGNuSmhlWE1nYzJodmRXeGtJR2hoZG1VZ2RHaGxJSE5oYldVZ2JHVnVaM1JvSnlrN1hHNWNiaUFnSUNBZ0lHTnZibk4wSUcxaGRGTnBlbVVnUFNCMllXeDFaWE5iTUYwdWJHVnVaM1JvSUNvZ0tIWmhiSFZsYzFzd1hTNXNaVzVuZEdnZ0xTQXhLU0F2SURJN1hHNGdJQ0FnSUNCamIyNXpkQ0JqYUhWdWExTnBlbVVnUFNCTllYUm9MbVpzYjI5eUtHMWhkRk5wZW1VZ0x5QjBhR2x6TGw5M2IzSnJaWEpEYjNWdWRDazdYRzRnSUNBZ0lDQmpiMjV6ZENCd2NtOXRhWE5sY3lBOVhHNGdJQ0FnSUNBZ0lHNWxkeUJCY25KaGVUeFFjbTl0YVhObFBFdHVibEpsYzNWc2RENCtLSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBLVHRjYmlBZ0lDQWdJR052Ym5OMElIZHZjbXRsY25NZ1BTQnVaWGNnUVhKeVlYa29kR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUXBYRzRnSUNBZ0lDQWdJQzVtYVd4c0tHNTFiR3dwTG0xaGNDZ29LU0E5UGlCdVpYY2dWMjl5YTJWeUtHNWxkeUJWVWt3b0p5NHZhMjV1TFhSb2NtVnphRzlzWkMxM2IzSnJaWEluTENCcGJYQnZjblF1YldWMFlTNTFjbXdwS1NrN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0IwYUdsekxsOTNiM0pyWlhKRGIzVnVkRHNnYVdSNEt5c3BJSHRjYmlBZ0lDQWdJQ0FnY0hKdmJXbHpaWE5iYVdSNFhTQTlJRzVsZHlCUWNtOXRhWE5sS0NoeVpYTnZiSFpsVjI5eWEyVnlMQ0J5WldwbFkzUlhiM0pyWlhJcElEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J6ZEdGeWRFbGtlQ0E5SUdsa2VDQXFJR05vZFc1clUybDZaVHRjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0JsYm1SSlpIZ2dQU0JwWkhnZ1BUMDlJSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBJQzBnTVNBL0lHMWhkRk5wZW1VZ09pQW9hV1I0SUNzZ01Ta2dLaUJqYUhWdWExTnBlbVU3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1Z1WkVsa2VDQThQU0J6ZEdGeWRFbGtlQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjMjlzZG1WWGIzSnJaWElvZTJ0dWJrUnBjM1JoYm1ObGN6b2dibVYzSUVGeWNtRjVLREFwTENCcmJtNUpibVJsZUdWek9pQnVaWGNnUVhKeVlYa29NQ2w5S1R0Y2JpQWdJQ0FnSUNBZ0lDQjNiM0pyWlhKelcybGtlRjB1Y0c5emRFMWxjM05oWjJVb2UzWmhiSFZsY3l3Z2MzUmhjblJKWkhnc0lHVnVaRWxrZUN3Z1ptNU9ZVzFsY3l3Z2IzQjBjeXdnZEdoeVpYTm9iMnhrTENCM1pXbG5hSFJ6TENCaFoyZHlaV2RoZEdsdmJrMWxkR2h2WkgwcE8xeHVJQ0FnSUNBZ0lDQWdJSGR2Y210bGNuTmJhV1I0WFM1dmJtMWxjM05oWjJVZ1BTQW9lMlJoZEdFNklIdGxjbkp2Y2l3Z2EyNXVSR2x6ZEdGdVkyVnpMQ0JyYm01SmJtUmxlR1Z6ZlgwcE9pQjJiMmxrSUQwK0lIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdsbUlDaGxjbkp2Y2lrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2IzSnJaWEp6VzJsa2VGMHVkR1Z5YldsdVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYW1WamRGZHZjbXRsY2lobGNuSnZjaWs3WEc0Z0lDQWdJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnSUNCM2IzSnJaWEp6VzJsa2VGMHVkR1Z5YldsdVlYUmxLQ2s3WEc0Z0lDQWdJQ0FnSUNBZ0lDQWdJSEpsYzI5c2RtVlhiM0pyWlhJb2UydHVia1JwYzNSaGJtTmxjeXdnYTI1dVNXNWtaWGhsYzMwcE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNBZ0lIMDdYRzRnSUNBZ0lDQWdJSDBwTzF4dUlDQWdJQ0FnZlZ4dVhHNGdJQ0FnSUNCamIyNXpkQ0J5WlhOMWJIUnpJRDBnWVhkaGFYUWdVSEp2YldselpTNWhiR3dvY0hKdmJXbHpaWE1wTzF4dUlDQWdJQ0FnWTI5dWMzUWdhMjV1VTJsNlpYTWdQU0J1WlhjZ1NXNTBNekpCY25KaGVTaDJZV3gxWlhOYk1GMHViR1Z1WjNSb0tUdGNiaUFnSUNBZ0lHWnZjaUFvWTI5dWMzUWdjbVZ6SUc5bUlISmxjM1ZzZEhNcElIdGNiaUFnSUNBZ0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0IyWVd4MVpYTmJNRjB1YkdWdVozUm9PeUFySzJrcFhHNGdJQ0FnSUNBZ0lDQWdhMjV1VTJsNlpYTmJhVjBnS3owZ2NtVnpMbXR1YmtsdVpHVjRaWE5iYVYwL0xteGxibWQwYUNBL1B5QXdPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdZMjl1YzNRZ2EyNXVVbVZ6T2lCTGJtNVNaWE4xYkhRZ1BTQjdYRzRnSUNBZ0lDQWdJR3R1YmtScGMzUmhibU5sY3pvZ2JtVjNJRUZ5Y21GNUtIWmhiSFZsYzFzd1hTNXNaVzVuZEdncExtWnBiR3dvYm5Wc2JDa3ViV0Z3S0NoZkxDQnBLU0E5UGlCdVpYY2dRWEp5WVhrOGJuVnRZbVZ5UGlocmJtNVRhWHBsYzF0cFhTa3BMRnh1SUNBZ0lDQWdJQ0JyYm01SmJtUmxlR1Z6T2lCdVpYY2dRWEp5WVhrb2RtRnNkV1Z6V3pCZExteGxibWQwYUNrdVptbHNiQ2h1ZFd4c0tTNXRZWEFvS0Y4c0lHa3BJRDArSUc1bGR5QkJjbkpoZVR4dWRXMWlaWEkrS0d0dWJsTnBlbVZ6VzJsZEtTbDlPMXh1SUNBZ0lDQWdabTl5SUNoamIyNXpkQ0J5WlhNZ2IyWWdjbVZ6ZFd4MGN5a2dlMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhaaGJIVmxjMXN3WFM1c1pXNW5kR2c3SUNzcmFTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdadmNpQW9iR1YwSUdvZ1BTQXdPeUJxSUR3Z2NtVnpMbXR1YmtScGMzUmhibU5sYzF0cFhUOHViR1Z1WjNSb0lEOC9JREE3SUNzcmFpa2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2EyNXVVbVZ6TG10dWJrUnBjM1JoYm1ObGMxdHBYVnRyYm01VGFYcGxjMXRwWFNBdElERmRJRDBnY21WekxtdHVia1JwYzNSaGJtTmxjMXRwWFZ0cVhUdGNiaUFnSUNBZ0lDQWdJQ0FnSUd0dWJsSmxjeTVyYm01SmJtUmxlR1Z6VzJsZFcydHVibE5wZW1WelcybGRJQzBnTVYwZ1BTQnlaWE11YTI1dVNXNWtaWGhsYzF0cFhWdHFYVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lHdHVibE5wZW1WelcybGRJQzA5SURFN1hHNGdJQ0FnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdJQ0I5WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdJQ0J5WlhSMWNtNGdhMjV1VW1Wek8xeHVJQ0FnSUgxY2JseHVJQ0FnSUhCMVlteHBZeUJoYzNsdVl5QnRkV3gwYVVOdmJIVnRia3RPVGloMllXeDFaWE02SUVGeWNtRjVQRUZ5Y21GNVBHRnVlVDQrTENCbWJrNWhiV1Z6T2lCTGJtOTNiazFsZEhKcFkzTmJYU3dnYms1bGFXZG9ZbTkxY25NNklHNTFiV0psY2lBOUlERTFMRnh1SUNBZ0lDQWdiM0IwY3pvZ2UxdGZPaUJ6ZEhKcGJtZGRPaUJoYm5sOVcxMHNJSGRsYVdkb2RITTZJRzUxYldKbGNsdGRMRnh1SUNBZ0lDQWdZV2RuY21WbllYUnBiMjVOWlhSb2IyUTZJRVJwYzNSaGJtTmxRV2RuY21WbllYUnBiMjVOWlhSb2IyUWdQU0JFYVhOMFlXNWpaVUZuWjNKbFoyRjBhVzl1VFdWMGFHOWtjeTVGVlVOTVNVUkZRVTVjYmlBZ0lDQXBJSHRjYmlBZ0lDQWdJR2xtSUNoMllXeDFaWE11YkdWdVozUm9JQ0U5UFNCbWJrNWhiV1Z6TG14bGJtZDBhQ0I4ZkNCMllXeDFaWE11YkdWdVozUm9JQ0U5UFNCdmNIUnpMbXhsYm1kMGFDQjhmQ0IyWVd4MVpYTXViR1Z1WjNSb0lDRTlQU0IzWldsbmFIUnpMbXhsYm1kMGFDbGNiaUFnSUNBZ0lDQWdkR2h5YjNjZ2JtVjNJRVZ5Y205eUtDZDJZV3gxWlhNc0lHUnBjM1JoYm1ObElHWjFibU4wYVc5dWN5d2diM0IwYVc5dWN5QmhibVFnZDJWcFoyaDBjeUJoY25KaGVYTWdjMmh2ZFd4a0lHaGhkbVVnZEdobElITmhiV1VnYkdWdVozUm9KeWs3WEc1Y2JpQWdJQ0FnSUdsbUlDaDJZV3gxWlhNdWMyOXRaU2dvZGlrZ1BUNGdkaTVzWlc1bmRHZ2dJVDA5SUhaaGJIVmxjMXN3WFM1c1pXNW5kR2dwS1Z4dUlDQWdJQ0FnSUNCMGFISnZkeUJ1WlhjZ1JYSnliM0lvSjJGc2JDQjJZV3gxWlhNZ1lYSnlZWGx6SUhOb2IzVnNaQ0JvWVhabElIUm9aU0J6WVcxbElHeGxibWQwYUNjcE8xeHVYRzRnSUNBZ0lDQmpiMjV6ZENCdFlYUlRhWHBsSUQwZ2RtRnNkV1Z6V3pCZExteGxibWQwYUNBcUlDaDJZV3gxWlhOYk1GMHViR1Z1WjNSb0lDMGdNU2tnTHlBeU8xeHVJQ0FnSUNBZ1kyOXVjM1FnWTJoMWJtdFRhWHBsSUQwZ1RXRjBhQzVtYkc5dmNpaHRZWFJUYVhwbElDOGdkR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUXBPMXh1SUNBZ0lDQWdZMjl1YzNRZ2NISnZiV2x6WlhNZ1BWeHVJQ0FnSUNBZ0lDQnVaWGNnUVhKeVlYazhVSEp2YldselpUeExibTVTWlhOMWJIUStQaWgwYUdsekxsOTNiM0pyWlhKRGIzVnVkQ2s3WEc0Z0lDQWdJQ0JqYjI1emRDQjNiM0pyWlhKeklEMGdibVYzSUVGeWNtRjVLSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBLVnh1SUNBZ0lDQWdJQ0F1Wm1sc2JDaHVkV3hzS1M1dFlYQW9LQ2tnUFQ0Z2JtVjNJRmR2Y210bGNpaHVaWGNnVlZKTUtDY3VMMnR1YmkxM2IzSnJaWEluTENCcGJYQnZjblF1YldWMFlTNTFjbXdwS1NrN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0IwYUdsekxsOTNiM0pyWlhKRGIzVnVkRHNnYVdSNEt5c3BJSHRjYmlBZ0lDQWdJQ0FnY0hKdmJXbHpaWE5iYVdSNFhTQTlJRzVsZHlCUWNtOXRhWE5sS0NoeVpYTnZiSFpsVjI5eWEyVnlMQ0J5WldwbFkzUlhiM0pyWlhJcElEMCtJSHRjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0J6ZEdGeWRFbGtlQ0E5SUdsa2VDQXFJR05vZFc1clUybDZaVHRjYmlBZ0lDQWdJQ0FnSUNCamIyNXpkQ0JsYm1SSlpIZ2dQU0JwWkhnZ1BUMDlJSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBJQzBnTVNBL0lHMWhkRk5wZW1VZ09pQW9hV1I0SUNzZ01Ta2dLaUJqYUhWdWExTnBlbVU3WEc0Z0lDQWdJQ0FnSUNBZ2FXWWdLR1Z1WkVsa2VDQThQU0J6ZEdGeWRFbGtlQ2xjYmlBZ0lDQWdJQ0FnSUNBZ0lISmxjMjlzZG1WWGIzSnJaWElvZTJ0dWJrUnBjM1JoYm1ObGN6b2dibVYzSUVGeWNtRjVLREFwTENCcmJtNUpibVJsZUdWek9pQnVaWGNnUVhKeVlYa29NQ2w5S1R0Y2JpQWdJQ0FnSUNBZ0lDQjNiM0pyWlhKelcybGtlRjB1Y0c5emRFMWxjM05oWjJVb2UzWmhiSFZsY3l3Z2MzUmhjblJKWkhnc0lHVnVaRWxrZUN3Z1ptNU9ZVzFsY3l3Z2IzQjBjeXdnYms1bGFXZG9ZbTkxY25Nc0lIZGxhV2RvZEhNc0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a2ZTazdYRzRnSUNBZ0lDQWdJQ0FnZDI5eWEyVnljMXRwWkhoZExtOXViV1Z6YzJGblpTQTlJQ2g3WkdGMFlUb2dlMlZ5Y205eUxDQnJibTVFYVhOMFlXNWpaWE1zSUd0dWJrbHVaR1Y0WlhOOWZTazZJSFp2YVdRZ1BUNGdlMXh1SUNBZ0lDQWdJQ0FnSUNBZ2FXWWdLR1Z5Y205eUtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIZHZjbXRsY25OYmFXUjRYUzUwWlhKdGFXNWhkR1VvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WcVpXTjBWMjl5YTJWeUtHVnljbTl5S1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJSDBnWld4elpTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lIZHZjbXRsY25OYmFXUjRYUzUwWlhKdGFXNWhkR1VvS1R0Y2JpQWdJQ0FnSUNBZ0lDQWdJQ0FnY21WemIyeDJaVmR2Y210bGNpaDdhMjV1UkdsemRHRnVZMlZ6TENCcmJtNUpibVJsZUdWemZTazdYRzRnSUNBZ0lDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNBZ0lDQWdmVHRjYmlBZ0lDQWdJQ0FnZlNrN1hHNGdJQ0FnSUNCOVhHNWNiaUFnSUNBZ0lHTnZibk4wSUhKbGMzVnNkSE1nUFNCaGQyRnBkQ0JRY205dGFYTmxMbUZzYkNod2NtOXRhWE5sY3lrN1hHNGdJQ0FnSUNCamIyNXpkQ0JyYm01U1pYTTZJRXR1YmxKbGMzVnNkQ0E5SUh0Y2JpQWdJQ0FnSUNBZ2EyNXVSR2x6ZEdGdVkyVnpPaUJ1WlhjZ1FYSnlZWGtvZG1Gc2RXVnpXekJkTG14bGJtZDBhQ2t1Wm1sc2JDaHVkV3hzS1M1dFlYQW9LQ2tnUFQ0Z2JtVjNJRUZ5Y21GNVBHNTFiV0psY2o0b2JrNWxhV2RvWW05MWNuTXBMbVpwYkd3b09UazVPVGtwS1N4Y2JpQWdJQ0FnSUNBZ2EyNXVTVzVrWlhobGN6b2dibVYzSUVGeWNtRjVLSFpoYkhWbGMxc3dYUzVzWlc1bmRHZ3BMbVpwYkd3b2JuVnNiQ2t1YldGd0tDZ3BJRDArSUc1bGR5QkJjbkpoZVR4dWRXMWlaWEkrS0c1T1pXbG5hR0p2ZFhKektTNW1hV3hzS0MweEtTbDlPMXh1SUNBZ0lDQWdabTl5SUNoamIyNXpkQ0J5WlhNZ2IyWWdjbVZ6ZFd4MGN5a2dlMXh1SUNBZ0lDQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhaaGJIVmxjMXN3WFM1c1pXNW5kR2c3SUNzcmFTa2dlMXh1SUNBZ0lDQWdJQ0FnSUdadmNpQW9iR1YwSUdvZ1BTQXdPeUJxSUR3Z2NtVnpMbXR1YmtScGMzUmhibU5sYzF0cFhUOHViR1Z1WjNSb0lEOC9JREE3SUNzcmFpbGNiaUFnSUNBZ0lDQWdJQ0FnSUdsdWMyVnlkRk50WVd4c1pYSW9hMjV1VW1WekxtdHVia1JwYzNSaGJtTmxjMXRwWFN3Z2EyNXVVbVZ6TG10dWJrbHVaR1Y0WlhOYmFWMHNJSEpsY3k1cmJtNUVhWE4wWVc1alpYTmJhVjFiYWwwc0lISmxjeTVyYm01SmJtUmxlR1Z6VzJsZFcycGRLVHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnY21WMGRYSnVJR3R1YmxKbGN6dGNiaUFnSUNCOVhHNWNiaUFnSUNCd2RXSnNhV01nWVhONWJtTWdaMlYwVTJGdGNHeGxSR2x6ZEdGdVkyVnpLSFpoYkhWbGN6b2dRWEp5WVhrOFlXNTVXMTArTEZ4dUlDQWdJQ0FnWm01T1lXMWxjem9nUzI1dmQyNU5aWFJ5YVdOelcxMHNJRzl3ZEhNNklIdGJYem9nYzNSeWFXNW5YVG9nWVc1NWZWdGRJRDBnVzEwc0lIZGxhV2RvZEhNNklHNTFiV0psY2x0ZExGeHVJQ0FnSUNBZ1lXZG5jbVZuWVhScGIyNU5aWFJvYjJRNklFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJRZ1BTQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a2N5NUZWVU5NU1VSRlFVNHBPaUJRY205dGFYTmxQRVpzYjJGME16SkJjbkpoZVQ0Z2UxeHVJQ0FnSUNBZ1kyOXVjM1FnZEdoeVpYTm9iMnhrVjI5eWEyVnljeUE5SUc1bGR5QkJjbkpoZVNoMGFHbHpMbDkzYjNKclpYSkRiM1Z1ZENrdVptbHNiQ2h1ZFd4c0tWeHVJQ0FnSUNBZ0lDQXViV0Z3S0NncElEMCtJRzVsZHlCWGIzSnJaWElvYm1WM0lGVlNUQ2duTGk5emNHRnljMlV0YldGMGNtbDRMWFJvY21WemFHOXNaQzEzYjNKclpYSW5MQ0JwYlhCdmNuUXViV1YwWVM1MWNtd3BLU2s3WEc1Y2JpQWdJQ0FnSUhSeWVTQjdYRzRnSUNBZ0lDQWdJR052Ym5OMElHMWhkRk5wZW1VZ1BTQjJZV3gxWlhOYk1GMHViR1Z1WjNSb0lDb2dLSFpoYkhWbGMxc3dYUzVzWlc1bmRHZ2dMU0F4S1NBdklESTdYRzRnSUNBZ0lDQWdJR052Ym5OMElHTm9kVzVyVTJsNlpTQTlJRTFoZEdndVpteHZiM0lvYldGMFUybDZaU0F2SUhSb2FYTXVYM2R2Y210bGNrTnZkVzUwS1R0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYldGNFUyRnRjR3hsVTJsNlpTQTlJREZmTURBd1h6QXdNRHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdjMkZ0Y0d4bFUybHpaU0E5SUUxaGRHZ3ViV0Y0S0UxaGRHZ3ViV2x1S0cxaGRGTnBlbVVnTHlBeE1EQXdMQ0J0WVhoVFlXMXdiR1ZUYVhwbEtTd2dUV0YwYUM1dGFXNG9iV0YwVTJsNlpTd2diV0Y0VTJGdGNHeGxVMmw2WlNrcE8xeHVJQ0FnSUNBZ0lDQmpiMjV6ZENCMFpYTjBVMlYwVTJsNlpWQmxjbGR2Y210bGNpQTlJRTFoZEdndVpteHZiM0lvYzJGdGNHeGxVMmx6WlNBdklIUm9hWE11WDNkdmNtdGxja052ZFc1MEtUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2RGQnliMjFwYzJWeklEMGdibVYzSUVGeWNtRjVQRkJ5YjIxcGMyVThlMlJwYzNSaGJtTmxPaUJHYkc5aGRETXlRWEp5WVhsOVBqNG9kR2hwY3k1ZmQyOXlhMlZ5UTI5MWJuUXBPMXh1WEc0Z0lDQWdJQ0FnSUdadmNpQW9iR1YwSUdsa2VDQTlJREE3SUdsa2VDQThJSFJvYVhNdVgzZHZjbXRsY2tOdmRXNTBPeUJwWkhnckt5a2dlMXh1SUNBZ0lDQWdJQ0FnSUhSUWNtOXRhWE5sYzF0cFpIaGRJRDBnYm1WM0lGQnliMjFwYzJVb0tISmxjMjlzZG1WWGIzSnJaWElzSUhKbGFtVmpkRmR2Y210bGNpa2dQVDRnZTF4dUlDQWdJQ0FnSUNBZ0lDQWdZMjl1YzNRZ2MzUmhjblJKWkhnZ1BTQnBaSGdnS2lCamFIVnVhMU5wZW1VN1hHNGdJQ0FnSUNBZ0lDQWdJQ0JqYjI1emRDQmxibVJKWkhnZ1BTQnBaSGdnUFQwOUlIUm9hWE11WDNkdmNtdGxja052ZFc1MElDMGdNU0EvSUcxaGRGTnBlbVVnT2lBb2FXUjRJQ3NnTVNrZ0tpQmphSFZ1YTFOcGVtVTdYRzRnSUNBZ0lDQWdJQ0FnSUNCMGFISmxjMmh2YkdSWGIzSnJaWEp6VzJsa2VGMHVjRzl6ZEUxbGMzTmhaMlVvZTF4dUlDQWdJQ0FnSUNBZ0lDQWdJQ0IyWVd4MVpYTTZJSFpoYkhWbGN5d2djM1JoY25SSlpIZ3NJR1Z1WkVsa2VDd2djMkZ0Y0d4bFRHVnVaM1JvT2lCMFpYTjBVMlYwVTJsNlpWQmxjbGR2Y210bGNpeGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ1ptNU9ZVzFsY3l3Z2IzQjBjeXdnZDJWcFoyaDBjeXdnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJjYmlBZ0lDQWdJQ0FnSUNBZ0lIMHBPMXh1SUNBZ0lDQWdJQ0FnSUNBZ2RHaHlaWE5vYjJ4a1YyOXlhMlZ5YzF0cFpIaGRMbTl1YldWemMyRm5aU0E5SUNoN1pHRjBZVG9nZTJWeWNtOXlMQ0JrYVhOMFlXNWpaWDE5S1RvZ2RtOXBaQ0E5UGlCN1hHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2NtVnphRzlzWkZkdmNtdGxjbk5iYVdSNFhTNTBaWEp0YVc1aGRHVW9LVHRjYmlBZ0lDQWdJQ0FnSUNBZ0lDQWdhV1lnS0dWeWNtOXlLU0J5WldwbFkzUlhiM0pyWlhJb1pYSnliM0lwT3lCbGJITmxYRzRnSUNBZ0lDQWdJQ0FnSUNBZ0lDQWdjbVZ6YjJ4MlpWZHZjbXRsY2loN1pHbHpkR0Z1WTJWOUtUdGNiaUFnSUNBZ0lDQWdJQ0FnSUgwN1hHNGdJQ0FnSUNBZ0lDQWdmU2s3WEc0Z0lDQWdJQ0FnSUgxY2JseHVJQ0FnSUNBZ0lDQmpiMjV6ZENCeVpYTjFiSFJ6SUQwZ1lYZGhhWFFnVUhKdmJXbHpaUzVoYkd3b2RGQnliMjFwYzJWektUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ1puVnNiRk5wZW1VZ1BTQnlaWE4xYkhSekxuSmxaSFZqWlNnb1lXTmpMQ0IyWVd3cElEMCtJR0ZqWXlBcklIWmhiQzVrYVhOMFlXNWpaUzVzWlc1bmRHZ3NJREFwTzF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JrYVhOMFlXNWpaU0E5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvWm5Wc2JGTnBlbVVwTzF4dUlDQWdJQ0FnSUNCc1pYUWdiMlptYzJWMElEMGdNRHRjYmlBZ0lDQWdJQ0FnWm05eUlDaGpiMjV6ZENCeVpYTWdiMllnY21WemRXeDBjeWtnZTF4dUlDQWdJQ0FnSUNBZ0lHUnBjM1JoYm1ObExuTmxkQ2h5WlhNdVpHbHpkR0Z1WTJVc0lHOW1abk5sZENrN1hHNGdJQ0FnSUNBZ0lDQWdiMlptYzJWMElDczlJSEpsY3k1a2FYTjBZVzVqWlM1c1pXNW5kR2c3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1pHbHpkR0Z1WTJVdWMyOXlkQ2dwTzF4dVhHNGdJQ0FnSUNBZ0lISmxkSFZ5YmlCa2FYTjBZVzVqWlR0Y2JpQWdJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lDQWdkR2h5WlhOb2IyeGtWMjl5YTJWeWN6OHVabTl5UldGamFDZ29keWtnUFQ0Z2R6OHVkR1Z5YldsdVlYUmxLQ2twTzF4dUlDQWdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLR1VwTzF4dUlDQWdJQ0FnSUNCeVpYUjFjbTRnYm1WM0lFWnNiMkYwTXpKQmNuSmhlU2d4S1M1bWFXeHNLREF1TlNrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dVhHNGdJQ0FnY0hKcGRtRjBaU0JoYzNsdVl5Qm5aWFJOYVc1cGJXRnNWR2h5WlhOb2IyeGtLSFpoYkhWbGN6b2dRWEp5WVhrOFlXNTVXMTArTEZ4dUlDQWdJQ0FnWm01T1lXMWxjem9nUzI1dmQyNU5aWFJ5YVdOelcxMHNJRzl3ZEhNNklIdGJYem9nYzNSeWFXNW5YVG9nWVc1NWZWdGRJRDBnVzEwc0lIZGxhV2RvZEhNNklHNTFiV0psY2x0ZExGeHVJQ0FnSUNBZ1lXZG5jbVZuWVhScGIyNU5aWFJvYjJRNklFUnBjM1JoYm1ObFFXZG5jbVZuWVhScGIyNU5aWFJvYjJRZ1BTQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a2N5NUZWVU5NU1VSRlFVNHBJSHRjYmlBZ0lDQWdJQzh2VjJVZ2JtVmxaQ0IwYnlCallXeGpkV3hoZEdVZ2RHaGxJRzFwYm1sdFlXd2dkR2h5WlhOb2IyeGtJR1pwY25OMExGeHVJQ0FnSUNBZ0x5OXBiaUJ2Y21SbGNpQjBieUJuWlhRZ2JXRjBjbWw0SUhOMVkyZ2dkR2hoZENCcGRDQmtiMlZ6SUc1dmRDQmxlR05sWldRZ2RHaGxJRzFoZUdsdGRXMGdjMmw2WlNCdlppQXhSMEpjYmlBZ0lDQWdJQzh2ZDJVZ2FHRjJaU0F6SUhKbGRIVnliaUJoY25KaGVYTXNJR1ZoWTJnZ05DQmlhWFJsY3lCd1pYSWdaV3hsYldWdWRDd2djMjhnYVdZZ2RHaGxJRzFoZUdsdGRXMGdjMmw2WlNCdlppQjBhR1VnYldGMGNtbDRJR2x6SURGSFFpeGNiaUFnSUNBZ0lHTnZibk4wSUcxaGVGTndZWEp6WlUxaGRISnBlRk5wZW1VZ1BTQTNNRjh3TURCZk1EQXdPMXh1SUNBZ0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnYldGMFUybDZaU0E5SUhaaGJIVmxjeTVzWlc1bmRHZ2dLaUFvZG1Gc2RXVnpMbXhsYm1kMGFDQXRJREVwSUM4Z01qdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ1pHbHpkR0Z1WTJVZ1BTQmhkMkZwZENCMGFHbHpMbWRsZEZOaGJYQnNaVVJwYzNSaGJtTmxjeWgyWVd4MVpYTXNJR1p1VG1GdFpYTXNJRzl3ZEhNc0lIZGxhV2RvZEhNc0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a0tUdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ1puSmhZM1JwYjI1SmJtUmxlQ0E5SUUxaGRHZ3VabXh2YjNJb2JXRjRVM0JoY25ObFRXRjBjbWw0VTJsNlpTQXZJRzFoZEZOcGVtVWdLaUJrYVhOMFlXNWpaUzVzWlc1bmRHZ3BPMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQjBhSEpsYzJodmJHUWdQU0F4SUMwZ1pHbHpkR0Z1WTJWYlpuSmhZM1JwYjI1SmJtUmxlRjA3WEc0Z0lDQWdJQ0FnSUM4dklIUm9jbVZ6YUc5c1pDQTlJRTFoZEdndWJXRjRLSFJvY21WemFHOXNaQ3dnTUM0ektUdGNiaUFnSUNBZ0lDQWdjbVYwZFhKdUlIUm9jbVZ6YUc5c1pEdGNiaUFnSUNBZ0lIMGdZMkYwWTJnZ0tHVXBJSHRjYmlBZ0lDQWdJQ0FnWTI5dWMyOXNaUzVsY25KdmNpaGxLVHRjYmlBZ0lDQWdJQ0FnY21WMGRYSnVJREF1TlR0Y2JpQWdJQ0FnSUgxY2JpQWdJQ0I5WEc1Y2JpQWdJQ0J3ZFdKc2FXTWdjM1JoZEdsaklHTmhiR05UZVc1alBGUStLRnh1SUNBZ0lDQWdkbUZzZFdWek9pQkJjbkpoZVR4VVBpQjhJRUZ5Y21GNVRHbHJaVHhVUGl3Z1ptNU9ZVzFsT2lCTGJtOTNiazFsZEhKcFkzTXNJR1JwYzNSaGJtTmxSbTQ2SUVaMWJtTjBhVzl1TENCMGFISmxjMmh2YkdRNklHNTFiV0psY2x4dUlDQWdJQ2tnZTF4dUlDQWdJQ0FnWTI5dWMzUWdhVG9nYm5WdFltVnlXMTBnUFNCYlhUdGNiaUFnSUNBZ0lHTnZibk4wSUdvNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lDQWdJQ0JqYjI1emRDQmthWE4wWVc1alpYTTZJRzUxYldKbGNsdGRJRDBnVzEwN1hHNGdJQ0FnSUNCc1pYUWdZMjUwSUQwZ01EdGNiaUFnSUNBZ0lHeGxkQ0J0YVNBOUlEQTdYRzRnSUNBZ0lDQnNaWFFnYldvZ1BTQXdPMXh1SUNBZ0lDQWdZMjl1YzNRZ1puVnNiRk5wZW1VZ1BTQjJZV3gxWlhNdWJHVnVaM1JvSUNvZ0tIWmhiSFZsY3k1c1pXNW5kR2dnTFNBeEtTQXZJREk3WEc0Z0lDQWdJQ0IzYUdsc1pTQW9ZMjUwSUR3Z1puVnNiRk5wZW1VcElIdGNiaUFnSUNBZ0lDQWdMeTlqYjI1emRDQjJZV3gxWlNBOUlITmxjVEZNYVhOMFcyMXBYU0FtSmlCelpYRXhUR2x6ZEZ0dGFsMGdQeUJvWVcxdGFXNW5LSE5sY1RGTWFYTjBXMjFwWFN3Z2MyVnhNVXhwYzNSYmJXcGRLU0E2SURBN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUhaaGJIVmxJRDBnSVdselRtbHNLSFpoYkhWbGMxdHRhVjBwSUNZbUlDRnBjMDVwYkNoMllXeDFaWE5iYldwZEtTQS9YRzRnSUNBZ0lDQWdJQ0FnWkdsemRHRnVZMlZHYmloMllXeDFaWE5iYldsZExDQjJZV3gxWlhOYmJXcGRLU0E2SURFN1hHNGdJQ0FnSUNBZ0lHTnZibk4wSUhOcGJXbHNZWEpwZEhrZ1BTQXhJQzBnZG1Gc2RXVTdYRzRnSUNBZ0lDQWdJR2xtSUNoemFXMXBiR0Z5YVhSNUlENDlJSFJvY21WemFHOXNaQ2tnZTF4dUlDQWdJQ0FnSUNBZ0lHa3VjSFZ6YUNodGFTazdYRzRnSUNBZ0lDQWdJQ0FnYWk1d2RYTm9LRzFxS1R0Y2JpQWdJQ0FnSUNBZ0lDQmthWE4wWVc1alpYTXVjSFZ6YUNoMllXeDFaU2s3WEc0Z0lDQWdJQ0FnSUgxY2JpQWdJQ0FnSUNBZ1kyNTBLeXM3WEc0Z0lDQWdJQ0FnSUcxcUt5czdYRzRnSUNBZ0lDQWdJR2xtSUNodGFpQTlQVDBnZG1Gc2RXVnpMbXhsYm1kMGFDa2dlMXh1SUNBZ0lDQWdJQ0FnSUcxcEt5czdYRzRnSUNBZ0lDQWdJQ0FnYldvZ1BTQnRhU0FySURFN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNibHh1SUNBZ0lDQWdZMjl1YzNRZ2FVRnljbUY1SUQwZ2JtVjNJRWx1ZERNeVFYSnlZWGtvYVNrN1hHNGdJQ0FnSUNCamIyNXpkQ0JxUVhKeVlYa2dQU0J1WlhjZ1NXNTBNekpCY25KaGVTaHFLVHRjYmlBZ0lDQWdJR052Ym5OMElHUnBjM1JoYm1ObFFYSnlZWGtnUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0dScGMzUmhibU5sY3lrN1hHNWNiaUFnSUNBZ0lISmxkSFZ5YmlCN2FUb2dhVUZ5Y21GNUxDQnFPaUJxUVhKeVlYa3NJR1JwYzNSaGJtTmxPaUJrYVhOMFlXNWpaVUZ5Y21GNWZUdGNiaUFnSUNCOVhHNTlYRzRpWFgwPSIsImV4cG9ydCBhc3luYyBmdW5jdGlvbiBiaW9MYXlvdXQoY2x1c3Rlciwgc3BhcnNlT2JqZWN0LCB0aHJlc2hvbGQpIHtcbiAgICBjb25zdCBuID0gY2x1c3Rlci5sZW5ndGg7XG4gICAgY29uc3QgaXMgPSBbXTtcbiAgICBjb25zdCBqcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBpICsgMTsgaiA8IG47IGorKykge1xuICAgICAgICAgICAgY29uc3QgYSA9IGNsdXN0ZXJbaV07XG4gICAgICAgICAgICBjb25zdCBiID0gY2x1c3RlcltqXTtcbiAgICAgICAgICAgIGlmIChzcGFyc2VPYmplY3RbYV0/LltiXSA+PSB0aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBpcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIGpzLnB1c2goaik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldExheW91dEVtYmVkZGluZ3MoaXMsIGpzLCBjbHVzdGVyKTtcbn1cbmZ1bmN0aW9uIGdldExheW91dEVtYmVkZGluZ3MoaXMsIGpzLCBjbHVzdGVyKSB7XG4gICAgY29uc3QgZW1iZWRYID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKS5tYXAoKCkgPT4gTWF0aC5yYW5kb20oKSAqIDEwKTtcbiAgICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIGNvbnN0IGl0ZXJhdGlvbnMgPSAxMDA7XG4gICAgY29uc3QgeFZlbG9jaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApO1xuICAgIGNvbnN0IHlWZWxvY2l0aWVzID0gbmV3IEZsb2F0MzJBcnJheShjbHVzdGVyLmxlbmd0aCkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICBjb25zdCB0ZW1wZXJhdHVyZSA9ICgxIC0gaSAvIGl0ZXJhdGlvbnMpO1xuICAgICAgICB4VmVsb2NpdGllcy5maWxsKDApO1xuICAgICAgICB5VmVsb2NpdGllcy5maWxsKDApO1xuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpcy5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gaXNbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBqc1tpZHhdO1xuICAgICAgICAgICAgY29uc3QgZHggPSBlbWJlZFhbYV0gLSBlbWJlZFhbYl07XG4gICAgICAgICAgICBjb25zdCBkeSA9IGVtYmVkWVthXSAtIGVtYmVkWVtiXTtcbiAgICAgICAgICAgIC8vICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpO1xuICAgICAgICAgICAgLy8gICBjb25zdCBmYWN0b3IgPSAoZGlzdGFuY2UgLSAxKSAvIGRpc3RhbmNlO1xuICAgICAgICAgICAgLy8gICBjb25zdCBvZmZzZXRYID0gZHggKiBmYWN0b3I7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IG9mZnNldFkgPSBkeSAqIGZhY3RvcjtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeCkgPj0gMSkge1xuICAgICAgICAgICAgICAgIHhWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHg7XG4gICAgICAgICAgICAgICAgeFZlbG9jaXRpZXNbYl0gKz0gdGVtcGVyYXR1cmUgKiBkeDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhkeSkgPj0gMSkge1xuICAgICAgICAgICAgICAgIHlWZWxvY2l0aWVzW2FdIC09IHRlbXBlcmF0dXJlICogZHk7XG4gICAgICAgICAgICAgICAgeVZlbG9jaXRpZXNbYl0gKz0gdGVtcGVyYXR1cmUgKiBkeTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgZW1iZWRZW2FdICs9IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgIC8vICAgZW1iZWRZW2JdIC09IG9mZnNldFkgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IHZlY1NpemUgPSBNYXRoLnNxcnQoeFZlbG9jaXRpZXNbaWR4XSAqIHhWZWxvY2l0aWVzW2lkeF0gKyB5VmVsb2NpdGllc1tpZHhdICogeVZlbG9jaXRpZXNbaWR4XSk7XG4gICAgICAgICAgICBpZiAodmVjU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBlbWJlZFhbaWR4XSArPSB4VmVsb2NpdGllc1tpZHhdIC8gdmVjU2l6ZSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgICAgIGVtYmVkWVtpZHhdICs9IHlWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gbm9ybWFsaXplXG4gICAgbGV0IG1pblggPSBlbWJlZFhbMF07XG4gICAgbGV0IG1pblkgPSBlbWJlZFlbMF07XG4gICAgbGV0IG1heFggPSBlbWJlZFhbMF07XG4gICAgbGV0IG1heFkgPSBlbWJlZFlbMF07XG4gICAgZm9yIChsZXQgaWR4ID0gMTsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKSB7XG4gICAgICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCBlbWJlZFhbaWR4XSk7XG4gICAgICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCBlbWJlZFlbaWR4XSk7XG4gICAgICAgIG1heFggPSBNYXRoLm1heChtYXhYLCBlbWJlZFhbaWR4XSk7XG4gICAgICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCBlbWJlZFlbaWR4XSk7XG4gICAgfVxuICAgIGxldCByYW5nZVggPSBtYXhYIC0gbWluWDtcbiAgICBsZXQgcmFuZ2VZID0gbWF4WSAtIG1pblk7XG4gICAgaWYgKHJhbmdlWCA9PT0gMClcbiAgICAgICAgcmFuZ2VYID0gbWF4WDtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgICAgIGVtYmVkWFtpZHhdID0gKGVtYmVkWFtpZHhdIC0gbWluWCkgLyByYW5nZVggLyAyICsgMC41O1xuICAgIGlmIChyYW5nZVkgPT09IDApXG4gICAgICAgIHJhbmdlWSA9IG1heFk7XG4gICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgY2x1c3Rlci5sZW5ndGg7IGlkeCsrKVxuICAgICAgICBlbWJlZFlbaWR4XSA9IChlbWJlZFlbaWR4XSAtIG1pblkpIC8gcmFuZ2VZIC8gMiArIDAuNTtcbiAgICByZXR1cm4geyBlbWJlZFgsIGVtYmVkWSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pWW1sdkxXeGhlVzkxZEM1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbUpwYnkxc1lYbHZkWFF1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlJVRXNUVUZCVFN4RFFVRkRMRXRCUVVzc1ZVRkJWU3hUUVVGVExFTkJRVU1zVDBGQmFVSXNSVUZCUlN4WlFVRm5ReXhGUVVGRkxGTkJRV2xDTzBsQlEzQkhMRTFCUVUwc1EwRkJReXhIUVVGSExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTTdTVUZEZWtJc1RVRkJUU3hGUVVGRkxFZEJRV0VzUlVGQlJTeERRVUZETzBsQlEzaENMRTFCUVUwc1JVRkJSU3hIUVVGaExFVkJRVVVzUTBGQlF6dEpRVU40UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xRkJRekZDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxDTEUxQlFVMHNRMEZCUXl4SFFVRkhMRTlCUVU4c1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFpRVU55UWl4TlFVRk5MRU5CUVVNc1IwRkJSeXhQUVVGUExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEY2tJc1NVRkJTU3haUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hUUVVGVExFVkJRVVU3WjBKQlEzSkRMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTFnc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0aFFVTmFPMU5CUTBZN1MwRkRSanRKUVVORUxFOUJRVThzYlVKQlFXMUNMRU5CUVVNc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeFBRVUZQTEVOQlFVTXNRMEZCUXp0QlFVTTVReXhEUVVGRE8wRkJSVVFzVTBGQlV5eHRRa0ZCYlVJc1EwRkJReXhGUVVGWkxFVkJRVVVzUlVGQldTeEZRVUZGTEU5QlFXbENPMGxCUTNoRkxFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRVZCUVVVc1IwRkJSeXhGUVVGRkxFTkJRVU1zUTBGQlF6dEpRVU4wUml4TlFVRk5MRTFCUVUwc1IwRkJSeXhKUVVGSkxGbEJRVmtzUTBGQlF5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVkQlFVY3NSVUZCUlN4RFFVRkRMRU5CUVVNN1NVRkRkRVlzVFVGQlRTeFZRVUZWTEVkQlFVY3NSMEZCUnl4RFFVRkRPMGxCUTNaQ0xFMUJRVTBzVjBGQlZ5eEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkROMFFzVFVGQlRTeFhRVUZYTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVNM1JDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVlVGQlZTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMUZCUTI1RExFMUJRVTBzVjBGQlZ5eEhRVUZITEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zUTBGQlF6dFJRVU42UXl4WFFVRlhMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzQkNMRmRCUVZjc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0VJc1MwRkJTeXhKUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEVWQlFVVXNSMEZCUnl4SFFVRkhMRVZCUVVVc1EwRkJReXhOUVVGTkxFVkJRVVVzUjBGQlJ5eEZRVUZGTEVWQlFVVTdXVUZEZUVNc1RVRkJUU3hEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTJ4Q0xFMUJRVTBzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRaUVVOc1FpeE5RVUZOTEVWQlFVVXNSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTJwRExFMUJRVTBzUlVGQlJTeEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdXVUZEYWtNc2JVUkJRVzFFTzFsQlEyNUVMRGhEUVVFNFF6dFpRVU01UXl4cFEwRkJhVU03V1VGRGFrTXNhVU5CUVdsRE8xbEJRMnBETEVsQlFVa3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVTdaMEpCUTNKQ0xGZEJRVmNzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4WFFVRlhMRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU51UXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzVjBGQlZ5eEhRVUZITEVWQlFVVXNRMEZCUXp0aFFVTndRenRaUVVORUxFbEJRVWtzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1NVRkJTU3hEUVVGRExFVkJRVVU3WjBKQlEzSkNMRmRCUVZjc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFhRVUZYTEVkQlFVY3NSVUZCUlN4RFFVRkRPMmRDUVVOdVF5eFhRVUZYTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1YwRkJWeXhIUVVGSExFVkJRVVVzUTBGQlF6dGhRVU53UXp0WlFVTklMSGREUVVGM1F6dFpRVU40UXl4M1EwRkJkME03VTBGRGRrTTdVVUZEUkN4TFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJUdFpRVU0zUXl4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEZkQlFWY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhYUVVGWExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExGZEJRVmNzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMWxCUTNKSExFbEJRVWtzVDBGQlR5eEhRVUZITEVOQlFVTXNSVUZCUlR0blFrRkRaaXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NWMEZCVnl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFOUJRVThzUjBGQlJ5eFhRVUZYTEVOQlFVTTdaMEpCUTNoRUxFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4WFFVRlhMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzVDBGQlR5eEhRVUZITEZkQlFWY3NRMEZCUXp0aFFVTjZSRHRUUVVOR08wdEJRMFk3U1VGRlJDeFpRVUZaTzBsQlExb3NTVUZCU1N4SlFVRkpMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzSkNMRWxCUVVrc1NVRkJTU3hIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0SlFVTnlRaXhKUVVGSkxFbEJRVWtzUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1NVRkRja0lzU1VGQlNTeEpRVUZKTEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8wbEJRM0pDTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSU3hGUVVGRk8xRkJRemRETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUlVGQlJTeE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOdVF5eEpRVUZKTEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhKUVVGSkxFVkJRVVVzVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRia01zU1VGQlNTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hGUVVGRkxFMUJRVTBzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTI1RExFbEJRVWtzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1JVRkJSU3hOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTXNRMEZCUXp0TFFVTndRenRKUVVORUxFbEJRVWtzVFVGQlRTeEhRVUZITEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNN1NVRkRla0lzU1VGQlNTeE5RVUZOTEVkQlFVY3NTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJRenRKUVVONlFpeEpRVUZKTEUxQlFVMHNTMEZCU3l4RFFVRkRPMUZCUTJRc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF6dEpRVU5vUWl4TFFVRkxMRWxCUVVrc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJTeEhRVUZITEVkQlFVY3NUMEZCVHl4RFFVRkRMRTFCUVUwc1JVRkJSU3hIUVVGSExFVkJRVVU3VVVGRE0wTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFTkJRVU1zVFVGQlRTeERRVUZETEVkQlFVY3NRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFMUJRVTBzUjBGQlJ5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRPMGxCUTNoRUxFbEJRVWtzVFVGQlRTeExRVUZMTEVOQlFVTTdVVUZEWkN4TlFVRk5MRWRCUVVjc1NVRkJTU3hEUVVGRE8wbEJRMmhDTEV0QlFVc3NTVUZCU1N4SFFVRkhMRWRCUVVjc1EwRkJReXhGUVVGRkxFZEJRVWNzUjBGQlJ5eFBRVUZQTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSVHRSUVVNelF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1RVRkJUU3hIUVVGSExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdTVUZGZUVRc1QwRkJUeXhGUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVTXNRMEZCUXp0QlFVTXhRaXhEUVVGRElpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdFRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUjlJR1p5YjIwZ0p5NHZkSGx3WlhNbk8xeHVYRzVsZUhCdmNuUWdZWE41Ym1NZ1puVnVZM1JwYjI0Z1ltbHZUR0Y1YjNWMEtHTnNkWE4wWlhJNklHNTFiV0psY2x0ZExDQnpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2RHaHlaWE5vYjJ4a09pQnVkVzFpWlhJcElIdGNiaUFnWTI5dWMzUWdiaUE5SUdOc2RYTjBaWEl1YkdWdVozUm9PMXh1SUNCamIyNXpkQ0JwY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ1kyOXVjM1FnYW5NNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2dianNnYVNzcktTQjdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FpQTlJR2tnS3lBeE95QnFJRHdnYmpzZ2Fpc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmhJRDBnWTJ4MWMzUmxjbHRwWFR0Y2JpQWdJQ0FnSUdOdmJuTjBJR0lnUFNCamJIVnpkR1Z5VzJwZE8xeHVJQ0FnSUNBZ2FXWWdLSE53WVhKelpVOWlhbVZqZEZ0aFhUOHVXMkpkSUQ0OUlIUm9jbVZ6YUc5c1pDa2dlMXh1SUNBZ0lDQWdJQ0JwY3k1d2RYTm9LR2twTzF4dUlDQWdJQ0FnSUNCcWN5NXdkWE5vS0dvcE8xeHVJQ0FnSUNBZ2ZWeHVJQ0FnSUgxY2JpQWdmVnh1SUNCeVpYUjFjbTRnWjJWMFRHRjViM1YwUlcxaVpXUmthVzVuY3locGN5d2dhbk1zSUdOc2RYTjBaWElwTzF4dWZWeHVYRzVtZFc1amRHbHZiaUJuWlhSTVlYbHZkWFJGYldKbFpHUnBibWR6S0dsek9pQnVkVzFpWlhKYlhTd2dhbk02SUc1MWJXSmxjbHRkTENCamJIVnpkR1Z5T2lCdWRXMWlaWEpiWFNrZ2UxeHVJQ0JqYjI1emRDQmxiV0psWkZnZ1BTQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtHTnNkWE4wWlhJdWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29LU0E5UGlCTllYUm9MbkpoYm1SdmJTZ3BJQ29nTVRBcE8xeHVJQ0JqYjI1emRDQmxiV0psWkZrZ1BTQnVaWGNnUm14dllYUXpNa0Z5Y21GNUtHTnNkWE4wWlhJdWJHVnVaM1JvS1M1bWFXeHNLREFwTG0xaGNDZ29LU0E5UGlCTllYUm9MbkpoYm1SdmJTZ3BJQ29nTVRBcE8xeHVJQ0JqYjI1emRDQnBkR1Z5WVhScGIyNXpJRDBnTVRBd08xeHVJQ0JqYjI1emRDQjRWbVZzYjJOcGRHbGxjeUE5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvWTJ4MWMzUmxjaTVzWlc1bmRHZ3BMbVpwYkd3b01DazdYRzRnSUdOdmJuTjBJSGxXWld4dlkybDBhV1Z6SUQwZ2JtVjNJRVpzYjJGME16SkJjbkpoZVNoamJIVnpkR1Z5TG14bGJtZDBhQ2t1Wm1sc2JDZ3dLVHRjYmlBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnBkR1Z5WVhScGIyNXpPeUJwS3lzcElIdGNiaUFnSUNCamIyNXpkQ0IwWlcxd1pYSmhkSFZ5WlNBOUlDZ3hJQzBnYVNBdklHbDBaWEpoZEdsdmJuTXBPMXh1SUNBZ0lIaFdaV3h2WTJsMGFXVnpMbVpwYkd3b01DazdYRzRnSUNBZ2VWWmxiRzlqYVhScFpYTXVabWxzYkNnd0tUdGNiaUFnSUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0JwY3k1c1pXNW5kR2c3SUdsa2VDc3JLU0I3WEc0Z0lDQWdJQ0JqYjI1emRDQmhJRDBnYVhOYmFXUjRYVHRjYmlBZ0lDQWdJR052Ym5OMElHSWdQU0JxYzF0cFpIaGRPMXh1SUNBZ0lDQWdZMjl1YzNRZ1pIZ2dQU0JsYldKbFpGaGJZVjBnTFNCbGJXSmxaRmhiWWwwN1hHNGdJQ0FnSUNCamIyNXpkQ0JrZVNBOUlHVnRZbVZrV1Z0aFhTQXRJR1Z0WW1Wa1dWdGlYVHRjYmlBZ0lDQWdJQzh2SUNBZ1kyOXVjM1FnWkdsemRHRnVZMlVnUFNCTllYUm9Mbk54Y25Rb1pIZ2dLaUJrZUNBcklHUjVJQ29nWkhrcE8xeHVJQ0FnSUNBZ0x5OGdJQ0JqYjI1emRDQm1ZV04wYjNJZ1BTQW9aR2x6ZEdGdVkyVWdMU0F4S1NBdklHUnBjM1JoYm1ObE8xeHVJQ0FnSUNBZ0x5OGdJQ0JqYjI1emRDQnZabVp6WlhSWUlEMGdaSGdnS2lCbVlXTjBiM0k3WEc0Z0lDQWdJQ0F2THlBZ0lHTnZibk4wSUc5bVpuTmxkRmtnUFNCa2VTQXFJR1poWTNSdmNqdGNiaUFnSUNBZ0lHbG1JQ2hOWVhSb0xtRmljeWhrZUNrZ1BqMGdNU2tnZTF4dUlDQWdJQ0FnSUNCNFZtVnNiMk5wZEdsbGMxdGhYU0F0UFNCMFpXMXdaWEpoZEhWeVpTQXFJR1I0TzF4dUlDQWdJQ0FnSUNCNFZtVnNiMk5wZEdsbGMxdGlYU0FyUFNCMFpXMXdaWEpoZEhWeVpTQXFJR1I0TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJQ0FnYVdZZ0tFMWhkR2d1WVdKektHUjVLU0ErUFNBeEtTQjdYRzRnSUNBZ0lDQWdJSGxXWld4dlkybDBhV1Z6VzJGZElDMDlJSFJsYlhCbGNtRjBkWEpsSUNvZ1pIazdYRzRnSUNBZ0lDQWdJSGxXWld4dlkybDBhV1Z6VzJKZElDczlJSFJsYlhCbGNtRjBkWEpsSUNvZ1pIazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0x5OGdJQ0JsYldKbFpGbGJZVjBnS3owZ2IyWm1jMlYwV1NBcUlIUmxiWEJsY21GMGRYSmxPMXh1SUNBZ0lDOHZJQ0FnWlcxaVpXUlpXMkpkSUMwOUlHOW1abk5sZEZrZ0tpQjBaVzF3WlhKaGRIVnlaVHRjYmlBZ0lDQjlYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FXUjRJRDBnTURzZ2FXUjRJRHdnWTJ4MWMzUmxjaTVzWlc1bmRHZzdJR2xrZUNzcktTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCMlpXTlRhWHBsSUQwZ1RXRjBhQzV6Y1hKMEtIaFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0tpQjRWbVZzYjJOcGRHbGxjMXRwWkhoZElDc2dlVlpsYkc5amFYUnBaWE5iYVdSNFhTQXFJSGxXWld4dlkybDBhV1Z6VzJsa2VGMHBPMXh1SUNBZ0lDQWdhV1lnS0habFkxTnBlbVVnUGlBd0tTQjdYRzRnSUNBZ0lDQWdJR1Z0WW1Wa1dGdHBaSGhkSUNzOUlIaFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0x5QjJaV05UYVhwbElDb2dkR1Z0Y0dWeVlYUjFjbVU3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXVnRwWkhoZElDczlJSGxXWld4dlkybDBhV1Z6VzJsa2VGMGdMeUIyWldOVGFYcGxJQ29nZEdWdGNHVnlZWFIxY21VN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ0x5OGdibTl5YldGc2FYcGxYRzRnSUd4bGRDQnRhVzVZSUQwZ1pXMWlaV1JZV3pCZE8xeHVJQ0JzWlhRZ2JXbHVXU0E5SUdWdFltVmtXVnN3WFR0Y2JpQWdiR1YwSUcxaGVGZ2dQU0JsYldKbFpGaGJNRjA3WEc0Z0lHeGxkQ0J0WVhoWklEMGdaVzFpWldSWld6QmRPMXh1SUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F4T3lCcFpIZ2dQQ0JqYkhWemRHVnlMbXhsYm1kMGFEc2dhV1I0S3lzcElIdGNiaUFnSUNCdGFXNVlJRDBnVFdGMGFDNXRhVzRvYldsdVdDd2daVzFpWldSWVcybGtlRjBwTzF4dUlDQWdJRzFwYmxrZ1BTQk5ZWFJvTG0xcGJpaHRhVzVaTENCbGJXSmxaRmxiYVdSNFhTazdYRzRnSUNBZ2JXRjRXQ0E5SUUxaGRHZ3ViV0Y0S0cxaGVGZ3NJR1Z0WW1Wa1dGdHBaSGhkS1R0Y2JpQWdJQ0J0WVhoWklEMGdUV0YwYUM1dFlYZ29iV0Y0V1N3Z1pXMWlaV1JaVzJsa2VGMHBPMXh1SUNCOVhHNGdJR3hsZENCeVlXNW5aVmdnUFNCdFlYaFlJQzBnYldsdVdEdGNiaUFnYkdWMElISmhibWRsV1NBOUlHMWhlRmtnTFNCdGFXNVpPMXh1SUNCcFppQW9jbUZ1WjJWWUlEMDlQU0F3S1Z4dUlDQWdJSEpoYm1kbFdDQTlJRzFoZUZnN1hHNGdJR1p2Y2lBb2JHVjBJR2xrZUNBOUlEQTdJR2xrZUNBOElHTnNkWE4wWlhJdWJHVnVaM1JvT3lCcFpIZ3JLeWxjYmlBZ0lDQmxiV0psWkZoYmFXUjRYU0E5SUNobGJXSmxaRmhiYVdSNFhTQXRJRzFwYmxncElDOGdjbUZ1WjJWWUlDOGdNaUFySURBdU5UdGNiaUFnYVdZZ0tISmhibWRsV1NBOVBUMGdNQ2xjYmlBZ0lDQnlZVzVuWlZrZ1BTQnRZWGhaTzF4dUlDQm1iM0lnS0d4bGRDQnBaSGdnUFNBd095QnBaSGdnUENCamJIVnpkR1Z5TG14bGJtZDBhRHNnYVdSNEt5c3BYRzRnSUNBZ1pXMWlaV1JaVzJsa2VGMGdQU0FvWlcxaVpXUlpXMmxrZUYwZ0xTQnRhVzVaS1NBdklISmhibWRsV1NBdklESWdLeUF3TGpVN1hHNWNiaUFnY21WMGRYSnVJSHRsYldKbFpGZ3NJR1Z0WW1Wa1dYMDdYRzU5WEc0aVhYMD0iLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogY29sd2lzZSBub3JtYWxpemUgdGhlIGtubiBzaW1pbGFyaXRpZXNcbiAqIEJFIFdBUkUsIG1vZGlmaWVzIHRoZSBpbnB1dCBhcnJheSBpbiBwbGFjZVxuICogQHBhcmFtIGRldmljZVxuICogQHBhcmFtIGtublNpbWlsYXJpdGllc1xuICogQHBhcmFtIG9mZnNldHNcbiAqIEBwYXJhbSBuUm93c1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSBuUm93cztcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBtb2R1bGUgPSBkZXZpY2UuY3JlYXRlU2hhZGVyTW9kdWxlKHtcbiAgICAgICAgICAgIGxhYmVsOiAnY29sd2lzZS1ub3JtYWxpemUnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBAZ3JvdXAoMCkgQGJpbmRpbmcoMCkgdmFyPHN0b3JhZ2UsIHJlYWRfd3JpdGU+IGtublNpbWlsYXJpdGllcyA6IGFycmF5PGYzMj47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZD4gb2Zmc2V0cyA6IGFycmF5PHUzMj47XG4gICAgICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cFRocmVhZHNQZXJEaW19LCAke3dvcmtHcm91cFRocmVhZHNQZXJEaW19KSBmbiBub3JtYWxpemUoXG4gICAgICAgICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPixcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC54O1xuICAgICAgICAgICAgbGV0IGNvbCA9IGlkLnk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByb3cgKiAke3RocmVhZHNQZXJEaW19ICsgY29sO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49ICR7blJvd3N9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luID0gb2Zmc2V0c1tpbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0RW5kID0gb2Zmc2V0c1tpbmRleCArIDFdO1xuICAgICAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgICAgIGlmIChvZmZzZXRFbmQgLSBvZmZzZXRCZWdpbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldEJlZ2luOyBpIDwgb2Zmc2V0RW5kOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBrbm5TaW1pbGFyaXRpZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VtID4gMC4wKSB7XG4gICAgICAgICAgICAgIGZvciAodmFyIGkgPSBvZmZzZXRCZWdpbjsgaSA8IG9mZnNldEVuZDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgICBrbm5TaW1pbGFyaXRpZXNbaV0gPSBrbm5TaW1pbGFyaXRpZXNbaV0gLyBzdW07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBgLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnaGFtbWluZyBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZSxcbiAgICAgICAgICAgICAgICBlbnRyeVBvaW50OiAnbm9ybWFsaXplJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzaW1taWxhcml0aWVzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NpbW1pbGFyaXRpZXMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZToga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc2ltbWlsYXJpdGllc0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQoa25uU2ltaWxhcml0aWVzKTtcbiAgICAgICAgc2ltbWlsYXJpdGllc0J1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ29mZnNldHMgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogb2Zmc2V0cy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkob2Zmc2V0c0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQob2Zmc2V0cyk7XG4gICAgICAgIG9mZnNldHNCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IHNpbW1pbGFyaXRpZXNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGJpbmRpbmc6IDEsXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI6IG9mZnNldHNCdWZmZXIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBjb21tYW5kRW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2RlcigpO1xuICAgICAgICBjb25zdCBwYXNzRW5jb2RlciA9IGNvbW1hbmRFbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3MoKTtcbiAgICAgICAgcGFzc0VuY29kZXIuc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICBwYXNzRW5jb2Rlci5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgcGFzc0VuY29kZXIuZW5kKCk7XG4gICAgICAgIGNvbnN0IG91dFNpbWlsYXJpdHlCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IHNpbWlsYXJpdHkgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IGtublNpbWlsYXJpdGllcy5ieXRlTGVuZ3RoLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb21tYW5kRW5jb2Rlci5jb3B5QnVmZmVyVG9CdWZmZXIoc2ltbWlsYXJpdGllc0J1ZmZlciwgMCwgb3V0U2ltaWxhcml0eUJ1ZmZlciwgMCwga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgpO1xuICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtjb21tYW5kRW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICB5aWVsZCBkZXZpY2UucXVldWUub25TdWJtaXR0ZWRXb3JrRG9uZSgpO1xuICAgICAgICB5aWVsZCBvdXRTaW1pbGFyaXR5QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgIGNvbnN0IGFycmF5QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShvdXRTaW1pbGFyaXR5QnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpO1xuICAgICAgICBrbm5TaW1pbGFyaXRpZXMuc2V0KGFycmF5QnVmZmVyKTtcbiAgICAgICAgb3V0U2ltaWxhcml0eUJ1ZmZlci51bm1hcCgpO1xuICAgICAgICBzaW1taWxhcml0aWVzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgb2Zmc2V0c0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dFNpbWlsYXJpdHlCdWZmZXIuZGVzdHJveSgpO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sd2lzZS1ub3JtYWxpemUuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKipcbiAqIGluZmxhdGlvbiBvcGVyYXRvciBpbiBwbGFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mbGF0ZShrbm5TaW1pbGFyaXRpZXMsIGZhY3RvciA9IDIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtublNpbWlsYXJpdGllcy5sZW5ndGg7IGkrKylcbiAgICAgICAga25uU2ltaWxhcml0aWVzW2ldID0gTWF0aC5wb3coa25uU2ltaWxhcml0aWVzW2ldLCBmYWN0b3IpO1xufVxuZnVuY3Rpb24gZ2V0Um93SW5kZXhlcyhvZmZzZXRzKSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQzMkFycmF5KG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvZmZzZXRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBmb3IgKGxldCBqID0gb2Zmc2V0c1tpXTsgaiA8IG9mZnNldHNbaSArIDFdOyBqKyspXG4gICAgICAgICAgICByZXNbal0gPSBpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgbG9va2luZyBhdCBhbHJlYWR5IHplcm9lZCBvdXQgdmFsdWVzLCBhbmQgb25seSBsb29rcyBhdCBsaXZlIGNlbGxzLlxuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZE5vUmV2aXZlKGRldmljZSwga25uU2ltaWxhcml0aWVzLCBrbm5JbmRleGVzLCBvZmZzZXRzLCBuUm93cykge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG5lZWRlZFRocmVhZHMgPSA5MDAwMDtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwVGhyZWFkc1BlckRpbSA9IDEwO1xuICAgICAgICBjb25zdCB0b3RhbFdvcmtncm91cFRocmVhZHMgPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwVGhyZWFkc1BlckRpbTtcbiAgICAgICAgY29uc3QgbmVlZGVkV29ya0dyb3VwcyA9IE1hdGguY2VpbChuZWVkZWRUaHJlYWRzIC8gdG90YWxXb3JrZ3JvdXBUaHJlYWRzKTtcbiAgICAgICAgY29uc3Qgd29ya0dyb3VwRGltID0gTWF0aC5jZWlsKE1hdGguc3FydChuZWVkZWRXb3JrR3JvdXBzKSk7XG4gICAgICAgIGNvbnN0IHRocmVhZHNQZXJEaW0gPSB3b3JrR3JvdXBUaHJlYWRzUGVyRGltICogd29ya0dyb3VwRGltO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIC8vIG1pbmltdW0gdmFsdWUgYWZ0ZXIgZXhwYW5zaW9uLlxuICAgICAgICBjb25zdCBwcnVuZVZhbHVlID0gTWF0aC5wb3coMTAsIC1vcmRlcik7XG4gICAgICAgIGNvbnN0IG91dEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoa25uU2ltaWxhcml0aWVzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQnLFxuICAgICAgICAgICAgY29kZTogYFxuICAgICAgICBzdHJ1Y3QgU3BhcnNlS05OIHtcbiAgICAgICAgICAgIGtublNpbWlsYXJpdGllczogYXJyYXk8ZjMyLCAke2tublNpbWlsYXJpdGllcy5sZW5ndGh9PixcbiAgICAgICAgICAgIGtubkluZGV4ZXM6IGFycmF5PHUzMiwgJHtrbm5JbmRleGVzLmxlbmd0aH0+LFxuICAgICAgICAgICAgb2Zmc2V0czogYXJyYXk8dTMyLCAke29mZnNldHMubGVuZ3RofT4sXG4gICAgICAgICAgICByb3dJbmRleGVzOiBhcnJheTx1MzIsICR7a25uSW5kZXhlcy5sZW5ndGh9PixcbiAgICAgICAgfVxuXG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3BhcnNlS05OOiBTcGFyc2VLTk47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygxKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gcmVzdWx0U2ltQmxvY2s6IGFycmF5PGYzMiwgJHtuZWVkZWRUaHJlYWRzfT47XG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygyKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4gc3RhcnRBdDogdTMyO1xuICAgICAgICBAY29tcHV0ZSBAd29ya2dyb3VwX3NpemUoJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSwgJHt3b3JrR3JvdXBUaHJlYWRzUGVyRGltfSkgZm4gZXhwYW5kKFxuICAgICAgICAgICAgQGJ1aWx0aW4oZ2xvYmFsX2ludm9jYXRpb25faWQpIGlkOiB2ZWMzPHUzMj4sXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgY29sID0gaWQueDtcbiAgICAgICAgICAgIGxldCByb3cgPSBpZC55O1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gcm93ICogJHt0aHJlYWRzUGVyRGltfSArIGNvbDtcbiAgICAgICAgICAgIGlmIChpbmRleCA+PSAke25lZWRlZFRocmVhZHN9KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHdvcmtpbmdJbmRleCA9IGluZGV4ICsgc3RhcnRBdDtcbiAgICAgICAgICAgIGlmICh3b3JraW5nSW5kZXggPj0gJHtrbm5JbmRleGVzLmxlbmd0aH0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByb3dJZHggPSBzcGFyc2VLTk4ucm93SW5kZXhlc1t3b3JraW5nSW5kZXhdO1xuICAgICAgICAgICAgbGV0IGNvbElkeCA9IHNwYXJzZUtOTi5rbm5JbmRleGVzW3dvcmtpbmdJbmRleF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0QmVnaW5Sb3cgPSBzcGFyc2VLTk4ub2Zmc2V0c1tyb3dJZHhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEVuZFJvdyA9IHNwYXJzZUtOTi5vZmZzZXRzW3Jvd0lkeCArIDFdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEJlZ2luQ29sID0gc3BhcnNlS05OLm9mZnNldHNbY29sSWR4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbmRDb2wgPSBzcGFyc2VLTk4ub2Zmc2V0c1tjb2xJZHggKyAxXTtcbiAgICAgICAgICAgIHZhciBzdW0gPSAwLjA7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0QmVnaW5Sb3c7IGkgPCBvZmZzZXRFbmRSb3c7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGZvcih2YXIgaiA9IG9mZnNldEJlZ2luQ29sOyBqIDwgb2Zmc2V0RW5kQ29sOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwYXJzZUtOTi5rbm5JbmRleGVzW2ldID09IHNwYXJzZUtOTi5rbm5JbmRleGVzW2pdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdW0gPSBzdW0gKyBzcGFyc2VLTk4ua25uU2ltaWxhcml0aWVzW2ldICogc3BhcnNlS05OLmtublNpbWlsYXJpdGllc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN1bSA+ICR7cHJ1bmVWYWx1ZX0pIHtcbiAgICAgICAgICAgICAgICByZXN1bHRTaW1CbG9ja1tpbmRleF0gPSBzdW07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3VsdFNpbUJsb2NrW2luZGV4XSA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHBpcGVsaW5lID0gZGV2aWNlLmNyZWF0ZUNvbXB1dGVQaXBlbGluZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCBjb21wdXRlIHBpcGVsaW5lJyxcbiAgICAgICAgICAgIGxheW91dDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcHV0ZToge1xuICAgICAgICAgICAgICAgIG1vZHVsZTogbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdleHBhbmQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSA9IGtublNpbWlsYXJpdGllcy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aCArIG9mZnNldHMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGg7XG4gICAgICAgIGxldCBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSA9IHNwYXJzZUtOTkJ1ZmZlcjMyU2l6ZSAqIDQ7XG4gICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplICYgMTU7XG4gICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSArPSAxNiAtIHJlbWFpbmRlcjtcbiAgICAgICAgY29uc3Qgc3BhcnNlS05OQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3NwYXJzZSBrbm4gYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBzcGFyc2VLTk5BcnJheUJ1ZmZlciA9IHNwYXJzZUtOTkJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpO1xuICAgICAgICAvLyBzZXQgc2ltaWxhcml0aWVzXG4gICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIDAsIGtublNpbWlsYXJpdGllcy5sZW5ndGgpLnNldChrbm5TaW1pbGFyaXRpZXMpO1xuICAgICAgICAvLyBzZXQgaW5kZXhlc1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIGtublNpbWlsYXJpdGllcy5sZW5ndGggKiA0LCBrbm5JbmRleGVzLmxlbmd0aCkuc2V0KGtubkluZGV4ZXMpO1xuICAgICAgICAvLyBzZXQgb2Zmc2V0c1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGgpICogNCwgb2Zmc2V0cy5sZW5ndGgpLnNldChvZmZzZXRzKTtcbiAgICAgICAgLy8gc2V0IHJvdyBpbmRleGVzXG4gICAgICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBnZXRSb3dJbmRleGVzKG9mZnNldHMpO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3BhcnNlS05OQXJyYXlCdWZmZXIsIChrbm5TaW1pbGFyaXRpZXMubGVuZ3RoICsga25uSW5kZXhlcy5sZW5ndGggKyBvZmZzZXRzLmxlbmd0aCkgKiA0LCByb3dJbmRleGVzLmxlbmd0aCkuc2V0KHJvd0luZGV4ZXMpO1xuICAgICAgICBzcGFyc2VLTk5CdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3Qgc3RhcnRCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3RhcnQgZW5kIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiA0LFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBuZXcgVWludDMyQXJyYXkoc3RhcnRCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSkuc2V0KFswXSk7XG4gICAgICAgIHN0YXJ0QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdEJsb2NrQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdCBibG9jayBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogbmVlZGVkVGhyZWFkcyAqIDQsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYmluZEdyb3VwID0gZGV2aWNlLmNyZWF0ZUJpbmRHcm91cCh7XG4gICAgICAgICAgICBsYXlvdXQ6IHBpcGVsaW5lLmdldEJpbmRHcm91cExheW91dCgwKSxcbiAgICAgICAgICAgIGVudHJpZXM6IFtcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDAsIHJlc291cmNlOiB7IGJ1ZmZlcjogc3BhcnNlS05OQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDEsIHJlc291cmNlOiB7IGJ1ZmZlcjogcmVzdWx0QmxvY2tCdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMiwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzdGFydEJ1ZmZlciB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgb3V0QmxvY2tCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb3V0IGJsb2NrIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiByZXN1bHRCbG9ja0J1ZmZlci5zaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLk1BUF9SRUFEIHwgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1RcbiAgICAgICAgfSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5jZWlsKGtubkluZGV4ZXMubGVuZ3RoIC8gbmVlZGVkVGhyZWFkcyk7IGkrKykge1xuICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSBpICogbmVlZGVkVGhyZWFkcztcbiAgICAgICAgICAgIGNvbnN0IGN1ckxlbmd0aCA9IE1hdGgubWluKG5lZWRlZFRocmVhZHMsIGtubkluZGV4ZXMubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLndyaXRlQnVmZmVyKHN0YXJ0QnVmZmVyLCAwLCBuZXcgVWludDMyQXJyYXkoW3N0YXJ0XSkpO1xuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQgZW5jb2RlcicsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHBhc3MgPSBlbmNvZGVyLmJlZ2luQ29tcHV0ZVBhc3Moe1xuICAgICAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kIGNvbXB1dGUgcGFzcycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHBhc3Muc2V0UGlwZWxpbmUocGlwZWxpbmUpO1xuICAgICAgICAgICAgcGFzcy5zZXRCaW5kR3JvdXAoMCwgYmluZEdyb3VwKTtcbiAgICAgICAgICAgIHBhc3MuZGlzcGF0Y2hXb3JrZ3JvdXBzKHdvcmtHcm91cERpbSwgd29ya0dyb3VwRGltKTtcbiAgICAgICAgICAgIHBhc3MuZW5kKCk7XG4gICAgICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihyZXN1bHRCbG9ja0J1ZmZlciwgMCwgb3V0QmxvY2tCdWZmZXIsIDAsIG91dEJsb2NrQnVmZmVyLnNpemUpO1xuICAgICAgICAgICAgZGV2aWNlLnF1ZXVlLnN1Ym1pdChbZW5jb2Rlci5maW5pc2goKV0pO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ29uU3VibWl0dGVkV29ya0RvbmUnKTtcbiAgICAgICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZUVuZCgnb25TdWJtaXR0ZWRXb3JrRG9uZScpO1xuICAgICAgICAgICAgeWllbGQgb3V0QmxvY2tCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgICAgIGNvbnN0IG91dEJsb2NrID0gbmV3IEZsb2F0MzJBcnJheShvdXRCbG9ja0J1ZmZlci5nZXRNYXBwZWRSYW5nZSgpLCAwLCBjdXJMZW5ndGgpO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWUoJ2ZpbGxvdXQnKTtcbiAgICAgICAgICAgIG91dEtOTlNpbWlsYXJpdGllcy5zZXQob3V0QmxvY2ssIHN0YXJ0KTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lRW5kKCdmaWxsb3V0Jyk7XG4gICAgICAgICAgICBvdXRCbG9ja0J1ZmZlci51bm1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3lcbiAgICAgICAgc3BhcnNlS05OQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgc3RhcnRCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRCbG9ja0J1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIG91dEJsb2NrQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHsgS05OSW5kZXhlczoga25uSW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRLTk5TaW1pbGFyaXRpZXMsIGluZGV4T2Zmc2V0czogb2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5mbGF0ZS1leHBhbmQuanMubWFwIiwiaW1wb3J0IHsgdG9PZmZzZXRGb3JtIH0gZnJvbSAnLi4vdW1hcC91dGlscyc7XG5leHBvcnQgZnVuY3Rpb24gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50MzJBcnJheShuUm93cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbc3BhcnNlTWF0cml4LmlbaV1dKys7XG4gICAgICAgIHJlc1tzcGFyc2VNYXRyaXgualtpXV0rKztcbiAgICB9XG4gICAgLy8gYWRkIGxvb3BzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuUm93czsgaSsrKVxuICAgICAgICByZXNbaV0rKztcbiAgICByZXR1cm4gcmVzO1xufVxuLyoqXG4gKiBCRSBXQVJFLCB0aGlzIGZ1bmN0aW9uIGlzIG1lbnQgZm9yIGhhbGYgc3BhcnNlIG1hdHJpY2VzIG9ubHkhISFcbiAqIEBwYXJhbSBzcGFyc2VNYXRyaXhcbiAqIEBwYXJhbSBuUm93c1xuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0oc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgIGNvbnN0IG9jY3VyZW5jZUNvdW50ID0gY291bnRPY2N1cmFuY2VzQWRkTG9vcHMoc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgY29uc3Qgb2Zmc2V0Rm9ybSA9IHRvT2Zmc2V0Rm9ybShvY2N1cmVuY2VDb3VudCk7XG4gICAgY29uc3QgaW5zZXJ0Q291bnRlciA9IG5ldyBVaW50MzJBcnJheShuUm93cykuZmlsbCgxKTsgLy8gZm9yIGNvdW50aW5nIGhvdyBtYW55IHRoaW5ncyB3ZSBpbnNlcnRlZCBpbnRvIHRoZSBrbm4gYXJyYXlzLlxuICAgIC8vIHdlIGluaXRpYWxpemUgdGhlc2UgY291bnRlcnMgdG8gb25lIGJlY2F1c2UgZmlyc3Qgd2UgaW5zZXJ0IHRoZSBzZWxmIGxvb3BzXG4gICAgLy8gZG9udCBiZSBjb25mdXNlZCBieSB0aGUgbmFtZSBrbm4sIGsgaGVyZSBpcyB2YXJpYWJsZSwgaXRzIGp1c3QgdGhlIHRoaW5nIHRoYXQgaW4gdGhpcyBmb3JtLCB3ZSBrbm93IHRoYXQgYXQgaW5kZXggaVxuICAgIC8vIHdlIGhhdmUgc29tZSBrKHZhcmlhYmxlKSBhbW1vdW50IG9mIHNwYXJzZSBuZWlnYm91cnNcbiAgICAvLyB3ZSBrbm93IGZvciBhIGZhY3QgdGhhdCBzcGFyc2UgbWF0cml4IHdpbGwgbm90IGNvbnRhaW4gYW55IGR1cGxpY2F0ZXMsIHdlIGFkZCBuUm93cyB0byBhY2NvdW50IGZvciBzZWxmIGxvb3BzXG4gICAgY29uc3QgS05OSW5kZXhlcyA9IG5ldyBVaW50MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICAgIGNvbnN0IEtOTlNpbWlsYXJpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoc3BhcnNlTWF0cml4LmkubGVuZ3RoICogMiArIG5Sb3dzKTtcbiAgICAvLyBpbnNlcnQgc2VsZiBsb29wcyBhdCB0aGUgc3RhcnQgb2YgZWFjaCBvZmZzZXRcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW2ldXSA9IGk7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2ldXSA9IDE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhcnNlTWF0cml4LmkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlTWF0cml4LmlbaV07XG4gICAgICAgIGNvbnN0IGNvbCA9IHNwYXJzZU1hdHJpeC5qW2ldO1xuICAgICAgICBjb25zdCBzaW1pbGFyaXR5ID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgS05OSW5kZXhlc1tvZmZzZXRGb3JtW3Jvd10gKyBpbnNlcnRDb3VudGVyW3Jvd11dID0gY29sO1xuICAgICAgICBLTk5TaW1pbGFyaXRpZXNbb2Zmc2V0Rm9ybVtyb3ddICsgaW5zZXJ0Q291bnRlcltyb3ddXSA9IHNpbWlsYXJpdHk7XG4gICAgICAgIGluc2VydENvdW50ZXJbcm93XSsrO1xuICAgICAgICBLTk5JbmRleGVzW29mZnNldEZvcm1bY29sXSArIGluc2VydENvdW50ZXJbY29sXV0gPSByb3c7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW2NvbF0gKyBpbnNlcnRDb3VudGVyW2NvbF1dID0gc2ltaWxhcml0eTtcbiAgICAgICAgaW5zZXJ0Q291bnRlcltjb2xdKys7XG4gICAgfVxuICAgIHJldHVybiB7IEtOTkluZGV4ZXMsIEtOTlNpbWlsYXJpdGllcywgaW5kZXhPZmZzZXRzOiBvZmZzZXRGb3JtIH07XG59XG5leHBvcnQgZnVuY3Rpb24ga25uVG9TcGFyc2VGb3JtKGtubkluZGV4ZXMsIGtublNpbXMpIHtcbiAgICBjb25zdCBsZW5ndGhzID0ga25uSW5kZXhlcy5tYXAoKHgpID0+IHgubGVuZ3RoKTtcbiAgICBjb25zdCB0b3RhbExlbmd0aCA9IGxlbmd0aHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IHRvT2Zmc2V0Rm9ybShsZW5ndGhzKTtcbiAgICBjb25zdCBvdXRJbmRleGVzID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICBjb25zdCBvdXRTaW1zID0gbmV3IEZsb2F0MzJBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrbm5JbmRleGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG91dEluZGV4ZXMuc2V0KGtubkluZGV4ZXNbaV0sIG9mZnNldHNbaV0pO1xuICAgICAgICBvdXRTaW1zLnNldChrbm5TaW1zW2ldLCBvZmZzZXRzW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgS05OSW5kZXhlczogb3V0SW5kZXhlcywgS05OU2ltaWxhcml0aWVzOiBvdXRTaW1zLCBpbmRleE9mZnNldHM6IG9mZnNldHMgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXV0aWxzLmpzLm1hcCIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuaW1wb3J0IHsgbGV2ZW5iZXJnTWFycXVhcmR0IH0gZnJvbSAnbWwtbGV2ZW5iZXJnLW1hcnF1YXJkdCc7XG5leHBvcnQgZnVuY3Rpb24gbGluZWFyKHgxLCB4Miwgbikge1xuICAgIGNvbnN0IHN0ZXAgPSAoeDIgLSB4MSkgLyAobiAtIDEpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiB4MSArIHN0ZXAgKiBpKTtcbn1cbi8qKlxuICogRml0IGEsIGIgcGFyYW1zIGZvciB0aGUgZGlmZmVyZW50aWFibGUgY3VydmUgdXNlZCBpbiBsb3dlclxuICogZGltZW5zaW9uYWwgZnV6enkgc2ltcGxpY2lhbCBjb21wbGV4IGNvbnN0cnVjdGlvbi4gV2Ugd2FudCB0aGVcbiAqIHNtb290aCBjdXJ2ZSAoZnJvbSBhIHByZS1kZWZpbmVkIGZhbWlseSB3aXRoIHNpbXBsZSBncmFkaWVudCkgdGhhdFxuICogYmVzdCBtYXRjaGVzIGFuIG9mZnNldCBleHBvbmVudGlhbCBkZWNheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBQlBhcmFtcyhzcHJlYWQsIG1pbkRpc3QpIHtcbiAgICBjb25zdCBjdXJ2ZSA9IChbYSwgYl0pID0+ICh4KSA9PiB7XG4gICAgICAgIHJldHVybiAxLjAgLyAoMS4wICsgYSAqIE1hdGgucG93KHgsICgyICogYikpKTtcbiAgICB9O1xuICAgIGNvbnN0IHh2ID0gbGluZWFyKDAsIHNwcmVhZCAqIDMsIDMwMClcbiAgICAgICAgLm1hcCgodmFsKSA9PiAodmFsIDwgbWluRGlzdCA/IDEuMCA6IHZhbCkpO1xuICAgIGNvbnN0IHl2ID0gbmV3IEFycmF5KHh2Lmxlbmd0aCkuZmlsbCgwKS5tYXAoKHZhbCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZ3RlID0geHZbaW5kZXhdID49IG1pbkRpc3Q7XG4gICAgICAgIHJldHVybiBndGUgPyBNYXRoLmV4cCgtKHh2W2luZGV4XSAtIG1pbkRpc3QpIC8gc3ByZWFkKSA6IHZhbDtcbiAgICB9KTtcbiAgICBjb25zdCBpbml0aWFsVmFsdWVzID0gWzAuNSwgMC41XTtcbiAgICBjb25zdCBkYXRhID0geyB4OiB4diwgeTogeXYgfTtcbiAgICAvLyBEZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBhbGdvcml0aG0gKGZyb20gZ2l0aHViIGV4YW1wbGUpXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZGFtcGluZzogMS41LFxuICAgICAgICBpbml0aWFsVmFsdWVzLFxuICAgICAgICBncmFkaWVudERpZmZlcmVuY2U6IDEwZS0yLFxuICAgICAgICBtYXhJdGVyYXRpb25zOiAxMDAsXG4gICAgICAgIGVycm9yVG9sZXJhbmNlOiAxMGUtMyxcbiAgICB9O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuZXctY2FwXG4gICAgY29uc3QgeyBwYXJhbWV0ZXJWYWx1ZXMgfSA9IGxldmVuYmVyZ01hcnF1YXJkdChkYXRhLCBjdXJ2ZSwgb3B0aW9ucyk7XG4gICAgY29uc3QgW2EsIGJdID0gcGFyYW1ldGVyVmFsdWVzO1xuICAgIHJldHVybiB7IGEsIGIgfTtcbn1cbi8qKlxuICogaGV1cmlzdGljIGZvciBudW1iZXIgb2YgZXBvY2hzIG9mIHVtYXAsIGRpZmZlcnMgZnJvbSBjcHUgdmVyc2lvbiwgYmVjYXVzZSBvZiB0aGUgd2F5IGdwdSBwYXNzZXMgZGF0YVxuICogQHBhcmFtIGVudHJ5TGVuIG51bWJlciBvZiBlbnRyaWVzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TkVwb2NocyhlbnRyeUxlbikge1xuICAgIC8vXG4gICAgY29uc3QgbGVuZ3RoID0gZW50cnlMZW47XG4gICAgaWYgKGxlbmd0aCA8PSAyNTAwKVxuICAgICAgICByZXR1cm4gMTAwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNTAwMClcbiAgICAgICAgcmV0dXJuIDgwMDtcbiAgICBlbHNlIGlmIChsZW5ndGggPD0gNzUwMClcbiAgICAgICAgcmV0dXJuIDY1MDtcbiAgICBlbHNlXG4gICAgICAgIHJldHVybiA0MDA7XG59XG4vKiogIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgYXJyYXkgb2Ygc2l6ZXMgdG8gb2Zmc2V0IGZvcm0gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b09mZnNldEZvcm0oYXIpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDMyQXJyYXkoYXIubGVuZ3RoICsgMSk7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhci5sZW5ndGg7IGkrKykge1xuICAgICAgICByZXNbaV0gPSBvZmZzZXQ7XG4gICAgICAgIG9mZnNldCArPSBhcltpXTtcbiAgICB9XG4gICAgcmVzW2FyLmxlbmd0aF0gPSBvZmZzZXQ7XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKiBtdWx0aXBsaWVzIGZsYXQgcmVwcmVzZW50YXRpb24gb2Ygc3BhcnNlIGtubiBpbmZvIGJ5IHNjYWxhci5cbiAqIGFsc28gbm8gcG9pbnQgb2YgZG9pbmcgdGhpcyBvbiBncHUsIGNhbiBiZSBkb25lIG9uIGNwdSBwcmV0dHkgcXVpY2tseS5cbiAqIGlmIHRoZXJlIHdpbGwgYmUgbmVlZCBmb3IgaXQsIGl0IGNhbiBiZSBkb25lIG9uIGdwdSBhcyB3ZWxsIHZlcnkgdmVyeSBlYXNpbHkuXG4gKiBAcGFyYW0gdmFsdWVzIHZhbHVlcyBhcnJheVxuICogQHBhcmFtIHNjYWxhclxuICovXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHlTY2FsYXIodmFsdWVzLCBzY2FsYXIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgdmFsdWVzW2ldID0gdmFsdWVzW2ldICogc2NhbGFyO1xufVxuLyoqXG4gKiBnZW5lcmF0ZSB0cmFuc3Bvc2Ugb2Yga25uIGZyb20gdGhlIHRyYW5zcG9zaXRpb24gaW5mbyB0YWtlbiBmcm9tIHNwYXJzZSBrbm4gaW5mb1xuICogdXNpbmcgdGhpcyBpbmZvcm1hdGlvbiBhdm9pZHMgYmlsbGlvbnMgb2YgYXJyYXkucHVzaCBjYWxscywgaXMgbXVjaCBjbGVhbmVyLCBhbGxvd3MgdHlwZWQgYXJyYXkgdXNlIGFuZCBpcyBmYXN0ZXIuXG4gKiBubyBwb2ludCBvZiBkb2luZyB0aGlzIG9uIGdwdSwgY2FuIGJlIGRvbmUgb24gY3B1IGFzIHdlIGFscmVhZHkgaGF2ZSBhbGwgdGhlIGluZm8gbmVlZGVkLlxuICogQHBhcmFtIGtubkluZGV4ZXNcbiAqIEBwYXJhbSBrbm5EaXN0YW5jZXNcbiAqIEBwYXJhbSBrbm5TcGFyc2VJbmZvXG4gKiBAcGFyYW0ga25uU2l6ZVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUtOTihrbm5JbmRleGVzLCBrbm5EaXN0YW5jZXMsIGtublNwYXJzZUluZm8sIGtublNpemUgPSAxNSkge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IG51bU9mRW50cmllcyA9IGtubkluZGV4ZXMubGVuZ3RoO1xuICAgICAgICBjb25zdCBmdWxsS25uRW50cnlTaXplID0ga25uU2l6ZSAqIG51bU9mRW50cmllcztcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlU2l6ZXMgPSBrbm5TcGFyc2VJbmZvLnJlc3VsdFRyYW5zcG9zZVNpemVzQXJyYXk7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZU9mZnNldHMgPSB0b09mZnNldEZvcm0odHJhbnNwb3NlU2l6ZXMpO1xuICAgICAgICBjb25zdCBvZmZzZXRzQ29weSA9IG5ldyBVaW50MzJBcnJheSh0cmFuc3Bvc2VPZmZzZXRzLmxlbmd0aCk7XG4gICAgICAgIG9mZnNldHNDb3B5LnNldCh0cmFuc3Bvc2VPZmZzZXRzKTsgLy8gd2lsbCBiZSB1c2VkIGZvciBkeW5hbWljIGluZGV4aW5nXG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZUtOTkluZGV4ZXMgPSBuZXcgSW50MzJBcnJheShmdWxsS25uRW50cnlTaXplKS5maWxsKDApO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VLTk5EaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KGZ1bGxLbm5FbnRyeVNpemUpLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtT2ZFbnRyaWVzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwga25uU2l6ZTsgaisrKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleCA9IGtubkluZGV4ZXNbaV1bal07XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJJbmRleE9mZnNldCA9IG9mZnNldHNDb3B5W290aGVySW5kZXhdO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkluZGV4ZXNbb3RoZXJJbmRleE9mZnNldF0gPSBpO1xuICAgICAgICAgICAgICAgIHRyYW5zcG9zZUtOTkRpc3RhbmNlc1tvdGhlckluZGV4T2Zmc2V0XSA9IGtubkRpc3RhbmNlc1tpXVtqXTtcbiAgICAgICAgICAgICAgICBvZmZzZXRzQ29weVtvdGhlckluZGV4XSArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHRyYW5zcG9zZUtOTkluZGV4ZXMsIHRyYW5zcG9zZUtOTkRpc3RhbmNlcywgdHJhbnNwb3NlT2Zmc2V0cyB9O1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuLyoqXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGFuIGluc3RhbmNlIG9mIGFuIEFycmF5IChhcnJheSBvciB0eXBlZCBhcnJheSwgZXhjZXB0IHRob3NlIHRoYXQgY29udGFpbiBiaWdpbnQgdmFsdWVzKS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBPYmplY3QgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBUcnVlIGlmIHRoZSBvYmplY3QgaXMgYW4gYXJyYXkgb3IgYSB0eXBlZCBhcnJheS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQW55QXJyYXkodmFsdWUpIHtcbiAgICBjb25zdCB0YWcgPSB0b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgICByZXR1cm4gdGFnLmVuZHNXaXRoKCdBcnJheV0nKSAmJiAhdGFnLmluY2x1ZGVzKCdCaWcnKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IGJpb0xheW91dCB9IGZyb20gJy4vYmlvLWxheW91dCc7XG5pbXBvcnQgeyBtYXJrb3ZDbHVzdGVyV2ViR1BVIH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML01DTC13ZWJHUFUnO1xuZXhwb3J0IGNvbnN0IGRlZmF1bHRNQ0xPcHRpb25zID0ge1xuICAgIGV4cGFuZEZhY3RvcjogMixcbiAgICBtYXhJdGVyYXRpb25zOiA1LFxuICAgIGluZmxhdGVGYWN0b3I6IDIsXG4gICAgbXVsdEZhY3RvcjogMSxcbn07XG5leHBvcnQgY2xhc3MgTUNMU3BhcnNlUmVkdWNlciB7XG4gICAgY29uc3RydWN0b3Iob3B0cyA9IHt9KSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSB7IC4uLmRlZmF1bHRNQ0xPcHRpb25zLCAuLi5vcHRzIH07XG4gICAgfVxuICAgIGFzeW5jIHRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgICAgIC8vIHRlc3RXb3JrZXJNdWx0aXBseSgpO1xuICAgICAgICAvLyByZXR1cm4gbmV3IEludDMyQXJyYXkoblJvd3MpO1xuICAgICAgICBsZXQgc3BhcnNlT2JqZWN0ID0gdGhpcy50b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KTtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuYWRkTG9vcHMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnM7IGkrKykge1xuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdCA9IHRoaXMuZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5mbGF0ZShzcGFyc2VPYmplY3QpO1xuICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBjbHVzdGVycywgaXMsIGpzIH0gPSB0aGlzLmFzc2lnbkNsdXN0ZXJzKHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICB0aGlzLmNvcnJlY3RDbHVzdGVycyhjbHVzdGVycyk7XG4gICAgICAgIGNvbnN0IGVtYmVkZGluZ3MgPSBhd2FpdCB0aGlzLmxheW91dChjbHVzdGVycywgc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBlbWJlZFg6IGVtYmVkZGluZ3MuZW1iZWRYLCBlbWJlZFk6IGVtYmVkZGluZ3MuZW1iZWRZLCBpcywganMgfTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zZm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICAgICAgY29uc3QgbWNsUmVzID0gYXdhaXQgbWFya292Q2x1c3RlcldlYkdQVShzcGFyc2VNYXRyaXgsIG5Sb3dzLCB0aGlzLl9vcHRpb25zLm1heEl0ZXJhdGlvbnMsIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHRoaXMuY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cyk7XG4gICAgICAgIGNvbnN0IHsgY2x1c3RlcnMsIGlzLCBqcyB9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgdGhpcy5sYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzIH07XG4gICAgfVxuICAgIGNvcnJlY3RDbHVzdGVycyhjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0gPSAwO1xuICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0rKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2FdIC0gY2x1c3RlclNpemVNYXBbYl0pO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIHNvcnRlZEluZGV4ZXMuZm9yRWFjaCgoY2x1c3RlcklkeCwgaSkgPT4gY2x1c3Rlck1hcFtjbHVzdGVySWR4XSA9IGkgKyAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0pIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGN1ckNsdXN0ZXIrKztcbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cykge1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gMSAvIE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8IG1pbk9yZGVyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBtY2xSZXMuS05OU2ltaWxhcml0aWVzW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gICAgfVxuICAgIGFzeW5jIGxheW91dChjbHVzdGVycywgc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIGNsdXN0ZXJzLmZvckVhY2goKGNsdXN0ZXIsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyXSlcbiAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdID0gW107XG4gICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zdCBuQ2x1c3RlcnMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKS5sZW5ndGg7XG4gICAgICAgIC8vIGNvbnN0IHBlclJvdyA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG5DbHVzdGVycykpO1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IHNvcnRlZENsdXN0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApO1xuICAgICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiXS5sZW5ndGggLSBjbHVzdGVyTWFwW2FdLmxlbmd0aCk7XG4gICAgICAgIGxldCBwZXJSb3cgPSA2O1xuICAgICAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJOYW1lIG9mIHNvcnRlZENsdXN0ZXJOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWVdO1xuICAgICAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxKTtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyTnVtID09PSBNYXRoLmNlaWwocGVyUm93IC8gMS41KSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICAgICAgICBwZXJSb3cgPSBNYXRoLmNlaWwocGVyUm93ICogMS41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0gJSBwZXJSb3cpICogbGF5b3V0U2l6ZSAvIHBlclJvdykgKiAxLjU7XG4gICAgICAgICAgICAvLyBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihjbHVzdGVyTnVtIC8gcGVyUm93KSAqIDI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYmVkZGluZ3MuZW1iZWRYLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRYW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFhbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgb2Zmc2V0WDtcbiAgICAgICAgICAgICAgICBlbWJlZFlbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWVtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgKyB5T2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVtYmVkWCwgZW1iZWRZIH07XG4gICAgfVxuICAgIG1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopIHtcbiAgICAgICAgY29uc3QgaUNsdXN0ZXIgPSBjbHVzdGVyc1tpXTtcbiAgICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjbHVzdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBpcyA9IFtdO1xuICAgICAgICBjb25zdCBqcyA9IFtdO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeFtpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChzcGFyc2VNYXRyaXhbaV1bal0gKiBtaW5PcmRlcikgLyBtaW5PcmRlciA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgc3BhcnNlTWF0cml4W2ldW2pdICE9PSBOdW1iZXIoaSkgJiYgTnVtYmVyKGopID4gTnVtYmVyKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzLnB1c2goTnVtYmVyKGkpKTtcbiAgICAgICAgICAgICAgICAgICAganMucHVzaChOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEgJiYgY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSBjbHVzdGVyc1tOdW1iZXIoaildKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgTnVtYmVyKGkpLCBOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaildID0gY2x1c3RlcnNbTnVtYmVyKGkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJzW051bWJlcihqKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcykgfTtcbiAgICB9XG4gICAgLyoqIHNhbWUgYXMgYXNzaWduIGNsdXN0ZXJzIGJ1dCB3b3JraW5nIG9uIHRoZSBsZXZlbCBvZiBDU1IgZm9ybWF0IHJldHVybmVkIGZyb20gd2ViR1BVICovXG4gICAgYXNzaWduQ2x1c3RlcnNDU1IobWNsUmVzLCBuUm93cykge1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IGlzID0gW107XG4gICAgICAgIGNvbnN0IGpzID0gW107XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBjb25zdCBjb3JyZWN0ZWRPZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KG5Sb3dzICsgMSk7XG4gICAgICAgIGxldCBvZmZzZXRDb3VudGVyID0gMDtcbiAgICAgICAgY29ycmVjdGVkT2Zmc2V0c1swXSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8PSBtaW5PcmRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICAgICAgICAgIG9mZnNldENvdW50ZXIrKztcbiAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IGNsdXN0ZXJzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbaV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJzW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3JyZWN0ZWRPZmZzZXRzW2kgKyAxXSA9IG9mZnNldENvdW50ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKSwgY29ycmVjdGVkT2Zmc2V0cyB9O1xuICAgIH1cbiAgICB0b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KSB7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV1bc3BhcnNlTWF0cml4LmlbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9ybWFsaXplKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzdW0gKz0gcm93W2pdO1xuICAgICAgICAgICAgaWYgKHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXVtqXSAvPSBzdW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRPYmplY3QgPSB7fTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXSA/PyAoZXhwYW5kZWRPYmplY3RbaV0gPSB7fSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5Sb3dzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXT8uW2pdKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaik7IC8vcHJ1bmluZyBzdGVwXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldW2pdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGFuZGVkT2JqZWN0W2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBhbmRlZE9iamVjdDtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBwcnVuZShyb3c6IFNwYXJzZU1hdHJpeE9iamVjdFtudW1iZXJdKSB7XG4gICAgLy8gfVxuICAgIGluZmxhdGUoc3BhcnNlT2JqZWN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBNYXRoLnBvdyhzcGFyc2VPYmplY3RbaV1bal0sIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKSB7XG4gICAgICAgIGxldCB2YWwgPSAwO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtpXSA/PyB7fSk7XG4gICAgICAgIGNvbnN0IG90aGVySW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtqXSA/PyB7fSk7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBjdXJyZW50SW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKG90aGVySW5kZXhlcy5pbmNsdWRlcyhrKSlcbiAgICAgICAgICAgICAgICB2YWwgKz0gc3BhcnNlT2JqZWN0W2ldW2tdICogc3BhcnNlT2JqZWN0W2pdW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldGeVkyOTJMV05zZFhOMFpYSXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKdFlYSmpiM1l0WTJ4MWMzUmxjaTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGRFFTeFBRVUZQTEVWQlFVTXNVMEZCVXl4RlFVRkRMRTFCUVUwc1kwRkJZeXhEUVVGRE8wRkJSM1pETEU5QlFVOHNSVUZCUXl4dFFrRkJiVUlzUlVGQlF5eE5RVUZOTEc5RVFVRnZSQ3hEUVVGRE8wRkJRM1pHTEUxQlFVMHNRMEZCUXl4TlFVRk5MR2xDUVVGcFFpeEhRVUZsTzBsQlF6TkRMRmxCUVZrc1JVRkJSU3hEUVVGRE8wbEJRMllzWVVGQllTeEZRVUZGTEVOQlFVTTdTVUZEYUVJc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNWVUZCVlN4RlFVRkZMRU5CUVVNN1EwRkRaQ3hEUVVGRE8wRkJSVVlzVFVGQlRTeFBRVUZQTEdkQ1FVRm5RanRKUVVjelFpeFpRVUZaTEU5QlFUUkNMRVZCUVVVN1VVRkRlRU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4RlFVRkRMRWRCUVVjc2FVSkJRV2xDTEVWQlFVVXNSMEZCUnl4SlFVRkpMRVZCUVVNc1EwRkJRenRKUVVOc1JDeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMRk5CUVZNc1EwRkJReXhaUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZEY0VVc2QwSkJRWGRDTzFGQlEzaENMR2REUVVGblF6dFJRVU5vUXl4SlFVRkpMRmxCUVZrc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUTI1RUxFbEJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRWRCUVVjc1EwRkJReXhGUVVGRk8xbEJRMjVETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFsQlEyNURMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdXVUZETjBJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zWVVGQllTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMmRDUVVOd1JDeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdaMEpCUTJoRUxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1owSkJRek5DTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03WVVGRE9VSTdVMEZEUmp0UlFVTkVMRTFCUVUwc1JVRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUTNCRkxFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRMMElzVFVGQlRTeFZRVUZWTEVkQlFVY3NUVUZCVFN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGRkJRVkVzUlVGQlJTeFpRVUZaTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRjRVVzVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlN4TlFVRk5MRVZCUVVVc1ZVRkJWU3hEUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZETEVOQlFVTTdTVUZEYkVZc1EwRkJRenRKUVVWTkxFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNXVUZCWjBNc1JVRkJSU3hMUVVGaE8xRkJRekZGTEVsQlFVa3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhoUVVGaExFdEJRVXNzUTBGQlF6dFpRVU51UXl4UFFVRlBMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUlRkRExFMUJRVTBzVFVGQlRTeEhRVUZITEUxQlFVMHNiVUpCUVcxQ0xFTkJRM1JETEZsQlFWa3NSVUZCUlN4TFFVRkxMRVZCUVVVc1NVRkJTU3hEUVVGRExGRkJRVkVzUTBGQlF5eGhRVUZoTEVWQlFVVXNTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhoUVVGaExFTkJRemxGTEVOQlFVTTdVVUZEUml4TlFVRk5MRmxCUVZrc1IwRkJSeXhKUVVGSkxFTkJRVU1zYVVKQlFXbENMRU5CUVVNc1RVRkJUU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlF6TkVMRTFCUVUwc1JVRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUTNCRkxFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRMMElzVFVGQlRTeFZRVUZWTEVkQlFVY3NUVUZCVFN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGRkJRVkVzUlVGQlJTeFpRVUZaTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRjRVVzVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlN4TlFVRk5MRVZCUVVVc1ZVRkJWU3hEUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZETEVOQlFVTTdTVUZEYkVZc1EwRkJRenRKUVVWUExHVkJRV1VzUTBGQlF5eFJRVUZyUWp0UlFVTjRReXhOUVVGTkxHTkJRV01zUjBGQk1FSXNSVUZCUlN4RFFVRkRPMUZCUTJwRUxFdEJRVXNzVFVGQlRTeFBRVUZQTEVsQlFVa3NVVUZCVVN4RlFVRkZPMWxCUXpsQ0xFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTXNUMEZCVHl4RFFVRkRPMmRDUVVNeFFpeGpRVUZqTEVOQlFVTXNUMEZCVHl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xbEJRemxDTEdOQlFXTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1JVRkJSU3hEUVVGRE8xTkJRek5DTzFGQlEwUXNUVUZCVFN4aFFVRmhMRWRCUVVjc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zWTBGQll5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzQklMRTFCUVUwc1ZVRkJWU3hIUVVFd1FpeEZRVUZGTEVOQlFVTTdVVUZETjBNc1lVRkJZU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEZWQlFWVXNSVUZCUlN4RFFVRkRMRVZCUVVVc1JVRkJSU3hEUVVGRExGVkJRVlVzUTBGQlF5eFZRVUZWTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGVrVXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRk8xbEJRM1JETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRlRU1zYzBKQlFYTkNPMUZCUTNSQ0xEaERRVUU0UXp0UlFVTTVReXh2UTBGQmIwTTdVVUZEY0VNc05FTkJRVFJETzFGQlF6VkRMR2REUVVGblF6dFJRVU5vUXl4dlFrRkJiMEk3VVVGRGNFSXNZVUZCWVR0UlFVTmlMRFpEUVVFMlF6dFJRVU0zUXl4TlFVRk5PMUZCUTA0c1NVRkJTVHRKUVVOT0xFTkJRVU03U1VGRlR5eHBRa0ZCYVVJc1EwRkJReXhOUVVGMVFpeEZRVUZGTEV0QlFXRTdVVUZET1VRc1RVRkJUU3hMUVVGTExFZEJRVWNzU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUTBGQlF5eExRVUZMTEVOQlFVTXNTMEZCU3l4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZETjBRc1RVRkJUU3hSUVVGUkxFZEJRVWNzUTBGQlF5eEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzcERMRTFCUVUwc1dVRkJXU3hIUVVGMVFpeEZRVUZGTEVOQlFVTTdVVUZETlVNc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdFpRVU01UWl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzFsQlEzSkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdaMEpCUTNoRkxFMUJRVTBzUTBGQlF5eEhRVUZITEUxQlFVMHNRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03WjBKQlF5OUNMRWxCUVVrc1EwRkJReXhKUVVGSkxFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNaVUZCWlN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkU3YjBKQlEyaEVMRk5CUVZNN1owSkJRMWdzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFMUJRVTBzUTBGQlF5eGxRVUZsTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1lVRkRhRVE3VTBGRFJqdFJRVU5FTEU5QlFVOHNXVUZCV1N4RFFVRkRPMGxCUTNSQ0xFTkJRVU03U1VGRlR5eExRVUZMTEVOQlFVTXNUVUZCVFN4RFFVRkRMRkZCUVd0Q0xFVkJRVVVzV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUTNSR0xFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTXZReXhOUVVGTkxFMUJRVTBzUjBGQlJ5eEpRVUZKTEZsQlFWa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZETDBNc1RVRkJUU3hWUVVGVkxFZEJRVFJDTEVWQlFVVXNRMEZCUXp0UlFVTXZReXhSUVVGUkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNUMEZCVHl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxDTEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1QwRkJUeXhEUVVGRE8yZENRVU4wUWl4VlFVRlZMRU5CUVVNc1QwRkJUeXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzFsQlF6TkNMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRPVUlzUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEU0N4dlJFRkJiMFE3VVVGRGNFUXNiVVJCUVcxRU8xRkJRMjVFTEVsQlFVa3NWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOdVFpeE5RVUZOTEd0Q1FVRnJRaXhIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNWVUZCVlN4RFFVRkRMRU5CUVVNN1VVRkRia1FzYTBKQlFXdENMRU5CUVVNc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1ZVRkJWU3hEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETEUxQlFVMHNSMEZCUnl4VlFVRlZMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTTdVVUZETjBZc1NVRkJTU3hOUVVGTkxFZEJRVWNzUTBGQlF5eERRVUZETzFGQlJXWXNTVUZCU1N4UFFVRlBMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRMmhDTEUxQlFVMHNWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOeVFpeExRVUZMTEUxQlFVMHNWMEZCVnl4SlFVRkpMR3RDUVVGclFpeEZRVUZGTzFsQlF6VkRMRTFCUVUwc1QwRkJUeXhIUVVGSExGVkJRVlVzUTBGQlF5eFhRVUZyUWl4RFFVRkZMRU5CUVVNN1dVRkRhRVFzVFVGQlRTeFZRVUZWTEVkQlFVY3NUVUZCVFN4VFFVRlRMRU5CUVVNc1QwRkJUeXhGUVVGRkxGbEJRVmtzUlVGQlJTeExRVUZMTEVOQlFVTXNRMEZCUXp0WlFVTnFSU3hKUVVGSkxGVkJRVlVzUzBGQlN5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRTFCUVUwc1IwRkJSeXhIUVVGSExFTkJRVU1zUlVGQlJUdG5Ra0ZETVVNc1ZVRkJWU3hIUVVGSExFTkJRVU1zUTBGQlF6dG5Ra0ZEWml4UFFVRlBMRWxCUVVrc1ZVRkJWU3hIUVVGSExFMUJRVTBzUTBGQlF6dG5Ra0ZETDBJc1RVRkJUU3hIUVVGSExFbEJRVWtzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4SFFVRkhMRWRCUVVjc1EwRkJReXhEUVVGRE8yRkJRMnhETzFsQlEwUXNUVUZCVFN4UFFVRlBMRWRCUVVjc1EwRkJReXhEUVVGRExGVkJRVlVzUjBGQlJ5eE5RVUZOTEVOQlFVTXNSMEZCUnl4VlFVRlZMRWRCUVVjc1RVRkJUU3hEUVVGRExFZEJRVWNzUjBGQlJ5eERRVUZETzFsQlEzQkZMSFZFUVVGMVJEdFpRVVYyUkN4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRMRTFCUVUwc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdaMEpCUTJwRUxFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1IwRkJSeXhOUVVGTkxFZEJRVWNzVDBGQlR5eERRVUZETzJkQ1FVTXhSU3hOUVVGTkxFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRWRCUVVjc1RVRkJUU3hIUVVGSExFOUJRVThzUTBGQlF6dGhRVU16UlR0WlFVTkVMRlZCUVZVc1JVRkJSU3hEUVVGRE8xTkJRMlE3VVVGRFJDeFBRVUZQTEVWQlFVTXNUVUZCVFN4RlFVRkZMRTFCUVUwc1JVRkJReXhEUVVGRE8wbEJRekZDTEVOQlFVTTdTVUZGVHl4aFFVRmhMRU5CUVVNc1VVRkJhMElzUlVGQlJTeERRVUZUTEVWQlFVVXNRMEZCVXp0UlFVTTFSQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkROMElzVFVGQlRTeFJRVUZSTEVkQlFVY3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRemRDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRM2hETEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExGRkJRVkU3WjBKQlF6RkNMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTTdVMEZETVVJN1NVRkRTQ3hEUVVGRE8wbEJRMDBzWTBGQll5eERRVUZETEZsQlFXZERMRVZCUVVVc1MwRkJZVHRSUVVOdVJTeEpRVUZKTEZWQlFWVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRia0lzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMUZCUTNoQ0xFMUJRVTBzUlVGQlJTeEhRVUZoTEVWQlFVVXNRMEZCUXp0UlFVTjRRaXhOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTNSQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1JVRkJSU3hMUVVGTExFTkJRVU1zUTBGQlF6dFJRVU55UXl4TlFVRk5MRkZCUVZFc1IwRkJZU3hKUVVGSkxFdEJRVXNzUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU55UkN4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVN1dVRkRla01zUzBGQlN5eE5RVUZOTEVOQlFVTXNTVUZCU1N4TlFVRk5MRU5CUVVNc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RlFVRkZPMmRDUVVOdVJDeEpRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVkVzUTBGQlF5eERRVUZETEVOQlFWRXNRMEZCUXl4SFFVRkhMRkZCUVZFc1EwRkJReXhIUVVGSExGRkJRVkVzUjBGQlJ5eERRVUZETzI5Q1FVTjRSU3haUVVGWkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNRMEZCVVN4RFFVRkRMRXRCUVVzc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVTdiMEpCUTNwRkxFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03YjBKQlEyNUNMRVZCUVVVc1EwRkJReXhKUVVGSkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2IwSkJRMjVDTEVsQlFVa3NVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4SlFVRkpMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHQzUWtGRE5VUXNTVUZCU1N4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6czBRa0ZETjBNc1NVRkJTU3hEUVVGRExHRkJRV0VzUTBGQlF5eFJRVUZSTEVWQlFVVXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPM0ZDUVVOMFJEdDVRa0ZCVFN4SlFVRkpMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHQzUWtGRGNrTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHhRa0ZETTBNN2VVSkJRVTBzU1VGQlNTeFJRVUZSTEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVWQlFVVTdkMEpCUTNKRExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2NVSkJRek5ETzNsQ1FVRk5PM2RDUVVOTUxGVkJRVlVzUlVGQlJTeERRVUZETzNkQ1FVTmlMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNN2QwSkJRMnBETEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdjVUpCUTJ4RE8ybENRVU5HTzJGQlEwWTdVMEZEUmp0UlFVTkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVU1zUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4UlFVRlJMRU5CUVVNc1RVRkJUU3hGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFsQlEzUkRMRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPMmRDUVVOMFFpeFZRVUZWTEVWQlFVY3NRMEZCUXp0blFrRkRaQ3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NWVUZCVlN4RFFVRkRPMkZCUXpGQ08xTkJRMFk3VVVGRFJDeFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZMRVZCUVVVc1NVRkJTU3hYUVVGWExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVTXNRMEZCUXp0SlFVTjBSU3hEUVVGRE8wbEJSVVFzTUVaQlFUQkdPMGxCUTJ4R0xHbENRVUZwUWl4RFFVRkRMRTFCUVhWQ0xFVkJRVVVzUzBGQllUdFJRVU01UkN4SlFVRkpMRlZCUVZVc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRGJrSXNUVUZCVFN4RlFVRkZMRWRCUVdFc1JVRkJSU3hEUVVGRE8xRkJRM2hDTEUxQlFVMHNSVUZCUlN4SFFVRmhMRVZCUVVVc1EwRkJRenRSUVVONFFpeE5RVUZOTEV0QlFVc3NSMEZCUnl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVNM1JDeE5RVUZOTEZGQlFWRXNSMEZCUnl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRla01zVFVGQlRTeFJRVUZSTEVkQlFXRXNTVUZCU1N4TFFVRkxMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRja1FzVFVGQlRTeG5Ra0ZCWjBJc1IwRkJSeXhKUVVGSkxGZEJRVmNzUTBGQlF5eExRVUZMTEVkQlFVY3NRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRjRVFzU1VGQlNTeGhRVUZoTEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUTNSQ0xHZENRVUZuUWl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU40UWl4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NTMEZCU3l4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxDTEV0QlFVc3NTVUZCU1N4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1RVRkJUU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3WjBKQlEzaEZMRTFCUVUwc1EwRkJReXhIUVVGSExFMUJRVTBzUTBGQlF5eFZRVUZWTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJReTlDTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTXNRMEZCUXl4SlFVRkpMRkZCUVZFN2IwSkJRMnBFTEZOQlFWTTdaMEpCUTFnc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRXQ3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOWUxHRkJRV0VzUlVGQlJTeERRVUZETzJkQ1FVTm9RaXhKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN2IwSkJRelZETEVsQlFVa3NVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhMUVVGTExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdkMEpCUXpkQ0xFbEJRVWtzUTBGQlF5eGhRVUZoTEVOQlFVTXNVVUZCVVN4RlFVRkZMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dHBRa0ZEZEVNN2NVSkJRVTBzU1VGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3YjBKQlF6ZENMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2FVSkJRek5DTzNGQ1FVRk5MRWxCUVVrc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eExRVUZMTEVOQlFVTXNRMEZCUXl4RlFVRkZPMjlDUVVNM1FpeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJsQ1FVTXpRanR4UWtGQlRUdHZRa0ZEVEN4VlFVRlZMRVZCUVVVc1EwRkJRenR2UWtGRFlpeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRE8yOUNRVU42UWl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVlVGQlZTeERRVUZETzJsQ1FVTXhRanRoUVVOR08xbEJRMFFzWjBKQlFXZENMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF5eEhRVUZITEdGQlFXRXNRMEZCUXp0VFFVTjZRenRSUVVORUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zVFVGQlRTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMWxCUTNSRExFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRk8yZENRVU4wUWl4VlFVRlZMRVZCUVVjc1EwRkJRenRuUWtGRFpDeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hEUVVGRE8yRkJRekZDTzFOQlEwWTdVVUZEUkN4UFFVRlBMRVZCUVVNc1VVRkJVU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEpRVUZKTEZkQlFWY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRkxFVkJRVVVzU1VGQlNTeFhRVUZYTEVOQlFVTXNSVUZCUlN4RFFVRkRMRVZCUVVVc1owSkJRV2RDTEVWQlFVTXNRMEZCUXp0SlFVTjRSaXhEUVVGRE8wbEJSVTBzV1VGQldTeERRVUZETEZsQlFXZERPMUZCUTJ4RUxFMUJRVTBzV1VGQldTeEhRVUY1UXl4RlFVRkZMRU5CUVVNN1VVRkRPVVFzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xbEJRemxETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRiRU1zV1VGQldTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZEZGtNc1dVRkJXU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExGbEJRVmtzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRiRVlzU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTnNReXhaUVVGWkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dFpRVU4yUXl4WlFVRlpMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1dVRkJXU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0VFFVTnVSanRSUVVORUxFOUJRVThzV1VGQldTeERRVUZETzBsQlEzUkNMRU5CUVVNN1NVRkZUeXhSUVVGUkxFTkJRVU1zV1VGQlowTXNSVUZCUlN4TFFVRmhPMUZCUXpsRUxFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhMUVVGTExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdXVUZET1VJc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTJ4Q0xGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRU5CUVVNN1dVRkRka0lzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eFJRVUZSTEVOQlFVTXNWVUZCVlN4RFFVRkRPMU5CUXk5RE8wbEJRMGdzUTBGQlF6dEpRVVZQTEZOQlFWTXNRMEZCUXl4WlFVRm5RenRSUVVOb1JDeExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVWQlFVVTdXVUZEZWtNc1RVRkJUU3hIUVVGSExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRPMWxCUTI1RExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXp0WlFVTmFMRXRCUVVzc1RVRkJUU3hEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNN1owSkJRemxDTEVkQlFVY3NTVUZCU1N4SFFVRkhMRU5CUVVNc1EwRkJVU3hEUVVGRExFTkJRVU03V1VGRGRrSXNTVUZCU1N4SFFVRkhMRXRCUVVzc1EwRkJRenRuUWtGQlJTeFRRVUZUTzFsQlEzaENMRXRCUVVzc1RVRkJUU3hEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNN1owSkJRemxDTEZsQlFWa3NRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJReXhEUVVGUkxFTkJRVU1zU1VGQlNTeEhRVUZITEVOQlFVTTdVMEZETTBNN1NVRkRTQ3hEUVVGRE8wbEJSVThzVFVGQlRTeERRVUZETEZsQlFXZERMRVZCUVVVc1MwRkJZVHRSUVVNMVJDeE5RVUZOTEdOQlFXTXNSMEZCZFVJc1JVRkJSU3hEUVVGRE8xRkJRemxETEUxQlFVMHNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRemRFTEUxQlFVMHNVVUZCVVN4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUTNKRExFdEJRVXNzU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhMUVVGTExFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdXVUZET1VJc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTJ4Q0xGTkJRVk03V1VGRFdDd3JRa0ZCSzBJN1dVRkRMMElzWTBGQll5eERRVUZETEVOQlFVTXNUVUZCYUVJc1kwRkJZeXhEUVVGRExFTkJRVU1zU1VGQlRTeEZRVUZGTEVWQlFVTTdXVUZEZWtJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRXRCUVVzc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdG5Ra0ZET1VJc1NVRkJTU3hEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRGRrSXNVMEZCVXp0blFrRkRXQ3hOUVVGTkxFZEJRVWNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNZMEZCWXl4RFFVRkRMRmxCUVZrc1JVRkJSU3hEUVVGRExFVkJRVVVzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4alFVRmpPMmRDUVVOdVJTeEpRVUZKTEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1IwRkJSeXhIUVVGSExGRkJRVkVzUTBGQlF5eEhRVUZITEZGQlFWRXNSMEZCUnl4RFFVRkRMRVZCUVVVN2IwSkJRemRETEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdiMEpCUXpOQ0xFbEJRVWtzUTBGQlF5eGpRVUZqTEVOQlFVTXNRMEZCUXl4RFFVRkRPM2RDUVVOd1FpeGpRVUZqTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1JVRkJSU3hEUVVGRE8yOUNRVU42UWl4alFVRmpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NSMEZCUnl4RFFVRkRPMmxDUVVNMVFqdGhRVU5HTzFOQlEwWTdVVUZEUkN4UFFVRlBMR05CUVdNc1EwRkJRenRKUVVONFFpeERRVUZETzBsQlJVUXNiVVJCUVcxRU8wbEJSVzVFTEVsQlFVazdTVUZGU1N4UFFVRlBMRU5CUVVNc1dVRkJaME03VVVGRE9VTXNTMEZCU3l4TlFVRk5MRU5CUVVNc1NVRkJTU3hOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4RlFVRkZPMWxCUTNwRExFMUJRVTBzUjBGQlJ5eEhRVUZITEZsQlFWa3NRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJRenRaUVVOdVF5eExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETzJkQ1FVTTVRaXhaUVVGWkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNRMEZCVVN4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNc1EwRkJVU3hEUVVGRExFVkJRVVVzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRU5CUVVNc1EwRkJRenRUUVVNNVJ6dEpRVU5JTEVOQlFVTTdTVUZGVHl4alFVRmpMRU5CUVVNc1dVRkJaME1zUlVGQlJTeERRVUZOTEVWQlFVVXNRMEZCVFR0UlFVTnlSU3hKUVVGSkxFZEJRVWNzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZEV2l4TlFVRk5MR05CUVdNc1IwRkJSeXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU14UkN4TlFVRk5MRmxCUVZrc1IwRkJSeXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hGUVVGRkxFTkJRVU1zUTBGQlF6dFJRVU40UkN4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxHTkJRV01zUlVGQlJUdFpRVU01UWl4SlFVRkpMRmxCUVZrc1EwRkJReXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETzJkQ1FVTXhRaXhIUVVGSExFbEJRVWtzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhIUVVGSExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJRenRUUVVOb1JUdFJRVU5FTEU5QlFVOHNSMEZCUnl4RFFVRkRPMGxCUTJJc1EwRkJRenREUVVOR0lpd2ljMjkxY21ObGMwTnZiblJsYm5RaU9sc2lhVzF3YjNKMElIdFRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUjlJR1p5YjIwZ0p5NHVMMlJwYzNSaGJtTmxMVzFoZEhKcGVDOXpjR0Z5YzJVdGJXRjBjbWw0TFhObGNuWnBZMlVuTzF4dWFXMXdiM0owSUh0aWFXOU1ZWGx2ZFhSOUlHWnliMjBnSnk0dlltbHZMV3hoZVc5MWRDYzdYRzVwYlhCdmNuUWdlMDFEVEU5d2RHbHZibk1zSUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEgwZ1puSnZiU0FuTGk5MGVYQmxjeWM3WEc1cGJYQnZjblFnZTAxRFRFOXdVbVYwZFhKdVZIbHdaWDBnWm5KdmJTQW5RR1JoZEdGbmNtOXJMV3hwWW5KaGNtbGxjeTl0WVhSb0wzTnlZeTkzWldKSFVGVXZUVU5NTDNSNWNHVnpKenRjYm1sdGNHOXlkQ0I3YldGeWEyOTJRMngxYzNSbGNsZGxZa2RRVlgwZ1puSnZiU0FuUUdSaGRHRm5jbTlyTFd4cFluSmhjbWxsY3k5dFlYUm9MM055WXk5M1pXSkhVRlV2VFVOTUwwMURUQzEzWldKSFVGVW5PMXh1Wlhod2IzSjBJR052Ym5OMElHUmxabUYxYkhSTlEweFBjSFJwYjI1ek9pQk5RMHhQY0hScGIyNXpJRDBnZTF4dUlDQmxlSEJoYm1SR1lXTjBiM0k2SURJc1hHNGdJRzFoZUVsMFpYSmhkR2x2Ym5NNklEVXNYRzRnSUdsdVpteGhkR1ZHWVdOMGIzSTZJRElzWEc0Z0lHMTFiSFJHWVdOMGIzSTZJREVzWEc1OU8xeHVYRzVsZUhCdmNuUWdZMnhoYzNNZ1RVTk1VM0JoY25ObFVtVmtkV05sY2lCN1hHNGdJSEJ5YVhaaGRHVWdYMjl3ZEdsdmJuTTZJRTFEVEU5d2RHbHZibk03WEc1Y2JpQWdZMjl1YzNSeWRXTjBiM0lvYjNCMGN6b2dVR0Z5ZEdsaGJEeE5RMHhQY0hScGIyNXpQaUE5SUh0OUtTQjdYRzRnSUNBZ2RHaHBjeTVmYjNCMGFXOXVjeUE5SUhzdUxpNWtaV1poZFd4MFRVTk1UM0IwYVc5dWN5d2dMaTR1YjNCMGMzMDdYRzRnSUgxY2JseHVJQ0J3ZFdKc2FXTWdZWE41Ym1NZ2RISmhibk5tYjNKdEtITndZWEp6WlUxaGRISnBlRG9nVTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwTENCdVVtOTNjem9nYm5WdFltVnlLU0I3WEc0Z0lDQWdMeThnZEdWemRGZHZjbXRsY2sxMWJIUnBjR3g1S0NrN1hHNGdJQ0FnTHk4Z2NtVjBkWEp1SUc1bGR5QkpiblF6TWtGeWNtRjVLRzVTYjNkektUdGNiaUFnSUNCc1pYUWdjM0JoY25ObFQySnFaV04wSUQwZ2RHaHBjeTUwYjA5aWFtVmpkRVp2Y20wb2MzQmhjbk5sVFdGMGNtbDRLVHRjYmlBZ0lDQnBaaUFvZEdocGN5NWZiM0IwYVc5dWN5NXRZWGhKZEdWeVlYUnBiMjV6SUQ0Z01Da2dlMXh1SUNBZ0lDQWdkR2hwY3k1aFpHUk1iMjl3Y3loemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNBZ0lIUm9hWE11Ym05eWJXRnNhWHBsS0hOd1lYSnpaVTlpYW1WamRDazdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnBJRDBnTURzZ2FTQThJSFJvYVhNdVgyOXdkR2x2Ym5NdWJXRjRTWFJsY21GMGFXOXVjenNnYVNzcktTQjdYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZENBOUlIUm9hWE11Wlhod1lXNWtLSE53WVhKelpVOWlhbVZqZEN3Z2JsSnZkM01wTzF4dUlDQWdJQ0FnSUNCMGFHbHpMbWx1Wm14aGRHVW9jM0JoY25ObFQySnFaV04wS1R0Y2JpQWdJQ0FnSUNBZ2RHaHBjeTV1YjNKdFlXeHBlbVVvYzNCaGNuTmxUMkpxWldOMEtUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnWTI5dWMzUWdlMk5zZFhOMFpYSnpMQ0JwY3l3Z2FuTjlJRDBnZEdocGN5NWhjM05wWjI1RGJIVnpkR1Z5Y3loemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNCMGFHbHpMbU52Y25KbFkzUkRiSFZ6ZEdWeWN5aGpiSFZ6ZEdWeWN5azdYRzRnSUNBZ1kyOXVjM1FnWlcxaVpXUmthVzVuY3lBOUlHRjNZV2wwSUhSb2FYTXViR0Y1YjNWMEtHTnNkWE4wWlhKekxDQnpjR0Z5YzJWUFltcGxZM1FzSUc1U2IzZHpLVHRjYmlBZ0lDQnlaWFIxY200Z2UyTnNkWE4wWlhKekxDQmxiV0psWkZnNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWUxDQmxiV0psWkZrNklHVnRZbVZrWkdsdVozTXVaVzFpWldSWkxDQnBjeXdnYW5OOU8xeHVJQ0I5WEc1Y2JpQWdjSFZpYkdsaklHRnplVzVqSUhSeVlXNXpabTl5YlZkbFlrZFFWU2h6Y0dGeWMyVk5ZWFJ5YVhnNklGTndZWEp6WlUxaGRISnBlRkpsYzNWc2RDd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdsbUlDaDBhR2x6TGw5dmNIUnBiMjV6TG0xaGVFbDBaWEpoZEdsdmJuTWdQVDA5SURBcFhHNGdJQ0FnSUNCeVpYUjFjbTRnZEdocGN5NTBjbUZ1YzJadmNtMG9jM0JoY25ObFRXRjBjbWw0TENCdVVtOTNjeWs3WEc1Y2JpQWdJQ0JqYjI1emRDQnRZMnhTWlhNZ1BTQmhkMkZwZENCdFlYSnJiM1pEYkhWemRHVnlWMlZpUjFCVktGeHVJQ0FnSUNBZ2MzQmhjbk5sVFdGMGNtbDRMQ0J1VW05M2N5d2dkR2hwY3k1ZmIzQjBhVzl1Y3k1dFlYaEpkR1Z5WVhScGIyNXpMQ0IwYUdsekxsOXZjSFJwYjI1ekxtbHVabXhoZEdWR1lXTjBiM0pjYmlBZ0lDQXBPMXh1SUNBZ0lHTnZibk4wSUhOd1lYSnpaVTlpYW1WamRDQTlJSFJvYVhNdVkzTnlWRzlUY0dGeWMyVlBZbXBsWTNRb2JXTnNVbVZ6TENCdVVtOTNjeWs3WEc0Z0lDQWdZMjl1YzNRZ2UyTnNkWE4wWlhKekxDQnBjeXdnYW5OOUlEMGdkR2hwY3k1aGMzTnBaMjVEYkhWemRHVnljeWh6Y0dGeWMyVlBZbXBsWTNRc0lHNVNiM2R6S1R0Y2JpQWdJQ0IwYUdsekxtTnZjbkpsWTNSRGJIVnpkR1Z5Y3loamJIVnpkR1Z5Y3lrN1hHNGdJQ0FnWTI5dWMzUWdaVzFpWldSa2FXNW5jeUE5SUdGM1lXbDBJSFJvYVhNdWJHRjViM1YwS0dOc2RYTjBaWEp6TENCemNHRnljMlZQWW1wbFkzUXNJRzVTYjNkektUdGNiaUFnSUNCeVpYUjFjbTRnZTJOc2RYTjBaWEp6TENCbGJXSmxaRmc2SUdWdFltVmtaR2x1WjNNdVpXMWlaV1JZTENCbGJXSmxaRms2SUdWdFltVmtaR2x1WjNNdVpXMWlaV1JaTENCcGN5d2dhbk45TzF4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCamIzSnlaV04wUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk02SUc1MWJXSmxjbHRkS1NCN1hHNGdJQ0FnWTI5dWMzUWdZMngxYzNSbGNsTnBlbVZOWVhBNklIdGJYem9nYm5WdFltVnlYVG9nYm5WdFltVnlmU0E5SUh0OU8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ1kyeDFjM1JsY2lCdlppQmpiSFZ6ZEdWeWN5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGamJIVnpkR1Z5VTJsNlpVMWhjRnRqYkhWemRHVnlYU2xjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbE5wZW1WTllYQmJZMngxYzNSbGNsMGdQU0F3TzF4dUlDQWdJQ0FnWTJ4MWMzUmxjbE5wZW1WTllYQmJZMngxYzNSbGNsMHJLenRjYmlBZ0lDQjlYRzRnSUNBZ1kyOXVjM1FnYzI5eWRHVmtTVzVrWlhobGN5QTlJRTlpYW1WamRDNXJaWGx6S0dOc2RYTjBaWEpUYVhwbFRXRndLUzV0WVhBb1RuVnRZbVZ5S1M1emIzSjBLQ2hoTENCaUtTQTlQaUJqYkhWemRHVnlVMmw2WlUxaGNGdGhYU0F0SUdOc2RYTjBaWEpUYVhwbFRXRndXMkpkS1R0Y2JpQWdJQ0JqYjI1emRDQmpiSFZ6ZEdWeVRXRndPaUI3VzE4NklHNTFiV0psY2wwNklHNTFiV0psY24wZ1BTQjdmVHRjYmlBZ0lDQnpiM0owWldSSmJtUmxlR1Z6TG1admNrVmhZMmdvS0dOc2RYTjBaWEpKWkhnc0lHa3BJRDArSUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY2tsa2VGMGdQU0JwSUNzZ01TazdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQmpiSFZ6ZEdWeWN5NXNaVzVuZEdnN0lHa3JLeWxjYmlBZ0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeWMxdHBYVjA3WEc0Z0lDQWdMeThnYkdWMElHTjFja05zZFhOMFpYSWdQU0F4TzF4dUlDQWdJQzh2SUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1kyeDFjM1JsY25NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQXZMeUFnSUdsbUlDZ2hZMngxYzNSbGNrMWhjRnRqYkhWemRHVnljMXRwWFYwcElIdGNiaUFnSUNBdkx5QWdJQ0FnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5YzF0cFhWMGdQU0JqZFhKRGJIVnpkR1Z5TzF4dUlDQWdJQzh2SUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOMWNrTnNkWE4wWlhJN1hHNGdJQ0FnTHk4Z0lDQWdJR04xY2tOc2RYTjBaWElyS3p0Y2JpQWdJQ0F2THlBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnTHk4Z0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY2sxaGNGdGpiSFZ6ZEdWeWMxdHBYVjA3WEc0Z0lDQWdMeThnSUNCOVhHNGdJQ0FnTHk4Z2ZWeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmpjM0pVYjFOd1lYSnpaVTlpYW1WamRDaHRZMnhTWlhNNklFMURURTl3VW1WMGRYSnVWSGx3WlN3Z2JsSnZkM002SUc1MWJXSmxjaWtnZTF4dUlDQWdJR052Ym5OMElHOXlaR1Z5SUQwZ1RXRjBhQzVtYkc5dmNpaE5ZWFJvTG0xaGVDaE5ZWFJvTG14dlp6RXdLRzVTYjNkektTd2dNaWtwSUNzZ01UdGNiaUFnSUNCamIyNXpkQ0J0YVc1UGNtUmxjaUE5SURFZ0x5Qk5ZWFJvTG5CdmR5Z3hNQ3dnYjNKa1pYSXBPMXh1SUNBZ0lHTnZibk4wSUhOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBJRDBnZTMwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCdVVtOTNjenNnYVNzcktTQjdYRzRnSUNBZ0lDQnpjR0Z5YzJWUFltcGxZM1JiYVYwZ1BTQjdmVHRjYmlBZ0lDQWdJR1p2Y2lBb2JHVjBJR3NnUFNCdFkyeFNaWE11YVc1a1pYaFBabVp6WlhSelcybGRPeUJySUR3Z2JXTnNVbVZ6TG1sdVpHVjRUMlptYzJWMGMxdHBJQ3NnTVYwN0lHc3JLeWtnZTF4dUlDQWdJQ0FnSUNCamIyNXpkQ0JxSUQwZ2JXTnNVbVZ6TGt0T1RrbHVaR1Y0WlhOYmExMDdYRzRnSUNBZ0lDQWdJR2xtSUNocUlEdzlJR2tnZkh3Z2JXTnNVbVZ6TGt0T1RsTnBiV2xzWVhKcGRHbGxjMXRyWFNBOElHMXBiazl5WkdWeUtWeHVJQ0FnSUNBZ0lDQWdJR052Ym5ScGJuVmxPMXh1SUNBZ0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmFWMWJhbDBnUFNCdFkyeFNaWE11UzA1T1UybHRhV3hoY21sMGFXVnpXMnRkTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2MzQmhjbk5sVDJKcVpXTjBPMXh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JoYzNsdVl5QnNZWGx2ZFhRb1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZExDQnpjR0Z5YzJWTllYUnlhWGc2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2JsSnZkM002SUc1MWJXSmxjaWtnZTF4dUlDQWdJR052Ym5OMElHVnRZbVZrV0NBOUlHNWxkeUJHYkc5aGRETXlRWEp5WVhrb2JsSnZkM01wTG1acGJHd29NQ2s3WEc0Z0lDQWdZMjl1YzNRZ1pXMWlaV1JaSUQwZ2JtVjNJRVpzYjJGME16SkJjbkpoZVNodVVtOTNjeWt1Wm1sc2JDZ3dLVHRjYmlBZ0lDQmpiMjV6ZENCamJIVnpkR1Z5VFdGd09pQjdXMTg2SUc1MWJXSmxjbDA2SUc1MWJXSmxjbHRkZlNBOUlIdDlPMXh1SUNBZ0lHTnNkWE4wWlhKekxtWnZja1ZoWTJnb0tHTnNkWE4wWlhJc0lHa3BJRDArSUh0Y2JpQWdJQ0FnSUdsbUlDZ2hZMngxYzNSbGNrMWhjRnRqYkhWemRHVnlYU2xjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5WFNBOUlGdGRPMXh1SUNBZ0lDQWdZMngxYzNSbGNrMWhjRnRqYkhWemRHVnlYUzV3ZFhOb0tHa3BPMXh1SUNBZ0lIMHBPMXh1SUNBZ0lDOHZJR052Ym5OMElHNURiSFZ6ZEdWeWN5QTlJRTlpYW1WamRDNXJaWGx6S0dOc2RYTjBaWEpOWVhBcExteGxibWQwYUR0Y2JpQWdJQ0F2THlCamIyNXpkQ0J3WlhKU2IzY2dQU0JOWVhSb0xtWnNiMjl5S0UxaGRHZ3VjM0Z5ZENodVEyeDFjM1JsY25NcEtUdGNiaUFnSUNCc1pYUWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnWTI5dWMzUWdjMjl5ZEdWa1EyeDFjM1JsY2s1aGJXVnpJRDBnVDJKcVpXTjBMbXRsZVhNb1kyeDFjM1JsY2sxaGNDazdYRzRnSUNBZ2MyOXlkR1ZrUTJ4MWMzUmxjazVoYldWekxuTnZjblFvS0dFc0lHSXBJRDArSUdOc2RYTjBaWEpOWVhCYllpQmhjeUJoYm5sZExteGxibWQwYUNBdElHTnNkWE4wWlhKTllYQmJZU0JoY3lCaGJubGRMbXhsYm1kMGFDazdYRzRnSUNBZ2JHVjBJSEJsY2xKdmR5QTlJRFk3WEc1Y2JpQWdJQ0JzWlhRZ2VVOW1abk5sZENBOUlEQTdYRzRnSUNBZ1kyOXVjM1FnYkdGNWIzVjBVMmw2WlNBOUlEVTdYRzRnSUNBZ1ptOXlJQ2hqYjI1emRDQmpiSFZ6ZEdWeVRtRnRaU0J2WmlCemIzSjBaV1JEYkhWemRHVnlUbUZ0WlhNcElIdGNiaUFnSUNBZ0lHTnZibk4wSUdOc2RYTjBaWElnUFNCamJIVnpkR1Z5VFdGd1cyTnNkWE4wWlhKT1lXMWxJR0Z6SUdGdWVWMGhPMXh1SUNBZ0lDQWdZMjl1YzNRZ1pXMWlaV1JrYVc1bmN5QTlJR0YzWVdsMElHSnBiMHhoZVc5MWRDaGpiSFZ6ZEdWeUxDQnpjR0Z5YzJWTllYUnlhWGdzSURBdU1EQXhLVHRjYmlBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5VG5WdElEMDlQU0JOWVhSb0xtTmxhV3dvY0dWeVVtOTNJQzhnTVM0MUtTa2dlMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0SUQwZ01EdGNiaUFnSUNBZ0lDQWdlVTltWm5ObGRDQXJQU0JzWVhsdmRYUlRhWHBsSUM4Z2NHVnlVbTkzTzF4dUlDQWdJQ0FnSUNCd1pYSlNiM2NnUFNCTllYUm9MbU5sYVd3b2NHVnlVbTkzSUNvZ01TNDFLVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR052Ym5OMElHOW1abk5sZEZnZ1BTQW9LR05zZFhOMFpYSk9kVzBnSlNCd1pYSlNiM2NwSUNvZ2JHRjViM1YwVTJsNlpTQXZJSEJsY2xKdmR5a2dLaUF4TGpVN1hHNGdJQ0FnSUNBdkx5QmpiMjV6ZENCdlptWnpaWFJaSUQwZ1RXRjBhQzVtYkc5dmNpaGpiSFZ6ZEdWeVRuVnRJQzhnY0dWeVVtOTNLU0FxSURJN1hHNWNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHa2dQU0F3T3lCcElEd2daVzFpWldSa2FXNW5jeTVsYldKbFpGZ3ViR1Z1WjNSb095QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ1pXMWlaV1JZVzJOc2RYTjBaWEpiYVYxZElEMGdaVzFpWldSa2FXNW5jeTVsYldKbFpGaGJhVjBnS2lCc1lYbHZkWFJUYVhwbElDOGdjR1Z5VW05M0lDc2diMlptYzJWMFdEdGNiaUFnSUNBZ0lDQWdaVzFpWldSWlcyTnNkWE4wWlhKYmFWMWRJRDBnWlcxaVpXUmthVzVuY3k1bGJXSmxaRmxiYVYwZ0tpQnNZWGx2ZFhSVGFYcGxJQzhnY0dWeVVtOTNJQ3NnZVU5bVpuTmxkRHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQWdJR05zZFhOMFpYSk9kVzByS3p0Y2JpQWdJQ0I5WEc0Z0lDQWdjbVYwZFhKdUlIdGxiV0psWkZnc0lHVnRZbVZrV1gwN1hHNGdJSDFjYmx4dUlDQndjbWwyWVhSbElHMWxjbWRsUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk02SUc1MWJXSmxjbHRkTENCcE9pQnVkVzFpWlhJc0lHbzZJRzUxYldKbGNpa2dlMXh1SUNBZ0lHTnZibk4wSUdsRGJIVnpkR1Z5SUQwZ1kyeDFjM1JsY25OYmFWMDdYRzRnSUNBZ1kyOXVjM1FnYWtOc2RYTjBaWElnUFNCamJIVnpkR1Z5YzF0cVhUdGNiaUFnSUNCbWIzSWdLR3hsZENCcklEMGdNRHNnYXlBOElHTnNkWE4wWlhKekxteGxibWQwYURzZ2F5c3JLU0I3WEc0Z0lDQWdJQ0JwWmlBb1kyeDFjM1JsY25OYmExMGdQVDA5SUdwRGJIVnpkR1Z5S1Z4dUlDQWdJQ0FnSUNCamJIVnpkR1Z5YzF0clhTQTlJR2xEYkhWemRHVnlPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQndkV0pzYVdNZ1lYTnphV2R1UTJ4MWMzUmxjbk1vYzNCaGNuTmxUV0YwY21sNE9pQlRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUXNJRzVTYjNkek9pQnVkVzFpWlhJcElIdGNiaUFnSUNCc1pYUWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnWTI5dWMzUWdhWE02SUc1MWJXSmxjbHRkSUQwZ1cxMDdYRzRnSUNBZ1kyOXVjM1FnYW5NNklHNTFiV0psY2x0ZElEMGdXMTA3WEc0Z0lDQWdZMjl1YzNRZ2IzSmtaWElnUFNCTllYUm9MbVpzYjI5eUtFMWhkR2d1YldGNEtFMWhkR2d1Ykc5bk1UQW9ibEp2ZDNNcExDQXlLU2tnS3lBeE8xeHVJQ0FnSUdOdmJuTjBJRzFwYms5eVpHVnlJRDBnVFdGMGFDNXdiM2NvTVRBc0lHOXlaR1Z5S1R0Y2JpQWdJQ0JqYjI1emRDQmpiSFZ6ZEdWeWN6b2diblZ0WW1WeVcxMGdQU0J1WlhjZ1FYSnlZWGtvYmxKdmQzTXBMbVpwYkd3b0xURXBPMXh1SUNBZ0lHWnZjaUFvWTI5dWMzUWdhU0J2WmlCUFltcGxZM1F1YTJWNWN5aHpjR0Z5YzJWTllYUnlhWGdwS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElHb2diMllnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVFdGMGNtbDRXMmtnWVhNZ1lXNTVYU2twSUh0Y2JpQWdJQ0FnSUNBZ2FXWWdLRTFoZEdndWNtOTFibVFvYzNCaGNuTmxUV0YwY21sNFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMGdLaUJ0YVc1UGNtUmxjaWtnTHlCdGFXNVBjbVJsY2lBK0lEQWdKaVpjYmlBZ0lDQWdJQ0FnSUNCemNHRnljMlZOWVhSeWFYaGJhU0JoY3lCaGJubGRXMm9nWVhNZ1lXNTVYU0FoUFQwZ1RuVnRZbVZ5S0drcElDWW1JRTUxYldKbGNpaHFLU0ErSUU1MWJXSmxjaWhwS1NrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2x6TG5CMWMyZ29UblZ0WW1WeUtHa3BLVHRjYmlBZ0lDQWdJQ0FnSUNCcWN5NXdkWE5vS0U1MWJXSmxjaWhxS1NrN1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0dOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwZ0lUMDlJQzB4SUNZbUlHTnNkWE4wWlhKelcwNTFiV0psY2locUtWMGdJVDA5SUMweEtTQjdYRzRnSUNBZ0lDQWdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJUblZ0WW1WeUtHa3BYU0FoUFQwZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTbGNiaUFnSUNBZ0lDQWdJQ0FnSUNBZ2RHaHBjeTV0WlhKblpVTnNkWE4wWlhKektHTnNkWE4wWlhKekxDQk9kVzFpWlhJb2FTa3NJRTUxYldKbGNpaHFLU2s3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTQTlJR05zZFhOMFpYSnpXMDUxYldKbGNpaHBLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUdsbUlDaGpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FpbGRJQ0U5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYlRuVnRZbVZ5S0drcFhTQTlJR05zZFhOMFpYSnpXMDUxYldKbGNpaHFLVjA3WEc0Z0lDQWdJQ0FnSUNBZ2ZTQmxiSE5sSUh0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSk9kVzByS3p0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMDUxYldKbGNpaHBLVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iVG5WdFltVnlLR29wWFNBOUlHTnNkWE4wWlhKT2RXMDdYRzRnSUNBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnSUNCOVhHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJR1p2Y2lBb2JHVjBJR2s5TURzZ2FTQThJR05zZFhOMFpYSnpMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJhVjBnUFQwOUlDMHhLU0I3WEc0Z0lDQWdJQ0FnSUdOc2RYTjBaWEpPZFcwZ0t5czdYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMmxkSUQwZ1kyeDFjM1JsY2s1MWJUdGNiaUFnSUNBZ0lIMWNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSHRqYkhWemRHVnljeXdnYVhNNklHNWxkeUJWYVc1ME16SkJjbkpoZVNocGN5a3NJR3B6T2lCdVpYY2dWV2x1ZERNeVFYSnlZWGtvYW5NcGZUdGNiaUFnZlZ4dVhHNGdJQzhxS2lCellXMWxJR0Z6SUdGemMybG5iaUJqYkhWemRHVnljeUJpZFhRZ2QyOXlhMmx1WnlCdmJpQjBhR1VnYkdWMlpXd2diMllnUTFOU0lHWnZjbTFoZENCeVpYUjFjbTVsWkNCbWNtOXRJSGRsWWtkUVZTQXFMMXh1SUNCd2NtbDJZWFJsSUdGemMybG5ia05zZFhOMFpYSnpRMU5TS0cxamJGSmxjem9nVFVOTVQzQlNaWFIxY201VWVYQmxMQ0J1VW05M2N6b2diblZ0WW1WeUtTQjdYRzRnSUNBZ2JHVjBJR05zZFhOMFpYSk9kVzBnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR2x6T2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNBZ0lHTnZibk4wSUdwek9pQnVkVzFpWlhKYlhTQTlJRnRkTzF4dUlDQWdJR052Ym5OMElHOXlaR1Z5SUQwZ1RXRjBhQzVtYkc5dmNpaE5ZWFJvTG0xaGVDaE5ZWFJvTG14dlp6RXdLRzVTYjNkektTd2dNaWtwSUNzZ01UdGNiaUFnSUNCamIyNXpkQ0J0YVc1UGNtUmxjaUE5SURFZ0x5Qk5ZWFJvTG5CdmR5Z3hNQ3dnYjNKa1pYSXBPMXh1SUNBZ0lHTnZibk4wSUdOc2RYTjBaWEp6T2lCdWRXMWlaWEpiWFNBOUlHNWxkeUJCY25KaGVTaHVVbTkzY3lrdVptbHNiQ2d0TVNrN1hHNGdJQ0FnWTI5dWMzUWdZMjl5Y21WamRHVmtUMlptYzJWMGN5QTlJRzVsZHlCVmFXNTBNekpCY25KaGVTaHVVbTkzY3lBcklERXBPMXh1SUNBZ0lHeGxkQ0J2Wm1aelpYUkRiM1Z1ZEdWeUlEMGdNRHRjYmlBZ0lDQmpiM0p5WldOMFpXUlBabVp6WlhSeld6QmRJRDBnTUR0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUc1U2IzZHpPeUJwS3lzcElIdGNiaUFnSUNBZ0lHWnZjaUFvYkdWMElHc2dQU0J0WTJ4U1pYTXVhVzVrWlhoUFptWnpaWFJ6VzJsZE95QnJJRHdnYldOc1VtVnpMbWx1WkdWNFQyWm1jMlYwYzF0cElDc2dNVjA3SUdzckt5a2dlMXh1SUNBZ0lDQWdJQ0JqYjI1emRDQnFJRDBnYldOc1VtVnpMa3RPVGtsdVpHVjRaWE5iYTEwN1hHNGdJQ0FnSUNBZ0lHbG1JQ2hxSUR3OUlHa2dmSHdnYldOc1VtVnpMa3RPVGxOcGJXbHNZWEpwZEdsbGMxdHJYU0E4UFNCdGFXNVBjbVJsY2lsY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdhWE11Y0hWemFDaHBLVHRjYmlBZ0lDQWdJQ0FnYW5NdWNIVnphQ2hxS1R0Y2JpQWdJQ0FnSUNBZ2IyWm1jMlYwUTI5MWJuUmxjaXNyTzF4dUlDQWdJQ0FnSUNCcFppQW9ZMngxYzNSbGNuTmJhVjBnSVQwOUlDMHhJQ1ltSUdOc2RYTjBaWEp6VzJwZElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5YzF0cFhTQWhQVDBnWTJ4MWMzUmxjbk5iYWwwcFhHNGdJQ0FnSUNBZ0lDQWdJQ0IwYUdsekxtMWxjbWRsUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk1zSUdrc0lHb3BPMXh1SUNBZ0lDQWdJQ0I5SUdWc2MyVWdhV1lnS0dOc2RYTjBaWEp6VzJsZElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMnBkSUQwZ1kyeDFjM1JsY25OYmFWMDdYRzRnSUNBZ0lDQWdJSDBnWld4elpTQnBaaUFvWTJ4MWMzUmxjbk5iYWwwZ0lUMDlJQzB4S1NCN1hHNGdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNuTmJhVjBnUFNCamJIVnpkR1Z5YzF0cVhUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElIdGNiaUFnSUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0S3lzN1hHNGdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNuTmJhVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMnBkSUQwZ1kyeDFjM1JsY2s1MWJUdGNiaUFnSUNBZ0lDQWdmVnh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdZMjl5Y21WamRHVmtUMlptYzJWMGMxdHBJQ3NnTVYwZ1BTQnZabVp6WlhSRGIzVnVkR1Z5TzF4dUlDQWdJSDFjYmlBZ0lDQm1iM0lnS0d4bGRDQnBQVEE3SUdrZ1BDQmpiSFZ6ZEdWeWN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcybGRJRDA5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0SUNzck8xeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpPZFcwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjdZMngxYzNSbGNuTXNJR2x6T2lCdVpYY2dWV2x1ZERNeVFYSnlZWGtvYVhNcExDQnFjem9nYm1WM0lGVnBiblF6TWtGeWNtRjVLR3B6S1N3Z1kyOXljbVZqZEdWa1QyWm1jMlYwYzMwN1hHNGdJSDFjYmx4dUlDQndkV0pzYVdNZ2RHOVBZbXBsWTNSR2IzSnRLSE53WVhKelpVMWhkSEpwZURvZ1UzQmhjbk5sVFdGMGNtbDRVbVZ6ZFd4MEtUb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBJSHRjYmlBZ0lDQmpiMjV6ZENCemNHRnljMlZQWW1wbFkzUTZJSHRiWHpvZ2JuVnRZbVZ5WFRvZ2UxdGZPaUJ1ZFcxaVpYSmRPaUJ1ZFcxaVpYSjlmU0E5SUh0OU8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2MzQmhjbk5sVFdGMGNtbDRMbWt1YkdWdVozUm9PeUJwS3lzcElIdGNiaUFnSUNBZ0lHbG1JQ2doYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVwVzJsZFhTbGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXBXMmxkWFNBOUlIdDlPMXh1SUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXBXMmxkWFZ0emNHRnljMlZOWVhSeWFYZ3VhbHRwWFYwZ1BTQXhJQzBnYzNCaGNuTmxUV0YwY21sNExtUnBjM1JoYm1ObFcybGRPMXh1SUNBZ0lDQWdhV1lnS0NGemNHRnljMlZQWW1wbFkzUmJjM0JoY25ObFRXRjBjbWw0TG1wYmFWMWRLVnh1SUNBZ0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmMzQmhjbk5sVFdGMGNtbDRMbXBiYVYxZElEMGdlMzA3WEc0Z0lDQWdJQ0J6Y0dGeWMyVlBZbXBsWTNSYmMzQmhjbk5sVFdGMGNtbDRMbXBiYVYxZFczTndZWEp6WlUxaGRISnBlQzVwVzJsZFhTQTlJREVnTFNCemNHRnljMlZOWVhSeWFYZ3VaR2x6ZEdGdVkyVmJhVjA3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCemNHRnljMlZQWW1wbFkzUTdYRzRnSUgxY2JseHVJQ0J3Y21sMllYUmxJR0ZrWkV4dmIzQnpLSE53WVhKelpVOWlhbVZqZERvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMExDQnVVbTkzY3pvZ2JuVnRZbVZ5S1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCdVVtOTNjenNnYVNzcktTQjdYRzRnSUNBZ0lDQnBaaUFvSVhOd1lYSnpaVTlpYW1WamRGdHBYU2xjYmlBZ0lDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFcybGRJRDBnZTMwN1hHNGdJQ0FnSUNCemNHRnljMlZQWW1wbFkzUmJhVjFiYVYwZ1BTQjBhR2x6TGw5dmNIUnBiMjV6TG0xMWJIUkdZV04wYjNJN1hHNGdJQ0FnZlZ4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCdWIzSnRZV3hwZW1Vb2MzQmhjbk5sVDJKcVpXTjBPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FwSUh0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdrZ2IyWWdUMkpxWldOMExtdGxlWE1vYzNCaGNuTmxUMkpxWldOMEtTa2dlMXh1SUNBZ0lDQWdZMjl1YzNRZ2NtOTNJRDBnYzNCaGNuTmxUMkpxWldOMFcya2dZWE1nWVc1NVhUdGNiaUFnSUNBZ0lHeGxkQ0J6ZFcwZ1BTQXdPMXh1SUNBZ0lDQWdabTl5SUNoamIyNXpkQ0JxSUc5bUlFOWlhbVZqZEM1clpYbHpLSEp2ZHlrcFhHNGdJQ0FnSUNBZ0lITjFiU0FyUFNCeWIzZGJhaUJoY3lCaGJubGRPMXh1SUNBZ0lDQWdhV1lnS0hOMWJTQTlQVDBnTUNrZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNCbWIzSWdLR052Ym5OMElHb2diMllnVDJKcVpXTjBMbXRsZVhNb2NtOTNLU2xjYmlBZ0lDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMGdMejBnYzNWdE8xeHVJQ0FnSUgxY2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ1pYaHdZVzVrS0hOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBMQ0J1VW05M2N6b2diblZ0WW1WeUtTQjdYRzRnSUNBZ1kyOXVjM1FnWlhod1lXNWtaV1JQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ0E5SUh0OU8xeHVJQ0FnSUdOdmJuTjBJRzl5WkdWeUlEMGdUV0YwYUM1bWJHOXZjaWhOWVhSb0xtMWhlQ2hOWVhSb0xteHZaekV3S0c1U2IzZHpLU3dnTWlrcElDc2dNVHRjYmlBZ0lDQmpiMjV6ZENCdGFXNVBjbVJsY2lBOUlFMWhkR2d1Y0c5M0tERXdMQ0J2Y21SbGNpazdYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FTQTlJREE3SUdrZ1BDQnVVbTkzY3pzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0JwWmlBb0lYTndZWEp6WlU5aWFtVmpkRnRwWFNsY2JpQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBdkx5QmpiMjV6ZENCeWIzY2dQU0J6Y0dGeWMyVlBZbXBsWTNSYmFWMDdYRzRnSUNBZ0lDQmxlSEJoYm1SbFpFOWlhbVZqZEZ0cFhTQS9QejBnZTMwN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcUlEMGdhVHNnYWlBOElHNVNiM2R6T3lCcUt5c3BJSHRjYmlBZ0lDQWdJQ0FnYVdZZ0tDRnpjR0Z5YzJWUFltcGxZM1JiYVYwL0xsdHFYU2xjYmlBZ0lDQWdJQ0FnSUNCamIyNTBhVzUxWlR0Y2JpQWdJQ0FnSUNBZ1kyOXVjM1FnZG1Gc0lEMGdkR2hwY3k1blpYUkZlSEJoYm1SV1lXeDFaU2h6Y0dGeWMyVlBZbXBsWTNRc0lHa3NJR29wT3lBdkwzQnlkVzVwYm1jZ2MzUmxjRnh1SUNBZ0lDQWdJQ0JwWmlBb1RXRjBhQzV5YjNWdVpDaDJZV3dnS2lCdGFXNVBjbVJsY2lrZ0x5QnRhVzVQY21SbGNpQStJREFwSUh0Y2JpQWdJQ0FnSUNBZ0lDQmxlSEJoYm1SbFpFOWlhbVZqZEZ0cFhWdHFYU0E5SUhaaGJEdGNiaUFnSUNBZ0lDQWdJQ0JwWmlBb0lXVjRjR0Z1WkdWa1QySnFaV04wVzJwZEtWeHVJQ0FnSUNBZ0lDQWdJQ0FnWlhod1lXNWtaV1JQWW1wbFkzUmJhbDBnUFNCN2ZUdGNiaUFnSUNBZ0lDQWdJQ0JsZUhCaGJtUmxaRTlpYW1WamRGdHFYVnRwWFNBOUlIWmhiRHRjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z1pYaHdZVzVrWldSUFltcGxZM1E3WEc0Z0lIMWNibHh1SUNBdkx5QndjbWwyWVhSbElIQnlkVzVsS0hKdmR6b2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBXMjUxYldKbGNsMHBJSHRjYmx4dUlDQXZMeUI5WEc1Y2JpQWdjSEpwZG1GMFpTQnBibVpzWVhSbEtITndZWEp6WlU5aWFtVmpkRG9nVTNCaGNuTmxUV0YwY21sNFQySnFaV04wS1NCN1hHNGdJQ0FnWm05eUlDaGpiMjV6ZENCcElHOW1JRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTlpYW1WamRDa3BJSHRjYmlBZ0lDQWdJR052Ym5OMElISnZkeUE5SUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMDdYRzRnSUNBZ0lDQm1iM0lnS0dOdmJuTjBJR29nYjJZZ1QySnFaV04wTG10bGVYTW9jbTkzS1NsY2JpQWdJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmtnWVhNZ1lXNTVYVnRxSUdGeklHRnVlVjBnUFNCTllYUm9MbkJ2ZHloemNHRnljMlZQWW1wbFkzUmJhU0JoY3lCaGJubGRXMm9nWVhNZ1lXNTVYU3dnZEdocGN5NWZiM0IwYVc5dWN5NXBibVpzWVhSbFJtRmpkRzl5S1R0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUdkbGRFVjRjR0Z1WkZaaGJIVmxLSE53WVhKelpVOWlhbVZqZERvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMExDQnBPaUJoYm5rc0lHbzZJR0Z1ZVNrZ2UxeHVJQ0FnSUd4bGRDQjJZV3dnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR04xY25KbGJuUkpibVJsZUdWeklEMGdUMkpxWldOMExtdGxlWE1vYzNCaGNuTmxUMkpxWldOMFcybGRJRDgvSUh0OUtUdGNiaUFnSUNCamIyNXpkQ0J2ZEdobGNrbHVaR1Y0WlhNZ1BTQlBZbXBsWTNRdWEyVjVjeWh6Y0dGeWMyVlBZbXBsWTNSYmFsMGdQejhnZTMwcE8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ2F5QnZaaUJqZFhKeVpXNTBTVzVrWlhobGN5a2dlMXh1SUNBZ0lDQWdhV1lnS0c5MGFHVnlTVzVrWlhobGN5NXBibU5zZFdSbGN5aHJLU2xjYmlBZ0lDQWdJQ0FnZG1Gc0lDczlJSE53WVhKelpVOWlhbVZqZEZ0cFhWdHJJR0Z6SUdGdWVWMGdLaUJ6Y0dGeWMyVlBZbXBsWTNSYmFsMWJheUJoY3lCaGJubGRPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnZG1Gc08xeHVJQ0I5WEc1OVhHNWNiaUpkZlE9PSIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuaW1wb3J0IHsgZ2V0R1BVRGV2aWNlIH0gZnJvbSAnLi4vZ2V0R1BVRGV2aWNlJztcbmltcG9ydCB7IHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZSB9IGZyb20gJy4vY29sd2lzZS1ub3JtYWxpemUnO1xuaW1wb3J0IHsgZXhwYW5kTm9SZXZpdmUsIGluZmxhdGUgfSBmcm9tICcuL2luZmxhdGUtZXhwYW5kJztcbmltcG9ydCB7IHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0gfSBmcm9tICcuL3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXJrb3ZDbHVzdGVyV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MsIG1heEl0ZXJhdGlvbnMgPSA1LCBpbmZsYXRlRmFjdG9yID0gMikge1xuICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgICAgIGNvbnN0IGRldmljZSA9IHlpZWxkIGdldEdQVURldmljZSgpO1xuICAgICAgICBpZiAoIWRldmljZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gZ3B1IGRldmljZSBmb3VuZCcpO1xuICAgICAgICAvLyBzZWxmIGxvb3BzIGFyZSBhbHJlYWR5IGFkZGVkIGhlcmVcbiAgICAgICAgY29uc3Qgc3BhcnNlS05ORm9ybSA9IHRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0oc3BhcnNlTWF0cml4LCBuUm93cyk7XG4gICAgICAgIC8vIGZpcnN0LCB3ZSBub3JtaWxpemUgdGhlIHNpbWlsYXJpdGllc1xuICAgICAgICB5aWVsZCBzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UoZGV2aWNlLCBzcGFyc2VLTk5Gb3JtLktOTlNpbWlsYXJpdGllcywgc3BhcnNlS05ORm9ybS5pbmRleE9mZnNldHMsIG5Sb3dzKTtcbiAgICAgICAgbGV0IHJlcyA9IHNwYXJzZUtOTkZvcm07XG4gICAgICAgIC8vIHRoZW4gd2UgZXhwYW5kIHRoZSBzaW1pbGFyaXRpZXNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXhJdGVyYXRpb25zOyBpKyspIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coY2hlY2tTb3J0ZWQocmVzLktOTkluZGV4ZXMsIHJlcy5pbmRleE9mZnNldHMpKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGFuZFJlcyA9IHlpZWxkIGV4cGFuZE5vUmV2aXZlKGRldmljZSwgcmVzLktOTlNpbWlsYXJpdGllcywgcmVzLktOTkluZGV4ZXMsIHJlcy5pbmRleE9mZnNldHMsIG5Sb3dzKTtcbiAgICAgICAgICAgIC8vIHRoZW4gd2UgaW5mbGF0ZSB0aGUgc2ltaWxhcml0aWVzXG4gICAgICAgICAgICBpbmZsYXRlKGV4cGFuZFJlcy5LTk5TaW1pbGFyaXRpZXMsIGluZmxhdGVGYWN0b3IpO1xuICAgICAgICAgICAgLy8gdGhlbiB3ZSBub3JtaWxpemUgdGhlIHNpbWlsYXJpdGllcyBhZ2FpblxuICAgICAgICAgICAgeWllbGQgc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwgZXhwYW5kUmVzLktOTlNpbWlsYXJpdGllcywgZXhwYW5kUmVzLmluZGV4T2Zmc2V0cywgblJvd3MpO1xuICAgICAgICAgICAgcmVzID0gZXhwYW5kUmVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1NQ0wtd2ViR1BVLmpzLm1hcCIsImltcG9ydCB7IG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4IH0gZnJvbSAnQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvc3BhcnNlLW1hdHJpeC93ZWJHUFUtc3BhcnNlLW1hdHJpeCc7XG5pbXBvcnQgeyBTcGFyc2VNYXRyaXhTZXJ2aWNlIH0gZnJvbSAnLi4vZGlzdGFuY2UtbWF0cml4L3NwYXJzZS1tYXRyaXgtc2VydmljZSc7XG5pbXBvcnQgeyBNQ0xTcGFyc2VSZWR1Y2VyIH0gZnJvbSAnLi9tYXJjb3YtY2x1c3Rlcic7XG5vbm1lc3NhZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHRocmVzaG9sZCwgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QsIGRpc3RhbmNlRm5BcmdzLCBkaXN0YW5jZUZucywgbWF4SXRlcmF0aW9ucywgdXNlV2ViR1BVLCBpbmZsYXRlIH0gPSBldmVudC5kYXRhO1xuICAgIGNvbnNvbGUudGltZSgnc3BhcnNlIG1hdHJpeCcpO1xuICAgIGxldCBzcGFyc2UgPSBudWxsO1xuICAgIGlmICh1c2VXZWJHUFUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHNwYXJzZSA9IGF3YWl0IG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4KGRhdGEsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbnMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCB3ZWlnaHRzLCBkaXN0YW5jZUZuQXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzcGFyc2UpIHsgLy8gZmFsc2JhY2sgdG8gQ1BVXG4gICAgICAgIGlmICh1c2VXZWJHUFUpXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdXRUJHUFUgc3BhcnNlIG1hdHJpeCBjYWxjdWxhdGlvbiBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgc3BhcnNlID0gYXdhaXQgbmV3IFNwYXJzZU1hdHJpeFNlcnZpY2UoKVxuICAgICAgICAgICAgLmNhbGNNdWx0aUNvbHVtbihkYXRhLCBkaXN0YW5jZUZucywgdGhyZXNob2xkIC8gMTAwLCBkaXN0YW5jZUZuQXJncywgd2VpZ2h0cywgYWdncmVnYXRpb25NZXRob2QpO1xuICAgIH1cbiAgICBjb25zb2xlLnRpbWVFbmQoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgICAvL2NvbnN0IHJlcyA9IGF3YWl0IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHttYXhJdGVyYXRpb25zOiBtYXhJdGVyYXRpb25zID8/IDV9KS50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gICAgY29uc3QgcmVkdWNlciA9IG5ldyBNQ0xTcGFyc2VSZWR1Y2VyKHsgbWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1LCBpbmZsYXRlRmFjdG9yOiBpbmZsYXRlID8/IDIgfSk7XG4gICAgY29uc29sZS50aW1lKCdNQ0wnKTtcbiAgICBsZXQgcmVzID0gbnVsbDtcbiAgICBpZiAodXNlV2ViR1BVKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXMgPSBhd2FpdCByZWR1Y2VyLnRyYW5zZm9ybVdlYkdQVShzcGFyc2UsIGRhdGFbMF0ubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignd2ViR1BVIE1DTCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBDUFUgaW1wbGVtZW50YXRpb24nKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFyZXMpXG4gICAgICAgIHJlcyA9IGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgIGNvbnNvbGUudGltZUVuZCgnTUNMJyk7XG4gICAgcG9zdE1lc3NhZ2UoeyByZXMgfSk7XG59O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldOc0xYZHZjbXRsY2k1cWN5SXNJbk52ZFhKalpWSnZiM1FpT2lJaUxDSnpiM1Z5WTJWeklqcGJJbTFqYkMxM2IzSnJaWEl1ZEhNaVhTd2libUZ0WlhNaU9sdGRMQ0p0WVhCd2FXNW5jeUk2SWtGQlFVRXNUMEZCVHl4RlFVRkRMREJDUVVFd1FpeEZRVUZETEUxQlFVMHNkMFZCUVhkRkxFTkJRVU03UVVGRGJFZ3NUMEZCVHl4RlFVRnhRaXh0UWtGQmJVSXNSVUZCUXl4TlFVRk5MREJEUVVFd1F5eERRVUZETzBGQlIycEhMRTlCUVU4c1JVRkJReXhuUWtGQlowSXNSVUZCUXl4TlFVRk5MR3RDUVVGclFpeERRVUZETzBGQlJXeEVMRk5CUVZNc1IwRkJSeXhMUVVGTExFVkJRVVVzUzBGQlN5eEZRVUZGTEVWQlFVVTdTVUZETVVJc1RVRkJUU3hGUVVGRExFbEJRVWtzUlVGQlJTeFRRVUZUTEVWQlFVVXNUMEZCVHl4RlFVRkZMR2xDUVVGcFFpeEZRVUZGTEdOQlFXTXNSVUZCUlN4WFFVRlhMRVZCUVVVc1lVRkJZU3hGUVVGRkxGTkJRVk1zUlVGQlJTeFBRVUZQTEVWQlFVTXNSMEZOTDBjc1MwRkJTeXhEUVVGRExFbEJRVWtzUTBGQlF6dEpRVVZtTEU5QlFVOHNRMEZCUXl4SlFVRkpMRU5CUVVNc1pVRkJaU3hEUVVGRExFTkJRVU03U1VGRE9VSXNTVUZCU1N4TlFVRk5MRWRCUVRoQ0xFbEJRVWtzUTBGQlF6dEpRVU0zUXl4SlFVRkpMRk5CUVZNc1JVRkJSVHRSUVVOaUxFbEJRVWs3V1VGRFJpeE5RVUZOTEVkQlFVY3NUVUZCVFN3d1FrRkJNRUlzUTBGRGRrTXNTVUZCU1N4RlFVRkZMRk5CUVZNc1IwRkJSeXhIUVVGSExFVkJRVVVzVjBGQmEwSXNSVUZCUlN4cFFrRkJkMElzUlVGQlJTeFBRVUZQTEVWQlFVVXNZMEZCWXl4RFFVRkRMRU5CUVVNN1UwRkRha2M3VVVGQlF5eFBRVUZQTEVOQlFVTXNSVUZCUlR0WlFVTldMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVMEZEYkVJN1MwRkRSanRKUVVORUxFbEJRVWtzUTBGQlF5eE5RVUZOTEVWQlFVVXNSVUZCUlN4clFrRkJhMEk3VVVGREwwSXNTVUZCU1N4VFFVRlRPMWxCUTFnc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5dzJSVUZCTmtVc1EwRkJReXhEUVVGRE8xRkJSUzlHTEUxQlFVMHNSMEZCUnl4TlFVRk5MRWxCUVVrc2JVSkJRVzFDTEVWQlFVVTdZVUZEY2tNc1pVRkJaU3hEUVVGRExFbEJRVWtzUlVGQlJTeFhRVUZYTEVWQlFVVXNVMEZCVXl4SFFVRkhMRWRCUVVjc1JVRkJSU3hqUVVGakxFVkJRVVVzVDBGQlR5eEZRVUZGTEdsQ1FVRnBRaXhEUVVGRExFTkJRVU03UzBGRGNFYzdTVUZEUkN4UFFVRlBMRU5CUVVNc1QwRkJUeXhEUVVGRExHVkJRV1VzUTBGQlF5eERRVUZETzBsQlJXcERMR2RJUVVGblNEdEpRVU5vU0N4TlFVRk5MRTlCUVU4c1IwRkJSeXhKUVVGSkxHZENRVUZuUWl4RFFVRkRMRVZCUVVNc1lVRkJZU3hGUVVGRkxHRkJRV0VzU1VGQlNTeERRVUZETEVWQlFVVXNZVUZCWVN4RlFVRkZMRTlCUVU4c1NVRkJTU3hEUVVGRExFVkJRVU1zUTBGQlF5eERRVUZETzBsQlEzWkhMRTlCUVU4c1EwRkJReXhKUVVGSkxFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdTVUZEY0VJc1NVRkJTU3hIUVVGSExFZEJRVkVzU1VGQlNTeERRVUZETzBsQlEzQkNMRWxCUVVrc1UwRkJVeXhGUVVGRk8xRkJRMklzU1VGQlNUdFpRVU5HTEVkQlFVY3NSMEZCUnl4TlFVRk5MRTlCUVU4c1EwRkJReXhsUVVGbExFTkJRVU1zVFVGQlRTeEZRVUZGTEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF6dFRRVU0zUkR0UlFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRk8xbEJRMVlzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4MVJFRkJkVVFzUTBGQlF5eERRVUZETzFsQlEzWkZMRTlCUVU4c1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVMEZEYkVJN1MwRkRSanRKUVVORUxFbEJRVWtzUTBGQlF5eEhRVUZITzFGQlEwNHNSMEZCUnl4SFFVRkhMRTFCUVUwc1QwRkJUeXhEUVVGRExGTkJRVk1zUTBGQlF5eE5RVUZOTEVWQlFVVXNTVUZCU1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETzBsQlEzaEVMRTlCUVU4c1EwRkJReXhQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTTdTVUZGZGtJc1YwRkJWeXhEUVVGRExFVkJRVU1zUjBGQlJ5eEZRVUZETEVOQlFVTXNRMEZCUXp0QlFVTnlRaXhEUVVGRExFTkJRVU1pTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTIxMWJIUnBRMjlzVjJWaVIxQlZVM0JoY25ObFRXRjBjbWw0ZlNCbWNtOXRJQ2RBWkdGMFlXZHliMnN0YkdsaWNtRnlhV1Z6TDIxaGRHZ3ZjM0pqTDNkbFlrZFFWUzl6Y0dGeWMyVXRiV0YwY21sNEwzZGxZa2RRVlMxemNHRnljMlV0YldGMGNtbDRKenRjYm1sdGNHOXlkQ0I3VTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwTENCVGNHRnljMlZOWVhSeWFYaFRaWEoyYVdObGZTQm1jbTl0SUNjdUxpOWthWE4wWVc1alpTMXRZWFJ5YVhndmMzQmhjbk5sTFcxaGRISnBlQzF6WlhKMmFXTmxKenRjYm1sdGNHOXlkQ0I3UkdsemRHRnVZMlZCWjJkeVpXZGhkR2x2YmsxbGRHaHZaSDBnWm5KdmJTQW5MaTR2WkdsemRHRnVZMlV0YldGMGNtbDRMM1I1Y0dWekp6dGNibWx0Y0c5eWRDQjdTMjV2ZDI1TlpYUnlhV056ZlNCbWNtOXRJQ2N1TGk5MGVYQmxaQzF0WlhSeWFXTnpKenRjYm1sdGNHOXlkQ0I3VFVOTVUzQmhjbk5sVW1Wa2RXTmxjbjBnWm5KdmJTQW5MaTl0WVhKamIzWXRZMngxYzNSbGNpYzdYRzVjYm05dWJXVnpjMkZuWlNBOUlHRnplVzVqSUNobGRtVnVkQ2tnUFQ0Z2UxeHVJQ0JqYjI1emRDQjdaR0YwWVN3Z2RHaHlaWE5vYjJ4a0xDQjNaV2xuYUhSekxDQmhaMmR5WldkaGRHbHZiazFsZEdodlpDd2daR2x6ZEdGdVkyVkdia0Z5WjNNc0lHUnBjM1JoYm1ObFJtNXpMQ0J0WVhoSmRHVnlZWFJwYjI1ekxDQjFjMlZYWldKSFVGVXNJR2x1Wm14aGRHVjlPbHh1SUNBZ2UxeHVJQ0FnSUdSaGRHRTZJR0Z1ZVZ0ZFcxMHNJSFJvY21WemFHOXNaRG9nYm5WdFltVnlMRnh1SUNBZ0lIZGxhV2RvZEhNNklHNTFiV0psY2x0ZExDQmhaMmR5WldkaGRHbHZiazFsZEdodlpEb2dSR2x6ZEdGdVkyVkJaMmR5WldkaGRHbHZiazFsZEdodlpDeGNiaUFnSUNCa2FYTjBZVzVqWlVadWN6b2dTMjV2ZDI1TlpYUnlhV056VzEwc0lHUnBjM1JoYm1ObFJtNUJjbWR6T2lCaGJubGJYU3dnYldGNFNYUmxjbUYwYVc5dWN6b2diblZ0WW1WeUxGeHVJQ0FnSUhWelpWZGxZa2RRVlQ4NklHSnZiMnhsWVc0c0lHbHVabXhoZEdVL09pQnVkVzFpWlhKY2JpQWdmU0E5SUdWMlpXNTBMbVJoZEdFN1hHNWNiaUFnWTI5dWMyOXNaUzUwYVcxbEtDZHpjR0Z5YzJVZ2JXRjBjbWw0SnlrN1hHNGdJR3hsZENCemNHRnljMlU2SUZOd1lYSnpaVTFoZEhKcGVGSmxjM1ZzZENCOElHNTFiR3dnUFNCdWRXeHNPMXh1SUNCcFppQW9kWE5sVjJWaVIxQlZLU0I3WEc0Z0lDQWdkSEo1SUh0Y2JpQWdJQ0FnSUhOd1lYSnpaU0E5SUdGM1lXbDBJRzExYkhScFEyOXNWMlZpUjFCVlUzQmhjbk5sVFdGMGNtbDRLRnh1SUNBZ0lDQWdJQ0JrWVhSaExDQjBhSEpsYzJodmJHUWdMeUF4TURBc0lHUnBjM1JoYm1ObFJtNXpJR0Z6SUdGdWVTd2dZV2RuY21WbllYUnBiMjVOWlhSb2IyUWdZWE1nWVc1NUxDQjNaV2xuYUhSekxDQmthWE4wWVc1alpVWnVRWEpuY3lrN1hHNGdJQ0FnZlNCallYUmphQ0FvWlNrZ2UxeHVJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWhsS1R0Y2JpQWdJQ0I5WEc0Z0lIMWNiaUFnYVdZZ0tDRnpjR0Z5YzJVcElIc2dMeThnWm1Gc2MySmhZMnNnZEc4Z1ExQlZYRzRnSUNBZ2FXWWdLSFZ6WlZkbFlrZFFWU2xjYmlBZ0lDQWdJR052Ym5OdmJHVXVaWEp5YjNJb0oxZEZRa2RRVlNCemNHRnljMlVnYldGMGNtbDRJR05oYkdOMWJHRjBhVzl1SUdaaGFXeGxaQ3dnWm1Gc2JHbHVaeUJpWVdOcklIUnZJRU5RVlNCcGJYQnNaVzFsYm5SaGRHbHZiaWNwTzF4dVhHNGdJQ0FnYzNCaGNuTmxJRDBnWVhkaGFYUWdibVYzSUZOd1lYSnpaVTFoZEhKcGVGTmxjblpwWTJVb0tWeHVJQ0FnSUNBZ0xtTmhiR05OZFd4MGFVTnZiSFZ0Ymloa1lYUmhMQ0JrYVhOMFlXNWpaVVp1Y3l3Z2RHaHlaWE5vYjJ4a0lDOGdNVEF3TENCa2FYTjBZVzVqWlVadVFYSm5jeXdnZDJWcFoyaDBjeXdnWVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlFwTzF4dUlDQjlYRzRnSUdOdmJuTnZiR1V1ZEdsdFpVVnVaQ2duYzNCaGNuTmxJRzFoZEhKcGVDY3BPMXh1WEc0Z0lDOHZZMjl1YzNRZ2NtVnpJRDBnWVhkaGFYUWdibVYzSUUxRFRGTndZWEp6WlZKbFpIVmpaWElvZTIxaGVFbDBaWEpoZEdsdmJuTTZJRzFoZUVsMFpYSmhkR2x2Ym5NZ1B6OGdOWDBwTG5SeVlXNXpabTl5YlNoemNHRnljMlVzSUdSaGRHRmJNRjB1YkdWdVozUm9LVHRjYmlBZ1kyOXVjM1FnY21Wa2RXTmxjaUE5SUc1bGR5Qk5RMHhUY0dGeWMyVlNaV1IxWTJWeUtIdHRZWGhKZEdWeVlYUnBiMjV6T2lCdFlYaEpkR1Z5WVhScGIyNXpJRDgvSURVc0lHbHVabXhoZEdWR1lXTjBiM0k2SUdsdVpteGhkR1VnUHo4Z01uMHBPMXh1SUNCamIyNXpiMnhsTG5ScGJXVW9KMDFEVENjcE8xeHVJQ0JzWlhRZ2NtVnpPaUJoYm5rZ1BTQnVkV3hzTzF4dUlDQnBaaUFvZFhObFYyVmlSMUJWS1NCN1hHNGdJQ0FnZEhKNUlIdGNiaUFnSUNBZ0lISmxjeUE5SUdGM1lXbDBJSEpsWkhWalpYSXVkSEpoYm5ObWIzSnRWMlZpUjFCVktITndZWEp6WlN3Z1pHRjBZVnN3WFM1c1pXNW5kR2dwTzF4dUlDQWdJSDBnWTJGMFkyZ2dLR1VwSUh0Y2JpQWdJQ0FnSUdOdmJuTnZiR1V1WlhKeWIzSW9KM2RsWWtkUVZTQk5RMHdnWm1GcGJHVmtMQ0JtWVd4c2FXNW5JR0poWTJzZ2RHOGdRMUJWSUdsdGNHeGxiV1Z1ZEdGMGFXOXVKeWs3WEc0Z0lDQWdJQ0JqYjI1emIyeGxMbVZ5Y205eUtHVXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnBaaUFvSVhKbGN5bGNiaUFnSUNCeVpYTWdQU0JoZDJGcGRDQnlaV1IxWTJWeUxuUnlZVzV6Wm05eWJTaHpjR0Z5YzJVc0lHUmhkR0ZiTUYwdWJHVnVaM1JvS1R0Y2JpQWdZMjl1YzI5c1pTNTBhVzFsUlc1a0tDZE5RMHduS1R0Y2JseHVJQ0J3YjNOMFRXVnpjMkZuWlNoN2NtVnpmU2s3WEc1OU8xeHVJbDE5Il0sIm5hbWVzIjpbIldFQkdTTEFHR1JFR0FUSU9OIiwiX193ZWJwYWNrX3JlcXVpcmVfXyIsImNodW5rSWQiLCJnIiwiZ2xvYmFsVGhpcyIsInRoaXMiLCJGdW5jdGlvbiIsImUiLCJ3aW5kb3ciLCJvIiwib2JqIiwicHJvcCIsIk9iamVjdCIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsInNjcmlwdFVybCIsImltcG9ydFNjcmlwdHMiLCJsb2NhdGlvbiIsImRvY3VtZW50IiwiY3VycmVudFNjcmlwdCIsInNyYyIsInNjcmlwdHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsImxlbmd0aCIsImkiLCJFcnJvciIsInJlcGxhY2UiLCJwIiwiYiIsInNlbGYiLCJXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUyIsIkVVQ0xJREVBTiIsImFycmF5U2l6ZSIsIk1BTkhBVFRBTiIsIldFQkdQVURJU1RBTkNFIiwid2ViR1BVRnVuY3Rpb25zIiwiSEFNTUlORyIsIl9tYXhBcnJheVNpemUiLCJlbnRyeUluZGV4IiwibWF4QXJyYXlTaXplIiwiX2VudHJ5SW5kZXgiLCJUQU5JTU9UTyIsIkxFVkVOU1RFSU4iLCJORUVETEVNQU5fV1VOU0NIIiwiTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSIsIlNPS0FMIiwiQ09TSU5FIiwiQVNZTU1FVFJJQyIsIkRpZmZlcmVuY2UiLCJPbmVIb3QiLCJkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSIsIm1heEVudHJ5U2l6ZSIsIk1hdGgiLCJjZWlsIiwiX21heEVudHJ5U2l6ZSIsIlR5cGVTdXBwb3J0ZWREaXN0YW5jZXMiLCJTZXQiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImZ1bGZpbGxlZCIsInZhbHVlIiwic3RlcCIsIm5leHQiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJncHVBZGFwdGVyIiwiZ3B1RGV2aWNlIiwiZ2V0R1BVRGV2aWNlIiwibmF2aWdhdG9yIiwiZ3B1IiwicmVxdWVzdEFkYXB0ZXIiLCJwb3dlclByZWZlcmVuY2UiLCJpc0xvc3QiLCJsb3N0IiwiciIsInNldFRpbWVvdXQiLCJyZXF1aXJlZEJ1ZmZlclNpemUiLCJhZGFwdGVyTGltaXRzIiwibGltaXRzIiwiYnVmZmZlclNpemVMaW1pdCIsIm1heEJ1ZmZlclNpemUiLCJzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0IiwibWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIiwicmVxdWVzdERldmljZSIsInJlcXVpcmVkTGltaXRzIiwibWluIiwiY29uc29sZSIsImVycm9yIiwiRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMiLCJtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeCIsImVudHJ5TGlzdCIsInRocmVzaG9sZCIsImRpc3RhbmNlTWV0cmljcyIsImFnZ3JlZ2F0aW9uRnVuY3Rpb24iLCJ3ZWlnaHRzIiwib3B0aW9ucyIsImRldmljZSIsImF2YWlsYWJsZURpc3RhbmNlTWV0cmljcyIsInZhbHVlcyIsInNvbWUiLCJtZXRyaWMiLCJpbmNsdWRlcyIsImpvaW4iLCJtYXhEaXN0YW5jZSIsImxpc3QiLCJudW1PZkNvbHVtbnMiLCJsaXN0U2l6ZSIsInByb2Nlc3NJbmZvIiwibWFwIiwiZW50cnkiLCJkaXN0YW5jZU1ldHJpYyIsImdhcE9wZW5QZW5hbHR5IiwiZ2FwRXh0ZW5zaW9uUGVuYWx0eSIsIl9hIiwiX2IiLCJlbnRyeVR5cGUiLCJlbmNvZGVkTGlzdCIsIlVpbnQzMkFycmF5Iiwic3BsaXQiLCJjIiwiY2hhckNvZGVBdCIsIkZsb2F0MzJBcnJheSIsIl9kYXRhIiwiSW50MzJBcnJheSIsImVuY29kZWRMaXN0VHlwZSIsImFycmF5U2l6ZXMiLCJhcnIiLCJoYXMiLCJtYXhFbnRyeUxlbiIsInJlZHVjZSIsImEiLCJtYXgiLCJjb21wbGV4aXR5IiwiRW5jb2RlZEFycmF5Q29uc3RydWN0b3IiLCJmbGF0U291cmNlQXJyYXkiLCJmb3JFYWNoIiwic2VxIiwic2V0Iiwic3VwcEluZm9TdHJ1Y3RXZ3NsIiwic3VwcEluZm9TaXplIiwic3VwcEluZm9UeXBlIiwic3VwcEluZm9CdWZmZXIiLCJtYXhNb25vbWVySW5kZXgiLCJzY29yaW5nTWF0cml4IiwiYWxwaGFiZXRJbmRleGVzIiwia2V5cyIsInByZXYiLCJuIiwiQXJyYXkiLCJmaWxsIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwic2ltaWxhcml0eU1hdHJpeFNpemUiLCJ0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeCIsImtleSIsImtleTIiLCJvZmZzZXQiLCJyYW5nZSIsImRhdGFUeXBlV0dTTCIsImRhdGFTdHJ1Y3RXZ3NsIiwic291cmNlQXJyYXlTaXplIiwid2ViR1BVUHJvY2Vzc0luZm8iLCJzdXBwSW5mb1dnc2wiLCJpbmZvIiwiZmlsdGVyIiwid2dzbCIsIm5lZWRzRHVtbXkiLCJ0cmltIiwiZGF0YVdnc2wiLCJudW1PZlRocmVhZHMiLCJzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkIiwiY29tYmluZWRDb21wbGV4aXR5IiwibWF4SXRlcmF0aW9uc1BlclRocmVhZCIsIndvcmtncm91cHNEaW0iLCJzcXJ0IiwiZ2xvYmFsVGhyZWFkRGltU2l6ZSIsImNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSIsImRtQ2h1bmtTaXplUGVyVGhyZWFkIiwibW9kdWxlIiwiY3JlYXRlU2hhZGVyTW9kdWxlIiwibGFiZWwiLCJjb2RlIiwiZ2V0Q29tYmluZWREaXN0YW5jZVNjcmlwdCIsInBpcGVsaW5lIiwiY3JlYXRlQ29tcHV0ZVBpcGVsaW5lIiwibGF5b3V0IiwiY29tcHV0ZSIsImVudHJ5UG9pbnQiLCJzdGFydEF0Q29scyIsInN0YXJ0QXRSb3dzIiwiZW5kQXRDb2xzIiwiZW5kQXRSb3dzIiwiY2h1bmtTaXplIiwiZmxvb3IiLCJzdGFydFJvdyIsInN0YXJ0Q29sIiwidGltZSIsImVuZElkeCIsImVuZFJvdyIsImVuZENvbCIsInRpbWVFbmQiLCJjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSIsInN1cHBJbmZvQnVmZmVyMzJTaXplIiwic3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplIiwiY29tcHV0ZUluZm9CdWZmZXJTaXplIiwiQllURVNfUEVSX0VMRU1FTlQiLCJwYWRkZWRDb21wdXRlSW5mb0J1ZmZlclNpemUiLCJyZW1haW5kZXIiLCJjb21wdXRlSW5mb0J1ZmZlciIsImNyZWF0ZUJ1ZmZlciIsInNpemUiLCJ1c2FnZSIsIkdQVUJ1ZmZlclVzYWdlIiwiU1RPUkFHRSIsIkNPUFlfU1JDIiwiQ09QWV9EU1QiLCJtYXBwZWRBdENyZWF0aW9uIiwibWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciIsImdldE1hcHBlZFJhbmdlIiwiY29tcHV0ZUluZm9PZmZTZXQiLCJBcnJheUNvbnN0cnVjdG9yIiwidW5tYXAiLCJzdXBwSW5mb0J1ZmZlclNpemUiLCJwYWRkZWRTdXBwSW5mb0J1ZmZlclNpemUiLCJzdXBwSW5mb1JlbWFpbmRlciIsIm1hcHBlZFN1cHBJbmZvQXJyYXlCdWZmZXIiLCJzdXBwSW5mb09mZlNldCIsImJ5dGVMZW5ndGgiLCJyZXN1bHRzQnVmZmVyU2l6ZSIsInBhZGRlZFJlc3VsdHNCdWZmZXJTaXplIiwicmVzdWx0c1JlbWFpbmRlciIsInJlc3VsdHNCdWZmZXIiLCJiaW5kR3JvdXAiLCJjcmVhdGVCaW5kR3JvdXAiLCJnZXRCaW5kR3JvdXBMYXlvdXQiLCJlbnRyaWVzIiwiYmluZGluZyIsInJlc291cmNlIiwiYnVmZmVyIiwicmVzdWx0c091dEJ1ZmZlciIsIk1BUF9SRUFEIiwicmVzdWx0SXMiLCJyZXN1bHRKcyIsInJlc3VsdERpc3RhbmNlcyIsImlzQWxsRG9uZSIsImVuY29kZXIiLCJjcmVhdGVDb21tYW5kRW5jb2RlciIsInBhc3MiLCJiZWdpbkNvbXB1dGVQYXNzIiwic2V0UGlwZWxpbmUiLCJzZXRCaW5kR3JvdXAiLCJkaXNwYXRjaFdvcmtncm91cHMiLCJlbmQiLCJjb3B5QnVmZmVyVG9CdWZmZXIiLCJjb21tYW5kQnVmZmVyIiwiZmluaXNoIiwicXVldWUiLCJzdWJtaXQiLCJvblN1Ym1pdHRlZFdvcmtEb25lIiwibWFwQXN5bmMiLCJHUFVNYXBNb2RlIiwiUkVBRCIsInJlc3VsdHNPdXRBcnJheUJ1ZmZlciIsInJlc3VsdE9mZnNldCIsInJlc3VsdHNJIiwicmVzdWx0c0oiLCJyZXN1bHRzRGlzdGFuY2VzIiwicmVzdWx0c0ZvdW5kIiwiZXZlcnkiLCJkIiwidG90YWxSZXN1bHRzIiwiY29tYmluZWRJIiwiY29tYmluZWRKIiwiY29tYmluZWREaXN0YW5jZXMiLCJjb21iaW5lZE9mZnNldCIsInJlc0kiLCJmb3VuZCIsInN1YmFycmF5IiwicHVzaCIsInRvdGFsU2l6ZSIsImZpbmFsSSIsImZpbmFsSiIsImZpbmFsRGlzdGFuY2VzIiwiZmluYWxPZmZzZXQiLCJkZXN0cm95IiwiaiIsImRpc3RhbmNlIiwibWF4RW50cnlMZW5zIiwiYWdncmVnYXRpb24iLCJfIiwiaXNOaWwiLCJ4IiwiaW5zZXJ0U21hbGxlciIsImRpc3RhbmNlc0FyIiwiaW5kZXhlcyIsIm51bSIsImluZGV4IiwibmV3UG9zaXRpb24iLCJmaW5kSW5kZXgiLCJ2IiwicG9wIiwic3BsaWNlIiwiU3BhcnNlTWF0cml4U2VydmljZSIsImNvbnN0cnVjdG9yIiwiX3dvcmtlckNvdW50IiwiaGFyZHdhcmVDb25jdXJyZW5jeSIsImNhbGNNdWx0aUNvbHVtbiIsImZuTmFtZXMiLCJvcHRzIiwiYWdncmVnYXRpb25NZXRob2QiLCJtYXRTaXplIiwibWluVGhyZXNob2xkIiwiZ2V0TWluaW1hbFRocmVzaG9sZCIsImxvZyIsInByb21pc2VzIiwid29ya2VycyIsIldvcmtlciIsIlVSTCIsImlkeCIsInJlc29sdmVXb3JrZXIiLCJyZWplY3RXb3JrZXIiLCJzdGFydElkeCIsInBvc3RNZXNzYWdlIiwib25tZXNzYWdlIiwiZGF0YSIsInRlcm1pbmF0ZSIsInJlc3VsdHMiLCJhbGwiLCJmdWxsU2l6ZSIsImFjYyIsInZhbCIsInJlcyIsImNhbGMiLCJmbk5hbWUiLCJnZXRLTk4iLCJuTmVpZ2hib3VycyIsIm11bHRpQ29sdW1uS05OIiwiZ2V0VGhyZXNob2xkS05OIiwibXVsdGlDb2x1bW5UaHJlc2hvbGRLbm4iLCJrbm5EaXN0YW5jZXMiLCJrbm5JbmRleGVzIiwia25uU2l6ZXMiLCJrbm5SZXMiLCJnZXRTYW1wbGVEaXN0YW5jZXMiLCJ0aHJlc2hvbGRXb3JrZXJzIiwibWF4U2FtcGxlU2l6ZSIsInNhbXBsZVNpc2UiLCJ0ZXN0U2V0U2l6ZVBlcldvcmtlciIsInRQcm9taXNlcyIsInNhbXBsZUxlbmd0aCIsInNvcnQiLCJ3IiwiY2FsY1N5bmMiLCJkaXN0YW5jZUZuIiwiZGlzdGFuY2VzIiwiY250IiwibWkiLCJtaiIsImFzeW5jIiwiYmlvTGF5b3V0IiwiY2x1c3RlciIsInNwYXJzZU9iamVjdCIsImlzIiwianMiLCJlbWJlZFgiLCJyYW5kb20iLCJlbWJlZFkiLCJ4VmVsb2NpdGllcyIsInlWZWxvY2l0aWVzIiwidGVtcGVyYXR1cmUiLCJkeCIsImR5IiwiYWJzIiwidmVjU2l6ZSIsIm1pblgiLCJtaW5ZIiwibWF4WCIsIm1heFkiLCJyYW5nZVgiLCJyYW5nZVkiLCJnZXRMYXlvdXRFbWJlZGRpbmdzIiwic3BhcnNlS05OTm9yYWxpemVDb2x3aXNlIiwia25uU2ltaWxhcml0aWVzIiwib2Zmc2V0cyIsIm5Sb3dzIiwibmVlZGVkVGhyZWFkcyIsIm5lZWRlZFdvcmtHcm91cHMiLCJ3b3JrR3JvdXBUaHJlYWRzUGVyRGltIiwid29ya0dyb3VwRGltIiwidGhyZWFkc1BlckRpbSIsInNpbW1pbGFyaXRpZXNCdWZmZXIiLCJvZmZzZXRzQnVmZmVyIiwiY29tbWFuZEVuY29kZXIiLCJwYXNzRW5jb2RlciIsIm91dFNpbWlsYXJpdHlCdWZmZXIiLCJhcnJheUJ1ZmZlciIsImluZmxhdGUiLCJmYWN0b3IiLCJwb3ciLCJleHBhbmROb1Jldml2ZSIsIm9yZGVyIiwibG9nMTAiLCJwcnVuZVZhbHVlIiwib3V0S05OU2ltaWxhcml0aWVzIiwic3BhcnNlS05OQnVmZmVyQnl0ZVNpemUiLCJzcGFyc2VLTk5CdWZmZXIiLCJzcGFyc2VLTk5BcnJheUJ1ZmZlciIsInJvd0luZGV4ZXMiLCJnZXRSb3dJbmRleGVzIiwic3RhcnRCdWZmZXIiLCJyZXN1bHRCbG9ja0J1ZmZlciIsIm91dEJsb2NrQnVmZmVyIiwic3RhcnQiLCJjdXJMZW5ndGgiLCJ3cml0ZUJ1ZmZlciIsIm91dEJsb2NrIiwiS05OSW5kZXhlcyIsIktOTlNpbWlsYXJpdGllcyIsImluZGV4T2Zmc2V0cyIsInRvU3BhcnNlS05OU2ltaWxhcml0eUZvcm0iLCJzcGFyc2VNYXRyaXgiLCJvY2N1cmVuY2VDb3VudCIsImNvdW50T2NjdXJhbmNlc0FkZExvb3BzIiwib2Zmc2V0Rm9ybSIsImFyIiwiaW5zZXJ0Q291bnRlciIsInJvdyIsImNvbCIsInNpbWlsYXJpdHkiLCJ0b1N0cmluZyIsImRlZmF1bHRNQ0xPcHRpb25zIiwiZXhwYW5kRmFjdG9yIiwibWF4SXRlcmF0aW9ucyIsImluZmxhdGVGYWN0b3IiLCJtdWx0RmFjdG9yIiwiTUNMU3BhcnNlUmVkdWNlciIsIl9vcHRpb25zIiwidHJhbnNmb3JtIiwidG9PYmplY3RGb3JtIiwiYWRkTG9vcHMiLCJub3JtYWxpemUiLCJleHBhbmQiLCJjbHVzdGVycyIsImFzc2lnbkNsdXN0ZXJzIiwiY29ycmVjdENsdXN0ZXJzIiwiZW1iZWRkaW5ncyIsInRyYW5zZm9ybVdlYkdQVSIsIm1jbFJlcyIsInNwYXJzZUtOTkZvcm0iLCJleHBhbmRSZXMiLCJtYXJrb3ZDbHVzdGVyV2ViR1BVIiwiY3NyVG9TcGFyc2VPYmplY3QiLCJjbHVzdGVyU2l6ZU1hcCIsInNvcnRlZEluZGV4ZXMiLCJOdW1iZXIiLCJjbHVzdGVyTWFwIiwiY2x1c3RlcklkeCIsIm1pbk9yZGVyIiwiayIsImNsdXN0ZXJOdW0iLCJzb3J0ZWRDbHVzdGVyTmFtZXMiLCJwZXJSb3ciLCJ5T2Zmc2V0IiwiY2x1c3Rlck5hbWUiLCJvZmZzZXRYIiwibWVyZ2VDbHVzdGVycyIsImlDbHVzdGVyIiwiakNsdXN0ZXIiLCJyb3VuZCIsImFzc2lnbkNsdXN0ZXJzQ1NSIiwiY29ycmVjdGVkT2Zmc2V0cyIsIm9mZnNldENvdW50ZXIiLCJzdW0iLCJleHBhbmRlZE9iamVjdCIsImdldEV4cGFuZFZhbHVlIiwiY3VycmVudEluZGV4ZXMiLCJvdGhlckluZGV4ZXMiLCJldmVudCIsImRpc3RhbmNlRm5BcmdzIiwiZGlzdGFuY2VGbnMiLCJ1c2VXZWJHUFUiLCJzcGFyc2UiLCJyZWR1Y2VyIl0sInNvdXJjZVJvb3QiOiIifQ==