@datagrok/eda 1.1.25 → 1.1.28

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.
Files changed (111) hide show
  1. package/.vscode/settings.json +5 -0
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +1 -0
  4. package/dist/05e5e0770f54f07e9474.wasm +0 -0
  5. package/dist/111.js +2 -0
  6. package/dist/111.js.map +1 -0
  7. package/dist/153.js +2 -0
  8. package/dist/153.js.map +1 -0
  9. package/dist/23.js +2 -2
  10. package/dist/23.js.map +1 -0
  11. package/dist/234.js +2 -0
  12. package/dist/234.js.map +1 -0
  13. package/dist/242.js +2 -0
  14. package/dist/242.js.map +1 -0
  15. package/dist/260.js +2 -0
  16. package/dist/260.js.map +1 -0
  17. package/dist/317.js +2 -0
  18. package/dist/317.js.map +1 -0
  19. package/dist/33.js +2 -0
  20. package/dist/33.js.map +1 -0
  21. package/dist/348.js +2 -0
  22. package/dist/348.js.map +1 -0
  23. package/dist/377.js +2 -0
  24. package/dist/377.js.map +1 -0
  25. package/dist/412.js +2 -0
  26. package/dist/412.js.map +1 -0
  27. package/dist/415.js +2 -0
  28. package/dist/415.js.map +1 -0
  29. package/dist/531.js +2 -0
  30. package/dist/531.js.map +1 -0
  31. package/dist/583.js +2 -0
  32. package/dist/583.js.map +1 -0
  33. package/dist/589.js +2 -0
  34. package/dist/589.js.map +1 -0
  35. package/dist/603.js +2 -0
  36. package/dist/603.js.map +1 -0
  37. package/dist/656.js +2 -0
  38. package/dist/656.js.map +1 -0
  39. package/dist/682.js +2 -0
  40. package/dist/682.js.map +1 -0
  41. package/dist/705.js +2 -0
  42. package/dist/705.js.map +1 -0
  43. package/dist/731.js +2 -0
  44. package/dist/731.js.map +1 -0
  45. package/dist/738.js +3 -0
  46. package/dist/738.js.map +1 -0
  47. package/dist/763.js +2 -0
  48. package/dist/763.js.map +1 -0
  49. package/dist/778.js +2 -0
  50. package/dist/778.js.map +1 -0
  51. package/dist/783.js +2 -0
  52. package/dist/783.js.map +1 -0
  53. package/dist/793.js +2 -0
  54. package/dist/793.js.map +1 -0
  55. package/dist/907.js +2 -0
  56. package/dist/907.js.map +1 -0
  57. package/dist/91.js +2 -0
  58. package/dist/91.js.map +1 -0
  59. package/dist/950.js +2 -0
  60. package/dist/950.js.map +1 -0
  61. package/dist/package-test.js +2 -2
  62. package/dist/package-test.js.map +1 -0
  63. package/dist/package.js +2 -2
  64. package/dist/package.js.map +1 -0
  65. package/package.json +92 -92
  66. package/scripts/command.txt +1 -1
  67. package/scripts/func.json +1 -1
  68. package/scripts/module.json +1 -1
  69. package/src/missing-values-imputation/ui.ts +80 -66
  70. package/src/package.ts +288 -38
  71. package/src/pls/pls-tools.ts +16 -15
  72. package/src/regression.ts +232 -0
  73. package/src/svm.ts +78 -38
  74. package/tsconfig.json +4 -4
  75. package/wasm/EDA.js +65 -1
  76. package/wasm/EDA.wasm +0 -0
  77. package/wasm/EDAAPI.js +30 -0
  78. package/wasm/EDAForWebWorker.js +1 -1
  79. package/wasm/callWasm.js +384 -393
  80. package/wasm/regression-api.cpp +66 -0
  81. package/wasm/regression.h +128 -0
  82. package/wasm/workers/fitLinearRegressionParamsWithDataNormalizingWorker.js +13 -0
  83. package/wasm/workers/fitLinearRegressionParamsWorker.js +13 -0
  84. package/webpack.config.js +1 -1
  85. package/dist/208.js +0 -2
  86. package/dist/221.js +0 -2
  87. package/dist/231.js +0 -2
  88. package/dist/261.js +0 -2
  89. package/dist/282.js +0 -2
  90. package/dist/334.js +0 -2
  91. package/dist/356.js +0 -2
  92. package/dist/36.js +0 -2
  93. package/dist/367.js +0 -2
  94. package/dist/374.js +0 -2
  95. package/dist/40.js +0 -2
  96. package/dist/413.js +0 -2
  97. package/dist/42.js +0 -2
  98. package/dist/427.js +0 -2
  99. package/dist/467.js +0 -2
  100. package/dist/523.js +0 -3
  101. package/dist/533.js +0 -2
  102. package/dist/590.js +0 -2
  103. package/dist/65.js +0 -2
  104. package/dist/694.js +0 -2
  105. package/dist/729.js +0 -2
  106. package/dist/796.js +0 -2
  107. package/dist/902.js +0 -2
  108. package/dist/910.js +0 -2
  109. package/dist/972.js +0 -2
  110. package/dist/f5343e2c2e15952ce916.wasm +0 -0
  111. /package/dist/{523.js.LICENSE.txt → 738.js.LICENSE.txt} +0 -0
package/dist/231.js DELETED
@@ -1,2 +0,0 @@
1
- var eda;(()=>{"use strict";var e,n,t={9295:(e,n,t)=>{var r;!function(e){e.EUCLIDEAN="EUCLIDEAN",e.MANHATTAN="MANHATTAN"}(r||(r={}));const a={[r.EUCLIDEAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + distances[i] * distances[i] * computeInfo.weights[i] * computeInfo.weights[i];\n }\n return sqrt(sum);\n `},[r.MANHATTAN]:function(e){return`\n var sum = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n sum = sum + abs(distances[i]) * computeInfo.weights[i];\n }\n return sum;\n `}};var i;!function(e){e.HAMMING="Hamming",e.EUCLIDEAN="Euclidean",e.MANHATTAN="Manhattan",e.TANIMOTO="Tanimoto",e.LEVENSTEIN="Levenshtein",e.NEEDLEMAN_WUNSCH="Needlemann-Wunsch",e.MONOMER_CHEMICAL_DISTANCE="Monomer chemical distance",e.SOKAL="Sokal",e.COSINE="Cosine",e.ASYMMETRIC="Asymmetric",e.Difference="Difference",e.OneHot="One-Hot"}(i||(i={}));const o={[i.HAMMING]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + f32(a[i] != b[i]);\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.EUCLIDEAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + f32(a[i] - b[i]) * f32(a[i] - b[i]);\n }\n return sqrt(dist);\n `},[i.MANHATTAN]:function(e,n){return`\n var dist: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n dist = dist + abs(f32(a[i] - b[i]));\n }\n return dist;\n `},[i.TANIMOTO]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n\n if (onBitsa == 0u && onBitsb == 0u) {\n return 0.0;\n }\n\n let totalOnBits = onBitsa + onBitsb;\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n\n return 1.0 - f32(commonBits) / f32(totalOnBits - commonBits);\n `},[i.LEVENSTEIN]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n\n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = f32(i);\n }\n\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n dynamicPassMat[curIndex][0] = f32(i);\n var minEntry: f32 = f32(maxLength);\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n let bMon = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n var cost: f32 = f32(a[j - 1] != bMon);\n var res: f32 = min(\n min(\n (*prevRow)[j] + 1.0, // deletion\n (*curRow)[j - 1] + 1.0, // insertion\n ),\n (*prevRow)[j - 1] + cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n `},[i.NEEDLEMAN_WUNSCH]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength));\n // we will store two arrays as matrix and swap the working indices per pass.\n // this way we can reduce memory usage per computation to just O(aLength)\n // the grid will have aLength + 1 columns and bLength + 1 rows\n // this will be guaranteed by iteration, but the array sizes must be known at compile time, so we will use a fixed size of maxArraySize\n var dynamicPassMat: array<array<f32, ${e+1}u>, 2>; // initialize to 0\n \n // we need to keep track of which operation led to the current cell\n // i.e. whether we came from the left, top or diagonal to assign gap open/gap extend penalty\n var verticalGaps: array<u32, ${e+1}u>;\n var horizontalGaps: array<u32, ${e+1}u>;\n\n let gapOpenPenalty: f32 = suppInfo.gapOpenPenalty${n};\n let gapExtensionPenalty: f32 = suppInfo.gapExtensionPenalty${n};\n var prevIndex: u32 = 0;\n var curIndex: u32 = 1; // we will swap these indices per pass\n // initialize the first row\n for (var i = 0u; i <= aLength; i = i + 1u) {\n dynamicPassMat[prevIndex][i] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n dynamicPassMat[curIndex][i] = 0.0;\n }\n dynamicPassMat[0][0] = 0.0;\n\n let simMatrix = &suppInfo.similarityMatrix${n}; // using pointers make things faster\n // iterate over the rows\n for (var i = 1u; i <= bLength; i = i + 1u) {\n let prevRow = &dynamicPassMat[prevIndex];\n let curRow = &dynamicPassMat[curIndex];\n (*curRow)[0] = gapOpenPenalty + f32(i - 1) * gapExtensionPenalty;\n var minEntry: f32 = f32(maxLength);\n let monB = u32(b[i - 1]);\n for (var j = 1u; j <= aLength; j = j + 1u) {\n let monA = u32(a[j - 1]);\n \n let cost: f32 = (*prevRow)[j - 1] + 1f - (*simMatrix)[monA][monB];\n var top = (*prevRow)[j]; // deletion\n if (verticalGaps[j] > 0) {\n top = top + gapExtensionPenalty;\n } else {\n top = top + gapOpenPenalty;\n }\n var left = (*curRow)[j - 1]; // insertion\n if (horizontalGaps[j - 1] > 0) {\n left = left + gapExtensionPenalty;\n } else {\n left = left + gapOpenPenalty;\n }\n var res: f32 = min(\n min(\n top, // deletion\n left, // insertion\n ),\n cost // substitution\n );\n (*curRow)[j] = res;\n if (res < minEntry) {\n minEntry = res;\n }\n // update the horizontal and vertical gaps\n if (res == cost) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 0;\n } else if (res == left) {\n verticalGaps[j] = 0;\n horizontalGaps[j] = 1;\n } else {\n verticalGaps[j] = 1;\n horizontalGaps[j] = 0;\n }\n }\n // swap the indices\n let temp: u32 = prevIndex;\n prevIndex = curIndex;\n curIndex = temp;\n if (minEntry > maxIntDistance) {\n return 1.0;\n }\n }\n return dynamicPassMat[prevIndex][aLength] / f32(maxLength);\n \n `},[i.MONOMER_CHEMICAL_DISTANCE]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n let maxLength: u32 = max(aLength, bLength);\n let minLength: u32 = min(aLength, bLength);\n let sizeDiff: u32 = maxLength - minLength;\n \n let maxIntDistance = ceil(maxDistance * f32(maxLength)) - f32(sizeDiff);\n\n let simMatrix = &(suppInfo.similarityMatrix${n}); // using pointers make things faster\n var diff: f32 = 0.0;\n for (var i = 0u; i < ${e}; i = i + 1u) {\n diff = diff + 1.0 - (*simMatrix)[u32(a[i])][u32(b[i])];\n if (diff > maxIntDistance) {\n return 1.0;\n }\n }\n diff += f32(sizeDiff);\n return diff / ${e};\n `},[i.SOKAL]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa + onBitsb;\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(total * 2 - commonBits * 3);\n `},[i.COSINE]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let total = onBitsa * onBitsb; // p.s. here total is taken by multiplying\n if (total == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / sqrt(f32(total));\n `},[i.ASYMMETRIC]:function(e,n){return`\n var onBitsa: u32 = 0u;\n var onBitsb: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n onBitsa = onBitsa + countOneBits(a[i]);\n onBitsb = onBitsb + countOneBits(b[i]);\n }\n let min = min(onBitsa, onBitsb);\n if (min == 0u) {\n return 1.0;\n }\n var commonBits: u32 = 0u;\n for (var i = 0u; i < ${e}u; i = i + 1u) {\n commonBits = commonBits + countOneBits(a[i] & b[i]);\n }\n return 1.0 - f32(commonBits) / f32(min);\n `},[i.Difference]:function(e,n){return`\n let range = suppInfo.range${n};\n return f32(abs(f32(a[0]) - f32(b[0])) / range);\n `},[i.OneHot]:function(e,n){return`\n let aLength: u32 = computeInfo.entrySizes[${n}][aIndex];\n let bLength: u32 = computeInfo.entrySizes[${n}][bIndex];\n if (aLength != bLength) {\n return 1.0;\n }\n for (var i = 0u; i < aLength; i = i + 1u) {\n if(a[i] != b[i]) {\n return 1.0;\n }\n }\n return 0.0;\n `}},s={[i.HAMMING]:e=>Math.ceil(e/30),[i.EUCLIDEAN]:e=>Math.ceil(e/30),[i.MANHATTAN]:e=>Math.ceil(e/30),[i.TANIMOTO]:e=>Math.ceil(e/60),[i.SOKAL]:e=>Math.ceil(e/60),[i.COSINE]:e=>Math.ceil(e/60),[i.ASYMMETRIC]:e=>Math.ceil(e/60),[i.LEVENSTEIN]:e=>Math.ceil(e*e/60),[i.NEEDLEMAN_WUNSCH]:e=>Math.ceil(e*e/60),[i.MONOMER_CHEMICAL_DISTANCE]:e=>Math.ceil(e/25),[i.Difference]:e=>1,[i.OneHot]:e=>Math.ceil(e/40)},u={STRING:new Set([i.HAMMING,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.MONOMER_CHEMICAL_DISTANCE,i.OneHot]),UINT32ARRAY:new Set([i.HAMMING,i.EUCLIDEAN,i.MANHATTAN,i.MONOMER_CHEMICAL_DISTANCE,i.LEVENSTEIN,i.NEEDLEMAN_WUNSCH,i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC,i.OneHot,i.Difference]),INT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.OneHot,i.Difference]),FLOAT32ARRAY:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),NUMBER:new Set([i.EUCLIDEAN,i.MANHATTAN,i.Difference]),BITARRAY:new Set([i.TANIMOTO,i.COSINE,i.SOKAL,i.ASYMMETRIC])};var l=function(e,n,t,r){return new(t||(t=Promise))((function(a,i){function o(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var n;e.done?a(e.value):(n=e.value,n instanceof t?n:new t((function(e){e(n)}))).then(o,s)}u((r=r.apply(e,n||[])).next())}))};let f=null,c=null;function d(){return l(this,void 0,void 0,(function*(){if(!f&&(f=yield navigator.gpu.requestAdapter({powerPreference:"high-performance"}),null==f))return null;let e=!1;if(c&&(c.lost.then((()=>{e=!0})),yield new Promise((e=>setTimeout(e,10)))),!c||e){const e=1e9,n=f.limits,t=n.maxBufferSize,r=n.maxStorageBufferBindingSize;try{return c=yield f.requestDevice({requiredLimits:{maxBufferSize:Math.min(t,e),maxStorageBufferBindingSize:Math.min(r,e)}}),c}catch(e){return console.error("Failed to create device with required limits",e),c=yield f.requestDevice(),c}}return c}))}function p(e,n=.8,t,a,o,l){return f=this,c=void 0,h=function*(){const f=yield d();if(!f)return null;const c=Object.values(i);if(t.some((e=>!c.includes(e))))throw new Error("Invalid distance metrics provided: "+t.join(", "));if(!Object.values(r).includes(a))throw new Error("Invalid aggregation function provided: "+a);const p=1-n;if(l.length!==e.length||l.length!==t.length||l.length!==o.length)throw new Error("Options, weigths and distance functions must be provided for each column");if(e.some((n=>n.length!==e[0].length)))throw new Error("All entry lists must be the same length");const h=e.length,g=e[0].length,y=e.map(((e,n)=>function(e,n=i.HAMMING,t,r={gapOpenPenalty:1,gapExtensionPenalty:.6}){var a,o;let l=null;const f=e.some((e=>"string"==typeof e))?(l="STRING",e.map((e=>new Uint32Array(e.split("").map((e=>e.charCodeAt(0))))))):e.some((e=>"number"==typeof e))?(l="NUMBER",e.map((e=>new Float32Array([e])))):"object"==typeof e[0]&&e.some((e=>"_data"in e&&"_length"in e))?(l="BITARRAY",e.map((e=>e._data))):e.some((e=>e instanceof Float32Array))?(l="FLOAT32ARRAY",e):e.some((e=>e instanceof Uint32Array))?(l="UINT32ARRAY",e):e.some((e=>e instanceof Int32Array))?(l="INT32ARRAY",e):void 0;if(!f||!l)throw new Error("Invalid entry type, could not determine entry type from input list");const c=f[0]instanceof Int32Array?"INT32ARRAY":f[0]instanceof Float32Array?"FLOAT32ARRAY":"UINT32ARRAY",d=new Uint32Array(f.map((e=>e.length)));if(!u[l]||!u[l].has(n))throw new Error(`Distance metric '${n}' not supported for entry type '${l}'`);const p=d.reduce(((e,n)=>Math.max(e,n)),0),m=s[n](p),h="INT32ARRAY"===c?Int32Array:"FLOAT32ARRAY"===c?Float32Array:Uint32Array,g=new h(f.length*p);f.forEach(((e,n)=>{g.set(e,n*p)}));let y="",A=0,b="FLOAT32ARRAY",w=null;if(n===i.NEEDLEMAN_WUNSCH||n===i.MONOMER_CHEMICAL_DISTANCE){let e=r.scoringMatrix&&r.alphabetIndexes?Object.keys(r.alphabetIndexes).reduce(((e,n)=>Math.max(e,n.charCodeAt(0))),0):-1;if(!r.alphabetIndexes||!r.scoringMatrix){for(let n=0;n<g.length;n++)g[n]>e&&(e=g[n]);r.scoringMatrix=new Array(e+1).fill(null).map((()=>new Array(e+1).fill(0))),r.alphabetIndexes={};for(let e=0;e<r.scoringMatrix.length;e++)r.scoringMatrix[e][e]=1,r.alphabetIndexes[String.fromCharCode(e)]=e}const n=(e+1)*(e+1),i=new Array(e+1).fill(null).map((()=>new Float32Array(e+1)));for(let n=0;n<e+1;n++)i[n][n]=1;const s=r.alphabetIndexes;for(const e of Object.keys(s))for(const n of Object.keys(s))e!==n&&(i[e.charCodeAt(0)][n.charCodeAt(0)]=r.scoringMatrix[s[e]][s[n]]);A=2+n,b="FLOAT32ARRAY",w=new Float32Array(A),w[0]=null!==(a=r.gapOpenPenalty)&&void 0!==a?a:1,w[1]=null!==(o=r.gapExtensionPenalty)&&void 0!==o?o:.6;let u=2;for(let e=0;e<i.length;e++)w.set(i[e],u),u+=i[e].length;y=`\n gapOpenPenalty${t}: f32,\n gapExtensionPenalty${t}: f32,\n similarityMatrix${t}: array<array<f32, ${e+1}>, ${e+1}>`}else if(n===i.Difference){if(!r.range||"number"!=typeof r.range||r.range<=0){const e=g.reduce(((e,n)=>Math.min(e,n)),g[0]),n=g.reduce(((e,n)=>Math.max(e,n)),g[0]);r.range=n-e}r.range<=0&&(r.range=1),A=1,b="FLOAT32ARRAY",w=new Float32Array([r.range]),y=`\n range${t}: f32`}const x=g instanceof Int32Array?"i32":g instanceof Float32Array?"f32":"u32",E=`data${t}: array<array<${x}, ${p}>, ${f.length}>`;return{flatSourceArray:g,sourceArraySize:g.length,maxEntryLen:p,arraySizes:d,complexity:m,suppInfoBuffer:w,suppInfoSize:A,suppInfoType:b,suppInfoStructWgsl:y,entryType:l,dataTypeWGSL:x,dataStructWgsl:E,EncodedArrayConstructor:h}}(e,t[n],n,l[n])));if(0===h)throw new Error("No columns provided. Please provide at least one column of data.");1===h&&(a=r.MANHATTAN);let A=y.map((e=>e.suppInfoStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),b=!1;A&&""!=A.trim()||(b=!0,A="\ndummy: f32\n");const w=y.map((e=>e.dataStructWgsl)).filter((e=>!!e&&""!=e)).join(",\n"),x=new Uint32Array(h*g);y.forEach(((e,n)=>{x.set(e.arraySizes,n*g)}));const E=1e4,I=100,M=y.reduce(((e,n)=>e+n.complexity),0),N=Math.ceil(1e4/M),v=Math.ceil(Math.sqrt(Math.ceil(100))),B=10*v,S=g*(g-1)/2,U=Math.ceil(S/E),C=f.createShaderModule({label:"Sparse matrix compute shader",code:`\n // each thread will perform 100 iterations at one time, comparing 100 pairs of entries.\n // in total, each thread will perform at most ${U} comparisons.\n // first is the result struct, containing is, js, and distances. each array with length of 100,\n // and also integer for how many pairs were found to be below threshold.\n struct SparseResult {\n i: array<array<u32, 100>, 10000>,\n j: array<array<u32, 100>, 10000>,\n distances: array<array<f32, 100>, 10000>,\n found: array<u32, 10000>,\n done: array<u32, 10000>\n }\n // struct for the data\n struct ComputeInfo {\n // start at cols and rows, and end at cols and rows for each thread, these will be calculated on cpu and passed to gpu.\n startAtCols: array<u32, 10000>,\n startAtRows: array<u32, 10000>,\n endAtCols: array<u32, 10000>,\n endAtRows: array<u32, 10000>,\n\n // the ACTUALLY sizes of each entry\n entrySizes: array<array<u32, ${g}>, ${h}>,\n // the weights for each entry\n weights: array<f32, ${h}>,\n // the data for each entry\n ${w} // an example of the dataWgsl would be:\n //data0: array<array<u32,20>,100>,\n //data1: array<array<u32,20>,100>\n }\n\n // struct for the supplementary information\n struct SuppInfo {\n // struct containing all the supplementary info, like scoring matrix, alphabet indexes, range, etc.\n ${A}\n };\n\n @group(0) @binding(0) var<storage, read_write> computeInfo: ComputeInfo;\n @group(0) @binding(1) var<storage, read_write> suppInfo: SuppInfo;\n @group(0) @binding(2) var<storage, read_write> results: SparseResult;\n @compute @workgroup_size(10, 10) fn calcSparseMatrix(\n @builtin(global_invocation_id) id: vec3<u32>\n ) {\n ${b?"let otherDummy = suppInfo.dummy * 2;":""} // just to make sure that the suppInfo is not optimized out\n let threadCol = id.x;\n let threadRow = id.y;\n let linearIndex = threadRow * ${B} + threadCol;\n if (linearIndex >= 10000) {\n return; // if we are out of bounds, return\n } \n var startAtCol: u32 = computeInfo.startAtCols[linearIndex];\n var startAtRow: u32 = computeInfo.startAtRows[linearIndex];\n let endAtCol: u32 = min(computeInfo.endAtCols[linearIndex], ${g}u);\n let endAtRow: u32 = min(computeInfo.endAtRows[linearIndex], ${g}u);\n let is = &results.i[linearIndex];\n let js = &results.j[linearIndex];\n let distances = &results.distances[linearIndex];\n results.found[linearIndex] = 0; // initialize the found counter\n var found: u32 = 0;\n if (results.done[linearIndex] > 0) {\n return; // if we are done, return\n }\n for (var i = 0; i < ${N}; i++) {\n if (startAtCol >= endAtCol && startAtRow >= endAtRow) {\n results.done[linearIndex] = 1;\n break;\n }\n if (found >= 100) {\n break;\n }\n let dist = combinedDistance(startAtCol, startAtRow);\n if (dist <= ${p}) {\n (*is)[found] = startAtCol;\n (*js)[found] = startAtRow;\n (*distances)[found] = dist;\n found = found + 1;\n }\n startAtCol = startAtCol + 1;\n if (startAtCol >= ${g}u) {\n startAtRow += 1;\n startAtCol = startAtRow + 1;\n }\n }\n results.found[linearIndex] = found;\n // update the startAtCols and startAtRows\n computeInfo.startAtCols[linearIndex] = startAtCol;\n computeInfo.startAtRows[linearIndex] = startAtRow;\n\n }\n\n // this will generate the distance script for each distance metric and then combine them into one\n ${m(t,y.map((e=>e.maxEntryLen)),p,a)}\n\n\n `}),O=f.createComputePipeline({label:"sparse matrix compute pipeline",layout:"auto",compute:{module:C,entryPoint:"calcSparseMatrix"}}),L=new Uint32Array(E),P=new Uint32Array(E),R=new Uint32Array(E),T=new Uint32Array(E),_=Math.floor(S/E);let j=0,$=1;console.time("GPUthreadStarts");for(let e=0;e<E;e++){const n=9999===e?S-1:(e+1)*_,t=g-2-Math.floor(Math.sqrt(-8*n+4*g*(g-1)-7)/2-.5),r=n-g*t+Math.floor((t+1)*(t+2)/2);L[e]=$,P[e]=j,R[e]=r,T[e]=t,j=t,$=r}console.timeEnd("GPUthreadStarts");const G=4e4+g*h+h+y.reduce(((e,n)=>e+n.sourceArraySize),0),D=y.reduce(((e,n)=>e+n.suppInfoSize),0),z=1e6,k=G*Uint32Array.BYTES_PER_ELEMENT;let Y=k;const F=15&k;0!==F&&(Y+=16-F);const H=f.createBuffer({label:"compute info buffer",size:Y,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),K=H.getMappedRange();let W=0;new Uint32Array(K,W,E).set(L),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(P),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(R),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,E).set(T),W+=E*Uint32Array.BYTES_PER_ELEMENT,new Uint32Array(K,W,x.length).set(x),W+=x.length*Uint32Array.BYTES_PER_ELEMENT,new Float32Array(K,W,h).set(o),W+=h*Float32Array.BYTES_PER_ELEMENT;for(const e of y){const n=e.EncodedArrayConstructor,t=e.sourceArraySize;new n(K,W,t).set(e.flatSourceArray),W+=t*n.BYTES_PER_ELEMENT}H.unmap();const q=D*Uint32Array.BYTES_PER_ELEMENT;let X=q;const V=15&q;0!==V&&(X+=16-V),X=Math.max(X,16);const Z=f.createBuffer({label:"supp info buffer",size:X,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),J=Z.getMappedRange();let Q=0;for(const e of y)e.suppInfoBuffer&&e.suppInfoBuffer.byteLength>0&&e.suppInfoSize>0&&(new("UINT32ARRAY"===e.suppInfoType?Uint32Array:Float32Array)(J,Q,e.suppInfoBuffer.length).set(e.suppInfoBuffer),Q+=e.suppInfoBuffer.byteLength);0===Q&&new Uint32Array(J,0,4).set([1,1,1,1]),Z.unmap();const ee=302e4*Uint32Array.BYTES_PER_ELEMENT;let ne=ee;const te=15&ee;0!==te&&(ne+=16-te);const re=f.createBuffer({label:"results buffer",size:ne,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC}),ae=f.createBindGroup({label:"bindGroup for sparse matrix buffer",layout:O.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:H}},{binding:1,resource:{buffer:Z}},{binding:2,resource:{buffer:re}}]}),ie=f.createBuffer({label:"results out buffer",size:re.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),oe=[],se=[],ue=[];let le=!1;for(;!le;){const e=f.createCommandEncoder({label:"distance encoder"}),n=e.beginComputePass({label:"distance compute pass"});n.setPipeline(O),n.setBindGroup(0,ae),n.dispatchWorkgroups(v,v),n.end(),e.copyBufferToBuffer(re,0,ie,0,ie.size);const t=e.finish();f.queue.submit([t]),yield f.queue.onSubmittedWorkDone(),yield ie.mapAsync(GPUMapMode.READ);const r=ie.getMappedRange();let a=0;const i=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const o=new Uint32Array(r,a,z);a+=z*Uint32Array.BYTES_PER_ELEMENT;const s=new Float32Array(r,a,z);a+=z*Float32Array.BYTES_PER_ELEMENT;const u=new Uint32Array(r,a,E);a+=E*Uint32Array.BYTES_PER_ELEMENT,le=new Uint32Array(r,a,E).every((e=>1===e));const l=u.reduce(((e,n)=>e+n),0),c=new Uint32Array(l),d=new Uint32Array(l),p=new Float32Array(l);let m=0;for(let e=0;e<u.length;e++){const n=u[e];0!==n&&(c.set(i.subarray(e*I,e*I+n),m),d.set(o.subarray(e*I,e*I+n),m),p.set(s.subarray(e*I,e*I+n),m),m+=n)}oe.push(c),se.push(d),ue.push(p),ie.unmap()}const fe=oe.reduce(((e,n)=>e+n.length),0),ce=new Uint32Array(fe),de=new Uint32Array(fe),pe=new Float32Array(fe);let me=0;for(let e=0;e<oe.length;e++)ce.set(oe[e],me),de.set(se[e],me),pe.set(ue[e],me),me+=oe[e].length;return H.destroy(),Z.destroy(),re.destroy(),ie.destroy(),{i:ce,j:de,distance:pe}},new((p=void 0)||(p=Promise))((function(e,n){function t(e){try{a(h.next(e))}catch(e){n(e)}}function r(e){try{a(h.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof p?a:new p((function(e){e(a)}))).then(t,r)}a((h=h.apply(f,c||[])).next())}));var f,c,p,h}function m(e,n,t,r){return e.map(((e,r)=>`\n fn distanceScript${r}(aIndex: u32, bIndex: u32) -> f32 {\n let a = computeInfo.data${r}[aIndex];\n let b = computeInfo.data${r}[bIndex];\n let maxDistance: f32 = ${t};\n ${o[e](n[r],r)}\n }\n `)).join("\n")+"\n"+`\n fn combinedDistance(aIndex: u32, bIndex: u32) -> f32 {\n var distances: array<f32, ${e.length}>;\n ${e.map(((e,n)=>`distances[${n}] = distanceScript${n}(aIndex, bIndex);`)).join("\n")}\n ${a[r](e.length)}\n }\n \n `}var h=t(2590);async function g(e,n,t){const r=e.length,a=[],i=[];for(let o=0;o<r;o++)for(let s=o+1;s<r;s++){const r=e[o],u=e[s];n[r]?.[u]>=t&&(a.push(o),i.push(s))}return function(e,n,t){const r=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),a=new Float32Array(t.length).fill(0).map((()=>10*Math.random())),i=new Float32Array(t.length).fill(0),o=new Float32Array(t.length).fill(0);for(let s=0;s<100;s++){const u=1-s/100;i.fill(0),o.fill(0);for(let t=0;t<e.length;t++){const s=e[t],l=n[t],f=r[s]-r[l],c=a[s]-a[l];Math.abs(f)>=1&&(i[s]-=u*f,i[l]+=u*f),Math.abs(c)>=1&&(o[s]-=u*c,o[l]+=u*c)}for(let e=0;e<t.length;e++){const n=Math.sqrt(i[e]*i[e]+o[e]*o[e]);n>0&&(r[e]+=i[e]/n*u,a[e]+=o[e]/n*u)}}let s=r[0],u=a[0],l=r[0],f=a[0];for(let e=1;e<t.length;e++)s=Math.min(s,r[e]),u=Math.min(u,a[e]),l=Math.max(l,r[e]),f=Math.max(f,a[e]);let c=l-s,d=f-u;0===c&&(c=l);for(let e=0;e<t.length;e++)r[e]=(r[e]-s)/c/2+.5;0===d&&(d=f);for(let e=0;e<t.length;e++)a[e]=(a[e]-u)/d/2+.5;return{embedX:r,embedY:a}}(a,i,e)}function y(e,n,t,r){return a=this,i=void 0,s=function*(){const a=r,i=Math.ceil(a/100),o=Math.ceil(Math.sqrt(i)),s=10*o,u=e.createShaderModule({label:"colwise-normalize",code:`\n @group(0) @binding(0) var<storage, read_write> knnSimilarities : array<f32>;\n @group(0) @binding(1) var<storage, read> offsets : array<u32>;\n @compute @workgroup_size(10, 10) fn normalize(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let row = id.x;\n let col = id.y;\n let index = row * ${s} + col;\n if (index >= ${r}) {\n return;\n }\n let offsetBegin = offsets[index];\n let offsetEnd = offsets[index + 1];\n var sum = 0.0;\n if (offsetEnd - offsetBegin == 0) {\n return;\n }\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n sum = sum + knnSimilarities[i];\n }\n if (sum > 0.0) {\n for (var i = offsetBegin; i < offsetEnd; i = i + 1) {\n knnSimilarities[i] = knnSimilarities[i] / sum;\n }\n }\n }\n \n `}),l=e.createComputePipeline({label:"hamming compute pipeline",layout:"auto",compute:{module:u,entryPoint:"normalize"}}),f=e.createBuffer({label:"simmilarities info buffer",size:n.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Float32Array(f.getMappedRange()).set(n),f.unmap();const c=e.createBuffer({label:"offsets info buffer",size:t.byteLength,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(c.getMappedRange()).set(t),c.unmap();const d=e.createBindGroup({layout:l.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:f}},{binding:1,resource:{buffer:c}}]}),p=e.createCommandEncoder(),m=p.beginComputePass();m.setPipeline(l),m.setBindGroup(0,d),m.dispatchWorkgroups(o,o),m.end();const h=e.createBuffer({label:"out similarity buffer",size:n.byteLength,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});p.copyBufferToBuffer(f,0,h,0,n.byteLength),e.queue.submit([p.finish()]),yield e.queue.onSubmittedWorkDone(),yield h.mapAsync(GPUMapMode.READ);const g=new Float32Array(h.getMappedRange());n.set(g),h.unmap(),f.destroy(),c.destroy(),h.destroy()},new((o=void 0)||(o=Promise))((function(e,n){function t(e){try{u(s.next(e))}catch(e){n(e)}}function r(e){try{u(s.throw(e))}catch(e){n(e)}}function u(n){var a;n.done?e(n.value):(a=n.value,a instanceof o?a:new o((function(e){e(a)}))).then(t,r)}u((s=s.apply(a,i||[])).next())}));var a,i,o,s}function A(e,n=2){for(let t=0;t<e.length;t++)e[t]=Math.pow(e[t],n)}function b(e,n,t,r,a){return i=this,o=void 0,u=function*(){const i=9e4,o=Math.ceil(900),s=Math.ceil(Math.sqrt(o)),u=10*s,l=Math.floor(Math.max(Math.log10(a),2))+1,f=Math.pow(10,-l),c=new Float32Array(n.length),d=e.createShaderModule({label:"expand",code:`\n struct SparseKNN {\n knnSimilarities: array<f32, ${n.length}>,\n knnIndexes: array<u32, ${t.length}>,\n offsets: array<u32, ${r.length}>,\n rowIndexes: array<u32, ${t.length}>,\n }\n\n @group(0) @binding(0) var<storage, read_write> sparseKNN: SparseKNN;\n @group(0) @binding(1) var<storage, read_write> resultSimBlock: array<f32, 90000>;\n @group(0) @binding(2) var<storage, read_write> startAt: u32;\n @compute @workgroup_size(10, 10) fn expand(\n @builtin(global_invocation_id) id: vec3<u32>,\n ) {\n let col = id.x;\n let row = id.y;\n let index = row * ${u} + col;\n if (index >= 90000) {\n return;\n }\n let workingIndex = index + startAt;\n if (workingIndex >= ${t.length}) {\n return;\n }\n \n let rowIdx = sparseKNN.rowIndexes[workingIndex];\n let colIdx = sparseKNN.knnIndexes[workingIndex];\n let offsetBeginRow = sparseKNN.offsets[rowIdx];\n let offsetEndRow = sparseKNN.offsets[rowIdx + 1];\n let offsetBeginCol = sparseKNN.offsets[colIdx];\n let offsetEndCol = sparseKNN.offsets[colIdx + 1];\n var sum = 0.0;\n for (var i = offsetBeginRow; i < offsetEndRow; i = i + 1) {\n for(var j = offsetBeginCol; j < offsetEndCol; j = j + 1) {\n if (sparseKNN.knnIndexes[i] == sparseKNN.knnIndexes[j]) {\n sum = sum + sparseKNN.knnSimilarities[i] * sparseKNN.knnSimilarities[j];\n break;\n }\n }\n }\n if (sum > ${f}) {\n resultSimBlock[index] = sum;\n } else {\n resultSimBlock[index] = 0.0;\n }\n }\n `}),p=e.createComputePipeline({label:"expand compute pipeline",layout:"auto",compute:{module:d,entryPoint:"expand"}});let m=4*(n.length+t.length+r.length+t.length);const h=15&m;0!==h&&(m+=16-h);const g=e.createBuffer({label:"sparse knn buffer",size:m,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0}),y=g.getMappedRange();new Float32Array(y,0,n.length).set(n),new Uint32Array(y,4*n.length,t.length).set(t),new Uint32Array(y,4*(n.length+t.length),r.length).set(r);const A=function(e){const n=new Uint32Array(e[e.length-1]);for(let t=0;t<e.length-1;t++)for(let r=e[t];r<e[t+1];r++)n[r]=t;return n}(r);new Uint32Array(y,4*(n.length+t.length+r.length),A.length).set(A),g.unmap();const b=e.createBuffer({label:"start end buffer",size:4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST,mappedAtCreation:!0});new Uint32Array(b.getMappedRange()).set([0]),b.unmap();const w=e.createBuffer({label:"result block buffer",size:36e4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST}),x=e.createBindGroup({layout:p.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:g}},{binding:1,resource:{buffer:w}},{binding:2,resource:{buffer:b}}]}),E=e.createBuffer({label:"out block buffer",size:w.size,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST});for(let n=0;n<Math.ceil(t.length/i);n++){const r=n*i,a=Math.min(i,t.length-r);e.queue.writeBuffer(b,0,new Uint32Array([r]));const o=e.createCommandEncoder({label:"expand encoder"}),u=o.beginComputePass({label:"expand compute pass"});u.setPipeline(p),u.setBindGroup(0,x),u.dispatchWorkgroups(s,s),u.end(),o.copyBufferToBuffer(w,0,E,0,E.size),e.queue.submit([o.finish()]),yield e.queue.onSubmittedWorkDone(),yield E.mapAsync(GPUMapMode.READ);const l=new Float32Array(E.getMappedRange(),0,a);c.set(l,r),E.unmap()}return g.destroy(),b.destroy(),w.destroy(),E.destroy(),{KNNIndexes:t,KNNSimilarities:c,indexOffsets:r}},new((s=void 0)||(s=Promise))((function(e,n){function t(e){try{a(u.next(e))}catch(e){n(e)}}function r(e){try{a(u.throw(e))}catch(e){n(e)}}function a(n){var a;n.done?e(n.value):(a=n.value,a instanceof s?a:new s((function(e){e(a)}))).then(t,r)}a((u=u.apply(i,o||[])).next())}));var i,o,s,u}function w(e,n){const t=function(e,n){const t=new Uint32Array(n);for(let n=0;n<e.i.length;n++)t[e.i[n]]++,t[e.j[n]]++;for(let e=0;e<n;e++)t[e]++;return t}(e,n),r=function(e){const n=new Uint32Array(e.length+1);let t=0;for(let r=0;r<e.length;r++)n[r]=t,t+=e[r];return n[e.length]=t,n}(t),a=new Uint32Array(n).fill(1),i=new Uint32Array(2*e.i.length+n),o=new Float32Array(2*e.i.length+n);for(let e=0;e<n;e++)i[r[e]]=e,o[r[e]]=1;for(let n=0;n<e.i.length;n++){const t=e.i[n],s=e.j[n],u=1-e.distance[n];i[r[t]+a[t]]=s,o[r[t]+a[t]]=u,a[t]++,i[r[s]+a[s]]=t,o[r[s]+a[s]]=u,a[s]++}return{KNNIndexes:i,KNNSimilarities:o,indexOffsets:r}}Object.prototype.toString;const x={expandFactor:2,maxIterations:5,inflateFactor:2,multFactor:1};class E{constructor(e={}){this._options={...x,...e}}async transform(e,n){let t=this.toObjectForm(e);if(this._options.maxIterations>0){this.addLoops(t,n),this.normalize(t);for(let e=0;e<this._options.maxIterations;e++)t=this.expand(t,n),this.inflate(t),this.normalize(t)}const{clusters:r,is:a,js:i}=this.assignClusters(t,n);this.correctClusters(r);const o=await this.layout(r,t,n);return{clusters:r,embedX:o.embedX,embedY:o.embedY,is:a,js:i}}async transformWebGPU(e,n){if(0===this._options.maxIterations)return this.transform(e,n);const t=await function(e,n,t=5){return r=this,a=void 0,o=function*(){const r=yield d();if(!r)throw new Error("no gpu device found");const a=w(e,n);yield y(r,a.KNNSimilarities,a.indexOffsets,n);let i=a;for(let e=0;e<t;e++){const e=yield b(r,i.KNNSimilarities,i.KNNIndexes,i.indexOffsets,n);A(e.KNNSimilarities,2),yield y(r,e.KNNSimilarities,e.indexOffsets,n),i=e}return i},new((i=void 0)||(i=Promise))((function(e,n){function t(e){try{u(o.next(e))}catch(e){n(e)}}function s(e){try{u(o.throw(e))}catch(e){n(e)}}function u(n){var r;n.done?e(n.value):(r=n.value,r instanceof i?r:new i((function(e){e(r)}))).then(t,s)}u((o=o.apply(r,a||[])).next())}));var r,a,i,o}(e,n,this._options.maxIterations),r=this.csrToSparseObject(t,n),{clusters:a,is:i,js:o}=this.assignClusters(r,n);this.correctClusters(a);const s=await this.layout(a,r,n);return{clusters:a,embedX:s.embedX,embedY:s.embedY,is:i,js:o}}correctClusters(e){const n={};for(const t of e)n[t]||(n[t]=0),n[t]++;const t=Object.keys(n).map(Number).sort(((e,t)=>n[e]-n[t])),r={};t.forEach(((e,n)=>r[e]=n+1));for(let n=0;n<e.length;n++)e[n]=r[e[n]]}csrToSparseObject(e,n){const t=Math.floor(Math.max(Math.log10(n),2))+1,r=1/Math.pow(10,t),a={};for(let t=0;t<n;t++){a[t]={};for(let n=e.indexOffsets[t];n<e.indexOffsets[t+1];n++){const i=e.KNNIndexes[n];i<=t||e.KNNSimilarities[n]<r||(a[t][i]=e.KNNSimilarities[n])}}return a}async layout(e,n,t){const r=new Float32Array(t).fill(0),a=new Float32Array(t).fill(0),i={};e.forEach(((e,n)=>{i[e]||(i[e]=[]),i[e].push(n)}));let o=0;const s=Object.keys(i);s.sort(((e,n)=>i[n].length-i[e].length));let u=6,l=0;for(const e of s){const t=i[e],s=await g(t,n,.001);o===Math.ceil(u/1.5)&&(o=0,l+=5/u,u=Math.ceil(1.5*u));const f=o%u*5/u*1.5;for(let e=0;e<s.embedX.length;e++)r[t[e]]=5*s.embedX[e]/u+f,a[t[e]]=5*s.embedY[e]/u+l;o++}return{embedX:r,embedY:a}}mergeClusters(e,n,t){const r=e[n],a=e[t];for(let n=0;n<e.length;n++)e[n]===a&&(e[n]=r)}assignClusters(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=Math.pow(10,i),s=new Array(n).fill(-1);for(const n of Object.keys(e))for(const i of Object.keys(e[n]))Math.round(e[n][i]*o)/o>0&&e[n][i]!==Number(n)&&Number(i)>Number(n)&&(r.push(Number(n)),a.push(Number(i)),-1!==s[Number(n)]&&-1!==s[Number(i)]?s[Number(n)]!==s[Number(i)]&&this.mergeClusters(s,Number(n),Number(i)):-1!==s[Number(n)]?s[Number(i)]=s[Number(n)]:-1!==s[Number(i)]?s[Number(n)]=s[Number(i)]:(t++,s[Number(n)]=t,s[Number(i)]=t));for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a)}}assignClustersCSR(e,n){let t=0;const r=[],a=[],i=Math.floor(Math.max(Math.log10(n),2))+1,o=1/Math.pow(10,i),s=new Array(n).fill(-1),u=new Uint32Array(n+1);let l=0;u[0]=0;for(let i=0;i<n;i++){for(let n=e.indexOffsets[i];n<e.indexOffsets[i+1];n++){const u=e.KNNIndexes[n];u<=i||e.KNNSimilarities[n]<=o||(r.push(i),a.push(u),l++,-1!==s[i]&&-1!==s[u]?s[i]!==s[u]&&this.mergeClusters(s,i,u):-1!==s[i]?s[u]=s[i]:-1!==s[u]?s[i]=s[u]:(t++,s[i]=t,s[u]=t))}u[i+1]=l}for(let e=0;e<s.length;e++)-1===s[e]&&(t++,s[e]=t);return{clusters:s,is:new Uint32Array(r),js:new Uint32Array(a),correctedOffsets:u}}toObjectForm(e){const n={};for(let t=0;t<e.i.length;t++)n[e.i[t]]||(n[e.i[t]]={}),n[e.i[t]][e.j[t]]=1-e.distance[t],n[e.j[t]]||(n[e.j[t]]={}),n[e.j[t]][e.i[t]]=1-e.distance[t];return n}addLoops(e,n){for(let t=0;t<n;t++)e[t]||(e[t]={}),e[t][t]=this._options.multFactor}normalize(e){for(const n of Object.keys(e)){const t=e[n];let r=0;for(const e of Object.keys(t))r+=t[e];if(0!==r)for(const a of Object.keys(t))e[n][a]/=r}}expand(e,n){const t={},r=Math.floor(Math.max(Math.log10(n),2))+1,a=Math.pow(10,r);for(let r=0;r<n;r++)if(e[r]){t[r]??(t[r]={});for(let i=r;i<n;i++){if(!e[r]?.[i])continue;const n=this.getExpandValue(e,r,i);Math.round(n*a)/a>0&&(t[r][i]=n,t[i]||(t[i]={}),t[i][r]=n)}}return t}inflate(e){for(const n of Object.keys(e)){const t=e[n];for(const r of Object.keys(t))e[n][r]=Math.pow(e[n][r],this._options.inflateFactor)}}getExpandValue(e,n,t){let r=0;const a=Object.keys(e[n]??{}),i=Object.keys(e[t]??{});for(const o of a)i.includes(o)&&(r+=e[n][o]*e[t][o]);return r}}onmessage=async e=>{const{data:n,threshold:t,weights:r,aggregationMethod:a,distanceFnArgs:i,distanceFns:o,maxIterations:s,useWebGPU:u}=e.data;console.time("sparse matrix");let l=null;if(u)try{l=await p(n,t/100,o,a,r,i)}catch(e){console.error(e)}l||(u&&console.error("WEBGPU sparse matrix calculation failed, falling back to CPU implementation"),l=await(new h._).calcMultiColumn(n,o,t/100,i,r,a)),console.timeEnd("sparse matrix");const f=new E({maxIterations:s??5});console.time("MCL");let c=null;if(u)try{c=await f.transformWebGPU(l,n[0].length)}catch(e){console.error("webGPU MCL failed, falling back to CPU implementation"),console.error(e)}c||(c=await f.transform(l,n[0].length)),console.timeEnd("MCL"),postMessage({res:c})}},6814:(e,n,t)=>{t.d(n,{cZ:()=>a,kK:()=>r}),t(7862);const r=e=>null==e;function a(e,n,t,r){if(t>e[e.length-1])return;const a=e.findIndex((e=>t<e));e.pop(),e.splice(a,0,t),n.pop(),n.splice(a,0,r)}}},r={};function a(e){var n=r[e];if(void 0!==n)return n.exports;var i=r[e]={exports:{}};return t[e](i,i.exports,a),i.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[590],(()=>a(9295)));return a.O(e)},e=[],a.O=(n,t,r,i)=>{if(!t){var o=1/0;for(f=0;f<e.length;f++){for(var[t,r,i]=e[f],s=!0,u=0;u<t.length;u++)(!1&i||o>=i)&&Object.keys(a.O).every((e=>a.O[e](t[u])))?t.splice(u--,1):(s=!1,i<o&&(o=i));if(s){e.splice(f--,1);var l=r();void 0!==l&&(n=l)}}return n}i=i||0;for(var f=e.length;f>0&&e[f-1][2]>i;f--)e[f]=e[f-1];e[f]=[t,r,i]},a.d=(e,n)=>{for(var t in n)a.o(n,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((n,t)=>(a.f[t](e,n),n)),[])),a.u=e=>e+".js",a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n),(()=>{var e;a.g.importScripts&&(e=a.g.location+"");var n=a.g.document;if(!e&&n&&(n.currentScript&&(e=n.currentScript.src),!e)){var t=n.getElementsByTagName("script");if(t.length)for(var r=t.length-1;r>-1&&!e;)e=t[r--].src}if(!e)throw new Error("Automatic publicPath is not supported in this browser");e=e.replace(/#.*$/,"").replace(/\?.*$/,"").replace(/\/[^\/]+$/,"/"),a.p=e})(),(()=>{a.b=self.location+"";var e={231:1};a.f.i=(n,t)=>{e[n]||importScripts(a.p+a.u(n))};var n=self.webpackChunkeda=self.webpackChunkeda||[],t=n.push.bind(n);n.push=n=>{var[r,i,o]=n;for(var s in i)a.o(i,s)&&(a.m[s]=i[s]);for(o&&o(a);r.length;)e[r.pop()]=1;t(n)}})(),n=a.x,a.x=()=>a.e(590).then(n);var i=a.x();eda=i})();
2
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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c0MsRUFBYUMsR0FBV3ZFLEVBQ3ZDLElBQUksSUFBSXdCLEtBQVk4QyxFQUNoQi9DLEVBQW9CZSxFQUFFZ0MsRUFBYTlDLEtBQ3JDRCxFQUFvQk0sRUFBRUwsR0FBWThDLEVBQVk5QyxJQUloRCxJQURHK0MsR0FBU0EsRUFBUWhELEdBQ2RTLEVBQVM3VixRQUNkK1gsRUFBZ0JsQyxFQUFTWixPQUFTLEVBQ25DZ0QsRUFBMkJwRSxFQUFLLEMsS3ZCbkI3QnBaLEVBQU8yYSxFQUFvQlosRUFDL0JZLEVBQW9CWixFQUFJLElBQ2hCWSxFQUFvQm5ZLEVBQUUsS0FBS0ksS0FBSzVDLEd3QkR4QyxJQUFJa2IsRUFBc0JQLEVBQW9CWixJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9jaHVuayBsb2FkZWQiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9zdGFydHVwIGNodW5rIGRlcGVuZGVuY2llcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtYWdncmVnYXRpb24uanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL211bHRpLWNvbC1kaXN0YW5jZXMvd2ViR1BVLW11bHRpY29sLWRpc3RhbmNlcy5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvZ2V0R1BVRGV2aWNlLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9zcGFyc2UtbWF0cml4L3dlYkdQVS1zcGFyc2UtbWF0cml4LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9wcmVwcm9jZXNzaW5nL3dlYkdQVS1wcm9jZXNzLWluZm8uanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWwvc3JjL01DTC9iaW8tbGF5b3V0LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvY29sd2lzZS1ub3JtYWxpemUuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9pbmZsYXRlLWV4cGFuZC5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tYXRoL3NyYy93ZWJHUFUvTUNML3V0aWxzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS91bWFwL3V0aWxzLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21hdGgvbm9kZV9tb2R1bGVzL2lzLWFueS1hcnJheS9saWItZXNtL2luZGV4LmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWFyY292LWNsdXN0ZXIuanMiLCJ3ZWJwYWNrOi8vZWRhLy4vbm9kZV9tb2R1bGVzL0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL01DTC9NQ0wtd2ViR1BVLmpzIiwid2VicGFjazovL2VkYS8uL25vZGVfbW9kdWxlcy9AZGF0YWdyb2stbGlicmFyaWVzL21sL3NyYy9NQ0wvbWNsLXdvcmtlci5qcyIsIndlYnBhY2s6Ly9lZGEvLi9ub2RlX21vZHVsZXMvQGRhdGFncm9rLWxpYnJhcmllcy9tbC9zcmMvZGlzdGFuY2UtbWF0cml4L3V0aWxzLmpzIiwid2VicGFjazovL2VkYS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9lZGEvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZW5zdXJlIGNodW5rIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZWRhL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3J1bnRpbWUvaW1wb3J0U2NyaXB0cyBjaHVuayBsb2FkaW5nIiwid2VicGFjazovL2VkYS93ZWJwYWNrL3N0YXJ0dXAiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGRlZmVycmVkID0gW107XG5fX3dlYnBhY2tfcmVxdWlyZV9fLk8gPSAocmVzdWx0LCBjaHVua0lkcywgZm4sIHByaW9yaXR5KSA9PiB7XG5cdGlmKGNodW5rSWRzKSB7XG5cdFx0cHJpb3JpdHkgPSBwcmlvcml0eSB8fCAwO1xuXHRcdGZvcih2YXIgaSA9IGRlZmVycmVkLmxlbmd0aDsgaSA+IDAgJiYgZGVmZXJyZWRbaSAtIDFdWzJdID4gcHJpb3JpdHk7IGktLSkgZGVmZXJyZWRbaV0gPSBkZWZlcnJlZFtpIC0gMV07XG5cdFx0ZGVmZXJyZWRbaV0gPSBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV07XG5cdFx0cmV0dXJuO1xuXHR9XG5cdHZhciBub3RGdWxmaWxsZWQgPSBJbmZpbml0eTtcblx0Zm9yICh2YXIgaSA9IDA7IGkgPCBkZWZlcnJlZC5sZW5ndGg7IGkrKykge1xuXHRcdHZhciBbY2h1bmtJZHMsIGZuLCBwcmlvcml0eV0gPSBkZWZlcnJlZFtpXTtcblx0XHR2YXIgZnVsZmlsbGVkID0gdHJ1ZTtcblx0XHRmb3IgKHZhciBqID0gMDsgaiA8IGNodW5rSWRzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRpZiAoKHByaW9yaXR5ICYgMSA9PT0gMCB8fCBub3RGdWxmaWxsZWQgPj0gcHJpb3JpdHkpICYmIE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uTykuZXZlcnkoKGtleSkgPT4gKF9fd2VicGFja19yZXF1aXJlX18uT1trZXldKGNodW5rSWRzW2pdKSkpKSB7XG5cdFx0XHRcdGNodW5rSWRzLnNwbGljZShqLS0sIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZnVsZmlsbGVkID0gZmFsc2U7XG5cdFx0XHRcdGlmKHByaW9yaXR5IDwgbm90RnVsZmlsbGVkKSBub3RGdWxmaWxsZWQgPSBwcmlvcml0eTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYoZnVsZmlsbGVkKSB7XG5cdFx0XHRkZWZlcnJlZC5zcGxpY2UoaS0tLCAxKVxuXHRcdFx0dmFyIHIgPSBmbigpO1xuXHRcdFx0aWYgKHIgIT09IHVuZGVmaW5lZCkgcmVzdWx0ID0gcjtcblx0XHR9XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn07IiwidmFyIG5leHQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLng7XG5fX3dlYnBhY2tfcmVxdWlyZV9fLnggPSAoKSA9PiB7XG5cdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fLmUoNTkwKS50aGVuKG5leHQpO1xufTsiLCJmdW5jdGlvbiBldWNsaWRlYW5BZ2dyZWdhdGlvbldnc2woYXJyYXlTaXplKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHthcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyBkaXN0YW5jZXNbaV0gKiBkaXN0YW5jZXNbaV0gKiBjb21wdXRlSW5mby53ZWlnaHRzW2ldICogY29tcHV0ZUluZm8ud2VpZ2h0c1tpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3FydChzdW0pO1xuICAgIGA7XG59XG47XG5mdW5jdGlvbiBtYW5oYXR0YW5BZ2dyZWdhdGlvbldnc2woYXJyYXlTaXplKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHthcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyBhYnMoZGlzdGFuY2VzW2ldKSAqIGNvbXB1dGVJbmZvLndlaWdodHNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICBgO1xufVxuZXhwb3J0IHZhciBXRUJHU0xBR0dSRUdBVElPTjtcbihmdW5jdGlvbiAoV0VCR1NMQUdHUkVHQVRJT04pIHtcbiAgICBXRUJHU0xBR0dSRUdBVElPTltcIkVVQ0xJREVBTlwiXSA9IFwiRVVDTElERUFOXCI7XG4gICAgV0VCR1NMQUdHUkVHQVRJT05bXCJNQU5IQVRUQU5cIl0gPSBcIk1BTkhBVFRBTlwiO1xufSkoV0VCR1NMQUdHUkVHQVRJT04gfHwgKFdFQkdTTEFHR1JFR0FUSU9OID0ge30pKTtcbmV4cG9ydCBjb25zdCBXRUJHU0xBR0dSRUdBVElPTkZVTkNUSU9OUyA9IHtcbiAgICBbV0VCR1NMQUdHUkVHQVRJT04uRVVDTElERUFOXTogZXVjbGlkZWFuQWdncmVnYXRpb25XZ3NsLFxuICAgIFtXRUJHU0xBR0dSRUdBVElPTi5NQU5IQVRUQU5dOiBtYW5oYXR0YW5BZ2dyZWdhdGlvbldnc2xcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtYWdncmVnYXRpb24uanMubWFwIiwiLyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuLy8gaW4gYWxsIHRoZSBmdW5jdGlvbnMgYmVsb3csIHRoZSB2YXJpYWJsZXMgYSBhbmQgYiBhcmUgYXNzdW1lZCB0byBiZSBhcnJheXMgb2YgdWludDMyL2YzMlxuLy92YWx1ZXMgd2hpY2ggYXJlIGluZmVyZWQgZnJvbSB0aGUgY29kZSB0aGlzIGNodW5rIGlzIGluamVjdGVkIGludG9cbi8vIGFsc28sIHdlIGhhdmUgYWNjZXNzIHRvIGNvbXB1dGVJbmZvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4vLyBjb21wdXRlSW5mby5lbnRyeVNpemVzOiBhcnJheSBvZiBhcnJheXMgb2YgdTMyIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mIHRoZSBlbnRyaWVzXG4vLyBvdGhlciBmaWVsZHMgYXJlIHNwZWNpZmljIHRvIHRoZSBkaXN0YW5jZSBmdW5jdGlvbiBzaG91bGQgYmUgaW5qZWN0ZWQgZnJvbSB0aGUgbWFpbiBzY3JpcHQgdGhhdCBjYWxscyB0aGlzIGZ1bmN0aW9uLFxuLy8gYW5kIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIHN1cHBsZW1lbnRhcnlJbmZvIHN0cnVjdFxuLy8gbGlrZSB0aGUgc2ltaWxhcml0eSBtYXRyaXggZm9yIG1vbm9tZXIgY2hlbWljYWwgZGlzdGFuY2UuXG4vLyB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24gc2hvdWxkIHJldHVybiBjb3JyZWN0IGJ1ZmZlciBhbGxvY2F0aW9uIG1lY2hhbmlzbSBmb3IgdGhlIHN1cHBsZW1lbnRhcnlJbmZvLFxuLy8gZm9yIGV2ZXJ5IGVudHJ5IGxpc3Rcbi8vIHRoZSBtYXhEaXN0YW5jZSB2YXJpYWJsZSBpcyBhbHNvIGFzc3VtZWQgdG8gYmUgYXZhaWxhYmxlIGluIHRoZVxuLy8gc2NvcGUgb2YgdGhlIGZ1bmN0aW9uLCBpbiBjYXNlIG9mIGtubiBpdCBpcyB0aGUgZGlzdGFuY2UgaW4gdGhlIGxhc3QgcG9zdGlvbiBvZiBrbm4gb24gdGhpcyBpbmRleCxcbi8vIGluIGNhc2Ugb2Ygc3BhcnNlIG1hdHJpeCwgaXQgY2FuIGJlIGp1c3QgdGhlIHRocmVzaG9sZCBmb3IgdGhlIGRpc3RhbmNlLlxuLy8gaGFtbWluZyBkaXN0YW5jZSBmb3Igc2VxdW5lbmNlcyBvZiB1aW50MzIgYXJyYXlzIG9mIG1heCBsZW5ndGggJHttYXhBcnJheVNpemV9XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVSGFtbWluZyhfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgbGV0IGFMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYUluZGV4XTtcbiAgbGV0IGJMZW5ndGg6IHUzMiA9IGNvbXB1dGVJbmZvLmVudHJ5U2l6ZXNbJHtlbnRyeUluZGV4fV1bYkluZGV4XTtcbiAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICBsZXQgbWluTGVuZ3RoOiB1MzIgPSBtaW4oYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBzaXplRGlmZjogdTMyID0gbWF4TGVuZ3RoIC0gbWluTGVuZ3RoO1xuICBcbiAgbGV0IG1heEludERpc3RhbmNlID0gY2VpbChtYXhEaXN0YW5jZSAqIGYzMihtYXhMZW5ndGgpKSAtIGYzMihzaXplRGlmZik7XG5cbiAgdmFyIGRpZmY6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHtfbWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgICAgZGlmZiA9IGRpZmYgKyBmMzIoYVtpXSAhPSBiW2ldKTtcbiAgICAgIGlmIChkaWZmID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICAgIHJldHVybiAxLjA7XG4gICAgICAgIH1cbiAgfVxuICBkaWZmICs9IGYzMihzaXplRGlmZik7XG4gIHJldHVybiBkaWZmIC8gJHtfbWF4QXJyYXlTaXplfTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gaXQgaXMgYXNzdW1ldCB0aGF0IHN1cHBJbmZvIHN0cnVjdCBjb250YWlucyBjb3JyZWN0IG1hdHJpeCBjYWxsZWQgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH0sIChzaW1pbGFyaXR5TWF0cml4MCwgc2ltaWxhcml0eU1hdHJpeDEsIGV0YylcbiAgICAvLyB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGJ5IHRoZSBnZXRQcm9jZXNzSW5mbyBmdW5jdGlvbi5cbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcbiAgbGV0IHNpemVEaWZmOiB1MzIgPSBtYXhMZW5ndGggLSBtaW5MZW5ndGg7XG4gIFxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpIC0gZjMyKHNpemVEaWZmKTtcblxuICBsZXQgc2ltTWF0cml4ID0gJihzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fSk7IC8vIHVzaW5nIHBvaW50ZXJzIG1ha2UgdGhpbmdzIGZhc3RlclxuICB2YXIgZGlmZjogZjMyID0gMC4wO1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke19tYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgICBkaWZmID0gZGlmZiArIDEuMCAtICgqc2ltTWF0cml4KVt1MzIoYVtpXSldW3UzMihiW2ldKV07XG4gICAgICBpZiAoZGlmZiA+IG1heEludERpc3RhbmNlKSB7XG4gICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICB9XG4gIH1cbiAgZGlmZiArPSBmMzIoc2l6ZURpZmYpO1xuICByZXR1cm4gZGlmZiAvICR7X21heEFycmF5U2l6ZX07XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVTGV2ZW5zdGVpbihtYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBsZXQgbWF4TGVuZ3RoOiB1MzIgPSBtYXgoYUxlbmd0aCwgYkxlbmd0aCk7XG4gIGxldCBtaW5MZW5ndGg6IHUzMiA9IG1pbihhTGVuZ3RoLCBiTGVuZ3RoKTtcblxuICBsZXQgbWF4SW50RGlzdGFuY2UgPSBjZWlsKG1heERpc3RhbmNlICogZjMyKG1heExlbmd0aCkpO1xuXG4gIC8vIHdlIHdpbGwgc3RvcmUgdHdvIGFycmF5cyBhcyBtYXRyaXggYW5kIHN3YXAgdGhlIHdvcmtpbmcgaW5kaWNlcyBwZXIgcGFzcy5cbiAgLy8gdGhpcyB3YXkgd2UgY2FuIHJlZHVjZSBtZW1vcnkgdXNhZ2UgcGVyIGNvbXB1dGF0aW9uIHRvIGp1c3QgTyhhTGVuZ3RoKVxuICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAvLyB0aGlzIHdpbGwgYmUgZ3VhcmFudGVlZCBieSBpdGVyYXRpb24sIGJ1dCB0aGUgYXJyYXkgc2l6ZXMgbXVzdCBiZSBrbm93biBhdCBjb21waWxlIHRpbWUsIHNvIHdlIHdpbGwgdXNlIGEgZml4ZWQgc2l6ZSBvZiBtYXhBcnJheVNpemVcbiAgdmFyIGR5bmFtaWNQYXNzTWF0OiBhcnJheTxhcnJheTxmMzIsICR7bWF4QXJyYXlTaXplICsgMX11PiwgMj47IC8vIGluaXRpYWxpemUgdG8gMFxuICBcbiAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgdmFyIGN1ckluZGV4OiB1MzIgPSAxOyAvLyB3ZSB3aWxsIHN3YXAgdGhlc2UgaW5kaWNlcyBwZXIgcGFzc1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICBmb3IgKHZhciBpID0gMHU7IGkgPD0gYUxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XVtpXSA9IGYzMihpKTtcbiAgfVxuXG4gIC8vIGl0ZXJhdGUgb3ZlciB0aGUgcm93c1xuICBmb3IgKHZhciBpID0gMXU7IGkgPD0gYkxlbmd0aDsgaSA9IGkgKyAxdSkge1xuICAgICAgZHluYW1pY1Bhc3NNYXRbY3VySW5kZXhdWzBdID0gZjMyKGkpO1xuICAgICAgdmFyIG1pbkVudHJ5OiBmMzIgPSBmMzIobWF4TGVuZ3RoKTtcbiAgICAgIGxldCBwcmV2Um93ID0gJmR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF07XG4gICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgIGxldCBiTW9uID0gdTMyKGJbaSAtIDFdKTtcbiAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgdmFyIGNvc3Q6IGYzMiA9IGYzMihhW2ogLSAxXSAhPSBiTW9uKTtcbiAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgIG1pbihcbiAgICAgICAgICAgICAgICAoKnByZXZSb3cpW2pdICsgMS4wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICgqY3VyUm93KVtqIC0gMV0gKyAxLjAsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAoKnByZXZSb3cpW2ogLSAxXSArIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICgqY3VyUm93KVtqXSA9IHJlcztcbiAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgbWluRW50cnkgPSByZXM7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gc3dhcCB0aGUgaW5kaWNlc1xuICAgICAgbGV0IHRlbXA6IHUzMiA9IHByZXZJbmRleDtcbiAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgY3VySW5kZXggPSB0ZW1wO1xuICAgICAgaWYgKG1pbkVudHJ5ID4gbWF4SW50RGlzdGFuY2UpIHtcbiAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgfVxuICB9XG5cbiAgcmV0dXJuIGR5bmFtaWNQYXNzTWF0W3ByZXZJbmRleF1bYUxlbmd0aF0gLyBmMzIobWF4TGVuZ3RoKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gobWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gdmVyc2lvbiBvZiB0aGUgbGV2ZW5zaHRhaW4gd2hlcmUgdGhlIGNvc3Qgb2Ygc3Vic3RpdHV0aW9uIGlzIGN1c3RvbWl6YWJsZVxuICAgIC8vIGl0IGlzIGFzc3VtZXQgdGhhdCBzdXBwSW5mbyBzdHJ1Y3QgY29udGFpbnMgY29ycmVjdCBtYXRyaXggY2FsbGVkIHNpbWlsYXJpdHlNYXRyaXgke2VudHJ5SW5kZXh9LCAoc2ltaWxhcml0eU1hdHJpeDAsIHNpbWlsYXJpdHlNYXRyaXgxLCBldGMpXG4gICAgLy8gYW5kIGdhcE9wZW5QZW5hbHR5LCBnYXBFeHRlbnNpb25QZW5hbHR5XG4gICAgLy8gdGhpcyBzaG91bGQgYmUgZ3VhcmFudGVlZCBieSB0aGUgZ2V0UHJvY2Vzc0luZm8gZnVuY3Rpb24uXG4gICAgcmV0dXJuIGBcbiAgICAgIGxldCBhTGVuZ3RoOiB1MzIgPSBjb21wdXRlSW5mby5lbnRyeVNpemVzWyR7ZW50cnlJbmRleH1dW2FJbmRleF07XG4gICAgICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICAgICAgbGV0IG1heExlbmd0aDogdTMyID0gbWF4KGFMZW5ndGgsIGJMZW5ndGgpO1xuICAgICAgbGV0IG1pbkxlbmd0aDogdTMyID0gbWluKGFMZW5ndGgsIGJMZW5ndGgpO1xuICBcbiAgICAgIGxldCBtYXhJbnREaXN0YW5jZSA9IGNlaWwobWF4RGlzdGFuY2UgKiBmMzIobWF4TGVuZ3RoKSk7XG4gICAgICAvLyB3ZSB3aWxsIHN0b3JlIHR3byBhcnJheXMgYXMgbWF0cml4IGFuZCBzd2FwIHRoZSB3b3JraW5nIGluZGljZXMgcGVyIHBhc3MuXG4gICAgICAvLyB0aGlzIHdheSB3ZSBjYW4gcmVkdWNlIG1lbW9yeSB1c2FnZSBwZXIgY29tcHV0YXRpb24gdG8ganVzdCBPKGFMZW5ndGgpXG4gICAgICAvLyB0aGUgZ3JpZCB3aWxsIGhhdmUgYUxlbmd0aCArIDEgY29sdW1ucyBhbmQgYkxlbmd0aCArIDEgcm93c1xuICAgICAgLy8gdGhpcyB3aWxsIGJlIGd1YXJhbnRlZWQgYnkgaXRlcmF0aW9uLCBidXQgdGhlIGFycmF5IHNpemVzIG11c3QgYmUga25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSB3aWxsIHVzZSBhIGZpeGVkIHNpemUgb2YgbWF4QXJyYXlTaXplXG4gICAgICB2YXIgZHluYW1pY1Bhc3NNYXQ6IGFycmF5PGFycmF5PGYzMiwgJHttYXhBcnJheVNpemUgKyAxfXU+LCAyPjsgLy8gaW5pdGlhbGl6ZSB0byAwXG4gICAgICBcbiAgICAgIC8vIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvcGVyYXRpb24gbGVkIHRvIHRoZSBjdXJyZW50IGNlbGxcbiAgICAgIC8vIGkuZS4gd2hldGhlciB3ZSBjYW1lIGZyb20gdGhlIGxlZnQsIHRvcCBvciBkaWFnb25hbCB0byBhc3NpZ24gZ2FwIG9wZW4vZ2FwIGV4dGVuZCBwZW5hbHR5XG4gICAgICB2YXIgdmVydGljYWxHYXBzOiBhcnJheTx1MzIsICR7bWF4QXJyYXlTaXplICsgMX11PjtcbiAgICAgIHZhciBob3Jpem9udGFsR2FwczogYXJyYXk8dTMyLCAke21heEFycmF5U2l6ZSArIDF9dT47XG5cbiAgICAgIGxldCBnYXBPcGVuUGVuYWx0eTogZjMyID0gc3VwcEluZm8uZ2FwT3BlblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgbGV0IGdhcEV4dGVuc2lvblBlbmFsdHk6IGYzMiA9IHN1cHBJbmZvLmdhcEV4dGVuc2lvblBlbmFsdHkke2VudHJ5SW5kZXh9O1xuICAgICAgdmFyIHByZXZJbmRleDogdTMyID0gMDtcbiAgICAgIHZhciBjdXJJbmRleDogdTMyID0gMTsgLy8gd2Ugd2lsbCBzd2FwIHRoZXNlIGluZGljZXMgcGVyIHBhc3NcbiAgICAgIC8vIGluaXRpYWxpemUgdGhlIGZpcnN0IHJvd1xuICAgICAgZm9yICh2YXIgaSA9IDB1OyBpIDw9IGFMZW5ndGg7IGkgPSBpICsgMXUpIHtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2ldID0gZ2FwT3BlblBlbmFsdHkgKyBmMzIoaSAtIDEpICogZ2FwRXh0ZW5zaW9uUGVuYWx0eTtcbiAgICAgICAgICBkeW5hbWljUGFzc01hdFtjdXJJbmRleF1baV0gPSAwLjA7XG4gICAgICB9XG4gICAgICBkeW5hbWljUGFzc01hdFswXVswXSA9IDAuMDtcblxuICAgICAgbGV0IHNpbU1hdHJpeCA9ICZzdXBwSW5mby5zaW1pbGFyaXR5TWF0cml4JHtlbnRyeUluZGV4fTsgLy8gdXNpbmcgcG9pbnRlcnMgbWFrZSB0aGluZ3MgZmFzdGVyXG4gICAgICAvLyBpdGVyYXRlIG92ZXIgdGhlIHJvd3NcbiAgICAgIGZvciAodmFyIGkgPSAxdTsgaSA8PSBiTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgICAgICAgbGV0IHByZXZSb3cgPSAmZHluYW1pY1Bhc3NNYXRbcHJldkluZGV4XTtcbiAgICAgICAgICBsZXQgY3VyUm93ID0gJmR5bmFtaWNQYXNzTWF0W2N1ckluZGV4XTtcbiAgICAgICAgICAoKmN1clJvdylbMF0gPSBnYXBPcGVuUGVuYWx0eSArIGYzMihpIC0gMSkgKiBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgIHZhciBtaW5FbnRyeTogZjMyID0gZjMyKG1heExlbmd0aCk7XG4gICAgICAgICAgbGV0IG1vbkIgPSB1MzIoYltpIC0gMV0pO1xuICAgICAgICAgIGZvciAodmFyIGogPSAxdTsgaiA8PSBhTGVuZ3RoOyBqID0gaiArIDF1KSB7XG4gICAgICAgICAgICAgIGxldCBtb25BID0gdTMyKGFbaiAtIDFdKTtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIGxldCBjb3N0OiBmMzIgPSAoKnByZXZSb3cpW2ogLSAxXSArIDFmIC0gKCpzaW1NYXRyaXgpW21vbkFdW21vbkJdO1xuICAgICAgICAgICAgICB2YXIgdG9wID0gKCpwcmV2Um93KVtqXTsgLy8gZGVsZXRpb25cbiAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsR2Fwc1tqXSA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRvcCA9IHRvcCArIGdhcEV4dGVuc2lvblBlbmFsdHk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0b3AgPSB0b3AgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgbGVmdCA9ICgqY3VyUm93KVtqIC0gMV07IC8vIGluc2VydGlvblxuICAgICAgICAgICAgICBpZiAoaG9yaXpvbnRhbEdhcHNbaiAtIDFdID4gMCkge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBFeHRlbnNpb25QZW5hbHR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQgKyBnYXBPcGVuUGVuYWx0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YXIgcmVzOiBmMzIgPSBtaW4oXG4gICAgICAgICAgICAgICAgICBtaW4oXG4gICAgICAgICAgICAgICAgICAgICAgdG9wLCAvLyBkZWxldGlvblxuICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIC8vIGluc2VydGlvblxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgIGNvc3QgLy8gc3Vic3RpdHV0aW9uXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgKCpjdXJSb3cpW2pdID0gcmVzO1xuICAgICAgICAgICAgICBpZiAocmVzIDwgbWluRW50cnkpIHtcbiAgICAgICAgICAgICAgICAgIG1pbkVudHJ5ID0gcmVzO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgZ2Fwc1xuICAgICAgICAgICAgICBpZiAocmVzID09IGNvc3QpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzID09IGxlZnQpIHtcbiAgICAgICAgICAgICAgICAgIHZlcnRpY2FsR2Fwc1tqXSA9IDA7XG4gICAgICAgICAgICAgICAgICBob3Jpem9udGFsR2Fwc1tqXSA9IDE7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEdhcHNbal0gPSAxO1xuICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbEdhcHNbal0gPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHN3YXAgdGhlIGluZGljZXNcbiAgICAgICAgICBsZXQgdGVtcDogdTMyID0gcHJldkluZGV4O1xuICAgICAgICAgIHByZXZJbmRleCA9IGN1ckluZGV4O1xuICAgICAgICAgIGN1ckluZGV4ID0gdGVtcDtcbiAgICAgICAgICBpZiAobWluRW50cnkgPiBtYXhJbnREaXN0YW5jZSkge1xuICAgICAgICAgICAgICByZXR1cm4gMS4wO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBkeW5hbWljUGFzc01hdFtwcmV2SW5kZXhdW2FMZW5ndGhdIC8gZjMyKG1heExlbmd0aCk7XG4gIFxuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVUV1Y2xpZGVhbihtYXhBcnJheVNpemUsIF9lbnRyeUluZGV4KSB7XG4gICAgcmV0dXJuIGBcbiAgdmFyIGRpc3Q6IGYzMiA9IDAuMDtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9OyBpID0gaSArIDF1KSB7XG4gICAgZGlzdCA9IGRpc3QgKyBmMzIoYVtpXSAtIGJbaV0pICogZjMyKGFbaV0gLSBiW2ldKTtcbiAgfVxuICByZXR1cm4gc3FydChkaXN0KTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVNYW5oYXR0YW4obWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBkaXN0OiBmMzIgPSAwLjA7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfTsgaSA9IGkgKyAxdSkge1xuICAgIGRpc3QgPSBkaXN0ICsgYWJzKGYzMihhW2ldIC0gYltpXSkpO1xuICB9XG4gIHJldHVybiBkaXN0O1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU9uZUhvdERpc3RhbmNlKF9tYXhBcnJheVNpemUsIGVudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICBsZXQgYUxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVthSW5kZXhdO1xuICBsZXQgYkxlbmd0aDogdTMyID0gY29tcHV0ZUluZm8uZW50cnlTaXplc1ske2VudHJ5SW5kZXh9XVtiSW5kZXhdO1xuICBpZiAoYUxlbmd0aCAhPSBiTGVuZ3RoKSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICBmb3IgKHZhciBpID0gMHU7IGkgPCBhTGVuZ3RoOyBpID0gaSArIDF1KSB7XG4gICAgaWYoYVtpXSAhPSBiW2ldKSB7XG4gICAgICByZXR1cm4gMS4wO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMC4wO1xuICBgO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVU51bWVyaWNEaXN0YW5jZShfbWF4QXJyYXlTaXplLCBlbnRyeUluZGV4KSB7XG4gICAgLy8gd2UgYXNzdW1lIHRoYXQgcmFuZ2Uke2VudHJ5SW5kZXh9IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3VwcGxlbWVudGFyeUluZm8gc3RydWN0XG4gICAgcmV0dXJuIGBcbiAgICBsZXQgcmFuZ2UgPSBzdXBwSW5mby5yYW5nZSR7ZW50cnlJbmRleH07XG4gICAgcmV0dXJuIGYzMihhYnMoZjMyKGFbMF0pIC0gZjMyKGJbMF0pKSAvIHJhbmdlKTtcbiAgYDtcbn1cbi8vIHRhbmltb3RvIGRpc3RhbmNlIGZvciB1aW50MzIgYXJyYXlzIG9mIGxlbmd0aCAke21heEFycmF5U2l6ZX1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVUYW5pbW90b0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuXG4gIGlmIChvbkJpdHNhID09IDB1ICYmIG9uQml0c2IgPT0gMHUpIHtcbiAgICAgIHJldHVybiAwLjA7XG4gIH1cblxuICBsZXQgdG90YWxPbkJpdHMgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgdmFyIGNvbW1vbkJpdHM6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBjb21tb25CaXRzID0gY29tbW9uQml0cyArIGNvdW50T25lQml0cyhhW2ldICYgYltpXSk7XG4gIH1cblxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsT25CaXRzIC0gY29tbW9uQml0cyk7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQXN5bW1ldHJpY0JpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgbWluID0gbWluKG9uQml0c2EsIG9uQml0c2IpO1xuICBpZiAobWluID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKG1pbik7XG4gIGA7XG59XG5leHBvcnQgZnVuY3Rpb24gd2ViR1BVQ29zaW5lQml0QXJyYXkobWF4QXJyYXlTaXplLCBfZW50cnlJbmRleCkge1xuICAgIHJldHVybiBgXG4gIHZhciBvbkJpdHNhOiB1MzIgPSAwdTtcbiAgdmFyIG9uQml0c2I6IHUzMiA9IDB1O1xuICBmb3IgKHZhciBpID0gMHU7IGkgPCAke21heEFycmF5U2l6ZX11OyBpID0gaSArIDF1KSB7XG4gICAgICBvbkJpdHNhID0gb25CaXRzYSArIGNvdW50T25lQml0cyhhW2ldKTtcbiAgICAgIG9uQml0c2IgPSBvbkJpdHNiICsgY291bnRPbmVCaXRzKGJbaV0pO1xuICB9XG4gIGxldCB0b3RhbCA9IG9uQml0c2EgKiBvbkJpdHNiOyAvLyBwLnMuIGhlcmUgdG90YWwgaXMgdGFrZW4gYnkgbXVsdGlwbHlpbmdcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gc3FydChmMzIodG90YWwpKTtcbiAgYDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB3ZWJHUFVTb2thbEJpdEFycmF5KG1heEFycmF5U2l6ZSwgX2VudHJ5SW5kZXgpIHtcbiAgICByZXR1cm4gYFxuICB2YXIgb25CaXRzYTogdTMyID0gMHU7XG4gIHZhciBvbkJpdHNiOiB1MzIgPSAwdTtcbiAgZm9yICh2YXIgaSA9IDB1OyBpIDwgJHttYXhBcnJheVNpemV9dTsgaSA9IGkgKyAxdSkge1xuICAgICAgb25CaXRzYSA9IG9uQml0c2EgKyBjb3VudE9uZUJpdHMoYVtpXSk7XG4gICAgICBvbkJpdHNiID0gb25CaXRzYiArIGNvdW50T25lQml0cyhiW2ldKTtcbiAgfVxuICBsZXQgdG90YWwgPSBvbkJpdHNhICsgb25CaXRzYjtcbiAgaWYgKHRvdGFsID09IDB1KSB7XG4gICAgcmV0dXJuIDEuMDtcbiAgfVxuICB2YXIgY29tbW9uQml0czogdTMyID0gMHU7XG4gIGZvciAodmFyIGkgPSAwdTsgaSA8ICR7bWF4QXJyYXlTaXplfXU7IGkgPSBpICsgMXUpIHtcbiAgICAgIGNvbW1vbkJpdHMgPSBjb21tb25CaXRzICsgY291bnRPbmVCaXRzKGFbaV0gJiBiW2ldKTtcbiAgfVxuICByZXR1cm4gMS4wIC0gZjMyKGNvbW1vbkJpdHMpIC8gZjMyKHRvdGFsICogMiAtIGNvbW1vbkJpdHMgKiAzKTtcbiAgYDtcbn1cbmV4cG9ydCB2YXIgV0VCR1BVRElTVEFOQ0U7XG4oZnVuY3Rpb24gKFdFQkdQVURJU1RBTkNFKSB7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJIQU1NSU5HXCJdID0gXCJIYW1taW5nXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJFVUNMSURFQU5cIl0gPSBcIkV1Y2xpZGVhblwiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTUFOSEFUVEFOXCJdID0gXCJNYW5oYXR0YW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIlRBTklNT1RPXCJdID0gXCJUYW5pbW90b1wiO1xuICAgIFdFQkdQVURJU1RBTkNFW1wiTEVWRU5TVEVJTlwiXSA9IFwiTGV2ZW5zaHRlaW5cIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIk5FRURMRU1BTl9XVU5TQ0hcIl0gPSBcIk5lZWRsZW1hbm4tV3Vuc2NoXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFXCJdID0gXCJNb25vbWVyIGNoZW1pY2FsIGRpc3RhbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJTT0tBTFwiXSA9IFwiU29rYWxcIjtcbiAgICBXRUJHUFVESVNUQU5DRVtcIkNPU0lORVwiXSA9IFwiQ29zaW5lXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJBU1lNTUVUUklDXCJdID0gXCJBc3ltbWV0cmljXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJEaWZmZXJlbmNlXCJdID0gXCJEaWZmZXJlbmNlXCI7XG4gICAgV0VCR1BVRElTVEFOQ0VbXCJPbmVIb3RcIl0gPSBcIk9uZS1Ib3RcIjtcbn0pKFdFQkdQVURJU1RBTkNFIHx8IChXRUJHUFVESVNUQU5DRSA9IHt9KSk7XG5leHBvcnQgY29uc3Qgd2ViR1BVRnVuY3Rpb25zID0ge1xuICAgIFtXRUJHUFVESVNUQU5DRS5IQU1NSU5HXTogd2ViR1BVSGFtbWluZyxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOXTogd2ViR1BVRXVjbGlkZWFuLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiB3ZWJHUFVNYW5oYXR0YW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLlRBTklNT1RPXTogd2ViR1BVVGFuaW1vdG9CaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTl06IHdlYkdQVUxldmVuc3RlaW4sXG4gICAgW1dFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0hdOiB3ZWJHUFVOZWVkbGVtYW5XdW5zY2gsXG4gICAgW1dFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0VdOiB3ZWJHUFVNb25vbWVyQ2hlbWljYWxEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuU09LQUxdOiB3ZWJHUFVTb2thbEJpdEFycmF5LFxuICAgIFtXRUJHUFVESVNUQU5DRS5DT1NJTkVdOiB3ZWJHUFVDb3NpbmVCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IHdlYkdQVUFzeW1tZXRyaWNCaXRBcnJheSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV06IHdlYkdQVU51bWVyaWNEaXN0YW5jZSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogd2ViR1BVT25lSG90RGlzdGFuY2Vcbn07XG5leHBvcnQgY29uc3QgZGlzdGFuY2VGdW5jdGlvbkNvbXBsZXhpdHkgPSB7XG4gICAgW1dFQkdQVURJU1RBTkNFLkhBTU1JTkddOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5FVUNMSURFQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplIC8gMzApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5UQU5JTU9UT106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLlNPS0FMXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQ09TSU5FXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuQVNZTU1FVFJJQ106IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyA2MCksXG4gICAgW1dFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU5dOiAobWF4RW50cnlTaXplKSA9PiBNYXRoLmNlaWwobWF4RW50cnlTaXplICogbWF4RW50cnlTaXplIC8gNjApLFxuICAgIFtXRUJHUFVESVNUQU5DRS5ORUVETEVNQU5fV1VOU0NIXTogKG1heEVudHJ5U2l6ZSkgPT4gTWF0aC5jZWlsKG1heEVudHJ5U2l6ZSAqIG1heEVudHJ5U2l6ZSAvIDYwKSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRV06IChtYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChtYXhFbnRyeVNpemUgLyAyNSksXG4gICAgW1dFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdOiAoX21heEVudHJ5U2l6ZSkgPT4gMSxcbiAgICBbV0VCR1BVRElTVEFOQ0UuT25lSG90XTogKF9tYXhFbnRyeVNpemUpID0+IE1hdGguY2VpbChfbWF4RW50cnlTaXplIC8gNDApLFxufTtcbmV4cG9ydCBjb25zdCBUeXBlU3VwcG9ydGVkRGlzdGFuY2VzID0ge1xuICAgIFtcIlNUUklOR1wiIC8qIFdHUFVFTlRSWVRZUEUuU1RSSU5HICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuTEVWRU5TVEVJTiwgV0VCR1BVRElTVEFOQ0UuTkVFRExFTUFOX1dVTlNDSCwgV0VCR1BVRElTVEFOQ0UuTU9OT01FUl9DSEVNSUNBTF9ESVNUQU5DRSwgV0VCR1BVRElTVEFOQ0UuT25lSG90XSksXG4gICAgW1wiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuSEFNTUlORywgV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UsIFdFQkdQVURJU1RBTkNFLkxFVkVOU1RFSU4sIFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0gsIFdFQkdQVURJU1RBTkNFLlRBTklNT1RPLCBXRUJHUFVESVNUQU5DRS5DT1NJTkUsIFdFQkdQVURJU1RBTkNFLlNPS0FMLCBXRUJHUFVESVNUQU5DRS5BU1lNTUVUUklDLCBXRUJHUFVESVNUQU5DRS5PbmVIb3QsIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLk9uZUhvdCwgV0VCR1BVRElTVEFOQ0UuRGlmZmVyZW5jZV0pLFxuICAgIFtcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuRVVDTElERUFOLCBXRUJHUFVESVNUQU5DRS5NQU5IQVRUQU4sIFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2VdKSxcbiAgICBbXCJOVU1CRVJcIiAvKiBXR1BVRU5UUllUWVBFLk5VTUJFUiAqL106IG5ldyBTZXQoW1dFQkdQVURJU1RBTkNFLkVVQ0xJREVBTiwgV0VCR1BVRElTVEFOQ0UuTUFOSEFUVEFOLCBXRUJHUFVESVNUQU5DRS5EaWZmZXJlbmNlXSksXG4gICAgW1wiQklUQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkJJVEFSUkFZICovXTogbmV3IFNldChbV0VCR1BVRElTVEFOQ0UuVEFOSU1PVE8sIFdFQkdQVURJU1RBTkNFLkNPU0lORSwgV0VCR1BVRElTVEFOQ0UuU09LQUwsIFdFQkdQVURJU1RBTkNFLkFTWU1NRVRSSUNdKVxufTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5sZXQgZ3B1QWRhcHRlciA9IG51bGw7XG5sZXQgZ3B1RGV2aWNlID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVEZXZpY2UoKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvL3JlYXNvbjogb25seSBoZXJlIHdlIGdldCB0aGUgZ3B1QWRhcHRlclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4XG4gICAgICAgICAgICBncHVBZGFwdGVyID0geWllbGQgbmF2aWdhdG9yLmdwdS5yZXF1ZXN0QWRhcHRlcih7IHBvd2VyUHJlZmVyZW5jZTogJ2hpZ2gtcGVyZm9ybWFuY2UnIH0pO1xuICAgICAgICAgICAgaWYgKGdwdUFkYXB0ZXIgPT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaXNMb3N0ID0gZmFsc2U7XG4gICAgICAgIGlmIChncHVEZXZpY2UpIHtcbiAgICAgICAgICAgIGdwdURldmljZS5sb3N0LnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlzTG9zdCA9IHRydWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHlpZWxkIG5ldyBQcm9taXNlKChyKSA9PiBzZXRUaW1lb3V0KHIsIDEwKSk7IC8vIHdhaXQgdG8gc2VlIGlmIHRoZSBkZXZpY2UgaXMgbG9zdFxuICAgICAgICB9XG4gICAgICAgIGlmICghZ3B1RGV2aWNlIHx8IGlzTG9zdCkge1xuICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRCdWZmZXJTaXplID0gMTAwMDAwMDAwMDsgLy8gfjEwMDBNQlxuICAgICAgICAgICAgY29uc3QgYWRhcHRlckxpbWl0cyA9IGdwdUFkYXB0ZXIubGltaXRzO1xuICAgICAgICAgICAgY29uc3QgYnVmZmZlclNpemVMaW1pdCA9IGFkYXB0ZXJMaW1pdHMubWF4QnVmZmVyU2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IHN0b3JhZ2VCdWZmZXJTaXplTGltaXQgPSBhZGFwdGVyTGltaXRzLm1heFN0b3JhZ2VCdWZmZXJCaW5kaW5nU2l6ZTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZ3B1RGV2aWNlID0geWllbGQgZ3B1QWRhcHRlci5yZXF1ZXN0RGV2aWNlKHsgcmVxdWlyZWRMaW1pdHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1heEJ1ZmZlclNpemU6IE1hdGgubWluKGJ1ZmZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTdG9yYWdlQnVmZmVyQmluZGluZ1NpemU6IE1hdGgubWluKHN0b3JhZ2VCdWZmZXJTaXplTGltaXQsIHJlcXVpcmVkQnVmZmVyU2l6ZSlcbiAgICAgICAgICAgICAgICAgICAgfSB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3B1RGV2aWNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIGRldmljZSB3aXRoIHJlcXVpcmVkIGxpbWl0cycsIGUpO1xuICAgICAgICAgICAgICAgIGdwdURldmljZSA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdERldmljZSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBncHVEZXZpY2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdwdURldmljZTtcbiAgICB9KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRHUFVBZGFwdGVyRGVzY3JpcHRpb24oKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgaWYgKCFncHVBZGFwdGVyKSB7XG4gICAgICAgICAgICAvLyByZWFzb246IG9ubHkgaGVyZSB3ZSBnZXQgdGhlIGdwdUFkYXB0ZXJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheFxuICAgICAgICAgICAgZ3B1QWRhcHRlciA9IHlpZWxkIG5hdmlnYXRvci5ncHUucmVxdWVzdEFkYXB0ZXIoKTtcbiAgICAgICAgICAgIGlmIChncHVBZGFwdGVyID09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5mbyA9IHlpZWxkIGdwdUFkYXB0ZXIucmVxdWVzdEFkYXB0ZXJJbmZvKCk7XG4gICAgICAgIGlmICghaW5mbylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBvdXRTdHJpbmcgPSByZXBsYWNlRW1wdHlTdHJpbmcoaW5mby5kZXNjcmlwdGlvbiwgcmVwbGFjZUVtcHR5U3RyaW5nKGluZm8udmVuZG9yLCAnTm8gR1BVIGRlc2NyaXB0aW9uIGF2YWlsYWJsZScpKTtcbiAgICAgICAgcmV0dXJuIG91dFN0cmluZztcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHJlcGxhY2VFbXB0eVN0cmluZyhzdHIsIHJlcGxhY2VtZW50KSB7XG4gICAgcmV0dXJuICFzdHIgfHwgc3RyID09ICcnID8gcmVwbGFjZW1lbnQgOiBzdHI7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRHUFVEZXZpY2UuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBXRUJHU0xBR0dSRUdBVElPTiwgV0VCR1NMQUdHUkVHQVRJT05GVU5DVElPTlMsIH0gZnJvbSAnLi4vbXVsdGktY29sLWRpc3RhbmNlcy93ZWJHUFUtYWdncmVnYXRpb24nO1xuaW1wb3J0IHsgV0VCR1BVRElTVEFOQ0UsIHdlYkdQVUZ1bmN0aW9ucywgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMnO1xuaW1wb3J0IHsgd2ViR1BVUHJvY2Vzc0luZm8gfSBmcm9tICcuLi9wcmVwcm9jZXNzaW5nL3dlYkdQVS1wcm9jZXNzLWluZm8nO1xuaW1wb3J0IHsgZ2V0R1BVRGV2aWNlIH0gZnJvbSAnLi4vZ2V0R1BVRGV2aWNlJztcbi8qKiBnZW5lcmF0ZSBzcGFyc2UgbWF0cml4IGJhc2VkIG9uIGxpc3Qgb2YgbGlzdHMgb2YgZW50cmllcy5cbiAqICB0aGVzZSBlbnRyaWVzIGFyZSBlYWNoIGVuY29kZWQgYXMgVWludDMyQXJyYXkgb3IgRkxPQVQzMkFycmF5IChkZXBlbmRpbmcgb24gdGhlaXIgdHlwZSkuXG4gKiBmb3IgZXhhbXBsZSwgc2VxdWVuY2VzIHdvdWxkIGJlIGVuY29kZWQgYXMgVWludDMyQXJyYXkgYmFzZWQgb24gY2hhciBjb2RlIG9mIHRoZSBsZXR0ZXIgYXQgZWFjaCBwb3NpdGlvbi5cbiAqIFs2NSwgNjYsIDY3LCA2OCwgNjldIHdvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgNSBsZXR0ZXJzLlxuICogZm9yIGNoZW1pY2FsIGZpbmdlcnByaW50cywgaXQgd291bGQgYmUgYSBiaW5hcnkgYXJyYXkgb2YgMHMgYW5kIDFzLFxuICogcmVwcmVzZW50ZWQgYXMgVWludDMyQXJyYXkoX2RhdGEgcHJvcGVydHkgb2YgREcgYml0YXJyYXkpLlxuICpcbiAqIEJlIHdhcmUgdGhhdCBzaXplIG9mIGVudHJ5TGlzdCwgZGlzdGFuY2VNZXRyaWNzLCB3ZWlnaHRzIGFuZCBvcHRpb25zIG11c3QgYmUgdGhlIHNhbWUuXG4gKiBpZiB0aGVyZSBhcmUgbm8gb3B0aW9ucyBmb3IgZW50cmllcyBpLCBwYXNzIGFuIGVtcHR5IG9iamVjdC5cbiAqIGZvciBub3cgb3B0aW9ucyBhcmUgbmVlZGVkIGZvclxuICogbmVlZGxlbWFuLXd1bnNjaCBhbmQgbW9ub21lciBjaGVtaWNhbCBkaXN0YW5jZXM6IHNlZSB7QGxpbmsgQmlvRGlzdGFuY2VGbk9wdGlvbnN9IGFzIGZvciBob3cgaXQgc2hvdWxkIGJlIHBhc3NlZFxuICogbnVtZXJpYyBkaXN0YW5jZXMgKERpZmZlcmVuY2UpOiB7cmFuZ2U6IG51bWJlcn0gd2hlcmUgcmFuZ2UgaXMgdGhlIHJhbmdlIG9mIHRoZSB2YWx1ZXMgaW4gdGhlIGNvbHVtbiAobWF4IC0gbWluKS5cbiAqIGluIGJvdGggY2FzZXMsIGlmIG9wdGlvbnMgYXJlIG5vdCBwcm92aWRlZCwgdGhleSB3aWxsIGJlIGNhbGN1bGF0ZWQgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpQ29sV2ViR1BVU3BhcnNlTWF0cml4KGVudHJ5TGlzdCwgLy8gbGlzdCBvZiBsaXN0cyBvZiBlbnRyaWVzLCBmb3IgbXVsdGlwbGUgY29sdW1uc1xudGhyZXNob2xkID0gMC44LCAvLyBzaW1pbGFyaXR5IHRocmVzaG9sZCwgYmUgd2FyZSB0aGF0IGlmIHlvdSB1c2UgdG9vIHNtYWxsIHRocmVzaG9sZCwgdGhlcmUgbWlnaHQgYmUgbWVtb3J5IG92ZXJmbG93Li4uXG5kaXN0YW5jZU1ldHJpY3MsIC8vIGRpc3RhbmNlIG1ldHJpY3MgZm9yIGVhY2ggY29sdW1uXG5hZ2dyZWdhdGlvbkZ1bmN0aW9uLCAvLyBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGRpc3RhbmNlc1xud2VpZ2h0cywgLy8gd2VpZ2h0cyBmb3IgZWFjaCBjb2x1bW5cbm9wdGlvbnMgLy8gc3VwcGxlbWVudGFyeSBvcHRpb25zIGZvciBlYWNoIGNvbHVtblxuKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgZGV2aWNlID0geWllbGQgZ2V0R1BVRGV2aWNlKCk7XG4gICAgICAgIGlmICghZGV2aWNlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGlmIG5vIGRldmljZSwgcmV0dXJuIG51bGwsIGFzIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB3aXRob3V0IGl0LlxuICAgICAgICBjb25zdCBhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MgPSBPYmplY3QudmFsdWVzKFdFQkdQVURJU1RBTkNFKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlTWV0cmljcy5zb21lKChtZXRyaWMpID0+ICFhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MuaW5jbHVkZXMobWV0cmljKSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZGlzdGFuY2UgbWV0cmljcyBwcm92aWRlZDogJyArIGRpc3RhbmNlTWV0cmljcy5qb2luKCcsICcpKTtcbiAgICAgICAgY29uc3QgYXZhaWxhYmxlQWdncmVnYXRpb25GdW5jdGlvbnMgPSBPYmplY3QudmFsdWVzKFdFQkdTTEFHR1JFR0FUSU9OKTtcbiAgICAgICAgaWYgKCFhdmFpbGFibGVBZ2dyZWdhdGlvbkZ1bmN0aW9ucy5pbmNsdWRlcyhhZ2dyZWdhdGlvbkZ1bmN0aW9uKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBhZ2dyZWdhdGlvbiBmdW5jdGlvbiBwcm92aWRlZDogJyArIGFnZ3JlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgICBjb25zdCBtYXhEaXN0YW5jZSA9IDEgLSB0aHJlc2hvbGQ7IC8vIG1heGltdW0gZGlzdGFuY2VcbiAgICAgICAgLy8gZmlyc3QsIGNoZWNrIHRoYXQgYWxsIHRoZSBzdXBwbGVtZW50YXJ5IG9wdGlvbnMgYXJlIHByb3ZpZGVkIGFuZCBhcmUgdGhlIHNhbWUgbGVuZ3RoOlxuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggIT09IGVudHJ5TGlzdC5sZW5ndGggfHxcbiAgICAgICAgICAgIG9wdGlvbnMubGVuZ3RoICE9PSBkaXN0YW5jZU1ldHJpY3MubGVuZ3RoIHx8XG4gICAgICAgICAgICBvcHRpb25zLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3B0aW9ucywgd2VpZ3RocyBhbmQgZGlzdGFuY2UgZnVuY3Rpb25zIG11c3QgYmUgcHJvdmlkZWQgZm9yIGVhY2ggY29sdW1uJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gY2hlY2sgdGhhdCBhbGwgdGhlIGVudHJ5IGxpc3RzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChsaXN0KSA9PiBsaXN0Lmxlbmd0aCAhPT0gZW50cnlMaXN0WzBdLmxlbmd0aCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FsbCBlbnRyeSBsaXN0cyBtdXN0IGJlIHRoZSBzYW1lIGxlbmd0aCcpO1xuICAgICAgICBjb25zdCBudW1PZkNvbHVtbnMgPSBlbnRyeUxpc3QubGVuZ3RoOyAvLyBudW1iZXIgb2YgY29sdW1uc1xuICAgICAgICBjb25zdCBsaXN0U2l6ZSA9IGVudHJ5TGlzdFswXS5sZW5ndGg7IC8vIHNpemUgb2YgZWFjaCBsaXN0IChvciBjb2x1bW4pXG4gICAgICAgIGNvbnN0IHByb2Nlc3NJbmZvID0gZW50cnlMaXN0Lm1hcCgoZW50cnksIGkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB3ZWJHUFVQcm9jZXNzSW5mbyhlbnRyeSwgZGlzdGFuY2VNZXRyaWNzW2ldLCBpLCBvcHRpb25zW2ldKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChudW1PZkNvbHVtbnMgPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gY29sdW1ucyBwcm92aWRlZC4gUGxlYXNlIHByb3ZpZGUgYXQgbGVhc3Qgb25lIGNvbHVtbiBvZiBkYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChudW1PZkNvbHVtbnMgPT09IDEpXG4gICAgICAgICAgICBhZ2dyZWdhdGlvbkZ1bmN0aW9uID0gV0VCR1NMQUdHUkVHQVRJT04uTUFOSEFUVEFOOyAvLyBzYXZlIGEgYml0IG9mIHRpbWVcbiAgICAgICAgLy8gY29tYmluZSBhbGwgc3RydWN0IHR5cGVzIGludG8gb25lIHRvIHB1dCBpbnRvIHRoZSBzdXBwSW5mbyBzdHJ1Y3QuXG4gICAgICAgIGxldCBzdXBwSW5mb1dnc2wgPSBwcm9jZXNzSW5mb1xuICAgICAgICAgICAgLm1hcCgoaW5mbykgPT4gaW5mby5zdXBwSW5mb1N0cnVjdFdnc2wpXG4gICAgICAgICAgICAuZmlsdGVyKCh3Z3NsKSA9PiAhIXdnc2wgJiYgd2dzbCAhPSAnJylcbiAgICAgICAgICAgIC5qb2luKCcsXFxuJyk7XG4gICAgICAgIC8vIHN0cnVjdHVyZXMgaW4gd2dzbCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG1lbWJlciwgc28gaWYgd2UgaGF2ZSBubyBzdHJ1Y3R1cmVzLCB3ZSBuZWVkIHRvIGFkZCBhIGR1bW15IG9uZVxuICAgICAgICBsZXQgbmVlZHNEdW1teSA9IGZhbHNlO1xuICAgICAgICBpZiAoIXN1cHBJbmZvV2dzbCB8fCBzdXBwSW5mb1dnc2wudHJpbSgpID09ICcnKSB7XG4gICAgICAgICAgICBuZWVkc0R1bW15ID0gdHJ1ZTtcbiAgICAgICAgICAgIHN1cHBJbmZvV2dzbCA9ICdcXG5kdW1teTogZjMyXFxuJztcbiAgICAgICAgfVxuICAgICAgICAvLyBjb21iaW5lIGFsbCBkYXRhIHdnc2wgc3RydWN0IGNvZGUgaW50byBvbmVcbiAgICAgICAgY29uc3QgZGF0YVdnc2wgPSBwcm9jZXNzSW5mby5tYXAoKGluZm8pID0+IGluZm8uZGF0YVN0cnVjdFdnc2wpLmZpbHRlcigod2dzbCkgPT4gISF3Z3NsICYmIHdnc2wgIT0gJycpLmpvaW4oJyxcXG4nKTtcbiAgICAgICAgLy8gY29tYmluZSBhbGwgYXJyYXkgc2l6ZXMgaW50byBvbmUgYXJyYXkgKGVhc2llciBmb3Igc2V0dGluZylcbiAgICAgICAgY29uc3QgYXJyYXlTaXplcyA9IG5ldyBVaW50MzJBcnJheShudW1PZkNvbHVtbnMgKiBsaXN0U2l6ZSk7XG4gICAgICAgIHByb2Nlc3NJbmZvLmZvckVhY2goKGluZm8sIGkpID0+IHtcbiAgICAgICAgICAgIGFycmF5U2l6ZXMuc2V0KGluZm8uYXJyYXlTaXplcywgaSAqIGxpc3RTaXplKTtcbiAgICAgICAgfSk7IC8vIGFycmF5LmZsYXQgaXMgbm90IGFzIG9wdGltaXplZCBhcyB0aGlzXG4gICAgICAgIC8vIGlmIHdlIHRyeSB0byBtYXAgbGFyZ2UgYXJyYXlzIGRpcmVjdGx5IGZyb20gR1BVLCBzb21ldGltZXMsIGRldmljZSBkaXNjb25uZWN0cy4gc28gd2UgbmVlZCB0byBkbyBpdCBpbiBjaHVua3MsIGEgZ29vZCBudW1iZXJcbiAgICAgICAgLy8gd2UgZm91bmQgaXMgMTAwMDAuIFNvIHdlIHdpbGwgcGVyZm9ybSBjb21wdXRhdGlvbnMgaW4gY2h1bmtzIG9mIDEwMDAwLiBtZWFuaW5nIHRoYXQgd2Ugd2lsbCBkaXNwYXRjaCAxMDAwMCB0aHJlYWRzIGF0IGEgdGltZS5cbiAgICAgICAgY29uc3QgbnVtT2ZUaHJlYWRzID0gMTAwMDA7XG4gICAgICAgIC8vIGluIHRoaXMgY2FzZSB3ZSBkbyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBjb21wbGV4aXR5IG9mIHRoZSBhbGdvcml0aG0sIGFzIHRoZSAxMDAgaXMgbG93IGVuYXVnaCBudW1iZXIsIHdoaWNoIGlzIGxpbWl0ZWQgYnkgbWVtb3J5IHVzYWdlLlxuICAgICAgICBjb25zdCBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkID0gMTAwOyAvLyBudW1iZXIgb2YgaXRlcmF0aW9ucyBwZXIgdGhyZWFkIChudW1iZXIgb2YgcGFpciBjb21wYXJpc29ucylcbiAgICAgICAgY29uc3QgY29tYmluZWRDb21wbGV4aXR5ID0gcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5jb21wbGV4aXR5LCAwKTsgLy8gY29tYmluZWQgY29tcGxleGl0eSBvZiBhbGwgdGhlIGNvbHVtbnNcbiAgICAgICAgY29uc3QgbWF4SXRlcmF0aW9uc1BlclRocmVhZCA9IE1hdGguY2VpbCgxMDAwMCAvIGNvbWJpbmVkQ29tcGxleGl0eSk7IC8vIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgcGVyIHRocmVhZFxuICAgICAgICBjb25zdCB3b3JrR3JvdXBEaXZpc2lvbiA9IDEwOyAvLyBob3cgbWFueSB0aHJlYWRzIGluc2lkZSBvZiBvbmUgd29ya2dyb3VwIGRpbWVuc2lvbiAoaW4gdGhpcyBjYXNlIDEwICogMTAgdGhyZWFkcyBwZXIgd29ya2dyb3VwKVxuICAgICAgICBjb25zdCB0aHJlYWRzUGVyV29ya2dyb3VwID0gd29ya0dyb3VwRGl2aXNpb24gKiB3b3JrR3JvdXBEaXZpc2lvbjtcbiAgICAgICAgY29uc3Qgd29ya2dyb3Vwc0RpbSA9IE1hdGguY2VpbChNYXRoLnNxcnQoTWF0aC5jZWlsKG51bU9mVGhyZWFkcyAvIHRocmVhZHNQZXJXb3JrZ3JvdXApKSk7IC8vIGhvdyBtYW55IHdvcmtncm91cHMgcGVyIDJkIGRpbWVuc2lvblxuICAgICAgICBjb25zdCBnbG9iYWxUaHJlYWREaW1TaXplID0gd29ya2dyb3Vwc0RpbSAqIHdvcmtHcm91cERpdmlzaW9uOyAvLyBob3cgbWFueSB0aHJlYWRzIHBlciAyZCBkaW1lbnNpb25cbiAgICAgICAgY29uc3QgY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplID0gbGlzdFNpemUgKiAobGlzdFNpemUgLSAxKSAvIDI7IC8vIHNpemUgb2YgdGhlIGNvbmRlbnNlZCBkaXN0YW5jZSBtYXRyaXgsIHRoaXMgbWFueSBjb21wYXJpc29ucyB3aWxsIGJlIG1hZGUuXG4gICAgICAgIGNvbnN0IGRtQ2h1bmtTaXplUGVyVGhyZWFkID0gTWF0aC5jZWlsKGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAvIG51bU9mVGhyZWFkcyk7IC8vIGhvdyBtYW55IGNvbXBhcmlzb25zIHBlciB0aHJlYWRcbiAgICAgICAgY29uc3QgbW9kdWxlID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG4gICAgICAgICAgICBsYWJlbDogJ1NwYXJzZSBtYXRyaXggY29tcHV0ZSBzaGFkZXInLFxuICAgICAgICAgICAgY29kZTogYFxuICAgIC8vIGVhY2ggdGhyZWFkIHdpbGwgcGVyZm9ybSAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9IGl0ZXJhdGlvbnMgYXQgb25lIHRpbWUsIGNvbXBhcmluZyAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9IHBhaXJzIG9mIGVudHJpZXMuXG4gICAgLy8gaW4gdG90YWwsIGVhY2ggdGhyZWFkIHdpbGwgcGVyZm9ybSBhdCBtb3N0ICR7ZG1DaHVua1NpemVQZXJUaHJlYWR9IGNvbXBhcmlzb25zLlxuICAgIC8vIGZpcnN0IGlzIHRoZSByZXN1bHQgc3RydWN0LCBjb250YWluaW5nIGlzLCBqcywgYW5kIGRpc3RhbmNlcy4gZWFjaCBhcnJheSB3aXRoIGxlbmd0aCBvZiAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9LFxuICAgIC8vIGFuZCBhbHNvIGludGVnZXIgZm9yIGhvdyBtYW55IHBhaXJzIHdlcmUgZm91bmQgdG8gYmUgYmVsb3cgdGhyZXNob2xkLlxuICAgIHN0cnVjdCBTcGFyc2VSZXN1bHQge1xuICAgICAgaTogYXJyYXk8YXJyYXk8dTMyLCAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9PiwgJHtudW1PZlRocmVhZHN9PixcbiAgICAgIGo6IGFycmF5PGFycmF5PHUzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBkaXN0YW5jZXM6IGFycmF5PGFycmF5PGYzMiwgJHtzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkfT4sICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBmb3VuZDogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZG9uZTogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+XG4gICAgfVxuICAgIC8vIHN0cnVjdCBmb3IgdGhlIGRhdGFcbiAgICBzdHJ1Y3QgQ29tcHV0ZUluZm8ge1xuICAgICAgLy8gc3RhcnQgYXQgY29scyBhbmQgcm93cywgYW5kIGVuZCBhdCBjb2xzIGFuZCByb3dzIGZvciBlYWNoIHRocmVhZCwgdGhlc2Ugd2lsbCBiZSBjYWxjdWxhdGVkIG9uIGNwdSBhbmQgcGFzc2VkIHRvIGdwdS5cbiAgICAgIHN0YXJ0QXRDb2xzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBzdGFydEF0Um93czogYXJyYXk8dTMyLCAke251bU9mVGhyZWFkc30+LFxuICAgICAgZW5kQXRDb2xzOiBhcnJheTx1MzIsICR7bnVtT2ZUaHJlYWRzfT4sXG4gICAgICBlbmRBdFJvd3M6IGFycmF5PHUzMiwgJHtudW1PZlRocmVhZHN9PixcblxuICAgICAgLy8gdGhlIEFDVFVBTExZIHNpemVzIG9mIGVhY2ggZW50cnlcbiAgICAgIGVudHJ5U2l6ZXM6IGFycmF5PGFycmF5PHUzMiwgJHtsaXN0U2l6ZX0+LCAke251bU9mQ29sdW1uc30+LFxuICAgICAgLy8gdGhlIHdlaWdodHMgZm9yIGVhY2ggZW50cnlcbiAgICAgIHdlaWdodHM6IGFycmF5PGYzMiwgJHtudW1PZkNvbHVtbnN9PixcbiAgICAgIC8vIHRoZSBkYXRhIGZvciBlYWNoIGVudHJ5XG4gICAgICAke2RhdGFXZ3NsfSAvLyBhbiBleGFtcGxlIG9mIHRoZSBkYXRhV2dzbCB3b3VsZCBiZTpcbiAgICAgIC8vZGF0YTA6IGFycmF5PGFycmF5PHUzMiwyMD4sMTAwPixcbiAgICAgIC8vZGF0YTE6IGFycmF5PGFycmF5PHUzMiwyMD4sMTAwPlxuICAgIH1cblxuICAgIC8vIHN0cnVjdCBmb3IgdGhlIHN1cHBsZW1lbnRhcnkgaW5mb3JtYXRpb25cbiAgICBzdHJ1Y3QgU3VwcEluZm8ge1xuICAgICAgLy8gc3RydWN0IGNvbnRhaW5pbmcgYWxsIHRoZSBzdXBwbGVtZW50YXJ5IGluZm8sIGxpa2Ugc2NvcmluZyBtYXRyaXgsIGFscGhhYmV0IGluZGV4ZXMsIHJhbmdlLCBldGMuXG4gICAgICAke3N1cHBJbmZvV2dzbH1cbiAgICB9O1xuXG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBjb21wdXRlSW5mbzogQ29tcHV0ZUluZm87XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBzdXBwSW5mbzogU3VwcEluZm87XG4gICAgQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiByZXN1bHRzOiBTcGFyc2VSZXN1bHQ7XG4gICAgQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCR7d29ya0dyb3VwRGl2aXNpb259LCAke3dvcmtHcm91cERpdmlzaW9ufSkgZm4gY2FsY1NwYXJzZU1hdHJpeChcbiAgICAgIEBidWlsdGluKGdsb2JhbF9pbnZvY2F0aW9uX2lkKSBpZDogdmVjMzx1MzI+XG4gICAgKSB7XG4gICAgICAke25lZWRzRHVtbXkgPyBgbGV0IG90aGVyRHVtbXkgPSBzdXBwSW5mby5kdW1teSAqIDI7YCA6ICcnfSAvLyBqdXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBzdXBwSW5mbyBpcyBub3Qgb3B0aW1pemVkIG91dFxuICAgICAgbGV0IHRocmVhZENvbCA9IGlkLng7XG4gICAgICBsZXQgdGhyZWFkUm93ID0gaWQueTtcbiAgICAgIGxldCBsaW5lYXJJbmRleCA9IHRocmVhZFJvdyAqICR7Z2xvYmFsVGhyZWFkRGltU2l6ZX0gKyB0aHJlYWRDb2w7XG4gICAgICBpZiAobGluZWFySW5kZXggPj0gJHtudW1PZlRocmVhZHN9KSB7XG4gICAgICAgIHJldHVybjsgLy8gaWYgd2UgYXJlIG91dCBvZiBib3VuZHMsIHJldHVyblxuICAgICAgfSAgICAgIFxuICAgICAgdmFyIHN0YXJ0QXRDb2w6IHUzMiA9IGNvbXB1dGVJbmZvLnN0YXJ0QXRDb2xzW2xpbmVhckluZGV4XTtcbiAgICAgIHZhciBzdGFydEF0Um93OiB1MzIgPSBjb21wdXRlSW5mby5zdGFydEF0Um93c1tsaW5lYXJJbmRleF07XG4gICAgICBsZXQgZW5kQXRDb2w6IHUzMiA9IG1pbihjb21wdXRlSW5mby5lbmRBdENvbHNbbGluZWFySW5kZXhdLCAke2xpc3RTaXplfXUpO1xuICAgICAgbGV0IGVuZEF0Um93OiB1MzIgPSBtaW4oY29tcHV0ZUluZm8uZW5kQXRSb3dzW2xpbmVhckluZGV4XSwgJHtsaXN0U2l6ZX11KTtcbiAgICAgIGxldCBpcyA9ICZyZXN1bHRzLmlbbGluZWFySW5kZXhdO1xuICAgICAgbGV0IGpzID0gJnJlc3VsdHMualtsaW5lYXJJbmRleF07XG4gICAgICBsZXQgZGlzdGFuY2VzID0gJnJlc3VsdHMuZGlzdGFuY2VzW2xpbmVhckluZGV4XTtcbiAgICAgIHJlc3VsdHMuZm91bmRbbGluZWFySW5kZXhdID0gMDsgLy8gaW5pdGlhbGl6ZSB0aGUgZm91bmQgY291bnRlclxuICAgICAgdmFyIGZvdW5kOiB1MzIgPSAwO1xuICAgICAgaWYgKHJlc3VsdHMuZG9uZVtsaW5lYXJJbmRleF0gPiAwKSB7XG4gICAgICAgIHJldHVybjsgLy8gaWYgd2UgYXJlIGRvbmUsIHJldHVyblxuICAgICAgfVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAke21heEl0ZXJhdGlvbnNQZXJUaHJlYWR9OyBpKyspIHtcbiAgICAgICAgaWYgKHN0YXJ0QXRDb2wgPj0gZW5kQXRDb2wgJiYgc3RhcnRBdFJvdyA+PSBlbmRBdFJvdykge1xuICAgICAgICAgIHJlc3VsdHMuZG9uZVtsaW5lYXJJbmRleF0gPSAxO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmb3VuZCA+PSAke3NwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWR9KSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRpc3QgPSBjb21iaW5lZERpc3RhbmNlKHN0YXJ0QXRDb2wsIHN0YXJ0QXRSb3cpO1xuICAgICAgICBpZiAoZGlzdCA8PSAke21heERpc3RhbmNlfSkge1xuICAgICAgICAgICgqaXMpW2ZvdW5kXSA9IHN0YXJ0QXRDb2w7XG4gICAgICAgICAgKCpqcylbZm91bmRdID0gc3RhcnRBdFJvdztcbiAgICAgICAgICAoKmRpc3RhbmNlcylbZm91bmRdID0gZGlzdDtcbiAgICAgICAgICBmb3VuZCA9IGZvdW5kICsgMTtcbiAgICAgICAgfVxuICAgICAgICBzdGFydEF0Q29sID0gc3RhcnRBdENvbCArIDE7XG4gICAgICAgIGlmIChzdGFydEF0Q29sID49ICR7bGlzdFNpemV9dSkge1xuICAgICAgICAgIHN0YXJ0QXRSb3cgKz0gMTtcbiAgICAgICAgICBzdGFydEF0Q29sID0gc3RhcnRBdFJvdyArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdHMuZm91bmRbbGluZWFySW5kZXhdID0gZm91bmQ7XG4gICAgICAvLyB1cGRhdGUgdGhlIHN0YXJ0QXRDb2xzIGFuZCBzdGFydEF0Um93c1xuICAgICAgY29tcHV0ZUluZm8uc3RhcnRBdENvbHNbbGluZWFySW5kZXhdID0gc3RhcnRBdENvbDtcbiAgICAgIGNvbXB1dGVJbmZvLnN0YXJ0QXRSb3dzW2xpbmVhckluZGV4XSA9IHN0YXJ0QXRSb3c7XG5cbiAgICB9XG5cbiAgICAvLyB0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIGRpc3RhbmNlIHNjcmlwdCBmb3IgZWFjaCBkaXN0YW5jZSBtZXRyaWMgYW5kIHRoZW4gY29tYmluZSB0aGVtIGludG8gb25lXG4gICAgJHtnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0KGRpc3RhbmNlTWV0cmljcywgcHJvY2Vzc0luZm8ubWFwKChpbmZvKSA9PiBpbmZvLm1heEVudHJ5TGVuKSwgbWF4RGlzdGFuY2UsIGFnZ3JlZ2F0aW9uRnVuY3Rpb24pfVxuXG5cbiAgICBgXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXBlbGluZSA9IGRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe1xuICAgICAgICAgICAgbGFiZWw6ICdzcGFyc2UgbWF0cml4IGNvbXB1dGUgcGlwZWxpbmUnLFxuICAgICAgICAgICAgbGF5b3V0OiAnYXV0bycsXG4gICAgICAgICAgICBjb21wdXRlOiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdjYWxjU3BhcnNlTWF0cml4JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBnZW5lcmF0ZSBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRDb2xzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0QXRSb3dzID0gbmV3IFVpbnQzMkFycmF5KG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGNvbnN0IGVuZEF0Q29scyA9IG5ldyBVaW50MzJBcnJheShudW1PZlRocmVhZHMpO1xuICAgICAgICBjb25zdCBlbmRBdFJvd3MgPSBuZXcgVWludDMyQXJyYXkobnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgY29uc3QgY2h1bmtTaXplID0gTWF0aC5mbG9vcihjb25kZW5zZWREaXN0YW5jZU1hdHJpeFNpemUgLyBudW1PZlRocmVhZHMpOyAvLyBzaXplIG9mIHRoZSBjaHVuayBwZXIgdGhyZWFkIChpbiB0b3RhbClcbiAgICAgICAgbGV0IHN0YXJ0Um93ID0gMDtcbiAgICAgICAgbGV0IHN0YXJ0Q29sID0gMTtcbiAgICAgICAgY29uc29sZS50aW1lKCdHUFV0aHJlYWRTdGFydHMnKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZlRocmVhZHM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZW5kSWR4ID0gaSA9PT0gbnVtT2ZUaHJlYWRzIC0gMSA/IGNvbmRlbnNlZERpc3RhbmNlTWF0cml4U2l6ZSAtIDEgOiAoaSArIDEpICogY2h1bmtTaXplO1xuICAgICAgICAgICAgLy8gZmFuY3kgZm9ybXVsYXMgdG8gY2FsY3VsYXRlIHRoZSBzdGFydCBhbmQgZW5kIGluZGljZXMgZm9yIHRoZSBjb25kZW5zZWQgZGlzdGFuY2UgbWF0cml4IGZvciBlYWNoIHRocmVhZCBzdGFydFxuICAgICAgICAgICAgY29uc3QgZW5kUm93ID0gbGlzdFNpemUgLSAyIC0gTWF0aC5mbG9vcihNYXRoLnNxcnQoLTggKiBlbmRJZHggKyA0ICogbGlzdFNpemUgKiAobGlzdFNpemUgLSAxKSAtIDcpIC8gMiAtIDAuNSk7XG4gICAgICAgICAgICBjb25zdCBlbmRDb2wgPSBlbmRJZHggLSBsaXN0U2l6ZSAqIGVuZFJvdyArIE1hdGguZmxvb3IoKGVuZFJvdyArIDEpICogKGVuZFJvdyArIDIpIC8gMik7XG4gICAgICAgICAgICBzdGFydEF0Q29sc1tpXSA9IHN0YXJ0Q29sO1xuICAgICAgICAgICAgc3RhcnRBdFJvd3NbaV0gPSBzdGFydFJvdztcbiAgICAgICAgICAgIGVuZEF0Q29sc1tpXSA9IGVuZENvbDtcbiAgICAgICAgICAgIGVuZEF0Um93c1tpXSA9IGVuZFJvdztcbiAgICAgICAgICAgIHN0YXJ0Um93ID0gZW5kUm93O1xuICAgICAgICAgICAgc3RhcnRDb2wgPSBlbmRDb2w7XG4gICAgICAgICAgICAvLyBjb25zdCBzdGFydFJvdyA9IHZhbHVlc1swXS5sZW5ndGggLSAyIC0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIC8vICAgTWF0aC5zcXJ0KC04ICogc3RhcnRJZHggKyA0ICogdmFsdWVzWzBdLmxlbmd0aCAqICh2YWx1ZXNbMF0ubGVuZ3RoIC0gMSkgLSA3KSAvIDIgLSAwLjUpO1xuICAgICAgICAgICAgLy8gY29uc3Qgc3RhcnRDb2wgPSBzdGFydElkeCAtIHZhbHVlc1swXS5sZW5ndGggKiBzdGFydFJvdyArIE1hdGguZmxvb3IoKHN0YXJ0Um93ICsgMSkgKiAoc3RhcnRSb3cgKyAyKSAvIDIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUudGltZUVuZCgnR1BVdGhyZWFkU3RhcnRzJyk7XG4gICAgICAgIC8vIHNpemUgb2YgdGhlIGNvbXB1dGVJbmZvIGJ1ZmZlclxuICAgICAgICBjb25zdCBjb21wdXRlSW5mb0J1ZmZlcjMyU2l6ZSA9IG51bU9mVGhyZWFkcyAqIDQgKyAvLyBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgICAgICBsaXN0U2l6ZSAqIG51bU9mQ29sdW1ucyArIC8vIGVudHJ5U2l6ZXNcbiAgICAgICAgICAgIG51bU9mQ29sdW1ucyArIC8vIHdlaWdodHNcbiAgICAgICAgICAgIHByb2Nlc3NJbmZvLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc291cmNlQXJyYXlTaXplLCAwKTtcbiAgICAgICAgLy8gc2l6ZSBvZiB0aGUgc3VwcEluZm8gYnVmZmVyXG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyMzJTaXplID0gcHJvY2Vzc0luZm8ucmVkdWNlKChhLCBiKSA9PiBhICsgYi5zdXBwSW5mb1NpemUsIDApO1xuICAgICAgICAvLyBzaXplIG9mIHRoZSByZXN1bHRzIGJ1ZmZlclxuICAgICAgICBjb25zdCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgPSBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkICogbnVtT2ZUaHJlYWRzO1xuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyMzJTaXplID0gMyAqIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSArIG51bU9mVGhyZWFkcyArIG51bU9mVGhyZWFkczsgLy8gaSwgaiwgZGlzdGFuY2VzLCBmb3VuZCwgZG9uZVxuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgb24gdGhlIEdQVSB0byBob2xkIGNvbXB1dGVJbmZvXG4gICAgICAgIC8vIGJld2FyZSB0aGF0IHN0cnVjdCBtdXN0IGJlIHBhZGRlZCB0byAxNiBieXRlcywgc28gd2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHN0cnVjdCBpbiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3QgY29tcHV0ZUluZm9CdWZmZXJTaXplID0gY29tcHV0ZUluZm9CdWZmZXIzMlNpemUgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgbGV0IHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSA9IGNvbXB1dGVJbmZvQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3QgcmVtYWluZGVyID0gY29tcHV0ZUluZm9CdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSArPSAxNiAtIHJlbWFpbmRlcjsgLy8gcGFkIHRoZSBzaXplIGFjY29yZGluZ2x5XG4gICAgICAgIGNvbnN0IGNvbXB1dGVJbmZvQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ2NvbXB1dGUgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkQ29tcHV0ZUluZm9CdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyID0gY29tcHV0ZUluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTsgLy8gZ2V0IGZ1bGwgYnVmZmVyXG4gICAgICAgIC8vIGR5bmFtaWMgb2Zmc2V0IGZvciB0aGUgY29tcHV0ZUluZm8gYnVmZmVyXG4gICAgICAgIGxldCBjb21wdXRlSW5mb09mZlNldCA9IDA7XG4gICAgICAgIC8vIGZpcnN0IHdyaXRlIHRoZSBzdGFydEF0Q29scywgc3RhcnRBdFJvd3MsIGVuZEF0Q29scywgZW5kQXRSb3dzXG4gICAgICAgIGNvbnN0IHN0YXJ0QXRDb2xzQnVmZmVyVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgc3RhcnRBdENvbHNCdWZmZXJWaWV3LnNldChzdGFydEF0Q29scyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgY29uc3Qgc3RhcnRBdFJvd3NCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBzdGFydEF0Um93c0J1ZmZlclZpZXcuc2V0KHN0YXJ0QXRSb3dzKTtcbiAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICBjb25zdCBlbmRBdENvbHNCdWZmZXJWaWV3ID0gbmV3IFVpbnQzMkFycmF5KG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBudW1PZlRocmVhZHMpO1xuICAgICAgICBlbmRBdENvbHNCdWZmZXJWaWV3LnNldChlbmRBdENvbHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZlRocmVhZHMgKiBVaW50MzJBcnJheS5CWVRFU19QRVJfRUxFTUVOVDsgLy8gYXJyYXkgb2YgMzJiaXQgdmFsdWVzXG4gICAgICAgIGNvbnN0IGVuZEF0Um93c0J1ZmZlclZpZXcgPSBuZXcgVWludDMyQXJyYXkobWFwcGVkQ29tcHV0ZUluZm9BcnJheUJ1ZmZlciwgY29tcHV0ZUluZm9PZmZTZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgIGVuZEF0Um93c0J1ZmZlclZpZXcuc2V0KGVuZEF0Um93cyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IG51bU9mVGhyZWFkcyAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UOyAvLyBhcnJheSBvZiAzMmJpdCB2YWx1ZXNcbiAgICAgICAgLy8gdGhlbiB3cml0ZSB0aGUgZW50cnlTaXplc1xuICAgICAgICBjb25zdCBlbnRyeVNpemVzVmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgYXJyYXlTaXplcy5sZW5ndGgpO1xuICAgICAgICBlbnRyeVNpemVzVmlldy5zZXQoYXJyYXlTaXplcyk7XG4gICAgICAgIGNvbXB1dGVJbmZvT2ZmU2V0ICs9IGFycmF5U2l6ZXMubGVuZ3RoICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7IC8vIGFycmF5IG9mIDMyYml0IHZhbHVlc1xuICAgICAgICAvLyB0aGVuIHdyaXRlIHRoZSB3ZWlnaHRzXG4gICAgICAgIGNvbnN0IHdlaWdodHNWaWV3ID0gbmV3IEZsb2F0MzJBcnJheShtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyLCBjb21wdXRlSW5mb09mZlNldCwgbnVtT2ZDb2x1bW5zKTtcbiAgICAgICAgd2VpZ2h0c1ZpZXcuc2V0KHdlaWdodHMpO1xuICAgICAgICBjb21wdXRlSW5mb09mZlNldCArPSBudW1PZkNvbHVtbnMgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgIC8vIGZpbmFsbHksIHdyaXRlIHRoZSBkYXRhIGl0c2VsZlxuICAgICAgICBmb3IgKGNvbnN0IGluZm8gb2YgcHJvY2Vzc0luZm8pIHtcbiAgICAgICAgICAgIGNvbnN0IEFycmF5Q29uc3RydWN0b3IgPSBpbmZvLkVuY29kZWRBcnJheUNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgY29uc3QgY2h1bmtTaXplID0gaW5mby5zb3VyY2VBcnJheVNpemU7XG4gICAgICAgICAgICBjb25zdCBkYXRhVmlldyA9IG5ldyBBcnJheUNvbnN0cnVjdG9yKG1hcHBlZENvbXB1dGVJbmZvQXJyYXlCdWZmZXIsIGNvbXB1dGVJbmZvT2ZmU2V0LCBjaHVua1NpemUpOyAvL25ldyBBcnJheUNvbnN0cnVjdG9yKGNvbXB1dGVJbmZvQnVmZmVyLmdldE1hcHBlZFJhbmdlKGNvbXB1dGVJbmZvT2ZmU2V0LCBjaHVua0J5dGVTaXplKSk7XG4gICAgICAgICAgICBkYXRhVmlldy5zZXQoaW5mby5mbGF0U291cmNlQXJyYXkpO1xuICAgICAgICAgICAgY29tcHV0ZUluZm9PZmZTZXQgKz0gY2h1bmtTaXplICogQXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgfVxuICAgICAgICAvLyB3ZSBhcmUgZG9uZSBhdCB0aGlzIHBvaW50LlxuICAgICAgICBjb21wdXRlSW5mb0J1ZmZlci51bm1hcCgpO1xuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgb24gdGhlIEdQVSB0byBob2xkIHN1cHBJbmZvXG4gICAgICAgIC8vIHNhbWUgaGVyZSwgd2UgbmVlZCB0byBwYWQgdGhlIHNpemUgb2YgdGhlIHN0cnVjdCB0byAxNiBieXRlc1xuICAgICAgICBjb25zdCBzdXBwSW5mb0J1ZmZlclNpemUgPSBzdXBwSW5mb0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplID0gc3VwcEluZm9CdWZmZXJTaXplO1xuICAgICAgICBjb25zdCBzdXBwSW5mb1JlbWFpbmRlciA9IHN1cHBJbmZvQnVmZmVyU2l6ZSAmIDE1OyAvLyBjaGVjayBpZiB0aGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDE2XG4gICAgICAgIGlmIChzdXBwSW5mb1JlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSArPSAxNiAtIHN1cHBJbmZvUmVtYWluZGVyOyAvLyBwYWQgdGhlIHNpemUgYWNjb3JkaW5nbHlcbiAgICAgICAgcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplID0gTWF0aC5tYXgocGFkZGVkU3VwcEluZm9CdWZmZXJTaXplLCAxNik7XG4gICAgICAgIGNvbnN0IHN1cHBJbmZvQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3N1cHAgaW5mbyBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogcGFkZGVkU3VwcEluZm9CdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgICAgIG1hcHBlZEF0Q3JlYXRpb246IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyID0gc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKTsgLy8gZ2V0IGZ1bGwgYnVmZmVyXG4gICAgICAgIGxldCBzdXBwSW5mb09mZlNldCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgaW5mbyBvZiBwcm9jZXNzSW5mbykge1xuICAgICAgICAgICAgaWYgKGluZm8uc3VwcEluZm9CdWZmZXIgJiYgaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoID4gMCAmJiBpbmZvLnN1cHBJbmZvU2l6ZSA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBBcnJheUNvbnN0cnVjdG9yID0gaW5mby5zdXBwSW5mb1R5cGUgPT09IFwiVUlOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLlVJTlQzMkFSUkFZICovID8gVWludDMyQXJyYXkgOiBGbG9hdDMyQXJyYXk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3VwcEluZm9WaWV3ID0gbmV3IEFycmF5Q29uc3RydWN0b3IobWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciwgc3VwcEluZm9PZmZTZXQsIGluZm8uc3VwcEluZm9CdWZmZXIubGVuZ3RoKTsgLy9uZXcgQXJyYXlDb25zdHJ1Y3RvcihzdXBwSW5mb0J1ZmZlci5nZXRNYXBwZWRSYW5nZShzdXBwSW5mb09mZlNldCwgaW5mby5zdXBwSW5mb0J1ZmZlci5ieXRlTGVuZ3RoKSk7XG4gICAgICAgICAgICAgICAgc3VwcEluZm9WaWV3LnNldChpbmZvLnN1cHBJbmZvQnVmZmVyKTtcbiAgICAgICAgICAgICAgICBzdXBwSW5mb09mZlNldCArPSBpbmZvLnN1cHBJbmZvQnVmZmVyLmJ5dGVMZW5ndGg7IC8vIGluZm8uc3VwcEluZm9CdWZmZXIubGVuZ3RoICogQXJyYXlDb25zdHJ1Y3Rvci5CWVRFU19QRVJfRUxFTUVOVDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc3VwcEluZm9PZmZTZXQgPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGR1bW15VmlldyA9IG5ldyBVaW50MzJBcnJheShtYXBwZWRTdXBwSW5mb0FycmF5QnVmZmVyLCAwLCA0KTsgLy9uZXcgVWludDMyQXJyYXkoc3VwcEluZm9CdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoMCwgMTYpKTtcbiAgICAgICAgICAgIGR1bW15Vmlldy5zZXQoWzEsIDEsIDEsIDFdKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBwSW5mb0J1ZmZlci51bm1hcCgpO1xuICAgICAgICAvLyBjcmVhdGUgYSBidWZmZXIgZm9yIHRoZSByZXN1bHRzXG4gICAgICAgIGNvbnN0IHJlc3VsdHNCdWZmZXJTaXplID0gcmVzdWx0c0J1ZmZlcjMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICBsZXQgcGFkZGVkUmVzdWx0c0J1ZmZlclNpemUgPSByZXN1bHRzQnVmZmVyU2l6ZTtcbiAgICAgICAgY29uc3QgcmVzdWx0c1JlbWFpbmRlciA9IHJlc3VsdHNCdWZmZXJTaXplICYgMTU7IC8vIGNoZWNrIGlmIHRoZSBzaXplIGlzIGEgbXVsdGlwbGUgb2YgMTZcbiAgICAgICAgaWYgKHJlc3VsdHNSZW1haW5kZXIgIT09IDApXG4gICAgICAgICAgICBwYWRkZWRSZXN1bHRzQnVmZmVyU2l6ZSArPSAxNiAtIHJlc3VsdHNSZW1haW5kZXI7IC8vIHBhZCB0aGUgc2l6ZSBhY2NvcmRpbmdseVxuICAgICAgICBjb25zdCByZXN1bHRzQnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdHMgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHBhZGRlZFJlc3VsdHNCdWZmZXJTaXplLFxuICAgICAgICAgICAgdXNhZ2U6IEdQVUJ1ZmZlclVzYWdlLlNUT1JBR0UgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfU1JDXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBTZXR1cCBhIGJpbmRHcm91cCB0byB0ZWxsIHRoZSBzaGFkZXIgd2hpY2hcbiAgICAgICAgLy8gYnVmZmVyIHRvIHVzZSBmb3IgdGhlIGNvbXB1dGF0aW9uXG4gICAgICAgIGNvbnN0IGJpbmRHcm91cCA9IGRldmljZS5jcmVhdGVCaW5kR3JvdXAoe1xuICAgICAgICAgICAgbGFiZWw6ICdiaW5kR3JvdXAgZm9yIHNwYXJzZSBtYXRyaXggYnVmZmVyJyxcbiAgICAgICAgICAgIGxheW91dDogcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAgICAgZW50cmllczogW1xuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMCwgcmVzb3VyY2U6IHsgYnVmZmVyOiBjb21wdXRlSW5mb0J1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAxLCByZXNvdXJjZTogeyBidWZmZXI6IHN1cHBJbmZvQnVmZmVyIH0gfSxcbiAgICAgICAgICAgICAgICB7IGJpbmRpbmc6IDIsIHJlc291cmNlOiB7IGJ1ZmZlcjogcmVzdWx0c0J1ZmZlciB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgLy9jb25zdCBwYWlyQ29tcGFyaXNvbnNQZXJQYXNzID0gbWF4SXRlcmF0aW9uc1BlclRocmVhZCAqIG51bU9mVGhyZWFkcztcbiAgICAgICAgLy9jb25zdCBwYXNzZXMgPSBNYXRoLmNlaWwoY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIC8gcGFpckNvbXBhcmlzb25zUGVyUGFzcyk7XG4gICAgICAgIC8vIHdlIHdpbGwgZGlzdHBhdGNoIHRoaXMgbWFueSBwYXNzZXMgdG8gdGhlIEdQVSwgYW5kIGl0IHdpbGwgaGFuZGxlIGluZGV4ZXMgYWxsIGJ5IGl0c2VsZi5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBjb3BpZWQgdGhlIHN0YXJ0L2VuZCBpbmZvcm1hdGlvbiB0byBpdCwgc28gaXQgd2lsbCBrbm93IHdoZXJlIHRvIHN0YXJ0IGFuZCBlbmQgb24gZWFjaCBwYXNzLlxuICAgICAgICBjb25zdCByZXN1bHRzT3V0QnVmZmVyID0gZGV2aWNlLmNyZWF0ZUJ1ZmZlcih7XG4gICAgICAgICAgICBsYWJlbDogJ3Jlc3VsdHMgb3V0IGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiByZXN1bHRzQnVmZmVyLnNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUQgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdElzID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdEpzID0gW107XG4gICAgICAgIGNvbnN0IHJlc3VsdERpc3RhbmNlcyA9IFtdO1xuICAgICAgICAvL2xldCBjb21iaW5lZEZvdW5kID0gMDtcbiAgICAgICAgbGV0IGlzQWxsRG9uZSA9IGZhbHNlO1xuICAgICAgICB3aGlsZSAoIWlzQWxsRG9uZSkge1xuICAgICAgICAgICAgLy8gRW5jb2RlIGNvbW1hbmRzIHRvIGRvIHRoZSBjb21wdXRhdGlvblxuICAgICAgICAgICAgY29uc3QgZW5jb2RlciA9IGRldmljZS5jcmVhdGVDb21tYW5kRW5jb2Rlcih7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdkaXN0YW5jZSBlbmNvZGVyJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcGFzcyA9IGVuY29kZXIuYmVnaW5Db21wdXRlUGFzcyh7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdkaXN0YW5jZSBjb21wdXRlIHBhc3MnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwYXNzLnNldFBpcGVsaW5lKHBpcGVsaW5lKTtcbiAgICAgICAgICAgIHBhc3Muc2V0QmluZEdyb3VwKDAsIGJpbmRHcm91cCk7XG4gICAgICAgICAgICBwYXNzLmRpc3BhdGNoV29ya2dyb3Vwcyh3b3JrZ3JvdXBzRGltLCB3b3JrZ3JvdXBzRGltKTtcbiAgICAgICAgICAgIHBhc3MuZW5kKCk7XG4gICAgICAgICAgICBlbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihyZXN1bHRzQnVmZmVyLCAwLCByZXN1bHRzT3V0QnVmZmVyLCAwLCByZXN1bHRzT3V0QnVmZmVyLnNpemUpO1xuICAgICAgICAgICAgLy8gRmluaXNoIGVuY29kaW5nIGFuZCBzdWJtaXQgdGhlIGNvbW1hbmRzXG4gICAgICAgICAgICBjb25zdCBjb21tYW5kQnVmZmVyID0gZW5jb2Rlci5maW5pc2goKTtcbiAgICAgICAgICAgIGRldmljZS5xdWV1ZS5zdWJtaXQoW2NvbW1hbmRCdWZmZXJdKTtcbiAgICAgICAgICAgIC8vIFJlYWQgdGhlIHJlc3VsdHNcbiAgICAgICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgICAgICB5aWVsZCByZXN1bHRzT3V0QnVmZmVyLm1hcEFzeW5jKEdQVU1hcE1vZGUuUkVBRCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzT3V0QXJyYXlCdWZmZXIgPSByZXN1bHRzT3V0QnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7XG4gICAgICAgICAgICAvLyByZWFkIHRoZSByZXN1bHRzXG4gICAgICAgICAgICBsZXQgcmVzdWx0T2Zmc2V0ID0gMDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHNJID0gbmV3IFVpbnQzMkFycmF5KHJlc3VsdHNPdXRBcnJheUJ1ZmZlciwgcmVzdWx0T2Zmc2V0LCBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUpO1xuICAgICAgICAgICAgcmVzdWx0T2Zmc2V0ICs9IHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSAqIFVpbnQzMkFycmF5LkJZVEVTX1BFUl9FTEVNRU5UO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0c0ogPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIHNwYXJzZU1hdHJpeEVhY2hBcnJheTMyU2l6ZSk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRGlzdGFuY2VzID0gbmV3IEZsb2F0MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgc3BhcnNlTWF0cml4RWFjaEFycmF5MzJTaXplKTtcbiAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUgKiBGbG9hdDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRm91bmQgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0c091dEFycmF5QnVmZmVyLCByZXN1bHRPZmZzZXQsIG51bU9mVGhyZWFkcyk7XG4gICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gbnVtT2ZUaHJlYWRzICogVWludDMyQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ7XG4gICAgICAgICAgICBjb25zdCByZXN1bHRzRG9uZSA9IG5ldyBVaW50MzJBcnJheShyZXN1bHRzT3V0QXJyYXlCdWZmZXIsIHJlc3VsdE9mZnNldCwgbnVtT2ZUaHJlYWRzKTtcbiAgICAgICAgICAgIGlzQWxsRG9uZSA9IHJlc3VsdHNEb25lLmV2ZXJ5KChkKSA9PiBkID09PSAxKTtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsUmVzdWx0cyA9IHJlc3VsdHNGb3VuZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkSSA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFJlc3VsdHMpO1xuICAgICAgICAgICAgY29uc3QgY29tYmluZWRKID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsUmVzdWx0cyk7XG4gICAgICAgICAgICBjb25zdCBjb21iaW5lZERpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxSZXN1bHRzKTtcbiAgICAgICAgICAgIGxldCBjb21iaW5lZE9mZnNldCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCByZXNJID0gMDsgcmVzSSA8IHJlc3VsdHNGb3VuZC5sZW5ndGg7IHJlc0krKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gcmVzdWx0c0ZvdW5kW3Jlc0ldO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgY29tYmluZWRJLnNldChyZXN1bHRzSS5zdWJhcnJheShyZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCwgcmVzSSAqIHNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQgKyBmb3VuZCksIGNvbWJpbmVkT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICBjb21iaW5lZEouc2V0KHJlc3VsdHNKLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkRGlzdGFuY2VzLnNldChyZXN1bHRzRGlzdGFuY2VzLnN1YmFycmF5KHJlc0kgKiBzcGFyc2VSZXN1bHRTaXplUGVyVGhyZWFkLCByZXNJICogc3BhcnNlUmVzdWx0U2l6ZVBlclRocmVhZCArIGZvdW5kKSwgY29tYmluZWRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIGNvbWJpbmVkT2Zmc2V0ICs9IGZvdW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzdWx0SXMucHVzaChjb21iaW5lZEkpO1xuICAgICAgICAgICAgcmVzdWx0SnMucHVzaChjb21iaW5lZEopO1xuICAgICAgICAgICAgcmVzdWx0RGlzdGFuY2VzLnB1c2goY29tYmluZWREaXN0YW5jZXMpO1xuICAgICAgICAgICAgcmVzdWx0c091dEJ1ZmZlci51bm1hcCgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsU2l6ZSA9IHJlc3VsdElzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIubGVuZ3RoLCAwKTtcbiAgICAgICAgY29uc3QgZmluYWxJID0gbmV3IFVpbnQzMkFycmF5KHRvdGFsU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpbmFsSiA9IG5ldyBVaW50MzJBcnJheSh0b3RhbFNpemUpO1xuICAgICAgICBjb25zdCBmaW5hbERpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkodG90YWxTaXplKTtcbiAgICAgICAgbGV0IGZpbmFsT2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRJcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZmluYWxJLnNldChyZXN1bHRJc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxKLnNldChyZXN1bHRKc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxEaXN0YW5jZXMuc2V0KHJlc3VsdERpc3RhbmNlc1tpXSwgZmluYWxPZmZzZXQpO1xuICAgICAgICAgICAgZmluYWxPZmZzZXQgKz0gcmVzdWx0SXNbaV0ubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFzIHJ1bGUgbWFuZGF0ZXMsIGRlc3Ryb3kgYWxsIGJ1ZmZlcnMuXG4gICAgICAgIGNvbXB1dGVJbmZvQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgc3VwcEluZm9CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXN1bHRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgcmVzdWx0c091dEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJldHVybiB7IGk6IGZpbmFsSSwgajogZmluYWxKLCBkaXN0YW5jZTogZmluYWxEaXN0YW5jZXMgfTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldENvbWJpbmVkRGlzdGFuY2VTY3JpcHQoZGlzdGFuY2VNZXRyaWNzLCBtYXhFbnRyeUxlbnMsIG1heERpc3RhbmNlLCBhZ2dyZWdhdGlvbikge1xuICAgIGNvbnN0IGRpc3RhbmNlV2dzbHMgPSBkaXN0YW5jZU1ldHJpY3MubWFwKChtZXRyaWMsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgZm4gZGlzdGFuY2VTY3JpcHQke2l9KGFJbmRleDogdTMyLCBiSW5kZXg6IHUzMikgLT4gZjMyIHtcbiAgICAgICAgICBsZXQgYSA9IGNvbXB1dGVJbmZvLmRhdGEke2l9W2FJbmRleF07XG4gICAgICAgICAgbGV0IGIgPSBjb21wdXRlSW5mby5kYXRhJHtpfVtiSW5kZXhdO1xuICAgICAgICAgIGxldCBtYXhEaXN0YW5jZTogZjMyID0gJHttYXhEaXN0YW5jZX07XG4gICAgICAgICAgJHt3ZWJHUFVGdW5jdGlvbnNbbWV0cmljXShtYXhFbnRyeUxlbnNbaV0sIGkpfVxuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0pO1xuICAgIGNvbnN0IGFsbERpc3RhbmNlU2NyaXB0cyA9IGRpc3RhbmNlV2dzbHMuam9pbignXFxuJyk7XG4gICAgY29uc3QgY29tYmluZURpc3RhbmNlc1NjcmlwdCA9IGBcbiAgICAgIGZuIGNvbWJpbmVkRGlzdGFuY2UoYUluZGV4OiB1MzIsIGJJbmRleDogdTMyKSAtPiBmMzIge1xuICAgICAgICB2YXIgZGlzdGFuY2VzOiBhcnJheTxmMzIsICR7ZGlzdGFuY2VNZXRyaWNzLmxlbmd0aH0+O1xuICAgICAgICAke2Rpc3RhbmNlTWV0cmljcy5tYXAoKF8sIGkpID0+IGBkaXN0YW5jZXNbJHtpfV0gPSBkaXN0YW5jZVNjcmlwdCR7aX0oYUluZGV4LCBiSW5kZXgpO2ApLmpvaW4oJ1xcbicpfVxuICAgICAgICAke1dFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TW2FnZ3JlZ2F0aW9uXShkaXN0YW5jZU1ldHJpY3MubGVuZ3RoKX1cbiAgICAgIH1cbiAgICBcbiAgICBgO1xuICAgIHJldHVybiBhbGxEaXN0YW5jZVNjcmlwdHMgKyAnXFxuJyArIGNvbWJpbmVEaXN0YW5jZXNTY3JpcHQ7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD13ZWJHUFUtc3BhcnNlLW1hdHJpeC5qcy5tYXAiLCIvKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgeyBkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eSwgVHlwZVN1cHBvcnRlZERpc3RhbmNlcywgV0VCR1BVRElTVEFOQ0UgfSBmcm9tICcuLi9tdWx0aS1jb2wtZGlzdGFuY2VzL3dlYkdQVS1tdWx0aWNvbC1kaXN0YW5jZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHdlYkdQVVByb2Nlc3NJbmZvKGVudHJ5TGlzdCwgZGlzdGFuY2VNZXRyaWMgPSBXRUJHUFVESVNUQU5DRS5IQU1NSU5HLCBlbnRyeUluZGV4LCAvLyBpbmRleCBvZiB0aGUgZW50cmllcyBpbiB0aGUgbGlzdCBvZiBsaXN0cyB0aGF0IHdlIHdhbnQgdG8gcHJvY2Vzc1xub3B0aW9ucyA9IHsgZ2FwT3BlblBlbmFsdHk6IDEuMCwgZ2FwRXh0ZW5zaW9uUGVuYWx0eTogMC42IH0pIHtcbiAgICB2YXIgX2EsIF9iO1xuICAgIGxldCBlbnRyeVR5cGUgPSBudWxsO1xuICAgIGNvbnN0IGVuY29kZWRMaXN0ID0gKCgpID0+IHtcbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiB0eXBlb2YgZSA9PT0gJ3N0cmluZycpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIlNUUklOR1wiIC8qIFdHUFVFTlRSWVRZUEUuU1RSSU5HICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBuZXcgVWludDMyQXJyYXkoZW50cnkuc3BsaXQoJycpLm1hcCgoYykgPT4gYy5jaGFyQ29kZUF0KDApKSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnRyeUxpc3Quc29tZSgoZSkgPT4gdHlwZW9mIGUgPT09ICdudW1iZXInKSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJOVU1CRVJcIiAvKiBXR1BVRU5UUllUWVBFLk5VTUJFUiAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3QubWFwKChlbnRyeSkgPT4gbmV3IEZsb2F0MzJBcnJheShbZW50cnldKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBlbnRyeUxpc3RbMF0gPT0gJ29iamVjdCcgJiYgZW50cnlMaXN0LnNvbWUoKGUpID0+ICdfZGF0YScgaW4gZSAmJiAnX2xlbmd0aCcgaW4gZSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiQklUQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkJJVEFSUkFZICovO1xuICAgICAgICAgICAgcmV0dXJuIGVudHJ5TGlzdC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5fZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgRmxvYXQzMkFycmF5KSkge1xuICAgICAgICAgICAgZW50cnlUeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgVWludDMyQXJyYXkpKSB7XG4gICAgICAgICAgICBlbnRyeVR5cGUgPSBcIlVJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5VSU5UMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVudHJ5TGlzdC5zb21lKChlKSA9PiBlIGluc3RhbmNlb2YgSW50MzJBcnJheSkpIHtcbiAgICAgICAgICAgIGVudHJ5VHlwZSA9IFwiSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuSU5UMzJBUlJBWSAqLztcbiAgICAgICAgICAgIHJldHVybiBlbnRyeUxpc3Q7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gZW50cnlMaXN0IGFzIFVpbnQzMkFycmF5W107XG4gICAgfSkoKTtcbiAgICBpZiAoIWVuY29kZWRMaXN0IHx8ICFlbnRyeVR5cGUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbnRyeSB0eXBlLCBjb3VsZCBub3QgZGV0ZXJtaW5lIGVudHJ5IHR5cGUgZnJvbSBpbnB1dCBsaXN0Jyk7XG4gICAgY29uc3QgZW5jb2RlZExpc3RUeXBlID0gZW5jb2RlZExpc3RbMF0gaW5zdGFuY2VvZiBJbnQzMkFycmF5ID8gXCJJTlQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5JTlQzMkFSUkFZICovIDpcbiAgICAgICAgZW5jb2RlZExpc3RbMF0gaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgPyBcIkZMT0FUMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuRkxPQVQzMkFSUkFZICovIDogXCJVSU5UMzJBUlJBWVwiIC8qIFdHUFVFTlRSWVRZUEUuVUlOVDMyQVJSQVkgKi87XG4gICAgLy8gc2l6ZXMgb2YgZWFjaCBlbnRyaWVzIG1pZ2h0IGRpZmZlciwgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoYXQgZm9yIHNvbWUgZGlzdGFuY2UgbWV0cmljcywgbGlrZSBoYW1taW5nIGZvciBleGFtcGxlXG4gICAgY29uc3QgYXJyYXlTaXplcyA9IG5ldyBVaW50MzJBcnJheShlbmNvZGVkTGlzdC5tYXAoKGFycikgPT4gYXJyLmxlbmd0aCkpO1xuICAgIGlmICghVHlwZVN1cHBvcnRlZERpc3RhbmNlc1tlbnRyeVR5cGVdIHx8ICFUeXBlU3VwcG9ydGVkRGlzdGFuY2VzW2VudHJ5VHlwZV0uaGFzKGRpc3RhbmNlTWV0cmljKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXN0YW5jZSBtZXRyaWMgJyR7ZGlzdGFuY2VNZXRyaWN9JyBub3Qgc3VwcG9ydGVkIGZvciBlbnRyeSB0eXBlICcke2VudHJ5VHlwZX0nYCk7XG4gICAgY29uc3QgbWF4RW50cnlMZW4gPSBhcnJheVNpemVzLnJlZHVjZSgoYSwgYikgPT4gTWF0aC5tYXgoYSwgYiksIDApO1xuICAgIC8vIGdldCB0aGUgY29tcGxleGl0eSBvZiB1c2VkIGFsZ29yaXRobVxuICAgIGNvbnN0IGNvbXBsZXhpdHkgPSBkaXN0YW5jZUZ1bmN0aW9uQ29tcGxleGl0eVtkaXN0YW5jZU1ldHJpY10obWF4RW50cnlMZW4pO1xuICAgIGNvbnN0IEVuY29kZWRBcnJheUNvbnN0cnVjdG9yID0gZW5jb2RlZExpc3RUeXBlID09PSBcIklOVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLklOVDMyQVJSQVkgKi8gPyBJbnQzMkFycmF5IDpcbiAgICAgICAgKGVuY29kZWRMaXN0VHlwZSA9PT0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLyA/IEZsb2F0MzJBcnJheSA6IFVpbnQzMkFycmF5KTtcbiAgICBjb25zdCBmbGF0U291cmNlQXJyYXkgPSBuZXcgRW5jb2RlZEFycmF5Q29uc3RydWN0b3IoZW5jb2RlZExpc3QubGVuZ3RoICogbWF4RW50cnlMZW4pO1xuICAgIC8vIHdoZW4gc2V0dGluZywgd2UgbmVlZCB0byBzZXQgZWFjaCBhcnJheSBhdCBhIHNwZWNpZmljIG9mZnNldCwgd2hpY2ggaXMgY29udHJvbGxlZCBieSBtYXhBcnJheUxlbiBiZWNhdXNlIGVhY2ggYXJyYXkgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMuXG4gICAgLy8gdGhpcyB3YXkgd2Ugd2lsbCBnZXQgY29ycmVjdCBtYXRyaXggcmVwcmVzZW50YXRpb24gaW4gdGhlIGNvbXB1dGUgc2hhZGVyXG4gICAgZW5jb2RlZExpc3QuZm9yRWFjaCgoc2VxLCBpKSA9PiB7XG4gICAgICAgIGZsYXRTb3VyY2VBcnJheS5zZXQoc2VxLCBpICogbWF4RW50cnlMZW4pO1xuICAgIH0pO1xuICAgIC8vIE5CISBhbGwgdGhpcyBiZWZvcmUgdGhlIGxpbmUgd2FzIGdlbmVyaWMsIG5vdyB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSBzb21lIHNwZWNpZmljIHRoaW5ncyBmb3Igc29tZSBzcGVjaWZpYyBkaXN0YW5jZSBtZXRyaWNzXG4gICAgLy8gaW5pdGlhbGl6ZSBzdXBwIGluZm8gbGluZSB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGZpbmFsIHNoYWRlcjtcbiAgICBsZXQgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gJyc7IC8vIHRoZSBjb2RlIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgc3RydWN0IG9mIHN1cHBJbmZvXG4gICAgbGV0IHN1cHBJbmZvU2l6ZSA9IDA7XG4gICAgbGV0IHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgbGV0IHN1cHBJbmZvQnVmZmVyID0gbnVsbDtcbiAgICBpZiAoZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLk5FRURMRU1BTl9XVU5TQ0ggfHwgZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLk1PTk9NRVJfQ0hFTUlDQUxfRElTVEFOQ0UpIHtcbiAgICAgICAgbGV0IG1heE1vbm9tZXJJbmRleCA9IG9wdGlvbnMuc2NvcmluZ01hdHJpeCAmJiBvcHRpb25zLmFscGhhYmV0SW5kZXhlcyA/XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhvcHRpb25zLmFscGhhYmV0SW5kZXhlcykucmVkdWNlKChwcmV2LCBuKSA9PiBNYXRoLm1heChwcmV2LCBuLmNoYXJDb2RlQXQoMCkpLCAwKSA6IC0xO1xuICAgICAgICAvLyBnZW5lcmF0ZSBkZWZhdWx0IHNpbWlsYXJpdHkgbWF0cml4IGlmIGl0IGlzIG5vdCBwcm92aWRlZFxuICAgICAgICBpZiAoIW9wdGlvbnMuYWxwaGFiZXRJbmRleGVzIHx8ICFvcHRpb25zLnNjb3JpbmdNYXRyaXgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdFNvdXJjZUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZsYXRTb3VyY2VBcnJheVtpXSA+IG1heE1vbm9tZXJJbmRleClcbiAgICAgICAgICAgICAgICAgICAgbWF4TW9ub21lckluZGV4ID0gZmxhdFNvdXJjZUFycmF5W2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4ID1cbiAgICAgICAgICAgICAgICBuZXcgQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkuZmlsbChudWxsKS5tYXAoKCkgPT4gbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwoMCkpO1xuICAgICAgICAgICAgb3B0aW9ucy5hbHBoYWJldEluZGV4ZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3B0aW9ucy5zY29yaW5nTWF0cml4Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zY29yaW5nTWF0cml4W2ldW2ldID0gMTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmFscGhhYmV0SW5kZXhlc1tTdHJpbmcuZnJvbUNoYXJDb2RlKGkpXSA9IGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2ltaWxhcml0eU1hdHJpeFNpemUgPSAobWF4TW9ub21lckluZGV4ICsgMSkgKiAobWF4TW9ub21lckluZGV4ICsgMSk7XG4gICAgICAgIGNvbnN0IHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4ID0gbmV3IEFycmF5KG1heE1vbm9tZXJJbmRleCArIDEpLmZpbGwobnVsbCkubWFwKCgpID0+IG5ldyBGbG9hdDMyQXJyYXkobWF4TW9ub21lckluZGV4ICsgMSkpO1xuICAgICAgICAvLyBzZXQgZGlhZ29uYWwgdG8gMVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heE1vbm9tZXJJbmRleCArIDE7IGkrKylcbiAgICAgICAgICAgIHRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4W2ldW2ldID0gMTtcbiAgICAgICAgY29uc3QgYWxwaGFiZXRJbmRleGVzID0gb3B0aW9ucy5hbHBoYWJldEluZGV4ZXM7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFscGhhYmV0SW5kZXhlcykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5MiBvZiBPYmplY3Qua2V5cyhhbHBoYWJldEluZGV4ZXMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0ga2V5MilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXhba2V5LmNoYXJDb2RlQXQoMCldW2tleTIuY2hhckNvZGVBdCgwKV0gPVxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLnNjb3JpbmdNYXRyaXhbYWxwaGFiZXRJbmRleGVzW2tleV1dW2FscGhhYmV0SW5kZXhlc1trZXkyXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW4gbWVtb3J5IGxheW91dCwgd2Ugd2lsbCBoYXZlIDIgZmxvYXQzMiBzIGZvciBnYXBPcGVuIGFuZCBnYXBFeHRlbnNpb24gcGVuYWx0aWVzLCBhbmQgdGhlbiBmMzIgYXJyYXk8YXJyYXk8ZjMyPj4gZm9yIHNpbWlsYXJpdHkgbWF0cml4LlxuICAgICAgICAvLyBiZWNhdXNlIG9mIHByaW1pdGl2ZXMsIHRoZXJlIHdpbGwgYmUgbm8gcGFkZGluZywgc28gd2UgY2FuIGNhbGN1bGF0ZSB0aGUgc2l6ZSBkaXJlY3RseVxuICAgICAgICBzdXBwSW5mb1NpemUgPSAyICsgc2ltaWxhcml0eU1hdHJpeFNpemU7XG4gICAgICAgIHN1cHBJbmZvVHlwZSA9IFwiRkxPQVQzMkFSUkFZXCIgLyogV0dQVUVOVFJZVFlQRS5GTE9BVDMyQVJSQVkgKi87XG4gICAgICAgIHN1cHBJbmZvQnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShzdXBwSW5mb1NpemUpO1xuICAgICAgICBzdXBwSW5mb0J1ZmZlclswXSA9IChfYSA9IG9wdGlvbnMuZ2FwT3BlblBlbmFsdHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDEuMDtcbiAgICAgICAgc3VwcEluZm9CdWZmZXJbMV0gPSAoX2IgPSBvcHRpb25zLmdhcEV4dGVuc2lvblBlbmFsdHkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDAuNjtcbiAgICAgICAgbGV0IG9mZnNldCA9IDI7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhbnNmZXJlZFNpbWlsYXJpdHlNYXRyaXgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHN1cHBJbmZvQnVmZmVyLnNldCh0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXSwgb2Zmc2V0KTtcbiAgICAgICAgICAgIG9mZnNldCArPSB0cmFuc2ZlcmVkU2ltaWxhcml0eU1hdHJpeFtpXS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsID0gYFxuICAgICAgICAgICAgZ2FwT3BlblBlbmFsdHkke2VudHJ5SW5kZXh9OiBmMzIsXG4gICAgICAgICAgICBnYXBFeHRlbnNpb25QZW5hbHR5JHtlbnRyeUluZGV4fTogZjMyLFxuICAgICAgICAgICAgc2ltaWxhcml0eU1hdHJpeCR7ZW50cnlJbmRleH06IGFycmF5PGFycmF5PGYzMiwgJHttYXhNb25vbWVySW5kZXggKyAxfT4sICR7bWF4TW9ub21lckluZGV4ICsgMX0+YDtcbiAgICB9XG4gICAgZWxzZSBpZiAoZGlzdGFuY2VNZXRyaWMgPT09IFdFQkdQVURJU1RBTkNFLkRpZmZlcmVuY2UpIHtcbiAgICAgICAgLy8gZm9yIGRpZmZlcmVuY2UsIHdlIG5lZWQgcmFuZ2Ugb2YgdmFsdWVzIGZvciBub3JtYWxpemF0aW9uIG9mIHRoZSBkaWZmZXJlbmNlXG4gICAgICAgIGlmICghb3B0aW9ucy5yYW5nZSB8fCB0eXBlb2Ygb3B0aW9ucy5yYW5nZSAhPT0gJ251bWJlcicgfHwgb3B0aW9ucy5yYW5nZSA8PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBtaW4gPSBmbGF0U291cmNlQXJyYXkucmVkdWNlKChhLCBiKSA9PiBNYXRoLm1pbihhLCBiKSwgZmxhdFNvdXJjZUFycmF5WzBdKTtcbiAgICAgICAgICAgIGNvbnN0IG1heCA9IGZsYXRTb3VyY2VBcnJheS5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpLCBmbGF0U291cmNlQXJyYXlbMF0pO1xuICAgICAgICAgICAgb3B0aW9ucy5yYW5nZSA9IG1heCAtIG1pbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5yYW5nZSA8PSAwKVxuICAgICAgICAgICAgb3B0aW9ucy5yYW5nZSA9IDEuMDsgLy8gdGhpcyBtZWFucyB0aGF0IGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLCBhbmQgYWxsIGRpc3RhbmNlcyB3aWxsIHByb2R1Y2UgMC5cbiAgICAgICAgc3VwcEluZm9TaXplID0gMTtcbiAgICAgICAgc3VwcEluZm9UeXBlID0gXCJGTE9BVDMyQVJSQVlcIiAvKiBXR1BVRU5UUllUWVBFLkZMT0FUMzJBUlJBWSAqLztcbiAgICAgICAgc3VwcEluZm9CdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KFtvcHRpb25zLnJhbmdlXSk7XG4gICAgICAgIHN1cHBJbmZvU3RydWN0V2dzbCA9IGBcbiAgICAgICAgICAgIHJhbmdlJHtlbnRyeUluZGV4fTogZjMyYDtcbiAgICB9XG4gICAgY29uc3QgZGF0YVR5cGVXR1NMID0gZmxhdFNvdXJjZUFycmF5IGluc3RhbmNlb2YgSW50MzJBcnJheSA/ICdpMzInIDogKGZsYXRTb3VyY2VBcnJheSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSA/ICdmMzInIDogJ3UzMicpO1xuICAgIGNvbnN0IGRhdGFTdHJ1Y3RXZ3NsID0gYGRhdGEke2VudHJ5SW5kZXh9OiBhcnJheTxhcnJheTwke2RhdGFUeXBlV0dTTH0sICR7bWF4RW50cnlMZW59PiwgJHtlbmNvZGVkTGlzdC5sZW5ndGh9PmA7XG4gICAgLy8gZm9yIG5vdywgb3RoZXIgZGlzdGFuY2VzIGRvIG5vdCByZXF1aXJlIGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzbyB3ZSBjYW4gc2tpcCB0aGF0XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZmxhdFNvdXJjZUFycmF5LFxuICAgICAgICBzb3VyY2VBcnJheVNpemU6IGZsYXRTb3VyY2VBcnJheS5sZW5ndGgsXG4gICAgICAgIG1heEVudHJ5TGVuLFxuICAgICAgICBhcnJheVNpemVzLFxuICAgICAgICBjb21wbGV4aXR5LFxuICAgICAgICBzdXBwSW5mb0J1ZmZlcixcbiAgICAgICAgc3VwcEluZm9TaXplLFxuICAgICAgICBzdXBwSW5mb1R5cGU6IHN1cHBJbmZvVHlwZSxcbiAgICAgICAgc3VwcEluZm9TdHJ1Y3RXZ3NsLFxuICAgICAgICBlbnRyeVR5cGUsXG4gICAgICAgIGRhdGFUeXBlV0dTTCxcbiAgICAgICAgZGF0YVN0cnVjdFdnc2wsXG4gICAgICAgIEVuY29kZWRBcnJheUNvbnN0cnVjdG9yXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlYkdQVS1wcm9jZXNzLWluZm8uanMubWFwIiwiZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VPYmplY3QsIHRocmVzaG9sZCkge1xuICAgIGNvbnN0IG4gPSBjbHVzdGVyLmxlbmd0aDtcbiAgICBjb25zdCBpcyA9IFtdO1xuICAgIGNvbnN0IGpzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbjsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gY2x1c3RlcltpXTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSBjbHVzdGVyW2pdO1xuICAgICAgICAgICAgaWYgKHNwYXJzZU9iamVjdFthXT8uW2JdID49IHRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGlzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAganMucHVzaChqKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpO1xufVxuZnVuY3Rpb24gZ2V0TGF5b3V0RW1iZWRkaW5ncyhpcywganMsIGNsdXN0ZXIpIHtcbiAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApLm1hcCgoKSA9PiBNYXRoLnJhbmRvbSgpICogMTApO1xuICAgIGNvbnN0IGVtYmVkWSA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCkubWFwKCgpID0+IE1hdGgucmFuZG9tKCkgKiAxMCk7XG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IDEwMDtcbiAgICBjb25zdCB4VmVsb2NpdGllcyA9IG5ldyBGbG9hdDMyQXJyYXkoY2x1c3Rlci5sZW5ndGgpLmZpbGwoMCk7XG4gICAgY29uc3QgeVZlbG9jaXRpZXMgPSBuZXcgRmxvYXQzMkFycmF5KGNsdXN0ZXIubGVuZ3RoKS5maWxsKDApO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHRlbXBlcmF0dXJlID0gKDEgLSBpIC8gaXRlcmF0aW9ucyk7XG4gICAgICAgIHhWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgICAgIHlWZWxvY2l0aWVzLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGlzLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGEgPSBpc1tpZHhdO1xuICAgICAgICAgICAgY29uc3QgYiA9IGpzW2lkeF07XG4gICAgICAgICAgICBjb25zdCBkeCA9IGVtYmVkWFthXSAtIGVtYmVkWFtiXTtcbiAgICAgICAgICAgIGNvbnN0IGR5ID0gZW1iZWRZW2FdIC0gZW1iZWRZW2JdO1xuICAgICAgICAgICAgLy8gICBjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSk7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZhY3RvciA9IChkaXN0YW5jZSAtIDEpIC8gZGlzdGFuY2U7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IG9mZnNldFggPSBkeCAqIGZhY3RvcjtcbiAgICAgICAgICAgIC8vICAgY29uc3Qgb2Zmc2V0WSA9IGR5ICogZmFjdG9yO1xuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR4KSA+PSAxKSB7XG4gICAgICAgICAgICAgICAgeFZlbG9jaXRpZXNbYV0gLT0gdGVtcGVyYXR1cmUgKiBkeDtcbiAgICAgICAgICAgICAgICB4VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGR5KSA+PSAxKSB7XG4gICAgICAgICAgICAgICAgeVZlbG9jaXRpZXNbYV0gLT0gdGVtcGVyYXR1cmUgKiBkeTtcbiAgICAgICAgICAgICAgICB5VmVsb2NpdGllc1tiXSArPSB0ZW1wZXJhdHVyZSAqIGR5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gICBlbWJlZFlbYV0gKz0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICAgICAgLy8gICBlbWJlZFlbYl0gLT0gb2Zmc2V0WSAqIHRlbXBlcmF0dXJlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKykge1xuICAgICAgICAgICAgY29uc3QgdmVjU2l6ZSA9IE1hdGguc3FydCh4VmVsb2NpdGllc1tpZHhdICogeFZlbG9jaXRpZXNbaWR4XSArIHlWZWxvY2l0aWVzW2lkeF0gKiB5VmVsb2NpdGllc1tpZHhdKTtcbiAgICAgICAgICAgIGlmICh2ZWNTaXplID4gMCkge1xuICAgICAgICAgICAgICAgIGVtYmVkWFtpZHhdICs9IHhWZWxvY2l0aWVzW2lkeF0gLyB2ZWNTaXplICogdGVtcGVyYXR1cmU7XG4gICAgICAgICAgICAgICAgZW1iZWRZW2lkeF0gKz0geVZlbG9jaXRpZXNbaWR4XSAvIHZlY1NpemUgKiB0ZW1wZXJhdHVyZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBub3JtYWxpemVcbiAgICBsZXQgbWluWCA9IGVtYmVkWFswXTtcbiAgICBsZXQgbWluWSA9IGVtYmVkWVswXTtcbiAgICBsZXQgbWF4WCA9IGVtYmVkWFswXTtcbiAgICBsZXQgbWF4WSA9IGVtYmVkWVswXTtcbiAgICBmb3IgKGxldCBpZHggPSAxOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspIHtcbiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIGVtYmVkWFtpZHhdKTtcbiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIGVtYmVkWVtpZHhdKTtcbiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIGVtYmVkWFtpZHhdKTtcbiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIGVtYmVkWVtpZHhdKTtcbiAgICB9XG4gICAgbGV0IHJhbmdlWCA9IG1heFggLSBtaW5YO1xuICAgIGxldCByYW5nZVkgPSBtYXhZIC0gbWluWTtcbiAgICBpZiAocmFuZ2VYID09PSAwKVxuICAgICAgICByYW5nZVggPSBtYXhYO1xuICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGNsdXN0ZXIubGVuZ3RoOyBpZHgrKylcbiAgICAgICAgZW1iZWRYW2lkeF0gPSAoZW1iZWRYW2lkeF0gLSBtaW5YKSAvIHJhbmdlWCAvIDIgKyAwLjU7XG4gICAgaWYgKHJhbmdlWSA9PT0gMClcbiAgICAgICAgcmFuZ2VZID0gbWF4WTtcbiAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjbHVzdGVyLmxlbmd0aDsgaWR4KyspXG4gICAgICAgIGVtYmVkWVtpZHhdID0gKGVtYmVkWVtpZHhdIC0gbWluWSkgLyByYW5nZVkgLyAyICsgMC41O1xuICAgIHJldHVybiB7IGVtYmVkWCwgZW1iZWRZIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lZbWx2TFd4aGVXOTFkQzVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkltSnBieTFzWVhsdmRYUXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUlVFc1RVRkJUU3hEUVVGRExFdEJRVXNzVlVGQlZTeFRRVUZUTEVOQlFVTXNUMEZCYVVJc1JVRkJSU3haUVVGblF5eEZRVUZGTEZOQlFXbENPMGxCUTNCSExFMUJRVTBzUTBGQlF5eEhRVUZITEU5QlFVOHNRMEZCUXl4TlFVRk5MRU5CUVVNN1NVRkRla0lzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMGxCUTNoQ0xFMUJRVTBzUlVGQlJTeEhRVUZoTEVWQlFVVXNRMEZCUXp0SlFVTjRRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFGQlF6RkNMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFsQlF6bENMRTFCUVUwc1EwRkJReXhIUVVGSExFOUJRVThzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0WlFVTnlRaXhOUVVGTkxFTkJRVU1zUjBGQlJ5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRja0lzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhEUVVGRExFTkJRVU1zU1VGQlNTeFRRVUZUTEVWQlFVVTdaMEpCUTNKRExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRMWdzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRoUVVOYU8xTkJRMFk3UzBGRFJqdEpRVU5FTEU5QlFVOHNiVUpCUVcxQ0xFTkJRVU1zUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUlN4UFFVRlBMRU5CUVVNc1EwRkJRenRCUVVNNVF5eERRVUZETzBGQlJVUXNVMEZCVXl4dFFrRkJiVUlzUTBGQlF5eEZRVUZaTEVWQlFVVXNSVUZCV1N4RlFVRkZMRTlCUVdsQ08wbEJRM2hGTEUxQlFVMHNUVUZCVFN4SFFVRkhMRWxCUVVrc1dVRkJXU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRMRWxCUVVrc1EwRkJReXhOUVVGTkxFVkJRVVVzUjBGQlJ5eEZRVUZGTEVOQlFVTXNRMEZCUXp0SlFVTjBSaXhOUVVGTkxFMUJRVTBzUjBGQlJ5eEpRVUZKTEZsQlFWa3NRMEZCUXl4UFFVRlBMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNUVUZCVFN4RlFVRkZMRWRCUVVjc1JVRkJSU3hEUVVGRExFTkJRVU03U1VGRGRFWXNUVUZCVFN4VlFVRlZMRWRCUVVjc1IwRkJSeXhEUVVGRE8wbEJRM1pDTEUxQlFVMHNWMEZCVnl4SFFVRkhMRWxCUVVrc1dVRkJXU3hEUVVGRExFOUJRVThzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRE4wUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1NVRkJTU3haUVVGWkxFTkJRVU1zVDBGQlR5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU0zUkN4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NWVUZCVlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRk8xRkJRMjVETEUxQlFVMHNWMEZCVnl4SFFVRkhMRU5CUVVNc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTXNRMEZCUXp0UlFVTjZReXhYUVVGWExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNCQ0xGZEJRVmNzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRjRUlzUzBGQlN5eEpRVUZKTEVkQlFVY3NSMEZCUnl4RFFVRkRMRVZCUVVVc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVWQlFVVXNSMEZCUnl4RlFVRkZMRVZCUVVVN1dVRkRlRU1zVFVGQlRTeERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xbEJRMnhDTEUxQlFVMHNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJReXhIUVVGSExFTkJRVU1zUTBGQlF6dFpRVU5zUWl4TlFVRk5MRVZCUVVVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRMnBETEUxQlFVMHNSVUZCUlN4SFFVRkhMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1dVRkRha01zYlVSQlFXMUVPMWxCUTI1RUxEaERRVUU0UXp0WlFVTTVReXhwUTBGQmFVTTdXVUZEYWtNc2FVTkJRV2xETzFsQlEycERMRWxCUVVrc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNTVUZCU1N4RFFVRkRMRVZCUVVVN1owSkJRM0pDTEZkQlFWY3NRMEZCUXl4RFFVRkRMRU5CUVVNc1NVRkJTU3hYUVVGWExFZEJRVWNzUlVGQlJTeERRVUZETzJkQ1FVTnVReXhYUVVGWExFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NWMEZCVnl4SFFVRkhMRVZCUVVVc1EwRkJRenRoUVVOd1F6dFpRVU5FTEVsQlFVa3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVWQlFVVTdaMEpCUTNKQ0xGZEJRVmNzUTBGQlF5eERRVUZETEVOQlFVTXNTVUZCU1N4WFFVRlhMRWRCUVVjc1JVRkJSU3hEUVVGRE8yZENRVU51UXl4WFFVRlhMRU5CUVVNc1EwRkJReXhEUVVGRExFbEJRVWtzVjBGQlZ5eEhRVUZITEVWQlFVVXNRMEZCUXp0aFFVTndRenRaUVVOSUxIZERRVUYzUXp0WlFVTjRReXgzUTBGQmQwTTdVMEZEZGtNN1VVRkRSQ3hMUVVGTExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSVUZCUlN4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFMUJRVTBzUlVGQlJTeEhRVUZITEVWQlFVVXNSVUZCUlR0WlFVTTNReXhOUVVGTkxFOUJRVThzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTVUZCU1N4RFFVRkRMRmRCUVZjc1EwRkJReXhIUVVGSExFTkJRVU1zUjBGQlJ5eFhRVUZYTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEZkQlFWY3NRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8xbEJRM0pITEVsQlFVa3NUMEZCVHl4SFFVRkhMRU5CUVVNc1JVRkJSVHRuUWtGRFppeE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1YwRkJWeXhEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEU5QlFVOHNSMEZCUnl4WFFVRlhMRU5CUVVNN1owSkJRM2hFTEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1NVRkJTU3hYUVVGWExFTkJRVU1zUjBGQlJ5eERRVUZETEVkQlFVY3NUMEZCVHl4SFFVRkhMRmRCUVZjc1EwRkJRenRoUVVONlJEdFRRVU5HTzB0QlEwWTdTVUZGUkN4WlFVRlpPMGxCUTFvc1NVRkJTU3hKUVVGSkxFZEJRVWNzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMGxCUTNKQ0xFbEJRVWtzU1VGQlNTeEhRVUZITEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRKUVVOeVFpeEpRVUZKTEVsQlFVa3NSMEZCUnl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03U1VGRGNrSXNTVUZCU1N4SlFVRkpMRWRCUVVjc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlEzSkNMRXRCUVVzc1NVRkJTU3hIUVVGSExFZEJRVWNzUTBGQlF5eEZRVUZGTEVkQlFVY3NSMEZCUnl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTzFGQlF6ZERMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVsQlFVa3NSVUZCUlN4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU51UXl4SlFVRkpMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVWQlFVVXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRGJrTXNTVUZCU1N4SFFVRkhMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeEZRVUZGTEUxQlFVMHNRMEZCUXl4SFFVRkhMRU5CUVVNc1EwRkJReXhEUVVGRE8xRkJRMjVETEVsQlFVa3NSMEZCUnl4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFbEJRVWtzUlVGQlJTeE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRMUVVOd1F6dEpRVU5FTEVsQlFVa3NUVUZCVFN4SFFVRkhMRWxCUVVrc1IwRkJSeXhKUVVGSkxFTkJRVU03U1VGRGVrSXNTVUZCU1N4TlFVRk5MRWRCUVVjc1NVRkJTU3hIUVVGSExFbEJRVWtzUTBGQlF6dEpRVU42UWl4SlFVRkpMRTFCUVUwc1MwRkJTeXhEUVVGRE8xRkJRMlFzVFVGQlRTeEhRVUZITEVsQlFVa3NRMEZCUXp0SlFVTm9RaXhMUVVGTExFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNSVUZCUlN4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFMUJRVTBzUlVGQlJTeEhRVUZITEVWQlFVVTdVVUZETTBNc1RVRkJUU3hEUVVGRExFZEJRVWNzUTBGQlF5eEhRVUZITEVOQlFVTXNUVUZCVFN4RFFVRkRMRWRCUVVjc1EwRkJReXhIUVVGSExFbEJRVWtzUTBGQlF5eEhRVUZITEUxQlFVMHNSMEZCUnl4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRE8wbEJRM2hFTEVsQlFVa3NUVUZCVFN4TFFVRkxMRU5CUVVNN1VVRkRaQ3hOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETzBsQlEyaENMRXRCUVVzc1NVRkJTU3hIUVVGSExFZEJRVWNzUTBGQlF5eEZRVUZGTEVkQlFVY3NSMEZCUnl4UFFVRlBMRU5CUVVNc1RVRkJUU3hGUVVGRkxFZEJRVWNzUlVGQlJUdFJRVU16UXl4TlFVRk5MRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzUTBGQlF5eE5RVUZOTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzVFVGQlRTeEhRVUZITEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNN1NVRkZlRVFzVDBGQlR5eEZRVUZETEUxQlFVMHNSVUZCUlN4TlFVRk5MRVZCUVVNc1EwRkJRenRCUVVNeFFpeERRVUZESWl3aWMyOTFjbU5sYzBOdmJuUmxiblFpT2xzaWFXMXdiM0owSUh0VGNHRnljMlZOWVhSeWFYaFBZbXBsWTNSOUlHWnliMjBnSnk0dmRIbHdaWE1uTzF4dVhHNWxlSEJ2Y25RZ1lYTjVibU1nWm5WdVkzUnBiMjRnWW1sdlRHRjViM1YwS0dOc2RYTjBaWEk2SUc1MWJXSmxjbHRkTENCemNHRnljMlZQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ3dnZEdoeVpYTm9iMnhrT2lCdWRXMWlaWElwSUh0Y2JpQWdZMjl1YzNRZ2JpQTlJR05zZFhOMFpYSXViR1Z1WjNSb08xeHVJQ0JqYjI1emRDQnBjem9nYm5WdFltVnlXMTBnUFNCYlhUdGNiaUFnWTI5dWMzUWdhbk02SUc1MWJXSmxjbHRkSUQwZ1cxMDdYRzRnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2Jqc2dhU3NyS1NCN1hHNGdJQ0FnWm05eUlDaHNaWFFnYWlBOUlHa2dLeUF4T3lCcUlEd2dianNnYWlzcktTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCaElEMGdZMngxYzNSbGNsdHBYVHRjYmlBZ0lDQWdJR052Ym5OMElHSWdQU0JqYkhWemRHVnlXMnBkTzF4dUlDQWdJQ0FnYVdZZ0tITndZWEp6WlU5aWFtVmpkRnRoWFQ4dVcySmRJRDQ5SUhSb2NtVnphRzlzWkNrZ2UxeHVJQ0FnSUNBZ0lDQnBjeTV3ZFhOb0tHa3BPMXh1SUNBZ0lDQWdJQ0JxY3k1d2RYTm9LR29wTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0J5WlhSMWNtNGdaMlYwVEdGNWIzVjBSVzFpWldSa2FXNW5jeWhwY3l3Z2FuTXNJR05zZFhOMFpYSXBPMXh1ZlZ4dVhHNW1kVzVqZEdsdmJpQm5aWFJNWVhsdmRYUkZiV0psWkdScGJtZHpLR2x6T2lCdWRXMWlaWEpiWFN3Z2FuTTZJRzUxYldKbGNsdGRMQ0JqYkhWemRHVnlPaUJ1ZFcxaVpYSmJYU2tnZTF4dUlDQmpiMjV6ZENCbGJXSmxaRmdnUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0dOc2RYTjBaWEl1YkdWdVozUm9LUzVtYVd4c0tEQXBMbTFoY0Nnb0tTQTlQaUJOWVhSb0xuSmhibVJ2YlNncElDb2dNVEFwTzF4dUlDQmpiMjV6ZENCbGJXSmxaRmtnUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0dOc2RYTjBaWEl1YkdWdVozUm9LUzVtYVd4c0tEQXBMbTFoY0Nnb0tTQTlQaUJOWVhSb0xuSmhibVJ2YlNncElDb2dNVEFwTzF4dUlDQmpiMjV6ZENCcGRHVnlZWFJwYjI1eklEMGdNVEF3TzF4dUlDQmpiMjV6ZENCNFZtVnNiMk5wZEdsbGN5QTlJRzVsZHlCR2JHOWhkRE15UVhKeVlYa29ZMngxYzNSbGNpNXNaVzVuZEdncExtWnBiR3dvTUNrN1hHNGdJR052Ym5OMElIbFdaV3h2WTJsMGFXVnpJRDBnYm1WM0lFWnNiMkYwTXpKQmNuSmhlU2hqYkhWemRHVnlMbXhsYm1kMGFDa3VabWxzYkNnd0tUdGNiaUFnWm05eUlDaHNaWFFnYVNBOUlEQTdJR2tnUENCcGRHVnlZWFJwYjI1ek95QnBLeXNwSUh0Y2JpQWdJQ0JqYjI1emRDQjBaVzF3WlhKaGRIVnlaU0E5SUNneElDMGdhU0F2SUdsMFpYSmhkR2x2Ym5NcE8xeHVJQ0FnSUhoV1pXeHZZMmwwYVdWekxtWnBiR3dvTUNrN1hHNGdJQ0FnZVZabGJHOWphWFJwWlhNdVptbHNiQ2d3S1R0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwWkhnZ1BTQXdPeUJwWkhnZ1BDQnBjeTVzWlc1bmRHZzdJR2xrZUNzcktTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCaElEMGdhWE5iYVdSNFhUdGNiaUFnSUNBZ0lHTnZibk4wSUdJZ1BTQnFjMXRwWkhoZE8xeHVJQ0FnSUNBZ1kyOXVjM1FnWkhnZ1BTQmxiV0psWkZoYllWMGdMU0JsYldKbFpGaGJZbDA3WEc0Z0lDQWdJQ0JqYjI1emRDQmtlU0E5SUdWdFltVmtXVnRoWFNBdElHVnRZbVZrV1Z0aVhUdGNiaUFnSUNBZ0lDOHZJQ0FnWTI5dWMzUWdaR2x6ZEdGdVkyVWdQU0JOWVhSb0xuTnhjblFvWkhnZ0tpQmtlQ0FySUdSNUlDb2daSGtwTzF4dUlDQWdJQ0FnTHk4Z0lDQmpiMjV6ZENCbVlXTjBiM0lnUFNBb1pHbHpkR0Z1WTJVZ0xTQXhLU0F2SUdScGMzUmhibU5sTzF4dUlDQWdJQ0FnTHk4Z0lDQmpiMjV6ZENCdlptWnpaWFJZSUQwZ1pIZ2dLaUJtWVdOMGIzSTdYRzRnSUNBZ0lDQXZMeUFnSUdOdmJuTjBJRzltWm5ObGRGa2dQU0JrZVNBcUlHWmhZM1J2Y2p0Y2JpQWdJQ0FnSUdsbUlDaE5ZWFJvTG1GaWN5aGtlQ2tnUGowZ01Ta2dlMXh1SUNBZ0lDQWdJQ0I0Vm1Wc2IyTnBkR2xsYzF0aFhTQXRQU0IwWlcxd1pYSmhkSFZ5WlNBcUlHUjRPMXh1SUNBZ0lDQWdJQ0I0Vm1Wc2IyTnBkR2xsYzF0aVhTQXJQU0IwWlcxd1pYSmhkSFZ5WlNBcUlHUjRPMXh1SUNBZ0lDQWdmVnh1SUNBZ0lDQWdhV1lnS0UxaGRHZ3VZV0p6S0dSNUtTQStQU0F4S1NCN1hHNGdJQ0FnSUNBZ0lIbFdaV3h2WTJsMGFXVnpXMkZkSUMwOUlIUmxiWEJsY21GMGRYSmxJQ29nWkhrN1hHNGdJQ0FnSUNBZ0lIbFdaV3h2WTJsMGFXVnpXMkpkSUNzOUlIUmxiWEJsY21GMGRYSmxJQ29nWkhrN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnTHk4Z0lDQmxiV0psWkZsYllWMGdLejBnYjJabWMyVjBXU0FxSUhSbGJYQmxjbUYwZFhKbE8xeHVJQ0FnSUM4dklDQWdaVzFpWldSWlcySmRJQzA5SUc5bVpuTmxkRmtnS2lCMFpXMXdaWEpoZEhWeVpUdGNiaUFnSUNCOVhHNGdJQ0FnWm05eUlDaHNaWFFnYVdSNElEMGdNRHNnYVdSNElEd2dZMngxYzNSbGNpNXNaVzVuZEdnN0lHbGtlQ3NyS1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0IyWldOVGFYcGxJRDBnVFdGMGFDNXpjWEowS0hoV1pXeHZZMmwwYVdWelcybGtlRjBnS2lCNFZtVnNiMk5wZEdsbGMxdHBaSGhkSUNzZ2VWWmxiRzlqYVhScFpYTmJhV1I0WFNBcUlIbFdaV3h2WTJsMGFXVnpXMmxrZUYwcE8xeHVJQ0FnSUNBZ2FXWWdLSFpsWTFOcGVtVWdQaUF3S1NCN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV0Z0cFpIaGRJQ3M5SUhoV1pXeHZZMmwwYVdWelcybGtlRjBnTHlCMlpXTlRhWHBsSUNvZ2RHVnRjR1Z5WVhSMWNtVTdYRzRnSUNBZ0lDQWdJR1Z0WW1Wa1dWdHBaSGhkSUNzOUlIbFdaV3h2WTJsMGFXVnpXMmxrZUYwZ0x5QjJaV05UYVhwbElDb2dkR1Z0Y0dWeVlYUjFjbVU3WEc0Z0lDQWdJQ0I5WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnTHk4Z2JtOXliV0ZzYVhwbFhHNGdJR3hsZENCdGFXNVlJRDBnWlcxaVpXUllXekJkTzF4dUlDQnNaWFFnYldsdVdTQTlJR1Z0WW1Wa1dWc3dYVHRjYmlBZ2JHVjBJRzFoZUZnZ1BTQmxiV0psWkZoYk1GMDdYRzRnSUd4bGRDQnRZWGhaSUQwZ1pXMWlaV1JaV3pCZE8xeHVJQ0JtYjNJZ0tHeGxkQ0JwWkhnZ1BTQXhPeUJwWkhnZ1BDQmpiSFZ6ZEdWeUxteGxibWQwYURzZ2FXUjRLeXNwSUh0Y2JpQWdJQ0J0YVc1WUlEMGdUV0YwYUM1dGFXNG9iV2x1V0N3Z1pXMWlaV1JZVzJsa2VGMHBPMXh1SUNBZ0lHMXBibGtnUFNCTllYUm9MbTFwYmlodGFXNVpMQ0JsYldKbFpGbGJhV1I0WFNrN1hHNGdJQ0FnYldGNFdDQTlJRTFoZEdndWJXRjRLRzFoZUZnc0lHVnRZbVZrV0Z0cFpIaGRLVHRjYmlBZ0lDQnRZWGhaSUQwZ1RXRjBhQzV0WVhnb2JXRjRXU3dnWlcxaVpXUlpXMmxrZUYwcE8xeHVJQ0I5WEc0Z0lHeGxkQ0J5WVc1blpWZ2dQU0J0WVhoWUlDMGdiV2x1V0R0Y2JpQWdiR1YwSUhKaGJtZGxXU0E5SUcxaGVGa2dMU0J0YVc1Wk8xeHVJQ0JwWmlBb2NtRnVaMlZZSUQwOVBTQXdLVnh1SUNBZ0lISmhibWRsV0NBOUlHMWhlRmc3WEc0Z0lHWnZjaUFvYkdWMElHbGtlQ0E5SURBN0lHbGtlQ0E4SUdOc2RYTjBaWEl1YkdWdVozUm9PeUJwWkhnckt5bGNiaUFnSUNCbGJXSmxaRmhiYVdSNFhTQTlJQ2hsYldKbFpGaGJhV1I0WFNBdElHMXBibGdwSUM4Z2NtRnVaMlZZSUM4Z01pQXJJREF1TlR0Y2JpQWdhV1lnS0hKaGJtZGxXU0E5UFQwZ01DbGNiaUFnSUNCeVlXNW5aVmtnUFNCdFlYaFpPMXh1SUNCbWIzSWdLR3hsZENCcFpIZ2dQU0F3T3lCcFpIZ2dQQ0JqYkhWemRHVnlMbXhsYm1kMGFEc2dhV1I0S3lzcFhHNGdJQ0FnWlcxaVpXUlpXMmxrZUYwZ1BTQW9aVzFpWldSWlcybGtlRjBnTFNCdGFXNVpLU0F2SUhKaGJtZGxXU0F2SURJZ0t5QXdMalU3WEc1Y2JpQWdjbVYwZFhKdUlIdGxiV0psWkZnc0lHVnRZbVZrV1gwN1hHNTlYRzRpWFgwPSIsInZhciBfX2F3YWl0ZXIgPSAodGhpcyAmJiB0aGlzLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxuICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gICAgfSk7XG59O1xuLyoqXG4gKiBjb2x3aXNlIG5vcm1hbGl6ZSB0aGUga25uIHNpbWlsYXJpdGllc1xuICogQkUgV0FSRSwgbW9kaWZpZXMgdGhlIGlucHV0IGFycmF5IGluIHBsYWNlXG4gKiBAcGFyYW0gZGV2aWNlXG4gKiBAcGFyYW0ga25uU2ltaWxhcml0aWVzXG4gKiBAcGFyYW0gb2Zmc2V0c1xuICogQHBhcmFtIG5Sb3dzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VLTk5Ob3JhbGl6ZUNvbHdpc2UoZGV2aWNlLCBrbm5TaW1pbGFyaXRpZXMsIG9mZnNldHMsIG5Sb3dzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbmVlZGVkVGhyZWFkcyA9IG5Sb3dzO1xuICAgICAgICBjb25zdCB3b3JrR3JvdXBUaHJlYWRzUGVyRGltID0gMTA7XG4gICAgICAgIGNvbnN0IHRvdGFsV29ya2dyb3VwVGhyZWFkcyA9IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gKiB3b3JrR3JvdXBUaHJlYWRzUGVyRGltO1xuICAgICAgICBjb25zdCBuZWVkZWRXb3JrR3JvdXBzID0gTWF0aC5jZWlsKG5lZWRlZFRocmVhZHMgLyB0b3RhbFdvcmtncm91cFRocmVhZHMpO1xuICAgICAgICBjb25zdCB3b3JrR3JvdXBEaW0gPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KG5lZWRlZFdvcmtHcm91cHMpKTtcbiAgICAgICAgY29uc3QgdGhyZWFkc1BlckRpbSA9IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gKiB3b3JrR3JvdXBEaW07XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGRldmljZS5jcmVhdGVTaGFkZXJNb2R1bGUoe1xuICAgICAgICAgICAgbGFiZWw6ICdjb2x3aXNlLW5vcm1hbGl6ZScsXG4gICAgICAgICAgICBjb2RlOiBgXG4gICAgICAgIEBncm91cCgwKSBAYmluZGluZygwKSB2YXI8c3RvcmFnZSwgcmVhZF93cml0ZT4ga25uU2ltaWxhcml0aWVzIDogYXJyYXk8ZjMyPjtcbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlLCByZWFkPiBvZmZzZXRzIDogYXJyYXk8dTMyPjtcbiAgICAgICAgQGNvbXB1dGUgQHdvcmtncm91cF9zaXplKCR7d29ya0dyb3VwVGhyZWFkc1BlckRpbX0sICR7d29ya0dyb3VwVGhyZWFkc1BlckRpbX0pIGZuIG5vcm1hbGl6ZShcbiAgICAgICAgICAgIEBidWlsdGluKGdsb2JhbF9pbnZvY2F0aW9uX2lkKSBpZDogdmVjMzx1MzI+LFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgbGV0IHJvdyA9IGlkLng7XG4gICAgICAgICAgICBsZXQgY29sID0gaWQueTtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJvdyAqICR7dGhyZWFkc1BlckRpbX0gKyBjb2w7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gJHtuUm93c30pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgb2Zmc2V0QmVnaW4gPSBvZmZzZXRzW2luZGV4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRFbmQgPSBvZmZzZXRzW2luZGV4ICsgMV07XG4gICAgICAgICAgICB2YXIgc3VtID0gMC4wO1xuICAgICAgICAgICAgaWYgKG9mZnNldEVuZCAtIG9mZnNldEJlZ2luID09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gb2Zmc2V0QmVnaW47IGkgPCBvZmZzZXRFbmQ7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIHN1bSA9IHN1bSArIGtublNpbWlsYXJpdGllc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzdW0gPiAwLjApIHtcbiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IG9mZnNldEJlZ2luOyBpIDwgb2Zmc2V0RW5kOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICAgIGtublNpbWlsYXJpdGllc1tpXSA9IGtublNpbWlsYXJpdGllc1tpXSAvIHN1bTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGAsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwaXBlbGluZSA9IGRldmljZS5jcmVhdGVDb21wdXRlUGlwZWxpbmUoe1xuICAgICAgICAgICAgbGFiZWw6ICdoYW1taW5nIGNvbXB1dGUgcGlwZWxpbmUnLFxuICAgICAgICAgICAgbGF5b3V0OiAnYXV0bycsXG4gICAgICAgICAgICBjb21wdXRlOiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLFxuICAgICAgICAgICAgICAgIGVudHJ5UG9pbnQ6ICdub3JtYWxpemUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNpbW1pbGFyaXRpZXNCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc2ltbWlsYXJpdGllcyBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBrbm5TaW1pbGFyaXRpZXMuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgICAgICBtYXBwZWRBdENyZWF0aW9uOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgbmV3IEZsb2F0MzJBcnJheShzaW1taWxhcml0aWVzQnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChrbm5TaW1pbGFyaXRpZXMpO1xuICAgICAgICBzaW1taWxhcml0aWVzQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIGNvbnN0IG9mZnNldHNCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnb2Zmc2V0cyBpbmZvIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBvZmZzZXRzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBVaW50MzJBcnJheShvZmZzZXRzQnVmZmVyLmdldE1hcHBlZFJhbmdlKCkpLnNldChvZmZzZXRzKTtcbiAgICAgICAgb2Zmc2V0c0J1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtcbiAgICAgICAgICAgIGxheW91dDogcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAgICAgZW50cmllczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZzogMCxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogc2ltbWlsYXJpdGllc0J1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYmluZGluZzogMSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2U6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogb2Zmc2V0c0J1ZmZlcixcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGNvbW1hbmRFbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKCk7XG4gICAgICAgIGNvbnN0IHBhc3NFbmNvZGVyID0gY29tbWFuZEVuY29kZXIuYmVnaW5Db21wdXRlUGFzcygpO1xuICAgICAgICBwYXNzRW5jb2Rlci5zZXRQaXBlbGluZShwaXBlbGluZSk7XG4gICAgICAgIHBhc3NFbmNvZGVyLnNldEJpbmRHcm91cCgwLCBiaW5kR3JvdXApO1xuICAgICAgICBwYXNzRW5jb2Rlci5kaXNwYXRjaFdvcmtncm91cHMod29ya0dyb3VwRGltLCB3b3JrR3JvdXBEaW0pO1xuICAgICAgICBwYXNzRW5jb2Rlci5lbmQoKTtcbiAgICAgICAgY29uc3Qgb3V0U2ltaWxhcml0eUJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdvdXQgc2ltaWxhcml0eSBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZToga25uU2ltaWxhcml0aWVzLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUQgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1hbmRFbmNvZGVyLmNvcHlCdWZmZXJUb0J1ZmZlcihzaW1taWxhcml0aWVzQnVmZmVyLCAwLCBvdXRTaW1pbGFyaXR5QnVmZmVyLCAwLCBrbm5TaW1pbGFyaXRpZXMuYnl0ZUxlbmd0aCk7XG4gICAgICAgIGRldmljZS5xdWV1ZS5zdWJtaXQoW2NvbW1hbmRFbmNvZGVyLmZpbmlzaCgpXSk7XG4gICAgICAgIHlpZWxkIGRldmljZS5xdWV1ZS5vblN1Ym1pdHRlZFdvcmtEb25lKCk7XG4gICAgICAgIHlpZWxkIG91dFNpbWlsYXJpdHlCdWZmZXIubWFwQXN5bmMoR1BVTWFwTW9kZS5SRUFEKTtcbiAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KG91dFNpbWlsYXJpdHlCdWZmZXIuZ2V0TWFwcGVkUmFuZ2UoKSk7XG4gICAgICAgIGtublNpbWlsYXJpdGllcy5zZXQoYXJyYXlCdWZmZXIpO1xuICAgICAgICBvdXRTaW1pbGFyaXR5QnVmZmVyLnVubWFwKCk7XG4gICAgICAgIHNpbW1pbGFyaXRpZXNCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBvZmZzZXRzQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgb3V0U2ltaWxhcml0eUJ1ZmZlci5kZXN0cm95KCk7XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb2x3aXNlLW5vcm1hbGl6ZS5qcy5tYXAiLCJ2YXIgX19hd2FpdGVyID0gKHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cbiAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH1cbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICAgIH0pO1xufTtcbi8qKlxuICogaW5mbGF0aW9uIG9wZXJhdG9yIGluIHBsYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmZsYXRlKGtublNpbWlsYXJpdGllcywgZmFjdG9yID0gMikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwga25uU2ltaWxhcml0aWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICBrbm5TaW1pbGFyaXRpZXNbaV0gPSBNYXRoLnBvdyhrbm5TaW1pbGFyaXRpZXNbaV0sIGZhY3Rvcik7XG59XG5mdW5jdGlvbiBnZXRSb3dJbmRleGVzKG9mZnNldHMpIHtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDMyQXJyYXkob2Zmc2V0c1tvZmZzZXRzLmxlbmd0aCAtIDFdKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9mZnNldHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGZvciAobGV0IGogPSBvZmZzZXRzW2ldOyBqIDwgb2Zmc2V0c1tpICsgMV07IGorKylcbiAgICAgICAgICAgIHJlc1tqXSA9IGk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59XG4vLyB0aGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBsb29raW5nIGF0IGFscmVhZHkgemVyb2VkIG91dCB2YWx1ZXMsIGFuZCBvbmx5IGxvb2tzIGF0IGxpdmUgY2VsbHMuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kTm9SZXZpdmUoZGV2aWNlLCBrbm5TaW1pbGFyaXRpZXMsIGtubkluZGV4ZXMsIG9mZnNldHMsIG5Sb3dzKSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbmVlZGVkVGhyZWFkcyA9IDkwMDAwO1xuICAgICAgICBjb25zdCB3b3JrR3JvdXBUaHJlYWRzUGVyRGltID0gMTA7XG4gICAgICAgIGNvbnN0IHRvdGFsV29ya2dyb3VwVGhyZWFkcyA9IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gKiB3b3JrR3JvdXBUaHJlYWRzUGVyRGltO1xuICAgICAgICBjb25zdCBuZWVkZWRXb3JrR3JvdXBzID0gTWF0aC5jZWlsKG5lZWRlZFRocmVhZHMgLyB0b3RhbFdvcmtncm91cFRocmVhZHMpO1xuICAgICAgICBjb25zdCB3b3JrR3JvdXBEaW0gPSBNYXRoLmNlaWwoTWF0aC5zcXJ0KG5lZWRlZFdvcmtHcm91cHMpKTtcbiAgICAgICAgY29uc3QgdGhyZWFkc1BlckRpbSA9IHdvcmtHcm91cFRocmVhZHNQZXJEaW0gKiB3b3JrR3JvdXBEaW07XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgLy8gbWluaW11bSB2YWx1ZSBhZnRlciBleHBhbnNpb24uXG4gICAgICAgIGNvbnN0IHBydW5lVmFsdWUgPSBNYXRoLnBvdygxMCwgLW9yZGVyKTtcbiAgICAgICAgY29uc3Qgb3V0S05OU2ltaWxhcml0aWVzID0gbmV3IEZsb2F0MzJBcnJheShrbm5TaW1pbGFyaXRpZXMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgbW9kdWxlID0gZGV2aWNlLmNyZWF0ZVNoYWRlck1vZHVsZSh7XG4gICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCcsXG4gICAgICAgICAgICBjb2RlOiBgXG4gICAgICAgIHN0cnVjdCBTcGFyc2VLTk4ge1xuICAgICAgICAgICAga25uU2ltaWxhcml0aWVzOiBhcnJheTxmMzIsICR7a25uU2ltaWxhcml0aWVzLmxlbmd0aH0+LFxuICAgICAgICAgICAga25uSW5kZXhlczogYXJyYXk8dTMyLCAke2tubkluZGV4ZXMubGVuZ3RofT4sXG4gICAgICAgICAgICBvZmZzZXRzOiBhcnJheTx1MzIsICR7b2Zmc2V0cy5sZW5ndGh9PixcbiAgICAgICAgICAgIHJvd0luZGV4ZXM6IGFycmF5PHUzMiwgJHtrbm5JbmRleGVzLmxlbmd0aH0+LFxuICAgICAgICB9XG5cbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDApIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBzcGFyc2VLTk46IFNwYXJzZUtOTjtcbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDEpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiByZXN1bHRTaW1CbG9jazogYXJyYXk8ZjMyLCAke25lZWRlZFRocmVhZHN9PjtcbiAgICAgICAgQGdyb3VwKDApIEBiaW5kaW5nKDIpIHZhcjxzdG9yYWdlLCByZWFkX3dyaXRlPiBzdGFydEF0OiB1MzI7XG4gICAgICAgIEBjb21wdXRlIEB3b3JrZ3JvdXBfc2l6ZSgke3dvcmtHcm91cFRocmVhZHNQZXJEaW19LCAke3dvcmtHcm91cFRocmVhZHNQZXJEaW19KSBmbiBleHBhbmQoXG4gICAgICAgICAgICBAYnVpbHRpbihnbG9iYWxfaW52b2NhdGlvbl9pZCkgaWQ6IHZlYzM8dTMyPixcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBjb2wgPSBpZC54O1xuICAgICAgICAgICAgbGV0IHJvdyA9IGlkLnk7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSByb3cgKiAke3RocmVhZHNQZXJEaW19ICsgY29sO1xuICAgICAgICAgICAgaWYgKGluZGV4ID49ICR7bmVlZGVkVGhyZWFkc30pIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgd29ya2luZ0luZGV4ID0gaW5kZXggKyBzdGFydEF0O1xuICAgICAgICAgICAgaWYgKHdvcmtpbmdJbmRleCA+PSAke2tubkluZGV4ZXMubGVuZ3RofSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHJvd0lkeCA9IHNwYXJzZUtOTi5yb3dJbmRleGVzW3dvcmtpbmdJbmRleF07XG4gICAgICAgICAgICBsZXQgY29sSWR4ID0gc3BhcnNlS05OLmtubkluZGV4ZXNbd29ya2luZ0luZGV4XTtcbiAgICAgICAgICAgIGxldCBvZmZzZXRCZWdpblJvdyA9IHNwYXJzZUtOTi5vZmZzZXRzW3Jvd0lkeF07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0RW5kUm93ID0gc3BhcnNlS05OLm9mZnNldHNbcm93SWR4ICsgMV07XG4gICAgICAgICAgICBsZXQgb2Zmc2V0QmVnaW5Db2wgPSBzcGFyc2VLTk4ub2Zmc2V0c1tjb2xJZHhdO1xuICAgICAgICAgICAgbGV0IG9mZnNldEVuZENvbCA9IHNwYXJzZUtOTi5vZmZzZXRzW2NvbElkeCArIDFdO1xuICAgICAgICAgICAgdmFyIHN1bSA9IDAuMDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBvZmZzZXRCZWdpblJvdzsgaSA8IG9mZnNldEVuZFJvdzsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgZm9yKHZhciBqID0gb2Zmc2V0QmVnaW5Db2w7IGogPCBvZmZzZXRFbmRDb2w7IGogPSBqICsgMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3BhcnNlS05OLmtubkluZGV4ZXNbaV0gPT0gc3BhcnNlS05OLmtubkluZGV4ZXNbal0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSArIHNwYXJzZUtOTi5rbm5TaW1pbGFyaXRpZXNbaV0gKiBzcGFyc2VLTk4ua25uU2ltaWxhcml0aWVzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VtID4gJHtwcnVuZVZhbHVlfSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdFNpbUJsb2NrW2luZGV4XSA9IHN1bTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0U2ltQmxvY2tbaW5kZXhdID0gMC4wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgYFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcGlwZWxpbmUgPSBkZXZpY2UuY3JlYXRlQ29tcHV0ZVBpcGVsaW5lKHtcbiAgICAgICAgICAgIGxhYmVsOiAnZXhwYW5kIGNvbXB1dGUgcGlwZWxpbmUnLFxuICAgICAgICAgICAgbGF5b3V0OiAnYXV0bycsXG4gICAgICAgICAgICBjb21wdXRlOiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlOiBtb2R1bGUsXG4gICAgICAgICAgICAgICAgZW50cnlQb2ludDogJ2V4cGFuZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3Qgc3BhcnNlS05OQnVmZmVyMzJTaXplID0ga25uU2ltaWxhcml0aWVzLmxlbmd0aCArIGtubkluZGV4ZXMubGVuZ3RoICsgb2Zmc2V0cy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aDtcbiAgICAgICAgbGV0IHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplID0gc3BhcnNlS05OQnVmZmVyMzJTaXplICogNDtcbiAgICAgICAgY29uc3QgcmVtYWluZGVyID0gc3BhcnNlS05OQnVmZmVyQnl0ZVNpemUgJiAxNTtcbiAgICAgICAgaWYgKHJlbWFpbmRlciAhPT0gMClcbiAgICAgICAgICAgIHNwYXJzZUtOTkJ1ZmZlckJ5dGVTaXplICs9IDE2IC0gcmVtYWluZGVyO1xuICAgICAgICBjb25zdCBzcGFyc2VLTk5CdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAnc3BhcnNlIGtubiBidWZmZXInLFxuICAgICAgICAgICAgc2l6ZTogc3BhcnNlS05OQnVmZmVyQnl0ZVNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkFycmF5QnVmZmVyID0gc3BhcnNlS05OQnVmZmVyLmdldE1hcHBlZFJhbmdlKCk7XG4gICAgICAgIC8vIHNldCBzaW1pbGFyaXRpZXNcbiAgICAgICAgbmV3IEZsb2F0MzJBcnJheShzcGFyc2VLTk5BcnJheUJ1ZmZlciwgMCwga25uU2ltaWxhcml0aWVzLmxlbmd0aCkuc2V0KGtublNpbWlsYXJpdGllcyk7XG4gICAgICAgIC8vIHNldCBpbmRleGVzXG4gICAgICAgIG5ldyBVaW50MzJBcnJheShzcGFyc2VLTk5BcnJheUJ1ZmZlciwga25uU2ltaWxhcml0aWVzLmxlbmd0aCAqIDQsIGtubkluZGV4ZXMubGVuZ3RoKS5zZXQoa25uSW5kZXhlcyk7XG4gICAgICAgIC8vIHNldCBvZmZzZXRzXG4gICAgICAgIG5ldyBVaW50MzJBcnJheShzcGFyc2VLTk5BcnJheUJ1ZmZlciwgKGtublNpbWlsYXJpdGllcy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aCkgKiA0LCBvZmZzZXRzLmxlbmd0aCkuc2V0KG9mZnNldHMpO1xuICAgICAgICAvLyBzZXQgcm93IGluZGV4ZXNcbiAgICAgICAgY29uc3Qgcm93SW5kZXhlcyA9IGdldFJvd0luZGV4ZXMob2Zmc2V0cyk7XG4gICAgICAgIG5ldyBVaW50MzJBcnJheShzcGFyc2VLTk5BcnJheUJ1ZmZlciwgKGtublNpbWlsYXJpdGllcy5sZW5ndGggKyBrbm5JbmRleGVzLmxlbmd0aCArIG9mZnNldHMubGVuZ3RoKSAqIDQsIHJvd0luZGV4ZXMubGVuZ3RoKS5zZXQocm93SW5kZXhlcyk7XG4gICAgICAgIHNwYXJzZUtOTkJ1ZmZlci51bm1hcCgpO1xuICAgICAgICBjb25zdCBzdGFydEJ1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdzdGFydCBlbmQgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IDQsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuU1RPUkFHRSB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9TUkMgfFxuICAgICAgICAgICAgICAgIEdQVUJ1ZmZlclVzYWdlLkNPUFlfRFNULFxuICAgICAgICAgICAgbWFwcGVkQXRDcmVhdGlvbjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIG5ldyBVaW50MzJBcnJheShzdGFydEJ1ZmZlci5nZXRNYXBwZWRSYW5nZSgpKS5zZXQoWzBdKTtcbiAgICAgICAgc3RhcnRCdWZmZXIudW5tYXAoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0QmxvY2tCdWZmZXIgPSBkZXZpY2UuY3JlYXRlQnVmZmVyKHtcbiAgICAgICAgICAgIGxhYmVsOiAncmVzdWx0IGJsb2NrIGJ1ZmZlcicsXG4gICAgICAgICAgICBzaXplOiBuZWVkZWRUaHJlYWRzICogNCxcbiAgICAgICAgICAgIHVzYWdlOiBHUFVCdWZmZXJVc2FnZS5TVE9SQUdFIHxcbiAgICAgICAgICAgICAgICBHUFVCdWZmZXJVc2FnZS5DT1BZX1NSQyB8XG4gICAgICAgICAgICAgICAgR1BVQnVmZmVyVXNhZ2UuQ09QWV9EU1QsXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBiaW5kR3JvdXAgPSBkZXZpY2UuY3JlYXRlQmluZEdyb3VwKHtcbiAgICAgICAgICAgIGxheW91dDogcGlwZWxpbmUuZ2V0QmluZEdyb3VwTGF5b3V0KDApLFxuICAgICAgICAgICAgZW50cmllczogW1xuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMCwgcmVzb3VyY2U6IHsgYnVmZmVyOiBzcGFyc2VLTk5CdWZmZXIgfSB9LFxuICAgICAgICAgICAgICAgIHsgYmluZGluZzogMSwgcmVzb3VyY2U6IHsgYnVmZmVyOiByZXN1bHRCbG9ja0J1ZmZlciB9IH0sXG4gICAgICAgICAgICAgICAgeyBiaW5kaW5nOiAyLCByZXNvdXJjZTogeyBidWZmZXI6IHN0YXJ0QnVmZmVyIH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBvdXRCbG9ja0J1ZmZlciA9IGRldmljZS5jcmVhdGVCdWZmZXIoe1xuICAgICAgICAgICAgbGFiZWw6ICdvdXQgYmxvY2sgYnVmZmVyJyxcbiAgICAgICAgICAgIHNpemU6IHJlc3VsdEJsb2NrQnVmZmVyLnNpemUsXG4gICAgICAgICAgICB1c2FnZTogR1BVQnVmZmVyVXNhZ2UuTUFQX1JFQUQgfCBHUFVCdWZmZXJVc2FnZS5DT1BZX0RTVFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBNYXRoLmNlaWwoa25uSW5kZXhlcy5sZW5ndGggLyBuZWVkZWRUaHJlYWRzKTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IGkgKiBuZWVkZWRUaHJlYWRzO1xuICAgICAgICAgICAgY29uc3QgY3VyTGVuZ3RoID0gTWF0aC5taW4obmVlZGVkVGhyZWFkcywga25uSW5kZXhlcy5sZW5ndGggLSBzdGFydCk7XG4gICAgICAgICAgICBkZXZpY2UucXVldWUud3JpdGVCdWZmZXIoc3RhcnRCdWZmZXIsIDAsIG5ldyBVaW50MzJBcnJheShbc3RhcnRdKSk7XG4gICAgICAgICAgICBjb25zdCBlbmNvZGVyID0gZGV2aWNlLmNyZWF0ZUNvbW1hbmRFbmNvZGVyKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ2V4cGFuZCBlbmNvZGVyJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgcGFzcyA9IGVuY29kZXIuYmVnaW5Db21wdXRlUGFzcyh7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdleHBhbmQgY29tcHV0ZSBwYXNzJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFzcy5zZXRQaXBlbGluZShwaXBlbGluZSk7XG4gICAgICAgICAgICBwYXNzLnNldEJpbmRHcm91cCgwLCBiaW5kR3JvdXApO1xuICAgICAgICAgICAgcGFzcy5kaXNwYXRjaFdvcmtncm91cHMod29ya0dyb3VwRGltLCB3b3JrR3JvdXBEaW0pO1xuICAgICAgICAgICAgcGFzcy5lbmQoKTtcbiAgICAgICAgICAgIGVuY29kZXIuY29weUJ1ZmZlclRvQnVmZmVyKHJlc3VsdEJsb2NrQnVmZmVyLCAwLCBvdXRCbG9ja0J1ZmZlciwgMCwgb3V0QmxvY2tCdWZmZXIuc2l6ZSk7XG4gICAgICAgICAgICBkZXZpY2UucXVldWUuc3VibWl0KFtlbmNvZGVyLmZpbmlzaCgpXSk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZSgnb25TdWJtaXR0ZWRXb3JrRG9uZScpO1xuICAgICAgICAgICAgeWllbGQgZGV2aWNlLnF1ZXVlLm9uU3VibWl0dGVkV29ya0RvbmUoKTtcbiAgICAgICAgICAgIC8vY29uc29sZS50aW1lRW5kKCdvblN1Ym1pdHRlZFdvcmtEb25lJyk7XG4gICAgICAgICAgICB5aWVsZCBvdXRCbG9ja0J1ZmZlci5tYXBBc3luYyhHUFVNYXBNb2RlLlJFQUQpO1xuICAgICAgICAgICAgY29uc3Qgb3V0QmxvY2sgPSBuZXcgRmxvYXQzMkFycmF5KG91dEJsb2NrQnVmZmVyLmdldE1hcHBlZFJhbmdlKCksIDAsIGN1ckxlbmd0aCk7XG4gICAgICAgICAgICAvL2NvbnNvbGUudGltZSgnZmlsbG91dCcpO1xuICAgICAgICAgICAgb3V0S05OU2ltaWxhcml0aWVzLnNldChvdXRCbG9jaywgc3RhcnQpO1xuICAgICAgICAgICAgLy9jb25zb2xlLnRpbWVFbmQoJ2ZpbGxvdXQnKTtcbiAgICAgICAgICAgIG91dEJsb2NrQnVmZmVyLnVubWFwKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGVzdHJveVxuICAgICAgICBzcGFyc2VLTk5CdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICBzdGFydEJ1ZmZlci5kZXN0cm95KCk7XG4gICAgICAgIHJlc3VsdEJsb2NrQnVmZmVyLmRlc3Ryb3koKTtcbiAgICAgICAgb3V0QmxvY2tCdWZmZXIuZGVzdHJveSgpO1xuICAgICAgICByZXR1cm4geyBLTk5JbmRleGVzOiBrbm5JbmRleGVzLCBLTk5TaW1pbGFyaXRpZXM6IG91dEtOTlNpbWlsYXJpdGllcywgaW5kZXhPZmZzZXRzOiBvZmZzZXRzIH07XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmZsYXRlLWV4cGFuZC5qcy5tYXAiLCJpbXBvcnQgeyB0b09mZnNldEZvcm0gfSBmcm9tICcuLi91bWFwL3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBjb3VudE9jY3VyYW5jZXNBZGRMb29wcyhzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgY29uc3QgcmVzID0gbmV3IFVpbnQzMkFycmF5KG5Sb3dzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tzcGFyc2VNYXRyaXguaVtpXV0rKztcbiAgICAgICAgcmVzW3NwYXJzZU1hdHJpeC5qW2ldXSsrO1xuICAgIH1cbiAgICAvLyBhZGQgbG9vcHNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspXG4gICAgICAgIHJlc1tpXSsrO1xuICAgIHJldHVybiByZXM7XG59XG4vKipcbiAqIEJFIFdBUkUsIHRoaXMgZnVuY3Rpb24gaXMgbWVudCBmb3IgaGFsZiBzcGFyc2UgbWF0cmljZXMgb25seSEhIVxuICogQHBhcmFtIHNwYXJzZU1hdHJpeFxuICogQHBhcmFtIG5Sb3dzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybShzcGFyc2VNYXRyaXgsIG5Sb3dzKSB7XG4gICAgY29uc3Qgb2NjdXJlbmNlQ291bnQgPSBjb3VudE9jY3VyYW5jZXNBZGRMb29wcyhzcGFyc2VNYXRyaXgsIG5Sb3dzKTtcbiAgICBjb25zdCBvZmZzZXRGb3JtID0gdG9PZmZzZXRGb3JtKG9jY3VyZW5jZUNvdW50KTtcbiAgICBjb25zdCBpbnNlcnRDb3VudGVyID0gbmV3IFVpbnQzMkFycmF5KG5Sb3dzKS5maWxsKDEpOyAvLyBmb3IgY291bnRpbmcgaG93IG1hbnkgdGhpbmdzIHdlIGluc2VydGVkIGludG8gdGhlIGtubiBhcnJheXMuXG4gICAgLy8gd2UgaW5pdGlhbGl6ZSB0aGVzZSBjb3VudGVycyB0byBvbmUgYmVjYXVzZSBmaXJzdCB3ZSBpbnNlcnQgdGhlIHNlbGYgbG9vcHNcbiAgICAvLyBkb250IGJlIGNvbmZ1c2VkIGJ5IHRoZSBuYW1lIGtubiwgayBoZXJlIGlzIHZhcmlhYmxlLCBpdHMganVzdCB0aGUgdGhpbmcgdGhhdCBpbiB0aGlzIGZvcm0sIHdlIGtub3cgdGhhdCBhdCBpbmRleCBpXG4gICAgLy8gd2UgaGF2ZSBzb21lIGsodmFyaWFibGUpIGFtbW91bnQgb2Ygc3BhcnNlIG5laWdib3Vyc1xuICAgIC8vIHdlIGtub3cgZm9yIGEgZmFjdCB0aGF0IHNwYXJzZSBtYXRyaXggd2lsbCBub3QgY29udGFpbiBhbnkgZHVwbGljYXRlcywgd2UgYWRkIG5Sb3dzIHRvIGFjY291bnQgZm9yIHNlbGYgbG9vcHNcbiAgICBjb25zdCBLTk5JbmRleGVzID0gbmV3IFVpbnQzMkFycmF5KHNwYXJzZU1hdHJpeC5pLmxlbmd0aCAqIDIgKyBuUm93cyk7XG4gICAgY29uc3QgS05OU2ltaWxhcml0aWVzID0gbmV3IEZsb2F0MzJBcnJheShzcGFyc2VNYXRyaXguaS5sZW5ndGggKiAyICsgblJvd3MpO1xuICAgIC8vIGluc2VydCBzZWxmIGxvb3BzIGF0IHRoZSBzdGFydCBvZiBlYWNoIG9mZnNldFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICBLTk5JbmRleGVzW29mZnNldEZvcm1baV1dID0gaTtcbiAgICAgICAgS05OU2ltaWxhcml0aWVzW29mZnNldEZvcm1baV1dID0gMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFyc2VNYXRyaXguaS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByb3cgPSBzcGFyc2VNYXRyaXguaVtpXTtcbiAgICAgICAgY29uc3QgY29sID0gc3BhcnNlTWF0cml4LmpbaV07XG4gICAgICAgIGNvbnN0IHNpbWlsYXJpdHkgPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgICBLTk5JbmRleGVzW29mZnNldEZvcm1bcm93XSArIGluc2VydENvdW50ZXJbcm93XV0gPSBjb2w7XG4gICAgICAgIEtOTlNpbWlsYXJpdGllc1tvZmZzZXRGb3JtW3Jvd10gKyBpbnNlcnRDb3VudGVyW3Jvd11dID0gc2ltaWxhcml0eTtcbiAgICAgICAgaW5zZXJ0Q291bnRlcltyb3ddKys7XG4gICAgICAgIEtOTkluZGV4ZXNbb2Zmc2V0Rm9ybVtjb2xdICsgaW5zZXJ0Q291bnRlcltjb2xdXSA9IHJvdztcbiAgICAgICAgS05OU2ltaWxhcml0aWVzW29mZnNldEZvcm1bY29sXSArIGluc2VydENvdW50ZXJbY29sXV0gPSBzaW1pbGFyaXR5O1xuICAgICAgICBpbnNlcnRDb3VudGVyW2NvbF0rKztcbiAgICB9XG4gICAgcmV0dXJuIHsgS05OSW5kZXhlcywgS05OU2ltaWxhcml0aWVzLCBpbmRleE9mZnNldHM6IG9mZnNldEZvcm0gfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBrbm5Ub1NwYXJzZUZvcm0oa25uSW5kZXhlcywga25uU2ltcykge1xuICAgIGNvbnN0IGxlbmd0aHMgPSBrbm5JbmRleGVzLm1hcCgoeCkgPT4geC5sZW5ndGgpO1xuICAgIGNvbnN0IHRvdGFsTGVuZ3RoID0gbGVuZ3Rocy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgICBjb25zdCBvZmZzZXRzID0gdG9PZmZzZXRGb3JtKGxlbmd0aHMpO1xuICAgIGNvbnN0IG91dEluZGV4ZXMgPSBuZXcgVWludDMyQXJyYXkodG90YWxMZW5ndGgpO1xuICAgIGNvbnN0IG91dFNpbXMgPSBuZXcgRmxvYXQzMkFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtubkluZGV4ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgb3V0SW5kZXhlcy5zZXQoa25uSW5kZXhlc1tpXSwgb2Zmc2V0c1tpXSk7XG4gICAgICAgIG91dFNpbXMuc2V0KGtublNpbXNbaV0sIG9mZnNldHNbaV0pO1xuICAgIH1cbiAgICByZXR1cm4geyBLTk5JbmRleGVzOiBvdXRJbmRleGVzLCBLTk5TaW1pbGFyaXRpZXM6IG91dFNpbXMsIGluZGV4T2Zmc2V0czogb2Zmc2V0cyB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyBsZXZlbmJlcmdNYXJxdWFyZHQgfSBmcm9tICdtbC1sZXZlbmJlcmctbWFycXVhcmR0JztcbmV4cG9ydCBmdW5jdGlvbiBsaW5lYXIoeDEsIHgyLCBuKSB7XG4gICAgY29uc3Qgc3RlcCA9ICh4MiAtIHgxKSAvIChuIC0gMSk7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IG4gfSwgKF8sIGkpID0+IHgxICsgc3RlcCAqIGkpO1xufVxuLyoqXG4gKiBGaXQgYSwgYiBwYXJhbXMgZm9yIHRoZSBkaWZmZXJlbnRpYWJsZSBjdXJ2ZSB1c2VkIGluIGxvd2VyXG4gKiBkaW1lbnNpb25hbCBmdXp6eSBzaW1wbGljaWFsIGNvbXBsZXggY29uc3RydWN0aW9uLiBXZSB3YW50IHRoZVxuICogc21vb3RoIGN1cnZlIChmcm9tIGEgcHJlLWRlZmluZWQgZmFtaWx5IHdpdGggc2ltcGxlIGdyYWRpZW50KSB0aGF0XG4gKiBiZXN0IG1hdGNoZXMgYW4gb2Zmc2V0IGV4cG9uZW50aWFsIGRlY2F5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEFCUGFyYW1zKHNwcmVhZCwgbWluRGlzdCkge1xuICAgIGNvbnN0IGN1cnZlID0gKFthLCBiXSkgPT4gKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIDEuMCAvICgxLjAgKyBhICogTWF0aC5wb3coeCwgKDIgKiBiKSkpO1xuICAgIH07XG4gICAgY29uc3QgeHYgPSBsaW5lYXIoMCwgc3ByZWFkICogMywgMzAwKVxuICAgICAgICAubWFwKCh2YWwpID0+ICh2YWwgPCBtaW5EaXN0ID8gMS4wIDogdmFsKSk7XG4gICAgY29uc3QgeXYgPSBuZXcgQXJyYXkoeHYubGVuZ3RoKS5maWxsKDApLm1hcCgodmFsLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBndGUgPSB4dltpbmRleF0gPj0gbWluRGlzdDtcbiAgICAgICAgcmV0dXJuIGd0ZSA/IE1hdGguZXhwKC0oeHZbaW5kZXhdIC0gbWluRGlzdCkgLyBzcHJlYWQpIDogdmFsO1xuICAgIH0pO1xuICAgIGNvbnN0IGluaXRpYWxWYWx1ZXMgPSBbMC41LCAwLjVdO1xuICAgIGNvbnN0IGRhdGEgPSB7IHg6IHh2LCB5OiB5diB9O1xuICAgIC8vIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGFsZ29yaXRobSAoZnJvbSBnaXRodWIgZXhhbXBsZSlcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBkYW1waW5nOiAxLjUsXG4gICAgICAgIGluaXRpYWxWYWx1ZXMsXG4gICAgICAgIGdyYWRpZW50RGlmZmVyZW5jZTogMTBlLTIsXG4gICAgICAgIG1heEl0ZXJhdGlvbnM6IDEwMCxcbiAgICAgICAgZXJyb3JUb2xlcmFuY2U6IDEwZS0zLFxuICAgIH07XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICBjb25zdCB7IHBhcmFtZXRlclZhbHVlcyB9ID0gbGV2ZW5iZXJnTWFycXVhcmR0KGRhdGEsIGN1cnZlLCBvcHRpb25zKTtcbiAgICBjb25zdCBbYSwgYl0gPSBwYXJhbWV0ZXJWYWx1ZXM7XG4gICAgcmV0dXJuIHsgYSwgYiB9O1xufVxuLyoqXG4gKiBoZXVyaXN0aWMgZm9yIG51bWJlciBvZiBlcG9jaHMgb2YgdW1hcCwgZGlmZmVycyBmcm9tIGNwdSB2ZXJzaW9uLCBiZWNhdXNlIG9mIHRoZSB3YXkgZ3B1IHBhc3NlcyBkYXRhXG4gKiBAcGFyYW0gZW50cnlMZW4gbnVtYmVyIG9mIGVudHJpZXNcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRORXBvY2hzKGVudHJ5TGVuKSB7XG4gICAgLy9cbiAgICBjb25zdCBsZW5ndGggPSBlbnRyeUxlbjtcbiAgICBpZiAobGVuZ3RoIDw9IDI1MDApXG4gICAgICAgIHJldHVybiAxMDAwO1xuICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA1MDAwKVxuICAgICAgICByZXR1cm4gODAwO1xuICAgIGVsc2UgaWYgKGxlbmd0aCA8PSA3NTAwKVxuICAgICAgICByZXR1cm4gNjUwO1xuICAgIGVsc2VcbiAgICAgICAgcmV0dXJuIDQwMDtcbn1cbi8qKiAgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBhcnJheSBvZiBzaXplcyB0byBvZmZzZXQgZm9ybSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvT2Zmc2V0Rm9ybShhcikge1xuICAgIGNvbnN0IHJlcyA9IG5ldyBVaW50MzJBcnJheShhci5sZW5ndGggKyAxKTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc1tpXSA9IG9mZnNldDtcbiAgICAgICAgb2Zmc2V0ICs9IGFyW2ldO1xuICAgIH1cbiAgICByZXNbYXIubGVuZ3RoXSA9IG9mZnNldDtcbiAgICByZXR1cm4gcmVzO1xufVxuLyoqIG11bHRpcGxpZXMgZmxhdCByZXByZXNlbnRhdGlvbiBvZiBzcGFyc2Uga25uIGluZm8gYnkgc2NhbGFyLlxuICogYWxzbyBubyBwb2ludCBvZiBkb2luZyB0aGlzIG9uIGdwdSwgY2FuIGJlIGRvbmUgb24gY3B1IHByZXR0eSBxdWlja2x5LlxuICogaWYgdGhlcmUgd2lsbCBiZSBuZWVkIGZvciBpdCwgaXQgY2FuIGJlIGRvbmUgb24gZ3B1IGFzIHdlbGwgdmVyeSB2ZXJ5IGVhc2lseS5cbiAqIEBwYXJhbSB2YWx1ZXMgdmFsdWVzIGFycmF5XG4gKiBAcGFyYW0gc2NhbGFyXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWx0aXBseVNjYWxhcih2YWx1ZXMsIHNjYWxhcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKVxuICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZXNbaV0gKiBzY2FsYXI7XG59XG4vKipcbiAqIGdlbmVyYXRlIHRyYW5zcG9zZSBvZiBrbm4gZnJvbSB0aGUgdHJhbnNwb3NpdGlvbiBpbmZvIHRha2VuIGZyb20gc3BhcnNlIGtubiBpbmZvXG4gKiB1c2luZyB0aGlzIGluZm9ybWF0aW9uIGF2b2lkcyBiaWxsaW9ucyBvZiBhcnJheS5wdXNoIGNhbGxzLCBpcyBtdWNoIGNsZWFuZXIsIGFsbG93cyB0eXBlZCBhcnJheSB1c2UgYW5kIGlzIGZhc3Rlci5cbiAqIG5vIHBvaW50IG9mIGRvaW5nIHRoaXMgb24gZ3B1LCBjYW4gYmUgZG9uZSBvbiBjcHUgYXMgd2UgYWxyZWFkeSBoYXZlIGFsbCB0aGUgaW5mbyBuZWVkZWQuXG4gKiBAcGFyYW0ga25uSW5kZXhlc1xuICogQHBhcmFtIGtubkRpc3RhbmNlc1xuICogQHBhcmFtIGtublNwYXJzZUluZm9cbiAqIEBwYXJhbSBrbm5TaXplXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlS05OKGtubkluZGV4ZXMsIGtubkRpc3RhbmNlcywga25uU3BhcnNlSW5mbywga25uU2l6ZSA9IDE1KSB7XG4gICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgY29uc3QgbnVtT2ZFbnRyaWVzID0ga25uSW5kZXhlcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGZ1bGxLbm5FbnRyeVNpemUgPSBrbm5TaXplICogbnVtT2ZFbnRyaWVzO1xuICAgICAgICBjb25zdCB0cmFuc3Bvc2VTaXplcyA9IGtublNwYXJzZUluZm8ucmVzdWx0VHJhbnNwb3NlU2l6ZXNBcnJheTtcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlT2Zmc2V0cyA9IHRvT2Zmc2V0Rm9ybSh0cmFuc3Bvc2VTaXplcyk7XG4gICAgICAgIGNvbnN0IG9mZnNldHNDb3B5ID0gbmV3IFVpbnQzMkFycmF5KHRyYW5zcG9zZU9mZnNldHMubGVuZ3RoKTtcbiAgICAgICAgb2Zmc2V0c0NvcHkuc2V0KHRyYW5zcG9zZU9mZnNldHMpOyAvLyB3aWxsIGJlIHVzZWQgZm9yIGR5bmFtaWMgaW5kZXhpbmdcbiAgICAgICAgY29uc3QgdHJhbnNwb3NlS05OSW5kZXhlcyA9IG5ldyBJbnQzMkFycmF5KGZ1bGxLbm5FbnRyeVNpemUpLmZpbGwoMCk7XG4gICAgICAgIGNvbnN0IHRyYW5zcG9zZUtOTkRpc3RhbmNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoZnVsbEtubkVudHJ5U2l6ZSkuZmlsbCgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1PZkVudHJpZXM7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBrbm5TaXplOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlckluZGV4ID0ga25uSW5kZXhlc1tpXVtqXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlckluZGV4T2Zmc2V0ID0gb2Zmc2V0c0NvcHlbb3RoZXJJbmRleF07XG4gICAgICAgICAgICAgICAgdHJhbnNwb3NlS05OSW5kZXhlc1tvdGhlckluZGV4T2Zmc2V0XSA9IGk7XG4gICAgICAgICAgICAgICAgdHJhbnNwb3NlS05ORGlzdGFuY2VzW290aGVySW5kZXhPZmZzZXRdID0ga25uRGlzdGFuY2VzW2ldW2pdO1xuICAgICAgICAgICAgICAgIG9mZnNldHNDb3B5W290aGVySW5kZXhdICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdHJhbnNwb3NlS05OSW5kZXhlcywgdHJhbnNwb3NlS05ORGlzdGFuY2VzLCB0cmFuc3Bvc2VPZmZzZXRzIH07XG4gICAgfSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlscy5qcy5tYXAiLCIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG5jb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiAqIENoZWNrcyBpZiBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYW4gQXJyYXkgKGFycmF5IG9yIHR5cGVkIGFycmF5LCBleGNlcHQgdGhvc2UgdGhhdCBjb250YWluIGJpZ2ludCB2YWx1ZXMpLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIE9iamVjdCB0byBjaGVjay5cbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG9iamVjdCBpcyBhbiBhcnJheSBvciBhIHR5cGVkIGFycmF5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBbnlBcnJheSh2YWx1ZSkge1xuICAgIGNvbnN0IHRhZyA9IHRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICAgIHJldHVybiB0YWcuZW5kc1dpdGgoJ0FycmF5XScpICYmICF0YWcuaW5jbHVkZXMoJ0JpZycpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwIiwiaW1wb3J0IHsgYmlvTGF5b3V0IH0gZnJvbSAnLi9iaW8tbGF5b3V0JztcbmltcG9ydCB7IG1hcmtvdkNsdXN0ZXJXZWJHUFUgfSBmcm9tICdAZGF0YWdyb2stbGlicmFyaWVzL21hdGgvc3JjL3dlYkdQVS9NQ0wvTUNMLXdlYkdQVSc7XG5leHBvcnQgY29uc3QgZGVmYXVsdE1DTE9wdGlvbnMgPSB7XG4gICAgZXhwYW5kRmFjdG9yOiAyLFxuICAgIG1heEl0ZXJhdGlvbnM6IDUsXG4gICAgaW5mbGF0ZUZhY3RvcjogMixcbiAgICBtdWx0RmFjdG9yOiAxLFxufTtcbmV4cG9ydCBjbGFzcyBNQ0xTcGFyc2VSZWR1Y2VyIHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IHsgLi4uZGVmYXVsdE1DTE9wdGlvbnMsIC4uLm9wdHMgfTtcbiAgICB9XG4gICAgYXN5bmMgdHJhbnNmb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgLy8gdGVzdFdvcmtlck11bHRpcGx5KCk7XG4gICAgICAgIC8vIHJldHVybiBuZXcgSW50MzJBcnJheShuUm93cyk7XG4gICAgICAgIGxldCBzcGFyc2VPYmplY3QgPSB0aGlzLnRvT2JqZWN0Rm9ybShzcGFyc2VNYXRyaXgpO1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zID4gMCkge1xuICAgICAgICAgICAgdGhpcy5hZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgICAgIHRoaXMubm9ybWFsaXplKHNwYXJzZU9iamVjdCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0ID0gdGhpcy5leHBhbmQoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmZsYXRlKHNwYXJzZU9iamVjdCk7XG4gICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoc3BhcnNlT2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGNsdXN0ZXJzLCBpcywganMgfSA9IHRoaXMuYXNzaWduQ2x1c3RlcnMoc3BhcnNlT2JqZWN0LCBuUm93cyk7XG4gICAgICAgIHRoaXMuY29ycmVjdENsdXN0ZXJzKGNsdXN0ZXJzKTtcbiAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IHRoaXMubGF5b3V0KGNsdXN0ZXJzLCBzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGVtYmVkWDogZW1iZWRkaW5ncy5lbWJlZFgsIGVtYmVkWTogZW1iZWRkaW5ncy5lbWJlZFksIGlzLCBqcyB9O1xuICAgIH1cbiAgICBhc3luYyB0cmFuc2Zvcm1XZWJHUFUoc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5tYXhJdGVyYXRpb25zID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpO1xuICAgICAgICBjb25zdCBtY2xSZXMgPSBhd2FpdCBtYXJrb3ZDbHVzdGVyV2ViR1BVKHNwYXJzZU1hdHJpeCwgblJvd3MsIHRoaXMuX29wdGlvbnMubWF4SXRlcmF0aW9ucyk7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHRoaXMuY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cyk7XG4gICAgICAgIGNvbnN0IHsgY2x1c3RlcnMsIGlzLCBqcyB9ID0gdGhpcy5hc3NpZ25DbHVzdGVycyhzcGFyc2VPYmplY3QsIG5Sb3dzKTtcbiAgICAgICAgdGhpcy5jb3JyZWN0Q2x1c3RlcnMoY2x1c3RlcnMpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmdzID0gYXdhaXQgdGhpcy5sYXlvdXQoY2x1c3RlcnMsIHNwYXJzZU9iamVjdCwgblJvd3MpO1xuICAgICAgICByZXR1cm4geyBjbHVzdGVycywgZW1iZWRYOiBlbWJlZGRpbmdzLmVtYmVkWCwgZW1iZWRZOiBlbWJlZGRpbmdzLmVtYmVkWSwgaXMsIGpzIH07XG4gICAgfVxuICAgIGNvcnJlY3RDbHVzdGVycyhjbHVzdGVycykge1xuICAgICAgICBjb25zdCBjbHVzdGVyU2l6ZU1hcCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXIgb2YgY2x1c3RlcnMpIHtcbiAgICAgICAgICAgIGlmICghY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0pXG4gICAgICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0gPSAwO1xuICAgICAgICAgICAgY2x1c3RlclNpemVNYXBbY2x1c3Rlcl0rKztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzb3J0ZWRJbmRleGVzID0gT2JqZWN0LmtleXMoY2x1c3RlclNpemVNYXApLm1hcChOdW1iZXIpLnNvcnQoKGEsIGIpID0+IGNsdXN0ZXJTaXplTWFwW2FdIC0gY2x1c3RlclNpemVNYXBbYl0pO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIHNvcnRlZEluZGV4ZXMuZm9yRWFjaCgoY2x1c3RlcklkeCwgaSkgPT4gY2x1c3Rlck1hcFtjbHVzdGVySWR4XSA9IGkgKyAxKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGNsdXN0ZXJzW2ldID0gY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV07XG4gICAgICAgIC8vIGxldCBjdXJDbHVzdGVyID0gMTtcbiAgICAgICAgLy8gZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyc1tpXV0pIHtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJNYXBbY2x1c3RlcnNbaV1dID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGNsdXN0ZXJzW2ldID0gY3VyQ2x1c3RlcjtcbiAgICAgICAgLy8gICAgIGN1ckNsdXN0ZXIrKztcbiAgICAgICAgLy8gICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTWFwW2NsdXN0ZXJzW2ldXTtcbiAgICAgICAgLy8gICB9XG4gICAgICAgIC8vIH1cbiAgICB9XG4gICAgY3NyVG9TcGFyc2VPYmplY3QobWNsUmVzLCBuUm93cykge1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gMSAvIE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5Sb3dzOyBpKyspIHtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXSA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8IG1pbk9yZGVyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBtY2xSZXMuS05OU2ltaWxhcml0aWVzW2tdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFyc2VPYmplY3Q7XG4gICAgfVxuICAgIGFzeW5jIGxheW91dChjbHVzdGVycywgc3BhcnNlTWF0cml4LCBuUm93cykge1xuICAgICAgICBjb25zdCBlbWJlZFggPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBlbWJlZFkgPSBuZXcgRmxvYXQzMkFycmF5KG5Sb3dzKS5maWxsKDApO1xuICAgICAgICBjb25zdCBjbHVzdGVyTWFwID0ge307XG4gICAgICAgIGNsdXN0ZXJzLmZvckVhY2goKGNsdXN0ZXIsIGkpID0+IHtcbiAgICAgICAgICAgIGlmICghY2x1c3Rlck1hcFtjbHVzdGVyXSlcbiAgICAgICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdID0gW107XG4gICAgICAgICAgICBjbHVzdGVyTWFwW2NsdXN0ZXJdLnB1c2goaSk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBjb25zdCBuQ2x1c3RlcnMgPSBPYmplY3Qua2V5cyhjbHVzdGVyTWFwKS5sZW5ndGg7XG4gICAgICAgIC8vIGNvbnN0IHBlclJvdyA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KG5DbHVzdGVycykpO1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IHNvcnRlZENsdXN0ZXJOYW1lcyA9IE9iamVjdC5rZXlzKGNsdXN0ZXJNYXApO1xuICAgICAgICBzb3J0ZWRDbHVzdGVyTmFtZXMuc29ydCgoYSwgYikgPT4gY2x1c3Rlck1hcFtiXS5sZW5ndGggLSBjbHVzdGVyTWFwW2FdLmxlbmd0aCk7XG4gICAgICAgIGxldCBwZXJSb3cgPSA2O1xuICAgICAgICBsZXQgeU9mZnNldCA9IDA7XG4gICAgICAgIGNvbnN0IGxheW91dFNpemUgPSA1O1xuICAgICAgICBmb3IgKGNvbnN0IGNsdXN0ZXJOYW1lIG9mIHNvcnRlZENsdXN0ZXJOYW1lcykge1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlciA9IGNsdXN0ZXJNYXBbY2x1c3Rlck5hbWVdO1xuICAgICAgICAgICAgY29uc3QgZW1iZWRkaW5ncyA9IGF3YWl0IGJpb0xheW91dChjbHVzdGVyLCBzcGFyc2VNYXRyaXgsIDAuMDAxKTtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyTnVtID09PSBNYXRoLmNlaWwocGVyUm93IC8gMS41KSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICAgICAgICAgIHlPZmZzZXQgKz0gbGF5b3V0U2l6ZSAvIHBlclJvdztcbiAgICAgICAgICAgICAgICBwZXJSb3cgPSBNYXRoLmNlaWwocGVyUm93ICogMS41KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG9mZnNldFggPSAoKGNsdXN0ZXJOdW0gJSBwZXJSb3cpICogbGF5b3V0U2l6ZSAvIHBlclJvdykgKiAxLjU7XG4gICAgICAgICAgICAvLyBjb25zdCBvZmZzZXRZID0gTWF0aC5mbG9vcihjbHVzdGVyTnVtIC8gcGVyUm93KSAqIDI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVtYmVkZGluZ3MuZW1iZWRYLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgZW1iZWRYW2NsdXN0ZXJbaV1dID0gZW1iZWRkaW5ncy5lbWJlZFhbaV0gKiBsYXlvdXRTaXplIC8gcGVyUm93ICsgb2Zmc2V0WDtcbiAgICAgICAgICAgICAgICBlbWJlZFlbY2x1c3RlcltpXV0gPSBlbWJlZGRpbmdzLmVtYmVkWVtpXSAqIGxheW91dFNpemUgLyBwZXJSb3cgKyB5T2Zmc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVtYmVkWCwgZW1iZWRZIH07XG4gICAgfVxuICAgIG1lcmdlQ2x1c3RlcnMoY2x1c3RlcnMsIGksIGopIHtcbiAgICAgICAgY29uc3QgaUNsdXN0ZXIgPSBjbHVzdGVyc1tpXTtcbiAgICAgICAgY29uc3QgakNsdXN0ZXIgPSBjbHVzdGVyc1tqXTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjbHVzdGVycy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2tdID09PSBqQ2x1c3RlcilcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1trXSA9IGlDbHVzdGVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzc2lnbkNsdXN0ZXJzKHNwYXJzZU1hdHJpeCwgblJvd3MpIHtcbiAgICAgICAgbGV0IGNsdXN0ZXJOdW0gPSAwO1xuICAgICAgICBjb25zdCBpcyA9IFtdO1xuICAgICAgICBjb25zdCBqcyA9IFtdO1xuICAgICAgICBjb25zdCBvcmRlciA9IE1hdGguZmxvb3IoTWF0aC5tYXgoTWF0aC5sb2cxMChuUm93cyksIDIpKSArIDE7XG4gICAgICAgIGNvbnN0IG1pbk9yZGVyID0gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlTWF0cml4KSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBqIG9mIE9iamVjdC5rZXlzKHNwYXJzZU1hdHJpeFtpXSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChzcGFyc2VNYXRyaXhbaV1bal0gKiBtaW5PcmRlcikgLyBtaW5PcmRlciA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgc3BhcnNlTWF0cml4W2ldW2pdICE9PSBOdW1iZXIoaSkgJiYgTnVtYmVyKGopID4gTnVtYmVyKGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzLnB1c2goTnVtYmVyKGkpKTtcbiAgICAgICAgICAgICAgICAgICAganMucHVzaChOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbTnVtYmVyKGkpXSAhPT0gLTEgJiYgY2x1c3RlcnNbTnVtYmVyKGopXSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHVzdGVyc1tOdW1iZXIoaSldICE9PSBjbHVzdGVyc1tOdW1iZXIoaildKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VDbHVzdGVycyhjbHVzdGVycywgTnVtYmVyKGkpLCBOdW1iZXIoaikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW051bWJlcihpKV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaildID0gY2x1c3RlcnNbTnVtYmVyKGkpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjbHVzdGVyc1tOdW1iZXIoaildICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlcnNbTnVtYmVyKGkpXSA9IGNsdXN0ZXJzW051bWJlcihqKV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tOdW1iZXIoaSldID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW051bWJlcihqKV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2x1c3RlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChjbHVzdGVyc1tpXSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjbHVzdGVyTnVtKys7XG4gICAgICAgICAgICAgICAgY2x1c3RlcnNbaV0gPSBjbHVzdGVyTnVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNsdXN0ZXJzLCBpczogbmV3IFVpbnQzMkFycmF5KGlzKSwganM6IG5ldyBVaW50MzJBcnJheShqcykgfTtcbiAgICB9XG4gICAgLyoqIHNhbWUgYXMgYXNzaWduIGNsdXN0ZXJzIGJ1dCB3b3JraW5nIG9uIHRoZSBsZXZlbCBvZiBDU1IgZm9ybWF0IHJldHVybmVkIGZyb20gd2ViR1BVICovXG4gICAgYXNzaWduQ2x1c3RlcnNDU1IobWNsUmVzLCBuUm93cykge1xuICAgICAgICBsZXQgY2x1c3Rlck51bSA9IDA7XG4gICAgICAgIGNvbnN0IGlzID0gW107XG4gICAgICAgIGNvbnN0IGpzID0gW107XG4gICAgICAgIGNvbnN0IG9yZGVyID0gTWF0aC5mbG9vcihNYXRoLm1heChNYXRoLmxvZzEwKG5Sb3dzKSwgMikpICsgMTtcbiAgICAgICAgY29uc3QgbWluT3JkZXIgPSAxIC8gTWF0aC5wb3coMTAsIG9yZGVyKTtcbiAgICAgICAgY29uc3QgY2x1c3RlcnMgPSBuZXcgQXJyYXkoblJvd3MpLmZpbGwoLTEpO1xuICAgICAgICBjb25zdCBjb3JyZWN0ZWRPZmZzZXRzID0gbmV3IFVpbnQzMkFycmF5KG5Sb3dzICsgMSk7XG4gICAgICAgIGxldCBvZmZzZXRDb3VudGVyID0gMDtcbiAgICAgICAgY29ycmVjdGVkT2Zmc2V0c1swXSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IG1jbFJlcy5pbmRleE9mZnNldHNbaV07IGsgPCBtY2xSZXMuaW5kZXhPZmZzZXRzW2kgKyAxXTsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaiA9IG1jbFJlcy5LTk5JbmRleGVzW2tdO1xuICAgICAgICAgICAgICAgIGlmIChqIDw9IGkgfHwgbWNsUmVzLktOTlNpbWlsYXJpdGllc1trXSA8PSBtaW5PcmRlcilcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgaXMucHVzaChpKTtcbiAgICAgICAgICAgICAgICBqcy5wdXNoKGopO1xuICAgICAgICAgICAgICAgIG9mZnNldENvdW50ZXIrKztcbiAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IC0xICYmIGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2x1c3RlcnNbaV0gIT09IGNsdXN0ZXJzW2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUNsdXN0ZXJzKGNsdXN0ZXJzLCBpLCBqKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoY2x1c3RlcnNbaV0gIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3RlcnNbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNsdXN0ZXJzW2pdICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJzW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2x1c3Rlck51bSsrO1xuICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICAgICAgICAgIGNsdXN0ZXJzW2pdID0gY2x1c3Rlck51bTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb3JyZWN0ZWRPZmZzZXRzW2kgKyAxXSA9IG9mZnNldENvdW50ZXI7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbHVzdGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNsdXN0ZXJzW2ldID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGNsdXN0ZXJOdW0rKztcbiAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJOdW07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgY2x1c3RlcnMsIGlzOiBuZXcgVWludDMyQXJyYXkoaXMpLCBqczogbmV3IFVpbnQzMkFycmF5KGpzKSwgY29ycmVjdGVkT2Zmc2V0cyB9O1xuICAgIH1cbiAgICB0b09iamVjdEZvcm0oc3BhcnNlTWF0cml4KSB7XG4gICAgICAgIGNvbnN0IHNwYXJzZU9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZU1hdHJpeC5pLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXguaVtpXV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXSA9IHt9O1xuICAgICAgICAgICAgc3BhcnNlT2JqZWN0W3NwYXJzZU1hdHJpeC5pW2ldXVtzcGFyc2VNYXRyaXgualtpXV0gPSAxIC0gc3BhcnNlTWF0cml4LmRpc3RhbmNlW2ldO1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3Rbc3BhcnNlTWF0cml4LmpbaV1dKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV0gPSB7fTtcbiAgICAgICAgICAgIHNwYXJzZU9iamVjdFtzcGFyc2VNYXRyaXgualtpXV1bc3BhcnNlTWF0cml4LmlbaV1dID0gMSAtIHNwYXJzZU1hdHJpeC5kaXN0YW5jZVtpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhcnNlT2JqZWN0O1xuICAgIH1cbiAgICBhZGRMb29wcyhzcGFyc2VPYmplY3QsIG5Sb3dzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgc3BhcnNlT2JqZWN0W2ldID0ge307XG4gICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1baV0gPSB0aGlzLl9vcHRpb25zLm11bHRGYWN0b3I7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbm9ybWFsaXplKHNwYXJzZU9iamVjdCkge1xuICAgICAgICBmb3IgKGNvbnN0IGkgb2YgT2JqZWN0LmtleXMoc3BhcnNlT2JqZWN0KSkge1xuICAgICAgICAgICAgY29uc3Qgcm93ID0gc3BhcnNlT2JqZWN0W2ldO1xuICAgICAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzdW0gKz0gcm93W2pdO1xuICAgICAgICAgICAgaWYgKHN1bSA9PT0gMClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaiBvZiBPYmplY3Qua2V5cyhyb3cpKVxuICAgICAgICAgICAgICAgIHNwYXJzZU9iamVjdFtpXVtqXSAvPSBzdW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZXhwYW5kKHNwYXJzZU9iamVjdCwgblJvd3MpIHtcbiAgICAgICAgY29uc3QgZXhwYW5kZWRPYmplY3QgPSB7fTtcbiAgICAgICAgY29uc3Qgb3JkZXIgPSBNYXRoLmZsb29yKE1hdGgubWF4KE1hdGgubG9nMTAoblJvd3MpLCAyKSkgKyAxO1xuICAgICAgICBjb25zdCBtaW5PcmRlciA9IE1hdGgucG93KDEwLCBvcmRlcik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblJvd3M7IGkrKykge1xuICAgICAgICAgICAgaWYgKCFzcGFyc2VPYmplY3RbaV0pXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAvLyBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBleHBhbmRlZE9iamVjdFtpXSA/PyAoZXhwYW5kZWRPYmplY3RbaV0gPSB7fSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IG5Sb3dzOyBqKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIXNwYXJzZU9iamVjdFtpXT8uW2pdKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSB0aGlzLmdldEV4cGFuZFZhbHVlKHNwYXJzZU9iamVjdCwgaSwgaik7IC8vcHJ1bmluZyBzdGVwXG4gICAgICAgICAgICAgICAgaWYgKE1hdGgucm91bmQodmFsICogbWluT3JkZXIpIC8gbWluT3JkZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkT2JqZWN0W2ldW2pdID0gdmFsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGFuZGVkT2JqZWN0W2pdKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal0gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRPYmplY3Rbal1baV0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBhbmRlZE9iamVjdDtcbiAgICB9XG4gICAgLy8gcHJpdmF0ZSBwcnVuZShyb3c6IFNwYXJzZU1hdHJpeE9iamVjdFtudW1iZXJdKSB7XG4gICAgLy8gfVxuICAgIGluZmxhdGUoc3BhcnNlT2JqZWN0KSB7XG4gICAgICAgIGZvciAoY29uc3QgaSBvZiBPYmplY3Qua2V5cyhzcGFyc2VPYmplY3QpKSB7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBzcGFyc2VPYmplY3RbaV07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGogb2YgT2JqZWN0LmtleXMocm93KSlcbiAgICAgICAgICAgICAgICBzcGFyc2VPYmplY3RbaV1bal0gPSBNYXRoLnBvdyhzcGFyc2VPYmplY3RbaV1bal0sIHRoaXMuX29wdGlvbnMuaW5mbGF0ZUZhY3Rvcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0RXhwYW5kVmFsdWUoc3BhcnNlT2JqZWN0LCBpLCBqKSB7XG4gICAgICAgIGxldCB2YWwgPSAwO1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtpXSA/PyB7fSk7XG4gICAgICAgIGNvbnN0IG90aGVySW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwYXJzZU9iamVjdFtqXSA/PyB7fSk7XG4gICAgICAgIGZvciAoY29uc3QgayBvZiBjdXJyZW50SW5kZXhlcykge1xuICAgICAgICAgICAgaWYgKG90aGVySW5kZXhlcy5pbmNsdWRlcyhrKSlcbiAgICAgICAgICAgICAgICB2YWwgKz0gc3BhcnNlT2JqZWN0W2ldW2tdICogc3BhcnNlT2JqZWN0W2pdW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxleUoyWlhKemFXOXVJam96TENKbWFXeGxJam9pYldGeVkyOTJMV05zZFhOMFpYSXVhbk1pTENKemIzVnlZMlZTYjI5MElqb2lJaXdpYzI5MWNtTmxjeUk2V3lKdFlYSmpiM1l0WTJ4MWMzUmxjaTUwY3lKZExDSnVZVzFsY3lJNlcxMHNJbTFoY0hCcGJtZHpJam9pUVVGRFFTeFBRVUZQTEVWQlFVTXNVMEZCVXl4RlFVRkRMRTFCUVUwc1kwRkJZeXhEUVVGRE8wRkJSM1pETEU5QlFVOHNSVUZCUXl4dFFrRkJiVUlzUlVGQlF5eE5RVUZOTEc5RVFVRnZSQ3hEUVVGRE8wRkJRM1pHTEUxQlFVMHNRMEZCUXl4TlFVRk5MR2xDUVVGcFFpeEhRVUZsTzBsQlF6TkRMRmxCUVZrc1JVRkJSU3hEUVVGRE8wbEJRMllzWVVGQllTeEZRVUZGTEVOQlFVTTdTVUZEYUVJc1lVRkJZU3hGUVVGRkxFTkJRVU03U1VGRGFFSXNWVUZCVlN4RlFVRkZMRU5CUVVNN1EwRkRaQ3hEUVVGRE8wRkJSVVlzVFVGQlRTeFBRVUZQTEdkQ1FVRm5RanRKUVVjelFpeFpRVUZaTEU5QlFUUkNMRVZCUVVVN1VVRkRlRU1zU1VGQlNTeERRVUZETEZGQlFWRXNSMEZCUnl4RlFVRkRMRWRCUVVjc2FVSkJRV2xDTEVWQlFVVXNSMEZCUnl4SlFVRkpMRVZCUVVNc1EwRkJRenRKUVVOc1JDeERRVUZETzBsQlJVMHNTMEZCU3l4RFFVRkRMRk5CUVZNc1EwRkJReXhaUVVGblF5eEZRVUZGTEV0QlFXRTdVVUZEY0VVc2QwSkJRWGRDTzFGQlEzaENMR2REUVVGblF6dFJRVU5vUXl4SlFVRkpMRmxCUVZrc1IwRkJSeXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRkRPMUZCUTI1RUxFbEJRVWtzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4aFFVRmhMRWRCUVVjc1EwRkJReXhGUVVGRk8xbEJRMjVETEVsQlFVa3NRMEZCUXl4UlFVRlJMRU5CUVVNc1dVRkJXU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFsQlEyNURMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTTdXVUZETjBJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhSUVVGUkxFTkJRVU1zWVVGQllTeEZRVUZGTEVOQlFVTXNSVUZCUlN4RlFVRkZPMmRDUVVOd1JDeFpRVUZaTEVkQlFVY3NTVUZCU1N4RFFVRkRMRTFCUVUwc1EwRkJReXhaUVVGWkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdaMEpCUTJoRUxFbEJRVWtzUTBGQlF5eFBRVUZQTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNN1owSkJRek5DTEVsQlFVa3NRMEZCUXl4VFFVRlRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU03WVVGRE9VSTdVMEZEUmp0UlFVTkVMRTFCUVUwc1JVRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUXl4SFFVRkhMRWxCUVVrc1EwRkJReXhqUVVGakxFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUTNCRkxFbEJRVWtzUTBGQlF5eGxRVUZsTEVOQlFVTXNVVUZCVVN4RFFVRkRMRU5CUVVNN1VVRkRMMElzVFVGQlRTeFZRVUZWTEVkQlFVY3NUVUZCVFN4SlFVRkpMRU5CUVVNc1RVRkJUU3hEUVVGRExGRkJRVkVzUlVGQlJTeFpRVUZaTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRjRVVzVDBGQlR5eEZRVUZETEZGQlFWRXNSVUZCUlN4TlFVRk5MRVZCUVVVc1ZVRkJWU3hEUVVGRExFMUJRVTBzUlVGQlJTeE5RVUZOTEVWQlFVVXNWVUZCVlN4RFFVRkRMRTFCUVUwc1JVRkJSU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZETEVOQlFVTTdTVUZEYkVZc1EwRkJRenRKUVVWTkxFdEJRVXNzUTBGQlF5eGxRVUZsTEVOQlFVTXNXVUZCWjBNc1JVRkJSU3hMUVVGaE8xRkJRekZGTEVsQlFVa3NTVUZCU1N4RFFVRkRMRkZCUVZFc1EwRkJReXhoUVVGaExFdEJRVXNzUTBGQlF6dFpRVU51UXl4UFFVRlBMRWxCUVVrc1EwRkJReXhUUVVGVExFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMUZCUlRkRExFMUJRVTBzVFVGQlRTeEhRVUZITEUxQlFVMHNiVUpCUVcxQ0xFTkJRVU1zV1VGQldTeEZRVUZGTEV0QlFVc3NSVUZCUlN4SlFVRkpMRU5CUVVNc1VVRkJVU3hEUVVGRExHRkJRV0VzUTBGQlF5eERRVUZETzFGQlF6TkdMRTFCUVUwc1dVRkJXU3hIUVVGSExFbEJRVWtzUTBGQlF5eHBRa0ZCYVVJc1EwRkJReXhOUVVGTkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZETTBRc1RVRkJUU3hGUVVGRExGRkJRVkVzUlVGQlJTeEZRVUZGTEVWQlFVVXNSVUZCUlN4RlFVRkRMRWRCUVVjc1NVRkJTU3hEUVVGRExHTkJRV01zUTBGQlF5eFpRVUZaTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRjRVVzU1VGQlNTeERRVUZETEdWQlFXVXNRMEZCUXl4UlFVRlJMRU5CUVVNc1EwRkJRenRSUVVNdlFpeE5RVUZOTEZWQlFWVXNSMEZCUnl4TlFVRk5MRWxCUVVrc1EwRkJReXhOUVVGTkxFTkJRVU1zVVVGQlVTeEZRVUZGTEZsQlFWa3NSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVOd1JTeFBRVUZQTEVWQlFVTXNVVUZCVVN4RlFVRkZMRTFCUVUwc1JVRkJSU3hWUVVGVkxFTkJRVU1zVFVGQlRTeEZRVUZGTEUxQlFVMHNSVUZCUlN4VlFVRlZMRU5CUVVNc1RVRkJUU3hGUVVGRkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVWQlFVTXNRMEZCUXp0SlFVTnNSaXhEUVVGRE8wbEJSVThzWlVGQlpTeERRVUZETEZGQlFXdENPMUZCUTNoRExFMUJRVTBzWTBGQll5eEhRVUV3UWl4RlFVRkZMRU5CUVVNN1VVRkRha1FzUzBGQlN5eE5RVUZOTEU5QlFVOHNTVUZCU1N4UlFVRlJMRVZCUVVVN1dVRkRPVUlzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4UFFVRlBMRU5CUVVNN1owSkJRekZDTEdOQlFXTXNRMEZCUXl4UFFVRlBMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03V1VGRE9VSXNZMEZCWXl4RFFVRkRMRTlCUVU4c1EwRkJReXhGUVVGRkxFTkJRVU03VTBGRE0wSTdVVUZEUkN4TlFVRk5MR0ZCUVdFc1IwRkJSeXhOUVVGTkxFTkJRVU1zU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVVzUTBGQlF5eGpRVUZqTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1kwRkJZeXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdVVUZEY0Vnc1RVRkJUU3hWUVVGVkxFZEJRVEJDTEVWQlFVVXNRMEZCUXp0UlFVTTNReXhoUVVGaExFTkJRVU1zVDBGQlR5eERRVUZETEVOQlFVTXNWVUZCVlN4RlFVRkZMRU5CUVVNc1JVRkJSU3hGUVVGRkxFTkJRVU1zVlVGQlZTeERRVUZETEZWQlFWVXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dFJRVU42UlN4TFFVRkxMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zUlVGQlJTeERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRTFCUVUwc1JVRkJSU3hEUVVGRExFVkJRVVU3V1VGRGRFTXNVVUZCVVN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGVkJRVlVzUTBGQlF5eFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONFF5eHpRa0ZCYzBJN1VVRkRkRUlzT0VOQlFUaERPMUZCUXpsRExHOURRVUZ2UXp0UlFVTndReXcwUTBGQk5FTTdVVUZETlVNc1owTkJRV2RETzFGQlEyaERMRzlDUVVGdlFqdFJRVU53UWl4aFFVRmhPMUZCUTJJc05rTkJRVFpETzFGQlF6ZERMRTFCUVUwN1VVRkRUaXhKUVVGSk8wbEJRMDRzUTBGQlF6dEpRVVZQTEdsQ1FVRnBRaXhEUVVGRExFMUJRWFZDTEVWQlFVVXNTMEZCWVR0UlFVTTVSQ3hOUVVGTkxFdEJRVXNzUjBGQlJ5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRWxCUVVrc1EwRkJReXhIUVVGSExFTkJRVU1zU1VGQlNTeERRVUZETEV0QlFVc3NRMEZCUXl4TFFVRkxMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTTNSQ3hOUVVGTkxGRkJRVkVzUjBGQlJ5eERRVUZETEVkQlFVY3NTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJReXhGUVVGRkxFVkJRVVVzUzBGQlN5eERRVUZETEVOQlFVTTdVVUZEZWtNc1RVRkJUU3haUVVGWkxFZEJRWFZDTEVWQlFVVXNRMEZCUXp0UlFVTTFReXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1MwRkJTeXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzFsQlF6bENMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZEY2tJc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhGUVVGRkxFTkJRVU1zUjBGQlJ5eE5RVUZOTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU1zUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0blFrRkRlRVVzVFVGQlRTeERRVUZETEVkQlFVY3NUVUZCVFN4RFFVRkRMRlZCUVZVc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETDBJc1NVRkJTU3hEUVVGRExFbEJRVWtzUTBGQlF5eEpRVUZKTEUxQlFVMHNRMEZCUXl4bFFVRmxMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVVVGQlVUdHZRa0ZEYUVRc1UwRkJVenRuUWtGRFdDeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEdWQlFXVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRoUVVOb1JEdFRRVU5HTzFGQlEwUXNUMEZCVHl4WlFVRlpMRU5CUVVNN1NVRkRkRUlzUTBGQlF6dEpRVVZQTEV0QlFVc3NRMEZCUXl4TlFVRk5MRU5CUVVNc1VVRkJhMElzUlVGQlJTeFpRVUZuUXl4RlFVRkZMRXRCUVdFN1VVRkRkRVlzVFVGQlRTeE5RVUZOTEVkQlFVY3NTVUZCU1N4WlFVRlpMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUXk5RExFMUJRVTBzVFVGQlRTeEhRVUZITEVsQlFVa3NXVUZCV1N4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFbEJRVWtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTXZReXhOUVVGTkxGVkJRVlVzUjBGQk5FSXNSVUZCUlN4RFFVRkRPMUZCUXk5RExGRkJRVkVzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4UFFVRlBMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTVUZCU1N4RFFVRkRMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU03WjBKQlEzUkNMRlZCUVZVc1EwRkJReXhQUVVGUExFTkJRVU1zUjBGQlJ5eEZRVUZGTEVOQlFVTTdXVUZETTBJc1ZVRkJWU3hEUVVGRExFOUJRVThzUTBGQlF5eERRVUZETEVsQlFVa3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVNNVFpeERRVUZETEVOQlFVTXNRMEZCUXp0UlFVTklMRzlFUVVGdlJEdFJRVU53UkN4dFJFRkJiVVE3VVVGRGJrUXNTVUZCU1N4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRMjVDTEUxQlFVMHNhMEpCUVd0Q0xFZEJRVWNzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4VlFVRlZMRU5CUVVNc1EwRkJRenRSUVVOdVJDeHJRa0ZCYTBJc1EwRkJReXhKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1EwRkJReXhWUVVGVkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNUVUZCVFN4SFFVRkhMRlZCUVZVc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXp0UlFVTTNSaXhKUVVGSkxFMUJRVTBzUjBGQlJ5eERRVUZETEVOQlFVTTdVVUZGWml4SlFVRkpMRTlCUVU4c1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRGFFSXNUVUZCVFN4VlFVRlZMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRM0pDTEV0QlFVc3NUVUZCVFN4WFFVRlhMRWxCUVVrc2EwSkJRV3RDTEVWQlFVVTdXVUZETlVNc1RVRkJUU3hQUVVGUExFZEJRVWNzVlVGQlZTeERRVUZETEZkQlFXdENMRU5CUVVVc1EwRkJRenRaUVVOb1JDeE5RVUZOTEZWQlFWVXNSMEZCUnl4TlFVRk5MRk5CUVZNc1EwRkJReXhQUVVGUExFVkJRVVVzV1VGQldTeEZRVUZGTEV0QlFVc3NRMEZCUXl4RFFVRkRPMWxCUTJwRkxFbEJRVWtzVlVGQlZTeExRVUZMTEVsQlFVa3NRMEZCUXl4SlFVRkpMRU5CUVVNc1RVRkJUU3hIUVVGSExFZEJRVWNzUTBGQlF5eEZRVUZGTzJkQ1FVTXhReXhWUVVGVkxFZEJRVWNzUTBGQlF5eERRVUZETzJkQ1FVTm1MRTlCUVU4c1NVRkJTU3hWUVVGVkxFZEJRVWNzVFVGQlRTeERRVUZETzJkQ1FVTXZRaXhOUVVGTkxFZEJRVWNzU1VGQlNTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU03WVVGRGJFTTdXVUZEUkN4TlFVRk5MRTlCUVU4c1IwRkJSeXhEUVVGRExFTkJRVU1zVlVGQlZTeEhRVUZITEUxQlFVMHNRMEZCUXl4SFFVRkhMRlZCUVZVc1IwRkJSeXhOUVVGTkxFTkJRVU1zUjBGQlJ5eEhRVUZITEVOQlFVTTdXVUZEY0VVc2RVUkJRWFZFTzFsQlJYWkVMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNc1RVRkJUU3hEUVVGRExFMUJRVTBzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0blFrRkRha1FzVFVGQlRTeERRVUZETEU5QlFVOHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGVkJRVlVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1ZVRkJWU3hIUVVGSExFMUJRVTBzUjBGQlJ5eFBRVUZQTEVOQlFVTTdaMEpCUXpGRkxFMUJRVTBzUTBGQlF5eFBRVUZQTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1IwRkJSeXhOUVVGTkxFZEJRVWNzVDBGQlR5eERRVUZETzJGQlF6TkZPMWxCUTBRc1ZVRkJWU3hGUVVGRkxFTkJRVU03VTBGRFpEdFJRVU5FTEU5QlFVOHNSVUZCUXl4TlFVRk5MRVZCUVVVc1RVRkJUU3hGUVVGRExFTkJRVU03U1VGRE1VSXNRMEZCUXp0SlFVVlBMR0ZCUVdFc1EwRkJReXhSUVVGclFpeEZRVUZGTEVOQlFWTXNSVUZCUlN4RFFVRlRPMUZCUXpWRUxFMUJRVTBzVVVGQlVTeEhRVUZITEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVNM1FpeE5RVUZOTEZGQlFWRXNSMEZCUnl4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU03VVVGRE4wSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhEUVVGRExFVkJRVVVzUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRGVFTXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVVVGQlVUdG5Ra0ZETVVJc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXp0VFFVTXhRanRKUVVOSUxFTkJRVU03U1VGRFRTeGpRVUZqTEVOQlFVTXNXVUZCWjBNc1JVRkJSU3hMUVVGaE8xRkJRMjVGTEVsQlFVa3NWVUZCVlN4SFFVRkhMRU5CUVVNc1EwRkJRenRSUVVOdVFpeE5RVUZOTEVWQlFVVXNSMEZCWVN4RlFVRkZMRU5CUVVNN1VVRkRlRUlzVFVGQlRTeEZRVUZGTEVkQlFXRXNSVUZCUlN4RFFVRkRPMUZCUTNoQ0xFMUJRVTBzUzBGQlN5eEhRVUZITEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEpRVUZKTEVOQlFVTXNTMEZCU3l4RFFVRkRMRXRCUVVzc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMUZCUXpkRUxFMUJRVTBzVVVGQlVTeEhRVUZITEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hGUVVGRkxFdEJRVXNzUTBGQlF5eERRVUZETzFGQlEzSkRMRTFCUVUwc1VVRkJVU3hIUVVGaExFbEJRVWtzUzBGQlN5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzFGQlEzSkVMRXRCUVVzc1RVRkJUU3hEUVVGRExFbEJRVWtzVFVGQlRTeERRVUZETEVsQlFVa3NRMEZCUXl4WlFVRlpMRU5CUVVNc1JVRkJSVHRaUVVONlF5eExRVUZMTEUxQlFVMHNRMEZCUXl4SlFVRkpMRTFCUVUwc1EwRkJReXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFWRXNRMEZCUXl4RFFVRkRMRVZCUVVVN1owSkJRMjVFTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlVTeERRVUZETEVOQlFVTXNRMEZCVVN4RFFVRkRMRWRCUVVjc1VVRkJVU3hEUVVGRExFZEJRVWNzVVVGQlVTeEhRVUZITEVOQlFVTTdiMEpCUTNoRkxGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1MwRkJTeXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVsQlFVa3NUVUZCVFN4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlR0dlFrRkRla1VzUlVGQlJTeERRVUZETEVsQlFVa3NRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF6dHZRa0ZEYmtJc1JVRkJSU3hEUVVGRExFbEJRVWtzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR2UWtGRGJrSXNTVUZCU1N4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRWxCUVVrc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRk8zZENRVU0xUkN4SlFVRkpMRkZCUVZFc1EwRkJReXhOUVVGTkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZET3pSQ1FVTTNReXhKUVVGSkxFTkJRVU1zWVVGQllTeERRVUZETEZGQlFWRXNSVUZCUlN4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFVkJRVVVzVFVGQlRTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2NVSkJRM1JFTzNsQ1FVRk5MRWxCUVVrc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhGUVVGRk8zZENRVU55UXl4UlFVRlJMRU5CUVVNc1RVRkJUU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVkQlFVY3NVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETzNGQ1FVTXpRenQ1UWtGQlRTeEpRVUZKTEZGQlFWRXNRMEZCUXl4TlFVRk5MRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUzBGQlN5eERRVUZETEVOQlFVTXNSVUZCUlR0M1FrRkRja01zVVVGQlVTeERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenR4UWtGRE0wTTdlVUpCUVUwN2QwSkJRMHdzVlVGQlZTeEZRVUZGTEVOQlFVTTdkMEpCUTJJc1VVRkJVU3hEUVVGRExFMUJRVTBzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRlZCUVZVc1EwRkJRenQzUWtGRGFrTXNVVUZCVVN4RFFVRkRMRTFCUVUwc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZWQlFWVXNRMEZCUXp0eFFrRkRiRU03YVVKQlEwWTdZVUZEUmp0VFFVTkdPMUZCUTBRc1MwRkJTeXhKUVVGSkxFTkJRVU1zUjBGQlF5eERRVUZETEVWQlFVVXNRMEZCUXl4SFFVRkhMRkZCUVZFc1EwRkJReXhOUVVGTkxFVkJRVVVzUTBGQlF5eEZRVUZGTEVWQlFVVTdXVUZEZEVNc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN1owSkJRM1JDTEZWQlFWVXNSVUZCUnl4RFFVRkRPMmRDUVVOa0xGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4VlFVRlZMRU5CUVVNN1lVRkRNVUk3VTBGRFJqdFJRVU5FTEU5QlFVOHNSVUZCUXl4UlFVRlJMRVZCUVVVc1JVRkJSU3hGUVVGRkxFbEJRVWtzVjBGQlZ5eERRVUZETEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVc1JVRkJSU3hKUVVGSkxGZEJRVmNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSVUZCUXl4RFFVRkRPMGxCUTNSRkxFTkJRVU03U1VGRlJDd3dSa0ZCTUVZN1NVRkRiRVlzYVVKQlFXbENMRU5CUVVNc1RVRkJkVUlzUlVGQlJTeExRVUZoTzFGQlF6bEVMRWxCUVVrc1ZVRkJWU3hIUVVGSExFTkJRVU1zUTBGQlF6dFJRVU51UWl4TlFVRk5MRVZCUVVVc1IwRkJZU3hGUVVGRkxFTkJRVU03VVVGRGVFSXNUVUZCVFN4RlFVRkZMRWRCUVdFc1JVRkJSU3hEUVVGRE8xRkJRM2hDTEUxQlFVMHNTMEZCU3l4SFFVRkhMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4SlFVRkpMRU5CUVVNc1MwRkJTeXhEUVVGRExFdEJRVXNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWRCUVVjc1EwRkJReXhEUVVGRE8xRkJRemRFTEUxQlFVMHNVVUZCVVN4SFFVRkhMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEVWQlFVVXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRSUVVONlF5eE5RVUZOTEZGQlFWRXNSMEZCWVN4SlFVRkpMRXRCUVVzc1EwRkJReXhMUVVGTExFTkJRVU1zUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOeVJDeE5RVUZOTEdkQ1FVRm5RaXhIUVVGSExFbEJRVWtzVjBGQlZ5eERRVUZETEV0QlFVc3NSMEZCUnl4RFFVRkRMRU5CUVVNc1EwRkJRenRSUVVOd1JDeEpRVUZKTEdGQlFXRXNSMEZCUnl4RFFVRkRMRU5CUVVNN1VVRkRkRUlzWjBKQlFXZENMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETzFGQlEzaENMRXRCUVVzc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNSMEZCUnl4TFFVRkxMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VSXNTMEZCU3l4SlFVRkpMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1IwRkJSeXhOUVVGTkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNSMEZCUnl4RFFVRkRMRU5CUVVNc1JVRkJSU3hEUVVGRExFVkJRVVVzUlVGQlJUdG5Ra0ZEZUVVc1RVRkJUU3hEUVVGRExFZEJRVWNzVFVGQlRTeERRVUZETEZWQlFWVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRuUWtGREwwSXNTVUZCU1N4RFFVRkRMRWxCUVVrc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eGxRVUZsTEVOQlFVTXNRMEZCUXl4RFFVRkRMRWxCUVVrc1VVRkJVVHR2UWtGRGFrUXNVMEZCVXp0blFrRkRXQ3hGUVVGRkxFTkJRVU1zU1VGQlNTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOWUxFVkJRVVVzUTBGQlF5eEpRVUZKTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNN1owSkJRMWdzWVVGQllTeEZRVUZGTEVOQlFVTTdaMEpCUTJoQ0xFbEJRVWtzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJReXhKUVVGSkxGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTXNTMEZCU3l4RFFVRkRMRU5CUVVNc1JVRkJSVHR2UWtGRE5VTXNTVUZCU1N4UlFVRlJMRU5CUVVNc1EwRkJReXhEUVVGRExFdEJRVXNzVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXp0M1FrRkROMElzU1VGQlNTeERRVUZETEdGQlFXRXNRMEZCUXl4UlFVRlJMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zUTBGQlF5eERRVUZETzJsQ1FVTjBRenR4UWtGQlRTeEpRVUZKTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1MwRkJTeXhEUVVGRExFTkJRVU1zUlVGQlJUdHZRa0ZETjBJc1VVRkJVU3hEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRwUWtGRE0wSTdjVUpCUVUwc1NVRkJTU3hSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRVZCUVVVN2IwSkJRemRDTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhSUVVGUkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdhVUpCUXpOQ08zRkNRVUZOTzI5Q1FVTk1MRlZCUVZVc1JVRkJSU3hEUVVGRE8yOUNRVU5pTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU03YjBKQlEzcENMRkZCUVZFc1EwRkJReXhEUVVGRExFTkJRVU1zUjBGQlJ5eFZRVUZWTEVOQlFVTTdhVUpCUXpGQ08yRkJRMFk3V1VGRFJDeG5Ra0ZCWjBJc1EwRkJReXhEUVVGRExFZEJRVWNzUTBGQlF5eERRVUZETEVkQlFVY3NZVUZCWVN4RFFVRkRPMU5CUTNwRE8xRkJRMFFzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUXl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExGRkJRVkVzUTBGQlF5eE5RVUZOTEVWQlFVVXNRMEZCUXl4RlFVRkZMRVZCUVVVN1dVRkRkRU1zU1VGQlNTeFJRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRkRMRXRCUVVzc1EwRkJReXhEUVVGRExFVkJRVVU3WjBKQlEzUkNMRlZCUVZVc1JVRkJSeXhEUVVGRE8yZENRVU5rTEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhWUVVGVkxFTkJRVU03WVVGRE1VSTdVMEZEUmp0UlFVTkVMRTlCUVU4c1JVRkJReXhSUVVGUkxFVkJRVVVzUlVGQlJTeEZRVUZGTEVsQlFVa3NWMEZCVnl4RFFVRkRMRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVVzUlVGQlJTeEpRVUZKTEZkQlFWY3NRMEZCUXl4RlFVRkZMRU5CUVVNc1JVRkJSU3huUWtGQlowSXNSVUZCUXl4RFFVRkRPMGxCUTNoR0xFTkJRVU03U1VGRlRTeFpRVUZaTEVOQlFVTXNXVUZCWjBNN1VVRkRiRVFzVFVGQlRTeFpRVUZaTEVkQlFYbERMRVZCUVVVc1EwRkJRenRSUVVNNVJDeExRVUZMTEVsQlFVa3NRMEZCUXl4SFFVRkhMRU5CUVVNc1JVRkJSU3hEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4TlFVRk5MRVZCUVVVc1EwRkJReXhGUVVGRkxFVkJRVVU3V1VGRE9VTXNTVUZCU1N4RFFVRkRMRmxCUVZrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMmRDUVVOc1F5eFpRVUZaTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0WlFVTjJReXhaUVVGWkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExGbEJRVmtzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEZGQlFWRXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRaUVVOc1JpeEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRmxCUVZrc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUTJ4RExGbEJRVmtzUTBGQlF5eFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzUlVGQlJTeERRVUZETzFsQlEzWkRMRmxCUVZrc1EwRkJReXhaUVVGWkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1dVRkJXU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRU5CUVVNc1IwRkJSeXhaUVVGWkxFTkJRVU1zVVVGQlVTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRPMU5CUTI1R08xRkJRMFFzVDBGQlR5eFpRVUZaTEVOQlFVTTdTVUZEZEVJc1EwRkJRenRKUVVWUExGRkJRVkVzUTBGQlF5eFpRVUZuUXl4RlFVRkZMRXRCUVdFN1VVRkRPVVFzUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFdEJRVXNzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0WlFVTTVRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRiRUlzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1EwRkJRenRaUVVOMlFpeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFZEJRVWNzU1VGQlNTeERRVUZETEZGQlFWRXNRMEZCUXl4VlFVRlZMRU5CUVVNN1UwRkRMME03U1VGRFNDeERRVUZETzBsQlJVOHNVMEZCVXl4RFFVRkRMRmxCUVdkRE8xRkJRMmhFTEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eFpRVUZaTEVOQlFVTXNSVUZCUlR0WlFVTjZReXhOUVVGTkxFZEJRVWNzUjBGQlJ5eFpRVUZaTEVOQlFVTXNRMEZCVVN4RFFVRkRMRU5CUVVNN1dVRkRia01zU1VGQlNTeEhRVUZITEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTFvc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJRenRuUWtGRE9VSXNSMEZCUnl4SlFVRkpMRWRCUVVjc1EwRkJReXhEUVVGUkxFTkJRVU1zUTBGQlF6dFpRVU4yUWl4SlFVRkpMRWRCUVVjc1MwRkJTeXhEUVVGRE8yZENRVUZGTEZOQlFWTTdXVUZEZUVJc1MwRkJTeXhOUVVGTkxFTkJRVU1zU1VGQlNTeE5RVUZOTEVOQlFVTXNTVUZCU1N4RFFVRkRMRWRCUVVjc1EwRkJRenRuUWtGRE9VSXNXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRExFTkJRVkVzUTBGQlF5eEpRVUZKTEVkQlFVY3NRMEZCUXp0VFFVTXpRenRKUVVOSUxFTkJRVU03U1VGRlR5eE5RVUZOTEVOQlFVTXNXVUZCWjBNc1JVRkJSU3hMUVVGaE8xRkJRelZFTEUxQlFVMHNZMEZCWXl4SFFVRjFRaXhGUVVGRkxFTkJRVU03VVVGRE9VTXNUVUZCVFN4TFFVRkxMRWRCUVVjc1NVRkJTU3hEUVVGRExFdEJRVXNzUTBGQlF5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRWxCUVVrc1EwRkJReXhMUVVGTExFTkJRVU1zUzBGQlN5eERRVUZETEVWQlFVVXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhEUVVGRExFTkJRVU03VVVGRE4wUXNUVUZCVFN4UlFVRlJMRWRCUVVjc1NVRkJTU3hEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVWQlFVVXNTMEZCU3l4RFFVRkRMRU5CUVVNN1VVRkRja01zUzBGQlN5eEpRVUZKTEVOQlFVTXNSMEZCUnl4RFFVRkRMRVZCUVVVc1EwRkJReXhIUVVGSExFdEJRVXNzUlVGQlJTeERRVUZETEVWQlFVVXNSVUZCUlR0WlFVTTVRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXp0blFrRkRiRUlzVTBGQlV6dFpRVU5ZTEN0Q1FVRXJRanRaUVVNdlFpeGpRVUZqTEVOQlFVTXNRMEZCUXl4TlFVRm9RaXhqUVVGakxFTkJRVU1zUTBGQlF5eEpRVUZOTEVWQlFVVXNSVUZCUXp0WlFVTjZRaXhMUVVGTExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTXNSVUZCUlN4RFFVRkRMRWRCUVVjc1MwRkJTeXhGUVVGRkxFTkJRVU1zUlVGQlJTeEZRVUZGTzJkQ1FVTTVRaXhKUVVGSkxFTkJRVU1zV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RlFVRkZMRU5CUVVNc1EwRkJReXhEUVVGRE8yOUNRVU4yUWl4VFFVRlRPMmRDUVVOWUxFMUJRVTBzUjBGQlJ5eEhRVUZITEVsQlFVa3NRMEZCUXl4alFVRmpMRU5CUVVNc1dVRkJXU3hGUVVGRkxFTkJRVU1zUlVGQlJTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMR05CUVdNN1owSkJRMjVGTEVsQlFVa3NTVUZCU1N4RFFVRkRMRXRCUVVzc1EwRkJReXhIUVVGSExFZEJRVWNzVVVGQlVTeERRVUZETEVkQlFVY3NVVUZCVVN4SFFVRkhMRU5CUVVNc1JVRkJSVHR2UWtGRE4wTXNZMEZCWXl4RFFVRkRMRU5CUVVNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eEhRVUZITEVkQlFVY3NRMEZCUXp0dlFrRkRNMElzU1VGQlNTeERRVUZETEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNN2QwSkJRM0JDTEdOQlFXTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03YjBKQlEzcENMR05CUVdNc1EwRkJReXhEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNN2FVSkJRelZDTzJGQlEwWTdVMEZEUmp0UlFVTkVMRTlCUVU4c1kwRkJZeXhEUVVGRE8wbEJRM2hDTEVOQlFVTTdTVUZGUkN4dFJFRkJiVVE3U1VGRmJrUXNTVUZCU1R0SlFVVkpMRTlCUVU4c1EwRkJReXhaUVVGblF6dFJRVU01UXl4TFFVRkxMRTFCUVUwc1EwRkJReXhKUVVGSkxFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRVZCUVVVN1dVRkRla01zVFVGQlRTeEhRVUZITEVkQlFVY3NXVUZCV1N4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRE8xbEJRMjVETEV0QlFVc3NUVUZCVFN4RFFVRkRMRWxCUVVrc1RVRkJUU3hEUVVGRExFbEJRVWtzUTBGQlF5eEhRVUZITEVOQlFVTTdaMEpCUXpsQ0xGbEJRVmtzUTBGQlF5eERRVUZSTEVOQlFVTXNRMEZCUXl4RFFVRlJMRU5CUVVNc1IwRkJSeXhKUVVGSkxFTkJRVU1zUjBGQlJ5eERRVUZETEZsQlFWa3NRMEZCUXl4RFFVRlJMRU5CUVVNc1EwRkJReXhEUVVGUkxFTkJRVU1zUlVGQlJTeEpRVUZKTEVOQlFVTXNVVUZCVVN4RFFVRkRMR0ZCUVdFc1EwRkJReXhEUVVGRE8xTkJRemxITzBsQlEwZ3NRMEZCUXp0SlFVVlBMR05CUVdNc1EwRkJReXhaUVVGblF5eEZRVUZGTEVOQlFVMHNSVUZCUlN4RFFVRk5PMUZCUTNKRkxFbEJRVWtzUjBGQlJ5eEhRVUZITEVOQlFVTXNRMEZCUXp0UlFVTmFMRTFCUVUwc1kwRkJZeXhIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF5eERRVUZETzFGQlF6RkVMRTFCUVUwc1dVRkJXU3hIUVVGSExFMUJRVTBzUTBGQlF5eEpRVUZKTEVOQlFVTXNXVUZCV1N4RFFVRkRMRU5CUVVNc1EwRkJReXhKUVVGSkxFVkJRVVVzUTBGQlF5eERRVUZETzFGQlEzaEVMRXRCUVVzc1RVRkJUU3hEUVVGRExFbEJRVWtzWTBGQll5eEZRVUZGTzFsQlF6bENMRWxCUVVrc1dVRkJXU3hEUVVGRExGRkJRVkVzUTBGQlF5eERRVUZETEVOQlFVTTdaMEpCUXpGQ0xFZEJRVWNzU1VGQlNTeFpRVUZaTEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJVU3hEUVVGRExFZEJRVWNzV1VGQldTeERRVUZETEVOQlFVTXNRMEZCUXl4RFFVRkRMRU5CUVZFc1EwRkJReXhEUVVGRE8xTkJRMmhGTzFGQlEwUXNUMEZCVHl4SFFVRkhMRU5CUVVNN1NVRkRZaXhEUVVGRE8wTkJRMFlpTENKemIzVnlZMlZ6UTI5dWRHVnVkQ0k2V3lKcGJYQnZjblFnZTFOd1lYSnpaVTFoZEhKcGVGSmxjM1ZzZEgwZ1puSnZiU0FuTGk0dlpHbHpkR0Z1WTJVdGJXRjBjbWw0TDNOd1lYSnpaUzF0WVhSeWFYZ3RjMlZ5ZG1salpTYzdYRzVwYlhCdmNuUWdlMkpwYjB4aGVXOTFkSDBnWm5KdmJTQW5MaTlpYVc4dGJHRjViM1YwSnp0Y2JtbHRjRzl5ZENCN1RVTk1UM0IwYVc5dWN5d2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBmU0JtY205dElDY3VMM1I1Y0dWekp6dGNibWx0Y0c5eWRDQjdUVU5NVDNCU1pYUjFjbTVVZVhCbGZTQm1jbTl0SUNkQVpHRjBZV2R5YjJzdGJHbGljbUZ5YVdWekwyMWhkR2d2YzNKakwzZGxZa2RRVlM5TlEwd3ZkSGx3WlhNbk8xeHVhVzF3YjNKMElIdHRZWEpyYjNaRGJIVnpkR1Z5VjJWaVIxQlZmU0JtY205dElDZEFaR0YwWVdkeWIyc3RiR2xpY21GeWFXVnpMMjFoZEdndmMzSmpMM2RsWWtkUVZTOU5RMHd2VFVOTUxYZGxZa2RRVlNjN1hHNWxlSEJ2Y25RZ1kyOXVjM1FnWkdWbVlYVnNkRTFEVEU5d2RHbHZibk02SUUxRFRFOXdkR2x2Ym5NZ1BTQjdYRzRnSUdWNGNHRnVaRVpoWTNSdmNqb2dNaXhjYmlBZ2JXRjRTWFJsY21GMGFXOXVjem9nTlN4Y2JpQWdhVzVtYkdGMFpVWmhZM1J2Y2pvZ01peGNiaUFnYlhWc2RFWmhZM1J2Y2pvZ01TeGNibjA3WEc1Y2JtVjRjRzl5ZENCamJHRnpjeUJOUTB4VGNHRnljMlZTWldSMVkyVnlJSHRjYmlBZ2NISnBkbUYwWlNCZmIzQjBhVzl1Y3pvZ1RVTk1UM0IwYVc5dWN6dGNibHh1SUNCamIyNXpkSEoxWTNSdmNpaHZjSFJ6T2lCUVlYSjBhV0ZzUEUxRFRFOXdkR2x2Ym5NK0lEMGdlMzBwSUh0Y2JpQWdJQ0IwYUdsekxsOXZjSFJwYjI1eklEMGdleTR1TG1SbFptRjFiSFJOUTB4UGNIUnBiMjV6TENBdUxpNXZjSFJ6ZlR0Y2JpQWdmVnh1WEc0Z0lIQjFZbXhwWXlCaGMzbHVZeUIwY21GdWMyWnZjbTBvYzNCaGNuTmxUV0YwY21sNE9pQlRjR0Z5YzJWTllYUnlhWGhTWlhOMWJIUXNJRzVTYjNkek9pQnVkVzFpWlhJcElIdGNiaUFnSUNBdkx5QjBaWE4wVjI5eWEyVnlUWFZzZEdsd2JIa29LVHRjYmlBZ0lDQXZMeUJ5WlhSMWNtNGdibVYzSUVsdWRETXlRWEp5WVhrb2JsSnZkM01wTzF4dUlDQWdJR3hsZENCemNHRnljMlZQWW1wbFkzUWdQU0IwYUdsekxuUnZUMkpxWldOMFJtOXliU2h6Y0dGeWMyVk5ZWFJ5YVhncE8xeHVJQ0FnSUdsbUlDaDBhR2x6TGw5dmNIUnBiMjV6TG0xaGVFbDBaWEpoZEdsdmJuTWdQaUF3S1NCN1hHNGdJQ0FnSUNCMGFHbHpMbUZrWkV4dmIzQnpLSE53WVhKelpVOWlhbVZqZEN3Z2JsSnZkM01wTzF4dUlDQWdJQ0FnZEdocGN5NXViM0p0WVd4cGVtVW9jM0JoY25ObFQySnFaV04wS1R0Y2JpQWdJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2RHaHBjeTVmYjNCMGFXOXVjeTV0WVhoSmRHVnlZWFJwYjI1ek95QnBLeXNwSUh0Y2JpQWdJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBJRDBnZEdocGN5NWxlSEJoYm1Rb2MzQmhjbk5sVDJKcVpXTjBMQ0J1VW05M2N5azdYRzRnSUNBZ0lDQWdJSFJvYVhNdWFXNW1iR0YwWlNoemNHRnljMlZQWW1wbFkzUXBPMXh1SUNBZ0lDQWdJQ0IwYUdsekxtNXZjbTFoYkdsNlpTaHpjR0Z5YzJWUFltcGxZM1FwTzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQmpiMjV6ZENCN1kyeDFjM1JsY25Nc0lHbHpMQ0JxYzMwZ1BTQjBhR2x6TG1GemMybG5ia05zZFhOMFpYSnpLSE53WVhKelpVOWlhbVZqZEN3Z2JsSnZkM01wTzF4dUlDQWdJSFJvYVhNdVkyOXljbVZqZEVOc2RYTjBaWEp6S0dOc2RYTjBaWEp6S1R0Y2JpQWdJQ0JqYjI1emRDQmxiV0psWkdScGJtZHpJRDBnWVhkaGFYUWdkR2hwY3k1c1lYbHZkWFFvWTJ4MWMzUmxjbk1zSUhOd1lYSnpaVTlpYW1WamRDd2dibEp2ZDNNcE8xeHVJQ0FnSUhKbGRIVnliaUI3WTJ4MWMzUmxjbk1zSUdWdFltVmtXRG9nWlcxaVpXUmthVzVuY3k1bGJXSmxaRmdzSUdWdFltVmtXVG9nWlcxaVpXUmthVzVuY3k1bGJXSmxaRmtzSUdsekxDQnFjMzA3WEc0Z0lIMWNibHh1SUNCd2RXSnNhV01nWVhONWJtTWdkSEpoYm5ObWIzSnRWMlZpUjFCVktITndZWEp6WlUxaGRISnBlRG9nVTNCaGNuTmxUV0YwY21sNFVtVnpkV3gwTENCdVVtOTNjem9nYm5WdFltVnlLU0I3WEc0Z0lDQWdhV1lnS0hSb2FYTXVYMjl3ZEdsdmJuTXViV0Y0U1hSbGNtRjBhVzl1Y3lBOVBUMGdNQ2xjYmlBZ0lDQWdJSEpsZEhWeWJpQjBhR2x6TG5SeVlXNXpabTl5YlNoemNHRnljMlZOWVhSeWFYZ3NJRzVTYjNkektUdGNibHh1SUNBZ0lHTnZibk4wSUcxamJGSmxjeUE5SUdGM1lXbDBJRzFoY210dmRrTnNkWE4wWlhKWFpXSkhVRlVvYzNCaGNuTmxUV0YwY21sNExDQnVVbTkzY3l3Z2RHaHBjeTVmYjNCMGFXOXVjeTV0WVhoSmRHVnlZWFJwYjI1ektUdGNiaUFnSUNCamIyNXpkQ0J6Y0dGeWMyVlBZbXBsWTNRZ1BTQjBhR2x6TG1OemNsUnZVM0JoY25ObFQySnFaV04wS0cxamJGSmxjeXdnYmxKdmQzTXBPMXh1SUNBZ0lHTnZibk4wSUh0amJIVnpkR1Z5Y3l3Z2FYTXNJR3B6ZlNBOUlIUm9hWE11WVhOemFXZHVRMngxYzNSbGNuTW9jM0JoY25ObFQySnFaV04wTENCdVVtOTNjeWs3WEc0Z0lDQWdkR2hwY3k1amIzSnlaV04wUTJ4MWMzUmxjbk1vWTJ4MWMzUmxjbk1wTzF4dUlDQWdJR052Ym5OMElHVnRZbVZrWkdsdVozTWdQU0JoZDJGcGRDQjBhR2x6TG14aGVXOTFkQ2hqYkhWemRHVnljeXdnYzNCaGNuTmxUMkpxWldOMExDQnVVbTkzY3lrN1hHNGdJQ0FnY21WMGRYSnVJSHRqYkhWemRHVnljeXdnWlcxaVpXUllPaUJsYldKbFpHUnBibWR6TG1WdFltVmtXQ3dnWlcxaVpXUlpPaUJsYldKbFpHUnBibWR6TG1WdFltVmtXU3dnYVhNc0lHcHpmVHRjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnWTI5eWNtVmpkRU5zZFhOMFpYSnpLR05zZFhOMFpYSnpPaUJ1ZFcxaVpYSmJYU2tnZTF4dUlDQWdJR052Ym5OMElHTnNkWE4wWlhKVGFYcGxUV0Z3T2lCN1cxODZJRzUxYldKbGNsMDZJRzUxYldKbGNuMGdQU0I3ZlR0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdOc2RYTjBaWElnYjJZZ1kyeDFjM1JsY25NcElIdGNiaUFnSUNBZ0lHbG1JQ2doWTJ4MWMzUmxjbE5wZW1WTllYQmJZMngxYzNSbGNsMHBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSlRhWHBsVFdGd1cyTnNkWE4wWlhKZElEMGdNRHRjYmlBZ0lDQWdJR05zZFhOMFpYSlRhWHBsVFdGd1cyTnNkWE4wWlhKZEt5czdYRzRnSUNBZ2ZWeHVJQ0FnSUdOdmJuTjBJSE52Y25SbFpFbHVaR1Y0WlhNZ1BTQlBZbXBsWTNRdWEyVjVjeWhqYkhWemRHVnlVMmw2WlUxaGNDa3ViV0Z3S0U1MWJXSmxjaWt1YzI5eWRDZ29ZU3dnWWlrZ1BUNGdZMngxYzNSbGNsTnBlbVZOWVhCYllWMGdMU0JqYkhWemRHVnlVMmw2WlUxaGNGdGlYU2s3WEc0Z0lDQWdZMjl1YzNRZ1kyeDFjM1JsY2sxaGNEb2dlMXRmT2lCdWRXMWlaWEpkT2lCdWRXMWlaWEo5SUQwZ2UzMDdYRzRnSUNBZ2MyOXlkR1ZrU1c1a1pYaGxjeTVtYjNKRllXTm9LQ2hqYkhWemRHVnlTV1I0TENCcEtTQTlQaUJqYkhWemRHVnlUV0Z3VzJOc2RYTjBaWEpKWkhoZElEMGdhU0FySURFcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z1kyeDFjM1JsY25NdWJHVnVaM1JvT3lCcEt5c3BYRzRnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY25OYmFWMWRPMXh1SUNBZ0lDOHZJR3hsZENCamRYSkRiSFZ6ZEdWeUlEMGdNVHRjYmlBZ0lDQXZMeUJtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUdOc2RYTjBaWEp6TG14bGJtZDBhRHNnYVNzcktTQjdYRzRnSUNBZ0x5OGdJQ0JwWmlBb0lXTnNkWE4wWlhKTllYQmJZMngxYzNSbGNuTmJhVjFkS1NCN1hHNGdJQ0FnTHk4Z0lDQWdJR05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbk5iYVYxZElEMGdZM1Z5UTJ4MWMzUmxjanRjYmlBZ0lDQXZMeUFnSUNBZ1kyeDFjM1JsY25OYmFWMGdQU0JqZFhKRGJIVnpkR1Z5TzF4dUlDQWdJQzh2SUNBZ0lDQmpkWEpEYkhWemRHVnlLeXM3WEc0Z0lDQWdMeThnSUNCOUlHVnNjMlVnZTF4dUlDQWdJQzh2SUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpOWVhCYlkyeDFjM1JsY25OYmFWMWRPMXh1SUNBZ0lDOHZJQ0FnZlZ4dUlDQWdJQzh2SUgxY2JpQWdmVnh1WEc0Z0lIQnlhWFpoZEdVZ1kzTnlWRzlUY0dGeWMyVlBZbXBsWTNRb2JXTnNVbVZ6T2lCTlEweFBjRkpsZEhWeWJsUjVjR1VzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCdmNtUmxjaUE5SUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV0WVhnb1RXRjBhQzVzYjJjeE1DaHVVbTkzY3lrc0lESXBLU0FySURFN1hHNGdJQ0FnWTI5dWMzUWdiV2x1VDNKa1pYSWdQU0F4SUM4Z1RXRjBhQzV3YjNjb01UQXNJRzl5WkdWeUtUdGNiaUFnSUNCamIyNXpkQ0J6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDQTlJSHQ5TzF4dUlDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmxKdmQzTTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2MzQmhjbk5sVDJKcVpXTjBXMmxkSUQwZ2UzMDdYRzRnSUNBZ0lDQm1iM0lnS0d4bGRDQnJJRDBnYldOc1VtVnpMbWx1WkdWNFQyWm1jMlYwYzF0cFhUc2dheUE4SUcxamJGSmxjeTVwYm1SbGVFOW1abk5sZEhOYmFTQXJJREZkT3lCckt5c3BJSHRjYmlBZ0lDQWdJQ0FnWTI5dWMzUWdhaUE5SUcxamJGSmxjeTVMVGs1SmJtUmxlR1Z6VzJ0ZE8xeHVJQ0FnSUNBZ0lDQnBaaUFvYWlBOFBTQnBJSHg4SUcxamJGSmxjeTVMVGs1VGFXMXBiR0Z5YVhScFpYTmJhMTBnUENCdGFXNVBjbVJsY2lsY2JpQWdJQ0FnSUNBZ0lDQmpiMjUwYVc1MVpUdGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzJsZFcycGRJRDBnYldOc1VtVnpMa3RPVGxOcGJXbHNZWEpwZEdsbGMxdHJYVHRjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUhOd1lYSnpaVTlpYW1WamREdGNiaUFnZlZ4dVhHNGdJSEJ5YVhaaGRHVWdZWE41Ym1NZ2JHRjViM1YwS0dOc2RYTjBaWEp6T2lCdWRXMWlaWEpiWFN3Z2MzQmhjbk5sVFdGMGNtbDRPaUJUY0dGeWMyVk5ZWFJ5YVhoUFltcGxZM1FzSUc1U2IzZHpPaUJ1ZFcxaVpYSXBJSHRjYmlBZ0lDQmpiMjV6ZENCbGJXSmxaRmdnUFNCdVpYY2dSbXh2WVhRek1rRnljbUY1S0c1U2IzZHpLUzVtYVd4c0tEQXBPMXh1SUNBZ0lHTnZibk4wSUdWdFltVmtXU0E5SUc1bGR5QkdiRzloZERNeVFYSnlZWGtvYmxKdmQzTXBMbVpwYkd3b01DazdYRzRnSUNBZ1kyOXVjM1FnWTJ4MWMzUmxjazFoY0RvZ2UxdGZPaUJ1ZFcxaVpYSmRPaUJ1ZFcxaVpYSmJYWDBnUFNCN2ZUdGNiaUFnSUNCamJIVnpkR1Z5Y3k1bWIzSkZZV05vS0NoamJIVnpkR1Z5TENCcEtTQTlQaUI3WEc0Z0lDQWdJQ0JwWmlBb0lXTnNkWE4wWlhKTllYQmJZMngxYzNSbGNsMHBYRzRnSUNBZ0lDQWdJR05zZFhOMFpYSk5ZWEJiWTJ4MWMzUmxjbDBnUFNCYlhUdGNiaUFnSUNBZ0lHTnNkWE4wWlhKTllYQmJZMngxYzNSbGNsMHVjSFZ6YUNocEtUdGNiaUFnSUNCOUtUdGNiaUFnSUNBdkx5QmpiMjV6ZENCdVEyeDFjM1JsY25NZ1BTQlBZbXBsWTNRdWEyVjVjeWhqYkhWemRHVnlUV0Z3S1M1c1pXNW5kR2c3WEc0Z0lDQWdMeThnWTI5dWMzUWdjR1Z5VW05M0lEMGdUV0YwYUM1bWJHOXZjaWhOWVhSb0xuTnhjblFvYmtOc2RYTjBaWEp6S1NrN1hHNGdJQ0FnYkdWMElHTnNkWE4wWlhKT2RXMGdQU0F3TzF4dUlDQWdJR052Ym5OMElITnZjblJsWkVOc2RYTjBaWEpPWVcxbGN5QTlJRTlpYW1WamRDNXJaWGx6S0dOc2RYTjBaWEpOWVhBcE8xeHVJQ0FnSUhOdmNuUmxaRU5zZFhOMFpYSk9ZVzFsY3k1emIzSjBLQ2hoTENCaUtTQTlQaUJqYkhWemRHVnlUV0Z3VzJJZ1lYTWdZVzU1WFM1c1pXNW5kR2dnTFNCamJIVnpkR1Z5VFdGd1cyRWdZWE1nWVc1NVhTNXNaVzVuZEdncE8xeHVJQ0FnSUd4bGRDQndaWEpTYjNjZ1BTQTJPMXh1WEc0Z0lDQWdiR1YwSUhsUFptWnpaWFFnUFNBd08xeHVJQ0FnSUdOdmJuTjBJR3hoZVc5MWRGTnBlbVVnUFNBMU8xeHVJQ0FnSUdadmNpQW9ZMjl1YzNRZ1kyeDFjM1JsY2s1aGJXVWdiMllnYzI5eWRHVmtRMngxYzNSbGNrNWhiV1Z6S1NCN1hHNGdJQ0FnSUNCamIyNXpkQ0JqYkhWemRHVnlJRDBnWTJ4MWMzUmxjazFoY0Z0amJIVnpkR1Z5VG1GdFpTQmhjeUJoYm5sZElUdGNiaUFnSUNBZ0lHTnZibk4wSUdWdFltVmtaR2x1WjNNZ1BTQmhkMkZwZENCaWFXOU1ZWGx2ZFhRb1kyeDFjM1JsY2l3Z2MzQmhjbk5sVFdGMGNtbDRMQ0F3TGpBd01TazdYRzRnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjazUxYlNBOVBUMGdUV0YwYUM1alpXbHNLSEJsY2xKdmR5QXZJREV1TlNrcElIdGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU0E5SURBN1hHNGdJQ0FnSUNBZ0lIbFBabVp6WlhRZ0t6MGdiR0Y1YjNWMFUybDZaU0F2SUhCbGNsSnZkenRjYmlBZ0lDQWdJQ0FnY0dWeVVtOTNJRDBnVFdGMGFDNWpaV2xzS0hCbGNsSnZkeUFxSURFdU5TazdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmpiMjV6ZENCdlptWnpaWFJZSUQwZ0tDaGpiSFZ6ZEdWeVRuVnRJQ1VnY0dWeVVtOTNLU0FxSUd4aGVXOTFkRk5wZW1VZ0x5QndaWEpTYjNjcElDb2dNUzQxTzF4dUlDQWdJQ0FnTHk4Z1kyOXVjM1FnYjJabWMyVjBXU0E5SUUxaGRHZ3VabXh2YjNJb1kyeDFjM1JsY2s1MWJTQXZJSEJsY2xKdmR5a2dLaUF5TzF4dVhHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcElEMGdNRHNnYVNBOElHVnRZbVZrWkdsdVozTXVaVzFpWldSWUxteGxibWQwYURzZ2FTc3JLU0I3WEc0Z0lDQWdJQ0FnSUdWdFltVmtXRnRqYkhWemRHVnlXMmxkWFNBOUlHVnRZbVZrWkdsdVozTXVaVzFpWldSWVcybGRJQ29nYkdGNWIzVjBVMmw2WlNBdklIQmxjbEp2ZHlBcklHOW1abk5sZEZnN1hHNGdJQ0FnSUNBZ0lHVnRZbVZrV1Z0amJIVnpkR1Z5VzJsZFhTQTlJR1Z0WW1Wa1pHbHVaM011WlcxaVpXUlpXMmxkSUNvZ2JHRjViM1YwVTJsNlpTQXZJSEJsY2xKdmR5QXJJSGxQWm1aelpYUTdYRzRnSUNBZ0lDQjlYRzRnSUNBZ0lDQmpiSFZ6ZEdWeVRuVnRLeXM3WEc0Z0lDQWdmVnh1SUNBZ0lISmxkSFZ5YmlCN1pXMWlaV1JZTENCbGJXSmxaRmw5TzF4dUlDQjlYRzVjYmlBZ2NISnBkbUYwWlNCdFpYSm5aVU5zZFhOMFpYSnpLR05zZFhOMFpYSnpPaUJ1ZFcxaVpYSmJYU3dnYVRvZ2JuVnRZbVZ5TENCcU9pQnVkVzFpWlhJcElIdGNiaUFnSUNCamIyNXpkQ0JwUTJ4MWMzUmxjaUE5SUdOc2RYTjBaWEp6VzJsZE8xeHVJQ0FnSUdOdmJuTjBJR3BEYkhWemRHVnlJRDBnWTJ4MWMzUmxjbk5iYWwwN1hHNGdJQ0FnWm05eUlDaHNaWFFnYXlBOUlEQTdJR3NnUENCamJIVnpkR1Z5Y3k1c1pXNW5kR2c3SUdzckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0dOc2RYTjBaWEp6VzJ0ZElEMDlQU0JxUTJ4MWMzUmxjaWxjYmlBZ0lDQWdJQ0FnWTJ4MWMzUmxjbk5iYTEwZ1BTQnBRMngxYzNSbGNqdGNiaUFnSUNCOVhHNGdJSDFjYmlBZ2NIVmliR2xqSUdGemMybG5ia05zZFhOMFpYSnpLSE53WVhKelpVMWhkSEpwZURvZ1UzQmhjbk5sVFdGMGNtbDRUMkpxWldOMExDQnVVbTkzY3pvZ2JuVnRZbVZ5S1NCN1hHNGdJQ0FnYkdWMElHTnNkWE4wWlhKT2RXMGdQU0F3TzF4dUlDQWdJR052Ym5OMElHbHpPaUJ1ZFcxaVpYSmJYU0E5SUZ0ZE8xeHVJQ0FnSUdOdmJuTjBJR3B6T2lCdWRXMWlaWEpiWFNBOUlGdGRPMXh1SUNBZ0lHTnZibk4wSUc5eVpHVnlJRDBnVFdGMGFDNW1iRzl2Y2loTllYUm9MbTFoZUNoTllYUm9MbXh2WnpFd0tHNVNiM2R6S1N3Z01pa3BJQ3NnTVR0Y2JpQWdJQ0JqYjI1emRDQnRhVzVQY21SbGNpQTlJRTFoZEdndWNHOTNLREV3TENCdmNtUmxjaWs3WEc0Z0lDQWdZMjl1YzNRZ1kyeDFjM1JsY25NNklHNTFiV0psY2x0ZElEMGdibVYzSUVGeWNtRjVLRzVTYjNkektTNW1hV3hzS0MweEtUdGNiaUFnSUNCbWIzSWdLR052Ym5OMElHa2diMllnVDJKcVpXTjBMbXRsZVhNb2MzQmhjbk5sVFdGMGNtbDRLU2tnZTF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCcUlHOW1JRTlpYW1WamRDNXJaWGx6S0hOd1lYSnpaVTFoZEhKcGVGdHBJR0Z6SUdGdWVWMHBLU0I3WEc0Z0lDQWdJQ0FnSUdsbUlDaE5ZWFJvTG5KdmRXNWtLSE53WVhKelpVMWhkSEpwZUZ0cElHRnpJR0Z1ZVYxYmFpQmhjeUJoYm5sZElDb2diV2x1VDNKa1pYSXBJQzhnYldsdVQzSmtaWElnUGlBd0lDWW1YRzRnSUNBZ0lDQWdJQ0FnYzNCaGNuTmxUV0YwY21sNFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMGdJVDA5SUU1MWJXSmxjaWhwS1NBbUppQk9kVzFpWlhJb2Fpa2dQaUJPZFcxaVpYSW9hU2twSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBjeTV3ZFhOb0tFNTFiV0psY2locEtTazdYRzRnSUNBZ0lDQWdJQ0FnYW5NdWNIVnphQ2hPZFcxaVpYSW9haWtwTzF4dUlDQWdJQ0FnSUNBZ0lHbG1JQ2hqYkhWemRHVnljMXRPZFcxaVpYSW9hU2xkSUNFOVBTQXRNU0FtSmlCamJIVnpkR1Z5YzF0T2RXMWlaWElvYWlsZElDRTlQU0F0TVNrZ2UxeHVJQ0FnSUNBZ0lDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcwNTFiV0psY2locEtWMGdJVDA5SUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwcFhHNGdJQ0FnSUNBZ0lDQWdJQ0FnSUhSb2FYTXViV1Z5WjJWRGJIVnpkR1Z5Y3loamJIVnpkR1Z5Y3l3Z1RuVnRZbVZ5S0drcExDQk9kVzFpWlhJb2Fpa3BPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyeDFjM1JsY25OYlRuVnRZbVZ5S0drcFhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhxS1YwZ1BTQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0JwWmlBb1kyeDFjM1JsY25OYlRuVnRZbVZ5S0dvcFhTQWhQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdJQ0FnSUdOc2RYTjBaWEp6VzA1MWJXSmxjaWhwS1YwZ1BTQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FpbGRPMXh1SUNBZ0lDQWdJQ0FnSUgwZ1pXeHpaU0I3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeVRuVnRLeXM3WEc0Z0lDQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdE9kVzFpWlhJb2FTbGRJRDBnWTJ4MWMzUmxjazUxYlR0Y2JpQWdJQ0FnSUNBZ0lDQWdJR05zZFhOMFpYSnpXMDUxYldKbGNpaHFLVjBnUFNCamJIVnpkR1Z5VG5WdE8xeHVJQ0FnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJQ0FnZlZ4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQm1iM0lnS0d4bGRDQnBQVEE3SUdrZ1BDQmpiSFZ6ZEdWeWN5NXNaVzVuZEdnN0lHa3JLeWtnZTF4dUlDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcybGRJRDA5UFNBdE1Ta2dlMXh1SUNBZ0lDQWdJQ0JqYkhWemRHVnlUblZ0SUNzck8xeHVJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHBYU0E5SUdOc2RYTjBaWEpPZFcwN1hHNGdJQ0FnSUNCOVhHNGdJQ0FnZlZ4dUlDQWdJSEpsZEhWeWJpQjdZMngxYzNSbGNuTXNJR2x6T2lCdVpYY2dWV2x1ZERNeVFYSnlZWGtvYVhNcExDQnFjem9nYm1WM0lGVnBiblF6TWtGeWNtRjVLR3B6S1gwN1hHNGdJSDFjYmx4dUlDQXZLaW9nYzJGdFpTQmhjeUJoYzNOcFoyNGdZMngxYzNSbGNuTWdZblYwSUhkdmNtdHBibWNnYjI0Z2RHaGxJR3hsZG1Wc0lHOW1JRU5UVWlCbWIzSnRZWFFnY21WMGRYSnVaV1FnWm5KdmJTQjNaV0pIVUZVZ0tpOWNiaUFnY0hKcGRtRjBaU0JoYzNOcFoyNURiSFZ6ZEdWeWMwTlRVaWh0WTJ4U1pYTTZJRTFEVEU5d1VtVjBkWEp1Vkhsd1pTd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUd4bGRDQmpiSFZ6ZEdWeVRuVnRJRDBnTUR0Y2JpQWdJQ0JqYjI1emRDQnBjem9nYm5WdFltVnlXMTBnUFNCYlhUdGNiaUFnSUNCamIyNXpkQ0JxY3pvZ2JuVnRZbVZ5VzEwZ1BTQmJYVHRjYmlBZ0lDQmpiMjV6ZENCdmNtUmxjaUE5SUUxaGRHZ3VabXh2YjNJb1RXRjBhQzV0WVhnb1RXRjBhQzVzYjJjeE1DaHVVbTkzY3lrc0lESXBLU0FySURFN1hHNGdJQ0FnWTI5dWMzUWdiV2x1VDNKa1pYSWdQU0F4SUM4Z1RXRjBhQzV3YjNjb01UQXNJRzl5WkdWeUtUdGNiaUFnSUNCamIyNXpkQ0JqYkhWemRHVnljem9nYm5WdFltVnlXMTBnUFNCdVpYY2dRWEp5WVhrb2JsSnZkM01wTG1acGJHd29MVEVwTzF4dUlDQWdJR052Ym5OMElHTnZjbkpsWTNSbFpFOW1abk5sZEhNZ1BTQnVaWGNnVldsdWRETXlRWEp5WVhrb2JsSnZkM01nS3lBeEtUdGNiaUFnSUNCc1pYUWdiMlptYzJWMFEyOTFiblJsY2lBOUlEQTdYRzRnSUNBZ1kyOXljbVZqZEdWa1QyWm1jMlYwYzFzd1hTQTlJREE3WEc0Z0lDQWdabTl5SUNoc1pYUWdhU0E5SURBN0lHa2dQQ0J1VW05M2N6c2dhU3NyS1NCN1hHNGdJQ0FnSUNCbWIzSWdLR3hsZENCcklEMGdiV05zVW1WekxtbHVaR1Y0VDJabWMyVjBjMXRwWFRzZ2F5QThJRzFqYkZKbGN5NXBibVJsZUU5bVpuTmxkSE5iYVNBcklERmRPeUJyS3lzcElIdGNiaUFnSUNBZ0lDQWdZMjl1YzNRZ2FpQTlJRzFqYkZKbGN5NUxUazVKYm1SbGVHVnpXMnRkTzF4dUlDQWdJQ0FnSUNCcFppQW9haUE4UFNCcElIeDhJRzFqYkZKbGN5NUxUazVUYVcxcGJHRnlhWFJwWlhOYmExMGdQRDBnYldsdVQzSmtaWElwWEc0Z0lDQWdJQ0FnSUNBZ1kyOXVkR2x1ZFdVN1hHNGdJQ0FnSUNBZ0lHbHpMbkIxYzJnb2FTazdYRzRnSUNBZ0lDQWdJR3B6TG5CMWMyZ29haWs3WEc0Z0lDQWdJQ0FnSUc5bVpuTmxkRU52ZFc1MFpYSXJLenRjYmlBZ0lDQWdJQ0FnYVdZZ0tHTnNkWE4wWlhKelcybGRJQ0U5UFNBdE1TQW1KaUJqYkhWemRHVnljMXRxWFNBaFBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQnBaaUFvWTJ4MWMzUmxjbk5iYVYwZ0lUMDlJR05zZFhOMFpYSnpXMnBkS1Z4dUlDQWdJQ0FnSUNBZ0lDQWdkR2hwY3k1dFpYSm5aVU5zZFhOMFpYSnpLR05zZFhOMFpYSnpMQ0JwTENCcUtUdGNiaUFnSUNBZ0lDQWdmU0JsYkhObElHbG1JQ2hqYkhWemRHVnljMXRwWFNBaFBUMGdMVEVwSUh0Y2JpQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHFYU0E5SUdOc2RYTjBaWEp6VzJsZE8xeHVJQ0FnSUNBZ0lDQjlJR1ZzYzJVZ2FXWWdLR05zZFhOMFpYSnpXMnBkSUNFOVBTQXRNU2tnZTF4dUlDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcybGRJRDBnWTJ4MWMzUmxjbk5iYWwwN1hHNGdJQ0FnSUNBZ0lIMGdaV3h6WlNCN1hHNGdJQ0FnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU3NyTzF4dUlDQWdJQ0FnSUNBZ0lHTnNkWE4wWlhKelcybGRJRDBnWTJ4MWMzUmxjazUxYlR0Y2JpQWdJQ0FnSUNBZ0lDQmpiSFZ6ZEdWeWMxdHFYU0E5SUdOc2RYTjBaWEpPZFcwN1hHNGdJQ0FnSUNBZ0lIMWNiaUFnSUNBZ0lIMWNiaUFnSUNBZ0lHTnZjbkpsWTNSbFpFOW1abk5sZEhOYmFTQXJJREZkSUQwZ2IyWm1jMlYwUTI5MWJuUmxjanRjYmlBZ0lDQjlYRzRnSUNBZ1ptOXlJQ2hzWlhRZ2FUMHdPeUJwSUR3Z1kyeDFjM1JsY25NdWJHVnVaM1JvT3lCcEt5c3BJSHRjYmlBZ0lDQWdJR2xtSUNoamJIVnpkR1Z5YzF0cFhTQTlQVDBnTFRFcElIdGNiaUFnSUNBZ0lDQWdZMngxYzNSbGNrNTFiU0FyS3p0Y2JpQWdJQ0FnSUNBZ1kyeDFjM1JsY25OYmFWMGdQU0JqYkhWemRHVnlUblZ0TzF4dUlDQWdJQ0FnZlZ4dUlDQWdJSDFjYmlBZ0lDQnlaWFIxY200Z2UyTnNkWE4wWlhKekxDQnBjem9nYm1WM0lGVnBiblF6TWtGeWNtRjVLR2x6S1N3Z2FuTTZJRzVsZHlCVmFXNTBNekpCY25KaGVTaHFjeWtzSUdOdmNuSmxZM1JsWkU5bVpuTmxkSE45TzF4dUlDQjlYRzVjYmlBZ2NIVmliR2xqSUhSdlQySnFaV04wUm05eWJTaHpjR0Z5YzJWTllYUnlhWGc2SUZOd1lYSnpaVTFoZEhKcGVGSmxjM1ZzZENrNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDQjdYRzRnSUNBZ1kyOXVjM1FnYzNCaGNuTmxUMkpxWldOME9pQjdXMTg2SUc1MWJXSmxjbDA2SUh0Ylh6b2diblZ0WW1WeVhUb2diblZ0WW1WeWZYMGdQU0I3ZlR0Y2JpQWdJQ0JtYjNJZ0tHeGxkQ0JwSUQwZ01Ec2dhU0E4SUhOd1lYSnpaVTFoZEhKcGVDNXBMbXhsYm1kMGFEc2dhU3NyS1NCN1hHNGdJQ0FnSUNCcFppQW9JWE53WVhKelpVOWlhbVZqZEZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYwcFhHNGdJQ0FnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnR6Y0dGeWMyVk5ZWFJ5YVhndWFWdHBYVjBnUFNCN2ZUdGNiaUFnSUNBZ0lITndZWEp6WlU5aWFtVmpkRnR6Y0dGeWMyVk5ZWFJ5YVhndWFWdHBYVjFiYzNCaGNuTmxUV0YwY21sNExtcGJhVjFkSUQwZ01TQXRJSE53WVhKelpVMWhkSEpwZUM1a2FYTjBZVzVqWlZ0cFhUdGNiaUFnSUNBZ0lHbG1JQ2doYzNCaGNuTmxUMkpxWldOMFczTndZWEp6WlUxaGRISnBlQzVxVzJsZFhTbGNiaUFnSUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXFXMmxkWFNBOUlIdDlPMXh1SUNBZ0lDQWdjM0JoY25ObFQySnFaV04wVzNOd1lYSnpaVTFoZEhKcGVDNXFXMmxkWFZ0emNHRnljMlZOWVhSeWFYZ3VhVnRwWFYwZ1BTQXhJQzBnYzNCaGNuTmxUV0YwY21sNExtUnBjM1JoYm1ObFcybGRPMXh1SUNBZ0lIMWNiaUFnSUNCeVpYUjFjbTRnYzNCaGNuTmxUMkpxWldOME8xeHVJQ0I5WEc1Y2JpQWdjSEpwZG1GMFpTQmhaR1JNYjI5d2N5aHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2JsSnZkM002SUc1MWJXSmxjaWtnZTF4dUlDQWdJR1p2Y2lBb2JHVjBJR2tnUFNBd095QnBJRHdnYmxKdmQzTTdJR2tyS3lrZ2UxeHVJQ0FnSUNBZ2FXWWdLQ0Z6Y0dGeWMyVlBZbXBsWTNSYmFWMHBYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0cFhTQTlJSHQ5TzF4dUlDQWdJQ0FnYzNCaGNuTmxUMkpxWldOMFcybGRXMmxkSUQwZ2RHaHBjeTVmYjNCMGFXOXVjeTV0ZFd4MFJtRmpkRzl5TzF4dUlDQWdJSDFjYmlBZ2ZWeHVYRzRnSUhCeWFYWmhkR1VnYm05eWJXRnNhWHBsS0hOd1lYSnpaVTlpYW1WamREb2dVM0JoY25ObFRXRjBjbWw0VDJKcVpXTjBLU0I3WEc0Z0lDQWdabTl5SUNoamIyNXpkQ0JwSUc5bUlFOWlhbVZqZEM1clpYbHpLSE53WVhKelpVOWlhbVZqZENrcElIdGNiaUFnSUNBZ0lHTnZibk4wSUhKdmR5QTlJSE53WVhKelpVOWlhbVZqZEZ0cElHRnpJR0Z1ZVYwN1hHNGdJQ0FnSUNCc1pYUWdjM1Z0SUQwZ01EdGNiaUFnSUNBZ0lHWnZjaUFvWTI5dWMzUWdhaUJ2WmlCUFltcGxZM1F1YTJWNWN5aHliM2NwS1Z4dUlDQWdJQ0FnSUNCemRXMGdLejBnY205M1cyb2dZWE1nWVc1NVhUdGNiaUFnSUNBZ0lHbG1JQ2h6ZFcwZ1BUMDlJREFwSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnWm05eUlDaGpiMjV6ZENCcUlHOW1JRTlpYW1WamRDNXJaWGx6S0hKdmR5a3BYRzRnSUNBZ0lDQWdJSE53WVhKelpVOWlhbVZqZEZ0cElHRnpJR0Z1ZVYxYmFpQmhjeUJoYm5sZElDODlJSE4xYlR0Y2JpQWdJQ0I5WEc0Z0lIMWNibHh1SUNCd2NtbDJZWFJsSUdWNGNHRnVaQ2h6Y0dGeWMyVlBZbXBsWTNRNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRDd2dibEp2ZDNNNklHNTFiV0psY2lrZ2UxeHVJQ0FnSUdOdmJuTjBJR1Y0Y0dGdVpHVmtUMkpxWldOME9pQlRjR0Z5YzJWTllYUnlhWGhQWW1wbFkzUWdQU0I3ZlR0Y2JpQWdJQ0JqYjI1emRDQnZjbVJsY2lBOUlFMWhkR2d1Wm14dmIzSW9UV0YwYUM1dFlYZ29UV0YwYUM1c2IyY3hNQ2h1VW05M2N5a3NJRElwS1NBcklERTdYRzRnSUNBZ1kyOXVjM1FnYldsdVQzSmtaWElnUFNCTllYUm9MbkJ2ZHlneE1Dd2diM0prWlhJcE8xeHVJQ0FnSUdadmNpQW9iR1YwSUdrZ1BTQXdPeUJwSUR3Z2JsSnZkM003SUdrckt5a2dlMXh1SUNBZ0lDQWdhV1lnS0NGemNHRnljMlZQWW1wbFkzUmJhVjBwWEc0Z0lDQWdJQ0FnSUdOdmJuUnBiblZsTzF4dUlDQWdJQ0FnTHk4Z1kyOXVjM1FnY205M0lEMGdjM0JoY25ObFQySnFaV04wVzJsZE8xeHVJQ0FnSUNBZ1pYaHdZVzVrWldSUFltcGxZM1JiYVYwZ1B6ODlJSHQ5TzF4dUlDQWdJQ0FnWm05eUlDaHNaWFFnYWlBOUlHazdJR29nUENCdVVtOTNjenNnYWlzcktTQjdYRzRnSUNBZ0lDQWdJR2xtSUNnaGMzQmhjbk5sVDJKcVpXTjBXMmxkUHk1YmFsMHBYRzRnSUNBZ0lDQWdJQ0FnWTI5dWRHbHVkV1U3WEc0Z0lDQWdJQ0FnSUdOdmJuTjBJSFpoYkNBOUlIUm9hWE11WjJWMFJYaHdZVzVrVm1Gc2RXVW9jM0JoY25ObFQySnFaV04wTENCcExDQnFLVHNnTHk5d2NuVnVhVzVuSUhOMFpYQmNiaUFnSUNBZ0lDQWdhV1lnS0UxaGRHZ3VjbTkxYm1Rb2RtRnNJQ29nYldsdVQzSmtaWElwSUM4Z2JXbHVUM0prWlhJZ1BpQXdLU0I3WEc0Z0lDQWdJQ0FnSUNBZ1pYaHdZVzVrWldSUFltcGxZM1JiYVYxYmFsMGdQU0IyWVd3N1hHNGdJQ0FnSUNBZ0lDQWdhV1lnS0NGbGVIQmhibVJsWkU5aWFtVmpkRnRxWFNsY2JpQWdJQ0FnSUNBZ0lDQWdJR1Y0Y0dGdVpHVmtUMkpxWldOMFcycGRJRDBnZTMwN1hHNGdJQ0FnSUNBZ0lDQWdaWGh3WVc1a1pXUlBZbXBsWTNSYmFsMWJhVjBnUFNCMllXdzdYRzRnSUNBZ0lDQWdJSDFjYmlBZ0lDQWdJSDFjYmlBZ0lDQjlYRzRnSUNBZ2NtVjBkWEp1SUdWNGNHRnVaR1ZrVDJKcVpXTjBPMXh1SUNCOVhHNWNiaUFnTHk4Z2NISnBkbUYwWlNCd2NuVnVaU2h5YjNjNklGTndZWEp6WlUxaGRISnBlRTlpYW1WamRGdHVkVzFpWlhKZEtTQjdYRzVjYmlBZ0x5OGdmVnh1WEc0Z0lIQnlhWFpoZEdVZ2FXNW1iR0YwWlNoemNHRnljMlZQWW1wbFkzUTZJRk53WVhKelpVMWhkSEpwZUU5aWFtVmpkQ2tnZTF4dUlDQWdJR1p2Y2lBb1kyOXVjM1FnYVNCdlppQlBZbXBsWTNRdWEyVjVjeWh6Y0dGeWMyVlBZbXBsWTNRcEtTQjdYRzRnSUNBZ0lDQmpiMjV6ZENCeWIzY2dQU0J6Y0dGeWMyVlBZbXBsWTNSYmFTQmhjeUJoYm5sZE8xeHVJQ0FnSUNBZ1ptOXlJQ2hqYjI1emRDQnFJRzltSUU5aWFtVmpkQzVyWlhsektISnZkeWtwWEc0Z0lDQWdJQ0FnSUhOd1lYSnpaVTlpYW1WamRGdHBJR0Z6SUdGdWVWMWJhaUJoY3lCaGJubGRJRDBnVFdGMGFDNXdiM2NvYzNCaGNuTmxUMkpxWldOMFcya2dZWE1nWVc1NVhWdHFJR0Z6SUdGdWVWMHNJSFJvYVhNdVgyOXdkR2x2Ym5NdWFXNW1iR0YwWlVaaFkzUnZjaWs3WEc0Z0lDQWdmVnh1SUNCOVhHNWNiaUFnY0hKcGRtRjBaU0JuWlhSRmVIQmhibVJXWVd4MVpTaHpjR0Z5YzJWUFltcGxZM1E2SUZOd1lYSnpaVTFoZEhKcGVFOWlhbVZqZEN3Z2FUb2dZVzU1TENCcU9pQmhibmtwSUh0Y2JpQWdJQ0JzWlhRZ2RtRnNJRDBnTUR0Y2JpQWdJQ0JqYjI1emRDQmpkWEp5Wlc1MFNXNWtaWGhsY3lBOUlFOWlhbVZqZEM1clpYbHpLSE53WVhKelpVOWlhbVZqZEZ0cFhTQS9QeUI3ZlNrN1hHNGdJQ0FnWTI5dWMzUWdiM1JvWlhKSmJtUmxlR1Z6SUQwZ1QySnFaV04wTG10bGVYTW9jM0JoY25ObFQySnFaV04wVzJwZElEOC9JSHQ5S1R0Y2JpQWdJQ0JtYjNJZ0tHTnZibk4wSUdzZ2IyWWdZM1Z5Y21WdWRFbHVaR1Y0WlhNcElIdGNiaUFnSUNBZ0lHbG1JQ2h2ZEdobGNrbHVaR1Y0WlhNdWFXNWpiSFZrWlhNb2F5a3BYRzRnSUNBZ0lDQWdJSFpoYkNBclBTQnpjR0Z5YzJWUFltcGxZM1JiYVYxYmF5QmhjeUJoYm5sZElDb2djM0JoY25ObFQySnFaV04wVzJwZFcyc2dZWE1nWVc1NVhUdGNiaUFnSUNCOVhHNGdJQ0FnY21WMGRYSnVJSFpoYkR0Y2JpQWdmVnh1ZlZ4dVhHNGlYWDA9IiwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG4vKiBlc2xpbnQtZGlzYWJsZSBtYXgtbGVuICovXG5pbXBvcnQgeyBnZXRHUFVEZXZpY2UgfSBmcm9tICcuLi9nZXRHUFVEZXZpY2UnO1xuaW1wb3J0IHsgc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlIH0gZnJvbSAnLi9jb2x3aXNlLW5vcm1hbGl6ZSc7XG5pbXBvcnQgeyBleHBhbmROb1Jldml2ZSwgaW5mbGF0ZSB9IGZyb20gJy4vaW5mbGF0ZS1leHBhbmQnO1xuaW1wb3J0IHsgdG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybSB9IGZyb20gJy4vdXRpbHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtvdkNsdXN0ZXJXZWJHUFUoc3BhcnNlTWF0cml4LCBuUm93cywgbWF4SXRlcmF0aW9ucyA9IDUpIHtcbiAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgICAgICBjb25zdCBkZXZpY2UgPSB5aWVsZCBnZXRHUFVEZXZpY2UoKTtcbiAgICAgICAgaWYgKCFkZXZpY2UpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGdwdSBkZXZpY2UgZm91bmQnKTtcbiAgICAgICAgLy8gc2VsZiBsb29wcyBhcmUgYWxyZWFkeSBhZGRlZCBoZXJlXG4gICAgICAgIGNvbnN0IHNwYXJzZUtOTkZvcm0gPSB0b1NwYXJzZUtOTlNpbWlsYXJpdHlGb3JtKHNwYXJzZU1hdHJpeCwgblJvd3MpO1xuICAgICAgICAvLyBmaXJzdCwgd2Ugbm9ybWlsaXplIHRoZSBzaW1pbGFyaXRpZXNcbiAgICAgICAgeWllbGQgc3BhcnNlS05OTm9yYWxpemVDb2x3aXNlKGRldmljZSwgc3BhcnNlS05ORm9ybS5LTk5TaW1pbGFyaXRpZXMsIHNwYXJzZUtOTkZvcm0uaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgIGxldCByZXMgPSBzcGFyc2VLTk5Gb3JtO1xuICAgICAgICAvLyB0aGVuIHdlIGV4cGFuZCB0aGUgc2ltaWxhcml0aWVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWF4SXRlcmF0aW9uczsgaSsrKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNoZWNrU29ydGVkKHJlcy5LTk5JbmRleGVzLCByZXMuaW5kZXhPZmZzZXRzKSk7XG4gICAgICAgICAgICBjb25zdCBleHBhbmRSZXMgPSB5aWVsZCBleHBhbmROb1Jldml2ZShkZXZpY2UsIHJlcy5LTk5TaW1pbGFyaXRpZXMsIHJlcy5LTk5JbmRleGVzLCByZXMuaW5kZXhPZmZzZXRzLCBuUm93cyk7XG4gICAgICAgICAgICAvLyB0aGVuIHdlIGluZmxhdGUgdGhlIHNpbWlsYXJpdGllc1xuICAgICAgICAgICAgaW5mbGF0ZShleHBhbmRSZXMuS05OU2ltaWxhcml0aWVzLCAyKTtcbiAgICAgICAgICAgIC8vIHRoZW4gd2Ugbm9ybWlsaXplIHRoZSBzaW1pbGFyaXRpZXMgYWdhaW5cbiAgICAgICAgICAgIHlpZWxkIHNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZShkZXZpY2UsIGV4cGFuZFJlcy5LTk5TaW1pbGFyaXRpZXMsIGV4cGFuZFJlcy5pbmRleE9mZnNldHMsIG5Sb3dzKTtcbiAgICAgICAgICAgIHJlcyA9IGV4cGFuZFJlcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9TUNMLXdlYkdQVS5qcy5tYXAiLCJpbXBvcnQgeyBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeCB9IGZyb20gJ0BkYXRhZ3Jvay1saWJyYXJpZXMvbWF0aC9zcmMvd2ViR1BVL3NwYXJzZS1tYXRyaXgvd2ViR1BVLXNwYXJzZS1tYXRyaXgnO1xuaW1wb3J0IHsgU3BhcnNlTWF0cml4U2VydmljZSB9IGZyb20gJy4uL2Rpc3RhbmNlLW1hdHJpeC9zcGFyc2UtbWF0cml4LXNlcnZpY2UnO1xuaW1wb3J0IHsgTUNMU3BhcnNlUmVkdWNlciB9IGZyb20gJy4vbWFyY292LWNsdXN0ZXInO1xub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBkYXRhLCB0aHJlc2hvbGQsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kLCBkaXN0YW5jZUZuQXJncywgZGlzdGFuY2VGbnMsIG1heEl0ZXJhdGlvbnMsIHVzZVdlYkdQVSB9ID0gZXZlbnQuZGF0YTtcbiAgICBjb25zb2xlLnRpbWUoJ3NwYXJzZSBtYXRyaXgnKTtcbiAgICBsZXQgc3BhcnNlID0gbnVsbDtcbiAgICBpZiAodXNlV2ViR1BVKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBzcGFyc2UgPSBhd2FpdCBtdWx0aUNvbFdlYkdQVVNwYXJzZU1hdHJpeChkYXRhLCB0aHJlc2hvbGQgLyAxMDAsIGRpc3RhbmNlRm5zLCBhZ2dyZWdhdGlvbk1ldGhvZCwgd2VpZ2h0cywgZGlzdGFuY2VGbkFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghc3BhcnNlKSB7IC8vIGZhbHNiYWNrIHRvIENQVVxuICAgICAgICBpZiAodXNlV2ViR1BVKVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignV0VCR1BVIHNwYXJzZSBtYXRyaXggY2FsY3VsYXRpb24gZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIGltcGxlbWVudGF0aW9uJyk7XG4gICAgICAgIHNwYXJzZSA9IGF3YWl0IG5ldyBTcGFyc2VNYXRyaXhTZXJ2aWNlKClcbiAgICAgICAgICAgIC5jYWxjTXVsdGlDb2x1bW4oZGF0YSwgZGlzdGFuY2VGbnMsIHRocmVzaG9sZCAvIDEwMCwgZGlzdGFuY2VGbkFyZ3MsIHdlaWdodHMsIGFnZ3JlZ2F0aW9uTWV0aG9kKTtcbiAgICB9XG4gICAgY29uc29sZS50aW1lRW5kKCdzcGFyc2UgbWF0cml4Jyk7XG4gICAgLy9jb25zdCByZXMgPSBhd2FpdCBuZXcgTUNMU3BhcnNlUmVkdWNlcih7bWF4SXRlcmF0aW9uczogbWF4SXRlcmF0aW9ucyA/PyA1fSkudHJhbnNmb3JtKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgIGNvbnN0IHJlZHVjZXIgPSBuZXcgTUNMU3BhcnNlUmVkdWNlcih7IG1heEl0ZXJhdGlvbnM6IG1heEl0ZXJhdGlvbnMgPz8gNSB9KTtcbiAgICBjb25zb2xlLnRpbWUoJ01DTCcpO1xuICAgIGxldCByZXMgPSBudWxsO1xuICAgIGlmICh1c2VXZWJHUFUpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlcyA9IGF3YWl0IHJlZHVjZXIudHJhbnNmb3JtV2ViR1BVKHNwYXJzZSwgZGF0YVswXS5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCd3ZWJHUFUgTUNMIGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIENQVSBpbXBsZW1lbnRhdGlvbicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXJlcylcbiAgICAgICAgcmVzID0gYXdhaXQgcmVkdWNlci50cmFuc2Zvcm0oc3BhcnNlLCBkYXRhWzBdLmxlbmd0aCk7XG4gICAgY29uc29sZS50aW1lRW5kKCdNQ0wnKTtcbiAgICBwb3N0TWVzc2FnZSh7IHJlcyB9KTtcbn07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2liV05zTFhkdmNtdGxjaTVxY3lJc0luTnZkWEpqWlZKdmIzUWlPaUlpTENKemIzVnlZMlZ6SWpwYkltMWpiQzEzYjNKclpYSXVkSE1pWFN3aWJtRnRaWE1pT2x0ZExDSnRZWEJ3YVc1bmN5STZJa0ZCUVVFc1QwRkJUeXhGUVVGRExEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc2QwVkJRWGRGTEVOQlFVTTdRVUZEYkVnc1QwRkJUeXhGUVVGeFFpeHRRa0ZCYlVJc1JVRkJReXhOUVVGTkxEQkRRVUV3UXl4RFFVRkRPMEZCUjJwSExFOUJRVThzUlVGQlF5eG5Ra0ZCWjBJc1JVRkJReXhOUVVGTkxHdENRVUZyUWl4RFFVRkRPMEZCUld4RUxGTkJRVk1zUjBGQlJ5eExRVUZMTEVWQlFVVXNTMEZCU3l4RlFVRkZMRVZCUVVVN1NVRkRNVUlzVFVGQlRTeEZRVUZETEVsQlFVa3NSVUZCUlN4VFFVRlRMRVZCUVVVc1QwRkJUeXhGUVVGRkxHbENRVUZwUWl4RlFVRkZMR05CUVdNc1JVRkJSU3hYUVVGWExFVkJRVVVzWVVGQllTeEZRVUZGTEZOQlFWTXNSVUZCUXl4SFFVZE9MRXRCUVVzc1EwRkJReXhKUVVGSkxFTkJRVU03U1VGRkwwY3NUMEZCVHl4RFFVRkRMRWxCUVVrc1EwRkJReXhsUVVGbExFTkJRVU1zUTBGQlF6dEpRVU01UWl4SlFVRkpMRTFCUVUwc1IwRkJPRUlzU1VGQlNTeERRVUZETzBsQlF6ZERMRWxCUVVrc1UwRkJVeXhGUVVGRk8xRkJRMklzU1VGQlNUdFpRVU5HTEUxQlFVMHNSMEZCUnl4TlFVRk5MREJDUVVFd1FpeERRVU4yUXl4SlFVRkpMRVZCUVVVc1UwRkJVeXhIUVVGSExFZEJRVWNzUlVGQlJTeFhRVUZyUWl4RlFVRkZMR2xDUVVGM1FpeEZRVUZGTEU5QlFVOHNSVUZCUlN4alFVRmpMRU5CUVVNc1EwRkJRenRUUVVOcVJ6dFJRVUZETEU5QlFVOHNRMEZCUXl4RlFVRkZPMWxCUTFZc1QwRkJUeXhEUVVGRExFdEJRVXNzUTBGQlF5eERRVUZETEVOQlFVTXNRMEZCUXp0VFFVTnNRanRMUVVOR08wbEJRMFFzU1VGQlNTeERRVUZETEUxQlFVMHNSVUZCUlN4RlFVRkZMR3RDUVVGclFqdFJRVU12UWl4SlFVRkpMRk5CUVZNN1dVRkRXQ3hQUVVGUExFTkJRVU1zUzBGQlN5eERRVUZETERaRlFVRTJSU3hEUVVGRExFTkJRVU03VVVGRkwwWXNUVUZCVFN4SFFVRkhMRTFCUVUwc1NVRkJTU3h0UWtGQmJVSXNSVUZCUlR0aFFVTnlReXhsUVVGbExFTkJRVU1zU1VGQlNTeEZRVUZGTEZkQlFWY3NSVUZCUlN4VFFVRlRMRWRCUVVjc1IwRkJSeXhGUVVGRkxHTkJRV01zUlVGQlJTeFBRVUZQTEVWQlFVVXNhVUpCUVdsQ0xFTkJRVU1zUTBGQlF6dExRVU53Unp0SlFVTkVMRTlCUVU4c1EwRkJReXhQUVVGUExFTkJRVU1zWlVGQlpTeERRVUZETEVOQlFVTTdTVUZGYWtNc1owaEJRV2RJTzBsQlEyaElMRTFCUVUwc1QwRkJUeXhIUVVGSExFbEJRVWtzWjBKQlFXZENMRU5CUVVNc1JVRkJReXhoUVVGaExFVkJRVVVzWVVGQllTeEpRVUZKTEVOQlFVTXNSVUZCUXl4RFFVRkRMRU5CUVVNN1NVRkRNVVVzVDBGQlR5eERRVUZETEVsQlFVa3NRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVOd1FpeEpRVUZKTEVkQlFVY3NSMEZCVVN4SlFVRkpMRU5CUVVNN1NVRkRjRUlzU1VGQlNTeFRRVUZUTEVWQlFVVTdVVUZEWWl4SlFVRkpPMWxCUTBZc1IwRkJSeXhIUVVGSExFMUJRVTBzVDBGQlR5eERRVUZETEdWQlFXVXNRMEZCUXl4TlFVRk5MRVZCUVVVc1NVRkJTU3hEUVVGRExFTkJRVU1zUTBGQlF5eERRVUZETEUxQlFVMHNRMEZCUXl4RFFVRkRPMU5CUXpkRU8xRkJRVU1zVDBGQlR5eERRVUZETEVWQlFVVTdXVUZEVml4UFFVRlBMRU5CUVVNc1MwRkJTeXhEUVVGRExIVkVRVUYxUkN4RFFVRkRMRU5CUVVNN1dVRkRka1VzVDBGQlR5eERRVUZETEV0QlFVc3NRMEZCUXl4RFFVRkRMRU5CUVVNc1EwRkJRenRUUVVOc1FqdExRVU5HTzBsQlEwUXNTVUZCU1N4RFFVRkRMRWRCUVVjN1VVRkRUaXhIUVVGSExFZEJRVWNzVFVGQlRTeFBRVUZQTEVOQlFVTXNVMEZCVXl4RFFVRkRMRTFCUVUwc1JVRkJSU3hKUVVGSkxFTkJRVU1zUTBGQlF5eERRVUZETEVOQlFVTXNUVUZCVFN4RFFVRkRMRU5CUVVNN1NVRkRlRVFzVDBGQlR5eERRVUZETEU5QlFVOHNRMEZCUXl4TFFVRkxMRU5CUVVNc1EwRkJRenRKUVVWMlFpeFhRVUZYTEVOQlFVTXNSVUZCUXl4SFFVRkhMRVZCUVVNc1EwRkJReXhEUVVGRE8wRkJRM0pDTEVOQlFVTXNRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN2JYVnNkR2xEYjJ4WFpXSkhVRlZUY0dGeWMyVk5ZWFJ5YVhoOUlHWnliMjBnSjBCa1lYUmhaM0p2YXkxc2FXSnlZWEpwWlhNdmJXRjBhQzl6Y21NdmQyVmlSMUJWTDNOd1lYSnpaUzF0WVhSeWFYZ3ZkMlZpUjFCVkxYTndZWEp6WlMxdFlYUnlhWGduTzF4dWFXMXdiM0owSUh0VGNHRnljMlZOWVhSeWFYaFNaWE4xYkhRc0lGTndZWEp6WlUxaGRISnBlRk5sY25acFkyVjlJR1p5YjIwZ0p5NHVMMlJwYzNSaGJtTmxMVzFoZEhKcGVDOXpjR0Z5YzJVdGJXRjBjbWw0TFhObGNuWnBZMlVuTzF4dWFXMXdiM0owSUh0RWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrZlNCbWNtOXRJQ2N1TGk5a2FYTjBZVzVqWlMxdFlYUnlhWGd2ZEhsd1pYTW5PMXh1YVcxd2IzSjBJSHRMYm05M2JrMWxkSEpwWTNOOUlHWnliMjBnSnk0dUwzUjVjR1ZrTFcxbGRISnBZM01uTzF4dWFXMXdiM0owSUh0TlEweFRjR0Z5YzJWU1pXUjFZMlZ5ZlNCbWNtOXRJQ2N1TDIxaGNtTnZkaTFqYkhWemRHVnlKenRjYmx4dWIyNXRaWE56WVdkbElEMGdZWE41Ym1NZ0tHVjJaVzUwS1NBOVBpQjdYRzRnSUdOdmJuTjBJSHRrWVhSaExDQjBhSEpsYzJodmJHUXNJSGRsYVdkb2RITXNJR0ZuWjNKbFoyRjBhVzl1VFdWMGFHOWtMQ0JrYVhOMFlXNWpaVVp1UVhKbmN5d2daR2x6ZEdGdVkyVkdibk1zSUcxaGVFbDBaWEpoZEdsdmJuTXNJSFZ6WlZkbFlrZFFWWDA2WEc0Z0lDQjdaR0YwWVRvZ1lXNTVXMTFiWFN3Z2RHaHlaWE5vYjJ4a09pQnVkVzFpWlhJc1hHNGdJQ0FnZDJWcFoyaDBjem9nYm5WdFltVnlXMTBzSUdGblozSmxaMkYwYVc5dVRXVjBhRzlrT2lCRWFYTjBZVzVqWlVGblozSmxaMkYwYVc5dVRXVjBhRzlrTEZ4dUlDQWdJR1JwYzNSaGJtTmxSbTV6T2lCTGJtOTNiazFsZEhKcFkzTmJYU3dnWkdsemRHRnVZMlZHYmtGeVozTTZJR0Z1ZVZ0ZExDQnRZWGhKZEdWeVlYUnBiMjV6T2lCdWRXMWlaWElzSUhWelpWZGxZa2RRVlQ4NklHSnZiMnhsWVc1OUlEMGdaWFpsYm5RdVpHRjBZVHRjYmx4dUlDQmpiMjV6YjJ4bExuUnBiV1VvSjNOd1lYSnpaU0J0WVhSeWFYZ25LVHRjYmlBZ2JHVjBJSE53WVhKelpUb2dVM0JoY25ObFRXRjBjbWw0VW1WemRXeDBJSHdnYm5Wc2JDQTlJRzUxYkd3N1hHNGdJR2xtSUNoMWMyVlhaV0pIVUZVcElIdGNiaUFnSUNCMGNua2dlMXh1SUNBZ0lDQWdjM0JoY25ObElEMGdZWGRoYVhRZ2JYVnNkR2xEYjJ4WFpXSkhVRlZUY0dGeWMyVk5ZWFJ5YVhnb1hHNGdJQ0FnSUNBZ0lHUmhkR0VzSUhSb2NtVnphRzlzWkNBdklERXdNQ3dnWkdsemRHRnVZMlZHYm5NZ1lYTWdZVzU1TENCaFoyZHlaV2RoZEdsdmJrMWxkR2h2WkNCaGN5QmhibmtzSUhkbGFXZG9kSE1zSUdScGMzUmhibU5sUm01QmNtZHpLVHRjYmlBZ0lDQjlJR05oZEdOb0lDaGxLU0I3WEc0Z0lDQWdJQ0JqYjI1emIyeGxMbVZ5Y205eUtHVXBPMXh1SUNBZ0lIMWNiaUFnZlZ4dUlDQnBaaUFvSVhOd1lYSnpaU2tnZXlBdkx5Qm1ZV3h6WW1GamF5QjBieUJEVUZWY2JpQWdJQ0JwWmlBb2RYTmxWMlZpUjFCVktWeHVJQ0FnSUNBZ1kyOXVjMjlzWlM1bGNuSnZjaWduVjBWQ1IxQlZJSE53WVhKelpTQnRZWFJ5YVhnZ1kyRnNZM1ZzWVhScGIyNGdabUZwYkdWa0xDQm1ZV3hzYVc1bklHSmhZMnNnZEc4Z1ExQlZJR2x0Y0d4bGJXVnVkR0YwYVc5dUp5azdYRzVjYmlBZ0lDQnpjR0Z5YzJVZ1BTQmhkMkZwZENCdVpYY2dVM0JoY25ObFRXRjBjbWw0VTJWeWRtbGpaU2dwWEc0Z0lDQWdJQ0F1WTJGc1kwMTFiSFJwUTI5c2RXMXVLR1JoZEdFc0lHUnBjM1JoYm1ObFJtNXpMQ0IwYUhKbGMyaHZiR1FnTHlBeE1EQXNJR1JwYzNSaGJtTmxSbTVCY21kekxDQjNaV2xuYUhSekxDQmhaMmR5WldkaGRHbHZiazFsZEdodlpDazdYRzRnSUgxY2JpQWdZMjl1YzI5c1pTNTBhVzFsUlc1a0tDZHpjR0Z5YzJVZ2JXRjBjbWw0SnlrN1hHNWNiaUFnTHk5amIyNXpkQ0J5WlhNZ1BTQmhkMkZwZENCdVpYY2dUVU5NVTNCaGNuTmxVbVZrZFdObGNpaDdiV0Y0U1hSbGNtRjBhVzl1Y3pvZ2JXRjRTWFJsY21GMGFXOXVjeUEvUHlBMWZTa3VkSEpoYm5ObWIzSnRLSE53WVhKelpTd2daR0YwWVZzd1hTNXNaVzVuZEdncE8xeHVJQ0JqYjI1emRDQnlaV1IxWTJWeUlEMGdibVYzSUUxRFRGTndZWEp6WlZKbFpIVmpaWElvZTIxaGVFbDBaWEpoZEdsdmJuTTZJRzFoZUVsMFpYSmhkR2x2Ym5NZ1B6OGdOWDBwTzF4dUlDQmpiMjV6YjJ4bExuUnBiV1VvSjAxRFRDY3BPMXh1SUNCc1pYUWdjbVZ6T2lCaGJua2dQU0J1ZFd4c08xeHVJQ0JwWmlBb2RYTmxWMlZpUjFCVktTQjdYRzRnSUNBZ2RISjVJSHRjYmlBZ0lDQWdJSEpsY3lBOUlHRjNZV2wwSUhKbFpIVmpaWEl1ZEhKaGJuTm1iM0p0VjJWaVIxQlZLSE53WVhKelpTd2daR0YwWVZzd1hTNXNaVzVuZEdncE8xeHVJQ0FnSUgwZ1kyRjBZMmdnS0dVcElIdGNiaUFnSUNBZ0lHTnZibk52YkdVdVpYSnliM0lvSjNkbFlrZFFWU0JOUTB3Z1ptRnBiR1ZrTENCbVlXeHNhVzVuSUdKaFkyc2dkRzhnUTFCVklHbHRjR3hsYldWdWRHRjBhVzl1SnlrN1hHNGdJQ0FnSUNCamIyNXpiMnhsTG1WeWNtOXlLR1VwTzF4dUlDQWdJSDFjYmlBZ2ZWeHVJQ0JwWmlBb0lYSmxjeWxjYmlBZ0lDQnlaWE1nUFNCaGQyRnBkQ0J5WldSMVkyVnlMblJ5WVc1elptOXliU2h6Y0dGeWMyVXNJR1JoZEdGYk1GMHViR1Z1WjNSb0tUdGNiaUFnWTI5dWMyOXNaUzUwYVcxbFJXNWtLQ2ROUTB3bktUdGNibHh1SUNCd2IzTjBUV1Z6YzJGblpTaDdjbVZ6ZlNrN1hHNTlPMXh1SWwxOSIsImltcG9ydCB7IERpc3RhbmNlQWdncmVnYXRpb25NZXRob2RzIH0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgY29uc3QgaXNOaWwgPSAoeCkgPT4geCA9PT0gbnVsbCB8fCB4ID09PSB1bmRlZmluZWQ7XG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0U21hbGxlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPiBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPCB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGluc2VydExhcmdlcihkaXN0YW5jZXNBciwgaW5kZXhlcywgbnVtLCBpbmRleCkge1xuICAgIGlmIChudW0gPCBkaXN0YW5jZXNBcltkaXN0YW5jZXNBci5sZW5ndGggLSAxXSlcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gZGlzdGFuY2VzQXIuZmluZEluZGV4KCh2KSA9PiBudW0gPiB2KTtcbiAgICBkaXN0YW5jZXNBci5wb3AoKTtcbiAgICBkaXN0YW5jZXNBci5zcGxpY2UobmV3UG9zaXRpb24sIDAsIG51bSk7XG4gICAgaW5kZXhlcy5wb3AoKTtcbiAgICBpbmRleGVzLnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaW5kZXgpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0aW9uRnVuY3Rpb24oYWdncmVnYXRpb25NZXRob2QsIHdlaWdodHMpIHtcbiAgICBzd2l0Y2ggKGFnZ3JlZ2F0aW9uTWV0aG9kKSB7XG4gICAgICAgIGNhc2UgRGlzdGFuY2VBZ2dyZWdhdGlvbk1ldGhvZHMuTUFOSEFUVEFOOlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4gdnMucmVkdWNlKChhY2MsIHZhbCwgaWR4KSA9PiBhY2MgKyB2YWwgKiB3ZWlnaHRzW2lkeF0sIDApO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuICh2cykgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGV1Y2xpZGVhblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bSA9IHZzLnJlZHVjZSgoYWNjLCB2YWwsIGlkeCkgPT4gYWNjICsgKHZhbCAqIHdlaWdodHNbaWR4XSkgKiogMiwgMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydChzdW0pO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LGV5SjJaWEp6YVc5dUlqb3pMQ0ptYVd4bElqb2lkWFJwYkhNdWFuTWlMQ0p6YjNWeVkyVlNiMjkwSWpvaUlpd2ljMjkxY21ObGN5STZXeUoxZEdsc2N5NTBjeUpkTENKdVlXMWxjeUk2VzEwc0ltMWhjSEJwYm1keklqb2lRVUZCUVN4UFFVRlBMRVZCUVRSQ0xEQkNRVUV3UWl4RlFVRkRMRTFCUVUwc1UwRkJVeXhEUVVGRE8wRkJSVGxGTEUxQlFVMHNRMEZCUXl4TlFVRk5MRXRCUVVzc1IwRkJSeXhEUVVGRExFTkJRVTBzUlVGQlJTeEZRVUZGTEVOQlFVTXNRMEZCUXl4TFFVRkxMRWxCUVVrc1NVRkJTU3hEUVVGRExFdEJRVXNzVTBGQlV5eERRVUZETzBGQlJTOUVMRTFCUVUwc1ZVRkJWU3hoUVVGaExFTkJRVU1zVjBGQmNVSXNSVUZCUlN4UFFVRnBRaXhGUVVGRkxFZEJRVmNzUlVGQlJTeExRVUZoTzBsQlEyaEhMRWxCUVVrc1IwRkJSeXhIUVVGSExGZEJRVmNzUTBGQlF5eFhRVUZYTEVOQlFVTXNUVUZCVFN4SFFVRkRMRU5CUVVNc1EwRkJRenRSUVVONlF5eFBRVUZQTzBsQlJWUXNUVUZCVFN4WFFVRlhMRWRCUVVjc1YwRkJWeXhEUVVGRExGTkJRVk1zUTBGQlF5eERRVUZETEVOQlFVTXNSVUZCUlN4RlFVRkZMRU5CUVVNc1IwRkJSeXhIUVVGSExFTkJRVU1zUTBGQlF5eERRVUZETzBsQlF6RkVMRmRCUVZjc1EwRkJReXhIUVVGSExFVkJRVVVzUTBGQlF6dEpRVU5zUWl4WFFVRlhMRU5CUVVNc1RVRkJUU3hEUVVGRExGZEJRVmNzUlVGQlJTeERRVUZETEVWQlFVVXNSMEZCUnl4RFFVRkRMRU5CUVVNN1NVRkRlRU1zVDBGQlR5eERRVUZETEVkQlFVY3NSVUZCUlN4RFFVRkRPMGxCUTJRc1QwRkJUeXhEUVVGRExFMUJRVTBzUTBGQlF5eFhRVUZYTEVWQlFVVXNRMEZCUXl4RlFVRkZMRXRCUVVzc1EwRkJReXhEUVVGRE8wRkJRM2hETEVOQlFVTTdRVUZGUkN4TlFVRk5MRlZCUVZVc1dVRkJXU3hEUVVGRExGZEJRWEZDTEVWQlFVVXNUMEZCYVVJc1JVRkJSU3hIUVVGWExFVkJRVVVzUzBGQllUdEpRVU12Uml4SlFVRkpMRWRCUVVjc1IwRkJSeXhYUVVGWExFTkJRVU1zVjBGQlZ5eERRVUZETEUxQlFVMHNSMEZCUXl4RFFVRkRMRU5CUVVNN1VVRkRla01zVDBGQlR6dEpRVVZVTEUxQlFVMHNWMEZCVnl4SFFVRkhMRmRCUVZjc1EwRkJReXhUUVVGVExFTkJRVU1zUTBGQlF5eERRVUZETEVWQlFVVXNSVUZCUlN4RFFVRkRMRWRCUVVjc1IwRkJSeXhEUVVGRExFTkJRVU1zUTBGQlF6dEpRVU14UkN4WFFVRlhMRU5CUVVNc1IwRkJSeXhGUVVGRkxFTkJRVU03U1VGRGJFSXNWMEZCVnl4RFFVRkRMRTFCUVUwc1EwRkJReXhYUVVGWExFVkJRVVVzUTBGQlF5eEZRVUZGTEVkQlFVY3NRMEZCUXl4RFFVRkRPMGxCUTNoRExFOUJRVThzUTBGQlF5eEhRVUZITEVWQlFVVXNRMEZCUXp0SlFVTmtMRTlCUVU4c1EwRkJReXhOUVVGTkxFTkJRVU1zVjBGQlZ5eEZRVUZGTEVOQlFVTXNSVUZCUlN4TFFVRkxMRU5CUVVNc1EwRkJRenRCUVVONFF5eERRVUZETzBGQlJVUXNUVUZCVFN4VlFVRlZMSE5DUVVGelFpeERRVU53UXl4cFFrRkJORU1zUlVGQlJTeFBRVUZwUWp0SlFVVXZSQ3hSUVVGUkxHbENRVUZwUWl4RlFVRkZPMUZCUTNwQ0xFdEJRVXNzTUVKQlFUQkNMRU5CUVVNc1UwRkJVenRaUVVOMlF5eFBRVUZQTEVOQlFVTXNSVUZCV1N4RlFVRkZMRVZCUVVVc1EwRkJReXhGUVVGRkxFTkJRVU1zVFVGQlRTeERRVUZETEVOQlFVTXNSMEZCUnl4RlFVRkZMRWRCUVVjc1JVRkJSU3hIUVVGSExFVkJRVVVzUlVGQlJTeERRVUZETEVkQlFVY3NSMEZCUnl4SFFVRkhMRWRCUVVjc1QwRkJUeXhEUVVGRExFZEJRVWNzUTBGQlF5eEZRVUZGTEVOQlFVTXNRMEZCUXl4RFFVRkRPMUZCUTNKR08xbEJRMFVzVDBGQlR5eERRVUZETEVWQlFWa3NSVUZCUlN4RlFVRkZPMmRDUVVOMFFpeFpRVUZaTzJkQ1FVTmFMRTFCUVUwc1IwRkJSeXhIUVVGSExFVkJRVVVzUTBGQlF5eE5RVUZOTEVOQlFVTXNRMEZCUXl4SFFVRkhMRVZCUVVVc1IwRkJSeXhGUVVGRkxFZEJRVWNzUlVGQlJTeEZRVUZGTEVOQlFVTXNSMEZCUnl4SFFVRkhMRU5CUVVNc1IwRkJSeXhIUVVGSExFOUJRVThzUTBGQlF5eEhRVUZITEVOQlFVTXNRMEZCUXl4SlFVRkpMRU5CUVVNc1JVRkJSU3hEUVVGRExFTkJRVU1zUTBGQlF6dG5Ra0ZETjBVc1QwRkJUeXhKUVVGSkxFTkJRVU1zU1VGQlNTeERRVUZETEVkQlFVY3NRMEZCUXl4RFFVRkRPMWxCUTNoQ0xFTkJRVU1zUTBGQlF6dExRVU5NTzBGQlEwZ3NRMEZCUXlJc0luTnZkWEpqWlhORGIyNTBaVzUwSWpwYkltbHRjRzl5ZENCN1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkN3Z1JHbHpkR0Z1WTJWQloyZHlaV2RoZEdsdmJrMWxkR2h2WkhOOUlHWnliMjBnSnk0dmRIbHdaWE1uTzF4dVhHNWxlSEJ2Y25RZ1kyOXVjM1FnYVhOT2FXd2dQU0FvZURvZ1lXNTVLU0E5UGlCNElEMDlQU0J1ZFd4c0lIeDhJSGdnUFQwOUlIVnVaR1ZtYVc1bFpEdGNibHh1Wlhod2IzSjBJR1oxYm1OMGFXOXVJR2x1YzJWeWRGTnRZV3hzWlhJb1pHbHpkR0Z1WTJWelFYSTZJRzUxYldKbGNsdGRMQ0JwYm1SbGVHVnpPaUJ1ZFcxaVpYSmJYU3dnYm5WdE9pQnVkVzFpWlhJc0lHbHVaR1Y0T2lCdWRXMWlaWElwSUh0Y2JpQWdhV1lnS0c1MWJTQStJR1JwYzNSaGJtTmxjMEZ5VzJScGMzUmhibU5sYzBGeUxteGxibWQwYUMweFhTbGNiaUFnSUNCeVpYUjFjbTQ3WEc1Y2JpQWdZMjl1YzNRZ2JtVjNVRzl6YVhScGIyNGdQU0JrYVhOMFlXNWpaWE5CY2k1bWFXNWtTVzVrWlhnb0tIWXBJRDArSUc1MWJTQThJSFlwTzF4dUlDQmthWE4wWVc1alpYTkJjaTV3YjNBb0tUdGNiaUFnWkdsemRHRnVZMlZ6UVhJdWMzQnNhV05sS0c1bGQxQnZjMmwwYVc5dUxDQXdMQ0J1ZFcwcE8xeHVJQ0JwYm1SbGVHVnpMbkJ2Y0NncE8xeHVJQ0JwYm1SbGVHVnpMbk53YkdsalpTaHVaWGRRYjNOcGRHbHZiaXdnTUN3Z2FXNWtaWGdwTzF4dWZWeHVYRzVsZUhCdmNuUWdablZ1WTNScGIyNGdhVzV6WlhKMFRHRnlaMlZ5S0dScGMzUmhibU5sYzBGeU9pQnVkVzFpWlhKYlhTd2dhVzVrWlhobGN6b2diblZ0WW1WeVcxMHNJRzUxYlRvZ2JuVnRZbVZ5TENCcGJtUmxlRG9nYm5WdFltVnlLU0I3WEc0Z0lHbG1JQ2h1ZFcwZ1BDQmthWE4wWVc1alpYTkJjbHRrYVhOMFlXNWpaWE5CY2k1c1pXNW5kR2d0TVYwcFhHNGdJQ0FnY21WMGRYSnVPMXh1WEc0Z0lHTnZibk4wSUc1bGQxQnZjMmwwYVc5dUlEMGdaR2x6ZEdGdVkyVnpRWEl1Wm1sdVpFbHVaR1Y0S0NoMktTQTlQaUJ1ZFcwZ1BpQjJLVHRjYmlBZ1pHbHpkR0Z1WTJWelFYSXVjRzl3S0NrN1hHNGdJR1JwYzNSaGJtTmxjMEZ5TG5Od2JHbGpaU2h1WlhkUWIzTnBkR2x2Yml3Z01Dd2diblZ0S1R0Y2JpQWdhVzVrWlhobGN5NXdiM0FvS1R0Y2JpQWdhVzVrWlhobGN5NXpjR3hwWTJVb2JtVjNVRzl6YVhScGIyNHNJREFzSUdsdVpHVjRLVHRjYm4xY2JseHVaWGh3YjNKMElHWjFibU4wYVc5dUlHZGxkRUZuWjNKbFoyRjBhVzl1Um5WdVkzUnBiMjRvWEc0Z0lHRm5aM0psWjJGMGFXOXVUV1YwYUc5a09pQkVhWE4wWVc1alpVRm5aM0psWjJGMGFXOXVUV1YwYUc5a0xDQjNaV2xuYUhSek9pQnVkVzFpWlhKYlhWeHVLVG9nS0haaGJIVmxjem9nYm5WdFltVnlXMTBwSUQwK0lHNTFiV0psY2lCN1hHNGdJSE4zYVhSamFDQW9ZV2RuY21WbllYUnBiMjVOWlhSb2IyUXBJSHRjYmlBZ0lDQmpZWE5sSUVScGMzUmhibU5sUVdkbmNtVm5ZWFJwYjI1TlpYUm9iMlJ6TGsxQlRraEJWRlJCVGpwY2JpQWdJQ0FnSUhKbGRIVnliaUFvZG5NNklHNTFiV0psY2x0ZEtTQTlQaUIyY3k1eVpXUjFZMlVvS0dGall5d2dkbUZzTENCcFpIZ3BJRDArSUdGall5QXJJSFpoYkNBcUlIZGxhV2RvZEhOYmFXUjRYU3dnTUNrN1hHNGdJQ0FnWkdWbVlYVnNkRHBjYmlBZ0lDQWdJSEpsZEhWeWJpQW9kbk02SUc1MWJXSmxjbHRkS1NBOVBpQjdYRzRnSUNBZ0lDQWdJQzh2SUdWMVkyeHBaR1ZoYmx4dUlDQWdJQ0FnSUNCamIyNXpkQ0J6ZFcwZ1BTQjJjeTV5WldSMVkyVW9LR0ZqWXl3Z2RtRnNMQ0JwWkhncElEMCtJR0ZqWXlBcklDaDJZV3dnS2lCM1pXbG5hSFJ6VzJsa2VGMHBJQ29xSURJc0lEQXBPMXh1SUNBZ0lDQWdJQ0J5WlhSMWNtNGdUV0YwYUM1emNYSjBLSE4xYlNrN1hHNGdJQ0FnSUNCOU8xeHVJQ0I5WEc1OVhHNGlYWDA9IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbi8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBfX3dlYnBhY2tfbW9kdWxlc19fO1xuXG4vLyB0aGUgc3RhcnR1cCBmdW5jdGlvblxuX193ZWJwYWNrX3JlcXVpcmVfXy54ID0gKCkgPT4ge1xuXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcblx0Ly8gVGhpcyBlbnRyeSBtb2R1bGUgZGVwZW5kcyBvbiBvdGhlciBsb2FkZWQgY2h1bmtzIGFuZCBleGVjdXRpb24gbmVlZCB0byBiZSBkZWxheWVkXG5cdHZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy5PKHVuZGVmaW5lZCwgWzU5MF0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKDkyOTUpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBzaWJsaW5nIGNodW5rcyBmb3IgdGhlIGVudHJ5cG9pbnRcbl9fd2VicGFja19yZXF1aXJlX18udSA9IChjaHVua0lkKSA9PiB7XG5cdC8vIHJldHVybiB1cmwgZm9yIGZpbGVuYW1lcyBiYXNlZCBvbiB0ZW1wbGF0ZVxuXHRyZXR1cm4gXCJcIiArIGNodW5rSWQgKyBcIi5qc1wiO1xufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmcgPSAoZnVuY3Rpb24oKSB7XG5cdGlmICh0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcpIHJldHVybiBnbG9iYWxUaGlzO1xuXHR0cnkge1xuXHRcdHJldHVybiB0aGlzIHx8IG5ldyBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0aWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSByZXR1cm4gd2luZG93O1xuXHR9XG59KSgpOyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCJ2YXIgc2NyaXB0VXJsO1xuaWYgKF9fd2VicGFja19yZXF1aXJlX18uZy5pbXBvcnRTY3JpcHRzKSBzY3JpcHRVcmwgPSBfX3dlYnBhY2tfcmVxdWlyZV9fLmcubG9jYXRpb24gKyBcIlwiO1xudmFyIGRvY3VtZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXy5nLmRvY3VtZW50O1xuaWYgKCFzY3JpcHRVcmwgJiYgZG9jdW1lbnQpIHtcblx0aWYgKGRvY3VtZW50LmN1cnJlbnRTY3JpcHQpXG5cdFx0c2NyaXB0VXJsID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdC5zcmM7XG5cdGlmICghc2NyaXB0VXJsKSB7XG5cdFx0dmFyIHNjcmlwdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInNjcmlwdFwiKTtcblx0XHRpZihzY3JpcHRzLmxlbmd0aCkge1xuXHRcdFx0dmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7XG5cdFx0XHR3aGlsZSAoaSA+IC0xICYmICFzY3JpcHRVcmwpIHNjcmlwdFVybCA9IHNjcmlwdHNbaS0tXS5zcmM7XG5cdFx0fVxuXHR9XG59XG4vLyBXaGVuIHN1cHBvcnRpbmcgYnJvd3NlcnMgd2hlcmUgYW4gYXV0b21hdGljIHB1YmxpY1BhdGggaXMgbm90IHN1cHBvcnRlZCB5b3UgbXVzdCBzcGVjaWZ5IGFuIG91dHB1dC5wdWJsaWNQYXRoIG1hbnVhbGx5IHZpYSBjb25maWd1cmF0aW9uXG4vLyBvciBwYXNzIGFuIGVtcHR5IHN0cmluZyAoXCJcIikgYW5kIHNldCB0aGUgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gdmFyaWFibGUgZnJvbSB5b3VyIGNvZGUgdG8gdXNlIHlvdXIgb3duIGxvZ2ljLlxuaWYgKCFzY3JpcHRVcmwpIHRocm93IG5ldyBFcnJvcihcIkF1dG9tYXRpYyBwdWJsaWNQYXRoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyXCIpO1xuc2NyaXB0VXJsID0gc2NyaXB0VXJsLnJlcGxhY2UoLyMuKiQvLCBcIlwiKS5yZXBsYWNlKC9cXD8uKiQvLCBcIlwiKS5yZXBsYWNlKC9cXC9bXlxcL10rJC8sIFwiL1wiKTtcbl9fd2VicGFja19yZXF1aXJlX18ucCA9IHNjcmlwdFVybDsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmIgPSBzZWxmLmxvY2F0aW9uICsgXCJcIjtcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0MjMxOiAxXG59O1xuXG4vLyBpbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmdcbnZhciBpbnN0YWxsQ2h1bmsgPSAoZGF0YSkgPT4ge1xuXHR2YXIgW2NodW5rSWRzLCBtb3JlTW9kdWxlcywgcnVudGltZV0gPSBkYXRhO1xuXHRmb3IodmFyIG1vZHVsZUlkIGluIG1vcmVNb2R1bGVzKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKG1vcmVNb2R1bGVzLCBtb2R1bGVJZCkpIHtcblx0XHRcdF9fd2VicGFja19yZXF1aXJlX18ubVttb2R1bGVJZF0gPSBtb3JlTW9kdWxlc1ttb2R1bGVJZF07XG5cdFx0fVxuXHR9XG5cdGlmKHJ1bnRpbWUpIHJ1bnRpbWUoX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cdHdoaWxlKGNodW5rSWRzLmxlbmd0aClcblx0XHRpbnN0YWxsZWRDaHVua3NbY2h1bmtJZHMucG9wKCldID0gMTtcblx0cGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24oZGF0YSk7XG59O1xuX193ZWJwYWNrX3JlcXVpcmVfXy5mLmkgPSAoY2h1bmtJZCwgcHJvbWlzZXMpID0+IHtcblx0Ly8gXCIxXCIgaXMgdGhlIHNpZ25hbCBmb3IgXCJhbHJlYWR5IGxvYWRlZFwiXG5cdGlmKCFpbnN0YWxsZWRDaHVua3NbY2h1bmtJZF0pIHtcblx0XHRpZih0cnVlKSB7IC8vIGFsbCBjaHVua3MgaGF2ZSBKU1xuXHRcdFx0aW1wb3J0U2NyaXB0cyhfX3dlYnBhY2tfcmVxdWlyZV9fLnAgKyBfX3dlYnBhY2tfcmVxdWlyZV9fLnUoY2h1bmtJZCkpO1xuXHRcdH1cblx0fVxufTtcblxudmFyIGNodW5rTG9hZGluZ0dsb2JhbCA9IHNlbGZbXCJ3ZWJwYWNrQ2h1bmtlZGFcIl0gPSBzZWxmW1wid2VicGFja0NodW5rZWRhXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCIvLyBydW4gc3RhcnR1cFxudmFyIF9fd2VicGFja19leHBvcnRzX18gPSBfX3dlYnBhY2tfcmVxdWlyZV9fLngoKTtcbiJdLCJuYW1lcyI6WyJkZWZlcnJlZCIsIm5leHQiLCJXRUJHU0xBR0dSRUdBVElPTiIsIldFQkdTTEFHR1JFR0FUSU9ORlVOQ1RJT05TIiwiRVVDTElERUFOIiwiYXJyYXlTaXplIiwiTUFOSEFUVEFOIiwiV0VCR1BVRElTVEFOQ0UiLCJ3ZWJHUFVGdW5jdGlvbnMiLCJIQU1NSU5HIiwiX21heEFycmF5U2l6ZSIsImVudHJ5SW5kZXgiLCJtYXhBcnJheVNpemUiLCJfZW50cnlJbmRleCIsIlRBTklNT1RPIiwiTEVWRU5TVEVJTiIsIk5FRURMRU1BTl9XVU5TQ0giLCJNT05PTUVSX0NIRU1JQ0FMX0RJU1RBTkNFIiwiU09LQUwiLCJDT1NJTkUiLCJBU1lNTUVUUklDIiwiRGlmZmVyZW5jZSIsIk9uZUhvdCIsImRpc3RhbmNlRnVuY3Rpb25Db21wbGV4aXR5IiwibWF4RW50cnlTaXplIiwiTWF0aCIsImNlaWwiLCJfbWF4RW50cnlTaXplIiwiVHlwZVN1cHBvcnRlZERpc3RhbmNlcyIsIlNldCIsIl9fYXdhaXRlciIsInRoaXNBcmciLCJfYXJndW1lbnRzIiwiUCIsImdlbmVyYXRvciIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZnVsZmlsbGVkIiwidmFsdWUiLCJzdGVwIiwiZSIsInJlamVjdGVkIiwicmVzdWx0IiwiZG9uZSIsInRoZW4iLCJhcHBseSIsImdwdUFkYXB0ZXIiLCJncHVEZXZpY2UiLCJnZXRHUFVEZXZpY2UiLCJ0aGlzIiwibmF2aWdhdG9yIiwiZ3B1IiwicmVxdWVzdEFkYXB0ZXIiLCJwb3dlclByZWZlcmVuY2UiLCJpc0xvc3QiLCJsb3N0IiwiciIsInNldFRpbWVvdXQiLCJyZXF1aXJlZEJ1ZmZlclNpemUiLCJhZGFwdGVyTGltaXRzIiwibGltaXRzIiwiYnVmZmZlclNpemVMaW1pdCIsIm1heEJ1ZmZlclNpemUiLCJzdG9yYWdlQnVmZmVyU2l6ZUxpbWl0IiwibWF4U3RvcmFnZUJ1ZmZlckJpbmRpbmdTaXplIiwicmVxdWVzdERldmljZSIsInJlcXVpcmVkTGltaXRzIiwibWluIiwiY29uc29sZSIsImVycm9yIiwibXVsdGlDb2xXZWJHUFVTcGFyc2VNYXRyaXgiLCJlbnRyeUxpc3QiLCJ0aHJlc2hvbGQiLCJkaXN0YW5jZU1ldHJpY3MiLCJhZ2dyZWdhdGlvbkZ1bmN0aW9uIiwid2VpZ2h0cyIsIm9wdGlvbnMiLCJkZXZpY2UiLCJhdmFpbGFibGVEaXN0YW5jZU1ldHJpY3MiLCJPYmplY3QiLCJ2YWx1ZXMiLCJzb21lIiwibWV0cmljIiwiaW5jbHVkZXMiLCJFcnJvciIsImpvaW4iLCJtYXhEaXN0YW5jZSIsImxlbmd0aCIsImxpc3QiLCJudW1PZkNvbHVtbnMiLCJsaXN0U2l6ZSIsInByb2Nlc3NJbmZvIiwibWFwIiwiZW50cnkiLCJpIiwiZGlzdGFuY2VNZXRyaWMiLCJnYXBPcGVuUGVuYWx0eSIsImdhcEV4dGVuc2lvblBlbmFsdHkiLCJfYSIsIl9iIiwiZW50cnlUeXBlIiwiZW5jb2RlZExpc3QiLCJVaW50MzJBcnJheSIsInNwbGl0IiwiYyIsImNoYXJDb2RlQXQiLCJGbG9hdDMyQXJyYXkiLCJfZGF0YSIsIkludDMyQXJyYXkiLCJlbmNvZGVkTGlzdFR5cGUiLCJhcnJheVNpemVzIiwiYXJyIiwiaGFzIiwibWF4RW50cnlMZW4iLCJyZWR1Y2UiLCJhIiwiYiIsIm1heCIsImNvbXBsZXhpdHkiLCJFbmNvZGVkQXJyYXlDb25zdHJ1Y3RvciIsImZsYXRTb3VyY2VBcnJheSIsImZvckVhY2giLCJzZXEiLCJzZXQiLCJzdXBwSW5mb1N0cnVjdFdnc2wiLCJzdXBwSW5mb1NpemUiLCJzdXBwSW5mb1R5cGUiLCJzdXBwSW5mb0J1ZmZlciIsIm1heE1vbm9tZXJJbmRleCIsInNjb3JpbmdNYXRyaXgiLCJhbHBoYWJldEluZGV4ZXMiLCJrZXlzIiwicHJldiIsIm4iLCJBcnJheSIsImZpbGwiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJzaW1pbGFyaXR5TWF0cml4U2l6ZSIsInRyYW5zZmVyZWRTaW1pbGFyaXR5TWF0cml4Iiwia2V5Iiwia2V5MiIsIm9mZnNldCIsInJhbmdlIiwiZGF0YVR5cGVXR1NMIiwiZGF0YVN0cnVjdFdnc2wiLCJzb3VyY2VBcnJheVNpemUiLCJ3ZWJHUFVQcm9jZXNzSW5mbyIsInN1cHBJbmZvV2dzbCIsImluZm8iLCJmaWx0ZXIiLCJ3Z3NsIiwibmVlZHNEdW1teSIsInRyaW0iLCJkYXRhV2dzbCIsIm51bU9mVGhyZWFkcyIsInNwYXJzZVJlc3VsdFNpemVQZXJUaHJlYWQiLCJjb21iaW5lZENvbXBsZXhpdHkiLCJtYXhJdGVyYXRpb25zUGVyVGhyZWFkIiwid29ya2dyb3Vwc0RpbSIsInNxcnQiLCJnbG9iYWxUaHJlYWREaW1TaXplIiwiY29uZGVuc2VkRGlzdGFuY2VNYXRyaXhTaXplIiwiZG1DaHVua1NpemVQZXJUaHJlYWQiLCJtb2R1bGUiLCJjcmVhdGVTaGFkZXJNb2R1bGUiLCJsYWJlbCIsImNvZGUiLCJnZXRDb21iaW5lZERpc3RhbmNlU2NyaXB0IiwicGlwZWxpbmUiLCJjcmVhdGVDb21wdXRlUGlwZWxpbmUiLCJsYXlvdXQiLCJjb21wdXRlIiwiZW50cnlQb2ludCIsInN0YXJ0QXRDb2xzIiwic3RhcnRBdFJvd3MiLCJlbmRBdENvbHMiLCJlbmRBdFJvd3MiLCJjaHVua1NpemUiLCJmbG9vciIsInN0YXJ0Um93Iiwic3RhcnRDb2wiLCJ0aW1lIiwiZW5kSWR4IiwiZW5kUm93IiwiZW5kQ29sIiwidGltZUVuZCIsImNvbXB1dGVJbmZvQnVmZmVyMzJTaXplIiwic3VwcEluZm9CdWZmZXIzMlNpemUiLCJzcGFyc2VNYXRyaXhFYWNoQXJyYXkzMlNpemUiLCJjb21wdXRlSW5mb0J1ZmZlclNpemUiLCJCWVRFU19QRVJfRUxFTUVOVCIsInBhZGRlZENvbXB1dGVJbmZvQnVmZmVyU2l6ZSIsInJlbWFpbmRlciIsImNvbXB1dGVJbmZvQnVmZmVyIiwiY3JlYXRlQnVmZmVyIiwic2l6ZSIsInVzYWdlIiwiR1BVQnVmZmVyVXNhZ2UiLCJTVE9SQUdFIiwiQ09QWV9TUkMiLCJDT1BZX0RTVCIsIm1hcHBlZEF0Q3JlYXRpb24iLCJtYXBwZWRDb21wdXRlSW5mb0FycmF5QnVmZmVyIiwiZ2V0TWFwcGVkUmFuZ2UiLCJjb21wdXRlSW5mb09mZlNldCIsIkFycmF5Q29uc3RydWN0b3IiLCJ1bm1hcCIsInN1cHBJbmZvQnVmZmVyU2l6ZSIsInBhZGRlZFN1cHBJbmZvQnVmZmVyU2l6ZSIsInN1cHBJbmZvUmVtYWluZGVyIiwibWFwcGVkU3VwcEluZm9BcnJheUJ1ZmZlciIsInN1cHBJbmZvT2ZmU2V0IiwiYnl0ZUxlbmd0aCIsInJlc3VsdHNCdWZmZXJTaXplIiwicGFkZGVkUmVzdWx0c0J1ZmZlclNpemUiLCJyZXN1bHRzUmVtYWluZGVyIiwicmVzdWx0c0J1ZmZlciIsImJpbmRHcm91cCIsImNyZWF0ZUJpbmRHcm91cCIsImdldEJpbmRHcm91cExheW91dCIsImVudHJpZXMiLCJiaW5kaW5nIiwicmVzb3VyY2UiLCJidWZmZXIiLCJyZXN1bHRzT3V0QnVmZmVyIiwiTUFQX1JFQUQiLCJyZXN1bHRJcyIsInJlc3VsdEpzIiwicmVzdWx0RGlzdGFuY2VzIiwiaXNBbGxEb25lIiwiZW5jb2RlciIsImNyZWF0ZUNvbW1hbmRFbmNvZGVyIiwicGFzcyIsImJlZ2luQ29tcHV0ZVBhc3MiLCJzZXRQaXBlbGluZSIsInNldEJpbmRHcm91cCIsImRpc3BhdGNoV29ya2dyb3VwcyIsImVuZCIsImNvcHlCdWZmZXJUb0J1ZmZlciIsImNvbW1hbmRCdWZmZXIiLCJmaW5pc2giLCJxdWV1ZSIsInN1Ym1pdCIsIm9uU3VibWl0dGVkV29ya0RvbmUiLCJtYXBBc3luYyIsIkdQVU1hcE1vZGUiLCJSRUFEIiwicmVzdWx0c091dEFycmF5QnVmZmVyIiwicmVzdWx0T2Zmc2V0IiwicmVzdWx0c0kiLCJyZXN1bHRzSiIsInJlc3VsdHNEaXN0YW5jZXMiLCJyZXN1bHRzRm91bmQiLCJldmVyeSIsImQiLCJ0b3RhbFJlc3VsdHMiLCJjb21iaW5lZEkiLCJjb21iaW5lZEoiLCJjb21iaW5lZERpc3RhbmNlcyIsImNvbWJpbmVkT2Zmc2V0IiwicmVzSSIsImZvdW5kIiwic3ViYXJyYXkiLCJwdXNoIiwidG90YWxTaXplIiwiZmluYWxJIiwiZmluYWxKIiwiZmluYWxEaXN0YW5jZXMiLCJmaW5hbE9mZnNldCIsImRlc3Ryb3kiLCJqIiwiZGlzdGFuY2UiLCJtYXhFbnRyeUxlbnMiLCJhZ2dyZWdhdGlvbiIsIl8iLCJhc3luYyIsImJpb0xheW91dCIsImNsdXN0ZXIiLCJzcGFyc2VPYmplY3QiLCJpcyIsImpzIiwiZW1iZWRYIiwicmFuZG9tIiwiZW1iZWRZIiwieFZlbG9jaXRpZXMiLCJ5VmVsb2NpdGllcyIsInRlbXBlcmF0dXJlIiwiaWR4IiwiZHgiLCJkeSIsImFicyIsInZlY1NpemUiLCJtaW5YIiwibWluWSIsIm1heFgiLCJtYXhZIiwicmFuZ2VYIiwicmFuZ2VZIiwiZ2V0TGF5b3V0RW1iZWRkaW5ncyIsInNwYXJzZUtOTk5vcmFsaXplQ29sd2lzZSIsImtublNpbWlsYXJpdGllcyIsIm9mZnNldHMiLCJuUm93cyIsIm5lZWRlZFRocmVhZHMiLCJuZWVkZWRXb3JrR3JvdXBzIiwid29ya0dyb3VwVGhyZWFkc1BlckRpbSIsIndvcmtHcm91cERpbSIsInRocmVhZHNQZXJEaW0iLCJzaW1taWxhcml0aWVzQnVmZmVyIiwib2Zmc2V0c0J1ZmZlciIsImNvbW1hbmRFbmNvZGVyIiwicGFzc0VuY29kZXIiLCJvdXRTaW1pbGFyaXR5QnVmZmVyIiwiYXJyYXlCdWZmZXIiLCJpbmZsYXRlIiwiZmFjdG9yIiwicG93IiwiZXhwYW5kTm9SZXZpdmUiLCJrbm5JbmRleGVzIiwib3JkZXIiLCJsb2cxMCIsInBydW5lVmFsdWUiLCJvdXRLTk5TaW1pbGFyaXRpZXMiLCJzcGFyc2VLTk5CdWZmZXJCeXRlU2l6ZSIsInNwYXJzZUtOTkJ1ZmZlciIsInNwYXJzZUtOTkFycmF5QnVmZmVyIiwicm93SW5kZXhlcyIsInJlcyIsImdldFJvd0luZGV4ZXMiLCJzdGFydEJ1ZmZlciIsInJlc3VsdEJsb2NrQnVmZmVyIiwib3V0QmxvY2tCdWZmZXIiLCJzdGFydCIsImN1ckxlbmd0aCIsIndyaXRlQnVmZmVyIiwib3V0QmxvY2siLCJLTk5JbmRleGVzIiwiS05OU2ltaWxhcml0aWVzIiwiaW5kZXhPZmZzZXRzIiwidG9TcGFyc2VLTk5TaW1pbGFyaXR5Rm9ybSIsInNwYXJzZU1hdHJpeCIsIm9jY3VyZW5jZUNvdW50IiwiY291bnRPY2N1cmFuY2VzQWRkTG9vcHMiLCJvZmZzZXRGb3JtIiwiYXIiLCJpbnNlcnRDb3VudGVyIiwicm93IiwiY29sIiwic2ltaWxhcml0eSIsInByb3RvdHlwZSIsInRvU3RyaW5nIiwiZGVmYXVsdE1DTE9wdGlvbnMiLCJleHBhbmRGYWN0b3IiLCJtYXhJdGVyYXRpb25zIiwiaW5mbGF0ZUZhY3RvciIsIm11bHRGYWN0b3IiLCJNQ0xTcGFyc2VSZWR1Y2VyIiwiY29uc3RydWN0b3IiLCJvcHRzIiwiX29wdGlvbnMiLCJ0b09iamVjdEZvcm0iLCJhZGRMb29wcyIsIm5vcm1hbGl6ZSIsImV4cGFuZCIsImNsdXN0ZXJzIiwiYXNzaWduQ2x1c3RlcnMiLCJjb3JyZWN0Q2x1c3RlcnMiLCJlbWJlZGRpbmdzIiwidHJhbnNmb3JtIiwibWNsUmVzIiwic3BhcnNlS05ORm9ybSIsImV4cGFuZFJlcyIsIm1hcmtvdkNsdXN0ZXJXZWJHUFUiLCJjc3JUb1NwYXJzZU9iamVjdCIsImNsdXN0ZXJTaXplTWFwIiwic29ydGVkSW5kZXhlcyIsIk51bWJlciIsInNvcnQiLCJjbHVzdGVyTWFwIiwiY2x1c3RlcklkeCIsIm1pbk9yZGVyIiwiayIsImNsdXN0ZXJOdW0iLCJzb3J0ZWRDbHVzdGVyTmFtZXMiLCJwZXJSb3ciLCJ5T2Zmc2V0IiwiY2x1c3Rlck5hbWUiLCJvZmZzZXRYIiwibWVyZ2VDbHVzdGVycyIsImlDbHVzdGVyIiwiakNsdXN0ZXIiLCJyb3VuZCIsImFzc2lnbkNsdXN0ZXJzQ1NSIiwiY29ycmVjdGVkT2Zmc2V0cyIsIm9mZnNldENvdW50ZXIiLCJzdW0iLCJleHBhbmRlZE9iamVjdCIsInZhbCIsImdldEV4cGFuZFZhbHVlIiwiY3VycmVudEluZGV4ZXMiLCJvdGhlckluZGV4ZXMiLCJvbm1lc3NhZ2UiLCJldmVudCIsImRhdGEiLCJhZ2dyZWdhdGlvbk1ldGhvZCIsImRpc3RhbmNlRm5BcmdzIiwiZGlzdGFuY2VGbnMiLCJ1c2VXZWJHUFUiLCJzcGFyc2UiLCJjYWxjTXVsdGlDb2x1bW4iLCJyZWR1Y2VyIiwidHJhbnNmb3JtV2ViR1BVIiwicG9zdE1lc3NhZ2UiLCJpc05pbCIsIngiLCJpbnNlcnRTbWFsbGVyIiwiZGlzdGFuY2VzQXIiLCJpbmRleGVzIiwibnVtIiwiaW5kZXgiLCJuZXdQb3NpdGlvbiIsImZpbmRJbmRleCIsInYiLCJwb3AiLCJzcGxpY2UiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJjYWNoZWRNb2R1bGUiLCJ1bmRlZmluZWQiLCJleHBvcnRzIiwiX193ZWJwYWNrX21vZHVsZXNfXyIsIm0iLCJfX3dlYnBhY2tfZXhwb3J0c19fIiwiTyIsImNodW5rSWRzIiwiZm4iLCJwcmlvcml0eSIsIm5vdEZ1bGZpbGxlZCIsIkluZmluaXR5IiwiZGVmaW5pdGlvbiIsIm8iLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJnZXQiLCJmIiwiY2h1bmtJZCIsImFsbCIsInByb21pc2VzIiwidSIsImciLCJnbG9iYWxUaGlzIiwiRnVuY3Rpb24iLCJ3aW5kb3ciLCJvYmoiLCJwcm9wIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwic2NyaXB0VXJsIiwiaW1wb3J0U2NyaXB0cyIsImxvY2F0aW9uIiwiZG9jdW1lbnQiLCJjdXJyZW50U2NyaXB0Iiwic3JjIiwic2NyaXB0cyIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwicmVwbGFjZSIsInAiLCJzZWxmIiwiaW5zdGFsbGVkQ2h1bmtzIiwiY2h1bmtMb2FkaW5nR2xvYmFsIiwicGFyZW50Q2h1bmtMb2FkaW5nRnVuY3Rpb24iLCJiaW5kIiwibW9yZU1vZHVsZXMiLCJydW50aW1lIl0sInNvdXJjZVJvb3QiOiIifQ==