diff --git a/dist/main.js b/dist/main.js index 6145e83e..1b44a24f 100644 --- a/dist/main.js +++ b/dist/main.js @@ -23833,7 +23833,7 @@ return 2; } function subdivideHyperbolicArc(arc, numDivisions) { - numDivisions = numDivisions || arc.arcLength > 1e-3 ? 2 * Math.ceil(arc.arcLength) : 1; + numDivisions = numDivisions || (arc.arcLength > 1e-3 ? 2 * Math.ceil(arc.arcLength) : 1); const spacing = arc.arcLength / numDivisions; const points = [arc.startPoint]; if (arc.arcLength > spacing) { @@ -23849,7 +23849,8 @@ } function subdivideHyperbolicPolygonEdges(polygon) { const subdivisionEdge = findSubdivisionEdge(polygon); - const edge1Points = subdivideHyperbolicArc(polygon.edges[subdivisionEdge]); + const forceDivisions = 3; + const edge1Points = subdivideHyperbolicArc(polygon.edges[subdivisionEdge], forceDivisions); const numDivisions = edge1Points.length - 1; polygon.numDivisions = numDivisions; const edge2Points = subdivideHyperbolicArc(polygon.edges[(subdivisionEdge + 1) % 3], numDivisions); @@ -23881,7 +23882,7 @@ for (let i = 1; i < numDivisions; i++) { const startPoint = subdividedEdges[2][numDivisions - i]; const endPoint = subdividedEdges[1][i]; - const newPoints = subdivideLine(startPoint, endPoint, i); + const newPoints = subdivideLine(startPoint, endPoint, numDivisions, i); points.push(...newPoints); } points.push(subdividedEdges[2][0]); @@ -23953,29 +23954,12 @@ } edgeStartingVertex += m; } + return [positionIndex, uvIndex]; } if (polygon.materialIndex === 0) { - addPositionsAndUvs(positionsA, positionAIndex, uvsA, uvAIndex); - if (divisions === 1) { - positionAIndex += 9; - uvAIndex += 6; - } else if (divisions === 2) { - positionAIndex += 36; - uvAIndex += 24; - } else { - console.error("Too many divisions!!"); - } + [positionAIndex, uvAIndex] = addPositionsAndUvs(positionsA, positionAIndex, uvsA, uvAIndex); } else { - addPositionsAndUvs(positionsB, positionBIndex, uvsB, uvBIndex); - if (divisions === 1) { - positionBIndex += 9; - uvBIndex += 6; - } else if (divisions === 2) { - positionBIndex += 36; - uvBIndex += 24; - } else { - console.error("Too many divisions!!"); - } + [positionBIndex, uvBIndex] = addPositionsAndUvs(positionsB, positionBIndex, uvsB, uvBIndex); } } const bufferGeometryA = new BufferGeometry(); @@ -24482,7 +24466,7 @@ buildTiling() { this.clearTiling(); console.time("Generate Tiling"); - const tiling = new RegularHyperbolicTesselation_default(this.spec).generateTiling(false); + const tiling = new RegularHyperbolicTesselation_default(this.spec).generateTiling(true); console.timeEnd("Generate Tiling"); console.time("Draw Tiling"); this.generateDisk(tiling); @@ -24549,4 +24533,4 @@ var main = new Main(); var main_default = main; })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL3RocmVlL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL1RpbWUuanMiLCAiLi4vc3JjL0FwcC9BcHAuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9wb2x5ZmlsbHMuanMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29udHJvbHMuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9tYXRoRnVuY3Rpb25zLmpzIiwgIi4uL3NyYy91dGlsaXRpZXMvY3JlYXRlR2VvbWV0cmllcy5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL2h5cGVyYm9saWNFbnRpdGllcy5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL2h5cGVyYm9saWNVdGlsaXRpZXMuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9SZWd1bGFySHlwZXJib2xpY1Rlc3NlbGF0aW9uLmpzIiwgIi4uL3NyYy9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMC0yMDIxIFRocmVlLmpzIEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbiAqL1xuY29uc3QgUkVWSVNJT04gPSAnMTI3JztcbmNvbnN0IE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyLCBST1RBVEU6IDAsIERPTExZOiAxLCBQQU46IDIgfTtcbmNvbnN0IFRPVUNIID0geyBST1RBVEU6IDAsIFBBTjogMSwgRE9MTFlfUEFOOiAyLCBET0xMWV9ST1RBVEU6IDMgfTtcbmNvbnN0IEN1bGxGYWNlTm9uZSA9IDA7XG5jb25zdCBDdWxsRmFjZUJhY2sgPSAxO1xuY29uc3QgQ3VsbEZhY2VGcm9udCA9IDI7XG5jb25zdCBDdWxsRmFjZUZyb250QmFjayA9IDM7XG5jb25zdCBCYXNpY1NoYWRvd01hcCA9IDA7XG5jb25zdCBQQ0ZTaGFkb3dNYXAgPSAxO1xuY29uc3QgUENGU29mdFNoYWRvd01hcCA9IDI7XG5jb25zdCBWU01TaGFkb3dNYXAgPSAzO1xuY29uc3QgRnJvbnRTaWRlID0gMDtcbmNvbnN0IEJhY2tTaWRlID0gMTtcbmNvbnN0IERvdWJsZVNpZGUgPSAyO1xuY29uc3QgRmxhdFNoYWRpbmcgPSAxO1xuY29uc3QgU21vb3RoU2hhZGluZyA9IDI7XG5jb25zdCBOb0JsZW5kaW5nID0gMDtcbmNvbnN0IE5vcm1hbEJsZW5kaW5nID0gMTtcbmNvbnN0IEFkZGl0aXZlQmxlbmRpbmcgPSAyO1xuY29uc3QgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG5jb25zdCBNdWx0aXBseUJsZW5kaW5nID0gNDtcbmNvbnN0IEN1c3RvbUJsZW5kaW5nID0gNTtcbmNvbnN0IEFkZEVxdWF0aW9uID0gMTAwO1xuY29uc3QgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbmNvbnN0IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uID0gMTAyO1xuY29uc3QgTWluRXF1YXRpb24gPSAxMDM7XG5jb25zdCBNYXhFcXVhdGlvbiA9IDEwNDtcbmNvbnN0IFplcm9GYWN0b3IgPSAyMDA7XG5jb25zdCBPbmVGYWN0b3IgPSAyMDE7XG5jb25zdCBTcmNDb2xvckZhY3RvciA9IDIwMjtcbmNvbnN0IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgPSAyMDM7XG5jb25zdCBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbmNvbnN0IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG5jb25zdCBEc3RBbHBoYUZhY3RvciA9IDIwNjtcbmNvbnN0IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG5jb25zdCBEc3RDb2xvckZhY3RvciA9IDIwODtcbmNvbnN0IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgPSAyMDk7XG5jb25zdCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xuY29uc3QgTmV2ZXJEZXB0aCA9IDA7XG5jb25zdCBBbHdheXNEZXB0aCA9IDE7XG5jb25zdCBMZXNzRGVwdGggPSAyO1xuY29uc3QgTGVzc0VxdWFsRGVwdGggPSAzO1xuY29uc3QgRXF1YWxEZXB0aCA9IDQ7XG5jb25zdCBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG5jb25zdCBHcmVhdGVyRGVwdGggPSA2O1xuY29uc3QgTm90RXF1YWxEZXB0aCA9IDc7XG5jb25zdCBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG5jb25zdCBNaXhPcGVyYXRpb24gPSAxO1xuY29uc3QgQWRkT3BlcmF0aW9uID0gMjtcbmNvbnN0IE5vVG9uZU1hcHBpbmcgPSAwO1xuY29uc3QgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xuY29uc3QgUmVpbmhhcmRUb25lTWFwcGluZyA9IDI7XG5jb25zdCBDaW5lb25Ub25lTWFwcGluZyA9IDM7XG5jb25zdCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcgPSA0O1xuY29uc3QgQ3VzdG9tVG9uZU1hcHBpbmcgPSA1O1xuXG5jb25zdCBVVk1hcHBpbmcgPSAzMDA7XG5jb25zdCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG5jb25zdCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG5jb25zdCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMztcbmNvbnN0IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xuY29uc3QgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XG5jb25zdCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNztcbmNvbnN0IFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbmNvbnN0IENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xuY29uc3QgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XG5jb25zdCBOZWFyZXN0RmlsdGVyID0gMTAwMztcbmNvbnN0IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbmNvbnN0IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbmNvbnN0IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xuY29uc3QgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG5jb25zdCBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xuY29uc3QgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7XG5jb25zdCBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbmNvbnN0IExpbmVhck1pcG1hcExpbmVhckZpbHRlciA9IDEwMDg7XG5jb25zdCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xuY29uc3QgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG5jb25zdCBCeXRlVHlwZSA9IDEwMTA7XG5jb25zdCBTaG9ydFR5cGUgPSAxMDExO1xuY29uc3QgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xuY29uc3QgSW50VHlwZSA9IDEwMTM7XG5jb25zdCBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xuY29uc3QgRmxvYXRUeXBlID0gMTAxNTtcbmNvbnN0IEhhbGZGbG9hdFR5cGUgPSAxMDE2O1xuY29uc3QgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbmNvbnN0IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG5jb25zdCBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7XG5jb25zdCBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xuY29uc3QgQWxwaGFGb3JtYXQgPSAxMDIxO1xuY29uc3QgUkdCRm9ybWF0ID0gMTAyMjtcbmNvbnN0IFJHQkFGb3JtYXQgPSAxMDIzO1xuY29uc3QgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbmNvbnN0IEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTtcbmNvbnN0IFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xuY29uc3QgRGVwdGhGb3JtYXQgPSAxMDI2O1xuY29uc3QgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNztcbmNvbnN0IFJlZEZvcm1hdCA9IDEwMjg7XG5jb25zdCBSZWRJbnRlZ2VyRm9ybWF0ID0gMTAyOTtcbmNvbnN0IFJHRm9ybWF0ID0gMTAzMDtcbmNvbnN0IFJHSW50ZWdlckZvcm1hdCA9IDEwMzE7XG5jb25zdCBSR0JJbnRlZ2VyRm9ybWF0ID0gMTAzMjtcbmNvbnN0IFJHQkFJbnRlZ2VyRm9ybWF0ID0gMTAzMztcblxuY29uc3QgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NjtcbmNvbnN0IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3O1xuY29uc3QgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG5jb25zdCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAzMzc3OTtcbmNvbnN0IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDA7XG5jb25zdCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xuY29uc3QgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDI7XG5jb25zdCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MztcbmNvbnN0IFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xuY29uc3QgUkdCX0VUQzJfRm9ybWF0ID0gMzc0OTI7XG5jb25zdCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCA9IDM3NDk2O1xuY29uc3QgUkdCQV9BU1RDXzR4NF9Gb3JtYXQgPSAzNzgwODtcbmNvbnN0IFJHQkFfQVNUQ181eDRfRm9ybWF0ID0gMzc4MDk7XG5jb25zdCBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xuY29uc3QgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgPSAzNzgxMTtcbmNvbnN0IFJHQkFfQVNUQ182eDZfRm9ybWF0ID0gMzc4MTI7XG5jb25zdCBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xuY29uc3QgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgPSAzNzgxNDtcbmNvbnN0IFJHQkFfQVNUQ184eDhfRm9ybWF0ID0gMzc4MTU7XG5jb25zdCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbmNvbnN0IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCA9IDM3ODE3O1xuY29uc3QgUkdCQV9BU1RDXzEweDhfRm9ybWF0ID0gMzc4MTg7XG5jb25zdCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG5jb25zdCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0ID0gMzc4MjA7XG5jb25zdCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4MjE7XG5jb25zdCBSR0JBX0JQVENfRm9ybWF0ID0gMzY0OTI7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ180eDRfRm9ybWF0ID0gMzc4NDA7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ181eDRfRm9ybWF0ID0gMzc4NDE7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0ID0gMzc4NDI7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0ID0gMzc4NDM7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ182eDZfRm9ybWF0ID0gMzc4NDQ7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0ID0gMzc4NDU7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDZfRm9ybWF0ID0gMzc4NDY7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0ID0gMzc4NDc7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODQ4O1xuY29uc3QgU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzg0OTtcbmNvbnN0IFNSR0I4X0FMUEhBOF9BU1RDXzEweDhfRm9ybWF0ID0gMzc4NTA7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzg1MTtcbmNvbnN0IFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODUyO1xuY29uc3QgU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4NTM7XG5jb25zdCBMb29wT25jZSA9IDIyMDA7XG5jb25zdCBMb29wUmVwZWF0ID0gMjIwMTtcbmNvbnN0IExvb3BQaW5nUG9uZyA9IDIyMDI7XG5jb25zdCBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbmNvbnN0IEludGVycG9sYXRlTGluZWFyID0gMjMwMTtcbmNvbnN0IEludGVycG9sYXRlU21vb3RoID0gMjMwMjtcbmNvbnN0IFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xuY29uc3QgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTtcbmNvbnN0IFdyYXBBcm91bmRFbmRpbmcgPSAyNDAyO1xuY29uc3QgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMDtcbmNvbnN0IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMTtcbmNvbnN0IFRyaWFuZ2xlc0RyYXdNb2RlID0gMDtcbmNvbnN0IFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG5jb25zdCBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcbmNvbnN0IExpbmVhckVuY29kaW5nID0gMzAwMDtcbmNvbnN0IHNSR0JFbmNvZGluZyA9IDMwMDE7XG5jb25zdCBHYW1tYUVuY29kaW5nID0gMzAwNztcbmNvbnN0IFJHQkVFbmNvZGluZyA9IDMwMDI7XG5jb25zdCBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG5jb25zdCBSR0JNN0VuY29kaW5nID0gMzAwNDtcbmNvbnN0IFJHQk0xNkVuY29kaW5nID0gMzAwNTtcbmNvbnN0IFJHQkRFbmNvZGluZyA9IDMwMDY7XG5jb25zdCBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XG5jb25zdCBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTtcbmNvbnN0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCA9IDA7XG5jb25zdCBPYmplY3RTcGFjZU5vcm1hbE1hcCA9IDE7XG5cbmNvbnN0IFplcm9TdGVuY2lsT3AgPSAwO1xuY29uc3QgS2VlcFN0ZW5jaWxPcCA9IDc2ODA7XG5jb25zdCBSZXBsYWNlU3RlbmNpbE9wID0gNzY4MTtcbmNvbnN0IEluY3JlbWVudFN0ZW5jaWxPcCA9IDc2ODI7XG5jb25zdCBEZWNyZW1lbnRTdGVuY2lsT3AgPSA3NjgzO1xuY29uc3QgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU1O1xuY29uc3QgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU2O1xuY29uc3QgSW52ZXJ0U3RlbmNpbE9wID0gNTM4NjtcblxuY29uc3QgTmV2ZXJTdGVuY2lsRnVuYyA9IDUxMjtcbmNvbnN0IExlc3NTdGVuY2lsRnVuYyA9IDUxMztcbmNvbnN0IEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTQ7XG5jb25zdCBMZXNzRXF1YWxTdGVuY2lsRnVuYyA9IDUxNTtcbmNvbnN0IEdyZWF0ZXJTdGVuY2lsRnVuYyA9IDUxNjtcbmNvbnN0IE5vdEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTc7XG5jb25zdCBHcmVhdGVyRXF1YWxTdGVuY2lsRnVuYyA9IDUxODtcbmNvbnN0IEFsd2F5c1N0ZW5jaWxGdW5jID0gNTE5O1xuXG5jb25zdCBTdGF0aWNEcmF3VXNhZ2UgPSAzNTA0NDtcbmNvbnN0IER5bmFtaWNEcmF3VXNhZ2UgPSAzNTA0ODtcbmNvbnN0IFN0cmVhbURyYXdVc2FnZSA9IDM1MDQwO1xuY29uc3QgU3RhdGljUmVhZFVzYWdlID0gMzUwNDU7XG5jb25zdCBEeW5hbWljUmVhZFVzYWdlID0gMzUwNDk7XG5jb25zdCBTdHJlYW1SZWFkVXNhZ2UgPSAzNTA0MTtcbmNvbnN0IFN0YXRpY0NvcHlVc2FnZSA9IDM1MDQ2O1xuY29uc3QgRHluYW1pY0NvcHlVc2FnZSA9IDM1MDUwO1xuY29uc3QgU3RyZWFtQ29weVVzYWdlID0gMzUwNDI7XG5cbmNvbnN0IEdMU0wxID0gJzEwMCc7XG5jb25zdCBHTFNMMyA9ICczMDAgZXMnO1xuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRoYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcblxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHRjb25zdCBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcblxuXHRcdFx0Ly8gTWFrZSBhIGNvcHksIGluIGNhc2UgbGlzdGVuZXJzIGFyZSByZW1vdmVkIHdoaWxlIGl0ZXJhdGluZy5cblx0XHRcdGNvbnN0IGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRldmVudC50YXJnZXQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5jb25zdCBfbHV0ID0gW107XG5cbmZvciAoIGxldCBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRfbHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxufVxuXG5sZXQgX3NlZWQgPSAxMjM0NTY3O1xuXG5jb25zdCBNYXRoVXRpbHMgPSB7XG5cblx0REVHMlJBRDogTWF0aC5QSSAvIDE4MCxcblx0UkFEMkRFRzogMTgwIC8gTWF0aC5QSSxcblxuXHRnZW5lcmF0ZVVVSUQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTk2MzEzNiMyMTk2MzEzNlxuXG5cdFx0Y29uc3QgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDEgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDIgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgdXVpZCA9IF9sdXRbIGQwICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0X2x1dFsgZDEgJiAweGZmIF0gKyBfbHV0WyBkMSA+PiA4ICYgMHhmZiBdICsgJy0nICsgX2x1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgX2x1dFsgZDEgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0X2x1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgX2x1dFsgZDIgPj4gOCAmIDB4ZmYgXSArICctJyArIF9sdXRbIGQyID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0X2x1dFsgZDMgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiAyNCAmIDB4ZmYgXTtcblxuXHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRyZXR1cm4gdXVpZC50b1VwcGVyQ2FzZSgpO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggdmFsdWUsIG1pbiwgbWF4ICkge1xuXG5cdFx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTtcblxuXHR9LFxuXG5cdC8vIGNvbXB1dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uXG5cblx0ZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAoIG4sIG0gKSB7XG5cblx0XHRyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtO1xuXG5cdH0sXG5cblx0Ly8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPlxuXG5cdG1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHtcblxuXHRcdHJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZ2FtZWRldi5uZXQvdHV0b3JpYWxzL3Byb2dyYW1taW5nL2dlbmVyYWwtYW5kLWdhbWVwbGF5LXByb2dyYW1taW5nL2ludmVyc2UtbGVycC1hLXN1cGVyLXVzZWZ1bC15ZXQtb2Z0ZW4tb3Zlcmxvb2tlZC1mdW5jdGlvbi1yNTIzMC9cblxuXHRpbnZlcnNlTGVycDogZnVuY3Rpb24gKCB4LCB5LCB2YWx1ZSApIHtcblxuXHRcdGlmICggeCAhPT0geSApIHtcblxuXHRcdFx0cmV0dXJuICggdmFsdWUgLSB4ICkgLyAoIHkgLSB4ICk7XG5cblx0XHQgfSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIDA7XG5cblx0XHQgfVxuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb25cblxuXHRsZXJwOiBmdW5jdGlvbiAoIHgsIHksIHQgKSB7XG5cblx0XHRyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5O1xuXG5cdH0sXG5cblx0Ly8gaHR0cDovL3d3dy5yb3J5ZHJpc2NvbGwuY29tLzIwMTYvMDMvMDcvZnJhbWUtcmF0ZS1pbmRlcGVuZGVudC1kYW1waW5nLXVzaW5nLWxlcnAvXG5cblx0ZGFtcDogZnVuY3Rpb24gKCB4LCB5LCBsYW1iZGEsIGR0ICkge1xuXG5cdFx0cmV0dXJuIE1hdGhVdGlscy5sZXJwKCB4LCB5LCAxIC0gTWF0aC5leHAoIC0gbGFtYmRhICogZHQgKSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZGVzbW9zLmNvbS9jYWxjdWxhdG9yL3Zjc2pueXo3eDRcblxuXHRwaW5ncG9uZzogZnVuY3Rpb24gKCB4LCBsZW5ndGggPSAxICkge1xuXG5cdFx0cmV0dXJuIGxlbmd0aCAtIE1hdGguYWJzKCBNYXRoVXRpbHMuZXVjbGlkZWFuTW9kdWxvKCB4LCBsZW5ndGggKiAyICkgLSBsZW5ndGggKTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdC8vIERldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBmbG9hdCBpbiB0aGUgaW50ZXJ2YWwgWyAwLCAxIF1cblxuXHRzZWVkZWRSYW5kb206IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdGlmICggcyAhPT0gdW5kZWZpbmVkICkgX3NlZWQgPSBzICUgMjE0NzQ4MzY0NztcblxuXHRcdC8vIFBhcmstTWlsbGVyIGFsZ29yaXRobVxuXG5cdFx0X3NlZWQgPSBfc2VlZCAqIDE2ODA3ICUgMjE0NzQ4MzY0NztcblxuXHRcdHJldHVybiAoIF9zZWVkIC0gMSApIC8gMjE0NzQ4MzY0NjtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIE1hdGhVdGlscy5ERUcyUkFEO1xuXG5cdH0sXG5cblx0cmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHtcblxuXHRcdHJldHVybiByYWRpYW5zICogTWF0aFV0aWxzLlJBRDJERUc7XG5cblx0fSxcblxuXHRpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcblxuXHR9LFxuXG5cdGNlaWxQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3JQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXI6IGZ1bmN0aW9uICggcSwgYSwgYiwgYywgb3JkZXIgKSB7XG5cblx0XHQvLyBJbnRyaW5zaWMgUHJvcGVyIEV1bGVyIEFuZ2xlcyAtIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXNcblxuXHRcdC8vIHJvdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgYXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5ICdvcmRlcidcblx0XHQvLyByb3RhdGlvbiBieSBhbmdsZSAnYScgaXMgYXBwbGllZCBmaXJzdCwgdGhlbiBieSBhbmdsZSAnYicsIHRoZW4gYnkgYW5nbGUgJ2MnXG5cdFx0Ly8gYW5nbGVzIGFyZSBpbiByYWRpYW5zXG5cblx0XHRjb25zdCBjb3MgPSBNYXRoLmNvcztcblx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdGNvbnN0IGMyID0gY29zKCBiIC8gMiApO1xuXHRcdGNvbnN0IHMyID0gc2luKCBiIC8gMiApO1xuXG5cdFx0Y29uc3QgYzEzID0gY29zKCAoIGEgKyBjICkgLyAyICk7XG5cdFx0Y29uc3QgczEzID0gc2luKCAoIGEgKyBjICkgLyAyICk7XG5cblx0XHRjb25zdCBjMV8zID0gY29zKCAoIGEgLSBjICkgLyAyICk7XG5cdFx0Y29uc3QgczFfMyA9IHNpbiggKCBhIC0gYyApIC8gMiApO1xuXG5cdFx0Y29uc3QgYzNfMSA9IGNvcyggKCBjIC0gYSApIC8gMiApO1xuXHRcdGNvbnN0IHMzXzEgPSBzaW4oICggYyAtIGEgKSAvIDIgKTtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVgnOlxuXHRcdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIGMxMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpZJzpcblx0XHRcdFx0cS5zZXQoIHMyICogczFfMywgYzIgKiBzMTMsIHMyICogYzFfMywgYzIgKiBjMTMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWic6XG5cdFx0XHRcdHEuc2V0KCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBzMTMsIGMyICogYzEzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdYWlgnOlxuXHRcdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIGMxMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhZJzpcblx0XHRcdFx0cS5zZXQoIHMyICogYzNfMSwgYzIgKiBzMTMsIHMyICogczNfMSwgYzIgKiBjMTMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pZWic6XG5cdFx0XHRcdHEuc2V0KCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBzMTMsIGMyICogYzEzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoVXRpbHM6IC5zZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5jbGFzcyBWZWN0b3IyIHtcblxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdH1cblxuXHRnZXQgd2lkdGgoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54O1xuXG5cdH1cblxuXHRzZXQgd2lkdGgoIHZhbHVlICkge1xuXG5cdFx0dGhpcy54ID0gdmFsdWU7XG5cblx0fVxuXG5cdGdldCBoZWlnaHQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdH1cblxuXHRzZXQgaGVpZ2h0KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMueSA9IHZhbHVlO1xuXG5cdH1cblxuXHRzZXQoIHgsIHkgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFgoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFkoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldENvbXBvbmVudCggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XG5cblx0fVxuXG5cdGNvcHkoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZCggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxhciggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YlNjYWxhciggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YlZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5KCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGl2aWRlKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRpdmlkZVNjYWxhciggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9XG5cblx0YXBwbHlNYXRyaXgzKCBtICkge1xuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xhbXBMZW5ndGgoIG1pbiwgbWF4ICkge1xuXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH1cblxuXHRmbG9vcigpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNlaWwoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm91bmQoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3VuZFRvWmVybygpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG5lZ2F0ZSgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRvdCggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fVxuXG5cdGNyb3NzKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0YW5nbGUoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0Y29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKCAtIHRoaXMueSwgLSB0aGlzLnggKSArIE1hdGguUEk7XG5cblx0XHRyZXR1cm4gYW5nbGU7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG8oIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSB7XG5cblx0XHRjb25zdCBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7XG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuXG5cdH1cblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBWZWN0b3JzKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ID0gdjEueCArICggdjIueCAtIHYxLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSA9IHYxLnkgKyAoIHYyLnkgLSB2MS55ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3RhdGVBcm91bmQoIGNlbnRlciwgYW5nbGUgKSB7XG5cblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIGFuZ2xlICksIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdGNvbnN0IHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHRjb25zdCB5ID0gdGhpcy55IC0gY2VudGVyLnk7XG5cblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJhbmRvbSgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy55ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3IyLnByb3RvdHlwZS5pc1ZlY3RvcjIgPSB0cnVlO1xuXG5jbGFzcyBNYXRyaXgzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0XTtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0aWRlbnRpdHkoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIG0gKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMSApO1xuXHRcdHpBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9XG5cblx0cHJlbXVsdGlwbHkoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fVxuXG5cdG11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSB7XG5cblx0XHRjb25zdCBhZSA9IGEuZWxlbWVudHM7XG5cdFx0Y29uc3QgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGNvbnN0IGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0Y29uc3QgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xuXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHRjb25zdCBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xuXHRcdGNvbnN0IGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkZXRlcm1pbmFudCgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGNvbnN0IGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XG5cblx0fVxuXG5cdGludmVydCgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSxcblx0XHRcdG4xMiA9IHRlWyAzIF0sIG4yMiA9IHRlWyA0IF0sIG4zMiA9IHRlWyA1IF0sXG5cdFx0XHRuMTMgPSB0ZVsgNiBdLCBuMjMgPSB0ZVsgNyBdLCBuMzMgPSB0ZVsgOCBdLFxuXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXG5cblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcblxuXHRcdGlmICggZGV0ID09PSAwICkgcmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICk7XG5cblx0XHRjb25zdCBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcblxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zcG9zZSgpIHtcblxuXHRcdGxldCB0bXA7XG5cdFx0Y29uc3QgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXROb3JtYWxNYXRyaXgoIG1hdHJpeDQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmludmVydCgpLnRyYW5zcG9zZSgpO1xuXG5cdH1cblxuXHR0cmFuc3Bvc2VJbnRvQXJyYXkoIHIgKSB7XG5cblx0XHRjb25zdCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcblx0XHRyWyAxIF0gPSBtWyAzIF07XG5cdFx0clsgMiBdID0gbVsgNiBdO1xuXHRcdHJbIDMgXSA9IG1bIDEgXTtcblx0XHRyWyA0IF0gPSBtWyA0IF07XG5cdFx0clsgNSBdID0gbVsgNyBdO1xuXHRcdHJbIDYgXSA9IG1bIDIgXTtcblx0XHRyWyA3IF0gPSBtWyA1IF07XG5cdFx0clsgOCBdID0gbVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFV2VHJhbnNmb3JtKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCBzeCwgc3kgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHN4OyB0ZVsgMyBdICo9IHN4OyB0ZVsgNiBdICo9IHN4O1xuXHRcdHRlWyAxIF0gKj0gc3k7IHRlWyA0IF0gKj0gc3k7IHRlWyA3IF0gKj0gc3k7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm90YXRlKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdGNvbnN0IGEyMSA9IHRlWyAxIF0sIGEyMiA9IHRlWyA0IF0sIGEyMyA9IHRlWyA3IF07XG5cblx0XHR0ZVsgMCBdID0gYyAqIGExMSArIHMgKiBhMjE7XG5cdFx0dGVbIDMgXSA9IGMgKiBhMTIgKyBzICogYTIyO1xuXHRcdHRlWyA2IF0gPSBjICogYTEzICsgcyAqIGEyMztcblxuXHRcdHRlWyAxIF0gPSAtIHMgKiBhMTEgKyBjICogYTIxO1xuXHRcdHRlWyA0IF0gPSAtIHMgKiBhMTIgKyBjICogYTIyO1xuXHRcdHRlWyA3IF0gPSAtIHMgKiBhMTMgKyBjICogYTIzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zbGF0ZSggdHgsIHR5ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSArPSB0eCAqIHRlWyAyIF07IHRlWyAzIF0gKz0gdHggKiB0ZVsgNSBdOyB0ZVsgNiBdICs9IHR4ICogdGVbIDggXTtcblx0XHR0ZVsgMSBdICs9IHR5ICogdGVbIDIgXTsgdGVbIDQgXSArPSB0eSAqIHRlWyA1IF07IHRlWyA3IF0gKz0gdHkgKiB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGVxdWFscyggbWF0cml4ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuTWF0cml4My5wcm90b3R5cGUuaXNNYXRyaXgzID0gdHJ1ZTtcblxubGV0IF9jYW52YXM7XG5cbmNvbnN0IEltYWdlVXRpbHMgPSB7XG5cblx0Z2V0RGF0YVVSTDogZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdGlmICggL15kYXRhOi9pLnRlc3QoIGltYWdlLnNyYyApICkge1xuXG5cdFx0XHRyZXR1cm4gaW1hZ2Uuc3JjO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBpbWFnZS5zcmM7XG5cblx0XHR9XG5cblx0XHRsZXQgY2FudmFzO1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRjYW52YXMgPSBpbWFnZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXG5cdFx0XHRfY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0Y29uc3QgY29udGV4dCA9IF9jYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXG5cdFx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkge1xuXG5cdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNhbnZhcyA9IF9jYW52YXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucycsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9wbmcnICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5sZXQgdGV4dHVyZUlkID0gMDtcblxuY2xhc3MgVGV4dHVyZSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XG5cblx0Y29uc3RydWN0b3IoIGltYWdlID0gVGV4dHVyZS5ERUZBVUxUX0lNQUdFLCBtYXBwaW5nID0gVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcsIHdyYXBTID0gQ2xhbXBUb0VkZ2VXcmFwcGluZywgd3JhcFQgPSBDbGFtcFRvRWRnZVdyYXBwaW5nLCBtYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgZm9ybWF0ID0gUkdCQUZvcm1hdCwgdHlwZSA9IFVuc2lnbmVkQnl0ZVR5cGUsIGFuaXNvdHJvcHkgPSAxLCBlbmNvZGluZyA9IExpbmVhckVuY29kaW5nICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHRcdHRoaXMudXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdHRoaXMubmFtZSA9ICcnO1xuXG5cdFx0dGhpcy5pbWFnZSA9IGltYWdlO1xuXHRcdHRoaXMubWlwbWFwcyA9IFtdO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHRoaXMud3JhcFMgPSB3cmFwUztcblx0XHR0aGlzLndyYXBUID0gd3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlcjtcblx0XHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0XHR0aGlzLmludGVybmFsRm9ybWF0ID0gbnVsbDtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXG5cdFx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHRcdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0XHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcblx0XHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcblxuXHRcdC8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLlxuXHRcdC8vXG5cdFx0Ly8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbFxuXHRcdC8vIHVwZGF0ZS4gWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHRcdHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcblxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XG5cdFx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeCgpIHtcblxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBzb3VyY2UuaW50ZXJuYWxGb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCBtZXRhICkge1xuXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG91dHB1dCA9IHtcblxuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xuXHRcdFx0fSxcblxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG5cblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxuXHRcdFx0Y2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSxcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcblxuXHRcdFx0Zm9ybWF0OiB0aGlzLmZvcm1hdCxcblx0XHRcdHR5cGU6IHRoaXMudHlwZSxcblx0XHRcdGVuY29kaW5nOiB0aGlzLmVuY29kaW5nLFxuXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLFxuXHRcdFx0bWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlcixcblx0XHRcdGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSxcblxuXHRcdFx0ZmxpcFk6IHRoaXMuZmxpcFksXG5cblx0XHRcdHByZW11bHRpcGx5QWxwaGE6IHRoaXMucHJlbXVsdGlwbHlBbHBoYSxcblx0XHRcdHVucGFja0FsaWdubWVudDogdGhpcy51bnBhY2tBbGlnbm1lbnRcblxuXHRcdH07XG5cblx0XHRpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gVE9ETzogTW92ZSB0byBUSFJFRS5JbWFnZVxuXG5cdFx0XHRjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSFxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxldCB1cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbWFnZSApICkge1xuXG5cdFx0XHRcdFx0Ly8gcHJvY2VzcyBhcnJheSBvZiBpbWFnZXMgZS5nLiBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0dXJsID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbWFnZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHQvLyBjaGVjayBjdWJlIHRleHR1cmUgd2l0aCBkYXRhIHRleHR1cmVzXG5cblx0XHRcdFx0XHRcdGlmICggaW1hZ2VbIGkgXS5pc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHVybC5wdXNoKCBzZXJpYWxpemVJbWFnZSggaW1hZ2VbIGkgXS5pbWFnZSApICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0dXJsLnB1c2goIHNlcmlhbGl6ZUltYWdlKCBpbWFnZVsgaSBdICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwcm9jZXNzIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0dXJsID0gc2VyaWFsaXplSW1hZ2UoIGltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7XG5cdFx0XHRcdFx0dXVpZDogaW1hZ2UudXVpZCxcblx0XHRcdFx0XHR1cmw6IHVybFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHRtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0fVxuXG5cdGRpc3Bvc2UoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cblx0dHJhbnNmb3JtVXYoIHV2ICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZyApIHJldHVybiB1djtcblxuXHRcdHV2LmFwcGx5TWF0cml4MyggdGhpcy5tYXRyaXggKTtcblxuXHRcdGlmICggdXYueCA8IDAgfHwgdXYueCA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFMgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IE1hdGguY2VpbCggdXYueCApIC0gdXYueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcblxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHV2O1xuXG5cdH1cblxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlLmlzVGV4dHVyZSA9IHRydWU7XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcblxuXHRpZiAoICggdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XG5cdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxuXHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XG5cblx0XHQvLyBkZWZhdWx0IGltYWdlc1xuXG5cdFx0cmV0dXJuIEltYWdlVXRpbHMuZ2V0RGF0YVVSTCggaW1hZ2UgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBpbWFnZS5kYXRhICkge1xuXG5cdFx0XHQvLyBpbWFnZXMgb2YgRGF0YVRleHR1cmVcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGltYWdlLmRhdGEgKSxcblx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodCxcblx0XHRcdFx0dHlwZTogaW1hZ2UuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLicgKTtcblx0XHRcdHJldHVybiB7fTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgVmVjdG9yNCB7XG5cblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHR9XG5cblx0Z2V0IHdpZHRoKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuejtcblxuXHR9XG5cblx0c2V0IHdpZHRoKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMueiA9IHZhbHVlO1xuXG5cdH1cblxuXHRnZXQgaGVpZ2h0KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMudztcblxuXHR9XG5cblx0c2V0IGhlaWdodCggdmFsdWUgKSB7XG5cblx0XHR0aGlzLncgPSB2YWx1ZTtcblxuXHR9XG5cblx0c2V0KCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXHRcdHRoaXMudyA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRYKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRZKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRaKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRXKCB3ICkge1xuXG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRDb21wb25lbnQoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XG5cblx0fVxuXG5cdGNvcHkoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZCggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cdFx0dGhpcy53ICs9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHR0aGlzLncgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXHRcdHRoaXMudyArPSB2LncgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cdFx0dGhpcy53IC09IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblx0XHR0aGlzLncgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5KCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXHRcdHRoaXMueiAqPSB2Lno7XG5cdFx0dGhpcy53ICo9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVNjYWxhciggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cdFx0dGhpcy53ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fVxuXG5cdHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0Y29uc3QgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApO1xuXG5cdFx0aWYgKCBzIDwgMC4wMDAxICkge1xuXG5cdFx0XHR0aGlzLnggPSAxO1xuXHRcdFx0dGhpcy55ID0gMDtcblx0XHRcdHRoaXMueiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnggPSBxLnggLyBzO1xuXHRcdFx0dGhpcy55ID0gcS55IC8gcztcblx0XHRcdHRoaXMueiA9IHEueiAvIHM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0bGV0IGFuZ2xlLCB4LCB5LCB6OyAvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdFxuXHRcdGNvbnN0IGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHRjb25zdCB4eCA9ICggbTExICsgMSApIC8gMjtcblx0XHRcdGNvbnN0IHl5ID0gKCBtMjIgKyAxICkgLyAyO1xuXHRcdFx0Y29uc3QgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHRjb25zdCB4eSA9ICggbTEyICsgbTIxICkgLyA0O1xuXHRcdFx0Y29uc3QgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcblx0XHRcdGNvbnN0IHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHRsZXQgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdFx0KCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xuXHRcdFx0KCBtMjEgLSBtMTIgKSAqICggbTIxIC0gbTEyICkgKTsgLy8gdXNlZCB0byBub3JtYWxpemVcblxuXHRcdGlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7XG5cblx0XHQvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBpZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlXG5cdFx0Ly8gY2F1Z2h0IGJ5IHNpbmd1bGFyaXR5IHRlc3QgYWJvdmUsIGJ1dCBJJ3ZlIGxlZnQgaXQgaW4ganVzdCBpbiBjYXNlXG5cblx0XHR0aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHR0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHR0aGlzLnogPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHR0aGlzLncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWluKCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluLncsIE1hdGgubWluKCBtYXgudywgdGhpcy53ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLncgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wTGVuZ3RoKCBtaW4sIG1heCApIHtcblxuXHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9XG5cblx0Zmxvb3IoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjZWlsKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3VuZCgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJvdW5kVG9aZXJvKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bmVnYXRlKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cdFx0dGhpcy53ID0gLSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZG90KCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cdFx0dGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRsZXJwVmVjdG9ycyggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCA9IHYxLnggKyAoIHYyLnggLSB2MS54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgPSB2MS55ICsgKCB2Mi55IC0gdjEueSApICogYWxwaGE7XG5cdFx0dGhpcy56ID0gdjEueiArICggdjIueiAtIHYxLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyA9IHYxLncgKyAoIHYyLncgLSB2MS53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9XG5cblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cmFuZG9tKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yYW5kb20oKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJhbmRvbSgpO1xuXHRcdHRoaXMueiA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy53ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3I0LnByb3RvdHlwZS5pc1ZlY3RvcjQgPSB0cnVlO1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5jbGFzcyBXZWJHTFJlbmRlclRhcmdldCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XG5cblx0Y29uc3RydWN0b3IoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMuZGVwdGggPSAxO1xuXG5cdFx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cblx0XHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgb3B0aW9ucy5tYXBwaW5nLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGluZyApO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlID0ge307XG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodCA9IGhlaWdodDtcblx0XHR0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGggPSAxO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyA6IGZhbHNlO1xuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWU7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgOiBmYWxzZTtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7XG5cblx0fVxuXG5cdHNldFRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR0ZXh0dXJlLmltYWdlID0ge1xuXHRcdFx0d2lkdGg6IHRoaXMud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuXHRcdFx0ZGVwdGg6IHRoaXMuZGVwdGhcblx0XHR9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcblxuXHR9XG5cblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgZGVwdGggPSAxICkge1xuXG5cdFx0aWYgKCB0aGlzLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0IHx8IHRoaXMuZGVwdGggIT09IGRlcHRoICkge1xuXG5cdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblx0XHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcblxuXHRcdFx0dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdFx0dGhpcy50ZXh0dXJlLmltYWdlLmRlcHRoID0gZGVwdGg7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblx0XHR0aGlzLmRlcHRoID0gc291cmNlLmRlcHRoO1xuXG5cdFx0dGhpcy52aWV3cG9ydC5jb3B5KCBzb3VyY2Uudmlld3BvcnQgKTtcblxuXHRcdHRoaXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyO1xuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyO1xuXHRcdHRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcblxuY2xhc3MgV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHtcblxuXHRjb25zdHJ1Y3Rvciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XG5cblx0XHR0aGlzLnNhbXBsZXMgPSA0O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5zYW1wbGVzID0gc291cmNlLnNhbXBsZXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldC5wcm90b3R5cGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcblxuY2xhc3MgUXVhdGVybmlvbiB7XG5cblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0fVxuXG5cdHN0YXRpYyBzbGVycCggcWEsIHFiLCBxbSwgdCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IFN0YXRpYyAuc2xlcnAoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgcW0uc2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHFtLnNsZXJwUXVhdGVybmlvbnMoIHFhLCBxYiwgdCApO1xuXG5cdH1cblxuXHRzdGF0aWMgc2xlcnBGbGF0KCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdGxldCB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XG5cblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHQgPT09IDAgKSB7XG5cblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDA7XG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDE7XG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkxO1xuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MTtcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzE7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0bGV0IHMgPSAxIC0gdDtcblx0XHRcdGNvbnN0IGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdERpciA9IHQgKiBkaXI7XG5cblx0XHRcdHgwID0geDAgKiBzICsgeDEgKiB0RGlyO1xuXHRcdFx0eTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7XG5cdFx0XHR6MCA9IHowICogcyArIHoxICogdERpcjtcblx0XHRcdHcwID0gdzAgKiBzICsgdzEgKiB0RGlyO1xuXG5cdFx0XHQvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxlcnA6XG5cdFx0XHRpZiAoIHMgPT09IDEgLSB0ICkge1xuXG5cdFx0XHRcdGNvbnN0IGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxuXHRzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxICkge1xuXG5cdFx0Y29uc3QgeDAgPSBzcmMwWyBzcmNPZmZzZXQwIF07XG5cdFx0Y29uc3QgeTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdO1xuXHRcdGNvbnN0IHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXTtcblx0XHRjb25zdCB3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XG5cblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgXTtcblx0XHRjb25zdCB5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF07XG5cdFx0Y29uc3QgejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdO1xuXHRcdGNvbnN0IHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MCAqIHcxICsgdzAgKiB4MSArIHkwICogejEgLSB6MCAqIHkxO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTAgKiB3MSArIHcwICogeTEgKyB6MCAqIHgxIC0geDAgKiB6MTtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowICogdzEgKyB3MCAqIHoxICsgeDAgKiB5MSAtIHkwICogeDE7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MCAqIHcxIC0geDAgKiB4MSAtIHkwICogeTEgLSB6MCAqIHoxO1xuXG5cdFx0cmV0dXJuIGRzdDtcblxuXHR9XG5cblx0Z2V0IHgoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHR9XG5cblx0c2V0IHgoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHkoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHR9XG5cblx0c2V0IHkoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHooKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHR9XG5cblx0c2V0IHooIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHcoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHR9XG5cblx0c2V0IHcoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5fdyA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0c2V0KCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9XG5cblx0Y29weSggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUV1bGVyKCBldWxlciwgdXBkYXRlICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cblxuXHRcdGNvbnN0IGNvcyA9IE1hdGguY29zO1xuXHRcdGNvbnN0IHNpbiA9IE1hdGguc2luO1xuXG5cdFx0Y29uc3QgYzEgPSBjb3MoIHggLyAyICk7XG5cdFx0Y29uc3QgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0Y29uc3QgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHRjb25zdCBzMSA9IHNpbiggeCAvIDIgKTtcblx0XHRjb25zdCBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHRjb25zdCBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVonOlxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhaJzpcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWSc6XG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdaWVgnOlxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpYJzpcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1haWSc6XG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0Y29uc3QgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdGNvbnN0IHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSxcblxuXHRcdFx0dHJhY2UgPSBtMTEgKyBtMjIgKyBtMzM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXG5cblx0XHRsZXQgciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0aWYgKCByIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdC8vIHZGcm9tIGFuZCB2VG8gcG9pbnQgaW4gb3Bwb3NpdGUgZGlyZWN0aW9uc1xuXG5cdFx0XHRyID0gMDtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gLSB2RnJvbS55O1xuXHRcdFx0XHR0aGlzLl95ID0gdkZyb20ueDtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gLSB2RnJvbS56O1xuXHRcdFx0XHR0aGlzLl96ID0gdkZyb20ueTtcblx0XHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApOyAvLyBpbmxpbmVkIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIFZlY3RvcjNcblxuXHRcdFx0dGhpcy5feCA9IHZGcm9tLnkgKiB2VG8ueiAtIHZGcm9tLnogKiB2VG8ueTtcblx0XHRcdHRoaXMuX3kgPSB2RnJvbS56ICogdlRvLnggLSB2RnJvbS54ICogdlRvLno7XG5cdFx0XHR0aGlzLl96ID0gdkZyb20ueCAqIHZUby55IC0gdkZyb20ueSAqIHZUby54O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9XG5cblx0YW5nbGVUbyggcSApIHtcblxuXHRcdHJldHVybiAyICogTWF0aC5hY29zKCBNYXRoLmFicyggTWF0aFV0aWxzLmNsYW1wKCB0aGlzLmRvdCggcSApLCAtIDEsIDEgKSApICk7XG5cblx0fVxuXG5cdHJvdGF0ZVRvd2FyZHMoIHEsIHN0ZXAgKSB7XG5cblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApO1xuXG5cdFx0aWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzO1xuXG5cdFx0Y29uc3QgdCA9IE1hdGgubWluKCAxLCBzdGVwIC8gYW5nbGUgKTtcblxuXHRcdHRoaXMuc2xlcnAoIHEsIHQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpZGVudGl0eSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMSApO1xuXG5cdH1cblxuXHRpbnZlcnQoKSB7XG5cblx0XHQvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XG5cblx0fVxuXG5cdGNvbmp1Z2F0ZSgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRvdCggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdztcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7XG5cblx0fVxuXG5cdGxlbmd0aCgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93ICk7XG5cblx0fVxuXG5cdG5vcm1hbGl6ZSgpIHtcblxuXHRcdGxldCBsID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdGlmICggbCA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdHRoaXMuX3ogPSAwO1xuXHRcdFx0dGhpcy5fdyA9IDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsID0gMSAvIGw7XG5cblx0XHRcdHRoaXMuX3ggPSB0aGlzLl94ICogbDtcblx0XHRcdHRoaXMuX3kgPSB0aGlzLl95ICogbDtcblx0XHRcdHRoaXMuX3ogPSB0aGlzLl96ICogbDtcblx0XHRcdHRoaXMuX3cgPSB0aGlzLl93ICogbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fVxuXG5cdHByZW11bHRpcGx5KCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH1cblxuXHRtdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHRjb25zdCBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdGNvbnN0IHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNsZXJwKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHRjb25zdCB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXG5cblx0XHRsZXQgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xuXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcblxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB3O1xuXHRcdFx0dGhpcy5feCA9IHg7XG5cdFx0XHR0aGlzLl95ID0geTtcblx0XHRcdHRoaXMuX3ogPSB6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGNvbnN0IHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTtcblxuXHRcdGlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRjb25zdCBzID0gMSAtIHQ7XG5cdFx0XHR0aGlzLl93ID0gcyAqIHcgKyB0ICogdGhpcy5fdztcblx0XHRcdHRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94O1xuXHRcdFx0dGhpcy5feSA9IHMgKiB5ICsgdCAqIHRoaXMuX3k7XG5cdFx0XHR0aGlzLl96ID0gcyAqIHogKyB0ICogdGhpcy5fejtcblxuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIHNxclNpbkhhbGZUaGV0YSApO1xuXHRcdGNvbnN0IGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0Y29uc3QgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcblxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkge1xuXG5cdFx0dGhpcy5jb3B5KCBxYSApLnNsZXJwKCBxYiwgdCApO1xuXG5cdH1cblxuXHRlcXVhbHMoIHF1YXRlcm5pb24gKSB7XG5cblx0XHRyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xuXG5cdFx0dGhpcy5feCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMuX3kgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLl96ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy5fdyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxuXG59XG5cblF1YXRlcm5pb24ucHJvdG90eXBlLmlzUXVhdGVybmlvbiA9IHRydWU7XG5cbmNsYXNzIFZlY3RvcjMge1xuXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cblx0fVxuXG5cdHNldCggeCwgeSwgeiApIHtcblxuXHRcdGlmICggeiA9PT0gdW5kZWZpbmVkICkgeiA9IHRoaXMuejsgLy8gc3ByaXRlLnNjYWxlLnNldCh4LHkpXG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFgoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFkoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFooIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH1cblxuXHRjb3B5KCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkU2NhbGVkVmVjdG9yKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3ViKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHkoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseUV1bGVyKCBldWxlciApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDQuc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0fVxuXG5cdGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24kNC5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0fVxuXG5cdGFwcGx5TWF0cml4MyggbSApIHtcblxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseU5vcm1hbE1hdHJpeCggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4MyggbSApLm5vcm1hbGl6ZSgpO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0Y29uc3QgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7XG5cblx0XHR0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7XG5cdFx0dGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICkgKiB3O1xuXHRcdHRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YXBwbHlRdWF0ZXJuaW9uKCBxICkge1xuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHRjb25zdCBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHRjb25zdCBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcblx0XHRjb25zdCBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHRjb25zdCBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHRjb25zdCBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG5cdFx0dGhpcy54ID0gaXggKiBxdyArIGl3ICogLSBxeCArIGl5ICogLSBxeiAtIGl6ICogLSBxeTtcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6O1xuXHRcdHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdH1cblxuXHR1bnByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHR9XG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uKCBtICkge1xuXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxuXHRcdC8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvblxuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH1cblxuXHRkaXZpZGUoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcExlbmd0aCggbWluLCBtYXggKSB7XG5cblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fVxuXG5cdGZsb29yKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2VpbCgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJvdW5kKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm91bmRUb1plcm8oKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRuZWdhdGUoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkb3QoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH1cblxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bGVycFZlY3RvcnMoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggPSB2MS54ICsgKCB2Mi54IC0gdjEueCApICogYWxwaGE7XG5cdFx0dGhpcy55ID0gdjEueSArICggdjIueSAtIHYxLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiA9IHYxLnogKyAoIHYyLnogLSB2MS56ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjcm9zcyggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB0aGlzLCB2ICk7XG5cblx0fVxuXG5cdGNyb3NzVmVjdG9ycyggYSwgYiApIHtcblxuXHRcdGNvbnN0IGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0Y29uc3QgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcblxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHByb2plY3RPblZlY3RvciggdiApIHtcblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdi5sZW5ndGhTcSgpO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCApO1xuXG5cdFx0Y29uc3Qgc2NhbGFyID0gdi5kb3QoIHRoaXMgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdiApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9XG5cblx0cHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0X3ZlY3RvciRjLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IkYyApO1xuXG5cdH1cblxuXHRyZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IkYy5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XG5cblx0fVxuXG5cdGFuZ2xlVG8oIHYgKSB7XG5cblx0XHRjb25zdCBkZW5vbWluYXRvciA9IE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkgcmV0dXJuIE1hdGguUEkgLyAyO1xuXG5cdFx0Y29uc3QgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gZGVub21pbmF0b3I7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggTWF0aFV0aWxzLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUbyggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH1cblxuXHRkaXN0YW5jZVRvU3F1YXJlZCggdiApIHtcblxuXHRcdGNvbnN0IGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH1cblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbVNwaGVyaWNhbCggcyApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoIHMucmFkaXVzLCBzLnBoaSwgcy50aGV0YSApO1xuXG5cdH1cblxuXHRzZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHRjb25zdCBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcGhpICkgKiByYWRpdXM7XG5cblx0XHR0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggdGhldGEgKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcGhpICkgKiByYWRpdXM7XG5cdFx0dGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUN5bGluZHJpY2FsKCBjICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKCBjLnJhZGl1cywgYy50aGV0YSwgYy55ICk7XG5cblx0fVxuXG5cdHNldEZyb21DeWxpbmRyaWNhbENvb3JkcyggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHRcdHRoaXMueCA9IHJhZGl1cyAqIE1hdGguc2luKCB0aGV0YSApO1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICkge1xuXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAxMiBdO1xuXHRcdHRoaXMueSA9IGVbIDEzIF07XG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tTWF0cml4U2NhbGUoIG0gKSB7XG5cblx0XHRjb25zdCBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0Y29uc3Qgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRoaXMueCA9IHN4O1xuXHRcdHRoaXMueSA9IHN5O1xuXHRcdHRoaXMueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW4oIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeDNDb2x1bW4oIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDMgKTtcblxuXHR9XG5cblx0ZXF1YWxzKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcblxuXHR9XG5cblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyYW5kb20oKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJhbmRvbSgpO1xuXHRcdHRoaXMueSA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy56ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3IzLnByb3RvdHlwZS5pc1ZlY3RvcjMgPSB0cnVlO1xuXG5jb25zdCBfdmVjdG9yJGMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfcXVhdGVybmlvbiQ0ID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xuXG5jbGFzcyBCb3gzIHtcblxuXHRjb25zdHJ1Y3RvciggbWluID0gbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKSwgbWF4ID0gbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKSApIHtcblxuXHRcdHRoaXMubWluID0gbWluO1xuXHRcdHRoaXMubWF4ID0gbWF4O1xuXG5cdH1cblxuXHRzZXQoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUFycmF5KCBhcnJheSApIHtcblxuXHRcdGxldCBtaW5YID0gKyBJbmZpbml0eTtcblx0XHRsZXQgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0bGV0IG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0bGV0IG1heFggPSAtIEluZmluaXR5O1xuXHRcdGxldCBtYXhZID0gLSBJbmZpbml0eTtcblx0XHRsZXQgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdGNvbnN0IHggPSBhcnJheVsgaSBdO1xuXHRcdFx0Y29uc3QgeSA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0Y29uc3QgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGxldCBtaW5YID0gKyBJbmZpbml0eTtcblx0XHRsZXQgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0bGV0IG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0bGV0IG1heFggPSAtIEluZmluaXR5O1xuXHRcdGxldCBtYXhZID0gLSBJbmZpbml0eTtcblx0XHRsZXQgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdGNvbnN0IHkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0Y29uc3QgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0Y29uc3QgaGFsZlNpemUgPSBfdmVjdG9yJGIuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdGNvcHkoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUVtcHR5KCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGlzRW1wdHkoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH1cblxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fVxuXG5cdGdldFNpemUoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fVxuXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcblxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIGZhbHNlICk7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfYm94JDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKTtcblx0XHRcdF9ib3gkMy5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR0aGlzLnVuaW9uKCBfYm94JDMgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeU9iamVjdCggY2hpbGRyZW5bIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0cG9pbnQueiA8IHRoaXMubWluLnogfHwgcG9pbnQueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55ICYmXG5cdFx0XHR0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejtcblxuXHR9XG5cblx0Z2V0UGFyYW1ldGVyKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICksXG5cdFx0XHQoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56IClcblx0XHQpO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucy5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdGJveC5tYXgueiA8IHRoaXMubWluLnogfHwgYm94Lm1pbi56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIF92ZWN0b3IkYiApO1xuXG5cdFx0Ly8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuXG5cdFx0cmV0dXJuIF92ZWN0b3IkYi5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdGxldCBtaW4sIG1heDtcblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICggbWluIDw9IC0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IC0gcGxhbmUuY29uc3RhbnQgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgYm94IGNlbnRlciBhbmQgZXh0ZW50c1xuXHRcdHRoaXMuZ2V0Q2VudGVyKCBfY2VudGVyICk7XG5cdFx0X2V4dGVudHMuc3ViVmVjdG9ycyggdGhpcy5tYXgsIF9jZW50ZXIgKTtcblxuXHRcdC8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpblxuXHRcdF92MCQyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmEsIF9jZW50ZXIgKTtcblx0XHRfdjEkNy5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBfY2VudGVyICk7XG5cdFx0X3YyJDMuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgX2NlbnRlciApO1xuXG5cdFx0Ly8gY29tcHV0ZSBlZGdlIHZlY3RvcnMgZm9yIHRyaWFuZ2xlXG5cdFx0X2YwLnN1YlZlY3RvcnMoIF92MSQ3LCBfdjAkMiApO1xuXHRcdF9mMS5zdWJWZWN0b3JzKCBfdjIkMywgX3YxJDcgKTtcblx0XHRfZjIuc3ViVmVjdG9ycyggX3YwJDIsIF92MiQzICk7XG5cblx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHQvLyBtYWtlIGFuIGF4aXMgdGVzdGluZyBvZiBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSBhYWJiIGFnYWluc3QgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgdHJpYW5nbGUgPSA5IGF4aXMgb2Ygc2VwYXJhdGlvblxuXHRcdC8vIGF4aXNfaWogPSB1X2kgeCBmX2ogKHUwLCB1MSwgdTIgPSBmYWNlIG5vcm1hbHMgb2YgYWFiYiA9IHgseSx6IGF4ZXMgdmVjdG9ycyBzaW5jZSBhYWJiIGlzIGF4aXMgYWxpZ25lZClcblx0XHRsZXQgYXhlcyA9IFtcblx0XHRcdDAsIC0gX2YwLnosIF9mMC55LCAwLCAtIF9mMS56LCBfZjEueSwgMCwgLSBfZjIueiwgX2YyLnksXG5cdFx0XHRfZjAueiwgMCwgLSBfZjAueCwgX2YxLnosIDAsIC0gX2YxLngsIF9mMi56LCAwLCAtIF9mMi54LFxuXHRcdFx0LSBfZjAueSwgX2YwLngsIDAsIC0gX2YxLnksIF9mMS54LCAwLCAtIF9mMi55LCBfZjIueCwgMFxuXHRcdF07XG5cdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCQyLCBfdjEkNywgX3YyJDMsIF9leHRlbnRzICkgKSB7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdGF4ZXMgPSBbIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgXTtcblx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwJDIsIF92MSQ3LCBfdjIkMywgX2V4dGVudHMgKSApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxuXHRcdF90cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIF9mMCwgX2YxICk7XG5cdFx0YXhlcyA9IFsgX3RyaWFuZ2xlTm9ybWFsLngsIF90cmlhbmdsZU5vcm1hbC55LCBfdHJpYW5nbGVOb3JtYWwueiBdO1xuXG5cdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCQyLCBfdjEkNywgX3YyJDMsIF9leHRlbnRzICk7XG5cblx0fVxuXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdGNvbnN0IGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkYi5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdH1cblxuXHRnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHQvL3RhcmdldCA9IG5ldyBTcGhlcmUoKTsgLy8gcmVtb3ZlZCB0byBhdm9pZCBjeWNsaWMgZGVwZW5kZW5jeVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcblxuXHRcdHRhcmdldC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIF92ZWN0b3IkYiApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0aW50ZXJzZWN0KCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR1bmlvbiggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XG5cblx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XG5cblx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xuXHRcdF9wb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcblx0XHRfcG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0X3BvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxuXHRcdF9wb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcblx0XHRfcG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0X3BvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxuXHRcdF9wb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcblx0XHRfcG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTExXG5cblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIF9wb2ludHMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn1cblxuQm94My5wcm90b3R5cGUuaXNCb3gzID0gdHJ1ZTtcblxuY29uc3QgX3BvaW50cyA9IFtcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKClcbl07XG5cbmNvbnN0IF92ZWN0b3IkYiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX2JveCQzID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xuXG4vLyB0cmlhbmdsZSBjZW50ZXJlZCB2ZXJ0aWNlc1xuXG5jb25zdCBfdjAkMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MSQ3ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3YyJDMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbi8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXG5jb25zdCBfZjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF9jZW50ZXIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZXh0ZW50cyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90cmlhbmdsZU5vcm1hbCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90ZXN0QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcywgdjAsIHYxLCB2MiwgZXh0ZW50cyApIHtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0X3Rlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdC8vIHByb2plY3QgdGhlIGFhYmIgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0Y29uc3QgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCBfdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIF90ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggX3Rlc3RBeGlzLnogKTtcblx0XHQvLyBwcm9qZWN0IGFsbCAzIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHRjb25zdCBwMCA9IHYwLmRvdCggX3Rlc3RBeGlzICk7XG5cdFx0Y29uc3QgcDEgPSB2MS5kb3QoIF90ZXN0QXhpcyApO1xuXHRcdGNvbnN0IHAyID0gdjIuZG90KCBfdGVzdEF4aXMgKTtcblx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxuXHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0Ly8gcG9pbnRzIG9mIHRoZSBwcm9qZWN0ZWQgdHJpYW5nbGUgYXJlIG91dHNpZGUgdGhlIHByb2plY3RlZCBoYWxmLWxlbmd0aCBvZiB0aGUgYWFiYlxuXHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwZXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuY29uc3QgX2JveCQyID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xuY29uc3QgX3YxJDYgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdG9GYXJ0aGVzdFBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3RvUG9pbnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIFNwaGVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGNlbnRlciA9IG5ldyBWZWN0b3IzKCksIHJhZGl1cyA9IC0gMSApIHtcblxuXHRcdHRoaXMuY2VudGVyID0gY2VudGVyO1xuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG5cdH1cblxuXHRzZXQoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9ib3gkMi5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IG1heFJhZGl1c1NxID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNwaGVyZSApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0aXNFbXB0eSgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDwgMCApO1xuXG5cdH1cblxuXHRtYWtlRW1wdHkoKSB7XG5cblx0XHR0aGlzLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHR0aGlzLnJhZGl1cyA9IC0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0Y29uc3QgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNQbGFuZSggcGxhbmUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5jZW50ZXIgKSApIDw9IHRoaXMucmFkaXVzO1xuXG5cdH1cblxuXHRjbGFtcFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRnZXRCb3VuZGluZ0JveCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdC8vIEVtcHR5IHNwaGVyZSBwcm9kdWNlcyBlbXB0eSBib3VuZGluZyBib3hcblx0XHRcdHRhcmdldC5tYWtlRW1wdHkoKTtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTtcblx0XHR0YXJnZXQuZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVBvaW50KCBwb2ludCApIHtcblxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p1ai9NYXRoR2VvTGliL2Jsb2IvMjk0MGI5OWI5OWNmZTU3NWRkNDUxMDNlZjIwZjQwMTlkZWUxNWI1NC9zcmMvR2VvbWV0cnkvU3BoZXJlLmNwcCNMNjQ5LUw2NzFcblxuXHRcdF90b1BvaW50LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLmNlbnRlciApO1xuXG5cdFx0Y29uc3QgbGVuZ3RoU3EgPSBfdG9Qb2ludC5sZW5ndGhTcSgpO1xuXG5cdFx0aWYgKCBsZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoIGxlbmd0aFNxICk7XG5cdFx0XHRjb25zdCBtaXNzaW5nUmFkaXVzSGFsZiA9ICggbGVuZ3RoIC0gdGhpcy5yYWRpdXMgKSAqIDAuNTtcblxuXHRcdFx0Ly8gTnVkZ2UgdGhpcyBzcGhlcmUgdG93YXJkcyB0aGUgdGFyZ2V0IHBvaW50LiBBZGQgaGFsZiB0aGUgbWlzc2luZyBkaXN0YW5jZSB0byByYWRpdXMsXG5cdFx0XHQvLyBhbmQgdGhlIG90aGVyIGhhbGYgdG8gcG9zaXRpb24uIFRoaXMgZ2l2ZXMgYSB0aWdodGVyIGVuY2xvc3VyZSwgaW5zdGVhZCBvZiBpZlxuXHRcdFx0Ly8gdGhlIHdob2xlIG1pc3NpbmcgZGlzdGFuY2Ugd2VyZSBqdXN0IGFkZGVkIHRvIHJhZGl1cy5cblxuXHRcdFx0dGhpcy5jZW50ZXIuYWRkKCBfdG9Qb2ludC5tdWx0aXBseVNjYWxhciggbWlzc2luZ1JhZGl1c0hhbGYgLyBsZW5ndGggKSApO1xuXHRcdFx0dGhpcy5yYWRpdXMgKz0gbWlzc2luZ1JhZGl1c0hhbGY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dW5pb24oIHNwaGVyZSApIHtcblxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p1ai9NYXRoR2VvTGliL2Jsb2IvMjk0MGI5OWI5OWNmZTU3NWRkNDUxMDNlZjIwZjQwMTlkZWUxNWI1NC9zcmMvR2VvbWV0cnkvU3BoZXJlLmNwcCNMNzU5LUw3NjlcblxuXHRcdC8vIFRvIGVuY2xvc2UgYW5vdGhlciBzcGhlcmUgaW50byB0aGlzIHNwaGVyZSwgd2Ugb25seSBuZWVkIHRvIGVuY2xvc2UgdHdvIHBvaW50czpcblx0XHQvLyAxKSBFbmNsb3NlIHRoZSBmYXJ0aGVzdCBwb2ludCBvbiB0aGUgb3RoZXIgc3BoZXJlIGludG8gdGhpcyBzcGhlcmUuXG5cdFx0Ly8gMikgRW5jbG9zZSB0aGUgb3Bwb3NpdGUgcG9pbnQgb2YgdGhlIGZhcnRoZXN0IHBvaW50IGludG8gdGhpcyBzcGhlcmUuXG5cblx0XHRfdG9GYXJ0aGVzdFBvaW50LnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMuY2VudGVyICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3YxJDYuY29weSggc3BoZXJlLmNlbnRlciApLmFkZCggX3RvRmFydGhlc3RQb2ludCApICk7XG5cdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdjEkNi5jb3B5KCBzcGhlcmUuY2VudGVyICkuc3ViKCBfdG9GYXJ0aGVzdFBvaW50ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yJGEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfc2VnQ2VudGVyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3NlZ0RpciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9kaWZmID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfZWRnZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZWRnZTIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIFJheSB7XG5cblx0Y29uc3RydWN0b3IoIG9yaWdpbiA9IG5ldyBWZWN0b3IzKCksIGRpcmVjdGlvbiA9IG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApIHtcblxuXHRcdHRoaXMub3JpZ2luID0gb3JpZ2luO1xuXHRcdHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXG5cdH1cblxuXHRzZXQoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggcmF5ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhdCggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9XG5cblx0bG9va0F0KCB2ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyZWNhc3QoIHQgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCB0aGlzLmF0KCB0LCBfdmVjdG9yJGEgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHRjb25zdCBkaXJlY3Rpb25EaXN0YW5jZSA9IHRhcmdldC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0Y29uc3QgZGlyZWN0aW9uRGlzdGFuY2UgPSBfdmVjdG9yJGEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9XG5cblx0XHRfdmVjdG9yJGEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRyZXR1cm4gX3ZlY3RvciRhLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdH1cblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcblx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0X3NlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0X3NlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRfZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1YiggX3NlZ0NlbnRlciApO1xuXG5cdFx0Y29uc3Qgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRjb25zdCBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggX3NlZ0RpciApO1xuXHRcdGNvbnN0IGIwID0gX2RpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdGNvbnN0IGIxID0gLSBfZGlmZi5kb3QoIF9zZWdEaXIgKTtcblx0XHRjb25zdCBjID0gX2RpZmYubGVuZ3RoU3EoKTtcblx0XHRjb25zdCBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdGxldCBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdGlmICggZGV0ID4gMCApIHtcblxuXHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XG5cdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXG5cblx0XHRcdFx0XHRcdGNvbnN0IGludkRldCA9IDEgLyBkZXQ7XG5cdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICogYjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0czEgPSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0czEgPSAtIHNlZ0V4dGVudDtcblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdC8vIHJlZ2lvbiA0XG5cblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdHMwID0gMDtcblx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDJcblxuXHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50O1xuXHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdH1cblxuXHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xuXG5cdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggX3NlZ0RpciApLm11bHRpcGx5U2NhbGFyKCBzMSApLmFkZCggX3NlZ0NlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNxckRpc3Q7XG5cblx0fVxuXG5cdGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCB0YXJnZXQgKSB7XG5cblx0XHRfdmVjdG9yJGEuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTtcblx0XHRjb25zdCB0Y2EgPSBfdmVjdG9yJGEuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdGNvbnN0IGQyID0gX3ZlY3RvciRhLmRvdCggX3ZlY3RvciRhICkgLSB0Y2EgKiB0Y2E7XG5cdFx0Y29uc3QgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzO1xuXG5cdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XG5cblx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdGNvbnN0IHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxuXHRcdGNvbnN0IHQxID0gdGNhICsgdGhjO1xuXG5cdFx0Ly8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXG5cdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheTpcblx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXG5cdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdGlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCB0YXJnZXQgKTtcblxuXHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKSB7XG5cblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcblxuXHR9XG5cblx0aW50ZXJzZWN0UGxhbmUoIHBsYW5lLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUoIHBsYW5lICk7XG5cblx0XHRpZiAoIHQgPT09IG51bGwgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQsIHRhcmdldCApO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzUGxhbmUoIHBsYW5lICkge1xuXG5cdFx0Ly8gY2hlY2sgaWYgdGhlIHJheSBsaWVzIG9uIHRoZSBwbGFuZSBmaXJzdFxuXG5cdFx0Y29uc3QgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RCb3goIGJveCwgdGFyZ2V0ICkge1xuXG5cdFx0bGV0IHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0Y29uc3QgaW52ZGlyeCA9IDEgLyB0aGlzLmRpcmVjdGlvbi54LFxuXHRcdFx0aW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55LFxuXHRcdFx0aW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56O1xuXG5cdFx0Y29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgX3ZlY3RvciRhICkgIT09IG51bGw7XG5cblx0fVxuXG5cdGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCApIHtcblxuXHRcdC8vIENvbXB1dGUgdGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLlxuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcblxuXHRcdF9lZGdlMS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0X2VkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRfbm9ybWFsJDEuY3Jvc3NWZWN0b3JzKCBfZWRnZTEsIF9lZGdlMiApO1xuXG5cdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXG5cdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxuXHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0bGV0IERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggX25vcm1hbCQxICk7XG5cdFx0bGV0IHNpZ247XG5cblx0XHRpZiAoIERkTiA+IDAgKSB7XG5cblx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRzaWduID0gMTtcblxuXHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XG5cblx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHREZE4gPSAtIERkTjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0X2RpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRjb25zdCBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBfZWRnZTIuY3Jvc3NWZWN0b3JzKCBfZGlmZiwgX2VkZ2UyICkgKTtcblxuXHRcdC8vIGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0aWYgKCBEZFF4RTIgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMS5jcm9zcyggX2RpZmYgKSApO1xuXG5cdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdGNvbnN0IFFkTiA9IC0gc2lnbiAqIF9kaWZmLmRvdCggX25vcm1hbCQxICk7XG5cblx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdHJldHVybiB0aGlzLmF0KCBRZE4gLyBEZE4sIHRhcmdldCApO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeDQgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcblx0XHR0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeDQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHJheSApIHtcblxuXHRcdHJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIE1hdHJpeDQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIDEsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0XTtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGlkZW50aXR5KCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9XG5cblx0Y29weSggbSApIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTtcblx0XHR0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTtcblx0XHR0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07XG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb3B5UG9zaXRpb24oIG0gKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21NYXRyaXgzKCBtICkge1xuXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyAzIF0sIG1lWyA2IF0sIDAsXG5cdFx0XHRtZVsgMSBdLCBtZVsgNCBdLCBtZVsgNyBdLCAwLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDUgXSwgbWVbIDggXSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHQvLyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHJlZmxlY3Rpb24gbWF0cmljZXNcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHRjb25zdCBzY2FsZVggPSAxIC8gX3YxJDUuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHNjYWxlWSA9IDEgLyBfdjEkNS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0Y29uc3Qgc2NhbGVaID0gMSAvIF92MSQ1LnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xuXHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xuXHRcdHRlWyAzIF0gPSAwO1xuXG5cdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDcgXSA9IDA7XG5cblx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXIoIGV1bGVyICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56O1xuXHRcdGNvbnN0IGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0Y29uc3QgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApO1xuXG5cdFx0aWYgKCBldWxlci5vcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdGNvbnN0IGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHRjb25zdCBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdGNvbnN0IGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSAtIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSAtIGEgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGRlICsgY2YgKiBiO1xuXG5cdFx0XHR0ZVsgMSBdID0gY2YgKyBkZSAqIGI7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gZGYgLSBjZSAqIGI7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGEgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHRjb25zdCBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XG5cblx0XHRcdHRlWyAxIF0gPSBjICogZjtcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcblx0XHRcdHRlWyA2IF0gPSBiICogYztcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHRjb25zdCBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBmO1xuXHRcdFx0dGVbIDggXSA9IGQgKiBlO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWMgKiBmICsgYmQ7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gYWQgKiBmIC0gYmM7XG5cblx0XHRcdHRlWyAyIF0gPSBiYyAqIGYgLSBhZDtcblx0XHRcdHRlWyA2IF0gPSBiICogZTtcblx0XHRcdHRlWyAxMCBdID0gYmQgKiBmICsgYWM7XG5cblx0XHR9XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb21wb3NlKCBfemVybywgcSwgX29uZSApO1xuXG5cdH1cblxuXHRsb29rQXQoIGV5ZSwgdGFyZ2V0LCB1cCApIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdF96LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XG5cblx0XHRpZiAoIF96Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxuXG5cdFx0XHRfei56ID0gMTtcblxuXHRcdH1cblxuXHRcdF96Lm5vcm1hbGl6ZSgpO1xuXHRcdF94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7XG5cblx0XHRpZiAoIF94Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7XG5cblx0XHRcdFx0X3oueCArPSAwLjAwMDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X3oueiArPSAwLjAwMDE7XG5cblx0XHRcdH1cblxuXHRcdFx0X3oubm9ybWFsaXplKCk7XG5cdFx0XHRfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApO1xuXG5cdFx0fVxuXG5cdFx0X3gubm9ybWFsaXplKCk7XG5cdFx0X3kuY3Jvc3NWZWN0b3JzKCBfeiwgX3ggKTtcblxuXHRcdHRlWyAwIF0gPSBfeC54OyB0ZVsgNCBdID0gX3kueDsgdGVbIDggXSA9IF96Lng7XG5cdFx0dGVbIDEgXSA9IF94Lnk7IHRlWyA1IF0gPSBfeS55OyB0ZVsgOSBdID0gX3oueTtcblx0XHR0ZVsgMiBdID0gX3guejsgdGVbIDYgXSA9IF95Lno7IHRlWyAxMCBdID0gX3ouejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggbSwgbiApIHtcblxuXHRcdGlmICggbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCBuICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fVxuXG5cdHByZW11bHRpcGx5KCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH1cblxuXHRtdWx0aXBseU1hdHJpY2VzKCBhLCBiICkge1xuXG5cdFx0Y29uc3QgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdGNvbnN0IGJlID0gYi5lbGVtZW50cztcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgNCBdLCBhMTMgPSBhZVsgOCBdLCBhMTQgPSBhZVsgMTIgXTtcblx0XHRjb25zdCBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XG5cdFx0Y29uc3QgYTQxID0gYWVbIDMgXSwgYTQyID0gYWVbIDcgXSwgYTQzID0gYWVbIDExIF0sIGE0NCA9IGFlWyAxNSBdO1xuXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0Y29uc3QgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XG5cdFx0Y29uc3QgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDYgXSwgYjMzID0gYmVbIDEwIF0sIGIzNCA9IGJlWyAxNCBdO1xuXHRcdGNvbnN0IGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGV0ZXJtaW5hbnQoKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBuMTEgPSB0ZVsgMCBdLCBuMTIgPSB0ZVsgNCBdLCBuMTMgPSB0ZVsgOCBdLCBuMTQgPSB0ZVsgMTIgXTtcblx0XHRjb25zdCBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcblx0XHRjb25zdCBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0Y29uc3QgbjQxID0gdGVbIDMgXSwgbjQyID0gdGVbIDcgXSwgbjQzID0gdGVbIDExIF0sIG40NCA9IHRlWyAxNSBdO1xuXG5cdFx0Ly9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnRcblx0XHQvLyggYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtIClcblxuXHRcdHJldHVybiAoXG5cdFx0XHRuNDEgKiAoXG5cdFx0XHRcdCsgbjE0ICogbjIzICogbjMyXG5cdFx0XHRcdCAtIG4xMyAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTQgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTIgKiBuMjMgKiBuMzRcblx0XHRcdCkgK1xuXHRcdFx0bjQyICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yMyAqIG4zNFxuXHRcdFx0XHQgLSBuMTEgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjE0ICogbjIxICogbjMzXG5cdFx0XHRcdCAtIG4xMyAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTMgKiBuMjQgKiBuMzFcblx0XHRcdFx0IC0gbjE0ICogbjIzICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40MyAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjExICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xNCAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgKyBuMTIgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjE0ICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMiAqIG4yNCAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDQgKiAoXG5cdFx0XHRcdC0gbjEzICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMSAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgKyBuMTEgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIxICogbjMyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjMgKiBuMzFcblx0XHRcdClcblxuXHRcdCk7XG5cblx0fVxuXG5cdHRyYW5zcG9zZSgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRsZXQgdG1wO1xuXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFBvc2l0aW9uKCB4LCB5LCB6ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0dGVbIDEyIF0gPSB4Lng7XG5cdFx0XHR0ZVsgMTMgXSA9IHgueTtcblx0XHRcdHRlWyAxNCBdID0geC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGVbIDEyIF0gPSB4O1xuXHRcdFx0dGVbIDEzIF0gPSB5O1xuXHRcdFx0dGVbIDE0IF0gPSB6O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGludmVydCgpIHtcblxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSwgbjQxID0gdGVbIDMgXSxcblx0XHRcdG4xMiA9IHRlWyA0IF0sIG4yMiA9IHRlWyA1IF0sIG4zMiA9IHRlWyA2IF0sIG40MiA9IHRlWyA3IF0sXG5cdFx0XHRuMTMgPSB0ZVsgOCBdLCBuMjMgPSB0ZVsgOSBdLCBuMzMgPSB0ZVsgMTAgXSwgbjQzID0gdGVbIDExIF0sXG5cdFx0XHRuMTQgPSB0ZVsgMTIgXSwgbjI0ID0gdGVbIDEzIF0sIG4zNCA9IHRlWyAxNCBdLCBuNDQgPSB0ZVsgMTUgXSxcblxuXHRcdFx0dDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LFxuXHRcdFx0dDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LFxuXHRcdFx0dDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LFxuXHRcdFx0dDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0O1xuXG5cdFx0Y29uc3QgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSByZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgKTtcblxuXHRcdGNvbnN0IGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCB2ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7XG5cblx0XHR0ZVsgMCBdICo9IHg7IHRlWyA0IF0gKj0geTsgdGVbIDggXSAqPSB6O1xuXHRcdHRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7XG5cdFx0dGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7XG5cdFx0dGVbIDMgXSAqPSB4OyB0ZVsgNyBdICo9IHk7IHRlWyAxMSBdICo9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0TWF4U2NhbGVPbkF4aXMoKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTtcblx0XHRjb25zdCBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVbIDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTtcblx0XHRjb25zdCBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH1cblxuXHRtYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25YKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCBjLCAtIHMsIDAsXG5cdFx0XHQwLCBzLCBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25ZKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdCBjLCAwLCBzLCAwLFxuXHRcdFx0IDAsIDEsIDAsIDAsXG5cdFx0XHQtIHMsIDAsIGMsIDAsXG5cdFx0XHQgMCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25aKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25BeGlzKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCBhbmdsZSApO1xuXHRcdGNvbnN0IHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblx0XHRjb25zdCB0ID0gMSAtIGM7XG5cdFx0Y29uc3QgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejtcblx0XHRjb25zdCB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5O1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCxcblx0XHRcdHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcblx0XHRcdHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVNoZWFyKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0Y29uc3QgeCA9IHF1YXRlcm5pb24uX3gsIHkgPSBxdWF0ZXJuaW9uLl95LCB6ID0gcXVhdGVybmlvbi5feiwgdyA9IHF1YXRlcm5pb24uX3c7XG5cdFx0Y29uc3QgeDIgPSB4ICsgeCxcdHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0Y29uc3QgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHRjb25zdCB5eSA9IHkgKiB5MiwgeXogPSB5ICogejIsIHp6ID0geiAqIHoyO1xuXHRcdGNvbnN0IHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHRjb25zdCBzeCA9IHNjYWxlLngsIHN5ID0gc2NhbGUueSwgc3ogPSBzY2FsZS56O1xuXG5cdFx0dGVbIDAgXSA9ICggMSAtICggeXkgKyB6eiApICkgKiBzeDtcblx0XHR0ZVsgMSBdID0gKCB4eSArIHd6ICkgKiBzeDtcblx0XHR0ZVsgMiBdID0gKCB4eiAtIHd5ICkgKiBzeDtcblx0XHR0ZVsgMyBdID0gMDtcblxuXHRcdHRlWyA0IF0gPSAoIHh5IC0gd3ogKSAqIHN5O1xuXHRcdHRlWyA1IF0gPSAoIDEgLSAoIHh4ICsgenogKSApICogc3k7XG5cdFx0dGVbIDYgXSA9ICggeXogKyB3eCApICogc3k7XG5cdFx0dGVbIDcgXSA9IDA7XG5cblx0XHR0ZVsgOCBdID0gKCB4eiArIHd5ICkgKiBzejtcblx0XHR0ZVsgOSBdID0gKCB5eiAtIHd4ICkgKiBzejtcblx0XHR0ZVsgMTAgXSA9ICggMSAtICggeHggKyB5eSApICkgKiBzejtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHR0ZVsgMTIgXSA9IHBvc2l0aW9uLng7XG5cdFx0dGVbIDEzIF0gPSBwb3NpdGlvbi55O1xuXHRcdHRlWyAxNCBdID0gcG9zaXRpb24uejtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRsZXQgc3ggPSBfdjEkNS5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcblx0XHRjb25zdCBzeSA9IF92MSQ1LnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHN6ID0gX3YxJDUuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xuXG5cdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRjb25zdCBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0aWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4O1xuXG5cdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xuXHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRwb3NpdGlvbi56ID0gdGVbIDE0IF07XG5cblx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxuXHRcdF9tMSQyLmNvcHkoIHRoaXMgKTtcblxuXHRcdGNvbnN0IGludlNYID0gMSAvIHN4O1xuXHRcdGNvbnN0IGludlNZID0gMSAvIHN5O1xuXHRcdGNvbnN0IGludlNaID0gMSAvIHN6O1xuXG5cdFx0X20xJDIuZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcblx0XHRfbTEkMi5lbGVtZW50c1sgMSBdICo9IGludlNYO1xuXHRcdF9tMSQyLmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRfbTEkMi5lbGVtZW50c1sgNCBdICo9IGludlNZO1xuXHRcdF9tMSQyLmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XG5cdFx0X20xJDIuZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdF9tMSQyLmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XG5cdFx0X20xJDIuZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcblx0XHRfbTEkMi5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMiApO1xuXG5cdFx0c2NhbGUueCA9IHN4O1xuXHRcdHNjYWxlLnkgPSBzeTtcblx0XHRzY2FsZS56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHRjb25zdCB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0Y29uc3QgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdGNvbnN0IGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHRjb25zdCBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdGNvbnN0IGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiO1x0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7XHR0ZVsgMTQgXSA9IGQ7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdGNvbnN0IGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdGNvbnN0IHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdGNvbnN0IHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHRjb25zdCB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XG5cdFx0Y29uc3QgeiA9ICggZmFyICsgbmVhciApICogcDtcblxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IDA7XHR0ZVsgMTIgXSA9IC0geDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwO1x0dGVbIDEzIF0gPSAtIHk7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gLSAyICogcDtcdHRlWyAxNCBdID0gLSB6O1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IDA7XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBtYXRyaXggKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn1cblxuTWF0cml4NC5wcm90b3R5cGUuaXNNYXRyaXg0ID0gdHJ1ZTtcblxuY29uc3QgX3YxJDUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbTEkMiA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcbmNvbnN0IF96ZXJvID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMCwgMCApO1xuY29uc3QgX29uZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcbmNvbnN0IF94ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3kgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfeiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX21hdHJpeCQxID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX3F1YXRlcm5pb24kMyA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcblxuY2xhc3MgRXVsZXIge1xuXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwLCBvcmRlciA9IEV1bGVyLkRlZmF1bHRPcmRlciApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0fVxuXG5cdGdldCB4KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0fVxuXG5cdHNldCB4KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCB5KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0fVxuXG5cdHNldCB5KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCB6KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0fVxuXG5cdHNldCB6KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCBvcmRlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9vcmRlcjtcblxuXHR9XG5cblx0c2V0IG9yZGVyKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdH1cblxuXHRzZXQoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTtcblxuXHR9XG5cblx0Y29weSggZXVsZXIgKSB7XG5cblx0XHR0aGlzLl94ID0gZXVsZXIuX3g7XG5cdFx0dGhpcy5feSA9IGV1bGVyLl95O1xuXHRcdHRoaXMuX3ogPSBldWxlci5fejtcblx0XHR0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHRjb25zdCBjbGFtcCA9IE1hdGhVdGlscy5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHRjb25zdCB0ZSA9IG0uZWxlbWVudHM7XG5cdFx0Y29uc3QgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHRjb25zdCBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdGNvbnN0IG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0b3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVonOlxuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhaJzpcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWSc6XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdaWVgnOlxuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpYJzpcblxuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OTk5ICkge1xuXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1haWSc6XG5cblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OTk5ICkge1xuXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0X21hdHJpeCQxLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tYXRyaXgkMSwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fVxuXG5cdHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0X3F1YXRlcm5pb24kMy5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiQzLCBuZXdPcmRlciApO1xuXG5cdH1cblxuXHRlcXVhbHMoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH1cblxuXHRmcm9tQXJyYXkoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHR0b1ZlY3RvcjMoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0aWYgKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdFx0cmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxuXG59XG5cbkV1bGVyLnByb3RvdHlwZS5pc0V1bGVyID0gdHJ1ZTtcblxuRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7XG5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5jbGFzcyBMYXllcnMge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5tYXNrID0gMSB8IDA7XG5cblx0fVxuXG5cdHNldCggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fVxuXG5cdGVuYWJsZSggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH1cblxuXHRlbmFibGVBbGwoKSB7XG5cblx0XHR0aGlzLm1hc2sgPSAweGZmZmZmZmZmIHwgMDtcblxuXHR9XG5cblx0dG9nZ2xlKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fVxuXG5cdGRpc2FibGUoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTtcblxuXHR9XG5cblx0ZGlzYWJsZUFsbCgpIHtcblxuXHRcdHRoaXMubWFzayA9IDA7XG5cblx0fVxuXG5cdHRlc3QoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59XG5cbmxldCBfb2JqZWN0M0RJZCA9IDA7XG5cbmNvbnN0IF92MSQ0ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9xMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5jb25zdCBfbTEkMSA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX3Bvc2l0aW9uJDMgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3NjYWxlJDIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3F1YXRlcm5pb24kMiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmNvbnN0IF94QXhpcyA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5jb25zdCBfeUF4aXMgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuY29uc3QgX3pBeGlzID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuY29uc3QgX2FkZGVkRXZlbnQgPSB7IHR5cGU6ICdhZGRlZCcgfTtcbmNvbnN0IF9yZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICdyZW1vdmVkJyB9O1xuXG5mdW5jdGlvbiBPYmplY3QzRCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9vYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdPYmplY3QzRCc7XG5cblx0dGhpcy5wYXJlbnQgPSBudWxsO1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cblx0dGhpcy51cCA9IE9iamVjdDNELkRlZmF1bHRVcC5jbG9uZSgpO1xuXG5cdGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0Y29uc3Qgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0Y29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdGNvbnN0IHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5fb25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTtcblx0cXVhdGVybmlvbi5fb25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0cG9zaXRpb246IHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcG9zaXRpb25cblx0XHR9LFxuXHRcdHJvdGF0aW9uOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHJvdGF0aW9uXG5cdFx0fSxcblx0XHRxdWF0ZXJuaW9uOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cblx0XHR9LFxuXHRcdHNjYWxlOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHNjYWxlXG5cdFx0fSxcblx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXG5cdFx0fSxcblx0XHRub3JtYWxNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTtcblx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xuXG5cdHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxufVxuXG5PYmplY3QzRC5EZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXG5PYmplY3QzRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT2JqZWN0M0QsXG5cblx0aXNPYmplY3QzRDogdHJ1ZSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cdG9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSggbWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdF9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBfcTEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gd29ybGQgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXHRcdC8vIG1ldGhvZCBhc3N1bWVzIG5vIHJvdGF0ZWQgcGFyZW50XG5cblx0XHRfcTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggX3ExICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF94QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF95QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF96QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0X3YxJDQuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmFkZCggX3YxJDQubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWDogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3hBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3lBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3pBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0bG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR3b3JsZFRvTG9jYWw6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIF9tMSQxLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKSApO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHQvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIHBhcmVudChzKVxuXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0X3RhcmdldC5jb3B5KCB4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdGFyZ2V0LnNldCggeCwgeSwgeiApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0X3Bvc2l0aW9uJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgfHwgdGhpcy5pc0xpZ2h0ICkge1xuXG5cdFx0XHRfbTEkMS5sb29rQXQoIF9wb3NpdGlvbiQzLCBfdGFyZ2V0LCB0aGlzLnVwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfbTEkMS5sb29rQXQoIF90YXJnZXQsIF9wb3NpdGlvbiQzLCB0aGlzLnVwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXG5cdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdF9tMSQxLmV4dHJhY3RSb3RhdGlvbiggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRfcTEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEuaW52ZXJ0KCkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW5cXCd0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLicsIG9iamVjdCApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdG9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfYWRkZWRFdmVudCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4nLCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfcmVtb3ZlZEV2ZW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5jaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9yZW1vdmVkRXZlbnQgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cblx0fSxcblxuXHRhdHRhY2g6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0Ly8gYWRkcyBvYmplY3QgYXMgYSBjaGlsZCBvZiB0aGlzLCB3aGlsZSBtYWludGFpbmluZyB0aGUgb2JqZWN0J3Mgd29ybGQgdHJhbnNmb3JtXG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0X20xJDEuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXG5cdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRvYmplY3QucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0XHRfbTEkMS5tdWx0aXBseSggb2JqZWN0LnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LmFwcGx5TWF0cml4NCggX20xJDEgKTtcblxuXHRcdHRoaXMuYWRkKCBvYmplY3QgKTtcblxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIHRydWUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlQcm9wZXJ0eTogZnVuY3Rpb24gKCBuYW1lLCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdGNvbnN0IG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24kMywgdGFyZ2V0LCBfc2NhbGUkMiApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiQzLCBfcXVhdGVybmlvbiQyLCB0YXJnZXQgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0Y29uc3QgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggZVsgOCBdLCBlWyA5IF0sIGVbIDEwIF0gKS5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdHJheWNhc3Q6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZVZpc2libGU6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcblxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRmb3JjZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgY2hpbGRyZW5cblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVXb3JsZE1hdHJpeDogZnVuY3Rpb24gKCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHtcblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCB1cGRhdGVQYXJlbnRzID09PSB0cnVlICYmIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0cGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjaGlsZHJlblxuXG5cdFx0aWYgKCB1cGRhdGVDaGlsZHJlbiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCB0cnVlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRjb25zdCBvdXRwdXQgPSB7fTtcblxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3Rcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9LFxuXHRcdFx0XHRzaGFwZXM6IHt9LFxuXHRcdFx0XHRza2VsZXRvbnM6IHt9LFxuXHRcdFx0XHRhbmltYXRpb25zOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxuXG5cdFx0Y29uc3Qgb2JqZWN0ID0ge307XG5cblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgKSBvYmplY3QucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHRvYmplY3QubGF5ZXJzID0gdGhpcy5sYXllcnMubWFzaztcblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdC8vIG9iamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzXG5cblx0XHRpZiAoIHRoaXMuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRvYmplY3QudHlwZSA9ICdJbnN0YW5jZWRNZXNoJztcblx0XHRcdG9iamVjdC5jb3VudCA9IHRoaXMuY291bnQ7XG5cdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSB0aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpO1xuXHRcdFx0aWYgKCB0aGlzLmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IHRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7XG5cblx0XHRcdGlmICggbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW1lbnQudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc01lc2ggfHwgdGhpcy5pc0xpbmUgfHwgdGhpcy5pc1BvaW50cyApIHtcblxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTtcblxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzU2tpbm5lZE1lc2ggKSB7XG5cblx0XHRcdG9iamVjdC5iaW5kTW9kZSA9IHRoaXMuYmluZE1vZGU7XG5cdFx0XHRvYmplY3QuYmluZE1hdHJpeCA9IHRoaXMuYmluZE1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRcdGlmICggdGhpcy5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5za2VsZXRvbnMsIHRoaXMuc2tlbGV0b24gKTtcblxuXHRcdFx0XHRvYmplY3Quc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uLnV1aWQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRjb25zdCB1dWlkcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHV1aWRzO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRvYmplY3QuY2hpbGRyZW4gPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5hbmltYXRpb25zLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG9iamVjdC5hbmltYXRpb25zID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zWyBpIF07XG5cblx0XHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMucHVzaCggc2VyaWFsaXplKCBtZXRhLmFuaW1hdGlvbnMsIGFuaW1hdGlvbiApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zdCBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7XG5cdFx0XHRjb25zdCBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXHRcdFx0Y29uc3Qgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5zaGFwZXMgKTtcblx0XHRcdGNvbnN0IHNrZWxldG9ucyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2tlbGV0b25zICk7XG5cdFx0XHRjb25zdCBhbmltYXRpb25zID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5hbmltYXRpb25zICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xuXHRcdFx0aWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzO1xuXHRcdFx0aWYgKCBzaGFwZXMubGVuZ3RoID4gMCApIG91dHB1dC5zaGFwZXMgPSBzaGFwZXM7XG5cdFx0XHRpZiAoIHNrZWxldG9ucy5sZW5ndGggPiAwICkgb3V0cHV0LnNrZWxldG9ucyA9IHNrZWxldG9ucztcblx0XHRcdGlmICggYW5pbWF0aW9ucy5sZW5ndGggPiAwICkgb3V0cHV0LmFuaW1hdGlvbnMgPSBhbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgPSB0cnVlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcblx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gc291cmNlLnJvdGF0aW9uLm9yZGVyO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07XG5cdFx0XHRcdHRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBfdmVjdG9yMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92ZWN0b3IyJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpO1xuXG5jbGFzcyBQbGFuZSB7XG5cblx0Y29uc3RydWN0b3IoIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIGNvbnN0YW50ID0gMCApIHtcblxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMubm9ybWFsID0gbm9ybWFsO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcblxuXHR9XG5cblx0c2V0KCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudHMoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7XG5cblx0XHRjb25zdCBub3JtYWwgPSBfdmVjdG9yMS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIF92ZWN0b3IyJDEuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7XG5cblx0XHQvLyBROiBzaG91bGQgYW4gZXJyb3IgYmUgdGhyb3duIGlmIG5vcm1hbCBpcyB6ZXJvIChlLmcuIGRlZ2VuZXJhdGUgcGxhbmUpP1xuXG5cdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHRjb25zdCBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bmVnYXRlKCkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xuXG5cdH1cblxuXHRkaXN0YW5jZVRvU3BoZXJlKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0fVxuXG5cdHByb2plY3RQb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgKS5hZGQoIHBvaW50ICk7XG5cblx0fVxuXG5cdGludGVyc2VjdExpbmUoIGxpbmUsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaW50ZXJzZWN0TGluZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggX3ZlY3RvcjEgKTtcblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0aWYgKCB0IDwgMCB8fCB0ID4gMSApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCBsaW5lLnN0YXJ0ICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNMaW5lKCBsaW5lICkge1xuXG5cdFx0Ly8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuXG5cblx0XHRjb25zdCBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApO1xuXHRcdGNvbnN0IGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9XG5cblx0Y29wbGFuYXJQb2ludCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XG5cblx0XHRjb25zdCBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBfbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRjb25zdCByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggX3ZlY3RvcjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59XG5cblBsYW5lLnByb3RvdHlwZS5pc1BsYW5lID0gdHJ1ZTtcblxuY29uc3QgX3YwJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjEkMyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MiQyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3YzJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF92YWIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdmFjID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZiYyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92YXAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdmJwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZjcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgVHJpYW5nbGUge1xuXG5cdGNvbnN0cnVjdG9yKCBhID0gbmV3IFZlY3RvcjMoKSwgYiA9IG5ldyBWZWN0b3IzKCksIGMgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0dGhpcy5hID0gYTtcblx0XHR0aGlzLmIgPSBiO1xuXHRcdHRoaXMuYyA9IGM7XG5cblx0fVxuXG5cdHN0YXRpYyBnZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdF92MCQxLnN1YlZlY3RvcnMoIGEsIGIgKTtcblx0XHR0YXJnZXQuY3Jvc3MoIF92MCQxICk7XG5cblx0XHRjb25zdCB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xuXHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCB0YXJnZXRMZW5ndGhTcSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdH1cblxuXHQvLyBzdGF0aWMvaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGN1bGF0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlc1xuXHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxuXHRzdGF0aWMgZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRfdjIkMi5zdWJWZWN0b3JzKCBwb2ludCwgYSApO1xuXG5cdFx0Y29uc3QgZG90MDAgPSBfdjAkMS5kb3QoIF92MCQxICk7XG5cdFx0Y29uc3QgZG90MDEgPSBfdjAkMS5kb3QoIF92MSQzICk7XG5cdFx0Y29uc3QgZG90MDIgPSBfdjAkMS5kb3QoIF92MiQyICk7XG5cdFx0Y29uc3QgZG90MTEgPSBfdjEkMy5kb3QoIF92MSQzICk7XG5cdFx0Y29uc3QgZG90MTIgPSBfdjEkMy5kb3QoIF92MiQyICk7XG5cblx0XHRjb25zdCBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRpZiAoIGRlbm9tID09PSAwICkge1xuXG5cdFx0XHQvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT9cblx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAtIDIsIC0gMSwgLSAxICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHRjb25zdCB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XG5cdFx0Y29uc3QgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xuXG5cdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMSAtIHUgLSB2LCB2LCB1ICk7XG5cblx0fVxuXG5cdHN0YXRpYyBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgX3YzJDEgKTtcblxuXHRcdHJldHVybiAoIF92MyQxLnggPj0gMCApICYmICggX3YzJDEueSA+PSAwICkgJiYgKCAoIF92MyQxLnggKyBfdjMkMS55ICkgPD0gMSApO1xuXG5cdH1cblxuXHRzdGF0aWMgZ2V0VVYoIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzLCB0YXJnZXQgKSB7XG5cblx0XHR0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHAxLCBwMiwgcDMsIF92MyQxICk7XG5cblx0XHR0YXJnZXQuc2V0KCAwLCAwICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYxLCBfdjMkMS54ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYyLCBfdjMkMS55ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYzLCBfdjMkMS56ICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRzdGF0aWMgaXNGcm9udEZhY2luZyggYSwgYiwgYywgZGlyZWN0aW9uICkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIGEsIGIgKTtcblxuXHRcdC8vIHN0cmljdGx5IGZyb250IGZhY2luZ1xuXHRcdHJldHVybiAoIF92MCQxLmNyb3NzKCBfdjEkMyApLmRvdCggZGlyZWN0aW9uICkgPCAwICkgPyB0cnVlIDogZmFsc2U7XG5cblx0fVxuXG5cdHNldCggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cblx0Y29weSggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRBcmVhKCkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcblx0XHRfdjEkMy5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIF92MCQxLmNyb3NzKCBfdjEkMyApLmxlbmd0aCgpICogMC41O1xuXG5cdH1cblxuXHRnZXRNaWRwb2ludCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApLmFkZCggdGhpcy5jICkubXVsdGlwbHlTY2FsYXIoIDEgLyAzICk7XG5cblx0fVxuXG5cdGdldE5vcm1hbCggdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XG5cblx0fVxuXG5cdGdldFBsYW5lKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBQbGFuZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9XG5cblx0Z2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH1cblxuXHRnZXRVViggcG9pbnQsIHV2MSwgdXYyLCB1djMsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRVViggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHV2MSwgdXYyLCB1djMsIHRhcmdldCApO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH1cblxuXHRpc0Zyb250RmFjaW5nKCBkaXJlY3Rpb24gKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuaXNGcm9udEZhY2luZyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgZGlyZWN0aW9uICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1RyaWFuZ2xlKCB0aGlzICk7XG5cblx0fVxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHAsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgYSA9IHRoaXMuYSwgYiA9IHRoaXMuYiwgYyA9IHRoaXMuYztcblx0XHRsZXQgdiwgdztcblxuXHRcdC8vIGFsZ29yaXRobSB0aGFua3MgdG8gUmVhbC1UaW1lIENvbGxpc2lvbiBEZXRlY3Rpb24gYnkgQ2hyaXN0ZXIgRXJpY3Nvbixcblx0XHQvLyBwdWJsaXNoZWQgYnkgTW9yZ2FuIEthdWZtYW5uIFB1Ymxpc2hlcnMsIChjKSAyMDA1IEVsc2V2aWVyIEluYy4sXG5cdFx0Ly8gdW5kZXIgdGhlIGFjY29tcGFueWluZyBsaWNlbnNlOyBzZWUgY2hhcHRlciA1LjEuNSBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uXG5cdFx0Ly8gYmFzaWNhbGx5LCB3ZSdyZSBkaXN0aW5ndWlzaGluZyB3aGljaCBvZiB0aGUgdm9yb25vaSByZWdpb25zIG9mIHRoZSB0cmlhbmdsZVxuXHRcdC8vIHRoZSBwb2ludCBsaWVzIGluIHdpdGggdGhlIG1pbmltdW0gYW1vdW50IG9mIHJlZHVuZGFudCBjb21wdXRhdGlvbi5cblxuXHRcdF92YWIuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdF92YWMuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF92YXAuc3ViVmVjdG9ycyggcCwgYSApO1xuXHRcdGNvbnN0IGQxID0gX3ZhYi5kb3QoIF92YXAgKTtcblx0XHRjb25zdCBkMiA9IF92YWMuZG90KCBfdmFwICk7XG5cdFx0aWYgKCBkMSA8PSAwICYmIGQyIDw9IDAgKSB7XG5cblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQTsgYmFyeWNlbnRyaWMgY29vcmRzICgxLCAwLCAwKVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICk7XG5cblx0XHR9XG5cblx0XHRfdmJwLnN1YlZlY3RvcnMoIHAsIGIgKTtcblx0XHRjb25zdCBkMyA9IF92YWIuZG90KCBfdmJwICk7XG5cdFx0Y29uc3QgZDQgPSBfdmFjLmRvdCggX3ZicCApO1xuXHRcdGlmICggZDMgPj0gMCAmJiBkNCA8PSBkMyApIHtcblxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEsIDApXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGIgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHZjID0gZDEgKiBkNCAtIGQzICogZDI7XG5cdFx0aWYgKCB2YyA8PSAwICYmIGQxID49IDAgJiYgZDMgPD0gMCApIHtcblxuXHRcdFx0diA9IGQxIC8gKCBkMSAtIGQzICk7XG5cdFx0XHQvLyBlZGdlIHJlZ2lvbiBvZiBBQjsgYmFyeWNlbnRyaWMgY29vcmRzICgxLXYsIHYsIDApXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKTtcblxuXHRcdH1cblxuXHRcdF92Y3Auc3ViVmVjdG9ycyggcCwgYyApO1xuXHRcdGNvbnN0IGQ1ID0gX3ZhYi5kb3QoIF92Y3AgKTtcblx0XHRjb25zdCBkNiA9IF92YWMuZG90KCBfdmNwICk7XG5cdFx0aWYgKCBkNiA+PSAwICYmIGQ1IDw9IGQ2ICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMCwgMSlcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYyApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdmIgPSBkNSAqIGQyIC0gZDEgKiBkNjtcblx0XHRpZiAoIHZiIDw9IDAgJiYgZDIgPj0gMCAmJiBkNiA8PSAwICkge1xuXG5cdFx0XHR3ID0gZDIgLyAoIGQyIC0gZDYgKTtcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdywgMCwgdylcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdmEgPSBkMyAqIGQ2IC0gZDUgKiBkNDtcblx0XHRpZiAoIHZhIDw9IDAgJiYgKCBkNCAtIGQzICkgPj0gMCAmJiAoIGQ1IC0gZDYgKSA+PSAwICkge1xuXG5cdFx0XHRfdmJjLnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdHcgPSAoIGQ0IC0gZDMgKSAvICggKCBkNCAtIGQzICkgKyAoIGQ1IC0gZDYgKSApO1xuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQkM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMS13LCB3KVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICkuYWRkU2NhbGVkVmVjdG9yKCBfdmJjLCB3ICk7IC8vIGVkZ2UgcmVnaW9uIG9mIEJDXG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHJlZ2lvblxuXHRcdGNvbnN0IGRlbm9tID0gMSAvICggdmEgKyB2YiArIHZjICk7XG5cdFx0Ly8gdSA9IHZhICogZGVub21cblx0XHR2ID0gdmIgKiBkZW5vbTtcblx0XHR3ID0gdmMgKiBkZW5vbTtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xuXG5cdH1cblxuXHRlcXVhbHMoIHRyaWFuZ2xlICkge1xuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApO1xuXG5cdH1cblxufVxuXG5sZXQgbWF0ZXJpYWxJZCA9IDA7XG5cbmZ1bmN0aW9uIE1hdGVyaWFsKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogbWF0ZXJpYWxJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZm9nID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBmYWxzZTtcblxuXHR0aGlzLm9wYWNpdHkgPSAxO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XG5cblx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XG5cdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblxuXHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xuXHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XG5cdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gMHhmZjtcblx0dGhpcy5zdGVuY2lsRnVuYyA9IEFsd2F5c1N0ZW5jaWxGdW5jO1xuXHR0aGlzLnN0ZW5jaWxSZWYgPSAwO1xuXHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IDB4ZmY7XG5cdHRoaXMuc3RlbmNpbEZhaWwgPSBLZWVwU3RlbmNpbE9wO1xuXHR0aGlzLnN0ZW5jaWxaRmFpbCA9IEtlZXBTdGVuY2lsT3A7XG5cdHRoaXMuc3RlbmNpbFpQYXNzID0gS2VlcFN0ZW5jaWxPcDtcblx0dGhpcy5zdGVuY2lsV3JpdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDtcblx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7XG5cdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcblxuXHR0aGlzLnNoYWRvd1NpZGUgPSBudWxsO1xuXG5cdHRoaXMuY29sb3JXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5wcmVjaXNpb24gPSBudWxsOyAvLyBvdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbFxuXG5cdHRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7XG5cblx0dGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcblxuXHR0aGlzLmFscGhhVGVzdCA9IDA7XG5cdHRoaXMuYWxwaGFUb0NvdmVyYWdlID0gZmFsc2U7XG5cdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XG5cblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLnRvbmVNYXBwZWQgPSB0cnVlO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCAvKiBzaGFkZXJvYmplY3QsIHJlbmRlcmVyICovICkge30sXG5cblx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKTtcblxuXHR9LFxuXG5cdHNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7XG5cblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IFxcJycgKyBrZXkgKyAnXFwnIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuJyApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBpZiBzaGFkaW5nIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3Jcblx0XHRcdGlmICgga2V5ID09PSAnc2hhZGluZycgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIG5ld1ZhbHVlID09PSBGbGF0U2hhZGluZyApID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogXFwnJyArIGtleSArICdcXCcgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gbmV3VmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Y29uc3QgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcblxuXHRcdGlmICggdGhpcy5zaGVlbiAmJiB0aGlzLnNoZWVuLmlzQ29sb3IgKSBkYXRhLnNoZWVuID0gdGhpcy5zaGVlbi5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xuXHRcdGlmICggdGhpcy5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJjb2F0ID0gdGhpcy5jbGVhcmNvYXQ7XG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzcztcblxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRNYXAgJiYgdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmNsZWFyY29hdE1hcCA9IHRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwICYmIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCAmJiB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsTWFwID0gdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tYXRjYXAgJiYgdGhpcy5tYXRjYXAuaXNUZXh0dXJlICkgZGF0YS5tYXRjYXAgPSB0aGlzLm1hdGNhcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdGhpcy5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5hb01hcCA9IHRoaXMuYW9NYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTtcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblx0XHRcdGRhdGEucmVmcmFjdGlvblJhdGlvID0gdGhpcy5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdGlmICggdGhpcy5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBkYXRhLmNvbWJpbmUgPSB0aGlzLmNvbWJpbmU7XG5cdFx0XHRpZiAoIHRoaXMuZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBkYXRhLmVudk1hcEludGVuc2l0eSA9IHRoaXMuZW52TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmdyYWRpZW50TWFwID0gdGhpcy5ncmFkaWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTtcblx0XHRpZiAoIHRoaXMuc2hhZG93U2lkZSAhPT0gbnVsbCApIGRhdGEuc2hhZG93U2lkZSA9IHRoaXMuc2hhZG93U2lkZTtcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0aWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nO1xuXHRcdGlmICggdGhpcy5zaWRlICE9PSBGcm9udFNpZGUgKSBkYXRhLnNpZGUgPSB0aGlzLnNpZGU7XG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyApIGRhdGEudmVydGV4Q29sb3JzID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cdFx0ZGF0YS5jb2xvcldyaXRlID0gdGhpcy5jb2xvcldyaXRlO1xuXG5cdFx0ZGF0YS5zdGVuY2lsV3JpdGUgPSB0aGlzLnN0ZW5jaWxXcml0ZTtcblx0XHRkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgPSB0aGlzLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRnVuYyA9IHRoaXMuc3RlbmNpbEZ1bmM7XG5cdFx0ZGF0YS5zdGVuY2lsUmVmID0gdGhpcy5zdGVuY2lsUmVmO1xuXHRcdGRhdGEuc3RlbmNpbEZ1bmNNYXNrID0gdGhpcy5zdGVuY2lsRnVuY01hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRmFpbCA9IHRoaXMuc3RlbmNpbEZhaWw7XG5cdFx0ZGF0YS5zdGVuY2lsWkZhaWwgPSB0aGlzLnN0ZW5jaWxaRmFpbDtcblx0XHRkYXRhLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzO1xuXG5cdFx0Ly8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKVxuXHRcdGlmICggdGhpcy5yb3RhdGlvbiAmJiB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIGRhdGEucG9seWdvbk9mZnNldCA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IDAgKSBkYXRhLnBvbHlnb25PZmZzZXRGYWN0b3IgPSB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICYmIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLmFscGhhVG9Db3ZlcmFnZSA9PT0gdHJ1ZSApIGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gdGhpcy5hbHBoYVRvQ292ZXJhZ2U7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5tb3JwaE5vcm1hbHMgPT09IHRydWUgKSBkYXRhLm1vcnBoTm9ybWFscyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIGRhdGEudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCB0aGlzLnRvbmVNYXBwZWQgPT09IGZhbHNlICkgZGF0YS50b25lTWFwcGVkID0gZmFsc2U7XG5cblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxuXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IHNvdXJjZS5zdGVuY2lsV3JpdGVNYXNrO1xuXHRcdHRoaXMuc3RlbmNpbEZ1bmMgPSBzb3VyY2Uuc3RlbmNpbEZ1bmM7XG5cdFx0dGhpcy5zdGVuY2lsUmVmID0gc291cmNlLnN0ZW5jaWxSZWY7XG5cdFx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSBzb3VyY2Uuc3RlbmNpbEZ1bmNNYXNrO1xuXHRcdHRoaXMuc3RlbmNpbEZhaWwgPSBzb3VyY2Uuc3RlbmNpbEZhaWw7XG5cdFx0dGhpcy5zdGVuY2lsWkZhaWwgPSBzb3VyY2Uuc3RlbmNpbFpGYWlsO1xuXHRcdHRoaXMuc3RlbmNpbFpQYXNzID0gc291cmNlLnN0ZW5jaWxaUGFzcztcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZSA9IHNvdXJjZS5zdGVuY2lsV3JpdGU7XG5cblx0XHRjb25zdCBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXM7XG5cdFx0bGV0IGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc3QgbiA9IHNyY1BsYW5lcy5sZW5ndGg7XG5cdFx0XHRkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lcztcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjtcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXG5cdFx0dGhpcy5zaGFkb3dTaWRlID0gc291cmNlLnNoYWRvd1NpZGU7XG5cblx0XHR0aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTtcblxuXHRcdHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjtcblxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0O1xuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZztcblxuXHRcdHRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDtcblx0XHR0aGlzLmFscGhhVG9Db3ZlcmFnZSA9IHNvdXJjZS5hbHBoYVRvQ292ZXJhZ2U7XG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cblx0XHR0aGlzLnRvbmVNYXBwZWQgPSBzb3VyY2UudG9uZU1hcHBlZDtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggTWF0ZXJpYWwucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX2NvbG9yS2V5d29yZHMgPSB7ICdhbGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRixcblx0J2JlaWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdibGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6IDB4OEEyQkUyLFxuXHQnYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsXG5cdCdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAweDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLFxuXHQnZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVlbic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZCLCAnZGFya21hZ2VudGEnOiAweDhCMDA4Qixcblx0J2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4Rixcblx0J2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJGNEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VEMSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMyxcblx0J2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVwc2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsXG5cdCdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLFxuXHQnZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXknOiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsXG5cdCdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZGRkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJibHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsXG5cdCdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsXG5cdCdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdodGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAweEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdDRUZBLFxuXHQnbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZFMCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLFxuXHQnbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsXG5cdCdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdyZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmluZ2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQyxcblx0J21lZGl1bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3JlYW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRCNSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsXG5cdCduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsXG5cdCdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwgJ3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3BhcGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LFxuXHQncGVydSc6IDB4Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWJlY2NhcHVycGxlJzogMHg2NjMzOTksICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93bic6IDB4QkM4RjhGLFxuXHQncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSxcblx0J3NpZW5uYSc6IDB4QTA1MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUnOiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAsICdzbm93JzogMHhGRkZBRkEsXG5cdCdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVlJzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUnOiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsXG5cdCd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07XG5cbmNvbnN0IF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XG5jb25zdCBfaHNsQiA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5mdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xuXG5cdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdGlmICggdCA+IDEgKSB0IC09IDE7XG5cdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcblx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xuXHRyZXR1cm4gcDtcblxufVxuXG5mdW5jdGlvbiBTUkdCVG9MaW5lYXIoIGMgKSB7XG5cblx0cmV0dXJuICggYyA8IDAuMDQwNDUgKSA/IGMgKiAwLjA3NzM5OTM4MDggOiBNYXRoLnBvdyggYyAqIDAuOTQ3ODY3Mjk4NiArIDAuMDUyMTMyNzAxNCwgMi40ICk7XG5cbn1cblxuZnVuY3Rpb24gTGluZWFyVG9TUkdCKCBjICkge1xuXG5cdHJldHVybiAoIGMgPCAwLjAwMzEzMDggKSA/IGMgKiAxMi45MiA6IDEuMDU1ICogKCBNYXRoLnBvdyggYywgMC40MTY2NiApICkgLSAwLjA1NTtcblxufVxuXG5jbGFzcyBDb2xvciB7XG5cblx0Y29uc3RydWN0b3IoIHIsIGcsIGIgKSB7XG5cblx0XHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmdcblx0XHRcdHJldHVybiB0aGlzLnNldCggciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7XG5cblx0fVxuXG5cdHNldCggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEhleCggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFJHQiggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cdFx0aCA9IE1hdGhVdGlscy5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRzID0gTWF0aFV0aWxzLmNsYW1wKCBzLCAwLCAxICk7XG5cdFx0bCA9IE1hdGhVdGlscy5jbGFtcCggbCwgMCwgMSApO1xuXG5cdFx0aWYgKCBzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApO1xuXHRcdFx0Y29uc3QgcSA9ICggMiAqIGwgKSAtIHA7XG5cblx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xuXHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0U3R5bGUoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0bGV0IG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKChbXlxcKV0qKVxcKS8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gcmdiIC8gaHNsXG5cblx0XHRcdGxldCBjb2xvcjtcblx0XHRcdGNvbnN0IG5hbWUgPSBtWyAxIF07XG5cdFx0XHRjb25zdCBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyooPzosXFxzKihcXGQqXFwuP1xcZCspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA0IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL15cXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHRcdGNhc2UgJ2hzbGEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQqXFwuP1xcZCspXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUpXG5cdFx0XHRcdFx0XHRjb25zdCBoID0gcGFyc2VGbG9hdCggY29sb3JbIDEgXSApIC8gMzYwO1xuXHRcdFx0XHRcdFx0Y29uc3QgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0Y29uc3QgbCA9IHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBtID0gL15cXCMoW0EtRmEtZlxcZF0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIGhleCBjb2xvclxuXG5cdFx0XHRjb25zdCBoZXggPSBtWyAxIF07XG5cdFx0XHRjb25zdCBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKCBzdHlsZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbG9yTmFtZSggc3R5bGUgKSB7XG5cblx0XHQvLyBjb2xvciBrZXl3b3Jkc1xuXHRcdGNvbnN0IGhleCA9IF9jb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0aWYgKCBoZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gcmVkXG5cdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyB1bmtub3duIGNvbG9yXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiApO1xuXG5cdH1cblxuXHRjb3B5KCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yLnI7XG5cdFx0dGhpcy5nID0gY29sb3IuZztcblx0XHR0aGlzLmIgPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHlHYW1tYVRvTGluZWFyKCBjb2xvciwgZ2FtbWFGYWN0b3IgPSAyLjAgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb3B5TGluZWFyVG9HYW1tYSggY29sb3IsIGdhbW1hRmFjdG9yID0gMi4wICkge1xuXG5cdFx0Y29uc3Qgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAxLjAgLyBnYW1tYUZhY3RvciApIDogMS4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29udmVydEdhbW1hVG9MaW5lYXIoIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0dGhpcy5jb3B5R2FtbWFUb0xpbmVhciggdGhpcywgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb252ZXJ0TGluZWFyVG9HYW1tYSggZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHR0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKCB0aGlzLCBnYW1tYUZhY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHlTUkdCVG9MaW5lYXIoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gU1JHQlRvTGluZWFyKCBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weUxpbmVhclRvU1JHQiggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcblx0XHR0aGlzLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb252ZXJ0U1JHQlRvTGluZWFyKCkge1xuXG5cdFx0dGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29udmVydExpbmVhclRvU1JHQigpIHtcblxuXHRcdHRoaXMuY29weUxpbmVhclRvU1JHQiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldEhleCgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH1cblxuXHRnZXRIZXhTdHJpbmcoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fVxuXG5cdGdldEhTTCggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7XG5cdFx0Y29uc3QgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdGxldCBodWUsIHNhdHVyYXRpb247XG5cdFx0Y29uc3QgbGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDtcblxuXHRcdGlmICggbWluID09PSBtYXggKSB7XG5cblx0XHRcdGh1ZSA9IDA7XG5cdFx0XHRzYXR1cmF0aW9uID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuXG5cdFx0XHRzYXR1cmF0aW9uID0gbGlnaHRuZXNzIDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWluICk7XG5cblx0XHRcdHN3aXRjaCAoIG1heCApIHtcblxuXHRcdFx0XHRjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRlbHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRodWUgLz0gNjtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5oID0gaHVlO1xuXHRcdHRhcmdldC5zID0gc2F0dXJhdGlvbjtcblx0XHR0YXJnZXQubCA9IGxpZ2h0bmVzcztcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fVxuXG5cdGdldFN0eWxlKCkge1xuXG5cdFx0cmV0dXJuICdyZ2IoJyArICggKCB0aGlzLnIgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmcgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmIgKiAyNTUgKSB8IDAgKSArICcpJztcblxuXHR9XG5cblx0b2Zmc2V0SFNMKCBoLCBzLCBsICkge1xuXG5cdFx0dGhpcy5nZXRIU0woIF9oc2xBICk7XG5cblx0XHRfaHNsQS5oICs9IGg7IF9oc2xBLnMgKz0gczsgX2hzbEEubCArPSBsO1xuXG5cdFx0dGhpcy5zZXRIU0woIF9oc2xBLmgsIF9oc2xBLnMsIF9oc2xBLmwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGQoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkQ29sb3JzKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxhciggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVNjYWxhciggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBDb2xvcnMoIGNvbG9yMSwgY29sb3IyLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgKCBjb2xvcjIuciAtIGNvbG9yMS5yICkgKiBhbHBoYTtcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArICggY29sb3IyLmcgLSBjb2xvcjEuZyApICogYWxwaGE7XG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyAoIGNvbG9yMi5iIC0gY29sb3IxLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBIU0woIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuZ2V0SFNMKCBfaHNsQSApO1xuXHRcdGNvbG9yLmdldEhTTCggX2hzbEIgKTtcblxuXHRcdGNvbnN0IGggPSBNYXRoVXRpbHMubGVycCggX2hzbEEuaCwgX2hzbEIuaCwgYWxwaGEgKTtcblx0XHRjb25zdCBzID0gTWF0aFV0aWxzLmxlcnAoIF9oc2xBLnMsIF9oc2xCLnMsIGFscGhhICk7XG5cdFx0Y29uc3QgbCA9IE1hdGhVdGlscy5sZXJwKCBfaHNsQS5sLCBfaHNsQi5sLCBhbHBoYSApO1xuXG5cdFx0dGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIGMgKSB7XG5cblx0XHRyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZztcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5iO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xuXG5cdFx0dGhpcy5yID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy5nID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy5iID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5ub3JtYWxpemVkID09PSB0cnVlICkge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBVaW50OEFycmF5XG5cblx0XHRcdHRoaXMuciAvPSAyNTU7XG5cdFx0XHR0aGlzLmcgLz0gMjU1O1xuXHRcdFx0dGhpcy5iIC89IDI1NTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRIZXgoKTtcblxuXHR9XG5cbn1cblxuQ29sb3IuTkFNRVMgPSBfY29sb3JLZXl3b3JkcztcblxuQ29sb3IucHJvdG90eXBlLmlzQ29sb3IgPSB0cnVlO1xuQ29sb3IucHJvdG90eXBlLnIgPSAxO1xuQ29sb3IucHJvdG90eXBlLmcgPSAxO1xuQ29sb3IucHJvdG90eXBlLmIgPSAxO1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICBkZXB0aFRlc3Q6IDxib29sPixcbiAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmNsYXNzIE1lc2hCYXNpY01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZVxuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0XHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5jb25zdCBfdmVjdG9yJDkgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZlY3RvcjIgPSBuZXcgVmVjdG9yMigpO1xuXG5mdW5jdGlvbiBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0fVxuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDtcblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxuXHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRVc2FnZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudXNhZ2UgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRsZXQgY29sb3IgPSBjb2xvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHRjb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bGV0IHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0Y29uc3QgYXJyYXkgPSB0aGlzLmFycmF5O1xuXHRcdGxldCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRsZXQgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bGV0IHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRpZiAoIHRoaXMuaXRlbVNpemUgPT09IDIgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdF92ZWN0b3IyLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcblx0XHRcdFx0X3ZlY3RvcjIuYXBwbHlNYXRyaXgzKCBtICk7XG5cblx0XHRcdFx0dGhpcy5zZXRYWSggaSwgX3ZlY3RvcjIueCwgX3ZlY3RvcjIueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLml0ZW1TaXplID09PSAzICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRfdmVjdG9yJDkuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xuXHRcdFx0XHRfdmVjdG9yJDkuYXBwbHlNYXRyaXgzKCBtICk7XG5cblx0XHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlOb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS5hcHBseU5vcm1hbE1hdHJpeCggbSApO1xuXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3RvciQ5LngsIF92ZWN0b3IkOS55LCBfdmVjdG9yJDkueiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS50cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcblx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcy5hcnJheSApLFxuXHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIHRoaXMudXNhZ2UgIT09IFN0YXRpY0RyYXdVc2FnZSApIGRhdGEudXNhZ2UgPSB0aGlzLnVzYWdlO1xuXHRcdGlmICggdGhpcy51cGRhdGVSYW5nZS5vZmZzZXQgIT09IDAgfHwgdGhpcy51cGRhdGVSYW5nZS5jb3VudCAhPT0gLSAxICkgZGF0YS51cGRhdGVSYW5nZSA9IHRoaXMudXBkYXRlUmFuZ2U7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5mdW5jdGlvbiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZTtcbkZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbmZ1bmN0aW9uIGFycmF5TWF4KCBhcnJheSApIHtcblxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdGxldCBtYXggPSBhcnJheVsgMCBdO1xuXG5cdGZvciAoIGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cblx0XHRpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbWF4O1xuXG59XG5cbmNvbnN0IFRZUEVEX0FSUkFZUyA9IHtcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG5cdFVpbnQ4Q2xhbXBlZEFycmF5OiBVaW50OENsYW1wZWRBcnJheSxcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxufTtcblxuZnVuY3Rpb24gZ2V0VHlwZWRBcnJheSggdHlwZSwgYnVmZmVyICkge1xuXG5cdHJldHVybiBuZXcgVFlQRURfQVJSQVlTWyB0eXBlIF0oIGJ1ZmZlciApO1xuXG59XG5cbmxldCBfaWQgPSAwO1xuXG5jb25zdCBfbTEgPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX29iaiA9IG5ldyBPYmplY3QzRCgpO1xuY29uc3QgX29mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfYm94JDEgPSBuZXcgQm94MygpO1xuY29uc3QgX2JveE1vcnBoVGFyZ2V0cyA9IG5ldyBCb3gzKCk7XG5jb25zdCBfdmVjdG9yJDggPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9pZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHR0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gZmFsc2U7XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0dGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0c2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRcdHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWxldGVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aGFzQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gIT09IHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCA9IDAgKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9zaXRpb24uYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsLmFwcGx5Tm9ybWFsTWF0cml4KCBub3JtYWxNYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHRhbmdlbnQgPSB0aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtcblxuXHRcdGlmICggdGFuZ2VudCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0YW5nZW50LnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICk7XG5cblx0XHRcdHRhbmdlbnQubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0X20xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdF9tMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdF9vYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdF9vYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX29iai5tYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIF9vZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdHRoaXMudHJhbnNsYXRlKCBfb2Zmc2V0LngsIF9vZmZzZXQueSwgX29mZnNldC56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0cG9zaXRpb24ucHVzaCggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCAzICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gJiYgcG9zaXRpb24uaXNHTEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0IFwibWVzaC5mcnVzdHVtQ3VsbGVkXCIgdG8gXCJmYWxzZVwiLicsIHRoaXMgKTtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXQoXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5IClcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxuXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcblx0XHRcdFx0XHRfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdGlmICggdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ4LmFkZFZlY3RvcnMoIHRoaXMuYm91bmRpbmdCb3gubWluLCBfYm94JDEubWluICk7XG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IkOCApO1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguYWRkVmVjdG9ycyggdGhpcy5ib3VuZGluZ0JveC5tYXgsIF9ib3gkMS5tYXggKTtcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciQ4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gkMS5taW4gKTtcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX2JveCQxLm1heCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAmJiBwb3NpdGlvbi5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4gQWx0ZXJuYXRpdmVseSBzZXQgXCJtZXNoLmZydXN0dW1DdWxsZWRcIiB0byBcImZhbHNlXCIuJywgdGhpcyApO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldCggbmV3IFZlY3RvcjMoKSwgSW5maW5pdHkgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NpdGlvbiApIHtcblxuXHRcdFx0Ly8gZmlyc3QsIGZpbmQgdGhlIGNlbnRlciBvZiB0aGUgYm91bmRpbmcgc3BoZXJlXG5cblx0XHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnRcblxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XG5cdFx0XHRcdFx0X2JveE1vcnBoVGFyZ2V0cy5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguYWRkVmVjdG9ycyggX2JveCQxLm1pbiwgX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMS5leHBhbmRCeVBvaW50KCBfdmVjdG9yJDggKTtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ4LmFkZFZlY3RvcnMoIF9ib3gkMS5tYXgsIF9ib3hNb3JwaFRhcmdldHMubWF4ICk7XG5cdFx0XHRcdFx0XHRfYm94JDEuZXhwYW5kQnlQb2ludCggX3ZlY3RvciQ4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRfYm94JDEuZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMS5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1heCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRfYm94JDEuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kLCB0cnkgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxuXG5cdFx0XHRsZXQgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGkgKTtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yJDggKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XG5cblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdO1xuXHRcdFx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBtb3JwaEF0dHJpYnV0ZS5jb3VudDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGogKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRfb2Zmc2V0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBqICk7XG5cdFx0XHRcdFx0XHRcdF92ZWN0b3IkOC5hZGQoIF9vZmZzZXQgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yJDggKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0fSxcblxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS90YW5nZW50Lmh0bWxcblx0XHQvLyAocGVyIHZlcnRleCB0YW5nZW50cylcblxuXHRcdGlmICggaW5kZXggPT09IG51bGwgfHxcblx0XHRcdCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHxcblx0XHRcdCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHQgYXR0cmlidXRlcy51diA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0Y29uc3Qgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdGNvbnN0IHV2cyA9IGF0dHJpYnV0ZXMudXYuYXJyYXk7XG5cblx0XHRjb25zdCBuVmVydGljZXMgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMztcblxuXHRcdGlmICggYXR0cmlidXRlcy50YW5nZW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndGFuZ2VudCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDQgKiBuVmVydGljZXMgKSwgNCApICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC5hcnJheTtcblxuXHRcdGNvbnN0IHRhbjEgPSBbXSwgdGFuMiA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgblZlcnRpY2VzOyBpICsrICkge1xuXG5cdFx0XHR0YW4xWyBpIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dGFuMlsgaSBdID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHZBID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHZCID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHZDID0gbmV3IFZlY3RvcjMoKSxcblxuXHRcdFx0dXZBID0gbmV3IFZlY3RvcjIoKSxcblx0XHRcdHV2QiA9IG5ldyBWZWN0b3IyKCksXG5cdFx0XHR1dkMgPSBuZXcgVmVjdG9yMigpLFxuXG5cdFx0XHRzZGlyID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHRkaXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlVHJpYW5nbGUoIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZBLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0dkIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7XG5cdFx0XHR2Qy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYyAqIDMgKTtcblxuXHRcdFx0dXZBLmZyb21BcnJheSggdXZzLCBhICogMiApO1xuXHRcdFx0dXZCLmZyb21BcnJheSggdXZzLCBiICogMiApO1xuXHRcdFx0dXZDLmZyb21BcnJheSggdXZzLCBjICogMiApO1xuXG5cdFx0XHR2Qi5zdWIoIHZBICk7XG5cdFx0XHR2Qy5zdWIoIHZBICk7XG5cblx0XHRcdHV2Qi5zdWIoIHV2QSApO1xuXHRcdFx0dXZDLnN1YiggdXZBICk7XG5cblx0XHRcdGNvbnN0IHIgPSAxLjAgLyAoIHV2Qi54ICogdXZDLnkgLSB1dkMueCAqIHV2Qi55ICk7XG5cblx0XHRcdC8vIHNpbGVudGx5IGlnbm9yZSBkZWdlbmVyYXRlIHV2IHRyaWFuZ2xlcyBoYXZpbmcgY29pbmNpZGVudCBvciBjb2xpbmVhciB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoICEgaXNGaW5pdGUoIHIgKSApIHJldHVybjtcblxuXHRcdFx0c2Rpci5jb3B5KCB2QiApLm11bHRpcGx5U2NhbGFyKCB1dkMueSApLmFkZFNjYWxlZFZlY3RvciggdkMsIC0gdXZCLnkgKS5tdWx0aXBseVNjYWxhciggciApO1xuXHRcdFx0dGRpci5jb3B5KCB2QyApLm11bHRpcGx5U2NhbGFyKCB1dkIueCApLmFkZFNjYWxlZFZlY3RvciggdkIsIC0gdXZDLnggKS5tdWx0aXBseVNjYWxhciggciApO1xuXG5cdFx0XHR0YW4xWyBhIF0uYWRkKCBzZGlyICk7XG5cdFx0XHR0YW4xWyBiIF0uYWRkKCBzZGlyICk7XG5cdFx0XHR0YW4xWyBjIF0uYWRkKCBzZGlyICk7XG5cblx0XHRcdHRhbjJbIGEgXS5hZGQoIHRkaXIgKTtcblx0XHRcdHRhbjJbIGIgXS5hZGQoIHRkaXIgKTtcblx0XHRcdHRhbjJbIGMgXS5hZGQoIHRkaXIgKTtcblxuXHRcdH1cblxuXHRcdGxldCBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0Z3JvdXBzID0gWyB7XG5cdFx0XHRcdHN0YXJ0OiAwLFxuXHRcdFx0XHRjb3VudDogaW5kaWNlcy5sZW5ndGhcblx0XHRcdH0gXTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRjb25zdCBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdGhhbmRsZVRyaWFuZ2xlKFxuXHRcdFx0XHRcdGluZGljZXNbIGogKyAwIF0sXG5cdFx0XHRcdFx0aW5kaWNlc1sgaiArIDEgXSxcblx0XHRcdFx0XHRpbmRpY2VzWyBqICsgMiBdXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IHRtcCA9IG5ldyBWZWN0b3IzKCksIHRtcDIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMygpLCBuMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVWZXJ0ZXgoIHYgKSB7XG5cblx0XHRcdG4uZnJvbUFycmF5KCBub3JtYWxzLCB2ICogMyApO1xuXHRcdFx0bjIuY29weSggbiApO1xuXG5cdFx0XHRjb25zdCB0ID0gdGFuMVsgdiBdO1xuXG5cdFx0XHQvLyBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6ZVxuXG5cdFx0XHR0bXAuY29weSggdCApO1xuXHRcdFx0dG1wLnN1Yiggbi5tdWx0aXBseVNjYWxhciggbi5kb3QoIHQgKSApICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBoYW5kZWRuZXNzXG5cblx0XHRcdHRtcDIuY3Jvc3NWZWN0b3JzKCBuMiwgdCApO1xuXHRcdFx0Y29uc3QgdGVzdCA9IHRtcDIuZG90KCB0YW4yWyB2IF0gKTtcblx0XHRcdGNvbnN0IHcgPSAoIHRlc3QgPCAwLjAgKSA/IC0gMS4wIDogMS4wO1xuXG5cdFx0XHR0YW5nZW50c1sgdiAqIDQgXSA9IHRtcC54O1xuXHRcdFx0dGFuZ2VudHNbIHYgKiA0ICsgMSBdID0gdG1wLnk7XG5cdFx0XHR0YW5nZW50c1sgdiAqIDQgKyAyIF0gPSB0bXAuejtcblx0XHRcdHRhbmdlbnRzWyB2ICogNCArIDMgXSA9IHc7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRjb25zdCBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0Y29uc3QgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRoYW5kbGVWZXJ0ZXgoIGluZGljZXNbIGogKyAwIF0gKTtcblx0XHRcdFx0aGFuZGxlVmVydGV4KCBpbmRpY2VzWyBqICsgMSBdICk7XG5cdFx0XHRcdGhhbmRsZVZlcnRleCggaW5kaWNlc1sgaiArIDIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdGlmICggcG9zaXRpb25BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGV0IG5vcm1hbEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbEF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICogMyApLCAzICk7XG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbm9ybWFsQXR0cmlidXRlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5vcm1hbEF0dHJpYnV0ZS5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSwgMCwgMCwgMCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBwQSA9IG5ldyBWZWN0b3IzKCksIHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc3QgbkEgPSBuZXcgVmVjdG9yMygpLCBuQiA9IG5ldyBWZWN0b3IzKCksIG5DID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpbmRleGVkIGVsZW1lbnRzXG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGluZGV4LmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHZBID0gaW5kZXguZ2V0WCggaSArIDAgKTtcblx0XHRcdFx0XHRjb25zdCB2QiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0Y29uc3QgdkMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xuXG5cdFx0XHRcdFx0cEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZBICk7XG5cdFx0XHRcdFx0cEIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZCICk7XG5cdFx0XHRcdFx0cEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZDICk7XG5cblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdG5BLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdkEgKTtcblx0XHRcdFx0XHRuQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHZCICk7XG5cdFx0XHRcdFx0bkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2QyApO1xuXG5cdFx0XHRcdFx0bkEuYWRkKCBjYiApO1xuXHRcdFx0XHRcdG5CLmFkZCggY2IgKTtcblx0XHRcdFx0XHRuQy5hZGQoIGNiICk7XG5cblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCB2QSwgbkEueCwgbkEueSwgbkEueiApO1xuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIHZCLCBuQi54LCBuQi55LCBuQi56ICk7XG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggdkMsIG5DLngsIG5DLnksIG5DLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdHBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMCApO1xuXHRcdFx0XHRcdHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApO1xuXHRcdFx0XHRcdHBDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpICsgMCwgY2IueCwgY2IueSwgY2IueiApO1xuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGkgKyAxLCBjYi54LCBjYi55LCBjYi56ICk7XG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSArIDIsIGNiLngsIGNiLnksIGNiLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuICdcblx0XHRcdFx0KyAnVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLidcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUxID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheTIgPSBhdHRyaWJ1dGUyLmFycmF5O1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVPZmZzZXQgPSBhdHRyaWJ1dGUyLml0ZW1TaXplICogb2Zmc2V0O1xuXHRcdFx0Y29uc3QgbGVuZ3RoID0gTWF0aC5taW4oIGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGgsIGF0dHJpYnV0ZUFycmF5MS5sZW5ndGggLSBhdHRyaWJ1dGVPZmZzZXQgKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gYXR0cmlidXRlT2Zmc2V0OyBpIDwgbGVuZ3RoOyBpICsrLCBqICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3Qgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgaSApO1xuXG5cdFx0XHRfdmVjdG9yJDgubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMuc2V0WFlaKCBpLCBfdmVjdG9yJDgueCwgX3ZlY3RvciQ4LnksIF92ZWN0b3IkOC56ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b05vbkluZGV4ZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0XHRjb25zdCBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBhdHRyaWJ1dGUubm9ybWFsaXplZDtcblxuXHRcdFx0Y29uc3QgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdGxldCBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Y29uc3QgbmV3QXR0cmlidXRlID0gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICk7XG5cblx0XHRcdGdlb21ldHJ5Mi5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5ld0F0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhBcnJheSA9IFtdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZVsgaSBdO1xuXG5cdFx0XHRcdGNvbnN0IG5ld0F0dHJpYnV0ZSA9IGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApO1xuXG5cdFx0XHRcdG1vcnBoQXJyYXkucHVzaCggbmV3QXR0cmlidXRlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkyLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gbW9ycGhBcnJheTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5Mi5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XG5cblx0XHQvLyBncm91cHNcblxuXHRcdGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdC8vIGZvciBzaW1wbGljaXR5IHRoZSBjb2RlIGFzc3VtZXMgYXR0cmlidXRlcyBhcmUgbm90IHNoYXJlZCBhY3Jvc3MgZ2VvbWV0cmllcywgc2VlICMxNTgxMVxuXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xuXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5IClcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSBhdHRyaWJ1dGUudG9KU09OKCBkYXRhLmRhdGEgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdGxldCBoYXNNb3JwaEF0dHJpYnV0ZXMgPSBmYWxzZTtcblxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlQXJyYXkgPSB0aGlzLm1vcnBoQXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS50b0pTT04oIGRhdGEuZGF0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhcnJheS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdG1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTtcblxuXHRcdFx0XHRoYXNNb3JwaEF0dHJpYnV0ZXMgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGhhc01vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLm1vcnBoQXR0cmlidXRlcyA9IG1vcnBoQXR0cmlidXRlcztcblx0XHRcdGRhdGEuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XG5cblx0XHR9XG5cblx0XHRjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHtcblx0XHRcdFx0Y2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxuXHRcdFx0XHRyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1c1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCBjb25zdCB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCBjb25zdCBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgY29uc3QgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIHVzZWQgZm9yIHN0b3JpbmcgY2xvbmVkLCBzaGFyZWQgZGF0YVxuXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0Y29uc3QgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSggZGF0YSApICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoIGRhdGEgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSggZGF0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHNvdXJjZS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0Y29uc3QgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdGNvbnN0IGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBkcmF3IHJhbmdlXG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xuXG5cdFx0Ly8gdXNlciBkYXRhXG5cblx0XHR0aGlzLnVzZXJEYXRhID0gc291cmNlLnVzZXJEYXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX2ludmVyc2VNYXRyaXgkMiA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfcmF5JDIgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlJDMgPSBuZXcgU3BoZXJlKCk7XG5cbmNvbnN0IF92QSQxID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92QiQxID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92QyQxID0gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX3RlbXBBID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfbW9ycGhBID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9tb3JwaEIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX21vcnBoQyA9IG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF91dkEkMSA9IG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdXZCJDEgPSBuZXcgVmVjdG9yMigpO1xuY29uc3QgX3V2QyQxID0gbmV3IFZlY3RvcjIoKTtcblxuY29uc3QgX2ludGVyc2VjdGlvblBvaW50ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoKSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2gnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNZXNoLFxuXG5cdGlzTWVzaDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlJDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRfc3BoZXJlJDMuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMyApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRfaW52ZXJzZU1hdHJpeCQyLmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheSQyLmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4JDIgKTtcblxuXHRcdC8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9yYXkkMi5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdH1cblxuXHRcdGxldCBpbnRlcnNlY3Rpb247XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRjb25zdCBtb3JwaFBvc2l0aW9uID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblx0XHRcdGNvbnN0IHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcblx0XHRcdGNvbnN0IHV2MiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXYyO1xuXHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXHRcdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICksICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBqICk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBqICsgMSApO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaiArIDIgKTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBncm91cE1hdGVyaWFsLCByYXljYXN0ZXIsIF9yYXkkMiwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaSApO1xuXHRcdFx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgYSA9IGo7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGIgPSBqICsgMTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYyA9IGogKyAyO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbi5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gaTtcblx0XHRcdFx0XHRcdGNvbnN0IGIgPSBpICsgMTtcblx0XHRcdFx0XHRcdGNvbnN0IGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBub24taW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcblxuXHRsZXQgaW50ZXJzZWN0O1xuXG5cdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTtcblxuXHR9XG5cblx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdGlvblBvaW50V29ybGQgKTtcblxuXHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XG5cblx0cmV0dXJuIHtcblx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0cG9pbnQ6IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksXG5cdFx0b2JqZWN0OiBvYmplY3Rcblx0fTtcblxufVxuXG5mdW5jdGlvbiBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICkge1xuXG5cdF92QSQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7XG5cdF92QiQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdF92QyQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7XG5cblx0Y29uc3QgbW9ycGhJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcyApIHtcblxuXHRcdF9tb3JwaEEuc2V0KCAwLCAwLCAwICk7XG5cdFx0X21vcnBoQi5zZXQoIDAsIDAsIDAgKTtcblx0XHRfbW9ycGhDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgaSBdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaFBvc2l0aW9uWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7XG5cblx0XHRcdF90ZW1wQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgYSApO1xuXHRcdFx0X3RlbXBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBiICk7XG5cdFx0XHRfdGVtcEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGMgKTtcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRfbW9ycGhBLmFkZFNjYWxlZFZlY3RvciggX3RlbXBBLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQi5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQiwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdF9tb3JwaEMuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEMsIGluZmx1ZW5jZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9tb3JwaEEuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEEuc3ViKCBfdkEkMSApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQi5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQi5zdWIoIF92QiQxICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRfbW9ycGhDLmFkZFNjYWxlZFZlY3RvciggX3RlbXBDLnN1YiggX3ZDJDEgKSwgaW5mbHVlbmNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF92QSQxLmFkZCggX21vcnBoQSApO1xuXHRcdF92QiQxLmFkZCggX21vcnBoQiApO1xuXHRcdF92QyQxLmFkZCggX21vcnBoQyApO1xuXG5cdH1cblxuXHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGEsIF92QSQxICk7XG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGIsIF92QiQxICk7XG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGMsIF92QyQxICk7XG5cblx0fVxuXG5cdGNvbnN0IGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgX3ZBJDEsIF92QiQxLCBfdkMkMSwgX2ludGVyc2VjdGlvblBvaW50ICk7XG5cblx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRpZiAoIHV2ICkge1xuXG5cdFx0XHRfdXZBJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTtcblx0XHRcdF91dkIkMS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0X3V2QyQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7XG5cblx0XHRcdGludGVyc2VjdGlvbi51diA9IFRyaWFuZ2xlLmdldFVWKCBfaW50ZXJzZWN0aW9uUG9pbnQsIF92QSQxLCBfdkIkMSwgX3ZDJDEsIF91dkEkMSwgX3V2QiQxLCBfdXZDJDEsIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXYyICkge1xuXG5cdFx0XHRfdXZBJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBhICk7XG5cdFx0XHRfdXZCJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBiICk7XG5cdFx0XHRfdXZDJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBjICk7XG5cblx0XHRcdGludGVyc2VjdGlvbi51djIgPSBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdGlvblBvaW50LCBfdkEkMSwgX3ZCJDEsIF92QyQxLCBfdXZBJDEsIF91dkIkMSwgX3V2QyQxLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBmYWNlID0ge1xuXHRcdFx0YTogYSxcblx0XHRcdGI6IGIsXG5cdFx0XHRjOiBjLFxuXHRcdFx0bm9ybWFsOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogMFxuXHRcdH07XG5cblx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIF92QSQxLCBfdkIkMSwgX3ZDJDEsIGZhY2Uubm9ybWFsICk7XG5cblx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cblx0fVxuXG5cdHJldHVybiBpbnRlcnNlY3Rpb247XG5cbn1cblxuY2xhc3MgQm94R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxLCBkZXB0aFNlZ21lbnRzID0gMSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRkZXB0aDogZGVwdGgsXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHRcdH07XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHQvLyBzZWdtZW50c1xuXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XG5cdFx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGxldCBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XG5cblx0XHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxuXG5cdFx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRcdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcblx0XHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdGNvbnN0IHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0XHRjb25zdCBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHRcdGNvbnN0IHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcblx0XHRcdGNvbnN0IGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyO1xuXHRcdFx0Y29uc3QgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0XHRjb25zdCBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0XHRcdGxldCB2ZXJ0ZXhDb3VudGVyID0gMDtcblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcblxuXHRcdFx0Y29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0geCAqIHVkaXI7XG5cdFx0XHRcdFx0dmVjdG9yWyB2IF0gPSB5ICogdmRpcjtcblx0XHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gdmVydGV4IGJ1ZmZlclxuXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0gMDtcblx0XHRcdFx0XHR2ZWN0b3JbIHYgXSA9IDA7XG5cdFx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyXG5cblx0XHRcdFx0XHRub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdFx0dmVydGV4Q291bnRlciArPSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlXG5cdFx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdFx0Ly8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIgc2VnbWVudFxuXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0XHRjb25zdCBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0XHRjb25zdCBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdFx0Ly8gaW5jcmVhc2UgY291bnRlclxuXG5cdFx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRcdG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBVbmlmb3JtIFV0aWxpdGllc1xuICovXG5cbmZ1bmN0aW9uIGNsb25lVW5pZm9ybXMoIHNyYyApIHtcblxuXHRjb25zdCBkc3QgPSB7fTtcblxuXHRmb3IgKCBjb25zdCB1IGluIHNyYyApIHtcblxuXHRcdGRzdFsgdSBdID0ge307XG5cblx0XHRmb3IgKCBjb25zdCBwIGluIHNyY1sgdSBdICkge1xuXG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHNyY1sgdSBdWyBwIF07XG5cblx0XHRcdGlmICggcHJvcGVydHkgJiYgKCBwcm9wZXJ0eS5pc0NvbG9yIHx8XG5cdFx0XHRcdHByb3BlcnR5LmlzTWF0cml4MyB8fCBwcm9wZXJ0eS5pc01hdHJpeDQgfHxcblx0XHRcdFx0cHJvcGVydHkuaXNWZWN0b3IyIHx8IHByb3BlcnR5LmlzVmVjdG9yMyB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjQgfHxcblx0XHRcdFx0cHJvcGVydHkuaXNUZXh0dXJlIHx8IHByb3BlcnR5LmlzUXVhdGVybmlvbiApICkge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwcm9wZXJ0eSApICkge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5zbGljZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZHN0O1xuXG59XG5cbmZ1bmN0aW9uIG1lcmdlVW5pZm9ybXMoIHVuaWZvcm1zICkge1xuXG5cdGNvbnN0IG1lcmdlZCA9IHt9O1xuXG5cdGZvciAoIGxldCB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdGNvbnN0IHRtcCA9IGNsb25lVW5pZm9ybXMoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdGZvciAoIGNvbnN0IHAgaW4gdG1wICkge1xuXG5cdFx0XHRtZXJnZWRbIHAgXSA9IHRtcFsgcCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gbWVyZ2VkO1xuXG59XG5cbi8vIExlZ2FjeVxuXG5jb25zdCBVbmlmb3Jtc1V0aWxzID0geyBjbG9uZTogY2xvbmVVbmlmb3JtcywgbWVyZ2U6IG1lcmdlVW5pZm9ybXMgfTtcblxudmFyIGRlZmF1bHRfdmVydGV4ID0gXCJ2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcbn1cIjtcblxudmFyIGRlZmF1bHRfZnJhZ21lbnQgPSBcInZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcXG59XCI7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBkZWZpbmVzOiB7IFwibGFiZWxcIiA6IFwidmFsdWVcIiB9LFxuICogIHVuaWZvcm1zOiB7IFwicGFyYW1ldGVyMVwiOiB7IHZhbHVlOiAxLjAgfSwgXCJwYXJhbWV0ZXIyXCI6IHsgdmFsdWUyOiAyIH0gfSxcbiAqXG4gKiAgZnJhZ21lbnRTaGFkZXI6IDxzdHJpbmc+LFxuICogIHZlcnRleFNoYWRlcjogPHN0cmluZz4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgbGlnaHRzOiA8Ym9vbD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcblxuXHR0aGlzLmRlZmluZXMgPSB7fTtcblx0dGhpcy51bmlmb3JtcyA9IHt9O1xuXG5cdHRoaXMudmVydGV4U2hhZGVyID0gZGVmYXVsdF92ZXJ0ZXg7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBkZWZhdWx0X2ZyYWdtZW50O1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBmb2dcblx0dGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHNcblx0dGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXNcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXNcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzXG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggbm9ybWFsc1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHtcblx0XHRkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXNcblx0XHRmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlc1xuXHRcdGRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnNcblx0XHRzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRFxuXHR9O1xuXG5cdC8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLFxuXHQvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXG5cdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcblx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcblx0XHQndXYnOiBbIDAsIDAgXSxcblx0XHQndXYyJzogWyAwLCAwIF1cblx0fTtcblxuXHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XG5cdHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5nbHNsVmVyc2lvbiA9IG51bGw7XG5cblx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cbn1cblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJNYXRlcmlhbDtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XG5cdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcblxuXHR0aGlzLnVuaWZvcm1zID0gY2xvbmVVbmlmb3Jtcyggc291cmNlLnVuaWZvcm1zICk7XG5cblx0dGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5leHRlbnNpb25zID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5leHRlbnNpb25zICk7XG5cblx0dGhpcy5nbHNsVmVyc2lvbiA9IHNvdXJjZS5nbHNsVmVyc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRjb25zdCBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0ZGF0YS5nbHNsVmVyc2lvbiA9IHRoaXMuZ2xzbFZlcnNpb247XG5cdGRhdGEudW5pZm9ybXMgPSB7fTtcblxuXHRmb3IgKCBjb25zdCBuYW1lIGluIHRoaXMudW5pZm9ybXMgKSB7XG5cblx0XHRjb25zdCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1sgbmFtZSBdO1xuXHRcdGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICd0Jyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvSlNPTiggbWV0YSApLnV1aWRcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICdjJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLmdldEhleCgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IyICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICd2MicsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjMgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ3YzJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yNCApIHtcblxuXHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xuXHRcdFx0XHR0eXBlOiAndjQnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNNYXRyaXgzICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICdtMycsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ200Jyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBub3RlOiB0aGUgYXJyYXkgdmFyaWFudHMgdjJ2LCB2M3YsIHY0diwgbTR2IGFuZCB0diBhcmUgbm90IHN1cHBvcnRlZCBzbyBmYXJcblxuXHRcdH1cblxuXHR9XG5cblx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy5kZWZpbmVzICkubGVuZ3RoID4gMCApIGRhdGEuZGVmaW5lcyA9IHRoaXMuZGVmaW5lcztcblxuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRjb25zdCBleHRlbnNpb25zID0ge307XG5cblx0Zm9yICggY29uc3Qga2V5IGluIHRoaXMuZXh0ZW5zaW9ucyApIHtcblxuXHRcdGlmICggdGhpcy5leHRlbnNpb25zWyBrZXkgXSA9PT0gdHJ1ZSApIGV4dGVuc2lvbnNbIGtleSBdID0gdHJ1ZTtcblxuXHR9XG5cblx0aWYgKCBPYmplY3Qua2V5cyggZXh0ZW5zaW9ucyApLmxlbmd0aCA+IDAgKSBkYXRhLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5mdW5jdGlvbiBDYW1lcmEoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYW1lcmEnO1xuXG5cdHRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5DYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ2FtZXJhLFxuXG5cdGlzQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XG5cblx0XHRjb25zdCBlID0gdGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztcblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCAtIGVbIDggXSwgLSBlWyA5IF0sIC0gZVsgMTAgXSApLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVdvcmxkTWF0cml4OiBmdW5jdGlvbiAoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZVdvcmxkTWF0cml4LmNhbGwoIHRoaXMsIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSggZm92ID0gNTAsIGFzcGVjdCA9IDEsIG5lYXIgPSAwLjEsIGZhciA9IDIwMDAgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92O1xuXHR0aGlzLnpvb20gPSAxO1xuXG5cdHRoaXMubmVhciA9IG5lYXI7XG5cdHRoaXMuZmFyID0gZmFyO1xuXHR0aGlzLmZvY3VzID0gMTA7XG5cblx0dGhpcy5hc3BlY3QgPSBhc3BlY3Q7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5maWxtR2F1Z2UgPSAzNTtcdC8vIHdpZHRoIG9mIHRoZSBmaWxtIChkZWZhdWx0IGluIG1pbGxpbWV0ZXJzKVxuXHR0aGlzLmZpbG1PZmZzZXQgPSAwO1x0Ly8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdlKVxuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQZXJzcGVjdGl2ZUNhbWVyYSxcblxuXHRpc1BlcnNwZWN0aXZlQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMuZm92ID0gc291cmNlLmZvdjtcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0O1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlO1xuXHRcdHRoaXMuZmlsbU9mZnNldCA9IHNvdXJjZS5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuXG5cdCAqXG5cdCAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuXHQgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS5cblx0ICpcblx0ICogVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuXG5cdCAqL1xuXHRzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCApIHtcblxuXHRcdC8qKiBzZWUge0BsaW5rIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sfSAqL1xuXHRcdGNvbnN0IHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IE1hdGhVdGlscy5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQgLmZvdiBhbmQgLmZpbG1HYXVnZS5cblx0ICovXG5cdGdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggTWF0aFV0aWxzLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xuXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xuXG5cdH0sXG5cblx0Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aFV0aWxzLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0TWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIGNvbnN0IHcgPSAxOTIwO1xuXHQgKiAgIGNvbnN0IGggPSAxMDgwO1xuXHQgKiAgIGNvbnN0IGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIGNvbnN0IGZ1bGxIZWlnaHQgPSBoICogMjtcblx0ICpcblx0ICogICAtLUEtLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1DLS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUQtLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1GLS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcblx0ICpcblx0ICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxuXHQgKi9cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCBuZWFyID0gdGhpcy5uZWFyO1xuXHRcdGxldCB0b3AgPSBuZWFyICogTWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbTtcblx0XHRsZXQgaGVpZ2h0ID0gMiAqIHRvcDtcblx0XHRsZXQgd2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodDtcblx0XHRsZXQgbGVmdCA9IC0gMC41ICogd2lkdGg7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMudmlldztcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHRjb25zdCBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcblxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR9XG5cblx0XHRjb25zdCBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBmb3YgPSA5MCwgYXNwZWN0ID0gMTtcblxuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbmVhciwgZmFyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgIT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DdWJlQ2FtZXJhOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgYW4gaW5zdGFuY2Ugb2YgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IGFzIHRoaXJkIHBhcmFtZXRlci4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcblxuXHRcdGNvbnN0IGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhUFgubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0XHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0XHR0aGlzLmFkZCggY2FtZXJhUFggKTtcblxuXHRcdGNvbnN0IGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhTlgubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0XHRjYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdFx0Y29uc3QgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFQWS5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0XHRjYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTtcblx0XHR0aGlzLmFkZCggY2FtZXJhUFkgKTtcblxuXHRcdGNvbnN0IGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhTlkubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTtcblx0XHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xuXG5cdFx0Y29uc3QgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFQWi5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRcdGNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdFx0Y29uc3QgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFOWi5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRcdGNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7XG5cdFx0dGhpcy5hZGQoIGNhbWVyYU5aICk7XG5cblx0fVxuXG5cdHVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXG5cdFx0Y29uc3QgWyBjYW1lcmFQWCwgY2FtZXJhTlgsIGNhbWVyYVBZLCBjYW1lcmFOWSwgY2FtZXJhUFosIGNhbWVyYU5aIF0gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Y29uc3QgY3VycmVudFhyRW5hYmxlZCA9IHJlbmRlcmVyLnhyLmVuYWJsZWQ7XG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMiApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMyApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBjdXJyZW50WHJFbmFibGVkO1xuXG5cdH1cblxufVxuXG5jbGFzcyBDdWJlVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0XHRpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdO1xuXHRcdG1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xuXHRcdGZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogUkdCRm9ybWF0O1xuXG5cdFx0c3VwZXIoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdFx0Ly8gV2h5IEN1YmVUZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXAgaXMgbmVjZXNzYXJ5OlxuXHRcdC8vXG5cdFx0Ly8gQnkgY29udmVudGlvbiAtLSBsaWtlbHkgYmFzZWQgb24gdGhlIFJlbmRlck1hbiBzcGVjIGZyb20gdGhlIDE5OTAncyAtLSBjdWJlIG1hcHMgYXJlIHNwZWNpZmllZCBieSBXZWJHTCAoYW5kIHRocmVlLmpzKVxuXHRcdC8vIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW0gaW4gd2hpY2ggcG9zaXRpdmUteCBpcyB0byB0aGUgcmlnaHQgd2hlbiBsb29raW5nIHVwIHRoZSBwb3NpdGl2ZS16IGF4aXMgLS0gaW4gb3RoZXIgd29yZHMsXG5cdFx0Ly8gaW4gYSBsZWZ0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbS4gQnkgY29udGludWluZyB0aGlzIGNvbnZlbnRpb24sIHByZWV4aXN0aW5nIGN1YmUgbWFwcyBjb250aW51ZWQgdG8gcmVuZGVyIGNvcnJlY3RseS5cblxuXHRcdC8vIHRocmVlLmpzIHVzZXMgYSByaWdodC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIFNvIGVudmlyb25tZW50IG1hcHMgdXNlZCBpbiB0aHJlZS5qcyBhcHBlYXIgdG8gaGF2ZSBweCBhbmQgbnggc3dhcHBlZFxuXHRcdC8vIGFuZCB0aGUgZmxhZyBfbmVlZHNGbGlwRW52TWFwIGNvbnRyb2xzIHRoaXMgY29udmVyc2lvbi4gVGhlIGZsaXAgaXMgbm90IHJlcXVpcmVkIChhbmQgdGh1cyBfbmVlZHNGbGlwRW52TWFwIGlzIHNldCB0byBmYWxzZSlcblx0XHQvLyB3aGVuIHVzaW5nIFdlYkdMQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlIGFzIGEgY3ViZSB0ZXh0dXJlLlxuXG5cdFx0dGhpcy5fbmVlZHNGbGlwRW52TWFwID0gdHJ1ZTtcblxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHR9XG5cblx0Z2V0IGltYWdlcygpIHtcblxuXHRcdHJldHVybiB0aGlzLmltYWdlO1xuXG5cdH1cblxuXHRzZXQgaW1hZ2VzKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xuXG5jbGFzcyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgZXh0ZW5kcyBXZWJHTFJlbmRlclRhcmdldCB7XG5cblx0Y29uc3RydWN0b3IoIHNpemUsIG9wdGlvbnMsIGR1bW15ICkge1xuXG5cdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogY29uc3RydWN0b3Igc2lnbmF0dXJlIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKScgKTtcblxuXHRcdFx0b3B0aW9ucyA9IGR1bW15O1xuXG5cdFx0fVxuXG5cdFx0c3VwZXIoIHNpemUsIHNpemUsIG9wdGlvbnMgKTtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCB1bmRlZmluZWQsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTtcblxuXHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgOiBmYWxzZTtcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gb3B0aW9ucy5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXG5cdFx0dGhpcy50ZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXAgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUoIHJlbmRlcmVyLCB0ZXh0dXJlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IFJHQkFGb3JtYXQ7IC8vIHNlZSAjMTg4NTlcblx0XHR0aGlzLnRleHR1cmUuZW5jb2RpbmcgPSB0ZXh0dXJlLmVuY29kaW5nO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcblx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7XG5cblx0XHRjb25zdCBzaGFkZXIgPSB7XG5cblx0XHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0fSxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiAvKiBnbHNsICovYFxuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0dmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0XHRcdFx0XHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cblx0XHRcdFx0fVxuXHRcdFx0YCxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXG5cblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHRgXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJveEdlb21ldHJ5KCA1LCA1LCA1ICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXG5cdFx0XHRuYW1lOiAnQ3ViZW1hcEZyb21FcXVpcmVjdCcsXG5cblx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBzaGFkZXIudW5pZm9ybXMgKSxcblx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nXG5cblx0XHR9ICk7XG5cblx0XHRtYXRlcmlhbC51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSB0ZXh0dXJlO1xuXG5cdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdC8vIEF2b2lkIGJsdXJyZWQgcG9sZXNcblx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdGNvbnN0IGNhbWVyYSA9IG5ldyBDdWJlQ2FtZXJhKCAxLCAxMCwgdGhpcyApO1xuXHRcdGNhbWVyYS51cGRhdGUoIHJlbmRlcmVyLCBtZXNoICk7XG5cblx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IGN1cnJlbnRNaW5GaWx0ZXI7XG5cblx0XHRtZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHRtZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGVhciggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcywgaSApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cbn1cblxuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7XG5cbmNsYXNzIERhdGFUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0XHRzdXBlciggbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSB8fCBudWxsLCB3aWR0aDogd2lkdGggfHwgMSwgaGVpZ2h0OiBoZWlnaHQgfHwgMSB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUgPSB0cnVlO1xuXG5jb25zdCBfc3BoZXJlJDIgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcbmNvbnN0IF92ZWN0b3IkNyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgRnJ1c3R1bSB7XG5cblx0Y29uc3RydWN0b3IoIHAwID0gbmV3IFBsYW5lKCksIHAxID0gbmV3IFBsYW5lKCksIHAyID0gbmV3IFBsYW5lKCksIHAzID0gbmV3IFBsYW5lKCksIHA0ID0gbmV3IFBsYW5lKCksIHA1ID0gbmV3IFBsYW5lKCkgKSB7XG5cblx0XHR0aGlzLnBsYW5lcyA9IFsgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSBdO1xuXG5cdH1cblxuXHRzZXQoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIGZydXN0dW0gKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggbSApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcblx0XHRjb25zdCBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xuXHRcdGNvbnN0IG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0Y29uc3QgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XG5cdFx0Y29uc3QgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xuXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUkMi5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlJDIgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0X3NwaGVyZSQyLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlJDIucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdF9zcGhlcmUkMi5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQyICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdGNvbnN0IGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0Y29uc3QgbmVnUmFkaXVzID0gLSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgcGxhbmUgPSBwbGFuZXNbIGkgXTtcblxuXHRcdFx0Ly8gY29ybmVyIGF0IG1heCBkaXN0YW5jZVxuXG5cdFx0XHRfdmVjdG9yJDcueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5tYXgueCA6IGJveC5taW4ueDtcblx0XHRcdF92ZWN0b3IkNy55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55O1xuXHRcdFx0X3ZlY3RvciQ3LnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBfdmVjdG9yJDcgKSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xBbmltYXRpb24oKSB7XG5cblx0bGV0IGNvbnRleHQgPSBudWxsO1xuXHRsZXQgaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0bGV0IGFuaW1hdGlvbkxvb3AgPSBudWxsO1xuXHRsZXQgcmVxdWVzdElkID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdGFuaW1hdGlvbkxvb3AoIHRpbWUsIGZyYW1lICk7XG5cblx0XHRyZXF1ZXN0SWQgPSBjb250ZXh0LnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0c3RhcnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBpc0FuaW1hdGluZyA9PT0gdHJ1ZSApIHJldHVybjtcblx0XHRcdGlmICggYW5pbWF0aW9uTG9vcCA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0cmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHRcdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdFx0fSxcblxuXHRcdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZSggcmVxdWVzdElkICk7XG5cblx0XHRcdGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0XHR9LFxuXG5cdFx0c2V0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdFx0YW5pbWF0aW9uTG9vcCA9IGNhbGxiYWNrO1xuXG5cdFx0fSxcblxuXHRcdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wsIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHRjb25zdCBidWZmZXJzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdGNvbnN0IHVzYWdlID0gYXR0cmlidXRlLnVzYWdlO1xuXG5cdFx0Y29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHRsZXQgdHlwZSA9IDUxMjY7XG5cblx0XHRpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyNjtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LicgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7XG5cblx0XHRcdGlmICggYXR0cmlidXRlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0dHlwZSA9IDUxMzE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVXNhZ2Ugb2YgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0eXBlID0gNTEyMztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyMjtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSA1MTI1O1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyNDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyMDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjE7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YnVmZmVyOiBidWZmZXIsXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdGNvbnN0IHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRcdGFycmF5LCB1cGRhdGVSYW5nZS5vZmZzZXQsIHVwZGF0ZVJhbmdlLmNvdW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhICkge1xuXG5cdFx0XHRnbC5kZWxldGVCdWZmZXIoIGRhdGEuYnVmZmVyICk7XG5cblx0XHRcdGJ1ZmZlcnMuZGVsZXRlKCBhdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zdCBjYWNoZWQgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRcdGlmICggISBjYWNoZWQgfHwgY2FjaGVkLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRidWZmZXJzLnNldCggYXR0cmlidXRlLCB7XG5cdFx0XHRcdFx0YnVmZmVyOiBhdHRyaWJ1dGUuYnVmZmVyLFxuXHRcdFx0XHRcdHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuXHRcdFx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXR0cmlidXRlLmVsZW1lbnRTaXplLFxuXHRcdFx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuY2xhc3MgUGxhbmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0XHR9O1xuXG5cdFx0Y29uc3Qgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcblx0XHRjb25zdCBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XG5cblx0XHRjb25zdCBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcblx0XHRjb25zdCBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XG5cblx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0Y29uc3QgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0Y29uc3Qgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0Y29uc3Qgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHRcdC8vXG5cblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgdXZzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0Y29uc3QgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0Y29uc3QgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRjb25zdCBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxudmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhdGVzdF9mcmFnbWVudCA9IFwiI2lmZGVmIEFMUEhBVEVTVFxcblxcdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xcbiNlbmRpZlwiO1xuXG52YXIgYW9tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgYmVnaW5fdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcIjtcblxudmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9IFwidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcXG4jaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xcbiNlbmRpZlwiO1xuXG52YXIgYnNkZnMgPSBcInZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xcblxcdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xcblxcdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XFxuXFx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XFxuXFx0cmV0dXJuIHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcXG59XFxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XFxuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcXG5cXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xcblxcdFxcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xcblxcdH1cXG5cXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xcbiNlbHNlXFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICYmIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XFxuXFx0XFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xcblxcdH1cXG5cXHRyZXR1cm4gMS4wO1xcbiNlbmRpZlxcbn1cXG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcXG59XFxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XFxuXFx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XFxuXFx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XFxufVxcbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdE5WIC0gNi45ODMxNiApICogZG90TlYgKTtcXG5cXHR2ZWMzIEZyID0gbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xcblxcdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcXG5cXHRjb25zdCBmbG9hdCBMVVRfQklBUyA9IDAuNSAvIExVVF9TSVpFO1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XFxuXFx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xcblxcdHV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUztcXG5cXHRyZXR1cm4gdXY7XFxufVxcbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xcblxcdGZsb2F0IGwgPSBsZW5ndGgoIGYgKTtcXG5cXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XFxufVxcbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xcblxcdGZsb2F0IHggPSBkb3QoIHYxLCB2MiApO1xcblxcdGZsb2F0IHkgPSBhYnMoIHggKTtcXG5cXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xcblxcdGZsb2F0IGIgPSAzLjQxNzU5NDAgKyAoIDQuMTYxNjcyNCArIHkgKSAqIHk7XFxuXFx0ZmxvYXQgdiA9IGEgLyBiO1xcblxcdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcXG5cXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XFxufVxcbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xcblxcdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xcblxcdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBUMSwgVDI7XFxuXFx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcXG5cXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XFxuXFx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTtcXG5cXHR2ZWMzIGNvb3Jkc1sgNCBdO1xcblxcdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xcblxcdGZsb2F0IHJlc3VsdCA9IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApO1xcblxcdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xcblxcdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xcbn1cXG52b2lkIEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHZlYzMgRnNzRXNzID0gRiAqIGJyZGYueCArIGJyZGYueTtcXG5cXHRmbG9hdCBFc3MgPSBicmRmLnggKyBicmRmLnk7XFxuXFx0ZmxvYXQgRW1zID0gMS4wIC0gRXNzO1xcblxcdHZlYzMgRmF2ZyA9IHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1xcdHZlYzMgRm1zID0gRnNzRXNzICogRmF2ZyAvICggMS4wIC0gRW1zICogRmF2ZyApO1xcblxcdHNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzO1xcblxcdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxcbmZsb2F0IERfQ2hhcmxpZShmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5vSCkge1xcblxcdGZsb2F0IGludkFscGhhID0gMS4wIC8gcm91Z2huZXNzO1xcblxcdGZsb2F0IGNvczJoID0gTm9IICogTm9IO1xcblxcdGZsb2F0IHNpbjJoID0gbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1xcdHJldHVybiAoMi4wICsgaW52QWxwaGEpICogcG93KHNpbjJoLCBpbnZBbHBoYSAqIDAuNSkgLyAoMi4wICogUEkpO1xcbn1cXG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9TaGVlbiggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIEwsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIHZlYzMgc3BlY3VsYXJDb2xvciApIHtcXG5cXHR2ZWMzIE4gPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHR2ZWMzIEggPSBub3JtYWxpemUoIFYgKyBMICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcXG5cXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xcbn1cXG4jZW5kaWZcIjtcblxudmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9CVU1QTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcXG5cXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcXG5cXHRcXHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XFxuXFx0XFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xcblxcdFxcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcXG5cXHRcXHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcXG5cXHRcXHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcXG5cXHRcXHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcXG5cXHR9XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcXG5cXHRcXHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgdk4gPSBzdXJmX25vcm07XFxuXFx0XFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xcblxcdFxcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcXG5cXHRcXHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2ZWM0IHBsYW5lO1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXFxuXFx0XFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0XFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRcXHRjbGlwcGVkID0gKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XFxuXFx0XFx0fVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcXG5cXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcXG4jZW5kaWZcIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XFxuI2VuZGlmXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2Q29sb3IgPSB2ZWM0KCAxLjAgKTtcXG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApXFxuXFx0dkNvbG9yID0gdmVjMyggMS4wICk7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvciAqPSBjb2xvcjtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1JcXG5cXHR2Q29sb3IueHl6ICo9IGluc3RhbmNlQ29sb3IueHl6O1xcbiNlbmRpZlwiO1xuXG52YXIgY29tbW9uID0gXCIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXFxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxNzk1ODZcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NDMwOTE4OTUzNVxcbiNkZWZpbmUgRVBTSUxPTiAxZS02XFxuI2lmbmRlZiBzYXR1cmF0ZVxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG4jaWZkZWYgSElHSF9QUkVDSVNJT05cXG5cXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxcbiNlbHNlXFxuXFx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XFxuXFx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xcblxcdFxcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heDMoIGFicyggdiApICk7XFxuXFx0XFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xcblxcdH1cXG4jZW5kaWZcXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG4jaWZkZWYgQ0xFQVJDT0FUXFxuXFx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XFxuI2VuZGlmXFxufTtcXG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xcbn1cXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcXG59XFxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XFxuXFx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xcbn1cXG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcXG59XFxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xcbn1cXG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcXG5cXHRtYXQzIHRtcDtcXG5cXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcXG5cXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcXG5cXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcXG5cXHRyZXR1cm4gdG1wO1xcbn1cXG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xcblxcdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcXG5cXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcXG59XFxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XFxuXFx0cmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wO1xcbn1cXG52ZWMyIGVxdWlyZWN0VXYoIGluIHZlYzMgZGlyICkge1xcblxcdGZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRyZXR1cm4gdmVjMiggdSwgdiApO1xcbn1cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG5cXHQjZGVmaW5lIGN1YmVVVl9tYXhNaXBMZXZlbCA4LjBcXG5cXHQjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjBcXG5cXHQjZGVmaW5lIGN1YmVVVl9tYXhUaWxlU2l6ZSAyNTYuMFxcblxcdCNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjBcXG5cXHRmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHtcXG5cXHRcXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgZmFjZSA9IC0gMS4wO1xcblxcdFxcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRcXHRpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDtcXG5cXHRcXHRcXHRlbHNlXFxuXFx0XFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0aWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7XFxuXFx0XFx0XFx0ZWxzZVxcblxcdFxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIGZhY2U7XFxuXFx0fVxcblxcdHZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkge1xcblxcdFxcdHZlYzIgdXY7XFxuXFx0XFx0aWYgKCBmYWNlID09IDAuMCApIHtcXG5cXHRcXHRcXHR1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xcblxcdFxcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xcblxcdFxcdFxcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xcblxcdFxcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xcblxcdFxcdFxcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcXG5cXHRcXHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcXG5cXHRcXHRcXHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7XFxuXFx0XFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XFxuXFx0XFx0XFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTtcXG5cXHR9XFxuXFx0dmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHtcXG5cXHRcXHRmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApO1xcblxcdFxcdG1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApO1xcblxcdFxcdGZsb2F0IHRleGVsU2l6ZSA9IDEuMCAvICggMy4wICogY3ViZVVWX21heFRpbGVTaXplICk7XFxuXFx0XFx0dmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAxLjAgKTtcXG5cXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKTtcXG5cXHRcXHR1diArPSAwLjUgLSBmO1xcblxcdFxcdGlmICggZmFjZSA+IDIuMCApIHtcXG5cXHRcXHRcXHR1di55ICs9IGZhY2VTaXplO1xcblxcdFxcdFxcdGZhY2UgLT0gMy4wO1xcblxcdFxcdH1cXG5cXHRcXHR1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTtcXG5cXHRcXHRpZiAoIG1pcEludCA8IGN1YmVVVl9tYXhNaXBMZXZlbCApIHtcXG5cXHRcXHRcXHR1di55ICs9IDIuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZTtcXG5cXHRcXHR9XFxuXFx0XFx0dXYueSArPSBmaWx0ZXJJbnQgKiAyLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XFxuXFx0XFx0dXYueCArPSAzLjAgKiBtYXgoIDAuMCwgY3ViZVVWX21heFRpbGVTaXplIC0gMi4wICogZmFjZVNpemUgKTtcXG5cXHRcXHR1diAqPSB0ZXhlbFNpemU7XFxuXFx0XFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xcblxcdFxcdHV2LnggKz0gdGV4ZWxTaXplO1xcblxcdFxcdHZlYzMgdHIgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcXG5cXHRcXHR1di55ICs9IHRleGVsU2l6ZTtcXG5cXHRcXHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XFxuXFx0XFx0dXYueCAtPSB0ZXhlbFNpemU7XFxuXFx0XFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xcblxcdFxcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XFxuXFx0XFx0dmVjMyBibSA9IG1peCggYmwsIGJyLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gbWl4KCB0bSwgYm0sIGYueSApO1xcblxcdH1cXG5cXHQjZGVmaW5lIHIwIDEuMFxcblxcdCNkZWZpbmUgdjAgMC4zMzlcXG5cXHQjZGVmaW5lIG0wIC0gMi4wXFxuXFx0I2RlZmluZSByMSAwLjhcXG5cXHQjZGVmaW5lIHYxIDAuMjc2XFxuXFx0I2RlZmluZSBtMSAtIDEuMFxcblxcdCNkZWZpbmUgcjQgMC40XFxuXFx0I2RlZmluZSB2NCAwLjA0NlxcblxcdCNkZWZpbmUgbTQgMi4wXFxuXFx0I2RlZmluZSByNSAwLjMwNVxcblxcdCNkZWZpbmUgdjUgMC4wMTZcXG5cXHQjZGVmaW5lIG01IDMuMFxcblxcdCNkZWZpbmUgcjYgMC4yMVxcblxcdCNkZWZpbmUgdjYgMC4wMDM4XFxuXFx0I2RlZmluZSBtNiA0LjBcXG5cXHRmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkge1xcblxcdFxcdGZsb2F0IG1pcCA9IDAuMDtcXG5cXHRcXHRpZiAoIHJvdWdobmVzcyA+PSByMSApIHtcXG5cXHRcXHRcXHRtaXAgPSAoIHIwIC0gcm91Z2huZXNzICkgKiAoIG0xIC0gbTAgKSAvICggcjAgLSByMSApICsgbTA7XFxuXFx0XFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI0ICkge1xcblxcdFxcdFxcdG1pcCA9ICggcjEgLSByb3VnaG5lc3MgKSAqICggbTQgLSBtMSApIC8gKCByMSAtIHI0ICkgKyBtMTtcXG5cXHRcXHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjUgKSB7XFxuXFx0XFx0XFx0bWlwID0gKCByNCAtIHJvdWdobmVzcyApICogKCBtNSAtIG00ICkgLyAoIHI0IC0gcjUgKSArIG00O1xcblxcdFxcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNiApIHtcXG5cXHRcXHRcXHRtaXAgPSAoIHI1IC0gcm91Z2huZXNzICkgKiAoIG02IC0gbTUgKSAvICggcjUgLSByNiApICsgbTU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRtaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTtcXHRcXHR9XFxuXFx0XFx0cmV0dXJuIG1pcDtcXG5cXHR9XFxuXFx0dmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdFxcdGZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIG0wLCBjdWJlVVZfbWF4TWlwTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApO1xcblxcdFxcdGZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcXG5cXHRcXHR2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7XFxuXFx0XFx0aWYgKCBtaXBGID09IDAuMCApIHtcXG5cXHRcXHRcXHRyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdHZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTtcXG5cXHRcXHRcXHRyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSBcInZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XFxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0bWF0MyBtID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTtcXG5cXHR0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIG1bIDAgXSwgbVsgMCBdICksIGRvdCggbVsgMSBdLCBtWyAxIF0gKSwgZG90KCBtWyAyIF0sIG1bIDIgXSApICk7XFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSBtICogdHJhbnNmb3JtZWROb3JtYWw7XFxuI2VuZGlmXFxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcXG4jaWZkZWYgRkxJUF9TSURFRFxcblxcdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XFxuXFx0I2lmZGVmIEZMSVBfU0lERURcXG5cXHRcXHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XFxuI2VuZGlmXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2VXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XFxuI2VuZGlmXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xcblxcdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xcblxcdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcXG4jZW5kaWZcIjtcblxudmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcXG4jZW5kaWZcIjtcblxudmFyIGVuY29kaW5nc19mcmFnbWVudCA9IFwiZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS5hICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xcblxcdE0gPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XFxufVxcbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgRCA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgPSBjbGFtcCggZmxvb3IoIEQgKSAvIDI1NS4wLCAwLjAsIDEuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XFxudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHR2ZWMzIFhwX1lfWFlacCA9IGNMb2dMdXZNICogdmFsdWUucmdiO1xcblxcdFhwX1lfWFlacCA9IG1heCggWHBfWV9YWVpwLCB2ZWMzKCAxZS02LCAxZS02LCAxZS02ICkgKTtcXG5cXHR2ZWM0IHZSZXN1bHQ7XFxuXFx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xcblxcdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcXG5cXHR2UmVzdWx0LncgPSBmcmFjdCggTGUgKTtcXG5cXHR2UmVzdWx0LnogPSAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2UmVzdWx0O1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xcbnZlYzQgTG9nTHV2VG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xcblxcdHZlYzMgWHBfWV9YWVpwO1xcblxcdFhwX1lfWFlacC55ID0gZXhwMiggKCBMZSAtIDEyNy4wICkgLyAyLjAgKTtcXG5cXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcXG5cXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcXG5cXHR2ZWMzIHZSR0IgPSBjTG9nTHV2SW52ZXJzZU0gKiBYcF9ZX1hZWnAucmdiO1xcblxcdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcXG59XCI7XG5cbnZhciBlbnZtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmZGVmIEVOVl9XT1JMRFBPU1xcblxcdFxcdHZlYzMgY2FtZXJhVG9GcmFnO1xcblxcdFxcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XFxuXFx0XFx0XFx0Y2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdH1cXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIDAuMCApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxcblxcdFxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHRcXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0I2RlZmluZSBFTlZfV09STERQT1NcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WX1dPUkxEUE9TXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZfV09STERQT1NcXG5cXHRcXHRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBlbnZtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZmRlZiBFTlZfV09STERQT1NcXG5cXHRcXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleDtcXG5cXHRcXHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0fVxcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGZvZ192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0Zm9nRGVwdGggPSAtIG12UG9zaXRpb24uejtcXG4jZW5kaWZcIjtcblxudmFyIGZvZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IDEuMCAtIGV4cCggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XFxuI2VuZGlmXFxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xcblxcdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XFxuXFx0dmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcXG5cXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0XFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xcblxcdCNlbHNlXFxuXFx0XFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcXG5cXHQjZW5kaWZcXG59XCI7XG5cbnZhciBsaWdodG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHZlYzQgbGlnaHRNYXBUZXhlbD0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSBcInZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuZ2VvbWV0cnkudmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XFxuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XFxuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuYmFja0dlb21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XFxuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XFxudkluZGlyZWN0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcblxcdHZJbmRpcmVjdEJhY2sgPSB2ZWMzKCAwLjAgKTtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbmZsb2F0IGRvdE5MO1xcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcbnZJbmRpcmVjdEZyb250ICs9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxudkluZGlyZWN0RnJvbnQgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZJbmRpcmVjdEJhY2sgKz0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHR2SW5kaXJlY3RCYWNrICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBiYWNrR2VvbWV0cnkgKTtcXG4jZW5kaWZcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZJbmRpcmVjdEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkluZGlyZWN0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3BhcnNfYmVnaW4gPSBcInVuaWZvcm0gYm9vbCByZWNlaXZlU2hhZG93O1xcbnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcXG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XFxuXFx0ZmxvYXQgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcXG5cXHR2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xcblxcdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xcblxcdHJldHVybiByZXN1bHQ7XFxufVxcbnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xcblxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcXG5cXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG59XFxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIGlycmFkaWFuY2U7XFxufVxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFBvaW50TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSAoIGRpcmVjdExpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFNwb3RMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGZsb2F0IGNvbmVDb3M7XFxuXFx0XFx0ZmxvYXQgcGVudW1icmFDb3M7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xcblxcdFxcdFxcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XFxuXFx0XFx0fVxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQ7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjtcXG5cXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHNreUNvbG9yO1xcblxcdFxcdHZlYzMgZ3JvdW5kQ29sb3I7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcXG5cXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBpcnJhZGlhbmNlO1xcblxcdH1cXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXFxuXFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRlJBQ1RJT05cXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZW5kaWZcXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdGZsb2F0IHNpZ21hID0gUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xcblxcdFxcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC12aWV3RGlyLCBub3JtYWwgKTtcXG5cXHRcXHRcXHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c190b29uX2ZyYWdtZW50ID0gXCJUb29uTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcIjtcblxudmFyIGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgVG9vbk1hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X1Rvb24oIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfVG9vblxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX1Rvb25cXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcXHQoMClcIjtcblxudmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9IFwiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1wiO1xuXG52YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XFxuXFx0ZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7XFxuXFx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSBcIlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XFxudmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggZ2VvbWV0cnlOb3JtYWwgKSApLCBhYnMoIGRGZHkoIGdlb21ldHJ5Tm9ybWFsICkgKSApO1xcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgMS4wICk7XFxuI2lmZGVmIFJFRkxFQ1RJVklUWVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuI2VuZGlmXFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IGNsZWFyY29hdDtcXG5cXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcXG5cXHRcXHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZVdiApLng7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXFxuXFx0XFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xcblxcdCNlbmRpZlxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IHNhdHVyYXRlKCBtYXRlcmlhbC5jbGVhcmNvYXQgKTtcXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XFxuXFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcblxcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1NIRUVOXFxuXFx0bWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG5cXHRmbG9hdCBzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGZsb2F0IGNsZWFyY29hdDtcXG5cXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9TSEVFTlxcblxcdHZlYzMgc2hlZW5Db2xvcjtcXG4jZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIENMRUFSQ09BVFxcblxcdFxcdGZsb2F0IGNjRG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0XFx0dmVjMyBjY0lycmFkaWFuY2UgPSBjY0RvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0Y2NJcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9TSEVFTlxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcXG5cXHRcXHRcXHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24sXFxuXFx0XFx0XFx0Z2VvbWV0cnksXFxuXFx0XFx0XFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxcblxcdFxcdCk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcXG5cXHRcXHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcXG5cXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIG11bHRpU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XFxuXFx0QlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XFxuXFx0dmVjMyBkaWZmdXNlID0gbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XFxufVwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X2JlZ2luID0gXCJcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcXG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7XFxuXFx0I2VuZGlmXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG4jZW5kaWZcXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcXG5cXHRcXHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcXG5cXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0XFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdH1cXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0aWJsSXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdFxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdFxcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xcblxcdCNlbHNlXFxuXFx0XFx0aWYgKCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKSB7XFxuXFx0XFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xcblxcdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFydGljbGVfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgbWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nO1xcbiNlbmRpZlwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDEgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaHRhcmdldF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCJmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDtcXG4jaWZkZWYgRkxBVF9TSEFERURcXG5cXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcXG4jZWxzZVxcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dmVjMyB0YW5nZW50ID0gbm9ybWFsaXplKCB2VGFuZ2VudCApO1xcblxcdFxcdHZlYzMgYml0YW5nZW50ID0gbm9ybWFsaXplKCB2Qml0YW5nZW50ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHRhbmdlbnQgPSB0YW5nZW50ICogZmFjZURpcmVjdGlvbjtcXG5cXHRcXHRcXHRiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxcblxcdFxcdFxcdG1hdDMgdlRCTiA9IG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDtcIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9tYXBzID0gXCIjaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXFxuXFx0bm9ybWFsID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHQjaWZkZWYgRkxJUF9TSURFRFxcblxcdFxcdG5vcm1hbCA9IC0gbm9ybWFsO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uO1xcblxcdCNlbmRpZlxcblxcdG5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XFxuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXFxuXFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRtYXBOLnh5ICo9IG5vcm1hbFNjYWxlO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcXG5cXHQjZWxzZVxcblxcdFxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBtYXBOLCBmYWNlRGlyZWN0aW9uICk7XFxuXFx0I2VuZGlmXFxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7XFxuI2VuZGlmXCI7XG5cbnZhciBub3JtYWxtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xcbiNlbmRpZlxcbiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xcbiNlbmRpZlxcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMyBtYXBOLCBmbG9hdCBmYWNlRGlyZWN0aW9uICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMyBOID0gc3VyZl9ub3JtO1xcblxcdFxcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XFxuXFx0XFx0dmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTtcXG5cXHRcXHR2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54O1xcblxcdFxcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XFxuXFx0XFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogZmFjZURpcmVjdGlvbiAqIGludmVyc2VzcXJ0KCBkZXQgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBUICogKCBtYXBOLnggKiBzY2FsZSApICsgQiAqICggbWFwTi55ICogc2NhbGUgKSArIE4gKiBtYXBOLnogKTtcXG5cXHR9XFxuI2VuZGlmXCI7XG5cbnZhciBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCIjaWZkZWYgQ0xFQVJDT0FUXFxuXFx0dmVjMyBjbGVhcmNvYXROb3JtYWwgPSBnZW9tZXRyeU5vcm1hbDtcXG4jZW5kaWZcIjtcblxudmFyIGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXFxuXFx0dmVjMyBjbGVhcmNvYXRNYXBOID0gdGV4dHVyZTJEKCBjbGVhcmNvYXROb3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdGNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIGNsZWFyY29hdE1hcE4gKTtcXG5cXHQjZWxzZVxcblxcdFxcdGNsZWFyY29hdE5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0TWFwTiwgZmFjZURpcmVjdGlvbiApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdFJvdWdobmVzc01hcDtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xcbiNlbmRpZlwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgMjU2LiApO1xcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xcblxcdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xcblxcdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XFx0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcXG59XFxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcXG5cXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XFxufVxcbnZlYzQgcGFjazJIYWxmVG9SR0JBKCB2ZWMyIHYgKSB7XFxuXFx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSk7XFxuXFx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncpO1xcbn1cXG52ZWMyIHVucGFja1JHQkFUbzJIYWxmKCB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XFxufVxcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xcbn1cXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xcbn1cXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XFxufVxcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xcbn1cIjtcblxudmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSBcIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcIjtcblxudmFyIHByb2plY3RfdmVydGV4ID0gXCJ2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0bXZQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogbXZQb3NpdGlvbjtcXG4jZW5kaWZcXG5tdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjtcXG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1wiO1xuXG52YXIgZGl0aGVyaW5nX2ZyYWdtZW50ID0gXCIjaWZkZWYgRElUSEVSSU5HXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBESVRIRVJJTkdcXG5cXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcXG5cXHRcXHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XFxuXFx0XFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcXG5cXHRcXHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xcblxcdFxcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xcblxcdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0fTtcXG5cXHRcXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0c3RydWN0IFBvaW50TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XFxuXFx0fVxcblxcdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xcblxcdFxcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XFxuXFx0XFx0ZmxvYXQgb2NjbHVzaW9uID0gMS4wO1xcblxcdFxcdHZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XFxuXFx0XFx0ZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcXG5cXHRcXHRpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkge1xcblxcdFxcdFxcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcXG5cXHRcXHRcXHRmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xcblxcdFxcdFxcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XFx0XFx0XFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XFx0XFx0XFx0b2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBvY2NsdXNpb247XFxuXFx0fVxcblxcdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdFxcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xcblxcdFxcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcXG5cXHRcXHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xcblxcdFxcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xcblxcdFxcdGlmICggZnJ1c3R1bVRlc3QgKSB7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XFxuXFx0XFx0XFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xcblxcdFxcdFxcdGZsb2F0IGR4MyA9IGR4MSAvIDIuMDtcXG5cXHRcXHRcXHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XFxuXFx0XFx0XFx0c2hhZG93ID0gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDE3LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSB0ZXhlbFNpemUueDtcXG5cXHRcXHRcXHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xcblxcdFxcdFxcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcXG5cXHRcXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7XFxuXFx0XFx0XFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksXFxuXFx0XFx0XFx0XFx0XFx0IGYueCApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnggKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHQgZi55ICkgK1xcblxcdFxcdFxcdFxcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0XFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXFxuXFx0XFx0XFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHR9O1xcblxcdFxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcXG5cXHRcXHR9O1xcblxcdFxcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dmVjMyBzaGFkb3dXb3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0dmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcXG5cXHRcXHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XFxuXFx0XFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xcblxcdFxcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xcblxcdFxcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcXG5cXHRcXHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XFxuXFx0XFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIHNoYWRvdztcXG59XCI7XG5cbnZhciBza2luYmFzZV92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcXG5cXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcXG5cXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcXG5cXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xcblxcdCNpZmRlZiBCT05FX1RFWFRVUkVcXG5cXHRcXHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcXG5cXHRcXHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdGZsb2F0IGogPSBpICogNC4wO1xcblxcdFxcdFxcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdHkgPSBkeSAqICggeSArIDAuNSApO1xcblxcdFxcdFxcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBib25lTWF0cmljZXNbIGludChpKSBdO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XFxuXFx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5ub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcXG5cXHRza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHRvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XFxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xcblxcdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XFxuI2Vsc2VcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xcblxcdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XFxufVxcbnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7XFxuXFx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XFxuXFx0dmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTtcXG5cXHRyZXR1cm4gYSAvIGI7XFxufVxcbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0MyhcXG5cXHRcXHR2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksXFx0XFx0dmVjMyggMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyApLFxcblxcdFxcdHZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKVxcblxcdCk7XFxuXFx0Y29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0MyhcXG5cXHRcXHR2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksXFx0XFx0dmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLFxcblxcdFxcdHZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKVxcblxcdCk7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjtcXG5cXHRjb2xvciA9IEFDRVNJbnB1dE1hdCAqIGNvbG9yO1xcblxcdGNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApO1xcblxcdGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xcblxcdHJldHVybiBzYXR1cmF0ZSggY29sb3IgKTtcXG59XFxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9XCI7XG5cbnZhciB0cmFuc21pc3Npb25tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXFxuXFx0dG90YWxUcmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZVdiApLnI7XFxuI2VuZGlmXCI7XG5cbnZhciB0cmFuc21pc3Npb25tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XFxuI2VuZGlmXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgKCBkZWZpbmVkKCBVU0VfVVYgKSAmJiAhIGRlZmluZWQoIFVWU19WRVJURVhfT05MWSApIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfVVZcXG5cXHQjaWZkZWYgVVZTX1ZFUlRFWF9PTkxZXFxuXFx0XFx0dmVjMiB2VXY7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzIgdlV2O1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG4jZW5kaWZcIjtcblxudmFyIHV2X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9VVlxcblxcdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdGF0dHJpYnV0ZSB2ZWMyIHV2MjtcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG5cXHR1bmlmb3JtIG1hdDMgdXYyVHJhbnNmb3JtO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dlV2MiA9ICggdXYyVHJhbnNmb3JtICogdmVjMyggdXYyLCAxICkgKS54eTtcXG4jZW5kaWZcIjtcblxudmFyIHdvcmxkcG9zX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcXG5cXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0I2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0XFx0d29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHR3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xcbiNlbmRpZlwiO1xuXG52YXIgYmFja2dyb3VuZF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XFxudmFyeWluZyB2ZWMyIHZVdjtcXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcXG5cXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIGJhY2tncm91bmRfdmVydCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxudm9pZCBtYWluKCkge1xcblxcdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XFxuXFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcXG59XCI7XG5cbnZhciBjdWJlX2ZyYWcgPSBcIiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyB2UmVmbGVjdCA9IHZXb3JsZERpcmVjdGlvbjtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IGVudkNvbG9yO1xcblxcdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgY3ViZV92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XFxufVwiO1xuXG52YXIgZGVwdGhfZnJhZyA9IFwiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdGZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XFxuXFx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7XFxuXFx0I2VuZGlmXFxufVwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dztcXG59XCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfZnJhZyA9IFwiI2RlZmluZSBESVNUQU5DRVxcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcXG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcXG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluICgpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XFxuXFx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xcblxcdGRpc3QgPSBzYXR1cmF0ZSggZGlzdCApO1xcblxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xcbn1cIjtcblxudmFyIGRpc3RhbmNlUkdCQV92ZXJ0ID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxufVwiO1xuXG52YXIgZXF1aXJlY3RfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcXG5cXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBlcXVpcmVjdF92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFxuXFx0XFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcblxcdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gKCBnbF9Gcm9udEZhY2luZyApID8gdkluZGlyZWN0RnJvbnQgOiB2SW5kaXJlY3RCYWNrO1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZJbmRpcmVjdEZyb250O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG5cXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX2ZyYWcgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdHZlYzMgdmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xcblxcdHZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcXG5cXHR2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApO1xcblxcdHZlYzIgdXYgPSB2ZWMyKCBkb3QoIHgsIG5vcm1hbCApLCBkb3QoIHksIG5vcm1hbCApICkgKiAwLjQ5NSArIDAuNTtcXG5cXHQjaWZkZWYgVVNFX01BVENBUFxcblxcdFxcdHZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcXG5cXHRcXHRtYXRjYXBDb2xvciA9IG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX3ZlcnQgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdFxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxufVwiO1xuXG52YXIgbWVzaHRvb25fZnJhZyA9IFwiI2RlZmluZSBUT09OXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c190b29uX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIG1lc2h0b29uX3ZlcnQgPSBcIiNkZWZpbmUgVE9PTlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgbWVzaHBob25nX3ZlcnQgPSBcIiNkZWZpbmUgUEhPTkdcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gXCIjZGVmaW5lIFNUQU5EQVJEXFxuI2lmZGVmIFBIWVNJQ0FMXFxuXFx0I2RlZmluZSBSRUZMRUNUSVZJVFlcXG5cXHQjZGVmaW5lIENMRUFSQ09BVFxcblxcdCNkZWZpbmUgVFJBTlNNSVNTSU9OXFxuI2VuZGlmXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZkZWYgVFJBTlNNSVNTSU9OXFxuXFx0dW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247XFxuI2VuZGlmXFxuI2lmZGVmIFJFRkxFQ1RJVklUWVxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBDTEVBUkNPQVRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1NIRUVOXFxuXFx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dHJhbnNtaXNzaW9ubWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2lmZGVmIFRSQU5TTUlTU0lPTlxcblxcdFxcdGZsb2F0IHRvdGFsVHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRyYW5zbWlzc2lvbm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpZmRlZiBUUkFOU01JU1NJT05cXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSAqPSBtaXgoIHNhdHVyYXRlKCAxLiAtIHRvdGFsVHJhbnNtaXNzaW9uICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKSwgMS4wLCBtZXRhbG5lc3MgKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNocGh5c2ljYWxfdmVydCA9IFwiI2RlZmluZSBTVEFOREFSRFxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xcblxcdFxcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBub3JtYWxfZnJhZyA9IFwiI2RlZmluZSBOT1JNQUxcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xcblxcdFxcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XFxuXFx0XFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcbn1cIjtcblxudmFyIHBvaW50c19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgcG9pbnRzX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcXG5cXHRcXHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIHNoYWRvd19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgY29sb3I7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgc2hhZG93X3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVwiO1xuXG52YXIgc3ByaXRlX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBzcHJpdGVfdmVydCA9IFwidW5pZm9ybSBmbG9hdCByb3RhdGlvbjtcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XFxuXFx0dmVjMiBzY2FsZTtcXG5cXHRzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTtcXG5cXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcXG5cXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cXG5cXHRcXHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XFxuXFx0XFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7XFxuXFx0I2VuZGlmXFxuXFx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcXG5cXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcXG5cXHRyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XFxuXFx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xcblxcdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbmNvbnN0IFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcblx0ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfdG9vbl9mcmFnbWVudDogbGlnaHRzX3Rvb25fZnJhZ21lbnQsXG5cdGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLFxuXHRsaWdodHNfZnJhZ21lbnRfbWFwczogbGlnaHRzX2ZyYWdtZW50X21hcHMsXG5cdGxpZ2h0c19mcmFnbWVudF9lbmQ6IGxpZ2h0c19mcmFnbWVudF9lbmQsXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcblx0bWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsXG5cdG5vcm1hbF9mcmFnbWVudF9iZWdpbjogbm9ybWFsX2ZyYWdtZW50X2JlZ2luLFxuXHRub3JtYWxfZnJhZ21lbnRfbWFwczogbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjogY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OiBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCxcblx0cGFja2luZzogcGFja2luZyxcblx0cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCxcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcblx0ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxuXHRzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCxcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcblx0c2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxuXHRzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHRyYW5zbWlzc2lvbm1hcF9mcmFnbWVudDogdHJhbnNtaXNzaW9ubWFwX2ZyYWdtZW50LFxuXHR0cmFuc21pc3Npb25tYXBfcGFyc19mcmFnbWVudDogdHJhbnNtaXNzaW9ubWFwX3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCxcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXG5cdHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCxcblx0dXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsXG5cdHV2Ml92ZXJ0ZXg6IHV2Ml92ZXJ0ZXgsXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxuXG5cdGJhY2tncm91bmRfZnJhZzogYmFja2dyb3VuZF9mcmFnLFxuXHRiYWNrZ3JvdW5kX3ZlcnQ6IGJhY2tncm91bmRfdmVydCxcblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaG1hdGNhcF9mcmFnOiBtZXNobWF0Y2FwX2ZyYWcsXG5cdG1lc2htYXRjYXBfdmVydDogbWVzaG1hdGNhcF92ZXJ0LFxuXHRtZXNodG9vbl9mcmFnOiBtZXNodG9vbl9mcmFnLFxuXHRtZXNodG9vbl92ZXJ0OiBtZXNodG9vbl92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnQsXG5cdHNwcml0ZV9mcmFnOiBzcHJpdGVfZnJhZyxcblx0c3ByaXRlX3ZlcnQ6IHNwcml0ZV92ZXJ0XG59O1xuXG4vKipcbiAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzXG4gKi9cblxuY29uc3QgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0dXYyVHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGxpZ2h0UHJvYmU6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93Tm9ybWFsQmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXHRcdFx0Y29uZUNvczoge30sXG5cdFx0XHRwZW51bWJyYUNvczoge30sXG5cdFx0XHRkZWNheToge31cblx0XHR9IH0sXG5cblx0XHRzcG90TGlnaHRTaGFkb3dzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdHNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0c3BvdFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH0sXG5cblx0XHRsdGNfMTogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGx0Y18yOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH0sXG5cblx0c3ByaXRlOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRjZW50ZXI6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApIH0sXG5cdFx0cm90YXRpb246IHsgdmFsdWU6IDAuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH1cblxufTtcblxuY29uc3QgU2hhZGVyTGliID0ge1xuXG5cdGJhc2ljOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWdcblxuXHR9LFxuXG5cdGxhbWJlcnQ6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXG5cblx0fSxcblxuXHRwaG9uZzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ19mcmFnXG5cblx0fSxcblxuXHRzdGFuZGFyZDoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRcdFx0bWV0YWxuZXNzOiB7IHZhbHVlOiAwLjAgfSxcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxuXHR9LFxuXG5cdHRvb246IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fZnJhZ1xuXG5cdH0sXG5cblx0bWF0Y2FwOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0bWF0Y2FwOiB7IHZhbHVlOiBudWxsIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaG1hdGNhcF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHRzcHJpdGU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcHJpdGUsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNwcml0ZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZ1xuXG5cdH0sXG5cblx0YmFja2dyb3VuZDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0XHR0MkQ6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfZnJhZ1xuXG5cdH0sXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGN1YmU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xuXG5cdH0sXG5cblx0ZXF1aXJlY3Q6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnXG5cblx0fSxcblxuXHRkaXN0YW5jZVJHQkE6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdHJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH0sXG5cdFx0XHRcdG5lYXJEaXN0YW5jZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcblxuXHR9LFxuXG5cdHNoYWRvdzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0Y29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMCApIH0sXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9LFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnXG5cblx0fVxuXG59O1xuXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XG5cblx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXG5cdFx0e1xuXHRcdFx0Y2xlYXJjb2F0OiB7IHZhbHVlOiAwIH0sXG5cdFx0XHRjbGVhcmNvYXRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9LFxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRzaGVlbjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHR0cmFuc21pc3Npb246IHsgdmFsdWU6IDAgfSxcblx0XHRcdHRyYW5zbWlzc2lvbk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH1cblx0XSApLFxuXG5cdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG59O1xuXG5mdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBjdWJlbWFwcywgc3RhdGUsIG9iamVjdHMsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRjb25zdCBjbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHRsZXQgY2xlYXJBbHBoYSA9IDA7XG5cblx0bGV0IHBsYW5lTWVzaDtcblx0bGV0IGJveE1lc2g7XG5cblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IDA7XG5cdGxldCBjdXJyZW50VG9uZW1hcHBpbmcgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIHJlbmRlciggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApIHtcblxuXHRcdGxldCBiYWNrZ3JvdW5kID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLmJhY2tncm91bmQgOiBudWxsO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRiYWNrZ3JvdW5kID0gY3ViZW1hcHMuZ2V0KCBiYWNrZ3JvdW5kICk7XG5cblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgYmFja2dyb3VuZCBpbiBBUlxuXHRcdC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy5cblxuXHRcdGNvbnN0IHhyID0gcmVuZGVyZXIueHI7XG5cdFx0Y29uc3Qgc2Vzc2lvbiA9IHhyLmdldFNlc3Npb24gJiYgeHIuZ2V0U2Vzc2lvbigpO1xuXG5cdFx0aWYgKCBzZXNzaW9uICYmIHNlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICdhZGRpdGl2ZScgKSB7XG5cblx0XHRcdGJhY2tncm91bmQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiAoIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSB8fCBiYWNrZ3JvdW5kLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94R2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsJyxcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBTaGFkZXJMaWIuY3ViZS51bmlmb3JtcyApLFxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmN1YmUuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRcdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIGVuYWJsZSBjb2RlIGluamVjdGlvbiBmb3Igbm9uLWJ1aWx0LWluIG1hdGVyaWFsXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggYm94TWVzaC5tYXRlcmlhbCwgJ2Vudk1hcCcsIHtcblxuXHRcdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdG9iamVjdHMudXBkYXRlKCBib3hNZXNoICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgJiYgYmFja2dyb3VuZC5fbmVlZHNGbGlwRW52TWFwICkgPyAtIDEgOiAxO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0Ym94TWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSBiYWNrZ3JvdW5kLnZlcnNpb247XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0XG5cdFx0XHRyZW5kZXJMaXN0LnVuc2hpZnQoIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggcGxhbmVNZXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kTWF0ZXJpYWwnLFxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5iYWNrZ3JvdW5kLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEZyb250U2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRwbGFuZU1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXG5cdFx0XHRcdC8vIGVuYWJsZSBjb2RlIGluamVjdGlvbiBmb3Igbm9uLWJ1aWx0LWluIG1hdGVyaWFsXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggcGxhbmVNZXNoLm1hdGVyaWFsLCAnbWFwJywge1xuXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0b2JqZWN0cy51cGRhdGUoIHBsYW5lTWVzaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRpZiAoIGJhY2tncm91bmQubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBiYWNrZ3JvdW5kLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IGJhY2tncm91bmQudmVyc2lvbjtcblx0XHRcdFx0Y3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XG5cblx0XHRcdH1cblxuXG5cdFx0XHQvLyBwdXNoIHRvIHRoZSBwcmUtc29ydGVkIG9wYXF1ZSByZW5kZXIgbGlzdFxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBwbGFuZU1lc2gsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckNvbG9yO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSA9IDEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0Z2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJBbHBoYTtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0cmVuZGVyOiByZW5kZXJcblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQmluZGluZ1N0YXRlcyggZ2wsIGV4dGVuc2lvbnMsIGF0dHJpYnV0ZXMsIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNDkyMSApO1xuXG5cdGNvbnN0IGV4dGVuc2lvbiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMiA/IG51bGwgOiBleHRlbnNpb25zLmdldCggJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0JyApO1xuXHRjb25zdCB2YW9BdmFpbGFibGUgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgfHwgZXh0ZW5zaW9uICE9PSBudWxsO1xuXG5cdGNvbnN0IGJpbmRpbmdTdGF0ZXMgPSB7fTtcblxuXHRjb25zdCBkZWZhdWx0U3RhdGUgPSBjcmVhdGVCaW5kaW5nU3RhdGUoIG51bGwgKTtcblx0bGV0IGN1cnJlbnRTdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcblxuXHRmdW5jdGlvbiBzZXR1cCggb2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIGluZGV4ICkge1xuXG5cdFx0bGV0IHVwZGF0ZUJ1ZmZlcnMgPSBmYWxzZTtcblxuXHRcdGlmICggdmFvQXZhaWxhYmxlICkge1xuXG5cdFx0XHRjb25zdCBzdGF0ZSA9IGdldEJpbmRpbmdTdGF0ZSggZ2VvbWV0cnksIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHRcdGlmICggY3VycmVudFN0YXRlICE9PSBzdGF0ZSApIHtcblxuXHRcdFx0XHRjdXJyZW50U3RhdGUgPSBzdGF0ZTtcblx0XHRcdFx0YmluZFZlcnRleEFycmF5T2JqZWN0KCBjdXJyZW50U3RhdGUub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlQnVmZmVycyA9IG5lZWRzVXBkYXRlKCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdFx0aWYgKCB1cGRhdGVCdWZmZXJzICkgc2F2ZUNhY2hlKCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHdpcmVmcmFtZSA9ICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHRcdGlmICggY3VycmVudFN0YXRlLmdlb21ldHJ5ICE9PSBnZW9tZXRyeS5pZCB8fFxuXHRcdFx0XHRjdXJyZW50U3RhdGUucHJvZ3JhbSAhPT0gcHJvZ3JhbS5pZCB8fFxuXHRcdFx0XHRjdXJyZW50U3RhdGUud2lyZWZyYW1lICE9PSB3aXJlZnJhbWUgKSB7XG5cblx0XHRcdFx0Y3VycmVudFN0YXRlLmdlb21ldHJ5ID0gZ2VvbWV0cnkuaWQ7XG5cdFx0XHRcdGN1cnJlbnRTdGF0ZS5wcm9ncmFtID0gcHJvZ3JhbS5pZDtcblx0XHRcdFx0Y3VycmVudFN0YXRlLndpcmVmcmFtZSA9IHdpcmVmcmFtZTtcblxuXHRcdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgMzQ5NjMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlQnVmZmVycyApIHtcblxuXHRcdFx0c2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGdsLmJpbmRCdWZmZXIoIDM0OTYzLCBhdHRyaWJ1dGVzLmdldCggaW5kZXggKS5idWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhBcnJheU9iamVjdCgpIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG5cblx0XHRyZXR1cm4gZXh0ZW5zaW9uLmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggdmFvICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gZ2wuYmluZFZlcnRleEFycmF5KCB2YW8gKTtcblxuXHRcdHJldHVybiBleHRlbnNpb24uYmluZFZlcnRleEFycmF5T0VTKCB2YW8gKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVsZXRlVmVydGV4QXJyYXlPYmplY3QoIHZhbyApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGdsLmRlbGV0ZVZlcnRleEFycmF5KCB2YW8gKTtcblxuXHRcdHJldHVybiBleHRlbnNpb24uZGVsZXRlVmVydGV4QXJyYXlPRVMoIHZhbyApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRCaW5kaW5nU3RhdGUoIGdlb21ldHJ5LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdGNvbnN0IHdpcmVmcmFtZSA9ICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHRsZXQgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIHByb2dyYW1NYXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbU1hcCA9IHt9O1xuXHRcdFx0YmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9IHByb2dyYW1NYXA7XG5cblx0XHR9XG5cblx0XHRsZXQgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF07XG5cblx0XHRpZiAoIHN0YXRlTWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN0YXRlTWFwID0ge307XG5cdFx0XHRwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPSBzdGF0ZU1hcDtcblxuXHRcdH1cblxuXHRcdGxldCBzdGF0ZSA9IHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdGlmICggc3RhdGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3RhdGUgPSBjcmVhdGVCaW5kaW5nU3RhdGUoIGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkgKTtcblx0XHRcdHN0YXRlTWFwWyB3aXJlZnJhbWUgXSA9IHN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVCaW5kaW5nU3RhdGUoIHZhbyApIHtcblxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBbXTtcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IFtdO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZURpdmlzb3JzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cblx0XHRcdC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9uIG5vbi1WQU8gc3VwcG9ydCBicm93c2VyXG5cdFx0XHRnZW9tZXRyeTogbnVsbCxcblx0XHRcdHByb2dyYW06IG51bGwsXG5cdFx0XHR3aXJlZnJhbWU6IGZhbHNlLFxuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzOiBuZXdBdHRyaWJ1dGVzLFxuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXM6IGVuYWJsZWRBdHRyaWJ1dGVzLFxuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnM6IGF0dHJpYnV0ZURpdmlzb3JzLFxuXHRcdFx0b2JqZWN0OiB2YW8sXG5cdFx0XHRhdHRyaWJ1dGVzOiB7fSxcblx0XHRcdGluZGV4OiBudWxsXG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBuZWVkc1VwZGF0ZSggZ2VvbWV0cnksIGluZGV4ICkge1xuXG5cdFx0Y29uc3QgY2FjaGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRsZXQgYXR0cmlidXRlc051bSA9IDA7XG5cblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRjb25zdCBjYWNoZWRBdHRyaWJ1dGUgPSBjYWNoZWRBdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHJldHVybiB0cnVlO1xuXG5cdFx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZS5hdHRyaWJ1dGUgIT09IGdlb21ldHJ5QXR0cmlidXRlICkgcmV0dXJuIHRydWU7XG5cblx0XHRcdGlmICggY2FjaGVkQXR0cmlidXRlLmRhdGEgIT09IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEgKSByZXR1cm4gdHJ1ZTtcblxuXHRcdFx0YXR0cmlidXRlc051bSArKztcblxuXHRcdH1cblxuXHRcdGlmICggY3VycmVudFN0YXRlLmF0dHJpYnV0ZXNOdW0gIT09IGF0dHJpYnV0ZXNOdW0gKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGlmICggY3VycmVudFN0YXRlLmluZGV4ICE9PSBpbmRleCApIHJldHVybiB0cnVlO1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzYXZlQ2FjaGUoIGdlb21ldHJ5LCBpbmRleCApIHtcblxuXHRcdGNvbnN0IGNhY2hlID0ge307XG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0bGV0IGF0dHJpYnV0ZXNOdW0gPSAwO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHRjb25zdCBkYXRhID0ge307XG5cdFx0XHRkYXRhLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuZGF0YSApIHtcblxuXHRcdFx0XHRkYXRhLmRhdGEgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjYWNoZVsga2V5IF0gPSBkYXRhO1xuXG5cdFx0XHRhdHRyaWJ1dGVzTnVtICsrO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudFN0YXRlLmF0dHJpYnV0ZXMgPSBjYWNoZTtcblx0XHRjdXJyZW50U3RhdGUuYXR0cmlidXRlc051bSA9IGF0dHJpYnV0ZXNOdW07XG5cblx0XHRjdXJyZW50U3RhdGUuaW5kZXggPSBpbmRleDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLm5ld0F0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIDAgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0Y29uc3QgbmV3QXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5uZXdBdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZURpdmlzb3JzID0gY3VycmVudFN0YXRlLmF0dHJpYnV0ZURpdmlzb3JzO1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gZ2wgOiBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ3ZlcnRleEF0dHJpYkRpdmlzb3InIDogJ3ZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRScgXSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlcztcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5lbmFibGVkQXR0cmlidXRlcztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyID09PSB0cnVlICYmICggdHlwZSA9PT0gNTEyNCB8fCB0eXBlID09PSA1MTI1ICkgKSB7XG5cblx0XHRcdGdsLnZlcnRleEF0dHJpYklQb2ludGVyKCBpbmRleCwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG9iamVjdCwgbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgPT09IGZhbHNlICYmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCB8fCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3JtYWxpemVkO1xuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xuXG5cdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0dmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LCBvZmZzZXQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbmFtZSA9PT0gJ2luc3RhbmNlTWF0cml4JyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBvYmplY3QuaW5zdGFuY2VNYXRyaXggKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gYXR0cmlidXRlLnR5cGU7XG5cblx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlICsgMCwgMSApO1xuXHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUgKyAxLCAxICk7XG5cdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSArIDIsIDEgKTtcblx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlICsgMywgMSApO1xuXG5cdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSArIDAsIDQsIHR5cGUsIGZhbHNlLCA2NCwgMCApO1xuXHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUgKyAxLCA0LCB0eXBlLCBmYWxzZSwgNjQsIDE2ICk7XG5cdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSArIDIsIDQsIHR5cGUsIGZhbHNlLCA2NCwgMzIgKTtcblx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlICsgMywgNCwgdHlwZSwgZmFsc2UsIDY0LCA0OCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG5hbWUgPT09ICdpbnN0YW5jZUNvbG9yJyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBvYmplY3QuaW5zdGFuY2VDb2xvciApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblxuXHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIDEgKTtcblxuXHRcdFx0XHRcdGdsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIDMsIHR5cGUsIGZhbHNlLCAxMiwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVzZXQoKTtcblxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcblxuXHRcdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5SWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3QgcHJvZ3JhbUlkIGluIHByb2dyYW1NYXAgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcblxuXHRcdFx0XHRmb3IgKCBjb25zdCB3aXJlZnJhbWUgaW4gc3RhdGVNYXAgKSB7XG5cblx0XHRcdFx0XHRkZWxldGVWZXJ0ZXhBcnJheU9iamVjdCggc3RhdGVNYXBbIHdpcmVmcmFtZSBdLm9iamVjdCApO1xuXG5cdFx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIHByb2dyYW1NYXBbIHByb2dyYW1JZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeUlkIF07XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5KCBnZW9tZXRyeSApIHtcblxuXHRcdGlmICggYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRmb3IgKCBjb25zdCBwcm9ncmFtSWQgaW4gcHJvZ3JhbU1hcCApIHtcblxuXHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xuXG5cdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XG5cblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbUlkIF07XG5cblx0XHR9XG5cblx0XHRkZWxldGUgYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVsZWFzZVN0YXRlc09mUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcblxuXHRcdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5SWQgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBzdGF0ZU1hcCA9IHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xuXG5cdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XG5cblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbS5pZCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZXNldCgpIHtcblxuXHRcdHJlc2V0RGVmYXVsdFN0YXRlKCk7XG5cblx0XHRpZiAoIGN1cnJlbnRTdGF0ZSA9PT0gZGVmYXVsdFN0YXRlICkgcmV0dXJuO1xuXG5cdFx0Y3VycmVudFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuXHRcdGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggY3VycmVudFN0YXRlLm9iamVjdCApO1xuXG5cdH1cblxuXHQvLyBmb3IgYmFja3dhcmQtY29tcGF0aWxpYml0eVxuXG5cdGZ1bmN0aW9uIHJlc2V0RGVmYXVsdFN0YXRlKCkge1xuXG5cdFx0ZGVmYXVsdFN0YXRlLmdlb21ldHJ5ID0gbnVsbDtcblx0XHRkZWZhdWx0U3RhdGUucHJvZ3JhbSA9IG51bGw7XG5cdFx0ZGVmYXVsdFN0YXRlLndpcmVmcmFtZSA9IGZhbHNlO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHJlc2V0OiByZXNldCxcblx0XHRyZXNldERlZmF1bHRTdGF0ZTogcmVzZXREZWZhdWx0U3RhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZSxcblx0XHRyZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeTogcmVsZWFzZVN0YXRlc09mR2VvbWV0cnksXG5cdFx0cmVsZWFzZVN0YXRlc09mUHJvZ3JhbTogcmVsZWFzZVN0YXRlc09mUHJvZ3JhbSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXNcblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0bGV0IG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIDEgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcblxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0bGV0IGV4dGVuc2lvbiwgbWV0aG9kTmFtZTtcblxuXHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGdsO1xuXHRcdFx0bWV0aG9kTmFtZSA9ICdkcmF3QXJyYXlzSW5zdGFuY2VkJztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblx0XHRcdG1ldGhvZE5hbWUgPSAnZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFJztcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb25bIG1ldGhvZE5hbWUgXSggbW9kZSwgc3RhcnQsIGNvdW50LCBwcmltY291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgcHJpbWNvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHtcblxuXHRsZXQgbWF4QW5pc290cm9weTtcblxuXHRmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkge1xuXG5cdFx0aWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggMzU2MzMsIDM2MzM4ICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0XHRnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMyLCAzNjMzOCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdoaWdocCc7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJlY2lzaW9uID0gJ21lZGl1bXAnO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMzLCAzNjMzNyApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdFx0Z2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCAzNTYzMiwgMzYzMzcgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnbWVkaXVtcCc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiAnbG93cCc7XG5cblx0fVxuXG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cdGNvbnN0IGlzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICkgfHxcblx0XHQoIHR5cGVvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCApO1xuXHQvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG5cblx0bGV0IHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XG5cdGNvbnN0IG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdGNvbnN0IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWU7XG5cblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM0OTMwICk7XG5cdGNvbnN0IG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNTY2MCApO1xuXHRjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzM3OSApO1xuXHRjb25zdCBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzQwNzYgKTtcblxuXHRjb25zdCBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNDkyMSApO1xuXHRjb25zdCBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggMzYzNDcgKTtcblx0Y29uc3QgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIDM2MzQ4ICk7XG5cdGNvbnN0IG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM2MzQ5ICk7XG5cblx0Y29uc3QgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdGNvbnN0IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9IGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdGNvbnN0IGZsb2F0VmVydGV4VGV4dHVyZXMgPSB2ZXJ0ZXhUZXh0dXJlcyAmJiBmbG9hdEZyYWdtZW50VGV4dHVyZXM7XG5cblx0Y29uc3QgbWF4U2FtcGxlcyA9IGlzV2ViR0wyID8gZ2wuZ2V0UGFyYW1ldGVyKCAzNjE4MyApIDogMDtcblxuXHRyZXR1cm4ge1xuXG5cdFx0aXNXZWJHTDI6IGlzV2ViR0wyLFxuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzLFxuXG5cdFx0bWF4U2FtcGxlczogbWF4U2FtcGxlc1xuXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xDbGlwcGluZyggcHJvcGVydGllcyApIHtcblxuXHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0bGV0IGdsb2JhbFN0YXRlID0gbnVsbCxcblx0XHRudW1HbG9iYWxQbGFuZXMgPSAwLFxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXG5cdGNvbnN0IHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGVuYWJsZWQgPVxuXHRcdFx0cGxhbmVzLmxlbmd0aCAhPT0gMCB8fFxuXHRcdFx0ZW5hYmxlTG9jYWxDbGlwcGluZyB8fFxuXHRcdFx0Ly8gZW5hYmxlIHN0YXRlIG9mIHByZXZpb3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvXG5cdFx0XHQvLyBydW4gYW5vdGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6XG5cdFx0XHRudW1HbG9iYWxQbGFuZXMgIT09IDAgfHxcblx0XHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBlbmFibGVMb2NhbENsaXBwaW5nO1xuXG5cdFx0Z2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgMCApO1xuXHRcdG51bUdsb2JhbFBsYW5lcyA9IHBsYW5lcy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gZW5hYmxlZDtcblxuXHR9O1xuXG5cdHRoaXMuYmVnaW5TaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IHRydWU7XG5cdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U3RhdGUgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBjYW1lcmEsIHVzZUNhY2hlICkge1xuXG5cdFx0Y29uc3QgcGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsXG5cdFx0XHRjbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbixcblx0XHRcdGNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cblx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fCByZW5kZXJpbmdTaGFkb3dzICYmICEgY2xpcFNoYWRvd3MgKSB7XG5cblx0XHRcdC8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmdcblxuXHRcdFx0aWYgKCByZW5kZXJpbmdTaGFkb3dzICkge1xuXG5cdFx0XHRcdC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nXG5cblx0XHRcdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3Qgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxuXHRcdFx0XHRsR2xvYmFsID0gbkdsb2JhbCAqIDQ7XG5cblx0XHRcdGxldCBkc3RBcnJheSA9IG1hdGVyaWFsUHJvcGVydGllcy5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxuXG5cdFx0XHRkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBsR2xvYmFsLCB1c2VDYWNoZSApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcblx0XHRcdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDogMDtcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XG5cblx0XHR9XG5cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG5cblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xuXG5cdFx0Y29uc3QgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwO1xuXHRcdGxldCBkc3RBcnJheSA9IG51bGw7XG5cblx0XHRpZiAoIG5QbGFuZXMgIT09IDAgKSB7XG5cblx0XHRcdGRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdFx0aWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5lcyAqIDQsXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRcdFx0dmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xuXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xuXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdHBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTtcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQ3ViZU1hcHMoIHJlbmRlcmVyICkge1xuXG5cdGxldCBjdWJlbWFwcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gbWFwVGV4dHVyZU1hcHBpbmcoIHRleHR1cmUsIG1hcHBpbmcgKSB7XG5cblx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nICkge1xuXG5cdFx0XHR0ZXh0dXJlLm1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHtcblxuXHRcdFx0dGV4dHVyZS5tYXBwaW5nID0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggdGV4dHVyZSApIHtcblxuXHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcblxuXHRcdFx0aWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHtcblxuXHRcdFx0XHRpZiAoIGN1YmVtYXBzLmhhcyggdGV4dHVyZSApICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgY3ViZW1hcCA9IGN1YmVtYXBzLmdldCggdGV4dHVyZSApLnRleHR1cmU7XG5cdFx0XHRcdFx0cmV0dXJuIG1hcFRleHR1cmVNYXBwaW5nKCBjdWJlbWFwLCB0ZXh0dXJlLm1hcHBpbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRcdFx0aWYgKCBpbWFnZSAmJiBpbWFnZS5oZWlnaHQgPiAwICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIGltYWdlLmhlaWdodCAvIDIgKTtcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldC5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSggcmVuZGVyZXIsIHRleHR1cmUgKTtcblx0XHRcdFx0XHRcdGN1YmVtYXBzLnNldCggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbWFwVGV4dHVyZU1hcHBpbmcoIHJlbmRlclRhcmdldC50ZXh0dXJlLCB0ZXh0dXJlLm1hcHBpbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIGltYWdlIG5vdCB5ZXQgcmVhZHkuIHRyeSB0aGUgY29udmVyc2lvbiBuZXh0IGZyYW1lXG5cblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRjb25zdCBjdWJlbWFwID0gY3ViZW1hcHMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIGN1YmVtYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y3ViZW1hcHMuZGVsZXRlKCB0ZXh0dXJlICk7XG5cdFx0XHRjdWJlbWFwLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdGN1YmVtYXBzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCApIHtcblxuXHRjb25zdCBleHRlbnNpb25zID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCBuYW1lICkge1xuXG5cdFx0aWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdGxldCBleHRlbnNpb247XG5cblx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApO1xuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGhhczogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gZ2V0RXh0ZW5zaW9uKCBuYW1lICkgIT09IG51bGw7XG5cblx0XHR9LFxuXG5cdFx0aW5pdDogZnVuY3Rpb24gKCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkge1xuXG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0Z2V0RXh0ZW5zaW9uKCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdFx0XHRnZXRFeHRlbnNpb24oICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0JyApO1xuXHRcdFx0XHRnZXRFeHRlbnNpb24oICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKTtcblx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKTtcblxuXHRcdH0sXG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMR2VvbWV0cmllcyggZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMgKSB7XG5cblx0Y29uc3QgZ2VvbWV0cmllcyA9IHt9O1xuXHRjb25zdCB3aXJlZnJhbWVBdHRyaWJ1dGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBnZW9tZXRyeS5pbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGNvbnN0IGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXMuZGVsZXRlKCBnZW9tZXRyeSApO1xuXG5cdFx0fVxuXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0ZGVsZXRlIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50O1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0LCBnZW9tZXRyeSApIHtcblxuXHRcdGlmICggZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdHJ1ZSApIHJldHVybiBnZW9tZXRyeTtcblxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF0gPSB0cnVlO1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBVcGRhdGluZyBpbmRleCBidWZmZXIgaW4gVkFPIG5vdy4gU2VlIFdlYkdMQmluZGluZ1N0YXRlcy5cblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIDM0OTYyICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXJyYXlbIGkgXSwgMzQ5NjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdGNvbnN0IGdlb21ldHJ5UG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdGxldCB2ZXJzaW9uID0gMDtcblxuXHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXHRcdFx0dmVyc2lvbiA9IGdlb21ldHJ5SW5kZXgudmVyc2lvbjtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdGNvbnN0IGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0Y29uc3QgYiA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0XHRjb25zdCBjID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gZ2VvbWV0cnlQb3NpdGlvbi5hcnJheTtcblx0XHRcdHZlcnNpb24gPSBnZW9tZXRyeVBvc2l0aW9uLnZlcnNpb247XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gaSArIDA7XG5cdFx0XHRcdGNvbnN0IGIgPSBpICsgMTtcblx0XHRcdFx0Y29uc3QgYyA9IGkgKyAyO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApO1xuXHRcdGF0dHJpYnV0ZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuXHRcdC8vIFVwZGF0aW5nIGluZGV4IGJ1ZmZlciBpbiBWQU8gbm93LiBTZWUgV2ViR0xCaW5kaW5nU3RhdGVzXG5cblx0XHQvL1xuXG5cdFx0Y29uc3QgcHJldmlvdXNBdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTtcblxuXHRcdGlmICggcHJldmlvdXNBdHRyaWJ1dGUgKSBhdHRyaWJ1dGVzLnJlbW92ZSggcHJldmlvdXNBdHRyaWJ1dGUgKTtcblxuXHRcdC8vXG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzLnNldCggZ2VvbWV0cnksIGF0dHJpYnV0ZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc3QgY3VycmVudEF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zdCBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cblx0XHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG9ic29sZXRlLCBjcmVhdGUgYSBuZXcgb25lXG5cblx0XHRcdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlLnZlcnNpb24gPCBnZW9tZXRyeUluZGV4LnZlcnNpb24gKSB7XG5cblx0XHRcdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5ICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblxuXHRcdGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmlidXRlXG5cblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHRsZXQgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0bGV0IHR5cGUsIGJ5dGVzUGVyRWxlbWVudDtcblxuXHRmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7XG5cblx0XHR0eXBlID0gdmFsdWUudHlwZTtcblx0XHRieXRlc1BlckVsZW1lbnQgPSB2YWx1ZS5ieXRlc1BlckVsZW1lbnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgMSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICkge1xuXG5cdFx0aWYgKCBwcmltY291bnQgPT09IDAgKSByZXR1cm47XG5cblx0XHRsZXQgZXh0ZW5zaW9uLCBtZXRob2ROYW1lO1xuXG5cdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZ2w7XG5cdFx0XHRtZXRob2ROYW1lID0gJ2RyYXdFbGVtZW50c0luc3RhbmNlZCc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cdFx0XHRtZXRob2ROYW1lID0gJ2RyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFJztcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uWyBtZXRob2ROYW1lIF0oIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCwgcHJpbWNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIHByaW1jb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMSW5mbyggZ2wgKSB7XG5cblx0Y29uc3QgbWVtb3J5ID0ge1xuXHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0dGV4dHVyZXM6IDBcblx0fTtcblxuXHRjb25zdCByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRyZW5kZXIuY2FsbHMgKys7XG5cblx0XHRzd2l0Y2ggKCBtb2RlICkge1xuXG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDIgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRyZW5kZXIucG9pbnRzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOicsIG1vZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0cmVuZGVyLmZyYW1lICsrO1xuXHRcdHJlbmRlci5jYWxscyA9IDA7XG5cdFx0cmVuZGVyLnRyaWFuZ2xlcyA9IDA7XG5cdFx0cmVuZGVyLnBvaW50cyA9IDA7XG5cdFx0cmVuZGVyLmxpbmVzID0gMDtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtZW1vcnk6IG1lbW9yeSxcblx0XHRyZW5kZXI6IHJlbmRlcixcblx0XHRwcm9ncmFtczogbnVsbCxcblx0XHRhdXRvUmVzZXQ6IHRydWUsXG5cdFx0cmVzZXQ6IHJlc2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gbnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYVsgMCBdIC0gYlsgMCBdO1xuXG59XG5cbmZ1bmN0aW9uIGFic051bWVyaWNhbFNvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIE1hdGguYWJzKCBiWyAxIF0gKSAtIE1hdGguYWJzKCBhWyAxIF0gKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wgKSB7XG5cblx0Y29uc3QgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0Y29uc3QgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0MzJBcnJheSggOCApO1xuXG5cdGNvbnN0IHdvcmtJbmZsdWVuY2VzID0gW107XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgODsgaSArKyApIHtcblxuXHRcdHdvcmtJbmZsdWVuY2VzWyBpIF0gPSBbIGksIDAgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApIHtcblxuXHRcdGNvbnN0IG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0Ly8gV2hlbiBvYmplY3QgZG9lc24ndCBoYXZlIG1vcnBoIHRhcmdldCBpbmZsdWVuY2VzIGRlZmluZWQsIHdlIHRyZWF0IGl0IGFzIGEgMC1sZW5ndGggYXJyYXlcblx0XHQvLyBUaGlzIGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgd2Ugc2V0IHVwIG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSAvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1xuXG5cdFx0Y29uc3QgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkID8gMCA6IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0bGV0IGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ29sbGVjdCBpbmZsdWVuY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggaSA8IGxlbmd0aCAmJiBpbmZsdWVuY2VzWyBpIF1bIDEgXSApIHtcblxuXHRcdFx0XHR3b3JrSW5mbHVlbmNlc1sgaSBdWyAwIF0gPSBpbmZsdWVuY2VzWyBpIF1bIDAgXTtcblx0XHRcdFx0d29ya0luZmx1ZW5jZXNbIGkgXVsgMSBdID0gaW5mbHVlbmNlc1sgaSBdWyAxIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0d29ya0luZmx1ZW5jZXNbIGkgXVsgMCBdID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cdFx0XHRcdHdvcmtJbmZsdWVuY2VzWyBpIF1bIDEgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHdvcmtJbmZsdWVuY2VzLnNvcnQoIG51bWVyaWNhbFNvcnQgKTtcblxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRsZXQgbW9ycGhJbmZsdWVuY2VzU3VtID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IHdvcmtJbmZsdWVuY2VzWyBpIF07XG5cdFx0XHRjb25zdCBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgdmFsdWUgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApICE9PSBtb3JwaFRhcmdldHNbIGluZGV4IF0gKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApICE9PSBtb3JwaE5vcm1hbHNbIGluZGV4IF0gKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpLCBtb3JwaE5vcm1hbHNbIGluZGV4IF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzU3VtICs9IHZhbHVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lmhhc0F0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEdMU0wgc2hhZGVyIHVzZXMgZm9ybXVsYSBiYXNlaW5mbHVlbmNlICogYmFzZSArIHN1bSh0YXJnZXQgKiBpbmZsdWVuY2UpXG5cdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgbW9ycGhzIGFuZCByZWxhdGl2ZSBtb3JwaHMgd2l0aG91dCBjaGFuZ2luZyBzaGFkZXIgY29kZVxuXHRcdC8vIFdoZW4gYmFzZWluZmx1ZW5jZSA9IDEgLSBzdW0oaW5mbHVlbmNlKSwgdGhlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG8gc3VtKCh0YXJnZXQgLSBiYXNlKSAqIGluZmx1ZW5jZSlcblx0XHRjb25zdCBtb3JwaEJhc2VJbmZsdWVuY2UgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA/IDEgOiAxIC0gbW9ycGhJbmZsdWVuY2VzU3VtO1xuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZScsIG1vcnBoQmFzZUluZmx1ZW5jZSApO1xuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBtb3JwaEluZmx1ZW5jZXMgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdsLCBnZW9tZXRyaWVzLCBhdHRyaWJ1dGVzLCBpbmZvICkge1xuXG5cdGxldCB1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0Y29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdGNvbnN0IGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIG9iamVjdCwgZ2VvbWV0cnkgKTtcblxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxuXG5cdFx0aWYgKCB1cGRhdGVNYXAuZ2V0KCBidWZmZXJnZW9tZXRyeSApICE9PSBmcmFtZSApIHtcblxuXHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRcdHVwZGF0ZU1hcC5zZXQoIGJ1ZmZlcmdlb21ldHJ5LCBmcmFtZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5oYXNFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBvYmplY3QuaW5zdGFuY2VNYXRyaXgsIDM0OTYyICk7XG5cblx0XHRcdGlmICggb2JqZWN0Lmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIG9iamVjdC5pbnN0YW5jZUNvbG9yLCAzNDk2MiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHR1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbkluc3RhbmNlZE1lc2hEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IGluc3RhbmNlZE1lc2ggPSBldmVudC50YXJnZXQ7XG5cblx0XHRpbnN0YW5jZWRNZXNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xuXG5cdFx0YXR0cmlidXRlcy5yZW1vdmUoIGluc3RhbmNlZE1lc2guaW5zdGFuY2VNYXRyaXggKTtcblxuXHRcdGlmICggaW5zdGFuY2VkTWVzaC5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkgYXR0cmlidXRlcy5yZW1vdmUoIGluc3RhbmNlZE1lc2guaW5zdGFuY2VDb2xvciApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuY2xhc3MgRGF0YVRleHR1cmUyREFycmF5IGV4dGVuZHMgVGV4dHVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSApIHtcblxuXHRcdHN1cGVyKCBudWxsICk7XG5cblx0XHR0aGlzLmltYWdlID0geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcblxuXHRcdHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuRGF0YVRleHR1cmUyREFycmF5LnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlMkRBcnJheSA9IHRydWU7XG5cbmNsYXNzIERhdGFUZXh0dXJlM0QgZXh0ZW5kcyBUZXh0dXJlIHtcblxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxICkge1xuXG5cdFx0Ly8gV2UncmUgZ29pbmcgdG8gYWRkIC5zZXRYWFgoKSBtZXRob2RzIGZvciBzZXR0aW5nIHByb3BlcnRpZXMgbGF0ZXIuXG5cdFx0Ly8gVXNlcnMgY2FuIHN0aWxsIHNldCBpbiBEYXRhVGV4dHVyZTNEIGRpcmVjdGx5LlxuXHRcdC8vXG5cdFx0Ly9cdGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuRGF0YVRleHR1cmUzRCggZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcblx0XHQvLyBcdHRleHR1cmUuYW5pc290cm9weSA9IDE2O1xuXHRcdC8vXG5cdFx0Ly8gU2VlICMxNDgzOVxuXG5cdFx0c3VwZXIoIG51bGwgKTtcblxuXHRcdHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXG5cdFx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH1cblxufVxuXG5EYXRhVGV4dHVyZTNELnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0QgPSB0cnVlO1xuXG4vKipcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICknLlxuICpcbiAqXG4gKiBQcm9wZXJ0aWVzIG9mIGlubmVyIG5vZGVzIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zXG4gKiAubWFwIC0gbmVzdGVkIHVuaWZvcm1zIGJ5IG5hbWVcbiAqXG4gKlxuICogTWV0aG9kcyBvZiBhbGwgbm9kZXMgZXhjZXB0IHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIHZhbHVlLCBbdGV4dHVyZXNdIClcbiAqXG4gKiBcdFx0dXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocylcbiAqICBcdHRoZSAndGV4dHVyZXMnIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5pZm9ybXNcbiAqXG4gKlxuICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAudXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZSdcbiAqXG4gKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXFcbiAqXG4gKiBcdFx0ZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXNcbiAqXG4gKlxuICogTWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAodGV4dHVyZXMgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlLCB0ZXh0dXJlcyApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbmNvbnN0IGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG5jb25zdCBlbXB0eVRleHR1cmUyZEFycmF5ID0gbmV3IERhdGFUZXh0dXJlMkRBcnJheSgpO1xuY29uc3QgZW1wdHlUZXh0dXJlM2QgPSBuZXcgRGF0YVRleHR1cmUzRCgpO1xuY29uc3QgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxuXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcblxuY29uc3QgYXJyYXlDYWNoZUYzMiA9IFtdO1xuY29uc3QgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxuY29uc3QgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcbmNvbnN0IG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDkgKTtcbmNvbnN0IG1hdDJhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDQgKTtcblxuLy8gRmxhdHRlbmluZyBmb3IgYXJyYXlzIG9mIHZlY3RvcnMgYW5kIG1hdHJpY2VzXG5cbmZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7XG5cblx0Y29uc3QgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHRjb25zdCBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZTtcblx0bGV0IHIgPSBhcnJheUNhY2hlRjMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEZsb2F0MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGlmICggbkJsb2NrcyAhPT0gMCApIHtcblxuXHRcdGZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7XG5cblx0XHRcdG9mZnNldCArPSBibG9ja1NpemU7XG5cdFx0XHRhcnJheVsgaSBdLnRvQXJyYXkoIHIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufVxuXG5mdW5jdGlvbiBhcnJheXNFcXVhbCggYSwgYiApIHtcblxuXHRpZiAoIGEubGVuZ3RoICE9PSBiLmxlbmd0aCApIHJldHVybiBmYWxzZTtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRpZiAoIGFbIGkgXSAhPT0gYlsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG5mdW5jdGlvbiBjb3B5QXJyYXkoIGEsIGIgKSB7XG5cblx0Zm9yICggbGV0IGkgPSAwLCBsID0gYi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0YVsgaSBdID0gYlsgaSBdO1xuXG5cdH1cblxufVxuXG4vLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvblxuXG5mdW5jdGlvbiBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApIHtcblxuXHRsZXQgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgSW50MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJbIGkgXSA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggY2FjaGVbIDAgXSA9PT0gdiApIHJldHVybjtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNhY2hlWyAwIF0gPSB2O1xuXG59XG5cbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgfHwgY2FjaGVbIDIgXSAhPT0gdi56ICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYuciB8fCBjYWNoZVsgMSBdICE9PSB2LmcgfHwgY2FjaGVbIDIgXSAhPT0gdi5iICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi5yO1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYuZztcblx0XHRcdGNhY2hlWyAyIF0gPSB2LmI7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGYoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xuXHRcdFx0Y2FjaGVbIDMgXSA9IHYudztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuTWF0cml4TilcblxuZnVuY3Rpb24gc2V0VmFsdWVNMiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHRjb25zdCBlbGVtZW50cyA9IHYuZWxlbWVudHM7XG5cblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XG5cblx0XHRtYXQyYXJyYXkuc2V0KCBlbGVtZW50cyApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0MmFycmF5ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdGNvbnN0IGVsZW1lbnRzID0gdi5lbGVtZW50cztcblxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcblxuXHRcdG1hdDNhcnJheS5zZXQoIGVsZW1lbnRzICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTQoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xuXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xuXG5cdFx0bWF0NGFycmF5LnNldCggZWxlbWVudHMgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDRhcnJheSApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjFpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuIHZlY3RvciAoZnJvbSBmbGF0IGFycmF5KVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG4vLyBTaW5nbGUgdW5zaWduZWQgaW50ZWdlclxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxdWkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTF1aSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gU2luZ2xlIHVuc2lnbmVkIGludGVnZXIgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJ1aSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTJ1aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzdWkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0zdWl2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNHVpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtNHVpdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG59XG5cblxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMSggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHR0ZXh0dXJlcy5zYWZlU2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDNEMSggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHR0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoIHYgfHwgZW1wdHlUZXh0dXJlM2QsIHVuaXQgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xuXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcblxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XG5cblx0fVxuXG5cdHRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUMkRBcnJheTEoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdGNvbnN0IHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XG5cblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xuXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcblxuXHR9XG5cblx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIHYgfHwgZW1wdHlUZXh0dXJlMmRBcnJheSwgdW5pdCApO1xuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIHRoZSBzaW5ndWxhciBjYXNlXG5cbmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlVjFmOyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRmOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNMzsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTQ7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZVYxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmk7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWVWM2k7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWVWNGk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aTsgLy8gVUlOVFxuXHRcdGNhc2UgMHg4ZGM2OiByZXR1cm4gc2V0VmFsdWVWMnVpOyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4ZGM3OiByZXR1cm4gc2V0VmFsdWVWM3VpOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWU6IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGQ2NjogLy8gU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGRjYTogLy8gSU5UX1NBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGRkMjogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MjogLy8gU0FNUExFUl8yRF9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQxO1xuXG5cdFx0Y2FzZSAweDhiNWY6IC8vIFNBTVBMRVJfM0Rcblx0XHRjYXNlIDB4OGRjYjogLy8gSU5UX1NBTVBMRVJfM0Rcblx0XHRjYXNlIDB4OGRkMzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfM0Rcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQzRDE7XG5cblx0XHRjYXNlIDB4OGI2MDogLy8gU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkY2M6IC8vIElOVF9TQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRkNDogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGM1OiAvLyBTQU1QTEVSX0NVQkVfU0hBRE9XXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUNjtcblxuXHRcdGNhc2UgMHg4ZGMxOiAvLyBTQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkY2Y6IC8vIElOVF9TQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkZDc6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkYzQ6IC8vIFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUMkRBcnJheTE7XG5cblx0fVxuXG59XG5cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZkFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkgb3IgYXJyYXkgb2YgVEhSRUUuVmVjdG9yTilcblxuZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApO1xuXG5cdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNmQXJyYXkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDMgKTtcblxuXHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGRhdGEgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0ZkFycmF5KCBnbCwgdiApIHtcblxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICk7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZyb20gZmxhdCBhcnJheSBvciBhcnJheSBvZiBUSFJFRS5NYXRyaXhOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yQXJyYXkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKTtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM0FycmF5KCBnbCwgdiApIHtcblxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICk7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTRBcnJheSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKTtcblxuXHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgaW50ZWdlciAvIGJvb2xlYW5cblxuZnVuY3Rpb24gc2V0VmFsdWVWMWlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgaW50ZWdlciAvIGJvb2xlYW4gdmVjdG9ycyAoZnJvbSBmbGF0IGFycmF5KVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzaUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtNGl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBBcnJheSBvZiB1bnNpZ25lZCBpbnRlZ2VyXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjF1aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMXVpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdW5zaWduZWQgaW50ZWdlciB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJ1aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMnVpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM3VpQXJyYXkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zdWl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0dWlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTR1aXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMUFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xuXG5cdGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2QXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBuID0gdi5sZW5ndGg7XG5cblx0Y29uc3QgdW5pdHMgPSBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR0ZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWZBcnJheTsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJmQXJyYXk7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZkFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGZBcnJheTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMkFycmF5OyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM0FycmF5OyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNEFycmF5OyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWlBcnJheTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmlBcnJheTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaUFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpQXJyYXk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aUFycmF5OyAvLyBVSU5UXG5cdFx0Y2FzZSAweDhkYzY6IHJldHVybiBzZXRWYWx1ZVYydWlBcnJheTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGRjNzogcmV0dXJuIHNldFZhbHVlVjN1aUFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpQXJyYXk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1ZTogLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZGQyOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDFBcnJheTtcblxuXHRcdGNhc2UgMHg4YjYwOiAvLyBTQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkYzU6IC8vIFNBTVBMRVJfQ1VCRV9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2QXJyYXk7XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5jYWNoZSA9IFtdO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuY2FjaGUgPSBbXTtcblx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuUHVyZUFycmF5VW5pZm9ybS5wcm90b3R5cGUudXBkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBjYWNoZS5sZW5ndGggIT09IGRhdGEubGVuZ3RoICkge1xuXG5cdFx0dGhpcy5jYWNoZSA9IG5ldyBGbG9hdDMyQXJyYXkoIGRhdGEubGVuZ3RoICk7XG5cblx0fVxuXG5cdGNvcHlBcnJheSggY2FjaGUsIGRhdGEgKTtcblxufTtcblxuZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblxuXHR0aGlzLnNlcSA9IFtdO1xuXHR0aGlzLm1hcCA9IHt9O1xuXG59XG5cblN0cnVjdHVyZWRVbmlmb3JtLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIHZhbHVlLCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBzZXEgPSB0aGlzLnNlcTtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0Y29uc3QgdSA9IHNlcVsgaSBdO1xuXHRcdHUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdLCB0ZXh0dXJlcyApO1xuXG5cdH1cblxufTtcblxuLy8gLS0tIFRvcC1sZXZlbCAtLS1cblxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xuXG5jb25zdCBSZVBhdGhQYXJ0ID0gLyhcXHcrKShcXF0pPyhcXFt8XFwuKT8vZztcblxuLy8gZXh0cmFjdHNcbi8vIFx0LSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3JpcHQpXG4vL1xuLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmRcbi8vIGFsbG93IHN0cmFpZ2h0Zm9yd2FyZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzXG4vLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy5cblxuZnVuY3Rpb24gYWRkVW5pZm9ybSggY29udGFpbmVyLCB1bmlmb3JtT2JqZWN0ICkge1xuXG5cdGNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApO1xuXHRjb250YWluZXIubWFwWyB1bmlmb3JtT2JqZWN0LmlkIF0gPSB1bmlmb3JtT2JqZWN0O1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkge1xuXG5cdGNvbnN0IHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdHdoaWxlICggdHJ1ZSApIHtcblxuXHRcdGNvbnN0IG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXG5cdFx0XHRtYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4O1xuXG5cdFx0bGV0IGlkID0gbWF0Y2hbIDEgXTtcblx0XHRjb25zdCBpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xuXG5cdFx0aWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyXG5cblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcblxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxuXG5cdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxuXHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xuXG5cdFx0XHRicmVhaztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxuXG5cdFx0XHRjb25zdCBtYXAgPSBjb250YWluZXIubWFwO1xuXHRcdFx0bGV0IG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cblx0Y29uc3QgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIDM1NzE4ICk7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbjsgKysgaSApIHtcblxuXHRcdGNvbnN0IGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlLCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKTtcblxufTtcblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBmdW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7XG5cblx0Y29uc3QgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzICkge1xuXG5cdGZvciAoIGxldCBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRjb25zdCB1ID0gc2VxWyBpIF0sXG5cdFx0XHR2ID0gdmFsdWVzWyB1LmlkIF07XG5cblx0XHRpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkXG5cdFx0XHR1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwgdGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbldlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlID0gZnVuY3Rpb24gKCBzZXEsIHZhbHVlcyApIHtcblxuXHRjb25zdCByID0gW107XG5cblx0Zm9yICggbGV0IGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdGNvbnN0IHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHRjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTtcblxuXHRnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7XG5cdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xuXG5cdHJldHVybiBzaGFkZXI7XG5cbn1cblxubGV0IHByb2dyYW1JZENvdW50ID0gMDtcblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHRjb25zdCBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xcbicgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBsaW5lcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7XG5cblx0c3dpdGNoICggZW5jb2RpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhckVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBzUkdCRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnc1JHQicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JFRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRScsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JNN0VuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgNy4wICknIF07XG5cdFx0Y2FzZSBSR0JNMTZFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDE2LjAgKScgXTtcblx0XHRjYXNlIFJHQkRFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JEJywgJyggdmFsdWUsIDI1Ni4wICknIF07XG5cdFx0Y2FzZSBHYW1tYUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0dhbW1hJywgJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApJyBdO1xuXHRcdGNhc2UgTG9nTHV2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnTG9nTHV2JywgJyggdmFsdWUgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBlbmNvZGluZzonLCBlbmNvZGluZyApO1xuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFNoYWRlckVycm9ycyggZ2wsIHNoYWRlciwgdHlwZSApIHtcblxuXHRjb25zdCBzdGF0dXMgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgMzU3MTMgKTtcblx0Y29uc3QgbG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkudHJpbSgpO1xuXG5cdGlmICggc3RhdHVzICYmIGxvZyA9PT0gJycgKSByZXR1cm4gJyc7XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coICcqKicgKyB0eXBlICsgJyoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApO1xuXG5cdGNvbnN0IHNvdXJjZSA9IGdsLmdldFNoYWRlclNvdXJjZSggc2hhZGVyICk7XG5cblx0cmV0dXJuICdUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICcgKyB0eXBlICsgJ1xcbicgKyBsb2cgKyBhZGRMaW5lTnVtYmVycyggc291cmNlICk7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvJyArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVudHNbIDEgXSArICc7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7XG5cblx0bGV0IHRvbmVNYXBwaW5nTmFtZTtcblxuXHRzd2l0Y2ggKCB0b25lTWFwcGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTGluZWFyJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1JlaW5oYXJkJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDaW5lb25Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdPcHRpbWl6ZWRDaW5lb24nO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIEFDRVNGaWxtaWNUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdBQ0VTRmlsbWljJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDdXN0b21Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdDdXN0b20nO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCB0b25lTWFwcGluZzonLCB0b25lTWFwcGluZyApO1xuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggcGFyYW1ldGVycyApIHtcblxuXHRjb25zdCBjaHVua3MgPSBbXG5cdFx0KCBwYXJhbWV0ZXJzLmV4dGVuc2lvbkRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLnRhbmdlbnRTcGFjZU5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nIHx8IHBhcmFtZXRlcnMuc2hhZGVySUQgPT09ICdwaHlzaWNhbCcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uRnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGggPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uRHJhd0J1ZmZlcnMgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJ1xuXHRdO1xuXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHtcblxuXHRjb25zdCBjaHVua3MgPSBbXTtcblxuXHRmb3IgKCBjb25zdCBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHRjb25zdCB2YWx1ZSA9IGRlZmluZXNbIG5hbWUgXTtcblxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICkge1xuXG5cdGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcblxuXHRjb25zdCBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgMzU3MjEgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0Y29uc3QgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xuXHRcdGNvbnN0IG5hbWUgPSBpbmZvLm5hbWU7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApO1xuXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGF0dHJpYnV0ZXM7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX0hFTUlfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfU0hBRE9XUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyApO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyApXG5cdFx0LnJlcGxhY2UoIC9VTklPTl9DTElQUElOR19QTEFORVMvZywgKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uICkgKTtcblxufVxuXG4vLyBSZXNvbHZlIEluY2x1ZGVzXG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC4vXSspPi9nbTtcblxuZnVuY3Rpb24gcmVzb2x2ZUluY2x1ZGVzKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBpbmNsdWRlUGF0dGVybiwgaW5jbHVkZVJlcGxhY2VyICk7XG5cbn1cblxuZnVuY3Rpb24gaW5jbHVkZVJlcGxhY2VyKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRjb25zdCBzdHJpbmcgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdO1xuXG5cdGlmICggc3RyaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0fVxuXG5cdHJldHVybiByZXNvbHZlSW5jbHVkZXMoIHN0cmluZyApO1xuXG59XG5cbi8vIFVucm9sbCBMb29wc1xuXG5jb25zdCBkZXByZWNhdGVkVW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcFtcXHNdKz9mb3IgXFwoIGludCBpIFxcPSAoXFxkKylcXDsgaSA8IChcXGQrKVxcOyBpIFxcK1xcKyBcXCkgXFx7KFtcXHNcXFNdKz8pKD89XFx9KVxcfS9nO1xuY29uc3QgdW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxccytmb3JcXHMqXFwoXFxzKmludFxccytpXFxzKj1cXHMqKFxcZCspXFxzKjtcXHMqaVxccyo8XFxzKihcXGQrKVxccyo7XFxzKmlcXHMqXFwrXFwrXFxzKlxcKVxccyp7KFtcXHNcXFNdKz8pfVxccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO1xuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggdW5yb2xsTG9vcFBhdHRlcm4sIGxvb3BSZXBsYWNlciApXG5cdFx0LnJlcGxhY2UoIGRlcHJlY2F0ZWRVbnJvbGxMb29wUGF0dGVybiwgZGVwcmVjYXRlZExvb3BSZXBsYWNlciApO1xuXG59XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWRMb29wUmVwbGFjZXIoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1dlYkdMUHJvZ3JhbTogI3ByYWdtYSB1bnJvbGxfbG9vcCBzaGFkZXIgc3ludGF4IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydCBzeW50YXggaW5zdGVhZC4nICk7XG5cdHJldHVybiBsb29wUmVwbGFjZXIoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICk7XG5cbn1cblxuZnVuY3Rpb24gbG9vcFJlcGxhY2VyKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRsZXQgc3RyaW5nID0gJyc7XG5cblx0Zm9yICggbGV0IGkgPSBwYXJzZUludCggc3RhcnQgKTsgaSA8IHBhcnNlSW50KCBlbmQgKTsgaSArKyApIHtcblxuXHRcdHN0cmluZyArPSBzbmlwcGV0XG5cdFx0XHQucmVwbGFjZSggL1xcW1xccyppXFxzKlxcXS9nLCAnWyAnICsgaSArICcgXScgKVxuXHRcdFx0LnJlcGxhY2UoIC9VTlJPTExFRF9MT09QX0lOREVYL2csIGkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZztcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApIHtcblxuXHRsZXQgcHJlY2lzaW9uc3RyaW5nID0gJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0O1xcbnByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnO1xuXG5cdGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XG5cblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gJ1xcbiNkZWZpbmUgSElHSF9QUkVDSVNJT04nO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7XG5cblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gJ1xcbiNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdsb3dwJyApIHtcblxuXHRcdHByZWNpc2lvbnN0cmluZyArPSAnXFxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OJztcblxuXHR9XG5cblx0cmV0dXJuIHByZWNpc2lvbnN0cmluZztcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNoYWRvd01hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0bGV0IHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBWU01TaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1ZTTSc7XG5cblx0fVxuXG5cdHJldHVybiBzaGFkb3dNYXBUeXBlRGVmaW5lO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW52TWFwVHlwZURlZmluZSggcGFyYW1ldGVycyApIHtcblxuXHRsZXQgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xuXG5cdFx0c3dpdGNoICggcGFyYW1ldGVycy5lbnZNYXBNb2RlICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwVHlwZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0bGV0IGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlxuXG5cdFx0XHRcdGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwTW9kZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xuXG5cdGxldCBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTk9ORSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuY29tYmluZSApIHtcblxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWRkT3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBlbnZNYXBCbGVuZGluZ0RlZmluZTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApIHtcblxuXHRjb25zdCBnbCA9IHJlbmRlcmVyLmdldENvbnRleHQoKTtcblxuXHRjb25zdCBkZWZpbmVzID0gcGFyYW1ldGVycy5kZWZpbmVzO1xuXG5cdGxldCB2ZXJ0ZXhTaGFkZXIgPSBwYXJhbWV0ZXJzLnZlcnRleFNoYWRlcjtcblx0bGV0IGZyYWdtZW50U2hhZGVyID0gcGFyYW1ldGVycy5mcmFnbWVudFNoYWRlcjtcblxuXHRjb25zdCBzaGFkb3dNYXBUeXBlRGVmaW5lID0gZ2VuZXJhdGVTaGFkb3dNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICk7XG5cdGNvbnN0IGVudk1hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblx0Y29uc3QgZW52TWFwTW9kZURlZmluZSA9IGdlbmVyYXRlRW52TWFwTW9kZURlZmluZSggcGFyYW1ldGVycyApO1xuXHRjb25zdCBlbnZNYXBCbGVuZGluZ0RlZmluZSA9IGdlbmVyYXRlRW52TWFwQmxlbmRpbmdEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblxuXG5cdGNvbnN0IGdhbW1hRmFjdG9yRGVmaW5lID0gKCByZW5kZXJlci5nYW1tYUZhY3RvciA+IDAgKSA/IHJlbmRlcmVyLmdhbW1hRmFjdG9yIDogMS4wO1xuXG5cdGNvbnN0IGN1c3RvbUV4dGVuc2lvbnMgPSBwYXJhbWV0ZXJzLmlzV2ViR0wyID8gJycgOiBnZW5lcmF0ZUV4dGVuc2lvbnMoIHBhcmFtZXRlcnMgKTtcblxuXHRjb25zdCBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Y29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHRsZXQgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblx0bGV0IHZlcnNpb25TdHJpbmcgPSBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID8gJyN2ZXJzaW9uICcgKyBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uICsgJ1xcbicgOiAnJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeFZlcnRleC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhWZXJ0ZXggKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhGcmFnbWVudCArPSAnXFxuJztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmcgPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuaW5zdGFuY2luZ0NvbG9yID8gJyNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXAgPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4QWxwaGFzID8gJyNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdnMgPyAnI2RlZmluZSBVU0VfVVYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnV2c1ZlcnRleE9ubHkgPyAnI2RlZmluZSBVVlNfVkVSVEVYX09OTFknIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aCApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXHRcdFx0J3VuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9JTlNUQU5DSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1InLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9UQU5HRU5UJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKScsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IGNvbG9yOycsXG5cblx0XHRcdCcjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKScsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7JyxcblxuXHRcdFx0J1x0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLFxuXG5cdFx0XHQnXHQjZWxzZScsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsXG5cblx0XHRcdCdcdCNlbmRpZicsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cblx0XHRcdGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICksXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCArICggcGFyYW1ldGVycy5hbHBoYVRlc3QgJSAxID8gJycgOiAnLjAnICkgOiAnJywgLy8gYWRkICcuMCcgaWYgaW50ZWdlclxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cDIgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1hdGNhcCA/ICcjZGVmaW5lIFVTRV9NQVRDQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuID8gJyNkZWZpbmUgVVNFX1NIRUVOJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXAgPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyB8fCBwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvciA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4QWxwaGFzID8gJyNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdnMgPyAnI2RlZmluZSBVU0VfVVYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnV2c1ZlcnRleE9ubHkgPyAnI2RlZmluZSBVVlNfVkVSVEVYX09OTFknIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gJyNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA/ICcjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGggKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCggKCBwYXJhbWV0ZXJzLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiBwYXJhbWV0ZXJzLnJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZCApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7JyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyAnI2RlZmluZSBUT05FX01BUFBJTkcnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHRvbmVNYXBwaW5nKCkgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCAndG9uZU1hcHBpbmcnLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsXG5cblx0XHRcdFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0sIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWF0Y2FwID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWF0Y2FwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubWF0Y2FwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdsaWdodE1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmxpZ2h0TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0Z2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCAnbGluZWFyVG9PdXRwdXRUZXhlbCcsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSxcblxuXHRcdFx0cGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAnI2RlZmluZSBERVBUSF9QQUNLSU5HICcgKyBwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA6ICcnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0fVxuXG5cdHZlcnRleFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcmVzb2x2ZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRpZiAoIHBhcmFtZXRlcnMuaXNXZWJHTDIgJiYgcGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsICE9PSB0cnVlICkge1xuXG5cdFx0Ly8gR0xTTCAzLjAgY29udmVyc2lvbiBmb3IgYnVpbHQtaW4gbWF0ZXJpYWxzIGFuZCBTaGFkZXJNYXRlcmlhbFxuXG5cdFx0dmVyc2lvblN0cmluZyA9ICcjdmVyc2lvbiAzMDAgZXNcXG4nO1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXHRcdFx0JyNkZWZpbmUgYXR0cmlidXRlIGluJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgb3V0Jyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlJ1xuXHRcdF0uam9pbiggJ1xcbicgKSArICdcXG4nICsgcHJlZml4VmVydGV4O1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cdFx0XHQnI2RlZmluZSB2YXJ5aW5nIGluJyxcblx0XHRcdCggcGFyYW1ldGVycy5nbHNsVmVyc2lvbiA9PT0gR0xTTDMgKSA/ICcnIDogJ291dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID09PSBHTFNMMyApID8gJycgOiAnI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yJyxcblx0XHRcdCcjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZScsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQnXG5cdFx0XS5qb2luKCAnXFxuJyApICsgJ1xcbicgKyBwcmVmaXhGcmFnbWVudDtcblxuXHR9XG5cblx0Y29uc3QgdmVydGV4R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdGNvbnN0IGZyYWdtZW50R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdGNvbnN0IGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMywgdmVydGV4R2xzbCApO1xuXHRjb25zdCBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMiwgZnJhZ21lbnRHbHNsICk7XG5cblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIHRvIGluZGV4IDAuXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgcGFyYW1ldGVycy5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTtcblxuXHR9XG5cblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHQvLyBjaGVjayBmb3IgbGluayBlcnJvcnNcblx0aWYgKCByZW5kZXJlci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyApIHtcblxuXHRcdGNvbnN0IHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0XHRjb25zdCB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApLnRyaW0oKTtcblx0XHRjb25zdCBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKS50cmltKCk7XG5cblx0XHRsZXQgcnVubmFibGUgPSB0cnVlO1xuXHRcdGxldCBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxNCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0cnVubmFibGUgPSBmYWxzZTtcblxuXHRcdFx0Y29uc3QgdmVydGV4RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgZ2xWZXJ0ZXhTaGFkZXIsICd2ZXJ0ZXgnICk7XG5cdFx0XHRjb25zdCBmcmFnbWVudEVycm9ycyA9IGdldFNoYWRlckVycm9ycyggZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICdmcmFnbWVudCcgKTtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnMzU3MTUnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxNSApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhFcnJvcnMsIGZyYWdtZW50RXJyb3JzICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdFx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRcdGhhdmVEaWFnbm9zdGljcyA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHRcdHRoaXMuZGlhZ25vc3RpY3MgPSB7XG5cblx0XHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXG5cdFx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdFx0dmVydGV4U2hhZGVyOiB7XG5cblx0XHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQ2xlYW4gdXBcblxuXHQvLyBDcmFzaGVzIGluIGlPUzkgYW5kIGlPUzEwLiAjMTg0MDJcblx0Ly8gZ2wuZGV0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHQvLyBnbC5kZXRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xuXG5cdGxldCBjYWNoZWRVbmlmb3JtcztcblxuXHR0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRVbmlmb3JtcyA9IG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZFVuaWZvcm1zO1xuXG5cdH07XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIGF0dHJpYnV0ZSBsb2NhdGlvbnNcblxuXHRsZXQgY2FjaGVkQXR0cmlidXRlcztcblxuXHR0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0fTtcblxuXHQvLyBmcmVlIHJlc291cmNlXG5cblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKCB0aGlzICk7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLnNoYWRlck5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jYWNoZUtleSA9IGNhY2hlS2V5O1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBjdWJlbWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApIHtcblxuXHRjb25zdCBwcm9ncmFtcyA9IFtdO1xuXG5cdGNvbnN0IGlzV2ViR0wyID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyO1xuXHRjb25zdCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7XG5cdGNvbnN0IGZsb2F0VmVydGV4VGV4dHVyZXMgPSBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcztcblx0Y29uc3QgbWF4VmVydGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4VW5pZm9ybXM7XG5cdGNvbnN0IHZlcnRleFRleHR1cmVzID0gY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdGxldCBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdGNvbnN0IHNoYWRlcklEcyA9IHtcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcblx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsXG5cdFx0TWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJyxcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXG5cdFx0TWVzaFBob25nTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Rvb24nLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hNYXRjYXBNYXRlcmlhbDogJ21hdGNhcCcsXG5cdFx0TGluZUJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVkJyxcblx0XHRQb2ludHNNYXRlcmlhbDogJ3BvaW50cycsXG5cdFx0U2hhZG93TWF0ZXJpYWw6ICdzaGFkb3cnLFxuXHRcdFNwcml0ZU1hdGVyaWFsOiAnc3ByaXRlJ1xuXHR9O1xuXG5cdGNvbnN0IHBhcmFtZXRlck5hbWVzID0gW1xuXHRcdCdwcmVjaXNpb24nLCAnaXNXZWJHTDInLCAnc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcycsICdvdXRwdXRFbmNvZGluZycsICdpbnN0YW5jaW5nJywgJ2luc3RhbmNpbmdDb2xvcicsXG5cdFx0J21hcCcsICdtYXBFbmNvZGluZycsICdtYXRjYXAnLCAnbWF0Y2FwRW5jb2RpbmcnLCAnZW52TWFwJywgJ2Vudk1hcE1vZGUnLCAnZW52TWFwRW5jb2RpbmcnLCAnZW52TWFwQ3ViZVVWJyxcblx0XHQnbGlnaHRNYXAnLCAnbGlnaHRNYXBFbmNvZGluZycsICdhb01hcCcsICdlbWlzc2l2ZU1hcCcsICdlbWlzc2l2ZU1hcEVuY29kaW5nJywgJ2J1bXBNYXAnLCAnbm9ybWFsTWFwJywgJ29iamVjdFNwYWNlTm9ybWFsTWFwJywgJ3RhbmdlbnRTcGFjZU5vcm1hbE1hcCcsICdjbGVhcmNvYXRNYXAnLCAnY2xlYXJjb2F0Um91Z2huZXNzTWFwJywgJ2NsZWFyY29hdE5vcm1hbE1hcCcsICdkaXNwbGFjZW1lbnRNYXAnLCAnc3BlY3VsYXJNYXAnLFxuXHRcdCdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2dyYWRpZW50TWFwJyxcblx0XHQnYWxwaGFNYXAnLCAnY29tYmluZScsICd2ZXJ0ZXhDb2xvcnMnLCAndmVydGV4QWxwaGFzJywgJ3ZlcnRleFRhbmdlbnRzJywgJ3ZlcnRleFV2cycsICd1dnNWZXJ0ZXhPbmx5JywgJ2ZvZycsICd1c2VGb2cnLCAnZm9nRXhwMicsXG5cdFx0J2ZsYXRTaGFkaW5nJywgJ3NpemVBdHRlbnVhdGlvbicsICdsb2dhcml0aG1pY0RlcHRoQnVmZmVyJywgJ3NraW5uaW5nJyxcblx0XHQnbWF4Qm9uZXMnLCAndXNlVmVydGV4VGV4dHVyZScsICdtb3JwaFRhcmdldHMnLCAnbW9ycGhOb3JtYWxzJywgJ3ByZW11bHRpcGxpZWRBbHBoYScsXG5cdFx0J251bURpckxpZ2h0cycsICdudW1Qb2ludExpZ2h0cycsICdudW1TcG90TGlnaHRzJywgJ251bUhlbWlMaWdodHMnLCAnbnVtUmVjdEFyZWFMaWdodHMnLFxuXHRcdCdudW1EaXJMaWdodFNoYWRvd3MnLCAnbnVtUG9pbnRMaWdodFNoYWRvd3MnLCAnbnVtU3BvdExpZ2h0U2hhZG93cycsXG5cdFx0J3NoYWRvd01hcEVuYWJsZWQnLCAnc2hhZG93TWFwVHlwZScsICd0b25lTWFwcGluZycsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0J2FscGhhVGVzdCcsICdkb3VibGVTaWRlZCcsICdmbGlwU2lkZWQnLCAnbnVtQ2xpcHBpbmdQbGFuZXMnLCAnbnVtQ2xpcEludGVyc2VjdGlvbicsICdkZXB0aFBhY2tpbmcnLCAnZGl0aGVyaW5nJyxcblx0XHQnc2hlZW4nLCAndHJhbnNtaXNzaW9uTWFwJ1xuXHRdO1xuXG5cdGZ1bmN0aW9uIGdldE1heEJvbmVzKCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHRjb25zdCBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0aWYgKCBmbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRyZXR1cm4gMTAyNDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWRcblx0XHRcdC8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKVxuXHRcdFx0Ly9cblx0XHRcdC8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zXG5cdFx0XHQvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnNcblx0XHRcdC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSlcblxuXHRcdFx0Y29uc3QgblZlcnRleFVuaWZvcm1zID0gbWF4VmVydGV4VW5pZm9ybXM7XG5cdFx0XHRjb25zdCBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdGNvbnN0IG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAgKSB7XG5cblx0XHRsZXQgZW5jb2Rpbmc7XG5cblx0XHRpZiAoIG1hcCAmJiBtYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IG1hcC5lbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcCAmJiBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb25cXCd0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuJyApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIHNjZW5lLCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBmb2cgPSBzY2VuZS5mb2c7XG5cdFx0Y29uc3QgZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXG5cdFx0Y29uc3QgZW52TWFwID0gY3ViZW1hcHMuZ2V0KCBtYXRlcmlhbC5lbnZNYXAgfHwgZW52aXJvbm1lbnQgKTtcblxuXHRcdGNvbnN0IHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XG5cblx0XHQvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZVxuXHRcdC8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpXG5cblx0XHRjb25zdCBtYXhCb25lcyA9IG9iamVjdC5pc1NraW5uZWRNZXNoID8gZ2V0TWF4Qm9uZXMoIG9iamVjdCApIDogMDtcblxuXHRcdGlmICggbWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczonLCBtYXRlcmlhbC5wcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIHByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXQgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjtcblxuXHRcdGlmICggc2hhZGVySUQgKSB7XG5cblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcblxuXHRcdFx0dmVydGV4U2hhZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjtcblx0XHRcdGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmVydGV4U2hhZGVyID0gbWF0ZXJpYWwudmVydGV4U2hhZGVyO1xuXHRcdFx0ZnJhZ21lbnRTaGFkZXIgPSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlcjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB7XG5cblx0XHRcdGlzV2ViR0wyOiBpc1dlYkdMMixcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXHRcdFx0c2hhZGVyTmFtZTogbWF0ZXJpYWwudHlwZSxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRkZWZpbmVzOiBtYXRlcmlhbC5kZWZpbmVzLFxuXG5cdFx0XHRpc1Jhd1NoYWRlck1hdGVyaWFsOiBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsID09PSB0cnVlLFxuXHRcdFx0Z2xzbFZlcnNpb246IG1hdGVyaWFsLmdsc2xWZXJzaW9uLFxuXG5cdFx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblxuXHRcdFx0aW5zdGFuY2luZzogb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCA9PT0gdHJ1ZSxcblx0XHRcdGluc3RhbmNpbmdDb2xvcjogb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCA9PT0gdHJ1ZSAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCxcblxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogdmVydGV4VGV4dHVyZXMsXG5cdFx0XHRvdXRwdXRFbmNvZGluZzogKCBjdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICkgPyBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUgKSA6IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwICksXG5cdFx0XHRtYXRjYXA6ICEhIG1hdGVyaWFsLm1hdGNhcCxcblx0XHRcdG1hdGNhcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXRjYXAgKSxcblx0XHRcdGVudk1hcDogISEgZW52TWFwLFxuXHRcdFx0ZW52TWFwTW9kZTogZW52TWFwICYmIGVudk1hcC5tYXBwaW5nLFxuXHRcdFx0ZW52TWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIGVudk1hcCApLFxuXHRcdFx0ZW52TWFwQ3ViZVVWOiAoICEhIGVudk1hcCApICYmICggKCBlbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAoIGVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyApICksXG5cdFx0XHRsaWdodE1hcDogISEgbWF0ZXJpYWwubGlnaHRNYXAsXG5cdFx0XHRsaWdodE1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5saWdodE1hcCApLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdG9iamVjdFNwYWNlTm9ybWFsTWFwOiBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID09PSBPYmplY3RTcGFjZU5vcm1hbE1hcCxcblx0XHRcdHRhbmdlbnRTcGFjZU5vcm1hbE1hcDogbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwLFxuXHRcdFx0Y2xlYXJjb2F0TWFwOiAhISBtYXRlcmlhbC5jbGVhcmNvYXRNYXAsXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCxcblx0XHRcdGNsZWFyY29hdE5vcm1hbE1hcDogISEgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLFxuXHRcdFx0ZGlzcGxhY2VtZW50TWFwOiAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsXG5cdFx0XHRyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCxcblx0XHRcdG1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLFxuXHRcdFx0c3BlY3VsYXJNYXA6ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwLFxuXHRcdFx0YWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLFxuXG5cdFx0XHRncmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsXG5cblx0XHRcdHNoZWVuOiAhISBtYXRlcmlhbC5zaGVlbixcblxuXHRcdFx0dHJhbnNtaXNzaW9uTWFwOiAhISBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAsXG5cblx0XHRcdGNvbWJpbmU6IG1hdGVyaWFsLmNvbWJpbmUsXG5cblx0XHRcdHZlcnRleFRhbmdlbnRzOiAoIG1hdGVyaWFsLm5vcm1hbE1hcCAmJiBtYXRlcmlhbC52ZXJ0ZXhUYW5nZW50cyApLFxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXG5cdFx0XHR2ZXJ0ZXhBbHBoYXM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNCxcblx0XHRcdHZlcnRleFV2czogISEgbWF0ZXJpYWwubWFwIHx8ICEhIG1hdGVyaWFsLmJ1bXBNYXAgfHwgISEgbWF0ZXJpYWwubm9ybWFsTWFwIHx8ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwIHx8ICEhIG1hdGVyaWFsLmFscGhhTWFwIHx8ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwIHx8ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCB8fCAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgfHwgISEgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwIHx8ICEhIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwIHx8ICEhIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCxcblx0XHRcdHV2c1ZlcnRleE9ubHk6ICEgKCAhISBtYXRlcmlhbC5tYXAgfHwgISEgbWF0ZXJpYWwuYnVtcE1hcCB8fCAhISBtYXRlcmlhbC5ub3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgfHwgISEgbWF0ZXJpYWwuYWxwaGFNYXAgfHwgISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgfHwgISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwIHx8ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwICkgJiYgISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXG5cdFx0XHRmb2c6ICEhIGZvZyxcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nLFxuXHRcdFx0Zm9nRXhwMjogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogISEgbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdFx0c2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCxcblx0XHRcdG1heEJvbmVzOiBtYXhCb25lcyxcblx0XHRcdHVzZVZlcnRleFRleHR1cmU6IGZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bURpckxpZ2h0U2hhZG93czogbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRTaGFkb3dzOiBsaWdodHMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0U2hhZG93czogbGlnaHRzLnNwb3RTaGFkb3dNYXAubGVuZ3RoLFxuXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogY2xpcHBpbmcubnVtUGxhbmVzLFxuXHRcdFx0bnVtQ2xpcEludGVyc2VjdGlvbjogY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiBtYXRlcmlhbC50b25lTWFwcGVkID8gcmVuZGVyZXIudG9uZU1hcHBpbmcgOiBOb1RvbmVNYXBwaW5nLFxuXHRcdFx0cGh5c2ljYWxseUNvcnJlY3RMaWdodHM6IHJlbmRlcmVyLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLFxuXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSxcblxuXHRcdFx0YWxwaGFUZXN0OiBtYXRlcmlhbC5hbHBoYVRlc3QsXG5cdFx0XHRkb3VibGVTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSxcblx0XHRcdGZsaXBTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUsXG5cblx0XHRcdGRlcHRoUGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogZmFsc2UsXG5cblx0XHRcdGluZGV4MEF0dHJpYnV0ZU5hbWU6IG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUsXG5cblx0XHRcdGV4dGVuc2lvbkRlcml2YXRpdmVzOiBtYXRlcmlhbC5leHRlbnNpb25zICYmIG1hdGVyaWFsLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMsXG5cdFx0XHRleHRlbnNpb25GcmFnRGVwdGg6IG1hdGVyaWFsLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWwuZXh0ZW5zaW9ucy5mcmFnRGVwdGgsXG5cdFx0XHRleHRlbnNpb25EcmF3QnVmZmVyczogbWF0ZXJpYWwuZXh0ZW5zaW9ucyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLmRyYXdCdWZmZXJzLFxuXHRcdFx0ZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRDogbWF0ZXJpYWwuZXh0ZW5zaW9ucyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QsXG5cblx0XHRcdHJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoOiBpc1dlYkdMMiB8fCBleHRlbnNpb25zLmhhcyggJ0VYVF9mcmFnX2RlcHRoJyApLFxuXHRcdFx0cmVuZGVyZXJFeHRlbnNpb25EcmF3QnVmZmVyczogaXNXZWJHTDIgfHwgZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICksXG5cdFx0XHRyZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q6IGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuaGFzKCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSxcblxuXHRcdFx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBtYXRlcmlhbC5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtQ2FjaGVLZXkoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRjb25zdCBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmZyYWdtZW50U2hhZGVyICk7XG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnZlcnRleFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggY29uc3QgbmFtZSBpbiBwYXJhbWV0ZXJzLmRlZmluZXMgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xuXHRcdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5vdXRwdXRFbmNvZGluZyApO1xuXHRcdFx0YXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgKTtcblxuXHRcdH1cblxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRVbmlmb3JtcyggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXHRcdGxldCB1bmlmb3JtcztcblxuXHRcdGlmICggc2hhZGVySUQgKSB7XG5cblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcblx0XHRcdHVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuaWZvcm1zO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhY3F1aXJlUHJvZ3JhbSggcGFyYW1ldGVycywgY2FjaGVLZXkgKSB7XG5cblx0XHRsZXQgcHJvZ3JhbTtcblxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxuXHRcdGZvciAoIGxldCBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0Y29uc3QgcHJlZXhpc3RpbmdQcm9ncmFtID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcmVleGlzdGluZ1Byb2dyYW0uY2FjaGVLZXkgPT09IGNhY2hlS2V5ICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcmVleGlzdGluZ1Byb2dyYW07XG5cdFx0XHRcdCsrIHByb2dyYW0udXNlZFRpbWVzO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0Y29uc3QgaSA9IHByb2dyYW1zLmluZGV4T2YoIHByb2dyYW0gKTtcblx0XHRcdHByb2dyYW1zWyBpIF0gPSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdO1xuXHRcdFx0cHJvZ3JhbXMucG9wKCk7XG5cblx0XHRcdC8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzXG5cdFx0XHRwcm9ncmFtLmRlc3Ryb3koKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXRQYXJhbWV0ZXJzOiBnZXRQYXJhbWV0ZXJzLFxuXHRcdGdldFByb2dyYW1DYWNoZUtleTogZ2V0UHJvZ3JhbUNhY2hlS2V5LFxuXHRcdGdldFVuaWZvcm1zOiBnZXRVbmlmb3Jtcyxcblx0XHRhY3F1aXJlUHJvZ3JhbTogYWNxdWlyZVByb2dyYW0sXG5cdFx0cmVsZWFzZVByb2dyYW06IHJlbGVhc2VQcm9ncmFtLFxuXHRcdC8vIEV4cG9zZWQgZm9yIHJlc291cmNlIG1vbml0b3JpbmcgJiBlcnJvciBmZWVkYmFjayB2aWEgcmVuZGVyZXIuaW5mbzpcblx0XHRwcm9ncmFtczogcHJvZ3JhbXNcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7XG5cblx0bGV0IHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xuXG5cdFx0bGV0IG1hcCA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hcCA9IHt9O1xuXHRcdFx0cHJvcGVydGllcy5zZXQoIG9iamVjdCwgbWFwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcblxuXHRcdHByb3BlcnRpZXMuZGVsZXRlKCBvYmplY3QgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGtleSwgdmFsdWUgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmdldCggb2JqZWN0IClbIGtleSBdID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcblxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyO1xuXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCBwcm9wZXJ0aWVzICkge1xuXG5cdGNvbnN0IHJlbmRlckl0ZW1zID0gW107XG5cdGxldCByZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRjb25zdCBvcGFxdWUgPSBbXTtcblx0Y29uc3QgdHJhbnNwYXJlbnQgPSBbXTtcblxuXHRjb25zdCBkZWZhdWx0UHJvZ3JhbSA9IHsgaWQ6IC0gMSB9O1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRcdG9wYXF1ZS5sZW5ndGggPSAwO1xuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRsZXQgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XG5cdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSB8fCBkZWZhdWx0UHJvZ3JhbSxcblx0XHRcdFx0Z3JvdXBPcmRlcjogZ3JvdXBPcmRlcixcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtIHx8IGRlZmF1bHRQcm9ncmFtO1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cE9yZGVyID0gZ3JvdXBPcmRlcjtcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IGdyb3VwO1xuXG5cdFx0fVxuXG5cdFx0cmVuZGVySXRlbXNJbmRleCArKztcblxuXHRcdHJldHVybiByZW5kZXJJdGVtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRjb25zdCByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkucHVzaCggcmVuZGVySXRlbSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1bnNoaWZ0KCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRjb25zdCByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkudW5zaGlmdCggcmVuZGVySXRlbSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCBjdXN0b21PcGFxdWVTb3J0LCBjdXN0b21UcmFuc3BhcmVudFNvcnQgKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEgKSB0cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZpbmlzaCgpIHtcblxuXHRcdC8vIENsZWFyIHJlZmVyZW5jZXMgZnJvbSBpbmFjdGl2ZSByZW5kZXJJdGVtcyBpbiB0aGUgbGlzdFxuXG5cdFx0Zm9yICggbGV0IGkgPSByZW5kZXJJdGVtc0luZGV4LCBpbCA9IHJlbmRlckl0ZW1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbIGkgXTtcblxuXHRcdFx0aWYgKCByZW5kZXJJdGVtLmlkID09PSBudWxsICkgYnJlYWs7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IG51bGw7XG5cdFx0XHRyZW5kZXJJdGVtLm1hdGVyaWFsID0gbnVsbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG51bGw7XG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gbnVsbDtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdG9wYXF1ZTogb3BhcXVlLFxuXHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0cHVzaDogcHVzaCxcblx0XHR1bnNoaWZ0OiB1bnNoaWZ0LFxuXHRcdGZpbmlzaDogZmluaXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoIHByb3BlcnRpZXMgKSB7XG5cblx0bGV0IGxpc3RzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCByZW5kZXJDYWxsRGVwdGggKSB7XG5cblx0XHRsZXQgbGlzdDtcblxuXHRcdGlmICggbGlzdHMuaGFzKCBzY2VuZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoIHByb3BlcnRpZXMgKTtcblx0XHRcdGxpc3RzLnNldCggc2NlbmUsIFsgbGlzdCBdICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSBsaXN0cy5nZXQoIHNjZW5lICkubGVuZ3RoICkge1xuXG5cdFx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCBwcm9wZXJ0aWVzICk7XG5cdFx0XHRcdGxpc3RzLmdldCggc2NlbmUgKS5wdXNoKCBsaXN0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bGlzdCA9IGxpc3RzLmdldCggc2NlbmUgKVsgcmVuZGVyQ2FsbERlcHRoIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0bGlzdHMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG5mdW5jdGlvbiBVbmlmb3Jtc0NhY2hlKCkge1xuXG5cdGNvbnN0IGxpZ2h0cyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgdW5pZm9ybXM7XG5cblx0XHRcdHN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0Y29uZUNvczogMCxcblx0XHRcdFx0XHRcdHBlbnVtYnJhQ29zOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDBcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFNoYWRvd1VuaWZvcm1zQ2FjaGUoKSB7XG5cblx0Y29uc3QgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93Tm9ybWFsQmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zXG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cblxuXG5sZXQgbmV4dFZlcnNpb24gPSAwO1xuXG5mdW5jdGlvbiBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QoIGxpZ2h0QSwgbGlnaHRCICkge1xuXG5cdHJldHVybiAoIGxpZ2h0Qi5jYXN0U2hhZG93ID8gMSA6IDAgKSAtICggbGlnaHRBLmNhc3RTaGFkb3cgPyAxIDogMCApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSBuZXcgVW5pZm9ybXNDYWNoZSgpO1xuXG5cdGNvbnN0IHNoYWRvd0NhY2hlID0gU2hhZG93VW5pZm9ybXNDYWNoZSgpO1xuXG5cdGNvbnN0IHN0YXRlID0ge1xuXG5cdFx0dmVyc2lvbjogMCxcblxuXHRcdGhhc2g6IHtcblx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoOiAtIDEsXG5cdFx0XHRwb2ludExlbmd0aDogLSAxLFxuXHRcdFx0c3BvdExlbmd0aDogLSAxLFxuXHRcdFx0cmVjdEFyZWFMZW5ndGg6IC0gMSxcblx0XHRcdGhlbWlMZW5ndGg6IC0gMSxcblxuXHRcdFx0bnVtRGlyZWN0aW9uYWxTaGFkb3dzOiAtIDEsXG5cdFx0XHRudW1Qb2ludFNoYWRvd3M6IC0gMSxcblx0XHRcdG51bVNwb3RTaGFkb3dzOiAtIDFcblx0XHR9LFxuXG5cdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXG5cdFx0cHJvYmU6IFtdLFxuXHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvdzogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cmVjdEFyZWFMVEMxOiBudWxsLFxuXHRcdHJlY3RBcmVhTFRDMjogbnVsbCxcblx0XHRwb2ludDogW10sXG5cdFx0cG9pbnRTaGFkb3c6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSBzdGF0ZS5wcm9iZS5wdXNoKCBuZXcgVmVjdG9yMygpICk7XG5cblx0Y29uc3QgdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cdGNvbnN0IG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHRjb25zdCBtYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0ZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cyApIHtcblxuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHN0YXRlLnByb2JlWyBpIF0uc2V0KCAwLCAwLCAwICk7XG5cblx0XHRsZXQgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xuXHRcdGxldCBwb2ludExlbmd0aCA9IDA7XG5cdFx0bGV0IHNwb3RMZW5ndGggPSAwO1xuXHRcdGxldCByZWN0QXJlYUxlbmd0aCA9IDA7XG5cdFx0bGV0IGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0bGV0IG51bURpcmVjdGlvbmFsU2hhZG93cyA9IDA7XG5cdFx0bGV0IG51bVBvaW50U2hhZG93cyA9IDA7XG5cdFx0bGV0IG51bVNwb3RTaGFkb3dzID0gMDtcblxuXHRcdGxpZ2h0cy5zb3J0KCBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9IGxpZ2h0LmNvbG9yO1xuXHRcdFx0Y29uc3QgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDtcblxuXHRcdFx0aWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHtcblxuXHRcdFx0XHRyICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGcgKz0gY29sb3IuZyAqIGludGVuc2l0eTtcblx0XHRcdFx0YiArPSBjb2xvci5iICogaW50ZW5zaXR5O1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0xpZ2h0UHJvYmUgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgOTsgaiArKyApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnByb2JlWyBqIF0uYWRkU2NhbGVkVmVjdG9yKCBsaWdodC5zaC5jb2VmZmljaWVudHNbIGogXSwgaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93VW5pZm9ybXMgPSBzaGFkb3dDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Tm9ybWFsQmlhcyA9IHNoYWRvdy5ub3JtYWxCaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3Jtcztcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdFx0XHRudW1EaXJlY3Rpb25hbFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb25lQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dbIHNwb3RMZW5ndGggXSA9IHNoYWRvd1VuaWZvcm1zO1xuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4WyBzcG90TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXG5cdFx0XHRcdFx0bnVtU3BvdFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHQvLyAoYSkgaW50ZW5zaXR5IGlzIHRoZSB0b3RhbCB2aXNpYmxlIGxpZ2h0IGVtaXR0ZWRcblx0XHRcdFx0Ly91bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICogTWF0aC5QSSApICk7XG5cblx0XHRcdFx0Ly8gKGIpIGludGVuc2l0eSBpcyB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgbGlnaHRcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3Jtcztcblx0XHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdFx0XHRudW1Qb2ludFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlY3RBcmVhTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0Ly8gV2ViR0wgMlxuXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xO1xuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzIgPSBVbmlmb3Jtc0xpYi5MVENfRkxPQVRfMjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAxXG5cblx0XHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xO1xuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8yO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzEgPSBVbmlmb3Jtc0xpYi5MVENfSEFMRl8xO1xuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19IQUxGXzI7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hbWJpZW50WyAwIF0gPSByO1xuXHRcdHN0YXRlLmFtYmllbnRbIDEgXSA9IGc7XG5cdFx0c3RhdGUuYW1iaWVudFsgMiBdID0gYjtcblxuXHRcdGNvbnN0IGhhc2ggPSBzdGF0ZS5oYXNoO1xuXG5cdFx0aWYgKCBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoICE9PSBkaXJlY3Rpb25hbExlbmd0aCB8fFxuXHRcdFx0aGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHxcblx0XHRcdGhhc2guc3BvdExlbmd0aCAhPT0gc3BvdExlbmd0aCB8fFxuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCAhPT0gcmVjdEFyZWFMZW5ndGggfHxcblx0XHRcdGhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fFxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgIT09IG51bURpcmVjdGlvbmFsU2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1Qb2ludFNoYWRvd3MgIT09IG51bVBvaW50U2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgKSB7XG5cblx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0c3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0XHRzdGF0ZS5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3cubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUuc3BvdFNoYWRvdy5sZW5ndGggPSBudW1TcG90U2hhZG93cztcblx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXAubGVuZ3RoID0gbnVtU3BvdFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzO1xuXG5cdFx0XHRoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0XHRoYXNoLnBvaW50TGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0XHRoYXNoLnNwb3RMZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdFx0aGFzaC5oZW1pTGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRoYXNoLm51bVBvaW50U2hhZG93cyA9IG51bVBvaW50U2hhZG93cztcblx0XHRcdGhhc2gubnVtU3BvdFNoYWRvd3MgPSBudW1TcG90U2hhZG93cztcblxuXHRcdFx0c3RhdGUudmVyc2lvbiA9IG5leHRWZXJzaW9uICsrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cFZpZXcoIGxpZ2h0cywgY2FtZXJhICkge1xuXG5cdFx0bGV0IGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHRsZXQgcG9pbnRMZW5ndGggPSAwO1xuXHRcdGxldCBzcG90TGVuZ3RoID0gMDtcblx0XHRsZXQgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdGxldCBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdGNvbnN0IHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGxpZ2h0ID0gbGlnaHRzWyBpIF07XG5cblx0XHRcdGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF07XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRkaXJlY3Rpb25hbExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF07XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuaGVtaVsgaGVtaUxlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRzZXR1cDogc2V0dXAsXG5cdFx0c2V0dXBWaWV3OiBzZXR1cFZpZXcsXG5cdFx0c3RhdGU6IHN0YXRlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdGNvbnN0IGxpZ2h0cyA9IG5ldyBXZWJHTExpZ2h0cyggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cblx0Y29uc3QgbGlnaHRzQXJyYXkgPSBbXTtcblx0Y29uc3Qgc2hhZG93c0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cygpIHtcblxuXHRcdGxpZ2h0cy5zZXR1cCggbGlnaHRzQXJyYXkgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dXBMaWdodHNWaWV3KCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMuc2V0dXBWaWV3KCBsaWdodHNBcnJheSwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGNvbnN0IHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cdFx0c2V0dXBMaWdodHNWaWV3OiBzZXR1cExpZ2h0c1ZpZXcsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93XG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZXMoIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHRsZXQgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCByZW5kZXJDYWxsRGVwdGggPSAwICkge1xuXG5cdFx0bGV0IHJlbmRlclN0YXRlO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZXMuaGFzKCBzY2VuZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0XHRyZW5kZXJTdGF0ZXMuc2V0KCBzY2VuZSwgWyByZW5kZXJTdGF0ZSBdICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApLmxlbmd0aCApIHtcblxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblx0XHRcdFx0cmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKS5wdXNoKCByZW5kZXJTdGF0ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKVsgcmVuZGVyQ2FsbERlcHRoIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmNsYXNzIE1lc2hEZXB0aE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0XHR0aGlzLm1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0XHR0aGlzLmZvZyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIHJlZmVyZW5jZVBvc2l0aW9uOiA8ZmxvYXQ+LFxuICogIG5lYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqICBmYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD5cbiAqXG4gKiB9XG4gKi9cblxuY2xhc3MgTWVzaERpc3RhbmNlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJztcblxuXHRcdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHRoaXMubmVhckRpc3RhbmNlID0gMTtcblx0XHR0aGlzLmZhckRpc3RhbmNlID0gMTAwMDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHRcdHRoaXMuZm9nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlO1xuXHRcdHRoaXMuZmFyRGlzdGFuY2UgPSBzb3VyY2UuZmFyRGlzdGFuY2U7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7XG5cbnZhciB2c21fZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7XFxudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxudm9pZCBtYWluKCkge1xcblxcdGZsb2F0IG1lYW4gPSAwLjA7XFxuXFx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xcblxcdGZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICkgLyByZXNvbHV0aW9uICkgKTtcXG5cXHRmb3IgKCBmbG9hdCBpID0gLTEuMDsgaSA8IDEuMCA7IGkgKz0gU0FNUExFX1JBVEUpIHtcXG5cXHRcXHQjaWZkZWYgSE9SSVpPTlRBTF9QQVNTXFxuXFx0XFx0XFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XFxuXFx0XFx0XFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcXG5cXHRcXHRcXHRzcXVhcmVkX21lYW4gKz0gZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSArIGRpc3RyaWJ1dGlvbi54ICogZGlzdHJpYnV0aW9uLng7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgaSApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcXG5cXHRcXHRcXHRtZWFuICs9IGRlcHRoO1xcblxcdFxcdFxcdHNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHRtZWFuID0gbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XFxuXFx0c3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcXG5cXHRmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTtcXG5cXHRnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xcbn1cIjtcblxudmFyIHZzbV92ZXJ0ID0gXCJ2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufVwiO1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgX2NhcGFiaWxpdGllcyApIHtcblxuXHRsZXQgX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xuXG5cdGNvbnN0IF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoKSxcblx0XHRfdmlld3BvcnRTaXplID0gbmV3IFZlY3RvcjIoKSxcblxuXHRcdF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cblx0XHRfZGVwdGhNYXRlcmlhbHMgPSBbXSxcblx0XHRfZGlzdGFuY2VNYXRlcmlhbHMgPSBbXSxcblxuXHRcdF9tYXRlcmlhbENhY2hlID0ge30sXG5cblx0XHRfbWF4VGV4dHVyZVNpemUgPSBfY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplO1xuXG5cdGNvbnN0IHNoYWRvd1NpZGUgPSB7IDA6IEJhY2tTaWRlLCAxOiBGcm9udFNpZGUsIDI6IERvdWJsZVNpZGUgfTtcblxuXHRjb25zdCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRkZWZpbmVzOiB7XG5cdFx0XHRTQU1QTEVfUkFURTogMi4wIC8gOC4wLFxuXHRcdFx0SEFMRl9TQU1QTEVfUkFURTogMS4wIC8gOC4wXG5cdFx0fSxcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRzaGFkb3dfcGFzczogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0cmVzb2x1dGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjIoKSB9LFxuXHRcdFx0cmFkaXVzOiB7IHZhbHVlOiA0LjAgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IHZzbV92ZXJ0LFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IHZzbV9mcmFnXG5cblx0fSApO1xuXG5cdGNvbnN0IHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbCA9IHNoYWRvd01hdGVyaWFsVmVydGljYWwuY2xvbmUoKTtcblx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTID0gMTtcblxuXHRjb25zdCBmdWxsU2NyZWVuVHJpID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGZ1bGxTY3JlZW5Ucmkuc2V0QXR0cmlidXRlKFxuXHRcdCdwb3NpdGlvbicsXG5cdFx0bmV3IEJ1ZmZlckF0dHJpYnV0ZShcblx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIFsgLSAxLCAtIDEsIDAuNSwgMywgLSAxLCAwLjUsIC0gMSwgMywgMC41IF0gKSxcblx0XHRcdDNcblx0XHQpXG5cdCk7XG5cblx0Y29uc3QgZnVsbFNjcmVlbk1lc2ggPSBuZXcgTWVzaCggZnVsbFNjcmVlblRyaSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCApO1xuXG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IF9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblx0XHRjb25zdCBhY3RpdmVDdWJlRmFjZSA9IF9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xuXHRcdGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7XG5cblx0XHRjb25zdCBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMSwgMSwgMSwgMSApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7XG5cblx0XHQvLyByZW5kZXIgZGVwdGggbWFwXG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRpZiAoIHNoYWRvdyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93LmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNoYWRvdy5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdFx0X3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblxuXHRcdFx0Y29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XG5cblx0XHRcdF92aWV3cG9ydFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblxuXHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplIHx8IF9zaGFkb3dNYXBTaXplLnkgPiBfbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ID0gTWF0aC5mbG9vciggX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnggKTtcblx0XHRcdFx0XHRfc2hhZG93TWFwU2l6ZS54ID0gX3ZpZXdwb3J0U2l6ZS54ICogc2hhZG93RnJhbWVFeHRlbnRzLng7XG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueCA9IF92aWV3cG9ydFNpemUueDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS55ID4gX21heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ID0gTWF0aC5mbG9vciggX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnkgKTtcblx0XHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ID0gX3ZpZXdwb3J0U2l6ZS55ICogc2hhZG93RnJhbWVFeHRlbnRzLnk7XG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueSA9IF92aWV3cG9ydFNpemUueTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICYmICEgc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcblxuXHRcdFx0XHRjb25zdCBwYXJzID0geyBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9O1xuXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgJy5zaGFkb3dNYXAnO1xuXG5cdFx0XHRcdHNoYWRvdy5tYXBQYXNzID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cblx0XHRcdFx0c2hhZG93LmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArICcuc2hhZG93TWFwJztcblxuXHRcdFx0XHRzaGFkb3cuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwICk7XG5cdFx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblxuXHRcdFx0Y29uc3Qgdmlld3BvcnRDb3VudCA9IHNoYWRvdy5nZXRWaWV3cG9ydENvdW50KCk7XG5cblx0XHRcdGZvciAoIGxldCB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgdmlld3BvcnQgPSBzaGFkb3cuZ2V0Vmlld3BvcnQoIHZwICk7XG5cblx0XHRcdFx0X3ZpZXdwb3J0LnNldChcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC54LFxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LnksXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueixcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC53XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0X3N0YXRlLnZpZXdwb3J0KCBfdmlld3BvcnQgKTtcblxuXHRcdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2cCApO1xuXG5cdFx0XHRcdF9mcnVzdHVtID0gc2hhZG93LmdldEZydXN0dW0oKTtcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvdy5jYW1lcmEsIGxpZ2h0LCB0aGlzLnR5cGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBkbyBibHVyIHBhc3MgZm9yIFZTTVxuXG5cdFx0XHRpZiAoICEgc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcblxuXHRcdFx0XHRWU01QYXNzKCBzaGFkb3csIGNhbWVyYSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNoYWRvdy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gVlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggZnVsbFNjcmVlbk1lc2ggKTtcblxuXHRcdC8vIHZlcnRpY2FsIHBhc3NcblxuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwLnRleHR1cmU7XG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlID0gc2hhZG93Lm1hcFNpemU7XG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXBQYXNzICk7XG5cdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCwgZnVsbFNjcmVlbk1lc2gsIG51bGwgKTtcblxuXHRcdC8vIGhvcml6b250YWwgcGFzc1xuXG5cdFx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcFBhc3MudGV4dHVyZTtcblx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZSA9IHNoYWRvdy5tYXBTaXplO1xuXHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXAgKTtcblx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWxWYXJpYW50KCB1c2VNb3JwaGluZywgdXNlU2tpbm5pbmcsIHVzZUluc3RhbmNpbmcgKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IHVzZU1vcnBoaW5nIDw8IDAgfCB1c2VTa2lubmluZyA8PCAxIHwgdXNlSW5zdGFuY2luZyA8PCAyO1xuXG5cdFx0bGV0IG1hdGVyaWFsID0gX2RlcHRoTWF0ZXJpYWxzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcblxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRfZGVwdGhNYXRlcmlhbHNbIGluZGV4IF0gPSBtYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQoIHVzZU1vcnBoaW5nLCB1c2VTa2lubmluZywgdXNlSW5zdGFuY2luZyApIHtcblxuXHRcdGNvbnN0IGluZGV4ID0gdXNlTW9ycGhpbmcgPDwgMCB8IHVzZVNraW5uaW5nIDw8IDEgfCB1c2VJbnN0YW5jaW5nIDw8IDI7XG5cblx0XHRsZXQgbWF0ZXJpYWwgPSBfZGlzdGFuY2VNYXRlcmlhbHNbIGluZGV4IF07XG5cblx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsID0gbmV3IE1lc2hEaXN0YW5jZU1hdGVyaWFsKCB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZyxcblx0XHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzWyBpbmRleCBdID0gbWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhTmVhciwgc2hhZG93Q2FtZXJhRmFyLCB0eXBlICkge1xuXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XG5cblx0XHRsZXQgZ2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGVwdGhNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0bGV0IGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0XHRjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjdXN0b21NYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsZXQgdXNlTW9ycGhpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB1c2VTa2lubmluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoID09PSB0cnVlICkge1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHR1c2VTa2lubmluZyA9IHRydWU7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZTonLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdXNlSW5zdGFuY2luZyA9IG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWU7XG5cblx0XHRcdHJlc3VsdCA9IGdldE1hdGVyaWFsVmFyaWFudCggdXNlTW9ycGhpbmcsIHVzZVNraW5uaW5nLCB1c2VJbnN0YW5jaW5nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggX3JlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcblx0XHRcdC8vIGFwcHJvcHJpYXRlIHN0YXRlXG5cblx0XHRcdGNvbnN0IGtleUEgPSByZXN1bHQudXVpZCwga2V5QiA9IG1hdGVyaWFsLnV1aWQ7XG5cblx0XHRcdGxldCBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNGb3JWYXJpYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9O1xuXHRcdFx0XHRfbWF0ZXJpYWxDYWNoZVsga2V5QSBdID0gbWF0ZXJpYWxzRm9yVmFyaWFudDtcblxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07XG5cblx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpO1xuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF0gPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTtcblx0XHRyZXN1bHQud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lO1xuXG5cdFx0aWYgKCB0eXBlID09PSBWU01TaGFkb3dNYXAgKSB7XG5cblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogbWF0ZXJpYWwuc2lkZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBsaWdodC5pc1BvaW50TGlnaHQgPT09IHRydWUgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPT09IHRydWUgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRyZXN1bHQubmVhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdHJlc3VsdC5mYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYUZhcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgbGlnaHQsIHR5cGUgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSAmJiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSApIHtcblxuXHRcdFx0aWYgKCAoIG9iamVjdC5jYXN0U2hhZG93IHx8ICggb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgdHlwZSA9PT0gVlNNU2hhZG93TWFwICkgKSAmJiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSApIHtcblxuXHRcdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGsgXTtcblx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIsIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIsIHR5cGUgKTtcblxuXHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgbnVsbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRyZW5kZXJPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBsaWdodCwgdHlwZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdGNvbnN0IGlzV2ViR0wyID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyO1xuXG5cdGZ1bmN0aW9uIENvbG9yQnVmZmVyKCkge1xuXG5cdFx0bGV0IGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdGxldCBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRjb25zdCBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yLnNldCggciwgZywgYiwgYSApO1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7XG5cblx0XHRsZXQgbG9ja2VkID0gZmFsc2U7XG5cblx0XHRsZXQgY3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggMjkyOSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCAyOTI5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxMiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTMgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTYgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdGxldCBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdGxldCBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRcdFx0ZW5hYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRkaXNhYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgIT09IHN0ZW5jaWxSZWYgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWwgIT09IHN0ZW5jaWxGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IHN0ZW5jaWxaUGFzcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vXG5cblx0Y29uc3QgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0Y29uc3QgZGVwdGhCdWZmZXIgPSBuZXcgRGVwdGhCdWZmZXIoKTtcblx0Y29uc3Qgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7XG5cblx0bGV0IGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRsZXQgeHJGcmFtZWJ1ZmZlciA9IG51bGw7XG5cdGxldCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgPSB7fTtcblxuXHRsZXQgY3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdGxldCBjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7XG5cdGxldCBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXHRsZXQgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRsZXQgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdGxldCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdGxldCBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0bGV0IGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0bGV0IGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdGxldCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IG51bGw7XG5cdGxldCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcblxuXHRjb25zdCBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggMzU2NjEgKTtcblxuXHRsZXQgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7XG5cdGxldCB2ZXJzaW9uID0gMDtcblx0Y29uc3QgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCA3OTM4ICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTCAoXFxkKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAxLjAgKTtcblxuXHR9IGVsc2UgaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ09wZW5HTCBFUycgKSAhPT0gLSAxICkge1xuXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMIEVTIChcXGQpLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDIuMCApO1xuXG5cdH1cblxuXHRsZXQgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0Y29uc3QgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XG5cdGNvbnN0IGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50ICkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0ZXh0dXJlICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgMTAyNDEsIDk3MjggKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCAxMDI0MCwgOTcyOCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIDY0MDgsIDEsIDEsIDAsIDY0MDgsIDUxMjEsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHRjb25zdCBlbXB0eVRleHR1cmVzID0ge307XG5cdGVtcHR5VGV4dHVyZXNbIDM1NTMgXSA9IGNyZWF0ZVRleHR1cmUoIDM1NTMsIDM1NTMsIDEgKTtcblx0ZW1wdHlUZXh0dXJlc1sgMzQwNjcgXSA9IGNyZWF0ZVRleHR1cmUoIDM0MDY3LCAzNDA2OSwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCAyOTI5ICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggMjg4NCApO1xuXG5cdHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBlbmFibGUoIGlkICkge1xuXG5cdFx0aWYgKCBlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdICE9PSB0cnVlICkge1xuXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XG5cdFx0XHRlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5kaXNhYmxlKCBpZCApO1xuXHRcdFx0ZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kWFJGcmFtZWJ1ZmZlciggZnJhbWVidWZmZXIgKSB7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSB4ckZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHR4ckZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdGlmICggZnJhbWVidWZmZXIgPT09IG51bGwgJiYgeHJGcmFtZWJ1ZmZlciAhPT0gbnVsbCApIGZyYW1lYnVmZmVyID0geHJGcmFtZWJ1ZmZlcjsgLy8gdXNlIGFjdGl2ZSBYUiBmcmFtZWJ1ZmZlciBpZiBhdmFpbGFibGVcblxuXHRcdGlmICggY3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSAhPT0gZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIHRhcmdldCBdID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xuXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdGN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdGNvbnN0IGVxdWF0aW9uVG9HTCA9IHtcblx0XHRbIEFkZEVxdWF0aW9uIF06IDMyNzc0LFxuXHRcdFsgU3VidHJhY3RFcXVhdGlvbiBdOiAzMjc3OCxcblx0XHRbIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIF06IDMyNzc5XG5cdH07XG5cblx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdGVxdWF0aW9uVG9HTFsgTWluRXF1YXRpb24gXSA9IDMyNzc1O1xuXHRcdGVxdWF0aW9uVG9HTFsgTWF4RXF1YXRpb24gXSA9IDMyNzc2O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZXF1YXRpb25Ub0dMWyBNaW5FcXVhdGlvbiBdID0gZXh0ZW5zaW9uLk1JTl9FWFQ7XG5cdFx0XHRlcXVhdGlvblRvR0xbIE1heEVxdWF0aW9uIF0gPSBleHRlbnNpb24uTUFYX0VYVDtcblxuXHRcdH1cblxuXHR9XG5cblx0Y29uc3QgZmFjdG9yVG9HTCA9IHtcblx0XHRbIFplcm9GYWN0b3IgXTogMCxcblx0XHRbIE9uZUZhY3RvciBdOiAxLFxuXHRcdFsgU3JjQ29sb3JGYWN0b3IgXTogNzY4LFxuXHRcdFsgU3JjQWxwaGFGYWN0b3IgXTogNzcwLFxuXHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiA3NzYsXG5cdFx0WyBEc3RDb2xvckZhY3RvciBdOiA3NzQsXG5cdFx0WyBEc3RBbHBoYUZhY3RvciBdOiA3NzIsXG5cdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IDc2OSxcblx0XHRbIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgXTogNzcxLFxuXHRcdFsgT25lTWludXNEc3RDb2xvckZhY3RvciBdOiA3NzUsXG5cdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IDc3M1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRkaXNhYmxlKCAzMDQyICk7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRlbmFibGUoIDMwNDIgKTtcblx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRCbGVuZEVxdWF0aW9uICE9PSBBZGRFcXVhdGlvbiB8fCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICE9PSBBZGRFcXVhdGlvbiApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIDMyNzc0ICk7XG5cblx0XHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHRcdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcblxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDEsIDc3MSwgMSwgNzcxICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggMSwgMSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggMCwgMCwgNzY5LCA3NzEgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDAsIDc2OCwgMCwgNzcwICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogJywgYmxlbmRpbmcgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xuXG5cdFx0XHRcdFx0XHRjYXNlIE5vcm1hbEJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggNzcwLCA3NzEsIDEsIDc3MSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDc3MCwgMSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDAsIDc2OSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDAsIDc2OCApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcblx0XHRcdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSBibGVuZGluZ1xuXG5cdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0YmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7XG5cdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XG5cblx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb24gXSwgZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uQWxwaGEgXSApO1xuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBmYWN0b3JUb0dMWyBibGVuZFNyYyBdLCBmYWN0b3JUb0dMWyBibGVuZERzdCBdLCBmYWN0b3JUb0dMWyBibGVuZFNyY0FscGhhIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0QWxwaGEgXSApO1xuXG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcblx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gbnVsbDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApIHtcblxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcblx0XHRcdD8gZGlzYWJsZSggMjg4NCApXG5cdFx0XHQ6IGVuYWJsZSggMjg4NCApO1xuXG5cdFx0bGV0IGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0KCBtYXRlcmlhbC5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IGZhbHNlIClcblx0XHRcdD8gc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKVxuXHRcdFx0OiBzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7XG5cdFx0c3RlbmNpbEJ1ZmZlci5zZXRUZXN0KCBzdGVuY2lsV3JpdGUgKTtcblx0XHRpZiAoIHN0ZW5jaWxXcml0ZSApIHtcblxuXHRcdFx0c3RlbmNpbEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrICk7XG5cdFx0XHRzdGVuY2lsQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLnN0ZW5jaWxGdW5jLCBtYXRlcmlhbC5zdGVuY2lsUmVmLCBtYXRlcmlhbC5zdGVuY2lsRnVuY01hc2sgKTtcblx0XHRcdHN0ZW5jaWxCdWZmZXIuc2V0T3AoIG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0fVxuXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XG5cblx0XHRtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWVcblx0XHRcdD8gZW5hYmxlKCAzMjkyNiApXG5cdFx0XHQ6IGRpc2FibGUoIDMyOTI2ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcblxuXHRcdFx0aWYgKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCAyMzA0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCAyMzA1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xuXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xuXG5cdFx0XHRlbmFibGUoIDI4ODQgKTtcblxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xuXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCAxMDI5ICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggMTAyOCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggMTAzMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggMjg4NCApO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XG5cblx0XHRpZiAoIHdpZHRoICE9PSBjdXJyZW50TGluZVdpZHRoICkge1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVXaWR0aCggd2lkdGggKTtcblxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xuXG5cdFx0aWYgKCBwb2x5Z29uT2Zmc2V0ICkge1xuXG5cdFx0XHRlbmFibGUoIDMyODIzICk7XG5cblx0XHRcdGlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcblxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XG5cblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7XG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggMzI4MjMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCAzMDg5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCAzMDg5ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIHRleHR1cmVcblxuXHRmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XG5cblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gMzM5ODQgKyBtYXhUZXh0dXJlcyAtIDE7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xuXG5cdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcblx0XHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XG5cblx0XHRcdGFjdGl2ZVRleHR1cmUoKTtcblxuXHRcdH1cblxuXHRcdGxldCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XG5cdFx0XHRjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7XG5cblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlO1xuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVuYmluZFRleHR1cmUoKSB7XG5cblx0XHRjb25zdCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVGV4dHVyZS50eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCBib3VuZFRleHR1cmUudHlwZSwgbnVsbCApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gdW5kZWZpbmVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlM0QoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTNELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Ly8gcmVzZXQgc3RhdGVcblxuXHRcdGdsLmRpc2FibGUoIDMwNDIgKTtcblx0XHRnbC5kaXNhYmxlKCAyODg0ICk7XG5cdFx0Z2wuZGlzYWJsZSggMjkyOSApO1xuXHRcdGdsLmRpc2FibGUoIDMyODIzICk7XG5cdFx0Z2wuZGlzYWJsZSggMzA4OSApO1xuXHRcdGdsLmRpc2FibGUoIDI5NjAgKTtcblx0XHRnbC5kaXNhYmxlKCAzMjkyNiApO1xuXG5cdFx0Z2wuYmxlbmRFcXVhdGlvbiggMzI3NzQgKTtcblx0XHRnbC5ibGVuZEZ1bmMoIDEsIDAgKTtcblx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggMSwgMCwgMSwgMCApO1xuXG5cdFx0Z2wuY29sb3JNYXNrKCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlICk7XG5cdFx0Z2wuY2xlYXJDb2xvciggMCwgMCwgMCwgMCApO1xuXG5cdFx0Z2wuZGVwdGhNYXNrKCB0cnVlICk7XG5cdFx0Z2wuZGVwdGhGdW5jKCA1MTMgKTtcblx0XHRnbC5jbGVhckRlcHRoKCAxICk7XG5cblx0XHRnbC5zdGVuY2lsTWFzayggMHhmZmZmZmZmZiApO1xuXHRcdGdsLnN0ZW5jaWxGdW5jKCA1MTksIDAsIDB4ZmZmZmZmZmYgKTtcblx0XHRnbC5zdGVuY2lsT3AoIDc2ODAsIDc2ODAsIDc2ODAgKTtcblx0XHRnbC5jbGVhclN0ZW5jaWwoIDAgKTtcblxuXHRcdGdsLmN1bGxGYWNlKCAxMDI5ICk7XG5cdFx0Z2wuZnJvbnRGYWNlKCAyMzA1ICk7XG5cblx0XHRnbC5wb2x5Z29uT2Zmc2V0KCAwLCAwICk7XG5cblx0XHRnbC5hY3RpdmVUZXh0dXJlKCAzMzk4NCApO1xuXG5cdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgbnVsbCApO1xuXG5cdFx0aWYgKCBpc1dlYkdMMiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOSwgbnVsbCApO1xuXHRcdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0Z2wudXNlUHJvZ3JhbSggbnVsbCApO1xuXG5cdFx0Z2wubGluZVdpZHRoKCAxICk7XG5cblx0XHRnbC5zY2lzc29yKCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblx0XHRnbC52aWV3cG9ydCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHQvLyByZXNldCBpbnRlcm5hbHNcblxuXHRcdGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdFx0Y3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHRcdHhyRnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xuXG5cdFx0Y3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdFx0Y3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRcdGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsO1xuXG5cdFx0Y3VycmVudFNjaXNzb3Iuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblx0XHRjdXJyZW50Vmlld3BvcnQuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGVuYWJsZTogZW5hYmxlLFxuXHRcdGRpc2FibGU6IGRpc2FibGUsXG5cblx0XHRiaW5kRnJhbWVidWZmZXI6IGJpbmRGcmFtZWJ1ZmZlcixcblx0XHRiaW5kWFJGcmFtZWJ1ZmZlcjogYmluZFhSRnJhbWVidWZmZXIsXG5cblx0XHR1c2VQcm9ncmFtOiB1c2VQcm9ncmFtLFxuXG5cdFx0c2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLFxuXHRcdHNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCxcblxuXHRcdHNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLFxuXHRcdHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSxcblxuXHRcdHNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLFxuXHRcdHNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsXG5cblx0XHRzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsXG5cblx0XHRhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLFxuXHRcdGJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSxcblx0XHR1bmJpbmRUZXh0dXJlOiB1bmJpbmRUZXh0dXJlLFxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCxcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxuXHRcdHRleEltYWdlM0Q6IHRleEltYWdlM0QsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXM7XG5cdGNvbnN0IG1heEN1YmVtYXBTaXplID0gY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplO1xuXHRjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZTtcblx0Y29uc3QgbWF4U2FtcGxlcyA9IGNhcGFiaWxpdGllcy5tYXhTYW1wbGVzO1xuXG5cdGNvbnN0IF92aWRlb1RleHR1cmVzID0gbmV3IFdlYWtNYXAoKTtcblx0bGV0IF9jYW52YXM7XG5cblx0Ly8gY29yZG92YSBpT1MgKGFzIG9mIDUuMCkgc3RpbGwgdXNlcyBVSVdlYlZpZXcsIHdoaWNoIHByb3ZpZGVzIE9mZnNjcmVlbkNhbnZhcyxcblx0Ly8gYWxzbyBPZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIpLCBidXQgbm90IE9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhXG5cdC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBvbmx5IGltcGxlbWVudCBPZmZzY3JlZW5DYW52YXMgcGFydGlhbGx5IChlLmcuIGxhY2tpbmcgMmQpLlxuXG5cdGxldCB1c2VPZmZzY3JlZW5DYW52YXMgPSBmYWxzZTtcblxuXHR0cnkge1xuXG5cdFx0dXNlT2Zmc2NyZWVuQ2FudmFzID0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCdcblx0XHRcdCYmICggbmV3IE9mZnNjcmVlbkNhbnZhcyggMSwgMSApLmdldENvbnRleHQoICcyZCcgKSApICE9PSBudWxsO1xuXG5cdH0gY2F0Y2ggKCBlcnIgKSB7XG5cblx0XHQvLyBJZ25vcmUgYW55IGVycm9yc1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHQvLyBVc2UgT2Zmc2NyZWVuQ2FudmFzIHdoZW4gYXZhaWxhYmxlLiBTcGVjaWFsbHkgbmVlZGVkIGluIHdlYiB3b3JrZXJzXG5cblx0XHRyZXR1cm4gdXNlT2Zmc2NyZWVuQ2FudmFzID9cblx0XHRcdG5ldyBPZmZzY3JlZW5DYW52YXMoIHdpZHRoLCBoZWlnaHQgKSA6XG5cdFx0XHRkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzaXplSW1hZ2UoIGltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIG5lZWRzTmV3Q2FudmFzLCBtYXhTaXplICkge1xuXG5cdFx0bGV0IHNjYWxlID0gMTtcblxuXHRcdC8vIGhhbmRsZSBjYXNlIGlmIHRleHR1cmUgZXhjZWVkcyBtYXggc2l6ZVxuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0c2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgcGVyZm9ybSByZXNpemUgaWYgbmVjZXNzYXJ5XG5cblx0XHRpZiAoIHNjYWxlIDwgMSB8fCBuZWVkc1Bvd2VyT2ZUd28gPT09IHRydWUgKSB7XG5cblx0XHRcdC8vIG9ubHkgcGVyZm9ybSByZXNpemUgZm9yIGNlcnRhaW4gaW1hZ2UgdHlwZXNcblxuXHRcdFx0aWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fFxuXHRcdFx0XHQoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHx8XG5cdFx0XHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XG5cblx0XHRcdFx0Y29uc3QgZmxvb3IgPSBuZWVkc1Bvd2VyT2ZUd28gPyBNYXRoVXRpbHMuZmxvb3JQb3dlck9mVHdvIDogTWF0aC5mbG9vcjtcblxuXHRcdFx0XHRjb25zdCB3aWR0aCA9IGZsb29yKCBzY2FsZSAqIGltYWdlLndpZHRoICk7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IGZsb29yKCBzY2FsZSAqIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0XHRcdC8vIGN1YmUgdGV4dHVyZXMgY2FuJ3QgcmV1c2UgdGhlIHNhbWUgY2FudmFzXG5cblx0XHRcdFx0Y29uc3QgY2FudmFzID0gbmVlZHNOZXdDYW52YXMgPyBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSA6IF9jYW52YXM7XG5cblx0XHRcdFx0Y2FudmFzLndpZHRoID0gd2lkdGg7XG5cdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKSB0byAoJyArIHdpZHRoICsgJ3gnICsgaGVpZ2h0ICsgJykuJyApO1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBJbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpbWFnZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0cmV0dXJuIE1hdGhVdGlscy5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgTWF0aFV0aWxzLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGlzV2ViR0wyICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBzdXBwb3J0c01pcHMgJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IE1hdGgubG9nMiggTWF0aC5tYXgoIHdpZHRoLCBoZWlnaHQgKSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdCggaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlICkge1xuXG5cdFx0aWYgKCBpc1dlYkdMMiA9PT0gZmFsc2UgKSByZXR1cm4gZ2xGb3JtYXQ7XG5cblx0XHRpZiAoIGludGVybmFsRm9ybWF0TmFtZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gX2dsWyBpbnRlcm5hbEZvcm1hdE5hbWUgXTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCBcXCcnICsgaW50ZXJuYWxGb3JtYXROYW1lICsgJ1xcJycgKTtcblxuXHRcdH1cblxuXHRcdGxldCBpbnRlcm5hbEZvcm1hdCA9IGdsRm9ybWF0O1xuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwMyApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI2O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI1O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzIxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwNyApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODM3O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODQzO1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMyODQ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwOCApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODM2O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODQyO1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMyODU2O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpbnRlcm5hbEZvcm1hdCA9PT0gMzMzMjUgfHwgaW50ZXJuYWxGb3JtYXQgPT09IDMzMzI2IHx8XG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gMzQ4NDIgfHwgaW50ZXJuYWxGb3JtYXQgPT09IDM0ODM2ICkge1xuXG5cdFx0XHRleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJuYWxGb3JtYXQ7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIDk3Mjg7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gOTcyOTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcblxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuZGVsZXRlKCB0ZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICkgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7XG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdGxldCB0ZXh0dXJlVW5pdHMgPSAwO1xuXG5cdGZ1bmN0aW9uIHJlc2V0VGV4dHVyZVVuaXRzKCkge1xuXG5cdFx0dGV4dHVyZVVuaXRzID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWxsb2NhdGVUZXh0dXJlVW5pdCgpIHtcblxuXHRcdGNvbnN0IHRleHR1cmVVbml0ID0gdGV4dHVyZVVuaXRzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVW5pdCA+PSBtYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgbWF4VGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyREFycmF5KCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1ODY2LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlM0QoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzI4NzksIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGxvYWRDdWJlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNDA2NywgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0Y29uc3Qgd3JhcHBpbmdUb0dMID0ge1xuXHRcdFsgUmVwZWF0V3JhcHBpbmcgXTogMTA0OTcsXG5cdFx0WyBDbGFtcFRvRWRnZVdyYXBwaW5nIF06IDMzMDcxLFxuXHRcdFsgTWlycm9yZWRSZXBlYXRXcmFwcGluZyBdOiAzMzY0OFxuXHR9O1xuXG5cdGNvbnN0IGZpbHRlclRvR0wgPSB7XG5cdFx0WyBOZWFyZXN0RmlsdGVyIF06IDk3MjgsXG5cdFx0WyBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciBdOiA5OTg0LFxuXHRcdFsgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciBdOiA5OTg2LFxuXG5cdFx0WyBMaW5lYXJGaWx0ZXIgXTogOTcyOSxcblx0XHRbIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgXTogOTk4NSxcblx0XHRbIExpbmVhck1pcG1hcExpbmVhckZpbHRlciBdOiA5OTg3XG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSB7XG5cblx0XHRpZiAoIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0Miwgd3JhcHBpbmdUb0dMWyB0ZXh0dXJlLndyYXBTIF0gKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDMsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwVCBdICk7XG5cblx0XHRcdGlmICggdGV4dHVyZVR5cGUgPT09IDMyODc5IHx8IHRleHR1cmVUeXBlID09PSAzNTg2NiApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDMyODgyLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDAsIGZpbHRlclRvR0xbIHRleHR1cmUubWFnRmlsdGVyIF0gKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDEsIGZpbHRlclRvR0xbIHRleHR1cmUubWluRmlsdGVyIF0gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDIsIDMzMDcxICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQzLCAzMzA3MSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVUeXBlID09PSAzMjg3OSB8fCB0ZXh0dXJlVHlwZSA9PT0gMzU4NjYgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAzMjg4MiwgMzMwNzEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQwLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MSwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBmYWxzZSApIHJldHVybjsgLy8gdmVyaWZ5IGV4dGVuc2lvbiBmb3IgV2ViR0wgMSBhbmQgV2ViR0wgMlxuXHRcdFx0aWYgKCBpc1dlYkdMMiA9PT0gZmFsc2UgJiYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5oYXMoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gZmFsc2UgKSApIHJldHVybjsgLy8gdmVyaWZ5IGV4dGVuc2lvbiBmb3IgV2ViR0wgMSBvbmx5XG5cblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xuXHRcdFx0XHRwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XG5cblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0bGV0IHRleHR1cmVUeXBlID0gMzU1MztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHRleHR1cmVUeXBlID0gMzU4NjY7XG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUzRCApIHRleHR1cmVUeXBlID0gMzI4Nzk7XG5cblx0XHRpbml0VGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDAsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQxLCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTcsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MywgMCApO1xuXG5cdFx0Y29uc3QgbmVlZHNQb3dlck9mVHdvID0gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApICYmIGlzUG93ZXJPZlR3byggdGV4dHVyZS5pbWFnZSApID09PSBmYWxzZTtcblx0XHRjb25zdCBpbWFnZSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIGZhbHNlLCBtYXhUZXh0dXJlU2l6ZSApO1xuXG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCBpbWFnZSApIHx8IGlzV2ViR0wyLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0bGV0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApLFxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApO1xuXG5cdFx0bGV0IG1pcG1hcDtcblx0XHRjb25zdCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHRnbEludGVybmFsRm9ybWF0ID0gNjQwMjtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM2MDEyO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDMzMTkwO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM1MDU2O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzMxODk7IC8vIFdlYkdMMiByZXF1aXJlcyBzaXplZCBpbnRlcm5hbGZvcm1hdCBmb3IgZ2xUZXhJbWFnZTJEXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgV2ViR0wgMVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCAmJiBnbEludGVybmFsRm9ybWF0ID09PSA2NDAyICkge1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9DT01QT05FTlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVFxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgJiYgZ2xJbnRlcm5hbEZvcm1hdCA9PT0gNjQwMiApIHtcblxuXHRcdFx0XHQvLyBEZXB0aCBzdGVuY2lsIHRleHR1cmVzIG5lZWQgdGhlIERFUFRIX1NURU5DSUwgaW50ZXJuYWwgZm9ybWF0XG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzQwNDE7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvL1xuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBzdXBwb3J0c01pcHMgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzU1MywgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdGlmICggZ2xGb3JtYXQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUyREFycmF5ICkge1xuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCAzNTg2NiwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlM0QgKSB7XG5cblx0XHRcdHN0YXRlLnRleEltYWdlM0QoIDMyODc5LCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKVxuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgc3VwcG9ydHNNaXBzICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7XG5cblx0XHRcdGdlbmVyYXRlTWlwbWFwKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRDdWJlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2ICkgcmV0dXJuO1xuXG5cdFx0aW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICk7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQwLCB0ZXh0dXJlLmZsaXBZICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MSwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMzE3LCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDMsIDAgKTtcblxuXHRcdGNvbnN0IGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSB8fCB0ZXh0dXJlLmltYWdlWyAwIF0uaXNDb21wcmVzc2VkVGV4dHVyZSApICk7XG5cdFx0Y29uc3QgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRjb25zdCBjdWJlSW1hZ2UgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgJiYgISBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gcmVzaXplSW1hZ2UoIHRleHR1cmUuaW1hZ2VbIGkgXSwgZmFsc2UsIHRydWUsIG1heEN1YmVtYXBTaXplICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0c3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCBpbWFnZSApIHx8IGlzV2ViR0wyLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICksXG5cdFx0XHRnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblxuXHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCAzNDA2NywgdGV4dHVyZSwgc3VwcG9ydHNNaXBzICk7XG5cblx0XHRsZXQgbWlwbWFwcztcblxuXHRcdGlmICggaXNDb21wcmVzc2VkICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG1pcG1hcHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgbWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCAzNDA2OSArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKScgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcEltYWdlID0gbWlwbWFwLmltYWdlWyBpIF0uaW1hZ2U7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcEltYWdlLndpZHRoLCBtaXBtYXBJbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcEltYWdlLmRhdGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCBqICsgMSwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHQvLyBXZSBhc3N1bWUgaW1hZ2VzIGZvciBjdWJlIG1hcCBoYXZlIHRoZSBzYW1lIHNpemUuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggMzQwNjcsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXHRcdGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVGFyZ2V0ID09PSAzMjg3OSB8fCB0ZXh0dXJlVGFyZ2V0ID09PSAzNTg2NiApIHtcblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UzRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCByZW5kZXJUYXJnZXQuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7XG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdGxldCBnbEludGVybmFsRm9ybWF0ID0gMzMxODk7XG5cblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZSApIHtcblxuXHRcdFx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHtcblxuXHRcdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM2MDEyO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGVwdGhUZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDMzMTkwO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzYwOTYsIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgMzUwNTYsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgMzQwNDEsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzMzMDYsIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblxuXHRcdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXHRcdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cdFx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIDM2MTYxLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdGNvbnN0IGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApO1xuXHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAnRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCcgKTtcblxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHRjb25zdCB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzYwOTYsIDM1NTMsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCAzMzMwNiwgMzU1Mywgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldCB1cCBHTCByZXNvdXJjZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0XG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcblx0XHRjb25zdCBpc011bHRpc2FtcGxlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID09PSB0cnVlICk7XG5cdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQzRCA9IHRleHR1cmUuaXNEYXRhVGV4dHVyZTNEIHx8IHRleHR1cmUuaXNEYXRhVGV4dHVyZTJEQXJyYXk7XG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSB8fCBpc1dlYkdMMjtcblxuXHRcdC8vIEhhbmRsZXMgV2ViR0wyIFJHQkZvcm1hdCBmYWxsYmFjayAtICMxODg1OFxuXG5cdFx0aWYgKCBpc1dlYkdMMiAmJiB0ZXh0dXJlLmZvcm1hdCA9PT0gUkdCRm9ybWF0ICYmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgfHwgdGV4dHVyZS50eXBlID09PSBIYWxmRmxvYXRUeXBlICkgKSB7XG5cblx0XHRcdHRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogUmVuZGVyaW5nIHRvIHRleHR1cmVzIHdpdGggUkdCIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiBVc2luZyBSR0JBIGZvcm1hdCBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGZyYW1lYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZSApIHtcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblxuXHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKTtcblx0XHRcdFx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblx0XHRcdFx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblx0XHRcdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTtcblx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIDM2MTYwLCAzNjA2NCwgMzYxNjEsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICk7XG5cdFx0XHRcdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQsIHRydWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIG51bGwgKTtcblxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIDM0MDY3LCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgMzQwNjkgKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCAzNDA2NywgdGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsZXQgZ2xUZXh0dXJlVHlwZSA9IDM1NTM7XG5cblx0XHRcdGlmICggaXNSZW5kZXJUYXJnZXQzRCApIHtcblxuXHRcdFx0XHQvLyBSZW5kZXIgdGFyZ2V0cyBjb250YWluaW5nIGxheWVycywgaS5lOiBUZXh0dXJlIDNEIGFuZCAyZCBhcnJheXNcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgaXNUZXh0dXJlM0QgPSB0ZXh0dXJlLmlzRGF0YVRleHR1cmUzRDtcblx0XHRcdFx0XHRnbFRleHR1cmVUeXBlID0gaXNUZXh0dXJlM0QgPyAzMjg3OSA6IDM1ODY2O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkgb25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgZ2xUZXh0dXJlVHlwZSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIDM1NTMsIHRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNTUzLCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSB8fCBpc1dlYkdMMjtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSApIHtcblxuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID8gMzQwNjcgOiAzNTUzO1xuXHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYwMDgsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYwMDksIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0Y29uc3Qgd2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XG5cdFx0XHRcdGxldCBtYXNrID0gMTYzODQ7XG5cblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSBtYXNrIHw9IDI1Njtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIG1hc2sgfD0gMTAyNDtcblxuXHRcdFx0XHRfZ2wuYmxpdEZyYW1lYnVmZmVyKCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCA5NzI4ICk7XG5cblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTsgLy8gc2VlICMxODkwNVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuICggaXNXZWJHTDIgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApID9cblx0XHRcdE1hdGgubWluKCBtYXhTYW1wbGVzLCByZW5kZXJUYXJnZXQuc2FtcGxlcyApIDogMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0Y29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlcy5nZXQoIHRleHR1cmUgKSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzLnNldCggdGV4dHVyZSwgZnJhbWUgKTtcblx0XHRcdHRleHR1cmUudXBkYXRlKCk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0bGV0IHdhcm5lZFRleHR1cmUyRCA9IGZhbHNlO1xuXHRsZXQgd2FybmVkVGV4dHVyZUN1YmUgPSBmYWxzZTtcblxuXHRmdW5jdGlvbiBzYWZlU2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB3YXJuZWRUZXh0dXJlMkQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uXFwndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLicgKTtcblx0XHRcdFx0d2FybmVkVGV4dHVyZTJEID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNhZmVTZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHdhcm5lZFRleHR1cmVDdWJlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZTogZG9uXFwndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuJyApO1xuXHRcdFx0XHR3YXJuZWRUZXh0dXJlQ3ViZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdH1cblxuXG5cdFx0c2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0O1xuXHR0aGlzLnJlc2V0VGV4dHVyZVVuaXRzID0gcmVzZXRUZXh0dXJlVW5pdHM7XG5cblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEQXJyYXkgPSBzZXRUZXh0dXJlMkRBcnJheTtcblx0dGhpcy5zZXRUZXh0dXJlM0QgPSBzZXRUZXh0dXJlM0Q7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblx0dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCA9IHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0O1xuXG5cdHRoaXMuc2FmZVNldFRleHR1cmUyRCA9IHNhZmVTZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2FmZVNldFRleHR1cmVDdWJlID0gc2FmZVNldFRleHR1cmVDdWJlO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMVXRpbHMoIGdsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdGxldCBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gNTEyMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiAzMjgxOTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiAzMjgyMDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIDMzNjM1O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiA1MTIwO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIDUxMjI7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiA1MTIzO1xuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiA1MTI0O1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIDUxMjU7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gNTEyNjtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiA1MTMxO1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gNjQwNjtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiA2NDA3O1xuXHRcdGlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiA2NDA4O1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIDY0MDk7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiA2NDEwO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gNjQwMjtcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiAzNDA0MTtcblx0XHRpZiAoIHAgPT09IFJlZEZvcm1hdCApIHJldHVybiA2NDAzO1xuXG5cdFx0Ly8gV2ViR0wyIGZvcm1hdHMuXG5cblx0XHRpZiAoIHAgPT09IFJlZEludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDQ7XG5cdFx0aWYgKCBwID09PSBSR0Zvcm1hdCApIHJldHVybiAzMzMxOTtcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiAzMzMyMDtcblx0XHRpZiAoIHAgPT09IFJHQkludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDg7XG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiAzNjI0OTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQjhfRVRDMjtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0VUQzJfRUFDX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNHg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIFRPRE8gQ29tcGxldGU/XG5cblx0XHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyBUT0RPIENvbXBsZXRlP1xuXG5cdFx0XHRcdHJldHVybiBwO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiAzNDA0MjtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcblxufVxuXG5jbGFzcyBBcnJheUNhbWVyYSBleHRlbmRzIFBlcnNwZWN0aXZlQ2FtZXJhIHtcblxuXHRjb25zdHJ1Y3RvciggYXJyYXkgPSBbXSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLmNhbWVyYXMgPSBhcnJheTtcblxuXHR9XG5cbn1cblxuQXJyYXlDYW1lcmEucHJvdG90eXBlLmlzQXJyYXlDYW1lcmEgPSB0cnVlO1xuXG5jbGFzcyBHcm91cCBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xuXG5cdH1cblxufVxuXG5Hcm91cC5wcm90b3R5cGUuaXNHcm91cCA9IHRydWU7XG5cbmZ1bmN0aW9uIFdlYlhSQ29udHJvbGxlcigpIHtcblxuXHR0aGlzLl90YXJnZXRSYXkgPSBudWxsO1xuXHR0aGlzLl9ncmlwID0gbnVsbDtcblx0dGhpcy5faGFuZCA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggV2ViWFJDb250cm9sbGVyLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBXZWJYUkNvbnRyb2xsZXIsXG5cblx0Z2V0SGFuZFNwYWNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2hhbmQgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2hhbmQgPSBuZXcgR3JvdXAoKTtcblx0XHRcdHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5faGFuZC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdHRoaXMuX2hhbmQuam9pbnRzID0ge307XG5cdFx0XHR0aGlzLl9oYW5kLmlucHV0U3RhdGUgPSB7IHBpbmNoaW5nOiBmYWxzZSB9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2hhbmQ7XG5cblx0fSxcblxuXHRnZXRUYXJnZXRSYXlTcGFjZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLl90YXJnZXRSYXkgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3RhcmdldFJheSA9IG5ldyBHcm91cCgpO1xuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5O1xuXG5cdH0sXG5cblx0Z2V0R3JpcFNwYWNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2dyaXAgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2dyaXAgPSBuZXcgR3JvdXAoKTtcblx0XHRcdHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZ3JpcDtcblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX2dyaXAgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2dyaXAuZGlzcGF0Y2hFdmVudCggZXZlbnQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5faGFuZCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5faGFuZC5kaXNwYXRjaEV2ZW50KCBldmVudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNjb25uZWN0OiBmdW5jdGlvbiAoIGlucHV0U291cmNlICkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5fZ3JpcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX2hhbmQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggaW5wdXRTb3VyY2UsIGZyYW1lLCByZWZlcmVuY2VTcGFjZSApIHtcblxuXHRcdGxldCBpbnB1dFBvc2UgPSBudWxsO1xuXHRcdGxldCBncmlwUG9zZSA9IG51bGw7XG5cdFx0bGV0IGhhbmRQb3NlID0gbnVsbDtcblxuXHRcdGNvbnN0IHRhcmdldFJheSA9IHRoaXMuX3RhcmdldFJheTtcblx0XHRjb25zdCBncmlwID0gdGhpcy5fZ3JpcDtcblx0XHRjb25zdCBoYW5kID0gdGhpcy5faGFuZDtcblxuXHRcdGlmICggaW5wdXRTb3VyY2UgJiYgZnJhbWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUgIT09ICd2aXNpYmxlLWJsdXJyZWQnICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpbnB1dFBvc2UgPSBmcmFtZS5nZXRQb3NlKCBpbnB1dFNvdXJjZS50YXJnZXRSYXlTcGFjZSwgcmVmZXJlbmNlU3BhY2UgKTtcblxuXHRcdFx0XHRpZiAoIGlucHV0UG9zZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZnJvbUFycmF5KCBpbnB1dFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZGVjb21wb3NlKCB0YXJnZXRSYXkucG9zaXRpb24sIHRhcmdldFJheS5yb3RhdGlvbiwgdGFyZ2V0UmF5LnNjYWxlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFuZCAmJiBpbnB1dFNvdXJjZS5oYW5kICkge1xuXG5cdFx0XHRcdGhhbmRQb3NlID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnB1dGpvaW50IG9mIGlucHV0U291cmNlLmhhbmQudmFsdWVzKCkgKSB7XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgdGhlIGpvaW50cyBncm91cHMgd2l0aCB0aGUgWFJKb2ludCBwb3Nlc1xuXHRcdFx0XHRcdGNvbnN0IGpvaW50UG9zZSA9IGZyYW1lLmdldEpvaW50UG9zZSggaW5wdXRqb2ludCwgcmVmZXJlbmNlU3BhY2UgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZC5qb2ludHNbIGlucHV0am9pbnQuam9pbnROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gVGhlIHRyYW5zZm9ybSBvZiB0aGlzIGpvaW50IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBqb2ludCBwb3NlIG9uIGVhY2ggZnJhbWVcblx0XHRcdFx0XHRcdGNvbnN0IGpvaW50ID0gbmV3IEdyb3VwKCk7XG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRqb2ludC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXSA9IGpvaW50O1xuXHRcdFx0XHRcdFx0Ly8gPz9cblx0XHRcdFx0XHRcdGhhbmQuYWRkKCBqb2ludCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3Qgam9pbnQgPSBoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggam9pbnRQb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXguZnJvbUFycmF5KCBqb2ludFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRcdFx0am9pbnQubWF0cml4LmRlY29tcG9zZSggam9pbnQucG9zaXRpb24sIGpvaW50LnJvdGF0aW9uLCBqb2ludC5zY2FsZSApO1xuXHRcdFx0XHRcdFx0am9pbnQuam9pbnRSYWRpdXMgPSBqb2ludFBvc2UucmFkaXVzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0am9pbnQudmlzaWJsZSA9IGpvaW50UG9zZSAhPT0gbnVsbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3VzdG9tIGV2ZW50c1xuXG5cdFx0XHRcdC8vIENoZWNrIHBpbmNoelxuXHRcdFx0XHRjb25zdCBpbmRleFRpcCA9IGhhbmQuam9pbnRzWyAnaW5kZXgtZmluZ2VyLXRpcCcgXTtcblx0XHRcdFx0Y29uc3QgdGh1bWJUaXAgPSBoYW5kLmpvaW50c1sgJ3RodW1iLXRpcCcgXTtcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBpbmRleFRpcC5wb3NpdGlvbi5kaXN0YW5jZVRvKCB0aHVtYlRpcC5wb3NpdGlvbiApO1xuXG5cdFx0XHRcdGNvbnN0IGRpc3RhbmNlVG9QaW5jaCA9IDAuMDI7XG5cdFx0XHRcdGNvbnN0IHRocmVzaG9sZCA9IDAuMDA1O1xuXG5cdFx0XHRcdGlmICggaGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nICYmIGRpc3RhbmNlID4gZGlzdGFuY2VUb1BpbmNoICsgdGhyZXNob2xkICkge1xuXG5cdFx0XHRcdFx0aGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAncGluY2hlbmQnLFxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhIGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA8PSBkaXN0YW5jZVRvUGluY2ggLSB0aHJlc2hvbGQgKSB7XG5cblx0XHRcdFx0XHRoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3BpbmNoc3RhcnQnLFxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBncmlwICE9PSBudWxsICYmIGlucHV0U291cmNlLmdyaXBTcGFjZSApIHtcblxuXHRcdFx0XHRcdGdyaXBQb3NlID0gZnJhbWUuZ2V0UG9zZSggaW5wdXRTb3VyY2UuZ3JpcFNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0XHRcdFx0aWYgKCBncmlwUG9zZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0Z3JpcC5tYXRyaXguZnJvbUFycmF5KCBncmlwUG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XG5cdFx0XHRcdFx0XHRncmlwLm1hdHJpeC5kZWNvbXBvc2UoIGdyaXAucG9zaXRpb24sIGdyaXAucm90YXRpb24sIGdyaXAuc2NhbGUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGFyZ2V0UmF5ICE9PSBudWxsICkge1xuXG5cdFx0XHR0YXJnZXRSYXkudmlzaWJsZSA9ICggaW5wdXRQb3NlICE9PSBudWxsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyaXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGdyaXAudmlzaWJsZSA9ICggZ3JpcFBvc2UgIT09IG51bGwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaGFuZCAhPT0gbnVsbCApIHtcblxuXHRcdFx0aGFuZC52aXNpYmxlID0gKCBoYW5kUG9zZSAhPT0gbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIFdlYlhSTWFuYWdlciggcmVuZGVyZXIsIGdsICkge1xuXG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblx0Y29uc3Qgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcblxuXHRsZXQgc2Vzc2lvbiA9IG51bGw7XG5cblx0bGV0IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxLjA7XG5cblx0bGV0IHJlZmVyZW5jZVNwYWNlID0gbnVsbDtcblx0bGV0IHJlZmVyZW5jZVNwYWNlVHlwZSA9ICdsb2NhbC1mbG9vcic7XG5cblx0bGV0IHBvc2UgPSBudWxsO1xuXG5cdGNvbnN0IGNvbnRyb2xsZXJzID0gW107XG5cdGNvbnN0IGlucHV0U291cmNlc01hcCA9IG5ldyBNYXAoKTtcblxuXHQvL1xuXG5cdGNvbnN0IGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYUwudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGNvbnN0IGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdGNhbWVyYVIudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGNvbnN0IGNhbWVyYXMgPSBbIGNhbWVyYUwsIGNhbWVyYVIgXTtcblxuXHRjb25zdCBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSgpO1xuXHRjYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHRsZXQgX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xuXHRsZXQgX2N1cnJlbnREZXB0aEZhciA9IG51bGw7XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xuXG5cdHRoaXMuZ2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRUYXJnZXRSYXlTcGFjZSgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDb250cm9sbGVyR3JpcCA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRHcmlwU3BhY2UoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0SGFuZCA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRIYW5kU3BhY2UoKTtcblxuXHR9O1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25TZXNzaW9uRXZlbnQoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IGlucHV0U291cmNlc01hcC5nZXQoIGV2ZW50LmlucHV0U291cmNlICk7XG5cblx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiBldmVudC50eXBlLCBkYXRhOiBldmVudC5pbnB1dFNvdXJjZSB9ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uU2Vzc2lvbkVuZCgpIHtcblxuXHRcdGlucHV0U291cmNlc01hcC5mb3JFYWNoKCBmdW5jdGlvbiAoIGNvbnRyb2xsZXIsIGlucHV0U291cmNlICkge1xuXG5cdFx0XHRjb250cm9sbGVyLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XG5cblx0XHR9ICk7XG5cblx0XHRpbnB1dFNvdXJjZXNNYXAuY2xlYXIoKTtcblxuXHRcdF9jdXJyZW50RGVwdGhOZWFyID0gbnVsbDtcblx0XHRfY3VycmVudERlcHRoRmFyID0gbnVsbDtcblxuXHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIvcmVuZGVyaW5nIHN0YXRlXG5cblx0XHRzdGF0ZS5iaW5kWFJGcmFtZWJ1ZmZlciggbnVsbCApO1xuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCkgKTtcblxuXHRcdC8vXG5cblx0XHRhbmltYXRpb24uc3RvcCgpO1xuXG5cdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gZmFsc2U7XG5cblx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uZW5kJyB9ICk7XG5cblx0fVxuXG5cdHRoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gdmFsdWU7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNjYWxlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmVmZXJlbmNlU3BhY2VUeXBlID0gdmFsdWU7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5nZXRSZWZlcmVuY2VTcGFjZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiByZWZlcmVuY2VTcGFjZTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBzZXNzaW9uO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHNlc3Npb24gPSB2YWx1ZTtcblxuXHRcdGlmICggc2Vzc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdHN0YXJ0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplJywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemVzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2VuZCcsIG9uU2Vzc2lvbkVuZCApO1xuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXRzb3VyY2VzY2hhbmdlJywgb25JbnB1dFNvdXJjZXNDaGFuZ2UgKTtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0XHRcdGlmICggYXR0cmlidXRlcy54ckNvbXBhdGlibGUgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0YXdhaXQgZ2wubWFrZVhSQ29tcGF0aWJsZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGxheWVySW5pdCA9IHtcblx0XHRcdFx0YW50aWFsaWFzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyxcblx0XHRcdFx0YWxwaGE6IGF0dHJpYnV0ZXMuYWxwaGEsXG5cdFx0XHRcdGRlcHRoOiBhdHRyaWJ1dGVzLmRlcHRoLFxuXHRcdFx0XHRzdGVuY2lsOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsXG5cdFx0XHRcdGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3Jcblx0XHRcdH07XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXHRcdFx0Y29uc3QgYmFzZUxheWVyID0gbmV3IFhSV2ViR0xMYXllciggc2Vzc2lvbiwgZ2wsIGxheWVySW5pdCApO1xuXG5cdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGJhc2VMYXllcjogYmFzZUxheWVyIH0gKTtcblxuXHRcdFx0cmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSggcmVmZXJlbmNlU3BhY2VUeXBlICk7XG5cblx0XHRcdGFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZXNzaW9uICk7XG5cdFx0XHRhbmltYXRpb24uc3RhcnQoKTtcblxuXHRcdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gdHJ1ZTtcblxuXHRcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbnN0YXJ0JyB9ICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHRmdW5jdGlvbiBvbklucHV0U291cmNlc0NoYW5nZSggZXZlbnQgKSB7XG5cblx0XHRjb25zdCBpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlcztcblxuXHRcdC8vIEFzc2lnbiBpbnB1dFNvdXJjZXMgdG8gYXZhaWxhYmxlIGNvbnRyb2xsZXJzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlucHV0U291cmNlc01hcC5zZXQoIGlucHV0U291cmNlc1sgaSBdLCBjb250cm9sbGVyc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5yZW1vdmVkLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5yZW1vdmVkWyBpIF07XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gaW5wdXRTb3VyY2VzTWFwLmdldCggaW5wdXRTb3VyY2UgKTtcblxuXHRcdFx0aWYgKCBjb250cm9sbGVyICkge1xuXG5cdFx0XHRcdGNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xuXHRcdFx0XHRpbnB1dFNvdXJjZXNNYXAuZGVsZXRlKCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgY29ubmVjdGVkXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5hZGRlZC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQuYWRkZWRbIGkgXTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBpbnB1dFNvdXJjZXNNYXAuZ2V0KCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdFx0Y29udHJvbGxlci5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRjb25zdCBjYW1lcmFMUG9zID0gbmV3IFZlY3RvcjMoKTtcblx0Y29uc3QgY2FtZXJhUlBvcyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0LyoqXG5cdCAqIEFzc3VtZXMgMiBjYW1lcmFzIHRoYXQgYXJlIHBhcmFsbGVsIGFuZCBzaGFyZSBhbiBYLWF4aXMsIGFuZCB0aGF0XG5cdCAqIHRoZSBjYW1lcmFzJyBwcm9qZWN0aW9uIGFuZCB3b3JsZCBtYXRyaWNlcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuXG5cdCAqIEFuZCB0aGF0IG5lYXIgYW5kIGZhciBwbGFuZXMgYXJlIGlkZW50aWNhbCBmb3IgYm90aCBjYW1lcmFzLlxuXHQgKiBWaXN1YWxpemF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlOiBodHRwczovL2NvbXB1dGVyZ3JhcGhpY3Muc3RhY2tleGNoYW5nZS5jb20vYS80NzY1XG5cdCAqL1xuXHRmdW5jdGlvbiBzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmEsIGNhbWVyYUwsIGNhbWVyYVIgKSB7XG5cblx0XHRjYW1lcmFMUG9zLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhTC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYVJQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFSLm1hdHJpeFdvcmxkICk7XG5cblx0XHRjb25zdCBpcGQgPSBjYW1lcmFMUG9zLmRpc3RhbmNlVG8oIGNhbWVyYVJQb3MgKTtcblxuXHRcdGNvbnN0IHByb2pMID0gY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xuXHRcdGNvbnN0IHByb2pSID0gY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Ly8gVlIgc3lzdGVtcyB3aWxsIGhhdmUgaWRlbnRpY2FsIGZhciBhbmQgbmVhciBwbGFuZXMsIGFuZFxuXHRcdC8vIG1vc3QgbGlrZWx5IGlkZW50aWNhbCB0b3AgYW5kIGJvdHRvbSBmcnVzdHVtIGV4dGVudHMuXG5cdFx0Ly8gVXNlIHRoZSBsZWZ0IGNhbWVyYSBmb3IgdGhlc2UgdmFsdWVzLlxuXHRcdGNvbnN0IG5lYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gLSAxICk7XG5cdFx0Y29uc3QgZmFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdICsgMSApO1xuXHRcdGNvbnN0IHRvcEZvdiA9ICggcHJvakxbIDkgXSArIDEgKSAvIHByb2pMWyA1IF07XG5cdFx0Y29uc3QgYm90dG9tRm92ID0gKCBwcm9qTFsgOSBdIC0gMSApIC8gcHJvakxbIDUgXTtcblxuXHRcdGNvbnN0IGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdO1xuXHRcdGNvbnN0IHJpZ2h0Rm92ID0gKCBwcm9qUlsgOCBdICsgMSApIC8gcHJvalJbIDAgXTtcblx0XHRjb25zdCBsZWZ0ID0gbmVhciAqIGxlZnRGb3Y7XG5cdFx0Y29uc3QgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7XG5cblx0XHQvLyBDYWxjdWxhdGUgdGhlIG5ldyBjYW1lcmEncyBwb3NpdGlvbiBvZmZzZXQgZnJvbSB0aGVcblx0XHQvLyBsZWZ0IGNhbWVyYS4geE9mZnNldCBzaG91bGQgYmUgcm91Z2hseSBoYWxmIGBpcGRgLlxuXHRcdGNvbnN0IHpPZmZzZXQgPSBpcGQgLyAoIC0gbGVmdEZvdiArIHJpZ2h0Rm92ICk7XG5cdFx0Y29uc3QgeE9mZnNldCA9IHpPZmZzZXQgKiAtIGxlZnRGb3Y7XG5cblx0XHQvLyBUT0RPOiBCZXR0ZXIgd2F5IHRvIGFwcGx5IHRoaXMgb2Zmc2V0P1xuXHRcdGNhbWVyYUwubWF0cml4V29ybGQuZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcblx0XHRjYW1lcmEudHJhbnNsYXRlWCggeE9mZnNldCApO1xuXHRcdGNhbWVyYS50cmFuc2xhdGVaKCB6T2Zmc2V0ICk7XG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApO1xuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cblx0XHQvLyBGaW5kIHRoZSB1bmlvbiBvZiB0aGUgZnJ1c3R1bSB2YWx1ZXMgb2YgdGhlIGNhbWVyYXMgYW5kIHNjYWxlXG5cdFx0Ly8gdGhlIHZhbHVlcyBzbyB0aGF0IHRoZSBuZWFyIHBsYW5lJ3MgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlIGluIHdvcmxkIHNwYWNlLFxuXHRcdC8vIGFsdGhvdWdoIG11c3Qgbm93IGJlIHJlbGF0aXZlIHRvIHRoZSBuZXcgdW5pb24gY2FtZXJhLlxuXHRcdGNvbnN0IG5lYXIyID0gbmVhciArIHpPZmZzZXQ7XG5cdFx0Y29uc3QgZmFyMiA9IGZhciArIHpPZmZzZXQ7XG5cdFx0Y29uc3QgbGVmdDIgPSBsZWZ0IC0geE9mZnNldDtcblx0XHRjb25zdCByaWdodDIgPSByaWdodCArICggaXBkIC0geE9mZnNldCApO1xuXHRcdGNvbnN0IHRvcDIgPSB0b3BGb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XG5cdFx0Y29uc3QgYm90dG9tMiA9IGJvdHRvbUZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjtcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdDIsIHJpZ2h0MiwgdG9wMiwgYm90dG9tMiwgbmVhcjIsIGZhcjIgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQ2FtZXJhKCBjYW1lcmEsIHBhcmVudCApIHtcblxuXHRcdGlmICggcGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHBhcmVudC5tYXRyaXhXb3JsZCwgY2FtZXJhLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHR9XG5cblx0dGhpcy5nZXRDYW1lcmEgPSBmdW5jdGlvbiAoIGNhbWVyYSApIHtcblxuXHRcdGNhbWVyYVZSLm5lYXIgPSBjYW1lcmFSLm5lYXIgPSBjYW1lcmFMLm5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRjYW1lcmFWUi5mYXIgPSBjYW1lcmFSLmZhciA9IGNhbWVyYUwuZmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGlmICggX2N1cnJlbnREZXB0aE5lYXIgIT09IGNhbWVyYVZSLm5lYXIgfHwgX2N1cnJlbnREZXB0aEZhciAhPT0gY2FtZXJhVlIuZmFyICkge1xuXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhlIG5ldyByZW5kZXJTdGF0ZSB3b24ndCBhcHBseSB1bnRpbCB0aGUgbmV4dCBmcmFtZS4gU2VlICMxODMyMFxuXG5cdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7XG5cdFx0XHRcdGRlcHRoTmVhcjogY2FtZXJhVlIubmVhcixcblx0XHRcdFx0ZGVwdGhGYXI6IGNhbWVyYVZSLmZhclxuXHRcdFx0fSApO1xuXG5cdFx0XHRfY3VycmVudERlcHRoTmVhciA9IGNhbWVyYVZSLm5lYXI7XG5cdFx0XHRfY3VycmVudERlcHRoRmFyID0gY2FtZXJhVlIuZmFyO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50ID0gY2FtZXJhLnBhcmVudDtcblx0XHRjb25zdCBjYW1lcmFzID0gY2FtZXJhVlIuY2FtZXJhcztcblxuXHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhVlIsIHBhcmVudCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2FtZXJhcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhc1sgaSBdLCBwYXJlbnQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYVZSLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBjYW1lcmFWUi5tYXRyaXggKTtcblx0XHRjYW1lcmEubWF0cml4LmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XG5cblx0XHRjb25zdCBjaGlsZHJlbiA9IGNhbWVyYS5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgcHJvcGVyIHZpZXcgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRpZiAoIGNhbWVyYXMubGVuZ3RoID09PSAyICkge1xuXG5cdFx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFWUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYXNzdW1lIHNpbmdsZSBjYW1lcmEgc2V0dXAgKEFSKVxuXG5cdFx0XHRjYW1lcmFWUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhbWVyYVZSO1xuXG5cdH07XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHRsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0aWYgKCBwb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHRjb25zdCB2aWV3cyA9IHBvc2Uudmlld3M7XG5cdFx0XHRjb25zdCBiYXNlTGF5ZXIgPSBzZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcblxuXHRcdFx0c3RhdGUuYmluZFhSRnJhbWVidWZmZXIoIGJhc2VMYXllci5mcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRsZXQgY2FtZXJhVlJOZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHQvLyBjaGVjayBpZiBpdCdzIG5lY2Vzc2FyeSB0byByZWJ1aWxkIGNhbWVyYVZSJ3MgY2FtZXJhIGxpc3RcblxuXHRcdFx0aWYgKCB2aWV3cy5sZW5ndGggIT09IGNhbWVyYVZSLmNhbWVyYXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNhbWVyYVZSLmNhbWVyYXMubGVuZ3RoID0gMDtcblx0XHRcdFx0Y2FtZXJhVlJOZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB2aWV3c1sgaSBdO1xuXHRcdFx0XHRjb25zdCB2aWV3cG9ydCA9IGJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xuXG5cdFx0XHRcdGNvbnN0IGNhbWVyYSA9IGNhbWVyYXNbIGkgXTtcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5mcm9tQXJyYXkoIHZpZXcudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIHZpZXcucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdFx0XHRjYW1lcmEudmlld3BvcnQuc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0ICk7XG5cblx0XHRcdFx0aWYgKCBpID09PSAwICkge1xuXG5cdFx0XHRcdFx0Y2FtZXJhVlIubWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBjYW1lcmFWUk5lZWRzVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Y2FtZXJhVlIuY2FtZXJhcy5wdXNoKCBjYW1lcmEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjb25zdCBpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07XG5cdFx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IGlucHV0U291cmNlc1sgaSBdO1xuXG5cdFx0XHRjb250cm9sbGVyLnVwZGF0ZSggaW5wdXRTb3VyY2UsIGZyYW1lLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgKSBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soIHRpbWUsIGZyYW1lICk7XG5cblx0fVxuXG5cdGNvbnN0IGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpO1xuXHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFdlYlhSTWFuYWdlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTtcblxuZnVuY3Rpb24gV2ViR0xNYXRlcmlhbHMoIHByb3BlcnRpZXMgKSB7XG5cblx0ZnVuY3Rpb24gcmVmcmVzaEZvZ1VuaWZvcm1zKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUuY29weSggZm9nLmNvbG9yICk7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNNYXRjYXAoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zU3ByaXRlcyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5jb2xvci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0XHRtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTsgLy8gIzE1NTgxXG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZW52TWFwID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkuZW52TWFwO1xuXG5cdFx0aWYgKCBlbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGVudk1hcDtcblxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggZW52TWFwLmlzQ3ViZVRleHR1cmUgJiYgZW52TWFwLl9uZWVkc0ZsaXBFbnZNYXAgKSA/IC0gMSA6IDE7XG5cblx0XHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcblx0XHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcblxuXHRcdFx0Y29uc3QgbWF4TWlwTGV2ZWwgPSBwcm9wZXJ0aWVzLmdldCggZW52TWFwICkuX19tYXhNaXBMZXZlbDtcblxuXHRcdFx0aWYgKCBtYXhNaXBMZXZlbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gbWF4TWlwTGV2ZWw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcblx0XHRcdHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBzcGVjdWxhciBtYXBcblx0XHQvLyAzLiBkaXNwbGFjZW1lbnRNYXAgbWFwXG5cdFx0Ly8gNC4gbm9ybWFsIG1hcFxuXHRcdC8vIDUuIGJ1bXAgbWFwXG5cdFx0Ly8gNi4gcm91Z2huZXNzTWFwIG1hcFxuXHRcdC8vIDcuIG1ldGFsbmVzc01hcCBtYXBcblx0XHQvLyA4LiBhbHBoYU1hcCBtYXBcblx0XHQvLyA5LiBlbWlzc2l2ZU1hcCBtYXBcblx0XHQvLyAxMC4gY2xlYXJjb2F0IG1hcFxuXHRcdC8vIDExLiBjbGVhcmNvYXQgbm9ybWFsIG1hcFxuXHRcdC8vIDEyLiBjbGVhcmNvYXQgcm91Z2huZXNzTWFwIG1hcFxuXG5cdFx0bGV0IHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYnVtcE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0TWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwID0gdXZTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZTY2FsZU1hcC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggdXZTY2FsZU1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllcyBmb3IgdXYyXG5cdFx0Ly8gMS4gYW8gbWFwXG5cdFx0Ly8gMi4gbGlnaHQgbWFwXG5cblx0XHRsZXQgdXYyU2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICkge1xuXG5cdFx0XHR1djJTY2FsZU1hcCA9IG1hdGVyaWFsLmFvTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHV2MlNjYWxlTWFwID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2MlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2MlNjYWxlTWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0dXYyU2NhbGVNYXAgPSB1djJTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXYyU2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1djJTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51djJUcmFuc2Zvcm0udmFsdWUuY29weSggdXYyU2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTtcblx0XHR1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1hdGVyaWFsLmdhcFNpemU7XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblx0XHR1bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIHBpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBoZWlnaHQgKiAwLjU7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllc1xuXHRcdC8vIDEuIGNvbG9yIG1hcFxuXHRcdC8vIDIuIGFscGhhIG1hcFxuXG5cdFx0bGV0IHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cdFx0dW5pZm9ybXMucm90YXRpb24udmFsdWUgPSBtYXRlcmlhbC5yb3RhdGlvbjtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gYWxwaGEgbWFwXG5cblx0XHRsZXQgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIHV2U2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5zcGVjdWxhciApO1xuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzO1xuXHRcdHVuaWZvcm1zLm1ldGFsbmVzcy52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzcztcblxuXHRcdGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGNvbnN0IGVudk1hcCA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLmVudk1hcDtcblxuXHRcdGlmICggZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTsgLy8gYWxzbyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxuXG5cdFx0dW5pZm9ybXMuY2xlYXJjb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0O1xuXHRcdHVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcztcblx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuICkgdW5pZm9ybXMuc2hlZW4udmFsdWUuY29weSggbWF0ZXJpYWwuc2hlZW4gKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXRNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnRyYW5zbWlzc2lvbi52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy50cmFuc21pc3Npb25NYXAudmFsdWUgPSBtYXRlcmlhbC50cmFuc21pc3Npb25NYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc01hdGNhcCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXRjYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hdGNhcC52YWx1ZSA9IG1hdGVyaWFsLm1hdGNhcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGVwdGgoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdFx0dW5pZm9ybXMucmVmZXJlbmNlUG9zaXRpb24udmFsdWUuY29weSggbWF0ZXJpYWwucmVmZXJlbmNlUG9zaXRpb24gKTtcblx0XHR1bmlmb3Jtcy5uZWFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5uZWFyRGlzdGFuY2U7XG5cdFx0dW5pZm9ybXMuZmFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5mYXJEaXN0YW5jZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cmVmcmVzaEZvZ1VuaWZvcm1zOiByZWZyZXNoRm9nVW5pZm9ybXMsXG5cdFx0cmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6IHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzRWxlbWVudCgpIHtcblxuXHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0Y2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRyZXR1cm4gY2FudmFzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0Y29uc3QgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGNyZWF0ZUNhbnZhc0VsZW1lbnQoKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCcsXG5cdFx0X2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBwYXJhbWV0ZXJzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA6IGZhbHNlO1xuXG5cdGxldCBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cdGxldCBjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdC8vIHJlbmRlcigpIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsYmFjayB0cmlnZ2VyZWQgYnkgYW5vdGhlciByZW5kZXIuXG5cdC8vIFdlIHRyYWNrIHRoaXMgc28gdGhhdCB0aGUgbmVzdGVkIHJlbmRlciBjYWxsIGdldHMgaXRzIGxpc3QgYW5kIHN0YXRlIGlzb2xhdGVkIGZyb20gdGhlIHBhcmVudCByZW5kZXIgY2FsbC5cblxuXHRjb25zdCByZW5kZXJMaXN0U3RhY2sgPSBbXTtcblx0Y29uc3QgcmVuZGVyU3RhdGVTdGFjayA9IFtdO1xuXG5cdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG5cblx0dGhpcy5kb21FbGVtZW50ID0gX2NhbnZhcztcblxuXHQvLyBEZWJ1ZyBjb25maWd1cmF0aW9uIGNvbnRhaW5lclxuXHR0aGlzLmRlYnVnID0ge1xuXG5cdFx0LyoqXG5cdFx0ICogRW5hYmxlcyBlcnJvciBjaGVja2luZyBhbmQgcmVwb3J0aW5nIHdoZW4gc2hhZGVyIHByb2dyYW1zIGFyZSBiZWluZyBjb21waWxlZFxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlXG5cdH07XG5cblx0Ly8gY2xlYXJpbmdcblxuXHR0aGlzLmF1dG9DbGVhciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTtcblxuXHQvLyBzY2VuZSBncmFwaFxuXG5cdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xuXG5cdC8vIHVzZXItZGVmaW5lZCBjbGlwcGluZ1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTtcblx0dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZ1xuXG5cdHRoaXMuZ2FtbWFGYWN0b3IgPSAyLjA7XHQvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0dGhpcy5vdXRwdXRFbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdC8vIHBoeXNpY2FsIGxpZ2h0c1xuXG5cdHRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTtcblxuXHQvLyB0b25lIG1hcHBpbmdcblxuXHR0aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXG5cdC8vIGludGVybmFsIHByb3BlcnRpZXNcblxuXHRjb25zdCBfdGhpcyA9IHRoaXM7XG5cblx0bGV0IF9pc0NvbnRleHRMb3N0ID0gZmFsc2U7XG5cblx0Ly8gaW50ZXJuYWwgc3RhdGUgY2FjaGVcblxuXHRsZXQgX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7XG5cdGxldCBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gMDtcblx0bGV0IF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbDtcblx0bGV0IF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblxuXHRsZXQgX2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdGNvbnN0IF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXHRjb25zdCBfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRsZXQgX2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGw7XG5cblx0Ly9cblxuXHRsZXQgX3dpZHRoID0gX2NhbnZhcy53aWR0aDtcblx0bGV0IF9oZWlnaHQgPSBfY2FudmFzLmhlaWdodDtcblxuXHRsZXQgX3BpeGVsUmF0aW8gPSAxO1xuXHRsZXQgX29wYXF1ZVNvcnQgPSBudWxsO1xuXHRsZXQgX3RyYW5zcGFyZW50U29ydCA9IG51bGw7XG5cblx0Y29uc3QgX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApO1xuXHRjb25zdCBfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKTtcblx0bGV0IF9zY2lzc29yVGVzdCA9IGZhbHNlO1xuXG5cdC8vIGZydXN0dW1cblxuXHRjb25zdCBfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XG5cblx0Ly8gY2xpcHBpbmdcblxuXHRsZXQgX2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRsZXQgX2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXG5cblx0Y29uc3QgX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdGNvbnN0IF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRjb25zdCBfZW1wdHlTY2VuZSA9IHsgYmFja2dyb3VuZDogbnVsbCwgZm9nOiBudWxsLCBlbnZpcm9ubWVudDogbnVsbCwgb3ZlcnJpZGVNYXRlcmlhbDogbnVsbCwgaXNTY2VuZTogdHJ1ZSB9O1xuXG5cdGZ1bmN0aW9uIGdldFRhcmdldFBpeGVsUmF0aW8oKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7XG5cblx0fVxuXG5cdC8vIGluaXRpYWxpemVcblxuXHRsZXQgX2dsID0gX2NvbnRleHQ7XG5cblx0ZnVuY3Rpb24gZ2V0Q29udGV4dCggY29udGV4dE5hbWVzLCBjb250ZXh0QXR0cmlidXRlcyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRleHROYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGNvbnRleHROYW1lID0gY29udGV4dE5hbWVzWyBpIF07XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCBjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMgKTtcblx0XHRcdGlmICggY29udGV4dCAhPT0gbnVsbCApIHJldHVybiBjb250ZXh0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG5cdHRyeSB7XG5cblx0XHRjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcblx0XHRcdGFscGhhOiBfYWxwaGEsXG5cdFx0XHRkZXB0aDogX2RlcHRoLFxuXHRcdFx0c3RlbmNpbDogX3N0ZW5jaWwsXG5cdFx0XHRhbnRpYWxpYXM6IF9hbnRpYWxpYXMsXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG5cdFx0XHRwb3dlclByZWZlcmVuY2U6IF9wb3dlclByZWZlcmVuY2UsXG5cdFx0XHRmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBfZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdFxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdGlmICggX2dsID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zdCBjb250ZXh0TmFtZXMgPSBbICd3ZWJnbDInLCAnd2ViZ2wnLCAnZXhwZXJpbWVudGFsLXdlYmdsJyBdO1xuXG5cdFx0XHRpZiAoIF90aGlzLmlzV2ViR0wxUmVuZGVyZXIgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Y29udGV4dE5hbWVzLnNoaWZ0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsID0gZ2V0Q29udGV4dCggY29udGV4dE5hbWVzLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIGdldENvbnRleHQoIGNvbnRleHROYW1lcyApICkge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBleHBlcmltZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdFxuXG5cdFx0aWYgKCBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNpc2lvbic6IDEgfTtcblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIGVycm9yLm1lc3NhZ2UgKTtcblx0XHR0aHJvdyBlcnJvcjtcblxuXHR9XG5cblx0bGV0IGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87XG5cdGxldCBwcm9wZXJ0aWVzLCB0ZXh0dXJlcywgY3ViZW1hcHMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdGxldCBwcm9ncmFtQ2FjaGUsIG1hdGVyaWFscywgcmVuZGVyTGlzdHMsIHJlbmRlclN0YXRlcywgY2xpcHBpbmcsIHNoYWRvd01hcDtcblxuXHRsZXQgYmFja2dyb3VuZCwgbW9ycGh0YXJnZXRzLCBidWZmZXJSZW5kZXJlciwgaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXG5cdGxldCB1dGlscywgYmluZGluZ1N0YXRlcztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXG5cdFx0Y2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTtcblxuXHRcdGV4dGVuc2lvbnMuaW5pdCggY2FwYWJpbGl0aWVzICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXG5cdFx0c3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHRcdHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKTtcblx0XHRjdWJlbWFwcyA9IG5ldyBXZWJHTEN1YmVNYXBzKCBfdGhpcyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wsIGNhcGFiaWxpdGllcyApO1xuXHRcdGJpbmRpbmdTdGF0ZXMgPSBuZXcgV2ViR0xCaW5kaW5nU3RhdGVzKCBfZ2wsIGV4dGVuc2lvbnMsIGF0dHJpYnV0ZXMsIGNhcGFiaWxpdGllcyApO1xuXHRcdGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMgKTtcblx0XHRvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggX2dsLCBnZW9tZXRyaWVzLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0bW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTtcblx0XHRjbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCBwcm9wZXJ0aWVzICk7XG5cdFx0cHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBjdWJlbWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApO1xuXHRcdG1hdGVyaWFscyA9IG5ldyBXZWJHTE1hdGVyaWFscyggcHJvcGVydGllcyApO1xuXHRcdHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoIHByb3BlcnRpZXMgKTtcblx0XHRyZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXHRcdGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgY3ViZW1hcHMsIHN0YXRlLCBvYmplY3RzLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0c2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApO1xuXHRcdGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XG5cblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cdFx0X3RoaXMuc3RhdGUgPSBzdGF0ZTtcblx0XHRfdGhpcy5pbmZvID0gaW5mbztcblxuXHR9XG5cblx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdC8vIHhyXG5cblx0Y29uc3QgeHIgPSBuZXcgV2ViWFJNYW5hZ2VyKCBfdGhpcywgX2dsICk7XG5cblx0dGhpcy54ciA9IHhyO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3BpeGVsUmF0aW87XG5cblx0fTtcblxuXHR0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0X3BpeGVsUmF0aW8gPSB2YWx1ZTtcblxuXHRcdHRoaXMuc2V0U2l6ZSggX3dpZHRoLCBfaGVpZ2h0LCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiAuZ2V0c2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQnICk7XG5cblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggX3dpZHRoLCBfaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0aWYgKCB4ci5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENhblxcJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9jYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCB3aWR0aCAqIF9waXhlbFJhdGlvICk7XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBfcGl4ZWxSYXRpbyApO1xuXG5cdFx0aWYgKCB1cGRhdGVTdHlsZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdF9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiAuZ2V0ZHJhd2luZ0J1ZmZlclNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50JyApO1xuXG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCAqIF9waXhlbFJhdGlvLCBfaGVpZ2h0ICogX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xuXG5cdH07XG5cblx0dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbyApIHtcblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG5cblx0XHRfY2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggd2lkdGggKiBwaXhlbFJhdGlvICk7XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBwaXhlbFJhdGlvICk7XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQnICk7XG5cblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF9jdXJyZW50Vmlld3BvcnQgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggX3ZpZXdwb3J0ICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB4LmlzVmVjdG9yNCApIHtcblxuXHRcdFx0X3ZpZXdwb3J0LnNldCggeC54LCB4LnksIHgueiwgeC53ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggX3NjaXNzb3IgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XG5cblx0XHRcdF9zY2lzc29yLnNldCggeC54LCB4LnksIHgueiwgeC53ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCkgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3NjaXNzb3JUZXN0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XG5cblx0fTtcblxuXHR0aGlzLnNldE9wYXF1ZVNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcblxuXHRcdF9vcGFxdWVTb3J0ID0gbWV0aG9kO1xuXG5cdH07XG5cblx0dGhpcy5zZXRUcmFuc3BhcmVudFNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcblxuXHRcdF90cmFuc3BhcmVudFNvcnQgPSBtZXRob2Q7XG5cblx0fTtcblxuXHQvLyBDbGVhcmluZ1xuXG5cdHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldENsZWFyQ29sb3IoKSBub3cgcmVxdWlyZXMgYSBDb2xvciBhcyBhbiBhcmd1bWVudCcgKTtcblxuXHRcdFx0dGFyZ2V0ID0gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGJhY2tncm91bmQuZ2V0Q2xlYXJDb2xvcigpICk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdGxldCBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gMTYzODQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSAyNTY7XG5cdFx0aWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gMTAyNDtcblxuXHRcdF9nbC5jbGVhciggYml0cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblx0XHRyZW5kZXJTdGF0ZXMuZGlzcG9zZSgpO1xuXHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xuXHRcdGN1YmVtYXBzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblx0XHRiaW5kaW5nU3RhdGVzLmRpc3Bvc2UoKTtcblxuXHRcdHhyLmRpc3Bvc2UoKTtcblxuXHRcdHhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZXNzaW9uc3RhcnQnLCBvblhSU2Vzc2lvblN0YXJ0ICk7XG5cdFx0eHIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xuXG5cdFx0YW5pbWF0aW9uLnN0b3AoKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGNvbnN0IGluZm9BdXRvUmVzZXQgPSBpbmZvLmF1dG9SZXNldDtcblx0XHRjb25zdCBzaGFkb3dNYXBFbmFibGVkID0gc2hhZG93TWFwLmVuYWJsZWQ7XG5cdFx0Y29uc3Qgc2hhZG93TWFwQXV0b1VwZGF0ZSA9IHNoYWRvd01hcC5hdXRvVXBkYXRlO1xuXHRcdGNvbnN0IHNoYWRvd01hcE5lZWRzVXBkYXRlID0gc2hhZG93TWFwLm5lZWRzVXBkYXRlO1xuXHRcdGNvbnN0IHNoYWRvd01hcFR5cGUgPSBzaGFkb3dNYXAudHlwZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHRcdGluZm8uYXV0b1Jlc2V0ID0gaW5mb0F1dG9SZXNldDtcblx0XHRzaGFkb3dNYXAuZW5hYmxlZCA9IHNoYWRvd01hcEVuYWJsZWQ7XG5cdFx0c2hhZG93TWFwLmF1dG9VcGRhdGUgPSBzaGFkb3dNYXBBdXRvVXBkYXRlO1xuXHRcdHNoYWRvd01hcC5uZWVkc1VwZGF0ZSA9IHNoYWRvd01hcE5lZWRzVXBkYXRlO1xuXHRcdHNoYWRvd01hcC50eXBlID0gc2hhZG93TWFwVHlwZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XG5cblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZXMoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlcyggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCBwcm9ncmFtcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW1zO1xuXG5cdFx0aWYgKCBwcm9ncmFtcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtcy5mb3JFYWNoKCBmdW5jdGlvbiAoIHByb2dyYW0gKSB7XG5cblx0XHRcdFx0cHJvZ3JhbUNhY2hlLnJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQnVmZmVyIHJlbmRlcmluZ1xuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICkge1xuXG5cdFx0b2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0gKSB7XG5cblx0XHRiaW5kaW5nU3RhdGVzLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRjb25zdCBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIDM1MDQ4ICk7XG5cblx0XHRcdGJpbmRpbmdTdGF0ZXMuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCA1MTI2LCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXJzLm5vcm1hbCApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3Qubm9ybWFsQXJyYXksIDM1MDQ4ICk7XG5cblx0XHRcdGJpbmRpbmdTdGF0ZXMuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwsIDMsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy51diApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QudXZBcnJheSwgMzUwNDggKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMudXYsIDIsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QuY29sb3JBcnJheSwgMzUwNDggKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nU3RhdGVzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggNCwgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdGlmICggc2NlbmUgPT09IG51bGwgKSBzY2VuZSA9IF9lbXB0eVNjZW5lOyAvLyByZW5kZXJCdWZmZXJEaXJlY3Qgc2Vjb25kIHBhcmFtZXRlciB1c2VkIHRvIGJlIGZvZyAoY291bGQgYmUgbnVsbClcblxuXHRcdGNvbnN0IGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdC8vXG5cblx0XHRsZXQgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uLmNvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0fSBlbHNlIGlmICggaW5kZXguY291bnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRsZXQgcmFuZ2VGYWN0b3IgPSAxO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdGluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cdFx0XHRyYW5nZUZhY3RvciA9IDI7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyB8fCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1vcnBodGFyZ2V0cy51cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nU3RhdGVzLnNldHVwKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdGxldCBhdHRyaWJ1dGU7XG5cdFx0bGV0IHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y29uc3QgZGF0YUNvdW50ID0gKCBpbmRleCAhPT0gbnVsbCApID8gaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudDtcblxuXHRcdGNvbnN0IHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHRjb25zdCByYW5nZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7XG5cblx0XHRjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHRjb25zdCBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHRjb25zdCBkcmF3U3RhcnQgPSBNYXRoLm1heCggcmFuZ2VTdGFydCwgZ3JvdXBTdGFydCApO1xuXHRcdGNvbnN0IGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHRjb25zdCBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0bGV0IGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsXG5cblx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDEgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCApIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBkcmF3U3RhcnQsIGRyYXdDb3VudCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBpbnN0YW5jZUNvdW50ID0gTWF0aC5taW4oIGdlb21ldHJ5Lmluc3RhbmNlQ291bnQsIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ICk7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZHJhd1N0YXJ0LCBkcmF3Q291bnQsIGluc3RhbmNlQ291bnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIENvbXBpbGVcblxuXHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWF0ZXJpYWwubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbDIgPSBtYXRlcmlhbFsgaSBdO1xuXG5cdFx0XHRcdFx0XHRnZXRQcm9ncmFtKCBtYXRlcmlhbDIsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2V0UHJvZ3JhbSggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHR9O1xuXG5cdC8vIEFuaW1hdGlvbiBMb29wXG5cblx0bGV0IG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayA9IG51bGw7XG5cblx0ZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSggdGltZSApIHtcblxuXHRcdGlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uWFJTZXNzaW9uU3RhcnQoKSB7XG5cblx0XHRhbmltYXRpb24uc3RvcCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblhSU2Vzc2lvbkVuZCgpIHtcblxuXHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdH1cblxuXHRjb25zdCBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb24oKTtcblx0YW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHRpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkgYW5pbWF0aW9uLnNldENvbnRleHQoIHdpbmRvdyApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblx0XHR4ci5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdFx0KCBjYWxsYmFjayA9PT0gbnVsbCApID8gYW5pbWF0aW9uLnN0b3AoKSA6IGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdH07XG5cblx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25zdGFydCcsIG9uWFJTZXNzaW9uU3RhcnQgKTtcblx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xuXG5cdC8vIFJlbmRlcmluZ1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0bGV0IHJlbmRlclRhcmdldCwgZm9yY2VDbGVhcjtcblxuXHRcdGlmICggYXJndW1lbnRzWyAyIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIHJlbmRlclRhcmdldCBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGluc3RlYWQuJyApO1xuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gYXJndW1lbnRzWyAyIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50c1sgMyBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdGZvcmNlQ2xlYXIgPSBhcmd1bWVudHNbIDMgXTtcblxuXHRcdH1cblxuXHRcdGlmICggY2FtZXJhICE9PSB1bmRlZmluZWQgJiYgY2FtZXJhLmlzQ2FtZXJhICE9PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggX2lzQ29udGV4dExvc3QgPT09IHRydWUgKSByZXR1cm47XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGlmICggeHIuZW5hYmxlZCA9PT0gdHJ1ZSAmJiB4ci5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHhyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXHRcdGlmICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApIHNjZW5lLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0IHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgcmVuZGVyU3RhdGVTdGFjay5sZW5ndGggKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0cmVuZGVyU3RhdGVTdGFjay5wdXNoKCBjdXJyZW50UmVuZGVyU3RhdGUgKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0X2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSB0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBjbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCByZW5kZXJMaXN0U3RhY2subGVuZ3RoICk7XG5cdFx0Y3VycmVudFJlbmRlckxpc3QuaW5pdCgpO1xuXG5cdFx0cmVuZGVyTGlzdFN0YWNrLnB1c2goIGN1cnJlbnRSZW5kZXJMaXN0ICk7XG5cblx0XHRwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCAwLCBfdGhpcy5zb3J0T2JqZWN0cyApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QuZmluaXNoKCk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCBfb3BhcXVlU29ydCwgX3RyYW5zcGFyZW50U29ydCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0Y29uc3Qgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHNoYWRvd01hcC5yZW5kZXIoIHNoYWRvd3NBcnJheSwgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzVmlldyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSBjbGlwcGluZy5lbmRTaGFkb3dzKCk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmluZm8uYXV0b1Jlc2V0ID09PSB0cnVlICkgdGhpcy5pbmZvLnJlc2V0KCk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0YmFja2dyb3VuZC5yZW5kZXIoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICk7XG5cblx0XHQvLyByZW5kZXIgc2NlbmVcblxuXHRcdGNvbnN0IG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0Y29uc3QgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XG5cblx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoID4gMCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggPiAwICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmdcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0XHQvLyByZXNvbHZlIG11bHRpc2FtcGxlIHJlbmRlcmJ1ZmZlcnMgdG8gYSBzaW5nbGUtc2FtcGxlIHRleHR1cmUgaWYgbmVjZXNzYXJ5XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApIHNjZW5lLm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxuXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApO1xuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0YmluZGluZ1N0YXRlcy5yZXNldERlZmF1bHRTdGF0ZSgpO1xuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XG5cblx0XHRyZW5kZXJTdGF0ZVN0YWNrLnBvcCgpO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZVN0YWNrLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlU3RhY2tbIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoIC0gMSBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJlbmRlckxpc3RTdGFjay5wb3AoKTtcblxuXHRcdGlmICggcmVuZGVyTGlzdFN0YWNrLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdFN0YWNrWyByZW5kZXJMaXN0U3RhY2subGVuZ3RoIC0gMSBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIGdyb3VwT3JkZXIsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjb25zdCB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzR3JvdXAgKSB7XG5cblx0XHRcdFx0Z3JvdXBPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTE9EICkge1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmF1dG9VcGRhdGUgPT09IHRydWUgKSBvYmplY3QudXBkYXRlKCBjYW1lcmEgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmplY3QubWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xuXG5cdFx0XHRcdFx0Ly8gdXBkYXRlIHNrZWxldG9uIG9ubHkgb25jZSBpbiBhIGZyYW1lXG5cblx0XHRcdFx0XHRpZiAoIG9iamVjdC5za2VsZXRvbi5mcmFtZSAhPT0gaW5mby5yZW5kZXIuZnJhbWUgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi5mcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgZ3JvdXBPcmRlciwgc29ydE9iamVjdHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5pc1NjZW5lID09PSB0cnVlID8gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA6IG51bGw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0O1xuXHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSBudWxsID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHRjb25zdCBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XG5cblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTtcblxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEyLmxheWVycyApICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBjYW1lcmEyLnZpZXdwb3J0ICkgKTtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzVmlldyggY2FtZXJhMiApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRjb25zdCBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZSwgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5yZXNldCgpO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApIHtcblxuXHRcdGlmICggc2NlbmUuaXNTY2VuZSAhPT0gdHJ1ZSApIHNjZW5lID0gX2VtcHR5U2NlbmU7IC8vIHNjZW5lIGNvdWxkIGJlIGEgTWVzaCwgTGluZSwgUG9pbnRzLCAuLi5cblxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0Y29uc3QgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblx0XHRjb25zdCBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xuXG5cdFx0Y29uc3QgbGlnaHRzU3RhdGVWZXJzaW9uID0gbGlnaHRzLnN0YXRlLnZlcnNpb247XG5cblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgc2NlbmUsIG9iamVjdCApO1xuXHRcdGNvbnN0IHByb2dyYW1DYWNoZUtleSA9IHByb2dyYW1DYWNoZS5nZXRQcm9ncmFtQ2FjaGVLZXkoIHBhcmFtZXRlcnMgKTtcblxuXHRcdGxldCBwcm9ncmFtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtcztcblxuXHRcdC8vIGFsd2F5cyB1cGRhdGUgZW52aXJvbm1lbnQgYW5kIGZvZyAtIGNoYW5naW5nIHRoZXNlIHRyaWdnZXIgYW4gZ2V0UHJvZ3JhbSBjYWxsLCBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBwcm9ncmFtIGRvZXNuJ3QgY2hhbmdlXG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBzY2VuZS5mb2c7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCA9IGN1YmVtYXBzLmdldCggbWF0ZXJpYWwuZW52TWFwIHx8IG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCApO1xuXG5cdFx0aWYgKCBwcm9ncmFtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblxuXHRcdFx0bWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0XHRwcm9ncmFtcyA9IG5ldyBNYXAoKTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtcyA9IHByb2dyYW1zO1xuXG5cdFx0fVxuXG5cdFx0bGV0IHByb2dyYW0gPSBwcm9ncmFtcy5nZXQoIHByb2dyYW1DYWNoZUtleSApO1xuXG5cdFx0aWYgKCBwcm9ncmFtICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGVhcmx5IG91dCBpZiBwcm9ncmFtIGFuZCBsaWdodCBzdGF0ZSBpcyBpZGVudGljYWxcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0gPT09IHByb2dyYW0gJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9PT0gbGlnaHRzU3RhdGVWZXJzaW9uICkge1xuXG5cdFx0XHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdFx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cGFyYW1ldGVycy51bmlmb3JtcyA9IHByb2dyYW1DYWNoZS5nZXRVbmlmb3JtcyggbWF0ZXJpYWwgKTtcblxuXHRcdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBwYXJhbWV0ZXJzLCBfdGhpcyApO1xuXG5cdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBwYXJhbWV0ZXJzLCBwcm9ncmFtQ2FjaGVLZXkgKTtcblx0XHRcdHByb2dyYW1zLnNldCggcHJvZ3JhbUNhY2hlS2V5LCBwcm9ncmFtICk7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcyA9IHBhcmFtZXRlcnMudW5pZm9ybXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcblxuXHRcdGlmICggKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkgfHwgbWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gY2xpcHBpbmcudW5pZm9ybTtcblxuXHRcdH1cblxuXHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyA9IG1hdGVyaWFsTmVlZHNMaWdodHMoIG1hdGVyaWFsICk7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUudmFsdWUgPSBsaWdodHMuc3RhdGUucHJvYmU7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzE7XG5cdFx0XHR1bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzI7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pO1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDtcblx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcblxuXHRcdH1cblxuXHRcdGNvbnN0IHByb2dVbmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKTtcblx0XHRjb25zdCB1bmlmb3Jtc0xpc3QgPSBXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTtcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVDb21tb25NYXRlcmlhbFByb3BlcnRpZXMoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMub3V0cHV0RW5jb2RpbmcgPSBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID0gcGFyYW1ldGVycy5pbnN0YW5jaW5nO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXM7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbjtcblx0XHRtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzID0gcGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIHNjZW5lLmlzU2NlbmUgIT09IHRydWUgKSBzY2VuZSA9IF9lbXB0eVNjZW5lOyAvLyBzY2VuZSBjb3VsZCBiZSBhIE1lc2gsIExpbmUsIFBvaW50cywgLi4uXG5cblx0XHR0ZXh0dXJlcy5yZXNldFRleHR1cmVVbml0cygpO1xuXG5cdFx0Y29uc3QgZm9nID0gc2NlbmUuZm9nO1xuXHRcdGNvbnN0IGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcblx0XHRjb25zdCBlbmNvZGluZyA9ICggX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgKSA/IF90aGlzLm91dHB1dEVuY29kaW5nIDogX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS5lbmNvZGluZztcblx0XHRjb25zdCBlbnZNYXAgPSBjdWJlbWFwcy5nZXQoIG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudCApO1xuXHRcdGNvbnN0IHZlcnRleEFscGhhcyA9IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNDtcblxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXHRcdGNvbnN0IGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkID09PSB0cnVlIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0Y29uc3QgdXNlQ2FjaGUgPVxuXHRcdFx0XHRcdGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiZcblx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xuXG5cdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXG5cdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXG5cdFx0XHRcdC8vICgjODQ2NSwgIzgzNzkpXG5cdFx0XHRcdGNsaXBwaW5nLnNldFN0YXRlKCBtYXRlcmlhbCwgY2FtZXJhLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0bGV0IG5lZWRzUHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC52ZXJzaW9uID09PSBtYXRlcmlhbFByb3BlcnRpZXMuX192ZXJzaW9uICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyAmJiAoIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNTdGF0ZVZlcnNpb24gIT09IGxpZ2h0cy5zdGF0ZS52ZXJzaW9uICkgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dEVuY29kaW5nICE9PSBlbmNvZGluZyApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAhIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCAhPT0gZW52TWFwICkge1xuXG5cdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMuZm9nICE9PSBmb2cgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IGNsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBjbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzICE9PSB2ZXJ0ZXhBbHBoYXMgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3ZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGxldCBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtO1xuXG5cdFx0aWYgKCBuZWVkc1Byb2dyYW1DaGFuZ2UgPT09IHRydWUgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0bGV0IHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdGxldCByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHRjb25zdCBwX3VuaWZvcm1zID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0bV91bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IF9jdXJyZW50Q2FtZXJhICE9PSBjYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSBjYW1lcmEgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdFx0Y29uc3QgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdpc09ydGhvZ3JhcGhpYycsIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9PT0gdHJ1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gb3RoZXJ3aXNlIHRleHR1cmVzIHVzZWQgZm9yIHNraW5uaW5nIGNhbiB0YWtlIG92ZXIgdGV4dHVyZSB1bml0cyByZXNlcnZlZCBmb3Igb3RoZXIgbWF0ZXJpYWwgdGV4dHVyZXNcblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdGNvbnN0IHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXG5cdFx0XHRpZiAoIHNrZWxldG9uICkge1xuXG5cdFx0XHRcdGNvbnN0IGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcblx0XHRcdFx0XHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcblx0XHRcdFx0XHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcblx0XHRcdFx0XHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXG5cblxuXHRcdFx0XHRcdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIGJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGhVdGlscy5jZWlsUG93ZXJPZlR3byggc2l6ZSApO1xuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxuXHRcdFx0XHRcdFx0Ym9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXNcblxuXHRcdFx0XHRcdFx0Y29uc3QgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSwgdGV4dHVyZXMgKTtcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaE1hdGVyaWFsIHx8IG1hdGVyaWFsUHJvcGVydGllcy5yZWNlaXZlU2hhZG93ICE9PSBvYmplY3QucmVjZWl2ZVNoYWRvdyApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgPSBvYmplY3QucmVjZWl2ZVNoYWRvdztcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3JlY2VpdmVTaGFkb3cnLCBvYmplY3QucmVjZWl2ZVNoYWRvdyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICkge1xuXG5cdFx0XHRcdC8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm9cblxuXHRcdFx0XHQvLyBub3RlOiBhbGwgbGlnaHRpbmcgdW5pZm9ybXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5XG5cdFx0XHRcdC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXJcblx0XHRcdFx0Ly8gdmFsdWVzXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXRcblx0XHRcdFx0Ly8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWRcblxuXHRcdFx0XHRtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlZnJlc2ggdW5pZm9ybXMgY29tbW9uIHRvIHNldmVyYWwgbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHMucmVmcmVzaEZvZ1VuaWZvcm1zKCBtX3VuaWZvcm1zLCBmb2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbHMucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsLCBfcGl4ZWxSYXRpbywgX2hlaWdodCApO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgdGV4dHVyZXMgKTtcblx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1Nwcml0ZU1hdGVyaWFsICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdjZW50ZXInLCBvYmplY3QuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXG5cblx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcblxuXHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBtYXRlcmlhbE5lZWRzTGlnaHRzKCBtYXRlcmlhbCApIHtcblxuXHRcdHJldHVybiBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCB8fFxuXHRcdFx0KCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLmxpZ2h0cyA9PT0gdHJ1ZSApO1xuXG5cdH1cblxuXHR0aGlzLmdldEFjdGl2ZUN1YmVGYWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlQ3ViZUZhY2U7XG5cblx0fTtcblxuXHR0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWw7XG5cblx0fTtcblxuXHR0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlID0gMCwgYWN0aXZlTWlwbWFwTGV2ZWwgPSAwICkge1xuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XG5cdFx0X2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IGFjdGl2ZUN1YmVGYWNlO1xuXHRcdF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSBhY3RpdmVNaXBtYXBMZXZlbDtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICYmIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZXMuc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IGZyYW1lYnVmZmVyID0gbnVsbDtcblx0XHRsZXQgaXNDdWJlID0gZmFsc2U7XG5cdFx0bGV0IGlzUmVuZGVyVGFyZ2V0M0QgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cblx0XHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlM0QgfHwgdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHtcblxuXHRcdFx0XHRpc1JlbmRlclRhcmdldDNEID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2UgXTtcblx0XHRcdFx0aXNDdWJlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQudmlld3BvcnQgKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJnZXQuc2Npc3NvciApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IHJlbmRlclRhcmdldC5zY2lzc29yVGVzdDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzYwNjQsIDM0MDY5ICsgYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xuXG5cdFx0fSBlbHNlIGlmICggaXNSZW5kZXJUYXJnZXQzRCApIHtcblxuXHRcdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdGNvbnN0IGxheWVyID0gYWN0aXZlQ3ViZUZhY2UgfHwgMDtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggMzYxNjAsIDM2MDY0LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwgfHwgMCwgbGF5ZXIgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIsIGFjdGl2ZUN1YmVGYWNlSW5kZXggKSB7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRsZXQgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgJiYgYWN0aXZlQ3ViZUZhY2VJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZUluZGV4IF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHRcdFx0Y29uc3QgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHRjb25zdCB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCAzNTczOSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGhhbGZGbG9hdFN1cHBvcnRlZEJ5RXh0ID0gKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSApICYmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgfHwgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgJiYgZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIDM1NzM4ICkgJiYgLy8gRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISBoYWxmRmxvYXRTdXBwb3J0ZWRCeUV4dCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyggMzYxNjAgKSA9PT0gMzYwNTMgKSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpXG5cblx0XHRcdFx0XHRpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkge1xuXG5cdFx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGZpbmFsbHkge1xuXG5cdFx0XHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIgb2YgY3VycmVudCByZW5kZXIgdGFyZ2V0IGlmIG5lY2Vzc2FyeVxuXG5cdFx0XHRcdGNvbnN0IGZyYW1lYnVmZmVyID0gKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApID8gcHJvcGVydGllcy5nZXQoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDtcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCB0ZXh0dXJlLCBsZXZlbCA9IDAgKSB7XG5cblx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gbGV2ZWwgKTtcblx0XHRjb25zdCB3aWR0aCA9IE1hdGguZmxvb3IoIHRleHR1cmUuaW1hZ2Uud2lkdGggKiBsZXZlbFNjYWxlICk7XG5cdFx0Y29uc3QgaGVpZ2h0ID0gTWF0aC5mbG9vciggdGV4dHVyZS5pbWFnZS5oZWlnaHQgKiBsZXZlbFNjYWxlICk7XG5cdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wuY29weVRleEltYWdlMkQoIDM1NTMsIGxldmVsLCBnbEZvcm1hdCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGhlaWdodCwgMCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZSA9IGZ1bmN0aW9uICggcG9zaXRpb24sIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIGxldmVsID0gMCApIHtcblxuXHRcdGNvbnN0IHdpZHRoID0gc3JjVGV4dHVyZS5pbWFnZS53aWR0aDtcblx0XHRjb25zdCBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHRjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUuZm9ybWF0ICk7XG5cdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS50eXBlICk7XG5cblx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIGRzdFRleHR1cmUsIDAgKTtcblxuXHRcdC8vIEFzIGFub3RoZXIgdGV4dHVyZSB1cGxvYWQgbWF5IGhhdmUgY2hhbmdlZCBwaXhlbFN0b3JlaVxuXHRcdC8vIHBhcmFtZXRlcnMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBjb3JyZWN0IGZvciB0aGUgZHN0VGV4dHVyZVxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDAsIGRzdFRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQxLCBkc3RUZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTcsIGRzdFRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlLmRhdGEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRcdF9nbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggMzU1MywgbGV2ZWwsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHNyY1RleHR1cmUubWlwbWFwc1sgMCBdLndpZHRoLCBzcmNUZXh0dXJlLm1pcG1hcHNbIDAgXS5oZWlnaHQsIGdsRm9ybWF0LCBzcmNUZXh0dXJlLm1pcG1hcHNbIDAgXS5kYXRhICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcHMgb25seSB3aGVuIGNvcHlpbmcgbGV2ZWwgMFxuXHRcdGlmICggbGV2ZWwgPT09IDAgJiYgZHN0VGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIDM1NTMgKTtcblxuXHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcblxuXHR9O1xuXG5cdHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUzRCA9IGZ1bmN0aW9uICggc291cmNlQm94LCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgPSAwICkge1xuXG5cdFx0aWYgKCBfdGhpcy5pc1dlYkdMMVJlbmRlcmVyICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhIH0gPSBzcmNUZXh0dXJlLmltYWdlO1xuXHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS5mb3JtYXQgKTtcblx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHRsZXQgZ2xUYXJnZXQ7XG5cblx0XHRpZiAoIGRzdFRleHR1cmUuaXNEYXRhVGV4dHVyZTNEICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoIGRzdFRleHR1cmUsIDAgKTtcblx0XHRcdGdsVGFyZ2V0ID0gMzI4Nzk7XG5cblx0XHR9IGVsc2UgaWYgKCBkc3RUZXh0dXJlLmlzRGF0YVRleHR1cmUyREFycmF5ICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggZHN0VGV4dHVyZSwgMCApO1xuXHRcdFx0Z2xUYXJnZXQgPSAzNTg2NjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogb25seSBzdXBwb3J0cyBUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MCwgZHN0VGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDEsIGRzdFRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNywgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdGNvbnN0IHVucGFja1Jvd0xlbiA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTQgKTtcblx0XHRjb25zdCB1bnBhY2tJbWFnZUhlaWdodCA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMyODc4ICk7XG5cdFx0Y29uc3QgdW5wYWNrU2tpcFBpeGVscyA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTYgKTtcblx0XHRjb25zdCB1bnBhY2tTa2lwUm93cyA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTUgKTtcblx0XHRjb25zdCB1bnBhY2tTa2lwSW1hZ2VzID0gX2dsLmdldFBhcmFtZXRlciggMzI4NzcgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNCwgd2lkdGggKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc4LCBoZWlnaHQgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTYsIHNvdXJjZUJveC5taW4ueCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNSwgc291cmNlQm94Lm1pbi55ICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMjg3Nywgc291cmNlQm94Lm1pbi56ICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UzRChcblx0XHRcdGdsVGFyZ2V0LFxuXHRcdFx0bGV2ZWwsXG5cdFx0XHRwb3NpdGlvbi54LFxuXHRcdFx0cG9zaXRpb24ueSxcblx0XHRcdHBvc2l0aW9uLnosXG5cdFx0XHRzb3VyY2VCb3gubWF4LnggLSBzb3VyY2VCb3gubWluLnggKyAxLFxuXHRcdFx0c291cmNlQm94Lm1heC55IC0gc291cmNlQm94Lm1pbi55ICsgMSxcblx0XHRcdHNvdXJjZUJveC5tYXgueiAtIHNvdXJjZUJveC5taW4ueiArIDEsXG5cdFx0XHRnbEZvcm1hdCxcblx0XHRcdGdsVHlwZSxcblx0XHRcdGRhdGFcblx0XHQpO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMzE0LCB1bnBhY2tSb3dMZW4gKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc4LCB1bnBhY2tJbWFnZUhlaWdodCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNiwgdW5wYWNrU2tpcFBpeGVscyApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNSwgdW5wYWNrU2tpcFJvd3MgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc3LCB1bnBhY2tTa2lwSW1hZ2VzICk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtaXBtYXBzIG9ubHkgd2hlbiBjb3B5aW5nIGxldmVsIDBcblx0XHRpZiAoIGxldmVsID09PSAwICYmIGRzdFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBnbFRhcmdldCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5pbml0VGV4dHVyZSA9IGZ1bmN0aW9uICggdGV4dHVyZSApIHtcblxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5yZXNldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0X2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0X2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsO1xuXG5cdFx0c3RhdGUucmVzZXQoKTtcblx0XHRiaW5kaW5nU3RhdGVzLnJlc2V0KCk7XG5cblx0fTtcblxuXHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0X19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ29ic2VydmUnLCB7IGRldGFpbDogdGhpcyB9ICkgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cdH1cblxufVxuXG5jbGFzcyBXZWJHTDFSZW5kZXJlciBleHRlbmRzIFdlYkdMUmVuZGVyZXIge31cblxuV2ViR0wxUmVuZGVyZXIucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXIgPSB0cnVlO1xuXG5jbGFzcyBGb2dFeHAyIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGRlbnNpdHkgPSAwLjAwMDI1ICkge1xuXG5cdFx0dGhpcy5uYW1lID0gJyc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHRcdHRoaXMuZGVuc2l0eSA9IGRlbnNpdHk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLCB0aGlzLmRlbnNpdHkgKTtcblxuXHR9XG5cblx0dG9KU09OKCAvKiBtZXRhICovICkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6ICdGb2dFeHAyJyxcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XG5cdFx0fTtcblxuXHR9XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuY2xhc3MgRm9nIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIG5lYXIgPSAxLCBmYXIgPSAxMDAwICkge1xuXG5cdFx0dGhpcy5uYW1lID0gJyc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcblx0XHR0aGlzLmZhciA9IGZhcjtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvciwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG5cdH1cblxuXHR0b0pTT04oIC8qIG1ldGEgKi8gKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogJ0ZvZycsXG5cdFx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRcdG5lYXI6IHRoaXMubmVhcixcblx0XHRcdGZhcjogdGhpcy5mYXJcblx0XHR9O1xuXG5cdH1cblxufVxuXG5Gb2cucHJvdG90eXBlLmlzRm9nID0gdHJ1ZTtcblxuY2xhc3MgU2NlbmUgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHRcdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdFx0dGhpcy5lbnZpcm9ubWVudCA9IG51bGw7XG5cdFx0dGhpcy5mb2cgPSBudWxsO1xuXG5cdFx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyXG5cblx0XHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblx0XHR9XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmVudmlyb25tZW50ICE9PSBudWxsICkgdGhpcy5lbnZpcm9ubWVudCA9IHNvdXJjZS5lbnZpcm9ubWVudC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xuXG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICk7XG5cdFx0aWYgKCB0aGlzLmVudmlyb25tZW50ICE9PSBudWxsICkgZGF0YS5vYmplY3QuZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50LnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufVxuXG5TY2VuZS5wcm90b3R5cGUuaXNTY2VuZSA9IHRydWU7XG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkge1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5zdHJpZGUgPSBzdHJpZGU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDtcblxuXHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG5cdHRoaXMudXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0b25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VXNhZ2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggZGF0YSApIHtcblxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnMgPSB7fTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID0gdGhpcy5hcnJheS5zbGljZSggMCApLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGFycmF5ID0gbmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdICk7XG5cblx0XHRjb25zdCBpYiA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHRoaXMuc3RyaWRlICk7XG5cdFx0aWIuc2V0VXNhZ2UoIHRoaXMudXNhZ2UgKTtcblxuXHRcdHJldHVybiBpYjtcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVycyA9IHt9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgVVVJRCBmb3IgYXJyYXkgYnVmZmVyIGlmIG5lY2Vzc2FyeVxuXG5cdFx0aWYgKCB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggbmV3IFVpbnQzMkFycmF5KCB0aGlzLmFycmF5LmJ1ZmZlciApICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcblx0XHRcdGJ1ZmZlcjogdGhpcy5hcnJheS5idWZmZXIuX3V1aWQsXG5cdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRzdHJpZGU6IHRoaXMuc3RyaWRlXG5cdFx0fTtcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX3ZlY3RvciQ2ID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGNvdW50OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFycmF5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG5lZWRzVXBkYXRlOiB7XG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuZGF0YS5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5kYXRhLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYuYXBwbHlNYXRyaXg0KCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDYueCwgX3ZlY3RvciQ2LnksIF92ZWN0b3IkNi56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYuYXBwbHlOb3JtYWxNYXRyaXgoIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkNi54LCBfdmVjdG9yJDYueSwgX3ZlY3RvciQ2LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYudHJhbnNmb3JtRGlyZWN0aW9uKCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDYueCwgX3ZlY3RvciQ2LnksIF92ZWN0b3IkNi56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5jbG9uZSgpOiBDbG9uaW5nIGFuIGludGVybGF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4nICk7XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbVNpemU7IGogKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheS5wdXNoKCB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgaiBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3RvciggYXJyYXkgKSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPSB0aGlzLmRhdGEuY2xvbmUoIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMubm9ybWFsaXplZCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLicgKTtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdGhpcy5pdGVtU2l6ZTsgaiArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5LnB1c2goIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyBqIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVpbnRlcmxlYXZlIGRhdGEgYW5kIHNhdmUgaXQgYXMgYW4gb3JkaW5hcnkgYnVmZmVyIGF0dHJpYnV0ZSBmb3Igbm93XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxuXHRcdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gc2F2ZSBhcyB0cnVlIGludGVybGF2ZWQgYXR0cmlidHVlXG5cblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVycyA9IHt9O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9IHRoaXMuZGF0YS50b0pTT04oIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXHRcdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcblx0XHRcdFx0ZGF0YTogdGhpcy5kYXRhLnV1aWQsXG5cdFx0XHRcdG9mZnNldDogdGhpcy5vZmZzZXQsXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgcm90YXRpb246IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBTcHJpdGVNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcblxubGV0IF9nZW9tZXRyeTtcblxuY29uc3QgX2ludGVyc2VjdFBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3dvcmxkU2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbXZQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX2FsaWduZWRQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcbmNvbnN0IF9yb3RhdGVkUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdmlld1dvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuXG5jb25zdCBfdkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdkIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdkMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF91dkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdXZCID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xuY29uc3QgX3V2QyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcblxuY2xhc3MgU3ByaXRlIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCBtYXRlcmlhbCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlJztcblxuXHRcdGlmICggX2dlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0XHRjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHRcdC0gMC41LCAtIDAuNSwgMCwgMCwgMCxcblx0XHRcdFx0MC41LCAtIDAuNSwgMCwgMSwgMCxcblx0XHRcdFx0MC41LCAwLjUsIDAsIDEsIDEsXG5cdFx0XHRcdC0gMC41LCAwLjUsIDAsIDAsIDFcblx0XHRcdF0gKTtcblxuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGZsb2F0MzJBcnJheSwgNSApO1xuXG5cdFx0XHRfZ2VvbWV0cnkuc2V0SW5kZXgoIFsgMCwgMSwgMixcdDAsIDIsIDMgXSApO1xuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMywgMCwgZmFsc2UgKSApO1xuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMiwgMywgZmFsc2UgKSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTtcblx0XHR0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xuXG5cdFx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMC41LCAwLjUgKTtcblxuXHR9XG5cblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3ByaXRlOiBcIlJheWNhc3Rlci5jYW1lcmFcIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyApO1xuXG5cdFx0fVxuXG5cdFx0X3dvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRfdmlld1dvcmxkTWF0cml4LmNvcHkoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHR0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCByYXljYXN0ZXIuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0X212UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1vZGVsVmlld01hdHJpeCApO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgJiYgdGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPT09IGZhbHNlICkge1xuXG5cdFx0XHRfd29ybGRTY2FsZS5tdWx0aXBseVNjYWxhciggLSBfbXZQb3NpdGlvbi56ICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCByb3RhdGlvbiA9IHRoaXMubWF0ZXJpYWwucm90YXRpb247XG5cdFx0bGV0IHNpbiwgY29zO1xuXG5cdFx0aWYgKCByb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdFx0Y29zID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XG5cdFx0XHRzaW4gPSBNYXRoLnNpbiggcm90YXRpb24gKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkEuc2V0KCAtIDAuNSwgLSAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkIuc2V0KCAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZDLnNldCggMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cblx0XHRfdXZBLnNldCggMCwgMCApO1xuXHRcdF91dkIuc2V0KCAxLCAwICk7XG5cdFx0X3V2Qy5zZXQoIDEsIDEgKTtcblxuXHRcdC8vIGNoZWNrIGZpcnN0IHRyaWFuZ2xlXG5cdFx0bGV0IGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZCLCBfdkMsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBzZWNvbmQgdHJpYW5nbGVcblx0XHRcdHRyYW5zZm9ybVZlcnRleCggX3ZCLnNldCggLSAwLjUsIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcblx0XHRcdF91dkIuc2V0KCAwLCAxICk7XG5cblx0XHRcdGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZDLCBfdkIsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0cG9pbnQ6IF9pbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0dXY6IFRyaWFuZ2xlLmdldFVWKCBfaW50ZXJzZWN0UG9pbnQsIF92QSwgX3ZCLCBfdkMsIF91dkEsIF91dkIsIF91dkMsIG5ldyBWZWN0b3IyKCkgKSxcblx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU3ByaXRlLnByb3RvdHlwZS5pc1Nwcml0ZSA9IHRydWU7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVZlcnRleCggdmVydGV4UG9zaXRpb24sIG12UG9zaXRpb24sIGNlbnRlciwgc2NhbGUsIHNpbiwgY29zICkge1xuXG5cdC8vIGNvbXB1dGUgcG9zaXRpb24gaW4gY2FtZXJhIHNwYWNlXG5cdF9hbGlnbmVkUG9zaXRpb24uc3ViVmVjdG9ycyggdmVydGV4UG9zaXRpb24sIGNlbnRlciApLmFkZFNjYWxhciggMC41ICkubXVsdGlwbHkoIHNjYWxlICk7XG5cblx0Ly8gdG8gY2hlY2sgaWYgcm90YXRpb24gaXMgbm90IHplcm9cblx0aWYgKCBzaW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdF9yb3RhdGVkUG9zaXRpb24ueCA9ICggY29zICogX2FsaWduZWRQb3NpdGlvbi54ICkgLSAoIHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xuXHRcdF9yb3RhdGVkUG9zaXRpb24ueSA9ICggc2luICogX2FsaWduZWRQb3NpdGlvbi54ICkgKyAoIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRfcm90YXRlZFBvc2l0aW9uLmNvcHkoIF9hbGlnbmVkUG9zaXRpb24gKTtcblxuXHR9XG5cblxuXHR2ZXJ0ZXhQb3NpdGlvbi5jb3B5KCBtdlBvc2l0aW9uICk7XG5cdHZlcnRleFBvc2l0aW9uLnggKz0gX3JvdGF0ZWRQb3NpdGlvbi54O1xuXHR2ZXJ0ZXhQb3NpdGlvbi55ICs9IF9yb3RhdGVkUG9zaXRpb24ueTtcblxuXHQvLyB0cmFuc2Zvcm0gdG8gd29ybGQgc3BhY2Vcblx0dmVydGV4UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfdmlld1dvcmxkTWF0cml4ICk7XG5cbn1cblxuY29uc3QgX3YxJDIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjIkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgTE9EIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX2N1cnJlbnRMZXZlbCA9IDA7XG5cblx0XHR0aGlzLnR5cGUgPSAnTE9EJztcblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0XHRsZXZlbHM6IHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IFtdXG5cdFx0XHR9LFxuXHRcdFx0aXNMT0Q6IHtcblx0XHRcdFx0dmFsdWU6IHRydWUsXG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCBmYWxzZSApO1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gc291cmNlLmxldmVscztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZExldmVsKCBvYmplY3QsIGRpc3RhbmNlID0gMCApIHtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGxldCBsO1xuXG5cdFx0Zm9yICggbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q3VycmVudExldmVsKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbDtcblxuXHR9XG5cblx0Z2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkge1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRsZXQgaSwgbDtcblxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRfdjEkMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfdjEkMiApO1xuXG5cdFx0XHR0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0X3YxJDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdF92MiQxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IF92MSQyLmRpc3RhbmNlVG8oIF92MiQxICkgLyBjYW1lcmEuem9vbTtcblxuXHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRsZXQgaSwgbDtcblxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY3VycmVudExldmVsID0gaSAtIDE7XG5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBkYXRhLm9iamVjdC5hdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHRkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTtcblxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9iYXNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfc2tpbkluZGV4ID0gbmV3IFZlY3RvcjQoKTtcbmNvbnN0IF9za2luV2VpZ2h0ID0gbmV3IFZlY3RvcjQoKTtcblxuY29uc3QgX3ZlY3RvciQ1ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJztcblxuXHR0aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJztcblx0dGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuU2tpbm5lZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCxcblxuXHRpc1NraW5uZWRNZXNoOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuYmluZE1vZGUgPSBzb3VyY2UuYmluZE1vZGU7XG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIHNvdXJjZS5iaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UuYmluZE1hdHJpeEludmVyc2UgKTtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBzb3VyY2Uuc2tlbGV0b247XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICggc2tlbGV0b24sIGJpbmRNYXRyaXggKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uID0gc2tlbGV0b247XG5cblx0XHRpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHRcdGJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTtcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIGJpbmRNYXRyaXggKS5pbnZlcnQoKTtcblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2tlbGV0b24ucG9zZSgpO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplU2tpbldlaWdodHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRjb25zdCBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBza2luV2VpZ2h0LmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmVjdG9yLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdHZlY3Rvci55ID0gc2tpbldlaWdodC5nZXRZKCBpICk7XG5cdFx0XHR2ZWN0b3IueiA9IHNraW5XZWlnaHQuZ2V0WiggaSApO1xuXHRcdFx0dmVjdG9yLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0Y29uc3Qgc2NhbGUgPSAxLjAgLyB2ZWN0b3IubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdHZlY3Rvci5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZWN0b3Iuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdH1cblxuXHRcdFx0c2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB2ZWN0b3IudyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRNZXNoLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmJpbmRNb2RlID09PSAnYXR0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggdGhpcy5iaW5kTWF0cml4ICkuaW52ZXJ0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAnICsgdGhpcy5iaW5kTW9kZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ym9uZVRyYW5zZm9ybTogZnVuY3Rpb24gKCBpbmRleCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc3Qgc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uO1xuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdF9za2luSW5kZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luSW5kZXgsIGluZGV4ICk7XG5cdFx0X3NraW5XZWlnaHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LCBpbmRleCApO1xuXG5cdFx0X2Jhc2VQb3NpdGlvbi5mcm9tQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBpbmRleCApLmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4ICk7XG5cblx0XHR0YXJnZXQuc2V0KCAwLCAwLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBfc2tpbldlaWdodC5nZXRDb21wb25lbnQoIGkgKTtcblxuXHRcdFx0aWYgKCB3ZWlnaHQgIT09IDAgKSB7XG5cblx0XHRcdFx0Y29uc3QgYm9uZUluZGV4ID0gX3NraW5JbmRleC5nZXRDb21wb25lbnQoIGkgKTtcblxuXHRcdFx0XHRfbWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNrZWxldG9uLmJvbmVzWyBib25lSW5kZXggXS5tYXRyaXhXb3JsZCwgc2tlbGV0b24uYm9uZUludmVyc2VzWyBib25lSW5kZXggXSApO1xuXG5cdFx0XHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92ZWN0b3IkNS5jb3B5KCBfYmFzZVBvc2l0aW9uICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICksIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4SW52ZXJzZSApO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBCb25lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm9uZSc7XG5cbn1cblxuQm9uZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb25lLFxuXG5cdGlzQm9uZTogdHJ1ZVxuXG59ICk7XG5cbmNvbnN0IF9vZmZzZXRNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfaWRlbnRpdHlNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5cbmNsYXNzIFNrZWxldG9uIHtcblxuXHRjb25zdHJ1Y3RvciggYm9uZXMgPSBbXSwgYm9uZUludmVyc2VzID0gW10gKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcztcblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG51bGw7XG5cblx0XHR0aGlzLmJvbmVUZXh0dXJlID0gbnVsbDtcblx0XHR0aGlzLmJvbmVUZXh0dXJlU2l6ZSA9IDA7XG5cblx0XHR0aGlzLmZyYW1lID0gLSAxO1xuXG5cdFx0dGhpcy5pbml0KCk7XG5cblx0fVxuXG5cdGluaXQoKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIGJvbmVzLmxlbmd0aCAqIDE2ICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgaW52ZXJzZSBib25lIG1hdHJpY2VzIGlmIG5lY2Vzc2FyeVxuXG5cdFx0aWYgKCBib25lSW52ZXJzZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlXG5cblx0XHRcdGlmICggYm9uZXMubGVuZ3RoICE9PSBib25lSW52ZXJzZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBOdW1iZXIgb2YgaW52ZXJzZSBib25lIG1hdHJpY2VzIGRvZXMgbm90IG1hdGNoIGFtb3VudCBvZiBib25lcy4nICk7XG5cblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Y2FsY3VsYXRlSW52ZXJzZXMoKSB7XG5cblx0XHR0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGggPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0XHRpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHtcblxuXHRcdFx0XHRpbnZlcnNlLmNvcHkoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cG9zZSgpIHtcblxuXHRcdC8vIHJlY292ZXIgdGhlIGJpbmQtdGltZSB3b3JsZCBtYXRyaWNlc1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKS5pbnZlcnQoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cdFx0Y29uc3QgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0Y29uc3QgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xuXG5cdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXG5cblx0XHRcdGNvbnN0IG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogX2lkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRfb2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcblx0XHRcdF9vZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYm9uZVRleHR1cmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApO1xuXG5cdH1cblxuXHRnZXRCb25lQnlOYW1lKCBuYW1lICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHRkaXNwb3NlKCApIHtcblxuXHRcdGlmICggdGhpcy5ib25lVGV4dHVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHRcdHRoaXMuYm9uZVRleHR1cmUgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiwgYm9uZXMgKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmJvbmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHV1aWQgPSBqc29uLmJvbmVzWyBpIF07XG5cdFx0XHRsZXQgYm9uZSA9IGJvbmVzWyB1dWlkIF07XG5cblx0XHRcdGlmICggYm9uZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBObyBib25lIGZvdW5kIHdpdGggVVVJRDonLCB1dWlkICk7XG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZXMucHVzaCggYm9uZSApO1xuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIGpzb24uYm9uZUludmVyc2VzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ1NrZWxldG9uJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnU2tlbGV0b24udG9KU09OJ1xuXHRcdFx0fSxcblx0XHRcdGJvbmVzOiBbXSxcblx0XHRcdGJvbmVJbnZlcnNlczogW11cblx0XHR9O1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYm9uZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzWyBpIF07XG5cdFx0XHRkYXRhLmJvbmVzLnB1c2goIGJvbmUudXVpZCApO1xuXG5cdFx0XHRjb25zdCBib25lSW52ZXJzZSA9IGJvbmVJbnZlcnNlc1sgaSBdO1xuXHRcdFx0ZGF0YS5ib25lSW52ZXJzZXMucHVzaCggYm9uZUludmVyc2UudG9BcnJheSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuY29uc3QgX2luc3RhbmNlTG9jYWxNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2luc3RhbmNlV29ybGRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5jb25zdCBfaW5zdGFuY2VJbnRlcnNlY3RzID0gW107XG5cbmNvbnN0IF9tZXNoID0gbmV3IE1lc2goKTtcblxuZnVuY3Rpb24gSW5zdGFuY2VkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuaW5zdGFuY2VNYXRyaXggPSBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBjb3VudCAqIDE2ICksIDE2ICk7XG5cdHRoaXMuaW5zdGFuY2VDb2xvciA9IG51bGw7XG5cblx0dGhpcy5jb3VudCA9IGNvdW50O1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXG59XG5cbkluc3RhbmNlZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRNZXNoLFxuXG5cdGlzSW5zdGFuY2VkTWVzaDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE1lc2gucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmluc3RhbmNlTWF0cml4LmNvcHkoIHNvdXJjZS5pbnN0YW5jZU1hdHJpeCApO1xuXG5cdFx0aWYgKCBzb3VyY2UuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCApIHRoaXMuaW5zdGFuY2VDb2xvciA9IHNvdXJjZS5pbnN0YW5jZUNvbG9yLmNsb25lKCk7XG5cblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb2xvckF0OiBmdW5jdGlvbiAoIGluZGV4LCBjb2xvciApIHtcblxuXHRcdGNvbG9yLmZyb21BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcblxuXHR9LFxuXG5cdGdldE1hdHJpeEF0OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRtYXRyaXguZnJvbUFycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRjb25zdCByYXljYXN0VGltZXMgPSB0aGlzLmNvdW50O1xuXG5cdFx0X21lc2guZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdF9tZXNoLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblxuXHRcdGlmICggX21lc2gubWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGZvciAoIGxldCBpbnN0YW5jZUlkID0gMDsgaW5zdGFuY2VJZCA8IHJheWNhc3RUaW1lczsgaW5zdGFuY2VJZCArKyApIHtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSB3b3JsZCBtYXRyaXggZm9yIGVhY2ggaW5zdGFuY2VcblxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaW5zdGFuY2VJZCwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcblxuXHRcdFx0X2luc3RhbmNlV29ybGRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGQsIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XG5cblx0XHRcdC8vIHRoZSBtZXNoIHJlcHJlc2VudHMgdGhpcyBzaW5nbGUgaW5zdGFuY2VcblxuXHRcdFx0X21lc2gubWF0cml4V29ybGQgPSBfaW5zdGFuY2VXb3JsZE1hdHJpeDtcblxuXHRcdFx0X21lc2gucmF5Y2FzdCggcmF5Y2FzdGVyLCBfaW5zdGFuY2VJbnRlcnNlY3RzICk7XG5cblx0XHRcdC8vIHByb2Nlc3MgdGhlIHJlc3VsdCBvZiByYXljYXN0XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBfaW5zdGFuY2VJbnRlcnNlY3RzWyBpIF07XG5cdFx0XHRcdGludGVyc2VjdC5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcblx0XHRcdFx0aW50ZXJzZWN0Lm9iamVjdCA9IHRoaXM7XG5cdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2luc3RhbmNlSW50ZXJzZWN0cy5sZW5ndGggPSAwO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0c2V0Q29sb3JBdDogZnVuY3Rpb24gKCBpbmRleCwgY29sb3IgKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5pbnN0YW5jZUNvbG9yID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggdGhpcy5jb3VudCAqIDMgKSwgMyApO1xuXG5cdFx0fVxuXG5cdFx0Y29sb3IudG9BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcblxuXHR9LFxuXG5cdHNldE1hdHJpeEF0OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRtYXRyaXgudG9BcnJheSggdGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwgaW5kZXggKiAxNiApO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKiAgbGluZWNhcDogXCJyb3VuZFwiLFxuICogIGxpbmVqb2luOiBcInJvdW5kXCJcbiAqIH1cbiAqL1xuXG5jbGFzcyBMaW5lQmFzaWNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubGluZXdpZHRoID0gMTtcblx0XHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXHRcdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHRcdHRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47XG5cblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5jb25zdCBfc3RhcnQkMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZW5kJDEgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2ludmVyc2VNYXRyaXgkMSA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfcmF5JDEgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlJDEgPSBuZXcgU3BoZXJlKCk7XG5cbmZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbkxpbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZSxcblxuXHRpc0xpbmU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHRjb25zdCBsaW5lRGlzdGFuY2VzID0gWyAwIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0X3N0YXJ0JDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0X2VuZCQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBfc3RhcnQkMS5kaXN0YW5jZVRvKCBfZW5kJDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXHRcdGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuTGluZS50aHJlc2hvbGQ7XG5cdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xuXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlJDEuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRfc3BoZXJlJDEuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdF9zcGhlcmUkMS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRfaW52ZXJzZU1hdHJpeCQxLmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheSQxLmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4JDEgKTtcblxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xuXG5cdFx0Y29uc3QgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB2RW5kID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBpbnRlclNlZ21lbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBzdGVwID0gdGhpcy5pc0xpbmVTZWdtZW50cyA/IDIgOiAxO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcblxuXHRcdFx0XHRcdHZTdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xuXHRcdFx0XHRcdHZFbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGIgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gbG9jYWxUaHJlc2hvbGRTcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dlN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0dkVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gbG9jYWxUaHJlc2hvbGRTcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xuXG5cdFx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xuXG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTGluZS51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX3N0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9lbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lU2VnbWVudHMnO1xuXG59XG5cbkxpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVTZWdtZW50cyxcblxuXHRpc0xpbmVTZWdtZW50czogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdGNvbnN0IGxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdF9zdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXHRcdFx0XHRcdF9lbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBfc3RhcnQuZGlzdGFuY2VUbyggX2VuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBMaW5lTG9vcCBleHRlbmRzIExpbmUge1xuXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xuXG5cdH1cblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUuaXNMaW5lTG9vcCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNpemU6IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBQb2ludHNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5zaXplID0gMTtcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XG5cbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbmNvbnN0IF9yYXkgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuY29uc3QgX3Bvc2l0aW9uJDIgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IFBvaW50c01hdGVyaWFsKCkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHMnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50cyxcblxuXHRpc1BvaW50czogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbCA9IHNvdXJjZS5tYXRlcmlhbDtcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0Y29uc3QgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkO1xuXHRcdGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTtcblxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdF9zcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcblxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBpICk7XG5cblx0XHRcdFx0XHRfcG9zaXRpb24kMi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24kMiwgYSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9IGVuZDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRfcG9zaXRpb24kMi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24kMiwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlBvaW50cy5yYXljYXN0KCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xuXG5cdFx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXgsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIG9iamVjdCApIHtcblxuXHRjb25zdCByYXlQb2ludERpc3RhbmNlU3EgPSBfcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdGNvbnN0IGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdF9yYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxuXHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LFxuXHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHR9ICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIFZpZGVvVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0c3VwZXIoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHRcdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JGb3JtYXQ7XG5cblx0XHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0ZnVuY3Rpb24gdXBkYXRlVmlkZW8oKSB7XG5cblx0XHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHRcdHZpZGVvLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soIHVwZGF0ZVZpZGVvICk7XG5cblx0XHR9XG5cblx0XHRpZiAoICdyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrJyBpbiB2aWRlbyApIHtcblxuXHRcdFx0dmlkZW8ucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayggdXBkYXRlVmlkZW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuaW1hZ2UgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdHVwZGF0ZSgpIHtcblxuXHRcdGNvbnN0IHZpZGVvID0gdGhpcy5pbWFnZTtcblx0XHRjb25zdCBoYXNWaWRlb0ZyYW1lQ2FsbGJhY2sgPSAncmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaycgaW4gdmlkZW87XG5cblx0XHRpZiAoIGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9PT0gZmFsc2UgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcblxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUuaXNWaWRlb1RleHR1cmUgPSB0cnVlO1xuXG5jbGFzcyBDb21wcmVzc2VkVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHRcdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0XHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdFx0Ly8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXNcblx0XHQvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKVxuXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdFx0Ly8gY2FuJ3QgZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlc1xuXHRcdC8vIG1pcHMgbXVzdCBiZSBlbWJlZGRlZCBpbiBERFMgZmlsZXNcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0fVxuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlID0gdHJ1ZTtcblxuY2xhc3MgQ2FudmFzVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRcdHN1cGVyKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fVxuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmlzQ2FudmFzVGV4dHVyZSA9IHRydWU7XG5cbmNsYXNzIERlcHRoVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7XG5cblx0XHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdFx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cblx0fVxuXG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbmNsYXNzIENpcmNsZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBzZWdtZW50cyA9IDgsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0c2VnbWVudHMgPSBNYXRoLm1heCggMywgc2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Ly8gY2VudGVyIHBvaW50XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0XHRmb3IgKCBsZXQgcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHQvLyB1dnNcblxuXHRcdFx0dXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cdFx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBDeWxpbmRlckdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXNUb3AgPSAxLCByYWRpdXNCb3R0b20gPSAxLCBoZWlnaHQgPSAxLCByYWRpYWxTZWdtZW50cyA9IDgsIGhlaWdodFNlZ21lbnRzID0gMSwgb3BlbkVuZGVkID0gZmFsc2UsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXHRcdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgaW5kZXhBcnJheSA9IFtdO1xuXHRcdGNvbnN0IGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHRcdGxldCBncm91cFN0YXJ0ID0gMDtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5XG5cblx0XHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0XHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XG5cdFx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcblxuXHRcdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcblxuXHRcdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcblx0XHRcdGNvbnN0IHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0XHRjb25zdCB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHRcdGNvbnN0IHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xuXG5cdFx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0XHRjb25zdCB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0XHRjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRcdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xuXHRcdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XG5cdFx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0XHQvLyB1dlxuXG5cdFx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xuXHRcdFx0XHRcdGNvbnN0IGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0XHQvLyB1cGRhdGUgZ3JvdXAgY291bnRlclxuXG5cdFx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcblxuXHRcdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcblxuXHRcdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0XHRjb25zdCByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xuXHRcdFx0Y29uc3Qgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xuXG5cdFx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXG5cdFx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcblx0XHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdFx0Zm9yICggbGV0IHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRcdGluZGV4ICsrO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4RW5kID0gaW5kZXg7XG5cblx0XHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblx0XHRcdFx0Y29uc3QgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0XHRcdGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcblx0XHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0XHRpbmRleCArKztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdFx0Y29uc3QgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcblxuXHRcdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIGZhY2UgdG9wXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGZhY2UgYm90dG9tXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgQ29uZUdlb21ldHJ5IGV4dGVuZHMgQ3lsaW5kZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGhlaWdodCA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgaGVpZ2h0U2VnbWVudHMgPSAxLCBvcGVuRW5kZWQgPSBmYWxzZSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlciggMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdFx0fTtcblxuXHR9XG5cbn1cblxuY2xhc3MgUG9seWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGRldGFpbDogZGV0YWlsXG5cdFx0fTtcblxuXHRcdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcblxuXHRcdGNvbnN0IHZlcnRleEJ1ZmZlciA9IFtdO1xuXHRcdGNvbnN0IHV2QnVmZmVyID0gW107XG5cblx0XHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXG5cblx0XHRzdWJkaXZpZGUoIGRldGFpbCApO1xuXG5cdFx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0XHRhcHBseVJhZGl1cyggcmFkaXVzICk7XG5cblx0XHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRcdGdlbmVyYXRlVVZzKCk7XG5cblx0XHQvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTtcblxuXHRcdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFsc1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0XHR9XG5cblx0XHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdFx0Y29uc3QgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRjb25zdCBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcblx0XHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApO1xuXHRcdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxuXG5cdFx0XHRcdHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKSB7XG5cblx0XHRcdGNvbnN0IGNvbHMgPSBkZXRhaWwgKyAxO1xuXG5cdFx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxuXG5cdFx0XHRjb25zdCB2ID0gW107XG5cblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHRcdHZbIGkgXSA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHRcdGNvbnN0IGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cblx0XHRcdFx0Y29uc3Qgcm93cyA9IGNvbHMgLSBpO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMgKSB7XG5cblx0XHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBrID0gTWF0aC5mbG9vciggaiAvIDIgKTtcblxuXHRcdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTtcblx0XHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0XHRjb25zdCB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdFx0Y29uc3QgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHRcdHV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0XHRjb3JyZWN0U2VhbSgpO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHRcdC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNlYW0sIHNlZSAjMzI2OVxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0XHRjb25zdCB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0XHRjb25zdCB4MSA9IHV2QnVmZmVyWyBpICsgMiBdO1xuXHRcdFx0XHRjb25zdCB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHRcdGNvbnN0IG1pbiA9IE1hdGgubWluKCB4MCwgeDEsIHgyICk7XG5cblx0XHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRcdGlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxO1xuXHRcdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkge1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHtcblxuXHRcdFx0Y29uc3Qgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBzdHJpZGUgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0XHRjb25zdCBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc3QgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGNvbnN0IGNlbnRyb2lkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Y29uc3QgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHRcdGNvbnN0IHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0XHRjb25zdCB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdFx0Yi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTtcblx0XHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdFx0dXZCLnNldCggdXZCdWZmZXJbIGogKyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7XG5cdFx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0XHRjb25zdCBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRcdGNvcnJlY3RVViggdXZCLCBqICsgMiwgYiwgYXppICk7XG5cdFx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsgMC41O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuXG5cblx0XHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0XHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgRG9kZWNhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xuXG5cdFx0Y29uc3QgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXHRcdGNvbnN0IHIgPSAxIC8gdDtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXG5cdFx0XHQvLyAoXHUwMEIxMSwgXHUwMEIxMSwgXHUwMEIxMSlcblx0XHRcdC0gMSwgLSAxLCAtIDEsXHQtIDEsIC0gMSwgMSxcblx0XHRcdC0gMSwgMSwgLSAxLCAtIDEsIDEsIDEsXG5cdFx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdFx0MSwgMSwgLSAxLCAxLCAxLCAxLFxuXG5cdFx0XHQvLyAoMCwgXHUwMEIxMS9cdTAzQzYsIFx1MDBCMVx1MDNDNilcblx0XHRcdDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0XHQwLCByLCAtIHQsIDAsIHIsIHQsXG5cblx0XHRcdC8vIChcdTAwQjExL1x1MDNDNiwgXHUwMEIxXHUwM0M2LCAwKVxuXHRcdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHRcdHIsIC0gdCwgMCwgciwgdCwgMCxcblxuXHRcdFx0Ly8gKFx1MDBCMVx1MDNDNiwgMCwgXHUwMEIxMS9cdTAzQzYpXG5cdFx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdFx0LSB0LCAwLCByLCB0LCAwLCByXG5cdFx0XTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXG5cdFx0XHQzLCAxMSwgNywgXHQzLCA3LCAxNSwgXHQzLCAxNSwgMTMsXG5cdFx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0XHQxNywgNCwgOCwgXHQxNywgOCwgMTAsIFx0MTcsIDEwLCA2LFxuXHRcdFx0OCwgMCwgMTYsIFx0OCwgMTYsIDIsIFx0OCwgMiwgMTAsXG5cdFx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0XHQ2LCAxMCwgMiwgXHQ2LCAyLCAxMywgXHQ2LCAxMywgMTUsXG5cdFx0XHQyLCAxNiwgMTgsIFx0MiwgMTgsIDMsIFx0MiwgMywgMTMsXG5cdFx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdFx0NCwgMTQsIDEyLCBcdDQsIDEyLCAwLCBcdDQsIDAsIDgsXG5cdFx0XHQxMSwgOSwgNSwgXHQxMSwgNSwgMTksIFx0MTEsIDE5LCA3LFxuXHRcdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0XHQxLCAxMiwgMTQsIFx0MSwgMTQsIDUsIFx0MSwgNSwgOVxuXHRcdF07XG5cblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxuXHRcdH07XG5cblx0fVxuXG59XG5cbmNvbnN0IF92MCA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjEkMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90cmlhbmdsZSA9IG5ldyBUcmlhbmdsZSgpO1xuXG5jbGFzcyBFZGdlc0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdFx0fTtcblxuXHRcdHRocmVzaG9sZEFuZ2xlID0gKCB0aHJlc2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FZGdlc0dlb21ldHJ5IG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJlY2lzaW9uUG9pbnRzID0gNDtcblx0XHRjb25zdCBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHByZWNpc2lvblBvaW50cyApO1xuXHRcdGNvbnN0IHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBNYXRoVXRpbHMuREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XG5cblx0XHRjb25zdCBpbmRleEF0dHIgPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xuXHRcdGNvbnN0IHBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHRcdGNvbnN0IGluZGV4Q291bnQgPSBpbmRleEF0dHIgPyBpbmRleEF0dHIuY291bnQgOiBwb3NpdGlvbkF0dHIuY291bnQ7XG5cblx0XHRjb25zdCBpbmRleEFyciA9IFsgMCwgMCwgMCBdO1xuXHRcdGNvbnN0IHZlcnRLZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cdFx0Y29uc3QgaGFzaGVzID0gbmV3IEFycmF5KCAzICk7XG5cblx0XHRjb25zdCBlZGdlRGF0YSA9IHt9O1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgaW5kZXhDb3VudDsgaSArPSAzICkge1xuXG5cdFx0XHRpZiAoIGluZGV4QXR0ciApIHtcblxuXHRcdFx0XHRpbmRleEFyclsgMCBdID0gaW5kZXhBdHRyLmdldFgoIGkgKTtcblx0XHRcdFx0aW5kZXhBcnJbIDEgXSA9IGluZGV4QXR0ci5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRpbmRleEFyclsgMiBdID0gaW5kZXhBdHRyLmdldFgoIGkgKyAyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aW5kZXhBcnJbIDAgXSA9IGk7XG5cdFx0XHRcdGluZGV4QXJyWyAxIF0gPSBpICsgMTtcblx0XHRcdFx0aW5kZXhBcnJbIDIgXSA9IGkgKyAyO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHsgYSwgYiwgYyB9ID0gX3RyaWFuZ2xlO1xuXHRcdFx0YS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4QXJyWyAwIF0gKTtcblx0XHRcdGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleEFyclsgMSBdICk7XG5cdFx0XHRjLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXhBcnJbIDIgXSApO1xuXHRcdFx0X3RyaWFuZ2xlLmdldE5vcm1hbCggX25vcm1hbCApO1xuXG5cdFx0XHQvLyBjcmVhdGUgaGFzaGVzIGZvciB0aGUgZWRnZSBmcm9tIHRoZSB2ZXJ0aWNlc1xuXHRcdFx0aGFzaGVzWyAwIF0gPSBgJHsgTWF0aC5yb3VuZCggYS54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBhLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGEueiAqIHByZWNpc2lvbiApIH1gO1xuXHRcdFx0aGFzaGVzWyAxIF0gPSBgJHsgTWF0aC5yb3VuZCggYi54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBiLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGIueiAqIHByZWNpc2lvbiApIH1gO1xuXHRcdFx0aGFzaGVzWyAyIF0gPSBgJHsgTWF0aC5yb3VuZCggYy54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBjLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGMueiAqIHByZWNpc2lvbiApIH1gO1xuXG5cdFx0XHQvLyBza2lwIGRlZ2VuZXJhdGUgdHJpYW5nbGVzXG5cdFx0XHRpZiAoIGhhc2hlc1sgMCBdID09PSBoYXNoZXNbIDEgXSB8fCBoYXNoZXNbIDEgXSA9PT0gaGFzaGVzWyAyIF0gfHwgaGFzaGVzWyAyIF0gPT09IGhhc2hlc1sgMCBdICkge1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBldmVyeSBlZGdlXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIGdldCB0aGUgZmlyc3QgYW5kIG5leHQgdmVydGV4IG1ha2luZyB1cCB0aGUgZWRnZVxuXHRcdFx0XHRjb25zdCBqTmV4dCA9ICggaiArIDEgKSAlIDM7XG5cdFx0XHRcdGNvbnN0IHZlY0hhc2gwID0gaGFzaGVzWyBqIF07XG5cdFx0XHRcdGNvbnN0IHZlY0hhc2gxID0gaGFzaGVzWyBqTmV4dCBdO1xuXHRcdFx0XHRjb25zdCB2MCA9IF90cmlhbmdsZVsgdmVydEtleXNbIGogXSBdO1xuXHRcdFx0XHRjb25zdCB2MSA9IF90cmlhbmdsZVsgdmVydEtleXNbIGpOZXh0IF0gXTtcblxuXHRcdFx0XHRjb25zdCBoYXNoID0gYCR7IHZlY0hhc2gwIH1fJHsgdmVjSGFzaDEgfWA7XG5cdFx0XHRcdGNvbnN0IHJldmVyc2VIYXNoID0gYCR7IHZlY0hhc2gxIH1fJHsgdmVjSGFzaDAgfWA7XG5cblx0XHRcdFx0aWYgKCByZXZlcnNlSGFzaCBpbiBlZGdlRGF0YSAmJiBlZGdlRGF0YVsgcmV2ZXJzZUhhc2ggXSApIHtcblxuXHRcdFx0XHRcdC8vIGlmIHdlIGZvdW5kIGEgc2libGluZyBlZGdlIGFkZCBpdCBpbnRvIHRoZSB2ZXJ0ZXggYXJyYXkgaWZcblx0XHRcdFx0XHQvLyBpdCBtZWV0cyB0aGUgYW5nbGUgdGhyZXNob2xkIGFuZCBkZWxldGUgdGhlIGVkZ2UgZnJvbSB0aGUgbWFwLlxuXHRcdFx0XHRcdGlmICggX25vcm1hbC5kb3QoIGVkZ2VEYXRhWyByZXZlcnNlSGFzaCBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcblxuXHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjAueCwgdjAueSwgdjAueiApO1xuXHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWRnZURhdGFbIHJldmVyc2VIYXNoIF0gPSBudWxsO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgKCBoYXNoIGluIGVkZ2VEYXRhICkgKSB7XG5cblx0XHRcdFx0XHQvLyBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBlZGdlIGhlcmUgdGhlbiBza2lwIGFkZGluZyBhIG5ldyBvbmVcblx0XHRcdFx0XHRlZGdlRGF0YVsgaGFzaCBdID0ge1xuXG5cdFx0XHRcdFx0XHRpbmRleDA6IGluZGV4QXJyWyBqIF0sXG5cdFx0XHRcdFx0XHRpbmRleDE6IGluZGV4QXJyWyBqTmV4dCBdLFxuXHRcdFx0XHRcdFx0bm9ybWFsOiBfbm9ybWFsLmNsb25lKCksXG5cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCByZW1haW5pbmcsIHVubWF0Y2hlZCBlZGdlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHZlcnRleCBhcnJheVxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBlZGdlRGF0YSApIHtcblxuXHRcdFx0aWYgKCBlZGdlRGF0YVsga2V5IF0gKSB7XG5cblx0XHRcdFx0Y29uc3QgeyBpbmRleDAsIGluZGV4MSB9ID0gZWRnZURhdGFbIGtleSBdO1xuXHRcdFx0XHRfdjAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDAgKTtcblx0XHRcdFx0X3YxJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDEgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBfdjAueCwgX3YwLnksIF92MC56ICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIF92MSQxLngsIF92MSQxLnksIF92MSQxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogUG9ydCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0ICh2Mi4yLjIpXG4gKi9cblxuY29uc3QgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdGNvbnN0IGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuXHRcdGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cdFx0bGV0IG91dGVyTm9kZSA9IGxpbmtlZExpc3QoIGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUgKTtcblx0XHRjb25zdCB0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2ICkgcmV0dXJuIHRyaWFuZ2xlcztcblxuXHRcdGxldCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG5cdFx0aWYgKCBoYXNIb2xlcyApIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKTtcblxuXHRcdC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxuXHRcdGlmICggZGF0YS5sZW5ndGggPiA4MCAqIGRpbSApIHtcblxuXHRcdFx0bWluWCA9IG1heFggPSBkYXRhWyAwIF07XG5cdFx0XHRtaW5ZID0gbWF4WSA9IGRhdGFbIDEgXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0gKSB7XG5cblx0XHRcdFx0eCA9IGRhdGFbIGkgXTtcblx0XHRcdFx0eSA9IGRhdGFbIGkgKyAxIF07XG5cdFx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSApIHtcblxuXHRsZXQgaSwgbGFzdDtcblxuXHRpZiAoIGNsb2Nrd2lzZSA9PT0gKCBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSA+IDAgKSApIHtcblxuXHRcdGZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltICkgbGFzdCA9IGluc2VydE5vZGUoIGksIGRhdGFbIGkgXSwgZGF0YVsgaSArIDEgXSwgbGFzdCApO1xuXG5cdH1cblxuXHRpZiAoIGxhc3QgJiYgZXF1YWxzKCBsYXN0LCBsYXN0Lm5leHQgKSApIHtcblxuXHRcdHJlbW92ZU5vZGUoIGxhc3QgKTtcblx0XHRsYXN0ID0gbGFzdC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gbGFzdDtcblxufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKCBzdGFydCwgZW5kICkge1xuXG5cdGlmICggISBzdGFydCApIHJldHVybiBzdGFydDtcblx0aWYgKCAhIGVuZCApIGVuZCA9IHN0YXJ0O1xuXG5cdGxldCBwID0gc3RhcnQsXG5cdFx0YWdhaW47XG5cdGRvIHtcblxuXHRcdGFnYWluID0gZmFsc2U7XG5cblx0XHRpZiAoICEgcC5zdGVpbmVyICYmICggZXF1YWxzKCBwLCBwLm5leHQgKSB8fCBhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID09PSAwICkgKSB7XG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHAgPSBlbmQgPSBwLnByZXY7XG5cdFx0XHRpZiAoIHAgPT09IHAubmV4dCApIGJyZWFrO1xuXHRcdFx0YWdhaW4gPSB0cnVlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cCA9IHAubmV4dDtcblxuXHRcdH1cblxuXHR9IHdoaWxlICggYWdhaW4gfHwgcCAhPT0gZW5kICk7XG5cblx0cmV0dXJuIGVuZDtcblxufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblx0aWYgKCAhIHBhc3MgJiYgaW52U2l6ZSApIGluZGV4Q3VydmUoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdGxldCBzdG9wID0gZWFyLFxuXHRcdHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cdHdoaWxlICggZWFyLnByZXYgIT09IGVhci5uZXh0ICkge1xuXG5cdFx0cHJldiA9IGVhci5wcmV2O1xuXHRcdG5leHQgPSBlYXIubmV4dDtcblxuXHRcdGlmICggaW52U2l6ZSA/IGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSA6IGlzRWFyKCBlYXIgKSApIHtcblxuXHRcdFx0Ly8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBwcmV2LmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBlYXIuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIG5leHQuaSAvIGRpbSApO1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBlYXIgKTtcblxuXHRcdFx0Ly8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblx0XHRpZiAoIGVhciA9PT0gc3RvcCApIHtcblxuXHRcdFx0Ly8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cblx0XHRcdGlmICggISBwYXNzICkge1xuXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZmlsdGVyUG9pbnRzKCBlYXIgKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEgKTtcblxuXHRcdFx0XHQvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAxICkge1xuXG5cdFx0XHRcdGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHRcdC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG5cblx0XHRcdH0gZWxzZSBpZiAoIHBhc3MgPT09IDIgKSB7XG5cblx0XHRcdFx0c3BsaXRFYXJjdXQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdGNvbnN0IGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG5cdGxldCBwID0gZWFyLm5leHQubmV4dDtcblxuXHR3aGlsZSAoIHAgIT09IGVhci5wcmV2ICkge1xuXG5cdFx0aWYgKCBwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZCggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdGNvbnN0IGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG5cdGNvbnN0IG1pblRYID0gYS54IDwgYi54ID8gKCBhLnggPCBjLnggPyBhLnggOiBjLnggKSA6ICggYi54IDwgYy54ID8gYi54IDogYy54ICksXG5cdFx0bWluVFkgPSBhLnkgPCBiLnkgPyAoIGEueSA8IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPCBjLnkgPyBiLnkgOiBjLnkgKSxcblx0XHRtYXhUWCA9IGEueCA+IGIueCA/ICggYS54ID4gYy54ID8gYS54IDogYy54ICkgOiAoIGIueCA+IGMueCA/IGIueCA6IGMueCApLFxuXHRcdG1heFRZID0gYS55ID4gYi55ID8gKCBhLnkgPiBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55ID4gYy55ID8gYi55IDogYy55ICk7XG5cblx0Ly8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcblx0Y29uc3QgbWluWiA9IHpPcmRlciggbWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICksXG5cdFx0bWF4WiA9IHpPcmRlciggbWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0bGV0IHAgPSBlYXIucHJldlosXG5cdFx0biA9IGVhci5uZXh0WjtcblxuXHQvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBib3RoIGRpcmVjdGlvbnNcblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5wcmV2WjtcblxuXHRcdGlmICggbiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiZcblx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkgKSAmJlxuXHRcdFx0YXJlYSggbi5wcmV2LCBuLCBuLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdG4gPSBuLm5leHRaO1xuXG5cdH1cblxuXHQvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXHR3aGlsZSAoIHAgJiYgcC56ID49IG1pblogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5wcmV2WjtcblxuXHR9XG5cblx0Ly8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblx0d2hpbGUgKCBuICYmIG4ueiA8PSBtYXhaICkge1xuXG5cdFx0aWYgKCBuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSApICYmXG5cdFx0XHRhcmVhKCBuLnByZXYsIG4sIG4ubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0biA9IG4ubmV4dFo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBzdGFydCwgdHJpYW5nbGVzLCBkaW0gKSB7XG5cblx0bGV0IHAgPSBzdGFydDtcblx0ZG8ge1xuXG5cdFx0Y29uc3QgYSA9IHAucHJldixcblx0XHRcdGIgPSBwLm5leHQubmV4dDtcblxuXHRcdGlmICggISBlcXVhbHMoIGEsIGIgKSAmJiBpbnRlcnNlY3RzKCBhLCBwLCBwLm5leHQsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICkge1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7XG5cblx0XHRcdC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gZmlsdGVyUG9pbnRzKCBwICk7XG5cbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KCBzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cblx0bGV0IGEgPSBzdGFydDtcblx0ZG8ge1xuXG5cdFx0bGV0IGIgPSBhLm5leHQubmV4dDtcblx0XHR3aGlsZSAoIGIgIT09IGEucHJldiApIHtcblxuXHRcdFx0aWYgKCBhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoIGEsIGIgKSApIHtcblxuXHRcdFx0XHQvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG5cdFx0XHRcdGxldCBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblx0XHRcdFx0YSA9IGZpbHRlclBvaW50cyggYSwgYS5uZXh0ICk7XG5cdFx0XHRcdGMgPSBmaWx0ZXJQb2ludHMoIGMsIGMubmV4dCApO1xuXG5cdFx0XHRcdC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0YiA9IGIubmV4dDtcblxuXHRcdH1cblxuXHRcdGEgPSBhLm5leHQ7XG5cblx0fSB3aGlsZSAoIGEgIT09IHN0YXJ0ICk7XG5cbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHRjb25zdCBxdWV1ZSA9IFtdO1xuXHRsZXQgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXHRmb3IgKCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGVsaW1pbmF0ZUhvbGUoIHF1ZXVlWyBpIF0sIG91dGVyTm9kZSApO1xuXHRcdG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyggb3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCApO1xuXG5cdH1cblxuXHRyZXR1cm4gb3V0ZXJOb2RlO1xuXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKCBhLCBiICkge1xuXG5cdHJldHVybiBhLnggLSBiLng7XG5cbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKCBob2xlLCBvdXRlck5vZGUgKSB7XG5cblx0b3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApO1xuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdGNvbnN0IGIgPSBzcGxpdFBvbHlnb24oIG91dGVyTm9kZSwgaG9sZSApO1xuXG5cdFx0Ly8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG5cdFx0ZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cdFx0ZmlsdGVyUG9pbnRzKCBiLCBiLm5leHQgKTtcblxuXHR9XG5cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHRsZXQgcCA9IG91dGVyTm9kZTtcblx0Y29uc3QgaHggPSBob2xlLng7XG5cdGNvbnN0IGh5ID0gaG9sZS55O1xuXHRsZXQgcXggPSAtIEluZmluaXR5LCBtO1xuXG5cdC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcblx0Ly8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHRjb25zdCB4ID0gcC54ICsgKCBoeSAtIHAueSApICogKCBwLm5leHQueCAtIHAueCApIC8gKCBwLm5leHQueSAtIHAueSApO1xuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cdFx0XHRcdGlmICggeCA9PT0gaHggKSB7XG5cblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLnkgKSByZXR1cm4gcDtcblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLm5leHQueSApIHJldHVybiBwLm5leHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IG91dGVyTm9kZSApO1xuXG5cdGlmICggISBtICkgcmV0dXJuIG51bGw7XG5cblx0aWYgKCBoeCA9PT0gcXggKSByZXR1cm4gbTsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbGVmdG1vc3QgZW5kcG9pbnRcblxuXHQvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG5cdC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuXHQvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG5cdGNvbnN0IHN0b3AgPSBtLFxuXHRcdG14ID0gbS54LFxuXHRcdG15ID0gbS55O1xuXHRsZXQgdGFuTWluID0gSW5maW5pdHksIHRhbjtcblxuXHRwID0gbTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55ICkgKSB7XG5cblx0XHRcdHRhbiA9IE1hdGguYWJzKCBoeSAtIHAueSApIC8gKCBoeCAtIHAueCApOyAvLyB0YW5nZW50aWFsXG5cblx0XHRcdGlmICggbG9jYWxseUluc2lkZSggcCwgaG9sZSApICYmICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgKCBwLnggPiBtLnggfHwgKCBwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvciggbSwgcCApICkgKSApICkgKSB7XG5cblx0XHRcdFx0bSA9IHA7XG5cdFx0XHRcdHRhbk1pbiA9IHRhbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RvcCApO1xuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IoIG0sIHAgKSB7XG5cblx0cmV0dXJuIGFyZWEoIG0ucHJldiwgbSwgcC5wcmV2ICkgPCAwICYmIGFyZWEoIHAubmV4dCwgbSwgbS5uZXh0ICkgPCAwO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoIHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdGxldCBwID0gc3RhcnQ7XG5cdGRvIHtcblxuXHRcdGlmICggcC56ID09PSBudWxsICkgcC56ID0gek9yZGVyKCBwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdHAucHJldlogPSBwLnByZXY7XG5cdFx0cC5uZXh0WiA9IHAubmV4dDtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBzdGFydCApO1xuXG5cdHAucHJldloubmV4dFogPSBudWxsO1xuXHRwLnByZXZaID0gbnVsbDtcblxuXHRzb3J0TGlua2VkKCBwICk7XG5cbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdGxldCBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcblx0XHRpblNpemUgPSAxO1xuXG5cdGRvIHtcblxuXHRcdHAgPSBsaXN0O1xuXHRcdGxpc3QgPSBudWxsO1xuXHRcdHRhaWwgPSBudWxsO1xuXHRcdG51bU1lcmdlcyA9IDA7XG5cblx0XHR3aGlsZSAoIHAgKSB7XG5cblx0XHRcdG51bU1lcmdlcyArKztcblx0XHRcdHEgPSBwO1xuXHRcdFx0cFNpemUgPSAwO1xuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5mdW5jdGlvbiB6T3JkZXIoIHgsIHksIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuXHR4ID0gMzI3NjcgKiAoIHggLSBtaW5YICkgKiBpbnZTaXplO1xuXHR5ID0gMzI3NjcgKiAoIHkgLSBtaW5ZICkgKiBpbnZTaXplO1xuXG5cdHggPSAoIHggfCAoIHggPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eCA9ICggeCB8ICggeCA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHggPSAoIHggfCAoIHggPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHkgPSAoIHkgfCAoIHkgPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eSA9ICggeSB8ICggeSA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHJldHVybiB4IHwgKCB5IDw8IDEgKTtcblxufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0bGV0IHAgPSBzdGFydCxcblx0XHRsZWZ0bW9zdCA9IHN0YXJ0O1xuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggfHwgKCBwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSApICkgbGVmdG1vc3QgPSBwO1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cmV0dXJuIGxlZnRtb3N0O1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZSggYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5ICkge1xuXG5cdHJldHVybiAoIGN4IC0gcHggKSAqICggYXkgLSBweSApIC0gKCBheCAtIHB4ICkgKiAoIGN5IC0gcHkgKSA+PSAwICYmXG5cdFx0XHQoIGF4IC0gcHggKSAqICggYnkgLSBweSApIC0gKCBieCAtIHB4ICkgKiAoIGF5IC0gcHkgKSA+PSAwICYmXG5cdFx0XHQoIGJ4IC0gcHggKSAqICggY3kgLSBweSApIC0gKCBjeCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSA+PSAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmIC8vIGRvbmVzJ3QgaW50ZXJzZWN0IG90aGVyIGVkZ2VzXG5cdFx0KCBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICYmIG1pZGRsZUluc2lkZSggYSwgYiApICYmIC8vIGxvY2FsbHkgdmlzaWJsZVxuXHRcdCggYXJlYSggYS5wcmV2LCBhLCBiLnByZXYgKSB8fCBhcmVhKCBhLCBiLnByZXYsIGIgKSApIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xuXHRcdGVxdWFscyggYSwgYiApICYmIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPiAwICYmIGFyZWEoIGIucHJldiwgYiwgYi5uZXh0ICkgPiAwICk7IC8vIHNwZWNpYWwgemVyby1sZW5ndGggY2FzZVxuXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyggcDEsIHAyICkge1xuXG5cdHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyggcDEsIHExLCBwMiwgcTIgKSB7XG5cblx0Y29uc3QgbzEgPSBzaWduKCBhcmVhKCBwMSwgcTEsIHAyICkgKTtcblx0Y29uc3QgbzIgPSBzaWduKCBhcmVhKCBwMSwgcTEsIHEyICkgKTtcblx0Y29uc3QgbzMgPSBzaWduKCBhcmVhKCBwMiwgcTIsIHAxICkgKTtcblx0Y29uc3QgbzQgPSBzaWduKCBhcmVhKCBwMiwgcTIsIHExICkgKTtcblxuXHRpZiAoIG8xICE9PSBvMiAmJiBvMyAhPT0gbzQgKSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXG5cblx0aWYgKCBvMSA9PT0gMCAmJiBvblNlZ21lbnQoIHAxLCBwMiwgcTEgKSApIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxuXHRpZiAoIG8yID09PSAwICYmIG9uU2VnbWVudCggcDEsIHEyLCBxMSApICkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcTIgYXJlIGNvbGxpbmVhciBhbmQgcTIgbGllcyBvbiBwMXExXG5cdGlmICggbzMgPT09IDAgJiYgb25TZWdtZW50KCBwMiwgcDEsIHEyICkgKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcblx0aWYgKCBvNCA9PT0gMCAmJiBvblNlZ21lbnQoIHAyLCBxMSwgcTIgKSApIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxuZnVuY3Rpb24gb25TZWdtZW50KCBwLCBxLCByICkge1xuXG5cdHJldHVybiBxLnggPD0gTWF0aC5tYXgoIHAueCwgci54ICkgJiYgcS54ID49IE1hdGgubWluKCBwLngsIHIueCApICYmIHEueSA8PSBNYXRoLm1heCggcC55LCByLnkgKSAmJiBxLnkgPj0gTWF0aC5taW4oIHAueSwgci55ICk7XG5cbn1cblxuZnVuY3Rpb24gc2lnbiggbnVtICkge1xuXG5cdHJldHVybiBudW0gPiAwID8gMSA6IG51bSA8IDAgPyAtIDEgOiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApIHtcblxuXHRsZXQgcCA9IGE7XG5cdGRvIHtcblxuXHRcdGlmICggcC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG5cdFx0XHRcdGludGVyc2VjdHMoIHAsIHAubmV4dCwgYSwgYiApICkgcmV0dXJuIHRydWU7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPCAwID9cblx0XHRhcmVhKCBhLCBiLCBhLm5leHQgKSA+PSAwICYmIGFyZWEoIGEsIGEucHJldiwgYiApID49IDAgOlxuXHRcdGFyZWEoIGEsIGIsIGEucHJldiApIDwgMCB8fCBhcmVhKCBhLCBhLm5leHQsIGIgKSA8IDA7XG5cbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoIGEsIGIgKSB7XG5cblx0bGV0IHAgPSBhLFxuXHRcdGluc2lkZSA9IGZhbHNlO1xuXHRjb25zdCBweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cdGRvIHtcblxuXHRcdGlmICggKCAoIHAueSA+IHB5ICkgIT09ICggcC5uZXh0LnkgPiBweSApICkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuXHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKVxuXHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oIGEsIGIgKSB7XG5cblx0Y29uc3QgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZSggaSwgeCwgeSwgbGFzdCApIHtcblxuXHRjb25zdCBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuXHR0aGlzLmkgPSBpO1xuXG5cdC8vIHZlcnRleCBjb29yZGluYXRlc1xuXHR0aGlzLnggPSB4O1xuXHR0aGlzLnkgPSB5O1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuXHR0aGlzLnByZXYgPSBudWxsO1xuXHR0aGlzLm5leHQgPSBudWxsO1xuXG5cdC8vIHotb3JkZXIgY3VydmUgdmFsdWVcblx0dGhpcy56ID0gbnVsbDtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG5cdHRoaXMucHJldlogPSBudWxsO1xuXHR0aGlzLm5leHRaID0gbnVsbDtcblxuXHQvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuXHR0aGlzLnN0ZWluZXIgPSBmYWxzZTtcblxufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSB7XG5cblx0bGV0IHN1bSA9IDA7XG5cdGZvciAoIGxldCBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltICkge1xuXG5cdFx0c3VtICs9ICggZGF0YVsgaiBdIC0gZGF0YVsgaSBdICkgKiAoIGRhdGFbIGkgKyAxIF0gKyBkYXRhWyBqICsgMSBdICk7XG5cdFx0aiA9IGk7XG5cblx0fVxuXG5cdHJldHVybiBzdW07XG5cbn1cblxuY29uc3QgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0Y29uc3QgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdGxldCBhID0gMC4wO1xuXG5cdFx0Zm9yICggbGV0IHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107IC8vIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgbGlrZSBbIHgwLHkwLCB4MSx5MSwgeDIseTIsIC4uLiBdXG5cdFx0Y29uc3QgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXG5cdFx0Y29uc3QgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0bGV0IGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjb25zdCB0cmlhbmdsZXMgPSBFYXJjdXQudHJpYW5ndWxhdGUoIHZlcnRpY2VzLCBob2xlSW5kaWNlcyApO1xuXG5cdFx0Ly9cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0ZmFjZXMucHVzaCggdHJpYW5nbGVzLnNsaWNlKCBpLCBpICsgMyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFjZXM7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHtcblxuXHRjb25zdCBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRwb2ludHMucG9wKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBkZXB0aDogPGZsb2F0PiwgLy8gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGVcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgKGluY2x1ZGluZyBiZXZlbE9mZnNldCkgaXMgYmV2ZWxcbiAqICBiZXZlbE9mZnNldDogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgZG9lcyBiZXZlbCBzdGFydFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuY2xhc3MgRXh0cnVkZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0XHR9O1xuXG5cdFx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgdmVydGljZXNBcnJheSA9IFtdO1xuXHRcdGNvbnN0IHV2QXJyYXkgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdFx0YWRkU2hhcGUoIHNoYXBlICk7XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlc0FycmF5LCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QXJyYXksIDIgKSApO1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdFx0Ly8gZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyID0gW107XG5cblx0XHRcdC8vIG9wdGlvbnNcblxuXHRcdFx0Y29uc3QgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7XG5cdFx0XHRjb25zdCBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdFx0bGV0IGRlcHRoID0gb3B0aW9ucy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aCA6IDEwMDtcblxuXHRcdFx0bGV0IGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7XG5cdFx0XHRsZXQgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHRcdGxldCBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7XG5cdFx0XHRsZXQgYmV2ZWxPZmZzZXQgPSBvcHRpb25zLmJldmVsT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsT2Zmc2V0IDogMDtcblx0XHRcdGxldCBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0XHRjb25zdCBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cblx0XHRcdGNvbnN0IHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IFdvcmxkVVZHZW5lcmF0b3I7XG5cblx0XHRcdC8vIGRlcHJlY2F0ZWQgb3B0aW9uc1xuXG5cdFx0XHRpZiAoIG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4nICk7XG5cdFx0XHRcdGRlcHRoID0gb3B0aW9ucy5hbW91bnQ7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0bGV0IGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcblx0XHRcdGxldCBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XG5cblx0XHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcblxuXHRcdFx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcblx0XHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcblxuXHRcdFx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xuXG5cdFx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcblxuXHRcdFx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRcdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdFx0YmV2ZWxTZWdtZW50cyA9IDA7XG5cdFx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdFx0YmV2ZWxTaXplID0gMDtcblx0XHRcdFx0YmV2ZWxPZmZzZXQgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxuXG5cdFx0XHRjb25zdCBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdFx0bGV0IHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XG5cdFx0XHRjb25zdCBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0XHRjb25zdCByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xuXG5cdFx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cblxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XG5cblx0XHRcdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblxuXHRcdFx0Y29uc3QgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHZlcnRpY2VzLCBob2xlcyApO1xuXG5cdFx0XHQvKiBWZXJ0aWNlcyAqL1xuXG5cdFx0XHRjb25zdCBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXG5cblx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHRcdH1cblxuXG5cdFx0XHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0JyApO1xuXG5cdFx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB2bGVuID0gdmVydGljZXMubGVuZ3RoLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHRcdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcblxuXG5cdFx0XHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XG5cdFx0XHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xuXHRcdFx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxuXG5cdFx0XHRcdGxldCB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxuXHRcdFx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxuXG5cdFx0XHRcdGNvbnN0IHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXG5cdFx0XHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcblx0XHRcdFx0Y29uc3Qgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcblx0XHRcdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xuXG5cdFx0XHRcdGNvbnN0IHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcblxuXHRcdFx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXG5cdFx0XHRcdGNvbnN0IGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcblxuXHRcdFx0XHRcdGNvbnN0IHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHRcdGNvbnN0IHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XG5cblx0XHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0XHRjb25zdCBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xuXHRcdFx0XHRcdGNvbnN0IHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XG5cblx0XHRcdFx0XHRjb25zdCBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHRcdGNvbnN0IHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XG5cblx0XHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdFx0Y29uc3Qgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cblx0XHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcblxuXHRcdFx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XG5cdFx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHRcdGNvbnN0IHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xuXHRcdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0XHRsZXQgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXG5cblx0XHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XG5cdFx0XHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0Y29uc3QgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXG5cblx0XHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBob2xlc01vdmVtZW50cyA9IFtdO1xuXHRcdFx0bGV0IG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcblxuXHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcblx0XHRcdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xuXG5cdFx0XHRmb3IgKCBsZXQgYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXG5cdFx0XHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xuXG5cdFx0XHRcdGNvbnN0IHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdFx0Y29uc3QgeiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0XHRjb25zdCBicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0O1xuXG5cdFx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJzID0gYmV2ZWxTaXplICsgYmV2ZWxPZmZzZXQ7XG5cblx0XHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XG5cblx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHRcdC8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXNcblxuXHRcdFx0Zm9yICggbGV0IHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCAvIHN0ZXBzICogcyApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXG5cdFx0XHQvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVzXG5cblx0XHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRcdGZvciAoIGxldCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0XHRjb25zdCB0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHRcdGNvbnN0IHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdFx0Y29uc3QgYnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICkgKyBiZXZlbE9mZnNldDtcblxuXHRcdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0LyogRmFjZXMgKi9cblxuXHRcdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdFx0YnVpbGRMaWRGYWNlcygpO1xuXG5cdFx0XHQvLyBTaWRlcyBmYWNlc1xuXG5cdFx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHRcdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcblxuXHRcdFx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblxuXHRcdFx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0XHRcdGxldCBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHRcdGxldCBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRcdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xuXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0XHRsZXQgbGF5ZXJvZmZzZXQgPSAwO1xuXHRcdFx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XG5cdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xuXG5cdFx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XG5cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcblxuXHRcdFx0XHRsZXQgaSA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgaiA9IGk7XG5cdFx0XHRcdFx0bGV0IGsgPSBpIC0gMTtcblx0XHRcdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMgPSAwLCBzbCA9ICggc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMiApOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0XHRjb25zdCBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcblx0XHRcdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxuXHRcdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcblxuXHRcdFx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XG5cdFx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcblx0XHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHtcblxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblx0XHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblx0XHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XG5cdFx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XG5cblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLnBhcmFtZXRlcnMub3B0aW9ucztcblxuXHRcdHJldHVybiB0b0pTT04kMSggc2hhcGVzLCBvcHRpb25zLCBkYXRhICk7XG5cblx0fVxuXG59XG5cbmNvbnN0IFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHRjb25zdCBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdGNvbnN0IGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdGNvbnN0IGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0Y29uc3QgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0Y29uc3QgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHRjb25zdCBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0Y29uc3QgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHRjb25zdCBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHRjb25zdCBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHRjb25zdCBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdGNvbnN0IGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdGNvbnN0IGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdGNvbnN0IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0Y29uc3QgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cdFx0Y29uc3QgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0Y29uc3QgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcblx0XHRjb25zdCBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcblx0XHRjb25zdCBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gdG9KU09OJDEoIHNoYXBlcywgb3B0aW9ucywgZGF0YSApIHtcblxuXHRkYXRhLnNoYXBlcyA9IFtdO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRpZiAoIG9wdGlvbnMuZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIGRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGgudG9KU09OKCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuY2xhc3MgSWNvc2FoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XG5cblx0XHRjb25zdCB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcblx0XHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHRcdDAsIC0gMSwgdCwgXHQwLCAxLCB0LFx0MCwgLSAxLCAtIHQsIFx0MCwgMSwgLSB0LFxuXHRcdFx0dCwgMCwgLSAxLCBcdHQsIDAsIDEsIFx0LSB0LCAwLCAtIDEsIFx0LSB0LCAwLCAxXG5cdFx0XTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXG5cdFx0XHQwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdFx0MSwgNSwgOSwgXHQ1LCAxMSwgNCxcdDExLCAxMCwgMixcdDEwLCA3LCA2LFx0NywgMSwgOCxcblx0XHRcdDMsIDksIDQsIFx0MywgNCwgMixcdDMsIDIsIDYsXHQzLCA2LCA4LFx0MywgOCwgOSxcblx0XHRcdDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdFx0XTtcblxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcblx0XHR9O1xuXG5cdH1cblxufVxuXG5jbGFzcyBMYXRoZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMsIHNlZ21lbnRzID0gMTIsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHRcdH07XG5cblx0XHRzZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICk7XG5cblx0XHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0XHRwaGlMZW5ndGggPSBNYXRoVXRpbHMuY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHBoaSApO1xuXHRcdFx0Y29uc3QgY29zID0gTWF0aC5jb3MoIHBoaSApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXYueCA9IGkgLyBzZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGJhc2UgPSBqICsgaSAqIHBvaW50cy5sZW5ndGg7XG5cblx0XHRcdFx0Y29uc3QgYSA9IGJhc2U7XG5cdFx0XHRcdGNvbnN0IGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdFx0Y29uc3QgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTtcblx0XHRcdFx0Y29uc3QgZCA9IGJhc2UgKyAxO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRcdC8vIGdlbmVyYXRlIG5vcm1hbHNcblxuXHRcdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2VhbS5cblx0XHQvLyBiZWNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2VzIGFyZSBpZGVudGljYWwgKGJ1dCBzdGlsbCBoYXZlIGRpZmZlcmVudCBVVnMpLlxuXG5cdFx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0XHRjb25zdCBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblx0XHRcdGNvbnN0IG4xID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRcdGNvbnN0IGJhc2UgPSBzZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkge1xuXG5cdFx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGZpcnN0IGxpbmVcblxuXHRcdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdFx0bjEueSA9IG5vcm1hbHNbIGogKyAxIF07XG5cdFx0XHRcdG4xLnogPSBub3JtYWxzWyBqICsgMiBdO1xuXG5cdFx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRcdG4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTtcblx0XHRcdFx0bjIueSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdO1xuXHRcdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdFx0Ly8gYXZlcmFnZSBub3JtYWxzXG5cblx0XHRcdFx0bi5hZGRWZWN0b3JzKCBuMSwgbjIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdFx0bm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54O1xuXHRcdFx0XHRub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7XG5cdFx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5jbGFzcyBPY3RhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xuXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0XHQwLCAtIDEsIDAsIFx0MCwgMCwgMSxcdDAsIDAsIC0gMVxuXHRcdF07XG5cblx0XHRjb25zdCBpbmRpY2VzID0gW1xuXHRcdFx0MCwgMiwgNCxcdDAsIDQsIDMsXHQwLCAzLCA1LFxuXHRcdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdFx0MSwgMywgNCxcdDEsIDQsIDJcblx0XHRdO1xuXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGRldGFpbDogZGV0YWlsXG5cdFx0fTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHBzOi8vcHJpZGVvdXQubmV0L2Jsb2cvb2xkL2Jsb2cvaW5kZXguaHRtbEBwPTQ0Lmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHRjb25zdCBpbmRpY2VzID0gW107XG5cdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0Y29uc3QgdXZzID0gW107XG5cblx0Y29uc3QgRVBTID0gMC4wMDAwMTtcblxuXHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGNvbnN0IHAwID0gbmV3IFZlY3RvcjMoKSwgcDEgPSBuZXcgVmVjdG9yMygpO1xuXHRjb25zdCBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRpZiAoIGZ1bmMubGVuZ3RoIDwgMyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5QYXJhbWV0cmljR2VvbWV0cnk6IEZ1bmN0aW9uIG11c3Qgbm93IG1vZGlmeSBhIFZlY3RvcjMgYXMgdGhpcmQgcGFyYW1ldGVyLicgKTtcblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGNvbnN0IHNsaWNlQ291bnQgPSBzbGljZXMgKyAxO1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRjb25zdCB2ID0gaSAvIHN0YWNrcztcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdGNvbnN0IHUgPSBqIC8gc2xpY2VzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0ZnVuYyggdSwgdiwgcDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdC8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzXG5cblx0XHRcdGlmICggdSAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUgKyBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdiAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgKyBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVybnMgc3VyZmFjZSBub3JtYWxcblxuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIHYgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IHN0YWNrczsgaSArKyApIHtcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0Y29uc3QgYSA9IGkgKiBzbGljZUNvdW50ICsgajtcblx0XHRcdGNvbnN0IGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0Y29uc3QgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdGNvbnN0IGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajtcblxuXHRcdFx0Ly8gZmFjZXMgb25lIGFuZCB0d29cblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbmNsYXNzIFJpbmdHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggaW5uZXJSYWRpdXMgPSAwLjUsIG91dGVyUmFkaXVzID0gMSwgdGhldGFTZWdtZW50cyA9IDgsIHBoaVNlZ21lbnRzID0gMSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHRcdH07XG5cblx0XHR0aGV0YVNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKTtcblx0XHRwaGlTZWdtZW50cyA9IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRsZXQgcmFkaXVzID0gaW5uZXJSYWRpdXM7XG5cdFx0Y29uc3QgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZVxuXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1di54ID0gKCB2ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblx0XHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcblxuXHRcdH1cblxuXHRcdC8vIGluZGljZXNcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRjb25zdCB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0XHRjb25zdCBhID0gc2VnbWVudDtcblx0XHRcdFx0Y29uc3QgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcblx0XHRcdFx0Y29uc3QgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdFx0Y29uc3QgZCA9IHNlZ21lbnQgKyAxO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgU2hhcGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3Rvciggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzID0gMTIgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHRcdH07XG5cblx0XHQvLyBidWZmZXJzXG5cblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgdXZzID0gW107XG5cblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XG5cdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXHRcdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblxuXHRcdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdFx0Y29uc3QgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdFx0Y29uc3QgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0XHRsZXQgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHRcdGNvbnN0IHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XG5cblx0XHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cdFx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gdmVydGljZXMsIG5vcm1hbHMsIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApO1xuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmNpZGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHRcdGNvbnN0IGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0XHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIGRhdGEgKSB7XG5cblx0ZGF0YS5zaGFwZXMgPSBbXTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcblxuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuY2xhc3MgU3BoZXJlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHdpZHRoU2VnbWVudHMgPSA4LCBoZWlnaHRTZWdtZW50cyA9IDYsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgKTtcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApICk7XG5cblx0XHRjb25zdCB0aGV0YUVuZCA9IE1hdGgubWluKCB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGgsIE1hdGguUEkgKTtcblxuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgZ3JpZCA9IFtdO1xuXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0XHRjb25zdCB2ZXJ0aWNlc1JvdyA9IFtdO1xuXG5cdFx0XHRjb25zdCB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlIGZvciB0aGUgcG9sZXNcblxuXHRcdFx0bGV0IHVPZmZzZXQgPSAwO1xuXG5cdFx0XHRpZiAoIGl5ID09IDAgJiYgdGhldGFTdGFydCA9PSAwICkge1xuXG5cdFx0XHRcdHVPZmZzZXQgPSAwLjUgLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpeSA9PSBoZWlnaHRTZWdtZW50cyAmJiB0aGV0YUVuZCA9PSBNYXRoLlBJICkge1xuXG5cdFx0XHRcdHVPZmZzZXQgPSAtIDAuNSAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5jb3B5KCB2ZXJ0ZXggKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSArIHVPZmZzZXQsIDEgLSB2ICk7XG5cblx0XHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHRcdGNvbnN0IGIgPSBncmlkWyBpeSBdWyBpeCBdO1xuXHRcdFx0XHRjb25zdCBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHRcdGNvbnN0IGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBUZXRyYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXHRcdFx0MSwgMSwgMSwgXHQtIDEsIC0gMSwgMSwgXHQtIDEsIDEsIC0gMSwgXHQxLCAtIDEsIC0gMVxuXHRcdF07XG5cblx0XHRjb25zdCBpbmRpY2VzID0gW1xuXHRcdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XHRdO1xuXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxuXHRcdH07XG5cblx0fVxuXG59XG5cbi8qKlxuICogVGV4dCA9IDNEIFRleHRcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGZvbnQ6IDxUSFJFRS5Gb250PiwgLy8gZm9udFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0XG4gKiAgaGVpZ2h0OiA8ZmxvYXQ+LCAvLyB0aGlja25lc3MgdG8gZXh0cnVkZSB0ZXh0XG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSAoaW5jbHVkaW5nIGJldmVsT2Zmc2V0KSBpcyBiZXZlbFxuICogIGJldmVsT2Zmc2V0OiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgZG9lcyBiZXZlbCBzdGFydFxuICogfVxuICovXG5cbmNsYXNzIFRleHRHZW9tZXRyeSBleHRlbmRzIEV4dHJ1ZGVHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHRleHQsIHBhcmFtZXRlcnMgPSB7fSApIHtcblxuXHRcdGNvbnN0IGZvbnQgPSBwYXJhbWV0ZXJzLmZvbnQ7XG5cblx0XHRpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRcdHJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFwZXMoIHRleHQsIHBhcmFtZXRlcnMuc2l6ZSApO1xuXG5cdFx0Ly8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSVxuXG5cdFx0cGFyYW1ldGVycy5kZXB0aCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdFx0Ly8gZGVmYXVsdHNcblxuXHRcdGlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwO1xuXHRcdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0XHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0c3VwZXIoIHNoYXBlcywgcGFyYW1ldGVycyApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7XG5cblx0fVxuXG59XG5cbmNsYXNzIFRvcnVzR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHJhZGlhbFNlZ21lbnRzID0gOCwgdHVidWxhclNlZ21lbnRzID0gNiwgYXJjID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0dHViZTogdHViZSxcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0YXJjOiBhcmNcblx0XHR9O1xuXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXHRcdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XG5cdFx0XHRcdGNvbnN0IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcblx0XHRcdFx0Y29uc3QgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XG5cdFx0XHRcdGNvbnN0IGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHRcdGNvbnN0IGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgVG9ydXNLbm90R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHR1YnVsYXJTZWdtZW50cyA9IDY0LCByYWRpYWxTZWdtZW50cyA9IDgsIHAgPSAyLCBxID0gMyApIHtcblxuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0dHViZTogdHViZSxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0cDogcCxcblx0XHRcdHE6IHFcblx0XHR9O1xuXG5cdFx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICk7XG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Y29uc3QgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGNvbnN0IEIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IFQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdFx0Ly8gdGhlIHJhZGlhbiBcInVcIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBjdXJyZW50IHR1YnVsYXIgc2VnZW1lbnRcblxuXHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxuXHRcdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0XHROLmFkZFZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcblxuXHRcdFx0Qi5ub3JtYWxpemUoKTtcblx0XHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBhcmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS5cblx0XHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdFx0Y29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXHRcdFx0XHRjb25zdCBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHRcdGNvbnN0IGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZVxuXG5cdFx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdFx0dmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56ICk7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHRjb25zdCBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdGNvbnN0IGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0XHQvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlXG5cblx0XHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHRcdGNvbnN0IGN1ID0gTWF0aC5jb3MoIHUgKTtcblx0XHRcdGNvbnN0IHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHRcdGNvbnN0IHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0XHRjb25zdCBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7XG5cblx0XHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdFx0cG9zaXRpb24ueiA9IHJhZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNsYXNzIFR1YmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggcGF0aCwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGl1cyA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgY2xvc2VkID0gZmFsc2UgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cGF0aDogcGF0aCxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0XHRjbG9zZWQ6IGNsb3NlZFxuXHRcdH07XG5cblx0XHRjb25zdCBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0XHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0XHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xuXHRcdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHRcdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0bGV0IFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gYnVmZmVyXG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cblx0XHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcblxuXHRcdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0XHQvLyBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcblxuXHRcdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cblx0XHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0XHRnZW5lcmF0ZVVWcygpO1xuXG5cdFx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xuXG5cdFx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcblxuXHRcdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0XHRQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7XG5cblx0XHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxuXG5cdFx0XHRjb25zdCBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcblx0XHRcdGNvbnN0IEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHRjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHYgKTtcblx0XHRcdFx0Y29uc3QgY29zID0gLSBNYXRoLmNvcyggdiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xuXHRcdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XG5cdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdFx0XHRjb25zdCBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xuXHRcdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5wYXRoID0gdGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuY2xhc3MgV2lyZWZyYW1lR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBidWZmZXJcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRjb25zdCBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge307XG5cblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRsZXQgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbGV0IG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHtcblxuXHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgbyBdO1xuXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdGNvbnN0IGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRjb25zdCBlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRjb25zdCBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggcG9zaXRpb24uY291bnQgLyAzICk7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxuXHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxuXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXgxID0gMyAqIGkgKyBqO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxuXHR9XG5cbn1cblxudmFyIEdlb21ldHJpZXMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94R2VvbWV0cnksXG5cdENpcmNsZUdlb21ldHJ5OiBDaXJjbGVHZW9tZXRyeSxcblx0Q2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LFxuXHRDb25lR2VvbWV0cnk6IENvbmVHZW9tZXRyeSxcblx0Q29uZUJ1ZmZlckdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LFxuXHRFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LFxuXHRFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSxcblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBFeHRydWRlR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IE9jdGFoZWRyb25HZW9tZXRyeSxcblx0UGFyYW1ldHJpY0dlb21ldHJ5OiBQYXJhbWV0cmljR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQbGFuZUJ1ZmZlckdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uR2VvbWV0cnk6IFBvbHloZWRyb25HZW9tZXRyeSxcblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFJpbmdHZW9tZXRyeTogUmluZ0dlb21ldHJ5LFxuXHRSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0U2hhcGVHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LFxuXHRTcGhlcmVCdWZmZXJHZW9tZXRyeTogU3BoZXJlR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRleHRHZW9tZXRyeTogVGV4dEdlb21ldHJ5LFxuXHRUZXh0QnVmZmVyR2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNCdWZmZXJHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LFxuXHRUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9ydXNLbm90R2VvbWV0cnksXG5cdFR1YmVHZW9tZXRyeTogVHViZUdlb21ldHJ5LFxuXHRUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0V2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5XG59KTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8VEhSRUUuQ29sb3I+XG4gKiB9XG4gKi9cblxuY2xhc3MgU2hhZG93TWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NoYWRvd01hdGVyaWFsJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5jbGFzcyBSYXdTaGFkZXJNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xuXG5cdH1cblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+LFxuICpcbiAqICBmbGF0U2hhZGluZzogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFN0YW5kYXJkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5yb3VnaG5lc3MgPSAxLjA7XG5cdHRoaXMubWV0YWxuZXNzID0gMC4wO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0dGhpcy52ZXJ0ZXhUYW5nZW50cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XG5cdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcblxuXHR0aGlzLnZlcnRleFRhbmdlbnRzID0gc291cmNlLnZlcnRleFRhbmdlbnRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY2xlYXJjb2F0OiA8ZmxvYXQ+LFxuICogIGNsZWFyY29hdE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBjbGVhcmNvYXRSb3VnaG5lc3M6IDxmbG9hdD4sXG4gKiAgY2xlYXJjb2F0Um91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGNsZWFyY29hdE5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKiAgY2xlYXJjb2F0Tm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgaW9yOiA8ZmxvYXQ+LFxuICpcbiAqICBzaGVlbjogPENvbG9yPixcbiAqXG4gKiAgdHJhbnNtaXNzaW9uOiA8ZmxvYXQ+LFxuICogIHRyYW5zbWlzc2lvbk1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7XG5cblx0XHQnU1RBTkRBUkQnOiAnJyxcblx0XHQnUEhZU0lDQUwnOiAnJ1xuXG5cdH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJztcblxuXHR0aGlzLmNsZWFyY29hdCA9IDAuMDtcblx0dGhpcy5jbGVhcmNvYXRNYXAgPSBudWxsO1xuXHR0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IDAuMDtcblx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBudWxsO1xuXHR0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBudWxsO1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lvcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuICggMSArIDAuNCAqIHRoaXMucmVmbGVjdGl2aXR5ICkgLyAoIDEgLSAwLjQgKiB0aGlzLnJlZmxlY3Rpdml0eSApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggaW9yICkge1xuXG5cdFx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IE1hdGhVdGlscy5jbGFtcCggMi41ICogKCBpb3IgLSAxICkgLyAoIGlvciArIDEgKSwgMCwgMSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5zaGVlbiA9IG51bGw7IC8vIG51bGwgd2lsbCBkaXNhYmxlIHNoZWVuIGJzZGZcblxuXHR0aGlzLnRyYW5zbWlzc2lvbiA9IDAuMDtcblx0dGhpcy50cmFuc21pc3Npb25NYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHtcblxuXHRcdCdTVEFOREFSRCc6ICcnLFxuXHRcdCdQSFlTSUNBTCc6ICcnXG5cblx0fTtcblxuXHR0aGlzLmNsZWFyY29hdCA9IHNvdXJjZS5jbGVhcmNvYXQ7XG5cdHRoaXMuY2xlYXJjb2F0TWFwID0gc291cmNlLmNsZWFyY29hdE1hcDtcblx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJjb2F0Um91Z2huZXNzO1xuXHR0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA7XG5cdHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwID0gc291cmNlLmNsZWFyY29hdE5vcm1hbE1hcDtcblx0dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KCBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0aWYgKCBzb3VyY2Uuc2hlZW4gKSB7XG5cblx0XHR0aGlzLnNoZWVuID0gKCB0aGlzLnNoZWVuIHx8IG5ldyBDb2xvcigpICkuY29weSggc291cmNlLnNoZWVuICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMuc2hlZW4gPSBudWxsO1xuXG5cdH1cblxuXHR0aGlzLnRyYW5zbWlzc2lvbiA9IHNvdXJjZS50cmFuc21pc3Npb247XG5cdHRoaXMudHJhbnNtaXNzaW9uTWFwID0gc291cmNlLnRyYW5zbWlzc2lvbk1hcDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBzcGVjdWxhcjogPGhleD4sXG4gKiAgc2hpbmluZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsTWFwVHlwZTogVEhSRUUuVGFuZ2VudFNwYWNlTm9ybWFsTWFwLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseU9wZXJhdGlvbixcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4sXG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoUGhvbmdNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHRcdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdFx0dGhpcy5zaGluaW5lc3MgPSAzMDtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0XHR0aGlzLnNwZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApO1xuXHRcdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoVG9vbk1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblx0XHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXHRcdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4sXG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTm9ybWFsTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdFx0dGhpcy5mb2cgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTGFtYmVydE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcblx0XHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXRjYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTWF0Y2FwTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTWF0Y2FwTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXG5cdFx0dGhpcy5tYXRjYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hdGNhcCA9IHNvdXJjZS5tYXRjYXA7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaE1hdGNhcE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBzY2FsZTogPGZsb2F0PixcbiAqICBkYXNoU2l6ZTogPGZsb2F0PixcbiAqICBnYXBTaXplOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuY2xhc3MgTGluZURhc2hlZE1hdGVyaWFsIGV4dGVuZHMgTGluZUJhc2ljTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5zY2FsZSA9IDE7XG5cdFx0dGhpcy5kYXNoU2l6ZSA9IDM7XG5cdFx0dGhpcy5nYXBTaXplID0gMTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcblx0XHR0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplO1xuXHRcdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlO1xuXG52YXIgTWF0ZXJpYWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCxcblx0U3ByaXRlTWF0ZXJpYWw6IFNwcml0ZU1hdGVyaWFsLFxuXHRSYXdTaGFkZXJNYXRlcmlhbDogUmF3U2hhZGVyTWF0ZXJpYWwsXG5cdFNoYWRlck1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbCxcblx0UG9pbnRzTWF0ZXJpYWw6IFBvaW50c01hdGVyaWFsLFxuXHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogTWVzaFBoeXNpY2FsTWF0ZXJpYWwsXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0TWVzaFBob25nTWF0ZXJpYWw6IE1lc2hQaG9uZ01hdGVyaWFsLFxuXHRNZXNoVG9vbk1hdGVyaWFsOiBNZXNoVG9vbk1hdGVyaWFsLFxuXHRNZXNoTm9ybWFsTWF0ZXJpYWw6IE1lc2hOb3JtYWxNYXRlcmlhbCxcblx0TWVzaExhbWJlcnRNYXRlcmlhbDogTWVzaExhbWJlcnRNYXRlcmlhbCxcblx0TWVzaERlcHRoTWF0ZXJpYWw6IE1lc2hEZXB0aE1hdGVyaWFsLFxuXHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogTWVzaERpc3RhbmNlTWF0ZXJpYWwsXG5cdE1lc2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCxcblx0TWVzaE1hdGNhcE1hdGVyaWFsOiBNZXNoTWF0Y2FwTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbmNvbnN0IEFuaW1hdGlvblV0aWxzID0ge1xuXG5cdC8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXNcblx0YXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7XG5cblx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0Ly8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9tLCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBidXQgYXJyYXkuc3ViYXJyYXkoZnJvbSkgb3IgYXJyYXkuc3ViYXJyYXkoZnJvbSwgbGVuKSBpcyBjb3JyZWN0XG5cdFx0XHRyZXR1cm4gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBhcnJheS5zdWJhcnJheSggZnJvbSwgdG8gIT09IHVuZGVmaW5lZCA/IHRvIDogYXJyYXkubGVuZ3RoICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheS5zbGljZSggZnJvbSwgdG8gKTtcblxuXHR9LFxuXG5cdC8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZVxuXHRjb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xvbmUgKSB7XG5cblx0XHRpZiAoICEgYXJyYXkgfHwgLy8gbGV0ICd1bmRlZmluZWQnIGFuZCAnbnVsbCcgcGFzc1xuXHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHQhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkXG5cdGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcblxuXHRcdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKTtcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7XG5cblx0XHRyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyB1c2VzIHRoZSBhcnJheSBwcmV2aW91c2x5IHJldHVybmVkIGJ5ICdnZXRLZXlmcmFtZU9yZGVyJyB0byBzb3J0IGRhdGFcblx0c29ydGVkQXJyYXk6IGZ1bmN0aW9uICggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xuXG5cdFx0Y29uc3QgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIGZ1bmN0aW9uIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzXG5cdGZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcblxuXHRcdGxldCBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTtcblxuXHRcdHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRsZXQgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoLmFwcGx5KCB2YWx1ZXMsIHZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2hcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWUudG9BcnJheSggdmFsdWVzLCB2YWx1ZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXNcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0c3ViY2xpcDogZnVuY3Rpb24gKCBzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzID0gMzAgKSB7XG5cblx0XHRjb25zdCBjbGlwID0gc291cmNlQ2xpcC5jbG9uZSgpO1xuXG5cdFx0Y2xpcC5uYW1lID0gbmFtZTtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcC50cmFja3MubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCB0cmFjayA9IGNsaXAudHJhY2tzWyBpIF07XG5cdFx0XHRjb25zdCB2YWx1ZVNpemUgPSB0cmFjay5nZXRWYWx1ZVNpemUoKTtcblxuXHRcdFx0Y29uc3QgdGltZXMgPSBbXTtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB0cmFjay50aW1lcy5sZW5ndGg7ICsrIGogKSB7XG5cblx0XHRcdFx0Y29uc3QgZnJhbWUgPSB0cmFjay50aW1lc1sgaiBdICogZnBzO1xuXG5cdFx0XHRcdGlmICggZnJhbWUgPCBzdGFydEZyYW1lIHx8IGZyYW1lID49IGVuZEZyYW1lICkgY29udGludWU7XG5cblx0XHRcdFx0dGltZXMucHVzaCggdHJhY2sudGltZXNbIGogXSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBrID0gMDsgayA8IHZhbHVlU2l6ZTsgKysgayApIHtcblxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB0cmFjay52YWx1ZXNbIGogKiB2YWx1ZVNpemUgKyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0dHJhY2sudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0cmFjay50aW1lcy5jb25zdHJ1Y3RvciApO1xuXHRcdFx0dHJhY2sudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRyYWNrLnZhbHVlcy5jb25zdHJ1Y3RvciApO1xuXG5cdFx0XHR0cmFja3MucHVzaCggdHJhY2sgKTtcblxuXHRcdH1cblxuXHRcdGNsaXAudHJhY2tzID0gdHJhY2tzO1xuXG5cdFx0Ly8gZmluZCBtaW5pbXVtIC50aW1lcyB2YWx1ZSBhY3Jvc3MgYWxsIHRyYWNrcyBpbiB0aGUgdHJpbW1lZCBjbGlwXG5cblx0XHRsZXQgbWluU3RhcnRUaW1lID0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggbWluU3RhcnRUaW1lID4gY2xpcC50cmFja3NbIGkgXS50aW1lc1sgMCBdICkge1xuXG5cdFx0XHRcdG1pblN0YXJ0VGltZSA9IGNsaXAudHJhY2tzWyBpIF0udGltZXNbIDAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2hpZnQgYWxsIHRyYWNrcyBzdWNoIHRoYXQgY2xpcCBiZWdpbnMgYXQgdD0wXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGNsaXAudHJhY2tzWyBpIF0uc2hpZnQoIC0gMSAqIG1pblN0YXJ0VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0Y2xpcC5yZXNldER1cmF0aW9uKCk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9LFxuXG5cdG1ha2VDbGlwQWRkaXRpdmU6IGZ1bmN0aW9uICggdGFyZ2V0Q2xpcCwgcmVmZXJlbmNlRnJhbWUgPSAwLCByZWZlcmVuY2VDbGlwID0gdGFyZ2V0Q2xpcCwgZnBzID0gMzAgKSB7XG5cblx0XHRpZiAoIGZwcyA8PSAwICkgZnBzID0gMzA7XG5cblx0XHRjb25zdCBudW1UcmFja3MgPSByZWZlcmVuY2VDbGlwLnRyYWNrcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVmZXJlbmNlVGltZSA9IHJlZmVyZW5jZUZyYW1lIC8gZnBzO1xuXG5cdFx0Ly8gTWFrZSBlYWNoIHRyYWNrJ3MgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZXMgYXQgdGhlIHJlZmVyZW5jZSBmcmFtZVxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG51bVRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2sgPSByZWZlcmVuY2VDbGlwLnRyYWNrc1sgaSBdO1xuXHRcdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2tUeXBlID0gcmVmZXJlbmNlVHJhY2suVmFsdWVUeXBlTmFtZTtcblxuXHRcdFx0Ly8gU2tpcCB0aGlzIHRyYWNrIGlmIGl0J3Mgbm9uLW51bWVyaWNcblx0XHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnYm9vbCcgfHwgcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnc3RyaW5nJyApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBGaW5kIHRoZSB0cmFjayBpbiB0aGUgdGFyZ2V0IGNsaXAgd2hvc2UgbmFtZSBhbmQgdHlwZSBtYXRjaGVzIHRoZSByZWZlcmVuY2UgdHJhY2tcblx0XHRcdGNvbnN0IHRhcmdldFRyYWNrID0gdGFyZ2V0Q2xpcC50cmFja3MuZmluZCggZnVuY3Rpb24gKCB0cmFjayApIHtcblxuXHRcdFx0XHRyZXR1cm4gdHJhY2submFtZSA9PT0gcmVmZXJlbmNlVHJhY2submFtZVxuXHRcdFx0XHRcdCYmIHRyYWNrLlZhbHVlVHlwZU5hbWUgPT09IHJlZmVyZW5jZVRyYWNrVHlwZTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldFRyYWNrID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0bGV0IHJlZmVyZW5jZU9mZnNldCA9IDA7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VWYWx1ZVNpemUgPSByZWZlcmVuY2VUcmFjay5nZXRWYWx1ZVNpemUoKTtcblxuXHRcdFx0aWYgKCByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSApIHtcblxuXHRcdFx0XHRyZWZlcmVuY2VPZmZzZXQgPSByZWZlcmVuY2VWYWx1ZVNpemUgLyAzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB0YXJnZXRPZmZzZXQgPSAwO1xuXHRcdFx0Y29uc3QgdGFyZ2V0VmFsdWVTaXplID0gdGFyZ2V0VHJhY2suZ2V0VmFsdWVTaXplKCk7XG5cblx0XHRcdGlmICggdGFyZ2V0VHJhY2suY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgKSB7XG5cblx0XHRcdFx0dGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0VmFsdWVTaXplIC8gMztcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSByZWZlcmVuY2VUcmFjay50aW1lcy5sZW5ndGggLSAxO1xuXHRcdFx0bGV0IHJlZmVyZW5jZVZhbHVlO1xuXG5cdFx0XHQvLyBGaW5kIHRoZSB2YWx1ZSB0byBzdWJ0cmFjdCBvdXQgb2YgdGhlIHRyYWNrXG5cdFx0XHRpZiAoIHJlZmVyZW5jZVRpbWUgPD0gcmVmZXJlbmNlVHJhY2sudGltZXNbIDAgXSApIHtcblxuXHRcdFx0XHQvLyBSZWZlcmVuY2UgZnJhbWUgaXMgZWFybGllciB0aGFuIHRoZSBmaXJzdCBrZXlmcmFtZSwgc28ganVzdCB1c2UgdGhlIGZpcnN0IGtleWZyYW1lXG5cdFx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSByZWZlcmVuY2VPZmZzZXQ7XG5cdFx0XHRcdGNvbnN0IGVuZEluZGV4ID0gcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRyZWZlcmVuY2VWYWx1ZSA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHJlZmVyZW5jZVRyYWNrLnZhbHVlcywgc3RhcnRJbmRleCwgZW5kSW5kZXggKTtcblxuXHRcdFx0fSBlbHNlIGlmICggcmVmZXJlbmNlVGltZSA+PSByZWZlcmVuY2VUcmFjay50aW1lc1sgbGFzdEluZGV4IF0gKSB7XG5cblx0XHRcdFx0Ly8gUmVmZXJlbmNlIGZyYW1lIGlzIGFmdGVyIHRoZSBsYXN0IGtleWZyYW1lLCBzbyBqdXN0IHVzZSB0aGUgbGFzdCBrZXlmcmFtZVxuXHRcdFx0XHRjb25zdCBzdGFydEluZGV4ID0gbGFzdEluZGV4ICogcmVmZXJlbmNlVmFsdWVTaXplICsgcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7XG5cdFx0XHRcdHJlZmVyZW5jZVZhbHVlID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggcmVmZXJlbmNlVHJhY2sudmFsdWVzLCBzdGFydEluZGV4LCBlbmRJbmRleCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEludGVycG9sYXRlIHRvIHRoZSByZWZlcmVuY2UgdmFsdWVcblx0XHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudCgpO1xuXHRcdFx0XHRjb25zdCBzdGFydEluZGV4ID0gcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBlbmRJbmRleCA9IHJlZmVyZW5jZVZhbHVlU2l6ZSAtIHJlZmVyZW5jZU9mZnNldDtcblx0XHRcdFx0aW50ZXJwb2xhbnQuZXZhbHVhdGUoIHJlZmVyZW5jZVRpbWUgKTtcblx0XHRcdFx0cmVmZXJlbmNlVmFsdWUgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCBpbnRlcnBvbGFudC5yZXN1bHRCdWZmZXIsIHN0YXJ0SW5kZXgsIGVuZEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29uanVnYXRlIHRoZSBxdWF0ZXJuaW9uXG5cdFx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ3F1YXRlcm5pb24nICkge1xuXG5cdFx0XHRcdGNvbnN0IHJlZmVyZW5jZVF1YXQgPSBuZXcgUXVhdGVybmlvbigpLmZyb21BcnJheSggcmVmZXJlbmNlVmFsdWUgKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKTtcblx0XHRcdFx0cmVmZXJlbmNlUXVhdC50b0FycmF5KCByZWZlcmVuY2VWYWx1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1YnRyYWN0IHRoZSByZWZlcmVuY2UgdmFsdWUgZnJvbSBhbGwgb2YgdGhlIHRyYWNrIHZhbHVlc1xuXG5cdFx0XHRjb25zdCBudW1UaW1lcyA9IHRhcmdldFRyYWNrLnRpbWVzLmxlbmd0aDtcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG51bVRpbWVzOyArKyBqICkge1xuXG5cdFx0XHRcdGNvbnN0IHZhbHVlU3RhcnQgPSBqICogdGFyZ2V0VmFsdWVTaXplICsgdGFyZ2V0T2Zmc2V0O1xuXG5cdFx0XHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAncXVhdGVybmlvbicgKSB7XG5cblx0XHRcdFx0XHQvLyBNdWx0aXBseSB0aGUgY29uanVnYXRlIGZvciBxdWF0ZXJuaW9uIHRyYWNrIHR5cGVzXG5cdFx0XHRcdFx0UXVhdGVybmlvbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChcblx0XHRcdFx0XHRcdHRhcmdldFRyYWNrLnZhbHVlcyxcblx0XHRcdFx0XHRcdHZhbHVlU3RhcnQsXG5cdFx0XHRcdFx0XHRyZWZlcmVuY2VWYWx1ZSxcblx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHR0YXJnZXRUcmFjay52YWx1ZXMsXG5cdFx0XHRcdFx0XHR2YWx1ZVN0YXJ0XG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVFbmQgPSB0YXJnZXRWYWx1ZVNpemUgLSB0YXJnZXRPZmZzZXQgKiAyO1xuXG5cdFx0XHRcdFx0Ly8gU3VidHJhY3QgZWFjaCB2YWx1ZSBmb3IgYWxsIG90aGVyIG51bWVyaWMgdHJhY2sgdHlwZXNcblx0XHRcdFx0XHRmb3IgKCBsZXQgayA9IDA7IGsgPCB2YWx1ZUVuZDsgKysgayApIHtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0VHJhY2sudmFsdWVzWyB2YWx1ZVN0YXJ0ICsgayBdIC09IHJlZmVyZW5jZVZhbHVlWyBrIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0YXJnZXRDbGlwLmJsZW5kTW9kZSA9IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlO1xuXG5cdFx0cmV0dXJuIHRhcmdldENsaXA7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxuICpcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxuICpcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxuICpcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogXHRcdGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblxuXHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID9cblx0XHRyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XG5cdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0ZXZhbHVhdGU6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdFx0bGV0IGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cdFx0XHR0MSA9IHBwWyBpMSBdLFxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xuXG5cdFx0XHRzZWVrOiB7XG5cblx0XHRcdFx0bGV0IHJpZ2h0O1xuXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XG5cblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXG5cblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cblxuXHRcdFx0XHRcdFx0Y29uc3QgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xuXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xuXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dDEgPSBwcFsgaTEgXTtcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXG5cblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gLy8gc2Vla1xuXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcblxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcblxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xuXG5cdH0sXG5cblx0c2V0dGluZ3M6IG51bGwsIC8vIG9wdGlvbmFsLCBzdWJjbGFzcy1zcGVjaWZpYyBzZXR0aW5ncyBzdHJ1Y3R1cmVcblx0Ly8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuXG5cblx0Ly8gLS0tIFByb3RlY3RlZCBpbnRlcmZhY2VcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7fSxcblxuXHRnZXRTZXR0aW5nc186IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcblxuXHR9LFxuXG5cdGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcblxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gVGVtcGxhdGUgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzOlxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7XG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQxICovICkge1xuXG5cdFx0Ly8gZW1wdHlcblxuXHR9XG5cbn0gKTtcblxuLy8gREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cbi8qKlxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cbiAqXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cbiAqL1xuXG5mdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxuXHR0aGlzLl93ZWlnaHRQcmV2ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXRQcmV2ID0gLSAwO1xuXHR0aGlzLl93ZWlnaHROZXh0ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXROZXh0ID0gLSAwO1xuXG59XG5cbkN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3ViaWNJbnRlcnBvbGFudCxcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7XG5cblx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uICggaTEsIHQwLCB0MSApIHtcblxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdFx0bGV0IGlQcmV2ID0gaTEgLSAyLFxuXHRcdFx0aU5leHQgPSBpMSArIDEsXG5cblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xuXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xuXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApO1xuXHRcdHRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHROZXh0IC0gdDEgKTtcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7XG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlO1xuXG5cdH0sXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHRjb25zdCBzUCA9IC0gd1AgKiBwcHAgKyAyICogd1AgKiBwcCAtIHdQICogcDtcblx0XHRjb25zdCBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7XG5cdFx0Y29uc3QgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0Y29uc3Qgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7XG5cblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQxID0gaTEgKiBzdHJpZGUsXG5cdFx0XHRvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHdlaWdodDAgPSAxIC0gd2VpZ2h0MTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmdcbiAqIHRoZSBwYXJhbWV0ZXIuXG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIEtleWZyYW1lVHJhY2sge1xuXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCcgKTtcblx0XHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXG5cdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcblx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHR9XG5cblx0Ly8gU2VyaWFsaXphdGlvbiAoaW4gc3RhdGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvblxuXHQvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6XG5cblx0c3RhdGljIHRvSlNPTiggdHJhY2sgKSB7XG5cblx0XHRjb25zdCB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjtcblxuXHRcdGxldCBqc29uO1xuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0gdGhpcy50b0pTT04gKSB7XG5cblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXG5cdFx0XHRqc29uID0ge1xuXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXG5cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH1cblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9XG5cblx0c2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdGxldCBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9ICd1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAnICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgJyBrZXlmcmFtZSB0cmFjayBuYW1lZCAnICsgdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLktleWZyYW1lVHJhY2s6JywgbWVzc2FnZSApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRJbnRlcnBvbGF0aW9uKCkge1xuXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGdldFZhbHVlU2l6ZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcblxuXHR9XG5cblx0Ly8gbW92ZSBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMgaW4gdGltZVxuXHRzaGlmdCggdGltZU9mZnNldCApIHtcblxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xuXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlKCB0aW1lU2NhbGUgKSB7XG5cblx0XHRpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkge1xuXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUsIGVuZFRpbWVdLlxuXHQvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXG5cdHRyaW0oIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xuXG5cdFx0bGV0IGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHtcblxuXHRcdFx0XHR0byA9IE1hdGgubWF4KCB0bywgMSApO1xuXHRcdFx0XHRmcm9tID0gdG8gLSAxO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIGZyb20sIHRvICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIGVuc3VyZSB3ZSBkbyBub3QgZ2V0IGEgR2FyYmFnZUluR2FyYmFnZU91dCBzaXR1YXRpb24sIG1ha2Ugc3VyZSB0cmFja3MgYXJlIGF0IGxlYXN0IG1pbmltYWxseSB2aWFibGVcblx0dmFsaWRhdGUoKSB7XG5cblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xuXG5cdFx0Y29uc3QgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRpZiAoIHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLicsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGxldCBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjdXJyVGltZSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggaXNOYU4oIHZhbHVlICkgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblxuXHR9XG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZSgpIHtcblxuXHRcdC8vIHRpbWVzIG9yIHZhbHVlcyBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgdHJhY2tzLCBzbyBvdmVyd3JpdGluZyBpcyB1bnNhZmVcblx0XHRjb25zdCB0aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudGltZXMgKSxcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzICksXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0bGV0IHdyaXRlSW5kZXggPSAxO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHRsZXQga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHRjb25zdCB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdGNvbnN0IHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07XG5cblx0XHRcdC8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWVcblxuXHRcdFx0aWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkgIT09IDEgfHwgdGltZSAhPT0gdGltZXNbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHRjb25zdCByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCBsZXQgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXM7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdGNvbnN0IHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGhpcy50aW1lcywgMCApO1xuXHRcdGNvbnN0IHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCAwICk7XG5cblx0XHRjb25zdCBUeXBlZEtleWZyYW1lVHJhY2sgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXHRcdGNvbnN0IHRyYWNrID0gbmV3IFR5cGVkS2V5ZnJhbWVUcmFjayggdGhpcy5uYW1lLCB0aW1lcywgdmFsdWVzICk7XG5cblx0XHQvLyBJbnRlcnBvbGFudCBhcmd1bWVudCB0byBjb25zdHJ1Y3RvciBpcyBub3Qgc2F2ZWQsIHNvIGNvcHkgdGhlIGZhY3RvcnkgbWV0aG9kIGRpcmVjdGx5LlxuXHRcdHRyYWNrLmNyZWF0ZUludGVycG9sYW50ID0gdGhpcy5jcmVhdGVJbnRlcnBvbGFudDtcblxuXHRcdHJldHVybiB0cmFjaztcblxuXHR9XG5cbn1cblxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlTGluZWFyO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIEJvb2xlYW5LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7fVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdib29sJztcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBBcnJheTtcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyID0gdW5kZWZpbmVkO1xuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci5cbiAqL1xuY2xhc3MgQ29sb3JLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7fVxuXG5Db2xvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnY29sb3InO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIE51bWJlcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHt9XG5cbk51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnbnVtYmVyJztcblxuLyoqXG4gKiBTcGhlcmljYWwgbGluZWFyIHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC5cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApO1xuXG5cdFx0bGV0IG9mZnNldCA9IGkxICogc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkge1xuXG5cdFx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAwLCB2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH1cblxufVxuXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdxdWF0ZXJuaW9uJztcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlTGluZWFyO1xuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3NcbiAqL1xuY2xhc3MgU3RyaW5nS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge31cblxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdzdHJpbmcnO1xuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gQXJyYXk7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIgPSB1bmRlZmluZWQ7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIFZlY3RvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHt9XG5cblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAndmVjdG9yJztcblxuY2xhc3MgQW5pbWF0aW9uQ2xpcCB7XG5cblx0Y29uc3RydWN0b3IoIG5hbWUsIGR1cmF0aW9uID0gLSAxLCB0cmFja3MsIGJsZW5kTW9kZSA9IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy50cmFja3MgPSB0cmFja3M7XG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xuXG5cdFx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRcdGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7XG5cblx0XHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xuXG5cdFx0fVxuXG5cdH1cblxuXG5cdHN0YXRpYyBwYXJzZSgganNvbiApIHtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdLFxuXHRcdFx0anNvblRyYWNrcyA9IGpzb24udHJhY2tzLFxuXHRcdFx0ZnJhbWVUaW1lID0gMS4wIC8gKCBqc29uLmZwcyB8fCAxLjAgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcygganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MsIGpzb24uYmxlbmRNb2RlICk7XG5cdFx0Y2xpcC51dWlkID0ganNvbi51dWlkO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG5cdHN0YXRpYyB0b0pTT04oIGNsaXAgKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSBbXSxcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcblxuXHRcdGNvbnN0IGpzb24gPSB7XG5cblx0XHRcdCduYW1lJzogY2xpcC5uYW1lLFxuXHRcdFx0J2R1cmF0aW9uJzogY2xpcC5kdXJhdGlvbixcblx0XHRcdCd0cmFja3MnOiB0cmFja3MsXG5cdFx0XHQndXVpZCc6IGNsaXAudXVpZCxcblx0XHRcdCdibGVuZE1vZGUnOiBjbGlwLmJsZW5kTW9kZVxuXG5cdFx0fTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cblx0c3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdGNvbnN0IG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHRsZXQgdGltZXMgPSBbXTtcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0dGltZXMucHVzaChcblx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcblxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcblxuXHRcdFx0Y29uc3Qgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xuXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cmFja3MucHVzaChcblx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXG5cdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxuXHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcblx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgdGhpcyggbmFtZSwgLSAxLCB0cmFja3MgKTtcblxuXHR9XG5cblx0c3RhdGljIGZpbmRCeU5hbWUoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xuXG5cdFx0bGV0IGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XG5cblx0XHRcdGNvbnN0IG8gPSBvYmplY3RPckNsaXBBcnJheTtcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxuXHRzdGF0aWMgQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XG5cblx0XHRjb25zdCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxuXHRcdGNvbnN0IHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXHRcdFx0Y29uc3QgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XG5cblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHRjb25zdCBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHRsZXQgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xpcHMgPSBbXTtcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9XG5cblx0Ly8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0XG5cdHN0YXRpYyBwYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uLCBib25lcyApIHtcblxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTtcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcblxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Y29uc3QgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XG5cdFx0Y29uc3QgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcblx0XHRjb25zdCBibGVuZE1vZGUgPSBhbmltYXRpb24uYmxlbmRNb2RlO1xuXG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXG5cdFx0bGV0IGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XG5cblx0XHRjb25zdCBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xuXG5cdFx0Zm9yICggbGV0IGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0Y29uc3QgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHRjb25zdCBtb3JwaFRhcmdldE5hbWVzID0ge307XG5cblx0XHRcdFx0bGV0IGs7XG5cblx0XHRcdFx0Zm9yICggayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcblxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxuXHRcdFx0XHRmb3IgKCBjb25zdCBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHRjb25zdCBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcyggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MsIGJsZW5kTW9kZSApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG5cdHJlc2V0RHVyYXRpb24oKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSB0aGlzLnRyYWNrcztcblx0XHRsZXQgZHVyYXRpb24gPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyaW0oKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHZhbGlkYXRlKCkge1xuXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsaWQgPSB2YWxpZCAmJiB0aGlzLnRyYWNrc1sgaSBdLnZhbGlkYXRlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cblx0fVxuXG5cdG9wdGltaXplKCkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIHRoaXMudHJhY2tzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm5hbWUsIHRoaXMuZHVyYXRpb24sIHRyYWNrcywgdGhpcy5ibGVuZE1vZGUgKTtcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKCB0aGlzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIHR5cGVOYW1lICkge1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cblx0XHRjYXNlICdzY2FsYXInOlxuXHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0Y2FzZSAnZmxvYXQnOlxuXHRcdGNhc2UgJ251bWJlcic6XG5cdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRjYXNlICd2ZWN0b3IzJzpcblx0XHRjYXNlICd2ZWN0b3I0JzpcblxuXHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdjb2xvcic6XG5cblx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cblx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uICkge1xuXG5cdGlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTtcblxuXHR9XG5cblx0Y29uc3QgdHJhY2tUeXBlID0gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0aWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRjb25zdCB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcblxuXHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcblxuXHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcblxuXHR9XG5cblx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxuXHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcblxuXHR9XG5cbn1cblxuY29uc3QgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdGxldCBpc0xvYWRpbmcgPSBmYWxzZTtcblx0bGV0IGl0ZW1zTG9hZGVkID0gMDtcblx0bGV0IGl0ZW1zVG90YWwgPSAwO1xuXHRsZXQgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7XG5cdGNvbnN0IGhhbmRsZXJzID0gW107XG5cblx0Ly8gUmVmZXIgdG8gIzU2ODkgZm9yIHRoZSByZWFzb24gd2h5IHdlIGRvbid0IHNldCAub25TdGFydFxuXHQvLyBpbiB0aGUgY29uc3RydWN0b3JcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fTtcblxuXHR0aGlzLmFkZEhhbmRsZXIgPSBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XG5cblx0XHRoYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdHRoaXMucmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uICggcmVnZXggKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoIHJlZ2V4ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdGhhbmRsZXJzLnNwbGljZSggaW5kZXgsIDIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRIYW5kbGVyID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHRjb25zdCByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHRjb25zdCBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcblxuXHRcdFx0aWYgKCByZWdleC5nbG9iYWwgKSByZWdleC5sYXN0SW5kZXggPSAwOyAvLyBzZWUgIzE3OTIwXG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH07XG5cbn1cblxuY29uc3QgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCk7XG5cbmZ1bmN0aW9uIExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG5cdHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cdHRoaXMucGF0aCA9ICcnO1xuXHR0aGlzLnJlc291cmNlUGF0aCA9ICcnO1xuXHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB7fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCAvKiB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciAqLyApIHt9LFxuXG5cdGxvYWRBc3luYzogZnVuY3Rpb24gKCB1cmwsIG9uUHJvZ3Jlc3MgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xuXG5cdFx0XHRzY29wZS5sb2FkKCB1cmwsIHJlc29sdmUsIG9uUHJvZ3Jlc3MsIHJlamVjdCApO1xuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICggLyogZGF0YSAqLyApIHt9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdHRoaXMucGF0aCA9IHBhdGg7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNvdXJjZVBhdGg6IGZ1bmN0aW9uICggcmVzb3VyY2VQYXRoICkge1xuXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiAoIHJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSByZXF1ZXN0SGVhZGVyO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBsb2FkaW5nID0ge307XG5cbmZ1bmN0aW9uIEZpbGVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxufVxuXG5GaWxlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBGaWxlTG9hZGVyLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiByZXF1ZXN0IGlzIGR1cGxpY2F0ZVxuXG5cdFx0aWYgKCBsb2FkaW5nWyB1cmwgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZGF0YTogVVJJXG5cdFx0Y29uc3QgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0Y29uc3QgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblx0XHRsZXQgcmVxdWVzdDtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdGNvbnN0IG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAxIF07XG5cdFx0XHRjb25zdCBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXG5cdFx0XHRsZXQgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXHRcdFx0ZGF0YSA9IGRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IGF0b2IoIGRhdGEgKTtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRsZXQgcmVzcG9uc2U7XG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0Y29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KCBkYXRhLmxlbmd0aCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IEJsb2IoIFsgdmlldy5idWZmZXIgXSwgeyB0eXBlOiBtaW1lVHlwZSB9ICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSB2aWV3LmJ1ZmZlcjtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcblxuXHRcdFx0XHRcdFx0Y29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBtaW1lVHlwZSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2pzb24nOlxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OiAvLyAndGV4dCcgb3Igb3RoZXJcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBkYXRhO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2sgbGlrZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBldmVudCBkaXNwYXRjaGluZyBkb2VzXG5cdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzXG5cblx0XHRcdGxvYWRpbmdbIHVybCBdID0gW107XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuXHRcdFx0cmVxdWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSBjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcblxuXHRcdFx0XHRcdC8vIEFkZCB0byBjYWNoZSBvbmx5IG9uIEhUVFAgc3VjY2Vzcywgc28gdGhhdCB3ZSBkbyBub3QgY2FjaGVcblx0XHRcdFx0XHQvLyBlcnJvciByZXNwb25zZSBib2RpZXMgYXMgcHJvcGVyIHJlc3BvbnNlcyB0byByZXF1ZXN0cy5cblx0XHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdhYm9ydCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTtcblx0XHRcdGlmICggdGhpcy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCApIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdGlmICggcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlICkgcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlKCB0aGlzLm1pbWVUeXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLm1pbWVUeXBlIDogJ3RleHQvcGxhaW4nICk7XG5cblx0XHRcdGZvciAoIGNvbnN0IGhlYWRlciBpbiB0aGlzLnJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LnNlbmQoIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXG5cdH0sXG5cblx0c2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBBbmltYXRpb25Mb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLilcbiAqXG4gKiBTdWIgY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCB0aGUgcGFyc2UoKSBtZXRob2Qgd2hpY2ggd2lsbCBiZSB1c2VkIGluIGxvYWQoKS5cbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgaW1hZ2VzID0gW107XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XG5cblx0XHRsZXQgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzOiBbXSB9O1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBJbWFnZUxvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRmdW5jdGlvbiBvbkltYWdlTG9hZCgpIHtcblxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VFcnJvciggZXZlbnQgKSB7XG5cblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cbn1cblxuY2xhc3MgQ3ViZVRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsZXQgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcblxuXHRcdFx0XHRsb2FkZWQgKys7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICpcbiAqIFN1YiBjbGFzc2VzIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBwYXJzZSgpIG1ldGhvZCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gbG9hZCgpLlxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERhdGFUZXh0dXJlTG9hZGVyLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdGNvbnN0IHRleERhdGEgPSBzY29wZS5wYXJzZSggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleERhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdGV4RGF0YS5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdGV4RGF0YS53cmFwUyAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdGV4RGF0YS53cmFwVCAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdGV4RGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHRleERhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmVuY29kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5lbmNvZGluZyA9IHRleERhdGEuZW5jb2Rpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5mbGlwWSA9IHRleERhdGEuZmxpcFk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLnR5cGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOyAvLyBwcmVzdW1hYmx5Li4uXG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcENvdW50ID09PSAxICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4RGF0YS5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleERhdGEuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cblRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmVMb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2U7XG5cblx0XHRcdC8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLlxuXHRcdFx0Y29uc3QgaXNKUEVHID0gdXJsLnNlYXJjaCggL1xcLmpwZT9nKCR8XFw/KS9pICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0LlxuICpcbiAqIFNvbWUgY29tbW9uIG9mIGN1cnZlIG1ldGhvZHM6XG4gKiAuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKVxuICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKClcbiAqIC5nZXRMZW5ndGgoKVxuICogLnVwZGF0ZUFyY0xlbmd0aHMoKVxuICpcbiAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6XG4gKlxuICogLS0gMkQgY3VydmVzIC0tXG4gKiBUSFJFRS5BcmNDdXJ2ZVxuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuRWxsaXBzZUN1cnZlXG4gKiBUSFJFRS5MaW5lQ3VydmVcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlXG4gKiBUSFJFRS5TcGxpbmVDdXJ2ZVxuICpcbiAqIC0tIDNEIGN1cnZlcyAtLVxuICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlM1xuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTNcbiAqIFRIUkVFLkxpbmVDdXJ2ZTNcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlM1xuICpcbiAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguXG4gKlxuICoqL1xuXG5mdW5jdGlvbiBDdXJ2ZSgpIHtcblxuXHR0aGlzLnR5cGUgPSAnQ3VydmUnO1xuXG5cdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlLnByb3RvdHlwZSwge1xuXG5cdC8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRlIGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlc1xuXHQvL1x0LSB0IFswIC4uIDFdXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggLyogdCwgb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLicgKTtcblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aFxuXHQvLyAtIHUgWzAgLi4gMV1cblxuXHRnZXRQb2ludEF0OiBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgPSA1ICkge1xuXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1IClcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zID0gNSApIHtcblxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuZ3Roc1sgbGVuZ3Rocy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBHZXQgbGlzdCBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3Roc1xuXG5cdGdldExlbmd0aHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0aWYgKCB0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJlxuXHRcdFx0KCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAmJlxuXHRcdFx0ISB0aGlzLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHRjb25zdCBjYWNoZSA9IFtdO1xuXHRcdGxldCBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xuXHRcdGxldCBzdW0gPSAwO1xuXG5cdFx0Y2FjaGUucHVzaCggMCApO1xuXG5cdFx0Zm9yICggbGV0IHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHtcblxuXHRcdFx0Y3VycmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTtcblx0XHRcdHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3QgKTtcblx0XHRcdGNhY2hlLnB1c2goIHN1bSApO1xuXHRcdFx0bGFzdCA9IGN1cnJlbnQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xuXG5cdFx0cmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4gdGhlIGxhc3QgZWxlbWVudC5cblxuXHR9LFxuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudFxuXG5cdGdldFV0b1RtYXBwaW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkge1xuXG5cdFx0Y29uc3QgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdFx0bGV0IGkgPSAwO1xuXHRcdGNvbnN0IGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHRsZXQgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdGxldCBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHRjb25zdCBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07XG5cdFx0Y29uc3QgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xuXG5cdFx0Y29uc3Qgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdGNvbnN0IHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0Ly8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxuXG5cdFx0Y29uc3QgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcblxuXHRcdHJldHVybiB0O1xuXG5cdH0sXG5cblx0Ly8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdFxuXHQvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXG5cdC8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XG5cdC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cblxuXHRnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZGVsdGEgPSAwLjAwMDE7XG5cdFx0bGV0IHQxID0gdCAtIGRlbHRhO1xuXHRcdGxldCB0MiA9IHQgKyBkZWx0YTtcblxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcblxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xuXG5cdFx0Y29uc3QgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHRjb25zdCBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApO1xuXG5cdFx0Y29uc3QgdGFuZ2VudCA9IG9wdGlvbmFsVGFyZ2V0IHx8ICggKCBwdDEuaXNWZWN0b3IyICkgPyBuZXcgVmVjdG9yMigpIDogbmV3IFZlY3RvcjMoKSApO1xuXG5cdFx0dGFuZ2VudC5jb3B5KCBwdDIgKS5zdWIoIHB0MSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRhbmdlbnQ7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRjb21wdXRlRnJlbmV0RnJhbWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXG5cblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Y29uc3QgdGFuZ2VudHMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgYmlub3JtYWxzID0gW107XG5cblx0XHRjb25zdCB2ZWMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgdSA9IGkgLyBzZWdtZW50cztcblxuXHRcdFx0dGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KCB1LCBuZXcgVmVjdG9yMygpICk7XG5cdFx0XHR0YW5nZW50c1sgaSBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmaXJzdCB0YW5nZW50IHZlY3Rvcixcblx0XHQvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnRcblxuXHRcdG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Ymlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdGNvbnN0IHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xuXHRcdGNvbnN0IHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdGNvbnN0IHR6ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueiApO1xuXG5cdFx0aWYgKCB0eCA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR4O1xuXHRcdFx0bm9ybWFsLnNldCggMSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eSA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR5O1xuXHRcdFx0bm9ybWFsLnNldCggMCwgMSwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eiA8PSBtaW4gKSB7XG5cblx0XHRcdG5vcm1hbC5zZXQoIDAsIDAsIDEgKTtcblxuXHRcdH1cblxuXHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0bm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgdmVjICk7XG5cdFx0Ymlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTtcblxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgc2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0Y29uc3QgdGhldGEgPSBNYXRoLmFjb3MoIE1hdGhVdGlscy5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHRsZXQgdGhldGEgPSBNYXRoLmFjb3MoIE1hdGhVdGlscy5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcblx0XHR9O1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIEVsbGlwc2VDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggYVggPSAwLCBhWSA9IDAsIHhSYWRpdXMgPSAxLCB5UmFkaXVzID0gMSwgYVN0YXJ0QW5nbGUgPSAwLCBhRW5kQW5nbGUgPSBNYXRoLlBJICogMiwgYUNsb2Nrd2lzZSA9IGZhbHNlLCBhUm90YXRpb24gPSAwICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdFx0dGhpcy5hWCA9IGFYO1xuXHRcdHRoaXMuYVkgPSBhWTtcblxuXHRcdHRoaXMueFJhZGl1cyA9IHhSYWRpdXM7XG5cdFx0dGhpcy55UmFkaXVzID0geVJhZGl1cztcblxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZTtcblx0XHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZTtcblxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2U7XG5cblx0XHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Y29uc3QgdHdvUGkgPSBNYXRoLlBJICogMjtcblx0XHRsZXQgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0XHRjb25zdCBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRlbHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OO1xuXG5cdFx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpO1xuXG5cdFx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gMDtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdFx0aWYgKCBkZWx0YUFuZ2xlID09PSB0d29QaSApIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0XHRsZXQgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHRsZXQgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHRcdGNvbnN0IGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApO1xuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHRcdGNvbnN0IHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0XHRjb25zdCB0eSA9IHkgLSB0aGlzLmFZO1xuXG5cdFx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0XHR5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMuYVk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5hWCA9IHNvdXJjZS5hWDtcblx0XHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdFx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XG5cdFx0dGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7XG5cblx0XHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHRcdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcblxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IHNvdXJjZS5hQ2xvY2t3aXNlO1xuXG5cdFx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEuYVggPSB0aGlzLmFYO1xuXHRcdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdFx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xuXHRcdGRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1cztcblxuXHRcdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRcdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XG5cblx0XHRkYXRhLmFDbG9ja3dpc2UgPSB0aGlzLmFDbG9ja3dpc2U7XG5cblx0XHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMuYVggPSBqc29uLmFYO1xuXHRcdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdFx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xuXHRcdHRoaXMueVJhZGl1cyA9IGpzb24ueVJhZGl1cztcblxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHRcdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XG5cblx0XHR0aGlzLmFDbG9ja3dpc2UgPSBqc29uLmFDbG9ja3dpc2U7XG5cblx0XHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBBcmNDdXJ2ZSBleHRlbmRzIEVsbGlwc2VDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHN1cGVyKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdBcmNDdXJ2ZSc7XG5cblx0fVxuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZS5pc0FyY0N1cnZlID0gdHJ1ZTtcblxuLyoqXG4gKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xuICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXG4gKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxuICpcbiAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxuICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxuICovXG5cblxuLypcbkJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cbiAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXG4gLSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cblxuVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxuYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXG53aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXG4qL1xuXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XG5cblx0bGV0IGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuXHQvKlxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xuXHQgKiBzdWNoIHRoYXRcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxuXHQgKiAgYW5kXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xuXG5cdFx0YzAgPSB4MDtcblx0XHRjMSA9IHQwO1xuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xuXG5cdFx0fSxcblxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxuXHRcdFx0bGV0IHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcblx0XHRcdGxldCB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XG5cblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxuXHRcdFx0dDEgKj0gZHQxO1xuXHRcdFx0dDIgKj0gZHQxO1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xuXG5cdFx0fSxcblxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdFx0Y29uc3QgdDIgPSB0ICogdDtcblx0XHRcdGNvbnN0IHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG5jb25zdCB0bXAgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgcHggPSBuZXcgQ3ViaWNQb2x5KCksIHB5ID0gbmV3IEN1YmljUG9seSgpLCBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuY2xhc3MgQ2F0bXVsbFJvbUN1cnZlMyBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggcG9pbnRzID0gW10sIGNsb3NlZCA9IGZhbHNlLCBjdXJ2ZVR5cGUgPSAnY2VudHJpcGV0YWwnLCB0ZW5zaW9uID0gMC41ICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJztcblxuXHRcdHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXHRcdHRoaXMuY2xvc2VkID0gY2xvc2VkO1xuXHRcdHRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlO1xuXHRcdHRoaXMudGVuc2lvbiA9IHRlbnNpb247XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0Y29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdFx0Y29uc3QgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0XHRjb25zdCBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XG5cdFx0bGV0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHRcdGxldCB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0XHRpZiAoIHRoaXMuY2xvc2VkICkge1xuXG5cdFx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0XHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xuXG5cdFx0XHRpbnRQb2ludCA9IGwgLSAyO1xuXHRcdFx0d2VpZ2h0ID0gMTtcblxuXHRcdH1cblxuXHRcdGxldCBwMCwgcDM7IC8vIDQgcG9pbnRzIChwMSAmIHAyIGRlZmluZWQgYmVsb3cpXG5cblx0XHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcblxuXHRcdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxuXHRcdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRcdHAwID0gdG1wO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRcdGNvbnN0IHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xuXG5cdFx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcblx0XHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0XHRwMyA9IHRtcDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cblx0XHRcdGNvbnN0IHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdFx0bGV0IGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XG5cdFx0XHRsZXQgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcblx0XHRcdGxldCBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xuXHRcdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xuXHRcdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xuXG5cdFx0XHRweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xuXG5cdFx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7XG5cdFx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uICk7XG5cblx0XHR9XG5cblx0XHRwb2ludC5zZXQoXG5cdFx0XHRweC5jYWxjKCB3ZWlnaHQgKSxcblx0XHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdFx0cHouY2FsYyggd2VpZ2h0IClcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7XG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHRcdHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHRcdH1cblxuXHRcdGRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7XG5cdFx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0XHRkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkO1xuXHRcdHRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7XG5cdFx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMyA9IHRydWU7XG5cbi8qKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JcdTAwRTl6aWVyX2N1cnZlXG4gKi9cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0Y29uc3QgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0Y29uc3QgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0Y29uc3QgdDIgPSB0ICogdDtcblx0Y29uc3QgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdGNvbnN0IGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdGNvbnN0IGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRjb25zdCBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuY2xhc3MgQ3ViaWNCZXppZXJDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMigpLCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSwgdjMgPSBuZXcgVmVjdG9yMigpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlJztcblxuXHRcdHRoaXMudjAgPSB2MDtcblx0XHR0aGlzLnYxID0gdjE7XG5cdFx0dGhpcy52MiA9IHYyO1xuXHRcdHRoaXMudjMgPSB2MztcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0XHRwb2ludC5zZXQoXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcG9pbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdFx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XG5cblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdFx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBDdWJpY0JlemllckN1cnZlMyBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMygpLCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSwgdjMgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2Mjtcblx0XHR0aGlzLnYzID0gdjM7XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55ICksXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdFx0KTtcblxuXHRcdHJldHVybiBwb2ludDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0XHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRcdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0XHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuY2xhc3MgTGluZUN1cnZlIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlJztcblxuXHRcdHRoaXMudjEgPSB2MTtcblx0XHR0aGlzLnYyID0gdjI7XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHQvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblx0Z2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG5cblx0Z2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0YW5nZW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRcdHRhbmdlbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRhbmdlbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBMaW5lQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XG5cdFx0dGhpcy5pc0xpbmVDdXJ2ZTMgPSB0cnVlO1xuXG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblx0Ly8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cdGdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIFF1YWRyYXRpY0JlemllckN1cnZlIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IyKCksIHYxID0gbmV3IFZlY3RvcjIoKSwgdjIgPSBuZXcgVmVjdG9yMigpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZSc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcG9pbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjMoKSwgdjEgPSBuZXcgVmVjdG9yMygpLCB2MiA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlMyc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApXG5cdFx0KTtcblxuXHRcdHJldHVybiBwb2ludDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XG5cblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuY2xhc3MgU3BsaW5lQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIHBvaW50cyA9IFtdICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdTcGxpbmVDdXJ2ZSc7XG5cblx0XHR0aGlzLnBvaW50cyA9IHBvaW50cztcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0XHRjb25zdCBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcblxuXHRcdGNvbnN0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHRcdGNvbnN0IHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHRcdGNvbnN0IHAwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50IF07XG5cdFx0Y29uc3QgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHRcdGNvbnN0IHAzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcblxuXHRcdHBvaW50LnNldChcblx0XHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueCwgcDEueCwgcDIueCwgcDMueCApLFxuXHRcdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC55LCBwMS55LCBwMi55LCBwMy55IClcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxudmFyIEN1cnZlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRBcmNDdXJ2ZTogQXJjQ3VydmUsXG5cdENhdG11bGxSb21DdXJ2ZTM6IENhdG11bGxSb21DdXJ2ZTMsXG5cdEN1YmljQmV6aWVyQ3VydmU6IEN1YmljQmV6aWVyQ3VydmUsXG5cdEN1YmljQmV6aWVyQ3VydmUzOiBDdWJpY0JlemllckN1cnZlMyxcblx0RWxsaXBzZUN1cnZlOiBFbGxpcHNlQ3VydmUsXG5cdExpbmVDdXJ2ZTogTGluZUN1cnZlLFxuXHRMaW5lQ3VydmUzOiBMaW5lQ3VydmUzLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTogUXVhZHJhdGljQmV6aWVyQ3VydmUsXG5cdFF1YWRyYXRpY0JlemllckN1cnZlMzogUXVhZHJhdGljQmV6aWVyQ3VydmUzLFxuXHRTcGxpbmVDdXJ2ZTogU3BsaW5lQ3VydmVcbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5jbGFzcyBDdXJ2ZVBhdGggZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXHRcdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cblx0fVxuXG5cdGFkZCggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH1cblxuXHRjbG9zZVBhdGgoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHRjb25zdCBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xuXHRcdGNvbnN0IGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xuXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgTGluZUN1cnZlKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50KCB0ICkge1xuXG5cdFx0Y29uc3QgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdGNvbnN0IGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0bGV0IGkgPSAwO1xuXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXG5cblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xuXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcblx0XHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcblx0XHRcdFx0Y29uc3QgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aSArKztcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXG5cblx0fVxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGgoKSB7XG5cblx0XHRjb25zdCBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fVxuXG5cdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cblx0dXBkYXRlQXJjTGVuZ3RocygpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH1cblxuXHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cblx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cblxuXHRnZXRDdXJ2ZUxlbmd0aHMoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0Y29uc3QgbGVuZ3RocyA9IFtdO1xuXHRcdGxldCBzdW1zID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0cmV0dXJuIGxlbmd0aHM7XG5cblx0fVxuXG5cdGdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zID0gNDAgKSB7XG5cblx0XHRjb25zdCBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9XG5cblx0Z2V0UG9pbnRzKCBkaXZpc2lvbnMgPSAxMiApIHtcblxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xuXHRcdGxldCBsYXN0O1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHRjb25zdCByZXNvbHV0aW9uID0gKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSApID8gZGl2aXNpb25zICogMlxuXHRcdFx0XHQ6ICggY3VydmUgJiYgKCBjdXJ2ZS5pc0xpbmVDdXJ2ZSB8fCBjdXJ2ZS5pc0xpbmVDdXJ2ZTMgKSApID8gMVxuXHRcdFx0XHRcdDogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlICkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ6IGRpdmlzaW9ucztcblxuXHRcdFx0Y29uc3QgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBwdHNbIGogXTtcblxuXHRcdFx0XHRpZiAoIGxhc3QgJiYgbGFzdC5lcXVhbHMoIHBvaW50ICkgKSBjb250aW51ZTsgLy8gZW5zdXJlcyBubyBjb25zZWN1dGl2ZSBwb2ludHMgYXJlIGR1cGxpY2F0ZXNcblxuXHRcdFx0XHRwb2ludHMucHVzaCggcG9pbnQgKTtcblx0XHRcdFx0bGFzdCA9IHBvaW50O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICEgcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGN1cnZlID0gc291cmNlLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXHRcdFx0ZGF0YS5jdXJ2ZXMucHVzaCggY3VydmUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IGpzb24uYXV0b0Nsb3NlO1xuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IGpzb24uY3VydmVzWyBpIF07XG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBjdXJ2ZS50eXBlIF0oKS5mcm9tSlNPTiggY3VydmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIFBhdGggZXh0ZW5kcyBDdXJ2ZVBhdGgge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdQYXRoJztcblxuXHRcdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGlmICggcG9pbnRzICkge1xuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bW92ZVRvKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bGluZVRvKCB4LCB5ICkge1xuXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNwbGluZVRocnUoIHB0cyAvKkFycmF5IG9mIFZlY3RvciovICkge1xuXG5cdFx0Y29uc3QgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdGNvbnN0IHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHRjb25zdCB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhYnNhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZWxsaXBzZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHRjb25zdCB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0Y29uc3QgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhYnNlbGxpcHNlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cblx0XHRcdGNvbnN0IGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApO1xuXG5cdFx0XHRpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBvaW50ICkgKSB7XG5cblx0XHRcdFx0dGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHRjb25zdCBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggc291cmNlLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSgganNvbi5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5jbGFzcyBTaGFwZSBleHRlbmRzIFBhdGgge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XG5cblx0XHRzdXBlciggcG9pbnRzICk7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU2hhcGUnO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdH1cblxuXHRnZXRQb2ludHNIb2xlcyggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc3QgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH1cblxuXHQvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcblxuXHRleHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgaG9sZSA9IHRoaXMuaG9sZXNbIGkgXTtcblx0XHRcdGRhdGEuaG9sZXMucHVzaCggaG9sZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGhvbGUgPSBqc29uLmhvbGVzWyBpIF07XG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoKCkuZnJvbUpTT04oIGhvbGUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIExpZ2h0IGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0XHR0aGlzLmludGVuc2l0eSA9IGludGVuc2l0eTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cdFx0ZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuZ3JvdW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xuXHRcdGlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuXHRcdGlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5O1xuXHRcdGlmICggdGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhO1xuXG5cdFx0aWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuTGlnaHQucHJvdG90eXBlLmlzTGlnaHQgPSB0cnVlO1xuXG5jbGFzcyBIZW1pc3BoZXJlTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdFx0c3VwZXIoIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy5ncm91bmRDb2xvciA9IG5ldyBDb2xvciggZ3JvdW5kQ29sb3IgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmdyb3VuZENvbG9yLmNvcHkoIHNvdXJjZS5ncm91bmRDb2xvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHQgPSB0cnVlO1xuXG5jb25zdCBfcHJvalNjcmVlbk1hdHJpeCQxID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2xvb2tUYXJnZXQkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCBjYW1lcmEgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblxuXHRcdHRoaXMuYmlhcyA9IDA7XG5cdFx0dGhpcy5ub3JtYWxCaWFzID0gMDtcblx0XHR0aGlzLnJhZGl1cyA9IDE7XG5cblx0XHR0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblx0XHR0aGlzLm1hcFBhc3MgPSBudWxsO1xuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5fZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XG5cdFx0dGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHRcdHRoaXMuX3ZpZXdwb3J0Q291bnQgPSAxO1xuXG5cdFx0dGhpcy5fdmlld3BvcnRzID0gW1xuXG5cdFx0XHRuZXcgVmVjdG9yNCggMCwgMCwgMSwgMSApXG5cblx0XHRdO1xuXG5cdH1cblxuXHRnZXRWaWV3cG9ydENvdW50KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7XG5cblx0fVxuXG5cdGdldEZydXN0dW0oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJ1c3R1bTtcblxuXHR9XG5cblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0ICkge1xuXG5cdFx0Y29uc3Qgc2hhZG93Q2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cdFx0Y29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7XG5cblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkJDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkJDEgKTtcblxuXHRcdF9sb29rVGFyZ2V0JDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCQxICk7XG5cdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeCQxLm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXgkMSApO1xuXG5cdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdDAuNSwgMC4wLCAwLjAsIDAuNSxcblx0XHRcdDAuMCwgMC41LCAwLjAsIDAuNSxcblx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdDAuMCwgMC4wLCAwLjAsIDEuMFxuXHRcdCk7XG5cblx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0fVxuXG5cdGdldFZpZXdwb3J0KCB2aWV3cG9ydEluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1sgdmlld3BvcnRJbmRleCBdO1xuXG5cdH1cblxuXHRnZXRGcmFtZUV4dGVudHMoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTtcblxuXHRcdHRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzO1xuXHRcdHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1cztcblxuXHRcdHRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBvYmplY3QgPSB7fTtcblxuXHRcdGlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7XG5cdFx0aWYgKCB0aGlzLm5vcm1hbEJpYXMgIT09IDAgKSBvYmplY3Qubm9ybWFsQmlhcyA9IHRoaXMubm9ybWFsQmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn1cblxuY2xhc3MgU3BvdExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggNTAsIDEsIDAuNSwgNTAwICkgKTtcblxuXHRcdHRoaXMuZm9jdXMgPSAxO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaWNlcyggbGlnaHQgKSB7XG5cblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuXHRcdGNvbnN0IGZvdiA9IE1hdGhVdGlscy5SQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlICogdGhpcy5mb2N1cztcblx0XHRjb25zdCBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0O1xuXHRcdGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0fVxuXG5cdFx0c3VwZXIudXBkYXRlTWF0cmljZXMoIGxpZ2h0ICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5TcG90TGlnaHRTaGFkb3cucHJvdG90eXBlLmlzU3BvdExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSA9IDAsIGFuZ2xlID0gTWF0aC5QSSAvIDMsIHBlbnVtYnJhID0gMCwgZGVjYXkgPSAxICkge1xuXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gYW5nbGU7XG5cdFx0dGhpcy5wZW51bWJyYSA9IHBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTsgLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XG5cblx0fVxuXG5cdGdldCBwb3dlcigpIHtcblxuXHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcblxuXHR9XG5cblx0c2V0IHBvd2VyKCBwb3dlciApIHtcblxuXHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU3BvdExpZ2h0LnByb3RvdHlwZS5pc1Nwb3RMaWdodCA9IHRydWU7XG5cbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9sb29rVGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBQb2ludExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxuXHRcdHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBWZWN0b3IyKCA0LCAyICk7XG5cblx0XHR0aGlzLl92aWV3cG9ydENvdW50ID0gNjtcblxuXHRcdHRoaXMuX3ZpZXdwb3J0cyA9IFtcblx0XHRcdC8vIFRoZXNlIHZpZXdwb3J0cyBtYXAgYSBjdWJlLW1hcCBvbnRvIGEgMkQgdGV4dHVyZSB3aXRoIHRoZVxuXHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0Ly9cblx0XHRcdC8vICB4elhaXG5cdFx0XHQvLyAgIHkgWVxuXHRcdFx0Ly9cblx0XHRcdC8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdC8vIHkgLSBOZWdhdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cblxuXHRcdFx0Ly8gcG9zaXRpdmUgWFxuXHRcdFx0bmV3IFZlY3RvcjQoIDIsIDEsIDEsIDEgKSxcblx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdG5ldyBWZWN0b3I0KCAwLCAxLCAxLCAxICksXG5cdFx0XHQvLyBwb3NpdGl2ZSBaXG5cdFx0XHRuZXcgVmVjdG9yNCggMywgMSwgMSwgMSApLFxuXHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0bmV3IFZlY3RvcjQoIDEsIDEsIDEsIDEgKSxcblx0XHRcdC8vIHBvc2l0aXZlIFlcblx0XHRcdG5ldyBWZWN0b3I0KCAzLCAwLCAxLCAxICksXG5cdFx0XHQvLyBuZWdhdGl2ZSBZXG5cdFx0XHRuZXcgVmVjdG9yNCggMSwgMCwgMSwgMSApXG5cdFx0XTtcblxuXHRcdHRoaXMuX2N1YmVEaXJlY3Rpb25zID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFxuXHRcdFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwIClcblx0XHRdO1xuXG5cdFx0dGhpcy5fY3ViZVVwcyA9IFtcblx0XHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXG5cdFx0XTtcblxuXHR9XG5cblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2aWV3cG9ydEluZGV4ID0gMCApIHtcblxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuXHRcdGNvbnN0IHNoYWRvd01hdHJpeCA9IHRoaXMubWF0cml4O1xuXG5cdFx0Y29uc3QgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdH1cblxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRfbG9va1RhcmdldC5jb3B5KCBjYW1lcmEucG9zaXRpb24gKTtcblx0XHRfbG9va1RhcmdldC5hZGQoIHRoaXMuX2N1YmVEaXJlY3Rpb25zWyB2aWV3cG9ydEluZGV4IF0gKTtcblx0XHRjYW1lcmEudXAuY29weSggdGhpcy5fY3ViZVVwc1sgdmlld3BvcnRJbmRleCBdICk7XG5cdFx0Y2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHR9XG5cbn1cblxuUG9pbnRMaWdodFNoYWRvdy5wcm90b3R5cGUuaXNQb2ludExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UgPSAwLCBkZWNheSA9IDEgKSB7XG5cblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTsgLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgUG9pbnRMaWdodFNoYWRvdygpO1xuXG5cdH1cblxuXHRnZXQgcG93ZXIoKSB7XG5cblx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xuXG5cdH1cblxuXHRzZXQgcG93ZXIoIHBvd2VyICkge1xuXG5cdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblBvaW50TGlnaHQucHJvdG90eXBlLmlzUG9pbnRMaWdodCA9IHRydWU7XG5cbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cblx0Y29uc3RydWN0b3IoIGxlZnQgPSAtIDEsIHJpZ2h0ID0gMSwgdG9wID0gMSwgYm90dG9tID0gLSAxLCBuZWFyID0gMC4xLCBmYXIgPSAyMDAwICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdFx0dGhpcy56b29tID0gMTtcblx0XHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdFx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdFx0dGhpcy50b3AgPSB0b3A7XG5cdFx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xuXHRcdHRoaXMuZmFyID0gZmFyO1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdGNsZWFyVmlld09mZnNldCgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XG5cblx0XHRjb25zdCBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0Y29uc3QgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdGNvbnN0IGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdGNvbnN0IGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkgLyAyO1xuXG5cdFx0bGV0IGxlZnQgPSBjeCAtIGR4O1xuXHRcdGxldCByaWdodCA9IGN4ICsgZHg7XG5cdFx0bGV0IHRvcCA9IGN5ICsgZHk7XG5cdFx0bGV0IGJvdHRvbSA9IGN5IC0gZHk7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0Y29uc3Qgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcuZnVsbFdpZHRoIC8gdGhpcy56b29tO1xuXHRcdFx0Y29uc3Qgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAvIHRoaXMuem9vbTtcblxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiB0aGlzLnZpZXcub2Zmc2V0WDtcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHRvcCAtPSBzY2FsZUggKiB0aGlzLnZpZXcub2Zmc2V0WTtcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXHRcdGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7XG5cdFx0ZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0O1xuXHRcdGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wO1xuXHRcdGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tO1xuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuT3J0aG9ncmFwaGljQ2FtZXJhLnByb3RvdHlwZS5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9IHRydWU7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlciggbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxuXHR9XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlLmlzRGlyZWN0aW9uYWxMaWdodCA9IHRydWU7XG5cbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQW1iaWVudExpZ2h0JztcblxuXHR9XG5cbn1cblxuQW1iaWVudExpZ2h0LnByb3RvdHlwZS5pc0FtYmllbnRMaWdodCA9IHRydWU7XG5cbmNsYXNzIFJlY3RBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwICkge1xuXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdSZWN0QXJlYUxpZ2h0JztcblxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuUmVjdEFyZWFMaWdodC5wcm90b3R5cGUuaXNSZWN0QXJlYUxpZ2h0ID0gdHJ1ZTtcblxuLyoqXG4gKiBQcmltYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG4gKlxuICogU2Vjb25kYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly93d3cucHBzbG9hbi5vcmcvcHVibGljYXRpb25zL1N0dXBpZFNIMzYucGRmXG4gKi9cblxuLy8gMy1iYW5kIFNIIGRlZmluZWQgYnkgOSBjb2VmZmljaWVudHNcblxuY2xhc3MgU3BoZXJpY2FsSGFybW9uaWNzMyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLmNvZWZmaWNpZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHMucHVzaCggbmV3IFZlY3RvcjMoKSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRzZXQoIGNvZWZmaWNpZW50cyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uY29weSggY29lZmZpY2llbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR6ZXJvKCkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHQvLyBnZXQgdGhlIHJhZGlhbmNlIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG5vcm1hbFxuXHQvLyB0YXJnZXQgaXMgYSBWZWN0b3IzXG5cdGdldEF0KCBub3JtYWwsIHRhcmdldCApIHtcblxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXG5cblx0XHRjb25zdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xuXG5cdFx0Y29uc3QgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuMjgyMDk1ICk7XG5cblx0XHQvLyBiYW5kIDFcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMSBdLCAwLjQ4ODYwMyAqIHkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMiBdLCAwLjQ4ODYwMyAqIHogKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMyBdLCAwLjQ4ODYwMyAqIHggKTtcblxuXHRcdC8vIGJhbmQgMlxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA0IF0sIDEuMDkyNTQ4ICogKCB4ICogeSApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDUgXSwgMS4wOTI1NDggKiAoIHkgKiB6ICkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjMxNTM5MiAqICggMy4wICogeiAqIHogLSAxLjAgKSApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDEuMDkyNTQ4ICogKCB4ICogeiApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDggXSwgMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0Ly8gZ2V0IHRoZSBpcnJhZGlhbmNlIChyYWRpYW5jZSBjb252b2x2ZWQgd2l0aCBjb3NpbmUgbG9iZSkgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbm9ybWFsXG5cdC8vIHRhcmdldCBpcyBhIFZlY3RvcjNcblx0Ly8gaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG5cdGdldElycmFkaWFuY2VBdCggbm9ybWFsLCB0YXJnZXQgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcblxuXHRcdGNvbnN0IGNvZWZmID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHQvLyBiYW5kIDBcblx0XHR0YXJnZXQuY29weSggY29lZmZbIDAgXSApLm11bHRpcGx5U2NhbGFyKCAwLjg4NjIyNyApOyAvLyBcdTAzQzAgKiAwLjI4MjA5NVxuXG5cdFx0Ly8gYmFuZCAxXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDEgXSwgMi4wICogMC41MTE2NjQgKiB5ICk7IC8vICggMiAqIFx1MDNDMCAvIDMgKSAqIDAuNDg4NjAzXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDIgXSwgMi4wICogMC41MTE2NjQgKiB6ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDMgXSwgMi4wICogMC41MTE2NjQgKiB4ICk7XG5cblx0XHQvLyBiYW5kIDJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNCBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB5ICk7IC8vICggXHUwM0MwIC8gNCApICogMS4wOTI1NDhcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNSBdLCAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDYgXSwgMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7IC8vICggXHUwM0MwIC8gNCApICogMC4zMTUzOTIgKiAzXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDcgXSwgMi4wICogMC40MjkwNDMgKiB4ICogeiApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA4IF0sIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICkgKTsgLy8gKCBcdTAzQzAgLyA0ICkgKiAwLjU0NjI3NFxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0YWRkKCBzaCApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkKCBzaC5jb2VmZmljaWVudHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFNIKCBzaCwgcyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkU2NhbGVkVmVjdG9yKCBzaC5jb2VmZmljaWVudHNbIGkgXSwgcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCBzICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5tdWx0aXBseVNjYWxhciggcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnAoIHNoLCBhbHBoYSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0ubGVycCggc2guY29lZmZpY2llbnRzWyBpIF0sIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBzaCApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggISB0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmVxdWFscyggc2guY29lZmZpY2llbnRzWyBpIF0gKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxuXHRjb3B5KCBzaCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggc2guY29lZmZpY2llbnRzICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS5mcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgKyAoIGkgKiAzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICsgKCBpICogMyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdC8vIGV2YWx1YXRlIHRoZSBiYXNpcyBmdW5jdGlvbnNcblx0Ly8gc2hCYXNpcyBpcyBhbiBBcnJheVsgOSBdXG5cdHN0YXRpYyBnZXRCYXNpc0F0KCBub3JtYWwsIHNoQmFzaXMgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHNoQmFzaXNbIDAgXSA9IDAuMjgyMDk1O1xuXG5cdFx0Ly8gYmFuZCAxXG5cdFx0c2hCYXNpc1sgMSBdID0gMC40ODg2MDMgKiB5O1xuXHRcdHNoQmFzaXNbIDIgXSA9IDAuNDg4NjAzICogejtcblx0XHRzaEJhc2lzWyAzIF0gPSAwLjQ4ODYwMyAqIHg7XG5cblx0XHQvLyBiYW5kIDJcblx0XHRzaEJhc2lzWyA0IF0gPSAxLjA5MjU0OCAqIHggKiB5O1xuXHRcdHNoQmFzaXNbIDUgXSA9IDEuMDkyNTQ4ICogeSAqIHo7XG5cdFx0c2hCYXNpc1sgNiBdID0gMC4zMTUzOTIgKiAoIDMgKiB6ICogeiAtIDEgKTtcblx0XHRzaEJhc2lzWyA3IF0gPSAxLjA5MjU0OCAqIHggKiB6O1xuXHRcdHNoQmFzaXNbIDggXSA9IDAuNTQ2Mjc0ICogKCB4ICogeCAtIHkgKiB5ICk7XG5cblx0fVxuXG59XG5cblNwaGVyaWNhbEhhcm1vbmljczMucHJvdG90eXBlLmlzU3BoZXJpY2FsSGFybW9uaWNzMyA9IHRydWU7XG5cbmNsYXNzIExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIHNoID0gbmV3IFNwaGVyaWNhbEhhcm1vbmljczMoKSwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdFx0dGhpcy5zaCA9IHNoO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuc2guY29weSggc291cmNlLnNoICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHR0aGlzLmludGVuc2l0eSA9IGpzb24uaW50ZW5zaXR5OyAvLyBUT0RPOiBNb3ZlIHRoaXMgYml0IHRvIExpZ2h0LmZyb21KU09OKCk7XG5cdFx0dGhpcy5zaC5mcm9tQXJyYXkoIGpzb24uc2ggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5zaCA9IHRoaXMuc2gudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59XG5cbkxpZ2h0UHJvYmUucHJvdG90eXBlLmlzTGlnaHRQcm9iZSA9IHRydWU7XG5cbmNsYXNzIE1hdGVyaWFsTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcblxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcblxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XG5cdFx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWxzWyBqc29uLnR5cGUgXSgpO1xuXG5cdFx0aWYgKCBqc29uLnV1aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7XG5cdFx0aWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7XG5cdFx0aWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5zaGVlbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW4gPSBuZXcgQ29sb3IoKS5zZXRIZXgoIGpzb24uc2hlZW4gKTtcblx0XHRpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdCA9IGpzb24uY2xlYXJjb2F0O1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJjb2F0Um91Z2huZXNzO1xuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xuXHRcdGlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nO1xuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xuXHRcdGlmICgganNvbi5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb21iaW5lID0ganNvbi5jb21iaW5lO1xuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xuXHRcdGlmICgganNvbi5zaGFkb3dTaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGFkb3dTaWRlID0ganNvbi5zaGFkb3dTaWRlO1xuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xuXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlID0ganNvbi5zdGVuY2lsV3JpdGU7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZU1hc2sgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgPSBqc29uLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRnVuYyA9IGpzb24uc3RlbmNpbEZ1bmM7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxSZWYgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxSZWYgPSBqc29uLnN0ZW5jaWxSZWY7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jTWFzayAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrID0ganNvbi5zdGVuY2lsRnVuY01hc2s7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGYWlsICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRmFpbCA9IGpzb24uc3RlbmNpbEZhaWw7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaRmFpbCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsID0ganNvbi5zdGVuY2lsWkZhaWw7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaUGFzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzID0ganNvbi5zdGVuY2lsWlBhc3M7XG5cblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24ubW9ycGhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgPSBqc29uLm1vcnBoTm9ybWFscztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi5hbHBoYVRvQ292ZXJhZ2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSA9IGpzb24uYWxwaGFUb0NvdmVyYWdlO1xuXHRcdGlmICgganNvbi5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSA9IGpzb24ucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0aWYgKCBqc29uLnZlcnRleFRhbmdlbnRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhUYW5nZW50cyA9IGpzb24udmVydGV4VGFuZ2VudHM7XG5cblx0XHRpZiAoIGpzb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmlzaWJsZSA9IGpzb24udmlzaWJsZTtcblxuXHRcdGlmICgganNvbi50b25lTWFwcGVkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50b25lTWFwcGVkID0ganNvbi50b25lTWFwcGVkO1xuXG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mIGpzb24udmVydGV4Q29sb3JzID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSAoIGpzb24udmVydGV4Q29sb3JzID4gMCApID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTaGFkZXIgTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGpzb24udW5pZm9ybXMgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybSA9IGpzb24udW5pZm9ybXNbIG5hbWUgXTtcblxuXHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdID0ge307XG5cblx0XHRcdFx0c3dpdGNoICggdW5pZm9ybS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAndCc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gZ2V0VGV4dHVyZSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdjJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgQ29sb3IoKS5zZXRIZXgoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAndjInOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3YzJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICd2NCc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnbTMnOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBNYXRyaXgzKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ200Jzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVmaW5lcyA9IGpzb24uZGVmaW5lcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblxuXHRcdGlmICgganNvbi5leHRlbnNpb25zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBqc29uLmV4dGVuc2lvbnMgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwuZXh0ZW5zaW9uc1sga2V5IF0gPSBqc29uLmV4dGVuc2lvbnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLnNoYWRpbmcgPT09IDE7IC8vIFRIUkVFLkZsYXRTaGFkaW5nXG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblx0XHRpZiAoIGpzb24ubWF0Y2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXRjYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hdGNhcCApO1xuXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxNYXBUeXBlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsZXQgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblx0XHRpZiAoIGpzb24uZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPSBqc29uLmVudk1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXHRcdGlmICgganNvbi5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXRNYXAgKTtcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdFJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXROb3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICk7XG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb24gPSBqc29uLnRyYW5zbWlzc2lvbjtcblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAgPSBnZXRUZXh0dXJlKCBqc29uLnRyYW5zbWlzc2lvbk1hcCApO1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxuXHRzZXRUZXh0dXJlcyggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNvbnN0IExvYWRlclV0aWxzID0ge1xuXG5cdGRlY29kZVRleHQ6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoIGFycmF5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBBdm9pZCB0aGUgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgc2hvcnRjdXQsIHdoaWNoXG5cdFx0Ly8gdGhyb3dzIGEgXCJtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiIGVycm9yIGZvciBsYXJnZSBhcnJheXMuXG5cblx0XHRsZXQgcyA9ICcnO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBJbXBsaWNpdGx5IGFzc3VtZXMgbGl0dGxlLWVuZGlhbi5cblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggYXJyYXlbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Ly8gbWVyZ2VzIG11bHRpLWJ5dGUgdXRmLTggY2hhcmFjdGVycy5cblxuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCggZXNjYXBlKCBzICkgKTtcblxuXHRcdH0gY2F0Y2ggKCBlICkgeyAvLyBzZWUgIzE2MzU4XG5cblx0XHRcdHJldHVybiBzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0Y29uc3QgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Jztcblx0dGhpcy5pbnN0YW5jZUNvdW50ID0gSW5maW5pdHk7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5pbnN0YW5jZUNvdW50ID0gc291cmNlLmluc3RhbmNlQ291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuaW5zdGFuY2VDb3VudCA9IHRoaXMuaW5zdGFuY2VDb3VudDtcblxuXHRcdGRhdGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IHRydWU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0aWYgKCB0eXBlb2YgKCBub3JtYWxpemVkICkgPT09ICdudW1iZXInICkge1xuXG5cdFx0bWVzaFBlckF0dHJpYnV0ZSA9IG5vcm1hbGl6ZWQ7XG5cblx0XHRub3JtYWxpemVkID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuJyApO1xuXG5cdH1cblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKClcdHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRkYXRhLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBCdWZmZXJHZW9tZXRyeUxvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXJNYXAgPSB7fTtcblx0XHRjb25zdCBhcnJheUJ1ZmZlck1hcCA9IHt9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24sIHV1aWQgKSB7XG5cblx0XHRcdGlmICggaW50ZXJsZWF2ZWRCdWZmZXJNYXBbIHV1aWQgXSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGludGVybGVhdmVkQnVmZmVyTWFwWyB1dWlkIF07XG5cblx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVycyA9IGpzb24uaW50ZXJsZWF2ZWRCdWZmZXJzO1xuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBpbnRlcmxlYXZlZEJ1ZmZlcnNbIHV1aWQgXTtcblxuXHRcdFx0Y29uc3QgYnVmZmVyID0gZ2V0QXJyYXlCdWZmZXIoIGpzb24sIGludGVybGVhdmVkQnVmZmVyLmJ1ZmZlciApO1xuXG5cdFx0XHRjb25zdCBhcnJheSA9IGdldFR5cGVkQXJyYXkoIGludGVybGVhdmVkQnVmZmVyLnR5cGUsIGJ1ZmZlciApO1xuXHRcdFx0Y29uc3QgaWIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBpbnRlcmxlYXZlZEJ1ZmZlci5zdHJpZGUgKTtcblx0XHRcdGliLnV1aWQgPSBpbnRlcmxlYXZlZEJ1ZmZlci51dWlkO1xuXG5cdFx0XHRpbnRlcmxlYXZlZEJ1ZmZlck1hcFsgdXVpZCBdID0gaWI7XG5cblx0XHRcdHJldHVybiBpYjtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKCBqc29uLCB1dWlkICkge1xuXG5cdFx0XHRpZiAoIGFycmF5QnVmZmVyTWFwWyB1dWlkIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBhcnJheUJ1ZmZlck1hcFsgdXVpZCBdO1xuXG5cdFx0XHRjb25zdCBhcnJheUJ1ZmZlcnMgPSBqc29uLmFycmF5QnVmZmVycztcblx0XHRcdGNvbnN0IGFycmF5QnVmZmVyID0gYXJyYXlCdWZmZXJzWyB1dWlkIF07XG5cblx0XHRcdGNvbnN0IGFiID0gbmV3IFVpbnQzMkFycmF5KCBhcnJheUJ1ZmZlciApLmJ1ZmZlcjtcblxuXHRcdFx0YXJyYXlCdWZmZXJNYXBbIHV1aWQgXSA9IGFiO1xuXG5cdFx0XHRyZXR1cm4gYWI7XG5cblx0XHR9XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IGpzb24uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA/IG5ldyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHRjb25zdCBpbmRleCA9IGpzb24uZGF0YS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoIGluZGV4LnR5cGUsIGluZGV4LmFycmF5ICk7XG5cdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgMSApICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRsZXQgYnVmZmVyQXR0cmlidXRlO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24uZGF0YSwgYXR0cmlidXRlLmRhdGEgKTtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUub2Zmc2V0LCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KCBhdHRyaWJ1dGUudHlwZSwgYXR0cmlidXRlLmFycmF5ICk7XG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciA9IGF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA/IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA6IEJ1ZmZlckF0dHJpYnV0ZTtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS51c2FnZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLnNldFVzYWdlKCBhdHRyaWJ1dGUudXNhZ2UgKTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUudXBkYXRlUmFuZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUudXBkYXRlUmFuZ2Uub2Zmc2V0ID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlLm9mZnNldDtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlLnVwZGF0ZVJhbmdlLmNvdW50ID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlLmNvdW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgga2V5LCBidWZmZXJBdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGpzb24uZGF0YS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRpZiAoIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheSA9IG1vcnBoQXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlQXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xuXHRcdFx0XHRcdGxldCBidWZmZXJBdHRyaWJ1dGU7XG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IGdldEludGVybGVhdmVkQnVmZmVyKCBqc29uLmRhdGEsIGF0dHJpYnV0ZS5kYXRhICk7XG5cdFx0XHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5vZmZzZXQsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheSggYXR0cmlidXRlLnR5cGUsIGF0dHJpYnV0ZS5hcnJheSApO1xuXHRcdFx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcblx0XHRcdFx0XHRhcnJheS5wdXNoKCBidWZmZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGpzb24uZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XG5cblx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHRnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5uYW1lICkgZ2VvbWV0cnkubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24udXNlckRhdGEgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59XG5cbmNsYXNzIE9iamVjdExvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IHBhdGggPSAoIHRoaXMucGF0aCA9PT0gJycgKSA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKSA6IHRoaXMucGF0aDtcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoIHx8IHBhdGg7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0bGV0IGpzb24gPSBudWxsO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9XG5cblx0cGFyc2UoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlcygganNvbi5zaGFwZXMgKTtcblx0XHRjb25zdCBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHRjb25zdCBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH0gKTtcblxuXHRcdGNvbnN0IHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIGFuaW1hdGlvbnMgKTtcblx0XHRjb25zdCBza2VsZXRvbnMgPSB0aGlzLnBhcnNlU2tlbGV0b25zKCBqc29uLnNrZWxldG9ucywgb2JqZWN0ICk7XG5cblx0XHR0aGlzLmJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGV0IGhhc0ltYWdlcyA9IGZhbHNlO1xuXG5cdFx0XHRmb3IgKCBjb25zdCB1dWlkIGluIGltYWdlcyApIHtcblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgdXVpZCBdIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHtcblxuXHRcdFx0XHRcdGhhc0ltYWdlcyA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzSW1hZ2VzID09PSBmYWxzZSApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxuXHRwYXJzZVNoYXBlcygganNvbiApIHtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxuXHRwYXJzZVNrZWxldG9ucygganNvbiwgb2JqZWN0ICkge1xuXG5cdFx0Y29uc3Qgc2tlbGV0b25zID0ge307XG5cdFx0Y29uc3QgYm9uZXMgPSB7fTtcblxuXHRcdC8vIGdlbmVyYXRlIGJvbmUgbG9va3VwIHRhYmxlXG5cblx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggY2hpbGQgKSB7XG5cblx0XHRcdGlmICggY2hpbGQuaXNCb25lICkgYm9uZXNbIGNoaWxkLnV1aWQgXSA9IGNoaWxkO1xuXG5cdFx0fSApO1xuXG5cdFx0Ly8gY3JlYXRlIHNrZWxldG9uc1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbigpLmZyb21KU09OKCBqc29uWyBpIF0sIGJvbmVzICk7XG5cblx0XHRcdFx0c2tlbGV0b25zWyBza2VsZXRvbi51dWlkIF0gPSBza2VsZXRvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNrZWxldG9ucztcblxuXHR9XG5cblx0cGFyc2VHZW9tZXRyaWVzKCBqc29uLCBzaGFwZXMgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyaWVzID0ge307XG5cdFx0bGV0IGdlb21ldHJ5U2hhcGVzO1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRsZXQgZ2VvbWV0cnk7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0JveEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdCb3hCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1R1YmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVHViZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBvbmx5IHdvcmtzIGZvciBidWlsdC1pbiBjdXJ2ZXMgKGUuZy4gQ2F0bXVsbFJvbUN1cnZlMykuXG5cdFx0XHRcdFx0XHQvLyBVc2VyIGRlZmluZWQgY3VydmVzIG9yIGluc3RhbmNlcyBvZiBDdXJ2ZVBhdGggd2lsbCBub3QgYmUgZGVzZXJpYWxpemVkLlxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdG5ldyBDdXJ2ZXNbIGRhdGEucGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZGF0YS5wYXRoICksXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jbG9zZWRcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBvaW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS52ZXJ0aWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbmRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jdXJ2ZVNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRcdFx0Y2FzZSAnRXh0cnVkZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGV4dHJ1ZGVQYXRoID0gZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gbmV3IEN1cnZlc1sgZXh0cnVkZVBhdGgudHlwZSBdKCkuZnJvbUpTT04oIGV4dHJ1ZGVQYXRoICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdGlvbnNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0dlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogTG9hZGluZyBcIkdlb21ldHJ5XCIgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLicgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID09PSB0cnVlICYmIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9XG5cblx0cGFyc2VNYXRlcmlhbHMoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0Y29uc3QgY2FjaGUgPSB7fTsgLy8gTXVsdGlNYXRlcmlhbFxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBkYXRhLm1hdGVyaWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZVsgbWF0ZXJpYWwudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBjYWNoZVsgZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y2FjaGVbIGRhdGEudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gY2FjaGVbIGRhdGEudXVpZCBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9XG5cblx0cGFyc2VBbmltYXRpb25zKCBqc29uICkge1xuXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRhbmltYXRpb25zWyBjbGlwLnV1aWQgXSA9IGNsaXA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH1cblxuXHRwYXJzZUltYWdlcygganNvbiwgb25Mb2FkICkge1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXHRcdGNvbnN0IGltYWdlcyA9IHt9O1xuXG5cdFx0bGV0IGxvYWRlcjtcblxuXHRcdGZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlO1xuXG5cdFx0XHRcdGNvbnN0IHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIHVybCApID8gdXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgdXJsO1xuXG5cdFx0XHRcdHJldHVybiBsb2FkSW1hZ2UoIHBhdGggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIGltYWdlLmRhdGEgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZGF0YTogZ2V0VHlwZWRBcnJheSggaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSApLFxuXHRcdFx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Y29uc3QgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggbWFuYWdlciApO1xuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZS51cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0XHRcdC8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRVcmwgPSB1cmxbIGogXTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBjdXJyZW50VXJsICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBhcnJheSBvZiBkYXRhIHRleHR1cmVzIGZvciBjdWJlIHRleHR1cmVzXG5cblx0XHRcdFx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBuZXcgRGF0YVRleHR1cmUoIGRlc2VyaWFsaXplZEltYWdlLmRhdGEsIGRlc2VyaWFsaXplZEltYWdlLndpZHRoLCBkZXNlcmlhbGl6ZWRJbWFnZS5oZWlnaHQgKSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBsb2FkIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZS51cmwgKTtcblxuXHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gZGVzZXJpYWxpemVkSW1hZ2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH1cblxuXHRwYXJzZVRleHR1cmVzKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0ZXh0dXJlO1xuXHRcdFx0XHRjb25zdCBpbWFnZSA9IGltYWdlc1sgZGF0YS5pbWFnZSBdO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggaW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoIGltYWdlICk7XG5cblx0XHRcdFx0XHRpZiAoIGltYWdlLmxlbmd0aCA9PT0gNiApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIGltYWdlICYmIGltYWdlLmRhdGEgKSB7XG5cblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaW1hZ2UgKSB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsgLy8gdGV4dHVyZXMgY2FuIGhhdmUgdW5kZWZpbmVkIGltYWdlIGRhdGFcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cdFx0XHRcdGlmICggZGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnR5cGUgPSBkYXRhLnR5cGU7XG5cdFx0XHRcdGlmICggZGF0YS5lbmNvZGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5lbmNvZGluZyA9IGRhdGEuZW5jb2Rpbmc7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdGlmICggZGF0YS5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgPSBkYXRhLnByZW11bHRpcGx5QWxwaGE7XG5cdFx0XHRcdGlmICggZGF0YS51bnBhY2tBbGlnbm1lbnQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ID0gZGF0YS51bnBhY2tBbGlnbm1lbnQ7XG5cblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xuXG5cdH1cblxuXHRwYXJzZU9iamVjdCggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCBhbmltYXRpb25zICkge1xuXG5cdFx0bGV0IG9iamVjdDtcblxuXHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRjb25zdCBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRsZXQgZ2VvbWV0cnksIG1hdGVyaWFsO1xuXG5cdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRjYXNlICdTY2VuZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNjZW5lKCk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKCBkYXRhLmJhY2tncm91bmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzO1xuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0O1xuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnQW1iaWVudExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpZ2h0UHJvYmUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaWdodFByb2JlKCkuZnJvbUpTT04oIGRhdGEgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdCBcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5iaW5kTW9kZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJpbmRNb2RlID0gZGF0YS5iaW5kTW9kZTtcblx0XHRcdFx0aWYgKCBkYXRhLmJpbmRNYXRyaXggIT09IHVuZGVmaW5lZCApIG9iamVjdC5iaW5kTWF0cml4LmZyb21BcnJheSggZGF0YS5iaW5kTWF0cml4ICk7XG5cdFx0XHRcdGlmICggZGF0YS5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNrZWxldG9uID0gZGF0YS5za2VsZXRvbjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xuXHRcdFx0XHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdJbnN0YW5jZWRNZXNoJzpcblxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XG5cdFx0XHRcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblx0XHRcdFx0Y29uc3QgY291bnQgPSBkYXRhLmNvdW50O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZU1hdHJpeCA9IGRhdGEuaW5zdGFuY2VNYXRyaXg7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3IgPSBkYXRhLmluc3RhbmNlQ29sb3I7XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEluc3RhbmNlZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKTtcblx0XHRcdFx0b2JqZWN0Lmluc3RhbmNlTWF0cml4ID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggaW5zdGFuY2VNYXRyaXguYXJyYXkgKSwgMTYgKTtcblx0XHRcdFx0aWYgKCBpbnN0YW5jZUNvbG9yICE9PSB1bmRlZmluZWQgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGluc3RhbmNlQ29sb3IuYXJyYXkgKSwgaW5zdGFuY2VDb2xvci5pdGVtU2l6ZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZUxvb3AnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lU2VnbWVudHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRDbG91ZCc6XG5cdFx0XHRjYXNlICdQb2ludHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3ByaXRlJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3ByaXRlKCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0dyb3VwJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgR3JvdXAoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnQm9uZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEJvbmUoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0aWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvYmplY3QubWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTtcblxuXHRcdFx0aWYgKCBkYXRhLm1hdHJpeEF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZGF0YS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdFx0aWYgKCBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSApIG9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Qucm90YXRpb24uZnJvbUFycmF5KCBkYXRhLnJvdGF0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRhLnF1YXRlcm5pb24gKTtcblx0XHRcdGlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93O1xuXHRcdGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdztcblxuXHRcdGlmICggZGF0YS5zaGFkb3cgKSB7XG5cblx0XHRcdGlmICggZGF0YS5zaGFkb3cuYmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5iaWFzID0gZGF0YS5zaGFkb3cuYmlhcztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubm9ybWFsQmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5ub3JtYWxCaWFzID0gZGF0YS5zaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1cztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5jYW1lcmEgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCggZGF0YS5zaGFkb3cuY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpc2libGUgPSBkYXRhLnZpc2libGU7XG5cdFx0aWYgKCBkYXRhLmZydXN0dW1DdWxsZWQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZGF0YS5mcnVzdHVtQ3VsbGVkO1xuXHRcdGlmICggZGF0YS5yZW5kZXJPcmRlciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjtcblx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XG5cdFx0aWYgKCBkYXRhLmxheWVycyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmxheWVycy5tYXNrID0gZGF0YS5sYXllcnM7XG5cblx0XHRpZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCBhbmltYXRpb25zICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0QW5pbWF0aW9ucyA9IGRhdGEuYW5pbWF0aW9ucztcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0QW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdXVpZCA9IG9iamVjdEFuaW1hdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRvYmplY3QuYW5pbWF0aW9ucy5wdXNoKCBhbmltYXRpb25zWyB1dWlkIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHRpZiAoIGRhdGEuYXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmF1dG9VcGRhdGUgPSBkYXRhLmF1dG9VcGRhdGU7XG5cblx0XHRcdGNvbnN0IGxldmVscyA9IGRhdGEubGV2ZWxzO1xuXG5cdFx0XHRmb3IgKCBsZXQgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG5cdGJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICkge1xuXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggc2tlbGV0b25zICkubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIGNoaWxkICkge1xuXG5cdFx0XHRpZiAoIGNoaWxkLmlzU2tpbm5lZE1lc2ggPT09IHRydWUgJiYgY2hpbGQuc2tlbGV0b24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IHNrZWxldG9uc1sgY2hpbGQuc2tlbGV0b24gXTtcblxuXHRcdFx0XHRpZiAoIHNrZWxldG9uID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDonLCBjaGlsZC5za2VsZXRvbiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjaGlsZC5iaW5kKCBza2VsZXRvbiwgY2hpbGQuYmluZE1hdHJpeCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdH1cblxuXHQvKiBERVBSRUNBVEVEICovXG5cblx0c2V0VGV4dHVyZVBhdGgoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKCB2YWx1ZSApO1xuXG5cdH1cblxufVxuXG5jb25zdCBURVhUVVJFX01BUFBJTkcgPSB7XG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxuY29uc3QgVEVYVFVSRV9XUkFQUElORyA9IHtcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXG59O1xuXG5jb25zdCBURVhUVVJFX0ZJTFRFUiA9IHtcblx0TmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjogTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcixcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJcbn07XG5cbmZ1bmN0aW9uIEltYWdlQml0bWFwTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBjcmVhdGVJbWFnZUJpdG1hcCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxuXHR0aGlzLm9wdGlvbnMgPSB7IHByZW11bHRpcGx5QWxwaGE6ICdub25lJyB9O1xuXG59XG5cbkltYWdlQml0bWFwTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbWFnZUJpdG1hcExvYWRlcixcblxuXHRpc0ltYWdlQml0bWFwTG9hZGVyOiB0cnVlLFxuXG5cdHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZmV0Y2hPcHRpb25zID0ge307XG5cdFx0ZmV0Y2hPcHRpb25zLmNyZWRlbnRpYWxzID0gKCB0aGlzLmNyb3NzT3JpZ2luID09PSAnYW5vbnltb3VzJyApID8gJ3NhbWUtb3JpZ2luJyA6ICdpbmNsdWRlJztcblx0XHRmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHRoaXMucmVxdWVzdEhlYWRlcjtcblxuXHRcdGZldGNoKCB1cmwsIGZldGNoT3B0aW9ucyApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XG5cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgT2JqZWN0LmFzc2lnbiggc2NvcGUub3B0aW9ucywgeyBjb2xvclNwYWNlQ29udmVyc2lvbjogJ25vbmUnIH0gKSApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9ICk7XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIFNoYXBlUGF0aCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHRcdHRoaXMuc3ViUGF0aHMgPSBbXTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxuXHR9XG5cblx0bW92ZVRvKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7XG5cdFx0dGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7XG5cdFx0dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRsaW5lVG8oIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNwbGluZVRocnUoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9TaGFwZXMoIGlzQ0NXLCBub0hvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xuXG5cdFx0XHRjb25zdCBzaGFwZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XG5cblx0XHRcdGNvbnN0IHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoO1xuXG5cdFx0XHQvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1lZGlhdGUgc3VjY2VzcyAgICBvclxuXHRcdFx0Ly8gdG9nZ2xpbmcgb2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYW4gZWRnZVxuXHRcdFx0Ly8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQgb2YgaW5QdFxuXHRcdFx0Ly8gIG5vdCBjb3VudGluZyBsb3dlclkgZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmVcblx0XHRcdGxldCBpbnNpZGUgPSBmYWxzZTtcblx0XHRcdGZvciAoIGxldCBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdFx0bGV0IGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcCBdO1xuXHRcdFx0XHRsZXQgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdO1xuXG5cdFx0XHRcdGxldCBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDtcblx0XHRcdFx0bGV0IGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55O1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcblx0XHRcdFx0XHRpZiAoIGVkZ2VEeSA8IDAgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVkZ2VEeDtcblx0XHRcdFx0XHRcdGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdlRHk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGlzQ2xvY2tXaXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTtcblxuXHRcdGNvbnN0IHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0bGV0IHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZTtcblx0XHRjb25zdCBzaGFwZXMgPSBbXTtcblxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGxldCBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xuXG5cdFx0Y29uc3QgYmV0dGVyU2hhcGVIb2xlcyA9IFtdO1xuXHRcdGNvbnN0IG5ld1NoYXBlcyA9IFtdO1xuXHRcdGxldCBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0bGV0IG1haW5JZHggPSAwO1xuXHRcdGxldCB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0bGV0IGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0Y29uc3QgdG9DaGFuZ2UgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc2hvID0gbmV3U2hhcGVIb2xlc1sgc0lkeCBdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdGxldCBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYW1iaWd1b3VzOiBcIiwgYW1iaWd1b3VzKTtcblxuXHRcdFx0aWYgKCB0b0NoYW5nZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidG8gY2hhbmdlOiBcIiwgdG9DaGFuZ2UpO1xuXHRcdFx0XHRpZiAoICEgYW1iaWd1b3VzIClcdG5ld1NoYXBlSG9sZXMgPSBiZXR0ZXJTaGFwZUhvbGVzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXQgdG1wSG9sZXM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5sb2coXCJzaGFwZVwiLCBzaGFwZXMpO1xuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn1cblxuY2xhc3MgRm9udCB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEgKSB7XG5cblx0XHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXG5cdH1cblxuXHRnZW5lcmF0ZVNoYXBlcyggdGV4dCwgc2l6ZSA9IDEwMCApIHtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IFtdO1xuXHRcdGNvbnN0IHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIHRoaXMuZGF0YSApO1xuXG5cdFx0Zm9yICggbGV0IHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCBkYXRhICkge1xuXG5cdGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSggdGV4dCApO1xuXHRjb25zdCBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247XG5cdGNvbnN0IGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0Y29uc3QgcGF0aHMgPSBbXTtcblxuXHRsZXQgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwO1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGNvbnN0IGNoYXIgPSBjaGFyc1sgaSBdO1xuXG5cdFx0aWYgKCBjaGFyID09PSAnXFxuJyApIHtcblxuXHRcdFx0b2Zmc2V0WCA9IDA7XG5cdFx0XHRvZmZzZXRZIC09IGxpbmVfaGVpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKTtcblx0XHRcdG9mZnNldFggKz0gcmV0Lm9mZnNldFg7XG5cdFx0XHRwYXRocy5wdXNoKCByZXQucGF0aCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcGF0aHM7XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKSB7XG5cblx0Y29uc3QgZ2x5cGggPSBkYXRhLmdseXBoc1sgY2hhciBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTtcblxuXHRpZiAoICEgZ2x5cGggKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRm9udDogY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgZG9lcyBub3QgZXhpc3RzIGluIGZvbnQgZmFtaWx5ICcgKyBkYXRhLmZhbWlseU5hbWUgKyAnLicgKTtcblxuXHRcdHJldHVybjtcblxuXHR9XG5cblx0Y29uc3QgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHRsZXQgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0Y29uc3Qgb3V0bGluZSA9IGdseXBoLl9jYWNoZWRPdXRsaW5lIHx8ICggZ2x5cGguX2NhY2hlZE91dGxpbmUgPSBnbHlwaC5vLnNwbGl0KCAnICcgKSApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gb3V0bGluZS5sZW5ndGg7IGkgPCBsOyApIHtcblxuXHRcdFx0Y29uc3QgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBhY3Rpb24gKSB7XG5cblx0XHRcdFx0Y2FzZSAnbSc6IC8vIG1vdmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2wnOiAvLyBsaW5lVG9cblxuXHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGNweDEsIGNweTEsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5iZXppZXJDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9O1xuXG59XG5cbkZvbnQucHJvdG90eXBlLmlzRm9udCA9IHRydWU7XG5cbmNsYXNzIEZvbnRMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdGxldCBqc29uO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7XG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fVxuXG59XG5cbmxldCBfY29udGV4dDtcblxuY29uc3QgQXVkaW9Db250ZXh0ID0ge1xuXG5cdGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggX2NvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2NvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9jb250ZXh0O1xuXG5cdH0sXG5cblx0c2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdF9jb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG5jbGFzcyBBdWRpb0xvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJ1ZmZlci4gVGhlIGBkZWNvZGVBdWRpb0RhdGFgIG1ldGhvZFxuXHRcdFx0XHQvLyBkZXRhY2hlcyB0aGUgYnVmZmVyIHdoZW4gY29tcGxldGUsIHByZXZlbnRpbmcgcmV1c2UuXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckNvcHkgPSBidWZmZXIuc2xpY2UoIDAgKTtcblxuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblx0XHRcdFx0Y29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlckNvcHksIGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIEhlbWlzcGhlcmVMaWdodFByb2JlIGV4dGVuZHMgTGlnaHRQcm9iZSB7XG5cblx0Y29uc3RydWN0b3IoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdFx0Y29uc3QgY29sb3IxID0gbmV3IENvbG9yKCkuc2V0KCBza3lDb2xvciApO1xuXHRcdGNvbnN0IGNvbG9yMiA9IG5ldyBDb2xvcigpLnNldCggZ3JvdW5kQ29sb3IgKTtcblxuXHRcdGNvbnN0IHNreSA9IG5ldyBWZWN0b3IzKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdFx0Y29uc3QgZ3JvdW5kID0gbmV3IFZlY3RvcjMoIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdC8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHNob3VsZCA9IDEgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTtcblx0XHRjb25zdCBjMCA9IE1hdGguc3FydCggTWF0aC5QSSApO1xuXHRcdGNvbnN0IGMxID0gYzAgKiBNYXRoLnNxcnQoIDAuNzUgKTtcblxuXHRcdHRoaXMuc2guY29lZmZpY2llbnRzWyAwIF0uY29weSggc2t5ICkuYWRkKCBncm91bmQgKS5tdWx0aXBseVNjYWxhciggYzAgKTtcblx0XHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMSBdLmNvcHkoIHNreSApLnN1YiggZ3JvdW5kICkubXVsdGlwbHlTY2FsYXIoIGMxICk7XG5cblx0fVxuXG59XG5cbkhlbWlzcGhlcmVMaWdodFByb2JlLnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodFByb2JlID0gdHJ1ZTtcblxuY2xhc3MgQW1iaWVudExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodFByb2JlIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSA9IDEgKSB7XG5cblx0XHRzdXBlciggdW5kZWZpbmVkLCBpbnRlbnNpdHkgKTtcblxuXHRcdGNvbnN0IGNvbG9yMSA9IG5ldyBDb2xvcigpLnNldCggY29sb3IgKTtcblxuXHRcdC8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHdvdWxkIGJlIDIgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTtcblx0XHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMCBdLnNldCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApLm11bHRpcGx5U2NhbGFyKCAyICogTWF0aC5zcXJ0KCBNYXRoLlBJICkgKTtcblxuXHR9XG5cbn1cblxuQW1iaWVudExpZ2h0UHJvYmUucHJvdG90eXBlLmlzQW1iaWVudExpZ2h0UHJvYmUgPSB0cnVlO1xuXG5jb25zdCBfZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2V5ZUxlZnQgPSBuZXcgTWF0cml4NCgpO1xuXG5jbGFzcyBTdGVyZW9DYW1lcmEge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0XHR0aGlzLmFzcGVjdCA9IDE7XG5cblx0XHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdFx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdFx0dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblx0XHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdFx0dGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblx0XHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5fY2FjaGUgPSB7XG5cdFx0XHRmb2N1czogbnVsbCxcblx0XHRcdGZvdjogbnVsbCxcblx0XHRcdGFzcGVjdDogbnVsbCxcblx0XHRcdG5lYXI6IG51bGwsXG5cdFx0XHRmYXI6IG51bGwsXG5cdFx0XHR6b29tOiBudWxsLFxuXHRcdFx0ZXllU2VwOiBudWxsXG5cdFx0fTtcblxuXHR9XG5cblx0dXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlO1xuXG5cdFx0Y29uc3QgbmVlZHNVcGRhdGUgPSBjYWNoZS5mb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGNhY2hlLmZvdiAhPT0gY2FtZXJhLmZvdiB8fFxuXHRcdFx0Y2FjaGUuYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgY2FjaGUubmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcblx0XHRcdGNhY2hlLmZhciAhPT0gY2FtZXJhLmZhciB8fCBjYWNoZS56b29tICE9PSBjYW1lcmEuem9vbSB8fCBjYWNoZS5leWVTZXAgIT09IHRoaXMuZXllU2VwO1xuXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0Y2FjaGUuZm9jdXMgPSBjYW1lcmEuZm9jdXM7XG5cdFx0XHRjYWNoZS5mb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0Y2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0Y2FjaGUubmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdFx0Y2FjaGUuZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdGNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTtcblx0XHRcdGNhY2hlLmV5ZVNlcCA9IHRoaXMuZXllU2VwO1xuXG5cdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xuXG5cdFx0XHRjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKTtcblx0XHRcdGNvbnN0IGV5ZVNlcEhhbGYgPSBjYWNoZS5leWVTZXAgLyAyO1xuXHRcdFx0Y29uc3QgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwSGFsZiAqIGNhY2hlLm5lYXIgLyBjYWNoZS5mb2N1cztcblx0XHRcdGNvbnN0IHltYXggPSAoIGNhY2hlLm5lYXIgKiBNYXRoLnRhbiggTWF0aFV0aWxzLkRFRzJSQUQgKiBjYWNoZS5mb3YgKiAwLjUgKSApIC8gY2FjaGUuem9vbTtcblx0XHRcdGxldCB4bWluLCB4bWF4O1xuXG5cdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxuXG5cdFx0XHRfZXllTGVmdC5lbGVtZW50c1sgMTIgXSA9IC0gZXllU2VwSGFsZjtcblx0XHRcdF9leWVSaWdodC5lbGVtZW50c1sgMTIgXSA9IGV5ZVNlcEhhbGY7XG5cblx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHR4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0eG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBjYWNoZS5uZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0eG1pbiA9IC0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdHhtYXggPSB5bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogY2FjaGUubmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBfZXllTGVmdCApO1xuXHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggX2V5ZVJpZ2h0ICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIENsb2NrIHtcblxuXHRjb25zdHJ1Y3RvciggYXV0b1N0YXJ0ICkge1xuXG5cdFx0dGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlO1xuXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHRcdHRoaXMub2xkVGltZSA9IDA7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0c3RhcnQoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9IG5vdygpO1xuXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuXHR9XG5cblx0c3RvcCgpIHtcblxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLmF1dG9TdGFydCA9IGZhbHNlO1xuXG5cdH1cblxuXHRnZXRFbGFwc2VkVGltZSgpIHtcblxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcblxuXHR9XG5cblx0Z2V0RGVsdGEoKSB7XG5cblx0XHRsZXQgZGlmZiA9IDA7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0XHRyZXR1cm4gMDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHRjb25zdCBuZXdUaW1lID0gbm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gbm93KCkge1xuXG5cdHJldHVybiAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsgLy8gc2VlICMxMDczMlxuXG59XG5cbmNvbnN0IF9wb3NpdGlvbiQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3F1YXRlcm5pb24kMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcbmNvbnN0IF9zY2FsZSQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX29yaWVudGF0aW9uJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInO1xuXG5cdFx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0dGhpcy50aW1lRGVsdGEgPSAwO1xuXG5cdFx0Ly8gcHJpdmF0ZVxuXG5cdFx0dGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTtcblxuXHR9XG5cblx0Z2V0SW5wdXQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH1cblxuXHRyZW1vdmVGaWx0ZXIoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldEZpbHRlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9XG5cblx0c2V0RmlsdGVyKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldE1hc3RlclZvbHVtZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9XG5cblx0c2V0TWFzdGVyVm9sdW1lKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0Y29uc3QgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7XG5cdFx0Y29uc3QgdXAgPSB0aGlzLnVwO1xuXG5cdFx0dGhpcy50aW1lRGVsdGEgPSB0aGlzLl9jbG9jay5nZXREZWx0YSgpO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiQxLCBfcXVhdGVybmlvbiQxLCBfc2NhbGUkMSApO1xuXG5cdFx0X29yaWVudGF0aW9uJDEuc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDEgKTtcblxuXHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSAoc2VlICMxNDM5MylcblxuXHRcdFx0Y29uc3QgZW5kVGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIHRoaXMudGltZURlbHRhO1xuXG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbiQxLngsIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDEueSwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMS56LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uJDEueCwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbiQxLnksIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24kMS56LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLngsIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueSwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC56LCBlbmRUaW1lICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uJDEueCwgX3Bvc2l0aW9uJDEueSwgX3Bvc2l0aW9uJDEueiApO1xuXHRcdFx0bGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbiQxLngsIF9vcmllbnRhdGlvbiQxLnksIF9vcmllbnRhdGlvbiQxLnosIHVwLngsIHVwLnksIHVwLnogKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgQXVkaW8gZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdBdWRpbyc7XG5cblx0XHR0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG5cdFx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcblxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHRcdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcblxuXHRcdHRoaXMuYnVmZmVyID0gbnVsbDtcblx0XHR0aGlzLmRldHVuZSA9IDA7XG5cdFx0dGhpcy5sb29wID0gZmFsc2U7XG5cdFx0dGhpcy5sb29wU3RhcnQgPSAwO1xuXHRcdHRoaXMubG9vcEVuZCA9IDA7XG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xuXHRcdHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHRcdHRoaXMuc291cmNlID0gbnVsbDtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gMDtcblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XG5cdFx0dGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG5cblx0XHR0aGlzLmZpbHRlcnMgPSBbXTtcblxuXHR9XG5cblx0Z2V0T3V0cHV0KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9XG5cblx0c2V0Tm9kZVNvdXJjZSggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRNZWRpYUVsZW1lbnRTb3VyY2UoIG1lZGlhRWxlbWVudCApIHtcblxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhTm9kZSc7XG5cdFx0dGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKCBtZWRpYUVsZW1lbnQgKTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRNZWRpYVN0cmVhbVNvdXJjZSggbWVkaWFTdHJlYW0gKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdtZWRpYVN0cmVhbU5vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBtZWRpYVN0cmVhbSApO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEJ1ZmZlciggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cGxheSggZGVsYXkgPSAwICkge1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXk7XG5cblx0XHRjb25zdCBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5sb29wU3RhcnQgPSB0aGlzLmxvb3BTdGFydDtcblx0XHRzb3VyY2UubG9vcEVuZCA9IHRoaXMubG9vcEVuZDtcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XG5cdFx0c291cmNlLnN0YXJ0KCB0aGlzLl9zdGFydGVkQXQsIHRoaXMuX3Byb2dyZXNzICsgdGhpcy5vZmZzZXQsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXG5cdFx0dGhpcy5zZXREZXR1bmUoIHRoaXMuZGV0dW5lICk7XG5cdFx0dGhpcy5zZXRQbGF5YmFja1JhdGUoIHRoaXMucGxheWJhY2tSYXRlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fVxuXG5cdHBhdXNlKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdC8vIHVwZGF0ZSBjdXJyZW50IHByb2dyZXNzXG5cblx0XHRcdHRoaXMuX3Byb2dyZXNzICs9IE1hdGgubWF4KCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLl9zdGFydGVkQXQsIDAgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXG5cdFx0XHRpZiAoIHRoaXMubG9vcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBlbnN1cmUgX3Byb2dyZXNzIGRvZXMgbm90IGV4Y2VlZCBkdXJhdGlvbiB3aXRoIGxvb3BlZCBhdWRpb3NcblxuXHRcdFx0XHR0aGlzLl9wcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzICUgKCB0aGlzLmR1cmF0aW9uIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cblx0XHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3RvcCgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb25uZWN0KCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGlzY29ubmVjdCgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRGaWx0ZXJzKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9XG5cblx0c2V0RmlsdGVycyggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLl9jb25uZWN0ZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXREZXR1bmUoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kZXR1bmUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5zb3VyY2UuZGV0dW5lID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG9ubHkgc2V0IGRldHVuZSB3aGVuIGF2YWlsYWJsZVxuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSggdGhpcy5kZXR1bmUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldERldHVuZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRldHVuZTtcblxuXHR9XG5cblx0Z2V0RmlsdGVyKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fVxuXG5cdHNldEZpbHRlciggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fVxuXG5cdHNldFBsYXliYWNrUmF0ZSggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRQbGF5YmFja1JhdGUoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fVxuXG5cdG9uRW5kZWQoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH1cblxuXHRnZXRMb29wKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fVxuXG5cdHNldExvb3AoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wU3RhcnQoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5sb29wU3RhcnQgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wRW5kKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubG9vcEVuZCA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldFZvbHVtZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9XG5cblx0c2V0Vm9sdW1lKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xuY29uc3QgX3NjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX29yaWVudGF0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBQb3NpdGlvbmFsQXVkaW8gZXh0ZW5kcyBBdWRpbyB7XG5cblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xuXG5cdFx0c3VwZXIoIGxpc3RlbmVyICk7XG5cblx0XHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0XHR0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWwgPSAnSFJURic7XG5cdFx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XG5cblx0fVxuXG5cdGdldE91dHB1dCgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lcjtcblxuXHR9XG5cblx0Z2V0UmVmRGlzdGFuY2UoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7XG5cblx0fVxuXG5cdHNldFJlZkRpc3RhbmNlKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Um9sbG9mZkZhY3RvcigpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yO1xuXG5cdH1cblxuXHRzZXRSb2xsb2ZmRmFjdG9yKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXREaXN0YW5jZU1vZGVsKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fVxuXG5cdHNldERpc3RhbmNlTW9kZWwoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldE1heERpc3RhbmNlKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlO1xuXG5cdH1cblxuXHRzZXRNYXhEaXN0YW5jZSggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldERpcmVjdGlvbmFsQ29uZSggY29uZUlubmVyQW5nbGUsIGNvbmVPdXRlckFuZ2xlLCBjb25lT3V0ZXJHYWluICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBjb25lSW5uZXJBbmdsZTtcblx0XHR0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IGNvbmVPdXRlckFuZ2xlO1xuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckdhaW4gPSBjb25lT3V0ZXJHYWluO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gdHJ1ZSAmJiB0aGlzLmlzUGxheWluZyA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgX3NjYWxlICk7XG5cblx0XHRfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiApO1xuXG5cdFx0Y29uc3QgcGFubmVyID0gdGhpcy5wYW5uZXI7XG5cblx0XHRpZiAoIHBhbm5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdC8vIGNvZGUgcGF0aCBmb3IgQ2hyb21lIGFuZCBGaXJlZm94IChzZWUgIzE0MzkzKVxuXG5cdFx0XHRjb25zdCBlbmRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7XG5cblx0XHRcdHBhbm5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi54LCBlbmRUaW1lICk7XG5cdFx0XHRwYW5uZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnosIGVuZFRpbWUgKTtcblx0XHRcdHBhbm5lci5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7XG5cdFx0XHRwYW5uZXIub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnosIGVuZFRpbWUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHBhbm5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55LCBfcG9zaXRpb24ueiApO1xuXHRcdFx0cGFubmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24ueCwgX29yaWVudGF0aW9uLnksIF9vcmllbnRhdGlvbi56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNsYXNzIEF1ZGlvQW5hbHlzZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBhdWRpbywgZmZ0U2l6ZSA9IDIwNDggKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHRcdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemU7XG5cblx0XHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xuXG5cdFx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xuXG5cdH1cblxuXG5cdGdldEZyZXF1ZW5jeURhdGEoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fVxuXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3koKSB7XG5cblx0XHRsZXQgdmFsdWUgPSAwO1xuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcblxuXHR9XG5cbn1cblxuY2xhc3MgUHJvcGVydHlNaXhlciB7XG5cblx0Y29uc3RydWN0b3IoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0XHR0aGlzLmJpbmRpbmcgPSBiaW5kaW5nO1xuXHRcdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xuXG5cdFx0bGV0IG1peEZ1bmN0aW9uLFxuXHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSxcblx0XHRcdHNldElkZW50aXR5O1xuXG5cdFx0Ly8gYnVmZmVyIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIHwgYWRkQWNjdSB8IChvcHRpb25hbCB3b3JrKSBdXG5cdFx0Ly9cblx0XHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XG5cdFx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0XHQvL1xuXHRcdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXG5cdFx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdFx0Ly8gY2hhbmdlc1xuXHRcdC8vXG5cdFx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cdFx0Ly9cblx0XHQvLyAnYWRkJyBpcyB1c2VkIGZvciBhZGRpdGl2ZSBjdW11bGF0aXZlIHJlc3VsdHNcblx0XHQvL1xuXHRcdC8vICd3b3JrJyBpcyBvcHRpb25hbCBhbmQgaXMgb25seSBwcmVzZW50IGZvciBxdWF0ZXJuaW9uIHR5cGVzLiBJdCBpcyB1c2VkXG5cdFx0Ly8gdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHF1YXRlcm5pb24gbXVsdGlwbGljYXRpb24gcmVzdWx0c1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxuXHRcdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xuXHRcdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlID0gdGhpcy5fc2xlcnBBZGRpdGl2ZTtcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbjtcblxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDYgKTtcblx0XHRcdFx0dGhpcy5fd29ya0luZGV4ID0gNTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSByZWd1bGFyIG1peCBmdW5jdGlvbiBhbmQgZm9yIGFkZGl0aXZlIG9uIHRoZXNlIHR5cGVzLFxuXHRcdFx0XHQvLyBhZGRpdGl2ZSBpcyBub3QgcmVsZXZhbnQgZm9yIG5vbi1udW1lcmljIHR5cGVzXG5cdFx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUgPSB0aGlzLl9zZWxlY3Q7XG5cblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXI7XG5cblx0XHRcdFx0dGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblx0XHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX2xlcnBBZGRpdGl2ZTtcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYztcblxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlID0gbWl4RnVuY3Rpb25BZGRpdGl2ZTtcblx0XHR0aGlzLl9zZXRJZGVudGl0eSA9IHNldElkZW50aXR5O1xuXHRcdHRoaXMuX29yaWdJbmRleCA9IDM7XG5cdFx0dGhpcy5fYWRkSW5kZXggPSA0O1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XG5cblx0XHR0aGlzLnVzZUNvdW50ID0gMDtcblx0XHR0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDtcblxuXHR9XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhY2N1PGk+J1xuXHRhY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApIHtcblxuXHRcdC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzXG5cdFx0Ly8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2VcblxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGU7XG5cblx0XHRsZXQgY3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdGNvbnN0IG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7XG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDtcblxuXHR9XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhZGQnXG5cdGFjY3VtdWxhdGVBZGRpdGl2ZSggd2VpZ2h0ICkge1xuXG5cdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX2FkZEluZGV4O1xuXG5cdFx0aWYgKCB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWRkID0gaWRlbnRpdHlcblxuXHRcdFx0dGhpcy5fc2V0SWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdC8vIGFkZCA6PSBhZGQgKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCAwLCB3ZWlnaHQsIHN0cmlkZSApO1xuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlICs9IHdlaWdodDtcblxuXHR9XG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlclxuXHRhcHBseSggYWNjdUluZGV4ICkge1xuXG5cdFx0Y29uc3Qgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxuXHRcdFx0d2VpZ2h0QWRkaXRpdmUgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSxcblxuXHRcdFx0YmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdGNvbnN0IG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XG5cblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB3ZWlnaHRBZGRpdGl2ZSA+IDAgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgYWRkaXRpdmUgYWNjdU5cblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCB0aGlzLl9hZGRJbmRleCAqIHN0cmlkZSwgMSwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzXG5cdHNhdmVPcmlnaW5hbFN0YXRlKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdC8vIEFkZCB0byBpZGVudGl0eSBmb3IgYWRkaXRpdmVcblx0XHR0aGlzLl9zZXRJZGVudGl0eSgpO1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XG5cblx0fVxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nXG5cdHJlc3RvcmVPcmlnaW5hbFN0YXRlKCkge1xuXG5cdFx0Y29uc3Qgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMztcblx0XHR0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0fVxuXG5cdF9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpIHtcblxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplO1xuXHRcdGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHRoaXMudmFsdWVTaXplO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYnVmZmVyWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRfc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKSB7XG5cblx0XHR0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpO1xuXHRcdHRoaXMuYnVmZmVyWyB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplICsgMyBdID0gMTtcblxuXHR9XG5cblx0X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpIHtcblxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9vcmlnSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTtcblx0XHRjb25zdCB0YXJnZXRJbmRleCA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemU7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlU2l6ZTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5idWZmZXJbIHRhcmdldEluZGV4ICsgaSBdID0gdGhpcy5idWZmZXJbIHN0YXJ0SW5kZXggKyBpIF07XG5cblx0XHR9XG5cblx0fVxuXG5cblx0Ly8gbWl4IGZ1bmN0aW9uc1xuXG5cdF9zZWxlY3QoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGlmICggdCA+PSAwLjUgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgZHN0T2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0X3NsZXJwKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkge1xuXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTtcblxuXHR9XG5cblx0X3NsZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGNvbnN0IHdvcmtPZmZzZXQgPSB0aGlzLl93b3JrSW5kZXggKiBzdHJpZGU7XG5cblx0XHQvLyBTdG9yZSByZXN1bHQgaW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBvZmZzZXRcblx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KCBidWZmZXIsIHdvcmtPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCApO1xuXG5cdFx0Ly8gU2xlcnAgdG8gdGhlIGludGVybWVkaWF0ZSByZXN1bHRcblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHdvcmtPZmZzZXQsIHQgKTtcblxuXHR9XG5cblx0X2xlcnAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGNvbnN0IHMgPSAxIC0gdDtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gQ2hhcmFjdGVycyBbXS46LyBhcmUgcmVzZXJ2ZWQgZm9yIHRyYWNrIGJpbmRpbmcgc3ludGF4LlxuY29uc3QgX1JFU0VSVkVEX0NIQVJTX1JFID0gJ1xcXFxbXFxcXF1cXFxcLjpcXFxcLyc7XG5jb25zdCBfcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIF9SRVNFUlZFRF9DSEFSU19SRSArICddJywgJ2cnICk7XG5cbi8vIEF0dGVtcHRzIHRvIGFsbG93IG5vZGUgbmFtZXMgZnJvbSBhbnkgbGFuZ3VhZ2UuIEVTNSdzIGBcXHdgIHJlZ2V4cCBtYXRjaGVzXG4vLyBvbmx5IGxhdGluIGNoYXJhY3RlcnMsIGFuZCB0aGUgdW5pY29kZSBcXHB7TH0gaXMgbm90IHlldCBzdXBwb3J0ZWQuIFNvXG4vLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cbmNvbnN0IF93b3JkQ2hhciA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5jb25zdCBfd29yZENoYXJPckRvdCA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuLy8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3Rcbi8vIGJlIG1hdGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuXG5jb25zdCBfZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xuXG4vLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cbmNvbnN0IF9ub2RlUmUgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIF93b3JkQ2hhck9yRG90ICk7XG5cbi8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcbi8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cbmNvbnN0IF9vYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XG5cbi8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuLy8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cbmNvbnN0IF9wcm9wZXJ0eVJlID0gL1xcLihXQyspKD86XFxbKC4rKVxcXSk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XG5cbmNvbnN0IF90cmFja1JlID0gbmV3IFJlZ0V4cCggJydcblx0KyAnXidcblx0KyBfZGlyZWN0b3J5UmVcblx0KyBfbm9kZVJlXG5cdCsgX29iamVjdFJlXG5cdCsgX3Byb3BlcnR5UmVcblx0KyAnJCdcbik7XG5cbmNvbnN0IF9zdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdGNvbnN0IHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcblx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwge1xuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xuXG5cdFx0Y29uc3QgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcblxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmJpbmQoKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0dGhpcy5wYXRoID0gcGF0aDtcblx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTtcblxuXHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLCB7XG5cblx0Q29tcG9zaXRlOiBDb21wb3NpdGUsXG5cblx0Y3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvKipcblx0ICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tXG5cdCAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VUcmFja05hbWUoKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSggL1xccy9nLCAnXycgKS5yZXBsYWNlKCBfcmVzZXJ2ZWRSZSwgJycgKTtcblxuXHR9LFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHtcblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBfdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcblxuXHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdHMgPSB7XG5cdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0bm9kZU5hbWU6IG1hdGNoZXNbIDIgXSxcblx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcblx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgLy8gcmVxdWlyZWRcblx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxuXHRcdH07XG5cblx0XHRjb25zdCBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApO1xuXG5cdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYW4gYWxsb3dsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcblx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRpZiAoIF9zdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcblxuXHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHRzO1xuXG5cdH0sXG5cblx0ZmluZE5vZGU6IGZ1bmN0aW9uICggcm9vdCwgbm9kZU5hbWUgKSB7XG5cblx0XHRpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICcnIHx8IG5vZGVOYW1lID09PSAnLicgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XG5cblx0XHRcdHJldHVybiByb290O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xuXG5cdFx0XHRjb25zdCBib25lID0gcm9vdC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKCBub2RlTmFtZSApO1xuXG5cdFx0XHRpZiAoIGJvbmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gbm9kZSBzdWJ0cmVlLlxuXHRcdGlmICggcm9vdC5jaGlsZHJlbiApIHtcblxuXHRcdFx0Y29uc3Qgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hpbGROb2RlLmNoaWxkcmVuICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XSxcblxuXHRTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogW1xuXG5cdFx0W1xuXHRcdFx0Ly8gRGlyZWN0XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBFbnRpcmVBcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEFycmF5RWxlbWVudFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdXG5cblx0XSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcblxuXHRcdC8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxuXHRcdC8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXG5cdFx0Ly8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcblx0XHQvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcblx0XHQvLyBiZWNvbWUgbm8tb3BzLlxuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHQvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGxldCB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGU7XG5cdFx0Y29uc3QgcGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aDtcblxuXHRcdGNvbnN0IG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWU7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWU7XG5cdFx0bGV0IHByb3BlcnR5SW5kZXggPSBwYXJzZWRQYXRoLnByb3BlcnR5SW5kZXg7XG5cblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHR0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlO1xuXG5cdFx0XHR0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cblx0XHQvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogJyArIHRoaXMucGF0aCArICcgYnV0IGl0IHdhc25cXCd0IGZvdW5kLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0bGV0IG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDtcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVhY2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4uLlxuXHRcdFx0c3dpdGNoICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdtYXRlcmlhbHMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnYm9uZXMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5za2VsZXRvbiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXJcblx0XHRcdFx0XHQvLyBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1lID09PSBvYmplY3RJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3RJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdGlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4nLCB0aGlzLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzb2x2ZSBwcm9wZXJ0eVxuXHRcdGNvbnN0IG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAnICsgbm9kZU5hbWUgK1xuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxuXHRcdGxldCB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XG5cblx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdGlmICggdGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG1hdGVyaWFsXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7XG5cblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybVxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0bGV0IGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJyApIHtcblxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgcHJvcGVydHlJbmRleCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSB0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBwcm9wZXJ0eUluZGV4IF07XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBvbiBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcblxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5vZGUgPSBudWxsO1xuXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xuXG5cdH1cblxufSApO1xuXG4vLyBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGVcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgLSBBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZVxuICogICAgY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiAgLSBJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLlxuICpcbiAqICAtIFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyXG4gKiAgICBpcyBydW5uaW5nLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAgT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlcixcbiAqICAgIHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmVcbiAqICAgIG9uIHRoZSBncm91cC5cbiAqXG4gKiBMaW1pdGF0aW9uOlxuICpcbiAqICAtIFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGVcbiAqICAgIGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLSBBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhXG4gKiAgICB0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC5cbiAqL1xuXG5jbGFzcyBBbmltYXRpb25PYmplY3RHcm91cCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHQvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwOyAvLyB0aHJlc2hvbGRcblx0XHQvLyBub3RlOiByZWFkIGJ5IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGVcblxuXHRcdGNvbnN0IGluZGljZXMgPSB7fTtcblx0XHR0aGlzLl9pbmRpY2VzQnlVVUlEID0gaW5kaWNlczsgLy8gZm9yIGJvb2trZWVwaW5nXG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fcGF0aHMgPSBbXTsgLy8gaW5zaWRlOiBzdHJpbmdcblx0XHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdOyAvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID5cblx0XHR0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsgLy8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5c1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdFx0b2JqZWN0czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGFkZCgpIHtcblxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRsZXQga25vd25PYmplY3QgPSB1bmRlZmluZWQsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQ7XG5cdFx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRjb25zdCBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0XHRsZXQgYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heVxuXHRcdFx0XHRcdFx0Ly8gb3IgbWF5IG5vdCBleGlzdFxuXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBrbm93bk9iamVjdCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICtcblx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9XG5cblx0cmVtb3ZlKCkge1xuXG5cdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRsZXQgbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdGNvbnN0IGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLFxuXHRcdFx0XHRcdGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgZmlyc3RBY3RpdmVPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBsYXN0Q2FjaGVkSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH1cblxuXHQvLyByZW1vdmUgJiBmb3JnZXRcblx0dW5jYWNoZSgpIHtcblxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0bGV0IG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdFx0Y29uc3QgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBjYWNoZWQgb2JqZWN0IHRha2VzIHRoaXMgb2JqZWN0J3MgcGxhY2Vcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBvYmplY3QgZ29lcyB0byB0aGUgYWN0aXZhdGVkIHNsb3QgYW5kIHBvcFxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcblxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOlxuXG5cdHN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxuXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtcblx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHJldHVybiBiaW5kaW5nc1sgaW5kZXggXTtcblxuXHRcdGNvbnN0IHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBvYmplY3QgPSBvYmplY3RzWyBpIF07XG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcblxuXHR9XG5cblx0dW5zdWJzY3JpYmVfKCBwYXRoICkge1xuXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xuXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5BbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUuaXNBbmltYXRpb25PYmplY3RHcm91cCA9IHRydWU7XG5cbmNsYXNzIEFuaW1hdGlvbkFjdGlvbiB7XG5cblx0Y29uc3RydWN0b3IoIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgPSBudWxsLCBibGVuZE1vZGUgPSBjbGlwLmJsZW5kTW9kZSApIHtcblxuXHRcdHRoaXMuX21peGVyID0gbWl4ZXI7XG5cdFx0dGhpcy5fY2xpcCA9IGNsaXA7XG5cdFx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290O1xuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xuXG5cdFx0Y29uc3QgdHJhY2tzID0gY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHtcblx0XHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cdFx0fTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApO1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHRcdH1cblxuXHRcdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAvLyBib3VuZCBieSB0aGUgbWl4ZXJcblxuXHRcdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdFx0dGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdFx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblx0XHR0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsgLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXG5cdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblxuXHRcdHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7XG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdFx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcblx0XHQvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0IG9mIHRoZSBhY3Rpb25cblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdFx0Ly8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvblxuXHRcdC8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3Bcblx0XHR0aGlzLnRpbWUgPSAwO1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSAxO1xuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7XG5cblx0XHR0aGlzLndlaWdodCA9IDE7XG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcblxuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgLy8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTsgLy8gdHJ1ZSAtPiB6ZXJvIGVmZmVjdGl2ZSB0aW1lIHNjYWxlXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTsgLy8gZmFsc2UgLT4gemVybyBlZmZlY3RpdmUgd2VpZ2h0XG5cblx0XHR0aGlzLmNsYW1wV2hlbkZpbmlzaGVkID0gZmFsc2U7Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdFx0dGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID0gdHJ1ZTsvLyBmb3Igc21vb3RoIGludGVycG9sYXRpb24gdy9vIHNlcGFyYXRlXG5cdFx0dGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxuXHR9XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheSgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN0b3AoKSB7XG5cblx0XHR0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVzZXQoKTtcblxuXHR9XG5cblx0cmVzZXQoKSB7XG5cblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cblx0XHR0aGlzLnRpbWUgPSAwOyAvLyByZXN0YXJ0IGNsaXBcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtIDE7Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsvLyBmb3JnZXQgc2NoZWR1bGluZ1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7XG5cblx0fVxuXG5cdGlzUnVubmluZygpIHtcblxuXHRcdHJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJlxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH1cblxuXHQvLyByZXR1cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkXG5cdGlzU2NoZWR1bGVkKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH1cblxuXHRzdGFydEF0KCB0aW1lICkge1xuXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gdGltZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wKCBtb2RlLCByZXBldGl0aW9ucyApIHtcblxuXHRcdHRoaXMubG9vcCA9IG1vZGU7XG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIFdlaWdodFxuXG5cdC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nXG5cdC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVdlaWdodCggd2VpZ2h0ICkge1xuXG5cdFx0dGhpcy53ZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHQvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1lXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHR9XG5cblx0Ly8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZFxuXHRnZXRFZmZlY3RpdmVXZWlnaHQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0O1xuXG5cdH1cblxuXHRmYWRlSW4oIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApO1xuXG5cdH1cblxuXHRmYWRlT3V0KCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDEsIDAgKTtcblxuXHR9XG5cblx0Y3Jvc3NGYWRlRnJvbSggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRmYWRlT3V0QWN0aW9uLmZhZGVPdXQoIGR1cmF0aW9uICk7XG5cdFx0dGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7XG5cblx0XHRpZiAoIHdhcnAgKSB7XG5cblx0XHRcdGNvbnN0IGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcblxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjcm9zc0ZhZGVUbyggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcblxuXHR9XG5cblx0c3RvcEZhZGluZygpIHtcblxuXHRcdGNvbnN0IHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gVGltZSBTY2FsZSBDb250cm9sXG5cblx0Ly8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgd2FycGluZ1xuXHQvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlVGltZVNjYWxlKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH1cblxuXHQvLyByZXR1cm4gdGhlIHRpbWUgc2NhbGUgY29uc2lkZXJpbmcgd2FycGluZyBhbmQgLnBhdXNlZFxuXHRnZXRFZmZlY3RpdmVUaW1lU2NhbGUoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH1cblxuXHRzZXREdXJhdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fVxuXG5cdHN5bmNXaXRoKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH1cblxuXHRoYWx0KCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9XG5cblx0d2FycCggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLFxuXHRcdFx0bm93ID0gbWl4ZXIudGltZSxcblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0bGV0IGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcblxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3RvcFdhcnBpbmcoKSB7XG5cblx0XHRjb25zdCB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIE9iamVjdCBBY2Nlc3NvcnNcblxuXHRnZXRNaXhlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9XG5cblx0Z2V0Q2xpcCgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH1cblxuXHRnZXRSb290KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9XG5cblx0Ly8gSW50ZXJuYVxuXG5cdF91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTtcblxuXHRcdGlmICggc3RhcnRUaW1lICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvblxuXG5cdFx0XHRjb25zdCB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuOyAvLyB5ZXQgdG8gY29tZSAvIGRvbid0IGRlY2lkZSB3aGVuIGRlbHRhID0gMFxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHN0YXJ0XG5cblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcblx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcblxuXHRcdH1cblxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xuXHRcdGNvbnN0IGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0Y29uc3Qgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cblx0XHRpZiAoIHdlaWdodCA+IDAgKSB7XG5cblx0XHRcdGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcblx0XHRcdGNvbnN0IHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0c3dpdGNoICggdGhpcy5ibGVuZE1vZGUgKSB7XG5cblx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTpcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xuXHRcdFx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlQWRkaXRpdmUoIHdlaWdodCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6XG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRfdXBkYXRlV2VpZ2h0KCB0aW1lICkge1xuXG5cdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0d2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZmFkZWQgb3V0LCBkaXNhYmxlXG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDtcblx0XHRyZXR1cm4gd2VpZ2h0O1xuXG5cdH1cblxuXHRfdXBkYXRlVGltZVNjYWxlKCB0aW1lICkge1xuXG5cdFx0bGV0IHRpbWVTY2FsZSA9IDA7XG5cblx0XHRpZiAoICEgdGhpcy5wYXVzZWQgKSB7XG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH1cblxuXHRfdXBkYXRlVGltZSggZGVsdGFUaW1lICkge1xuXG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uO1xuXHRcdGNvbnN0IGxvb3AgPSB0aGlzLmxvb3A7XG5cblx0XHRsZXQgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTtcblx0XHRsZXQgbG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xuXG5cdFx0Y29uc3QgcGluZ1BvbmcgPSAoIGxvb3AgPT09IExvb3BQaW5nUG9uZyApO1xuXG5cdFx0aWYgKCBkZWx0YVRpbWUgPT09IDAgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSByZXR1cm4gdGltZTtcblxuXHRcdFx0cmV0dXJuICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSA/IGR1cmF0aW9uIC0gdGltZSA6IHRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGxvb3AgPT09IExvb3BPbmNlICkge1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IDA7XG5cdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlX3N0b3A6IHtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gZHVyYXRpb247XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gMDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblxuXHRcdFx0XHRcdGJyZWFrIGhhbmRsZV9zdG9wO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XG5cblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcblxuXHRcdFx0XHRjb25zdCBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XG5cblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcblxuXHRcdFx0XHRjb25zdCBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLSAxXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBrZWVwIHJ1bm5pbmdcblxuXHRcdFx0XHRcdGlmICggcGVuZGluZyA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmRcblxuXHRcdFx0XHRcdFx0Y29uc3QgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aW1lO1xuXG5cdH1cblxuXHRfc2V0RW5kaW5ncyggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkge1xuXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXG5cblx0XHRcdGlmICggYXRTdGFydCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXRFbmQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRfc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XG5cblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lO1xuXHRcdGxldCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcblx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XG5cdFx0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIEFuaW1hdGlvbk1peGVyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcblxuXHRjb25zdHJ1Y3Rvciggcm9vdCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9yb290ID0gcm9vdDtcblx0XHR0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO1xuXHRcdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cdFx0dGhpcy50aW1lID0gMDtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxuXHR9XG5cblx0X2JpbmRBY3Rpb24oIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkge1xuXG5cdFx0Y29uc3Qgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtcblxuXHRcdGxldCBiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZTtcblxuXHRcdFx0bGV0IGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93c1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9hY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0Y29uc3Qgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRfZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuX3Rha2VCYWNrQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyKCkge1xuXG5cdFx0dGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cblx0XHR0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307XG5cdFx0Ly8gaW5zaWRlOlxuXHRcdC8vIHtcblx0XHQvLyBcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+IC0gdXNlZCBhcyBwcm90b3R5cGVzXG5cdFx0Ly8gXHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbiAtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRiaW5kaW5nczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXG5cblx0X2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHR9XG5cblx0X2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRsZXQgYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcblxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cblxuXHRcdFx0fTtcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcblxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3Qga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9XG5cblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHRjb25zdCBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxuXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcblxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcblxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XG5cblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9XG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZW5kQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcblxuXHR9XG5cblx0X3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxuXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcblxuXHR9XG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XG5cblx0XHRjb25zdCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRsZXQgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xuXG5cdH1cblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XG5cdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRpZiAoIE9iamVjdC5rZXlzKCBiaW5kaW5nQnlOYW1lICkubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZW5kQmluZGluZyggYmluZGluZyApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7XG5cblx0fVxuXG5cdF90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKSB7XG5cblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH1cblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSB7XG5cblx0XHRjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKys7XG5cblx0XHRsZXQgaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH1cblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIGludGVycG9sYW50ICkge1xuXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH1cblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlICkge1xuXG5cdFx0Y29uc3Qgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQ7XG5cblx0XHRsZXQgY2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/IEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcDtcblxuXHRcdGNvbnN0IGNsaXBVdWlkID0gY2xpcE9iamVjdCAhPT0gbnVsbCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXA7XG5cblx0XHRjb25zdCBhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cdFx0bGV0IHByb3RvdHlwZUFjdGlvbiA9IG51bGw7XG5cblx0XHRpZiAoIGJsZW5kTW9kZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0YmxlbmRNb2RlID0gY2xpcE9iamVjdC5ibGVuZE1vZGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmdBY3Rpb24uYmxlbmRNb2RlID09PSBibGVuZE1vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQWN0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsXG5cdFx0XHQvLyB0aGUgYmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHlcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdO1xuXG5cdFx0XHQvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb25cblx0XHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApXG5cdFx0XHRcdGNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7XG5cblx0XHR9XG5cblx0XHQvLyBjbGlwIG11c3QgYmUga25vd24gd2hlbiBzcGVjaWZpZWQgdmlhIHN0cmluZ1xuXHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXRcblx0XHRjb25zdCBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QsIGJsZW5kTW9kZSApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH1cblxuXHQvLyBnZXQgYW4gZXhpc3RpbmcgYWN0aW9uXG5cdGV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHRjb25zdCByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbigpIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdGZvciAoIGxldCBpID0gbkFjdGlvbnMgLSAxOyBpID49IDA7IC0tIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5zdG9wKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb25cblx0dXBkYXRlKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdHRpbWUgPSB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lLFxuXHRcdFx0dGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksXG5cblx0XHRcdGFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxO1xuXG5cdFx0Ly8gcnVuIGFjdGl2ZSBhY3Rpb25zXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIEFsbG93cyB5b3UgdG8gc2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gYW4gYW5pbWF0aW9uLlxuXHRzZXRUaW1lKCB0aW1lSW5TZWNvbmRzICkge1xuXG5cdFx0dGhpcy50aW1lID0gMDsgLy8gWmVybyBvdXQgdGltZSBhdHRyaWJ1dGUgZm9yIEFuaW1hdGlvbk1peGVyIG9iamVjdDtcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9hY3Rpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5fYWN0aW9uc1sgaSBdLnRpbWUgPSAwOyAvLyBaZXJvIG91dCB0aW1lIGF0dHJpYnV0ZSBmb3IgYWxsIGFzc29jaWF0ZWQgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHMuXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy51cGRhdGUoIHRpbWVJblNlY29uZHMgKTsgLy8gVXBkYXRlIHVzZWQgdG8gc2V0IGV4YWN0IHRpbWUuIFJldHVybnMgXCJ0aGlzXCIgQW5pbWF0aW9uTWl4ZXIgb2JqZWN0LlxuXG5cdH1cblxuXHQvLyByZXR1cm4gdGhpcyBtaXhlcidzIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHRnZXRSb290KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fVxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xpcFxuXHR1bmNhY2hlQ2xpcCggY2xpcCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XG5cblx0XHRcdGNvbnN0IGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHRjb25zdCBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHR1bmNhY2hlUm9vdCggcm9vdCApIHtcblxuXHRcdGNvbnN0IHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRmb3IgKCBjb25zdCBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGNvbnN0IHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlXG5cdHVuY2FjaGVBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbiA9IHRoaXMuZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0aWYgKCBhY3Rpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KCAxICk7XG5cbmNsYXNzIFVuaWZvcm0ge1xuXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7XG5cdFx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLFxuXG5cdGlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0Y29uc3QgaWIgPSBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY2xvbmUuY2FsbCggdGhpcywgZGF0YSApO1xuXG5cdFx0aWIubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiBpYjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0Y29uc3QganNvbiA9IEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgZGF0YSApO1xuXG5cdFx0anNvbi5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTtcblx0XHRqc29uLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gR0xCdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciwgdHlwZSwgaXRlbVNpemUsIGVsZW1lbnRTaXplLCBjb3VudCApIHtcblxuXHR0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcblx0dGhpcy50eXBlID0gdHlwZTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmVsZW1lbnRTaXplID0gZWxlbWVudFNpemU7XG5cdHRoaXMuY291bnQgPSBjb3VudDtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggR0xCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggR0xCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNHTEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBidWZmZXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFR5cGU6IGZ1bmN0aW9uICggdHlwZSwgZWxlbWVudFNpemUgKSB7XG5cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMuZWxlbWVudFNpemUgPSBlbGVtZW50U2l6ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SXRlbVNpemU6IGZ1bmN0aW9uICggaXRlbVNpemUgKSB7XG5cblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvdW50OiBmdW5jdGlvbiAoIGNvdW50ICkge1xuXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxufSApO1xuXG5mdW5jdGlvbiBSYXljYXN0ZXIoIG9yaWdpbiwgZGlyZWN0aW9uLCBuZWFyID0gMCwgZmFyID0gSW5maW5pdHkgKSB7XG5cblx0dGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdHRoaXMubmVhciA9IG5lYXI7XG5cdHRoaXMuZmFyID0gZmFyO1xuXHR0aGlzLmNhbWVyYSA9IG51bGw7XG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0TE9EOiB7fSxcblx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0U3ByaXRlOiB7fVxuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywge1xuXHRcdFBvaW50Q2xvdWQ6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuUG9pbnRzO1xuXG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCByYXljYXN0ZXIubGF5ZXJzICkgKSB7XG5cblx0XHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0fVxuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblx0XHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0fSBlbHNlIGlmICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZTogJyArIGNhbWVyYS50eXBlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUgPSBmYWxzZSwgaW50ZXJzZWN0cyA9IFtdICkge1xuXG5cdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVjdXJzaXZlID0gZmFsc2UsIGludGVyc2VjdHMgPSBbXSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0fVxuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xhciBhbmdsZSAocGhpKSBpcyBtZWFzdXJlZCBmcm9tIHRoZSBwb3NpdGl2ZSB5LWF4aXMuIFRoZSBwb3NpdGl2ZSB5LWF4aXMgaXMgdXAuXG4gKiBUaGUgYXppbXV0aGFsIGFuZ2xlICh0aGV0YSkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzLlxuICovXG5cbmNsYXNzIFNwaGVyaWNhbCB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHBoaSA9IDAsIHRoZXRhID0gMCApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpOyAvLyBwb2xhciBhbmdsZVxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTsgLy8gYXppbXV0aGFsIGFuZ2xlXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0KCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTtcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZSgpIHtcblxuXHRcdGNvbnN0IEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTtcblxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSAwO1xuXHRcdFx0dGhpcy5waGkgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBNYXRoVXRpbHMuY2xhbXAoIHkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKi9cblxuY2xhc3MgQ3lsaW5kcmljYWwge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB0aGV0YSA9IDAsIHkgPSAwICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHRcdHRoaXMueSA9IHk7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0KCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHogKiB6ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yJDQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5cbmNsYXNzIEJveDIge1xuXG5cdGNvbnN0cnVjdG9yKCBtaW4gPSBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApLCBtYXggPSBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApICkge1xuXG5cdFx0dGhpcy5taW4gPSBtaW47XG5cdFx0dGhpcy5tYXggPSBtYXg7XG5cblx0fVxuXG5cdHNldCggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IkNC5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdGNvcHkoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUVtcHR5KCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpc0VtcHR5KCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xuXG5cdH1cblxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fVxuXG5cdGdldFNpemUoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fVxuXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xuXG5cdH1cblxuXHRnZXRQYXJhbWV0ZXIoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxuXHRcdCk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXG5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdGNvbnN0IGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkNC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0KCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR1bmlvbiggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59XG5cbkJveDIucHJvdG90eXBlLmlzQm94MiA9IHRydWU7XG5cbmNvbnN0IF9zdGFydFAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfc3RhcnRFbmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIExpbmUzIHtcblxuXHRjb25zdHJ1Y3Rvciggc3RhcnQgPSBuZXcgVmVjdG9yMygpLCBlbmQgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0dGhpcy5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXG5cdH1cblxuXHRzZXQoIHN0YXJ0LCBlbmQgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q2VudGVyKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9XG5cblx0ZGVsdGEoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VTcSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH1cblxuXHRkaXN0YW5jZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fVxuXG5cdGF0KCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9XG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0X3N0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApO1xuXHRcdF9zdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdFx0Y29uc3Qgc3RhcnRFbmQyID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0RW5kICk7XG5cdFx0Y29uc3Qgc3RhcnRFbmRfc3RhcnRQID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0UCApO1xuXG5cdFx0bGV0IHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHR0ID0gTWF0aFV0aWxzLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblxuXHR9XG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGNsYW1wVG9MaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fVxuXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5zdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBsaW5lICkge1xuXG5cdFx0cmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKCB0aGlzLnN0YXJ0ICkgJiYgbGluZS5lbmQuZXF1YWxzKCB0aGlzLmVuZCApO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxuXHR0aGlzLmhhc1Bvc2l0aW9ucyA9IGZhbHNlO1xuXHR0aGlzLmhhc05vcm1hbHMgPSBmYWxzZTtcblx0dGhpcy5oYXNDb2xvcnMgPSBmYWxzZTtcblx0dGhpcy5oYXNVdnMgPSBmYWxzZTtcblxuXHR0aGlzLnBvc2l0aW9uQXJyYXkgPSBudWxsO1xuXHR0aGlzLm5vcm1hbEFycmF5ID0gbnVsbDtcblx0dGhpcy5jb2xvckFycmF5ID0gbnVsbDtcblx0dGhpcy51dkFycmF5ID0gbnVsbDtcblxuXHR0aGlzLmNvdW50ID0gMDtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuY29uc3QgX3ZlY3RvciQzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBTcG90TGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHRcdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gW1xuXHRcdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdFx0MCwgMCwgMCwgXHQxLCAwLCAxLFxuXHRcdFx0MCwgMCwgMCxcdC0gMSwgMCwgMSxcblx0XHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHRcdDAsIDAsIDAsIFx0MCwgLSAxLCAxXG5cdFx0XTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdGNvbnN0IHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XG5cdFx0XHRjb25zdCBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHRwb3NpdGlvbnMucHVzaChcblx0XHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdFx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHR9XG5cblx0ZGlzcG9zZSgpIHtcblxuXHRcdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHR9XG5cblx0dXBkYXRlKCkge1xuXG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Y29uc3QgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHRjb25zdCBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0XHRfdmVjdG9yJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggX3ZlY3RvciQzICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY29uc3QgX3ZlY3RvciQyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2JvbmVNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfbWF0cml4V29ybGRJbnYgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5cblxuY2xhc3MgU2tlbGV0b25IZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xuXG5cdGNvbnN0cnVjdG9yKCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xuXG5cdFx0Y29uc3QgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XG5cdFx0Y29uc3QgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NrZWxldG9uSGVscGVyJztcblx0XHR0aGlzLmlzU2tlbGV0b25IZWxwZXIgPSB0cnVlO1xuXG5cdFx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHRcdHRoaXMuYm9uZXMgPSBib25lcztcblxuXHRcdHRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxkO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdF9tYXRyaXhXb3JsZEludi5jb3B5KCB0aGlzLnJvb3QubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRfYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdFx0X3ZlY3RvciQyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCBfdmVjdG9yJDIueCwgX3ZlY3RvciQyLnksIF92ZWN0b3IkMi56ICk7XG5cblx0XHRcdFx0X2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX21hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRfdmVjdG9yJDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBfYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCBfdmVjdG9yJDIueCwgX3ZlY3RvciQyLnksIF92ZWN0b3IkMi56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkge1xuXG5cdGNvbnN0IGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5jbGFzcyBQb2ludExpZ2h0SGVscGVyIGV4dGVuZHMgTWVzaCB7XG5cblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBzcGhlcmVTaXplLCBjb2xvciApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IFNwaGVyZUdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7XG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHRIZWxwZXInO1xuXG5cdFx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXG5cdFx0Lypcblx0Ly8gVE9ETzogZGVsZXRlIHRoaXMgY29tbWVudD9cblx0Y29uc3QgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCAxLCAyICk7XG5cdGNvbnN0IGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcblxuXHRjb25zdCBkID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcblx0Ki9cblxuXHR9XG5cblx0ZGlzcG9zZSgpIHtcblxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0fVxuXG5cdFx0Lypcblx0XHRjb25zdCBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcblxuXHRcdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdFx0fVxuXHRcdCovXG5cblx0fVxuXG59XG5cbmNvbnN0IF92ZWN0b3IkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9jb2xvcjEgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xuY29uc3QgX2NvbG9yMiA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XG5cbmNsYXNzIEhlbWlzcGhlcmVMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25HZW9tZXRyeSggc2l6ZSApO1xuXHRcdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cdFx0aWYgKCB0aGlzLmNvbG9yID09PSB1bmRlZmluZWQgKSB0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9IHRydWU7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHRcdGNvbnN0IGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApO1xuXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zdCBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xuXG5cdFx0XHRfY29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdF9jb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBfY29sb3IxIDogX2NvbG9yMjtcblxuXHRcdFx0XHRjb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdG1lc2gubG9va0F0KCBfdmVjdG9yJDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgR3JpZEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIHNpemUgPSAxMCwgZGl2aXNpb25zID0gMTAsIGNvbG9yMSA9IDB4NDQ0NDQ0LCBjb2xvcjIgPSAweDg4ODg4OCApIHtcblxuXHRcdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICk7XG5cdFx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgKTtcblxuXHRcdGNvbnN0IGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdFx0Y29uc3Qgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7XG5cdFx0Y29uc3QgaGFsZlNpemUgPSBzaXplIC8gMjtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHRcdH1cblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdHcmlkSGVscGVyJztcblxuXHR9XG5cbn1cblxuY2xhc3MgUG9sYXJHcmlkSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcblxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMTAsIHJhZGlhbHMgPSAxNiwgY2lyY2xlcyA9IDgsIGRpdmlzaW9ucyA9IDY0LCBjb2xvcjEgPSAweDQ0NDQ0NCwgY29sb3IyID0gMHg4ODg4ODggKSB7XG5cblx0XHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSApO1xuXHRcdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICk7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xuXG5cdFx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgdiA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0Y29uc3QgeCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XG5cdFx0XHRjb25zdCB6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0XHQvLyBjcmVhdGUgdGhlIGNpcmNsZXNcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29uc3QgciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIGZpcnN0IHZlcnRleFxuXG5cdFx0XHRcdGxldCB2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdFx0bGV0IHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdFx0bGV0IHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxuXG5cdFx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvbGFyR3JpZEhlbHBlcic7XG5cblx0fVxuXG59XG5cbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7XG5cblx0XHRsZXQgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0XHQtIHNpemUsIHNpemUsIDAsXG5cdFx0XHRzaXplLCBzaXplLCAwLFxuXHRcdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdFx0LSBzaXplLCAtIHNpemUsIDAsXG5cdFx0XHQtIHNpemUsIHNpemUsIDBcblx0XHRdLCAzICkgKTtcblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdHRoaXMubGlnaHRQbGFuZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0XHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTtcblxuXHRcdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHR9XG5cblx0dXBkYXRlKCkge1xuXG5cdFx0X3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdF92Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0X3YzLnN1YlZlY3RvcnMoIF92MiwgX3YxICk7XG5cblx0XHR0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCBfdjIgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIF92MiApO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5zY2FsZS56ID0gX3YzLmxlbmd0aCgpO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2NhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IENhbWVyYSgpO1xuXG4vKipcbiAqXHQtIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQgYW5kIHVwIG9mIHRoZSBjYW1lcmFcbiAqXHQtIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXNcbiAqIFx0LSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZVxuICpcdFx0aHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90ZXN0cy9zaGFkb3dtYXAuaHRtbFxuICovXG5cbmNsYXNzIENhbWVyYUhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3QgY29sb3JzID0gW107XG5cblx0XHRjb25zdCBwb2ludE1hcCA9IHt9O1xuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHRjb25zdCBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdFx0Y29uc3QgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHRcdGNvbnN0IGNvbG9yVXAgPSBuZXcgQ29sb3IoIDB4MDBhYWZmICk7XG5cdFx0Y29uc3QgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdFx0Y29uc3QgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdGFkZExpbmUoICduMScsICduMicsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduNCcsICduMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduMycsICduMScsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdFx0Ly8gZmFyXG5cblx0XHRhZGRMaW5lKCAnZjEnLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjInLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjMnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHRcdC8vIHNpZGVzXG5cblx0XHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjMnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHRcdC8vIGNvbmVcblxuXHRcdGFkZExpbmUoICdwJywgJ24xJywgY29sb3JDb25lICk7XG5cdFx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0XHRhZGRMaW5lKCAncCcsICduMycsIGNvbG9yQ29uZSApO1xuXHRcdGFkZExpbmUoICdwJywgJ240JywgY29sb3JDb25lICk7XG5cblx0XHQvLyB1cFxuXG5cdFx0YWRkTGluZSggJ3UxJywgJ3UyJywgY29sb3JVcCApO1xuXHRcdGFkZExpbmUoICd1MicsICd1MycsIGNvbG9yVXAgKTtcblx0XHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0XHQvLyB0YXJnZXRcblxuXHRcdGFkZExpbmUoICdjJywgJ3QnLCBjb2xvclRhcmdldCApO1xuXHRcdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0XHQvLyBjcm9zc1xuXG5cdFx0YWRkTGluZSggJ2NuMScsICdjbjInLCBjb2xvckNyb3NzICk7XG5cdFx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0XHRhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTtcblx0XHRhZGRMaW5lKCAnY2YzJywgJ2NmNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRcdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRcdGFkZFBvaW50KCBiLCBjb2xvciApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBvaW50TWFwWyBpZCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDYW1lcmFIZWxwZXInO1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdFx0aWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHR0aGlzLnBvaW50TWFwID0gcG9pbnRNYXA7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgcG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xuXG5cdFx0Y29uc3QgdyA9IDEsIGggPSAxO1xuXG5cdFx0Ly8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeCBpbnZlcnNlXG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdF9jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3QnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIDEgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdHNldFBvaW50KCAnbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICduNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgMSApO1xuXG5cdFx0Ly8gdXBcblxuXHRcdHNldFBvaW50KCAndTEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCAndTInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCAqIDIsIC0gMSApO1xuXG5cdFx0Ly8gY3Jvc3NcblxuXHRcdHNldFBvaW50KCAnY2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIDAsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgMSApO1xuXG5cdFx0c2V0UG9pbnQoICdjbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY24zJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY240JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHBvaW50TWFwLCBnZW9tZXRyeSwgY2FtZXJhLCB4LCB5LCB6ICkge1xuXG5cdF92ZWN0b3Iuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHRjb25zdCBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTtcblxuXHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XG5cbmNsYXNzIEJveEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIG9iamVjdCwgY29sb3IgPSAweGZmZmYwMCApIHtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cdFx0Y29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XG5cblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0XHR0aGlzLnR5cGUgPSAnQm94SGVscGVyJztcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHR9XG5cblx0dXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9ib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdGlmICggX2JveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHRjb25zdCBtaW4gPSBfYm94Lm1pbjtcblx0XHRjb25zdCBtYXggPSBfYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0XHQ1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHRcdGFycmF5WyAwIF0gPSBtYXgueDsgYXJyYXlbIDEgXSA9IG1heC55OyBhcnJheVsgMiBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDMgXSA9IG1pbi54OyBhcnJheVsgNCBdID0gbWF4Lnk7IGFycmF5WyA1IF0gPSBtYXguejtcblx0XHRhcnJheVsgNiBdID0gbWluLng7IGFycmF5WyA3IF0gPSBtaW4ueTsgYXJyYXlbIDggXSA9IG1heC56O1xuXHRcdGFycmF5WyA5IF0gPSBtYXgueDsgYXJyYXlbIDEwIF0gPSBtaW4ueTsgYXJyYXlbIDExIF0gPSBtYXguejtcblx0XHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE4IF0gPSBtaW4ueDsgYXJyYXlbIDE5IF0gPSBtaW4ueTsgYXJyYXlbIDIwIF0gPSBtaW4uejtcblx0XHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXG5cdH1cblxuXHRzZXRGcm9tT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdExpbmVTZWdtZW50cy5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMub2JqZWN0ID0gc291cmNlLm9iamVjdDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5jbGFzcyBCb3gzSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcblxuXHRjb25zdHJ1Y3RvciggYm94LCBjb2xvciA9IDB4ZmZmZjAwICkge1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdFx0dGhpcy5ib3ggPSBib3g7XG5cblx0XHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRjb25zdCBib3ggPSB0aGlzLmJveDtcblxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRcdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcblxuXHRcdGJveC5nZXRTaXplKCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBQbGFuZUhlbHBlciBleHRlbmRzIExpbmUge1xuXG5cdGNvbnN0cnVjdG9yKCBwbGFuZSwgc2l6ZSA9IDEsIGhleCA9IDB4ZmZmZjAwICkge1xuXG5cdFx0Y29uc3QgY29sb3IgPSBoZXg7XG5cblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbIDEsIC0gMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAwLCAwIF07XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJztcblxuXHRcdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHRcdHRoaXMuc2l6ZSA9IHNpemU7XG5cblx0XHRjb25zdCBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdFx0Z2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKSApO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRsZXQgc2NhbGUgPSAtIHRoaXMucGxhbmUuY29uc3RhbnQ7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXJcblxuXHRcdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5zaWRlID0gKCBzY2FsZSA8IDAgKSA/IEJhY2tTaWRlIDogRnJvbnRTaWRlOyAvLyByZW5kZXJlciBmbGlwcyBzaWRlIHdoZW4gZGV0ZXJtaW5hbnQgPCAwOyBmbGlwcGluZyBub3Qgd2FudGVkIGhlcmVcblxuXHRcdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xuXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9heGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xubGV0IF9saW5lR2VvbWV0cnksIF9jb25lR2VvbWV0cnk7XG5cbmNsYXNzIEFycm93SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRjb25zdHJ1Y3RvciggZGlyID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwgb3JpZ2luID0gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKSwgbGVuZ3RoID0gMSwgY29sb3IgPSAweGZmZmYwMCwgaGVhZExlbmd0aCA9IGxlbmd0aCAqIDAuMiwgaGVhZFdpZHRoID0gaGVhZExlbmd0aCAqIDAuMiApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQXJyb3dIZWxwZXInO1xuXG5cdFx0aWYgKCBfbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9saW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRcdF9saW5lR2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0XHRfY29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdFx0X2NvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xuXG5cdFx0dGhpcy5saW5lID0gbmV3IExpbmUoIF9saW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXHRcdHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdFx0dGhpcy5jb25lID0gbmV3IE1lc2goIF9jb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXHRcdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdFx0dGhpcy5zZXREaXJlY3Rpb24oIGRpciApO1xuXHRcdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG5cdH1cblxuXHRzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2F4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRjb25zdCByYWRpYW5zID0gTWF0aC5hY29zKCBkaXIueSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggX2F4aXMsIHJhZGlhbnMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGggPSBsZW5ndGggKiAwLjIsIGhlYWRXaWR0aCA9IGhlYWRMZW5ndGggKiAwLjIgKSB7XG5cblx0XHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMC4wMDAxLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEgKTsgLy8gc2VlICMxNzQ1OFxuXHRcdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cdFx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdFx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdH1cblxuXHRzZXRDb2xvciggY29sb3IgKSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIGNvbG9yICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHRoaXMubGluZS5jb3B5KCBzb3VyY2UubGluZSApO1xuXHRcdHRoaXMuY29uZS5jb3B5KCBzb3VyY2UuY29uZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIEF4ZXNIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xuXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXHRcdFx0MCwgMCwgMCxcdHNpemUsIDAsIDAsXG5cdFx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcblx0XHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdFx0XTtcblxuXHRcdGNvbnN0IGNvbG9ycyA9IFtcblx0XHRcdDEsIDAsIDAsXHQxLCAwLjYsIDAsXG5cdFx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxuXHRcdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRcdF07XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQXhlc0hlbHBlcic7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9mbG9hdFZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KCAxICk7XG5jb25zdCBfaW50MzJWaWV3ID0gbmV3IEludDMyQXJyYXkoIF9mbG9hdFZpZXcuYnVmZmVyICk7XG5cbmNvbnN0IERhdGFVdGlscyA9IHtcblxuXHQvLyBDb252ZXJ0cyBmbG9hdDMyIHRvIGZsb2F0MTYgKHN0b3JlZCBhcyB1aW50MTYgdmFsdWUpLlxuXG5cdHRvSGFsZkZsb2F0OiBmdW5jdGlvbiAoIHZhbCApIHtcblxuXHRcdC8vIFNvdXJjZTogaHR0cDovL2dhbWVkZXYuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzE3MzI2L2NvbnZlcnNpb24tb2YtYS1udW1iZXItZnJvbS1zaW5nbGUtcHJlY2lzaW9uLWZsb2F0aW5nLXBvaW50LXJlcHJlc2VudGF0aW9uLXRvLWEvMTc0MTAjMTc0MTBcblxuXHRcdC8qIFRoaXMgbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZSBPcGVuRVhSIGltcGxlbWVudGF0aW9uICh2ZXJ5IG9mdGVuXG5cdFx0KiB1c2VkLCBlZy4gaW4gT2dyZSksIHdpdGggdGhlIGFkZGl0aW9uYWwgYmVuZWZpdCBvZiByb3VuZGluZywgaW5zcGlyZWRcblx0XHQqIGJ5IEphbWVzIFR1cnNhP3MgaGFsZi1wcmVjaXNpb24gY29kZS4gKi9cblxuXHRcdF9mbG9hdFZpZXdbIDAgXSA9IHZhbDtcblx0XHRjb25zdCB4ID0gX2ludDMyVmlld1sgMCBdO1xuXG5cdFx0bGV0IGJpdHMgPSAoIHggPj4gMTYgKSAmIDB4ODAwMDsgLyogR2V0IHRoZSBzaWduICovXG5cdFx0bGV0IG0gPSAoIHggPj4gMTIgKSAmIDB4MDdmZjsgLyogS2VlcCBvbmUgZXh0cmEgYml0IGZvciByb3VuZGluZyAqL1xuXHRcdGNvbnN0IGUgPSAoIHggPj4gMjMgKSAmIDB4ZmY7IC8qIFVzaW5nIGludCBpcyBmYXN0ZXIgaGVyZSAqL1xuXG5cdFx0LyogSWYgemVybywgb3IgZGVub3JtYWwsIG9yIGV4cG9uZW50IHVuZGVyZmxvd3MgdG9vIG11Y2ggZm9yIGEgZGVub3JtYWxcblx0XHRcdCogaGFsZiwgcmV0dXJuIHNpZ25lZCB6ZXJvLiAqL1xuXHRcdGlmICggZSA8IDEwMyApIHJldHVybiBiaXRzO1xuXG5cdFx0LyogSWYgTmFOLCByZXR1cm4gTmFOLiBJZiBJbmYgb3IgZXhwb25lbnQgb3ZlcmZsb3csIHJldHVybiBJbmYuICovXG5cdFx0aWYgKCBlID4gMTQyICkge1xuXG5cdFx0XHRiaXRzIHw9IDB4N2MwMDtcblx0XHRcdC8qIElmIGV4cG9uZW50IHdhcyAweGZmIGFuZCBvbmUgbWFudGlzc2EgYml0IHdhcyBzZXQsIGl0IG1lYW5zIE5hTixcblx0XHRcdFx0XHRcdCogbm90IEluZiwgc28gbWFrZSBzdXJlIHdlIHNldCBvbmUgbWFudGlzc2EgYml0IHRvby4gKi9cblx0XHRcdGJpdHMgfD0gKCAoIGUgPT0gMjU1ICkgPyAwIDogMSApICYmICggeCAmIDB4MDA3ZmZmZmYgKTtcblx0XHRcdHJldHVybiBiaXRzO1xuXG5cdFx0fVxuXG5cdFx0LyogSWYgZXhwb25lbnQgdW5kZXJmbG93cyBidXQgbm90IHRvbyBtdWNoLCByZXR1cm4gYSBkZW5vcm1hbCAqL1xuXHRcdGlmICggZSA8IDExMyApIHtcblxuXHRcdFx0bSB8PSAweDA4MDA7XG5cdFx0XHQvKiBFeHRyYSByb3VuZGluZyBtYXkgb3ZlcmZsb3cgYW5kIHNldCBtYW50aXNzYSB0byAwIGFuZCBleHBvbmVudFxuXHRcdFx0XHQqIHRvIDEsIHdoaWNoIGlzIE9LLiAqL1xuXHRcdFx0Yml0cyB8PSAoIG0gPj4gKCAxMTQgLSBlICkgKSArICggKCBtID4+ICggMTEzIC0gZSApICkgJiAxICk7XG5cdFx0XHRyZXR1cm4gYml0cztcblxuXHRcdH1cblxuXHRcdGJpdHMgfD0gKCAoIGUgLSAxMTIgKSA8PCAxMCApIHwgKCBtID4+IDEgKTtcblx0XHQvKiBFeHRyYSByb3VuZGluZy4gQW4gb3ZlcmZsb3cgd2lsbCBzZXQgbWFudGlzc2EgdG8gMCBhbmQgaW5jcmVtZW50XG5cdFx0XHQqIHRoZSBleHBvbmVudCwgd2hpY2ggaXMgT0suICovXG5cdFx0Yml0cyArPSBtICYgMTtcblx0XHRyZXR1cm4gYml0cztcblxuXHR9XG5cbn07XG5cbmNvbnN0IExPRF9NSU4gPSA0O1xuY29uc3QgTE9EX01BWCA9IDg7XG5jb25zdCBTSVpFX01BWCA9IE1hdGgucG93KCAyLCBMT0RfTUFYICk7XG5cbi8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIChyYWRpYW5zKSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dHJhIG1pcHMuIFRoZXNlIGFyZVxuLy8gY2hvc2VuIHRvIGFwcHJveGltYXRlIGEgVHJvd2JyaWRnZS1SZWl0eiBkaXN0cmlidXRpb24gZnVuY3Rpb24gdGltZXMgdGhlXG4vLyBnZW9tZXRyaWMgc2hhZG93aW5nIGZ1bmN0aW9uLiBUaGVzZSBzaWdtYSB2YWx1ZXMgc3F1YXJlZCBtdXN0IG1hdGNoIHRoZVxuLy8gdmFyaWFuY2UgI2RlZmluZXMgaW4gY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMuXG5jb25zdCBFWFRSQV9MT0RfU0lHTUEgPSBbIDAuMTI1LCAwLjIxNSwgMC4zNSwgMC40NDYsIDAuNTI2LCAwLjU4MiBdO1xuXG5jb25zdCBUT1RBTF9MT0RTID0gTE9EX01BWCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDtcblxuLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBibHVyIGZvciBsb29wLiBTbWFsbGVyIHNpZ21hcyB3aWxsIHVzZSBmZXdlclxuLy8gc2FtcGxlcyBhbmQgZXhpdCBlYXJseSwgYnV0IG5vdCByZWNvbXBpbGUgdGhlIHNoYWRlci5cbmNvbnN0IE1BWF9TQU1QTEVTID0gMjA7XG5cbmNvbnN0IEVOQ09ESU5HUyA9IHtcblx0WyBMaW5lYXJFbmNvZGluZyBdOiAwLFxuXHRbIHNSR0JFbmNvZGluZyBdOiAxLFxuXHRbIFJHQkVFbmNvZGluZyBdOiAyLFxuXHRbIFJHQk03RW5jb2RpbmcgXTogMyxcblx0WyBSR0JNMTZFbmNvZGluZyBdOiA0LFxuXHRbIFJHQkRFbmNvZGluZyBdOiA1LFxuXHRbIEdhbW1hRW5jb2RpbmcgXTogNlxufTtcblxuY29uc3QgYmFja2dyb3VuZE1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7XG5cdHNpZGU6IEJhY2tTaWRlLFxuXHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0ZGVwdGhUZXN0OiBmYWxzZSxcbn0gKTtcbmNvbnN0IGJhY2tncm91bmRCb3ggPSBuZXcgTWVzaCggbmV3IEJveEdlb21ldHJ5KCksIGJhY2tncm91bmRNYXRlcmlhbCApO1xuXG5jb25zdCBfZmxhdENhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgpO1xuY29uc3QgeyBfbG9kUGxhbmVzLCBfc2l6ZUxvZHMsIF9zaWdtYXMgfSA9IC8qQF9fUFVSRV9fKi8gX2NyZWF0ZVBsYW5lcygpO1xuY29uc3QgX2NsZWFyQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xubGV0IF9vbGRUYXJnZXQgPSBudWxsO1xuXG4vLyBHb2xkZW4gUmF0aW9cbmNvbnN0IFBISSA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuY29uc3QgSU5WX1BISSA9IDEgLyBQSEk7XG5cbi8vIFZlcnRpY2VzIG9mIGEgZG9kZWNhaGVkcm9uIChleGNlcHQgdGhlIG9wcG9zaXRlcywgd2hpY2ggcmVwcmVzZW50IHRoZVxuLy8gc2FtZSBheGlzKSwgdXNlZCBhcyBheGlzIGRpcmVjdGlvbnMgZXZlbmx5IHNwcmVhZCBvbiBhIHNwaGVyZS5cbmNvbnN0IF9heGlzRGlyZWN0aW9ucyA9IFtcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMSwgMSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIDEgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMSwgLSAxICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gMSwgMSwgLSAxICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIFBISSwgSU5WX1BISSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCBQSEksIC0gSU5WX1BISSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCBJTlZfUEhJLCAwLCBQSEkgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggLSBJTlZfUEhJLCAwLCBQSEkgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggUEhJLCBJTlZfUEhJLCAwICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gUEhJLCBJTlZfUEhJLCAwICkgXTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhIFByZWZpbHRlcmVkLCBNaXBtYXBwZWQgUmFkaWFuY2UgRW52aXJvbm1lbnQgTWFwXG4gKiAoUE1SRU0pIGZyb20gYSBjdWJlTWFwIGVudmlyb25tZW50IHRleHR1cmUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBsZXZlbHMgb2ZcbiAqIGJsdXIgdG8gYmUgcXVpY2tseSBhY2Nlc3NlZCBiYXNlZCBvbiBtYXRlcmlhbCByb3VnaG5lc3MuIEl0IGlzIHBhY2tlZCBpbnRvIGFcbiAqIHNwZWNpYWwgQ3ViZVVWIGZvcm1hdCB0aGF0IGFsbG93cyB1cyB0byBwZXJmb3JtIGN1c3RvbSBpbnRlcnBvbGF0aW9uIHNvIHRoYXRcbiAqIHdlIGNhbiBzdXBwb3J0IG5vbmxpbmVhciBmb3JtYXRzIHN1Y2ggYXMgUkdCRS4gVW5saWtlIGEgdHJhZGl0aW9uYWwgbWlwbWFwXG4gKiBjaGFpbiwgaXQgb25seSBnb2VzIGRvd24gdG8gdGhlIExPRF9NSU4gbGV2ZWwgKGFib3ZlKSwgYW5kIHRoZW4gY3JlYXRlcyBleHRyYVxuICogZXZlbiBtb3JlIGZpbHRlcmVkICdtaXBzJyBhdCB0aGUgc2FtZSBMT0RfTUlOIHJlc29sdXRpb24sIGFzc29jaWF0ZWQgd2l0aFxuICogaGlnaGVyIHJvdWdobmVzcyBsZXZlbHMuIEluIHRoaXMgd2F5IHdlIG1haW50YWluIHJlc29sdXRpb24gdG8gc21vb3RobHlcbiAqIGludGVycG9sYXRlIGRpZmZ1c2UgbGlnaHRpbmcgd2hpbGUgbGltaXRpbmcgc2FtcGxpbmcgY29tcHV0YXRpb24uXG4gKlxuICogUGFwZXI6IEZhc3QsIEFjY3VyYXRlIEltYWdlLUJhc2VkIExpZ2h0aW5nXG4gKiBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzE1eThyX1VwS2xVOVN2VjRJTGIwQzNxQ1BlY1M4cHZMei92aWV3XG4qL1xuXG5mdW5jdGlvbiBjb252ZXJ0TGluZWFyVG9SR0JFKCBjb2xvciApIHtcblxuXHRjb25zdCBtYXhDb21wb25lbnQgPSBNYXRoLm1heCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXHRjb25zdCBmRXhwID0gTWF0aC5taW4oIE1hdGgubWF4KCBNYXRoLmNlaWwoIE1hdGgubG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLSAxMjguMCApLCAxMjcuMCApO1xuXHRjb2xvci5tdWx0aXBseVNjYWxhciggTWF0aC5wb3coIDIuMCwgLSBmRXhwICkgKTtcblxuXHRjb25zdCBhbHBoYSA9ICggZkV4cCArIDEyOC4wICkgLyAyNTUuMDtcblx0cmV0dXJuIGFscGhhO1xuXG59XG5cbmNsYXNzIFBNUkVNR2VuZXJhdG9yIHtcblxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIgKSB7XG5cblx0XHR0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xuXHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IF9nZXRCbHVyU2hhZGVyKCBNQVhfU0FNUExFUyApO1xuXHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gbnVsbDtcblx0XHR0aGlzLl9jdWJlbWFwU2hhZGVyID0gbnVsbDtcblxuXHRcdHRoaXMuX2NvbXBpbGVNYXRlcmlhbCggdGhpcy5fYmx1ck1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGEgc3VwcGxpZWQgU2NlbmUsIHdoaWNoIGNhbiBiZSBmYXN0ZXIgdGhhbiB1c2luZyBhblxuXHQgKiBpbWFnZSBpZiBuZXR3b3JraW5nIGJhbmR3aWR0aCBpcyBsb3cuIE9wdGlvbmFsIHNpZ21hIHNwZWNpZmllcyBhIGJsdXIgcmFkaXVzXG5cdCAqIGluIHJhZGlhbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2NlbmUgYmVmb3JlIFBNUkVNIGdlbmVyYXRpb24uIE9wdGlvbmFsIG5lYXJcblx0ICogYW5kIGZhciBwbGFuZXMgZW5zdXJlIHRoZSBzY2VuZSBpcyByZW5kZXJlZCBpbiBpdHMgZW50aXJldHkgKHRoZSBjdWJlQ2FtZXJhXG5cdCAqIGlzIHBsYWNlZCBhdCB0aGUgb3JpZ2luKS5cblx0ICovXG5cdGZyb21TY2VuZSggc2NlbmUsIHNpZ21hID0gMCwgbmVhciA9IDAuMSwgZmFyID0gMTAwICkge1xuXG5cdFx0X29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO1xuXG5cdFx0dGhpcy5fc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0aWYgKCBzaWdtYSA+IDAgKSB7XG5cblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgc2lnbWEgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuX2NsZWFudXAoIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXG5cdCAqIChSR0JGb3JtYXQpIG9yIEhEUiAoUkdCRUZvcm1hdCkuIFRoZSBpZGVhbCBpbnB1dCBpbWFnZSBzaXplIGlzIDFrICgxMDI0IHggNTEyKSxcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxuXHQgKi9cblx0ZnJvbUVxdWlyZWN0YW5ndWxhciggZXF1aXJlY3Rhbmd1bGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gY3ViZW1hcCB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxuXHQgKiAoUkdCRm9ybWF0KSBvciBIRFIgKFJHQkVGb3JtYXQpLiBUaGUgaWRlYWwgaW5wdXQgY3ViZSBzaXplIGlzIDI1NiB4IDI1Nixcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxuXHQgKi9cblx0ZnJvbUN1YmVtYXAoIGN1YmVtYXAgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGN1YmVtYXAgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFByZS1jb21waWxlcyB0aGUgY3ViZW1hcCBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcblx0ICogeW91ciB0ZXh0dXJlJ3MgbmV0d29yayBmZXRjaCBmb3IgaW5jcmVhc2VkIGNvbmN1cnJlbmN5LlxuXHQgKi9cblx0Y29tcGlsZUN1YmVtYXBTaGFkZXIoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2N1YmVtYXBTaGFkZXIgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2N1YmVtYXBTaGFkZXIgPSBfZ2V0Q3ViZW1hcFNoYWRlcigpO1xuXHRcdFx0dGhpcy5fY29tcGlsZU1hdGVyaWFsKCB0aGlzLl9jdWJlbWFwU2hhZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGVxdWlyZWN0YW5ndWxhciBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcblx0ICogeW91ciB0ZXh0dXJlJ3MgbmV0d29yayBmZXRjaCBmb3IgaW5jcmVhc2VkIGNvbmN1cnJlbmN5LlxuXHQgKi9cblx0Y29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpIHtcblxuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RTaGFkZXIgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gX2dldEVxdWlyZWN0U2hhZGVyKCk7XG5cdFx0XHR0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2VxdWlyZWN0U2hhZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwb3NlcyBvZiB0aGUgUE1SRU1HZW5lcmF0b3IncyBpbnRlcm5hbCBtZW1vcnkuIE5vdGUgdGhhdCBQTVJFTUdlbmVyYXRvciBpcyBhIHN0YXRpYyBjbGFzcyxcblx0ICogc28geW91IHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gb25lIFBNUkVNR2VuZXJhdG9yIG9iamVjdC4gSWYgeW91IGRvLCBjYWxsaW5nIGRpc3Bvc2UoKSBvblxuXHQgKiBvbmUgb2YgdGhlbSB3aWxsIGNhdXNlIGFueSBvdGhlcnMgdG8gYWxzbyBiZWNvbWUgdW51c2FibGUuXG5cdCAqL1xuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHRcdGlmICggdGhpcy5fY3ViZW1hcFNoYWRlciAhPT0gbnVsbCApIHRoaXMuX2N1YmVtYXBTaGFkZXIuZGlzcG9zZSgpO1xuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RTaGFkZXIgIT09IG51bGwgKSB0aGlzLl9lcXVpcmVjdFNoYWRlci5kaXNwb3NlKCk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBfbG9kUGxhbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0X2xvZFBsYW5lc1sgaSBdLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gcHJpdmF0ZSBpbnRlcmZhY2VcblxuXHRfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xuXG5cdFx0dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpO1xuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggX29sZFRhcmdldCApO1xuXHRcdG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlO1xuXHRcdF9zZXRWaWV3cG9ydCggb3V0cHV0VGFyZ2V0LCAwLCAwLCBvdXRwdXRUYXJnZXQud2lkdGgsIG91dHB1dFRhcmdldC5oZWlnaHQgKTtcblxuXHR9XG5cblx0X2Zyb21UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0X29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cyggdGV4dHVyZSApO1xuXHRcdHRoaXMuX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5fY2xlYW51cCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xuXG5cdH1cblxuXHRfYWxsb2NhdGVUYXJnZXRzKCB0ZXh0dXJlICkgeyAvLyB3YXJuaW5nOiBudWxsIHRleHR1cmUgaXMgdmFsaWRcblxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0XHRcdG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0XHRcdGdlbmVyYXRlTWlwbWFwczogZmFsc2UsXG5cdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxuXHRcdFx0Zm9ybWF0OiBSR0JFRm9ybWF0LFxuXHRcdFx0ZW5jb2Rpbmc6IF9pc0xEUiggdGV4dHVyZSApID8gdGV4dHVyZS5lbmNvZGluZyA6IFJHQkVFbmNvZGluZyxcblx0XHRcdGRlcHRoQnVmZmVyOiBmYWxzZVxuXHRcdH07XG5cblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCBwYXJhbXMgKTtcblx0XHRjdWJlVVZSZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSB0ZXh0dXJlID8gZmFsc2UgOiB0cnVlO1xuXHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gX2NyZWF0ZVJlbmRlclRhcmdldCggcGFyYW1zICk7XG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcblxuXHR9XG5cblx0X2NvbXBpbGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCB0bXBNZXNoID0gbmV3IE1lc2goIF9sb2RQbGFuZXNbIDAgXSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLl9yZW5kZXJlci5jb21waWxlKCB0bXBNZXNoLCBfZmxhdENhbWVyYSApO1xuXG5cdH1cblxuXHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZm92ID0gOTA7XG5cdFx0Y29uc3QgYXNwZWN0ID0gMTtcblx0XHRjb25zdCBjdWJlQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y29uc3QgdXBTaWduID0gWyAxLCAtIDEsIDEsIDEsIDEsIDEgXTtcblx0XHRjb25zdCBmb3J3YXJkU2lnbiA9IFsgMSwgMSwgMSwgLSAxLCAtIDEsIC0gMSBdO1xuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XG5cblx0XHRjb25zdCBvcmlnaW5hbEF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcblx0XHRjb25zdCBvdXRwdXRFbmNvZGluZyA9IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nO1xuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XG5cdFx0cmVuZGVyZXIuZ2V0Q2xlYXJDb2xvciggX2NsZWFyQ29sb3IgKTtcblxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcblx0XHRyZW5kZXJlci5vdXRwdXRFbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xuXG5cdFx0bGV0IHVzZVNvbGlkQ29sb3IgPSBmYWxzZTtcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblx0XHRpZiAoIGJhY2tncm91bmQgKSB7XG5cblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGJhY2tncm91bmRNYXRlcmlhbC5jb2xvci5jb3B5KCBiYWNrZ3JvdW5kICkuY29udmVydFNSR0JUb0xpbmVhcigpO1xuXHRcdFx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcblxuXHRcdFx0XHRjb25zdCBhbHBoYSA9IGNvbnZlcnRMaW5lYXJUb1JHQkUoIGJhY2tncm91bmRNYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0XHRiYWNrZ3JvdW5kTWF0ZXJpYWwub3BhY2l0eSA9IGFscGhhO1xuXHRcdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLmNvbG9yLmNvcHkoIF9jbGVhckNvbG9yICkuY29udmVydFNSR0JUb0xpbmVhcigpO1xuXG5cdFx0XHRjb25zdCBhbHBoYSA9IGNvbnZlcnRMaW5lYXJUb1JHQkUoIGJhY2tncm91bmRNYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLm9wYWNpdHkgPSBhbHBoYTtcblx0XHRcdHVzZVNvbGlkQ29sb3IgPSB0cnVlO1xuXG5cdFx0fVxuXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjb2wgPSBpICUgMztcblx0XHRcdGlmICggY29sID09IDAgKSB7XG5cblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBmb3J3YXJkU2lnblsgaSBdLCAwLCAwICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbCA9PSAxICkge1xuXG5cdFx0XHRcdGN1YmVDYW1lcmEudXAuc2V0KCAwLCAwLCB1cFNpZ25bIGkgXSApO1xuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgZm9yd2FyZFNpZ25bIGkgXSwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGN1YmVDYW1lcmEudXAuc2V0KCAwLCB1cFNpZ25bIGkgXSwgMCApO1xuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgMCwgZm9yd2FyZFNpZ25bIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LFxuXHRcdFx0XHRjb2wgKiBTSVpFX01BWCwgaSA+IDIgPyBTSVpFX01BWCA6IDAsIFNJWkVfTUFYLCBTSVpFX01BWCApO1xuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0aWYgKCB1c2VTb2xpZENvbG9yICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggYmFja2dyb3VuZEJveCwgY3ViZUNhbWVyYSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGN1YmVDYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gdG9uZU1hcHBpbmc7XG5cdFx0cmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBvdXRwdXRFbmNvZGluZztcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBvcmlnaW5hbEF1dG9DbGVhcjtcblxuXHR9XG5cblx0X3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcblxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuX2N1YmVtYXBTaGFkZXIgPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLl9jdWJlbWFwU2hhZGVyID0gX2dldEN1YmVtYXBTaGFkZXIoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCB0aGlzLl9lcXVpcmVjdFNoYWRlciA9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gX2dldEVxdWlyZWN0U2hhZGVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gdGhpcy5fY3ViZW1hcFNoYWRlciA6IHRoaXMuX2VxdWlyZWN0U2hhZGVyO1xuXHRcdGNvbnN0IG1lc2ggPSBuZXcgTWVzaCggX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xuXG5cdFx0Y29uc3QgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcblxuXHRcdHVuaWZvcm1zWyAnZW52TWFwJyBdLnZhbHVlID0gdGV4dHVyZTtcblxuXHRcdGlmICggISB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdHVuaWZvcm1zWyAndGV4ZWxTaXplJyBdLnZhbHVlLnNldCggMS4wIC8gdGV4dHVyZS5pbWFnZS53aWR0aCwgMS4wIC8gdGV4dHVyZS5pbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zWyAnaW5wdXRFbmNvZGluZycgXS52YWx1ZSA9IEVOQ09ESU5HU1sgdGV4dHVyZS5lbmNvZGluZyBdO1xuXHRcdHVuaWZvcm1zWyAnb3V0cHV0RW5jb2RpbmcnIF0udmFsdWUgPSBFTkNPRElOR1NbIGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLmVuY29kaW5nIF07XG5cblx0XHRfc2V0Vmlld3BvcnQoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgMyAqIFNJWkVfTUFYLCAyICogU0laRV9NQVggKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBtZXNoLCBfZmxhdENhbWVyYSApO1xuXG5cdH1cblxuXHRfYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcblx0XHRjb25zdCBhdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XG5cdFx0cmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCBUT1RBTF9MT0RTOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBzaWdtYSA9IE1hdGguc3FydCggX3NpZ21hc1sgaSBdICogX3NpZ21hc1sgaSBdIC0gX3NpZ21hc1sgaSAtIDEgXSAqIF9zaWdtYXNbIGkgLSAxIF0gKTtcblxuXHRcdFx0Y29uc3QgcG9sZUF4aXMgPSBfYXhpc0RpcmVjdGlvbnNbICggaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcblxuXHRcdFx0dGhpcy5fYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBpIC0gMSwgaSwgc2lnbWEsIHBvbGVBeGlzICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgdHdvLXBhc3MgR2F1c3NpYW4gYmx1ciBmb3IgYSBjdWJlbWFwLiBOb3JtYWxseSB0aGlzIGlzIGRvbmVcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBidXQgdGhpcyBicmVha3MgZG93biBvbiBhIGN1YmUuIEhlcmUgd2UgYXBwbHlcblx0ICogdGhlIGJsdXIgbGF0aXR1ZGluYWxseSAoYXJvdW5kIHRoZSBwb2xlcyksIGFuZCB0aGVuIGxvbmdpdHVkaW5hbGx5ICh0b3dhcmRzXG5cdCAqIHRoZSBwb2xlcykgdG8gYXBwcm94aW1hdGUgdGhlIG9ydGhvZ29uYWxseS1zZXBhcmFibGUgYmx1ci4gSXQgaXMgbGVhc3Rcblx0ICogYWNjdXJhdGUgYXQgdGhlIHBvbGVzLCBidXQgc3RpbGwgZG9lcyBhIGRlY2VudCBqb2IuXG5cdCAqL1xuXHRfYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYSwgcG9sZUF4aXMgKSB7XG5cblx0XHRjb25zdCBwaW5nUG9uZ1JlbmRlclRhcmdldCA9IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0O1xuXG5cdFx0dGhpcy5faGFsZkJsdXIoXG5cdFx0XHRjdWJlVVZSZW5kZXJUYXJnZXQsXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcblx0XHRcdGxvZEluLFxuXHRcdFx0bG9kT3V0LFxuXHRcdFx0c2lnbWEsXG5cdFx0XHQnbGF0aXR1ZGluYWwnLFxuXHRcdFx0cG9sZUF4aXMgKTtcblxuXHRcdHRoaXMuX2hhbGZCbHVyKFxuXHRcdFx0cGluZ1BvbmdSZW5kZXJUYXJnZXQsXG5cdFx0XHRjdWJlVVZSZW5kZXJUYXJnZXQsXG5cdFx0XHRsb2RPdXQsXG5cdFx0XHRsb2RPdXQsXG5cdFx0XHRzaWdtYSxcblx0XHRcdCdsb25naXR1ZGluYWwnLFxuXHRcdFx0cG9sZUF4aXMgKTtcblxuXHR9XG5cblx0X2hhbGZCbHVyKCB0YXJnZXRJbiwgdGFyZ2V0T3V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYVJhZGlhbnMsIGRpcmVjdGlvbiwgcG9sZUF4aXMgKSB7XG5cblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xuXHRcdGNvbnN0IGJsdXJNYXRlcmlhbCA9IHRoaXMuX2JsdXJNYXRlcmlhbDtcblxuXHRcdGlmICggZGlyZWN0aW9uICE9PSAnbGF0aXR1ZGluYWwnICYmIGRpcmVjdGlvbiAhPT0gJ2xvbmdpdHVkaW5hbCcgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdCdibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gTnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYXQgd2hpY2ggdG8gY3V0IG9mZiB0aGUgZGlzY3JldGUgYXBwcm94aW1hdGlvbi5cblx0XHRjb25zdCBTVEFOREFSRF9ERVZJQVRJT05TID0gMztcblxuXHRcdGNvbnN0IGJsdXJNZXNoID0gbmV3IE1lc2goIF9sb2RQbGFuZXNbIGxvZE91dCBdLCBibHVyTWF0ZXJpYWwgKTtcblx0XHRjb25zdCBibHVyVW5pZm9ybXMgPSBibHVyTWF0ZXJpYWwudW5pZm9ybXM7XG5cblx0XHRjb25zdCBwaXhlbHMgPSBfc2l6ZUxvZHNbIGxvZEluIF0gLSAxO1xuXHRcdGNvbnN0IHJhZGlhbnNQZXJQaXhlbCA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IE1hdGguUEkgLyAoIDIgKiBwaXhlbHMgKSA6IDIgKiBNYXRoLlBJIC8gKCAyICogTUFYX1NBTVBMRVMgLSAxICk7XG5cdFx0Y29uc3Qgc2lnbWFQaXhlbHMgPSBzaWdtYVJhZGlhbnMgLyByYWRpYW5zUGVyUGl4ZWw7XG5cdFx0Y29uc3Qgc2FtcGxlcyA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IDEgKyBNYXRoLmZsb29yKCBTVEFOREFSRF9ERVZJQVRJT05TICogc2lnbWFQaXhlbHMgKSA6IE1BWF9TQU1QTEVTO1xuXG5cdFx0aWYgKCBzYW1wbGVzID4gTUFYX1NBTVBMRVMgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggYHNpZ21hUmFkaWFucywgJHtcblx0XHRcdFx0c2lnbWFSYWRpYW5zfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke1xuXHRcdFx0XHRzYW1wbGVzfSBzYW1wbGVzIHdoZW4gdGhlIG1heGltdW0gaXMgc2V0IHRvICR7TUFYX1NBTVBMRVN9YCApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3Qgd2VpZ2h0cyA9IFtdO1xuXHRcdGxldCBzdW0gPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgTUFYX1NBTVBMRVM7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IHggPSBpIC8gc2lnbWFQaXhlbHM7XG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBNYXRoLmV4cCggLSB4ICogeCAvIDIgKTtcblx0XHRcdHdlaWdodHMucHVzaCggd2VpZ2h0ICk7XG5cblx0XHRcdGlmICggaSA9PSAwICkge1xuXG5cdFx0XHRcdHN1bSArPSB3ZWlnaHQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGkgPCBzYW1wbGVzICkge1xuXG5cdFx0XHRcdHN1bSArPSAyICogd2VpZ2h0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0d2VpZ2h0c1sgaSBdID0gd2VpZ2h0c1sgaSBdIC8gc3VtO1xuXG5cdFx0fVxuXG5cdFx0Ymx1clVuaWZvcm1zWyAnZW52TWFwJyBdLnZhbHVlID0gdGFyZ2V0SW4udGV4dHVyZTtcblx0XHRibHVyVW5pZm9ybXNbICdzYW1wbGVzJyBdLnZhbHVlID0gc2FtcGxlcztcblx0XHRibHVyVW5pZm9ybXNbICd3ZWlnaHRzJyBdLnZhbHVlID0gd2VpZ2h0cztcblx0XHRibHVyVW5pZm9ybXNbICdsYXRpdHVkaW5hbCcgXS52YWx1ZSA9IGRpcmVjdGlvbiA9PT0gJ2xhdGl0dWRpbmFsJztcblxuXHRcdGlmICggcG9sZUF4aXMgKSB7XG5cblx0XHRcdGJsdXJVbmlmb3Jtc1sgJ3BvbGVBeGlzJyBdLnZhbHVlID0gcG9sZUF4aXM7XG5cblx0XHR9XG5cblx0XHRibHVyVW5pZm9ybXNbICdkVGhldGEnIF0udmFsdWUgPSByYWRpYW5zUGVyUGl4ZWw7XG5cdFx0Ymx1clVuaWZvcm1zWyAnbWlwSW50JyBdLnZhbHVlID0gTE9EX01BWCAtIGxvZEluO1xuXHRcdGJsdXJVbmlmb3Jtc1sgJ2lucHV0RW5jb2RpbmcnIF0udmFsdWUgPSBFTkNPRElOR1NbIHRhcmdldEluLnRleHR1cmUuZW5jb2RpbmcgXTtcblx0XHRibHVyVW5pZm9ybXNbICdvdXRwdXRFbmNvZGluZycgXS52YWx1ZSA9IEVOQ09ESU5HU1sgdGFyZ2V0SW4udGV4dHVyZS5lbmNvZGluZyBdO1xuXG5cdFx0Y29uc3Qgb3V0cHV0U2l6ZSA9IF9zaXplTG9kc1sgbG9kT3V0IF07XG5cdFx0Y29uc3QgeCA9IDMgKiBNYXRoLm1heCggMCwgU0laRV9NQVggLSAyICogb3V0cHV0U2l6ZSApO1xuXHRcdGNvbnN0IHkgPSAoIGxvZE91dCA9PT0gMCA/IDAgOiAyICogU0laRV9NQVggKSArIDIgKiBvdXRwdXRTaXplICogKCBsb2RPdXQgPiBMT0RfTUFYIC0gTE9EX01JTiA/IGxvZE91dCAtIExPRF9NQVggKyBMT0RfTUlOIDogMCApO1xuXG5cdFx0X3NldFZpZXdwb3J0KCB0YXJnZXRPdXQsIHgsIHksIDMgKiBvdXRwdXRTaXplLCAyICogb3V0cHV0U2l6ZSApO1xuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGFyZ2V0T3V0ICk7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBibHVyTWVzaCwgX2ZsYXRDYW1lcmEgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gX2lzTERSKCB0ZXh0dXJlICkge1xuXG5cdGlmICggdGV4dHVyZSA9PT0gdW5kZWZpbmVkIHx8IHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBmYWxzZTtcblxuXHRyZXR1cm4gdGV4dHVyZS5lbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgfHwgdGV4dHVyZS5lbmNvZGluZyA9PT0gc1JHQkVuY29kaW5nIHx8IHRleHR1cmUuZW5jb2RpbmcgPT09IEdhbW1hRW5jb2Rpbmc7XG5cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVBsYW5lcygpIHtcblxuXHRjb25zdCBfbG9kUGxhbmVzID0gW107XG5cdGNvbnN0IF9zaXplTG9kcyA9IFtdO1xuXHRjb25zdCBfc2lnbWFzID0gW107XG5cblx0bGV0IGxvZCA9IExPRF9NQVg7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgVE9UQUxfTE9EUzsgaSArKyApIHtcblxuXHRcdGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdyggMiwgbG9kICk7XG5cdFx0X3NpemVMb2RzLnB1c2goIHNpemVMb2QgKTtcblx0XHRsZXQgc2lnbWEgPSAxLjAgLyBzaXplTG9kO1xuXG5cdFx0aWYgKCBpID4gTE9EX01BWCAtIExPRF9NSU4gKSB7XG5cblx0XHRcdHNpZ21hID0gRVhUUkFfTE9EX1NJR01BWyBpIC0gTE9EX01BWCArIExPRF9NSU4gLSAxIF07XG5cblx0XHR9IGVsc2UgaWYgKCBpID09IDAgKSB7XG5cblx0XHRcdHNpZ21hID0gMDtcblxuXHRcdH1cblxuXHRcdF9zaWdtYXMucHVzaCggc2lnbWEgKTtcblxuXHRcdGNvbnN0IHRleGVsU2l6ZSA9IDEuMCAvICggc2l6ZUxvZCAtIDEgKTtcblx0XHRjb25zdCBtaW4gPSAtIHRleGVsU2l6ZSAvIDI7XG5cdFx0Y29uc3QgbWF4ID0gMSArIHRleGVsU2l6ZSAvIDI7XG5cdFx0Y29uc3QgdXYxID0gWyBtaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4IF07XG5cblx0XHRjb25zdCBjdWJlRmFjZXMgPSA2O1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gNjtcblx0XHRjb25zdCBwb3NpdGlvblNpemUgPSAzO1xuXHRcdGNvbnN0IHV2U2l6ZSA9IDI7XG5cdFx0Y29uc3QgZmFjZUluZGV4U2l6ZSA9IDE7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uU2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xuXHRcdGNvbnN0IGZhY2VJbmRleCA9IG5ldyBGbG9hdDMyQXJyYXkoIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xuXG5cdFx0Zm9yICggbGV0IGZhY2UgPSAwOyBmYWNlIDwgY3ViZUZhY2VzOyBmYWNlICsrICkge1xuXG5cdFx0XHRjb25zdCB4ID0gKCBmYWNlICUgMyApICogMiAvIDMgLSAxO1xuXHRcdFx0Y29uc3QgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcblx0XHRcdGNvbnN0IGNvb3JkaW5hdGVzID0gW1xuXHRcdFx0XHR4LCB5LCAwLFxuXHRcdFx0XHR4ICsgMiAvIDMsIHksIDAsXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXG5cdFx0XHRcdHgsIHksIDAsXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXG5cdFx0XHRcdHgsIHkgKyAxLCAwXG5cdFx0XHRdO1xuXHRcdFx0cG9zaXRpb24uc2V0KCBjb29yZGluYXRlcywgcG9zaXRpb25TaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cdFx0XHR1di5zZXQoIHV2MSwgdXZTaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cdFx0XHRjb25zdCBmaWxsID0gWyBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlIF07XG5cdFx0XHRmYWNlSW5kZXguc2V0KCBmaWxsLCBmYWNlSW5kZXhTaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwbGFuZXMgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgcG9zaXRpb25TaXplICkgKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1diwgdXZTaXplICkgKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAnZmFjZUluZGV4JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggZmFjZUluZGV4LCBmYWNlSW5kZXhTaXplICkgKTtcblx0XHRfbG9kUGxhbmVzLnB1c2goIHBsYW5lcyApO1xuXG5cdFx0aWYgKCBsb2QgPiBMT0RfTUlOICkge1xuXG5cdFx0XHRsb2QgLS07XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IF9sb2RQbGFuZXMsIF9zaXplTG9kcywgX3NpZ21hcyB9O1xuXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVSZW5kZXJUYXJnZXQoIHBhcmFtcyApIHtcblxuXHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIDMgKiBTSVpFX01BWCwgMyAqIFNJWkVfTUFYLCBwYXJhbXMgKTtcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubWFwcGluZyA9IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nO1xuXHRjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gJ1BNUkVNLmN1YmVVdic7XG5cdGN1YmVVVlJlbmRlclRhcmdldC5zY2lzc29yVGVzdCA9IHRydWU7XG5cdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XG5cbn1cblxuZnVuY3Rpb24gX3NldFZpZXdwb3J0KCB0YXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0dGFyZ2V0LnZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xuXHR0YXJnZXQuc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcblxufVxuXG5mdW5jdGlvbiBfZ2V0Qmx1clNoYWRlciggbWF4U2FtcGxlcyApIHtcblxuXHRjb25zdCB3ZWlnaHRzID0gbmV3IEZsb2F0MzJBcnJheSggbWF4U2FtcGxlcyApO1xuXHRjb25zdCBwb2xlQXhpcyA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cdGNvbnN0IHNoYWRlck1hdGVyaWFsID0gbmV3IFJhd1NoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRuYW1lOiAnU3BoZXJpY2FsR2F1c3NpYW5CbHVyJyxcblxuXHRcdGRlZmluZXM6IHsgJ24nOiBtYXhTYW1wbGVzIH0sXG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0J2Vudk1hcCc6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdCdzYW1wbGVzJzogeyB2YWx1ZTogMSB9LFxuXHRcdFx0J3dlaWdodHMnOiB7IHZhbHVlOiB3ZWlnaHRzIH0sXG5cdFx0XHQnbGF0aXR1ZGluYWwnOiB7IHZhbHVlOiBmYWxzZSB9LFxuXHRcdFx0J2RUaGV0YSc6IHsgdmFsdWU6IDAgfSxcblx0XHRcdCdtaXBJbnQnOiB7IHZhbHVlOiAwIH0sXG5cdFx0XHQncG9sZUF4aXMnOiB7IHZhbHVlOiBwb2xlQXhpcyB9LFxuXHRcdFx0J2lucHV0RW5jb2RpbmcnOiB7IHZhbHVlOiBFTkNPRElOR1NbIExpbmVhckVuY29kaW5nIF0gfSxcblx0XHRcdCdvdXRwdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogX2dldENvbW1vblZlcnRleFNoYWRlcigpLFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHRcdFx0dW5pZm9ybSBpbnQgc2FtcGxlcztcblx0XHRcdHVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdO1xuXHRcdFx0dW5pZm9ybSBib29sIGxhdGl0dWRpbmFsO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCBkVGhldGE7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IG1pcEludDtcblx0XHRcdHVuaWZvcm0gdmVjMyBwb2xlQXhpcztcblxuXHRcdFx0JHsgX2dldEVuY29kaW5ncygpIH1cblxuXHRcdFx0I2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdFx0XHQjaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuXG5cdFx0XHR2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHtcblxuXHRcdFx0XHRmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTtcblx0XHRcdFx0Ly8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uXG5cdFx0XHRcdHZlYzMgc2FtcGxlRGlyZWN0aW9uID0gdk91dHB1dERpcmVjdGlvbiAqIGNvc1RoZXRhXG5cdFx0XHRcdFx0KyBjcm9zcyggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogc2luKCB0aGV0YSApXG5cdFx0XHRcdFx0KyBheGlzICogZG90KCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiAoIDEuMCAtIGNvc1RoZXRhICk7XG5cblx0XHRcdFx0cmV0dXJuIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpcmVjdGlvbiwgbWlwSW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdHZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRpZiAoIGFsbCggZXF1YWwoIGF4aXMsIHZlYzMoIDAuMCApICkgKSApIHtcblxuXHRcdFx0XHRcdGF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXhpcyA9IG5vcm1hbGl6ZSggYXhpcyApO1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIDAgXSAqIGdldFNhbXBsZSggMC4wLCBheGlzICk7XG5cblx0XHRcdFx0Zm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpID49IHNhbXBsZXMgKSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZmxvYXQgdGhldGEgPSBkVGhldGEgKiBmbG9hdCggaSApO1xuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCAtMS4wICogdGhldGEsIGF4aXMgKTtcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggdGhldGEsIGF4aXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHRgLFxuXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxuXG5cdH0gKTtcblxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XG5cbn1cblxuZnVuY3Rpb24gX2dldEVxdWlyZWN0U2hhZGVyKCkge1xuXG5cdGNvbnN0IHRleGVsU2l6ZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cdGNvbnN0IHNoYWRlck1hdGVyaWFsID0gbmV3IFJhd1NoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRuYW1lOiAnRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYnLFxuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHQndGV4ZWxTaXplJzogeyB2YWx1ZTogdGV4ZWxTaXplIH0sXG5cdFx0XHQnaW5wdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9LFxuXHRcdFx0J291dHB1dEVuY29kaW5nJzogeyB2YWx1ZTogRU5DT0RJTkdTWyBMaW5lYXJFbmNvZGluZyBdIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXG5cblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xuXG5cdFx0XHQkeyBfZ2V0RW5jb2RpbmdzKCkgfVxuXG5cdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cblx0XHRcdFx0dmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTtcblx0XHRcdFx0dmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAvIHRleGVsU2l6ZSAtIDAuNSApO1xuXHRcdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHRcdFx0XHR2ZWMzIHRsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54ICs9IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di55ICs9IHRleGVsU2l6ZS55O1xuXHRcdFx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54IC09IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIGJsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXG5cdFx0XHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0XHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIHRtLCBibSwgZi55ICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHRgLFxuXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxuXG5cdH0gKTtcblxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XG5cbn1cblxuZnVuY3Rpb24gX2dldEN1YmVtYXBTaGFkZXIoKSB7XG5cblx0Y29uc3Qgc2hhZGVyTWF0ZXJpYWwgPSBuZXcgUmF3U2hhZGVyTWF0ZXJpYWwoIHtcblxuXHRcdG5hbWU6ICdDdWJlbWFwVG9DdWJlVVYnLFxuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHQnaW5wdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9LFxuXHRcdFx0J291dHB1dEVuY29kaW5nJzogeyB2YWx1ZTogRU5DT0RJTkdTWyBMaW5lYXJFbmNvZGluZyBdIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXG5cblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuXHRcdFx0JHsgX2dldEVuY29kaW5ncygpIH1cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggLSB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApICkucmdiO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdGAsXG5cblx0XHRibGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXG5cblx0fSApO1xuXG5cdHJldHVybiBzaGFkZXJNYXRlcmlhbDtcblxufVxuXG5mdW5jdGlvbiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCkge1xuXG5cdHJldHVybiAvKiBnbHNsICovYFxuXG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cdFx0YXR0cmlidXRlIHZlYzIgdXY7XG5cdFx0YXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDtcblxuXHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxuXHRcdHZlYzMgZ2V0RGlyZWN0aW9uKCB2ZWMyIHV2LCBmbG9hdCBmYWNlICkge1xuXG5cdFx0XHR1diA9IDIuMCAqIHV2IC0gMS4wO1xuXG5cdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTtcblxuXHRcdFx0aWYgKCBmYWNlID09IDAuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueCAqPSAtMS4wOyAvLyAoIC11LCB2LCAxICkgcG9zIHpcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRpcmVjdGlvbjtcblxuXHRcdH1cblxuXHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0dk91dHB1dERpcmVjdGlvbiA9IGdldERpcmVjdGlvbiggdXYsIGZhY2VJbmRleCApO1xuXHRcdFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cblx0XHR9XG5cdGA7XG5cbn1cblxuZnVuY3Rpb24gX2dldEVuY29kaW5ncygpIHtcblxuXHRyZXR1cm4gLyogZ2xzbCAqL2BcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdGA7XG5cbn1cblxuY29uc3QgTGluZVN0cmlwID0gMDtcbmNvbnN0IExpbmVQaWVjZXMgPSAxO1xuY29uc3QgTm9Db2xvcnMgPSAwO1xuY29uc3QgRmFjZUNvbG9ycyA9IDE7XG5jb25zdCBWZXJ0ZXhDb2xvcnMgPSAyO1xuXG5mdW5jdGlvbiBNZXNoRmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gTXVsdGlNYXRlcmlhbCggbWF0ZXJpYWxzID0gW10gKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdG1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlO1xuXHRtYXRlcmlhbHMubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRtYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7XG5cblx0fTtcblxuXHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG59XG5cbmZ1bmN0aW9uIFBvaW50Q2xvdWQoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4nICk7XG5cdHJldHVybiBuZXcgU3ByaXRlKCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW0gaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBWZXJ0ZXgoIHgsIHksIHogKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFZlY3RvcjMoIHgsIHksIHogKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBEeW5hbWljQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldFVzYWdlKCBUSFJFRS5EeW5hbWljRHJhd1VzYWdlICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKS5zZXRVc2FnZSggRHluYW1pY0RyYXdVc2FnZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuUGF0aC5wcm90b3R5cGUuZnJvbVBvaW50cyA9IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLicgKTtcblx0cmV0dXJuIHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIEF4aXNIZWxwZXIoIHNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuJyApO1xuXHRyZXR1cm4gbmV3IEF4ZXNIZWxwZXIoIHNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBCb3VuZGluZ0JveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKTtcblxufVxuXG5mdW5jdGlvbiBFZGdlc0hlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgRWRnZXNHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7XG5cbn07XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTtcblxufTtcblxuZnVuY3Rpb24gV2lyZWZyYW1lSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IFdpcmVmcmFtZUdlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbi8vXG5cbkxvYWRlci5wcm90b3R5cGUuZXh0cmFjdFVybEJhc2UgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG59O1xuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0YWRkOiBmdW5jdGlvbiAoIC8qIHJlZ2V4LCBsb2FkZXIgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5hZGQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuYWRkSGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIC8qIGZpbGUgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5nZXQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuZ2V0SGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5Cb3gyLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuQm94Mi5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG59O1xuXG5Cb3gyLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveCA9IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG59O1xuXG5Cb3gyLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbi8vXG5cbkJveDMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5Cb3gzLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94ID0gZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlID0gZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuLy9cblxuU3BoZXJlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxufTtcblxuLy9cblxuRnJ1c3R1bS5wcm90b3R5cGUuc2V0RnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggbSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GcnVzdHVtOiAuc2V0RnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggbSApO1xuXG59O1xuXG4vL1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG4vL1xuXG5NYXRoVXRpbHMucmFuZG9tMTYgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBNYXRoLnJhbmRvbSgpO1xuXG59O1xuXG5NYXRoVXRpbHMubmVhcmVzdFBvd2VyT2ZUd28gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZWFyZXN0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZsb29yUG93ZXJPZlR3bygpLicgKTtcblx0cmV0dXJuIE1hdGhVdGlscy5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cbn07XG5cbk1hdGhVdGlscy5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4nICk7XG5cdHJldHVybiBNYXRoVXRpbHMuY2VpbFBvd2VyT2ZUd28oIHZhbHVlICk7XG5cbn07XG5cbi8vXG5cbk1hdHJpeDMucHJvdG90eXBlLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0ID0gZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4My5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gYXR0cmlidXRlLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG59O1xuXG5NYXRyaXgzLnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLmdldEludmVyc2UgPSBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy5jb3B5KCBtYXRyaXggKS5pbnZlcnQoKTtcblxufTtcblxuLy9cblxuTWF0cml4NC5wcm90b3R5cGUuZXh0cmFjdFBvc2l0aW9uID0gZnVuY3Rpb24gKCBtICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdHJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5mbGF0dGVuVG9BcnJheU9mZnNldCA9IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24gPSBmdW5jdGlvbiAoIHEgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0cmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlUb0FycmF5ID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3I0ID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXkgPSBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVBeGlzID0gZnVuY3Rpb24gKCB2ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0di50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUuY3Jvc3NWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVYID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVZID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVaID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVCeUF4aXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gYXR0cmlidXRlLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLm1ha2VGcnVzdHVtID0gZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5nZXRJbnZlcnNlID0gZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4SW52LmNvcHkoIG1hdHJpeCApLmludmVydCgpOyBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7XG5cbn07XG5cbi8vXG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuLy9cblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAuaW52ZXJzZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW52ZXJ0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnZlcnQoKTtcblxufTtcblxuLy9cblxuUmF5LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveCA9IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cbn07XG5cblJheS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25QbGFuZSA9IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApO1xuXG59O1xuXG5SYXkucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlID0gZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxufTtcblxuLy9cblxuVHJpYW5nbGUucHJvdG90eXBlLmFyZWEgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG59O1xuXG5UcmlhbmdsZS5wcm90b3R5cGUuYmFyeWNvb3JkRnJvbVBvaW50ID0gZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKTtcblxufTtcblxuVHJpYW5nbGUucHJvdG90eXBlLm1pZHBvaW50ID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRNaWRwb2ludCggdGFyZ2V0ICk7XG5cbn07XG5cblRyaWFuZ2xlLnByb3RvdHlwZW5vcm1hbCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXROb3JtYWwoIHRhcmdldCApO1xuXG59O1xuXG5UcmlhbmdsZS5wcm90b3R5cGUucGxhbmUgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldFBsYW5lKCB0YXJnZXQgKTtcblxufTtcblxuVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50ID0gZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICk7XG5cbn07XG5cblRyaWFuZ2xlLm5vcm1hbCA9IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxufTtcblxuLy9cblxuU2hhcGUucHJvdG90eXBlLmV4dHJhY3RBbGxQb2ludHMgPSBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyggZGl2aXNpb25zICk7XG5cbn07XG5cblNoYXBlLnByb3RvdHlwZS5leHRydWRlID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxufTtcblxuU2hhcGUucHJvdG90eXBlLm1ha2VHZW9tZXRyeSA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG59O1xuXG4vL1xuXG5WZWN0b3IyLnByb3RvdHlwZS5mcm9tQXR0cmlidXRlID0gZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxufTtcblxuVmVjdG9yMi5wcm90b3R5cGUuZGlzdGFuY2VUb01hbmhhdHRhbiA9IGZ1bmN0aW9uICggdiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxufTtcblxuVmVjdG9yMi5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG59O1xuXG4vL1xuXG5WZWN0b3IzLnByb3RvdHlwZS5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuJyApO1xuXG59O1xuXG5WZWN0b3IzLnByb3RvdHlwZS5zZXRFdWxlckZyb21RdWF0ZXJuaW9uID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApO1xuXG59O1xuXG5WZWN0b3IzLnByb3RvdHlwZS5nZXRQb3NpdGlvbkZyb21NYXRyaXggPSBmdW5jdGlvbiAoIG0gKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTtcblx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmdldFNjYWxlRnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggbSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuZ2V0Q29sdW1uRnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7XG5cdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuYXBwbHlQcm9qZWN0aW9uID0gZnVuY3Rpb24gKCBtICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmRpc3RhbmNlVG9NYW5oYXR0YW4gPSBmdW5jdGlvbiAoIHYgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxufTtcblxuLy9cblxuVmVjdG9yNC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cbn07XG5cblZlY3RvcjQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxufTtcblxuLy9cblxuT2JqZWN0M0QucHJvdG90eXBlLmdldENoaWxkQnlOYW1lID0gZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApO1xuXG59O1xuXG5PYmplY3QzRC5wcm90b3R5cGUucmVuZGVyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLicgKTtcblxufTtcblxuT2JqZWN0M0QucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICggZGlzdGFuY2UsIGF4aXMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApO1xuXG59O1xuXG5PYmplY3QzRC5wcm90b3R5cGUuZ2V0V29ybGRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4nICk7XG5cbn07XG5cbk9iamVjdDNELnByb3RvdHlwZS5hcHBseU1hdHJpeCA9IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4nICk7XG5cdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRldWxlck9yZGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dXNlUXVhdGVybmlvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5NZXNoLnByb3RvdHlwZS5zZXREcmF3TW9kZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaDogLnNldERyYXdNb2RlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4nICk7XG5cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoLnByb3RvdHlwZSwge1xuXG5cdGRyYXdNb2RlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4nICk7XG5cdFx0XHRyZXR1cm4gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuU2tpbm5lZE1lc2gucHJvdG90eXBlLmluaXRCb25lcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1cnZlLnByb3RvdHlwZSwgJ19fYXJjTGVuZ3RoRGl2aXNpb25zJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gJyArXG5cdFx0XHQnVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuJyApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0ZHluYW1pYzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy51c2FnZSA9PT0gRHluYW1pY0RyYXdVc2FnZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnNldFVzYWdlKCBEeW5hbWljRHJhd1VzYWdlICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5CdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLnNldER5bmFtaWMgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLnNldER5bmFtaWMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFVzYWdlKCkgaW5zdGVhZC4nICk7XG5cdHRoaXMuc2V0VXNhZ2UoIHZhbHVlID09PSB0cnVlID8gRHluYW1pY0RyYXdVc2FnZSA6IFN0YXRpY0RyYXdVc2FnZSApO1xuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5SW5kaWNlc0FycmF5ID0gZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5jb3B5SW5kaWNlc0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn0sXG5cbkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuc2V0QXJyYXkgPSBmdW5jdGlvbiAoIC8qIGFycmF5ICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXRBcnJheSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgQnVmZmVyR2VvbWV0cnkgLnNldEF0dHJpYnV0ZSB0byByZXBsYWNlL3Jlc2l6ZSBhdHRyaWJ1dGUgYnVmZmVycycgKTtcblxufTtcblxuLy9cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZEluZGV4ID0gZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cbn07XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5hZGRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEF0dHJpYnV0ZSgpLicgKTtcblxuXHRpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJndW1lbnRzWyAxIF0sIGFyZ3VtZW50c1sgMiBdICkgKTtcblxuXHR9XG5cblx0aWYgKCBuYW1lID09PSAnaW5kZXgnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTtcblxufTtcblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZERyYXdDYWxsID0gZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApO1xuXG5cdH1cblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cbn07XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jbGVhckRyYXdDYWxscyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLicgKTtcblx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAucmVtb3ZlQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZGVsZXRlQXR0cmlidXRlKCkuJyApO1xuXG5cdHJldHVybiB0aGlzLmRlbGV0ZUF0dHJpYnV0ZSggbmFtZSApO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYXBwbHlNYXRyaXggPSBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFwcGx5TWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuYXBwbHlNYXRyaXg0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdG1heEluc3RhbmNlZENvdW50OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiAubWF4SW5zdGFuY2VkQ291bnQgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW5zdGFuY2VDb3VudC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnN0YW5jZUNvdW50O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiAubWF4SW5zdGFuY2VkQ291bnQgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW5zdGFuY2VDb3VudC4nICk7XG5cdFx0XHR0aGlzLmluc3RhbmNlQ291bnQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IC5saW5lUHJlY2lzaW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAucGFyYW1zLkxpbmUudGhyZXNob2xkIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyYW1zLkxpbmUudGhyZXNob2xkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogLmxpbmVQcmVjaXNpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5wYXJhbXMuTGluZS50aHJlc2hvbGQgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnBhcmFtcy5MaW5lLnRocmVzaG9sZCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXI6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnNldFVzYWdlKCB2YWx1ZSApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLnNldER5bmFtaWMgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLicgKTtcblx0dGhpcy5zZXRVc2FnZSggdmFsdWUgPT09IHRydWUgPyBEeW5hbWljRHJhd1VzYWdlIDogU3RhdGljRHJhd1VzYWdlICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5JbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuc2V0QXJyYXkgPSBmdW5jdGlvbiAoIC8qIGFycmF5ICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLnNldEFycmF5IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBCdWZmZXJHZW9tZXRyeSAuc2V0QXR0cmlidXRlIHRvIHJlcGxhY2UvcmVzaXplIGF0dHJpYnV0ZSBidWZmZXJzJyApO1xuXG59O1xuXG4vL1xuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmdldEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5hZGRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuYWRkU2hhcGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuLy9cblxuU2NlbmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lOiAuZGlzcG9zZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG4vL1xuXG5Vbmlmb3JtLnByb3RvdHlwZS5vblVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0d3JhcEFyb3VuZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cblx0b3ZlcmRyYXc6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cblx0d3JhcFJHQjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cdH0sXG5cblx0c2hhZGluZzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTtcblxuXHRcdH1cblx0fSxcblxuXHRzdGVuY2lsTWFzazoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnN0ZW5jaWxNYXNrIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc3RlbmNpbEZ1bmNNYXNrIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RlbmNpbEZ1bmNNYXNrO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHRyYW5zcGFyZW5jeToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbDogLnRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIC50cmFuc21pc3Npb24uJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNtaXNzaW9uO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsOiAudHJhbnNwYXJlbmN5IGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRyYW5zbWlzc2lvbi4nICk7XG5cdFx0XHR0aGlzLnRyYW5zbWlzc2lvbiA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdGRlcml2YXRpdmVzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmNsZWFyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLicgKTtcblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4nICk7XG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCggY2FsbGJhY2sgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0Q3VycmVudFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFJlbmRlclRhcmdldCgpIGlzIG5vdyAuZ2V0UmVuZGVyVGFyZ2V0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmdldFByZWNpc2lvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLicgKTtcblx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUucmVzZXRHTFN0YXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzQmxlbmRNaW5NYXggPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdFWFRfYmxlbmRfbWlubWF4XFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcztcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5lbmFibGVTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApO1xuXHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmluaXRNYXRlcmlhbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFkZFByZVBsdWdpbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFkZFBvc3RQbHVnaW4gPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUudXBkYXRlU2hhZG93TWFwID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc2V0RmFjZUN1bGxpbmcgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFsbG9jVGV4dHVyZVVuaXQoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc2V0VGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zZXRUZXh0dXJlMkQgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUyRCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcblxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGNvbnRleHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCk7XG5cblx0XHR9XG5cdH0sXG5cdHZyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC52ciBoYXMgYmVlbiByZW5hbWVkIHRvIC54cicgKTtcblx0XHRcdHJldHVybiB0aGlzLnhyO1xuXG5cdFx0fVxuXHR9LFxuXHRnYW1tYUlucHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYUlucHV0IGhhcyBiZWVuIHJlbW92ZWQuIFNldCB0aGUgZW5jb2RpbmcgZm9yIHRleHR1cmVzIHZpYSBUZXh0dXJlLmVuY29kaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGdhbW1hT3V0cHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLm91dHB1dEVuY29kaW5nID0gKCB2YWx1ZSA9PT0gdHJ1ZSApID8gc1JHQkVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9XG5cdH0sXG5cdHRvbmVNYXBwaW5nV2hpdGVQb2ludDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXHRcdFx0cmV0dXJuIDEuMDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC50b25lTWFwcGluZ1doaXRlUG9pbnQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMU2hhZG93TWFwLnByb3RvdHlwZSwge1xuXG5cdGN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogY3VsbEZhY2UgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclJldmVyc2VTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyU2luZ2xlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKS4nICk7XG5cdHJldHVybiBuZXcgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgb3B0aW9ucyApO1xuXG59XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbkF1ZGlvLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblx0Y29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTtcblx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRzY29wZS5zZXRCdWZmZXIoIGJ1ZmZlciApO1xuXG5cdH0gKTtcblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuQXVkaW9BbmFseXNlci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG59O1xuXG4vL1xuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTtcblxufTtcblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLmNsZWFyKCkgaXMgbm93IC5yZW5kZXJUYXJnZXQuY2xlYXIoKS4nICk7XG5cdHJldHVybiB0aGlzLnJlbmRlclRhcmdldC5jbGVhciggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG59O1xuXG5JbWFnZVV0aWxzLmNyb3NzT3JpZ2luID0gdW5kZWZpbmVkO1xuXG5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlID0gZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0Y29uc3QgbG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0Y29uc3QgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmwsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRyZXR1cm4gdGV4dHVyZTtcblxufTtcblxuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRjb25zdCBsb2FkZXIgPSBuZXcgQ3ViZVRleHR1cmVMb2FkZXIoKTtcblx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0Y29uc3QgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmxzLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0cmV0dXJuIHRleHR1cmU7XG5cbn07XG5cbkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCcgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59XG5cbi8vXG5cbmNvbnN0IFNjZW5lVXRpbHMgPSB7XG5cblx0Y3JlYXRlTXVsdGlNYXRlcmlhbE9iamVjdDogZnVuY3Rpb24gKCAvKiBnZW9tZXRyeSwgbWF0ZXJpYWxzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBwYXJlbnQsIHNjZW5lICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH1cblxufTtcblxuLy9cblxuZnVuY3Rpb24gTGVuc0ZsYXJlKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MZW5zRmxhcmUgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS9vYmplY3RzL0xlbnNmbGFyZS5qcycgKTtcblxufVxuXG5pZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cdF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoICdyZWdpc3RlcicsIHsgZGV0YWlsOiB7XG5cdFx0cmV2aXNpb246IFJFVklTSU9OLFxuXHR9IH0gKSApO1xuXHQvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG5cbn1cblxuaWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRpZiAoIHdpbmRvdy5fX1RIUkVFX18gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuJyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR3aW5kb3cuX19USFJFRV9fID0gUkVWSVNJT047XG5cblx0fVxuXG59XG5cbmV4cG9ydCB7IEFDRVNGaWxtaWNUb25lTWFwcGluZywgQWRkRXF1YXRpb24sIEFkZE9wZXJhdGlvbiwgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUsIEFkZGl0aXZlQmxlbmRpbmcsIEFscGhhRm9ybWF0LCBBbHdheXNEZXB0aCwgQWx3YXlzU3RlbmNpbEZ1bmMsIEFtYmllbnRMaWdodCwgQW1iaWVudExpZ2h0UHJvYmUsIEFuaW1hdGlvbkNsaXAsIEFuaW1hdGlvbkxvYWRlciwgQW5pbWF0aW9uTWl4ZXIsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25VdGlscywgQXJjQ3VydmUsIEFycmF5Q2FtZXJhLCBBcnJvd0hlbHBlciwgQXVkaW8sIEF1ZGlvQW5hbHlzZXIsIEF1ZGlvQ29udGV4dCwgQXVkaW9MaXN0ZW5lciwgQXVkaW9Mb2FkZXIsIEF4ZXNIZWxwZXIsIEF4aXNIZWxwZXIsIEJhY2tTaWRlLCBCYXNpY0RlcHRoUGFja2luZywgQmFzaWNTaGFkb3dNYXAsIEJpbmFyeVRleHR1cmVMb2FkZXIsIEJvbmUsIEJvb2xlYW5LZXlmcmFtZVRyYWNrLCBCb3VuZGluZ0JveEhlbHBlciwgQm94MiwgQm94MywgQm94M0hlbHBlciwgQm94R2VvbWV0cnkgYXMgQm94QnVmZmVyR2VvbWV0cnksIEJveEdlb21ldHJ5LCBCb3hIZWxwZXIsIEJ1ZmZlckF0dHJpYnV0ZSwgQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLCBCeXRlVHlwZSwgQ2FjaGUsIENhbWVyYSwgQ2FtZXJhSGVscGVyLCBDYW52YXNSZW5kZXJlciwgQ2FudmFzVGV4dHVyZSwgQ2F0bXVsbFJvbUN1cnZlMywgQ2luZW9uVG9uZU1hcHBpbmcsIENpcmNsZUdlb21ldHJ5IGFzIENpcmNsZUJ1ZmZlckdlb21ldHJ5LCBDaXJjbGVHZW9tZXRyeSwgQ2xhbXBUb0VkZ2VXcmFwcGluZywgQ2xvY2ssIENvbG9yLCBDb2xvcktleWZyYW1lVHJhY2ssIENvbXByZXNzZWRUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgQ29uZUdlb21ldHJ5IGFzIENvbmVCdWZmZXJHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDdWJlQ2FtZXJhLCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVRleHR1cmUsIEN1YmVUZXh0dXJlTG9hZGVyLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcsIEN1YmljQmV6aWVyQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUzLCBDdWJpY0ludGVycG9sYW50LCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBDdWxsRmFjZU5vbmUsIEN1cnZlLCBDdXJ2ZVBhdGgsIEN1c3RvbUJsZW5kaW5nLCBDdXN0b21Ub25lTWFwcGluZywgQ3lsaW5kZXJHZW9tZXRyeSBhcyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LCBDeWxpbmRlckdlb21ldHJ5LCBDeWxpbmRyaWNhbCwgRGF0YVRleHR1cmUsIERhdGFUZXh0dXJlMkRBcnJheSwgRGF0YVRleHR1cmUzRCwgRGF0YVRleHR1cmVMb2FkZXIsIERhdGFVdGlscywgRGVjcmVtZW50U3RlbmNpbE9wLCBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wLCBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIERlcHRoVGV4dHVyZSwgRGlyZWN0aW9uYWxMaWdodCwgRGlyZWN0aW9uYWxMaWdodEhlbHBlciwgRGlzY3JldGVJbnRlcnBvbGFudCwgRG9kZWNhaGVkcm9uR2VvbWV0cnkgYXMgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb3VibGVTaWRlLCBEc3RBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUsIER5bmFtaWNDb3B5VXNhZ2UsIER5bmFtaWNEcmF3VXNhZ2UsIER5bmFtaWNSZWFkVXNhZ2UsIEVkZ2VzR2VvbWV0cnksIEVkZ2VzSGVscGVyLCBFbGxpcHNlQ3VydmUsIEVxdWFsRGVwdGgsIEVxdWFsU3RlbmNpbEZ1bmMsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgRXVsZXIsIEV2ZW50RGlzcGF0Y2hlciwgRXh0cnVkZUdlb21ldHJ5IGFzIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRXh0cnVkZUdlb21ldHJ5LCBGYWNlQ29sb3JzLCBGaWxlTG9hZGVyLCBGbGF0U2hhZGluZywgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQzMkF0dHJpYnV0ZSwgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQ2NEF0dHJpYnV0ZSwgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXRUeXBlLCBGb2csIEZvZ0V4cDIsIEZvbnQsIEZvbnRMb2FkZXIsIEZyb250U2lkZSwgRnJ1c3R1bSwgR0xCdWZmZXJBdHRyaWJ1dGUsIEdMU0wxLCBHTFNMMywgR2FtbWFFbmNvZGluZywgR3JlYXRlckRlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMsIEdyZWF0ZXJTdGVuY2lsRnVuYywgR3JpZEhlbHBlciwgR3JvdXAsIEhhbGZGbG9hdFR5cGUsIEhlbWlzcGhlcmVMaWdodCwgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRQcm9iZSwgSWNvc2FoZWRyb25HZW9tZXRyeSBhcyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBJY29zYWhlZHJvbkdlb21ldHJ5LCBJbWFnZUJpdG1hcExvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlVXRpbHMsIEltbWVkaWF0ZVJlbmRlck9iamVjdCwgSW5jcmVtZW50U3RlbmNpbE9wLCBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wLCBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LCBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkTWVzaCwgSW50MTZBdHRyaWJ1dGUsIEludDE2QnVmZmVyQXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIEludDhBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEludFR5cGUsIEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSwgSW50ZXJwb2xhbnQsIEludGVycG9sYXRlRGlzY3JldGUsIEludGVycG9sYXRlTGluZWFyLCBJbnRlcnBvbGF0ZVNtb290aCwgSW52ZXJ0U3RlbmNpbE9wLCBKU09OTG9hZGVyLCBLZWVwU3RlbmNpbE9wLCBLZXlmcmFtZVRyYWNrLCBMT0QsIExhdGhlR2VvbWV0cnkgYXMgTGF0aGVCdWZmZXJHZW9tZXRyeSwgTGF0aGVHZW9tZXRyeSwgTGF5ZXJzLCBMZW5zRmxhcmUsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIExlc3NFcXVhbFN0ZW5jaWxGdW5jLCBMZXNzU3RlbmNpbEZ1bmMsIExpZ2h0LCBMaWdodFByb2JlLCBMaW5lLCBMaW5lMywgTGluZUJhc2ljTWF0ZXJpYWwsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lTG9vcCwgTGluZVBpZWNlcywgTGluZVNlZ21lbnRzLCBMaW5lU3RyaXAsIExpbmVhckVuY29kaW5nLCBMaW5lYXJGaWx0ZXIsIExpbmVhckludGVycG9sYW50LCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciwgTGluZWFyVG9uZU1hcHBpbmcsIExvYWRlciwgTG9hZGVyVXRpbHMsIExvYWRpbmdNYW5hZ2VyLCBMb2dMdXZFbmNvZGluZywgTG9vcE9uY2UsIExvb3BQaW5nUG9uZywgTG9vcFJlcGVhdCwgTHVtaW5hbmNlQWxwaGFGb3JtYXQsIEx1bWluYW5jZUZvcm1hdCwgTU9VU0UsIE1hdGVyaWFsLCBNYXRlcmlhbExvYWRlciwgTWF0aFV0aWxzIGFzIE1hdGgsIE1hdGhVdGlscywgTWF0cml4MywgTWF0cml4NCwgTWF4RXF1YXRpb24sIE1lc2gsIE1lc2hCYXNpY01hdGVyaWFsLCBNZXNoRGVwdGhNYXRlcmlhbCwgTWVzaERpc3RhbmNlTWF0ZXJpYWwsIE1lc2hGYWNlTWF0ZXJpYWwsIE1lc2hMYW1iZXJ0TWF0ZXJpYWwsIE1lc2hNYXRjYXBNYXRlcmlhbCwgTWVzaE5vcm1hbE1hdGVyaWFsLCBNZXNoUGhvbmdNYXRlcmlhbCwgTWVzaFBoeXNpY2FsTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsLCBNZXNoVG9vbk1hdGVyaWFsLCBNaW5FcXVhdGlvbiwgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgTWl4T3BlcmF0aW9uLCBNdWx0aU1hdGVyaWFsLCBNdWx0aXBseUJsZW5kaW5nLCBNdWx0aXBseU9wZXJhdGlvbiwgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLCBOZXZlckRlcHRoLCBOZXZlclN0ZW5jaWxGdW5jLCBOb0JsZW5kaW5nLCBOb0NvbG9ycywgTm9Ub25lTWFwcGluZywgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlLCBOb3JtYWxCbGVuZGluZywgTm90RXF1YWxEZXB0aCwgTm90RXF1YWxTdGVuY2lsRnVuYywgTnVtYmVyS2V5ZnJhbWVUcmFjaywgT2JqZWN0M0QsIE9iamVjdExvYWRlciwgT2JqZWN0U3BhY2VOb3JtYWxNYXAsIE9jdGFoZWRyb25HZW9tZXRyeSBhcyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIE9jdGFoZWRyb25HZW9tZXRyeSwgT25lRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBPcnRob2dyYXBoaWNDYW1lcmEsIFBDRlNoYWRvd01hcCwgUENGU29mdFNoYWRvd01hcCwgUE1SRU1HZW5lcmF0b3IsIFBhcmFtZXRyaWNHZW9tZXRyeSBhcyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksIFBhcmFtZXRyaWNHZW9tZXRyeSwgUGFydGljbGUsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW0sIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwsIFBhdGgsIFBlcnNwZWN0aXZlQ2FtZXJhLCBQbGFuZSwgUGxhbmVHZW9tZXRyeSBhcyBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUhlbHBlciwgUG9pbnRDbG91ZCwgUG9pbnRDbG91ZE1hdGVyaWFsLCBQb2ludExpZ2h0LCBQb2ludExpZ2h0SGVscGVyLCBQb2ludHMsIFBvaW50c01hdGVyaWFsLCBQb2xhckdyaWRIZWxwZXIsIFBvbHloZWRyb25HZW9tZXRyeSBhcyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFBvbHloZWRyb25HZW9tZXRyeSwgUG9zaXRpb25hbEF1ZGlvLCBQcm9wZXJ0eUJpbmRpbmcsIFByb3BlcnR5TWl4ZXIsIFF1YWRyYXRpY0JlemllckN1cnZlLCBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsIFF1YXRlcm5pb24sIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIFJFVklTSU9OLCBSR0JBRGVwdGhQYWNraW5nLCBSR0JBRm9ybWF0LCBSR0JBSW50ZWdlckZvcm1hdCwgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEweDVfRm9ybWF0LCBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0JQVENfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCwgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQkRFbmNvZGluZywgUkdCRUVuY29kaW5nLCBSR0JFRm9ybWF0LCBSR0JGb3JtYXQsIFJHQkludGVnZXJGb3JtYXQsIFJHQk0xNkVuY29kaW5nLCBSR0JNN0VuY29kaW5nLCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCwgUkdGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgUmF3U2hhZGVyTWF0ZXJpYWwsIFJheSwgUmF5Y2FzdGVyLCBSZWN0QXJlYUxpZ2h0LCBSZWRGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFJlcGVhdFdyYXBwaW5nLCBSZXBsYWNlU3RlbmNpbE9wLCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiwgUmluZ0dlb21ldHJ5IGFzIFJpbmdCdWZmZXJHZW9tZXRyeSwgUmluZ0dlb21ldHJ5LCBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ180eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0LCBTY2VuZSwgU2NlbmVVdGlscywgU2hhZGVyQ2h1bmssIFNoYWRlckxpYiwgU2hhZGVyTWF0ZXJpYWwsIFNoYWRvd01hdGVyaWFsLCBTaGFwZSwgU2hhcGVHZW9tZXRyeSBhcyBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZVBhdGgsIFNoYXBlVXRpbHMsIFNob3J0VHlwZSwgU2tlbGV0b24sIFNrZWxldG9uSGVscGVyLCBTa2lubmVkTWVzaCwgU21vb3RoU2hhZGluZywgU3BoZXJlLCBTcGhlcmVHZW9tZXRyeSBhcyBTcGhlcmVCdWZmZXJHZW9tZXRyeSwgU3BoZXJlR2VvbWV0cnksIFNwaGVyaWNhbCwgU3BoZXJpY2FsSGFybW9uaWNzMywgU3BsaW5lQ3VydmUsIFNwb3RMaWdodCwgU3BvdExpZ2h0SGVscGVyLCBTcHJpdGUsIFNwcml0ZU1hdGVyaWFsLCBTcmNBbHBoYUZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgU3JjQ29sb3JGYWN0b3IsIFN0YXRpY0NvcHlVc2FnZSwgU3RhdGljRHJhd1VzYWdlLCBTdGF0aWNSZWFkVXNhZ2UsIFN0ZXJlb0NhbWVyYSwgU3RyZWFtQ29weVVzYWdlLCBTdHJlYW1EcmF3VXNhZ2UsIFN0cmVhbVJlYWRVc2FnZSwgU3RyaW5nS2V5ZnJhbWVUcmFjaywgU3VidHJhY3RFcXVhdGlvbiwgU3VidHJhY3RpdmVCbGVuZGluZywgVE9VQ0gsIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCwgVGV0cmFoZWRyb25HZW9tZXRyeSBhcyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBUZXRyYWhlZHJvbkdlb21ldHJ5LCBUZXh0R2VvbWV0cnkgYXMgVGV4dEJ1ZmZlckdlb21ldHJ5LCBUZXh0R2VvbWV0cnksIFRleHR1cmUsIFRleHR1cmVMb2FkZXIsIFRvcnVzR2VvbWV0cnkgYXMgVG9ydXNCdWZmZXJHZW9tZXRyeSwgVG9ydXNHZW9tZXRyeSwgVG9ydXNLbm90R2VvbWV0cnkgYXMgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzS25vdEdlb21ldHJ5LCBUcmlhbmdsZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgVHJpYW5nbGVTdHJpcERyYXdNb2RlLCBUcmlhbmdsZXNEcmF3TW9kZSwgVHViZUdlb21ldHJ5IGFzIFR1YmVCdWZmZXJHZW9tZXRyeSwgVHViZUdlb21ldHJ5LCBVVk1hcHBpbmcsIFVpbnQxNkF0dHJpYnV0ZSwgVWludDE2QnVmZmVyQXR0cmlidXRlLCBVaW50MzJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDhBdHRyaWJ1dGUsIFVpbnQ4QnVmZmVyQXR0cmlidXRlLCBVaW50OENsYW1wZWRBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVW5pZm9ybSwgVW5pZm9ybXNMaWIsIFVuaWZvcm1zVXRpbHMsIFVuc2lnbmVkQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkU2hvcnRUeXBlLCBWU01TaGFkb3dNYXAsIFZlY3RvcjIsIFZlY3RvcjMsIFZlY3RvcjQsIFZlY3RvcktleWZyYW1lVHJhY2ssIFZlcnRleCwgVmVydGV4Q29sb3JzLCBWaWRlb1RleHR1cmUsIFdlYkdMMVJlbmRlcmVyLCBXZWJHTEN1YmVSZW5kZXJUYXJnZXQsIFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlclRhcmdldEN1YmUsIFdlYkdMUmVuZGVyZXIsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBXaXJlZnJhbWVIZWxwZXIsIFdyYXBBcm91bmRFbmRpbmcsIFhIUkxvYWRlciwgWmVyb0N1cnZhdHVyZUVuZGluZywgWmVyb0ZhY3RvciwgWmVyb1Nsb3BlRW5kaW5nLCBaZXJvU3RlbmNpbE9wLCBzUkdCRW5jb2RpbmcgfTtcbiIsICIvKipcbiAqIEBhdXRob3IgTGV3eSBCbHVlIC8gaHR0cHM6Ly9naXRodWIuY29tL2xvb2VlZVxuICovXG5cbmZ1bmN0aW9uIFRpbWUoKSB7XG5cblx0Ly8gS2VlcCB0cmFjayBvZiB0aW1lIHdoZW4gcGF1c2UoKSB3YXMgY2FsbGVkXG4gIGxldCBfcGF1c2VUaW1lO1xuXG5cdC8vIEtlZXAgdHJhY2sgb2YgdGltZSB3aGVuIGRlbHRhIHdhcyBsYXN0IGNoZWNrZWRcbiAgbGV0IF9sYXN0RGVsdGEgPSAwO1xuXG5cdC8vIEhvbGQgdGhlIHRpbWUgd2hlbiBzdGFydCgpIHdhcyBjYWxsZWRcblx0Ly8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZXhwb3NpbmcgdGhpcyBhcyBpdCdzIGVzc2VudGlhbGx5IGEgcmFuZG9tIG51bWJlclxuXHQvLyBhbmQgd2lsbCBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcGVyZm9ybWFuY2Uubm93IG9yIERhdGUubm93IGlzIHVzZWRcbiAgbGV0IF9zdGFydFRpbWUgPSAwO1xuXG4gIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG5cdC8vIFRoZSBzY2FsZSBhdCB3aGljaCB0aGUgdGltZSBpcyBwYXNzaW5nLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBzbG93IG1vdGlvbiBlZmZlY3RzLlxuICBsZXQgX3RpbWVTY2FsZSA9IDEuMDtcblx0Ly8gS2VlcCB0cmFjayBvZiBzY2FsZWQgdGltZSBhY3Jvc3Mgc2NhbGUgY2hhbmdlc1xuICBsZXQgX3RvdGFsVGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gMDtcbiAgbGV0IF90aW1lQXRMYXN0U2NhbGVDaGFuZ2UgPSAwO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cbiAgICBub3c6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiAoIHBlcmZvcm1hbmNlIHx8IERhdGUgKS5ub3coKTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICB0aW1lU2NhbGU6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiBfdGltZVNjYWxlO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQoIHZhbHVlICkge1xuXG4gICAgICAgIF90b3RhbFRpbWVBdExhc3RTY2FsZUNoYW5nZSA9IHRoaXMudG90YWxUaW1lO1xuICAgICAgICBfdGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gdGhpcy5ub3c7XG4gICAgICAgIF90aW1lU2NhbGUgPSB2YWx1ZTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICB1bnNjYWxlZFRvdGFsVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgcmV0dXJuICggdGhpcy5ydW5uaW5nICkgPyB0aGlzLm5vdyAtIF9zdGFydFRpbWUgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICAgIHRvdGFsVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgY29uc3QgZGlmZiA9ICggdGhpcy5ub3cgLSBfdGltZUF0TGFzdFNjYWxlQ2hhbmdlICkgKiB0aGlzLnRpbWVTY2FsZTtcblxuICAgICAgICByZXR1cm4gKCB0aGlzLnJ1bm5pbmcgKSA/IF90b3RhbFRpbWVBdExhc3RTY2FsZUNoYW5nZSArIGRpZmYgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICAgIC8vIFVuc2NhbGVkIHRpbWUgc2luY2UgZGVsdGEgd2FzIGxhc3QgY2hlY2tlZFxuICAgIHVuc2NhbGVkRGVsdGE6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm5vdyAtIF9sYXN0RGVsdGE7XG4gICAgICAgIF9sYXN0RGVsdGEgPSB0aGlzLm5vdztcblxuICAgICAgICByZXR1cm4gZGlmZjtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICAvLyBTY2FsZWQgdGltZSBzaW5jZSBkZWx0YSB3YXMgbGFzdCBjaGVja2VkXG4gICAgZGVsdGE6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2NhbGVkRGVsdGEgKiB0aGlzLnRpbWVTY2FsZTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgfSApO1xuXG4gIHRoaXMuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIHRoaXMucGF1c2VkICkge1xuXG4gICAgICBjb25zdCBkaWZmID0gKCB0aGlzLm5vdyAtIF9wYXVzZVRpbWUgKTtcblxuICAgICAgX3N0YXJ0VGltZSArPSBkaWZmO1xuICAgICAgX2xhc3REZWx0YSArPSBkaWZmO1xuICAgICAgX3RpbWVBdExhc3RTY2FsZUNoYW5nZSArPSBkaWZmO1xuXG4gICAgfVx0ZWxzZSBpZiAoICF0aGlzLnJ1bm5pbmcgKSB7XG5cbiAgICAgIF9zdGFydFRpbWUgPSBfbGFzdERlbHRhID0gX3RpbWVBdExhc3RTY2FsZUNoYW5nZSA9IHRoaXMubm93O1xuXG4gICAgICBfdG90YWxUaW1lQXRMYXN0U2NhbGVDaGFuZ2UgPSAwO1xuXG4gICAgfVxuXG4gICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gIH07XG5cblx0Ly8gUmVzZXQgYW5kIHN0b3AgY2xvY2tcbiAgdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuXG4gICAgX3N0YXJ0VGltZSA9IDA7XG4gICAgX3RvdGFsVGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gMDtcblxuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG4gIH07XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIF9wYXVzZVRpbWUgPSB0aGlzLm5vdztcblxuICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcblxuICB9O1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWUgO1xuIiwgImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCBUaW1lIGZyb20gJy4uL3V0aWxpdGllcy9UaW1lLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIExld3kgQmx1ZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9sb29lZWVcbiAqXG4gKi9cblxubGV0IF9jYW52YXM7XG5sZXQgX3NjZW5lO1xubGV0IF9jYW1lcmE7XG5sZXQgX3JlbmRlcmVyO1xuXG5sZXQgX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEO1xuXG5cbmZ1bmN0aW9uIEFwcCggY2FudmFzICkge1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICggY2FudmFzICE9PSB1bmRlZmluZWQgKSBfY2FudmFzID0gY2FudmFzO1xuXG4gIHRoaXMuYXV0b1JlbmRlciA9IHRydWU7XG5cbiAgdGhpcy5hdXRvUmVzaXplID0gdHJ1ZTtcblxuICB0aGlzLmZyYW1lQ291bnQgPSAwO1xuXG4gIHRoaXMuZGVsdGEgPSAwO1xuXG4gIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICB0aGlzLnRpbWUgPSBuZXcgVGltZSgpO1xuXG4gIGNvbnN0IHNldFJlbmRlcmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggX3JlbmRlcmVyICkgX3JlbmRlcmVyLnNldFNpemUoIHNlbGYuY2FudmFzLmNsaWVudFdpZHRoLCBzZWxmLmNhbnZhcy5jbGllbnRIZWlnaHQsIGZhbHNlICk7XG5cbiAgfTtcblxuICBjb25zdCBzZXRDYW1lcmFBc3BlY3QgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIF9jYW1lcmEgKSB7XG4gICAgICBfY2FtZXJhLmFzcGVjdCA9IF9jYW52YXMuY2xpZW50V2lkdGggLyBfY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIF9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIH1cblxuICB9O1xuXG4gIC8vIG5vdGU6IGdldHMgY2FsbGVkIGxhc3Qgd2hlbiBhdXRvUmVzaXplIGlzIG9uXG4gIHRoaXMub25XaW5kb3dSZXNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICBjb25zdCBvbldpbmRvd1Jlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXNlbGYuYXV0b1Jlc2l6ZSApIHtcblxuICAgICAgc2VsZi5vbldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgfVxuXG4gICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGNhbWVyYSBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGlmICggIV9jYW1lcmEgKSByZXR1cm47XG5cbiAgICBpZiAoIF9jYW1lcmEudHlwZSAhPT0gJ1BlcnNwZWN0aXZlQ2FtZXJhJyApIHtcblxuICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQXBwOiBBdXRvUmVzaXplIG9ubHkgd29ya3Mgd2l0aCBQZXJzcGVjdGl2ZUNhbWVyYScgKTtcbiAgICAgIHJldHVybjtcblxuICAgIH1cblxuICAgIHNldENhbWVyYUFzcGVjdCgpO1xuXG4gICAgc2V0UmVuZGVyZXJTaXplKCk7XG5cbiAgICBzZWxmLm9uV2luZG93UmVzaXplKCk7XG5cblxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgb25XaW5kb3dSZXNpemUsIGZhbHNlICk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblxuICAgIGNhbnZhczoge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgaWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSB7XG5cbiAgICAgICAgICBfY2FudmFzID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKSApO1xuICAgICAgICAgIF9jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgIF9jYW52YXMuc3R5bGUud2lkdGggPSBfY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9jYW52YXM7XG5cbiAgICAgIH0sXG5cbiAgICAgIHNldCggbmV3Q2FudmFzICkge1xuXG4gICAgICAgIF9jYW52YXMgPSBuZXdDYW52YXM7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNhbWVyYToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgaWYgKCBfY2FtZXJhID09PSB1bmRlZmluZWQgKSB7XG5cbiAgICAgICAgICBfY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggLyB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMCApO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2NhbWVyYTtcblxuICAgICAgfSxcblxuICAgICAgc2V0KCBjYW1lcmEgKSB7XG5cbiAgICAgICAgX2NhbWVyYSA9IGNhbWVyYTtcbiAgICAgICAgc2V0Q2FtZXJhQXNwZWN0KCk7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHNjZW5lOiB7XG5cbiAgICAgIGdldCgpIHtcblxuICAgICAgICBpZiAoIF9zY2VuZSA9PT0gdW5kZWZpbmVkICkge1xuXG4gICAgICAgICAgX3NjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfc2NlbmU7XG5cbiAgICAgIH0sXG5cbiAgICAgIHNldCggc2NlbmUgKSB7XG5cbiAgICAgICAgX3NjZW5lID0gc2NlbmU7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHJlbmRlcmVyOiB7XG5cbiAgICAgIGdldCgpIHtcblxuICAgICAgICBpZiAoIF9yZW5kZXJlciA9PT0gdW5kZWZpbmVkICkge1xuXG4gICAgICAgICAgX3JlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoIHsgY2FudmFzOiB0aGlzLmNhbnZhcywgYW50aWFsaWFzOiB0cnVlIH0gKTtcbiAgICAgICAgICBfcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggd2luZG93LmRldmljZVBpeGVsUmF0aW8gKTtcbiAgICAgICAgICBfcmVuZGVyZXIuc2V0U2l6ZSggdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCwgZmFsc2UgKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZW5kZXJlcjtcblxuICAgICAgfSxcblxuICAgICAgc2V0KCByZW5kZXJlciApIHtcblxuICAgICAgICBfcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgc2V0UmVuZGVyZXJTaXplKCk7XG5cbiAgICAgIH0sXG5cbiAgICB9LFxuXG4gICAgYXZlcmFnZUZyYW1lVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgcmV0dXJuICggdGhpcy5mcmFtZUNvdW50ICE9PSAwICkgPyB0aGlzLnRpbWUudW5zY2FsZWRUb3RhbFRpbWUgLyB0aGlzLmZyYW1lQ291bnQgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICB9ICk7XG5cbiAgdGhpcy5wbGF5ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgdGhpcy50aW1lLnN0YXJ0KCk7XG5cbiAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gYW5pbWF0aW9uSGFuZGxlcigpIHtcblxuICAgICAgc2VsZi5mcmFtZUNvdW50ICsrO1xuICAgICAgc2VsZi5kZWx0YSA9IHNlbGYudGltZS5kZWx0YTtcblxuICAgICAgc2VsZi5vblVwZGF0ZSgpO1xuXG4gICAgICBpZiAoIHNlbGYuY29udHJvbHMgJiYgc2VsZi5jb250cm9scy5lbmFibGVEYW1waW5nICkgc2VsZi5jb250cm9scy51cGRhdGUoKTtcblxuICAgICAgaWYgKCBzZWxmLmF1dG9SZW5kZXIgKSBzZWxmLnJlbmRlcmVyLnJlbmRlciggc2VsZi5zY2VuZSwgc2VsZi5jYW1lcmEgKTtcblxuICAgICAgX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7IGFuaW1hdGlvbkhhbmRsZXIoKTsgfSApO1xuXG4gICAgfVxuXG4gICAgYW5pbWF0aW9uSGFuZGxlcigpO1xuXG4gIH07XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgdGhpcy50aW1lLnBhdXNlKCk7XG5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEICk7XG5cbiAgfTtcblxuICB0aGlzLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMudGltZS5zdG9wKCk7XG4gICAgdGhpcy5mcmFtZUNvdW50ID0gMDtcblxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBfY3VycmVudEFuaW1hdGlvbkZyYW1lSUQgKTtcblxuICB9O1xuXG4gIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuICAgIGlmICggdHlwZW9mIG9iamVjdC50b0pTT04gPT09ICdmdW5jdGlvbicgKSB7XG4gICAgICBjb25zdCBqc29uID0gb2JqZWN0LnRvSlNPTigpO1xuXG4gICAgICB3aW5kb3cub3BlbiggJ2RhdGE6YXBwbGljYXRpb24vanNvbjsnICsgKCB3aW5kb3cuYnRvYVxuICAgICAgPyAnYmFzZTY0LCcgKyBidG9hKCBKU09OLnN0cmluZ2lmeSgganNvbiApIClcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkoIGpzb24gKSApICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdBcHAudG9KU09OIGVycm9yOiBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHRvSlNPTiBmdW5jdGlvbi4nICk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaW5pdENvbnRyb2xzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBPcmJpdENvbnRyb2xzKCB0aGlzLmNhbWVyYSwgdGhpcy5jYW52YXMgKTtcblxuICAgIHRoaXMuY29udHJvbHMuZW5hYmxlRGFtcGluZyA9IHRydWU7XG4gICAgdGhpcy5jb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4yO1xuXG4gIH07XG5cbiAgdGhpcy5maXRDYW1lcmFUb09iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0LCB6b29tICkge1xuXG4gICAgem9vbSA9IHpvb20gfHwgMS4yNTtcblxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKTtcblxuICAgIC8vIGdldCBib3VuZGluZyBib3ggb2Ygb2JqZWN0IC0gdGhpcyB3aWxsIGJlIHVzZWQgdG8gc2V0dXAgY29udHJvbHMgYW5kIGNhbWVyYVxuICAgIGJvdW5kaW5nQm94LnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG4gICAgY29uc3QgY2VudGVyID0gYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBuZXcgVEhSRUUuVmVjdG9yMygpICk7XG4gICAgY29uc3Qgc2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUoIG5ldyBUSFJFRS5WZWN0b3IzKCkgKTtcblxuICAgIC8vIGdldCB0aGUgbWF4IHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgIGNvbnN0IG1heERpbSA9IE1hdGgubWF4KCBzaXplLngsIHNpemUueSwgc2l6ZS56ICk7XG4gICAgY29uc3QgZm92ID0gdGhpcy5jYW1lcmEuZm92ICogKCBNYXRoLlBJIC8gMTgwICk7XG4gICAgbGV0IGNhbWVyYVogPSBNYXRoLmFicyggbWF4RGltIC8gNCAqIE1hdGgudGFuKCBmb3YgKiAyICkgKTtcblxuICAgIGNhbWVyYVogKj0gem9vbTsgLy8gem9vbSBvdXQgYSBsaXR0bGUgc28gdGhhdCBvYmplY3RzIGRvbid0IGZpbGwgdGhlIHNjcmVlblxuXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueiA9IGNhbWVyYVo7XG5cbiAgICBjb25zdCBtaW5aID0gYm91bmRpbmdCb3gubWluLno7XG4gICAgY29uc3QgY2FtZXJhVG9GYXJFZGdlID0gKCBtaW5aIDwgMCApID8gLW1pblogKyBjYW1lcmFaIDogY2FtZXJhWiAtIG1pblo7XG5cbiAgICB0aGlzLmNhbWVyYS5mYXIgPSBjYW1lcmFUb0ZhckVkZ2UgKiAzO1xuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuICAgIGlmICggdGhpcy5jb250cm9scyApIHtcblxuICAgICAgLy8gc2V0IGNhbWVyYSB0byByb3RhdGUgYXJvdW5kIGNlbnRlciBvZiBsb2FkZWQgb2JqZWN0XG4gICAgICB0aGlzLmNvbnRyb2xzLnRhcmdldCA9IGNlbnRlcjtcblxuICAgICAgLy8gcHJldmVudCBjYW1lcmEgZnJvbSB6b29taW5nIG91dCBmYXIgZW5vdWdoIHRvIGNyZWF0ZSBmYXIgcGxhbmUgY3V0b2ZmXG4gICAgICB0aGlzLmNvbnRyb2xzLm1heERpc3RhbmNlID0gY2FtZXJhVG9GYXJFZGdlICogMjtcblxuICAgICAgdGhpcy5jb250cm9scy5zYXZlU3RhdGUoKTtcblxuICAgIH1cblxuICAgIHJldHVybiBib3VuZGluZ0JveDtcblxuICB9O1xuXG4gIC8vIHRha2UgYSBzY3JlZW5zaG90IGF0IGEgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodFxuICAvLyBhbmQgcmV0dXJuIGFuIGltZyBlbGVtZW50XG4gIHRoaXMudGFrZVNjcmVlbnNob3QgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGlmICggd2lkdGggPiAwICYmIGhlaWdodCA+IDAgKSB7XG5cbiAgICAgIC8vIHNldCBjYW1lcmEgYW5kIHJlbmRlcmVyIHRvIHNjcmVlbnNob3Qgc2l6ZVxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoIHdpZHRoLCBoZWlnaHQsIGZhbHNlICk7XG5cbiAgICAgIC8vIHJlbmRlciBzY2VuZVxuICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoIHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCBudWxsLCBmYWxzZSApO1xuXG4gICAgICBpbWcuc3JjID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgpO1xuXG4gICAgICAvLyByZXNldCB0aGUgcmVuZGVyZXIgYW5kIGNhbWVyYSB0byBvcmlnaW5hbCBzaXplXG4gICAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCAvIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSggdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCwgZmFsc2UgKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIHJlbmRlciBzY2VuZVxuICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoIHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCBudWxsLCBmYWxzZSApO1xuXG4gICAgICBpbWcuc3JjID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGltZztcblxuICB9O1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiIsICJNYXRoLnNpbmggPSBNYXRoLnNpbmggfHwgZnVuY3Rpb24gc2luaCggeCApIHtcbiAgY29uc3QgeSA9IE1hdGguZXhwKCB4ICk7XG4gIHJldHVybiAoIHkgLSAxIC8geSApIC8gMjtcbn07XG5cbk1hdGguY29zaCA9IE1hdGguY29zaCB8fCBmdW5jdGlvbiBjb3NoKCB4ICkge1xuICBjb25zdCB5ID0gTWF0aC5leHAoIHggKTtcbiAgcmV0dXJuICggeSArIDEgLyB5ICkgLyAyO1xufTtcblxuTWF0aC5jb3QgPSBNYXRoLmNvdCB8fCBmdW5jdGlvbiBjb3QoIHggKSB7XG4gIHJldHVybiAxIC8gTWF0aC50YW4oIHggKTtcbn07XG4iLCAiXG5jb25zdCB3YXJuaW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyN3YXJuJyApO1xuXG5jb25zdCBwVmFsdWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3AtdmFsdWUnICk7XG5jb25zdCBxVmFsdWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3EtdmFsdWUnICk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjcC11cCcgKS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoIGUgKSA9PiB7XG5cbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KCBwVmFsdWUuaW5uZXJIVE1MLCAxMCApO1xuICBpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gMTIgKSByZXR1cm47XG5cbiAgd2FybmluZy5jbGFzc0xpc3QuYWRkKCAnaGlkZScgKTtcbiAgcFZhbHVlLmlubmVySFRNTCA9IGN1cnJlbnRWYWx1ZSArIDE7XG5cbn0gKTtcblxuZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyNwLWRvd24nICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCBlICkgPT4ge1xuXG4gIGUucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBjdXJyZW50VmFsdWUgPSBwYXJzZUludCggcFZhbHVlLmlubmVySFRNTCwgMTAgKTtcblxuICBpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gNCApIHJldHVybjtcblxuICBjb25zdCBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIDE7XG5cbiAgaWYgKCBuZXdWYWx1ZSA9PT0gNCAmJiBwYXJzZUludCggcVZhbHVlLmlubmVySFRNTCwgMTAgKSA9PT0gNCApIHtcblxuICAgIHdhcm5pbmcuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGUnICk7XG5cbiAgfVxuXG4gIHBWYWx1ZS5pbm5lckhUTUwgPSBuZXdWYWx1ZTtcblxufSApO1xuXG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3EtdXAnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCBlICkgPT4ge1xuXG4gIGUucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBjdXJyZW50VmFsdWUgPSBwYXJzZUludCggcVZhbHVlLmlubmVySFRNTCwgMTAgKTtcbiAgaWYgKCBjdXJyZW50VmFsdWUgPT09IDEyICkgcmV0dXJuO1xuXG4gIHdhcm5pbmcuY2xhc3NMaXN0LmFkZCggJ2hpZGUnICk7XG4gIHFWYWx1ZS5pbm5lckhUTUwgPSBjdXJyZW50VmFsdWUgKyAxO1xuXG59ICk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjcS1kb3duJyApLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsICggZSApID0+IHtcblxuICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgY29uc3QgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoIHFWYWx1ZS5pbm5lckhUTUwsIDEwICk7XG5cbiAgaWYgKCBjdXJyZW50VmFsdWUgPT09IDQgKSByZXR1cm47XG5cbiAgY29uc3QgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgLSAxO1xuXG4gIGlmICggbmV3VmFsdWUgPT09IDQgJiYgcGFyc2VJbnQoIHBWYWx1ZS5pbm5lckhUTUwsIDEwICkgPT09IDQgKSB7XG5cbiAgICB3YXJuaW5nLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRlJyApO1xuXG4gIH1cblxuICBxVmFsdWUuaW5uZXJIVE1MID0gbmV3VmFsdWU7XG5cbn0gKTtcbiIsICIvLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICAgTUFUSCBGVU5DVElPTlNcbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gKCB4MSwgeTEsIHgyLCB5MiApID0+XG4gIE1hdGguc3FydCggKCB4MiAtIHgxICkgKiAoIHgyIC0geDEgKSArICggeTIgLSB5MSApICogKCB5MiAtIHkxICkgKTtcblxuLy8gZG9lcyB0aGUgbGluZSBjb25uZWN0aW5nIHAxLCBwMiBnbyB0aHJvdWdoIHRoZSBwb2ludCAoMCwwKT9cbmV4cG9ydCBjb25zdCB0aHJvdWdoT3JpZ2luID0gKCB4MSwgeTEsIHgyLCB5MiApID0+IHtcbiAgLy8gdmVydGljYWwgbGluZSB0aHJvdWdoIGNlbnRyZVxuICBpZiAoICggTWF0aC5hYnMoIHgxICkgPD0gMC4wMDAwMSApICYmICggTWF0aC5hYnMoIHgyICkgPD0gMC4wMDAwMSApICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHRlc3QgPSAoIC14MSAqIHkyICsgeDEgKiB5MSApIC8gKCB4MiAtIHgxICkgKyB5MTtcblxuICBpZiAoIE1hdGguYWJzKCB0ZXN0ICkgPD0gMC4wMDAwMSApIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5cbi8vIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlciBhcmMgYmV0d2VlbiB0d28gYW5nbGVzIG9uIGEgZ2l2ZW4gY2lyY2xlXG5leHBvcnQgY29uc3QgYXJjTGVuZ3RoID0gKCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlICkgPT4ge1xuICByZXR1cm4gKCBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgPiBNYXRoLlBJIClcbiAgICA/IHJhZGl1cyAqICggMiAqIE1hdGguUEkgLSBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgKVxuICAgIDogcmFkaXVzICogKCBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgKTtcbn07XG5cbi8vIGZpbmQgdGhlIHR3byBwb2ludHMgYSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgb24gdGhlIGNpcmN1bWZlcmVuY2Ugb2YgYSBjaXJjbGVcbi8vIGluIHRoZSBkaXJlY3Rpb24gb2YgcG9pbnQyXG5leHBvcnQgY29uc3QgZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjID0gKCBhcmMsIHNwYWNpbmcgKSA9PiB7XG4gIGNvbnN0IGNvc1RoZXRhID0gLSggKCBzcGFjaW5nICogc3BhY2luZyApIC8gKCAyICogYXJjLnJhZGl1cyAqIGFyYy5yYWRpdXMgKSAtIDEgKTtcbiAgY29uc3Qgc2luVGhldGFQb3MgPSBNYXRoLnNxcnQoIDEgLSAoIGNvc1RoZXRhICogY29zVGhldGEgKSApO1xuICBjb25zdCBzaW5UaGV0YU5lZyA9IC1zaW5UaGV0YVBvcztcblxuICBjb25zdCB4UG9zID0gYXJjLmNlbnRyZS54ICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApIC0gc2luVGhldGFQb3NcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB4TmVnID0gYXJjLmNlbnRyZS54ICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApIC0gc2luVGhldGFOZWdcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB5UG9zID0gYXJjLmNlbnRyZS55ICsgc2luVGhldGFQb3NcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB5TmVnID0gYXJjLmNlbnRyZS55ICsgc2luVGhldGFOZWdcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuXG4gIGNvbnN0IGEgPSBkaXN0YW5jZSggeFBvcywgeVBvcywgYXJjLmVuZFBvaW50LngsIGFyYy5lbmRQb2ludC55ICk7XG4gIGNvbnN0IGIgPSBkaXN0YW5jZSggeE5lZywgeU5lZywgYXJjLmVuZFBvaW50LngsIGFyYy5lbmRQb2ludC55ICk7XG5cbiAgcmV0dXJuICggYSA8IGIgKSA/IHsgeDogeFBvcywgeTogeVBvcywgejogMCB9IDogeyB4OiB4TmVnLCB5OiB5TmVnLCB6OiAwIH07XG59O1xuXG4vLyBjYWxjdWxhdGUgdGhlIG5vcm1hbCB2ZWN0b3IgZ2l2ZW4gMiBwb2ludHNcbi8vIGV4cG9ydCBjb25zdCBub3JtYWxWZWN0b3IgPSAoIHgxLCB5MSwgeDIsIHkyICkgPT4ge1xuLy8gICBjb25zdCBkID0gZGlzdGFuY2UoIHgxLCB5MSwgeDIsIHkyICk7XG4vLyAgIHYxLnNldCggKCB4MiAtIHgxICkgLyBkLCAoIHkyIC0geTEgKSAvIGQsIDAgKTtcbi8vICAgcmV0dXJuIHYxO1xuLy8gICAvLyB7IHg6ICggeDIgLSB4MSApIC8gZCwgeTogKCB5MiAtIHkxICkgLyBkLCB6OiAwIH07XG4vLyB9O1xuXG4vLyBmaW5kIHRoZSBwb2ludCBhdCBhIGRpc3RhbmNlIGZyb20gcG9pbnQxIGFsb25nIGxpbmUgZGVmaW5lZCBieSBwb2ludDEsIHBvaW50Mixcbi8vIGluIHRoZSBkaXJlY3Rpb24gb2YgcG9pbnQyXG5leHBvcnQgY29uc3QgZGlyZWN0ZWRTcGFjZWRQb2ludE9uTGluZSA9ICggeDEsIHkxLCB4MiwgeTIsIHNwYWNpbmcgKSA9PiB7XG4gIGNvbnN0IGQgPSBkaXN0YW5jZSggeDEsIHkxLCB4MiwgeTIgKTtcbiAgLy8gY29uc3QgZHYgPSBub3JtYWxWZWN0b3IoIHgxLCB5MSwgeDIsIHkyICk7XG4gIHJldHVybiB7XG4gICAgeDogeDEgKyBzcGFjaW5nICogKCB4MiAtIHgxICkgLyBkLFxuICAgIHk6IHkxICsgc3BhY2luZyAqICggeTIgLSB5MSApIC8gZCxcbiAgICB6OiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5TWF0cmljZXMgPSAoIG0xLCBtMiApID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoIGxldCBpID0gMDsgaSA8IG0xLmxlbmd0aDsgaSsrICkge1xuICAgIHJlc3VsdFtpXSA9IFtdO1xuICAgIGZvciAoIGxldCBqID0gMDsgaiA8IG0yWzBdLmxlbmd0aDsgaisrICkge1xuICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICBmb3IgKCBsZXQgayA9IDA7IGsgPCBtMVswXS5sZW5ndGg7IGsrKyApIHtcbiAgICAgICAgc3VtICs9IG0xW2ldW2tdICogbTJba11bal07XG4gICAgICB9XG4gICAgICByZXN1bHRbaV1bal0gPSBzdW07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBjcmVhdGUgbnhuIGlkZW50aXR5TWF0cml4XG5leHBvcnQgY29uc3QgaWRlbnRpdHlNYXRyaXggPSBuID0+XG4gIEFycmF5KCAuLi5uZXcgQXJyYXkoIG4gKSApLm1hcCggKCB4LCBpLCBhICkgPT5cbiAgICBhLm1hcCggKCB5LCBrICkgPT4ge1xuICAgICAgcmV0dXJuICggaSA9PT0gayApID8gMSA6IDA7XG4gICAgfSApLFxuICApO1xuXG5leHBvcnQgY29uc3QgaHlwZXJib2xvaWRDcm9zc1Byb2R1Y3QgPSAoIHgxLCB5MSwgejEsIHgyLCB5MiwgejIgKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDogeTEgKiB6MiAtIHoxICogeTIsXG4gICAgeTogejEgKiB4MiAtIHgxICogejIsXG4gICAgejogLXgxICogeTIgKyB5MSAqIHgyLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgcG9pbmNhcmVUb0h5cGVyYm9sb2lkID0gKCB4LCB5ICkgPT4ge1xuICBjb25zdCBmYWN0b3IgPSAxIC8gKCAxIC0geCAqIHggLSB5ICogeSApO1xuICByZXR1cm4geyBcbiAgICB4OiAyICogZmFjdG9yICogeCxcbiAgICB5OiAyICogZmFjdG9yICogeSxcbiAgICB6OiBmYWN0b3IgKiAoIDEgKyB4ICogeCArIHkgKiB5ICksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaHlwZXJib2xvaWRUb1BvaW5jYXJlID0gKCB4LCB5LCB6ICkgPT4ge1xuICBjb25zdCBmYWN0b3IgPSAxIC8gKCAxICsgeiApO1xuICByZXR1cm4geyBcbiAgICB4OiBmYWN0b3IgKiB4LFxuICAgIHk6IGZhY3RvciAqIHksXG4gICAgejogMCxcbiAgfTtcbn07XG5cbi8vIG1vdmUgdGhlIHBvaW50IHRvIGh5cGVyYm9sb2lkIChXZWllcnN0cmFzcykgc3BhY2UsIGFwcGx5IHRoZSB0cmFuc2Zvcm0sIHRoZW4gbW92ZSBiYWNrXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUG9pbnQgPSAoIHRyYW5zZm9ybSwgeCwgeSApID0+IHtcbiAgY29uc3QgbWF0ID0gdHJhbnNmb3JtLm1hdHJpeDtcbiAgY29uc3QgcCA9IHBvaW5jYXJlVG9IeXBlcmJvbG9pZCggeCwgeSApO1xuICBjb25zdCB4VCA9IHAueCAqIG1hdFswXVswXSArIHAueSAqIG1hdFswXVsxXSArIHAueiAqIG1hdFswXVsyXTtcbiAgY29uc3QgeVQgPSBwLnggKiBtYXRbMV1bMF0gKyBwLnkgKiBtYXRbMV1bMV0gKyBwLnogKiBtYXRbMV1bMl07XG4gIGNvbnN0IHpUID0gcC54ICogbWF0WzJdWzBdICsgcC55ICogbWF0WzJdWzFdICsgcC56ICogbWF0WzJdWzJdO1xuXG4gIHJldHVybiBoeXBlcmJvbG9pZFRvUG9pbmNhcmUoIHhULCB5VCwgelQgKTtcbn07XG5cbi8vIGFyZSB0aGUgYW5nbGVzIGFscGhhLCBiZXRhIGluIGNsb2Nrd2lzZSBvcmRlciBvbiB1bml0IGRpc2s/XG4vLyBleHBvcnQgY29uc3QgY2xvY2t3aXNlID0gKCBhbHBoYSwgYmV0YSApID0+IHtcbi8vICAgLy8gbGV0IGN3ID0gdHJ1ZTtcbi8vICAgY29uc3QgYSA9ICggYmV0YSA+IDMgKiBNYXRoLlBJIC8gMiAmJiBhbHBoYSA8IE1hdGguUEkgLyAyICk7XG4vLyAgIGNvbnN0IGIgPSAoIGJldGEgLSBhbHBoYSA+IE1hdGguUEkgKTtcbi8vICAgY29uc3QgYyA9ICggKCBhbHBoYSA+IGJldGEgKSAmJiAhKCBhbHBoYSAtIGJldGEgPiBNYXRoLlBJICkgKTtcbi8vICAgLy8gaWYgKGEgfHwgYiB8fCBjKSB7XG4vLyAgICAgLy8gY3cgPSBmYWxzZTtcbi8vICAgLy8gfVxuLy8gICAvLyByZXR1cm4gKGEgfHwgYiB8fCBjKSA/IGZhbHNlIDogdHJ1ZTtcbi8vICAgcmV0dXJuICEoIGEgfHwgYiB8fCBjICk7XG4vLyB9O1xuXG4vLyBleHBvcnQgY29uc3QgcmFuZG9tRmxvYXQgPSAoIG1pbiwgbWF4ICkgPT4gTWF0aC5yYW5kb20oKSAqICggbWF4IC0gbWluICkgKyBtaW47XG5cbi8vIGV4cG9ydCBjb25zdCByYW5kb21JbnQgPSAoIG1pbiwgbWF4ICkgPT4gTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggbWF4IC0gbWluICsgMSApICsgbWluICk7XG4iLCAiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjLCBkaXJlY3RlZFNwYWNlZFBvaW50T25MaW5lLCBkaXN0YW5jZSB9IGZyb20gJy4uL3V0aWxpdGllcy9tYXRoRnVuY3Rpb25zLmpzJztcblxuLy8gVGhlIGxvbmdlc3QgZWRnZSB3aXRoIHJhZGl1cyA+IDAgc2hvdWxkIGJlIHVzZWQgdG8gY2FsY3VsYXRlIGhvdyBmaW5lbHlcbi8vIHRoZSBwb2x5Z29uIGdldHMgc3ViZGl2aWRlZFxuZnVuY3Rpb24gZmluZFN1YmRpdmlzaW9uRWRnZSggcG9seWdvbiApIHtcbiAgLy8gY3VydmF0dXJlID09PSAwIG1lYW5zIHRoaXMgZWRnZSBnb2VzIHRocm91Z2ggb3JpZ2luXG4gIC8vIGluIHdoaWNoIGNhc2Ugc3ViZGl2aWRlIGJhc2VkIG9uIG5leHQgbG9uZ2VzdCBlZGdlXG4gIGNvbnN0IGEgPSAoIHBvbHlnb24uZWRnZXNbMF0uY3VydmF0dXJlID09PSAwIClcbiAgICA/IDBcbiAgICA6IHBvbHlnb24uZWRnZXNbMF0uYXJjTGVuZ3RoO1xuICBjb25zdCBiID0gKCBwb2x5Z29uLmVkZ2VzWzFdLmN1cnZhdHVyZSA9PT0gMCApXG4gICAgPyAwXG4gICAgOiBwb2x5Z29uLmVkZ2VzWzFdLmFyY0xlbmd0aDtcbiAgY29uc3QgYyA9ICggcG9seWdvbi5lZGdlc1syXS5jdXJ2YXR1cmUgPT09IDAgKVxuICAgID8gMFxuICAgIDogcG9seWdvbi5lZGdlc1syXS5hcmNMZW5ndGg7XG4gIGlmICggYSA+IGIgJiYgYSA+IGMgKSByZXR1cm4gMDtcbiAgZWxzZSBpZiAoIGIgPiBjICkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG4vLyBTdWJkaXZpZGUgdGhlIGVkZ2UgaW50byBsZW5ndGhzIGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlU3BhY2luZygpXG5mdW5jdGlvbiBzdWJkaXZpZGVIeXBlcmJvbGljQXJjKCBhcmMsIG51bURpdmlzaW9ucyApIHtcbiAgLy8gY2FsY3VsYXRlIHRoZSBzcGFjaW5nIGZvciBzdWJkaXZpZGluZyB0aGUgZWRnZSBpbnRvIGFuIGV2ZW4gbnVtYmVyIG9mIHBpZWNlcy5cbiAgLy8gRm9yIHRoZSBmaXJzdCAoIGxvbmdlc3QgKSBlZGdlIHRoaXMgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHNwYWNpbmdcbiAgLy8gdGhlbiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGVkZ2VzIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mXG4gIC8vIHN1YmRpdmlzaW9ucyBvZiB0aGUgZmlyc3QgZWRnZSAoIHNvIHRoYXQgYWxsIGVkZ2VzIGFyZSBkaXZpZGVkIGludG8gYW4gZXF1YWxcbiAgLy8gbnVtYmVyIG9mIHBpZWNlcylcblxuICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgcmVxdWlyZWQgdG8gYnJlYWsgdGhlIGFyYyBpbnRvIGFuXG4gIC8vIGV2ZW4gbnVtYmVyIG9mIHBpZWNlcyAob3IgMSBpbiBjYXNlIG9mIHRpbnkgcG9seWdvbnMpXG5cbiAgbnVtRGl2aXNpb25zID0gbnVtRGl2aXNpb25zIHx8ICggYXJjLmFyY0xlbmd0aCA+IDAuMDAxIClcbiAgICA/IDIgKiBNYXRoLmNlaWwoIGFyYy5hcmNMZW5ndGggKSAvLyBjdXJyZW50bHkgYWx3YXlzID0gMlxuICAgIDogMTtcblxuICAvLyBjYWxjdWxhdGUgc3BhY2luZyBiYXNlZCBvbiBudW1iZXIgb2YgcG9pbnRzXG4gIGNvbnN0IHNwYWNpbmcgPSBhcmMuYXJjTGVuZ3RoIC8gbnVtRGl2aXNpb25zO1xuXG4gIGNvbnN0IHBvaW50cyA9IFthcmMuc3RhcnRQb2ludF07XG5cbiAgLy8gdGlueSBwZ29ucyBuZWFyIHRoZSBlZGdlcyBvZiB0aGUgZGlzayBkb24ndCBuZWVkIHRvIGJlIHN1YmRpdmlkZWRcbiAgaWYgKCBhcmMuYXJjTGVuZ3RoID4gc3BhY2luZyApIHtcbiAgICBsZXQgcCA9ICggIWFyYy5zdHJhaWdodExpbmUgKVxuICAgICAgPyBkaXJlY3RlZFNwYWNlZFBvaW50T25BcmMoIGFyYywgc3BhY2luZyApXG4gICAgICA6IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIGFyYy5zdGFydFBvaW50LngsIGFyYy5zdGFydFBvaW50LnksIGFyYy5lbmRQb2ludC54LCBhcmMuZW5kUG9pbnQueSwgc3BhY2luZyApO1xuICAgIHBvaW50cy5wdXNoKCBwICk7XG5cbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBudW1EaXZpc2lvbnMgLSAyOyBpKysgKSB7XG4gICAgICBwID0gKCAhYXJjLnN0cmFpZ2h0TGluZSApXG4gICAgICAgID8gZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjKCBhcmMsIHNwYWNpbmcgKVxuICAgICAgICA6IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIHAueCwgcC55LCBhcmMuZW5kUG9pbnQueCwgYXJjLmVuZFBvaW50LnksIHNwYWNpbmcgKTtcbiAgICAgIHBvaW50cy5wdXNoKCBwICk7XG4gICAgfVxuICB9XG4gIC8vIHB1c2ggdGhlIGZpbmFsIHZlcnRleFxuICBwb2ludHMucHVzaCggYXJjLmVuZFBvaW50ICk7XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuLy8gc3ViZGl2aWRlIHRoZSBzdWJkaXZpc2lvbiBlZGdlLCB0aGVuIHN1YmRpdmlkZSB0aGUgb3RoZXIgdHdvIGVkZ2VzIHdpdGggdGhlXG4vLyBzYW1lIG51bWJlciBvZiBwb2ludHMgYXMgdGhlIHN1YmRpdmlzaW9uXG5mdW5jdGlvbiBzdWJkaXZpZGVIeXBlcmJvbGljUG9seWdvbkVkZ2VzKCBwb2x5Z29uICkge1xuICBjb25zdCBzdWJkaXZpc2lvbkVkZ2UgPSBmaW5kU3ViZGl2aXNpb25FZGdlKCBwb2x5Z29uICk7XG5cbiAgY29uc3QgZWRnZTFQb2ludHMgPSBzdWJkaXZpZGVIeXBlcmJvbGljQXJjKCBwb2x5Z29uLmVkZ2VzW3N1YmRpdmlzaW9uRWRnZV0gKTtcblxuICBjb25zdCBudW1EaXZpc2lvbnMgPSBlZGdlMVBvaW50cy5sZW5ndGggLSAxO1xuXG4gIHBvbHlnb24ubnVtRGl2aXNpb25zID0gbnVtRGl2aXNpb25zO1xuXG4gIGNvbnN0IGVkZ2UyUG9pbnRzID0gc3ViZGl2aWRlSHlwZXJib2xpY0FyYyggcG9seWdvbi5lZGdlc1soIHN1YmRpdmlzaW9uRWRnZSArIDEgKSAlIDNdLCBudW1EaXZpc2lvbnMgKTtcbiAgY29uc3QgZWRnZTNQb2ludHMgPSBzdWJkaXZpZGVIeXBlcmJvbGljQXJjKCBwb2x5Z29uLmVkZ2VzWyggc3ViZGl2aXNpb25FZGdlICsgMiApICUgM10sIG51bURpdmlzaW9ucyApO1xuXG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgZWRnZXNbc3ViZGl2aXNpb25FZGdlXSA9IGVkZ2UxUG9pbnRzO1xuICBlZGdlc1soIHN1YmRpdmlzaW9uRWRnZSArIDEgKSAlIDNdID0gZWRnZTJQb2ludHM7XG4gIGVkZ2VzWyggc3ViZGl2aXNpb25FZGdlICsgMiApICUgM10gPSBlZGdlM1BvaW50cztcblxuICByZXR1cm4gZWRnZXM7XG59XG5cbi8vIEFsdGVybmF0aXZlIHRvIHN1YmRpdmlkZUludGVyaW9yQXJjIHVzaW5nIGxpbmVzIGluc3RlYWQgb2YgYXJjc1xuLy8gKCBxdWFsaXR5IHNlZW1zIHRoZSBzYW1lIGFuZCBtYXkgYmUgZmFzdGVyIClcbmZ1bmN0aW9uIHN1YmRpdmlkZUxpbmUoIHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBudW1EaXZpc2lvbnMsIGFyY0luZGV4ICkge1xuICBjb25zdCBwb2ludHMgPSBbc3RhcnRQb2ludF07XG5cbiAgY29uc3QgZGl2aXNpb25zID0gbnVtRGl2aXNpb25zIC0gYXJjSW5kZXg7XG5cbiAgLy8gaWYgdGhlIGxpbmUgZ2V0IGRpdmlkZWQgYWRkIHBvaW50cyBhbG9uZyBsaW5lIHRvIG1lc2hcbiAgaWYgKCBkaXZpc2lvbnMgPiAxICkge1xuICAgIGNvbnN0IHNwYWNpbmcgPSBkaXN0YW5jZSggc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksIGVuZFBvaW50LngsIGVuZFBvaW50LnkgKSAvICggZGl2aXNpb25zICk7XG4gICAgbGV0IG5leHRQb2ludCA9IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55LCBzcGFjaW5nICk7XG4gICAgZm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zIC0gMTsgaisrICkge1xuICAgICAgcG9pbnRzLnB1c2goIG5leHRQb2ludCApO1xuICAgICAgbmV4dFBvaW50ID0gZGlyZWN0ZWRTcGFjZWRQb2ludE9uTGluZSggbmV4dFBvaW50LngsIG5leHRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55LCBzcGFjaW5nICk7XG4gICAgfVxuICB9XG5cbiAgcG9pbnRzLnB1c2goIGVuZFBvaW50ICk7XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuLy8gR2l2ZW4gYSBoeXBlcmJvbGljIHBvbHlnb24sIHJldHVybiBhbiBhcnJheSByZXByZXNlbnRpbmcgYSBzdWJkaXZpZGVkICB0cmlhbmd1bGFyXG4vLyBtZXNoIGFjcm9zcyBpdCdzIHN1cmZhY2VcbmZ1bmN0aW9uIHN1YmRpdmlkZUh5cGVyYm9saWNQb2x5Z29uKCBwb2x5Z29uICkge1xuICBjb25zdCBzdWJkaXZpZGVkRWRnZXMgPSBzdWJkaXZpZGVIeXBlcmJvbGljUG9seWdvbkVkZ2VzKCBwb2x5Z29uICk7XG5cbiAgY29uc3QgbnVtRGl2aXNpb25zID0gcG9seWdvbi5udW1EaXZpc2lvbnM7XG5cbiAgY29uc3QgcG9pbnRzID0gW10uY29uY2F0KCBzdWJkaXZpZGVkRWRnZXNbMF0gKTtcblxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gdXNpbmcgZmxhdCBhcnJheSBhbmQgZXZlbnR1YWxseSBqdXN0IGltbWVkaWF0ZWx5IHBvcHVsYXRlIHRoZSBGbG9hdDMyQXJyYXlcbiAgLy8gY29uc3QgZmxhdFBvaW50cyA9IFtdO1xuXG4gIC8vIGZvciAoIGxldCBpID0gMDsgaSA8IHN1YmRpdmlkZWRFZGdlc1swXS5sZW5ndGg7IGkrKyApIHtcbiAgLy8gICBmbGF0UG9pbnRzLnB1c2goXG4gIC8vICAgICBzdWJkaXZpZGVkRWRnZXNbMF1baV0ueCxcbiAgLy8gICAgIHN1YmRpdmlkZWRFZGdlc1swXVtpXS55LFxuICAvLyAgICAgc3ViZGl2aWRlZEVkZ2VzWzBdW2ldLnosXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIGZvciAoIGxldCBpID0gMTsgaSA8IG51bURpdmlzaW9uczsgaSsrICkge1xuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBzdWJkaXZpZGVkRWRnZXNbMl1bKCBudW1EaXZpc2lvbnMgLSBpICldO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gc3ViZGl2aWRlZEVkZ2VzWzFdW2ldO1xuICAgIC8vIHRoaXMuc3ViZGl2aWRlSW50ZXJpb3JBcmMoIHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBpICk7XG4gICAgY29uc3QgbmV3UG9pbnRzID0gc3ViZGl2aWRlTGluZSggc3RhcnRQb2ludCwgZW5kUG9pbnQsIGkgKTtcblxuICAgIC8vIGZvciAoIGxldCBqID0gMDsgaiA8IG5ld1BvaW50cy5sZW5ndGg7IGorKykge1xuICAgIC8vICAgZmxhdFBvaW50cy5wdXNoKFxuICAgIC8vICAgICBuZXdQb2ludHNbal0ueCxcbiAgICAvLyAgICAgbmV3UG9pbnRzW2pdLnksXG4gICAgLy8gICAgIG5ld1BvaW50c1tqXS56LFxuICAgIC8vICAgKTtcbiAgICAvLyB9XG5cbiAgICBwb2ludHMucHVzaCggLi4ubmV3UG9pbnRzICk7XG5cbiAgfVxuXG4gIC8vIHB1c2ggdGhlIGZpbmFsIHZlcnRleFxuICBwb2ludHMucHVzaCggc3ViZGl2aWRlZEVkZ2VzWzJdWzBdICk7XG5cbiAgLy8gZmxhdFBvaW50cy5wdXNoKFxuICAvLyAgIHN1YmRpdmlkZWRFZGdlc1syXVswXS54LFxuICAvLyAgIHN1YmRpdmlkZWRFZGdlc1syXVswXS55LFxuICAvLyAgIHN1YmRpdmlkZWRFZGdlc1syXVswXS56LFxuICAvLyApO1xuXG4gIHJldHVybiBwb2ludHM7XG59XG5cbi8vIGNyZWF0ZSBvbmUgYnVmZmVyIGdlb21ldHJ5IHBlciBtYXRlcmlhbCAodGlsZSB0eXBlKVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gY3JlYXRlR2VvbWV0cmllcyggdGlsaW5nICkge1xuICBsZXQgcG9zaXRpb25BSW5kZXggPSAwO1xuICBsZXQgdXZBSW5kZXggPSAwO1xuXG4gIGxldCBwb3NpdGlvbkJJbmRleCA9IDA7XG4gIGxldCB1dkJJbmRleCA9IDA7XG5cbiAgY29uc3QgcG9zaXRpb25zQSA9IFtdO1xuICBjb25zdCB1dnNBID0gW107XG5cbiAgY29uc3QgcG9zaXRpb25zQiA9IFtdO1xuICBjb25zdCB1dnNCID0gW107XG5cbiAgZnVuY3Rpb24gY3JlYXRlR2VvbWV0cnkoIHBvbHlnb24gKSB7XG5cbiAgICBjb25zdCB2ZXJ0aWNlcyA9IHN1YmRpdmlkZUh5cGVyYm9saWNQb2x5Z29uKCBwb2x5Z29uICk7XG5cbiAgICBjb25zdCBkaXZpc2lvbnMgPSBwb2x5Z29uLm51bURpdmlzaW9ucyB8fCAxO1xuXG4gICAgZnVuY3Rpb24gYWRkUG9zaXRpb25zQW5kVXZzKCBwb3NpdGlvbnMsIHBvc2l0aW9uSW5kZXgsIHV2cywgdXZJbmRleCApIHtcblxuICAgICAgY29uc3QgcCA9IDEgLyBkaXZpc2lvbnM7XG5cbiAgICAgIGxldCBlZGdlU3RhcnRpbmdWZXJ0ZXggPSAwO1xuICAgICAgLy8gbG9vcCBvdmVyIGVhY2ggaW50ZXJpb3IgZWRnZSBvZiB0aGUgcG9seWdvbidzIHN1YmRpdmlvbiBtZXNoIGFuZCBjcmVhdGUgZmFjZXMgYW5kIHV2c1xuICAgICAgZm9yICggbGV0IGkgPSAwOyBpIDwgZGl2aXNpb25zOyBpKysgKSB7XG4gICAgICAgIC8vIGVkZ2UgZGl2aXNpb25zIHJlZHVjZSBieSBvbmUgZm9yIGVhY2ggaW50ZXJpb3IgZWRnZVxuICAgICAgICBjb25zdCBtID0gZGl2aXNpb25zIC0gaSArIDE7XG5cbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleF0ueDtcbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleF0ueTtcbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleF0uejtcblxuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbV0ueDtcbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG1dLnk7XG4gICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtXS56O1xuXG5cbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIDFdLng7XG4gICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyAxXS55O1xuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgMV0uejtcblxuICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gaSAqIHA7XG4gICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAwO1xuICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gKCBpICsgMSApICogcDtcbiAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9IDA7XG4gICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGkgKyAxICkgKiBwO1xuICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gcDtcblxuICAgICAgICAvLyByYW5nZSBtLTIgYmVjYXVzZSB3ZSBhcmUgaWdub3JpbmcgdGhlIGVkZ2VzIGZpcnN0IHZlcnRleCB3aGljaCB3YXNcbiAgICAgICAgLy8gdXNlZCBpbiB0aGUgcHJldmlvdXMgcG9zaXRpb25zLnB1c2hcbiAgICAgICAgLy8gRWFjaCBsb29wIGNyZWF0ZXMgMiBmYWNlc1xuICAgICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCBtIC0gMjsgaisrICkge1xuXG4gICAgICAgICAgLy8gRmFjZSAxXG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAxXS54O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMV0ueTtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDFdLno7XG5cbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIGpdLng7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyBqXS55O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgal0uejtcblxuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgMSArIGpdLng7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyAxICsgal0ueTtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIDEgKyBqXS56O1xuXG4gICAgICAgICAgLy8gRmFjZSAyXG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAxXS54O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMV0ueTtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDFdLno7XG5cbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIDEgKyBqXS54O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgMSArIGpdLnk7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyAxICsgal0uejtcblxuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMl0ueDtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDJdLnk7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAyXS56O1xuXG4gICAgICAgICAgLy8gRmFjZSAxIHV2c1xuICAgICAgICAgIHV2c1t1dkluZGV4KytdID0gKCBpICsgMSArIGogKSAqIHA7XG4gICAgICAgICAgdXZzW3V2SW5kZXgrK10gPSAoIDEgKyBqICkgKiBwO1xuICAgICAgICAgIHV2c1t1dkluZGV4KytdID0gKCBpICsgMSArIGogKSAqIHA7XG4gICAgICAgICAgdXZzW3V2SW5kZXgrK10gPSBqICogcDtcbiAgICAgICAgICB1dnNbdXZJbmRleCsrXSA9ICggaSArIGogKyAyICkgKiBwO1xuICAgICAgICAgIHV2c1t1dkluZGV4KytdID0gKCBqICsgMSApICogcDtcblxuICAgICAgICAgIC8vIEZhY2UgMiB1dnNcbiAgICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gKCBpICsgMSArIGogKSAqIHA7XG4gICAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9ICggMSArIGogKSAqIHA7XG4gICAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9ICggaSArIDIgKyBqICkgKiBwO1xuICAgICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGogKyAxICkgKiBwO1xuICAgICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGkgKyBqICsgMiApICogcDtcbiAgICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gKCBqICsgMiApICogcDtcblxuICAgICAgICB9XG4gICAgICAgIGVkZ2VTdGFydGluZ1ZlcnRleCArPSBtO1xuICAgICAgfVxuXG4gICAgfVxuXG4gICAgaWYgKCBwb2x5Z29uLm1hdGVyaWFsSW5kZXggPT09IDAgKSB7XG4gICAgICBhZGRQb3NpdGlvbnNBbmRVdnMoIHBvc2l0aW9uc0EsIHBvc2l0aW9uQUluZGV4LCB1dnNBLCB1dkFJbmRleCApO1xuICAgICAgaWYgKCBkaXZpc2lvbnMgPT09IDEgKSB7XG4gICAgICAgIHBvc2l0aW9uQUluZGV4ICs9IDk7XG4gICAgICAgIHV2QUluZGV4ICs9IDY7XG4gICAgICB9IGVsc2UgaWYgKCBkaXZpc2lvbnMgPT09IDIgKSB7XG4gICAgICAgIHBvc2l0aW9uQUluZGV4ICs9IDM2O1xuICAgICAgICB1dkFJbmRleCArPSAyNDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoICdUb28gbWFueSBkaXZpc2lvbnMhIScgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYWRkUG9zaXRpb25zQW5kVXZzKCBwb3NpdGlvbnNCLCBwb3NpdGlvbkJJbmRleCwgdXZzQiwgdXZCSW5kZXggKTtcbiAgICAgIGlmICggZGl2aXNpb25zID09PSAxICkge1xuICAgICAgICBwb3NpdGlvbkJJbmRleCArPSA5O1xuICAgICAgICB1dkJJbmRleCArPSA2O1xuICAgICAgfSBlbHNlIGlmICggZGl2aXNpb25zID09PSAyICkge1xuICAgICAgICBwb3NpdGlvbkJJbmRleCArPSAzNjtcbiAgICAgICAgdXZCSW5kZXggKz0gMjQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCAnVG9vIG1hbnkgZGl2aXNpb25zISEnICk7XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBjb25zdCBidWZmZXJHZW9tZXRyeUEgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcbiAgY29uc3QgYnVmZmVyR2VvbWV0cnlCID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7XG5cbiAgZm9yICggbGV0IGkgPSAwOyBpIDwgdGlsaW5nLmxlbmd0aDsgaSsrICkge1xuICAgIGNyZWF0ZUdlb21ldHJ5KCB0aWxpbmdbaV0gKTtcbiAgfVxuXG4gIGJ1ZmZlckdlb21ldHJ5QS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnNBLCAzICkgKTtcbiAgYnVmZmVyR2VvbWV0cnlBLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2c0EsIDIgKSApO1xuXG4gIGJ1ZmZlckdlb21ldHJ5Qi5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnNCLCAzICkgKTtcbiAgYnVmZmVyR2VvbWV0cnlCLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2c0IsIDIgKSApO1xuXG4gIHJldHVybiBbYnVmZmVyR2VvbWV0cnlBLCBidWZmZXJHZW9tZXRyeUJdO1xufVxuXG4vLyBmaW5kIHRoZSBwb2ludHMgYWxvbmcgdGhlIGFyYyBiZXR3ZWVuIG9wcG9zaXRlIHN1YmRpdmlvbnMgb2YgdGhlIHNlY29uZCB0d29cbi8vIGVkZ2VzIG9mIHRoZSBwb2x5Z29uLiBFYWNoIHN1YnNlcXVlbnQgYXJjIHdpbGwgaGF2ZSBvbmUgbGVzcyBzdWJkaXZpc2lvblxuLy8gZnVuY3Rpb24gc3ViZGl2aWRlSW50ZXJpb3JBcmMoIHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBhcmNJbmRleCApIHtcbi8vICAgY29uc3QgYXJjID0gbmV3IEh5cGVyYm9saWNBcmMoIHN0YXJ0UG9pbnQsIGVuZFBvaW50ICk7XG4vLyAgIHRoaXMubWVzaC5wdXNoKCBzdGFydFBvaW50ICk7XG5cbi8vICAgLy8gZm9yIGVhY2ggYXJjLCB0aGUgbnVtYmVyIG9mIGRpdmlzaW9ucyB3aWxsIGJlIHJlZHVjZWQgYnkgb25lXG4vLyAgIGNvbnN0IGRpdmlzaW9ucyA9IHRoaXMubnVtRGl2aXNpb25zIC0gYXJjSW5kZXg7XG5cbi8vICAgLy8gaWYgdGhlIGxpbmUgZ2V0IGRpdmlkZWQgYWRkIHBvaW50cyBhbG9uZyBsaW5lIHRvIG1lc2hcbi8vICAgaWYgKCBkaXZpc2lvbnMgPiAxICkge1xuLy8gICAgIGNvbnN0IHNwYWNpbmcgPSBkaXN0YW5jZSggc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksIGVuZFBvaW50LngsIGVuZFBvaW50LnkgKSAvICggZGl2aXNpb25zICk7XG4vLyAgICAgbGV0IG5leHRQb2ludCA9IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkFyYyggYXJjLCBzcGFjaW5nICk7XG4vLyAgICAgZm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zIC0gMTsgaisrICkge1xuLy8gICAgICAgdGhpcy5tZXNoLnB1c2goIG5leHRQb2ludCApO1xuLy8gICAgICAgbmV4dFBvaW50ID0gZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjKCBhcmMsIHNwYWNpbmcgKTtcbi8vICAgICB9XG4vLyAgIH1cblxuLy8gICB0aGlzLm1lc2gucHVzaCggZW5kUG9pbnQgKTtcbi8vIH1cbiIsICJpbXBvcnQgeyBkaXN0YW5jZSwgYXJjTGVuZ3RoLCB0aHJvdWdoT3JpZ2luLCBwb2luY2FyZVRvSHlwZXJib2xvaWQsIGh5cGVyYm9sb2lkQ3Jvc3NQcm9kdWN0LCB0cmFuc2Zvcm1Qb2ludCB9IGZyb20gJy4vbWF0aEZ1bmN0aW9ucy5qcyc7XG5cbi8vICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICpcbi8vICogIEhZUEVSQk9MSUMgQVJDIENMQVNTXG4vLyAqICBSZXByZXNlbnRzIGEgaHlwZXJib2xpYyBhcmMgb24gdGhlIFBvaW5jYXJlIGRpc2ssIHdoaWNoIGlzIGFcbi8vICogIEV1Y2xpZGVhbiBzdHJhaWdodCBsaW5lIGlmIGl0IGdvZXMgdGhyb3VnaCB0aGUgb3JpZ2luXG4vLyAqXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbmNsYXNzIEh5cGVyYm9saWNBcmMge1xuICBjb25zdHJ1Y3Rvciggc3RhcnRQb2ludCwgZW5kUG9pbnQgKSB7XG4gICAgdGhpcy5zdGFydFBvaW50ID0gc3RhcnRQb2ludDtcbiAgICB0aGlzLmVuZFBvaW50ID0gZW5kUG9pbnQ7XG5cbiAgICBpZiAoIHRocm91Z2hPcmlnaW4oIHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55ICkgKSB7XG4gICAgICB0aGlzLnN0cmFpZ2h0TGluZSA9IHRydWU7XG4gICAgICB0aGlzLmFyY0xlbmd0aCA9IGRpc3RhbmNlKCBzdGFydFBvaW50LngsIHN0YXJ0UG9pbnQueSwgZW5kUG9pbnQueCwgZW5kUG9pbnQueSApO1xuICAgICAgdGhpcy5jdXJ2YXR1cmUgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbGN1bGF0ZUFyYygpO1xuICAgICAgdGhpcy5hcmNMZW5ndGggPSBhcmNMZW5ndGgoIHRoaXMucmFkaXVzLCB0aGlzLnN0YXJ0QW5nbGUsIHRoaXMuZW5kQW5nbGUgKTtcbiAgICAgIHRoaXMuY3VydmF0dXJlID0gKCB0aGlzLmFyY0xlbmd0aCApIC8gKCB0aGlzLnJhZGl1cyApO1xuICAgIH1cbiAgfVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgYXJjIHVzaW5nIER1bmhhbSdzIG1ldGhvZFxuICBjYWxjdWxhdGVBcmMoKSB7XG4gICAgLy8gY2FsY3VsYXRlIGNlbnRyZSBvZiB0aGUgY2lyY2xlIHRoZSBhcmMgbGllcyBvbiByZWxhdGl2ZSB0byB1bml0IGRpc2tcbiAgICBjb25zdCBhID0gcG9pbmNhcmVUb0h5cGVyYm9sb2lkKCB0aGlzLnN0YXJ0UG9pbnQueCwgdGhpcy5zdGFydFBvaW50LnkgKTtcbiAgICBjb25zdCBiID0gcG9pbmNhcmVUb0h5cGVyYm9sb2lkKCB0aGlzLmVuZFBvaW50LngsIHRoaXMuZW5kUG9pbnQueSApO1xuICAgIGNvbnN0IGhwID0gaHlwZXJib2xvaWRDcm9zc1Byb2R1Y3QoIGEueCwgYS55LCBhLnosIGIueCwgYi55LCBiLnogKTtcblxuICAgIGNvbnN0IGFyY0NlbnRyZSA9IHsgeDogaHAueCAvIGhwLnosIHk6IGhwLnkgLyBocC56LCB6OiAwIH07XG4gICAgY29uc3QgYXJjUmFkaXVzID0gTWF0aC5zcXJ0KFxuICAgICAgKCB0aGlzLnN0YXJ0UG9pbnQueCAtIGFyY0NlbnRyZS54ICkgKiAoIHRoaXMuc3RhcnRQb2ludC54IC0gYXJjQ2VudHJlLnggKVxuICAgICAgKyAoIHRoaXMuc3RhcnRQb2ludC55IC0gYXJjQ2VudHJlLnkgKSAqICggdGhpcy5zdGFydFBvaW50LnkgLSBhcmNDZW50cmUueSApLFxuICAgICk7XG5cbiAgICAvLyB0cmFuc2xhdGUgcG9pbnRzIHRvIG9yaWdpbiBhbmQgY2FsY3VsYXRlIGFyY3RhblxuICAgIHRoaXMuc3RhcnRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICB0aGlzLnN0YXJ0UG9pbnQueSAtIGFyY0NlbnRyZS55LFxuICAgICAgdGhpcy5zdGFydFBvaW50LnggLSBhcmNDZW50cmUueCxcbiAgICApO1xuICAgIHRoaXMuZW5kQW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgdGhpcy5lbmRQb2ludC55IC0gYXJjQ2VudHJlLnksXG4gICAgICB0aGlzLmVuZFBvaW50LnggLSBhcmNDZW50cmUueCxcbiAgICApO1xuXG4gICAgLy8gYW5nbGVzIGFyZSBpbiAoLXBpLCBwaSksIHRyYW5zZm9ybSB0byAoMCwycGkpXG4gICAgdGhpcy5zdGFydEFuZ2xlID0gKCB0aGlzLnN0YXJ0QW5nbGUgPCAwIClcbiAgICAgICAgICAgICAgICAgICAgICA/IDIgKiBNYXRoLlBJICsgdGhpcy5zdGFydEFuZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnN0YXJ0QW5nbGU7XG4gICAgdGhpcy5lbmRBbmdsZSA9ICggdGhpcy5lbmRBbmdsZSA8IDAgKVxuICAgICAgICAgICAgICAgICAgICAgID8gMiAqIE1hdGguUEkgKyB0aGlzLmVuZEFuZ2xlXG4gICAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmVuZEFuZ2xlO1xuXG4gICAgdGhpcy5jZW50cmUgPSBhcmNDZW50cmU7XG4gICAgdGhpcy5yYWRpdXMgPSBhcmNSYWRpdXM7XG4gIH1cblxufVxuXG4vLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICAoVFJJQU5HVUxBUikgSFlQRVJCT0xJQyBQT0xZR09OIENMQVNTXG4vLyAqXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyBOT1RFOiBzb21ldGltZXMgcG9seWdvbnMgd2lsbCBiZSBiYWNrd2FyZHMgZmFjaW5nLiBTb2x2ZWQgd2l0aCBEb3VibGVTaWRlIG1hdGVyaWFsXG4vLyBidXQgbWF5IGNhdXNlIHByb2JsZW1zXG4vLyBtYXRlcmlhbEluZGV4OiB3aGljaCB0aWxlIHRvIHVzZVxuZXhwb3J0IGNsYXNzIEh5cGVyYm9saWNQb2x5Z29uIHtcbiAgY29uc3RydWN0b3IoIHZlcnRpY2VzLCBtYXRlcmlhbEluZGV4ID0gMCApIHtcblxuICAgIHRoaXMubWF0ZXJpYWxJbmRleCA9IG1hdGVyaWFsSW5kZXg7XG4gICAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzO1xuXG4gICAgdGhpcy5lZGdlcyA9IFtcbiAgICAgIG5ldyBIeXBlcmJvbGljQXJjKCB0aGlzLnZlcnRpY2VzWzBdLCB0aGlzLnZlcnRpY2VzWzFdICksXG4gICAgICBuZXcgSHlwZXJib2xpY0FyYyggdGhpcy52ZXJ0aWNlc1sxXSwgdGhpcy52ZXJ0aWNlc1syXSApLFxuICAgICAgbmV3IEh5cGVyYm9saWNBcmMoIHRoaXMudmVydGljZXNbMl0sIHRoaXMudmVydGljZXNbMF0gKSxcbiAgICBdO1xuICB9XG5cbiAgLy8gQXBwbHkgYSBUcmFuc2Zvcm0gdG8gdGhlIHBvbHlnb25cbiAgdHJhbnNmb3JtKCB0cmFuc2Zvcm0sIG1hdGVyaWFsSW5kZXggPSB0aGlzLm1hdGVyaWFsSW5kZXggKSB7XG4gICAgY29uc3QgbmV3VmVydGljZXMgPSBbXTtcbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSsrICkge1xuICAgICAgbmV3VmVydGljZXMucHVzaCggdHJhbnNmb3JtUG9pbnQoIHRyYW5zZm9ybSwgdGhpcy52ZXJ0aWNlc1tpXS54LCB0aGlzLnZlcnRpY2VzW2ldLnkgKSApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSHlwZXJib2xpY1BvbHlnb24oIG5ld1ZlcnRpY2VzLCBtYXRlcmlhbEluZGV4ICk7XG4gIH1cbn1cbiIsICJpbXBvcnQgeyBpZGVudGl0eU1hdHJpeCwgbXVsdGlwbHlNYXRyaWNlcyB9IGZyb20gJy4vbWF0aEZ1bmN0aW9ucy5qcyc7XG5cbi8vIFRPRE8gRG9jdW1lbnQgdGhlc2UgY2xhc3Nlc1xuLy8gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gKlxuLy8gKiAgVFJBTlNGT1JNIENMQVNTXG4vLyAqICBSZXByZXNlbnRzIGEgdHJhbnNmb3JtYXRpb24gb2YgYSBwb2ludCBpbiBoeXBlcmJvbGljIHNwYWNlXG4vLyAqXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5leHBvcnQgY2xhc3MgSHlwZXJib2xpY1RyYW5zZm9ybSB7XG4gIGNvbnN0cnVjdG9yKCBtYXRyaXgsIG9yaWVudGF0aW9uLCBwb3NpdGlvbiApIHtcbiAgICB0aGlzLm1hdHJpeCA9IG1hdHJpeCB8fCBpZGVudGl0eU1hdHJpeCggMyApO1xuICAgIHRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjtcbiAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb24gfHwgZmFsc2U7IC8vIHBvc2l0aW9uIG5vdCBhbHdheXMgcmVxdWlyZWRcbiAgfVxuXG4gIG11bHRpcGx5KCB0cmFuc2Zvcm0gKSB7XG4gICAgaWYgKCAhKCB0cmFuc2Zvcm0gaW5zdGFuY2VvZiBIeXBlcmJvbGljVHJhbnNmb3JtICkgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCBgRXJyb3I6ICR7dHJhbnNmb3JtfSBpcyBub3QgYSBIeXBlcmJvbGljVHJhbnNmb3JtYCApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBtYXQgPSBtdWx0aXBseU1hdHJpY2VzKCB0cmFuc2Zvcm0ubWF0cml4LCB0aGlzLm1hdHJpeCApO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdHJhbnNmb3JtLnBvc2l0aW9uO1xuICAgIGxldCBvcmllbnRhdGlvbiA9IDE7IC8vIHJvdGF0aW9uXG4gICAgaWYgKCB0cmFuc2Zvcm0ub3JpZW50YXRpb24gKiB0aGlzLm9yaWVudGF0aW9uIDwgMCApIHtcbiAgICAgIG9yaWVudGF0aW9uID0gLTE7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggbWF0LCBvcmllbnRhdGlvbiwgcG9zaXRpb24gKTtcbiAgfVxufVxuXG4vLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICBUUkFOU0ZPUk1BVElPTlMgQ0xBU1Ncbi8vICpcbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGNsYXNzIEh5cGVyYm9saWNUcmFuc2Zvcm1hdGlvbnMge1xuICBjb25zdHJ1Y3RvciggcCwgcSApIHtcbiAgICB0aGlzLnAgPSBwO1xuICAgIHRoaXMucSA9IHE7XG5cbiAgICB0aGlzLmluaXRIeXBvdGVudXNlUmVmbGVjdGlvbigpO1xuICAgIHRoaXMuaW5pdEVkZ2VSZWZsZWN0aW9uKCk7XG4gICAgdGhpcy5pbml0RWRnZUJpc2VjdG9yUmVmbGVjdGlvbigpO1xuXG4gICAgdGhpcy5yb3QyID0gbXVsdGlwbHlNYXRyaWNlcyggdGhpcy5lZGdlUmVmbGVjdGlvbi5tYXRyaXgsIHRoaXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbi5tYXRyaXggKTtcblxuICAgIHRoaXMuaW5pdFBnb25Sb3RhdGlvbnMoKTtcbiAgICB0aGlzLmluaXRFZGdlcygpO1xuICAgIHRoaXMuaW5pdEVkZ2VUcmFuc2Zvcm1zKCk7XG5cbiAgICB0aGlzLmlkZW50aXR5ID0gbmV3IEh5cGVyYm9saWNUcmFuc2Zvcm0oIGlkZW50aXR5TWF0cml4KCAzICkgKTtcbiAgfVxuXG4gIC8vIHJlZmxlY3QgYWNyb3NzIHRoZSBoeXBvdGVudXNlIG9mIHRoZSBmdW5kYW1lbnRhbCByZWdpb24gb2YgYSB0ZXNzZWxhdGlvblxuICBpbml0SHlwb3RlbnVzZVJlZmxlY3Rpb24oKSB7XG4gICAgdGhpcy5oeXBSZWZsZWN0aW9uID0gbmV3IEh5cGVyYm9saWNUcmFuc2Zvcm0oIGlkZW50aXR5TWF0cml4KCAzICksIC0xICk7XG4gICAgdGhpcy5oeXBSZWZsZWN0aW9uLm1hdHJpeFswXVswXSA9IE1hdGguY29zKCAyICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIHRoaXMuaHlwUmVmbGVjdGlvbi5tYXRyaXhbMF1bMV0gPSBNYXRoLnNpbiggMiAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICB0aGlzLmh5cFJlZmxlY3Rpb24ubWF0cml4WzFdWzBdID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgdGhpcy5oeXBSZWZsZWN0aW9uLm1hdHJpeFsxXVsxXSA9IC1NYXRoLmNvcyggMiAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgfVxuXG4gIC8vIHJlZmxlY3QgYWNyb3NzIHRoZSBmaXJzdCBlZGdlIG9mIHRoZSBwb2x5Z29uICh3aGljaCBjcm9zc2VzIHRoZSByYWRpdXNcbiAgLy8gKDAsMCkgLT4gKDAsMSkgb24gdW5pdCBkaXNrKS4gQ29tYmluZWQgd2l0aCByb3RhdGlvbnMgd2UgY2FuIHJlZmxlY3RcbiAgLy8gYWNyb3NzIGFueSBlZGdlXG4gIGluaXRFZGdlUmVmbGVjdGlvbigpIHtcbiAgICBjb25zdCBjb3NwID0gTWF0aC5jb3MoIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICBjb25zdCBzaW5wID0gTWF0aC5zaW4oIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICBjb25zdCBjb3MycCA9IE1hdGguY29zKCAyICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIGNvbnN0IHNpbjJwID0gTWF0aC5zaW4oIDIgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG5cbiAgICBjb25zdCBjb3NocSA9IE1hdGguY29zKCBNYXRoLlBJIC8gdGhpcy5xICkgLyBzaW5wO1xuICAgIGNvbnN0IHNpbmhxID0gTWF0aC5zcXJ0KCBjb3NocSAqIGNvc2hxIC0gMSApO1xuXG4gICAgY29uc3QgY29zaDJxID0gMiAqIGNvc2hxICogY29zaHEgLSAxO1xuICAgIGNvbnN0IHNpbmgycSA9IDIgKiBzaW5ocSAqIGNvc2hxO1xuICAgIGNvbnN0IG51bSA9IDI7XG4gICAgY29uc3QgZGVuID0gNjtcbiAgICB0aGlzLmVkZ2VSZWZsZWN0aW9uID0gbmV3IEh5cGVyYm9saWNUcmFuc2Zvcm0oIGlkZW50aXR5TWF0cml4KCAzICksIC0xICk7XG4gICAgdGhpcy5lZGdlUmVmbGVjdGlvbi5tYXRyaXhbMF1bMF0gPSAtY29zaDJxO1xuICAgIHRoaXMuZWRnZVJlZmxlY3Rpb24ubWF0cml4WzBdWzJdID0gc2luaDJxO1xuICAgIHRoaXMuZWRnZVJlZmxlY3Rpb24ubWF0cml4WzJdWzBdID0gLXNpbmgycTtcbiAgICB0aGlzLmVkZ2VSZWZsZWN0aW9uLm1hdHJpeFsyXVsyXSA9IGNvc2gycTtcbiAgfVxuXG4gIGluaXRFZGdlQmlzZWN0b3JSZWZsZWN0aW9uKCkge1xuICAgIHRoaXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbiA9IG5ldyBIeXBlcmJvbGljVHJhbnNmb3JtKCBpZGVudGl0eU1hdHJpeCggMyApLCAtMSApO1xuICAgIHRoaXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbi5tYXRyaXhbMV1bMV0gPSAtMTtcbiAgfVxuXG4gIC8vIHNldCB1cCBjbG9ja3dpc2UgYW5kIGFudGljbG9ja3dpc2Ugcm90YXRpb25zIHdoaWNoIHdpbGwgcm90YXRlIGJ5XG4gIC8vIFBJLyhudW1iZXIgb2Ygc2lkZXMgb2YgY2VudHJhbCBwb2x5Z29uKVxuICBpbml0UGdvblJvdGF0aW9ucygpIHtcbiAgICB0aGlzLnJvdGF0ZVBvbHlnb25DVyA9IFtdO1xuICAgIHRoaXMucm90YXRlUG9seWdvbkNDVyA9IFtdO1xuICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMucDsgaSsrICkge1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggaWRlbnRpdHlNYXRyaXgoIDMgKSwgMSApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0ubWF0cml4WzBdWzBdID0gTWF0aC5jb3MoIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0ubWF0cml4WzBdWzFdID0gLU1hdGguc2luKCAyICogaSAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICAgIHRoaXMucm90YXRlUG9seWdvbkNXW2ldLm1hdHJpeFsxXVswXSA9IE1hdGguc2luKCAyICogaSAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICAgIHRoaXMucm90YXRlUG9seWdvbkNXW2ldLm1hdHJpeFsxXVsxXSA9IE1hdGguY29zKCAyICogaSAqIE1hdGguUEkgLyB0aGlzLnAgKTtcblxuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXW2ldID0gbmV3IEh5cGVyYm9saWNUcmFuc2Zvcm0oIGlkZW50aXR5TWF0cml4KCAzICksIDEgKTtcbiAgICAgIHRoaXMucm90YXRlUG9seWdvbkNDV1tpXS5tYXRyaXhbMF1bMF0gPSBNYXRoLmNvcyggMiAqIGkgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbaV0ubWF0cml4WzBdWzFdID0gTWF0aC5zaW4oIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXW2ldLm1hdHJpeFsxXVswXSA9IC1NYXRoLnNpbiggMiAqIGkgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbaV0ubWF0cml4WzFdWzFdID0gTWF0aC5jb3MoIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIH1cbiAgfVxuXG4gIC8vIG9yaWVudGF0aW9uOiBlaXRoZXIgcmVmbGVjdGlvbiA9IC0xIE9SIHJvdGF0aW9uID0gMVxuICAvLyBOT1RFOiBoYXJkIGNvZGVkIGZvciBDaXJjbGUgTGltaXQgSVxuICBpbml0RWRnZXMoKSB7XG4gICAgdGhpcy5lZGdlcyA9IFtdO1xuICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMucDsgaSsrICkge1xuICAgICAgdGhpcy5lZGdlcy5wdXNoKCB7XG4gICAgICAgIG9yaWVudGF0aW9uOiAxLFxuICAgICAgICBhZGphY2VudEVkZ2U6IGksXG4gICAgICB9ICk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEVkZ2VUcmFuc2Zvcm1zKCkge1xuICAgIHRoaXMuZWRnZVRyYW5zZm9ybXMgPSBbXTtcblxuICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMucDsgaSsrICkge1xuICAgICAgY29uc3QgYWRqID0gdGhpcy5lZGdlc1tpXS5hZGphY2VudEVkZ2U7XG4gICAgICAvLyBDYXNlIDE6IHJlZmxlY3Rpb25cbiAgICAgIGlmICggdGhpcy5lZGdlc1tpXS5vcmllbnRhdGlvbiA9PT0gLTEgKSB7XG4gICAgICAgIGxldCBtYXQgPSBtdWx0aXBseU1hdHJpY2VzKCB0aGlzLnJvdGF0ZVBvbHlnb25DV1tpXS5tYXRyaXgsIHRoaXMuZWRnZVJlZmxlY3Rpb24ubWF0cml4ICk7XG4gICAgICAgIG1hdCA9IG11bHRpcGx5TWF0cmljZXMoIG1hdCwgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXW2Fkal0ubWF0cml4ICk7XG4gICAgICAgIHRoaXMuZWRnZVRyYW5zZm9ybXNbaV0gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggbWF0ICk7XG4gICAgICB9XG4gICAgICAvLyBDYXNlIDI6IHJvdGF0aW9uXG4gICAgICBlbHNlIGlmICggdGhpcy5lZGdlc1tpXS5vcmllbnRhdGlvbiA9PT0gMSApIHtcbiAgICAgICAgbGV0IG1hdCA9IG11bHRpcGx5TWF0cmljZXMoIHRoaXMucm90YXRlUG9seWdvbkNXW2ldLm1hdHJpeCwgdGhpcy5yb3QyICk7XG4gICAgICAgIG1hdCA9IG11bHRpcGx5TWF0cmljZXMoIG1hdCwgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXW2Fkal0ubWF0cml4ICk7XG4gICAgICAgIHRoaXMuZWRnZVRyYW5zZm9ybXNbaV0gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggbWF0ICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKCAnaW5pdEVkZ2VUcmFuc2Zvcm1zKCk6IGludmFsaWQgb3JpZW50YXRpb24gdmFsdWUnICk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoIHRoaXMuZWRnZXNbaV0gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZWRnZVRyYW5zZm9ybXNbaV0ub3JpZW50YXRpb24gPSB0aGlzLmVkZ2VzW2Fkal0ub3JpZW50YXRpb247XG4gICAgICB0aGlzLmVkZ2VUcmFuc2Zvcm1zW2ldLnBvc2l0aW9uID0gYWRqO1xuICAgIH1cbiAgfVxuXG4gIHNoaWZ0VHJhbnMoIHRyYW5zZm9ybSwgc2hpZnQgKSB7XG4gICAgY29uc3QgbmV3RWRnZSA9ICggdHJhbnNmb3JtLnBvc2l0aW9uICsgdHJhbnNmb3JtLm9yaWVudGF0aW9uICogc2hpZnQgKyAyICogdGhpcy5wICkgJSB0aGlzLnA7XG4gICAgaWYgKCBuZXdFZGdlIDwgMCB8fCBuZXdFZGdlID4gKCB0aGlzLnAgLSAxICkgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnRXJyb3I6IHNoaWZ0VHJhbiBuZXdFZGdlIG91dCBvZiByYW5nZS4nICk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2Zvcm0ubXVsdGlwbHkoIHRoaXMuZWRnZVRyYW5zZm9ybXNbbmV3RWRnZV0gKTtcbiAgfVxufVxuXG4vLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICBQQVJBTUVURVJTIENMQVNTXG4vLyAqXG4vLyAqICBBZGFwdGVkIGZyb20gdGhlIHRhYmxlIG9uIHBnIDE5IG9mIEFqaXQgRGFqYXIncyB0aGVzaXMgKFNlZSBEb2N1bWVudHMgZm9sZGVyKVxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgY2xhc3MgSHlwZXJib2xpY1BhcmFtZXRlcnMge1xuICBjb25zdHJ1Y3RvciggcCwgcSApIHtcbiAgICB0aGlzLnAgPSBwO1xuICAgIHRoaXMucSA9IHE7XG5cbiAgICB0aGlzLm1pbkV4cG9zdXJlID0gcSAtIDI7XG4gICAgdGhpcy5tYXhFeHBvc3VyZSA9IHEgLSAxO1xuICB9XG5cbiAgZXhwb3N1cmUoIGxheWVyLCB2ZXJ0ZXhOdW0sIHBnb25OdW0gKSB7XG4gICAgaWYgKCBsYXllciA9PT0gMCApIHtcbiAgICAgIGlmICggcGdvbk51bSA9PT0gMCApIHsgLy8gbGF5ZXIgMCwgcGdvbiAwXG4gICAgICAgIGlmICggdGhpcy5xID09PSAzICkgcmV0dXJuIHRoaXMubWF4RXhwb3N1cmU7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbkV4cG9zdXJlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWF4RXhwb3N1cmU7IC8vIGxheWVyIDAsIHBnb24gIT0gMFxuICAgIH1cbiAgICBpZiAoIHZlcnRleE51bSA9PT0gMCAmJiBwZ29uTnVtID09PSAwICkge1xuICAgICAgcmV0dXJuIHRoaXMubWluRXhwb3N1cmU7XG4gICAgfSBlbHNlIGlmICggdmVydGV4TnVtID09PSAwICkge1xuICAgICAgaWYgKCB0aGlzLnEgIT09IDMgKSByZXR1cm4gdGhpcy5tYXhFeHBvc3VyZTtcbiAgICAgIHJldHVybiB0aGlzLm1pbkV4cG9zdXJlO1xuICAgIH0gZWxzZSBpZiAoIHBnb25OdW0gPT09IDAgKSB7XG4gICAgICBpZiAoIHRoaXMucSAhPT0gMyApIHJldHVybiB0aGlzLm1pbkV4cG9zdXJlO1xuICAgICAgcmV0dXJuIHRoaXMubWF4RXhwb3N1cmU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1heEV4cG9zdXJlO1xuICB9XG5cbiAgcFNraXAoIGV4cG9zdXJlICkge1xuICAgIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWluRXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucSAhPT0gMyApIHJldHVybiAxO1xuICAgICAgcmV0dXJuIDM7XG4gICAgfSBlbHNlIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWF4RXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucCA9PT0gMyApIHJldHVybiAxO1xuICAgICAgZWxzZSBpZiAoIHRoaXMucSA9PT0gMyApIHJldHVybiAyO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoICdwU2tpcDogd3JvbmcgZXhwb3N1cmUgdmFsdWUhJyApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHFTa2lwKCBleHBvc3VyZSwgdmVydGV4TnVtICkge1xuICAgIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWluRXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHZlcnRleE51bSA9PT0gMCApIHtcbiAgICAgICAgaWYgKCB0aGlzLnEgIT09IDMgKSByZXR1cm4gLTE7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKCB0aGlzLnAgPT09IDMgKSByZXR1cm4gLTE7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5tYXhFeHBvc3VyZSApIHtcbiAgICAgIGlmICggdmVydGV4TnVtID09PSAwICkge1xuICAgICAgICBpZiAoIHRoaXMucCA9PT0gMyB8fCB0aGlzLnEgPT09IDMgKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoICdxU2tpcDogd3JvbmcgZXhwb3N1cmUgdmFsdWUhJyApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZlcnRpY2VzVG9EbyggZXhwb3N1cmUgKSB7XG4gICAgaWYgKCB0aGlzLnAgPT09IDMgKSByZXR1cm4gMTtcbiAgICBlbHNlIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWluRXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucSA9PT0gMyApIHJldHVybiB0aGlzLnAgLSA1O1xuICAgICAgcmV0dXJuIHRoaXMucCAtIDM7XG4gICAgfSBlbHNlIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWF4RXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucSA9PT0gMyApIHJldHVybiB0aGlzLnAgLSA0O1xuICAgICAgcmV0dXJuIHRoaXMucCAtIDI7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoICd2ZXJ0aWNlc1RvRG86IHdyb25nIGV4cG9zdXJlIHZhbHVlIScgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwZ29uc1RvRG8oIGV4cG9zdXJlLCB2ZXJ0ZXhOdW0gKSB7XG4gICAgaWYgKCB0aGlzLnEgPT09IDMgKSByZXR1cm4gMTtcbiAgICBlbHNlIGlmICggdmVydGV4TnVtID09PSAwICkgcmV0dXJuIHRoaXMucSAtIDM7XG4gICAgZWxzZSBpZiAoIGV4cG9zdXJlID09PSB0aGlzLm1pbkV4cG9zdXJlICkge1xuICAgICAgaWYgKCB0aGlzLnAgPT09IDMgKSByZXR1cm4gdGhpcy5xIC0gNDtcbiAgICAgIHJldHVybiB0aGlzLnEgLSAyO1xuICAgIH0gZWxzZSBpZiAoIGV4cG9zdXJlID09PSB0aGlzLm1heEV4cG9zdXJlICkge1xuICAgICAgaWYgKCB0aGlzLnAgPT09IDMgKSByZXR1cm4gdGhpcy5xIC0gMztcbiAgICAgIHJldHVybiB0aGlzLnEgLSAyO1xuICAgIH1cbiAgICBjb25zb2xlLmVycm9yKCAncGdvbnNUb0RvOiB3cm9uZyBleHBvc3VyZSB2YWx1ZSEnICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgSHlwZXJib2xpY1BvbHlnb24gYXMgUG9seWdvbixcbn1cbmZyb20gJy4vaHlwZXJib2xpY0VudGl0aWVzLmpzJztcblxuaW1wb3J0IHtcbiAgLy8gSHlwZXJib2xpY1RyYW5zZm9ybSBhcyBUcmFuc2Zvcm0sXG4gIEh5cGVyYm9saWNUcmFuc2Zvcm1hdGlvbnMgYXMgVHJhbnNmb3JtYXRpb25zLFxuICBIeXBlcmJvbGljUGFyYW1ldGVycyBhcyBQYXJhbWV0ZXJzLFxufVxuZnJvbSAnLi9oeXBlcmJvbGljVXRpbGl0aWVzLmpzJztcblxuXG4vLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqICAgIFJFR1VMQVIgSFlQRVJCT0xJQyBURVNTRUxBVElPTiBDTEFTU1xuLy8gKiAgICBDcmVhdGVzIGEgcmVndWxhciBUZXNzZWxhdGlvbiBvZiB0aGUgUG9pbmNhcmUgRGlzayB1c2luZyB0aGUgdGVjaG5pcXVlc1xuLy8gKiAgICBjcmVhdGVkIGJ5IENveGV0ZXIgYW5kIER1bmhhbVxuLy8gKlxuLy8gKiAgICBzcGVjID0ge1xuLy8gKiAgICAgIHdpcmVmcmFtZTogdHJ1ZS9mYWxzZVxuLy8gKiAgICAgIHA6IG51bWJlciBvZiBzaWRlcyBvZiBwLWdvblxuLy8gKiAgICAgIHE6IG51bWJlciBvZiBwLWdvbnMgbWVldGluZyBhdCBlYWNoIHZlcnRleFxuLy8gKiAgICAgIHRleHR1cmVzOiBhcnJheVxuLy8gKiAgICAgIGVkZ2VBZGphY2VuY3k6IFsgKG11bHRpRGltIGFycmF5KVxuLy8gKiAgICAgICAgICAgICAgICAgICAgICBbXG4vLyAqICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV8wIG9yaWVudGF0aW9uICgtMSA9IHJlZmxlY3Rpb24sIDEgPSByb3RhdGlvbildLFxuLy8gKiAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfMCBhZGphY2VuY3kgKHJhbmdlIHAgLSAxKV0sXG4vLyAqICAgICAgICAgICAgICAgICAgICAgIF0sXG4vLyAqICAgICAgICAgICAgICAgICAgICAuLi5cbi8vICogICAgICAgICAgICAgICAgICAgICAgW2VkZ2VfcCBvcmllbnRhdGlvbiwgZWRnZV9wIGFkamFjZW5jeV1cbi8vICogICAgICAgICAgICAgICAgICAgIF0sXG4vLyAqICAgICAgbWluUG9seWdvblNpemU6IHN0b3AgYXQgcG9seWdvbnMgYmVsb3cgdGhpcyBzaXplLFxuLy8gKiAgICB9XG4vLyAqXG4vLyAqXG4vLyAqXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZ3VsYXJIeXBlcmJvbGljVGVzc2VsYXRpb24ge1xuICBjb25zdHJ1Y3Rvciggc3BlYyApIHtcbiAgICB0aGlzLndpcmVmcmFtZSA9IHNwZWMud2lyZWZyYW1lIHx8IGZhbHNlO1xuICAgIHRoaXMudGV4dHVyZXMgPSBzcGVjLnRleHR1cmVzO1xuICAgIHRoaXMucCA9IHNwZWMucCB8fCA0O1xuICAgIHRoaXMucSA9IHNwZWMucSB8fCA2O1xuXG4gICAgLy8gU3RvcCBkcmF3aW5nIHdoZW4gcG9seWdvbnMgcmVhY2ggdGhpcyBzaXplIChvbiB1bml0IGRpc2spXG4gICAgLy8gYSB2YWx1ZSBvZiBhYm91dCAwLjAyIHNlZW1zIHRvIGJlIHRoZSBtaW5pbXVtIHRoYXQgd2ViZ2wgY2FuIGhhbmRsZSBlYXNpbHkuXG4gICAgdGhpcy5taW5Qb2x5Z29uU2l6ZSA9IHNwZWMubWluUG9seWdvblNpemUgfHwgMC4xO1xuXG4gICAgY29uc29sZS5sb2coICd7JywgdGhpcy5wLCAnLCAnLCB0aGlzLnEsICd9IHRpbGluZy4nICk7XG5cbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBQYXJhbWV0ZXJzKCB0aGlzLnAsIHRoaXMucSApO1xuICAgIHRoaXMudHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1hdGlvbnMoIHRoaXMucCwgdGhpcy5xICk7XG5cbiAgICBpZiAoIHRoaXMuY2hlY2tQYXJhbXMoKSApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBmdW5kYW1lbnRhbFJlZ2lvbiBjYWxjdWxhdGlvbiB1c2luZyBEdW5oYW0ncyBtZXRob2RcbiAgLy8gdGhpcyBpcyBhIHJpZ2h0IGFuZ2xlIHRyaWFuZ2xlIGFib3ZlIHRoZSByYWRpdXMgb24gdGhlIGxpbmUgKDAsMCkgLT4gKDAsMSlcbiAgLy8gb2YgdGhlIGNlbnRyYWwgcG9seWdvblxuICBmdW5kYW1lbnRhbFJlZ2lvbigpIHtcbiAgICBjb25zdCBjb3NoMiA9IE1hdGguY290KCBNYXRoLlBJIC8gdGhpcy5wICkgKiBNYXRoLmNvdCggTWF0aC5QSSAvIHRoaXMucSApO1xuXG4gICAgY29uc3Qgc2luaDIgPSBNYXRoLnNxcnQoIGNvc2gyICogY29zaDIgLSAxICk7XG5cbiAgICBjb25zdCBjb3NocSA9IE1hdGguY29zKCBNYXRoLlBJIC8gdGhpcy5xICkgLyBNYXRoLnNpbiggTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIGNvbnN0IHNpbmhxID0gTWF0aC5zcXJ0KCBjb3NocSAqIGNvc2hxIC0gMSApO1xuXG4gICAgY29uc3QgcmFkMiA9IHNpbmgyIC8gKCBjb3NoMiArIDEgKTsgLy8gcmFkaXVzIG9mIGNpcmNsZSBjb250YWluaW5nIGxheWVyIDBcbiAgICBjb25zdCB4MnB0ID0gc2luaHEgLyAoIGNvc2hxICsgMSApOyAvLyB4IGNvb3JkaW5hdGUgb2YgdGhpcmQgdmVydGV4IG9mIHRyaWFuZ2xlXG5cbiAgICAvLyBwb2ludCBhdCBlbmQgb2YgaHlwb3RlbnVzZSBvZiBmdW5kYW1lbnRhbCByZWdpb25cbiAgICBjb25zdCB4cXB0ID0gTWF0aC5jb3MoIE1hdGguUEkgLyB0aGlzLnAgKSAqIHJhZDI7XG4gICAgY29uc3QgeXFwdCA9IE1hdGguc2luKCBNYXRoLlBJIC8gdGhpcy5wICkgKiByYWQyO1xuXG4gICAgLy8gY3JlYXRlIHBvaW50cyBhbmQgbW92ZSB0aGVtIGZyb20gdGhlIHVuaXQgZGlzayB0byBvdXIgcmFkaXVzXG4gICAgY29uc3QgcDEgPSB7IHg6IHhxcHQsIHk6IHlxcHQsIHo6IDAgfTtcbiAgICBjb25zdCBwMiA9IHsgeDogeDJwdCwgeTogMCwgejogMCB9O1xuICAgIC8vIGNvbnN0IHAzID0gdHJhbnNmb3JtUG9pbnQoIHRoaXMudHJhbnNmb3Jtcy5lZGdlQmlzZWN0b3JSZWZsZWN0aW9uLCBwMS54LCBwMS55ICk7XG4gICAgY29uc3QgdmVydGljZXMgPSBbeyB4OiAwLCB5OiAwLCB6OiAwIH0sIHAxLCBwMl07XG5cbiAgICByZXR1cm4gbmV3IFBvbHlnb24oIHZlcnRpY2VzLCAwICk7XG4gIH1cblxuICAvLyB0aGlzIGlzIGEga2l0ZSBzaGFwZWQgcmVnaW9uIGNvbnNpc3Rpbmcgb2YgdHdvIGNvcGllcyBvZiB0aGUgZnVuZGFtZW50YWxcbiAgLy8gcmVnaW9uIHdpdGggZGlmZmVyZW50IHRleHR1cmVzIGFwcGxpZWQgdG8gY3JlYXRlIHRoZSBiYXNpYyBwYXR0ZXJuXG4gIC8vIE5PVEU6IGZvciB0aGUgdGltZSBiZWluZyBqdXN0IHVzaW5nIGVkZ2UgYmlzZWN0b3IgcmVmbGVjdGlvbiB0byByZWNyZWF0ZSBDaXJjbGVcbiAgLy8gTGltaXQgSSwgb3RoZXIgcGF0dGVybnMgd2lsbCByZXF1aXJlIGRpZmZlcmVudCBvcHRpb25zXG4gIGZ1bmRhbWVudGFsUGF0dGVybigpIHtcbiAgICBjb25zdCB1cHBlciA9IHRoaXMuZnVuZGFtZW50YWxSZWdpb24oKTtcbiAgICBjb25zdCBsb3dlciA9IHVwcGVyLnRyYW5zZm9ybSggdGhpcy50cmFuc2Zvcm1zLmVkZ2VCaXNlY3RvclJlZmxlY3Rpb24sIDEgKTtcbiAgICByZXR1cm4gW3VwcGVyLCBsb3dlcl07XG4gIH1cblxuICAvLyBUaGUgcGF0dGVybiBpbiB0aGUgY2VudHJhbCBwb2x5Z29uIGlzIG1hZGUgdXAgb2YgdHJhbnNmb3JtZWQgY29waWVzXG4gIC8vIG9mIHRoZSBmdW5kYW1lbnRhbCBwYXR0ZXJuXG4gIGJ1aWxkQ2VudHJhbFBhdHRlcm4oKSB7XG4gICAgLy8gYWRkIHRoZSBmaXJzdCB0d28gcG9seWdvbnMgdG8gdGhlIGNlbnRyYWwgcGF0dGVyblxuICAgIGNvbnN0IGNlbnRyYWxQYXR0ZXJuID0gdGhpcy5mdW5kYW1lbnRhbFBhdHRlcm4oKTtcblxuICAgIC8vIGNyZWF0ZWQgcmVmbGVjdGVkIHZlcnNpb25zIG9mIHRoZSB0d28gcGF0dGVybiBwaWVjZXNcbiAgICBjb25zdCB1cHBlclJlZmxlY3RlZCA9IGNlbnRyYWxQYXR0ZXJuWzBdLnRyYW5zZm9ybSggdGhpcy50cmFuc2Zvcm1zLmVkZ2VCaXNlY3RvclJlZmxlY3Rpb24gKTtcbiAgICBjb25zdCBsb3dlclJlZmxlY3RlZCA9IGNlbnRyYWxQYXR0ZXJuWzFdLnRyYW5zZm9ybSggdGhpcy50cmFuc2Zvcm1zLmVkZ2VCaXNlY3RvclJlZmxlY3Rpb24gKTtcblxuICAgIC8vIGFkZCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBwaWVjZXMgdG8gdGhlIGNlbnRyYWwgcGF0dGVyblxuICAgIGZvciAoIGxldCBpID0gMTsgaSA8IHRoaXMucDsgaSsrICkge1xuICAgICAgaWYgKCBpICUgMiA9PT0gMSApIHtcbiAgICAgICAgY2VudHJhbFBhdHRlcm4ucHVzaCggdXBwZXJSZWZsZWN0ZWQudHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMucm90YXRlUG9seWdvbkNXW2ldICkgKTtcbiAgICAgICAgY2VudHJhbFBhdHRlcm4ucHVzaCggbG93ZXJSZWZsZWN0ZWQudHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMucm90YXRlUG9seWdvbkNXW2ldICkgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNlbnRyYWxQYXR0ZXJuLnB1c2goIGNlbnRyYWxQYXR0ZXJuWzBdLnRyYW5zZm9ybSggdGhpcy50cmFuc2Zvcm1zLnJvdGF0ZVBvbHlnb25DV1tpXSApICk7XG4gICAgICAgIGNlbnRyYWxQYXR0ZXJuLnB1c2goIGNlbnRyYWxQYXR0ZXJuWzFdLnRyYW5zZm9ybSggdGhpcy50cmFuc2Zvcm1zLnJvdGF0ZVBvbHlnb25DV1tpXSApICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbnRyYWxQYXR0ZXJuO1xuICB9XG5cbiAgLy8gcmVjdXJzaXZlbHkgYnVpbGQgdGlsaW5nIGZyb20gdHJhbnNmb3JtZWQgY29waWVzIG9mIGNlbnRyYWwgcGF0dGVyblxuICBnZW5lcmF0ZVRpbGluZyggZGVzaWduTW9kZSA9IGZhbHNlICkge1xuICAgIGNvbnN0IHRpbGluZyA9IHRoaXMuYnVpbGRDZW50cmFsUGF0dGVybigpO1xuXG4gICAgY29uc3QgcFJhbmdlID0gZGVzaWduTW9kZSA/IDEgOiB0aGlzLnA7IC8vIGlmIHdlIGFyZSBpbiBkZXNpZ24gbW9kZSBvbmx5IGRvIG9uZSBsb29wXG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgcFJhbmdlOyBpKysgKSB7XG4gICAgICBsZXQgcVRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtcy5lZGdlVHJhbnNmb3Jtc1tpXTtcblxuICAgICAgY29uc3QgcVJhbmdlID0gZGVzaWduTW9kZSA/IDEgOiB0aGlzLnEgLSAyOyAvLyBpZiB3ZSBhcmUgaW4gZGVzaWduIG1vZGUgb25seSBkbyBvbmUgbG9vcFxuICAgICAgZm9yICggbGV0IGogPSAwOyBqIDwgcVJhbmdlOyBqKysgKSB7XG4gICAgICAgIGlmICggKCB0aGlzLnAgPT09IDMgKSAmJiAoIHRoaXMucSAtIDMgPT09IGogKSApIHtcbiAgICAgICAgICB0aGlzLmFkZFRyYW5zZm9ybWVkUGF0dGVybiggdGlsaW5nLCBxVHJhbnNmb3JtICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5sYXllclJlY3Vyc2lvbiggdGhpcy5wYXJhbXMuZXhwb3N1cmUoIDAsIGksIGogKSwgMSwgcVRyYW5zZm9ybSwgdGlsaW5nLCBkZXNpZ25Nb2RlICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCAoIC0xICUgdGhpcy5wICkgIT09IDAgKSB7XG4gICAgICAgICAgcVRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtcy5zaGlmdFRyYW5zKCBxVHJhbnNmb3JtLCAtMSApOyAvLyAtMSBtZWFucyBjbG9ja3dpc2VcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aWxpbmc7XG4gIH1cblxuICAvLyBjYWxjdWxhdGUgdGhlIHBvbHlnb25zIGluIGVhY2ggbGF5ZXIgYW5kIGFkZCB0aGVtIHRvIHRoaXMudGlsaW5nW11cbiAgLy8gVE9ETzogYmV0dGVyIGRlc2lnbk1vZGVcbiAgbGF5ZXJSZWN1cnNpb24oIGV4cG9zdXJlLCBsYXllciwgdHJhbnNmb3JtLCB0aWxpbmcsIGRlc2lnbk1vZGUgPSBmYWxzZSApIHtcbiAgICB0aGlzLmFkZFRyYW5zZm9ybWVkUGF0dGVybiggdGlsaW5nLCB0cmFuc2Zvcm0gKTtcbiAgICAvLyBzdG9wIGlmIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIHJlYWNoZWQgdGhlIG1pbmltdW0gc2l6ZVxuICAgIC8vIFRPRE8gYmV0dGVyIG1ldGhvZCBhcyB0aGlzIGxlYXZlcyBob2xlcyBhdCB0aGUgZWRnZXNcbiAgICBpZiAoIHRpbGluZ1t0aWxpbmcubGVuZ3RoIC0gMV0uZWRnZXNbMF0uYXJjTGVuZ3RoIDwgdGhpcy5taW5Qb2x5Z29uU2l6ZSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcFNraXAgPSB0aGlzLnBhcmFtcy5wU2tpcCggZXhwb3N1cmUgKTtcbiAgICBjb25zdCB2ZXJ0aWNlc1RvRG8gPSB0aGlzLnBhcmFtcy52ZXJ0aWNlc1RvRG8oIGV4cG9zdXJlICk7XG5cbiAgICBjb25zdCB2ZXJ0aWNlc1JhbmdlID0gZGVzaWduTW9kZSA/IDEgOiB2ZXJ0aWNlc1RvRG87IC8vIGlmIHdlIGFyZSBpbiBkZXNpZ24gbW9kZSBvbmx5IGRvIG9uZSBsb29wXG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgdmVydGljZXNSYW5nZTsgaSsrICkge1xuICAgICAgY29uc3QgcFRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtcy5zaGlmdFRyYW5zKCB0cmFuc2Zvcm0sIHBTa2lwICk7XG4gICAgICBsZXQgcVRyYW5zZm9ybTtcblxuICAgICAgY29uc3QgcVNraXAgPSB0aGlzLnBhcmFtcy5xU2tpcCggZXhwb3N1cmUsIGkgKTtcbiAgICAgIGlmICggcVNraXAgJSB0aGlzLnAgIT09IDAgKSB7XG4gICAgICAgIHFUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybXMuc2hpZnRUcmFucyggcFRyYW5zZm9ybSwgcVNraXAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHFUcmFuc2Zvcm0gPSBwVHJhbnNmb3JtO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwZ29uc1RvRG8gPSB0aGlzLnBhcmFtcy5wZ29uc1RvRG8oIGV4cG9zdXJlLCBpICk7XG5cbiAgICAgIGNvbnN0IHBnb25zUmFuZ2UgPSBkZXNpZ25Nb2RlID8gMSA6IHBnb25zVG9EbzsgLy8gaWYgd2UgYXJlIGluIGRlc2lnbiBtb2RlIG9ubHkgZG8gb25lIGxvb3BcbiAgICAgIGZvciAoIGxldCBqID0gMDsgaiA8IHBnb25zUmFuZ2U7IGorKyApIHtcbiAgICAgICAgaWYgKCAoIHRoaXMucCA9PT0gMyApICYmICggaiA9PT0gcGdvbnNUb0RvIC0gMSApICkge1xuICAgICAgICAgIHRoaXMuYWRkVHJhbnNmb3JtZWRQYXR0ZXJuKCB0aWxpbmcsIHFUcmFuc2Zvcm0gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxheWVyUmVjdXJzaW9uKCB0aGlzLnBhcmFtcy5leHBvc3VyZSggbGF5ZXIsIGksIGogKSwgbGF5ZXIgKyAxLCBxVHJhbnNmb3JtLCB0aWxpbmcgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoICggLTEgJSB0aGlzLnAgKSAhPT0gMCApIHtcbiAgICAgICAgICBxVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1zLnNoaWZ0VHJhbnMoIHFUcmFuc2Zvcm0sIC0xICk7IC8vIC0xIG1lYW5zIGNsb2Nrd2lzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBwU2tpcCA9ICggcFNraXAgKyAxICkgJSB0aGlzLnA7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGZpcnN0IHAqMiBlbGVtZW50cyBvZiB0aGUgdGlsaW5nIGhvbGQgdGhlIGNlbnRyYWwgcGF0dGVyblxuICAvLyBUaGUgdHJhbnNmb3JtIHdpbGwgYmUgYXBwbGllZCB0byB0aGVzZVxuICBhZGRUcmFuc2Zvcm1lZFBhdHRlcm4oIHRpbGluZywgdHJhbnNmb3JtICkge1xuICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMucCAqIDI7IGkrKyApIHtcbiAgICAgIHRpbGluZy5wdXNoKCB0aWxpbmdbaV0udHJhbnNmb3JtKCB0cmFuc2Zvcm0gKSApO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRoZSB0ZXNzZWxhdGlvbiByZXF1aXJlcyB0aGF0IChwLTIpKHEtMikgPiA0IHRvIHdvcmsgKG90aGVyd2lzZSBpdCBpc1xuICAvLyBlaXRoZXIgYW4gZWxsaXB0aWNhbCBvciBldWNsaWRlYW4gdGVzc2VsYXRpb24pO1xuICBjaGVja1BhcmFtcygpIHtcbiAgICBpZiAoICggdGhpcy5wIC0gMiApICogKCB0aGlzLnEgLSAyICkgPD0gNCApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdIeXBlcmJvbGljIHRlc3NlbGF0aW9ucyByZXF1aXJlIHRoYXQgKHAtMikocS0yKSA+IDQhJyApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIGlmICggdGhpcy5xIDwgMyB8fCBpc05hTiggdGhpcy5xICkgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnVGVzc2VsYXRpb24gZXJyb3I6IGF0IGxlYXN0IDMgcC1nb25zIG11c3QgbWVldCBhdCBlYWNoIHZlcnRleCEnICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCB0aGlzLnAgPCAzIHx8IGlzTmFOKCB0aGlzLnAgKSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdUZXNzZWxhdGlvbiBlcnJvcjogcG9seWdvbiBuZWVkcyBhdCBsZWFzdCAzIHNpZGVzIScgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQgKiBhcyBUSFJFRSBmcm9tIFwidGhyZWVcIjtcblxuaW1wb3J0IEFwcCBmcm9tIFwiLi9BcHAvQXBwLmpzXCI7XG5cbmltcG9ydCBcIi4vdXRpbGl0aWVzL3BvbHlmaWxscy5qc1wiO1xuaW1wb3J0IFwiLi9jb21wb25lbnRzL2NvbnRyb2xzLmpzXCI7XG5cbmltcG9ydCBjcmVhdGVHZW9tZXRyaWVzIGZyb20gXCIuL3V0aWxpdGllcy9jcmVhdGVHZW9tZXRyaWVzXCI7XG5cbmltcG9ydCBiYXNpY1ZlcnQgZnJvbSBcIi4vc2hhZGVycy9iYXNpYy52ZXJ0XCI7XG5pbXBvcnQgYmFzaWNGcmFnIGZyb20gXCIuL3NoYWRlcnMvYmFzaWMuZnJhZ1wiO1xuXG5pbXBvcnQgUmVndWxhckh5cGVyYm9saWNUZXNzZWxhdGlvbiBmcm9tIFwiLi91dGlsaXRpZXMvUmVndWxhckh5cGVyYm9saWNUZXNzZWxhdGlvbi5qc1wiO1xuXG5USFJFRS5DYWNoZS5lbmFibGVkID0gdHJ1ZTtcblxuY2xhc3MgTWFpbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgc2VsZi5hcHAgPSBuZXcgQXBwKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjY2FudmFzXCIpKTtcblxuICAgIHNlbGYuYXBwLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgMCwgMS41KTtcbiAgICBzZWxmLmFwcC5jYW1lcmEuZmFyID0gNTtcbiAgICBzZWxmLmFwcC5jYW1lcmEuYXNwZWN0ID0gMTtcbiAgICBzZWxmLmFwcC5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIHNlbGYuYXBwLmF1dG9SZXNpemUgPSBmYWxzZTtcblxuICAgIHNlbGYuaW5pdFBRQ29udHJvbHMoKTtcblxuICAgIHNlbGYuaW5pdERyYWdEcm9wQ29udHJvbHMoKTtcblxuICAgIHNlbGYuaW5pdEltYWdlRG93bmxvYWRlcigpO1xuXG4gICAgc2VsZi5pbml0U3BlYygpO1xuXG4gICAgc2VsZi5pbml0TWF0ZXJpYWxzKCk7XG5cbiAgICB0aGlzLmJ1aWxkVGlsaW5nKCk7XG5cbiAgICBzZWxmLmFwcC5vblVwZGF0ZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXJ0aWNsZVwiKTtcblxuICAgIGxldCBzaWRlID0gTWF0aC5taW4oY29udGVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0KSAtIDE2O1xuXG4gICAgY29uc3Qgc2V0U2l6ZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NpZGUgPSBNYXRoLm1pbihjb250ZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpIC0gMTY7XG4gICAgICBpZiAoc2lkZSAhPT0gbmV3U2lkZSkge1xuICAgICAgICBzaWRlID0gbmV3U2lkZTtcbiAgICAgICAgc2VsZi5hcHAucmVuZGVyZXIuc2V0U2l6ZShzaWRlLCBzaWRlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc2V0U2l6ZSgpO1xuXG4gICAgY29udGVudC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLCAoKSA9PiB7XG4gICAgICBzZXRTaXplKCk7XG4gICAgfSk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCAoKSA9PiB7XG4gICAgICBzZXRTaXplKCk7XG4gICAgfSk7XG5cbiAgICBzZWxmLmFwcC5wbGF5KCk7XG4gIH1cblxuICBpbml0UFFDb250cm9scygpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IHAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3AtdmFsdWVcIik7XG4gICAgY29uc3QgcSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcS12YWx1ZVwiKTtcblxuICAgIGNvbnN0IHBWYWx1ZSA9ICgpID0+IHBhcnNlSW50KHAuaW5uZXJIVE1MLCAxMCk7XG5cbiAgICBjb25zdCBxVmFsdWUgPSAoKSA9PiBwYXJzZUludChxLmlubmVySFRNTCwgMTApO1xuXG4gICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7XG4gICAgICBjb25zdCBuZXdQID0gcFZhbHVlKCk7XG4gICAgICBjb25zdCBuZXdRID0gcVZhbHVlKCk7XG5cbiAgICAgIGlmICh0aGlzLnNwZWMucCA9PT0gbmV3UCAmJiB0aGlzLnNwZWMucSA9PT0gbmV3USkgcmV0dXJuO1xuXG4gICAgICB0aGlzLnNwZWMucCA9IG5ld1A7XG4gICAgICB0aGlzLnNwZWMucSA9IG5ld1E7XG5cbiAgICAgIC8vIFRPRE86IGRpc3BsYXkgYSB3YXJuaW5nIGhlcmUgc2F5aW5nIHAsIHEgY2FuJ3QgYm90aCBiZSA0XG4gICAgICBpZiAocFZhbHVlKCkgPT09IDQgJiYgcVZhbHVlKCkgPT09IDQpIHJldHVybjtcblxuICAgICAgLy8gQWRkIGEgc2xpZ2h0IGRlbGF5IGJlZm9yZSByZWJ1aWxkaW5nIHRoZSB0aWxpbmcgdG8gYWxsb3cgdGhlIGRpc3BsYXllZFxuICAgICAgLy8gdmFsdWUgcCAvIHEgdG8gdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHNlbGYuYnVpbGRUaWxpbmcoKSwgMTApO1xuICAgIH0pO1xuXG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShwLCB7IGNoaWxkTGlzdDogdHJ1ZSB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKHEsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICB9XG5cbiAgaW5pdERyYWdEcm9wQ29udHJvbHMoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBjb25zdCBpZFRvVGV4dHVyZSA9IHtcbiAgICAgICdibGFjay10aWxlJzogMCxcbiAgICAgICd3aGl0ZS10aWxlJzogMSxcbiAgICB9O1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW1nLnRpbGUnKS5mb3JFYWNoKCh0aWxlKSA9PiB7XG4gICAgICB0aWxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdvdmVyJywgKGUpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSk7XG5cbiAgICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsKGUpID0+IHtcbiAgICAgICAgaWYgKCEoZS50YXJnZXQuaWQgaW4gaWRUb1RleHR1cmUpKSByZXR1cm47XG5cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoZS5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZS5kYXRhVHJhbnNmZXIuaXRlbXMpIHtcbiAgICAgICAgICAgIGlmIChpdGVtLmtpbmQgPT09ICdmaWxlJyAmJiBpdGVtLnR5cGUubWF0Y2goICdeaW1hZ2UvKGdpZnxqcGVnfHBuZ3x3ZWJwKSQnKSkge1xuICAgICAgICAgICAgICBjb25zdCBmaWxlRGF0YSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XG4gICAgICAgICAgICAgIGUudGFyZ2V0LnNyYyA9IFVSTC5jcmVhdGVPYmplY3RVUkwoZmlsZURhdGEpO1xuXG4gICAgICAgICAgICAgIHNlbGYuc3BlYy50ZXh0dXJlc1tpZFRvVGV4dHVyZVtlLnRhcmdldC5pZF1dID0gZS50YXJnZXQuc3JjO1xuICAgICAgICAgICAgICBzZWxmLmluaXRNYXRlcmlhbHMoKTtcbiAgICAgICAgICAgICAgc2VsZi5idWlsZFRpbGluZygpO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBlLmRhdGFUcmFuc2Zlci5pdGVtcy5jbGVhcigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybiggJ0RhdGFUcmFuc2Zlckl0ZW1MaXN0IGludGVyZmFjZSB1bmF2YWlsYWJsZScgKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0SW1hZ2VEb3dubG9hZGVyKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2NhbnZhcycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIGEuaHJlZiA9IHNlbGYuYXBwLnRha2VTY3JlZW5zaG90KDEwMjQsIDEwMjQpLnNyYztcbiAgICAgIGEuZG93bmxvYWQgPSBgaHlwZXJib2xpYy10aWxpbmctcCR7IHNlbGYuc3BlYy5wIH0tcSR7IHNlbGYuc3BlYy5xIH0ucG5nYDtcbiAgICAgIGEuY2xpY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIGJ1aWxkVGlsaW5nKCkge1xuICAgIHRoaXMuY2xlYXJUaWxpbmcoKTtcblxuICAgIGNvbnNvbGUudGltZShcIkdlbmVyYXRlIFRpbGluZ1wiKTtcbiAgICBjb25zdCB0aWxpbmcgPSBuZXcgUmVndWxhckh5cGVyYm9saWNUZXNzZWxhdGlvbih0aGlzLnNwZWMpLmdlbmVyYXRlVGlsaW5nKFxuICAgICAgZmFsc2VcbiAgICApO1xuICAgIGNvbnNvbGUudGltZUVuZChcIkdlbmVyYXRlIFRpbGluZ1wiKTtcblxuICAgIGNvbnNvbGUudGltZShcIkRyYXcgVGlsaW5nXCIpO1xuICAgIHRoaXMuZ2VuZXJhdGVEaXNrKHRpbGluZyk7XG4gICAgY29uc29sZS50aW1lRW5kKFwiRHJhdyBUaWxpbmdcIik7XG5cbiAgICAvLyBjb25zb2xlLmxvZyggJ1RpbGluZyBsZW5ndGg6ICcgKyB0aWxpbmcubGVuZ3RoICk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI3RpbGluZy1sZW5ndGhcIikuaW5uZXJIVE1MID0gdGlsaW5nLmxlbmd0aDtcbiAgfVxuXG4gIGNsZWFyVGlsaW5nKCkge1xuICAgIHdoaWxlICh0aGlzLmFwcC5zY2VuZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBvYmplY3QgPSB0aGlzLmFwcC5zY2VuZS5jaGlsZHJlblswXTtcbiAgICAgIGlmIChvYmplY3QudHlwZSA9PT0gXCJNZXNoXCIpIHtcbiAgICAgICAgb2JqZWN0Lmdlb21ldHJ5LmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5hcHAuc2NlbmUucmVtb3ZlKG9iamVjdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaW5pdFNwZWMoKSB7XG4gICAgY29uc3QgaW1hZ2VzUGF0aCA9IFwiYXNzZXRzL3RpbGVzL1wiO1xuXG4gICAgdGhpcy5zcGVjID0ge1xuICAgICAgd2lyZWZyYW1lOiBmYWxzZSxcbiAgICAgIHA6IDYsXG4gICAgICBxOiA2LFxuICAgICAgcmFkaXVzOiAxMDAsXG4gICAgICB0ZXh0dXJlczogW2Ake2ltYWdlc1BhdGh9ZmlzaC1ibGFjay5wbmdgLCBgJHtpbWFnZXNQYXRofWZpc2gtd2hpdGUucG5nYF0sXG4gICAgICBlZGdlQWRqYWNlbmN5OiBbXG4gICAgICAgIC8vIGFycmF5IG9mIGxlbmd0aCBwXG4gICAgICAgIFtcbiAgICAgICAgICAxLCAvLyBlZGdlXzAgb3JpZW50YXRpb24gKC0xID0gcmVmbGVjdGlvbiwgMSA9IHJvdGF0aW9uKVxuICAgICAgICAgIDUsIC8vIGVkZ2VfMCBhZGphY2VuY3kgKHJhbmdlIHAgLSAxKVxuICAgICAgICBdLFxuICAgICAgICBbMSwgNF0sIC8vIGVkZ2VfMSBvcmllbnRhdGlvbiwgYWRqYWNlbmN5XG4gICAgICAgIFsxLCAzXSxcbiAgICAgICAgWzEsIDJdLFxuICAgICAgICBbMSwgMV0sXG4gICAgICAgIFsxLCAwXSxcbiAgICAgIF0sXG4gICAgICBtaW5Qb2x5Z29uU2l6ZTogMC4wMSxcbiAgICB9O1xuICB9XG5cbiAgZ2VuZXJhdGVEaXNrKHRpbGluZykge1xuICAgIGNvbnN0IGdlb21ldHJpZXMgPSBjcmVhdGVHZW9tZXRyaWVzKHRpbGluZyk7XG5cbiAgICBjb25zdCBtZXNoQSA9IG5ldyBUSFJFRS5NZXNoKFxuICAgICAgZ2VvbWV0cmllc1swXSxcbiAgICAgIHRoaXMucGF0dGVyblt0aWxpbmdbMF0ubWF0ZXJpYWxJbmRleF1cbiAgICApO1xuICAgIGNvbnN0IG1lc2hCID0gbmV3IFRIUkVFLk1lc2goXG4gICAgICBnZW9tZXRyaWVzWzFdLFxuICAgICAgdGhpcy5wYXR0ZXJuW3RpbGluZ1sxXS5tYXRlcmlhbEluZGV4XVxuICAgICk7XG5cbiAgICB0aGlzLmFwcC5zY2VuZS5hZGQobWVzaEEpOyAvLyBibGFjayBmaXNoXG4gICAgdGhpcy5hcHAuc2NlbmUuYWRkKG1lc2hCKTsgLy8gd2hpdGUgZmlzaFxuICB9XG5cbiAgaW5pdE1hdGVyaWFscygpIHtcbiAgICB0aGlzLnBhdHRlcm4gPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zcGVjLnRleHR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0ZXh0dXJlID0gbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKHRoaXMuc3BlYy50ZXh0dXJlc1tpXSk7XG4gICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSB0aGlzLmFwcC5yZW5kZXJlci5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpO1xuXG4gICAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBUSFJFRS5SYXdTaGFkZXJNYXRlcmlhbCh7XG4gICAgICAgIHVuaWZvcm1zOiB7XG4gICAgICAgICAgdGlsZVRleHR1cmU6IHtcbiAgICAgICAgICAgIHZhbHVlOiB0ZXh0dXJlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHZlcnRleFNoYWRlcjogYmFzaWNWZXJ0LFxuICAgICAgICBmcmFnbWVudFNoYWRlcjogYmFzaWNGcmFnLFxuICAgICAgICBzaWRlOiBUSFJFRS5Eb3VibGVTaWRlLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucGF0dGVybi5wdXNoKG1hdGVyaWFsKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgbWFpbiA9IG5ldyBNYWluKCk7XG5cbmV4cG9ydCBkZWZhdWx0IG1haW47XG4iXSwKICAibWFwcGluZ3MiOiAiOztBQUFBO0FBQUE7QUFB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TUFBTSxHQUFJO0FBQzdELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJO0FBQzdELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLEtBQU0sTUFBTSxHQUFJO0FBQzlELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLEtBQU0sTUFBTSxHQUFJO0FBRTlELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJO0FBQzdELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJO0FBQzdELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLEtBQU0sTUFBTSxHQUFJO0FBQzlELFlBQU0sTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLEtBQU0sTUFBTSxHQUFJO0FBRTlELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksTUFBTyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBRXJELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksS0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBQ3BELFNBQUksTUFBTyxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNO0FBRXJELFNBQUksS0FBTSxNQUFN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QU0sTUFBTTtBQUV0RCxVQUFLLFFBQVE7QUFBSSxlQUFPLEtBQUssSUFBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRztBQUUvRSxZQUFNLFNBQVMsSUFBSTtBQUVuQixTQUFJLEtBQU0sTUFBTTtBQUNoQixTQUFJLEtBQVEsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQVE7QUFDMUgsU0FBSSxLQUFRLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFRO0FBQzFILFNBQUksS0FBUSxPQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBUTtBQUUxSCxTQUFJLEtBQU0sTUFBTTtBQUNoQixTQUFJLEtBQVEsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQVE7QUFDMUgsU0FBSSxLQUFRLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFRO0FBQzFILFNBQUksS0FBUSxPQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBUTtBQUUxSCxTQUFJLEtBQU0sTUFBTTtBQUNoQixTQUFJLEtBQVEsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0s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QSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBRUE7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFB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 +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzL3RocmVlL2J1aWxkL3RocmVlLm1vZHVsZS5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL1RpbWUuanMiLCAiLi4vc3JjL0FwcC9BcHAuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9wb2x5ZmlsbHMuanMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29udHJvbHMuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9tYXRoRnVuY3Rpb25zLmpzIiwgIi4uL3NyYy91dGlsaXRpZXMvY3JlYXRlR2VvbWV0cmllcy5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL2h5cGVyYm9saWNFbnRpdGllcy5qcyIsICIuLi9zcmMvdXRpbGl0aWVzL2h5cGVyYm9saWNVdGlsaXRpZXMuanMiLCAiLi4vc3JjL3V0aWxpdGllcy9SZWd1bGFySHlwZXJib2xpY1Rlc3NlbGF0aW9uLmpzIiwgIi4uL3NyYy9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxMC0yMDIxIFRocmVlLmpzIEF1dGhvcnNcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbiAqL1xuY29uc3QgUkVWSVNJT04gPSAnMTI3JztcbmNvbnN0IE1PVVNFID0geyBMRUZUOiAwLCBNSURETEU6IDEsIFJJR0hUOiAyLCBST1RBVEU6IDAsIERPTExZOiAxLCBQQU46IDIgfTtcbmNvbnN0IFRPVUNIID0geyBST1RBVEU6IDAsIFBBTjogMSwgRE9MTFlfUEFOOiAyLCBET0xMWV9ST1RBVEU6IDMgfTtcbmNvbnN0IEN1bGxGYWNlTm9uZSA9IDA7XG5jb25zdCBDdWxsRmFjZUJhY2sgPSAxO1xuY29uc3QgQ3VsbEZhY2VGcm9udCA9IDI7XG5jb25zdCBDdWxsRmFjZUZyb250QmFjayA9IDM7XG5jb25zdCBCYXNpY1NoYWRvd01hcCA9IDA7XG5jb25zdCBQQ0ZTaGFkb3dNYXAgPSAxO1xuY29uc3QgUENGU29mdFNoYWRvd01hcCA9IDI7XG5jb25zdCBWU01TaGFkb3dNYXAgPSAzO1xuY29uc3QgRnJvbnRTaWRlID0gMDtcbmNvbnN0IEJhY2tTaWRlID0gMTtcbmNvbnN0IERvdWJsZVNpZGUgPSAyO1xuY29uc3QgRmxhdFNoYWRpbmcgPSAxO1xuY29uc3QgU21vb3RoU2hhZGluZyA9IDI7XG5jb25zdCBOb0JsZW5kaW5nID0gMDtcbmNvbnN0IE5vcm1hbEJsZW5kaW5nID0gMTtcbmNvbnN0IEFkZGl0aXZlQmxlbmRpbmcgPSAyO1xuY29uc3QgU3VidHJhY3RpdmVCbGVuZGluZyA9IDM7XG5jb25zdCBNdWx0aXBseUJsZW5kaW5nID0gNDtcbmNvbnN0IEN1c3RvbUJsZW5kaW5nID0gNTtcbmNvbnN0IEFkZEVxdWF0aW9uID0gMTAwO1xuY29uc3QgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTtcbmNvbnN0IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uID0gMTAyO1xuY29uc3QgTWluRXF1YXRpb24gPSAxMDM7XG5jb25zdCBNYXhFcXVhdGlvbiA9IDEwNDtcbmNvbnN0IFplcm9GYWN0b3IgPSAyMDA7XG5jb25zdCBPbmVGYWN0b3IgPSAyMDE7XG5jb25zdCBTcmNDb2xvckZhY3RvciA9IDIwMjtcbmNvbnN0IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgPSAyMDM7XG5jb25zdCBTcmNBbHBoYUZhY3RvciA9IDIwNDtcbmNvbnN0IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7XG5jb25zdCBEc3RBbHBoYUZhY3RvciA9IDIwNjtcbmNvbnN0IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IgPSAyMDc7XG5jb25zdCBEc3RDb2xvckZhY3RvciA9IDIwODtcbmNvbnN0IE9uZU1pbnVzRHN0Q29sb3JGYWN0b3IgPSAyMDk7XG5jb25zdCBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yID0gMjEwO1xuY29uc3QgTmV2ZXJEZXB0aCA9IDA7XG5jb25zdCBBbHdheXNEZXB0aCA9IDE7XG5jb25zdCBMZXNzRGVwdGggPSAyO1xuY29uc3QgTGVzc0VxdWFsRGVwdGggPSAzO1xuY29uc3QgRXF1YWxEZXB0aCA9IDQ7XG5jb25zdCBHcmVhdGVyRXF1YWxEZXB0aCA9IDU7XG5jb25zdCBHcmVhdGVyRGVwdGggPSA2O1xuY29uc3QgTm90RXF1YWxEZXB0aCA9IDc7XG5jb25zdCBNdWx0aXBseU9wZXJhdGlvbiA9IDA7XG5jb25zdCBNaXhPcGVyYXRpb24gPSAxO1xuY29uc3QgQWRkT3BlcmF0aW9uID0gMjtcbmNvbnN0IE5vVG9uZU1hcHBpbmcgPSAwO1xuY29uc3QgTGluZWFyVG9uZU1hcHBpbmcgPSAxO1xuY29uc3QgUmVpbmhhcmRUb25lTWFwcGluZyA9IDI7XG5jb25zdCBDaW5lb25Ub25lTWFwcGluZyA9IDM7XG5jb25zdCBBQ0VTRmlsbWljVG9uZU1hcHBpbmcgPSA0O1xuY29uc3QgQ3VzdG9tVG9uZU1hcHBpbmcgPSA1O1xuXG5jb25zdCBVVk1hcHBpbmcgPSAzMDA7XG5jb25zdCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7XG5jb25zdCBDdWJlUmVmcmFjdGlvbk1hcHBpbmcgPSAzMDI7XG5jb25zdCBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyA9IDMwMztcbmNvbnN0IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0O1xuY29uc3QgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDY7XG5jb25zdCBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyA9IDMwNztcbmNvbnN0IFJlcGVhdFdyYXBwaW5nID0gMTAwMDtcbmNvbnN0IENsYW1wVG9FZGdlV3JhcHBpbmcgPSAxMDAxO1xuY29uc3QgTWlycm9yZWRSZXBlYXRXcmFwcGluZyA9IDEwMDI7XG5jb25zdCBOZWFyZXN0RmlsdGVyID0gMTAwMztcbmNvbnN0IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbmNvbnN0IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNDtcbmNvbnN0IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA1O1xuY29uc3QgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciA9IDEwMDU7XG5jb25zdCBMaW5lYXJGaWx0ZXIgPSAxMDA2O1xuY29uc3QgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7XG5jb25zdCBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyID0gMTAwNztcbmNvbnN0IExpbmVhck1pcG1hcExpbmVhckZpbHRlciA9IDEwMDg7XG5jb25zdCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4O1xuY29uc3QgVW5zaWduZWRCeXRlVHlwZSA9IDEwMDk7XG5jb25zdCBCeXRlVHlwZSA9IDEwMTA7XG5jb25zdCBTaG9ydFR5cGUgPSAxMDExO1xuY29uc3QgVW5zaWduZWRTaG9ydFR5cGUgPSAxMDEyO1xuY29uc3QgSW50VHlwZSA9IDEwMTM7XG5jb25zdCBVbnNpZ25lZEludFR5cGUgPSAxMDE0O1xuY29uc3QgRmxvYXRUeXBlID0gMTAxNTtcbmNvbnN0IEhhbGZGbG9hdFR5cGUgPSAxMDE2O1xuY29uc3QgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNztcbmNvbnN0IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSA9IDEwMTg7XG5jb25zdCBVbnNpZ25lZFNob3J0NTY1VHlwZSA9IDEwMTk7XG5jb25zdCBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwO1xuY29uc3QgQWxwaGFGb3JtYXQgPSAxMDIxO1xuY29uc3QgUkdCRm9ybWF0ID0gMTAyMjtcbmNvbnN0IFJHQkFGb3JtYXQgPSAxMDIzO1xuY29uc3QgTHVtaW5hbmNlRm9ybWF0ID0gMTAyNDtcbmNvbnN0IEx1bWluYW5jZUFscGhhRm9ybWF0ID0gMTAyNTtcbmNvbnN0IFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0O1xuY29uc3QgRGVwdGhGb3JtYXQgPSAxMDI2O1xuY29uc3QgRGVwdGhTdGVuY2lsRm9ybWF0ID0gMTAyNztcbmNvbnN0IFJlZEZvcm1hdCA9IDEwMjg7XG5jb25zdCBSZWRJbnRlZ2VyRm9ybWF0ID0gMTAyOTtcbmNvbnN0IFJHRm9ybWF0ID0gMTAzMDtcbmNvbnN0IFJHSW50ZWdlckZvcm1hdCA9IDEwMzE7XG5jb25zdCBSR0JJbnRlZ2VyRm9ybWF0ID0gMTAzMjtcbmNvbnN0IFJHQkFJbnRlZ2VyRm9ybWF0ID0gMTAzMztcblxuY29uc3QgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NjtcbmNvbnN0IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCA9IDMzNzc3O1xuY29uc3QgUkdCQV9TM1RDX0RYVDNfRm9ybWF0ID0gMzM3Nzg7XG5jb25zdCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAzMzc3OTtcbmNvbnN0IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDA7XG5jb25zdCBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCA9IDM1ODQxO1xuY29uc3QgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDI7XG5jb25zdCBSR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQgPSAzNTg0MztcbmNvbnN0IFJHQl9FVEMxX0Zvcm1hdCA9IDM2MTk2O1xuY29uc3QgUkdCX0VUQzJfRm9ybWF0ID0gMzc0OTI7XG5jb25zdCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCA9IDM3NDk2O1xuY29uc3QgUkdCQV9BU1RDXzR4NF9Gb3JtYXQgPSAzNzgwODtcbmNvbnN0IFJHQkFfQVNUQ181eDRfRm9ybWF0ID0gMzc4MDk7XG5jb25zdCBSR0JBX0FTVENfNXg1X0Zvcm1hdCA9IDM3ODEwO1xuY29uc3QgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgPSAzNzgxMTtcbmNvbnN0IFJHQkFfQVNUQ182eDZfRm9ybWF0ID0gMzc4MTI7XG5jb25zdCBSR0JBX0FTVENfOHg1X0Zvcm1hdCA9IDM3ODEzO1xuY29uc3QgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgPSAzNzgxNDtcbmNvbnN0IFJHQkFfQVNUQ184eDhfRm9ybWF0ID0gMzc4MTU7XG5jb25zdCBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgPSAzNzgxNjtcbmNvbnN0IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCA9IDM3ODE3O1xuY29uc3QgUkdCQV9BU1RDXzEweDhfRm9ybWF0ID0gMzc4MTg7XG5jb25zdCBSR0JBX0FTVENfMTB4MTBfRm9ybWF0ID0gMzc4MTk7XG5jb25zdCBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0ID0gMzc4MjA7XG5jb25zdCBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4MjE7XG5jb25zdCBSR0JBX0JQVENfRm9ybWF0ID0gMzY0OTI7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ180eDRfRm9ybWF0ID0gMzc4NDA7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ181eDRfRm9ybWF0ID0gMzc4NDE7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0ID0gMzc4NDI7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0ID0gMzc4NDM7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ182eDZfRm9ybWF0ID0gMzc4NDQ7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0ID0gMzc4NDU7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDZfRm9ybWF0ID0gMzc4NDY7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0ID0gMzc4NDc7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODQ4O1xuY29uc3QgU1JHQjhfQUxQSEE4X0FTVENfMTB4Nl9Gb3JtYXQgPSAzNzg0OTtcbmNvbnN0IFNSR0I4X0FMUEhBOF9BU1RDXzEweDhfRm9ybWF0ID0gMzc4NTA7XG5jb25zdCBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzg1MTtcbmNvbnN0IFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCA9IDM3ODUyO1xuY29uc3QgU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0ID0gMzc4NTM7XG5jb25zdCBMb29wT25jZSA9IDIyMDA7XG5jb25zdCBMb29wUmVwZWF0ID0gMjIwMTtcbmNvbnN0IExvb3BQaW5nUG9uZyA9IDIyMDI7XG5jb25zdCBJbnRlcnBvbGF0ZURpc2NyZXRlID0gMjMwMDtcbmNvbnN0IEludGVycG9sYXRlTGluZWFyID0gMjMwMTtcbmNvbnN0IEludGVycG9sYXRlU21vb3RoID0gMjMwMjtcbmNvbnN0IFplcm9DdXJ2YXR1cmVFbmRpbmcgPSAyNDAwO1xuY29uc3QgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTtcbmNvbnN0IFdyYXBBcm91bmRFbmRpbmcgPSAyNDAyO1xuY29uc3QgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMDtcbmNvbnN0IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlID0gMjUwMTtcbmNvbnN0IFRyaWFuZ2xlc0RyYXdNb2RlID0gMDtcbmNvbnN0IFRyaWFuZ2xlU3RyaXBEcmF3TW9kZSA9IDE7XG5jb25zdCBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjtcbmNvbnN0IExpbmVhckVuY29kaW5nID0gMzAwMDtcbmNvbnN0IHNSR0JFbmNvZGluZyA9IDMwMDE7XG5jb25zdCBHYW1tYUVuY29kaW5nID0gMzAwNztcbmNvbnN0IFJHQkVFbmNvZGluZyA9IDMwMDI7XG5jb25zdCBMb2dMdXZFbmNvZGluZyA9IDMwMDM7XG5jb25zdCBSR0JNN0VuY29kaW5nID0gMzAwNDtcbmNvbnN0IFJHQk0xNkVuY29kaW5nID0gMzAwNTtcbmNvbnN0IFJHQkRFbmNvZGluZyA9IDMwMDY7XG5jb25zdCBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7XG5jb25zdCBSR0JBRGVwdGhQYWNraW5nID0gMzIwMTtcbmNvbnN0IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCA9IDA7XG5jb25zdCBPYmplY3RTcGFjZU5vcm1hbE1hcCA9IDE7XG5cbmNvbnN0IFplcm9TdGVuY2lsT3AgPSAwO1xuY29uc3QgS2VlcFN0ZW5jaWxPcCA9IDc2ODA7XG5jb25zdCBSZXBsYWNlU3RlbmNpbE9wID0gNzY4MTtcbmNvbnN0IEluY3JlbWVudFN0ZW5jaWxPcCA9IDc2ODI7XG5jb25zdCBEZWNyZW1lbnRTdGVuY2lsT3AgPSA3NjgzO1xuY29uc3QgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU1O1xuY29uc3QgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU2O1xuY29uc3QgSW52ZXJ0U3RlbmNpbE9wID0gNTM4NjtcblxuY29uc3QgTmV2ZXJTdGVuY2lsRnVuYyA9IDUxMjtcbmNvbnN0IExlc3NTdGVuY2lsRnVuYyA9IDUxMztcbmNvbnN0IEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTQ7XG5jb25zdCBMZXNzRXF1YWxTdGVuY2lsRnVuYyA9IDUxNTtcbmNvbnN0IEdyZWF0ZXJTdGVuY2lsRnVuYyA9IDUxNjtcbmNvbnN0IE5vdEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTc7XG5jb25zdCBHcmVhdGVyRXF1YWxTdGVuY2lsRnVuYyA9IDUxODtcbmNvbnN0IEFsd2F5c1N0ZW5jaWxGdW5jID0gNTE5O1xuXG5jb25zdCBTdGF0aWNEcmF3VXNhZ2UgPSAzNTA0NDtcbmNvbnN0IER5bmFtaWNEcmF3VXNhZ2UgPSAzNTA0ODtcbmNvbnN0IFN0cmVhbURyYXdVc2FnZSA9IDM1MDQwO1xuY29uc3QgU3RhdGljUmVhZFVzYWdlID0gMzUwNDU7XG5jb25zdCBEeW5hbWljUmVhZFVzYWdlID0gMzUwNDk7XG5jb25zdCBTdHJlYW1SZWFkVXNhZ2UgPSAzNTA0MTtcbmNvbnN0IFN0YXRpY0NvcHlVc2FnZSA9IDM1MDQ2O1xuY29uc3QgRHluYW1pY0NvcHlVc2FnZSA9IDM1MDUwO1xuY29uc3QgU3RyZWFtQ29weVVzYWdlID0gMzUwNDI7XG5cbmNvbnN0IEdMU0wxID0gJzEwMCc7XG5jb25zdCBHTFNMMyA9ICczMDAgZXMnO1xuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9tcmRvb2IvZXZlbnRkaXNwYXRjaGVyLmpzL1xuICovXG5cbmZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9XG5cbk9iamVjdC5hc3NpZ24oIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUsIHtcblxuXHRhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9O1xuXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7XG5cblx0XHRcdGxpc3RlbmVyc1sgdHlwZSBdLnB1c2goIGxpc3RlbmVyICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRoYXNFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybiBmYWxzZTtcblxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblxuXHRcdHJldHVybiBsaXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkICYmIGxpc3RlbmVyc1sgdHlwZSBdLmluZGV4T2YoIGxpc3RlbmVyICkgIT09IC0gMTtcblxuXHR9LFxuXG5cdHJlbW92ZUV2ZW50TGlzdGVuZXI6IGZ1bmN0aW9uICggdHlwZSwgbGlzdGVuZXIgKSB7XG5cblx0XHRpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzO1xuXHRcdGNvbnN0IGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIHR5cGUgXTtcblxuXHRcdGlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBpbmRleCA9IGxpc3RlbmVyQXJyYXkuaW5kZXhPZiggbGlzdGVuZXIgKTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gLSAxICkge1xuXG5cdFx0XHRcdGxpc3RlbmVyQXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRkaXNwYXRjaEV2ZW50OiBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0aWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGNvbnN0IGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVycztcblx0XHRjb25zdCBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyBldmVudC50eXBlIF07XG5cblx0XHRpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcztcblxuXHRcdFx0Ly8gTWFrZSBhIGNvcHksIGluIGNhc2UgbGlzdGVuZXJzIGFyZSByZW1vdmVkIHdoaWxlIGl0ZXJhdGluZy5cblx0XHRcdGNvbnN0IGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRldmVudC50YXJnZXQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5jb25zdCBfbHV0ID0gW107XG5cbmZvciAoIGxldCBpID0gMDsgaSA8IDI1NjsgaSArKyApIHtcblxuXHRfbHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTtcblxufVxuXG5sZXQgX3NlZWQgPSAxMjM0NTY3O1xuXG5jb25zdCBNYXRoVXRpbHMgPSB7XG5cblx0REVHMlJBRDogTWF0aC5QSSAvIDE4MCxcblx0UkFEMkRFRzogMTgwIC8gTWF0aC5QSSxcblxuXHRnZW5lcmF0ZVVVSUQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA1MDM0L2hvdy10by1jcmVhdGUtYS1ndWlkLXV1aWQtaW4tamF2YXNjcmlwdC8yMTk2MzEzNiMyMTk2MzEzNlxuXG5cdFx0Y29uc3QgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDEgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDIgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7XG5cdFx0Y29uc3QgdXVpZCA9IF9sdXRbIGQwICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gOCAmIDB4ZmYgXSArIF9sdXRbIGQwID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0X2x1dFsgZDEgJiAweGZmIF0gKyBfbHV0WyBkMSA+PiA4ICYgMHhmZiBdICsgJy0nICsgX2x1dFsgZDEgPj4gMTYgJiAweDBmIHwgMHg0MCBdICsgX2x1dFsgZDEgPj4gMjQgJiAweGZmIF0gKyAnLScgK1xuXHRcdFx0X2x1dFsgZDIgJiAweDNmIHwgMHg4MCBdICsgX2x1dFsgZDIgPj4gOCAmIDB4ZmYgXSArICctJyArIF9sdXRbIGQyID4+IDE2ICYgMHhmZiBdICsgX2x1dFsgZDIgPj4gMjQgJiAweGZmIF0gK1xuXHRcdFx0X2x1dFsgZDMgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiA4ICYgMHhmZiBdICsgX2x1dFsgZDMgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMyA+PiAyNCAmIDB4ZmYgXTtcblxuXHRcdC8vIC50b1VwcGVyQ2FzZSgpIGhlcmUgZmxhdHRlbnMgY29uY2F0ZW5hdGVkIHN0cmluZ3MgdG8gc2F2ZSBoZWFwIG1lbW9yeSBzcGFjZS5cblx0XHRyZXR1cm4gdXVpZC50b1VwcGVyQ2FzZSgpO1xuXG5cdH0sXG5cblx0Y2xhbXA6IGZ1bmN0aW9uICggdmFsdWUsIG1pbiwgbWF4ICkge1xuXG5cdFx0cmV0dXJuIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIHZhbHVlICkgKTtcblxuXHR9LFxuXG5cdC8vIGNvbXB1dGUgZXVjbGlkaWFuIG1vZHVsbyBvZiBtICUgblxuXHQvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uXG5cblx0ZXVjbGlkZWFuTW9kdWxvOiBmdW5jdGlvbiAoIG4sIG0gKSB7XG5cblx0XHRyZXR1cm4gKCAoIG4gJSBtICkgKyBtICkgJSBtO1xuXG5cdH0sXG5cblx0Ly8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPlxuXG5cdG1hcExpbmVhcjogZnVuY3Rpb24gKCB4LCBhMSwgYTIsIGIxLCBiMiApIHtcblxuXHRcdHJldHVybiBiMSArICggeCAtIGExICkgKiAoIGIyIC0gYjEgKSAvICggYTIgLSBhMSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZ2FtZWRldi5uZXQvdHV0b3JpYWxzL3Byb2dyYW1taW5nL2dlbmVyYWwtYW5kLWdhbWVwbGF5LXByb2dyYW1taW5nL2ludmVyc2UtbGVycC1hLXN1cGVyLXVzZWZ1bC15ZXQtb2Z0ZW4tb3Zlcmxvb2tlZC1mdW5jdGlvbi1yNTIzMC9cblxuXHRpbnZlcnNlTGVycDogZnVuY3Rpb24gKCB4LCB5LCB2YWx1ZSApIHtcblxuXHRcdGlmICggeCAhPT0geSApIHtcblxuXHRcdFx0cmV0dXJuICggdmFsdWUgLSB4ICkgLyAoIHkgLSB4ICk7XG5cblx0XHQgfSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIDA7XG5cblx0XHQgfVxuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb25cblxuXHRsZXJwOiBmdW5jdGlvbiAoIHgsIHksIHQgKSB7XG5cblx0XHRyZXR1cm4gKCAxIC0gdCApICogeCArIHQgKiB5O1xuXG5cdH0sXG5cblx0Ly8gaHR0cDovL3d3dy5yb3J5ZHJpc2NvbGwuY29tLzIwMTYvMDMvMDcvZnJhbWUtcmF0ZS1pbmRlcGVuZGVudC1kYW1waW5nLXVzaW5nLWxlcnAvXG5cblx0ZGFtcDogZnVuY3Rpb24gKCB4LCB5LCBsYW1iZGEsIGR0ICkge1xuXG5cdFx0cmV0dXJuIE1hdGhVdGlscy5sZXJwKCB4LCB5LCAxIC0gTWF0aC5leHAoIC0gbGFtYmRhICogZHQgKSApO1xuXG5cdH0sXG5cblx0Ly8gaHR0cHM6Ly93d3cuZGVzbW9zLmNvbS9jYWxjdWxhdG9yL3Zjc2pueXo3eDRcblxuXHRwaW5ncG9uZzogZnVuY3Rpb24gKCB4LCBsZW5ndGggPSAxICkge1xuXG5cdFx0cmV0dXJuIGxlbmd0aCAtIE1hdGguYWJzKCBNYXRoVXRpbHMuZXVjbGlkZWFuTW9kdWxvKCB4LCBsZW5ndGggKiAyICkgLSBsZW5ndGggKTtcblxuXHR9LFxuXG5cdC8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU21vb3Roc3RlcFxuXG5cdHNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqICggMyAtIDIgKiB4ICk7XG5cblx0fSxcblxuXHRzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7XG5cblx0XHRpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7XG5cdFx0aWYgKCB4ID49IG1heCApIHJldHVybiAxO1xuXG5cdFx0eCA9ICggeCAtIG1pbiApIC8gKCBtYXggLSBtaW4gKTtcblxuXHRcdHJldHVybiB4ICogeCAqIHggKiAoIHggKiAoIHggKiA2IC0gMTUgKSArIDEwICk7XG5cblx0fSxcblxuXHQvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsXG5cblx0cmFuZEludDogZnVuY3Rpb24gKCBsb3csIGhpZ2ggKSB7XG5cblx0XHRyZXR1cm4gbG93ICsgTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggaGlnaCAtIGxvdyArIDEgKSApO1xuXG5cdH0sXG5cblx0Ly8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkge1xuXG5cdFx0cmV0dXJuIGxvdyArIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKTtcblxuXHR9LFxuXG5cdC8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWxcblxuXHRyYW5kRmxvYXRTcHJlYWQ6IGZ1bmN0aW9uICggcmFuZ2UgKSB7XG5cblx0XHRyZXR1cm4gcmFuZ2UgKiAoIDAuNSAtIE1hdGgucmFuZG9tKCkgKTtcblxuXHR9LFxuXG5cdC8vIERldGVybWluaXN0aWMgcHNldWRvLXJhbmRvbSBmbG9hdCBpbiB0aGUgaW50ZXJ2YWwgWyAwLCAxIF1cblxuXHRzZWVkZWRSYW5kb206IGZ1bmN0aW9uICggcyApIHtcblxuXHRcdGlmICggcyAhPT0gdW5kZWZpbmVkICkgX3NlZWQgPSBzICUgMjE0NzQ4MzY0NztcblxuXHRcdC8vIFBhcmstTWlsbGVyIGFsZ29yaXRobVxuXG5cdFx0X3NlZWQgPSBfc2VlZCAqIDE2ODA3ICUgMjE0NzQ4MzY0NztcblxuXHRcdHJldHVybiAoIF9zZWVkIC0gMSApIC8gMjE0NzQ4MzY0NjtcblxuXHR9LFxuXG5cdGRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7XG5cblx0XHRyZXR1cm4gZGVncmVlcyAqIE1hdGhVdGlscy5ERUcyUkFEO1xuXG5cdH0sXG5cblx0cmFkVG9EZWc6IGZ1bmN0aW9uICggcmFkaWFucyApIHtcblxuXHRcdHJldHVybiByYWRpYW5zICogTWF0aFV0aWxzLlJBRDJERUc7XG5cblx0fSxcblxuXHRpc1Bvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRyZXR1cm4gKCB2YWx1ZSAmICggdmFsdWUgLSAxICkgKSA9PT0gMCAmJiB2YWx1ZSAhPT0gMDtcblxuXHR9LFxuXG5cdGNlaWxQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmNlaWwoIE1hdGgubG9nKCB2YWx1ZSApIC8gTWF0aC5MTjIgKSApO1xuXG5cdH0sXG5cblx0Zmxvb3JQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTtcblxuXHR9LFxuXG5cdHNldFF1YXRlcm5pb25Gcm9tUHJvcGVyRXVsZXI6IGZ1bmN0aW9uICggcSwgYSwgYiwgYywgb3JkZXIgKSB7XG5cblx0XHQvLyBJbnRyaW5zaWMgUHJvcGVyIEV1bGVyIEFuZ2xlcyAtIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FdWxlcl9hbmdsZXNcblxuXHRcdC8vIHJvdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgYXhlcyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5ICdvcmRlcidcblx0XHQvLyByb3RhdGlvbiBieSBhbmdsZSAnYScgaXMgYXBwbGllZCBmaXJzdCwgdGhlbiBieSBhbmdsZSAnYicsIHRoZW4gYnkgYW5nbGUgJ2MnXG5cdFx0Ly8gYW5nbGVzIGFyZSBpbiByYWRpYW5zXG5cblx0XHRjb25zdCBjb3MgPSBNYXRoLmNvcztcblx0XHRjb25zdCBzaW4gPSBNYXRoLnNpbjtcblxuXHRcdGNvbnN0IGMyID0gY29zKCBiIC8gMiApO1xuXHRcdGNvbnN0IHMyID0gc2luKCBiIC8gMiApO1xuXG5cdFx0Y29uc3QgYzEzID0gY29zKCAoIGEgKyBjICkgLyAyICk7XG5cdFx0Y29uc3QgczEzID0gc2luKCAoIGEgKyBjICkgLyAyICk7XG5cblx0XHRjb25zdCBjMV8zID0gY29zKCAoIGEgLSBjICkgLyAyICk7XG5cdFx0Y29uc3QgczFfMyA9IHNpbiggKCBhIC0gYyApIC8gMiApO1xuXG5cdFx0Y29uc3QgYzNfMSA9IGNvcyggKCBjIC0gYSApIC8gMiApO1xuXHRcdGNvbnN0IHMzXzEgPSBzaW4oICggYyAtIGEgKSAvIDIgKTtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVgnOlxuXHRcdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogYzFfMywgczIgKiBzMV8zLCBjMiAqIGMxMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpZJzpcblx0XHRcdFx0cS5zZXQoIHMyICogczFfMywgYzIgKiBzMTMsIHMyICogYzFfMywgYzIgKiBjMTMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWic6XG5cdFx0XHRcdHEuc2V0KCBzMiAqIGMxXzMsIHMyICogczFfMywgYzIgKiBzMTMsIGMyICogYzEzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdYWlgnOlxuXHRcdFx0XHRxLnNldCggYzIgKiBzMTMsIHMyICogczNfMSwgczIgKiBjM18xLCBjMiAqIGMxMyApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhZJzpcblx0XHRcdFx0cS5zZXQoIHMyICogYzNfMSwgYzIgKiBzMTMsIHMyICogczNfMSwgYzIgKiBjMTMgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pZWic6XG5cdFx0XHRcdHEuc2V0KCBzMiAqIHMzXzEsIHMyICogYzNfMSwgYzIgKiBzMTMsIGMyICogYzEzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRoVXRpbHM6IC5zZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5jbGFzcyBWZWN0b3IyIHtcblxuXHRjb25zdHJ1Y3RvciggeCA9IDAsIHkgPSAwICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdH1cblxuXHRnZXQgd2lkdGgoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54O1xuXG5cdH1cblxuXHRzZXQgd2lkdGgoIHZhbHVlICkge1xuXG5cdFx0dGhpcy54ID0gdmFsdWU7XG5cblx0fVxuXG5cdGdldCBoZWlnaHQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy55O1xuXG5cdH1cblxuXHRzZXQgaGVpZ2h0KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMueSA9IHZhbHVlO1xuXG5cdH1cblxuXHRzZXQoIHgsIHkgKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggPSBzY2FsYXI7XG5cdFx0dGhpcy55ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFgoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFkoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldENvbXBvbmVudCggaW5kZXggKSB7XG5cblx0XHRzd2l0Y2ggKCBpbmRleCApIHtcblxuXHRcdFx0Y2FzZSAwOiByZXR1cm4gdGhpcy54O1xuXHRcdFx0Y2FzZSAxOiByZXR1cm4gdGhpcy55O1xuXHRcdFx0ZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55ICk7XG5cblx0fVxuXG5cdGNvcHkoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZCggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxhciggcyApIHtcblxuXHRcdHRoaXMueCArPSBzO1xuXHRcdHRoaXMueSArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKyBiLng7XG5cdFx0dGhpcy55ID0gYS55ICsgYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YlNjYWxhciggcyApIHtcblxuXHRcdHRoaXMueCAtPSBzO1xuXHRcdHRoaXMueSAtPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YlZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggLSBiLng7XG5cdFx0dGhpcy55ID0gYS55IC0gYi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5KCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGl2aWRlKCB2ICkge1xuXG5cdFx0dGhpcy54IC89IHYueDtcblx0XHR0aGlzLnkgLz0gdi55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRpdmlkZVNjYWxhciggc2NhbGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTtcblxuXHR9XG5cblx0YXBwbHlNYXRyaXgzKCBtICkge1xuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdO1xuXHRcdHRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgNyBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xhbXBMZW5ndGgoIG1pbiwgbWF4ICkge1xuXG5cdFx0Y29uc3QgbGVuZ3RoID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdHJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggbGVuZ3RoIHx8IDEgKS5tdWx0aXBseVNjYWxhciggTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgbGVuZ3RoICkgKSApO1xuXG5cdH1cblxuXHRmbG9vcigpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNlaWwoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGguY2VpbCggdGhpcy55ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm91bmQoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJvdW5kKCB0aGlzLnkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3VuZFRvWmVybygpIHtcblxuXHRcdHRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG5lZ2F0ZSgpIHtcblxuXHRcdHRoaXMueCA9IC0gdGhpcy54O1xuXHRcdHRoaXMueSA9IC0gdGhpcy55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRvdCggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7XG5cblx0fVxuXG5cdGNyb3NzKCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueSAtIHRoaXMueSAqIHYueDtcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0YW5nbGUoKSB7XG5cblx0XHQvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpc1xuXG5cdFx0Y29uc3QgYW5nbGUgPSBNYXRoLmF0YW4yKCAtIHRoaXMueSwgLSB0aGlzLnggKSArIE1hdGguUEk7XG5cblx0XHRyZXR1cm4gYW5nbGU7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG8oIHYgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKCB2ICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSB7XG5cblx0XHRjb25zdCBkeCA9IHRoaXMueCAtIHYueCwgZHkgPSB0aGlzLnkgLSB2Lnk7XG5cdFx0cmV0dXJuIGR4ICogZHggKyBkeSAqIGR5O1xuXG5cdH1cblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBWZWN0b3JzKCB2MSwgdjIsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ID0gdjEueCArICggdjIueCAtIHYxLnggKSAqIGFscGhhO1xuXHRcdHRoaXMueSA9IHYxLnkgKyAoIHYyLnkgLSB2MS55ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLnggPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3RhdGVBcm91bmQoIGNlbnRlciwgYW5nbGUgKSB7XG5cblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIGFuZ2xlICksIHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdGNvbnN0IHggPSB0aGlzLnggLSBjZW50ZXIueDtcblx0XHRjb25zdCB5ID0gdGhpcy55IC0gY2VudGVyLnk7XG5cblx0XHR0aGlzLnggPSB4ICogYyAtIHkgKiBzICsgY2VudGVyLng7XG5cdFx0dGhpcy55ID0geCAqIHMgKyB5ICogYyArIGNlbnRlci55O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJhbmRvbSgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy55ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3IyLnByb3RvdHlwZS5pc1ZlY3RvcjIgPSB0cnVlO1xuXG5jbGFzcyBNYXRyaXgzIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdHRoaXMuZWxlbWVudHMgPSBbXG5cblx0XHRcdDEsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMVxuXG5cdFx0XTtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMjEsIG4yMiwgbjIzLCBuMzEsIG4zMiwgbjMzICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTtcblx0XHR0ZVsgMyBdID0gbjEyOyB0ZVsgNCBdID0gbjIyOyB0ZVsgNSBdID0gbjMyO1xuXHRcdHRlWyA2IF0gPSBuMTM7IHRlWyA3IF0gPSBuMjM7IHRlWyA4IF0gPSBuMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0aWRlbnRpdHkoKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCxcblx0XHRcdDAsIDEsIDAsXG5cdFx0XHQwLCAwLCAxXG5cblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIG0gKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSA9IG1lWyAwIF07IHRlWyAxIF0gPSBtZVsgMSBdOyB0ZVsgMiBdID0gbWVbIDIgXTtcblx0XHR0ZVsgMyBdID0gbWVbIDMgXTsgdGVbIDQgXSA9IG1lWyA0IF07IHRlWyA1IF0gPSBtZVsgNSBdO1xuXHRcdHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeDNDb2x1bW4oIHRoaXMsIDAgKTtcblx0XHR5QXhpcy5zZXRGcm9tTWF0cml4M0NvbHVtbiggdGhpcywgMSApO1xuXHRcdHpBeGlzLnNldEZyb21NYXRyaXgzQ29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0bWVbIDAgXSwgbWVbIDQgXSwgbWVbIDggXSxcblx0XHRcdG1lWyAxIF0sIG1lWyA1IF0sIG1lWyA5IF0sXG5cdFx0XHRtZVsgMiBdLCBtZVsgNiBdLCBtZVsgMTAgXVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoIHRoaXMsIG0gKTtcblxuXHR9XG5cblx0cHJlbXVsdGlwbHkoIG0gKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7XG5cblx0fVxuXG5cdG11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSB7XG5cblx0XHRjb25zdCBhZSA9IGEuZWxlbWVudHM7XG5cdFx0Y29uc3QgYmUgPSBiLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGNvbnN0IGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyAzIF0sIGExMyA9IGFlWyA2IF07XG5cdFx0Y29uc3QgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDQgXSwgYTIzID0gYWVbIDcgXTtcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdO1xuXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDMgXSwgYjEzID0gYmVbIDYgXTtcblx0XHRjb25zdCBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdO1xuXHRcdGNvbnN0IGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA1IF0sIGIzMyA9IGJlWyA4IF07XG5cblx0XHR0ZVsgMCBdID0gYTExICogYjExICsgYTEyICogYjIxICsgYTEzICogYjMxO1xuXHRcdHRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7XG5cdFx0dGVbIDYgXSA9IGExMSAqIGIxMyArIGExMiAqIGIyMyArIGExMyAqIGIzMztcblxuXHRcdHRlWyAxIF0gPSBhMjEgKiBiMTEgKyBhMjIgKiBiMjEgKyBhMjMgKiBiMzE7XG5cdFx0dGVbIDQgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMjtcblx0XHR0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzO1xuXG5cdFx0dGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTtcblx0XHR0ZVsgNSBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyO1xuXHRcdHRlWyA4IF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyAzIF0gKj0gczsgdGVbIDYgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNSBdICo9IHM7IHRlWyA4IF0gKj0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkZXRlcm1pbmFudCgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdGNvbnN0IGEgPSB0ZVsgMCBdLCBiID0gdGVbIDEgXSwgYyA9IHRlWyAyIF0sXG5cdFx0XHRkID0gdGVbIDMgXSwgZSA9IHRlWyA0IF0sIGYgPSB0ZVsgNSBdLFxuXHRcdFx0ZyA9IHRlWyA2IF0sIGggPSB0ZVsgNyBdLCBpID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhICogZSAqIGkgLSBhICogZiAqIGggLSBiICogZCAqIGkgKyBiICogZiAqIGcgKyBjICogZCAqIGggLSBjICogZSAqIGc7XG5cblx0fVxuXG5cdGludmVydCgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSxcblx0XHRcdG4xMiA9IHRlWyAzIF0sIG4yMiA9IHRlWyA0IF0sIG4zMiA9IHRlWyA1IF0sXG5cdFx0XHRuMTMgPSB0ZVsgNiBdLCBuMjMgPSB0ZVsgNyBdLCBuMzMgPSB0ZVsgOCBdLFxuXG5cdFx0XHR0MTEgPSBuMzMgKiBuMjIgLSBuMzIgKiBuMjMsXG5cdFx0XHR0MTIgPSBuMzIgKiBuMTMgLSBuMzMgKiBuMTIsXG5cdFx0XHR0MTMgPSBuMjMgKiBuMTIgLSBuMjIgKiBuMTMsXG5cblx0XHRcdGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMztcblxuXHRcdGlmICggZGV0ID09PSAwICkgcmV0dXJuIHRoaXMuc2V0KCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwICk7XG5cblx0XHRjb25zdCBkZXRJbnYgPSAxIC8gZGV0O1xuXG5cdFx0dGVbIDAgXSA9IHQxMSAqIGRldEludjtcblx0XHR0ZVsgMSBdID0gKCBuMzEgKiBuMjMgLSBuMzMgKiBuMjEgKSAqIGRldEludjtcblx0XHR0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjtcblxuXHRcdHRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7XG5cdFx0dGVbIDQgXSA9ICggbjMzICogbjExIC0gbjMxICogbjEzICkgKiBkZXRJbnY7XG5cdFx0dGVbIDUgXSA9ICggbjMxICogbjEyIC0gbjMyICogbjExICkgKiBkZXRJbnY7XG5cblx0XHR0ZVsgNiBdID0gdDEzICogZGV0SW52O1xuXHRcdHRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52O1xuXHRcdHRlWyA4IF0gPSAoIG4yMiAqIG4xMSAtIG4yMSAqIG4xMiApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zcG9zZSgpIHtcblxuXHRcdGxldCB0bXA7XG5cdFx0Y29uc3QgbSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0bXAgPSBtWyAxIF07IG1bIDEgXSA9IG1bIDMgXTsgbVsgMyBdID0gdG1wO1xuXHRcdHRtcCA9IG1bIDIgXTsgbVsgMiBdID0gbVsgNiBdOyBtWyA2IF0gPSB0bXA7XG5cdFx0dG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXROb3JtYWxNYXRyaXgoIG1hdHJpeDQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCggbWF0cml4NCApLmludmVydCgpLnRyYW5zcG9zZSgpO1xuXG5cdH1cblxuXHR0cmFuc3Bvc2VJbnRvQXJyYXkoIHIgKSB7XG5cblx0XHRjb25zdCBtID0gdGhpcy5lbGVtZW50cztcblxuXHRcdHJbIDAgXSA9IG1bIDAgXTtcblx0XHRyWyAxIF0gPSBtWyAzIF07XG5cdFx0clsgMiBdID0gbVsgNiBdO1xuXHRcdHJbIDMgXSA9IG1bIDEgXTtcblx0XHRyWyA0IF0gPSBtWyA0IF07XG5cdFx0clsgNSBdID0gbVsgNyBdO1xuXHRcdHJbIDYgXSA9IG1bIDIgXTtcblx0XHRyWyA3IF0gPSBtWyA1IF07XG5cdFx0clsgOCBdID0gbVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFV2VHJhbnNmb3JtKCB0eCwgdHksIHN4LCBzeSwgcm90YXRpb24sIGN4LCBjeSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggcm90YXRpb24gKTtcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHJvdGF0aW9uICk7XG5cblx0XHR0aGlzLnNldChcblx0XHRcdHN4ICogYywgc3ggKiBzLCAtIHN4ICogKCBjICogY3ggKyBzICogY3kgKSArIGN4ICsgdHgsXG5cdFx0XHQtIHN5ICogcywgc3kgKiBjLCAtIHN5ICogKCAtIHMgKiBjeCArIGMgKiBjeSApICsgY3kgKyB0eSxcblx0XHRcdDAsIDAsIDFcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCBzeCwgc3kgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHN4OyB0ZVsgMyBdICo9IHN4OyB0ZVsgNiBdICo9IHN4O1xuXHRcdHRlWyAxIF0gKj0gc3k7IHRlWyA0IF0gKj0gc3k7IHRlWyA3IF0gKj0gc3k7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm90YXRlKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKTtcblx0XHRjb25zdCBzID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBhMTEgPSB0ZVsgMCBdLCBhMTIgPSB0ZVsgMyBdLCBhMTMgPSB0ZVsgNiBdO1xuXHRcdGNvbnN0IGEyMSA9IHRlWyAxIF0sIGEyMiA9IHRlWyA0IF0sIGEyMyA9IHRlWyA3IF07XG5cblx0XHR0ZVsgMCBdID0gYyAqIGExMSArIHMgKiBhMjE7XG5cdFx0dGVbIDMgXSA9IGMgKiBhMTIgKyBzICogYTIyO1xuXHRcdHRlWyA2IF0gPSBjICogYTEzICsgcyAqIGEyMztcblxuXHRcdHRlWyAxIF0gPSAtIHMgKiBhMTEgKyBjICogYTIxO1xuXHRcdHRlWyA0IF0gPSAtIHMgKiBhMTIgKyBjICogYTIyO1xuXHRcdHRlWyA3IF0gPSAtIHMgKiBhMTMgKyBjICogYTIzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zbGF0ZSggdHgsIHR5ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0dGVbIDAgXSArPSB0eCAqIHRlWyAyIF07IHRlWyAzIF0gKz0gdHggKiB0ZVsgNSBdOyB0ZVsgNiBdICs9IHR4ICogdGVbIDggXTtcblx0XHR0ZVsgMSBdICs9IHR5ICogdGVbIDIgXTsgdGVbIDQgXSArPSB0eSAqIHRlWyA1IF07IHRlWyA3IF0gKz0gdHkgKiB0ZVsgOCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGVxdWFscyggbWF0cml4ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IG1lID0gbWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0ZVsgMiBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRlWyAzIF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07XG5cblx0XHRhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgNyBdID0gdGVbIDcgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuTWF0cml4My5wcm90b3R5cGUuaXNNYXRyaXgzID0gdHJ1ZTtcblxubGV0IF9jYW52YXM7XG5cbmNvbnN0IEltYWdlVXRpbHMgPSB7XG5cblx0Z2V0RGF0YVVSTDogZnVuY3Rpb24gKCBpbWFnZSApIHtcblxuXHRcdGlmICggL15kYXRhOi9pLnRlc3QoIGltYWdlLnNyYyApICkge1xuXG5cdFx0XHRyZXR1cm4gaW1hZ2Uuc3JjO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBpbWFnZS5zcmM7XG5cblx0XHR9XG5cblx0XHRsZXQgY2FudmFzO1xuXG5cdFx0aWYgKCBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkge1xuXG5cdFx0XHRjYW52YXMgPSBpbWFnZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApO1xuXG5cdFx0XHRfY2FudmFzLndpZHRoID0gaW1hZ2Uud2lkdGg7XG5cdFx0XHRfY2FudmFzLmhlaWdodCA9IGltYWdlLmhlaWdodDtcblxuXHRcdFx0Y29uc3QgY29udGV4dCA9IF9jYW52YXMuZ2V0Q29udGV4dCggJzJkJyApO1xuXG5cdFx0XHRpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkge1xuXG5cdFx0XHRcdGNvbnRleHQucHV0SW1hZ2VEYXRhKCBpbWFnZSwgMCwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNhbnZhcyA9IF9jYW52YXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNhbnZhcy53aWR0aCA+IDIwNDggfHwgY2FudmFzLmhlaWdodCA+IDIwNDggKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMuZ2V0RGF0YVVSTDogSW1hZ2UgY29udmVydGVkIHRvIGpwZyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucycsIGltYWdlICk7XG5cblx0XHRcdHJldHVybiBjYW52YXMudG9EYXRhVVJMKCAnaW1hZ2UvanBlZycsIDAuNiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9wbmcnICk7XG5cblx0XHR9XG5cblx0fVxuXG59O1xuXG5sZXQgdGV4dHVyZUlkID0gMDtcblxuY2xhc3MgVGV4dHVyZSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XG5cblx0Y29uc3RydWN0b3IoIGltYWdlID0gVGV4dHVyZS5ERUZBVUxUX0lNQUdFLCBtYXBwaW5nID0gVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcsIHdyYXBTID0gQ2xhbXBUb0VkZ2VXcmFwcGluZywgd3JhcFQgPSBDbGFtcFRvRWRnZVdyYXBwaW5nLCBtYWdGaWx0ZXIgPSBMaW5lYXJGaWx0ZXIsIG1pbkZpbHRlciA9IExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgZm9ybWF0ID0gUkdCQUZvcm1hdCwgdHlwZSA9IFVuc2lnbmVkQnl0ZVR5cGUsIGFuaXNvdHJvcHkgPSAxLCBlbmNvZGluZyA9IExpbmVhckVuY29kaW5nICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogdGV4dHVyZUlkICsrIH0gKTtcblxuXHRcdHRoaXMudXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdHRoaXMubmFtZSA9ICcnO1xuXG5cdFx0dGhpcy5pbWFnZSA9IGltYWdlO1xuXHRcdHRoaXMubWlwbWFwcyA9IFtdO1xuXG5cdFx0dGhpcy5tYXBwaW5nID0gbWFwcGluZztcblxuXHRcdHRoaXMud3JhcFMgPSB3cmFwUztcblx0XHR0aGlzLndyYXBUID0gd3JhcFQ7XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlcjtcblx0XHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IGFuaXNvdHJvcHk7XG5cblx0XHR0aGlzLmZvcm1hdCA9IGZvcm1hdDtcblx0XHR0aGlzLmludGVybmFsRm9ybWF0ID0gbnVsbDtcblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXG5cdFx0dGhpcy5vZmZzZXQgPSBuZXcgVmVjdG9yMiggMCwgMCApO1xuXHRcdHRoaXMucmVwZWF0ID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0XHR0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLCAwICk7XG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDMoKTtcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTtcblx0XHR0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTtcblx0XHR0aGlzLmZsaXBZID0gdHJ1ZTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7XHQvLyB2YWxpZCB2YWx1ZXM6IDEsIDIsIDQsIDggKHNlZSBodHRwOi8vd3d3Lmtocm9ub3Mub3JnL29wZW5nbGVzL3Nkay9kb2NzL21hbi94aHRtbC9nbFBpeGVsU3RvcmVpLnhtbClcblxuXHRcdC8vIFZhbHVlcyBvZiBlbmNvZGluZyAhPT0gVEhSRUUuTGluZWFyRW5jb2Rpbmcgb25seSBzdXBwb3J0ZWQgb24gbWFwLCBlbnZNYXAgYW5kIGVtaXNzaXZlTWFwLlxuXHRcdC8vXG5cdFx0Ly8gQWxzbyBjaGFuZ2luZyB0aGUgZW5jb2RpbmcgYWZ0ZXIgYWxyZWFkeSB1c2VkIGJ5IGEgTWF0ZXJpYWwgd2lsbCBub3QgYXV0b21hdGljYWxseSBtYWtlIHRoZSBNYXRlcmlhbFxuXHRcdC8vIHVwZGF0ZS4gWW91IG5lZWQgdG8gZXhwbGljaXRseSBjYWxsIE1hdGVyaWFsLm5lZWRzVXBkYXRlIHRvIHRyaWdnZXIgaXQgdG8gcmVjb21waWxlLlxuXHRcdHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcblxuXHRcdHRoaXMudmVyc2lvbiA9IDA7XG5cdFx0dGhpcy5vblVwZGF0ZSA9IG51bGw7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeCgpIHtcblxuXHRcdHRoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKCB0aGlzLm9mZnNldC54LCB0aGlzLm9mZnNldC55LCB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55LCB0aGlzLnJvdGF0aW9uLCB0aGlzLmNlbnRlci54LCB0aGlzLmNlbnRlci55ICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblxuXHRcdHRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7XG5cdFx0dGhpcy5taXBtYXBzID0gc291cmNlLm1pcG1hcHMuc2xpY2UoIDAgKTtcblxuXHRcdHRoaXMubWFwcGluZyA9IHNvdXJjZS5tYXBwaW5nO1xuXG5cdFx0dGhpcy53cmFwUyA9IHNvdXJjZS53cmFwUztcblx0XHR0aGlzLndyYXBUID0gc291cmNlLndyYXBUO1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBzb3VyY2UubWFnRmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjtcblxuXHRcdHRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5O1xuXG5cdFx0dGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0O1xuXHRcdHRoaXMuaW50ZXJuYWxGb3JtYXQgPSBzb3VyY2UuaW50ZXJuYWxGb3JtYXQ7XG5cdFx0dGhpcy50eXBlID0gc291cmNlLnR5cGU7XG5cblx0XHR0aGlzLm9mZnNldC5jb3B5KCBzb3VyY2Uub2Zmc2V0ICk7XG5cdFx0dGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApO1xuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7XG5cdFx0dGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMucHJlbXVsdGlwbHlBbHBoYSA9IHNvdXJjZS5wcmVtdWx0aXBseUFscGhhO1xuXHRcdHRoaXMuZmxpcFkgPSBzb3VyY2UuZmxpcFk7XG5cdFx0dGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50O1xuXHRcdHRoaXMuZW5jb2RpbmcgPSBzb3VyY2UuZW5jb2Rpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCBtZXRhICkge1xuXG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICYmIG1ldGEudGV4dHVyZXNbIHRoaXMudXVpZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG91dHB1dCA9IHtcblxuXHRcdFx0bWV0YWRhdGE6IHtcblx0XHRcdFx0dmVyc2lvbjogNC41LFxuXHRcdFx0XHR0eXBlOiAnVGV4dHVyZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJ1xuXHRcdFx0fSxcblxuXHRcdFx0dXVpZDogdGhpcy51dWlkLFxuXHRcdFx0bmFtZTogdGhpcy5uYW1lLFxuXG5cdFx0XHRtYXBwaW5nOiB0aGlzLm1hcHBpbmcsXG5cblx0XHRcdHJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sXG5cdFx0XHRvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLFxuXHRcdFx0Y2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSxcblx0XHRcdHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLFxuXG5cdFx0XHR3cmFwOiBbIHRoaXMud3JhcFMsIHRoaXMud3JhcFQgXSxcblxuXHRcdFx0Zm9ybWF0OiB0aGlzLmZvcm1hdCxcblx0XHRcdHR5cGU6IHRoaXMudHlwZSxcblx0XHRcdGVuY29kaW5nOiB0aGlzLmVuY29kaW5nLFxuXG5cdFx0XHRtaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLFxuXHRcdFx0bWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlcixcblx0XHRcdGFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSxcblxuXHRcdFx0ZmxpcFk6IHRoaXMuZmxpcFksXG5cblx0XHRcdHByZW11bHRpcGx5QWxwaGE6IHRoaXMucHJlbXVsdGlwbHlBbHBoYSxcblx0XHRcdHVucGFja0FsaWdubWVudDogdGhpcy51bnBhY2tBbGlnbm1lbnRcblxuXHRcdH07XG5cblx0XHRpZiAoIHRoaXMuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gVE9ETzogTW92ZSB0byBUSFJFRS5JbWFnZVxuXG5cdFx0XHRjb25zdCBpbWFnZSA9IHRoaXMuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UudXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGltYWdlLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7IC8vIFVHSFxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGxldCB1cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBpbWFnZSApICkge1xuXG5cdFx0XHRcdFx0Ly8gcHJvY2VzcyBhcnJheSBvZiBpbWFnZXMgZS5nLiBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0dXJsID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBpbWFnZS5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHQvLyBjaGVjayBjdWJlIHRleHR1cmUgd2l0aCBkYXRhIHRleHR1cmVzXG5cblx0XHRcdFx0XHRcdGlmICggaW1hZ2VbIGkgXS5pc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdFx0XHRcdHVybC5wdXNoKCBzZXJpYWxpemVJbWFnZSggaW1hZ2VbIGkgXS5pbWFnZSApICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0dXJsLnB1c2goIHNlcmlhbGl6ZUltYWdlKCBpbWFnZVsgaSBdICkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBwcm9jZXNzIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0dXJsID0gc2VyaWFsaXplSW1hZ2UoIGltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7XG5cdFx0XHRcdFx0dXVpZDogaW1hZ2UudXVpZCxcblx0XHRcdFx0XHR1cmw6IHVybFxuXHRcdFx0XHR9O1xuXG5cdFx0XHR9XG5cblx0XHRcdG91dHB1dC5pbWFnZSA9IGltYWdlLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoICEgaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHRtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSA9IG91dHB1dDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0fVxuXG5cdGRpc3Bvc2UoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cblx0dHJhbnNmb3JtVXYoIHV2ICkge1xuXG5cdFx0aWYgKCB0aGlzLm1hcHBpbmcgIT09IFVWTWFwcGluZyApIHJldHVybiB1djtcblxuXHRcdHV2LmFwcGx5TWF0cml4MyggdGhpcy5tYXRyaXggKTtcblxuXHRcdGlmICggdXYueCA8IDAgfHwgdXYueCA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFMgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnggPSB1di54IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueCA9IE1hdGguY2VpbCggdXYueCApIC0gdXYueDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnggPSB1di54IC0gTWF0aC5mbG9vciggdXYueCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdXYueSA8IDAgfHwgdXYueSA+IDEgKSB7XG5cblx0XHRcdHN3aXRjaCAoIHRoaXMud3JhcFQgKSB7XG5cblx0XHRcdFx0Y2FzZSBSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgQ2xhbXBUb0VkZ2VXcmFwcGluZzpcblxuXHRcdFx0XHRcdHV2LnkgPSB1di55IDwgMCA/IDAgOiAxO1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzpcblxuXHRcdFx0XHRcdGlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0dXYueSA9IE1hdGguY2VpbCggdXYueSApIC0gdXYueTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHV2LnkgPSB1di55IC0gTWF0aC5mbG9vciggdXYueSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5mbGlwWSApIHtcblxuXHRcdFx0dXYueSA9IDEgLSB1di55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHV2O1xuXG5cdH1cblxuXHRzZXQgbmVlZHNVcGRhdGUoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn1cblxuVGV4dHVyZS5ERUZBVUxUX0lNQUdFID0gdW5kZWZpbmVkO1xuVGV4dHVyZS5ERUZBVUxUX01BUFBJTkcgPSBVVk1hcHBpbmc7XG5cblRleHR1cmUucHJvdG90eXBlLmlzVGV4dHVyZSA9IHRydWU7XG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcblxuXHRpZiAoICggdHlwZW9mIEhUTUxJbWFnZUVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHx8XG5cdFx0KCB0eXBlb2YgSFRNTENhbnZhc0VsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGltYWdlIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQgKSB8fFxuXHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XG5cblx0XHQvLyBkZWZhdWx0IGltYWdlc1xuXG5cdFx0cmV0dXJuIEltYWdlVXRpbHMuZ2V0RGF0YVVSTCggaW1hZ2UgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBpbWFnZS5kYXRhICkge1xuXG5cdFx0XHQvLyBpbWFnZXMgb2YgRGF0YVRleHR1cmVcblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGltYWdlLmRhdGEgKSxcblx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxuXHRcdFx0XHRoZWlnaHQ6IGltYWdlLmhlaWdodCxcblx0XHRcdFx0dHlwZTogaW1hZ2UuZGF0YS5jb25zdHJ1Y3Rvci5uYW1lXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLicgKTtcblx0XHRcdHJldHVybiB7fTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgVmVjdG9yNCB7XG5cblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHR9XG5cblx0Z2V0IHdpZHRoKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuejtcblxuXHR9XG5cblx0c2V0IHdpZHRoKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMueiA9IHZhbHVlO1xuXG5cdH1cblxuXHRnZXQgaGVpZ2h0KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMudztcblxuXHR9XG5cblx0c2V0IGhlaWdodCggdmFsdWUgKSB7XG5cblx0XHR0aGlzLncgPSB2YWx1ZTtcblxuXHR9XG5cblx0c2V0KCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXHRcdHRoaXMudyA9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRYKCB4ICkge1xuXG5cdFx0dGhpcy54ID0geDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRZKCB5ICkge1xuXG5cdFx0dGhpcy55ID0geTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRaKCB6ICkge1xuXG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRXKCB3ICkge1xuXG5cdFx0dGhpcy53ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRDb21wb25lbnQoIGluZGV4LCB2YWx1ZSApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhaztcblx0XHRcdGNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDM6IHRoaXMudyA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRjYXNlIDM6IHJldHVybiB0aGlzLnc7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiwgdGhpcy53ICk7XG5cblx0fVxuXG5cdGNvcHkoIHYgKSB7XG5cblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZCggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuYWRkVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ICs9IHYueDtcblx0XHR0aGlzLnkgKz0gdi55O1xuXHRcdHRoaXMueiArPSB2Lno7XG5cdFx0dGhpcy53ICs9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblx0XHR0aGlzLncgKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cdFx0dGhpcy53ID0gYS53ICsgYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFZlY3RvciggdiwgcyApIHtcblxuXHRcdHRoaXMueCArPSB2LnggKiBzO1xuXHRcdHRoaXMueSArPSB2LnkgKiBzO1xuXHRcdHRoaXMueiArPSB2LnogKiBzO1xuXHRcdHRoaXMudyArPSB2LncgKiBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54IC09IHYueDtcblx0XHR0aGlzLnkgLT0gdi55O1xuXHRcdHRoaXMueiAtPSB2Lno7XG5cdFx0dGhpcy53IC09IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblx0XHR0aGlzLncgLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cdFx0dGhpcy53ID0gYS53IC0gYi53O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5KCB2ICkge1xuXG5cdFx0dGhpcy54ICo9IHYueDtcblx0XHR0aGlzLnkgKj0gdi55O1xuXHRcdHRoaXMueiAqPSB2Lno7XG5cdFx0dGhpcy53ICo9IHYudztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVNjYWxhciggc2NhbGFyICkge1xuXG5cdFx0dGhpcy54ICo9IHNjYWxhcjtcblx0XHR0aGlzLnkgKj0gc2NhbGFyO1xuXHRcdHRoaXMueiAqPSBzY2FsYXI7XG5cdFx0dGhpcy53ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56LCB3ID0gdGhpcy53O1xuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSAqIHc7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKiB3O1xuXHRcdHRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fVxuXG5cdHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKCBxICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL3F1YXRlcm5pb25Ub0FuZ2xlL2luZGV4Lmh0bVxuXG5cdFx0Ly8gcSBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMudyA9IDIgKiBNYXRoLmFjb3MoIHEudyApO1xuXG5cdFx0Y29uc3QgcyA9IE1hdGguc3FydCggMSAtIHEudyAqIHEudyApO1xuXG5cdFx0aWYgKCBzIDwgMC4wMDAxICkge1xuXG5cdFx0XHR0aGlzLnggPSAxO1xuXHRcdFx0dGhpcy55ID0gMDtcblx0XHRcdHRoaXMueiA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnggPSBxLnggLyBzO1xuXHRcdFx0dGhpcy55ID0gcS55IC8gcztcblx0XHRcdHRoaXMueiA9IHEueiAvIHM7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4KCBtICkge1xuXG5cdFx0Ly8gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvQW5nbGUvaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0bGV0IGFuZ2xlLCB4LCB5LCB6OyAvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdFxuXHRcdGNvbnN0IGVwc2lsb24gPSAwLjAxLFx0XHQvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9yc1xuXHRcdFx0ZXBzaWxvbjIgPSAwLjEsXHRcdC8vIG1hcmdpbiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIDAgYW5kIDE4MCBkZWdyZWVzXG5cblx0XHRcdHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXTtcblxuXHRcdGlmICggKCBNYXRoLmFicyggbTEyIC0gbTIxICkgPCBlcHNpbG9uICkgJiZcblx0XHQgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmXG5cdFx0ICAgICAoIE1hdGguYWJzKCBtMjMgLSBtMzIgKSA8IGVwc2lsb24gKSApIHtcblxuXHRcdFx0Ly8gc2luZ3VsYXJpdHkgZm91bmRcblx0XHRcdC8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXNcblx0XHRcdC8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXNcblxuXHRcdFx0aWYgKCAoIE1hdGguYWJzKCBtMTIgKyBtMjEgKSA8IGVwc2lsb24yICkgJiZcblx0XHRcdCAgICAgKCBNYXRoLmFicyggbTEzICsgbTMxICkgPCBlcHNpbG9uMiApICYmXG5cdFx0XHQgICAgICggTWF0aC5hYnMoIG0yMyArIG0zMiApIDwgZXBzaWxvbjIgKSAmJlxuXHRcdFx0ICAgICAoIE1hdGguYWJzKCBtMTEgKyBtMjIgKyBtMzMgLSAzICkgPCBlcHNpbG9uMiApICkge1xuXG5cdFx0XHRcdC8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMFxuXG5cdFx0XHRcdHRoaXMuc2V0KCAxLCAwLCAwLCAwICk7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7IC8vIHplcm8gYW5nbGUsIGFyYml0cmFyeSBheGlzXG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODBcblxuXHRcdFx0YW5nbGUgPSBNYXRoLlBJO1xuXG5cdFx0XHRjb25zdCB4eCA9ICggbTExICsgMSApIC8gMjtcblx0XHRcdGNvbnN0IHl5ID0gKCBtMjIgKyAxICkgLyAyO1xuXHRcdFx0Y29uc3QgenogPSAoIG0zMyArIDEgKSAvIDI7XG5cdFx0XHRjb25zdCB4eSA9ICggbTEyICsgbTIxICkgLyA0O1xuXHRcdFx0Y29uc3QgeHogPSAoIG0xMyArIG0zMSApIC8gNDtcblx0XHRcdGNvbnN0IHl6ID0gKCBtMjMgKyBtMzIgKSAvIDQ7XG5cblx0XHRcdGlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7XG5cblx0XHRcdFx0Ly8gbTExIGlzIHRoZSBsYXJnZXN0IGRpYWdvbmFsIHRlcm1cblxuXHRcdFx0XHRpZiAoIHh4IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwO1xuXHRcdFx0XHRcdHkgPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR6ID0gMC43MDcxMDY3ODE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHggPSBNYXRoLnNxcnQoIHh4ICk7XG5cdFx0XHRcdFx0eSA9IHh5IC8geDtcblx0XHRcdFx0XHR6ID0geHogLyB4O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggeXkgPiB6eiApIHtcblxuXHRcdFx0XHQvLyBtMjIgaXMgdGhlIGxhcmdlc3QgZGlhZ29uYWwgdGVybVxuXG5cdFx0XHRcdGlmICggeXkgPCBlcHNpbG9uICkge1xuXG5cdFx0XHRcdFx0eCA9IDAuNzA3MTA2NzgxO1xuXHRcdFx0XHRcdHkgPSAwO1xuXHRcdFx0XHRcdHogPSAwLjcwNzEwNjc4MTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0eSA9IE1hdGguc3FydCggeXkgKTtcblx0XHRcdFx0XHR4ID0geHkgLyB5O1xuXHRcdFx0XHRcdHogPSB5eiAvIHk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXNcblxuXHRcdFx0XHRpZiAoIHp6IDwgZXBzaWxvbiApIHtcblxuXHRcdFx0XHRcdHggPSAwLjcwNzEwNjc4MTtcblx0XHRcdFx0XHR5ID0gMC43MDcxMDY3ODE7XG5cdFx0XHRcdFx0eiA9IDA7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHogPSBNYXRoLnNxcnQoIHp6ICk7XG5cdFx0XHRcdFx0eCA9IHh6IC8gejtcblx0XHRcdFx0XHR5ID0geXogLyB6O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnNldCggeCwgeSwgeiwgYW5nbGUgKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7IC8vIHJldHVybiAxODAgZGVnIHJvdGF0aW9uXG5cblx0XHR9XG5cblx0XHQvLyBhcyB3ZSBoYXZlIHJlYWNoZWQgaGVyZSB0aGVyZSBhcmUgbm8gc2luZ3VsYXJpdGllcyBzbyB3ZSBjYW4gaGFuZGxlIG5vcm1hbGx5XG5cblx0XHRsZXQgcyA9IE1hdGguc3FydCggKCBtMzIgLSBtMjMgKSAqICggbTMyIC0gbTIzICkgK1xuXHRcdFx0KCBtMTMgLSBtMzEgKSAqICggbTEzIC0gbTMxICkgK1xuXHRcdFx0KCBtMjEgLSBtMTIgKSAqICggbTIxIC0gbTEyICkgKTsgLy8gdXNlZCB0byBub3JtYWxpemVcblxuXHRcdGlmICggTWF0aC5hYnMoIHMgKSA8IDAuMDAxICkgcyA9IDE7XG5cblx0XHQvLyBwcmV2ZW50IGRpdmlkZSBieSB6ZXJvLCBzaG91bGQgbm90IGhhcHBlbiBpZiBtYXRyaXggaXMgb3J0aG9nb25hbCBhbmQgc2hvdWxkIGJlXG5cdFx0Ly8gY2F1Z2h0IGJ5IHNpbmd1bGFyaXR5IHRlc3QgYWJvdmUsIGJ1dCBJJ3ZlIGxlZnQgaXQgaW4ganVzdCBpbiBjYXNlXG5cblx0XHR0aGlzLnggPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHR0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHR0aGlzLnogPSAoIG0yMSAtIG0xMiApIC8gcztcblx0XHR0aGlzLncgPSBNYXRoLmFjb3MoICggbTExICsgbTIyICsgbTMzIC0gMSApIC8gMiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWluKCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXHRcdHRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluLncsIE1hdGgubWluKCBtYXgudywgdGhpcy53ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTtcblx0XHR0aGlzLncgPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLncgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wTGVuZ3RoKCBtaW4sIG1heCApIHtcblxuXHRcdGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTtcblxuXHR9XG5cblx0Zmxvb3IoKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmZsb29yKCB0aGlzLnogKTtcblx0XHR0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjZWlsKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGguY2VpbCggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gTWF0aC5jZWlsKCB0aGlzLncgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyb3VuZCgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGgucm91bmQoIHRoaXMueCApO1xuXHRcdHRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApO1xuXHRcdHRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApO1xuXHRcdHRoaXMudyA9IE1hdGgucm91bmQoIHRoaXMudyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJvdW5kVG9aZXJvKCkge1xuXG5cdFx0dGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gKCB0aGlzLnkgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueSApIDogTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gKCB0aGlzLnogPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueiApIDogTWF0aC5mbG9vciggdGhpcy56ICk7XG5cdFx0dGhpcy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bmVnYXRlKCkge1xuXG5cdFx0dGhpcy54ID0gLSB0aGlzLng7XG5cdFx0dGhpcy55ID0gLSB0aGlzLnk7XG5cdFx0dGhpcy56ID0gLSB0aGlzLno7XG5cdFx0dGhpcy53ID0gLSB0aGlzLnc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZG90KCB2ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMueCAqIHYueCArIHRoaXMueSAqIHYueSArIHRoaXMueiAqIHYueiArIHRoaXMudyAqIHYudztcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKyB0aGlzLncgKiB0aGlzLncgKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKSArIE1hdGguYWJzKCB0aGlzLncgKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cdFx0dGhpcy53ICs9ICggdi53IC0gdGhpcy53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRsZXJwVmVjdG9ycyggdjEsIHYyLCBhbHBoYSApIHtcblxuXHRcdHRoaXMueCA9IHYxLnggKyAoIHYyLnggLSB2MS54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgPSB2MS55ICsgKCB2Mi55IC0gdjEueSApICogYWxwaGE7XG5cdFx0dGhpcy56ID0gdjEueiArICggdjIueiAtIHYxLnogKSAqIGFscGhhO1xuXHRcdHRoaXMudyA9IHYxLncgKyAoIHYyLncgLSB2MS53ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHYgKSB7XG5cblx0XHRyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTtcblxuXHR9XG5cblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cdFx0dGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGhpcy54O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLnk7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy53O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0XHRpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy54ID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy56ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy53ID0gYXR0cmlidXRlLmdldFcoIGluZGV4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cmFuZG9tKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yYW5kb20oKTtcblx0XHR0aGlzLnkgPSBNYXRoLnJhbmRvbSgpO1xuXHRcdHRoaXMueiA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy53ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3I0LnByb3RvdHlwZS5pc1ZlY3RvcjQgPSB0cnVlO1xuXG4vKlxuIEluIG9wdGlvbnMsIHdlIGNhbiBzcGVjaWZ5OlxuICogVGV4dHVyZSBwYXJhbWV0ZXJzIGZvciBhbiBhdXRvLWdlbmVyYXRlZCB0YXJnZXQgdGV4dHVyZVxuICogZGVwdGhCdWZmZXIvc3RlbmNpbEJ1ZmZlcjogQm9vbGVhbnMgdG8gaW5kaWNhdGUgaWYgd2Ugc2hvdWxkIGdlbmVyYXRlIHRoZXNlIGJ1ZmZlcnNcbiovXG5jbGFzcyBXZWJHTFJlbmRlclRhcmdldCBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7XG5cblx0Y29uc3RydWN0b3IoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMuZGVwdGggPSAxO1xuXG5cdFx0dGhpcy5zY2lzc29yID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3JUZXN0ID0gZmFsc2U7XG5cblx0XHR0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IFRleHR1cmUoIHVuZGVmaW5lZCwgb3B0aW9ucy5tYXBwaW5nLCBvcHRpb25zLndyYXBTLCBvcHRpb25zLndyYXBULCBvcHRpb25zLm1hZ0ZpbHRlciwgb3B0aW9ucy5taW5GaWx0ZXIsIG9wdGlvbnMuZm9ybWF0LCBvcHRpb25zLnR5cGUsIG9wdGlvbnMuYW5pc290cm9weSwgb3B0aW9ucy5lbmNvZGluZyApO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlID0ge307XG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodCA9IGhlaWdodDtcblx0XHR0aGlzLnRleHR1cmUuaW1hZ2UuZGVwdGggPSAxO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyA6IGZhbHNlO1xuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gb3B0aW9ucy5kZXB0aEJ1ZmZlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aEJ1ZmZlciA6IHRydWU7XG5cdFx0dGhpcy5zdGVuY2lsQnVmZmVyID0gb3B0aW9ucy5zdGVuY2lsQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgOiBmYWxzZTtcblx0XHR0aGlzLmRlcHRoVGV4dHVyZSA9IG9wdGlvbnMuZGVwdGhUZXh0dXJlICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoVGV4dHVyZSA6IG51bGw7XG5cblx0fVxuXG5cdHNldFRleHR1cmUoIHRleHR1cmUgKSB7XG5cblx0XHR0ZXh0dXJlLmltYWdlID0ge1xuXHRcdFx0d2lkdGg6IHRoaXMud2lkdGgsXG5cdFx0XHRoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuXHRcdFx0ZGVwdGg6IHRoaXMuZGVwdGhcblx0XHR9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gdGV4dHVyZTtcblxuXHR9XG5cblx0c2V0U2l6ZSggd2lkdGgsIGhlaWdodCwgZGVwdGggPSAxICkge1xuXG5cdFx0aWYgKCB0aGlzLndpZHRoICE9PSB3aWR0aCB8fCB0aGlzLmhlaWdodCAhPT0gaGVpZ2h0IHx8IHRoaXMuZGVwdGggIT09IGRlcHRoICkge1xuXG5cdFx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblx0XHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcblxuXHRcdFx0dGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7XG5cdFx0XHR0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdFx0dGhpcy50ZXh0dXJlLmltYWdlLmRlcHRoID0gZGVwdGg7XG5cblx0XHRcdHRoaXMuZGlzcG9zZSgpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTtcblx0XHR0aGlzLnNjaXNzb3Iuc2V0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblx0XHR0aGlzLmRlcHRoID0gc291cmNlLmRlcHRoO1xuXG5cdFx0dGhpcy52aWV3cG9ydC5jb3B5KCBzb3VyY2Uudmlld3BvcnQgKTtcblxuXHRcdHRoaXMudGV4dHVyZSA9IHNvdXJjZS50ZXh0dXJlLmNsb25lKCk7XG5cblx0XHR0aGlzLmRlcHRoQnVmZmVyID0gc291cmNlLmRlcHRoQnVmZmVyO1xuXHRcdHRoaXMuc3RlbmNpbEJ1ZmZlciA9IHNvdXJjZS5zdGVuY2lsQnVmZmVyO1xuXHRcdHRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59XG5cbldlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcblxuY2xhc3MgV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCBleHRlbmRzIFdlYkdMUmVuZGVyVGFyZ2V0IHtcblxuXHRjb25zdHJ1Y3Rvciggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHtcblxuXHRcdHN1cGVyKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICk7XG5cblx0XHR0aGlzLnNhbXBsZXMgPSA0O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5zYW1wbGVzID0gc291cmNlLnNhbXBsZXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldC5wcm90b3R5cGUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID0gdHJ1ZTtcblxuY2xhc3MgUXVhdGVybmlvbiB7XG5cblx0Y29uc3RydWN0b3IoIHggPSAwLCB5ID0gMCwgeiA9IDAsIHcgPSAxICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0fVxuXG5cdHN0YXRpYyBzbGVycCggcWEsIHFiLCBxbSwgdCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IFN0YXRpYyAuc2xlcnAoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgcW0uc2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkgaW5zdGVhZC4nICk7XG5cdFx0cmV0dXJuIHFtLnNsZXJwUXVhdGVybmlvbnMoIHFhLCBxYiwgdCApO1xuXG5cdH1cblxuXHRzdGF0aWMgc2xlcnBGbGF0KCBkc3QsIGRzdE9mZnNldCwgc3JjMCwgc3JjT2Zmc2V0MCwgc3JjMSwgc3JjT2Zmc2V0MSwgdCApIHtcblxuXHRcdC8vIGZ1enotZnJlZSwgYXJyYXktYmFzZWQgUXVhdGVybmlvbiBTTEVSUCBvcGVyYXRpb25cblxuXHRcdGxldCB4MCA9IHNyYzBbIHNyY09mZnNldDAgKyAwIF0sXG5cdFx0XHR5MCA9IHNyYzBbIHNyY09mZnNldDAgKyAxIF0sXG5cdFx0XHR6MCA9IHNyYzBbIHNyY09mZnNldDAgKyAyIF0sXG5cdFx0XHR3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XG5cblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sXG5cdFx0XHR5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sXG5cdFx0XHR6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sXG5cdFx0XHR3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07XG5cblx0XHRpZiAoIHQgPT09IDAgKSB7XG5cblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDA7XG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkwO1xuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzA7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHQgPT09IDEgKSB7XG5cblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMCBdID0geDE7XG5cdFx0XHRkc3RbIGRzdE9mZnNldCArIDEgXSA9IHkxO1xuXHRcdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MTtcblx0XHRcdGRzdFsgZHN0T2Zmc2V0ICsgMyBdID0gdzE7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHtcblxuXHRcdFx0bGV0IHMgPSAxIC0gdDtcblx0XHRcdGNvbnN0IGNvcyA9IHgwICogeDEgKyB5MCAqIHkxICsgejAgKiB6MSArIHcwICogdzEsXG5cdFx0XHRcdGRpciA9ICggY29zID49IDAgPyAxIDogLSAxICksXG5cdFx0XHRcdHNxclNpbiA9IDEgLSBjb3MgKiBjb3M7XG5cblx0XHRcdC8vIFNraXAgdGhlIFNsZXJwIGZvciB0aW55IHN0ZXBzIHRvIGF2b2lkIG51bWVyaWMgcHJvYmxlbXM6XG5cdFx0XHRpZiAoIHNxclNpbiA+IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRcdGNvbnN0IHNpbiA9IE1hdGguc3FydCggc3FyU2luICksXG5cdFx0XHRcdFx0bGVuID0gTWF0aC5hdGFuMiggc2luLCBjb3MgKiBkaXIgKTtcblxuXHRcdFx0XHRzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjtcblx0XHRcdFx0dCA9IE1hdGguc2luKCB0ICogbGVuICkgLyBzaW47XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdERpciA9IHQgKiBkaXI7XG5cblx0XHRcdHgwID0geDAgKiBzICsgeDEgKiB0RGlyO1xuXHRcdFx0eTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7XG5cdFx0XHR6MCA9IHowICogcyArIHoxICogdERpcjtcblx0XHRcdHcwID0gdzAgKiBzICsgdzEgKiB0RGlyO1xuXG5cdFx0XHQvLyBOb3JtYWxpemUgaW4gY2FzZSB3ZSBqdXN0IGRpZCBhIGxlcnA6XG5cdFx0XHRpZiAoIHMgPT09IDEgLSB0ICkge1xuXG5cdFx0XHRcdGNvbnN0IGYgPSAxIC8gTWF0aC5zcXJ0KCB4MCAqIHgwICsgeTAgKiB5MCArIHowICogejAgKyB3MCAqIHcwICk7XG5cblx0XHRcdFx0eDAgKj0gZjtcblx0XHRcdFx0eTAgKj0gZjtcblx0XHRcdFx0ejAgKj0gZjtcblx0XHRcdFx0dzAgKj0gZjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZHN0WyBkc3RPZmZzZXQgXSA9IHgwO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTA7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDtcblx0XHRkc3RbIGRzdE9mZnNldCArIDMgXSA9IHcwO1xuXG5cdH1cblxuXHRzdGF0aWMgbXVsdGlwbHlRdWF0ZXJuaW9uc0ZsYXQoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxICkge1xuXG5cdFx0Y29uc3QgeDAgPSBzcmMwWyBzcmNPZmZzZXQwIF07XG5cdFx0Y29uc3QgeTAgPSBzcmMwWyBzcmNPZmZzZXQwICsgMSBdO1xuXHRcdGNvbnN0IHowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXTtcblx0XHRjb25zdCB3MCA9IHNyYzBbIHNyY09mZnNldDAgKyAzIF07XG5cblx0XHRjb25zdCB4MSA9IHNyYzFbIHNyY09mZnNldDEgXTtcblx0XHRjb25zdCB5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF07XG5cdFx0Y29uc3QgejEgPSBzcmMxWyBzcmNPZmZzZXQxICsgMiBdO1xuXHRcdGNvbnN0IHcxID0gc3JjMVsgc3JjT2Zmc2V0MSArIDMgXTtcblxuXHRcdGRzdFsgZHN0T2Zmc2V0IF0gPSB4MCAqIHcxICsgdzAgKiB4MSArIHkwICogejEgLSB6MCAqIHkxO1xuXHRcdGRzdFsgZHN0T2Zmc2V0ICsgMSBdID0geTAgKiB3MSArIHcwICogeTEgKyB6MCAqIHgxIC0geDAgKiB6MTtcblx0XHRkc3RbIGRzdE9mZnNldCArIDIgXSA9IHowICogdzEgKyB3MCAqIHoxICsgeDAgKiB5MSAtIHkwICogeDE7XG5cdFx0ZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MCAqIHcxIC0geDAgKiB4MSAtIHkwICogeTEgLSB6MCAqIHoxO1xuXG5cdFx0cmV0dXJuIGRzdDtcblxuXHR9XG5cblx0Z2V0IHgoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feDtcblxuXHR9XG5cblx0c2V0IHgoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feCA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHkoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feTtcblxuXHR9XG5cblx0c2V0IHkoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feSA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHooKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fejtcblxuXHR9XG5cblx0c2V0IHooIHZhbHVlICkge1xuXG5cdFx0dGhpcy5feiA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0Z2V0IHcoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fdztcblxuXHR9XG5cblx0c2V0IHcoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5fdyA9IHZhbHVlO1xuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHR9XG5cblx0c2V0KCB4LCB5LCB6LCB3ICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fdyA9IHc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX3cgKTtcblxuXHR9XG5cblx0Y29weSggcXVhdGVybmlvbiApIHtcblxuXHRcdHRoaXMuX3ggPSBxdWF0ZXJuaW9uLng7XG5cdFx0dGhpcy5feSA9IHF1YXRlcm5pb24ueTtcblx0XHR0aGlzLl96ID0gcXVhdGVybmlvbi56O1xuXHRcdHRoaXMuX3cgPSBxdWF0ZXJuaW9uLnc7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUV1bGVyKCBldWxlciwgdXBkYXRlICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdC8vIGh0dHA6Ly93d3cubWF0aHdvcmtzLmNvbS9tYXRsYWJjZW50cmFsL2ZpbGVleGNoYW5nZS9cblx0XHQvLyBcdDIwNjk2LWZ1bmN0aW9uLXRvLWNvbnZlcnQtYmV0d2Vlbi1kY20tZXVsZXItYW5nbGVzLXF1YXRlcm5pb25zLWFuZC1ldWxlci12ZWN0b3JzL1xuXHRcdC8vXHRjb250ZW50L1NwaW5DYWxjLm1cblxuXHRcdGNvbnN0IGNvcyA9IE1hdGguY29zO1xuXHRcdGNvbnN0IHNpbiA9IE1hdGguc2luO1xuXG5cdFx0Y29uc3QgYzEgPSBjb3MoIHggLyAyICk7XG5cdFx0Y29uc3QgYzIgPSBjb3MoIHkgLyAyICk7XG5cdFx0Y29uc3QgYzMgPSBjb3MoIHogLyAyICk7XG5cblx0XHRjb25zdCBzMSA9IHNpbiggeCAvIDIgKTtcblx0XHRjb25zdCBzMiA9IHNpbiggeSAvIDIgKTtcblx0XHRjb25zdCBzMyA9IHNpbiggeiAvIDIgKTtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVonOlxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzICsgYzEgKiBzMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzICsgczEgKiBzMiAqIGMzO1xuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhaJzpcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMztcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWSc6XG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7XG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdaWVgnOlxuXHRcdFx0XHR0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzO1xuXHRcdFx0XHR0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzO1xuXHRcdFx0XHR0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpYJzpcblx0XHRcdFx0dGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMztcblx0XHRcdFx0dGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMztcblx0XHRcdFx0dGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMztcblx0XHRcdFx0dGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1haWSc6XG5cdFx0XHRcdHRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7XG5cdFx0XHRcdHRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7XG5cdFx0XHRcdHRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7XG5cdFx0XHRcdHRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAuc2V0RnJvbUV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtXG5cblx0XHQvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZFxuXG5cdFx0Y29uc3QgaGFsZkFuZ2xlID0gYW5nbGUgLyAyLCBzID0gTWF0aC5zaW4oIGhhbGZBbmdsZSApO1xuXG5cdFx0dGhpcy5feCA9IGF4aXMueCAqIHM7XG5cdFx0dGhpcy5feSA9IGF4aXMueSAqIHM7XG5cdFx0dGhpcy5feiA9IGF4aXMueiAqIHM7XG5cdFx0dGhpcy5fdyA9IE1hdGguY29zKCBoYWxmQW5nbGUgKTtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKSB7XG5cblx0XHQvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bVxuXG5cdFx0Ly8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZClcblxuXHRcdGNvbnN0IHRlID0gbS5lbGVtZW50cyxcblxuXHRcdFx0bTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSxcblx0XHRcdG0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sXG5cdFx0XHRtMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSxcblxuXHRcdFx0dHJhY2UgPSBtMTEgKyBtMjIgKyBtMzM7XG5cblx0XHRpZiAoIHRyYWNlID4gMCApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDAuNSAvIE1hdGguc3FydCggdHJhY2UgKyAxLjAgKTtcblxuXHRcdFx0dGhpcy5fdyA9IDAuMjUgLyBzO1xuXHRcdFx0dGhpcy5feCA9ICggbTMyIC0gbTIzICkgKiBzO1xuXHRcdFx0dGhpcy5feSA9ICggbTEzIC0gbTMxICkgKiBzO1xuXHRcdFx0dGhpcy5feiA9ICggbTIxIC0gbTEyICkgKiBzO1xuXG5cdFx0fSBlbHNlIGlmICggbTExID4gbTIyICYmIG0xMSA+IG0zMyApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0zMiAtIG0yMyApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3kgPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3ogPSAoIG0xMyArIG0zMSApIC8gcztcblxuXHRcdH0gZWxzZSBpZiAoIG0yMiA+IG0zMyApIHtcblxuXHRcdFx0Y29uc3QgcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTIyIC0gbTExIC0gbTMzICk7XG5cblx0XHRcdHRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gcztcblx0XHRcdHRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gcztcblx0XHRcdHRoaXMuX3kgPSAwLjI1ICogcztcblx0XHRcdHRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gcztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0zMyAtIG0xMSAtIG0yMiApO1xuXG5cdFx0XHR0aGlzLl93ID0gKCBtMjEgLSBtMTIgKSAvIHM7XG5cdFx0XHR0aGlzLl94ID0gKCBtMTMgKyBtMzEgKSAvIHM7XG5cdFx0XHR0aGlzLl95ID0gKCBtMjMgKyBtMzIgKSAvIHM7XG5cdFx0XHR0aGlzLl96ID0gMC4yNSAqIHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVVuaXRWZWN0b3JzKCB2RnJvbSwgdlRvICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkXG5cblx0XHRsZXQgciA9IHZGcm9tLmRvdCggdlRvICkgKyAxO1xuXG5cdFx0aWYgKCByIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdC8vIHZGcm9tIGFuZCB2VG8gcG9pbnQgaW4gb3Bwb3NpdGUgZGlyZWN0aW9uc1xuXG5cdFx0XHRyID0gMDtcblxuXHRcdFx0aWYgKCBNYXRoLmFicyggdkZyb20ueCApID4gTWF0aC5hYnMoIHZGcm9tLnogKSApIHtcblxuXHRcdFx0XHR0aGlzLl94ID0gLSB2RnJvbS55O1xuXHRcdFx0XHR0aGlzLl95ID0gdkZyb20ueDtcblx0XHRcdFx0dGhpcy5feiA9IDA7XG5cdFx0XHRcdHRoaXMuX3cgPSByO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXMuX3ggPSAwO1xuXHRcdFx0XHR0aGlzLl95ID0gLSB2RnJvbS56O1xuXHRcdFx0XHR0aGlzLl96ID0gdkZyb20ueTtcblx0XHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApOyAvLyBpbmxpbmVkIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIFZlY3RvcjNcblxuXHRcdFx0dGhpcy5feCA9IHZGcm9tLnkgKiB2VG8ueiAtIHZGcm9tLnogKiB2VG8ueTtcblx0XHRcdHRoaXMuX3kgPSB2RnJvbS56ICogdlRvLnggLSB2RnJvbS54ICogdlRvLno7XG5cdFx0XHR0aGlzLl96ID0gdkZyb20ueCAqIHZUby55IC0gdkZyb20ueSAqIHZUby54O1xuXHRcdFx0dGhpcy5fdyA9IHI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTtcblxuXHR9XG5cblx0YW5nbGVUbyggcSApIHtcblxuXHRcdHJldHVybiAyICogTWF0aC5hY29zKCBNYXRoLmFicyggTWF0aFV0aWxzLmNsYW1wKCB0aGlzLmRvdCggcSApLCAtIDEsIDEgKSApICk7XG5cblx0fVxuXG5cdHJvdGF0ZVRvd2FyZHMoIHEsIHN0ZXAgKSB7XG5cblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApO1xuXG5cdFx0aWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzO1xuXG5cdFx0Y29uc3QgdCA9IE1hdGgubWluKCAxLCBzdGVwIC8gYW5nbGUgKTtcblxuXHRcdHRoaXMuc2xlcnAoIHEsIHQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpZGVudGl0eSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggMCwgMCwgMCwgMSApO1xuXG5cdH1cblxuXHRpbnZlcnQoKSB7XG5cblx0XHQvLyBxdWF0ZXJuaW9uIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aFxuXG5cdFx0cmV0dXJuIHRoaXMuY29uanVnYXRlKCk7XG5cblx0fVxuXG5cdGNvbmp1Z2F0ZSgpIHtcblxuXHRcdHRoaXMuX3ggKj0gLSAxO1xuXHRcdHRoaXMuX3kgKj0gLSAxO1xuXHRcdHRoaXMuX3ogKj0gLSAxO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGRvdCggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLl94ICogdi5feCArIHRoaXMuX3kgKiB2Ll95ICsgdGhpcy5feiAqIHYuX3ogKyB0aGlzLl93ICogdi5fdztcblxuXHR9XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7XG5cblx0fVxuXG5cdGxlbmd0aCgpIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuX3ggKiB0aGlzLl94ICsgdGhpcy5feSAqIHRoaXMuX3kgKyB0aGlzLl96ICogdGhpcy5feiArIHRoaXMuX3cgKiB0aGlzLl93ICk7XG5cblx0fVxuXG5cdG5vcm1hbGl6ZSgpIHtcblxuXHRcdGxldCBsID0gdGhpcy5sZW5ndGgoKTtcblxuXHRcdGlmICggbCA9PT0gMCApIHtcblxuXHRcdFx0dGhpcy5feCA9IDA7XG5cdFx0XHR0aGlzLl95ID0gMDtcblx0XHRcdHRoaXMuX3ogPSAwO1xuXHRcdFx0dGhpcy5fdyA9IDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsID0gMSAvIGw7XG5cblx0XHRcdHRoaXMuX3ggPSB0aGlzLl94ICogbDtcblx0XHRcdHRoaXMuX3kgPSB0aGlzLl95ICogbDtcblx0XHRcdHRoaXMuX3ogPSB0aGlzLl96ICogbDtcblx0XHRcdHRoaXMuX3cgPSB0aGlzLl93ICogbDtcblxuXHRcdH1cblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggcSwgcCApIHtcblxuXHRcdGlmICggcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCBxLCBwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKCB0aGlzLCBxICk7XG5cblx0fVxuXG5cdHByZW11bHRpcGx5KCBxICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyggcSwgdGhpcyApO1xuXG5cdH1cblxuXHRtdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkge1xuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtXG5cblx0XHRjb25zdCBxYXggPSBhLl94LCBxYXkgPSBhLl95LCBxYXogPSBhLl96LCBxYXcgPSBhLl93O1xuXHRcdGNvbnN0IHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7XG5cblx0XHR0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5O1xuXHRcdHRoaXMuX3kgPSBxYXkgKiBxYncgKyBxYXcgKiBxYnkgKyBxYXogKiBxYnggLSBxYXggKiBxYno7XG5cdFx0dGhpcy5feiA9IHFheiAqIHFidyArIHFhdyAqIHFieiArIHFheCAqIHFieSAtIHFheSAqIHFieDtcblx0XHR0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6O1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNsZXJwKCBxYiwgdCApIHtcblxuXHRcdGlmICggdCA9PT0gMCApIHJldHVybiB0aGlzO1xuXHRcdGlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7XG5cblx0XHRjb25zdCB4ID0gdGhpcy5feCwgeSA9IHRoaXMuX3ksIHogPSB0aGlzLl96LCB3ID0gdGhpcy5fdztcblxuXHRcdC8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvcmVhbE5vcm1lZEFsZ2VicmEvcXVhdGVybmlvbnMvc2xlcnAvXG5cblx0XHRsZXQgY29zSGFsZlRoZXRhID0gdyAqIHFiLl93ICsgeCAqIHFiLl94ICsgeSAqIHFiLl95ICsgeiAqIHFiLl96O1xuXG5cdFx0aWYgKCBjb3NIYWxmVGhldGEgPCAwICkge1xuXG5cdFx0XHR0aGlzLl93ID0gLSBxYi5fdztcblx0XHRcdHRoaXMuX3ggPSAtIHFiLl94O1xuXHRcdFx0dGhpcy5feSA9IC0gcWIuX3k7XG5cdFx0XHR0aGlzLl96ID0gLSBxYi5fejtcblxuXHRcdFx0Y29zSGFsZlRoZXRhID0gLSBjb3NIYWxmVGhldGE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmNvcHkoIHFiICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGNvc0hhbGZUaGV0YSA+PSAxLjAgKSB7XG5cblx0XHRcdHRoaXMuX3cgPSB3O1xuXHRcdFx0dGhpcy5feCA9IHg7XG5cdFx0XHR0aGlzLl95ID0geTtcblx0XHRcdHRoaXMuX3ogPSB6O1xuXG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdH1cblxuXHRcdGNvbnN0IHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTtcblxuXHRcdGlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkge1xuXG5cdFx0XHRjb25zdCBzID0gMSAtIHQ7XG5cdFx0XHR0aGlzLl93ID0gcyAqIHcgKyB0ICogdGhpcy5fdztcblx0XHRcdHRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94O1xuXHRcdFx0dGhpcy5feSA9IHMgKiB5ICsgdCAqIHRoaXMuX3k7XG5cdFx0XHR0aGlzLl96ID0gcyAqIHogKyB0ICogdGhpcy5fejtcblxuXHRcdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0XHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBzaW5IYWxmVGhldGEgPSBNYXRoLnNxcnQoIHNxclNpbkhhbGZUaGV0YSApO1xuXHRcdGNvbnN0IGhhbGZUaGV0YSA9IE1hdGguYXRhbjIoIHNpbkhhbGZUaGV0YSwgY29zSGFsZlRoZXRhICk7XG5cdFx0Y29uc3QgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLFxuXHRcdFx0cmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTtcblxuXHRcdHRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7XG5cdFx0dGhpcy5feCA9ICggeCAqIHJhdGlvQSArIHRoaXMuX3ggKiByYXRpb0IgKTtcblx0XHR0aGlzLl95ID0gKCB5ICogcmF0aW9BICsgdGhpcy5feSAqIHJhdGlvQiApO1xuXHRcdHRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkge1xuXG5cdFx0dGhpcy5jb3B5KCBxYSApLnNsZXJwKCBxYiwgdCApO1xuXG5cdH1cblxuXHRlcXVhbHMoIHF1YXRlcm5pb24gKSB7XG5cblx0XHRyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdO1xuXHRcdHRoaXMuX3kgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMuX3ogPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXHRcdHRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdO1xuXG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLl94O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAzIF0gPSB0aGlzLl93O1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xuXG5cdFx0dGhpcy5feCA9IGF0dHJpYnV0ZS5nZXRYKCBpbmRleCApO1xuXHRcdHRoaXMuX3kgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLl96ID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cdFx0dGhpcy5fdyA9IGF0dHJpYnV0ZS5nZXRXKCBpbmRleCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxuXG59XG5cblF1YXRlcm5pb24ucHJvdG90eXBlLmlzUXVhdGVybmlvbiA9IHRydWU7XG5cbmNsYXNzIFZlY3RvcjMge1xuXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwICkge1xuXG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cblx0fVxuXG5cdHNldCggeCwgeSwgeiApIHtcblxuXHRcdGlmICggeiA9PT0gdW5kZWZpbmVkICkgeiA9IHRoaXMuejsgLy8gc3ByaXRlLnNjYWxlLnNldCh4LHkpXG5cblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMueCA9IHNjYWxhcjtcblx0XHR0aGlzLnkgPSBzY2FsYXI7XG5cdFx0dGhpcy56ID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFgoIHggKSB7XG5cblx0XHR0aGlzLnggPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFkoIHkgKSB7XG5cblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFooIHogKSB7XG5cblx0XHR0aGlzLnogPSB6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudCggaW5kZXgsIHZhbHVlICkge1xuXG5cdFx0c3dpdGNoICggaW5kZXggKSB7XG5cblx0XHRcdGNhc2UgMDogdGhpcy54ID0gdmFsdWU7IGJyZWFrO1xuXHRcdFx0Y2FzZSAxOiB0aGlzLnkgPSB2YWx1ZTsgYnJlYWs7XG5cdFx0XHRjYXNlIDI6IHRoaXMueiA9IHZhbHVlOyBicmVhaztcblx0XHRcdGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q29tcG9uZW50KCBpbmRleCApIHtcblxuXHRcdHN3aXRjaCAoIGluZGV4ICkge1xuXG5cdFx0XHRjYXNlIDA6IHJldHVybiB0aGlzLng7XG5cdFx0XHRjYXNlIDE6IHJldHVybiB0aGlzLnk7XG5cdFx0XHRjYXNlIDI6IHJldHVybiB0aGlzLno7XG5cdFx0XHRkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy54LCB0aGlzLnksIHRoaXMueiApO1xuXG5cdH1cblxuXHRjb3B5KCB2ICkge1xuXG5cdFx0dGhpcy54ID0gdi54O1xuXHRcdHRoaXMueSA9IHYueTtcblx0XHR0aGlzLnogPSB2Lno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggKz0gdi54O1xuXHRcdHRoaXMueSArPSB2Lnk7XG5cdFx0dGhpcy56ICs9IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggKz0gcztcblx0XHR0aGlzLnkgKz0gcztcblx0XHR0aGlzLnogKz0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGRWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54ICsgYi54O1xuXHRcdHRoaXMueSA9IGEueSArIGIueTtcblx0XHR0aGlzLnogPSBhLnogKyBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkU2NhbGVkVmVjdG9yKCB2LCBzICkge1xuXG5cdFx0dGhpcy54ICs9IHYueCAqIHM7XG5cdFx0dGhpcy55ICs9IHYueSAqIHM7XG5cdFx0dGhpcy56ICs9IHYueiAqIHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3ViKCB2LCB3ICkge1xuXG5cdFx0aWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggLT0gdi54O1xuXHRcdHRoaXMueSAtPSB2Lnk7XG5cdFx0dGhpcy56IC09IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJTY2FsYXIoIHMgKSB7XG5cblx0XHR0aGlzLnggLT0gcztcblx0XHR0aGlzLnkgLT0gcztcblx0XHR0aGlzLnogLT0gcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzdWJWZWN0b3JzKCBhLCBiICkge1xuXG5cdFx0dGhpcy54ID0gYS54IC0gYi54O1xuXHRcdHRoaXMueSA9IGEueSAtIGIueTtcblx0XHR0aGlzLnogPSBhLnogLSBiLno7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHkoIHYsIHcgKSB7XG5cblx0XHRpZiAoIHcgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseVZlY3RvcnMoIHYsIHcgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMueCAqPSB2Lng7XG5cdFx0dGhpcy55ICo9IHYueTtcblx0XHR0aGlzLnogKj0gdi56O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLnggKj0gc2NhbGFyO1xuXHRcdHRoaXMueSAqPSBzY2FsYXI7XG5cdFx0dGhpcy56ICo9IHNjYWxhcjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVZlY3RvcnMoIGEsIGIgKSB7XG5cblx0XHR0aGlzLnggPSBhLnggKiBiLng7XG5cdFx0dGhpcy55ID0gYS55ICogYi55O1xuXHRcdHRoaXMueiA9IGEueiAqIGIuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseUV1bGVyKCBldWxlciApIHtcblxuXHRcdGlmICggISAoIGV1bGVyICYmIGV1bGVyLmlzRXVsZXIgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseUV1bGVyKCkgbm93IGV4cGVjdHMgYW4gRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDQuc2V0RnJvbUV1bGVyKCBldWxlciApICk7XG5cblx0fVxuXG5cdGFwcGx5QXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbiggX3F1YXRlcm5pb24kNC5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApICk7XG5cblx0fVxuXG5cdGFwcGx5TWF0cml4MyggbSApIHtcblxuXHRcdGNvbnN0IHggPSB0aGlzLngsIHkgPSB0aGlzLnksIHogPSB0aGlzLno7XG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAwIF0gKiB4ICsgZVsgMyBdICogeSArIGVbIDYgXSAqIHo7XG5cdFx0dGhpcy55ID0gZVsgMSBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA3IF0gKiB6O1xuXHRcdHRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcHBseU5vcm1hbE1hdHJpeCggbSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4MyggbSApLm5vcm1hbGl6ZSgpO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG0gKSB7XG5cblx0XHRjb25zdCB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56O1xuXHRcdGNvbnN0IGUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0Y29uc3QgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7XG5cblx0XHR0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7XG5cdFx0dGhpcy55ID0gKCBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHogKyBlWyAxMyBdICkgKiB3O1xuXHRcdHRoaXMueiA9ICggZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogeiArIGVbIDE0IF0gKSAqIHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YXBwbHlRdWF0ZXJuaW9uKCBxICkge1xuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHRjb25zdCBxeCA9IHEueCwgcXkgPSBxLnksIHF6ID0gcS56LCBxdyA9IHEudztcblxuXHRcdC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjdG9yXG5cblx0XHRjb25zdCBpeCA9IHF3ICogeCArIHF5ICogeiAtIHF6ICogeTtcblx0XHRjb25zdCBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogejtcblx0XHRjb25zdCBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDtcblx0XHRjb25zdCBpdyA9IC0gcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG5cdFx0Ly8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuXG5cdFx0dGhpcy54ID0gaXggKiBxdyArIGl3ICogLSBxeCArIGl5ICogLSBxeiAtIGl6ICogLSBxeTtcblx0XHR0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6O1xuXHRcdHRoaXMueiA9IGl6ICogcXcgKyBpdyAqIC0gcXogKyBpeCAqIC0gcXkgLSBpeSAqIC0gcXg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cHJvamVjdCggY2FtZXJhICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdH1cblxuXHR1bnByb2plY3QoIGNhbWVyYSApIHtcblxuXHRcdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHR9XG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uKCBtICkge1xuXG5cdFx0Ly8gaW5wdXQ6IFRIUkVFLk1hdHJpeDQgYWZmaW5lIG1hdHJpeFxuXHRcdC8vIHZlY3RvciBpbnRlcnByZXRlZCBhcyBhIGRpcmVjdGlvblxuXG5cdFx0Y29uc3QgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejtcblx0XHRjb25zdCBlID0gbS5lbGVtZW50cztcblxuXHRcdHRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogejtcblx0XHR0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7XG5cdFx0dGhpcy56ID0gZVsgMiBdICogeCArIGVbIDYgXSAqIHkgKyBlWyAxMCBdICogejtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZSgpO1xuXG5cdH1cblxuXHRkaXZpZGUoIHYgKSB7XG5cblx0XHR0aGlzLnggLz0gdi54O1xuXHRcdHRoaXMueSAvPSB2Lnk7XG5cdFx0dGhpcy56IC89IHYuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkaXZpZGVTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7XG5cblx0fVxuXG5cdG1pbiggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWluKCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1heCggdiApIHtcblxuXHRcdHRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCB0aGlzLnksIHYueSApO1xuXHRcdHRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsYW1wKCBtaW4sIG1heCApIHtcblxuXHRcdC8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlXG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTtcblx0XHR0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTtcblx0XHR0aGlzLnogPSBNYXRoLm1heCggbWluLnosIE1hdGgubWluKCBtYXgueiwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcFNjYWxhciggbWluVmFsLCBtYXhWYWwgKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApO1xuXHRcdHRoaXMueSA9IE1hdGgubWF4KCBtaW5WYWwsIE1hdGgubWluKCBtYXhWYWwsIHRoaXMueSApICk7XG5cdFx0dGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGFtcExlbmd0aCggbWluLCBtYXggKSB7XG5cblx0XHRjb25zdCBsZW5ndGggPSB0aGlzLmxlbmd0aCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7XG5cblx0fVxuXG5cdGZsb29yKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5mbG9vciggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2VpbCgpIHtcblxuXHRcdHRoaXMueCA9IE1hdGguY2VpbCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHJvdW5kKCkge1xuXG5cdFx0dGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7XG5cdFx0dGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7XG5cdFx0dGhpcy56ID0gTWF0aC5yb3VuZCggdGhpcy56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cm91bmRUb1plcm8oKSB7XG5cblx0XHR0aGlzLnggPSAoIHRoaXMueCA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy54ICkgOiBNYXRoLmZsb29yKCB0aGlzLnggKTtcblx0XHR0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTtcblx0XHR0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRuZWdhdGUoKSB7XG5cblx0XHR0aGlzLnggPSAtIHRoaXMueDtcblx0XHR0aGlzLnkgPSAtIHRoaXMueTtcblx0XHR0aGlzLnogPSAtIHRoaXMuejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRkb3QoIHYgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56O1xuXG5cdH1cblxuXHQvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/XG5cblx0bGVuZ3RoU3EoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56O1xuXG5cdH1cblxuXHRsZW5ndGgoKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKyB0aGlzLnogKiB0aGlzLnogKTtcblxuXHR9XG5cblx0bWFuaGF0dGFuTGVuZ3RoKCkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggKSArIE1hdGguYWJzKCB0aGlzLnkgKSArIE1hdGguYWJzKCB0aGlzLnogKTtcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTtcblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggbGVuZ3RoICk7XG5cblx0fVxuXG5cdGxlcnAoIHYsIGFscGhhICkge1xuXG5cdFx0dGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTtcblx0XHR0aGlzLnkgKz0gKCB2LnkgLSB0aGlzLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bGVycFZlY3RvcnMoIHYxLCB2MiwgYWxwaGEgKSB7XG5cblx0XHR0aGlzLnggPSB2MS54ICsgKCB2Mi54IC0gdjEueCApICogYWxwaGE7XG5cdFx0dGhpcy55ID0gdjEueSArICggdjIueSAtIHYxLnkgKSAqIGFscGhhO1xuXHRcdHRoaXMueiA9IHYxLnogKyAoIHYyLnogLSB2MS56ICkgKiBhbHBoYTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjcm9zcyggdiwgdyApIHtcblxuXHRcdGlmICggdyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuY3Jvc3MoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5jcm9zc1ZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmNyb3NzVmVjdG9ycyggdiwgdyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB0aGlzLCB2ICk7XG5cblx0fVxuXG5cdGNyb3NzVmVjdG9ycyggYSwgYiApIHtcblxuXHRcdGNvbnN0IGF4ID0gYS54LCBheSA9IGEueSwgYXogPSBhLno7XG5cdFx0Y29uc3QgYnggPSBiLngsIGJ5ID0gYi55LCBieiA9IGIuejtcblxuXHRcdHRoaXMueCA9IGF5ICogYnogLSBheiAqIGJ5O1xuXHRcdHRoaXMueSA9IGF6ICogYnggLSBheCAqIGJ6O1xuXHRcdHRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHByb2plY3RPblZlY3RvciggdiApIHtcblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdi5sZW5ndGhTcSgpO1xuXG5cdFx0aWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHJldHVybiB0aGlzLnNldCggMCwgMCwgMCApO1xuXG5cdFx0Y29uc3Qgc2NhbGFyID0gdi5kb3QoIHRoaXMgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weSggdiApLm11bHRpcGx5U2NhbGFyKCBzY2FsYXIgKTtcblxuXHR9XG5cblx0cHJvamVjdE9uUGxhbmUoIHBsYW5lTm9ybWFsICkge1xuXG5cdFx0X3ZlY3RvciRjLmNvcHkoIHRoaXMgKS5wcm9qZWN0T25WZWN0b3IoIHBsYW5lTm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IkYyApO1xuXG5cdH1cblxuXHRyZWZsZWN0KCBub3JtYWwgKSB7XG5cblx0XHQvLyByZWZsZWN0IGluY2lkZW50IHZlY3RvciBvZmYgcGxhbmUgb3J0aG9nb25hbCB0byBub3JtYWxcblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBoYXZlIHVuaXQgbGVuZ3RoXG5cblx0XHRyZXR1cm4gdGhpcy5zdWIoIF92ZWN0b3IkYy5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7XG5cblx0fVxuXG5cdGFuZ2xlVG8oIHYgKSB7XG5cblx0XHRjb25zdCBkZW5vbWluYXRvciA9IE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkgcmV0dXJuIE1hdGguUEkgLyAyO1xuXG5cdFx0Y29uc3QgdGhldGEgPSB0aGlzLmRvdCggdiApIC8gZGVub21pbmF0b3I7XG5cblx0XHQvLyBjbGFtcCwgdG8gaGFuZGxlIG51bWVyaWNhbCBwcm9ibGVtc1xuXG5cdFx0cmV0dXJuIE1hdGguYWNvcyggTWF0aFV0aWxzLmNsYW1wKCB0aGV0YSwgLSAxLCAxICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUbyggdiApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApO1xuXG5cdH1cblxuXHRkaXN0YW5jZVRvU3F1YXJlZCggdiApIHtcblxuXHRcdGNvbnN0IGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7XG5cblx0XHRyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6O1xuXG5cdH1cblxuXHRtYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICkge1xuXG5cdFx0cmV0dXJuIE1hdGguYWJzKCB0aGlzLnggLSB2LnggKSArIE1hdGguYWJzKCB0aGlzLnkgLSB2LnkgKSArIE1hdGguYWJzKCB0aGlzLnogLSB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbVNwaGVyaWNhbCggcyApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoIHMucmFkaXVzLCBzLnBoaSwgcy50aGV0YSApO1xuXG5cdH1cblxuXHRzZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHRjb25zdCBzaW5QaGlSYWRpdXMgPSBNYXRoLnNpbiggcGhpICkgKiByYWRpdXM7XG5cblx0XHR0aGlzLnggPSBzaW5QaGlSYWRpdXMgKiBNYXRoLnNpbiggdGhldGEgKTtcblx0XHR0aGlzLnkgPSBNYXRoLmNvcyggcGhpICkgKiByYWRpdXM7XG5cdFx0dGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUN5bGluZHJpY2FsKCBjICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzKCBjLnJhZGl1cywgYy50aGV0YSwgYy55ICk7XG5cblx0fVxuXG5cdHNldEZyb21DeWxpbmRyaWNhbENvb3JkcyggcmFkaXVzLCB0aGV0YSwgeSApIHtcblxuXHRcdHRoaXMueCA9IHJhZGl1cyAqIE1hdGguc2luKCB0aGV0YSApO1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICkge1xuXG5cdFx0Y29uc3QgZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0aGlzLnggPSBlWyAxMiBdO1xuXHRcdHRoaXMueSA9IGVbIDEzIF07XG5cdFx0dGhpcy56ID0gZVsgMTQgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tTWF0cml4U2NhbGUoIG0gKSB7XG5cblx0XHRjb25zdCBzeCA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHN5ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0Y29uc3Qgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRoaXMueCA9IHN4O1xuXHRcdHRoaXMueSA9IHN5O1xuXHRcdHRoaXMueiA9IHN6O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21NYXRyaXhDb2x1bW4oIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDQgKTtcblxuXHR9XG5cblx0c2V0RnJvbU1hdHJpeDNDb2x1bW4oIG0sIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZnJvbUFycmF5KCBtLmVsZW1lbnRzLCBpbmRleCAqIDMgKTtcblxuXHR9XG5cblx0ZXF1YWxzKCB2ICkge1xuXG5cdFx0cmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTtcblxuXHR9XG5cblx0ZnJvbUFycmF5KCBhcnJheSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdHRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTtcblx0XHR0aGlzLnkgPSBhcnJheVsgb2Zmc2V0ICsgMSBdO1xuXHRcdHRoaXMueiA9IGFycmF5WyBvZmZzZXQgKyAyIF07XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGhpcy55O1xuXHRcdGFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLno7XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdGZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApIHtcblxuXHRcdGlmICggb2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTtcblx0XHR0aGlzLnkgPSBhdHRyaWJ1dGUuZ2V0WSggaW5kZXggKTtcblx0XHR0aGlzLnogPSBhdHRyaWJ1dGUuZ2V0WiggaW5kZXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyYW5kb20oKSB7XG5cblx0XHR0aGlzLnggPSBNYXRoLnJhbmRvbSgpO1xuXHRcdHRoaXMueSA9IE1hdGgucmFuZG9tKCk7XG5cdFx0dGhpcy56ID0gTWF0aC5yYW5kb20oKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5WZWN0b3IzLnByb3RvdHlwZS5pc1ZlY3RvcjMgPSB0cnVlO1xuXG5jb25zdCBfdmVjdG9yJGMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfcXVhdGVybmlvbiQ0ID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xuXG5jbGFzcyBCb3gzIHtcblxuXHRjb25zdHJ1Y3RvciggbWluID0gbmV3IFZlY3RvcjMoICsgSW5maW5pdHksICsgSW5maW5pdHksICsgSW5maW5pdHkgKSwgbWF4ID0gbmV3IFZlY3RvcjMoIC0gSW5maW5pdHksIC0gSW5maW5pdHksIC0gSW5maW5pdHkgKSApIHtcblxuXHRcdHRoaXMubWluID0gbWluO1xuXHRcdHRoaXMubWF4ID0gbWF4O1xuXG5cdH1cblxuXHRzZXQoIG1pbiwgbWF4ICkge1xuXG5cdFx0dGhpcy5taW4uY29weSggbWluICk7XG5cdFx0dGhpcy5tYXguY29weSggbWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbUFycmF5KCBhcnJheSApIHtcblxuXHRcdGxldCBtaW5YID0gKyBJbmZpbml0eTtcblx0XHRsZXQgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0bGV0IG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0bGV0IG1heFggPSAtIEluZmluaXR5O1xuXHRcdGxldCBtYXhZID0gLSBJbmZpbml0eTtcblx0XHRsZXQgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7XG5cblx0XHRcdGNvbnN0IHggPSBhcnJheVsgaSBdO1xuXHRcdFx0Y29uc3QgeSA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0Y29uc3QgeiA9IGFycmF5WyBpICsgMiBdO1xuXG5cdFx0XHRpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7XG5cdFx0XHRpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7XG5cdFx0XHRpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7XG5cblx0XHRcdGlmICggeCA+IG1heFggKSBtYXhYID0geDtcblx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblx0XHRcdGlmICggeiA+IG1heFogKSBtYXhaID0gejtcblxuXHRcdH1cblxuXHRcdHRoaXMubWluLnNldCggbWluWCwgbWluWSwgbWluWiApO1xuXHRcdHRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIHtcblxuXHRcdGxldCBtaW5YID0gKyBJbmZpbml0eTtcblx0XHRsZXQgbWluWSA9ICsgSW5maW5pdHk7XG5cdFx0bGV0IG1pblogPSArIEluZmluaXR5O1xuXG5cdFx0bGV0IG1heFggPSAtIEluZmluaXR5O1xuXHRcdGxldCBtYXhZID0gLSBJbmZpbml0eTtcblx0XHRsZXQgbWF4WiA9IC0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTtcblx0XHRcdGNvbnN0IHkgPSBhdHRyaWJ1dGUuZ2V0WSggaSApO1xuXHRcdFx0Y29uc3QgeiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7XG5cblx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdGlmICggeSA8IG1pblkgKSBtaW5ZID0geTtcblx0XHRcdGlmICggeiA8IG1pblogKSBtaW5aID0gejtcblxuXHRcdFx0aWYgKCB4ID4gbWF4WCApIG1heFggPSB4O1xuXHRcdFx0aWYgKCB5ID4gbWF4WSApIG1heFkgPSB5O1xuXHRcdFx0aWYgKCB6ID4gbWF4WiApIG1heFogPSB6O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7XG5cdFx0dGhpcy5tYXguc2V0KCBtYXhYLCBtYXhZLCBtYXhaICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVBvaW50cyggcG9pbnRzICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuZXhwYW5kQnlQb2ludCggcG9pbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tQ2VudGVyQW5kU2l6ZSggY2VudGVyLCBzaXplICkge1xuXG5cdFx0Y29uc3QgaGFsZlNpemUgPSBfdmVjdG9yJGIuY29weSggc2l6ZSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0dGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzLmV4cGFuZEJ5T2JqZWN0KCBvYmplY3QgKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdGNvcHkoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUVtcHR5KCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTtcblx0XHR0aGlzLm1heC54ID0gdGhpcy5tYXgueSA9IHRoaXMubWF4LnogPSAtIEluZmluaXR5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGlzRW1wdHkoKSB7XG5cblx0XHQvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlc1xuXG5cdFx0cmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApO1xuXG5cdH1cblxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fVxuXG5cdGdldFNpemUoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fVxuXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeU9iamVjdCggb2JqZWN0ICkge1xuXG5cdFx0Ly8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSxcblx0XHQvLyBhY2NvdW50aW5nIGZvciBib3RoIHRoZSBvYmplY3QncywgYW5kIGNoaWxkcmVuJ3MsIHdvcmxkIHRyYW5zZm9ybXNcblxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIGZhbHNlICk7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfYm94JDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdCb3ggKTtcblx0XHRcdF9ib3gkMy5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHR0aGlzLnVuaW9uKCBfYm94JDMgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeU9iamVjdCggY2hpbGRyZW5bIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvbnRhaW5zUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0cmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fFxuXHRcdFx0cG9pbnQueiA8IHRoaXMubWluLnogfHwgcG9pbnQueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55ICYmXG5cdFx0XHR0aGlzLm1pbi56IDw9IGJveC5taW4ueiAmJiBib3gubWF4LnogPD0gdGhpcy5tYXguejtcblxuXHR9XG5cblx0Z2V0UGFyYW1ldGVyKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Ly8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3hcblx0XHQvLyBoYXMgYSBzaXplIGRpbWVuc2lvbiBvZiAwLlxuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoXG5cdFx0XHQoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksXG5cdFx0XHQoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICksXG5cdFx0XHQoIHBvaW50LnogLSB0aGlzLm1pbi56ICkgLyAoIHRoaXMubWF4LnogLSB0aGlzLm1pbi56IClcblx0XHQpO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHQvLyB1c2luZyA2IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucy5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgfHxcblx0XHRcdGJveC5tYXgueiA8IHRoaXMubWluLnogfHwgYm94Lm1pbi56ID4gdGhpcy5tYXgueiA/IGZhbHNlIDogdHJ1ZTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0Ly8gRmluZCB0aGUgcG9pbnQgb24gdGhlIEFBQkIgY2xvc2VzdCB0byB0aGUgc3BoZXJlIGNlbnRlci5cblx0XHR0aGlzLmNsYW1wUG9pbnQoIHNwaGVyZS5jZW50ZXIsIF92ZWN0b3IkYiApO1xuXG5cdFx0Ly8gSWYgdGhhdCBwb2ludCBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgdGhlIEFBQkIgYW5kIHNwaGVyZSBpbnRlcnNlY3QuXG5cdFx0cmV0dXJuIF92ZWN0b3IkYi5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApIHtcblxuXHRcdC8vIFdlIGNvbXB1dGUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gZG90IHByb2R1Y3QgdmFsdWVzLiBJZiB0aG9zZSB2YWx1ZXNcblx0XHQvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi5cblxuXHRcdGxldCBtaW4sIG1heDtcblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnggPiAwICkge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWF4Lng7XG5cdFx0XHRtYXggPSBwbGFuZS5ub3JtYWwueCAqIHRoaXMubWluLng7XG5cblx0XHR9XG5cblx0XHRpZiAoIHBsYW5lLm5vcm1hbC55ID4gMCApIHtcblxuXHRcdFx0bWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblx0XHRcdG1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1heC55O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTtcblxuXHRcdH1cblxuXHRcdGlmICggcGxhbmUubm9ybWFsLnogPiAwICkge1xuXG5cdFx0XHRtaW4gKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXHRcdFx0bWF4ICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5tYXguejtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdG1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7XG5cdFx0XHRtYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuICggbWluIDw9IC0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IC0gcGxhbmUuY29uc3RhbnQgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1RyaWFuZ2xlKCB0cmlhbmdsZSApIHtcblxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdC8vIGNvbXB1dGUgYm94IGNlbnRlciBhbmQgZXh0ZW50c1xuXHRcdHRoaXMuZ2V0Q2VudGVyKCBfY2VudGVyICk7XG5cdFx0X2V4dGVudHMuc3ViVmVjdG9ycyggdGhpcy5tYXgsIF9jZW50ZXIgKTtcblxuXHRcdC8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpblxuXHRcdF92MCQyLnN1YlZlY3RvcnMoIHRyaWFuZ2xlLmEsIF9jZW50ZXIgKTtcblx0XHRfdjEkNy5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBfY2VudGVyICk7XG5cdFx0X3YyJDMuc3ViVmVjdG9ycyggdHJpYW5nbGUuYywgX2NlbnRlciApO1xuXG5cdFx0Ly8gY29tcHV0ZSBlZGdlIHZlY3RvcnMgZm9yIHRyaWFuZ2xlXG5cdFx0X2YwLnN1YlZlY3RvcnMoIF92MSQ3LCBfdjAkMiApO1xuXHRcdF9mMS5zdWJWZWN0b3JzKCBfdjIkMywgX3YxJDcgKTtcblx0XHRfZjIuc3ViVmVjdG9ycyggX3YwJDIsIF92MiQzICk7XG5cblx0XHQvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmJcblx0XHQvLyBtYWtlIGFuIGF4aXMgdGVzdGluZyBvZiBlYWNoIG9mIHRoZSAzIHNpZGVzIG9mIHRoZSBhYWJiIGFnYWluc3QgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgdHJpYW5nbGUgPSA5IGF4aXMgb2Ygc2VwYXJhdGlvblxuXHRcdC8vIGF4aXNfaWogPSB1X2kgeCBmX2ogKHUwLCB1MSwgdTIgPSBmYWNlIG5vcm1hbHMgb2YgYWFiYiA9IHgseSx6IGF4ZXMgdmVjdG9ycyBzaW5jZSBhYWJiIGlzIGF4aXMgYWxpZ25lZClcblx0XHRsZXQgYXhlcyA9IFtcblx0XHRcdDAsIC0gX2YwLnosIF9mMC55LCAwLCAtIF9mMS56LCBfZjEueSwgMCwgLSBfZjIueiwgX2YyLnksXG5cdFx0XHRfZjAueiwgMCwgLSBfZjAueCwgX2YxLnosIDAsIC0gX2YxLngsIF9mMi56LCAwLCAtIF9mMi54LFxuXHRcdFx0LSBfZjAueSwgX2YwLngsIDAsIC0gX2YxLnksIF9mMS54LCAwLCAtIF9mMi55LCBfZjIueCwgMFxuXHRcdF07XG5cdFx0aWYgKCAhIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCQyLCBfdjEkNywgX3YyJDMsIF9leHRlbnRzICkgKSB7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdC8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYlxuXHRcdGF4ZXMgPSBbIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgXTtcblx0XHRpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwJDIsIF92MSQ3LCBfdjIkMywgX2V4dGVudHMgKSApIHtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGVcblx0XHQvLyB1c2UgYWxyZWFkeSBleGlzdGluZyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMgaGVyZVxuXHRcdF90cmlhbmdsZU5vcm1hbC5jcm9zc1ZlY3RvcnMoIF9mMCwgX2YxICk7XG5cdFx0YXhlcyA9IFsgX3RyaWFuZ2xlTm9ybWFsLngsIF90cmlhbmdsZU5vcm1hbC55LCBfdHJpYW5nbGVOb3JtYWwueiBdO1xuXG5cdFx0cmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCQyLCBfdjEkNywgX3YyJDMsIF9leHRlbnRzICk7XG5cblx0fVxuXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdGNvbnN0IGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkYi5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHRcdHJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpO1xuXG5cdH1cblxuXHRnZXRCb3VuZGluZ1NwaGVyZSggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJveDM6IC5nZXRCb3VuZGluZ1NwaGVyZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHQvL3RhcmdldCA9IG5ldyBTcGhlcmUoKTsgLy8gcmVtb3ZlZCB0byBhdm9pZCBjeWNsaWMgZGVwZW5kZW5jeVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5nZXRDZW50ZXIoIHRhcmdldC5jZW50ZXIgKTtcblxuXHRcdHRhcmdldC5yYWRpdXMgPSB0aGlzLmdldFNpemUoIF92ZWN0b3IkYiApLmxlbmd0aCgpICogMC41O1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0aW50ZXJzZWN0KCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdC8vIGVuc3VyZSB0aGF0IGlmIHRoZXJlIGlzIG5vIG92ZXJsYXAsIHRoZSByZXN1bHQgaXMgZnVsbHkgZW1wdHksIG5vdCBzbGlnaHRseSBlbXB0eSB3aXRoIG5vbi1pbmYvK2luZiB2YWx1ZXMgdGhhdCB3aWxsIGNhdXNlIHN1YnNlcXVlbmNlIGludGVyc2VjdHMgdG8gZXJyb25lb3VzbHkgcmV0dXJuIHZhbGlkIHZhbHVlcy5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgdGhpcy5tYWtlRW1wdHkoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR1bmlvbiggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YXBwbHlNYXRyaXg0KCBtYXRyaXggKSB7XG5cblx0XHQvLyB0cmFuc2Zvcm0gb2YgZW1wdHkgYm94IGlzIGFuIGVtcHR5IGJveC5cblx0XHRpZiAoIHRoaXMuaXNFbXB0eSgpICkgcmV0dXJuIHRoaXM7XG5cblx0XHQvLyBOT1RFOiBJIGFtIHVzaW5nIGEgYmluYXJ5IHBhdHRlcm4gdG8gc3BlY2lmeSBhbGwgMl4zIGNvbWJpbmF0aW9ucyBiZWxvd1xuXHRcdF9wb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDBcblx0XHRfcG9pbnRzWyAxIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDAxXG5cdFx0X3BvaW50c1sgMiBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5tYXgueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAxMFxuXHRcdF9wb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTFcblx0XHRfcG9pbnRzWyA0IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAwXG5cdFx0X3BvaW50c1sgNSBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMVxuXHRcdF9wb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTBcblx0XHRfcG9pbnRzWyA3IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1heC55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTExXG5cblx0XHR0aGlzLnNldEZyb21Qb2ludHMoIF9wb2ludHMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0cmFuc2xhdGUoIG9mZnNldCApIHtcblxuXHRcdHRoaXMubWluLmFkZCggb2Zmc2V0ICk7XG5cdFx0dGhpcy5tYXguYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIGJveCApIHtcblxuXHRcdHJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTtcblxuXHR9XG5cbn1cblxuQm94My5wcm90b3R5cGUuaXNCb3gzID0gdHJ1ZTtcblxuY29uc3QgX3BvaW50cyA9IFtcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKClcbl07XG5cbmNvbnN0IF92ZWN0b3IkYiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX2JveCQzID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xuXG4vLyB0cmlhbmdsZSBjZW50ZXJlZCB2ZXJ0aWNlc1xuXG5jb25zdCBfdjAkMiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MSQ3ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3YyJDMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbi8vIHRyaWFuZ2xlIGVkZ2UgdmVjdG9yc1xuXG5jb25zdCBfZjAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZjEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZjIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF9jZW50ZXIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZXh0ZW50cyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90cmlhbmdsZU5vcm1hbCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90ZXN0QXhpcyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gc2F0Rm9yQXhlcyggYXhlcywgdjAsIHYxLCB2MiwgZXh0ZW50cyApIHtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkge1xuXG5cdFx0X3Rlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApO1xuXHRcdC8vIHByb2plY3QgdGhlIGFhYmIgb250byB0aGUgc2VwZXJhdGluZyBheGlzXG5cdFx0Y29uc3QgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCBfdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIF90ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggX3Rlc3RBeGlzLnogKTtcblx0XHQvLyBwcm9qZWN0IGFsbCAzIHZlcnRpY2VzIG9mIHRoZSB0cmlhbmdsZSBvbnRvIHRoZSBzZXBlcmF0aW5nIGF4aXNcblx0XHRjb25zdCBwMCA9IHYwLmRvdCggX3Rlc3RBeGlzICk7XG5cdFx0Y29uc3QgcDEgPSB2MS5kb3QoIF90ZXN0QXhpcyApO1xuXHRcdGNvbnN0IHAyID0gdjIuZG90KCBfdGVzdEF4aXMgKTtcblx0XHQvLyBhY3R1YWwgdGVzdCwgYmFzaWNhbGx5IHNlZSBpZiBlaXRoZXIgb2YgdGhlIG1vc3QgZXh0cmVtZSBvZiB0aGUgdHJpYW5nbGUgcG9pbnRzIGludGVyc2VjdHMgclxuXHRcdGlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHtcblxuXHRcdFx0Ly8gcG9pbnRzIG9mIHRoZSBwcm9qZWN0ZWQgdHJpYW5nbGUgYXJlIG91dHNpZGUgdGhlIHByb2plY3RlZCBoYWxmLWxlbmd0aCBvZiB0aGUgYWFiYlxuXHRcdFx0Ly8gdGhlIGF4aXMgaXMgc2VwZXJhdGluZyBhbmQgd2UgY2FuIGV4aXRcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHRydWU7XG5cbn1cblxuY29uc3QgX2JveCQyID0gLypAX19QVVJFX18qLyBuZXcgQm94MygpO1xuY29uc3QgX3YxJDYgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdG9GYXJ0aGVzdFBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3RvUG9pbnQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIFNwaGVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGNlbnRlciA9IG5ldyBWZWN0b3IzKCksIHJhZGl1cyA9IC0gMSApIHtcblxuXHRcdHRoaXMuY2VudGVyID0gY2VudGVyO1xuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXG5cdH1cblxuXHRzZXQoIGNlbnRlciwgcmFkaXVzICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuY29weSggY2VudGVyICk7XG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0RnJvbVBvaW50cyggcG9pbnRzLCBvcHRpb25hbENlbnRlciApIHtcblxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0aWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjZW50ZXIuY29weSggb3B0aW9uYWxDZW50ZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9ib3gkMi5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKS5nZXRDZW50ZXIoIGNlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IG1heFJhZGl1c1NxID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdG1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50c1sgaSBdICkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCBtYXhSYWRpdXNTcSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNwaGVyZSApIHtcblxuXHRcdHRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTtcblx0XHR0aGlzLnJhZGl1cyA9IHNwaGVyZS5yYWRpdXM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0aXNFbXB0eSgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMucmFkaXVzIDwgMCApO1xuXG5cdH1cblxuXHRtYWtlRW1wdHkoKSB7XG5cblx0XHR0aGlzLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHR0aGlzLnJhZGl1cyA9IC0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiAoIHBvaW50LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmNlbnRlciApIDw9ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICk7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSB7XG5cblx0XHRyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0Y29uc3QgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzO1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzU3BoZXJlKCB0aGlzICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNQbGFuZSggcGxhbmUgKSB7XG5cblx0XHRyZXR1cm4gTWF0aC5hYnMoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5jZW50ZXIgKSApIDw9IHRoaXMucmFkaXVzO1xuXG5cdH1cblxuXHRjbGFtcFBvaW50KCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZGVsdGFMZW5ndGhTcSA9IHRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0dGFyZ2V0LmNvcHkoIHBvaW50ICk7XG5cblx0XHRpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHtcblxuXHRcdFx0dGFyZ2V0LnN1YiggdGhpcy5jZW50ZXIgKS5ub3JtYWxpemUoKTtcblx0XHRcdHRhcmdldC5tdWx0aXBseVNjYWxhciggdGhpcy5yYWRpdXMgKS5hZGQoIHRoaXMuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRnZXRCb3VuZGluZ0JveCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IEJveDMoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc0VtcHR5KCkgKSB7XG5cblx0XHRcdC8vIEVtcHR5IHNwaGVyZSBwcm9kdWNlcyBlbXB0eSBib3VuZGluZyBib3hcblx0XHRcdHRhcmdldC5tYWtlRW1wdHkoKTtcblx0XHRcdHJldHVybiB0YXJnZXQ7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc2V0KCB0aGlzLmNlbnRlciwgdGhpcy5jZW50ZXIgKTtcblx0XHR0YXJnZXQuZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCApIHtcblxuXHRcdHRoaXMuY2VudGVyLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cdFx0dGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyYW5zbGF0ZSggb2Zmc2V0ICkge1xuXG5cdFx0dGhpcy5jZW50ZXIuYWRkKCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVBvaW50KCBwb2ludCApIHtcblxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p1ai9NYXRoR2VvTGliL2Jsb2IvMjk0MGI5OWI5OWNmZTU3NWRkNDUxMDNlZjIwZjQwMTlkZWUxNWI1NC9zcmMvR2VvbWV0cnkvU3BoZXJlLmNwcCNMNjQ5LUw2NzFcblxuXHRcdF90b1BvaW50LnN1YlZlY3RvcnMoIHBvaW50LCB0aGlzLmNlbnRlciApO1xuXG5cdFx0Y29uc3QgbGVuZ3RoU3EgPSBfdG9Qb2ludC5sZW5ndGhTcSgpO1xuXG5cdFx0aWYgKCBsZW5ndGhTcSA+ICggdGhpcy5yYWRpdXMgKiB0aGlzLnJhZGl1cyApICkge1xuXG5cdFx0XHRjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoIGxlbmd0aFNxICk7XG5cdFx0XHRjb25zdCBtaXNzaW5nUmFkaXVzSGFsZiA9ICggbGVuZ3RoIC0gdGhpcy5yYWRpdXMgKSAqIDAuNTtcblxuXHRcdFx0Ly8gTnVkZ2UgdGhpcyBzcGhlcmUgdG93YXJkcyB0aGUgdGFyZ2V0IHBvaW50LiBBZGQgaGFsZiB0aGUgbWlzc2luZyBkaXN0YW5jZSB0byByYWRpdXMsXG5cdFx0XHQvLyBhbmQgdGhlIG90aGVyIGhhbGYgdG8gcG9zaXRpb24uIFRoaXMgZ2l2ZXMgYSB0aWdodGVyIGVuY2xvc3VyZSwgaW5zdGVhZCBvZiBpZlxuXHRcdFx0Ly8gdGhlIHdob2xlIG1pc3NpbmcgZGlzdGFuY2Ugd2VyZSBqdXN0IGFkZGVkIHRvIHJhZGl1cy5cblxuXHRcdFx0dGhpcy5jZW50ZXIuYWRkKCBfdG9Qb2ludC5tdWx0aXBseVNjYWxhciggbWlzc2luZ1JhZGl1c0hhbGYgLyBsZW5ndGggKSApO1xuXHRcdFx0dGhpcy5yYWRpdXMgKz0gbWlzc2luZ1JhZGl1c0hhbGY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dW5pb24oIHNwaGVyZSApIHtcblxuXHRcdC8vIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2p1ai9NYXRoR2VvTGliL2Jsb2IvMjk0MGI5OWI5OWNmZTU3NWRkNDUxMDNlZjIwZjQwMTlkZWUxNWI1NC9zcmMvR2VvbWV0cnkvU3BoZXJlLmNwcCNMNzU5LUw3NjlcblxuXHRcdC8vIFRvIGVuY2xvc2UgYW5vdGhlciBzcGhlcmUgaW50byB0aGlzIHNwaGVyZSwgd2Ugb25seSBuZWVkIHRvIGVuY2xvc2UgdHdvIHBvaW50czpcblx0XHQvLyAxKSBFbmNsb3NlIHRoZSBmYXJ0aGVzdCBwb2ludCBvbiB0aGUgb3RoZXIgc3BoZXJlIGludG8gdGhpcyBzcGhlcmUuXG5cdFx0Ly8gMikgRW5jbG9zZSB0aGUgb3Bwb3NpdGUgcG9pbnQgb2YgdGhlIGZhcnRoZXN0IHBvaW50IGludG8gdGhpcyBzcGhlcmUuXG5cblx0XHRfdG9GYXJ0aGVzdFBvaW50LnN1YlZlY3RvcnMoIHNwaGVyZS5jZW50ZXIsIHRoaXMuY2VudGVyICkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHNwaGVyZS5yYWRpdXMgKTtcblxuXHRcdHRoaXMuZXhwYW5kQnlQb2ludCggX3YxJDYuY29weSggc3BoZXJlLmNlbnRlciApLmFkZCggX3RvRmFydGhlc3RQb2ludCApICk7XG5cdFx0dGhpcy5leHBhbmRCeVBvaW50KCBfdjEkNi5jb3B5KCBzcGhlcmUuY2VudGVyICkuc3ViKCBfdG9GYXJ0aGVzdFBvaW50ICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHNwaGVyZSApIHtcblxuXHRcdHJldHVybiBzcGhlcmUuY2VudGVyLmVxdWFscyggdGhpcy5jZW50ZXIgKSAmJiAoIHNwaGVyZS5yYWRpdXMgPT09IHRoaXMucmFkaXVzICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yJGEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfc2VnQ2VudGVyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3NlZ0RpciA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9kaWZmID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfZWRnZTEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZWRnZTIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIFJheSB7XG5cblx0Y29uc3RydWN0b3IoIG9yaWdpbiA9IG5ldyBWZWN0b3IzKCksIGRpcmVjdGlvbiA9IG5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKSApIHtcblxuXHRcdHRoaXMub3JpZ2luID0gb3JpZ2luO1xuXHRcdHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXG5cdH1cblxuXHRzZXQoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggb3JpZ2luICk7XG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggcmF5ICkge1xuXG5cdFx0dGhpcy5vcmlnaW4uY29weSggcmF5Lm9yaWdpbiApO1xuXHRcdHRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhdCggdCwgdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9XG5cblx0bG9va0F0KCB2ICkge1xuXG5cdFx0dGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRyZWNhc3QoIHQgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5jb3B5KCB0aGlzLmF0KCB0LCBfdmVjdG9yJGEgKSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7XG5cblx0XHRjb25zdCBkaXJlY3Rpb25EaXN0YW5jZSA9IHRhcmdldC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRpcmVjdGlvbkRpc3RhbmNlIDwgMCApIHtcblxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VTcVRvUG9pbnQoIHBvaW50ICkge1xuXG5cdFx0Y29uc3QgZGlyZWN0aW9uRGlzdGFuY2UgPSBfdmVjdG9yJGEuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICkuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXG5cdFx0Ly8gcG9pbnQgYmVoaW5kIHRoZSByYXlcblxuXHRcdGlmICggZGlyZWN0aW9uRGlzdGFuY2UgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoIHBvaW50ICk7XG5cblx0XHR9XG5cblx0XHRfdmVjdG9yJGEuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggZGlyZWN0aW9uRGlzdGFuY2UgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRyZXR1cm4gX3ZlY3RvciRhLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApO1xuXG5cdH1cblxuXHRkaXN0YW5jZVNxVG9TZWdtZW50KCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHtcblxuXHRcdC8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oXG5cdFx0Ly8gSXQgcmV0dXJucyB0aGUgbWluIGRpc3RhbmNlIGJldHdlZW4gdGhlIHJheSBhbmQgdGhlIHNlZ21lbnRcblx0XHQvLyBkZWZpbmVkIGJ5IHYwIGFuZCB2MVxuXHRcdC8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgcmF5XG5cdFx0Ly8gLSBUaGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudFxuXG5cdFx0X3NlZ0NlbnRlci5jb3B5KCB2MCApLmFkZCggdjEgKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cdFx0X3NlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTtcblx0XHRfZGlmZi5jb3B5KCB0aGlzLm9yaWdpbiApLnN1YiggX3NlZ0NlbnRlciApO1xuXG5cdFx0Y29uc3Qgc2VnRXh0ZW50ID0gdjAuZGlzdGFuY2VUbyggdjEgKSAqIDAuNTtcblx0XHRjb25zdCBhMDEgPSAtIHRoaXMuZGlyZWN0aW9uLmRvdCggX3NlZ0RpciApO1xuXHRcdGNvbnN0IGIwID0gX2RpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdGNvbnN0IGIxID0gLSBfZGlmZi5kb3QoIF9zZWdEaXIgKTtcblx0XHRjb25zdCBjID0gX2RpZmYubGVuZ3RoU3EoKTtcblx0XHRjb25zdCBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApO1xuXHRcdGxldCBzMCwgczEsIHNxckRpc3QsIGV4dERldDtcblxuXHRcdGlmICggZGV0ID4gMCApIHtcblxuXHRcdFx0Ly8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLlxuXG5cdFx0XHRzMCA9IGEwMSAqIGIxIC0gYjA7XG5cdFx0XHRzMSA9IGEwMSAqIGIwIC0gYjE7XG5cdFx0XHRleHREZXQgPSBzZWdFeHRlbnQgKiBkZXQ7XG5cblx0XHRcdGlmICggczAgPj0gMCApIHtcblxuXHRcdFx0XHRpZiAoIHMxID49IC0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzMSA8PSBleHREZXQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJlZ2lvbiAwXG5cdFx0XHRcdFx0XHQvLyBNaW5pbXVtIGF0IGludGVyaW9yIHBvaW50cyBvZiByYXkgYW5kIHNlZ21lbnQuXG5cblx0XHRcdFx0XHRcdGNvbnN0IGludkRldCA9IDEgLyBkZXQ7XG5cdFx0XHRcdFx0XHRzMCAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRzMSAqPSBpbnZEZXQ7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gczAgKiAoIHMwICsgYTAxICogczEgKyAyICogYjAgKSArIHMxICogKCBhMDEgKiBzMCArIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gcmVnaW9uIDFcblxuXHRcdFx0XHRcdFx0czEgPSBzZWdFeHRlbnQ7XG5cdFx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyByZWdpb24gNVxuXG5cdFx0XHRcdFx0czEgPSAtIHNlZ0V4dGVudDtcblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggYTAxICogczEgKyBiMCApICk7XG5cdFx0XHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBzMSA8PSAtIGV4dERldCApIHtcblxuXHRcdFx0XHRcdC8vIHJlZ2lvbiA0XG5cblx0XHRcdFx0XHRzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gLSBzZWdFeHRlbnQgOiBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApO1xuXHRcdFx0XHRcdHNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDNcblxuXHRcdFx0XHRcdHMwID0gMDtcblx0XHRcdFx0XHRzMSA9IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7XG5cdFx0XHRcdFx0c3FyRGlzdCA9IHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gcmVnaW9uIDJcblxuXHRcdFx0XHRcdHMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7XG5cdFx0XHRcdFx0czEgPSAoIHMwID4gMCApID8gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTtcblx0XHRcdFx0XHRzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gUmF5IGFuZCBzZWdtZW50IGFyZSBwYXJhbGxlbC5cblxuXHRcdFx0czEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50O1xuXHRcdFx0czAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApO1xuXHRcdFx0c3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYztcblxuXHRcdH1cblxuXHRcdGlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkge1xuXG5cdFx0XHRvcHRpb25hbFBvaW50T25SYXkuY29weSggdGhpcy5kaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggczAgKS5hZGQoIHRoaXMub3JpZ2luICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9wdGlvbmFsUG9pbnRPblNlZ21lbnQgKSB7XG5cblx0XHRcdG9wdGlvbmFsUG9pbnRPblNlZ21lbnQuY29weSggX3NlZ0RpciApLm11bHRpcGx5U2NhbGFyKCBzMSApLmFkZCggX3NlZ0NlbnRlciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNxckRpc3Q7XG5cblx0fVxuXG5cdGludGVyc2VjdFNwaGVyZSggc3BoZXJlLCB0YXJnZXQgKSB7XG5cblx0XHRfdmVjdG9yJGEuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTtcblx0XHRjb25zdCB0Y2EgPSBfdmVjdG9yJGEuZG90KCB0aGlzLmRpcmVjdGlvbiApO1xuXHRcdGNvbnN0IGQyID0gX3ZlY3RvciRhLmRvdCggX3ZlY3RvciRhICkgLSB0Y2EgKiB0Y2E7XG5cdFx0Y29uc3QgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzO1xuXG5cdFx0aWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDtcblxuXHRcdGNvbnN0IHRoYyA9IE1hdGguc3FydCggcmFkaXVzMiAtIGQyICk7XG5cblx0XHQvLyB0MCA9IGZpcnN0IGludGVyc2VjdCBwb2ludCAtIGVudHJhbmNlIG9uIGZyb250IG9mIHNwaGVyZVxuXHRcdGNvbnN0IHQwID0gdGNhIC0gdGhjO1xuXG5cdFx0Ly8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZVxuXHRcdGNvbnN0IHQxID0gdGNhICsgdGhjO1xuXG5cdFx0Ly8gdGVzdCB0byBzZWUgaWYgYm90aCB0MCBhbmQgdDEgYXJlIGJlaGluZCB0aGUgcmF5IC0gaWYgc28sIHJldHVybiBudWxsXG5cdFx0aWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHQvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheTpcblx0XHQvLyBpZiBpdCBpcywgdGhlIHJheSBpcyBpbnNpZGUgdGhlIHNwaGVyZSwgc28gcmV0dXJuIHRoZSBzZWNvbmQgZXhpdCBwb2ludCBzY2FsZWQgYnkgdDEsXG5cdFx0Ly8gaW4gb3JkZXIgdG8gYWx3YXlzIHJldHVybiBhbiBpbnRlcnNlY3QgcG9pbnQgdGhhdCBpcyBpbiBmcm9udCBvZiB0aGUgcmF5LlxuXHRcdGlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCB0YXJnZXQgKTtcblxuXHRcdC8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQwLCB0YXJnZXQgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7XG5cblx0fVxuXG5cdGRpc3RhbmNlVG9QbGFuZSggcGxhbmUgKSB7XG5cblx0XHRjb25zdCBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7XG5cblx0XHRpZiAoIGRlbm9taW5hdG9yID09PSAwICkge1xuXG5cdFx0XHQvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luXG5cdFx0XHRpZiAoIHBsYW5lLmRpc3RhbmNlVG9Qb2ludCggdGhpcy5vcmlnaW4gKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gMDtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBOdWxsIGlzIHByZWZlcmFibGUgdG8gdW5kZWZpbmVkIHNpbmNlIHVuZGVmaW5lZCBtZWFucy4uLi4gaXQgaXMgdW5kZWZpbmVkXG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdCA9IC0gKCB0aGlzLm9yaWdpbi5kb3QoIHBsYW5lLm5vcm1hbCApICsgcGxhbmUuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0Ly8gUmV0dXJuIGlmIHRoZSByYXkgbmV2ZXIgaW50ZXJzZWN0cyB0aGUgcGxhbmVcblxuXHRcdHJldHVybiB0ID49IDAgPyB0IDogbnVsbDtcblxuXHR9XG5cblx0aW50ZXJzZWN0UGxhbmUoIHBsYW5lLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5kaXN0YW5jZVRvUGxhbmUoIHBsYW5lICk7XG5cblx0XHRpZiAoIHQgPT09IG51bGwgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXQoIHQsIHRhcmdldCApO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzUGxhbmUoIHBsYW5lICkge1xuXG5cdFx0Ly8gY2hlY2sgaWYgdGhlIHJheSBsaWVzIG9uIHRoZSBwbGFuZSBmaXJzdFxuXG5cdFx0Y29uc3QgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7XG5cblx0XHRpZiAoIGRpc3RUb1BvaW50ID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Ly8gcmF5IG9yaWdpbiBpcyBiZWhpbmQgdGhlIHBsYW5lIChhbmQgaXMgcG9pbnRpbmcgYmVoaW5kIGl0KVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RCb3goIGJveCwgdGFyZ2V0ICkge1xuXG5cdFx0bGV0IHRtaW4sIHRtYXgsIHR5bWluLCB0eW1heCwgdHptaW4sIHR6bWF4O1xuXG5cdFx0Y29uc3QgaW52ZGlyeCA9IDEgLyB0aGlzLmRpcmVjdGlvbi54LFxuXHRcdFx0aW52ZGlyeSA9IDEgLyB0aGlzLmRpcmVjdGlvbi55LFxuXHRcdFx0aW52ZGlyeiA9IDEgLyB0aGlzLmRpcmVjdGlvbi56O1xuXG5cdFx0Y29uc3Qgb3JpZ2luID0gdGhpcy5vcmlnaW47XG5cblx0XHRpZiAoIGludmRpcnggPj0gMCApIHtcblxuXHRcdFx0dG1pbiA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cdFx0XHR0bWF4ID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRtaW4gPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4O1xuXHRcdFx0dG1heCA9ICggYm94Lm1pbi54IC0gb3JpZ2luLnggKSAqIGludmRpcng7XG5cblx0XHR9XG5cblx0XHRpZiAoIGludmRpcnkgPj0gMCApIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dHltaW4gPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXHRcdFx0dHltYXggPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCAoIHRtaW4gPiB0eW1heCApIHx8ICggdHltaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDtcblxuXHRcdC8vIFRoZXNlIGxpbmVzIGFsc28gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRtaW4gb3IgdG1heCBpcyBOYU5cblx0XHQvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOXG5cblx0XHRpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluO1xuXG5cdFx0aWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDtcblxuXHRcdGlmICggaW52ZGlyeiA+PSAwICkge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0em1pbiA9ICggYm94Lm1heC56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cdFx0XHR0em1heCA9ICggYm94Lm1pbi56IC0gb3JpZ2luLnogKSAqIGludmRpcno7XG5cblx0XHR9XG5cblx0XHRpZiAoICggdG1pbiA+IHR6bWF4ICkgfHwgKCB0em1pbiA+IHRtYXggKSApIHJldHVybiBudWxsO1xuXG5cdFx0aWYgKCB0em1pbiA+IHRtaW4gfHwgdG1pbiAhPT0gdG1pbiApIHRtaW4gPSB0em1pbjtcblxuXHRcdGlmICggdHptYXggPCB0bWF4IHx8IHRtYXggIT09IHRtYXggKSB0bWF4ID0gdHptYXg7XG5cblx0XHQvL3JldHVybiBwb2ludCBjbG9zZXN0IHRvIHRoZSByYXkgKHBvc2l0aXZlIHNpZGUpXG5cblx0XHRpZiAoIHRtYXggPCAwICkgcmV0dXJuIG51bGw7XG5cblx0XHRyZXR1cm4gdGhpcy5hdCggdG1pbiA+PSAwID8gdG1pbiA6IHRtYXgsIHRhcmdldCApO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgX3ZlY3RvciRhICkgIT09IG51bGw7XG5cblx0fVxuXG5cdGludGVyc2VjdFRyaWFuZ2xlKCBhLCBiLCBjLCBiYWNrZmFjZUN1bGxpbmcsIHRhcmdldCApIHtcblxuXHRcdC8vIENvbXB1dGUgdGhlIG9mZnNldCBvcmlnaW4sIGVkZ2VzLCBhbmQgbm9ybWFsLlxuXG5cdFx0Ly8gZnJvbSBodHRwOi8vd3d3Lmdlb21ldHJpY3Rvb2xzLmNvbS9HVEVuZ2luZS9JbmNsdWRlL01hdGhlbWF0aWNzL0d0ZUludHJSYXkzVHJpYW5nbGUzLmhcblxuXHRcdF9lZGdlMS5zdWJWZWN0b3JzKCBiLCBhICk7XG5cdFx0X2VkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTtcblx0XHRfbm9ybWFsJDEuY3Jvc3NWZWN0b3JzKCBfZWRnZTEsIF9lZGdlMiApO1xuXG5cdFx0Ly8gU29sdmUgUSArIHQqRCA9IGIxKkUxICsgYjIqRTIgKFEgPSBrRGlmZiwgRCA9IHJheSBkaXJlY3Rpb24sXG5cdFx0Ly8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieVxuXHRcdC8vICAgfERvdChELE4pfCpiMSA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKFEsRTIpKVxuXHRcdC8vICAgfERvdChELE4pfCpiMiA9IHNpZ24oRG90KEQsTikpKkRvdChELENyb3NzKEUxLFEpKVxuXHRcdC8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pXG5cdFx0bGV0IERkTiA9IHRoaXMuZGlyZWN0aW9uLmRvdCggX25vcm1hbCQxICk7XG5cdFx0bGV0IHNpZ247XG5cblx0XHRpZiAoIERkTiA+IDAgKSB7XG5cblx0XHRcdGlmICggYmFja2ZhY2VDdWxsaW5nICkgcmV0dXJuIG51bGw7XG5cdFx0XHRzaWduID0gMTtcblxuXHRcdH0gZWxzZSBpZiAoIERkTiA8IDAgKSB7XG5cblx0XHRcdHNpZ24gPSAtIDE7XG5cdFx0XHREZE4gPSAtIERkTjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0X2RpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTtcblx0XHRjb25zdCBEZFF4RTIgPSBzaWduICogdGhpcy5kaXJlY3Rpb24uZG90KCBfZWRnZTIuY3Jvc3NWZWN0b3JzKCBfZGlmZiwgX2VkZ2UyICkgKTtcblxuXHRcdC8vIGIxIDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0aWYgKCBEZFF4RTIgPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMS5jcm9zcyggX2RpZmYgKSApO1xuXG5cdFx0Ly8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkRTF4USA8IDAgKSB7XG5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb25cblx0XHRpZiAoIERkUXhFMiArIERkRTF4USA+IERkTiApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHQvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLlxuXHRcdGNvbnN0IFFkTiA9IC0gc2lnbiAqIF9kaWZmLmRvdCggX25vcm1hbCQxICk7XG5cblx0XHQvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uXG5cdFx0aWYgKCBRZE4gPCAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdC8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLlxuXHRcdHJldHVybiB0aGlzLmF0KCBRZE4gLyBEZE4sIHRhcmdldCApO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeDQgKSB7XG5cblx0XHR0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTtcblx0XHR0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeDQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIHJheSApIHtcblxuXHRcdHJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIE1hdHJpeDQge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5lbGVtZW50cyA9IFtcblxuXHRcdFx0MSwgMCwgMCwgMCxcblx0XHRcdDAsIDEsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0XTtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiB0aGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlYWRzIGFyZ3VtZW50cy4gdXNlIC5zZXQoKSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0KCBuMTEsIG4xMiwgbjEzLCBuMTQsIG4yMSwgbjIyLCBuMjMsIG4yNCwgbjMxLCBuMzIsIG4zMywgbjM0LCBuNDEsIG40MiwgbjQzLCBuNDQgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDtcblx0XHR0ZVsgMSBdID0gbjIxOyB0ZVsgNSBdID0gbjIyOyB0ZVsgOSBdID0gbjIzOyB0ZVsgMTMgXSA9IG4yNDtcblx0XHR0ZVsgMiBdID0gbjMxOyB0ZVsgNiBdID0gbjMyOyB0ZVsgMTAgXSA9IG4zMzsgdGVbIDE0IF0gPSBuMzQ7XG5cdFx0dGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGlkZW50aXR5KCkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCAxLCAwLCAwLFxuXHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTtcblxuXHR9XG5cblx0Y29weSggbSApIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdID0gbWVbIDAgXTsgdGVbIDEgXSA9IG1lWyAxIF07IHRlWyAyIF0gPSBtZVsgMiBdOyB0ZVsgMyBdID0gbWVbIDMgXTtcblx0XHR0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTtcblx0XHR0ZVsgOCBdID0gbWVbIDggXTsgdGVbIDkgXSA9IG1lWyA5IF07IHRlWyAxMCBdID0gbWVbIDEwIF07IHRlWyAxMSBdID0gbWVbIDExIF07XG5cdFx0dGVbIDEyIF0gPSBtZVsgMTIgXTsgdGVbIDEzIF0gPSBtZVsgMTMgXTsgdGVbIDE0IF0gPSBtZVsgMTQgXTsgdGVbIDE1IF0gPSBtZVsgMTUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb3B5UG9zaXRpb24oIG0gKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHMsIG1lID0gbS5lbGVtZW50cztcblxuXHRcdHRlWyAxMiBdID0gbWVbIDEyIF07XG5cdFx0dGVbIDEzIF0gPSBtZVsgMTMgXTtcblx0XHR0ZVsgMTQgXSA9IG1lWyAxNCBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21NYXRyaXgzKCBtICkge1xuXG5cdFx0Y29uc3QgbWUgPSBtLmVsZW1lbnRzO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdG1lWyAwIF0sIG1lWyAzIF0sIG1lWyA2IF0sIDAsXG5cdFx0XHRtZVsgMSBdLCBtZVsgNCBdLCBtZVsgNyBdLCAwLFxuXHRcdFx0bWVbIDIgXSwgbWVbIDUgXSwgbWVbIDggXSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXh0cmFjdEJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0eEF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMCApO1xuXHRcdHlBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDEgKTtcblx0XHR6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUJhc2lzKCB4QXhpcywgeUF4aXMsIHpBeGlzICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cdFx0XHR4QXhpcy54LCB5QXhpcy54LCB6QXhpcy54LCAwLFxuXHRcdFx0eEF4aXMueSwgeUF4aXMueSwgekF4aXMueSwgMCxcblx0XHRcdHhBeGlzLnosIHlBeGlzLnosIHpBeGlzLnosIDAsXG5cdFx0XHQwLCAwLCAwLCAxXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHRyYWN0Um90YXRpb24oIG0gKSB7XG5cblx0XHQvLyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IHJlZmxlY3Rpb24gbWF0cmljZXNcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRjb25zdCBtZSA9IG0uZWxlbWVudHM7XG5cblx0XHRjb25zdCBzY2FsZVggPSAxIC8gX3YxJDUuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMCApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHNjYWxlWSA9IDEgLyBfdjEkNS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAxICkubGVuZ3RoKCk7XG5cdFx0Y29uc3Qgc2NhbGVaID0gMSAvIF92MSQ1LnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTtcblxuXHRcdHRlWyAwIF0gPSBtZVsgMCBdICogc2NhbGVYO1xuXHRcdHRlWyAxIF0gPSBtZVsgMSBdICogc2NhbGVYO1xuXHRcdHRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYO1xuXHRcdHRlWyAzIF0gPSAwO1xuXG5cdFx0dGVbIDQgXSA9IG1lWyA0IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDUgXSA9IG1lWyA1IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7XG5cdFx0dGVbIDcgXSA9IDA7XG5cblx0XHR0ZVsgOCBdID0gbWVbIDggXSAqIHNjYWxlWjtcblx0XHR0ZVsgOSBdID0gbWVbIDkgXSAqIHNjYWxlWjtcblx0XHR0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaO1xuXHRcdHRlWyAxMSBdID0gMDtcblxuXHRcdHRlWyAxMiBdID0gMDtcblx0XHR0ZVsgMTMgXSA9IDA7XG5cdFx0dGVbIDE0IF0gPSAwO1xuXHRcdHRlWyAxNSBdID0gMTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25Gcm9tRXVsZXIoIGV1bGVyICkge1xuXG5cdFx0aWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCB4ID0gZXVsZXIueCwgeSA9IGV1bGVyLnksIHogPSBldWxlci56O1xuXHRcdGNvbnN0IGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTtcblx0XHRjb25zdCBjID0gTWF0aC5jb3MoIHkgKSwgZCA9IE1hdGguc2luKCB5ICk7XG5cdFx0Y29uc3QgZSA9IE1hdGguY29zKCB6ICksIGYgPSBNYXRoLnNpbiggeiApO1xuXG5cdFx0aWYgKCBldWxlci5vcmRlciA9PT0gJ1hZWicgKSB7XG5cblx0XHRcdGNvbnN0IGFlID0gYSAqIGUsIGFmID0gYSAqIGYsIGJlID0gYiAqIGUsIGJmID0gYiAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSAtIGMgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhZiArIGJlICogZDtcblx0XHRcdHRlWyA1IF0gPSBhZSAtIGJmICogZDtcblx0XHRcdHRlWyA5IF0gPSAtIGIgKiBjO1xuXG5cdFx0XHR0ZVsgMiBdID0gYmYgLSBhZSAqIGQ7XG5cdFx0XHR0ZVsgNiBdID0gYmUgKyBhZiAqIGQ7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWFonICkge1xuXG5cdFx0XHRjb25zdCBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gY2UgKyBkZiAqIGI7XG5cdFx0XHR0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7XG5cdFx0XHR0ZVsgOCBdID0gYSAqIGQ7XG5cblx0XHRcdHRlWyAxIF0gPSBhICogZjtcblx0XHRcdHRlWyA1IF0gPSBhICogZTtcblx0XHRcdHRlWyA5IF0gPSAtIGI7XG5cblx0XHRcdHRlWyAyIF0gPSBjZiAqIGIgLSBkZTtcblx0XHRcdHRlWyA2IF0gPSBkZiArIGNlICogYjtcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1pYWScgKSB7XG5cblx0XHRcdGNvbnN0IGNlID0gYyAqIGUsIGNmID0gYyAqIGYsIGRlID0gZCAqIGUsIGRmID0gZCAqIGY7XG5cblx0XHRcdHRlWyAwIF0gPSBjZSAtIGRmICogYjtcblx0XHRcdHRlWyA0IF0gPSAtIGEgKiBmO1xuXHRcdFx0dGVbIDggXSA9IGRlICsgY2YgKiBiO1xuXG5cdFx0XHR0ZVsgMSBdID0gY2YgKyBkZSAqIGI7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gZGYgLSBjZSAqIGI7XG5cblx0XHRcdHRlWyAyIF0gPSAtIGEgKiBkO1xuXHRcdFx0dGVbIDYgXSA9IGI7XG5cdFx0XHR0ZVsgMTAgXSA9IGEgKiBjO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWVgnICkge1xuXG5cdFx0XHRjb25zdCBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gYmUgKiBkIC0gYWY7XG5cdFx0XHR0ZVsgOCBdID0gYWUgKiBkICsgYmY7XG5cblx0XHRcdHRlWyAxIF0gPSBjICogZjtcblx0XHRcdHRlWyA1IF0gPSBiZiAqIGQgKyBhZTtcblx0XHRcdHRlWyA5IF0gPSBhZiAqIGQgLSBiZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZDtcblx0XHRcdHRlWyA2IF0gPSBiICogYztcblx0XHRcdHRlWyAxMCBdID0gYSAqIGM7XG5cblx0XHR9IGVsc2UgaWYgKCBldWxlci5vcmRlciA9PT0gJ1laWCcgKSB7XG5cblx0XHRcdGNvbnN0IGFjID0gYSAqIGMsIGFkID0gYSAqIGQsIGJjID0gYiAqIGMsIGJkID0gYiAqIGQ7XG5cblx0XHRcdHRlWyAwIF0gPSBjICogZTtcblx0XHRcdHRlWyA0IF0gPSBiZCAtIGFjICogZjtcblx0XHRcdHRlWyA4IF0gPSBiYyAqIGYgKyBhZDtcblxuXHRcdFx0dGVbIDEgXSA9IGY7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gLSBiICogZTtcblxuXHRcdFx0dGVbIDIgXSA9IC0gZCAqIGU7XG5cdFx0XHR0ZVsgNiBdID0gYWQgKiBmICsgYmM7XG5cdFx0XHR0ZVsgMTAgXSA9IGFjIC0gYmQgKiBmO1xuXG5cdFx0fSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdYWlknICkge1xuXG5cdFx0XHRjb25zdCBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkO1xuXG5cdFx0XHR0ZVsgMCBdID0gYyAqIGU7XG5cdFx0XHR0ZVsgNCBdID0gLSBmO1xuXHRcdFx0dGVbIDggXSA9IGQgKiBlO1xuXG5cdFx0XHR0ZVsgMSBdID0gYWMgKiBmICsgYmQ7XG5cdFx0XHR0ZVsgNSBdID0gYSAqIGU7XG5cdFx0XHR0ZVsgOSBdID0gYWQgKiBmIC0gYmM7XG5cblx0XHRcdHRlWyAyIF0gPSBiYyAqIGYgLSBhZDtcblx0XHRcdHRlWyA2IF0gPSBiICogZTtcblx0XHRcdHRlWyAxMCBdID0gYmQgKiBmICsgYWM7XG5cblx0XHR9XG5cblx0XHQvLyBib3R0b20gcm93XG5cdFx0dGVbIDMgXSA9IDA7XG5cdFx0dGVbIDcgXSA9IDA7XG5cdFx0dGVbIDExIF0gPSAwO1xuXG5cdFx0Ly8gbGFzdCBjb2x1bW5cblx0XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAxNCBdID0gMDtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5jb21wb3NlKCBfemVybywgcSwgX29uZSApO1xuXG5cdH1cblxuXHRsb29rQXQoIGV5ZSwgdGFyZ2V0LCB1cCApIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblxuXHRcdF96LnN1YlZlY3RvcnMoIGV5ZSwgdGFyZ2V0ICk7XG5cblx0XHRpZiAoIF96Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvblxuXG5cdFx0XHRfei56ID0gMTtcblxuXHRcdH1cblxuXHRcdF96Lm5vcm1hbGl6ZSgpO1xuXHRcdF94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7XG5cblx0XHRpZiAoIF94Lmxlbmd0aFNxKCkgPT09IDAgKSB7XG5cblx0XHRcdC8vIHVwIGFuZCB6IGFyZSBwYXJhbGxlbFxuXG5cdFx0XHRpZiAoIE1hdGguYWJzKCB1cC56ICkgPT09IDEgKSB7XG5cblx0XHRcdFx0X3oueCArPSAwLjAwMDE7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X3oueiArPSAwLjAwMDE7XG5cblx0XHRcdH1cblxuXHRcdFx0X3oubm9ybWFsaXplKCk7XG5cdFx0XHRfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApO1xuXG5cdFx0fVxuXG5cdFx0X3gubm9ybWFsaXplKCk7XG5cdFx0X3kuY3Jvc3NWZWN0b3JzKCBfeiwgX3ggKTtcblxuXHRcdHRlWyAwIF0gPSBfeC54OyB0ZVsgNCBdID0gX3kueDsgdGVbIDggXSA9IF96Lng7XG5cdFx0dGVbIDEgXSA9IF94Lnk7IHRlWyA1IF0gPSBfeS55OyB0ZVsgOSBdID0gX3oueTtcblx0XHR0ZVsgMiBdID0gX3guejsgdGVbIDYgXSA9IF95Lno7IHRlWyAxMCBdID0gX3ouejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggbSwgbiApIHtcblxuXHRcdGlmICggbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseU1hdHJpY2VzKCBhLCBiICkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCBuICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7XG5cblx0fVxuXG5cdHByZW11bHRpcGx5KCBtICkge1xuXG5cdFx0cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApO1xuXG5cdH1cblxuXHRtdWx0aXBseU1hdHJpY2VzKCBhLCBiICkge1xuXG5cdFx0Y29uc3QgYWUgPSBhLmVsZW1lbnRzO1xuXHRcdGNvbnN0IGJlID0gYi5lbGVtZW50cztcblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBhMTEgPSBhZVsgMCBdLCBhMTIgPSBhZVsgNCBdLCBhMTMgPSBhZVsgOCBdLCBhMTQgPSBhZVsgMTIgXTtcblx0XHRjb25zdCBhMjEgPSBhZVsgMSBdLCBhMjIgPSBhZVsgNSBdLCBhMjMgPSBhZVsgOSBdLCBhMjQgPSBhZVsgMTMgXTtcblx0XHRjb25zdCBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07XG5cdFx0Y29uc3QgYTQxID0gYWVbIDMgXSwgYTQyID0gYWVbIDcgXSwgYTQzID0gYWVbIDExIF0sIGE0NCA9IGFlWyAxNSBdO1xuXG5cdFx0Y29uc3QgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07XG5cdFx0Y29uc3QgYjIxID0gYmVbIDEgXSwgYjIyID0gYmVbIDUgXSwgYjIzID0gYmVbIDkgXSwgYjI0ID0gYmVbIDEzIF07XG5cdFx0Y29uc3QgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDYgXSwgYjMzID0gYmVbIDEwIF0sIGIzNCA9IGJlWyAxNCBdO1xuXHRcdGNvbnN0IGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTtcblxuXHRcdHRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7XG5cdFx0dGVbIDQgXSA9IGExMSAqIGIxMiArIGExMiAqIGIyMiArIGExMyAqIGIzMiArIGExNCAqIGI0Mjtcblx0XHR0ZVsgOCBdID0gYTExICogYjEzICsgYTEyICogYjIzICsgYTEzICogYjMzICsgYTE0ICogYjQzO1xuXHRcdHRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0O1xuXG5cdFx0dGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTtcblx0XHR0ZVsgNSBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyICsgYTI0ICogYjQyO1xuXHRcdHRlWyA5IF0gPSBhMjEgKiBiMTMgKyBhMjIgKiBiMjMgKyBhMjMgKiBiMzMgKyBhMjQgKiBiNDM7XG5cdFx0dGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7XG5cblx0XHR0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxO1xuXHRcdHRlWyA2IF0gPSBhMzEgKiBiMTIgKyBhMzIgKiBiMjIgKyBhMzMgKiBiMzIgKyBhMzQgKiBiNDI7XG5cdFx0dGVbIDEwIF0gPSBhMzEgKiBiMTMgKyBhMzIgKiBiMjMgKyBhMzMgKiBiMzMgKyBhMzQgKiBiNDM7XG5cdFx0dGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7XG5cblx0XHR0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxO1xuXHRcdHRlWyA3IF0gPSBhNDEgKiBiMTIgKyBhNDIgKiBiMjIgKyBhNDMgKiBiMzIgKyBhNDQgKiBiNDI7XG5cdFx0dGVbIDExIF0gPSBhNDEgKiBiMTMgKyBhNDIgKiBiMjMgKyBhNDMgKiBiMzMgKyBhNDQgKiBiNDM7XG5cdFx0dGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bXVsdGlwbHlTY2FsYXIoIHMgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHR0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzO1xuXHRcdHRlWyAxIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOSBdICo9IHM7IHRlWyAxMyBdICo9IHM7XG5cdFx0dGVbIDIgXSAqPSBzOyB0ZVsgNiBdICo9IHM7IHRlWyAxMCBdICo9IHM7IHRlWyAxNCBdICo9IHM7XG5cdFx0dGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGV0ZXJtaW5hbnQoKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBuMTEgPSB0ZVsgMCBdLCBuMTIgPSB0ZVsgNCBdLCBuMTMgPSB0ZVsgOCBdLCBuMTQgPSB0ZVsgMTIgXTtcblx0XHRjb25zdCBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTtcblx0XHRjb25zdCBuMzEgPSB0ZVsgMiBdLCBuMzIgPSB0ZVsgNiBdLCBuMzMgPSB0ZVsgMTAgXSwgbjM0ID0gdGVbIDE0IF07XG5cdFx0Y29uc3QgbjQxID0gdGVbIDMgXSwgbjQyID0gdGVbIDcgXSwgbjQzID0gdGVbIDExIF0sIG40NCA9IHRlWyAxNSBdO1xuXG5cdFx0Ly9UT0RPOiBtYWtlIHRoaXMgbW9yZSBlZmZpY2llbnRcblx0XHQvLyggYmFzZWQgb24gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvYWxnZWJyYS9tYXRyaXgvZnVuY3Rpb25zL2ludmVyc2UvZm91ckQvaW5kZXguaHRtIClcblxuXHRcdHJldHVybiAoXG5cdFx0XHRuNDEgKiAoXG5cdFx0XHRcdCsgbjE0ICogbjIzICogbjMyXG5cdFx0XHRcdCAtIG4xMyAqIG4yNCAqIG4zMlxuXHRcdFx0XHQgLSBuMTQgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEyICogbjI0ICogbjMzXG5cdFx0XHRcdCArIG4xMyAqIG4yMiAqIG4zNFxuXHRcdFx0XHQgLSBuMTIgKiBuMjMgKiBuMzRcblx0XHRcdCkgK1xuXHRcdFx0bjQyICogKFxuXHRcdFx0XHQrIG4xMSAqIG4yMyAqIG4zNFxuXHRcdFx0XHQgLSBuMTEgKiBuMjQgKiBuMzNcblx0XHRcdFx0ICsgbjE0ICogbjIxICogbjMzXG5cdFx0XHRcdCAtIG4xMyAqIG4yMSAqIG4zNFxuXHRcdFx0XHQgKyBuMTMgKiBuMjQgKiBuMzFcblx0XHRcdFx0IC0gbjE0ICogbjIzICogbjMxXG5cdFx0XHQpICtcblx0XHRcdG40MyAqIChcblx0XHRcdFx0KyBuMTEgKiBuMjQgKiBuMzJcblx0XHRcdFx0IC0gbjExICogbjIyICogbjM0XG5cdFx0XHRcdCAtIG4xNCAqIG4yMSAqIG4zMlxuXHRcdFx0XHQgKyBuMTIgKiBuMjEgKiBuMzRcblx0XHRcdFx0ICsgbjE0ICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMiAqIG4yNCAqIG4zMVxuXHRcdFx0KSArXG5cdFx0XHRuNDQgKiAoXG5cdFx0XHRcdC0gbjEzICogbjIyICogbjMxXG5cdFx0XHRcdCAtIG4xMSAqIG4yMyAqIG4zMlxuXHRcdFx0XHQgKyBuMTEgKiBuMjIgKiBuMzNcblx0XHRcdFx0ICsgbjEzICogbjIxICogbjMyXG5cdFx0XHRcdCAtIG4xMiAqIG4yMSAqIG4zM1xuXHRcdFx0XHQgKyBuMTIgKiBuMjMgKiBuMzFcblx0XHRcdClcblxuXHRcdCk7XG5cblx0fVxuXG5cdHRyYW5zcG9zZSgpIHtcblxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cztcblx0XHRsZXQgdG1wO1xuXG5cdFx0dG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDIgXTsgdGVbIDIgXSA9IHRlWyA4IF07IHRlWyA4IF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDYgXTsgdGVbIDYgXSA9IHRlWyA5IF07IHRlWyA5IF0gPSB0bXA7XG5cblx0XHR0bXAgPSB0ZVsgMyBdOyB0ZVsgMyBdID0gdGVbIDEyIF07IHRlWyAxMiBdID0gdG1wO1xuXHRcdHRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7XG5cdFx0dG1wID0gdGVbIDExIF07IHRlWyAxMSBdID0gdGVbIDE0IF07IHRlWyAxNCBdID0gdG1wO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFBvc2l0aW9uKCB4LCB5LCB6ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0dGVbIDEyIF0gPSB4Lng7XG5cdFx0XHR0ZVsgMTMgXSA9IHgueTtcblx0XHRcdHRlWyAxNCBdID0geC56O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGVbIDEyIF0gPSB4O1xuXHRcdFx0dGVbIDEzIF0gPSB5O1xuXHRcdFx0dGVbIDE0IF0gPSB6O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGludmVydCgpIHtcblxuXHRcdC8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bVxuXHRcdGNvbnN0IHRlID0gdGhpcy5lbGVtZW50cyxcblxuXHRcdFx0bjExID0gdGVbIDAgXSwgbjIxID0gdGVbIDEgXSwgbjMxID0gdGVbIDIgXSwgbjQxID0gdGVbIDMgXSxcblx0XHRcdG4xMiA9IHRlWyA0IF0sIG4yMiA9IHRlWyA1IF0sIG4zMiA9IHRlWyA2IF0sIG40MiA9IHRlWyA3IF0sXG5cdFx0XHRuMTMgPSB0ZVsgOCBdLCBuMjMgPSB0ZVsgOSBdLCBuMzMgPSB0ZVsgMTAgXSwgbjQzID0gdGVbIDExIF0sXG5cdFx0XHRuMTQgPSB0ZVsgMTIgXSwgbjI0ID0gdGVbIDEzIF0sIG4zNCA9IHRlWyAxNCBdLCBuNDQgPSB0ZVsgMTUgXSxcblxuXHRcdFx0dDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LFxuXHRcdFx0dDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LFxuXHRcdFx0dDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LFxuXHRcdFx0dDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0O1xuXG5cdFx0Y29uc3QgZGV0ID0gbjExICogdDExICsgbjIxICogdDEyICsgbjMxICogdDEzICsgbjQxICogdDE0O1xuXG5cdFx0aWYgKCBkZXQgPT09IDAgKSByZXR1cm4gdGhpcy5zZXQoIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgKTtcblxuXHRcdGNvbnN0IGRldEludiA9IDEgLyBkZXQ7XG5cblx0XHR0ZVsgMCBdID0gdDExICogZGV0SW52O1xuXHRcdHRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAyIF0gPSAoIG4yMiAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMiAqIG40MSArIG4yNCAqIG4zMSAqIG40MiAtIG4yMSAqIG4zNCAqIG40MiAtIG4yMiAqIG4zMSAqIG40NCArIG4yMSAqIG4zMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAzIF0gPSAoIG4yMyAqIG4zMiAqIG40MSAtIG4yMiAqIG4zMyAqIG40MSAtIG4yMyAqIG4zMSAqIG40MiArIG4yMSAqIG4zMyAqIG40MiArIG4yMiAqIG4zMSAqIG40MyAtIG4yMSAqIG4zMiAqIG40MyApICogZGV0SW52O1xuXG5cdFx0dGVbIDQgXSA9IHQxMiAqIGRldEludjtcblx0XHR0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNiBdID0gKCBuMTQgKiBuMzIgKiBuNDEgLSBuMTIgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzEgKiBuNDIgKyBuMTEgKiBuMzQgKiBuNDIgKyBuMTIgKiBuMzEgKiBuNDQgLSBuMTEgKiBuMzIgKiBuNDQgKSAqIGRldEludjtcblx0XHR0ZVsgNyBdID0gKCBuMTIgKiBuMzMgKiBuNDEgLSBuMTMgKiBuMzIgKiBuNDEgKyBuMTMgKiBuMzEgKiBuNDIgLSBuMTEgKiBuMzMgKiBuNDIgLSBuMTIgKiBuMzEgKiBuNDMgKyBuMTEgKiBuMzIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyA4IF0gPSB0MTMgKiBkZXRJbnY7XG5cdFx0dGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDEwIF0gPSAoIG4xMiAqIG4yNCAqIG40MSAtIG4xNCAqIG4yMiAqIG40MSArIG4xNCAqIG4yMSAqIG40MiAtIG4xMSAqIG4yNCAqIG40MiAtIG4xMiAqIG4yMSAqIG40NCArIG4xMSAqIG4yMiAqIG40NCApICogZGV0SW52O1xuXHRcdHRlWyAxMSBdID0gKCBuMTMgKiBuMjIgKiBuNDEgLSBuMTIgKiBuMjMgKiBuNDEgLSBuMTMgKiBuMjEgKiBuNDIgKyBuMTEgKiBuMjMgKiBuNDIgKyBuMTIgKiBuMjEgKiBuNDMgLSBuMTEgKiBuMjIgKiBuNDMgKSAqIGRldEludjtcblxuXHRcdHRlWyAxMiBdID0gdDE0ICogZGV0SW52O1xuXHRcdHRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjtcblx0XHR0ZVsgMTQgXSA9ICggbjE0ICogbjIyICogbjMxIC0gbjEyICogbjI0ICogbjMxIC0gbjE0ICogbjIxICogbjMyICsgbjExICogbjI0ICogbjMyICsgbjEyICogbjIxICogbjM0IC0gbjExICogbjIyICogbjM0ICkgKiBkZXRJbnY7XG5cdFx0dGVbIDE1IF0gPSAoIG4xMiAqIG4yMyAqIG4zMSAtIG4xMyAqIG4yMiAqIG4zMSArIG4xMyAqIG4yMSAqIG4zMiAtIG4xMSAqIG4yMyAqIG4zMiAtIG4xMiAqIG4yMSAqIG4zMyArIG4xMSAqIG4yMiAqIG4zMyApICogZGV0SW52O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCB2ICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHggPSB2LngsIHkgPSB2LnksIHogPSB2Lno7XG5cblx0XHR0ZVsgMCBdICo9IHg7IHRlWyA0IF0gKj0geTsgdGVbIDggXSAqPSB6O1xuXHRcdHRlWyAxIF0gKj0geDsgdGVbIDUgXSAqPSB5OyB0ZVsgOSBdICo9IHo7XG5cdFx0dGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7XG5cdFx0dGVbIDMgXSAqPSB4OyB0ZVsgNyBdICo9IHk7IHRlWyAxMSBdICo9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0TWF4U2NhbGVPbkF4aXMoKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRjb25zdCBzY2FsZVhTcSA9IHRlWyAwIF0gKiB0ZVsgMCBdICsgdGVbIDEgXSAqIHRlWyAxIF0gKyB0ZVsgMiBdICogdGVbIDIgXTtcblx0XHRjb25zdCBzY2FsZVlTcSA9IHRlWyA0IF0gKiB0ZVsgNCBdICsgdGVbIDUgXSAqIHRlWyA1IF0gKyB0ZVsgNiBdICogdGVbIDYgXTtcblx0XHRjb25zdCBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdO1xuXG5cdFx0cmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApO1xuXG5cdH1cblxuXHRtYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKSB7XG5cblx0XHR0aGlzLnNldChcblxuXHRcdFx0MSwgMCwgMCwgeCxcblx0XHRcdDAsIDEsIDAsIHksXG5cdFx0XHQwLCAwLCAxLCB6LFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25YKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIDAsIDAsIDAsXG5cdFx0XHQwLCBjLCAtIHMsIDAsXG5cdFx0XHQwLCBzLCBjLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25ZKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdCBjLCAwLCBzLCAwLFxuXHRcdFx0IDAsIDEsIDAsIDAsXG5cdFx0XHQtIHMsIDAsIGMsIDAsXG5cdFx0XHQgMCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25aKCB0aGV0YSApIHtcblxuXHRcdGNvbnN0IGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApO1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdGMsIC0gcywgMCwgMCxcblx0XHRcdHMsIGMsIDAsIDAsXG5cdFx0XHQwLCAwLCAxLCAwLFxuXHRcdFx0MCwgMCwgMCwgMVxuXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtYWtlUm90YXRpb25BeGlzKCBheGlzLCBhbmdsZSApIHtcblxuXHRcdC8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcFxuXG5cdFx0Y29uc3QgYyA9IE1hdGguY29zKCBhbmdsZSApO1xuXHRcdGNvbnN0IHMgPSBNYXRoLnNpbiggYW5nbGUgKTtcblx0XHRjb25zdCB0ID0gMSAtIGM7XG5cdFx0Y29uc3QgeCA9IGF4aXMueCwgeSA9IGF4aXMueSwgeiA9IGF4aXMuejtcblx0XHRjb25zdCB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5O1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHR4ICogeCArIGMsIHR4ICogeSAtIHMgKiB6LCB0eCAqIHogKyBzICogeSwgMCxcblx0XHRcdHR4ICogeSArIHMgKiB6LCB0eSAqIHkgKyBjLCB0eSAqIHogLSBzICogeCwgMCxcblx0XHRcdHR4ICogeiAtIHMgKiB5LCB0eSAqIHogKyBzICogeCwgdCAqIHogKiB6ICsgYywgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVNjYWxlKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdHgsIDAsIDAsIDAsXG5cdFx0XHQwLCB5LCAwLCAwLFxuXHRcdFx0MCwgMCwgeiwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVNoZWFyKCB4LCB5LCB6ICkge1xuXG5cdFx0dGhpcy5zZXQoXG5cblx0XHRcdDEsIHksIHosIDAsXG5cdFx0XHR4LCAxLCB6LCAwLFxuXHRcdFx0eCwgeSwgMSwgMCxcblx0XHRcdDAsIDAsIDAsIDFcblxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29tcG9zZSggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0Y29uc3QgeCA9IHF1YXRlcm5pb24uX3gsIHkgPSBxdWF0ZXJuaW9uLl95LCB6ID0gcXVhdGVybmlvbi5feiwgdyA9IHF1YXRlcm5pb24uX3c7XG5cdFx0Y29uc3QgeDIgPSB4ICsgeCxcdHkyID0geSArIHksIHoyID0geiArIHo7XG5cdFx0Y29uc3QgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6Mjtcblx0XHRjb25zdCB5eSA9IHkgKiB5MiwgeXogPSB5ICogejIsIHp6ID0geiAqIHoyO1xuXHRcdGNvbnN0IHd4ID0gdyAqIHgyLCB3eSA9IHcgKiB5Miwgd3ogPSB3ICogejI7XG5cblx0XHRjb25zdCBzeCA9IHNjYWxlLngsIHN5ID0gc2NhbGUueSwgc3ogPSBzY2FsZS56O1xuXG5cdFx0dGVbIDAgXSA9ICggMSAtICggeXkgKyB6eiApICkgKiBzeDtcblx0XHR0ZVsgMSBdID0gKCB4eSArIHd6ICkgKiBzeDtcblx0XHR0ZVsgMiBdID0gKCB4eiAtIHd5ICkgKiBzeDtcblx0XHR0ZVsgMyBdID0gMDtcblxuXHRcdHRlWyA0IF0gPSAoIHh5IC0gd3ogKSAqIHN5O1xuXHRcdHRlWyA1IF0gPSAoIDEgLSAoIHh4ICsgenogKSApICogc3k7XG5cdFx0dGVbIDYgXSA9ICggeXogKyB3eCApICogc3k7XG5cdFx0dGVbIDcgXSA9IDA7XG5cblx0XHR0ZVsgOCBdID0gKCB4eiArIHd5ICkgKiBzejtcblx0XHR0ZVsgOSBdID0gKCB5eiAtIHd4ICkgKiBzejtcblx0XHR0ZVsgMTAgXSA9ICggMSAtICggeHggKyB5eSApICkgKiBzejtcblx0XHR0ZVsgMTEgXSA9IDA7XG5cblx0XHR0ZVsgMTIgXSA9IHBvc2l0aW9uLng7XG5cdFx0dGVbIDEzIF0gPSBwb3NpdGlvbi55O1xuXHRcdHRlWyAxNCBdID0gcG9zaXRpb24uejtcblx0XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGVjb21wb3NlKCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgc2NhbGUgKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cblx0XHRsZXQgc3ggPSBfdjEkNS5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTtcblx0XHRjb25zdCBzeSA9IF92MSQ1LnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpO1xuXHRcdGNvbnN0IHN6ID0gX3YxJDUuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpO1xuXG5cdFx0Ly8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGVcblx0XHRjb25zdCBkZXQgPSB0aGlzLmRldGVybWluYW50KCk7XG5cdFx0aWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4O1xuXG5cdFx0cG9zaXRpb24ueCA9IHRlWyAxMiBdO1xuXHRcdHBvc2l0aW9uLnkgPSB0ZVsgMTMgXTtcblx0XHRwb3NpdGlvbi56ID0gdGVbIDE0IF07XG5cblx0XHQvLyBzY2FsZSB0aGUgcm90YXRpb24gcGFydFxuXHRcdF9tMSQyLmNvcHkoIHRoaXMgKTtcblxuXHRcdGNvbnN0IGludlNYID0gMSAvIHN4O1xuXHRcdGNvbnN0IGludlNZID0gMSAvIHN5O1xuXHRcdGNvbnN0IGludlNaID0gMSAvIHN6O1xuXG5cdFx0X20xJDIuZWxlbWVudHNbIDAgXSAqPSBpbnZTWDtcblx0XHRfbTEkMi5lbGVtZW50c1sgMSBdICo9IGludlNYO1xuXHRcdF9tMSQyLmVsZW1lbnRzWyAyIF0gKj0gaW52U1g7XG5cblx0XHRfbTEkMi5lbGVtZW50c1sgNCBdICo9IGludlNZO1xuXHRcdF9tMSQyLmVsZW1lbnRzWyA1IF0gKj0gaW52U1k7XG5cdFx0X20xJDIuZWxlbWVudHNbIDYgXSAqPSBpbnZTWTtcblxuXHRcdF9tMSQyLmVsZW1lbnRzWyA4IF0gKj0gaW52U1o7XG5cdFx0X20xJDIuZWxlbWVudHNbIDkgXSAqPSBpbnZTWjtcblx0XHRfbTEkMi5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjtcblxuXHRcdHF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMiApO1xuXG5cdFx0c2NhbGUueCA9IHN4O1xuXHRcdHNjYWxlLnkgPSBzeTtcblx0XHRzY2FsZS56ID0gc3o7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApIHtcblxuXHRcdGlmICggZmFyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tYWtlUGVyc3BlY3RpdmUoKSBoYXMgYmVlbiByZWRlZmluZWQgYW5kIGhhcyBhIG5ldyBzaWduYXR1cmUuIFBsZWFzZSBjaGVjayB0aGUgZG9jcy4nICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgeCA9IDIgKiBuZWFyIC8gKCByaWdodCAtIGxlZnQgKTtcblx0XHRjb25zdCB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApO1xuXG5cdFx0Y29uc3QgYSA9ICggcmlnaHQgKyBsZWZ0ICkgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdGNvbnN0IGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTtcblx0XHRjb25zdCBjID0gLSAoIGZhciArIG5lYXIgKSAvICggZmFyIC0gbmVhciApO1xuXHRcdGNvbnN0IGQgPSAtIDIgKiBmYXIgKiBuZWFyIC8gKCBmYXIgLSBuZWFyICk7XG5cblx0XHR0ZVsgMCBdID0geDtcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IGE7XHR0ZVsgMTIgXSA9IDA7XG5cdFx0dGVbIDEgXSA9IDA7XHR0ZVsgNSBdID0geTtcdHRlWyA5IF0gPSBiO1x0dGVbIDEzIF0gPSAwO1xuXHRcdHRlWyAyIF0gPSAwO1x0dGVbIDYgXSA9IDA7XHR0ZVsgMTAgXSA9IGM7XHR0ZVsgMTQgXSA9IGQ7XG5cdFx0dGVbIDMgXSA9IDA7XHR0ZVsgNyBdID0gMDtcdHRlWyAxMSBdID0gLSAxO1x0dGVbIDE1IF0gPSAwO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdG1ha2VPcnRob2dyYXBoaWMoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXHRcdGNvbnN0IHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApO1xuXHRcdGNvbnN0IGggPSAxLjAgLyAoIHRvcCAtIGJvdHRvbSApO1xuXHRcdGNvbnN0IHAgPSAxLjAgLyAoIGZhciAtIG5lYXIgKTtcblxuXHRcdGNvbnN0IHggPSAoIHJpZ2h0ICsgbGVmdCApICogdztcblx0XHRjb25zdCB5ID0gKCB0b3AgKyBib3R0b20gKSAqIGg7XG5cdFx0Y29uc3QgeiA9ICggZmFyICsgbmVhciApICogcDtcblxuXHRcdHRlWyAwIF0gPSAyICogdztcdHRlWyA0IF0gPSAwO1x0dGVbIDggXSA9IDA7XHR0ZVsgMTIgXSA9IC0geDtcblx0XHR0ZVsgMSBdID0gMDtcdHRlWyA1IF0gPSAyICogaDtcdHRlWyA5IF0gPSAwO1x0dGVbIDEzIF0gPSAtIHk7XG5cdFx0dGVbIDIgXSA9IDA7XHR0ZVsgNiBdID0gMDtcdHRlWyAxMCBdID0gLSAyICogcDtcdHRlWyAxNCBdID0gLSB6O1xuXHRcdHRlWyAzIF0gPSAwO1x0dGVbIDcgXSA9IDA7XHR0ZVsgMTEgXSA9IDA7XHR0ZVsgMTUgXSA9IDE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBtYXRyaXggKSB7XG5cblx0XHRjb25zdCB0ZSA9IHRoaXMuZWxlbWVudHM7XG5cdFx0Y29uc3QgbWUgPSBtYXRyaXguZWxlbWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0aWYgKCB0ZVsgaSBdICE9PSBtZVsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCAxNjsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgdGUgPSB0aGlzLmVsZW1lbnRzO1xuXG5cdFx0YXJyYXlbIG9mZnNldCBdID0gdGVbIDAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGVbIDMgXTtcblxuXHRcdGFycmF5WyBvZmZzZXQgKyA0IF0gPSB0ZVsgNCBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA2IF0gPSB0ZVsgNiBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyA3IF0gPSB0ZVsgNyBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDggXSA9IHRlWyA4IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDEwIF0gPSB0ZVsgMTAgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTEgXSA9IHRlWyAxMSBdO1xuXG5cdFx0YXJyYXlbIG9mZnNldCArIDEyIF0gPSB0ZVsgMTIgXTtcblx0XHRhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdO1xuXHRcdGFycmF5WyBvZmZzZXQgKyAxNCBdID0gdGVbIDE0IF07XG5cdFx0YXJyYXlbIG9mZnNldCArIDE1IF0gPSB0ZVsgMTUgXTtcblxuXHRcdHJldHVybiBhcnJheTtcblxuXHR9XG5cbn1cblxuTWF0cml4NC5wcm90b3R5cGUuaXNNYXRyaXg0ID0gdHJ1ZTtcblxuY29uc3QgX3YxJDUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbTEkMiA9IC8qQF9fUFVSRV9fKi8gbmV3IE1hdHJpeDQoKTtcbmNvbnN0IF96ZXJvID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMCwgMCwgMCApO1xuY29uc3QgX29uZSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcbmNvbnN0IF94ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3kgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfeiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX21hdHJpeCQxID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX3F1YXRlcm5pb24kMyA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcblxuY2xhc3MgRXVsZXIge1xuXG5cdGNvbnN0cnVjdG9yKCB4ID0gMCwgeSA9IDAsIHogPSAwLCBvcmRlciA9IEV1bGVyLkRlZmF1bHRPcmRlciApIHtcblxuXHRcdHRoaXMuX3ggPSB4O1xuXHRcdHRoaXMuX3kgPSB5O1xuXHRcdHRoaXMuX3ogPSB6O1xuXHRcdHRoaXMuX29yZGVyID0gb3JkZXI7XG5cblx0fVxuXG5cdGdldCB4KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3g7XG5cblx0fVxuXG5cdHNldCB4KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3ggPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCB5KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3k7XG5cblx0fVxuXG5cdHNldCB5KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3kgPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCB6KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3o7XG5cblx0fVxuXG5cdHNldCB6KCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX3ogPSB2YWx1ZTtcblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0fVxuXG5cdGdldCBvcmRlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9vcmRlcjtcblxuXHR9XG5cblx0c2V0IG9yZGVyKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuX29yZGVyID0gdmFsdWU7XG5cdFx0dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdH1cblxuXHRzZXQoIHgsIHksIHosIG9yZGVyICkge1xuXG5cdFx0dGhpcy5feCA9IHg7XG5cdFx0dGhpcy5feSA9IHk7XG5cdFx0dGhpcy5feiA9IHo7XG5cdFx0dGhpcy5fb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fb3JkZXIgKTtcblxuXHR9XG5cblx0Y29weSggZXVsZXIgKSB7XG5cblx0XHR0aGlzLl94ID0gZXVsZXIuX3g7XG5cdFx0dGhpcy5feSA9IGV1bGVyLl95O1xuXHRcdHRoaXMuX3ogPSBldWxlci5fejtcblx0XHR0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjtcblxuXHRcdHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUm90YXRpb25NYXRyaXgoIG0sIG9yZGVyLCB1cGRhdGUgKSB7XG5cblx0XHRjb25zdCBjbGFtcCA9IE1hdGhVdGlscy5jbGFtcDtcblxuXHRcdC8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpXG5cblx0XHRjb25zdCB0ZSA9IG0uZWxlbWVudHM7XG5cdFx0Y29uc3QgbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXTtcblx0XHRjb25zdCBtMjEgPSB0ZVsgMSBdLCBtMjIgPSB0ZVsgNSBdLCBtMjMgPSB0ZVsgOSBdO1xuXHRcdGNvbnN0IG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdO1xuXG5cdFx0b3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjtcblxuXHRcdHN3aXRjaCAoIG9yZGVyICkge1xuXG5cdFx0XHRjYXNlICdYWVonOlxuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hdGFuMiggLSBtMjMsIG0zMyApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTExICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSAwO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVhaJzpcblxuXHRcdFx0XHR0aGlzLl94ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMjMsIC0gMSwgMSApICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggbTIzICkgPCAwLjk5OTk5OTkgKSB7XG5cblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIC0gbTMxLCBtMTEgKTtcblx0XHRcdFx0XHR0aGlzLl96ID0gMDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1pYWSc6XG5cblx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXNpbiggY2xhbXAoIG0zMiwgLSAxLCAxICkgKTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzIgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmF0YW4yKCAtIG0zMSwgbTMzICk7XG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XG5cdFx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdaWVgnOlxuXG5cdFx0XHRcdHRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTtcblxuXHRcdFx0XHRpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTk5OSApIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0zMyApO1xuXHRcdFx0XHRcdHRoaXMuX3ogPSBNYXRoLmF0YW4yKCBtMjEsIG0xMSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hdGFuMiggLSBtMTIsIG0yMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnWVpYJzpcblxuXHRcdFx0XHR0aGlzLl96ID0gTWF0aC5hc2luKCBjbGFtcCggbTIxLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0yMSApIDwgMC45OTk5OTk5ICkge1xuXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTtcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHR0aGlzLl94ID0gMDtcblx0XHRcdFx0XHR0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1haWSc6XG5cblx0XHRcdFx0dGhpcy5feiA9IE1hdGguYXNpbiggLSBjbGFtcCggbTEyLCAtIDEsIDEgKSApO1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIG0xMiApIDwgMC45OTk5OTk5ICkge1xuXG5cdFx0XHRcdFx0dGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTIyICk7XG5cdFx0XHRcdFx0dGhpcy5feSA9IE1hdGguYXRhbjIoIG0xMywgbTExICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7XG5cdFx0XHRcdFx0dGhpcy5feSA9IDA7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogJyArIG9yZGVyICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9vcmRlciA9IG9yZGVyO1xuXG5cdFx0aWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21RdWF0ZXJuaW9uKCBxLCBvcmRlciwgdXBkYXRlICkge1xuXG5cdFx0X21hdHJpeCQxLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCBxICk7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoIF9tYXRyaXgkMSwgb3JkZXIsIHVwZGF0ZSApO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiwgb3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5zZXQoIHYueCwgdi55LCB2LnosIG9yZGVyIHx8IHRoaXMuX29yZGVyICk7XG5cblx0fVxuXG5cdHJlb3JkZXIoIG5ld09yZGVyICkge1xuXG5cdFx0Ly8gV0FSTklORzogdGhpcyBkaXNjYXJkcyByZXZvbHV0aW9uIGluZm9ybWF0aW9uIC1iaG91c3RvblxuXG5cdFx0X3F1YXRlcm5pb24kMy5zZXRGcm9tRXVsZXIoIHRoaXMgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21RdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiQzLCBuZXdPcmRlciApO1xuXG5cdH1cblxuXHRlcXVhbHMoIGV1bGVyICkge1xuXG5cdFx0cmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApO1xuXG5cdH1cblxuXHRmcm9tQXJyYXkoIGFycmF5ICkge1xuXG5cdFx0dGhpcy5feCA9IGFycmF5WyAwIF07XG5cdFx0dGhpcy5feSA9IGFycmF5WyAxIF07XG5cdFx0dGhpcy5feiA9IGFycmF5WyAyIF07XG5cdFx0aWYgKCBhcnJheVsgMyBdICE9PSB1bmRlZmluZWQgKSB0aGlzLl9vcmRlciA9IGFycmF5WyAzIF07XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9BcnJheSggYXJyYXkgPSBbXSwgb2Zmc2V0ID0gMCApIHtcblxuXHRcdGFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7XG5cdFx0YXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuX3o7XG5cdFx0YXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHR0b1ZlY3RvcjMoIG9wdGlvbmFsUmVzdWx0ICkge1xuXG5cdFx0aWYgKCBvcHRpb25hbFJlc3VsdCApIHtcblxuXHRcdFx0cmV0dXJuIG9wdGlvbmFsUmVzdWx0LnNldCggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9vbkNoYW5nZSggY2FsbGJhY2sgKSB7XG5cblx0XHR0aGlzLl9vbkNoYW5nZUNhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0X29uQ2hhbmdlQ2FsbGJhY2soKSB7fVxuXG59XG5cbkV1bGVyLnByb3RvdHlwZS5pc0V1bGVyID0gdHJ1ZTtcblxuRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7XG5FdWxlci5Sb3RhdGlvbk9yZGVycyA9IFsgJ1hZWicsICdZWlgnLCAnWlhZJywgJ1haWScsICdZWFonLCAnWllYJyBdO1xuXG5jbGFzcyBMYXllcnMge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy5tYXNrID0gMSB8IDA7XG5cblx0fVxuXG5cdHNldCggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fVxuXG5cdGVuYWJsZSggY2hhbm5lbCApIHtcblxuXHRcdHRoaXMubWFzayB8PSAxIDw8IGNoYW5uZWwgfCAwO1xuXG5cdH1cblxuXHRlbmFibGVBbGwoKSB7XG5cblx0XHR0aGlzLm1hc2sgPSAweGZmZmZmZmZmIHwgMDtcblxuXHR9XG5cblx0dG9nZ2xlKCBjaGFubmVsICkge1xuXG5cdFx0dGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7XG5cblx0fVxuXG5cdGRpc2FibGUoIGNoYW5uZWwgKSB7XG5cblx0XHR0aGlzLm1hc2sgJj0gfiAoIDEgPDwgY2hhbm5lbCB8IDAgKTtcblxuXHR9XG5cblx0ZGlzYWJsZUFsbCgpIHtcblxuXHRcdHRoaXMubWFzayA9IDA7XG5cblx0fVxuXG5cdHRlc3QoIGxheWVycyApIHtcblxuXHRcdHJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7XG5cblx0fVxuXG59XG5cbmxldCBfb2JqZWN0M0RJZCA9IDA7XG5cbmNvbnN0IF92MSQ0ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9xMSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5jb25zdCBfbTEkMSA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX3Bvc2l0aW9uJDMgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3NjYWxlJDIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3F1YXRlcm5pb24kMiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cbmNvbnN0IF94QXhpcyA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7XG5jb25zdCBfeUF4aXMgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuY29uc3QgX3pBeGlzID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKTtcblxuY29uc3QgX2FkZGVkRXZlbnQgPSB7IHR5cGU6ICdhZGRlZCcgfTtcbmNvbnN0IF9yZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICdyZW1vdmVkJyB9O1xuXG5mdW5jdGlvbiBPYmplY3QzRCgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9vYmplY3QzRElkICsrIH0gKTtcblxuXHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0dGhpcy5uYW1lID0gJyc7XG5cdHRoaXMudHlwZSA9ICdPYmplY3QzRCc7XG5cblx0dGhpcy5wYXJlbnQgPSBudWxsO1xuXHR0aGlzLmNoaWxkcmVuID0gW107XG5cblx0dGhpcy51cCA9IE9iamVjdDNELkRlZmF1bHRVcC5jbG9uZSgpO1xuXG5cdGNvbnN0IHBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTtcblx0Y29uc3Qgcm90YXRpb24gPSBuZXcgRXVsZXIoKTtcblx0Y29uc3QgcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdGNvbnN0IHNjYWxlID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTtcblxuXHRmdW5jdGlvbiBvblJvdGF0aW9uQ2hhbmdlKCkge1xuXG5cdFx0cXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIHJvdGF0aW9uLCBmYWxzZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblF1YXRlcm5pb25DaGFuZ2UoKSB7XG5cblx0XHRyb3RhdGlvbi5zZXRGcm9tUXVhdGVybmlvbiggcXVhdGVybmlvbiwgdW5kZWZpbmVkLCBmYWxzZSApO1xuXG5cdH1cblxuXHRyb3RhdGlvbi5fb25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTtcblx0cXVhdGVybmlvbi5fb25DaGFuZ2UoIG9uUXVhdGVybmlvbkNoYW5nZSApO1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0cG9zaXRpb246IHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHR2YWx1ZTogcG9zaXRpb25cblx0XHR9LFxuXHRcdHJvdGF0aW9uOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHJvdGF0aW9uXG5cdFx0fSxcblx0XHRxdWF0ZXJuaW9uOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHF1YXRlcm5pb25cblx0XHR9LFxuXHRcdHNjYWxlOiB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHNjYWxlXG5cdFx0fSxcblx0XHRtb2RlbFZpZXdNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4NCgpXG5cdFx0fSxcblx0XHRub3JtYWxNYXRyaXg6IHtcblx0XHRcdHZhbHVlOiBuZXcgTWF0cml4MygpXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLm1hdHJpeFdvcmxkID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTtcblx0dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7XG5cdHRoaXMudmlzaWJsZSA9IHRydWU7XG5cblx0dGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7XG5cdHRoaXMucmVjZWl2ZVNoYWRvdyA9IGZhbHNlO1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7XG5cdHRoaXMucmVuZGVyT3JkZXIgPSAwO1xuXG5cdHRoaXMuYW5pbWF0aW9ucyA9IFtdO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxufVxuXG5PYmplY3QzRC5EZWZhdWx0VXAgPSBuZXcgVmVjdG9yMyggMCwgMSwgMCApO1xuT2JqZWN0M0QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUgPSB0cnVlO1xuXG5PYmplY3QzRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogT2JqZWN0M0QsXG5cblx0aXNPYmplY3QzRDogdHJ1ZSxcblxuXHRvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sXG5cdG9uQWZ0ZXJSZW5kZXI6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHRpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLm1hdHJpeC5wcmVtdWx0aXBseSggbWF0cml4ICk7XG5cblx0XHR0aGlzLm1hdHJpeC5kZWNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApO1xuXG5cdH0sXG5cblx0YXBwbHlRdWF0ZXJuaW9uOiBmdW5jdGlvbiAoIHEgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIHEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tRXVsZXI6IGZ1bmN0aW9uICggZXVsZXIgKSB7XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKCBldWxlciwgdHJ1ZSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHQvLyBhc3N1bWVzIHRoZSB1cHBlciAzeDMgb2YgbSBpcyBhIHB1cmUgcm90YXRpb24gbWF0cml4IChpLmUsIHVuc2NhbGVkKVxuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggbSApO1xuXG5cdH0sXG5cblx0c2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkge1xuXG5cdFx0Ly8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7XG5cblx0fSxcblxuXHRyb3RhdGVPbkF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gb2JqZWN0IHNwYWNlXG5cdFx0Ly8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdF9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApO1xuXG5cdFx0dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBfcTEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cm90YXRlT25Xb3JsZEF4aXM6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7XG5cblx0XHQvLyByb3RhdGUgb2JqZWN0IG9uIGF4aXMgaW4gd29ybGQgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXHRcdC8vIG1ldGhvZCBhc3N1bWVzIG5vIHJvdGF0ZWQgcGFyZW50XG5cblx0XHRfcTEuc2V0RnJvbUF4aXNBbmdsZSggYXhpcywgYW5nbGUgKTtcblxuXHRcdHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseSggX3ExICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF94QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVk6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF95QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHJvdGF0ZVo6IGZ1bmN0aW9uICggYW5nbGUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF96QXhpcywgYW5nbGUgKTtcblxuXHR9LFxuXG5cdHRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBkaXN0YW5jZSApIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2Vcblx0XHQvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZFxuXG5cdFx0X3YxJDQuY29weSggYXhpcyApLmFwcGx5UXVhdGVybmlvbiggdGhpcy5xdWF0ZXJuaW9uICk7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmFkZCggX3YxJDQubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWDogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3hBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3lBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0dHJhbnNsYXRlWjogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3pBeGlzLCBkaXN0YW5jZSApO1xuXG5cdH0sXG5cblx0bG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0fSxcblxuXHR3b3JsZFRvTG9jYWw6IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdFx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIF9tMSQxLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKSApO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7XG5cblx0XHQvLyBUaGlzIG1ldGhvZCBkb2VzIG5vdCBzdXBwb3J0IG9iamVjdHMgaGF2aW5nIG5vbi11bmlmb3JtbHktc2NhbGVkIHBhcmVudChzKVxuXG5cdFx0aWYgKCB4LmlzVmVjdG9yMyApIHtcblxuXHRcdFx0X3RhcmdldC5jb3B5KCB4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdGFyZ2V0LnNldCggeCwgeSwgeiApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0X3Bvc2l0aW9uJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRpZiAoIHRoaXMuaXNDYW1lcmEgfHwgdGhpcy5pc0xpZ2h0ICkge1xuXG5cdFx0XHRfbTEkMS5sb29rQXQoIF9wb3NpdGlvbiQzLCBfdGFyZ2V0LCB0aGlzLnVwICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfbTEkMS5sb29rQXQoIF90YXJnZXQsIF9wb3NpdGlvbiQzLCB0aGlzLnVwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXG5cdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdF9tMSQxLmV4dHJhY3RSb3RhdGlvbiggcGFyZW50Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRfcTEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApO1xuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEuaW52ZXJ0KCkgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QgPT09IHRoaXMgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW5cXCd0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLicsIG9iamVjdCApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApIHtcblxuXHRcdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdG9iamVjdC5wYXJlbnQucmVtb3ZlKCBvYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gdGhpcztcblx0XHRcdHRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfYWRkZWRFdmVudCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4nLCBvYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZiggb2JqZWN0ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdG9iamVjdC5wYXJlbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5jaGlsZHJlbi5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdG9iamVjdC5kaXNwYXRjaEV2ZW50KCBfcmVtb3ZlZEV2ZW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsZWFyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gdGhpcy5jaGlsZHJlblsgaSBdO1xuXG5cdFx0XHRvYmplY3QucGFyZW50ID0gbnVsbDtcblxuXHRcdFx0b2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9yZW1vdmVkRXZlbnQgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuY2hpbGRyZW4ubGVuZ3RoID0gMDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cblx0fSxcblxuXHRhdHRhY2g6IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0Ly8gYWRkcyBvYmplY3QgYXMgYSBjaGlsZCBvZiB0aGlzLCB3aGlsZSBtYWludGFpbmluZyB0aGUgb2JqZWN0J3Mgd29ybGQgdHJhbnNmb3JtXG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0X20xJDEuY29weSggdGhpcy5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXG5cdFx0aWYgKCBvYmplY3QucGFyZW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRvYmplY3QucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0XHRfbTEkMS5tdWx0aXBseSggb2JqZWN0LnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0fVxuXG5cdFx0b2JqZWN0LmFwcGx5TWF0cml4NCggX20xJDEgKTtcblxuXHRcdHRoaXMuYWRkKCBvYmplY3QgKTtcblxuXHRcdG9iamVjdC51cGRhdGVXb3JsZE1hdHJpeCggZmFsc2UsIHRydWUgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlJZDogZnVuY3Rpb24gKCBpZCApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICdpZCcsIGlkICk7XG5cblx0fSxcblxuXHRnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdHJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApO1xuXG5cdH0sXG5cblx0Z2V0T2JqZWN0QnlQcm9wZXJ0eTogZnVuY3Rpb24gKCBuYW1lLCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpc1sgbmFtZSBdID09PSB2YWx1ZSApIHJldHVybiB0aGlzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5bIGkgXTtcblx0XHRcdGNvbnN0IG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cblx0XHRcdGlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG9iamVjdDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGdldFdvcmxkUG9zaXRpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHR9LFxuXG5cdGdldFdvcmxkUXVhdGVybmlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24kMywgdGFyZ2V0LCBfc2NhbGUkMiApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9LFxuXG5cdGdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFNjYWxlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiQzLCBfcXVhdGVybmlvbiQyLCB0YXJnZXQgKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fSxcblxuXHRnZXRXb3JsZERpcmVjdGlvbjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0Y29uc3QgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggZVsgOCBdLCBlWyA5IF0sIGVbIDEwIF0gKS5ub3JtYWxpemUoKTtcblxuXHR9LFxuXG5cdHJheWNhc3Q6IGZ1bmN0aW9uICgpIHt9LFxuXG5cdHRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0Y2FsbGJhY2soIHRoaXMgKTtcblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZVZpc2libGU6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjYWxsYmFjayggdGhpcyApO1xuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y2hpbGRyZW5bIGkgXS50cmF2ZXJzZVZpc2libGUoIGNhbGxiYWNrICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0cmF2ZXJzZUFuY2VzdG9yczogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCBwYXJlbnQgIT09IG51bGwgKSB7XG5cblx0XHRcdGNhbGxiYWNrKCBwYXJlbnQgKTtcblxuXHRcdFx0cGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm1hdHJpeC5jb21wb3NlKCB0aGlzLnBvc2l0aW9uLCB0aGlzLnF1YXRlcm5pb24sIHRoaXMuc2NhbGUgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fSxcblxuXHR1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTtcblxuXHRcdGlmICggdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlIHx8IGZvcmNlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weSggdGhpcy5tYXRyaXggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHRmb3JjZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHQvLyB1cGRhdGUgY2hpbGRyZW5cblxuXHRcdGNvbnN0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVXb3JsZE1hdHJpeDogZnVuY3Rpb24gKCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHtcblxuXHRcdGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50O1xuXG5cdFx0aWYgKCB1cGRhdGVQYXJlbnRzID09PSB0cnVlICYmIHBhcmVudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0cGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCB0aGlzLm1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjaGlsZHJlblxuXG5cdFx0aWYgKCB1cGRhdGVDaGlsZHJlbiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCB0cnVlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Ly8gbWV0YSBpcyBhIHN0cmluZyB3aGVuIGNhbGxlZCBmcm9tIEpTT04uc3RyaW5naWZ5XG5cdFx0Y29uc3QgaXNSb290T2JqZWN0ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRjb25zdCBvdXRwdXQgPSB7fTtcblxuXHRcdC8vIG1ldGEgaXMgYSBoYXNoIHVzZWQgdG8gY29sbGVjdCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMuXG5cdFx0Ly8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3Rcblx0XHQvLyBiZWluZyBzZXJpYWxpemVkLlxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXplIG1ldGEgb2JqXG5cdFx0XHRtZXRhID0ge1xuXHRcdFx0XHRnZW9tZXRyaWVzOiB7fSxcblx0XHRcdFx0bWF0ZXJpYWxzOiB7fSxcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9LFxuXHRcdFx0XHRzaGFwZXM6IHt9LFxuXHRcdFx0XHRza2VsZXRvbnM6IHt9LFxuXHRcdFx0XHRhbmltYXRpb25zOiB7fVxuXHRcdFx0fTtcblxuXHRcdFx0b3V0cHV0Lm1ldGFkYXRhID0ge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdPYmplY3QnLFxuXHRcdFx0XHRnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nXG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvblxuXG5cdFx0Y29uc3Qgb2JqZWN0ID0ge307XG5cblx0XHRvYmplY3QudXVpZCA9IHRoaXMudXVpZDtcblx0XHRvYmplY3QudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIG9iamVjdC5uYW1lID0gdGhpcy5uYW1lO1xuXHRcdGlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5yZWNlaXZlU2hhZG93ID09PSB0cnVlICkgb2JqZWN0LnJlY2VpdmVTaGFkb3cgPSB0cnVlO1xuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIG9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0aWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTtcblx0XHRpZiAoIHRoaXMucmVuZGVyT3JkZXIgIT09IDAgKSBvYmplY3QucmVuZGVyT3JkZXIgPSB0aGlzLnJlbmRlck9yZGVyO1xuXHRcdGlmICggSlNPTi5zdHJpbmdpZnkoIHRoaXMudXNlckRhdGEgKSAhPT0gJ3t9JyApIG9iamVjdC51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7XG5cblx0XHRvYmplY3QubGF5ZXJzID0gdGhpcy5sYXllcnMubWFzaztcblx0XHRvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpO1xuXG5cdFx0aWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdC8vIG9iamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzXG5cblx0XHRpZiAoIHRoaXMuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRvYmplY3QudHlwZSA9ICdJbnN0YW5jZWRNZXNoJztcblx0XHRcdG9iamVjdC5jb3VudCA9IHRoaXMuY291bnQ7XG5cdFx0XHRvYmplY3QuaW5zdGFuY2VNYXRyaXggPSB0aGlzLmluc3RhbmNlTWF0cml4LnRvSlNPTigpO1xuXHRcdFx0aWYgKCB0aGlzLmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IHRoaXMuaW5zdGFuY2VDb2xvci50b0pTT04oKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7XG5cblx0XHRcdGlmICggbGlicmFyeVsgZWxlbWVudC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW1lbnQudXVpZDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc01lc2ggfHwgdGhpcy5pc0xpbmUgfHwgdGhpcy5pc1BvaW50cyApIHtcblxuXHRcdFx0b2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTtcblxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztcblxuXHRcdFx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgJiYgcGFyYW1ldGVycy5zaGFwZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZXMgPSBwYXJhbWV0ZXJzLnNoYXBlcztcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5zaGFwZXMsIHNoYXBlcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmlzU2tpbm5lZE1lc2ggKSB7XG5cblx0XHRcdG9iamVjdC5iaW5kTW9kZSA9IHRoaXMuYmluZE1vZGU7XG5cdFx0XHRvYmplY3QuYmluZE1hdHJpeCA9IHRoaXMuYmluZE1hdHJpeC50b0FycmF5KCk7XG5cblx0XHRcdGlmICggdGhpcy5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNlcmlhbGl6ZSggbWV0YS5za2VsZXRvbnMsIHRoaXMuc2tlbGV0b24gKTtcblxuXHRcdFx0XHRvYmplY3Quc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uLnV1aWQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRjb25zdCB1dWlkcyA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHV1aWRzO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG9iamVjdC5tYXRlcmlhbCA9IHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5jaGlsZHJlbi5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRvYmplY3QuY2hpbGRyZW4gPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5hbmltYXRpb25zLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdG9iamVjdC5hbmltYXRpb25zID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zWyBpIF07XG5cblx0XHRcdFx0b2JqZWN0LmFuaW1hdGlvbnMucHVzaCggc2VyaWFsaXplKCBtZXRhLmFuaW1hdGlvbnMsIGFuaW1hdGlvbiApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290T2JqZWN0ICkge1xuXG5cdFx0XHRjb25zdCBnZW9tZXRyaWVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5nZW9tZXRyaWVzICk7XG5cdFx0XHRjb25zdCBtYXRlcmlhbHMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLm1hdGVyaWFscyApO1xuXHRcdFx0Y29uc3QgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7XG5cdFx0XHRjb25zdCBpbWFnZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLmltYWdlcyApO1xuXHRcdFx0Y29uc3Qgc2hhcGVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5zaGFwZXMgKTtcblx0XHRcdGNvbnN0IHNrZWxldG9ucyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuc2tlbGV0b25zICk7XG5cdFx0XHRjb25zdCBhbmltYXRpb25zID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5hbmltYXRpb25zICk7XG5cblx0XHRcdGlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzO1xuXHRcdFx0aWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7XG5cdFx0XHRpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzO1xuXHRcdFx0aWYgKCBzaGFwZXMubGVuZ3RoID4gMCApIG91dHB1dC5zaGFwZXMgPSBzaGFwZXM7XG5cdFx0XHRpZiAoIHNrZWxldG9ucy5sZW5ndGggPiAwICkgb3V0cHV0LnNrZWxldG9ucyA9IHNrZWxldG9ucztcblx0XHRcdGlmICggYW5pbWF0aW9ucy5sZW5ndGggPiAwICkgb3V0cHV0LmFuaW1hdGlvbnMgPSBhbmltYXRpb25zO1xuXG5cdFx0fVxuXG5cdFx0b3V0cHV0Lm9iamVjdCA9IG9iamVjdDtcblxuXHRcdHJldHVybiBvdXRwdXQ7XG5cblx0XHQvLyBleHRyYWN0IGRhdGEgZnJvbSB0aGUgY2FjaGUgaGFzaFxuXHRcdC8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW1cblx0XHQvLyBhbmQgcmV0dXJuIGFzIGFycmF5XG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIGNhY2hlICkge1xuXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBjYWNoZVsga2V5IF07XG5cdFx0XHRcdGRlbGV0ZSBkYXRhLm1ldGFkYXRhO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggZGF0YSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZXM7XG5cblx0XHR9XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCByZWN1cnNpdmUgKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzLCByZWN1cnNpdmUgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgPSB0cnVlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLnVwLmNvcHkoIHNvdXJjZS51cCApO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBzb3VyY2UucG9zaXRpb24gKTtcblx0XHR0aGlzLnJvdGF0aW9uLm9yZGVyID0gc291cmNlLnJvdGF0aW9uLm9yZGVyO1xuXHRcdHRoaXMucXVhdGVybmlvbi5jb3B5KCBzb3VyY2UucXVhdGVybmlvbiApO1xuXHRcdHRoaXMuc2NhbGUuY29weSggc291cmNlLnNjYWxlICk7XG5cblx0XHR0aGlzLm1hdHJpeC5jb3B5KCBzb3VyY2UubWF0cml4ICk7XG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTtcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlO1xuXG5cdFx0dGhpcy5sYXllcnMubWFzayA9IHNvdXJjZS5sYXllcnMubWFzaztcblx0XHR0aGlzLnZpc2libGUgPSBzb3VyY2UudmlzaWJsZTtcblxuXHRcdHRoaXMuY2FzdFNoYWRvdyA9IHNvdXJjZS5jYXN0U2hhZG93O1xuXHRcdHRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93O1xuXG5cdFx0dGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7XG5cdFx0dGhpcy5yZW5kZXJPcmRlciA9IHNvdXJjZS5yZW5kZXJPcmRlcjtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gc291cmNlLmNoaWxkcmVuWyBpIF07XG5cdFx0XHRcdHRoaXMuYWRkKCBjaGlsZC5jbG9uZSgpICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBfdmVjdG9yMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92ZWN0b3IyJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4MygpO1xuXG5jbGFzcyBQbGFuZSB7XG5cblx0Y29uc3RydWN0b3IoIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICksIGNvbnN0YW50ID0gMCApIHtcblxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdHRoaXMubm9ybWFsID0gbm9ybWFsO1xuXHRcdHRoaXMuY29uc3RhbnQgPSBjb25zdGFudDtcblxuXHR9XG5cblx0c2V0KCBub3JtYWwsIGNvbnN0YW50ICkge1xuXG5cdFx0dGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7XG5cdFx0dGhpcy5jb25zdGFudCA9IGNvbnN0YW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbXBvbmVudHMoIHgsIHksIHosIHcgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5zZXQoIHgsIHksIHogKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gdztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBwb2ludCApIHtcblxuXHRcdHRoaXMubm9ybWFsLmNvcHkoIG5vcm1hbCApO1xuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tQ29wbGFuYXJQb2ludHMoIGEsIGIsIGMgKSB7XG5cblx0XHRjb25zdCBub3JtYWwgPSBfdmVjdG9yMS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIF92ZWN0b3IyJDEuc3ViVmVjdG9ycyggYSwgYiApICkubm9ybWFsaXplKCk7XG5cblx0XHQvLyBROiBzaG91bGQgYW4gZXJyb3IgYmUgdGhyb3duIGlmIG5vcm1hbCBpcyB6ZXJvIChlLmcuIGRlZ2VuZXJhdGUgcGxhbmUpP1xuXG5cdFx0dGhpcy5zZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludCggbm9ybWFsLCBhICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggcGxhbmUgKSB7XG5cblx0XHR0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTtcblx0XHR0aGlzLmNvbnN0YW50ID0gcGxhbmUuY29uc3RhbnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bm9ybWFsaXplKCkge1xuXG5cdFx0Ly8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuXG5cblx0XHRjb25zdCBpbnZlcnNlTm9ybWFsTGVuZ3RoID0gMS4wIC8gdGhpcy5ub3JtYWwubGVuZ3RoKCk7XG5cdFx0dGhpcy5ub3JtYWwubXVsdGlwbHlTY2FsYXIoIGludmVyc2VOb3JtYWxMZW5ndGggKTtcblx0XHR0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bmVnYXRlKCkge1xuXG5cdFx0dGhpcy5jb25zdGFudCAqPSAtIDE7XG5cdFx0dGhpcy5ub3JtYWwubmVnYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiB0aGlzLm5vcm1hbC5kb3QoIHBvaW50ICkgKyB0aGlzLmNvbnN0YW50O1xuXG5cdH1cblxuXHRkaXN0YW5jZVRvU3BoZXJlKCBzcGhlcmUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSAtIHNwaGVyZS5yYWRpdXM7XG5cblx0fVxuXG5cdHByb2plY3RQb2ludCggcG9pbnQsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAucHJvamVjdFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgKS5hZGQoIHBvaW50ICk7XG5cblx0fVxuXG5cdGludGVyc2VjdExpbmUoIGxpbmUsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaW50ZXJzZWN0TGluZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlyZWN0aW9uID0gbGluZS5kZWx0YSggX3ZlY3RvcjEgKTtcblxuXHRcdGNvbnN0IGRlbm9taW5hdG9yID0gdGhpcy5ub3JtYWwuZG90KCBkaXJlY3Rpb24gKTtcblxuXHRcdGlmICggZGVub21pbmF0b3IgPT09IDAgKSB7XG5cblx0XHRcdC8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW5cblx0XHRcdGlmICggdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKSA9PT0gMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGxpbmUuc3RhcnQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS5cblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yO1xuXG5cdFx0aWYgKCB0IDwgMCB8fCB0ID4gMSApIHtcblxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCBsaW5lLnN0YXJ0ICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNMaW5lKCBsaW5lICkge1xuXG5cdFx0Ly8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuXG5cblx0XHRjb25zdCBzdGFydFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5zdGFydCApO1xuXHRcdGNvbnN0IGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTtcblxuXHRcdHJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c0JveCggYm94ICkge1xuXG5cdFx0cmV0dXJuIGJveC5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICkge1xuXG5cdFx0cmV0dXJuIHNwaGVyZS5pbnRlcnNlY3RzUGxhbmUoIHRoaXMgKTtcblxuXHR9XG5cblx0Y29wbGFuYXJQb2ludCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5jb3BsYW5hclBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMubm9ybWFsICkubXVsdGlwbHlTY2FsYXIoIC0gdGhpcy5jb25zdGFudCApO1xuXG5cdH1cblxuXHRhcHBseU1hdHJpeDQoIG1hdHJpeCwgb3B0aW9uYWxOb3JtYWxNYXRyaXggKSB7XG5cblx0XHRjb25zdCBub3JtYWxNYXRyaXggPSBvcHRpb25hbE5vcm1hbE1hdHJpeCB8fCBfbm9ybWFsTWF0cml4LmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7XG5cblx0XHRjb25zdCByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggX3ZlY3RvcjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTtcblxuXHRcdHRoaXMuY29uc3RhbnQgPSAtIHJlZmVyZW5jZVBvaW50LmRvdCggbm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBwbGFuZSApIHtcblxuXHRcdHJldHVybiBwbGFuZS5ub3JtYWwuZXF1YWxzKCB0aGlzLm5vcm1hbCApICYmICggcGxhbmUuY29uc3RhbnQgPT09IHRoaXMuY29uc3RhbnQgKTtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG59XG5cblBsYW5lLnByb3RvdHlwZS5pc1BsYW5lID0gdHJ1ZTtcblxuY29uc3QgX3YwJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjEkMyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MiQyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3YzJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF92YWIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdmFjID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZiYyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92YXAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdmJwID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZjcCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgVHJpYW5nbGUge1xuXG5cdGNvbnN0cnVjdG9yKCBhID0gbmV3IFZlY3RvcjMoKSwgYiA9IG5ldyBWZWN0b3IzKCksIGMgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0dGhpcy5hID0gYTtcblx0XHR0aGlzLmIgPSBiO1xuXHRcdHRoaXMuYyA9IGM7XG5cblx0fVxuXG5cdHN0YXRpYyBnZXROb3JtYWwoIGEsIGIsIGMsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0Tm9ybWFsKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdF92MCQxLnN1YlZlY3RvcnMoIGEsIGIgKTtcblx0XHR0YXJnZXQuY3Jvc3MoIF92MCQxICk7XG5cblx0XHRjb25zdCB0YXJnZXRMZW5ndGhTcSA9IHRhcmdldC5sZW5ndGhTcSgpO1xuXHRcdGlmICggdGFyZ2V0TGVuZ3RoU3EgPiAwICkge1xuXG5cdFx0XHRyZXR1cm4gdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCAxIC8gTWF0aC5zcXJ0KCB0YXJnZXRMZW5ndGhTcSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMCwgMCwgMCApO1xuXG5cdH1cblxuXHQvLyBzdGF0aWMvaW5zdGFuY2UgbWV0aG9kIHRvIGNhbGN1bGF0ZSBiYXJ5Y2VudHJpYyBjb29yZGluYXRlc1xuXHQvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbFxuXHRzdGF0aWMgZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIGIsIGEgKTtcblx0XHRfdjIkMi5zdWJWZWN0b3JzKCBwb2ludCwgYSApO1xuXG5cdFx0Y29uc3QgZG90MDAgPSBfdjAkMS5kb3QoIF92MCQxICk7XG5cdFx0Y29uc3QgZG90MDEgPSBfdjAkMS5kb3QoIF92MSQzICk7XG5cdFx0Y29uc3QgZG90MDIgPSBfdjAkMS5kb3QoIF92MiQyICk7XG5cdFx0Y29uc3QgZG90MTEgPSBfdjEkMy5kb3QoIF92MSQzICk7XG5cdFx0Y29uc3QgZG90MTIgPSBfdjEkMy5kb3QoIF92MiQyICk7XG5cblx0XHRjb25zdCBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0QmFyeWNvb3JkKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHQvLyBjb2xsaW5lYXIgb3Igc2luZ3VsYXIgdHJpYW5nbGVcblx0XHRpZiAoIGRlbm9tID09PSAwICkge1xuXG5cdFx0XHQvLyBhcmJpdHJhcnkgbG9jYXRpb24gb3V0c2lkZSBvZiB0cmlhbmdsZT9cblx0XHRcdC8vIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgaWRlYSwgbWF5YmUgc2hvdWxkIGJlIHJldHVybmluZyB1bmRlZmluZWRcblx0XHRcdHJldHVybiB0YXJnZXQuc2V0KCAtIDIsIC0gMSwgLSAxICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbnZEZW5vbSA9IDEgLyBkZW5vbTtcblx0XHRjb25zdCB1ID0gKCBkb3QxMSAqIGRvdDAyIC0gZG90MDEgKiBkb3QxMiApICogaW52RGVub207XG5cdFx0Y29uc3QgdiA9ICggZG90MDAgKiBkb3QxMiAtIGRvdDAxICogZG90MDIgKSAqIGludkRlbm9tO1xuXG5cdFx0Ly8gYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMgbXVzdCBhbHdheXMgc3VtIHRvIDFcblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggMSAtIHUgLSB2LCB2LCB1ICk7XG5cblx0fVxuXG5cdHN0YXRpYyBjb250YWluc1BvaW50KCBwb2ludCwgYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgX3YzJDEgKTtcblxuXHRcdHJldHVybiAoIF92MyQxLnggPj0gMCApICYmICggX3YzJDEueSA+PSAwICkgJiYgKCAoIF92MyQxLnggKyBfdjMkMS55ICkgPD0gMSApO1xuXG5cdH1cblxuXHRzdGF0aWMgZ2V0VVYoIHBvaW50LCBwMSwgcDIsIHAzLCB1djEsIHV2MiwgdXYzLCB0YXJnZXQgKSB7XG5cblx0XHR0aGlzLmdldEJhcnljb29yZCggcG9pbnQsIHAxLCBwMiwgcDMsIF92MyQxICk7XG5cblx0XHR0YXJnZXQuc2V0KCAwLCAwICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYxLCBfdjMkMS54ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYyLCBfdjMkMS55ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYzLCBfdjMkMS56ICk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXG5cdH1cblxuXHRzdGF0aWMgaXNGcm9udEZhY2luZyggYSwgYiwgYywgZGlyZWN0aW9uICkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggYywgYiApO1xuXHRcdF92MSQzLnN1YlZlY3RvcnMoIGEsIGIgKTtcblxuXHRcdC8vIHN0cmljdGx5IGZyb250IGZhY2luZ1xuXHRcdHJldHVybiAoIF92MCQxLmNyb3NzKCBfdjEkMyApLmRvdCggZGlyZWN0aW9uICkgPCAwICkgPyB0cnVlIDogZmFsc2U7XG5cblx0fVxuXG5cdHNldCggYSwgYiwgYyApIHtcblxuXHRcdHRoaXMuYS5jb3B5KCBhICk7XG5cdFx0dGhpcy5iLmNvcHkoIGIgKTtcblx0XHR0aGlzLmMuY29weSggYyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21Qb2ludHNBbmRJbmRpY2VzKCBwb2ludHMsIGkwLCBpMSwgaTIgKSB7XG5cblx0XHR0aGlzLmEuY29weSggcG9pbnRzWyBpMCBdICk7XG5cdFx0dGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApO1xuXHRcdHRoaXMuYy5jb3B5KCBwb2ludHNbIGkyIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cblx0Y29weSggdHJpYW5nbGUgKSB7XG5cblx0XHR0aGlzLmEuY29weSggdHJpYW5nbGUuYSApO1xuXHRcdHRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7XG5cdFx0dGhpcy5jLmNvcHkoIHRyaWFuZ2xlLmMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRBcmVhKCkge1xuXG5cdFx0X3YwJDEuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTtcblx0XHRfdjEkMy5zdWJWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApO1xuXG5cdFx0cmV0dXJuIF92MCQxLmNyb3NzKCBfdjEkMyApLmxlbmd0aCgpICogMC41O1xuXG5cdH1cblxuXHRnZXRNaWRwb2ludCggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLmEsIHRoaXMuYiApLmFkZCggdGhpcy5jICkubXVsdGlwbHlTY2FsYXIoIDEgLyAzICk7XG5cblx0fVxuXG5cdGdldE5vcm1hbCggdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGFyZ2V0ICk7XG5cblx0fVxuXG5cdGdldFBsYW5lKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBQbGFuZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXRGcm9tQ29wbGFuYXJQb2ludHMoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTtcblxuXHR9XG5cblx0Z2V0QmFyeWNvb3JkKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApO1xuXG5cdH1cblxuXHRnZXRVViggcG9pbnQsIHV2MSwgdXYyLCB1djMsIHRhcmdldCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5nZXRVViggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHV2MSwgdXYyLCB1djMsIHRhcmdldCApO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBUcmlhbmdsZS5jb250YWluc1BvaW50KCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYyApO1xuXG5cdH1cblxuXHRpc0Zyb250RmFjaW5nKCBkaXJlY3Rpb24gKSB7XG5cblx0XHRyZXR1cm4gVHJpYW5nbGUuaXNGcm9udEZhY2luZyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgZGlyZWN0aW9uICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdHJldHVybiBib3guaW50ZXJzZWN0c1RyaWFuZ2xlKCB0aGlzICk7XG5cblx0fVxuXG5cdGNsb3Nlc3RQb2ludFRvUG9pbnQoIHAsIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgYSA9IHRoaXMuYSwgYiA9IHRoaXMuYiwgYyA9IHRoaXMuYztcblx0XHRsZXQgdiwgdztcblxuXHRcdC8vIGFsZ29yaXRobSB0aGFua3MgdG8gUmVhbC1UaW1lIENvbGxpc2lvbiBEZXRlY3Rpb24gYnkgQ2hyaXN0ZXIgRXJpY3Nvbixcblx0XHQvLyBwdWJsaXNoZWQgYnkgTW9yZ2FuIEthdWZtYW5uIFB1Ymxpc2hlcnMsIChjKSAyMDA1IEVsc2V2aWVyIEluYy4sXG5cdFx0Ly8gdW5kZXIgdGhlIGFjY29tcGFueWluZyBsaWNlbnNlOyBzZWUgY2hhcHRlciA1LjEuNSBmb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24uXG5cdFx0Ly8gYmFzaWNhbGx5LCB3ZSdyZSBkaXN0aW5ndWlzaGluZyB3aGljaCBvZiB0aGUgdm9yb25vaSByZWdpb25zIG9mIHRoZSB0cmlhbmdsZVxuXHRcdC8vIHRoZSBwb2ludCBsaWVzIGluIHdpdGggdGhlIG1pbmltdW0gYW1vdW50IG9mIHJlZHVuZGFudCBjb21wdXRhdGlvbi5cblxuXHRcdF92YWIuc3ViVmVjdG9ycyggYiwgYSApO1xuXHRcdF92YWMuc3ViVmVjdG9ycyggYywgYSApO1xuXHRcdF92YXAuc3ViVmVjdG9ycyggcCwgYSApO1xuXHRcdGNvbnN0IGQxID0gX3ZhYi5kb3QoIF92YXAgKTtcblx0XHRjb25zdCBkMiA9IF92YWMuZG90KCBfdmFwICk7XG5cdFx0aWYgKCBkMSA8PSAwICYmIGQyIDw9IDAgKSB7XG5cblx0XHRcdC8vIHZlcnRleCByZWdpb24gb2YgQTsgYmFyeWNlbnRyaWMgY29vcmRzICgxLCAwLCAwKVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBhICk7XG5cblx0XHR9XG5cblx0XHRfdmJwLnN1YlZlY3RvcnMoIHAsIGIgKTtcblx0XHRjb25zdCBkMyA9IF92YWIuZG90KCBfdmJwICk7XG5cdFx0Y29uc3QgZDQgPSBfdmFjLmRvdCggX3ZicCApO1xuXHRcdGlmICggZDMgPj0gMCAmJiBkNCA8PSBkMyApIHtcblxuXHRcdFx0Ly8gdmVydGV4IHJlZ2lvbiBvZiBCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDAsIDEsIDApXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGIgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHZjID0gZDEgKiBkNCAtIGQzICogZDI7XG5cdFx0aWYgKCB2YyA8PSAwICYmIGQxID49IDAgJiYgZDMgPD0gMCApIHtcblxuXHRcdFx0diA9IGQxIC8gKCBkMSAtIGQzICk7XG5cdFx0XHQvLyBlZGdlIHJlZ2lvbiBvZiBBQjsgYmFyeWNlbnRyaWMgY29vcmRzICgxLXYsIHYsIDApXG5cdFx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKTtcblxuXHRcdH1cblxuXHRcdF92Y3Auc3ViVmVjdG9ycyggcCwgYyApO1xuXHRcdGNvbnN0IGQ1ID0gX3ZhYi5kb3QoIF92Y3AgKTtcblx0XHRjb25zdCBkNiA9IF92YWMuZG90KCBfdmNwICk7XG5cdFx0aWYgKCBkNiA+PSAwICYmIGQ1IDw9IGQ2ICkge1xuXG5cdFx0XHQvLyB2ZXJ0ZXggcmVnaW9uIG9mIEM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMCwgMSlcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYyApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdmIgPSBkNSAqIGQyIC0gZDEgKiBkNjtcblx0XHRpZiAoIHZiIDw9IDAgJiYgZDIgPj0gMCAmJiBkNiA8PSAwICkge1xuXG5cdFx0XHR3ID0gZDIgLyAoIGQyIC0gZDYgKTtcblx0XHRcdC8vIGVkZ2UgcmVnaW9uIG9mIEFDOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdywgMCwgdylcblx0XHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdmEgPSBkMyAqIGQ2IC0gZDUgKiBkNDtcblx0XHRpZiAoIHZhIDw9IDAgJiYgKCBkNCAtIGQzICkgPj0gMCAmJiAoIGQ1IC0gZDYgKSA+PSAwICkge1xuXG5cdFx0XHRfdmJjLnN1YlZlY3RvcnMoIGMsIGIgKTtcblx0XHRcdHcgPSAoIGQ0IC0gZDMgKSAvICggKCBkNCAtIGQzICkgKyAoIGQ1IC0gZDYgKSApO1xuXHRcdFx0Ly8gZWRnZSByZWdpb24gb2YgQkM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMS13LCB3KVxuXHRcdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBiICkuYWRkU2NhbGVkVmVjdG9yKCBfdmJjLCB3ICk7IC8vIGVkZ2UgcmVnaW9uIG9mIEJDXG5cblx0XHR9XG5cblx0XHQvLyBmYWNlIHJlZ2lvblxuXHRcdGNvbnN0IGRlbm9tID0gMSAvICggdmEgKyB2YiArIHZjICk7XG5cdFx0Ly8gdSA9IHZhICogZGVub21cblx0XHR2ID0gdmIgKiBkZW5vbTtcblx0XHR3ID0gdmMgKiBkZW5vbTtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApLmFkZFNjYWxlZFZlY3RvciggX3ZhYywgdyApO1xuXG5cdH1cblxuXHRlcXVhbHMoIHRyaWFuZ2xlICkge1xuXG5cdFx0cmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApO1xuXG5cdH1cblxufVxuXG5sZXQgbWF0ZXJpYWxJZCA9IDA7XG5cbmZ1bmN0aW9uIE1hdGVyaWFsKCkge1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogbWF0ZXJpYWxJZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnTWF0ZXJpYWwnO1xuXG5cdHRoaXMuZm9nID0gdHJ1ZTtcblxuXHR0aGlzLmJsZW5kaW5nID0gTm9ybWFsQmxlbmRpbmc7XG5cdHRoaXMuc2lkZSA9IEZyb250U2lkZTtcblx0dGhpcy52ZXJ0ZXhDb2xvcnMgPSBmYWxzZTtcblxuXHR0aGlzLm9wYWNpdHkgPSAxO1xuXHR0aGlzLnRyYW5zcGFyZW50ID0gZmFsc2U7XG5cblx0dGhpcy5ibGVuZFNyYyA9IFNyY0FscGhhRmFjdG9yO1xuXHR0aGlzLmJsZW5kRHN0ID0gT25lTWludXNTcmNBbHBoYUZhY3Rvcjtcblx0dGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247XG5cdHRoaXMuYmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmREc3RBbHBoYSA9IG51bGw7XG5cdHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblxuXHR0aGlzLmRlcHRoRnVuYyA9IExlc3NFcXVhbERlcHRoO1xuXHR0aGlzLmRlcHRoVGVzdCA9IHRydWU7XG5cdHRoaXMuZGVwdGhXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5zdGVuY2lsV3JpdGVNYXNrID0gMHhmZjtcblx0dGhpcy5zdGVuY2lsRnVuYyA9IEFsd2F5c1N0ZW5jaWxGdW5jO1xuXHR0aGlzLnN0ZW5jaWxSZWYgPSAwO1xuXHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IDB4ZmY7XG5cdHRoaXMuc3RlbmNpbEZhaWwgPSBLZWVwU3RlbmNpbE9wO1xuXHR0aGlzLnN0ZW5jaWxaRmFpbCA9IEtlZXBTdGVuY2lsT3A7XG5cdHRoaXMuc3RlbmNpbFpQYXNzID0gS2VlcFN0ZW5jaWxPcDtcblx0dGhpcy5zdGVuY2lsV3JpdGUgPSBmYWxzZTtcblxuXHR0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDtcblx0dGhpcy5jbGlwSW50ZXJzZWN0aW9uID0gZmFsc2U7XG5cdHRoaXMuY2xpcFNoYWRvd3MgPSBmYWxzZTtcblxuXHR0aGlzLnNoYWRvd1NpZGUgPSBudWxsO1xuXG5cdHRoaXMuY29sb3JXcml0ZSA9IHRydWU7XG5cblx0dGhpcy5wcmVjaXNpb24gPSBudWxsOyAvLyBvdmVycmlkZSB0aGUgcmVuZGVyZXIncyBkZWZhdWx0IHByZWNpc2lvbiBmb3IgdGhpcyBtYXRlcmlhbFxuXG5cdHRoaXMucG9seWdvbk9mZnNldCA9IGZhbHNlO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgPSAwO1xuXHR0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7XG5cblx0dGhpcy5kaXRoZXJpbmcgPSBmYWxzZTtcblxuXHR0aGlzLmFscGhhVGVzdCA9IDA7XG5cdHRoaXMuYWxwaGFUb0NvdmVyYWdlID0gZmFsc2U7XG5cdHRoaXMucHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2U7XG5cblx0dGhpcy52aXNpYmxlID0gdHJ1ZTtcblxuXHR0aGlzLnRvbmVNYXBwZWQgPSB0cnVlO1xuXG5cdHRoaXMudXNlckRhdGEgPSB7fTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNYXRlcmlhbCxcblxuXHRpc01hdGVyaWFsOiB0cnVlLFxuXG5cdG9uQmVmb3JlQ29tcGlsZTogZnVuY3Rpb24gKCAvKiBzaGFkZXJvYmplY3QsIHJlbmRlcmVyICovICkge30sXG5cblx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKTtcblxuXHR9LFxuXG5cdHNldFZhbHVlczogZnVuY3Rpb24gKCB2YWx1ZXMgKSB7XG5cblx0XHRpZiAoIHZhbHVlcyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIHZhbHVlcyApIHtcblxuXHRcdFx0Y29uc3QgbmV3VmFsdWUgPSB2YWx1ZXNbIGtleSBdO1xuXG5cdFx0XHRpZiAoIG5ld1ZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IFxcJycgKyBrZXkgKyAnXFwnIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuJyApO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBpZiBzaGFkaW5nIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3Jcblx0XHRcdGlmICgga2V5ID09PSAnc2hhZGluZycgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHRcdHRoaXMuZmxhdFNoYWRpbmcgPSAoIG5ld1ZhbHVlID09PSBGbGF0U2hhZGluZyApID8gdHJ1ZSA6IGZhbHNlO1xuXHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjdXJyZW50VmFsdWUgPSB0aGlzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogXFwnJyArIGtleSArICdcXCcgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5zZXQoIG5ld1ZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoICggY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5pc1ZlY3RvcjMgKSAmJiAoIG5ld1ZhbHVlICYmIG5ld1ZhbHVlLmlzVmVjdG9yMyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRWYWx1ZS5jb3B5KCBuZXdWYWx1ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHRoaXNbIGtleSBdID0gbmV3VmFsdWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkge1xuXG5cdFx0Y29uc3QgaXNSb290ID0gKCBtZXRhID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIG1ldGEgPT09ICdzdHJpbmcnICk7XG5cblx0XHRpZiAoIGlzUm9vdCApIHtcblxuXHRcdFx0bWV0YSA9IHtcblx0XHRcdFx0dGV4dHVyZXM6IHt9LFxuXHRcdFx0XHRpbWFnZXM6IHt9XG5cdFx0XHR9O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ01hdGVyaWFsJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnTWF0ZXJpYWwudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEudHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAmJiB0aGlzLmNvbG9yLmlzQ29sb3IgKSBkYXRhLmNvbG9yID0gdGhpcy5jb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIGRhdGEucm91Z2huZXNzID0gdGhpcy5yb3VnaG5lc3M7XG5cdFx0aWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzcztcblxuXHRcdGlmICggdGhpcy5zaGVlbiAmJiB0aGlzLnNoZWVuLmlzQ29sb3IgKSBkYXRhLnNoZWVuID0gdGhpcy5zaGVlbi5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuZW1pc3NpdmUgJiYgdGhpcy5lbWlzc2l2ZS5pc0NvbG9yICkgZGF0YS5lbWlzc2l2ZSA9IHRoaXMuZW1pc3NpdmUuZ2V0SGV4KCk7XG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdGlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTtcblx0XHRpZiAoIHRoaXMuc2hpbmluZXNzICE9PSB1bmRlZmluZWQgKSBkYXRhLnNoaW5pbmVzcyA9IHRoaXMuc2hpbmluZXNzO1xuXHRcdGlmICggdGhpcy5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIGRhdGEuY2xlYXJjb2F0ID0gdGhpcy5jbGVhcmNvYXQ7XG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzcztcblxuXHRcdGlmICggdGhpcy5jbGVhcmNvYXRNYXAgJiYgdGhpcy5jbGVhcmNvYXRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmNsZWFyY29hdE1hcCA9IHRoaXMuY2xlYXJjb2F0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwICYmIHRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCAmJiB0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsTWFwID0gdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tYXRjYXAgJiYgdGhpcy5tYXRjYXAuaXNUZXh0dXJlICkgZGF0YS5tYXRjYXAgPSB0aGlzLm1hdGNhcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5hbHBoYU1hcCAmJiB0aGlzLmFscGhhTWFwLmlzVGV4dHVyZSApIGRhdGEuYWxwaGFNYXAgPSB0aGlzLmFscGhhTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cblx0XHRpZiAoIHRoaXMubGlnaHRNYXAgJiYgdGhpcy5saWdodE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubGlnaHRNYXAgPSB0aGlzLmxpZ2h0TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmxpZ2h0TWFwSW50ZW5zaXR5ID0gdGhpcy5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5hb01hcCA9IHRoaXMuYW9NYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEuYW9NYXBJbnRlbnNpdHkgPSB0aGlzLmFvTWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJ1bXBNYXAgJiYgdGhpcy5idW1wTWFwLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0ZGF0YS5idW1wTWFwID0gdGhpcy5idW1wTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmJ1bXBTY2FsZSA9IHRoaXMuYnVtcFNjYWxlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLm5vcm1hbE1hcCAmJiB0aGlzLm5vcm1hbE1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTtcblx0XHRcdGRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudE1hcCA9IHRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7XG5cdFx0XHRkYXRhLmRpc3BsYWNlbWVudFNjYWxlID0gdGhpcy5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdGRhdGEuZGlzcGxhY2VtZW50QmlhcyA9IHRoaXMuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5yb3VnaG5lc3NNYXAgJiYgdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5yb3VnaG5lc3NNYXAgPSB0aGlzLnJvdWdobmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXHRcdGlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRpZiAoIHRoaXMuc3BlY3VsYXJNYXAgJiYgdGhpcy5zcGVjdWxhck1hcC5pc1RleHR1cmUgKSBkYXRhLnNwZWN1bGFyTWFwID0gdGhpcy5zcGVjdWxhck1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0aWYgKCB0aGlzLmVudk1hcCAmJiB0aGlzLmVudk1hcC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDtcblx0XHRcdGRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXBcblx0XHRcdGRhdGEucmVmcmFjdGlvblJhdGlvID0gdGhpcy5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHRcdGlmICggdGhpcy5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBkYXRhLmNvbWJpbmUgPSB0aGlzLmNvbWJpbmU7XG5cdFx0XHRpZiAoIHRoaXMuZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBkYXRhLmVudk1hcEludGVuc2l0eSA9IHRoaXMuZW52TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmdyYWRpZW50TWFwICYmIHRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLmdyYWRpZW50TWFwID0gdGhpcy5ncmFkaWVudE1hcC50b0pTT04oIG1ldGEgKS51dWlkO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLnNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZSA9IHRoaXMuc2l6ZTtcblx0XHRpZiAoIHRoaXMuc2hhZG93U2lkZSAhPT0gbnVsbCApIGRhdGEuc2hhZG93U2lkZSA9IHRoaXMuc2hhZG93U2lkZTtcblx0XHRpZiAoIHRoaXMuc2l6ZUF0dGVudWF0aW9uICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemVBdHRlbnVhdGlvbiA9IHRoaXMuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0aWYgKCB0aGlzLmJsZW5kaW5nICE9PSBOb3JtYWxCbGVuZGluZyApIGRhdGEuYmxlbmRpbmcgPSB0aGlzLmJsZW5kaW5nO1xuXHRcdGlmICggdGhpcy5zaWRlICE9PSBGcm9udFNpZGUgKSBkYXRhLnNpZGUgPSB0aGlzLnNpZGU7XG5cdFx0aWYgKCB0aGlzLnZlcnRleENvbG9ycyApIGRhdGEudmVydGV4Q29sb3JzID0gdHJ1ZTtcblxuXHRcdGlmICggdGhpcy5vcGFjaXR5IDwgMSApIGRhdGEub3BhY2l0eSA9IHRoaXMub3BhY2l0eTtcblx0XHRpZiAoIHRoaXMudHJhbnNwYXJlbnQgPT09IHRydWUgKSBkYXRhLnRyYW5zcGFyZW50ID0gdGhpcy50cmFuc3BhcmVudDtcblxuXHRcdGRhdGEuZGVwdGhGdW5jID0gdGhpcy5kZXB0aEZ1bmM7XG5cdFx0ZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDtcblx0XHRkYXRhLmRlcHRoV3JpdGUgPSB0aGlzLmRlcHRoV3JpdGU7XG5cdFx0ZGF0YS5jb2xvcldyaXRlID0gdGhpcy5jb2xvcldyaXRlO1xuXG5cdFx0ZGF0YS5zdGVuY2lsV3JpdGUgPSB0aGlzLnN0ZW5jaWxXcml0ZTtcblx0XHRkYXRhLnN0ZW5jaWxXcml0ZU1hc2sgPSB0aGlzLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRnVuYyA9IHRoaXMuc3RlbmNpbEZ1bmM7XG5cdFx0ZGF0YS5zdGVuY2lsUmVmID0gdGhpcy5zdGVuY2lsUmVmO1xuXHRcdGRhdGEuc3RlbmNpbEZ1bmNNYXNrID0gdGhpcy5zdGVuY2lsRnVuY01hc2s7XG5cdFx0ZGF0YS5zdGVuY2lsRmFpbCA9IHRoaXMuc3RlbmNpbEZhaWw7XG5cdFx0ZGF0YS5zdGVuY2lsWkZhaWwgPSB0aGlzLnN0ZW5jaWxaRmFpbDtcblx0XHRkYXRhLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzO1xuXG5cdFx0Ly8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKVxuXHRcdGlmICggdGhpcy5yb3RhdGlvbiAmJiB0aGlzLnJvdGF0aW9uICE9PSAwICkgZGF0YS5yb3RhdGlvbiA9IHRoaXMucm90YXRpb247XG5cblx0XHRpZiAoIHRoaXMucG9seWdvbk9mZnNldCA9PT0gdHJ1ZSApIGRhdGEucG9seWdvbk9mZnNldCA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IDAgKSBkYXRhLnBvbHlnb25PZmZzZXRGYWN0b3IgPSB0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIHRoaXMubGluZXdpZHRoICYmIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDtcblx0XHRpZiAoIHRoaXMuZGFzaFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZGFzaFNpemUgPSB0aGlzLmRhc2hTaXplO1xuXHRcdGlmICggdGhpcy5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmdhcFNpemUgPSB0aGlzLmdhcFNpemU7XG5cdFx0aWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTtcblxuXHRcdGlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7XG5cdFx0aWYgKCB0aGlzLmFscGhhVG9Db3ZlcmFnZSA9PT0gdHJ1ZSApIGRhdGEuYWxwaGFUb0NvdmVyYWdlID0gdGhpcy5hbHBoYVRvQ292ZXJhZ2U7XG5cdFx0aWYgKCB0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIGRhdGEucHJlbXVsdGlwbGllZEFscGhhID0gdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE7XG5cblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lID09PSB0cnVlICkgZGF0YS53aXJlZnJhbWUgPSB0aGlzLndpcmVmcmFtZTtcblx0XHRpZiAoIHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID4gMSApIGRhdGEud2lyZWZyYW1lTGluZXdpZHRoID0gdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7XG5cdFx0aWYgKCB0aGlzLndpcmVmcmFtZUxpbmVqb2luICE9PSAncm91bmQnICkgZGF0YS53aXJlZnJhbWVMaW5lam9pbiA9IHRoaXMud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHRpZiAoIHRoaXMubW9ycGhUYXJnZXRzID09PSB0cnVlICkgZGF0YS5tb3JwaFRhcmdldHMgPSB0cnVlO1xuXHRcdGlmICggdGhpcy5tb3JwaE5vcm1hbHMgPT09IHRydWUgKSBkYXRhLm1vcnBoTm9ybWFscyA9IHRydWU7XG5cdFx0aWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7XG5cblx0XHRpZiAoIHRoaXMuZmxhdFNoYWRpbmcgPT09IHRydWUgKSBkYXRhLmZsYXRTaGFkaW5nID0gdGhpcy5mbGF0U2hhZGluZztcblxuXHRcdGlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIGRhdGEudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCB0aGlzLnRvbmVNYXBwZWQgPT09IGZhbHNlICkgZGF0YS50b25lTWFwcGVkID0gZmFsc2U7XG5cblx0XHRpZiAoIEpTT04uc3RyaW5naWZ5KCB0aGlzLnVzZXJEYXRhICkgIT09ICd7fScgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTtcblxuXHRcdC8vIFRPRE86IENvcGllZCBmcm9tIE9iamVjdDNELnRvSlNPTlxuXG5cdFx0ZnVuY3Rpb24gZXh0cmFjdEZyb21DYWNoZSggY2FjaGUgKSB7XG5cblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBjb25zdCBrZXkgaW4gY2FjaGUgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGNhY2hlWyBrZXkgXTtcblx0XHRcdFx0ZGVsZXRlIGRhdGEubWV0YWRhdGE7XG5cdFx0XHRcdHZhbHVlcy5wdXNoKCBkYXRhICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlcztcblxuXHRcdH1cblxuXHRcdGlmICggaXNSb290ICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEudGV4dHVyZXMgKTtcblx0XHRcdGNvbnN0IGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7XG5cblx0XHRcdGlmICggdGV4dHVyZXMubGVuZ3RoID4gMCApIGRhdGEudGV4dHVyZXMgPSB0ZXh0dXJlcztcblx0XHRcdGlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBkYXRhLmltYWdlcyA9IGltYWdlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHR0aGlzLmZvZyA9IHNvdXJjZS5mb2c7XG5cblx0XHR0aGlzLmJsZW5kaW5nID0gc291cmNlLmJsZW5kaW5nO1xuXHRcdHRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlO1xuXHRcdHRoaXMudmVydGV4Q29sb3JzID0gc291cmNlLnZlcnRleENvbG9ycztcblxuXHRcdHRoaXMub3BhY2l0eSA9IHNvdXJjZS5vcGFjaXR5O1xuXHRcdHRoaXMudHJhbnNwYXJlbnQgPSBzb3VyY2UudHJhbnNwYXJlbnQ7XG5cblx0XHR0aGlzLmJsZW5kU3JjID0gc291cmNlLmJsZW5kU3JjO1xuXHRcdHRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uID0gc291cmNlLmJsZW5kRXF1YXRpb247XG5cdFx0dGhpcy5ibGVuZFNyY0FscGhhID0gc291cmNlLmJsZW5kU3JjQWxwaGE7XG5cdFx0dGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7XG5cdFx0dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGEgPSBzb3VyY2UuYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0dGhpcy5kZXB0aEZ1bmMgPSBzb3VyY2UuZGVwdGhGdW5jO1xuXHRcdHRoaXMuZGVwdGhUZXN0ID0gc291cmNlLmRlcHRoVGVzdDtcblx0XHR0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTtcblxuXHRcdHRoaXMuc3RlbmNpbFdyaXRlTWFzayA9IHNvdXJjZS5zdGVuY2lsV3JpdGVNYXNrO1xuXHRcdHRoaXMuc3RlbmNpbEZ1bmMgPSBzb3VyY2Uuc3RlbmNpbEZ1bmM7XG5cdFx0dGhpcy5zdGVuY2lsUmVmID0gc291cmNlLnN0ZW5jaWxSZWY7XG5cdFx0dGhpcy5zdGVuY2lsRnVuY01hc2sgPSBzb3VyY2Uuc3RlbmNpbEZ1bmNNYXNrO1xuXHRcdHRoaXMuc3RlbmNpbEZhaWwgPSBzb3VyY2Uuc3RlbmNpbEZhaWw7XG5cdFx0dGhpcy5zdGVuY2lsWkZhaWwgPSBzb3VyY2Uuc3RlbmNpbFpGYWlsO1xuXHRcdHRoaXMuc3RlbmNpbFpQYXNzID0gc291cmNlLnN0ZW5jaWxaUGFzcztcblx0XHR0aGlzLnN0ZW5jaWxXcml0ZSA9IHNvdXJjZS5zdGVuY2lsV3JpdGU7XG5cblx0XHRjb25zdCBzcmNQbGFuZXMgPSBzb3VyY2UuY2xpcHBpbmdQbGFuZXM7XG5cdFx0bGV0IGRzdFBsYW5lcyA9IG51bGw7XG5cblx0XHRpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc3QgbiA9IHNyY1BsYW5lcy5sZW5ndGg7XG5cdFx0XHRkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdGRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5jbGlwcGluZ1BsYW5lcyA9IGRzdFBsYW5lcztcblx0XHR0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBzb3VyY2UuY2xpcEludGVyc2VjdGlvbjtcblx0XHR0aGlzLmNsaXBTaGFkb3dzID0gc291cmNlLmNsaXBTaGFkb3dzO1xuXG5cdFx0dGhpcy5zaGFkb3dTaWRlID0gc291cmNlLnNoYWRvd1NpZGU7XG5cblx0XHR0aGlzLmNvbG9yV3JpdGUgPSBzb3VyY2UuY29sb3JXcml0ZTtcblxuXHRcdHRoaXMucHJlY2lzaW9uID0gc291cmNlLnByZWNpc2lvbjtcblxuXHRcdHRoaXMucG9seWdvbk9mZnNldCA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0O1xuXHRcdHRoaXMucG9seWdvbk9mZnNldEZhY3RvciA9IHNvdXJjZS5wb2x5Z29uT2Zmc2V0RmFjdG9yO1xuXHRcdHRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0cztcblxuXHRcdHRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZztcblxuXHRcdHRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDtcblx0XHR0aGlzLmFscGhhVG9Db3ZlcmFnZSA9IHNvdXJjZS5hbHBoYVRvQ292ZXJhZ2U7XG5cdFx0dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0dGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7XG5cblx0XHR0aGlzLnRvbmVNYXBwZWQgPSBzb3VyY2UudG9uZU1hcHBlZDtcblxuXHRcdHRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0ZGlzcG9zZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggTWF0ZXJpYWwucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX2NvbG9yS2V5d29yZHMgPSB7ICdhbGljZWJsdWUnOiAweEYwRjhGRiwgJ2FudGlxdWV3aGl0ZSc6IDB4RkFFQkQ3LCAnYXF1YSc6IDB4MDBGRkZGLCAnYXF1YW1hcmluZSc6IDB4N0ZGRkQ0LCAnYXp1cmUnOiAweEYwRkZGRixcblx0J2JlaWdlJzogMHhGNUY1REMsICdiaXNxdWUnOiAweEZGRTRDNCwgJ2JsYWNrJzogMHgwMDAwMDAsICdibGFuY2hlZGFsbW9uZCc6IDB4RkZFQkNELCAnYmx1ZSc6IDB4MDAwMEZGLCAnYmx1ZXZpb2xldCc6IDB4OEEyQkUyLFxuXHQnYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsXG5cdCdjb3JuZmxvd2VyYmx1ZSc6IDB4NjQ5NUVELCAnY29ybnNpbGsnOiAweEZGRjhEQywgJ2NyaW1zb24nOiAweERDMTQzQywgJ2N5YW4nOiAweDAwRkZGRiwgJ2RhcmtibHVlJzogMHgwMDAwOEIsICdkYXJrY3lhbic6IDB4MDA4QjhCLFxuXHQnZGFya2dvbGRlbnJvZCc6IDB4Qjg4NjBCLCAnZGFya2dyYXknOiAweEE5QTlBOSwgJ2RhcmtncmVlbic6IDB4MDA2NDAwLCAnZGFya2dyZXknOiAweEE5QTlBOSwgJ2RhcmtraGFraSc6IDB4QkRCNzZCLCAnZGFya21hZ2VudGEnOiAweDhCMDA4Qixcblx0J2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4Rixcblx0J2RhcmtzbGF0ZWJsdWUnOiAweDQ4M0Q4QiwgJ2RhcmtzbGF0ZWdyYXknOiAweDJGNEY0RiwgJ2RhcmtzbGF0ZWdyZXknOiAweDJGNEY0RiwgJ2Rhcmt0dXJxdW9pc2UnOiAweDAwQ0VEMSwgJ2Rhcmt2aW9sZXQnOiAweDk0MDBEMyxcblx0J2RlZXBwaW5rJzogMHhGRjE0OTMsICdkZWVwc2t5Ymx1ZSc6IDB4MDBCRkZGLCAnZGltZ3JheSc6IDB4Njk2OTY5LCAnZGltZ3JleSc6IDB4Njk2OTY5LCAnZG9kZ2VyYmx1ZSc6IDB4MUU5MEZGLCAnZmlyZWJyaWNrJzogMHhCMjIyMjIsXG5cdCdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLFxuXHQnZ29sZGVucm9kJzogMHhEQUE1MjAsICdncmF5JzogMHg4MDgwODAsICdncmVlbic6IDB4MDA4MDAwLCAnZ3JlZW55ZWxsb3cnOiAweEFERkYyRiwgJ2dyZXknOiAweDgwODA4MCwgJ2hvbmV5ZGV3JzogMHhGMEZGRjAsICdob3RwaW5rJzogMHhGRjY5QjQsXG5cdCdpbmRpYW5yZWQnOiAweENENUM1QywgJ2luZGlnbyc6IDB4NEIwMDgyLCAnaXZvcnknOiAweEZGRkZGMCwgJ2toYWtpJzogMHhGMEU2OEMsICdsYXZlbmRlcic6IDB4RTZFNkZBLCAnbGF2ZW5kZXJibHVzaCc6IDB4RkZGMEY1LCAnbGF3bmdyZWVuJzogMHg3Q0ZDMDAsXG5cdCdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsXG5cdCdsaWdodGdyZWVuJzogMHg5MEVFOTAsICdsaWdodGdyZXknOiAweEQzRDNEMywgJ2xpZ2h0cGluayc6IDB4RkZCNkMxLCAnbGlnaHRzYWxtb24nOiAweEZGQTA3QSwgJ2xpZ2h0c2VhZ3JlZW4nOiAweDIwQjJBQSwgJ2xpZ2h0c2t5Ymx1ZSc6IDB4ODdDRUZBLFxuXHQnbGlnaHRzbGF0ZWdyYXknOiAweDc3ODg5OSwgJ2xpZ2h0c2xhdGVncmV5JzogMHg3Nzg4OTksICdsaWdodHN0ZWVsYmx1ZSc6IDB4QjBDNERFLCAnbGlnaHR5ZWxsb3cnOiAweEZGRkZFMCwgJ2xpbWUnOiAweDAwRkYwMCwgJ2xpbWVncmVlbic6IDB4MzJDRDMyLFxuXHQnbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsXG5cdCdtZWRpdW1wdXJwbGUnOiAweDkzNzBEQiwgJ21lZGl1bXNlYWdyZWVuJzogMHgzQ0IzNzEsICdtZWRpdW1zbGF0ZWJsdWUnOiAweDdCNjhFRSwgJ21lZGl1bXNwcmluZ2dyZWVuJzogMHgwMEZBOUEsICdtZWRpdW10dXJxdW9pc2UnOiAweDQ4RDFDQyxcblx0J21lZGl1bXZpb2xldHJlZCc6IDB4QzcxNTg1LCAnbWlkbmlnaHRibHVlJzogMHgxOTE5NzAsICdtaW50Y3JlYW0nOiAweEY1RkZGQSwgJ21pc3R5cm9zZSc6IDB4RkZFNEUxLCAnbW9jY2FzaW4nOiAweEZGRTRCNSwgJ25hdmFqb3doaXRlJzogMHhGRkRFQUQsXG5cdCduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsXG5cdCdwYWxlZ29sZGVucm9kJzogMHhFRUU4QUEsICdwYWxlZ3JlZW4nOiAweDk4RkI5OCwgJ3BhbGV0dXJxdW9pc2UnOiAweEFGRUVFRSwgJ3BhbGV2aW9sZXRyZWQnOiAweERCNzA5MywgJ3BhcGF5YXdoaXAnOiAweEZGRUZENSwgJ3BlYWNocHVmZic6IDB4RkZEQUI5LFxuXHQncGVydSc6IDB4Q0Q4NTNGLCAncGluayc6IDB4RkZDMENCLCAncGx1bSc6IDB4RERBMERELCAncG93ZGVyYmx1ZSc6IDB4QjBFMEU2LCAncHVycGxlJzogMHg4MDAwODAsICdyZWJlY2NhcHVycGxlJzogMHg2NjMzOTksICdyZWQnOiAweEZGMDAwMCwgJ3Jvc3licm93bic6IDB4QkM4RjhGLFxuXHQncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSxcblx0J3NpZW5uYSc6IDB4QTA1MjJELCAnc2lsdmVyJzogMHhDMEMwQzAsICdza3libHVlJzogMHg4N0NFRUIsICdzbGF0ZWJsdWUnOiAweDZBNUFDRCwgJ3NsYXRlZ3JheSc6IDB4NzA4MDkwLCAnc2xhdGVncmV5JzogMHg3MDgwOTAsICdzbm93JzogMHhGRkZBRkEsXG5cdCdzcHJpbmdncmVlbic6IDB4MDBGRjdGLCAnc3RlZWxibHVlJzogMHg0NjgyQjQsICd0YW4nOiAweEQyQjQ4QywgJ3RlYWwnOiAweDAwODA4MCwgJ3RoaXN0bGUnOiAweEQ4QkZEOCwgJ3RvbWF0byc6IDB4RkY2MzQ3LCAndHVycXVvaXNlJzogMHg0MEUwRDAsXG5cdCd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07XG5cbmNvbnN0IF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07XG5jb25zdCBfaHNsQiA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5mdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkge1xuXG5cdGlmICggdCA8IDAgKSB0ICs9IDE7XG5cdGlmICggdCA+IDEgKSB0IC09IDE7XG5cdGlmICggdCA8IDEgLyA2ICkgcmV0dXJuIHAgKyAoIHEgLSBwICkgKiA2ICogdDtcblx0aWYgKCB0IDwgMSAvIDIgKSByZXR1cm4gcTtcblx0aWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApO1xuXHRyZXR1cm4gcDtcblxufVxuXG5mdW5jdGlvbiBTUkdCVG9MaW5lYXIoIGMgKSB7XG5cblx0cmV0dXJuICggYyA8IDAuMDQwNDUgKSA/IGMgKiAwLjA3NzM5OTM4MDggOiBNYXRoLnBvdyggYyAqIDAuOTQ3ODY3Mjk4NiArIDAuMDUyMTMyNzAxNCwgMi40ICk7XG5cbn1cblxuZnVuY3Rpb24gTGluZWFyVG9TUkdCKCBjICkge1xuXG5cdHJldHVybiAoIGMgPCAwLjAwMzEzMDggKSA/IGMgKiAxMi45MiA6IDEuMDU1ICogKCBNYXRoLnBvdyggYywgMC40MTY2NiApICkgLSAwLjA1NTtcblxufVxuXG5jbGFzcyBDb2xvciB7XG5cblx0Y29uc3RydWN0b3IoIHIsIGcsIGIgKSB7XG5cblx0XHRpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIHIgaXMgVEhSRUUuQ29sb3IsIGhleCBvciBzdHJpbmdcblx0XHRcdHJldHVybiB0aGlzLnNldCggciApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuc2V0UkdCKCByLCBnLCBiICk7XG5cblx0fVxuXG5cdHNldCggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHZhbHVlICYmIHZhbHVlLmlzQ29sb3IgKSB7XG5cblx0XHRcdHRoaXMuY29weSggdmFsdWUgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHRoaXMuc2V0SGV4KCB2YWx1ZSApO1xuXG5cdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0dGhpcy5zZXRTdHlsZSggdmFsdWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRTY2FsYXIoIHNjYWxhciApIHtcblxuXHRcdHRoaXMuciA9IHNjYWxhcjtcblx0XHR0aGlzLmcgPSBzY2FsYXI7XG5cdFx0dGhpcy5iID0gc2NhbGFyO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEhleCggaGV4ICkge1xuXG5cdFx0aGV4ID0gTWF0aC5mbG9vciggaGV4ICk7XG5cblx0XHR0aGlzLnIgPSAoIGhleCA+PiAxNiAmIDI1NSApIC8gMjU1O1xuXHRcdHRoaXMuZyA9ICggaGV4ID4+IDggJiAyNTUgKSAvIDI1NTtcblx0XHR0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldFJHQiggciwgZywgYiApIHtcblxuXHRcdHRoaXMuciA9IHI7XG5cdFx0dGhpcy5nID0gZztcblx0XHR0aGlzLmIgPSBiO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEhTTCggaCwgcywgbCApIHtcblxuXHRcdC8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wXG5cdFx0aCA9IE1hdGhVdGlscy5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTtcblx0XHRzID0gTWF0aFV0aWxzLmNsYW1wKCBzLCAwLCAxICk7XG5cdFx0bCA9IE1hdGhVdGlscy5jbGFtcCggbCwgMCwgMSApO1xuXG5cdFx0aWYgKCBzID09PSAwICkge1xuXG5cdFx0XHR0aGlzLnIgPSB0aGlzLmcgPSB0aGlzLmIgPSBsO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgcCA9IGwgPD0gMC41ID8gbCAqICggMSArIHMgKSA6IGwgKyBzIC0gKCBsICogcyApO1xuXHRcdFx0Y29uc3QgcSA9ICggMiAqIGwgKSAtIHA7XG5cblx0XHRcdHRoaXMuciA9IGh1ZTJyZ2IoIHEsIHAsIGggKyAxIC8gMyApO1xuXHRcdFx0dGhpcy5nID0gaHVlMnJnYiggcSwgcCwgaCApO1xuXHRcdFx0dGhpcy5iID0gaHVlMnJnYiggcSwgcCwgaCAtIDEgLyAzICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0U3R5bGUoIHN0eWxlICkge1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlQWxwaGEoIHN0cmluZyApIHtcblxuXHRcdFx0aWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdFx0aWYgKCBwYXJzZUZsb2F0KCBzdHJpbmcgKSA8IDEgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXG5cdFx0bGV0IG07XG5cblx0XHRpZiAoIG0gPSAvXigoPzpyZ2J8aHNsKWE/KVxcKChbXlxcKV0qKVxcKS8uZXhlYyggc3R5bGUgKSApIHtcblxuXHRcdFx0Ly8gcmdiIC8gaHNsXG5cblx0XHRcdGxldCBjb2xvcjtcblx0XHRcdGNvbnN0IG5hbWUgPSBtWyAxIF07XG5cdFx0XHRjb25zdCBjb21wb25lbnRzID0gbVsgMiBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRcdGNhc2UgJ3JnYic6XG5cdFx0XHRcdGNhc2UgJ3JnYmEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyooPzosXFxzKihcXGQqXFwuP1xcZCspXFxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkge1xuXG5cdFx0XHRcdFx0XHQvLyByZ2IoMjU1LDAsMCkgcmdiYSgyNTUsMCwwLDAuNSlcblx0XHRcdFx0XHRcdHRoaXMuciA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMSBdLCAxMCApICkgLyAyNTU7XG5cdFx0XHRcdFx0XHR0aGlzLmcgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDIgXSwgMTAgKSApIC8gMjU1O1xuXHRcdFx0XHRcdFx0dGhpcy5iID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAzIF0sIDEwICkgKSAvIDI1NTtcblxuXHRcdFx0XHRcdFx0aGFuZGxlQWxwaGEoIGNvbG9yWyA0IF0gKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGNvbG9yID0gL15cXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KVxuXHRcdFx0XHRcdFx0dGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDtcblx0XHRcdFx0XHRcdHRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7XG5cdFx0XHRcdFx0XHR0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2hzbCc6XG5cdFx0XHRcdGNhc2UgJ2hzbGEnOlxuXG5cdFx0XHRcdFx0aWYgKCBjb2xvciA9IC9eXFxzKihcXGQqXFwuP1xcZCspXFxzKixcXHMqKFxcZCspXFwlXFxzKixcXHMqKFxcZCspXFwlXFxzKig/OixcXHMqKFxcZCpcXC4/XFxkKylcXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGhzbCgxMjAsNTAlLDUwJSkgaHNsYSgxMjAsNTAlLDUwJSwwLjUpXG5cdFx0XHRcdFx0XHRjb25zdCBoID0gcGFyc2VGbG9hdCggY29sb3JbIDEgXSApIC8gMzYwO1xuXHRcdFx0XHRcdFx0Y29uc3QgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwO1xuXHRcdFx0XHRcdFx0Y29uc3QgbCA9IHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApIC8gMTAwO1xuXG5cdFx0XHRcdFx0XHRoYW5kbGVBbHBoYSggY29sb3JbIDQgXSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCBtID0gL15cXCMoW0EtRmEtZlxcZF0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7XG5cblx0XHRcdC8vIGhleCBjb2xvclxuXG5cdFx0XHRjb25zdCBoZXggPSBtWyAxIF07XG5cdFx0XHRjb25zdCBzaXplID0gaGV4Lmxlbmd0aDtcblxuXHRcdFx0aWYgKCBzaXplID09PSAzICkge1xuXG5cdFx0XHRcdC8vICNmZjBcblx0XHRcdFx0dGhpcy5yID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDAgKSArIGhleC5jaGFyQXQoIDAgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDEgKSArIGhleC5jaGFyQXQoIDEgKSwgMTYgKSAvIDI1NTtcblx0XHRcdFx0dGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTtcblxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0fSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHtcblxuXHRcdFx0XHQvLyAjZmYwMDAwXG5cdFx0XHRcdHRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAyICkgKyBoZXguY2hhckF0KCAzICksIDE2ICkgLyAyNTU7XG5cdFx0XHRcdHRoaXMuYiA9IHBhcnNlSW50KCBoZXguY2hhckF0KCA0ICkgKyBoZXguY2hhckF0KCA1ICksIDE2ICkgLyAyNTU7XG5cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggc3R5bGUgJiYgc3R5bGUubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuc2V0Q29sb3JOYW1lKCBzdHlsZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldENvbG9yTmFtZSggc3R5bGUgKSB7XG5cblx0XHQvLyBjb2xvciBrZXl3b3Jkc1xuXHRcdGNvbnN0IGhleCA9IF9jb2xvcktleXdvcmRzWyBzdHlsZSBdO1xuXG5cdFx0aWYgKCBoZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gcmVkXG5cdFx0XHR0aGlzLnNldEhleCggaGV4ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyB1bmtub3duIGNvbG9yXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAnICsgc3R5bGUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5yLCB0aGlzLmcsIHRoaXMuYiApO1xuXG5cdH1cblxuXHRjb3B5KCBjb2xvciApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yLnI7XG5cdFx0dGhpcy5nID0gY29sb3IuZztcblx0XHR0aGlzLmIgPSBjb2xvci5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHlHYW1tYVRvTGluZWFyKCBjb2xvciwgZ2FtbWFGYWN0b3IgPSAyLjAgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLnBvdyggY29sb3IuciwgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmcgPSBNYXRoLnBvdyggY29sb3IuZywgZ2FtbWFGYWN0b3IgKTtcblx0XHR0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb3B5TGluZWFyVG9HYW1tYSggY29sb3IsIGdhbW1hRmFjdG9yID0gMi4wICkge1xuXG5cdFx0Y29uc3Qgc2FmZUludmVyc2UgPSAoIGdhbW1hRmFjdG9yID4gMCApID8gKCAxLjAgLyBnYW1tYUZhY3RvciApIDogMS4wO1xuXG5cdFx0dGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7XG5cdFx0dGhpcy5iID0gTWF0aC5wb3coIGNvbG9yLmIsIHNhZmVJbnZlcnNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29udmVydEdhbW1hVG9MaW5lYXIoIGdhbW1hRmFjdG9yICkge1xuXG5cdFx0dGhpcy5jb3B5R2FtbWFUb0xpbmVhciggdGhpcywgZ2FtbWFGYWN0b3IgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb252ZXJ0TGluZWFyVG9HYW1tYSggZ2FtbWFGYWN0b3IgKSB7XG5cblx0XHR0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKCB0aGlzLCBnYW1tYUZhY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHlTUkdCVG9MaW5lYXIoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yID0gU1JHQlRvTGluZWFyKCBjb2xvci5yICk7XG5cdFx0dGhpcy5nID0gU1JHQlRvTGluZWFyKCBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weUxpbmVhclRvU1JHQiggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLnIgKTtcblx0XHR0aGlzLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTtcblx0XHR0aGlzLmIgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb252ZXJ0U1JHQlRvTGluZWFyKCkge1xuXG5cdFx0dGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29udmVydExpbmVhclRvU1JHQigpIHtcblxuXHRcdHRoaXMuY29weUxpbmVhclRvU1JHQiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldEhleCgpIHtcblxuXHRcdHJldHVybiAoIHRoaXMuciAqIDI1NSApIDw8IDE2IF4gKCB0aGlzLmcgKiAyNTUgKSA8PCA4IF4gKCB0aGlzLmIgKiAyNTUgKSA8PCAwO1xuXG5cdH1cblxuXHRnZXRIZXhTdHJpbmcoKSB7XG5cblx0XHRyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7XG5cblx0fVxuXG5cdGdldEhTTCggdGFyZ2V0ICkge1xuXG5cdFx0Ly8gaCxzLGwgcmFuZ2VzIGFyZSBpbiAwLjAgLSAxLjBcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IHsgaDogMCwgczogMCwgbDogMCB9O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgciA9IHRoaXMuciwgZyA9IHRoaXMuZywgYiA9IHRoaXMuYjtcblxuXHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7XG5cdFx0Y29uc3QgbWluID0gTWF0aC5taW4oIHIsIGcsIGIgKTtcblxuXHRcdGxldCBodWUsIHNhdHVyYXRpb247XG5cdFx0Y29uc3QgbGlnaHRuZXNzID0gKCBtaW4gKyBtYXggKSAvIDIuMDtcblxuXHRcdGlmICggbWluID09PSBtYXggKSB7XG5cblx0XHRcdGh1ZSA9IDA7XG5cdFx0XHRzYXR1cmF0aW9uID0gMDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IGRlbHRhID0gbWF4IC0gbWluO1xuXG5cdFx0XHRzYXR1cmF0aW9uID0gbGlnaHRuZXNzIDw9IDAuNSA/IGRlbHRhIC8gKCBtYXggKyBtaW4gKSA6IGRlbHRhIC8gKCAyIC0gbWF4IC0gbWluICk7XG5cblx0XHRcdHN3aXRjaCAoIG1heCApIHtcblxuXHRcdFx0XHRjYXNlIHI6IGh1ZSA9ICggZyAtIGIgKSAvIGRlbHRhICsgKCBnIDwgYiA/IDYgOiAwICk7IGJyZWFrO1xuXHRcdFx0XHRjYXNlIGc6IGh1ZSA9ICggYiAtIHIgKSAvIGRlbHRhICsgMjsgYnJlYWs7XG5cdFx0XHRcdGNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhaztcblxuXHRcdFx0fVxuXG5cdFx0XHRodWUgLz0gNjtcblxuXHRcdH1cblxuXHRcdHRhcmdldC5oID0gaHVlO1xuXHRcdHRhcmdldC5zID0gc2F0dXJhdGlvbjtcblx0XHR0YXJnZXQubCA9IGxpZ2h0bmVzcztcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cblx0fVxuXG5cdGdldFN0eWxlKCkge1xuXG5cdFx0cmV0dXJuICdyZ2IoJyArICggKCB0aGlzLnIgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmcgKiAyNTUgKSB8IDAgKSArICcsJyArICggKCB0aGlzLmIgKiAyNTUgKSB8IDAgKSArICcpJztcblxuXHR9XG5cblx0b2Zmc2V0SFNMKCBoLCBzLCBsICkge1xuXG5cdFx0dGhpcy5nZXRIU0woIF9oc2xBICk7XG5cblx0XHRfaHNsQS5oICs9IGg7IF9oc2xBLnMgKz0gczsgX2hzbEEubCArPSBsO1xuXG5cdFx0dGhpcy5zZXRIU0woIF9oc2xBLmgsIF9oc2xBLnMsIF9oc2xBLmwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhZGQoIGNvbG9yICkge1xuXG5cdFx0dGhpcy5yICs9IGNvbG9yLnI7XG5cdFx0dGhpcy5nICs9IGNvbG9yLmc7XG5cdFx0dGhpcy5iICs9IGNvbG9yLmI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YWRkQ29sb3JzKCBjb2xvcjEsIGNvbG9yMiApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgY29sb3IyLnI7XG5cdFx0dGhpcy5nID0gY29sb3IxLmcgKyBjb2xvcjIuZztcblx0XHR0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxhciggcyApIHtcblxuXHRcdHRoaXMuciArPSBzO1xuXHRcdHRoaXMuZyArPSBzO1xuXHRcdHRoaXMuYiArPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN1YiggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApO1xuXHRcdHRoaXMuZyA9IE1hdGgubWF4KCAwLCB0aGlzLmcgLSBjb2xvci5nICk7XG5cdFx0dGhpcy5iID0gTWF0aC5tYXgoIDAsIHRoaXMuYiAtIGNvbG9yLmIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseSggY29sb3IgKSB7XG5cblx0XHR0aGlzLnIgKj0gY29sb3Iucjtcblx0XHR0aGlzLmcgKj0gY29sb3IuZztcblx0XHR0aGlzLmIgKj0gY29sb3IuYjtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRtdWx0aXBseVNjYWxhciggcyApIHtcblxuXHRcdHRoaXMuciAqPSBzO1xuXHRcdHRoaXMuZyAqPSBzO1xuXHRcdHRoaXMuYiAqPSBzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnAoIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhO1xuXHRcdHRoaXMuZyArPSAoIGNvbG9yLmcgLSB0aGlzLmcgKSAqIGFscGhhO1xuXHRcdHRoaXMuYiArPSAoIGNvbG9yLmIgLSB0aGlzLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBDb2xvcnMoIGNvbG9yMSwgY29sb3IyLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuciA9IGNvbG9yMS5yICsgKCBjb2xvcjIuciAtIGNvbG9yMS5yICkgKiBhbHBoYTtcblx0XHR0aGlzLmcgPSBjb2xvcjEuZyArICggY29sb3IyLmcgLSBjb2xvcjEuZyApICogYWxwaGE7XG5cdFx0dGhpcy5iID0gY29sb3IxLmIgKyAoIGNvbG9yMi5iIC0gY29sb3IxLmIgKSAqIGFscGhhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnBIU0woIGNvbG9yLCBhbHBoYSApIHtcblxuXHRcdHRoaXMuZ2V0SFNMKCBfaHNsQSApO1xuXHRcdGNvbG9yLmdldEhTTCggX2hzbEIgKTtcblxuXHRcdGNvbnN0IGggPSBNYXRoVXRpbHMubGVycCggX2hzbEEuaCwgX2hzbEIuaCwgYWxwaGEgKTtcblx0XHRjb25zdCBzID0gTWF0aFV0aWxzLmxlcnAoIF9oc2xBLnMsIF9oc2xCLnMsIGFscGhhICk7XG5cdFx0Y29uc3QgbCA9IE1hdGhVdGlscy5sZXJwKCBfaHNsQS5sLCBfaHNsQi5sLCBhbHBoYSApO1xuXG5cdFx0dGhpcy5zZXRIU0woIGgsIHMsIGwgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRlcXVhbHMoIGMgKSB7XG5cblx0XHRyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7XG5cblx0fVxuXG5cdGZyb21BcnJheSggYXJyYXksIG9mZnNldCA9IDAgKSB7XG5cblx0XHR0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07XG5cdFx0dGhpcy5nID0gYXJyYXlbIG9mZnNldCArIDEgXTtcblx0XHR0aGlzLmIgPSBhcnJheVsgb2Zmc2V0ICsgMiBdO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvQXJyYXkoIGFycmF5ID0gW10sIG9mZnNldCA9IDAgKSB7XG5cblx0XHRhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7XG5cdFx0YXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuZztcblx0XHRhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5iO1xuXG5cdFx0cmV0dXJuIGFycmF5O1xuXG5cdH1cblxuXHRmcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4ICkge1xuXG5cdFx0dGhpcy5yID0gYXR0cmlidXRlLmdldFgoIGluZGV4ICk7XG5cdFx0dGhpcy5nID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7XG5cdFx0dGhpcy5iID0gYXR0cmlidXRlLmdldFooIGluZGV4ICk7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5ub3JtYWxpemVkID09PSB0cnVlICkge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBVaW50OEFycmF5XG5cblx0XHRcdHRoaXMuciAvPSAyNTU7XG5cdFx0XHR0aGlzLmcgLz0gMjU1O1xuXHRcdFx0dGhpcy5iIC89IDI1NTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRIZXgoKTtcblxuXHR9XG5cbn1cblxuQ29sb3IuTkFNRVMgPSBfY29sb3JLZXl3b3JkcztcblxuQ29sb3IucHJvdG90eXBlLmlzQ29sb3IgPSB0cnVlO1xuQ29sb3IucHJvdG90eXBlLnIgPSAxO1xuQ29sb3IucHJvdG90eXBlLmcgPSAxO1xuQ29sb3IucHJvdG90eXBlLmIgPSAxO1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY29sb3I6IDxoZXg+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICBkZXB0aFRlc3Q6IDxib29sPixcbiAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPlxuICogfVxuICovXG5cbmNsYXNzIE1lc2hCYXNpY01hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoQmFzaWNNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZVxuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5saWdodE1hcCA9IG51bGw7XG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHRcdHRoaXMuYW9NYXAgPSBudWxsO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gc291cmNlLnNwZWN1bGFyTWFwO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0XHR0aGlzLmNvbWJpbmUgPSBzb3VyY2UuY29tYmluZTtcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaEJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaEJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5jb25zdCBfdmVjdG9yJDkgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3ZlY3RvcjIgPSBuZXcgVmVjdG9yMigpO1xuXG5mdW5jdGlvbiBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7XG5cblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4nICk7XG5cblx0fVxuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDtcblx0dGhpcy5ub3JtYWxpemVkID0gbm9ybWFsaXplZCA9PT0gdHJ1ZTtcblxuXHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRzZXRVc2FnZTogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMudXNhZ2UgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTtcblx0XHR0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7XG5cdFx0dGhpcy5pdGVtU2l6ZSA9IHNvdXJjZS5pdGVtU2l6ZTtcblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXHRcdHRoaXMubm9ybWFsaXplZCA9IHNvdXJjZS5ub3JtYWxpemVkO1xuXG5cdFx0dGhpcy51c2FnZSA9IHNvdXJjZS51c2FnZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7XG5cblx0XHRpbmRleDEgKj0gdGhpcy5pdGVtU2l6ZTtcblx0XHRpbmRleDIgKj0gYXR0cmlidXRlLml0ZW1TaXplO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5pdGVtU2l6ZTsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHR0aGlzLmFycmF5LnNldCggYXJyYXkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weUNvbG9yc0FycmF5OiBmdW5jdGlvbiAoIGNvbG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRsZXQgY29sb3IgPSBjb2xvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHRjb2xvciA9IG5ldyBDb2xvcigpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLnI7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5nO1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuYjtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bGV0IHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjb3B5VmVjdG9yM3NBcnJheTogZnVuY3Rpb24gKCB2ZWN0b3JzICkge1xuXG5cdFx0Y29uc3QgYXJyYXkgPSB0aGlzLmFycmF5O1xuXHRcdGxldCBvZmZzZXQgPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRsZXQgdmVjdG9yID0gdmVjdG9yc1sgaSBdO1xuXG5cdFx0XHRpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkJywgaSApO1xuXHRcdFx0XHR2ZWN0b3IgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci54O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnk7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IuejtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29weVZlY3RvcjRzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gdGhpcy5hcnJheTtcblx0XHRsZXQgb2Zmc2V0ID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHZlY3RvcnMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0bGV0IHZlY3RvciA9IHZlY3RvcnNbIGkgXTtcblxuXHRcdFx0aWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTtcblx0XHRcdFx0dmVjdG9yID0gbmV3IFZlY3RvcjQoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDtcblx0XHRcdGFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55O1xuXHRcdFx0YXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLno7XG5cdFx0XHRhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IudztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRpZiAoIHRoaXMuaXRlbVNpemUgPT09IDIgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdF92ZWN0b3IyLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHRoaXMsIGkgKTtcblx0XHRcdFx0X3ZlY3RvcjIuYXBwbHlNYXRyaXgzKCBtICk7XG5cblx0XHRcdFx0dGhpcy5zZXRYWSggaSwgX3ZlY3RvcjIueCwgX3ZlY3RvcjIueSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLml0ZW1TaXplID09PSAzICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRfdmVjdG9yJDkuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdGhpcywgaSApO1xuXHRcdFx0XHRfdmVjdG9yJDkuYXBwbHlNYXRyaXgzKCBtICk7XG5cblx0XHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS5hcHBseU1hdHJpeDQoIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0YXBwbHlOb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS5hcHBseU5vcm1hbE1hdHJpeCggbSApO1xuXG5cdFx0XHR0aGlzLnNldFhZWiggaSwgX3ZlY3RvciQ5LngsIF92ZWN0b3IkOS55LCBfdmVjdG9yJDkueiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDkueCA9IHRoaXMuZ2V0WCggaSApO1xuXHRcdFx0X3ZlY3RvciQ5LnkgPSB0aGlzLmdldFkoIGkgKTtcblx0XHRcdF92ZWN0b3IkOS56ID0gdGhpcy5nZXRaKCBpICk7XG5cblx0XHRcdF92ZWN0b3IkOS50cmFuc2Zvcm1EaXJlY3Rpb24oIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkOS54LCBfdmVjdG9yJDkueSwgX3ZlY3RvciQ5LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRcdHJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTtcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXSA9IHg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMSBdO1xuXG5cdH0sXG5cblx0c2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMiBdO1xuXG5cdH0sXG5cblx0c2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggKj0gdGhpcy5pdGVtU2l6ZTtcblxuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0WFlaVzogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiwgdyApIHtcblxuXHRcdGluZGV4ICo9IHRoaXMuaXRlbVNpemU7XG5cblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXHRcdHRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejtcblx0XHR0aGlzLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcblx0XHRcdHR5cGU6IHRoaXMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxcblx0XHRcdGFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggdGhpcy5hcnJheSApLFxuXHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXG5cdFx0fTtcblxuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIHRoaXMudXNhZ2UgIT09IFN0YXRpY0RyYXdVc2FnZSApIGRhdGEudXNhZ2UgPSB0aGlzLnVzYWdlO1xuXHRcdGlmICggdGhpcy51cGRhdGVSYW5nZS5vZmZzZXQgIT09IDAgfHwgdGhpcy51cGRhdGVSYW5nZS5jb3VudCAhPT0gLSAxICkgZGF0YS51cGRhdGVSYW5nZSA9IHRoaXMudXBkYXRlUmFuZ2U7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuLy9cblxuZnVuY3Rpb24gSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cbkludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OEFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlO1xuXG5cbmZ1bmN0aW9uIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDhDbGFtcGVkQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcblVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEludDE2QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7XG5cblxuZnVuY3Rpb24gVWludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5VaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApO1xuVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkge1xuXG5cdEJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5JbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG59XG5cblVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5VaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlO1xuXG5mdW5jdGlvbiBGbG9hdDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZTtcbkZsb2F0MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSA9IHRydWU7XG5cbmZ1bmN0aW9uIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHtcblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0MzJBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTtcblxufVxuXG5GbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTtcbkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTtcblxuXG5mdW5jdGlvbiBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7XG5cblx0QnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBGbG9hdDY0QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cbn1cblxuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7XG5GbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7XG5cbmZ1bmN0aW9uIGFycmF5TWF4KCBhcnJheSApIHtcblxuXHRpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5O1xuXG5cdGxldCBtYXggPSBhcnJheVsgMCBdO1xuXG5cdGZvciAoIGxldCBpID0gMSwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7ICsrIGkgKSB7XG5cblx0XHRpZiAoIGFycmF5WyBpIF0gPiBtYXggKSBtYXggPSBhcnJheVsgaSBdO1xuXG5cdH1cblxuXHRyZXR1cm4gbWF4O1xuXG59XG5cbmNvbnN0IFRZUEVEX0FSUkFZUyA9IHtcblx0SW50OEFycmF5OiBJbnQ4QXJyYXksXG5cdFVpbnQ4QXJyYXk6IFVpbnQ4QXJyYXksXG5cdFVpbnQ4Q2xhbXBlZEFycmF5OiBVaW50OENsYW1wZWRBcnJheSxcblx0SW50MTZBcnJheTogSW50MTZBcnJheSxcblx0VWludDE2QXJyYXk6IFVpbnQxNkFycmF5LFxuXHRJbnQzMkFycmF5OiBJbnQzMkFycmF5LFxuXHRVaW50MzJBcnJheTogVWludDMyQXJyYXksXG5cdEZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LFxuXHRGbG9hdDY0QXJyYXk6IEZsb2F0NjRBcnJheVxufTtcblxuZnVuY3Rpb24gZ2V0VHlwZWRBcnJheSggdHlwZSwgYnVmZmVyICkge1xuXG5cdHJldHVybiBuZXcgVFlQRURfQVJSQVlTWyB0eXBlIF0oIGJ1ZmZlciApO1xuXG59XG5cbmxldCBfaWQgPSAwO1xuXG5jb25zdCBfbTEgPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX29iaiA9IG5ldyBPYmplY3QzRCgpO1xuY29uc3QgX29mZnNldCA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfYm94JDEgPSBuZXcgQm94MygpO1xuY29uc3QgX2JveE1vcnBoVGFyZ2V0cyA9IG5ldyBCb3gzKCk7XG5jb25zdCBfdmVjdG9yJDggPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdpZCcsIHsgdmFsdWU6IF9pZCArKyB9ICk7XG5cblx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXHR0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknO1xuXG5cdHRoaXMuaW5kZXggPSBudWxsO1xuXHR0aGlzLmF0dHJpYnV0ZXMgPSB7fTtcblxuXHR0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHR0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gZmFsc2U7XG5cblx0dGhpcy5ncm91cHMgPSBbXTtcblxuXHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7XG5cblx0dGhpcy5kcmF3UmFuZ2UgPSB7IHN0YXJ0OiAwLCBjb3VudDogSW5maW5pdHkgfTtcblxuXHR0aGlzLnVzZXJEYXRhID0ge307XG5cbn1cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEJ1ZmZlckdlb21ldHJ5LFxuXG5cdGlzQnVmZmVyR2VvbWV0cnk6IHRydWUsXG5cblx0Z2V0SW5kZXg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLmluZGV4O1xuXG5cdH0sXG5cblx0c2V0SW5kZXg6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGluZGV4ICkgKSB7XG5cblx0XHRcdHRoaXMuaW5kZXggPSBuZXcgKCBhcnJheU1heCggaW5kZXggKSA+IDY1NTM1ID8gVWludDMyQnVmZmVyQXR0cmlidXRlIDogVWludDE2QnVmZmVyQXR0cmlidXRlICkoIGluZGV4LCAxICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmluZGV4ID0gaW5kZXg7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGdldEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdH0sXG5cblx0c2V0QXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRcdHRoaXMuYXR0cmlidXRlc1sgbmFtZSBdID0gYXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkZWxldGVBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0aGFzQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF0gIT09IHVuZGVmaW5lZDtcblxuXHR9LFxuXG5cdGFkZEdyb3VwOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgbWF0ZXJpYWxJbmRleCA9IDAgKSB7XG5cblx0XHR0aGlzLmdyb3Vwcy5wdXNoKCB7XG5cblx0XHRcdHN0YXJ0OiBzdGFydCxcblx0XHRcdGNvdW50OiBjb3VudCxcblx0XHRcdG1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXhcblxuXHRcdH0gKTtcblxuXHR9LFxuXG5cdGNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmdyb3VwcyA9IFtdO1xuXG5cdH0sXG5cblx0c2V0RHJhd1JhbmdlOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCApIHtcblxuXHRcdHRoaXMuZHJhd1JhbmdlLnN0YXJ0ID0gc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDtcblxuXHR9LFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cG9zaXRpb24uYXBwbHlNYXRyaXg0KCBtYXRyaXggKTtcblxuXHRcdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3Qgbm9ybWFsID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDtcblxuXHRcdGlmICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsLmFwcGx5Tm9ybWFsTWF0cml4KCBub3JtYWxNYXRyaXggKTtcblxuXHRcdFx0bm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHRhbmdlbnQgPSB0aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDtcblxuXHRcdGlmICggdGFuZ2VudCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0YW5nZW50LnRyYW5zZm9ybURpcmVjdGlvbiggbWF0cml4ICk7XG5cblx0XHRcdHRhbmdlbnQubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVYOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB4LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25YKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVZOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25ZKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyb3RhdGVaOiBmdW5jdGlvbiAoIGFuZ2xlICkge1xuXG5cdFx0Ly8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXNcblxuXHRcdF9tMS5tYWtlUm90YXRpb25aKCBhbmdsZSApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0cmFuc2xhdGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHtcblxuXHRcdC8vIHRyYW5zbGF0ZSBnZW9tZXRyeVxuXG5cdFx0X20xLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApO1xuXG5cdFx0dGhpcy5hcHBseU1hdHJpeDQoIF9tMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkge1xuXG5cdFx0Ly8gc2NhbGUgZ2VvbWV0cnlcblxuXHRcdF9tMS5tYWtlU2NhbGUoIHgsIHksIHogKTtcblxuXHRcdHRoaXMuYXBwbHlNYXRyaXg0KCBfbTEgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bG9va0F0OiBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRcdF9vYmoubG9va0F0KCB2ZWN0b3IgKTtcblxuXHRcdF9vYmoudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLmFwcGx5TWF0cml4NCggX29iai5tYXRyaXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2VudGVyOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO1xuXG5cdFx0dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIF9vZmZzZXQgKS5uZWdhdGUoKTtcblxuXHRcdHRoaXMudHJhbnNsYXRlKCBfb2Zmc2V0LngsIF9vZmZzZXQueSwgX29mZnNldC56ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IHBvaW50c1sgaSBdO1xuXHRcdFx0cG9zaXRpb24ucHVzaCggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCAzICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nQm94OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdCb3ggPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdGlmICggcG9zaXRpb24gJiYgcG9zaXRpb24uaXNHTEJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0IFwibWVzaC5mcnVzdHVtQ3VsbGVkXCIgdG8gXCJmYWxzZVwiLicsIHRoaXMgKTtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXQoXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCAtIEluZmluaXR5LCAtIEluZmluaXR5LCAtIEluZmluaXR5ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5IClcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudFxuXG5cdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTtcblx0XHRcdFx0XHRfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdGlmICggdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ4LmFkZFZlY3RvcnMoIHRoaXMuYm91bmRpbmdCb3gubWluLCBfYm94JDEubWluICk7XG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF92ZWN0b3IkOCApO1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguYWRkVmVjdG9ycyggdGhpcy5ib3VuZGluZ0JveC5tYXgsIF9ib3gkMS5tYXggKTtcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX3ZlY3RvciQ4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gkMS5taW4gKTtcblx0XHRcdFx0XHRcdHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX2JveCQxLm1heCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdCb3goKTogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Y29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjtcblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiA9IHRoaXMubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXG5cdFx0aWYgKCBwb3NpdGlvbiAmJiBwb3NpdGlvbi5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IEdMQnVmZmVyQXR0cmlidXRlIHJlcXVpcmVzIGEgbWFudWFsIGJvdW5kaW5nIHNwaGVyZS4gQWx0ZXJuYXRpdmVseSBzZXQgXCJtZXNoLmZydXN0dW1DdWxsZWRcIiB0byBcImZhbHNlXCIuJywgdGhpcyApO1xuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnNldCggbmV3IFZlY3RvcjMoKSwgSW5maW5pdHkgKTtcblxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwb3NpdGlvbiApIHtcblxuXHRcdFx0Ly8gZmlyc3QsIGZpbmQgdGhlIGNlbnRlciBvZiB0aGUgYm91bmRpbmcgc3BoZXJlXG5cblx0XHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO1xuXG5cdFx0XHRfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTtcblxuXHRcdFx0Ly8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnRcblxuXHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07XG5cdFx0XHRcdFx0X2JveE1vcnBoVGFyZ2V0cy5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguYWRkVmVjdG9ycyggX2JveCQxLm1pbiwgX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMS5leHBhbmRCeVBvaW50KCBfdmVjdG9yJDggKTtcblxuXHRcdFx0XHRcdFx0X3ZlY3RvciQ4LmFkZFZlY3RvcnMoIF9ib3gkMS5tYXgsIF9ib3hNb3JwaFRhcmdldHMubWF4ICk7XG5cdFx0XHRcdFx0XHRfYm94JDEuZXhwYW5kQnlQb2ludCggX3ZlY3RvciQ4ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRfYm94JDEuZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5taW4gKTtcblx0XHRcdFx0XHRcdF9ib3gkMS5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1heCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRfYm94JDEuZ2V0Q2VudGVyKCBjZW50ZXIgKTtcblxuXHRcdFx0Ly8gc2Vjb25kLCB0cnkgdG8gZmluZCBhIGJvdW5kaW5nU3BoZXJlIHdpdGggYSByYWRpdXMgc21hbGxlciB0aGFuIHRoZVxuXHRcdFx0Ly8gYm91bmRpbmdTcGhlcmUgb2YgdGhlIGJvdW5kaW5nQm94OiBzcXJ0KDMpIHNtYWxsZXIgaW4gdGhlIGJlc3QgY2FzZVxuXG5cdFx0XHRsZXQgbWF4UmFkaXVzU3EgPSAwO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGkgKTtcblxuXHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yJDggKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50XG5cblx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdO1xuXHRcdFx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBtb3JwaEF0dHJpYnV0ZS5jb3VudDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGogKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRcdFx0XHRfb2Zmc2V0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBqICk7XG5cdFx0XHRcdFx0XHRcdF92ZWN0b3IkOC5hZGQoIF9vZmZzZXQgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRtYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBfdmVjdG9yJDggKSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTtcblxuXHRcdFx0aWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSBcInBvc2l0aW9uXCIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJywgdGhpcyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0fSxcblxuXHRjb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleDtcblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Ly8gYmFzZWQgb24gaHR0cDovL3d3dy50ZXJhdGhvbi5jb20vY29kZS90YW5nZW50Lmh0bWxcblx0XHQvLyAocGVyIHZlcnRleCB0YW5nZW50cylcblxuXHRcdGlmICggaW5kZXggPT09IG51bGwgfHxcblx0XHRcdCBhdHRyaWJ1dGVzLnBvc2l0aW9uID09PSB1bmRlZmluZWQgfHxcblx0XHRcdCBhdHRyaWJ1dGVzLm5vcm1hbCA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHQgYXR0cmlidXRlcy51diA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IGluZGV4LmFycmF5O1xuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7XG5cdFx0Y29uc3Qgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsLmFycmF5O1xuXHRcdGNvbnN0IHV2cyA9IGF0dHJpYnV0ZXMudXYuYXJyYXk7XG5cblx0XHRjb25zdCBuVmVydGljZXMgPSBwb3NpdGlvbnMubGVuZ3RoIC8gMztcblxuXHRcdGlmICggYXR0cmlidXRlcy50YW5nZW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndGFuZ2VudCcsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIDQgKiBuVmVydGljZXMgKSwgNCApICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0YW5nZW50cyA9IGF0dHJpYnV0ZXMudGFuZ2VudC5hcnJheTtcblxuXHRcdGNvbnN0IHRhbjEgPSBbXSwgdGFuMiA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgblZlcnRpY2VzOyBpICsrICkge1xuXG5cdFx0XHR0YW4xWyBpIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0dGFuMlsgaSBdID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHZBID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHZCID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHZDID0gbmV3IFZlY3RvcjMoKSxcblxuXHRcdFx0dXZBID0gbmV3IFZlY3RvcjIoKSxcblx0XHRcdHV2QiA9IG5ldyBWZWN0b3IyKCksXG5cdFx0XHR1dkMgPSBuZXcgVmVjdG9yMigpLFxuXG5cdFx0XHRzZGlyID0gbmV3IFZlY3RvcjMoKSxcblx0XHRcdHRkaXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0ZnVuY3Rpb24gaGFuZGxlVHJpYW5nbGUoIGEsIGIsIGMgKSB7XG5cblx0XHRcdHZBLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApO1xuXHRcdFx0dkIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGIgKiAzICk7XG5cdFx0XHR2Qy5mcm9tQXJyYXkoIHBvc2l0aW9ucywgYyAqIDMgKTtcblxuXHRcdFx0dXZBLmZyb21BcnJheSggdXZzLCBhICogMiApO1xuXHRcdFx0dXZCLmZyb21BcnJheSggdXZzLCBiICogMiApO1xuXHRcdFx0dXZDLmZyb21BcnJheSggdXZzLCBjICogMiApO1xuXG5cdFx0XHR2Qi5zdWIoIHZBICk7XG5cdFx0XHR2Qy5zdWIoIHZBICk7XG5cblx0XHRcdHV2Qi5zdWIoIHV2QSApO1xuXHRcdFx0dXZDLnN1YiggdXZBICk7XG5cblx0XHRcdGNvbnN0IHIgPSAxLjAgLyAoIHV2Qi54ICogdXZDLnkgLSB1dkMueCAqIHV2Qi55ICk7XG5cblx0XHRcdC8vIHNpbGVudGx5IGlnbm9yZSBkZWdlbmVyYXRlIHV2IHRyaWFuZ2xlcyBoYXZpbmcgY29pbmNpZGVudCBvciBjb2xpbmVhciB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoICEgaXNGaW5pdGUoIHIgKSApIHJldHVybjtcblxuXHRcdFx0c2Rpci5jb3B5KCB2QiApLm11bHRpcGx5U2NhbGFyKCB1dkMueSApLmFkZFNjYWxlZFZlY3RvciggdkMsIC0gdXZCLnkgKS5tdWx0aXBseVNjYWxhciggciApO1xuXHRcdFx0dGRpci5jb3B5KCB2QyApLm11bHRpcGx5U2NhbGFyKCB1dkIueCApLmFkZFNjYWxlZFZlY3RvciggdkIsIC0gdXZDLnggKS5tdWx0aXBseVNjYWxhciggciApO1xuXG5cdFx0XHR0YW4xWyBhIF0uYWRkKCBzZGlyICk7XG5cdFx0XHR0YW4xWyBiIF0uYWRkKCBzZGlyICk7XG5cdFx0XHR0YW4xWyBjIF0uYWRkKCBzZGlyICk7XG5cblx0XHRcdHRhbjJbIGEgXS5hZGQoIHRkaXIgKTtcblx0XHRcdHRhbjJbIGIgXS5hZGQoIHRkaXIgKTtcblx0XHRcdHRhbjJbIGMgXS5hZGQoIHRkaXIgKTtcblxuXHRcdH1cblxuXHRcdGxldCBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0Z3JvdXBzID0gWyB7XG5cdFx0XHRcdHN0YXJ0OiAwLFxuXHRcdFx0XHRjb3VudDogaW5kaWNlcy5sZW5ndGhcblx0XHRcdH0gXTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cblx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRjb25zdCBjb3VudCA9IGdyb3VwLmNvdW50O1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IHN0YXJ0ICsgY291bnQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdGhhbmRsZVRyaWFuZ2xlKFxuXHRcdFx0XHRcdGluZGljZXNbIGogKyAwIF0sXG5cdFx0XHRcdFx0aW5kaWNlc1sgaiArIDEgXSxcblx0XHRcdFx0XHRpbmRpY2VzWyBqICsgMiBdXG5cdFx0XHRcdCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IHRtcCA9IG5ldyBWZWN0b3IzKCksIHRtcDIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMygpLCBuMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRmdW5jdGlvbiBoYW5kbGVWZXJ0ZXgoIHYgKSB7XG5cblx0XHRcdG4uZnJvbUFycmF5KCBub3JtYWxzLCB2ICogMyApO1xuXHRcdFx0bjIuY29weSggbiApO1xuXG5cdFx0XHRjb25zdCB0ID0gdGFuMVsgdiBdO1xuXG5cdFx0XHQvLyBHcmFtLVNjaG1pZHQgb3J0aG9nb25hbGl6ZVxuXG5cdFx0XHR0bXAuY29weSggdCApO1xuXHRcdFx0dG1wLnN1Yiggbi5tdWx0aXBseVNjYWxhciggbi5kb3QoIHQgKSApICkubm9ybWFsaXplKCk7XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBoYW5kZWRuZXNzXG5cblx0XHRcdHRtcDIuY3Jvc3NWZWN0b3JzKCBuMiwgdCApO1xuXHRcdFx0Y29uc3QgdGVzdCA9IHRtcDIuZG90KCB0YW4yWyB2IF0gKTtcblx0XHRcdGNvbnN0IHcgPSAoIHRlc3QgPCAwLjAgKSA/IC0gMS4wIDogMS4wO1xuXG5cdFx0XHR0YW5nZW50c1sgdiAqIDQgXSA9IHRtcC54O1xuXHRcdFx0dGFuZ2VudHNbIHYgKiA0ICsgMSBdID0gdG1wLnk7XG5cdFx0XHR0YW5nZW50c1sgdiAqIDQgKyAyIF0gPSB0bXAuejtcblx0XHRcdHRhbmdlbnRzWyB2ICogNCArIDMgXSA9IHc7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXG5cdFx0XHRjb25zdCBzdGFydCA9IGdyb3VwLnN0YXJ0O1xuXHRcdFx0Y29uc3QgY291bnQgPSBncm91cC5jb3VudDtcblxuXHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHtcblxuXHRcdFx0XHRoYW5kbGVWZXJ0ZXgoIGluZGljZXNbIGogKyAwIF0gKTtcblx0XHRcdFx0aGFuZGxlVmVydGV4KCBpbmRpY2VzWyBqICsgMSBdICk7XG5cdFx0XHRcdGhhbmRsZVZlcnRleCggaW5kaWNlc1sgaiArIDIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRjb21wdXRlVmVydGV4Tm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuXHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gdGhpcy5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdGlmICggcG9zaXRpb25BdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGV0IG5vcm1hbEF0dHJpYnV0ZSA9IHRoaXMuZ2V0QXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXG5cdFx0XHRpZiAoIG5vcm1hbEF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZSA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50ICogMyApLCAzICk7XG5cdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbm9ybWFsQXR0cmlidXRlICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gcmVzZXQgZXhpc3Rpbmcgbm9ybWFscyB0byB6ZXJvXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG5vcm1hbEF0dHJpYnV0ZS5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSwgMCwgMCwgMCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBwQSA9IG5ldyBWZWN0b3IzKCksIHBCID0gbmV3IFZlY3RvcjMoKSwgcEMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc3QgbkEgPSBuZXcgVmVjdG9yMygpLCBuQiA9IG5ldyBWZWN0b3IzKCksIG5DID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGNiID0gbmV3IFZlY3RvcjMoKSwgYWIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpbmRleGVkIGVsZW1lbnRzXG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGluZGV4LmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHZBID0gaW5kZXguZ2V0WCggaSArIDAgKTtcblx0XHRcdFx0XHRjb25zdCB2QiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0Y29uc3QgdkMgPSBpbmRleC5nZXRYKCBpICsgMiApO1xuXG5cdFx0XHRcdFx0cEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZBICk7XG5cdFx0XHRcdFx0cEIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZCICk7XG5cdFx0XHRcdFx0cEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIHZDICk7XG5cblx0XHRcdFx0XHRjYi5zdWJWZWN0b3JzKCBwQywgcEIgKTtcblx0XHRcdFx0XHRhYi5zdWJWZWN0b3JzKCBwQSwgcEIgKTtcblx0XHRcdFx0XHRjYi5jcm9zcyggYWIgKTtcblxuXHRcdFx0XHRcdG5BLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbEF0dHJpYnV0ZSwgdkEgKTtcblx0XHRcdFx0XHRuQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBub3JtYWxBdHRyaWJ1dGUsIHZCICk7XG5cdFx0XHRcdFx0bkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFsQXR0cmlidXRlLCB2QyApO1xuXG5cdFx0XHRcdFx0bkEuYWRkKCBjYiApO1xuXHRcdFx0XHRcdG5CLmFkZCggY2IgKTtcblx0XHRcdFx0XHRuQy5hZGQoIGNiICk7XG5cblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCB2QSwgbkEueCwgbkEueSwgbkEueiApO1xuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIHZCLCBuQi54LCBuQi55LCBuQi56ICk7XG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggdkMsIG5DLngsIG5DLnksIG5DLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gbm9uLWluZGV4ZWQgZWxlbWVudHMgKHVuY29ubmVjdGVkIHRyaWFuZ2xlIHNvdXApXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRcdHBBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMCApO1xuXHRcdFx0XHRcdHBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApO1xuXHRcdFx0XHRcdHBDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMiApO1xuXG5cdFx0XHRcdFx0Y2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7XG5cdFx0XHRcdFx0YWIuc3ViVmVjdG9ycyggcEEsIHBCICk7XG5cdFx0XHRcdFx0Y2IuY3Jvc3MoIGFiICk7XG5cblx0XHRcdFx0XHRub3JtYWxBdHRyaWJ1dGUuc2V0WFlaKCBpICsgMCwgY2IueCwgY2IueSwgY2IueiApO1xuXHRcdFx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5zZXRYWVooIGkgKyAxLCBjYi54LCBjYi55LCBjYi56ICk7XG5cdFx0XHRcdFx0bm9ybWFsQXR0cmlidXRlLnNldFhZWiggaSArIDIsIGNiLngsIGNiLnksIGNiLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7XG5cblx0XHRcdG5vcm1hbEF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fSxcblxuXHRtZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkge1xuXG5cdFx0aWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LicsIGdlb21ldHJ5ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvZmZzZXQgPSAwO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuICdcblx0XHRcdFx0KyAnVXNlIEJ1ZmZlckdlb21ldHJ5VXRpbHMubWVyZ2VCdWZmZXJHZW9tZXRyaWVzKCkgZm9yIGxvc3NsZXNzIG1lcmdlLidcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUxID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5O1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheTIgPSBhdHRyaWJ1dGUyLmFycmF5O1xuXG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVPZmZzZXQgPSBhdHRyaWJ1dGUyLml0ZW1TaXplICogb2Zmc2V0O1xuXHRcdFx0Y29uc3QgbGVuZ3RoID0gTWF0aC5taW4oIGF0dHJpYnV0ZUFycmF5Mi5sZW5ndGgsIGF0dHJpYnV0ZUFycmF5MS5sZW5ndGggLSBhdHRyaWJ1dGVPZmZzZXQgKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gYXR0cmlidXRlT2Zmc2V0OyBpIDwgbGVuZ3RoOyBpICsrLCBqICsrICkge1xuXG5cdFx0XHRcdGF0dHJpYnV0ZUFycmF5MVsgaiBdID0gYXR0cmlidXRlQXJyYXkyWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3Qgbm9ybWFscyA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbm9ybWFscy5jb3VudDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRfdmVjdG9yJDguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgaSApO1xuXG5cdFx0XHRfdmVjdG9yJDgubm9ybWFsaXplKCk7XG5cblx0XHRcdG5vcm1hbHMuc2V0WFlaKCBpLCBfdmVjdG9yJDgueCwgX3ZlY3RvciQ4LnksIF92ZWN0b3IkOC56ICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR0b05vbkluZGV4ZWQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGZ1bmN0aW9uIGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBhdHRyaWJ1dGUuYXJyYXk7XG5cdFx0XHRjb25zdCBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTtcblx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBhdHRyaWJ1dGUubm9ybWFsaXplZDtcblxuXHRcdFx0Y29uc3QgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7XG5cblx0XHRcdGxldCBpbmRleCA9IDAsIGluZGV4MiA9IDA7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpbmRleCA9IGluZGljZXNbIGkgXSAqIGl0ZW1TaXplO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkge1xuXG5cdFx0XHRcdFx0YXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXkyLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggdGhpcy5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkudG9Ob25JbmRleGVkKCk6IEJ1ZmZlckdlb21ldHJ5IGlzIGFscmVhZHkgbm9uLWluZGV4ZWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5O1xuXHRcdGNvbnN0IGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Y29uc3QgbmV3QXR0cmlidXRlID0gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICk7XG5cblx0XHRcdGdlb21ldHJ5Mi5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5ld0F0dHJpYnV0ZSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhBcnJheSA9IFtdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZVsgaSBdO1xuXG5cdFx0XHRcdGNvbnN0IG5ld0F0dHJpYnV0ZSA9IGNvbnZlcnRCdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kaWNlcyApO1xuXG5cdFx0XHRcdG1vcnBoQXJyYXkucHVzaCggbmV3QXR0cmlidXRlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Z2VvbWV0cnkyLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gbW9ycGhBcnJheTtcblxuXHRcdH1cblxuXHRcdGdlb21ldHJ5Mi5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XG5cblx0XHQvLyBncm91cHNcblxuXHRcdGNvbnN0IGdyb3VwcyA9IHRoaXMuZ3JvdXBzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGdyb3VwID0gZ3JvdXBzWyBpIF07XG5cdFx0XHRnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdlb21ldHJ5MjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ0J1ZmZlckdlb21ldHJ5Jyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJ1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBzdGFuZGFyZCBCdWZmZXJHZW9tZXRyeSBzZXJpYWxpemF0aW9uXG5cblx0XHRkYXRhLnV1aWQgPSB0aGlzLnV1aWQ7XG5cdFx0ZGF0YS50eXBlID0gdGhpcy50eXBlO1xuXHRcdGlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTtcblx0XHRpZiAoIE9iamVjdC5rZXlzKCB0aGlzLnVzZXJEYXRhICkubGVuZ3RoID4gMCApIGRhdGEudXNlckRhdGEgPSB0aGlzLnVzZXJEYXRhO1xuXG5cdFx0aWYgKCB0aGlzLnBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRcdFx0aWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblxuXHRcdH1cblxuXHRcdC8vIGZvciBzaW1wbGljaXR5IHRoZSBjb2RlIGFzc3VtZXMgYXR0cmlidXRlcyBhcmUgbm90IHNoYXJlZCBhY3Jvc3MgZ2VvbWV0cmllcywgc2VlICMxNTgxMVxuXG5cdFx0ZGF0YS5kYXRhID0geyBhdHRyaWJ1dGVzOiB7fSB9O1xuXG5cdFx0Y29uc3QgaW5kZXggPSB0aGlzLmluZGV4O1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLmluZGV4ID0ge1xuXHRcdFx0XHR0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLFxuXHRcdFx0XHRhcnJheTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGluZGV4LmFycmF5IClcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHRkYXRhLmRhdGEuYXR0cmlidXRlc1sga2V5IF0gPSBhdHRyaWJ1dGUudG9KU09OKCBkYXRhLmRhdGEgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IHt9O1xuXHRcdGxldCBoYXNNb3JwaEF0dHJpYnV0ZXMgPSBmYWxzZTtcblxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlQXJyYXkgPSB0aGlzLm1vcnBoQXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xuXG5cdFx0XHRcdGFycmF5LnB1c2goIGF0dHJpYnV0ZS50b0pTT04oIGRhdGEuZGF0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBhcnJheS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdG1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTtcblxuXHRcdFx0XHRoYXNNb3JwaEF0dHJpYnV0ZXMgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGhhc01vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0ZGF0YS5kYXRhLm1vcnBoQXR0cmlidXRlcyA9IG1vcnBoQXR0cmlidXRlcztcblx0XHRcdGRhdGEuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU7XG5cblx0XHR9XG5cblx0XHRjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwcztcblxuXHRcdGlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ncm91cHMgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggZ3JvdXBzICkgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTtcblxuXHRcdGlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGRhdGEuZGF0YS5ib3VuZGluZ1NwaGVyZSA9IHtcblx0XHRcdFx0Y2VudGVyOiBib3VuZGluZ1NwaGVyZS5jZW50ZXIudG9BcnJheSgpLFxuXHRcdFx0XHRyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1c1xuXHRcdFx0fTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdC8qXG5cdFx0IC8vIEhhbmRsZSBwcmltaXRpdmVzXG5cblx0XHQgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMucGFyYW1ldGVycztcblxuXHRcdCBpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdCBjb25zdCB2YWx1ZXMgPSBbXTtcblxuXHRcdCBmb3IgKCBjb25zdCBrZXkgaW4gcGFyYW1ldGVycyApIHtcblxuXHRcdCB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTtcblxuXHRcdCB9XG5cblx0XHQgY29uc3QgZ2VvbWV0cnkgPSBPYmplY3QuY3JlYXRlKCB0aGlzLmNvbnN0cnVjdG9yLnByb3RvdHlwZSApO1xuXHRcdCB0aGlzLmNvbnN0cnVjdG9yLmFwcGx5KCBnZW9tZXRyeSwgdmFsdWVzICk7XG5cdFx0IHJldHVybiBnZW9tZXRyeTtcblxuXHRcdCB9XG5cblx0XHQgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXHRcdCAqL1xuXG5cdFx0cmV0dXJuIG5ldyBCdWZmZXJHZW9tZXRyeSgpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0Ly8gcmVzZXRcblxuXHRcdHRoaXMuaW5kZXggPSBudWxsO1xuXHRcdHRoaXMuYXR0cmlidXRlcyA9IHt9O1xuXHRcdHRoaXMubW9ycGhBdHRyaWJ1dGVzID0ge307XG5cdFx0dGhpcy5ncm91cHMgPSBbXTtcblx0XHR0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDtcblx0XHR0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDtcblxuXHRcdC8vIHVzZWQgZm9yIHN0b3JpbmcgY2xvbmVkLCBzaGFyZWQgZGF0YVxuXG5cdFx0Y29uc3QgZGF0YSA9IHt9O1xuXG5cdFx0Ly8gbmFtZVxuXG5cdFx0dGhpcy5uYW1lID0gc291cmNlLm5hbWU7XG5cblx0XHQvLyBpbmRleFxuXG5cdFx0Y29uc3QgaW5kZXggPSBzb3VyY2UuaW5kZXg7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnNldEluZGV4KCBpbmRleC5jbG9uZSggZGF0YSApICk7XG5cblx0XHR9XG5cblx0XHQvLyBhdHRyaWJ1dGVzXG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTtcblx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoIGRhdGEgKSApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gbW9ycGggYXR0cmlidXRlc1xuXG5cdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gc291cmNlLm1vcnBoQXR0cmlidXRlcztcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gbW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRjb25zdCBhcnJheSA9IFtdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsgLy8gbW9ycGhBdHRyaWJ1dGU6IGFycmF5IG9mIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbW9ycGhBdHRyaWJ1dGVbIGkgXS5jbG9uZSggZGF0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5O1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZSA9IHNvdXJjZS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdC8vIGdyb3Vwc1xuXG5cdFx0Y29uc3QgZ3JvdXBzID0gc291cmNlLmdyb3VwcztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0dGhpcy5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBib3hcblxuXHRcdGNvbnN0IGJvdW5kaW5nQm94ID0gc291cmNlLmJvdW5kaW5nQm94O1xuXG5cdFx0aWYgKCBib3VuZGluZ0JveCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBib3VuZGluZyBzcGhlcmVcblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0gc291cmNlLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7XG5cblx0XHR9XG5cblx0XHQvLyBkcmF3IHJhbmdlXG5cblx0XHR0aGlzLmRyYXdSYW5nZS5zdGFydCA9IHNvdXJjZS5kcmF3UmFuZ2Uuc3RhcnQ7XG5cdFx0dGhpcy5kcmF3UmFuZ2UuY291bnQgPSBzb3VyY2UuZHJhd1JhbmdlLmNvdW50O1xuXG5cdFx0Ly8gdXNlciBkYXRhXG5cblx0XHR0aGlzLnVzZXJEYXRhID0gc291cmNlLnVzZXJEYXRhO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX2ludmVyc2VNYXRyaXgkMiA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfcmF5JDIgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlJDMgPSBuZXcgU3BoZXJlKCk7XG5cbmNvbnN0IF92QSQxID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92QiQxID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92QyQxID0gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX3RlbXBBID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90ZW1wQiA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdGVtcEMgPSBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfbW9ycGhBID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9tb3JwaEIgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX21vcnBoQyA9IG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF91dkEkMSA9IG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdXZCJDEgPSBuZXcgVmVjdG9yMigpO1xuY29uc3QgX3V2QyQxID0gbmV3IFZlY3RvcjIoKTtcblxuY29uc3QgX2ludGVyc2VjdGlvblBvaW50ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gTWVzaCggZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKSwgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoKSApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ01lc2gnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBNZXNoLFxuXG5cdGlzTWVzaDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gc291cmNlLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5zbGljZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcztcblx0XHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyggbW9ycGhBdHRyaWJ1dGVzICk7XG5cblx0XHRcdGlmICgga2V5cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBrZXlzWyAwIF0gXTtcblxuXHRcdFx0XHRpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdO1xuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG5hbWUgPSBtb3JwaEF0dHJpYnV0ZVsgbSBdLm5hbWUgfHwgU3RyaW5nKCBtICk7XG5cblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnB1c2goIDAgKTtcblx0XHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBuYW1lIF0gPSBtO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzO1xuXG5cdFx0XHRpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRjb25zdCBtYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlJDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRfc3BoZXJlJDMuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMyApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRfaW52ZXJzZU1hdHJpeCQyLmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheSQyLmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4JDIgKTtcblxuXHRcdC8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nXG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkge1xuXG5cdFx0XHRpZiAoIF9yYXkkMi5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdH1cblxuXHRcdGxldCBpbnRlcnNlY3Rpb247XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRjb25zdCBtb3JwaFBvc2l0aW9uID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0Y29uc3QgbW9ycGhUYXJnZXRzUmVsYXRpdmUgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblx0XHRcdGNvbnN0IHV2ID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djtcblx0XHRcdGNvbnN0IHV2MiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXYyO1xuXHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXHRcdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIGluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcblx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCBncm91cC5zdGFydCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdFx0XHRjb25zdCBlbmQgPSBNYXRoLm1pbiggKCBncm91cC5zdGFydCArIGdyb3VwLmNvdW50ICksICggZHJhd1JhbmdlLnN0YXJ0ICsgZHJhd1JhbmdlLmNvdW50ICkgKTtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBqICk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGIgPSBpbmRleC5nZXRYKCBqICsgMSApO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaiArIDIgKTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBncm91cE1hdGVyaWFsLCByYXljYXN0ZXIsIF9yYXkkMiwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gaW5kZXguZ2V0WCggaSApO1xuXHRcdFx0XHRcdFx0Y29uc3QgYiA9IGluZGV4LmdldFgoIGkgKyAxICk7XG5cdFx0XHRcdFx0XHRjb25zdCBjID0gaW5kZXguZ2V0WCggaSArIDIgKTtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3Ncblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBub24taW5kZXhlZCBidWZmZXIgZ2VvbWV0cnlcblxuXHRcdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3QgYSA9IGo7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGIgPSBqICsgMTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYyA9IGogKyAyO1xuXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGludGVyc2VjdGlvbiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlSW5kZXggPSBNYXRoLmZsb29yKCBqIC8gMyApOyAvLyB0cmlhbmdsZSBudW1iZXIgaW4gbm9uLWluZGV4ZWQgYnVmZmVyIHNlbWFudGljc1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdGlvbi5mYWNlLm1hdGVyaWFsSW5kZXggPSBncm91cC5tYXRlcmlhbEluZGV4O1xuXHRcdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoIDAsIGRyYXdSYW5nZS5zdGFydCApO1xuXHRcdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbi5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhID0gaTtcblx0XHRcdFx0XHRcdGNvbnN0IGIgPSBpICsgMTtcblx0XHRcdFx0XHRcdGNvbnN0IGMgPSBpICsgMjtcblxuXHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uID0gY2hlY2tCdWZmZXJHZW9tZXRyeUludGVyc2VjdGlvbiggdGhpcywgbWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSQyLCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgbW9ycGhUYXJnZXRzUmVsYXRpdmUsIHV2LCB1djIsIGEsIGIsIGMgKTtcblxuXHRcdFx0XHRcdFx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRcdFx0XHRcdFx0aW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGkgLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBub24taW5kZXhlZCBidWZmZXIgc2VtYW50aWNzXG5cdFx0XHRcdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwQSwgcEIsIHBDLCBwb2ludCApIHtcblxuXHRsZXQgaW50ZXJzZWN0O1xuXG5cdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRpbnRlcnNlY3QgPSByYXkuaW50ZXJzZWN0VHJpYW5nbGUoIHBDLCBwQiwgcEEsIHRydWUsIHBvaW50ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGludGVyc2VjdCA9IHJheS5pbnRlcnNlY3RUcmlhbmdsZSggcEEsIHBCLCBwQywgbWF0ZXJpYWwuc2lkZSAhPT0gRG91YmxlU2lkZSwgcG9pbnQgKTtcblxuXHR9XG5cblx0aWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSByZXR1cm4gbnVsbDtcblxuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jb3B5KCBwb2ludCApO1xuXHRfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdGNvbnN0IGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdGlvblBvaW50V29ybGQgKTtcblxuXHRpZiAoIGRpc3RhbmNlIDwgcmF5Y2FzdGVyLm5lYXIgfHwgZGlzdGFuY2UgPiByYXljYXN0ZXIuZmFyICkgcmV0dXJuIG51bGw7XG5cblx0cmV0dXJuIHtcblx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0cG9pbnQ6IF9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNsb25lKCksXG5cdFx0b2JqZWN0OiBvYmplY3Rcblx0fTtcblxufVxuXG5mdW5jdGlvbiBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIG1vcnBoVGFyZ2V0c1JlbGF0aXZlLCB1diwgdXYyLCBhLCBiLCBjICkge1xuXG5cdF92QSQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7XG5cdF92QiQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7XG5cdF92QyQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7XG5cblx0Y29uc3QgbW9ycGhJbmZsdWVuY2VzID0gb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcztcblxuXHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcyApIHtcblxuXHRcdF9tb3JwaEEuc2V0KCAwLCAwLCAwICk7XG5cdFx0X21vcnBoQi5zZXQoIDAsIDAsIDAgKTtcblx0XHRfbW9ycGhDLnNldCggMCwgMCwgMCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1vcnBoUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IG1vcnBoSW5mbHVlbmNlc1sgaSBdO1xuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaFBvc2l0aW9uWyBpIF07XG5cblx0XHRcdGlmICggaW5mbHVlbmNlID09PSAwICkgY29udGludWU7XG5cblx0XHRcdF90ZW1wQS5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgYSApO1xuXHRcdFx0X3RlbXBCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBiICk7XG5cdFx0XHRfdGVtcEMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGMgKTtcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHNSZWxhdGl2ZSApIHtcblxuXHRcdFx0XHRfbW9ycGhBLmFkZFNjYWxlZFZlY3RvciggX3RlbXBBLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQi5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQiwgaW5mbHVlbmNlICk7XG5cdFx0XHRcdF9tb3JwaEMuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEMsIGluZmx1ZW5jZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9tb3JwaEEuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEEuc3ViKCBfdkEkMSApLCBpbmZsdWVuY2UgKTtcblx0XHRcdFx0X21vcnBoQi5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQi5zdWIoIF92QiQxICksIGluZmx1ZW5jZSApO1xuXHRcdFx0XHRfbW9ycGhDLmFkZFNjYWxlZFZlY3RvciggX3RlbXBDLnN1YiggX3ZDJDEgKSwgaW5mbHVlbmNlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdF92QSQxLmFkZCggX21vcnBoQSApO1xuXHRcdF92QiQxLmFkZCggX21vcnBoQiApO1xuXHRcdF92QyQxLmFkZCggX21vcnBoQyApO1xuXG5cdH1cblxuXHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nICkge1xuXG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGEsIF92QSQxICk7XG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGIsIF92QiQxICk7XG5cdFx0b2JqZWN0LmJvbmVUcmFuc2Zvcm0oIGMsIF92QyQxICk7XG5cblx0fVxuXG5cdGNvbnN0IGludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCBvYmplY3QsIG1hdGVyaWFsLCByYXljYXN0ZXIsIHJheSwgX3ZBJDEsIF92QiQxLCBfdkMkMSwgX2ludGVyc2VjdGlvblBvaW50ICk7XG5cblx0aWYgKCBpbnRlcnNlY3Rpb24gKSB7XG5cblx0XHRpZiAoIHV2ICkge1xuXG5cdFx0XHRfdXZBJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTtcblx0XHRcdF91dkIkMS5mcm9tQnVmZmVyQXR0cmlidXRlKCB1diwgYiApO1xuXHRcdFx0X3V2QyQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2LCBjICk7XG5cblx0XHRcdGludGVyc2VjdGlvbi51diA9IFRyaWFuZ2xlLmdldFVWKCBfaW50ZXJzZWN0aW9uUG9pbnQsIF92QSQxLCBfdkIkMSwgX3ZDJDEsIF91dkEkMSwgX3V2QiQxLCBfdXZDJDEsIG5ldyBWZWN0b3IyKCkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXYyICkge1xuXG5cdFx0XHRfdXZBJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBhICk7XG5cdFx0XHRfdXZCJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBiICk7XG5cdFx0XHRfdXZDJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBjICk7XG5cblx0XHRcdGludGVyc2VjdGlvbi51djIgPSBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdGlvblBvaW50LCBfdkEkMSwgX3ZCJDEsIF92QyQxLCBfdXZBJDEsIF91dkIkMSwgX3V2QyQxLCBuZXcgVmVjdG9yMigpICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBmYWNlID0ge1xuXHRcdFx0YTogYSxcblx0XHRcdGI6IGIsXG5cdFx0XHRjOiBjLFxuXHRcdFx0bm9ybWFsOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0bWF0ZXJpYWxJbmRleDogMFxuXHRcdH07XG5cblx0XHRUcmlhbmdsZS5nZXROb3JtYWwoIF92QSQxLCBfdkIkMSwgX3ZDJDEsIGZhY2Uubm9ybWFsICk7XG5cblx0XHRpbnRlcnNlY3Rpb24uZmFjZSA9IGZhY2U7XG5cblx0fVxuXG5cdHJldHVybiBpbnRlcnNlY3Rpb247XG5cbn1cblxuY2xhc3MgQm94R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxLCBkZXB0aFNlZ21lbnRzID0gMSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQm94R2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0d2lkdGg6IHdpZHRoLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRkZXB0aDogZGVwdGgsXG5cdFx0XHR3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLFxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdFx0ZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50c1xuXHRcdH07XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHQvLyBzZWdtZW50c1xuXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XG5cdFx0ZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGxldCBudW1iZXJPZlZlcnRpY2VzID0gMDtcblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XG5cblx0XHQvLyBidWlsZCBlYWNoIHNpZGUgb2YgdGhlIGJveCBnZW9tZXRyeVxuXG5cdFx0YnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweFxuXHRcdGJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbnhcblx0XHRidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueVxuXHRcdGJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6XG5cdFx0YnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRcdGZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7XG5cblx0XHRcdGNvbnN0IHNlZ21lbnRXaWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0XHRjb25zdCBzZWdtZW50SGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7XG5cblx0XHRcdGNvbnN0IHdpZHRoSGFsZiA9IHdpZHRoIC8gMjtcblx0XHRcdGNvbnN0IGhlaWdodEhhbGYgPSBoZWlnaHQgLyAyO1xuXHRcdFx0Y29uc3QgZGVwdGhIYWxmID0gZGVwdGggLyAyO1xuXG5cdFx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0XHRjb25zdCBncmlkWTEgPSBncmlkWSArIDE7XG5cblx0XHRcdGxldCB2ZXJ0ZXhDb3VudGVyID0gMDtcblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcblxuXHRcdFx0Y29uc3QgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgeSA9IGl5ICogc2VnbWVudEhlaWdodCAtIGhlaWdodEhhbGY7XG5cblx0XHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCBncmlkWDE7IGl4ICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgeCA9IGl4ICogc2VnbWVudFdpZHRoIC0gd2lkdGhIYWxmO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0geCAqIHVkaXI7XG5cdFx0XHRcdFx0dmVjdG9yWyB2IF0gPSB5ICogdmRpcjtcblx0XHRcdFx0XHR2ZWN0b3JbIHcgXSA9IGRlcHRoSGFsZjtcblxuXHRcdFx0XHRcdC8vIG5vdyBhcHBseSB2ZWN0b3IgdG8gdmVydGV4IGJ1ZmZlclxuXG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApO1xuXG5cdFx0XHRcdFx0Ly8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnRcblxuXHRcdFx0XHRcdHZlY3RvclsgdSBdID0gMDtcblx0XHRcdFx0XHR2ZWN0b3JbIHYgXSA9IDA7XG5cdFx0XHRcdFx0dmVjdG9yWyB3IF0gPSBkZXB0aCA+IDAgPyAxIDogLSAxO1xuXG5cdFx0XHRcdFx0Ly8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyXG5cblx0XHRcdFx0XHRub3JtYWxzLnB1c2goIHZlY3Rvci54LCB2ZWN0b3IueSwgdmVjdG9yLnogKTtcblxuXHRcdFx0XHRcdC8vIHV2c1xuXG5cdFx0XHRcdFx0dXZzLnB1c2goIGl4IC8gZ3JpZFggKTtcblx0XHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdFx0XHQvLyBjb3VudGVyc1xuXG5cdFx0XHRcdFx0dmVydGV4Q291bnRlciArPSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmRpY2VzXG5cblx0XHRcdC8vIDEuIHlvdSBuZWVkIHRocmVlIGluZGljZXMgdG8gZHJhdyBhIHNpbmdsZSBmYWNlXG5cdFx0XHQvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlc1xuXHRcdFx0Ly8gMy4gc28gd2UgbmVlZCB0byBnZW5lcmF0ZSBzaXggKDIqMykgaW5kaWNlcyBwZXIgc2VnbWVudFxuXG5cdFx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZOyBpeSArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0XHRjb25zdCBiID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0XHRjb25zdCBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSBudW1iZXJPZlZlcnRpY2VzICsgKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdFx0Ly8gZmFjZXNcblxuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHRcdFx0Ly8gaW5jcmVhc2UgY291bnRlclxuXG5cdFx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0XHQvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzXG5cblx0XHRcdG51bWJlck9mVmVydGljZXMgKz0gdmVydGV4Q291bnRlcjtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLyoqXG4gKiBVbmlmb3JtIFV0aWxpdGllc1xuICovXG5cbmZ1bmN0aW9uIGNsb25lVW5pZm9ybXMoIHNyYyApIHtcblxuXHRjb25zdCBkc3QgPSB7fTtcblxuXHRmb3IgKCBjb25zdCB1IGluIHNyYyApIHtcblxuXHRcdGRzdFsgdSBdID0ge307XG5cblx0XHRmb3IgKCBjb25zdCBwIGluIHNyY1sgdSBdICkge1xuXG5cdFx0XHRjb25zdCBwcm9wZXJ0eSA9IHNyY1sgdSBdWyBwIF07XG5cblx0XHRcdGlmICggcHJvcGVydHkgJiYgKCBwcm9wZXJ0eS5pc0NvbG9yIHx8XG5cdFx0XHRcdHByb3BlcnR5LmlzTWF0cml4MyB8fCBwcm9wZXJ0eS5pc01hdHJpeDQgfHxcblx0XHRcdFx0cHJvcGVydHkuaXNWZWN0b3IyIHx8IHByb3BlcnR5LmlzVmVjdG9yMyB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjQgfHxcblx0XHRcdFx0cHJvcGVydHkuaXNUZXh0dXJlIHx8IHByb3BlcnR5LmlzUXVhdGVybmlvbiApICkge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5jbG9uZSgpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBwcm9wZXJ0eSApICkge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eS5zbGljZSgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGRzdFsgdSBdWyBwIF0gPSBwcm9wZXJ0eTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZHN0O1xuXG59XG5cbmZ1bmN0aW9uIG1lcmdlVW5pZm9ybXMoIHVuaWZvcm1zICkge1xuXG5cdGNvbnN0IG1lcmdlZCA9IHt9O1xuXG5cdGZvciAoIGxldCB1ID0gMDsgdSA8IHVuaWZvcm1zLmxlbmd0aDsgdSArKyApIHtcblxuXHRcdGNvbnN0IHRtcCA9IGNsb25lVW5pZm9ybXMoIHVuaWZvcm1zWyB1IF0gKTtcblxuXHRcdGZvciAoIGNvbnN0IHAgaW4gdG1wICkge1xuXG5cdFx0XHRtZXJnZWRbIHAgXSA9IHRtcFsgcCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gbWVyZ2VkO1xuXG59XG5cbi8vIExlZ2FjeVxuXG5jb25zdCBVbmlmb3Jtc1V0aWxzID0geyBjbG9uZTogY2xvbmVVbmlmb3JtcywgbWVyZ2U6IG1lcmdlVW5pZm9ybXMgfTtcblxudmFyIGRlZmF1bHRfdmVydGV4ID0gXCJ2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xcbn1cIjtcblxudmFyIGRlZmF1bHRfZnJhZ21lbnQgPSBcInZvaWQgbWFpbigpIHtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcXG59XCI7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBkZWZpbmVzOiB7IFwibGFiZWxcIiA6IFwidmFsdWVcIiB9LFxuICogIHVuaWZvcm1zOiB7IFwicGFyYW1ldGVyMVwiOiB7IHZhbHVlOiAxLjAgfSwgXCJwYXJhbWV0ZXIyXCI6IHsgdmFsdWUyOiAyIH0gfSxcbiAqXG4gKiAgZnJhZ21lbnRTaGFkZXI6IDxzdHJpbmc+LFxuICogIHZlcnRleFNoYWRlcjogPHN0cmluZz4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PixcbiAqXG4gKiAgbGlnaHRzOiA8Ym9vbD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5mdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRNYXRlcmlhbC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ1NoYWRlck1hdGVyaWFsJztcblxuXHR0aGlzLmRlZmluZXMgPSB7fTtcblx0dGhpcy51bmlmb3JtcyA9IHt9O1xuXG5cdHRoaXMudmVydGV4U2hhZGVyID0gZGVmYXVsdF92ZXJ0ZXg7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBkZWZhdWx0X2ZyYWdtZW50O1xuXG5cdHRoaXMubGluZXdpZHRoID0gMTtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0dGhpcy5mb2cgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBmb2dcblx0dGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHNcblx0dGhpcy5jbGlwcGluZyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXNcblxuXHR0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXNcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBtb3JwaCB0YXJnZXRzXG5cdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7IC8vIHNldCB0byB1c2UgbW9ycGggbm9ybWFsc1xuXG5cdHRoaXMuZXh0ZW5zaW9ucyA9IHtcblx0XHRkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXNcblx0XHRmcmFnRGVwdGg6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGZyYWdtZW50IGRlcHRoIHZhbHVlc1xuXHRcdGRyYXdCdWZmZXJzOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBkcmF3IGJ1ZmZlcnNcblx0XHRzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRFxuXHR9O1xuXG5cdC8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLFxuXHQvLyB1c2UgdGhlc2UgZGVmYXVsdCB2YWx1ZXMgaW4gV2ViR0wuIFRoaXMgYXZvaWRzIGVycm9ycyB3aGVuIGJ1ZmZlciBkYXRhIGlzIG1pc3NpbmcuXG5cdHRoaXMuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IHtcblx0XHQnY29sb3InOiBbIDEsIDEsIDEgXSxcblx0XHQndXYnOiBbIDAsIDAgXSxcblx0XHQndXYyJzogWyAwLCAwIF1cblx0fTtcblxuXHR0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWUgPSB1bmRlZmluZWQ7XG5cdHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy5nbHNsVmVyc2lvbiA9IG51bGw7XG5cblx0aWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuYXR0cmlidXRlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cbn1cblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFkZXJNYXRlcmlhbDtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlO1xuXG5TaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBzb3VyY2UuZnJhZ21lbnRTaGFkZXI7XG5cdHRoaXMudmVydGV4U2hhZGVyID0gc291cmNlLnZlcnRleFNoYWRlcjtcblxuXHR0aGlzLnVuaWZvcm1zID0gY2xvbmVVbmlmb3Jtcyggc291cmNlLnVuaWZvcm1zICk7XG5cblx0dGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7XG5cblx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0dGhpcy5saWdodHMgPSBzb3VyY2UubGlnaHRzO1xuXHR0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5leHRlbnNpb25zID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5leHRlbnNpb25zICk7XG5cblx0dGhpcy5nbHNsVmVyc2lvbiA9IHNvdXJjZS5nbHNsVmVyc2lvbjtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuU2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRjb25zdCBkYXRhID0gTWF0ZXJpYWwucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0ZGF0YS5nbHNsVmVyc2lvbiA9IHRoaXMuZ2xzbFZlcnNpb247XG5cdGRhdGEudW5pZm9ybXMgPSB7fTtcblxuXHRmb3IgKCBjb25zdCBuYW1lIGluIHRoaXMudW5pZm9ybXMgKSB7XG5cblx0XHRjb25zdCB1bmlmb3JtID0gdGhpcy51bmlmb3Jtc1sgbmFtZSBdO1xuXHRcdGNvbnN0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdGlmICggdmFsdWUgJiYgdmFsdWUuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICd0Jyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvSlNPTiggbWV0YSApLnV1aWRcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICdjJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLmdldEhleCgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IyICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICd2MicsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjMgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ3YzJyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yNCApIHtcblxuXHRcdFx0ZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0ge1xuXHRcdFx0XHR0eXBlOiAndjQnLFxuXHRcdFx0XHR2YWx1ZTogdmFsdWUudG9BcnJheSgpXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNNYXRyaXgzICkge1xuXG5cdFx0XHRkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7XG5cdFx0XHRcdHR5cGU6ICdtMycsXG5cdFx0XHRcdHZhbHVlOiB2YWx1ZS50b0FycmF5KClcblx0XHRcdH07XG5cblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDQgKSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dHlwZTogJ200Jyxcblx0XHRcdFx0dmFsdWU6IHZhbHVlLnRvQXJyYXkoKVxuXHRcdFx0fTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHtcblx0XHRcdFx0dmFsdWU6IHZhbHVlXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBub3RlOiB0aGUgYXJyYXkgdmFyaWFudHMgdjJ2LCB2M3YsIHY0diwgbTR2IGFuZCB0diBhcmUgbm90IHN1cHBvcnRlZCBzbyBmYXJcblxuXHRcdH1cblxuXHR9XG5cblx0aWYgKCBPYmplY3Qua2V5cyggdGhpcy5kZWZpbmVzICkubGVuZ3RoID4gMCApIGRhdGEuZGVmaW5lcyA9IHRoaXMuZGVmaW5lcztcblxuXHRkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyO1xuXHRkYXRhLmZyYWdtZW50U2hhZGVyID0gdGhpcy5mcmFnbWVudFNoYWRlcjtcblxuXHRjb25zdCBleHRlbnNpb25zID0ge307XG5cblx0Zm9yICggY29uc3Qga2V5IGluIHRoaXMuZXh0ZW5zaW9ucyApIHtcblxuXHRcdGlmICggdGhpcy5leHRlbnNpb25zWyBrZXkgXSA9PT0gdHJ1ZSApIGV4dGVuc2lvbnNbIGtleSBdID0gdHJ1ZTtcblxuXHR9XG5cblx0aWYgKCBPYmplY3Qua2V5cyggZXh0ZW5zaW9ucyApLmxlbmd0aCA+IDAgKSBkYXRhLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zO1xuXG5cdHJldHVybiBkYXRhO1xuXG59O1xuXG5mdW5jdGlvbiBDYW1lcmEoKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdDYW1lcmEnO1xuXG5cdHRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxuXHR0aGlzLnByb2plY3Rpb25NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTtcblxufVxuXG5DYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ2FtZXJhLFxuXG5cdGlzQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZEludmVyc2UuY29weSggc291cmNlLm1hdHJpeFdvcmxkSW52ZXJzZSApO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Z2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlV29ybGRNYXRyaXgoIHRydWUsIGZhbHNlICk7XG5cblx0XHRjb25zdCBlID0gdGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50cztcblxuXHRcdHJldHVybiB0YXJnZXQuc2V0KCAtIGVbIDggXSwgLSBlWyA5IF0sIC0gZVsgMTAgXSApLm5vcm1hbGl6ZSgpO1xuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTtcblxuXHRcdHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHR9LFxuXG5cdHVwZGF0ZVdvcmxkTWF0cml4OiBmdW5jdGlvbiAoIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICkge1xuXG5cdFx0T2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZVdvcmxkTWF0cml4LmNhbGwoIHRoaXMsIHVwZGF0ZVBhcmVudHMsIHVwZGF0ZUNoaWxkcmVuICk7XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCB0aGlzLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBQZXJzcGVjdGl2ZUNhbWVyYSggZm92ID0gNTAsIGFzcGVjdCA9IDEsIG5lYXIgPSAwLjEsIGZhciA9IDIwMDAgKSB7XG5cblx0Q2FtZXJhLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGVyc3BlY3RpdmVDYW1lcmEnO1xuXG5cdHRoaXMuZm92ID0gZm92O1xuXHR0aGlzLnpvb20gPSAxO1xuXG5cdHRoaXMubmVhciA9IG5lYXI7XG5cdHRoaXMuZmFyID0gZmFyO1xuXHR0aGlzLmZvY3VzID0gMTA7XG5cblx0dGhpcy5hc3BlY3QgPSBhc3BlY3Q7XG5cdHRoaXMudmlldyA9IG51bGw7XG5cblx0dGhpcy5maWxtR2F1Z2UgPSAzNTtcdC8vIHdpZHRoIG9mIHRoZSBmaWxtIChkZWZhdWx0IGluIG1pbGxpbWV0ZXJzKVxuXHR0aGlzLmZpbG1PZmZzZXQgPSAwO1x0Ly8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdlKVxuXG5cdHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG59XG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIENhbWVyYS5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBQZXJzcGVjdGl2ZUNhbWVyYSxcblxuXHRpc1BlcnNwZWN0aXZlQ2FtZXJhOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7XG5cblx0XHRDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMuZm92ID0gc291cmNlLmZvdjtcblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblxuXHRcdHRoaXMubmVhciA9IHNvdXJjZS5uZWFyO1xuXHRcdHRoaXMuZmFyID0gc291cmNlLmZhcjtcblx0XHR0aGlzLmZvY3VzID0gc291cmNlLmZvY3VzO1xuXG5cdFx0dGhpcy5hc3BlY3QgPSBzb3VyY2UuYXNwZWN0O1xuXHRcdHRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApO1xuXG5cdFx0dGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlO1xuXHRcdHRoaXMuZmlsbU9mZnNldCA9IHNvdXJjZS5maWxtT2Zmc2V0O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyB0aGUgRk9WIGJ5IGZvY2FsIGxlbmd0aCBpbiByZXNwZWN0IHRvIHRoZSBjdXJyZW50IC5maWxtR2F1Z2UuXG5cdCAqXG5cdCAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuXHQgKiBhIDM1bW0gKGZ1bGwgZnJhbWUpIGNhbWVyYS5cblx0ICpcblx0ICogVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuXG5cdCAqL1xuXHRzZXRGb2NhbExlbmd0aDogZnVuY3Rpb24gKCBmb2NhbExlbmd0aCApIHtcblxuXHRcdC8qKiBzZWUge0BsaW5rIGh0dHA6Ly93d3cuYm9iYXRraW5zLmNvbS9waG90b2dyYXBoeS90ZWNobmljYWwvZmllbGRfb2Zfdmlldy5odG1sfSAqL1xuXHRcdGNvbnN0IHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7XG5cblx0XHR0aGlzLmZvdiA9IE1hdGhVdGlscy5SQUQyREVHICogMiAqIE1hdGguYXRhbiggdkV4dGVudFNsb3BlICk7XG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgZm9jYWwgbGVuZ3RoIGZyb20gdGhlIGN1cnJlbnQgLmZvdiBhbmQgLmZpbG1HYXVnZS5cblx0ICovXG5cdGdldEZvY2FsTGVuZ3RoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggTWF0aFV0aWxzLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApO1xuXG5cdFx0cmV0dXJuIDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gdkV4dGVudFNsb3BlO1xuXG5cdH0sXG5cblx0Z2V0RWZmZWN0aXZlRk9WOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gTWF0aFV0aWxzLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKFxuXHRcdFx0TWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbVdpZHRoOiBmdW5jdGlvbiAoKSB7XG5cblx0XHQvLyBmaWxtIG5vdCBjb21wbGV0ZWx5IGNvdmVyZWQgaW4gcG9ydHJhaXQgZm9ybWF0IChhc3BlY3QgPCAxKVxuXHRcdHJldHVybiB0aGlzLmZpbG1HYXVnZSAqIE1hdGgubWluKCB0aGlzLmFzcGVjdCwgMSApO1xuXG5cdH0sXG5cblx0Z2V0RmlsbUhlaWdodDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Ly8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIGxhbmRzY2FwZSBmb3JtYXQgKGFzcGVjdCA+IDEpXG5cdFx0cmV0dXJuIHRoaXMuZmlsbUdhdWdlIC8gTWF0aC5tYXgoIHRoaXMuYXNwZWN0LCAxICk7XG5cblx0fSxcblxuXHQvKipcblx0ICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvclxuXHQgKiBtdWx0aS1tb25pdG9yL211bHRpLW1hY2hpbmUgc2V0dXBzLlxuXHQgKlxuXHQgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZFxuXHQgKiB0aGUgbW9uaXRvcnMgYXJlIGluIGdyaWQgbGlrZSB0aGlzXG5cdCAqXG5cdCAqICAgKy0tLSstLS0rLS0tK1xuXHQgKiAgIHwgQSB8IEIgfCBDIHxcblx0ICogICArLS0tKy0tLSstLS0rXG5cdCAqICAgfCBEIHwgRSB8IEYgfFxuXHQgKiAgICstLS0rLS0tKy0tLStcblx0ICpcblx0ICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpc1xuXHQgKlxuXHQgKiAgIGNvbnN0IHcgPSAxOTIwO1xuXHQgKiAgIGNvbnN0IGggPSAxMDgwO1xuXHQgKiAgIGNvbnN0IGZ1bGxXaWR0aCA9IHcgKiAzO1xuXHQgKiAgIGNvbnN0IGZ1bGxIZWlnaHQgPSBoICogMjtcblx0ICpcblx0ICogICAtLUEtLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMCwgdywgaCApO1xuXHQgKiAgIC0tQi0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7XG5cdCAqICAgLS1DLS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDAsIHcsIGggKTtcblx0ICogICAtLUQtLVxuXHQgKiAgIGNhbWVyYS5zZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHcgKiAwLCBoICogMSwgdywgaCApO1xuXHQgKiAgIC0tRS0tXG5cdCAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7XG5cdCAqICAgLS1GLS1cblx0ICogICBjYW1lcmEuc2V0Vmlld09mZnNldCggZnVsbFdpZHRoLCBmdWxsSGVpZ2h0LCB3ICogMiwgaCAqIDEsIHcsIGggKTtcblx0ICpcblx0ICogICBOb3RlIHRoZXJlIGlzIG5vIHJlYXNvbiBtb25pdG9ycyBoYXZlIHRvIGJlIHRoZSBzYW1lIHNpemUgb3IgaW4gYSBncmlkLlxuXHQgKi9cblx0c2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHR0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHRjbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fSxcblxuXHR1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRjb25zdCBuZWFyID0gdGhpcy5uZWFyO1xuXHRcdGxldCB0b3AgPSBuZWFyICogTWF0aC50YW4oIE1hdGhVdGlscy5ERUcyUkFEICogMC41ICogdGhpcy5mb3YgKSAvIHRoaXMuem9vbTtcblx0XHRsZXQgaGVpZ2h0ID0gMiAqIHRvcDtcblx0XHRsZXQgd2lkdGggPSB0aGlzLmFzcGVjdCAqIGhlaWdodDtcblx0XHRsZXQgbGVmdCA9IC0gMC41ICogd2lkdGg7XG5cdFx0Y29uc3QgdmlldyA9IHRoaXMudmlldztcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICYmIHRoaXMudmlldy5lbmFibGVkICkge1xuXG5cdFx0XHRjb25zdCBmdWxsV2lkdGggPSB2aWV3LmZ1bGxXaWR0aCxcblx0XHRcdFx0ZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDtcblxuXHRcdFx0bGVmdCArPSB2aWV3Lm9mZnNldFggKiB3aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdHRvcCAtPSB2aWV3Lm9mZnNldFkgKiBoZWlnaHQgLyBmdWxsSGVpZ2h0O1xuXHRcdFx0d2lkdGggKj0gdmlldy53aWR0aCAvIGZ1bGxXaWR0aDtcblx0XHRcdGhlaWdodCAqPSB2aWV3LmhlaWdodCAvIGZ1bGxIZWlnaHQ7XG5cblx0XHR9XG5cblx0XHRjb25zdCBza2V3ID0gdGhpcy5maWxtT2Zmc2V0O1xuXHRcdGlmICggc2tldyAhPT0gMCApIGxlZnQgKz0gbmVhciAqIHNrZXcgLyB0aGlzLmdldEZpbG1XaWR0aCgpO1xuXG5cdFx0dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgbGVmdCArIHdpZHRoLCB0b3AsIHRvcCAtIGhlaWdodCwgbmVhciwgdGhpcy5mYXIgKTtcblxuXHRcdHRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICkuaW52ZXJ0KCk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTtcblxuXHRcdGRhdGEub2JqZWN0LmZvdiA9IHRoaXMuZm92O1xuXHRcdGRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207XG5cblx0XHRkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyO1xuXHRcdGRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyO1xuXHRcdGRhdGEub2JqZWN0LmZvY3VzID0gdGhpcy5mb2N1cztcblxuXHRcdGRhdGEub2JqZWN0LmFzcGVjdCA9IHRoaXMuYXNwZWN0O1xuXG5cdFx0aWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSBkYXRhLm9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIHRoaXMudmlldyApO1xuXG5cdFx0ZGF0YS5vYmplY3QuZmlsbUdhdWdlID0gdGhpcy5maWxtR2F1Z2U7XG5cdFx0ZGF0YS5vYmplY3QuZmlsbU9mZnNldCA9IHRoaXMuZmlsbU9mZnNldDtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBmb3YgPSA5MCwgYXNwZWN0ID0gMTtcblxuY2xhc3MgQ3ViZUNhbWVyYSBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbmVhciwgZmFyLCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0N1YmVDYW1lcmEnO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgIT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5DdWJlQ2FtZXJhOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgYW4gaW5zdGFuY2Ugb2YgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0IGFzIHRoaXJkIHBhcmFtZXRlci4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLnJlbmRlclRhcmdldCA9IHJlbmRlclRhcmdldDtcblxuXHRcdGNvbnN0IGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhUFgubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0XHRjYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTtcblx0XHR0aGlzLmFkZCggY2FtZXJhUFggKTtcblxuXHRcdGNvbnN0IGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhTlgubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTtcblx0XHRjYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWCApO1xuXG5cdFx0Y29uc3QgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFQWS5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTtcblx0XHRjYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTtcblx0XHR0aGlzLmFkZCggY2FtZXJhUFkgKTtcblxuXHRcdGNvbnN0IGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y2FtZXJhTlkubGF5ZXJzID0gdGhpcy5sYXllcnM7XG5cdFx0Y2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTtcblx0XHRjYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFOWSApO1xuXG5cdFx0Y29uc3QgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFQWi5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRcdGNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApO1xuXHRcdHRoaXMuYWRkKCBjYW1lcmFQWiApO1xuXG5cdFx0Y29uc3QgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTtcblx0XHRjYW1lcmFOWi5sYXllcnMgPSB0aGlzLmxheWVycztcblx0XHRjYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApO1xuXHRcdGNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7XG5cdFx0dGhpcy5hZGQoIGNhbWVyYU5aICk7XG5cblx0fVxuXG5cdHVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICkge1xuXG5cdFx0aWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHRoaXMudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0O1xuXG5cdFx0Y29uc3QgWyBjYW1lcmFQWCwgY2FtZXJhTlgsIGNhbWVyYVBZLCBjYW1lcmFOWSwgY2FtZXJhUFosIGNhbWVyYU5aIF0gPSB0aGlzLmNoaWxkcmVuO1xuXG5cdFx0Y29uc3QgY3VycmVudFhyRW5hYmxlZCA9IHJlbmRlcmVyLnhyLmVuYWJsZWQ7XG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXG5cdFx0cmVuZGVyZXIueHIuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0cmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBYICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5YICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMiApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMyApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5ZICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNCApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBaICk7XG5cblx0XHRyZW5kZXJUYXJnZXQudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBnZW5lcmF0ZU1pcG1hcHM7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgNSApO1xuXHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aICk7XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcblxuXHRcdHJlbmRlcmVyLnhyLmVuYWJsZWQgPSBjdXJyZW50WHJFbmFibGVkO1xuXG5cdH1cblxufVxuXG5jbGFzcyBDdWJlVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0XHRpbWFnZXMgPSBpbWFnZXMgIT09IHVuZGVmaW5lZCA/IGltYWdlcyA6IFtdO1xuXHRcdG1hcHBpbmcgPSBtYXBwaW5nICE9PSB1bmRlZmluZWQgPyBtYXBwaW5nIDogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nO1xuXHRcdGZvcm1hdCA9IGZvcm1hdCAhPT0gdW5kZWZpbmVkID8gZm9ybWF0IDogUkdCRm9ybWF0O1xuXG5cdFx0c3VwZXIoIGltYWdlcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdFx0Ly8gV2h5IEN1YmVUZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXAgaXMgbmVjZXNzYXJ5OlxuXHRcdC8vXG5cdFx0Ly8gQnkgY29udmVudGlvbiAtLSBsaWtlbHkgYmFzZWQgb24gdGhlIFJlbmRlck1hbiBzcGVjIGZyb20gdGhlIDE5OTAncyAtLSBjdWJlIG1hcHMgYXJlIHNwZWNpZmllZCBieSBXZWJHTCAoYW5kIHRocmVlLmpzKVxuXHRcdC8vIGluIGEgY29vcmRpbmF0ZSBzeXN0ZW0gaW4gd2hpY2ggcG9zaXRpdmUteCBpcyB0byB0aGUgcmlnaHQgd2hlbiBsb29raW5nIHVwIHRoZSBwb3NpdGl2ZS16IGF4aXMgLS0gaW4gb3RoZXIgd29yZHMsXG5cdFx0Ly8gaW4gYSBsZWZ0LWhhbmRlZCBjb29yZGluYXRlIHN5c3RlbS4gQnkgY29udGludWluZyB0aGlzIGNvbnZlbnRpb24sIHByZWV4aXN0aW5nIGN1YmUgbWFwcyBjb250aW51ZWQgdG8gcmVuZGVyIGNvcnJlY3RseS5cblxuXHRcdC8vIHRocmVlLmpzIHVzZXMgYSByaWdodC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW0uIFNvIGVudmlyb25tZW50IG1hcHMgdXNlZCBpbiB0aHJlZS5qcyBhcHBlYXIgdG8gaGF2ZSBweCBhbmQgbnggc3dhcHBlZFxuXHRcdC8vIGFuZCB0aGUgZmxhZyBfbmVlZHNGbGlwRW52TWFwIGNvbnRyb2xzIHRoaXMgY29udmVyc2lvbi4gVGhlIGZsaXAgaXMgbm90IHJlcXVpcmVkIChhbmQgdGh1cyBfbmVlZHNGbGlwRW52TWFwIGlzIHNldCB0byBmYWxzZSlcblx0XHQvLyB3aGVuIHVzaW5nIFdlYkdMQ3ViZVJlbmRlclRhcmdldC50ZXh0dXJlIGFzIGEgY3ViZSB0ZXh0dXJlLlxuXG5cdFx0dGhpcy5fbmVlZHNGbGlwRW52TWFwID0gdHJ1ZTtcblxuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHR9XG5cblx0Z2V0IGltYWdlcygpIHtcblxuXHRcdHJldHVybiB0aGlzLmltYWdlO1xuXG5cdH1cblxuXHRzZXQgaW1hZ2VzKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuaW1hZ2UgPSB2YWx1ZTtcblxuXHR9XG5cbn1cblxuQ3ViZVRleHR1cmUucHJvdG90eXBlLmlzQ3ViZVRleHR1cmUgPSB0cnVlO1xuXG5jbGFzcyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQgZXh0ZW5kcyBXZWJHTFJlbmRlclRhcmdldCB7XG5cblx0Y29uc3RydWN0b3IoIHNpemUsIG9wdGlvbnMsIGR1bW15ICkge1xuXG5cdFx0aWYgKCBOdW1iZXIuaXNJbnRlZ2VyKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQ3ViZVJlbmRlclRhcmdldDogY29uc3RydWN0b3Igc2lnbmF0dXJlIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKScgKTtcblxuXHRcdFx0b3B0aW9ucyA9IGR1bW15O1xuXG5cdFx0fVxuXG5cdFx0c3VwZXIoIHNpemUsIHNpemUsIG9wdGlvbnMgKTtcblxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dGhpcy50ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCB1bmRlZmluZWQsIG9wdGlvbnMubWFwcGluZywgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTtcblxuXHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5nZW5lcmF0ZU1pcG1hcHMgOiBmYWxzZTtcblx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gb3B0aW9ucy5taW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXG5cdFx0dGhpcy50ZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXAgPSBmYWxzZTtcblxuXHR9XG5cblx0ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUoIHJlbmRlcmVyLCB0ZXh0dXJlICkge1xuXG5cdFx0dGhpcy50ZXh0dXJlLnR5cGUgPSB0ZXh0dXJlLnR5cGU7XG5cdFx0dGhpcy50ZXh0dXJlLmZvcm1hdCA9IFJHQkFGb3JtYXQ7IC8vIHNlZSAjMTg4NTlcblx0XHR0aGlzLnRleHR1cmUuZW5jb2RpbmcgPSB0ZXh0dXJlLmVuY29kaW5nO1xuXG5cdFx0dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO1xuXHRcdHRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcblx0XHR0aGlzLnRleHR1cmUubWFnRmlsdGVyID0gdGV4dHVyZS5tYWdGaWx0ZXI7XG5cblx0XHRjb25zdCBzaGFkZXIgPSB7XG5cblx0XHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRcdHRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0fSxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiAvKiBnbHNsICovYFxuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0dmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblxuXHRcdFx0XHRcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApO1xuXG5cdFx0XHRcdFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0XHRcdFx0XHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cblx0XHRcdFx0fVxuXHRcdFx0YCxcblxuXHRcdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXG5cblx0XHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xuXG5cdFx0XHRcdHZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG5cblx0XHRcdFx0I2luY2x1ZGUgPGNvbW1vbj5cblxuXHRcdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHR2ZWMyIHNhbXBsZVVWID0gZXF1aXJlY3RVdiggZGlyZWN0aW9uICk7XG5cblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblxuXHRcdFx0XHR9XG5cdFx0XHRgXG5cdFx0fTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJveEdlb21ldHJ5KCA1LCA1LCA1ICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCgge1xuXG5cdFx0XHRuYW1lOiAnQ3ViZW1hcEZyb21FcXVpcmVjdCcsXG5cblx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBzaGFkZXIudW5pZm9ybXMgKSxcblx0XHRcdHZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlcixcblx0XHRcdGZyYWdtZW50U2hhZGVyOiBzaGFkZXIuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdGJsZW5kaW5nOiBOb0JsZW5kaW5nXG5cblx0XHR9ICk7XG5cblx0XHRtYXRlcmlhbC51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSB0ZXh0dXJlO1xuXG5cdFx0Y29uc3QgbWVzaCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdGNvbnN0IGN1cnJlbnRNaW5GaWx0ZXIgPSB0ZXh0dXJlLm1pbkZpbHRlcjtcblxuXHRcdC8vIEF2b2lkIGJsdXJyZWQgcG9sZXNcblx0XHRpZiAoIHRleHR1cmUubWluRmlsdGVyID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdGNvbnN0IGNhbWVyYSA9IG5ldyBDdWJlQ2FtZXJhKCAxLCAxMCwgdGhpcyApO1xuXHRcdGNhbWVyYS51cGRhdGUoIHJlbmRlcmVyLCBtZXNoICk7XG5cblx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IGN1cnJlbnRNaW5GaWx0ZXI7XG5cblx0XHRtZXNoLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHRtZXNoLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbGVhciggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGhpcywgaSApO1xuXG5cdFx0XHRyZW5kZXJlci5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTtcblxuXHR9XG5cbn1cblxuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCA9IHRydWU7XG5cbmNsYXNzIERhdGFUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7XG5cblx0XHRzdXBlciggbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSB8fCBudWxsLCB3aWR0aDogd2lkdGggfHwgMSwgaGVpZ2h0OiBoZWlnaHQgfHwgMSB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblx0XHR0aGlzLnVucGFja0FsaWdubWVudCA9IDE7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuRGF0YVRleHR1cmUucHJvdG90eXBlLmlzRGF0YVRleHR1cmUgPSB0cnVlO1xuXG5jb25zdCBfc3BoZXJlJDIgPSAvKkBfX1BVUkVfXyovIG5ldyBTcGhlcmUoKTtcbmNvbnN0IF92ZWN0b3IkNyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgRnJ1c3R1bSB7XG5cblx0Y29uc3RydWN0b3IoIHAwID0gbmV3IFBsYW5lKCksIHAxID0gbmV3IFBsYW5lKCksIHAyID0gbmV3IFBsYW5lKCksIHAzID0gbmV3IFBsYW5lKCksIHA0ID0gbmV3IFBsYW5lKCksIHA1ID0gbmV3IFBsYW5lKCkgKSB7XG5cblx0XHR0aGlzLnBsYW5lcyA9IFsgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSBdO1xuXG5cdH1cblxuXHRzZXQoIHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUgKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdHBsYW5lc1sgMCBdLmNvcHkoIHAwICk7XG5cdFx0cGxhbmVzWyAxIF0uY29weSggcDEgKTtcblx0XHRwbGFuZXNbIDIgXS5jb3B5KCBwMiApO1xuXHRcdHBsYW5lc1sgMyBdLmNvcHkoIHAzICk7XG5cdFx0cGxhbmVzWyA0IF0uY29weSggcDQgKTtcblx0XHRwbGFuZXNbIDUgXS5jb3B5KCBwNSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIGZydXN0dW0gKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdHBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggbSApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdGNvbnN0IG1lID0gbS5lbGVtZW50cztcblx0XHRjb25zdCBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdO1xuXHRcdGNvbnN0IG1lNCA9IG1lWyA0IF0sIG1lNSA9IG1lWyA1IF0sIG1lNiA9IG1lWyA2IF0sIG1lNyA9IG1lWyA3IF07XG5cdFx0Y29uc3QgbWU4ID0gbWVbIDggXSwgbWU5ID0gbWVbIDkgXSwgbWUxMCA9IG1lWyAxMCBdLCBtZTExID0gbWVbIDExIF07XG5cdFx0Y29uc3QgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdO1xuXG5cdFx0cGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAxIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUwLCBtZTcgKyBtZTQsIG1lMTEgKyBtZTgsIG1lMTUgKyBtZTEyICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAyIF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUxLCBtZTcgKyBtZTUsIG1lMTEgKyBtZTksIG1lMTUgKyBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7XG5cdFx0cGxhbmVzWyA0IF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUyLCBtZTcgLSBtZTYsIG1lMTEgLSBtZTEwLCBtZTE1IC0gbWUxNCApLm5vcm1hbGl6ZSgpO1xuXHRcdHBsYW5lc1sgNSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMiwgbWU3ICsgbWU2LCBtZTExICsgbWUxMCwgbWUxNSArIG1lMTQgKS5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpbnRlcnNlY3RzT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXHRcdF9zcGhlcmUkMi5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApLmFwcGx5TWF0cml4NCggb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cblx0XHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlJDIgKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0c1Nwcml0ZSggc3ByaXRlICkge1xuXG5cdFx0X3NwaGVyZSQyLmNlbnRlci5zZXQoIDAsIDAsIDAgKTtcblx0XHRfc3BoZXJlJDIucmFkaXVzID0gMC43MDcxMDY3ODExODY1NDc2O1xuXHRcdF9zcGhlcmUkMi5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQyICk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXHRcdGNvbnN0IGNlbnRlciA9IHNwaGVyZS5jZW50ZXI7XG5cdFx0Y29uc3QgbmVnUmFkaXVzID0gLSBzcGhlcmUucmFkaXVzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIGNlbnRlciApO1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkge1xuXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdGNvbnN0IHBsYW5lcyA9IHRoaXMucGxhbmVzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgcGxhbmUgPSBwbGFuZXNbIGkgXTtcblxuXHRcdFx0Ly8gY29ybmVyIGF0IG1heCBkaXN0YW5jZVxuXG5cdFx0XHRfdmVjdG9yJDcueCA9IHBsYW5lLm5vcm1hbC54ID4gMCA/IGJveC5tYXgueCA6IGJveC5taW4ueDtcblx0XHRcdF92ZWN0b3IkNy55ID0gcGxhbmUubm9ybWFsLnkgPiAwID8gYm94Lm1heC55IDogYm94Lm1pbi55O1xuXHRcdFx0X3ZlY3RvciQ3LnogPSBwbGFuZS5ub3JtYWwueiA+IDAgPyBib3gubWF4LnogOiBib3gubWluLno7XG5cblx0XHRcdGlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBfdmVjdG9yJDcgKSA8IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblxuXHR9XG5cblx0Y29udGFpbnNQb2ludCggcG9pbnQgKSB7XG5cblx0XHRjb25zdCBwbGFuZXMgPSB0aGlzLnBsYW5lcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIDwgMCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xBbmltYXRpb24oKSB7XG5cblx0bGV0IGNvbnRleHQgPSBudWxsO1xuXHRsZXQgaXNBbmltYXRpbmcgPSBmYWxzZTtcblx0bGV0IGFuaW1hdGlvbkxvb3AgPSBudWxsO1xuXHRsZXQgcmVxdWVzdElkID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdGFuaW1hdGlvbkxvb3AoIHRpbWUsIGZyYW1lICk7XG5cblx0XHRyZXF1ZXN0SWQgPSBjb250ZXh0LnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0c3RhcnQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0aWYgKCBpc0FuaW1hdGluZyA9PT0gdHJ1ZSApIHJldHVybjtcblx0XHRcdGlmICggYW5pbWF0aW9uTG9vcCA9PT0gbnVsbCApIHJldHVybjtcblxuXHRcdFx0cmVxdWVzdElkID0gY29udGV4dC5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHRcdFx0aXNBbmltYXRpbmcgPSB0cnVlO1xuXG5cdFx0fSxcblxuXHRcdHN0b3A6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29udGV4dC5jYW5jZWxBbmltYXRpb25GcmFtZSggcmVxdWVzdElkICk7XG5cblx0XHRcdGlzQW5pbWF0aW5nID0gZmFsc2U7XG5cblx0XHR9LFxuXG5cdFx0c2V0QW5pbWF0aW9uTG9vcDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHtcblxuXHRcdFx0YW5pbWF0aW9uTG9vcCA9IGNhbGxiYWNrO1xuXG5cdFx0fSxcblxuXHRcdHNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnRleHQgPSB2YWx1ZTtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQXR0cmlidXRlcyggZ2wsIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHRjb25zdCBidWZmZXJzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdGNvbnN0IHVzYWdlID0gYXR0cmlidXRlLnVzYWdlO1xuXG5cdFx0Y29uc3QgYnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRnbC5iaW5kQnVmZmVyKCBidWZmZXJUeXBlLCBidWZmZXIgKTtcblx0XHRnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgdXNhZ2UgKTtcblxuXHRcdGF0dHJpYnV0ZS5vblVwbG9hZENhbGxiYWNrKCk7XG5cblx0XHRsZXQgdHlwZSA9IDUxMjY7XG5cblx0XHRpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyNjtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgRmxvYXQ2NEFycmF5ICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LicgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7XG5cblx0XHRcdGlmICggYXR0cmlidXRlLmlzRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0dHlwZSA9IDUxMzE7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMQXR0cmlidXRlczogVXNhZ2Ugb2YgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0eXBlID0gNTEyMztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQxNkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyMjtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDMyQXJyYXkgKSB7XG5cblx0XHRcdHR5cGUgPSA1MTI1O1xuXG5cdFx0fSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyNDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgSW50OEFycmF5ICkge1xuXG5cdFx0XHR0eXBlID0gNTEyMDtcblxuXHRcdH0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDhBcnJheSApIHtcblxuXHRcdFx0dHlwZSA9IDUxMjE7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0YnVmZmVyOiBidWZmZXIsXG5cdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0Ynl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCxcblx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHtcblxuXHRcdGNvbnN0IGFycmF5ID0gYXR0cmlidXRlLmFycmF5O1xuXHRcdGNvbnN0IHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlO1xuXG5cdFx0Z2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7XG5cblx0XHRpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7XG5cblx0XHRcdC8vIE5vdCB1c2luZyB1cGRhdGUgcmFuZ2VzXG5cblx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIDAsIGFycmF5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdGdsLmJ1ZmZlclN1YkRhdGEoIGJ1ZmZlclR5cGUsIHVwZGF0ZVJhbmdlLm9mZnNldCAqIGFycmF5LkJZVEVTX1BFUl9FTEVNRU5ULFxuXHRcdFx0XHRcdGFycmF5LCB1cGRhdGVSYW5nZS5vZmZzZXQsIHVwZGF0ZVJhbmdlLmNvdW50ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuYnVmZmVyU3ViRGF0YSggYnVmZmVyVHlwZSwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICogYXJyYXkuQllURVNfUEVSX0VMRU1FTlQsXG5cdFx0XHRcdFx0YXJyYXkuc3ViYXJyYXkoIHVwZGF0ZVJhbmdlLm9mZnNldCwgdXBkYXRlUmFuZ2Uub2Zmc2V0ICsgdXBkYXRlUmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVwZGF0ZVJhbmdlLmNvdW50ID0gLSAxOyAvLyByZXNldCByYW5nZVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIGdldCggYXR0cmlidXRlICkge1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlcnMuZ2V0KCBhdHRyaWJ1dGUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVtb3ZlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhICkge1xuXG5cdFx0XHRnbC5kZWxldGVCdWZmZXIoIGRhdGEuYnVmZmVyICk7XG5cblx0XHRcdGJ1ZmZlcnMuZGVsZXRlKCBhdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSB7XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0dMQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zdCBjYWNoZWQgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7XG5cblx0XHRcdGlmICggISBjYWNoZWQgfHwgY2FjaGVkLnZlcnNpb24gPCBhdHRyaWJ1dGUudmVyc2lvbiApIHtcblxuXHRcdFx0XHRidWZmZXJzLnNldCggYXR0cmlidXRlLCB7XG5cdFx0XHRcdFx0YnVmZmVyOiBhdHRyaWJ1dGUuYnVmZmVyLFxuXHRcdFx0XHRcdHR5cGU6IGF0dHJpYnV0ZS50eXBlLFxuXHRcdFx0XHRcdGJ5dGVzUGVyRWxlbWVudDogYXR0cmlidXRlLmVsZW1lbnRTaXplLFxuXHRcdFx0XHRcdHZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uXG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7XG5cblx0XHRjb25zdCBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApO1xuXG5cdFx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJ1ZmZlcnMuc2V0KCBhdHRyaWJ1dGUsIGNyZWF0ZUJ1ZmZlciggYXR0cmlidXRlLCBidWZmZXJUeXBlICkgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGRhdGEudmVyc2lvbiA8IGF0dHJpYnV0ZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXIoIGRhdGEuYnVmZmVyLCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKTtcblxuXHRcdFx0ZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZVxuXG5cdH07XG5cbn1cblxuY2xhc3MgUGxhbmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3Rvciggd2lkdGggPSAxLCBoZWlnaHQgPSAxLCB3aWR0aFNlZ21lbnRzID0gMSwgaGVpZ2h0U2VnbWVudHMgPSAxICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGhlaWdodCxcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHNcblx0XHR9O1xuXG5cdFx0Y29uc3Qgd2lkdGhfaGFsZiA9IHdpZHRoIC8gMjtcblx0XHRjb25zdCBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7XG5cblx0XHRjb25zdCBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKTtcblx0XHRjb25zdCBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICk7XG5cblx0XHRjb25zdCBncmlkWDEgPSBncmlkWCArIDE7XG5cdFx0Y29uc3QgZ3JpZFkxID0gZ3JpZFkgKyAxO1xuXG5cdFx0Y29uc3Qgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7XG5cdFx0Y29uc3Qgc2VnbWVudF9oZWlnaHQgPSBoZWlnaHQgLyBncmlkWTtcblxuXHRcdC8vXG5cblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgdXZzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGdyaWRZMTsgaXkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHkgPSBpeSAqIHNlZ21lbnRfaGVpZ2h0IC0gaGVpZ2h0X2hhbGY7XG5cblx0XHRcdGZvciAoIGxldCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCB4ID0gaXggKiBzZWdtZW50X3dpZHRoIC0gd2lkdGhfaGFsZjtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAtIHksIDAgKTtcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblxuXHRcdFx0XHR1dnMucHVzaCggaXggLyBncmlkWCApO1xuXHRcdFx0XHR1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gaXggKyBncmlkWDEgKiBpeTtcblx0XHRcdFx0Y29uc3QgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTtcblx0XHRcdFx0Y29uc3QgYyA9ICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApO1xuXHRcdFx0XHRjb25zdCBkID0gKCBpeCArIDEgKSArIGdyaWRYMSAqIGl5O1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxudmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQUxQSEFNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcXG4jZW5kaWZcIjtcblxudmFyIGFscGhhdGVzdF9mcmFnbWVudCA9IFwiI2lmZGVmIEFMUEhBVEVTVFxcblxcdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xcbiNlbmRpZlwiO1xuXG52YXIgYW9tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICo9IGFtYmllbnRPY2NsdXNpb247XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSAmJiBkZWZpbmVkKCBTVEFOREFSRCApXFxuXFx0XFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGdlb21ldHJ5LnZpZXdEaXIgKSApO1xcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKj0gY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBkb3ROViwgYW1iaWVudE9jY2x1c2lvbiwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQU9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGFvTWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgYmVnaW5fdmVydGV4ID0gXCJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTtcIjtcblxudmFyIGJlZ2lubm9ybWFsX3ZlcnRleCA9IFwidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcXG4jaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xcbiNlbmRpZlwiO1xuXG52YXIgYnNkZnMgPSBcInZlYzIgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xcblxcdGNvbnN0IHZlYzQgYzEgPSB2ZWM0KCAxLCAwLjA0MjUsIDEuMDQsIC0gMC4wNCApO1xcblxcdHZlYzQgciA9IHJvdWdobmVzcyAqIGMwICsgYzE7XFxuXFx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XFxuXFx0cmV0dXJuIHZlYzIoIC0xLjA0LCAxLjA0ICkgKiBhMDA0ICsgci56dztcXG59XFxuZmxvYXQgcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggY29uc3QgaW4gZmxvYXQgbGlnaHREaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgY3V0b2ZmRGlzdGFuY2UsIGNvbnN0IGluIGZsb2F0IGRlY2F5RXhwb25lbnQgKSB7XFxuI2lmIGRlZmluZWQgKCBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIClcXG5cXHRmbG9hdCBkaXN0YW5jZUZhbGxvZmYgPSAxLjAgLyBtYXgoIHBvdyggbGlnaHREaXN0YW5jZSwgZGVjYXlFeHBvbmVudCApLCAwLjAxICk7XFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xcblxcdFxcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xcblxcdH1cXG5cXHRyZXR1cm4gZGlzdGFuY2VGYWxsb2ZmO1xcbiNlbHNlXFxuXFx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICYmIGRlY2F5RXhwb25lbnQgPiAwLjAgKSB7XFxuXFx0XFx0cmV0dXJuIHBvdyggc2F0dXJhdGUoIC1saWdodERpc3RhbmNlIC8gY3V0b2ZmRGlzdGFuY2UgKyAxLjAgKSwgZGVjYXlFeHBvbmVudCApO1xcblxcdH1cXG5cXHRyZXR1cm4gMS4wO1xcbiNlbmRpZlxcbn1cXG52ZWMzIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBjb25zdCBpbiB2ZWMzIGRpZmZ1c2VDb2xvciApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGRpZmZ1c2VDb2xvcjtcXG59XFxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XFxuXFx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3RMSCAtIDYuOTgzMTYgKSAqIGRvdExIICk7XFxuXFx0cmV0dXJuICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogZnJlc25lbCArIHNwZWN1bGFyQ29sb3I7XFxufVxcbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcXG5cXHRmbG9hdCBmcmVzbmVsID0gZXhwMiggKCAtNS41NTQ3MyAqIGRvdE5WIC0gNi45ODMxNiApICogZG90TlYgKTtcXG5cXHR2ZWMzIEZyID0gbWF4KCB2ZWMzKCAxLjAgLSByb3VnaG5lc3MgKSwgRjAgKSAtIEYwO1xcblxcdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcXG59XFxuZmxvYXQgR19HR1hfU21pdGgoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcXG5cXHRmbG9hdCBndiA9IGRvdE5WICsgc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROViApICk7XFxuXFx0cmV0dXJuIDEuMCAvICggZ2wgKiBndiApO1xcbn1cXG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XFxuXFx0ZmxvYXQgYTIgPSBwb3cyKCBhbHBoYSApO1xcblxcdGZsb2F0IGd2ID0gZG90TkwgKiBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5WICkgKTtcXG5cXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XFxuXFx0cmV0dXJuIDAuNSAvIG1heCggZ3YgKyBnbCwgRVBTSUxPTiApO1xcbn1cXG5mbG9hdCBEX0dHWCggY29uc3QgaW4gZmxvYXQgYWxwaGEsIGNvbnN0IGluIGZsb2F0IGRvdE5IICkge1xcblxcdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcXG5cXHRmbG9hdCBkZW5vbSA9IHBvdzIoIGRvdE5IICkgKiAoIGEyIC0gMS4wICkgKyAxLjA7XFxuXFx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiBhMiAvIHBvdzIoIGRlbm9tICk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgYWxwaGEgPSBwb3cyKCByb3VnaG5lc3MgKTtcXG5cXHR2ZWMzIGhhbGZEaXIgPSBub3JtYWxpemUoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uICsgdmlld0RpciApO1xcblxcdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xcblxcdGZsb2F0IGRvdE5IID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBoYWxmRGlyICkgKTtcXG5cXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcXG5cXHR2ZWMzIEYgPSBGX1NjaGxpY2soIHNwZWN1bGFyQ29sb3IsIGRvdExIICk7XFxuXFx0ZmxvYXQgRyA9IEdfR0dYX1NtaXRoQ29ycmVsYXRlZCggYWxwaGEsIGRvdE5MLCBkb3ROViApO1xcblxcdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XFxuXFx0cmV0dXJuIEYgKiAoIEcgKiBEICk7XFxufVxcbnZlYzIgTFRDX1V2KCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdGNvbnN0IGZsb2F0IExVVF9TSVpFID0gNjQuMDtcXG5cXHRjb25zdCBmbG9hdCBMVVRfU0NBTEUgPSAoIExVVF9TSVpFIC0gMS4wICkgLyBMVVRfU0laRTtcXG5cXHRjb25zdCBmbG9hdCBMVVRfQklBUyA9IDAuNSAvIExVVF9TSVpFO1xcblxcdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggTiwgViApICk7XFxuXFx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xcblxcdHV2ID0gdXYgKiBMVVRfU0NBTEUgKyBMVVRfQklBUztcXG5cXHRyZXR1cm4gdXY7XFxufVxcbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xcblxcdGZsb2F0IGwgPSBsZW5ndGgoIGYgKTtcXG5cXHRyZXR1cm4gbWF4KCAoIGwgKiBsICsgZi56ICkgLyAoIGwgKyAxLjAgKSwgMC4wICk7XFxufVxcbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xcblxcdGZsb2F0IHggPSBkb3QoIHYxLCB2MiApO1xcblxcdGZsb2F0IHkgPSBhYnMoIHggKTtcXG5cXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xcblxcdGZsb2F0IGIgPSAzLjQxNzU5NDAgKyAoIDQuMTYxNjcyNCArIHkgKSAqIHk7XFxuXFx0ZmxvYXQgdiA9IGEgLyBiO1xcblxcdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcXG5cXHRyZXR1cm4gY3Jvc3MoIHYxLCB2MiApICogdGhldGFfc2ludGhldGE7XFxufVxcbnZlYzMgTFRDX0V2YWx1YXRlKCBjb25zdCBpbiB2ZWMzIE4sIGNvbnN0IGluIHZlYzMgViwgY29uc3QgaW4gdmVjMyBQLCBjb25zdCBpbiBtYXQzIG1JbnYsIGNvbnN0IGluIHZlYzMgcmVjdENvb3Jkc1sgNCBdICkge1xcblxcdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XFxuXFx0dmVjMyB2MiA9IHJlY3RDb29yZHNbIDMgXSAtIHJlY3RDb29yZHNbIDAgXTtcXG5cXHR2ZWMzIGxpZ2h0Tm9ybWFsID0gY3Jvc3MoIHYxLCB2MiApO1xcblxcdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBUMSwgVDI7XFxuXFx0VDEgPSBub3JtYWxpemUoIFYgLSBOICogZG90KCBWLCBOICkgKTtcXG5cXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XFxuXFx0bWF0MyBtYXQgPSBtSW52ICogdHJhbnNwb3NlTWF0MyggbWF0MyggVDEsIFQyLCBOICkgKTtcXG5cXHR2ZWMzIGNvb3Jkc1sgNCBdO1xcblxcdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBtYXQgKiAoIHJlY3RDb29yZHNbIDEgXSAtIFAgKTtcXG5cXHRjb29yZHNbIDIgXSA9IG1hdCAqICggcmVjdENvb3Jkc1sgMiBdIC0gUCApO1xcblxcdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XFxuXFx0Y29vcmRzWyAwIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMCBdICk7XFxuXFx0Y29vcmRzWyAxIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMSBdICk7XFxuXFx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XFxuXFx0Y29vcmRzWyAzIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjMyB2ZWN0b3JGb3JtRmFjdG9yID0gdmVjMyggMC4wICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xcblxcdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDEgXSwgY29vcmRzWyAyIF0gKTtcXG5cXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAyIF0sIGNvb3Jkc1sgMyBdICk7XFxuXFx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xcblxcdGZsb2F0IHJlc3VsdCA9IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggdmVjdG9yRm9ybUZhY3RvciApO1xcblxcdHJldHVybiB2ZWMzKCByZXN1bHQgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XFxuXFx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIHZpZXdEaXIgKSApO1xcblxcdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xcbn1cXG52b2lkIEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgaW5vdXQgdmVjMyBzaW5nbGVTY2F0dGVyLCBpbm91dCB2ZWMzIG11bHRpU2NhdHRlciApIHtcXG5cXHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHZlYzIgYnJkZiA9IGludGVncmF0ZVNwZWN1bGFyQlJERiggZG90TlYsIHJvdWdobmVzcyApO1xcblxcdHZlYzMgRnNzRXNzID0gRiAqIGJyZGYueCArIGJyZGYueTtcXG5cXHRmbG9hdCBFc3MgPSBicmRmLnggKyBicmRmLnk7XFxuXFx0ZmxvYXQgRW1zID0gMS4wIC0gRXNzO1xcblxcdHZlYzMgRmF2ZyA9IHNwZWN1bGFyQ29sb3IgKyAoIDEuMCAtIHNwZWN1bGFyQ29sb3IgKSAqIDAuMDQ3NjE5O1xcdHZlYzMgRm1zID0gRnNzRXNzICogRmF2ZyAvICggMS4wIC0gRW1zICogRmF2ZyApO1xcblxcdHNpbmdsZVNjYXR0ZXIgKz0gRnNzRXNzO1xcblxcdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XFxufVxcbmZsb2F0IEdfQmxpbm5QaG9uZ19JbXBsaWNpdCggKSB7XFxuXFx0cmV0dXJuIDAuMjU7XFxufVxcbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcXG5cXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqICggc2hpbmluZXNzICogMC41ICsgMS4wICkgKiBwb3coIGRvdE5ILCBzaGluaW5lc3MgKTtcXG59XFxudmVjMyBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCBzaGluaW5lc3MgKSB7XFxuXFx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcXG5cXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGFsZkRpciApICk7XFxuXFx0ZmxvYXQgZG90TEggPSBzYXR1cmF0ZSggZG90KCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiwgaGFsZkRpciApICk7XFxuXFx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xcblxcdGZsb2F0IEcgPSBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICk7XFxuXFx0ZmxvYXQgRCA9IERfQmxpbm5QaG9uZyggc2hpbmluZXNzLCBkb3ROSCApO1xcblxcdHJldHVybiBGICogKCBHICogRCApO1xcbn1cXG5mbG9hdCBHR1hSb3VnaG5lc3NUb0JsaW5uRXhwb25lbnQoIGNvbnN0IGluIGZsb2F0IGdneFJvdWdobmVzcyApIHtcXG5cXHRyZXR1cm4gKCAyLjAgLyBwb3cyKCBnZ3hSb3VnaG5lc3MgKyAwLjAwMDEgKSAtIDIuMCApO1xcbn1cXG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XFxuXFx0cmV0dXJuIHNxcnQoIDIuMCAvICggYmxpbm5FeHBvbmVudCArIDIuMCApICk7XFxufVxcbiNpZiBkZWZpbmVkKCBVU0VfU0hFRU4gKVxcbmZsb2F0IERfQ2hhcmxpZShmbG9hdCByb3VnaG5lc3MsIGZsb2F0IE5vSCkge1xcblxcdGZsb2F0IGludkFscGhhID0gMS4wIC8gcm91Z2huZXNzO1xcblxcdGZsb2F0IGNvczJoID0gTm9IICogTm9IO1xcblxcdGZsb2F0IHNpbjJoID0gbWF4KDEuMCAtIGNvczJoLCAwLjAwNzgxMjUpO1xcdHJldHVybiAoMi4wICsgaW52QWxwaGEpICogcG93KHNpbjJoLCBpbnZBbHBoYSAqIDAuNSkgLyAoMi4wICogUEkpO1xcbn1cXG5mbG9hdCBWX05ldWJlbHQoZmxvYXQgTm9WLCBmbG9hdCBOb0wpIHtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XFxufVxcbnZlYzMgQlJERl9TcGVjdWxhcl9TaGVlbiggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiB2ZWMzIEwsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIHZlYzMgc3BlY3VsYXJDb2xvciApIHtcXG5cXHR2ZWMzIE4gPSBnZW9tZXRyeS5ub3JtYWw7XFxuXFx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0RpcjtcXG5cXHR2ZWMzIEggPSBub3JtYWxpemUoIFYgKyBMICk7XFxuXFx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBOLCBIICkgKTtcXG5cXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xcbn1cXG4jZW5kaWZcIjtcblxudmFyIGJ1bXBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9CVU1QTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcXG5cXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcXG5cXHR2ZWMyIGRIZHh5X2Z3ZCgpIHtcXG5cXHRcXHR2ZWMyIGRTVGR4ID0gZEZkeCggdlV2ICk7XFxuXFx0XFx0dmVjMiBkU1RkeSA9IGRGZHkoIHZVdiApO1xcblxcdFxcdGZsb2F0IEhsbCA9IGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICkueDtcXG5cXHRcXHRmbG9hdCBkQnggPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR4ICkueCAtIEhsbDtcXG5cXHRcXHRmbG9hdCBkQnkgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiArIGRTVGR5ICkueCAtIEhsbDtcXG5cXHRcXHRyZXR1cm4gdmVjMiggZEJ4LCBkQnkgKTtcXG5cXHR9XFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSwgZmxvYXQgZmFjZURpcmVjdGlvbiApIHtcXG5cXHRcXHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XFxuXFx0XFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xcblxcdFxcdHZlYzMgdk4gPSBzdXJmX25vcm07XFxuXFx0XFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xcblxcdFxcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcXG5cXHRcXHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApICogZmFjZURpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHZHcmFkID0gc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2ZWM0IHBsYW5lO1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBVTklPTl9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XFxuXFx0XFx0cGxhbmUgPSBjbGlwcGluZ1BsYW5lc1sgaSBdO1xcblxcdFxcdGlmICggZG90KCB2Q2xpcFBvc2l0aW9uLCBwbGFuZS54eXogKSA+IHBsYW5lLncgKSBkaXNjYXJkO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNpZiBVTklPTl9DTElQUElOR19QTEFORVMgPCBOVU1fQ0xJUFBJTkdfUExBTkVTXFxuXFx0XFx0Ym9vbCBjbGlwcGVkID0gdHJ1ZTtcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0XFx0Zm9yICggaW50IGkgPSBVTklPTl9DTElQUElOR19QTEFORVM7IGkgPCBOVU1fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xcblxcdFxcdFxcdHBsYW5lID0gY2xpcHBpbmdQbGFuZXNbIGkgXTtcXG5cXHRcXHRcXHRjbGlwcGVkID0gKCBkb3QoIHZDbGlwUG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XFxuXFx0XFx0fVxcblxcdFxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0XFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2YXJ5aW5nIHZlYzMgdkNsaXBQb3NpdGlvbjtcXG5cXHR1bmlmb3JtIHZlYzQgY2xpcHBpbmdQbGFuZXNbIE5VTV9DTElQUElOR19QTEFORVMgXTtcXG4jZW5kaWZcIjtcblxudmFyIGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleCA9IFwiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXFxuXFx0dmFyeWluZyB2ZWMzIHZDbGlwUG9zaXRpb247XFxuI2VuZGlmXCI7XG5cbnZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gXCIjaWYgTlVNX0NMSVBQSU5HX1BMQU5FUyA+IDBcXG5cXHR2Q2xpcFBvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHRkaWZmdXNlQ29sb3IgKj0gdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXFxuXFx0ZGlmZnVzZUNvbG9yLnJnYiAqPSB2Q29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBjb2xvcl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApXFxuXFx0dmFyeWluZyB2ZWMzIHZDb2xvcjtcXG4jZW5kaWZcIjtcblxudmFyIGNvbG9yX3BhcnNfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2YXJ5aW5nIHZlYzQgdkNvbG9yO1xcbiNlbGlmIGRlZmluZWQoIFVTRV9DT0xPUiApIHx8IGRlZmluZWQoIFVTRV9JTlNUQU5DSU5HX0NPTE9SIClcXG5cXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xcbiNlbmRpZlwiO1xuXG52YXIgY29sb3JfdmVydGV4ID0gXCIjaWYgZGVmaW5lZCggVVNFX0NPTE9SX0FMUEhBIClcXG5cXHR2Q29sb3IgPSB2ZWM0KCAxLjAgKTtcXG4jZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKSB8fCBkZWZpbmVkKCBVU0VfSU5TVEFOQ0lOR19DT0xPUiApXFxuXFx0dkNvbG9yID0gdmVjMyggMS4wICk7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9DT0xPUlxcblxcdHZDb2xvciAqPSBjb2xvcjtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1JcXG5cXHR2Q29sb3IueHl6ICo9IGluc3RhbmNlQ29sb3IueHl6O1xcbiNlbmRpZlwiO1xuXG52YXIgY29tbW9uID0gXCIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkzXFxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxNzk1ODZcXG4jZGVmaW5lIFBJX0hBTEYgMS41NzA3OTYzMjY3OTQ4OTY2XFxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MTgzNzkwN1xcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NDMwOTE4OTUzNVxcbiNkZWZpbmUgRVBTSUxPTiAxZS02XFxuI2lmbmRlZiBzYXR1cmF0ZVxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG4jZGVmaW5lIHdoaXRlQ29tcGxlbWVudChhKSAoIDEuMCAtIHNhdHVyYXRlKCBhICkgKVxcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cXG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cXG5mbG9hdCBwb3c0KCBjb25zdCBpbiBmbG9hdCB4ICkgeyBmbG9hdCB4MiA9IHgqeDsgcmV0dXJuIHgyKngyOyB9XFxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cXG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xcblxcdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1MztcXG5cXHRoaWdocCBmbG9hdCBkdCA9IGRvdCggdXYueHksIHZlYzIoIGEsYiApICksIHNuID0gbW9kKCBkdCwgUEkgKTtcXG5cXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xcbn1cXG4jaWZkZWYgSElHSF9QUkVDSVNJT05cXG5cXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7IHJldHVybiBsZW5ndGgoIHYgKTsgfVxcbiNlbHNlXFxuXFx0ZmxvYXQgbWF4MyggdmVjMyB2ICkgeyByZXR1cm4gbWF4KCBtYXgoIHYueCwgdi55ICksIHYueiApOyB9XFxuXFx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xcblxcdFxcdGZsb2F0IG1heENvbXBvbmVudCA9IG1heDMoIGFicyggdiApICk7XFxuXFx0XFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xcblxcdH1cXG4jZW5kaWZcXG5zdHJ1Y3QgSW5jaWRlbnRMaWdodCB7XFxuXFx0dmVjMyBjb2xvcjtcXG5cXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRib29sIHZpc2libGU7XFxufTtcXG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xcblxcdHZlYzMgZGlyZWN0RGlmZnVzZTtcXG5cXHR2ZWMzIGRpcmVjdFNwZWN1bGFyO1xcblxcdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xcblxcdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcXG59O1xcbnN0cnVjdCBHZW9tZXRyaWNDb250ZXh0IHtcXG5cXHR2ZWMzIHBvc2l0aW9uO1xcblxcdHZlYzMgbm9ybWFsO1xcblxcdHZlYzMgdmlld0RpcjtcXG4jaWZkZWYgQ0xFQVJDT0FUXFxuXFx0dmVjMyBjbGVhcmNvYXROb3JtYWw7XFxuI2VuZGlmXFxufTtcXG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xcblxcdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xcbn1cXG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcXG5cXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIGRpciwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcXG59XFxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcXG5cXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XFxuXFx0cmV0dXJuIC0gZGlzdGFuY2UgKiBwbGFuZU5vcm1hbCArIHBvaW50O1xcbn1cXG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcXG59XFxudmVjMyBsaW5lUGxhbmVJbnRlcnNlY3QoIGluIHZlYzMgcG9pbnRPbkxpbmUsIGluIHZlYzMgbGluZURpcmVjdGlvbiwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XFxuXFx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xcbn1cXG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcXG5cXHRtYXQzIHRtcDtcXG5cXHR0bXBbIDAgXSA9IHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcXG5cXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcXG5cXHR0bXBbIDIgXSA9IHZlYzMoIG1bIDAgXS56LCBtWyAxIF0ueiwgbVsgMiBdLnogKTtcXG5cXHRyZXR1cm4gdG1wO1xcbn1cXG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xcblxcdHZlYzMgd2VpZ2h0cyA9IHZlYzMoIDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgKTtcXG5cXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcXG59XFxuYm9vbCBpc1BlcnNwZWN0aXZlTWF0cml4KCBtYXQ0IG0gKSB7XFxuXFx0cmV0dXJuIG1bIDIgXVsgMyBdID09IC0gMS4wO1xcbn1cXG52ZWMyIGVxdWlyZWN0VXYoIGluIHZlYzMgZGlyICkge1xcblxcdGZsb2F0IHUgPSBhdGFuKCBkaXIueiwgZGlyLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xcblxcdGZsb2F0IHYgPSBhc2luKCBjbGFtcCggZGlyLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcXG5cXHRyZXR1cm4gdmVjMiggdSwgdiApO1xcbn1cIjtcblxudmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9IFwiI2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVfVVZcXG5cXHQjZGVmaW5lIGN1YmVVVl9tYXhNaXBMZXZlbCA4LjBcXG5cXHQjZGVmaW5lIGN1YmVVVl9taW5NaXBMZXZlbCA0LjBcXG5cXHQjZGVmaW5lIGN1YmVVVl9tYXhUaWxlU2l6ZSAyNTYuMFxcblxcdCNkZWZpbmUgY3ViZVVWX21pblRpbGVTaXplIDE2LjBcXG5cXHRmbG9hdCBnZXRGYWNlKCB2ZWMzIGRpcmVjdGlvbiApIHtcXG5cXHRcXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyggZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgZmFjZSA9IC0gMS4wO1xcblxcdFxcdGlmICggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcXG5cXHRcXHRcXHRpZiAoIGFic0RpcmVjdGlvbi54ID4gYWJzRGlyZWN0aW9uLnkgKVxcblxcdFxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAuMCA6IDMuMDtcXG5cXHRcXHRcXHRlbHNlXFxuXFx0XFx0XFx0XFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMS4wIDogNC4wO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0aWYgKCBhYnNEaXJlY3Rpb24ueiA+IGFic0RpcmVjdGlvbi55IClcXG5cXHRcXHRcXHRcXHRmYWNlID0gZGlyZWN0aW9uLnogPiAwLjAgPyAyLjAgOiA1LjA7XFxuXFx0XFx0XFx0ZWxzZVxcblxcdFxcdFxcdFxcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEuMCA6IDQuMDtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIGZhY2U7XFxuXFx0fVxcblxcdHZlYzIgZ2V0VVYoIHZlYzMgZGlyZWN0aW9uLCBmbG9hdCBmYWNlICkge1xcblxcdFxcdHZlYzIgdXY7XFxuXFx0XFx0aWYgKCBmYWNlID09IDAuMCApIHtcXG5cXHRcXHRcXHR1diA9IHZlYzIoIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSApIC8gYWJzKCBkaXJlY3Rpb24ueCApO1xcblxcdFxcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMS4wICkge1xcblxcdFxcdFxcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgLSBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xcblxcdFxcdH0gZWxzZSBpZiAoIGZhY2UgPT0gMi4wICkge1xcblxcdFxcdFxcdHV2ID0gdmVjMiggLSBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcXG5cXHRcXHR9IGVsc2UgaWYgKCBmYWNlID09IDMuMCApIHtcXG5cXHRcXHRcXHR1diA9IHZlYzIoIC0gZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55ICkgLyBhYnMoIGRpcmVjdGlvbi54ICk7XFxuXFx0XFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XFxuXFx0XFx0XFx0dXYgPSB2ZWMyKCAtIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiApIC8gYWJzKCBkaXJlY3Rpb24ueSApO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0dXYgPSB2ZWMyKCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkgKSAvIGFicyggZGlyZWN0aW9uLnogKTtcXG5cXHRcXHR9XFxuXFx0XFx0cmV0dXJuIDAuNSAqICggdXYgKyAxLjAgKTtcXG5cXHR9XFxuXFx0dmVjMyBiaWxpbmVhckN1YmVVViggc2FtcGxlcjJEIGVudk1hcCwgdmVjMyBkaXJlY3Rpb24sIGZsb2F0IG1pcEludCApIHtcXG5cXHRcXHRmbG9hdCBmYWNlID0gZ2V0RmFjZSggZGlyZWN0aW9uICk7XFxuXFx0XFx0ZmxvYXQgZmlsdGVySW50ID0gbWF4KCBjdWJlVVZfbWluTWlwTGV2ZWwgLSBtaXBJbnQsIDAuMCApO1xcblxcdFxcdG1pcEludCA9IG1heCggbWlwSW50LCBjdWJlVVZfbWluTWlwTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBmYWNlU2l6ZSA9IGV4cDIoIG1pcEludCApO1xcblxcdFxcdGZsb2F0IHRleGVsU2l6ZSA9IDEuMCAvICggMy4wICogY3ViZVVWX21heFRpbGVTaXplICk7XFxuXFx0XFx0dmVjMiB1diA9IGdldFVWKCBkaXJlY3Rpb24sIGZhY2UgKSAqICggZmFjZVNpemUgLSAxLjAgKTtcXG5cXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKTtcXG5cXHRcXHR1diArPSAwLjUgLSBmO1xcblxcdFxcdGlmICggZmFjZSA+IDIuMCApIHtcXG5cXHRcXHRcXHR1di55ICs9IGZhY2VTaXplO1xcblxcdFxcdFxcdGZhY2UgLT0gMy4wO1xcblxcdFxcdH1cXG5cXHRcXHR1di54ICs9IGZhY2UgKiBmYWNlU2l6ZTtcXG5cXHRcXHRpZiAoIG1pcEludCA8IGN1YmVVVl9tYXhNaXBMZXZlbCApIHtcXG5cXHRcXHRcXHR1di55ICs9IDIuMCAqIGN1YmVVVl9tYXhUaWxlU2l6ZTtcXG5cXHRcXHR9XFxuXFx0XFx0dXYueSArPSBmaWx0ZXJJbnQgKiAyLjAgKiBjdWJlVVZfbWluVGlsZVNpemU7XFxuXFx0XFx0dXYueCArPSAzLjAgKiBtYXgoIDAuMCwgY3ViZVVWX21heFRpbGVTaXplIC0gMi4wICogZmFjZVNpemUgKTtcXG5cXHRcXHR1diAqPSB0ZXhlbFNpemU7XFxuXFx0XFx0dmVjMyB0bCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xcblxcdFxcdHV2LnggKz0gdGV4ZWxTaXplO1xcblxcdFxcdHZlYzMgdHIgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCB0ZXh0dXJlMkQoIGVudk1hcCwgdXYgKSApLnJnYjtcXG5cXHRcXHR1di55ICs9IHRleGVsU2l6ZTtcXG5cXHRcXHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEKCBlbnZNYXAsIHV2ICkgKS5yZ2I7XFxuXFx0XFx0dXYueCAtPSB0ZXhlbFNpemU7XFxuXFx0XFx0dmVjMyBibCA9IGVudk1hcFRleGVsVG9MaW5lYXIoIHRleHR1cmUyRCggZW52TWFwLCB1diApICkucmdiO1xcblxcdFxcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XFxuXFx0XFx0dmVjMyBibSA9IG1peCggYmwsIGJyLCBmLnggKTtcXG5cXHRcXHRyZXR1cm4gbWl4KCB0bSwgYm0sIGYueSApO1xcblxcdH1cXG5cXHQjZGVmaW5lIHIwIDEuMFxcblxcdCNkZWZpbmUgdjAgMC4zMzlcXG5cXHQjZGVmaW5lIG0wIC0gMi4wXFxuXFx0I2RlZmluZSByMSAwLjhcXG5cXHQjZGVmaW5lIHYxIDAuMjc2XFxuXFx0I2RlZmluZSBtMSAtIDEuMFxcblxcdCNkZWZpbmUgcjQgMC40XFxuXFx0I2RlZmluZSB2NCAwLjA0NlxcblxcdCNkZWZpbmUgbTQgMi4wXFxuXFx0I2RlZmluZSByNSAwLjMwNVxcblxcdCNkZWZpbmUgdjUgMC4wMTZcXG5cXHQjZGVmaW5lIG01IDMuMFxcblxcdCNkZWZpbmUgcjYgMC4yMVxcblxcdCNkZWZpbmUgdjYgMC4wMDM4XFxuXFx0I2RlZmluZSBtNiA0LjBcXG5cXHRmbG9hdCByb3VnaG5lc3NUb01pcCggZmxvYXQgcm91Z2huZXNzICkge1xcblxcdFxcdGZsb2F0IG1pcCA9IDAuMDtcXG5cXHRcXHRpZiAoIHJvdWdobmVzcyA+PSByMSApIHtcXG5cXHRcXHRcXHRtaXAgPSAoIHIwIC0gcm91Z2huZXNzICkgKiAoIG0xIC0gbTAgKSAvICggcjAgLSByMSApICsgbTA7XFxuXFx0XFx0fSBlbHNlIGlmICggcm91Z2huZXNzID49IHI0ICkge1xcblxcdFxcdFxcdG1pcCA9ICggcjEgLSByb3VnaG5lc3MgKSAqICggbTQgLSBtMSApIC8gKCByMSAtIHI0ICkgKyBtMTtcXG5cXHRcXHR9IGVsc2UgaWYgKCByb3VnaG5lc3MgPj0gcjUgKSB7XFxuXFx0XFx0XFx0bWlwID0gKCByNCAtIHJvdWdobmVzcyApICogKCBtNSAtIG00ICkgLyAoIHI0IC0gcjUgKSArIG00O1xcblxcdFxcdH0gZWxzZSBpZiAoIHJvdWdobmVzcyA+PSByNiApIHtcXG5cXHRcXHRcXHRtaXAgPSAoIHI1IC0gcm91Z2huZXNzICkgKiAoIG02IC0gbTUgKSAvICggcjUgLSByNiApICsgbTU7XFxuXFx0XFx0fSBlbHNlIHtcXG5cXHRcXHRcXHRtaXAgPSAtIDIuMCAqIGxvZzIoIDEuMTYgKiByb3VnaG5lc3MgKTtcXHRcXHR9XFxuXFx0XFx0cmV0dXJuIG1pcDtcXG5cXHR9XFxuXFx0dmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHNhbXBsZURpciwgZmxvYXQgcm91Z2huZXNzICkge1xcblxcdFxcdGZsb2F0IG1pcCA9IGNsYW1wKCByb3VnaG5lc3NUb01pcCggcm91Z2huZXNzICksIG0wLCBjdWJlVVZfbWF4TWlwTGV2ZWwgKTtcXG5cXHRcXHRmbG9hdCBtaXBGID0gZnJhY3QoIG1pcCApO1xcblxcdFxcdGZsb2F0IG1pcEludCA9IGZsb29yKCBtaXAgKTtcXG5cXHRcXHR2ZWMzIGNvbG9yMCA9IGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpciwgbWlwSW50ICk7XFxuXFx0XFx0aWYgKCBtaXBGID09IDAuMCApIHtcXG5cXHRcXHRcXHRyZXR1cm4gdmVjNCggY29sb3IwLCAxLjAgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdHZlYzMgY29sb3IxID0gYmlsaW5lYXJDdWJlVVYoIGVudk1hcCwgc2FtcGxlRGlyLCBtaXBJbnQgKyAxLjAgKTtcXG5cXHRcXHRcXHRyZXR1cm4gdmVjNCggbWl4KCBjb2xvcjAsIGNvbG9yMSwgbWlwRiApLCAxLjAgKTtcXG5cXHRcXHR9XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSBcInZlYzMgdHJhbnNmb3JtZWROb3JtYWwgPSBvYmplY3ROb3JtYWw7XFxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0bWF0MyBtID0gbWF0MyggaW5zdGFuY2VNYXRyaXggKTtcXG5cXHR0cmFuc2Zvcm1lZE5vcm1hbCAvPSB2ZWMzKCBkb3QoIG1bIDAgXSwgbVsgMCBdICksIGRvdCggbVsgMSBdLCBtWyAxIF0gKSwgZG90KCBtWyAyIF0sIG1bIDIgXSApICk7XFxuXFx0dHJhbnNmb3JtZWROb3JtYWwgPSBtICogdHJhbnNmb3JtZWROb3JtYWw7XFxuI2VuZGlmXFxudHJhbnNmb3JtZWROb3JtYWwgPSBub3JtYWxNYXRyaXggKiB0cmFuc2Zvcm1lZE5vcm1hbDtcXG4jaWZkZWYgRkxJUF9TSURFRFxcblxcdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHR2ZWMzIHRyYW5zZm9ybWVkVGFuZ2VudCA9ICggbW9kZWxWaWV3TWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XFxuXFx0I2lmZGVmIEZMSVBfU0lERURcXG5cXHRcXHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXNwbGFjZW1lbnRNYXA7XFxuXFx0dW5pZm9ybSBmbG9hdCBkaXNwbGFjZW1lbnRTY2FsZTtcXG5cXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XFxuI2VuZGlmXCI7XG5cbnZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxcblxcdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB2VXYgKS54ICogZGlzcGxhY2VtZW50U2NhbGUgKyBkaXNwbGFjZW1lbnRCaWFzICk7XFxuI2VuZGlmXCI7XG5cbnZhciBlbWlzc2l2ZW1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTUlTU0lWRU1BUFxcblxcdHZlYzQgZW1pc3NpdmVDb2xvciA9IHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xcblxcdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xcblxcdHRvdGFsRW1pc3NpdmVSYWRpYW5jZSAqPSBlbWlzc2l2ZUNvbG9yLnJnYjtcXG4jZW5kaWZcIjtcblxudmFyIGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBlbWlzc2l2ZU1hcDtcXG4jZW5kaWZcIjtcblxudmFyIGVuY29kaW5nc19mcmFnbWVudCA9IFwiZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XCI7XG5cbnZhciBlbmNvZGluZ3NfcGFyc19mcmFnbWVudCA9IFwiXFxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmFsdWU7XFxufVxcbnZlYzQgR2FtbWFUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcXG59XFxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcXG5cXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDEuMCAvIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xcbn1cXG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS5hICk7XFxufVxcbnZlYzQgTGluZWFyVG9zUkdCKCBpbiB2ZWM0IHZhbHVlICkge1xcblxcdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcXG59XFxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIGV4cDIoIHZhbHVlLmEgKiAyNTUuMCAtIDEyOC4wICksIDEuMCApO1xcbn1cXG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XFxuXFx0ZmxvYXQgZkV4cCA9IGNsYW1wKCBjZWlsKCBsb2cyKCBtYXhDb21wb25lbnQgKSApLCAtMTI4LjAsIDEyNy4wICk7XFxuXFx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XFxufVxcbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogdmFsdWUuYSAqIG1heFJhbmdlLCAxLjAgKTtcXG59XFxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xcblxcdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcXG5cXHRmbG9hdCBNID0gY2xhbXAoIG1heFJHQiAvIG1heFJhbmdlLCAwLjAsIDEuMCApO1xcblxcdE0gPSBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XFxufVxcbnZlYzQgUkdCRFRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XFxufVxcbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcXG5cXHRmbG9hdCBtYXhSR0IgPSBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XFxuXFx0ZmxvYXQgRCA9IG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xcblxcdEQgPSBjbGFtcCggZmxvb3IoIEQgKSAvIDI1NS4wLCAwLjAsIDEuMCApO1xcblxcdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XFxufVxcbmNvbnN0IG1hdDMgY0xvZ0x1dk0gPSBtYXQzKCAwLjIyMDksIDAuMzM5MCwgMC40MTg0LCAwLjExMzgsIDAuNjc4MCwgMC43MzE5LCAwLjAxMDIsIDAuMTEzMCwgMC4yOTY5ICk7XFxudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApIHtcXG5cXHR2ZWMzIFhwX1lfWFlacCA9IGNMb2dMdXZNICogdmFsdWUucmdiO1xcblxcdFhwX1lfWFlacCA9IG1heCggWHBfWV9YWVpwLCB2ZWMzKCAxZS02LCAxZS02LCAxZS02ICkgKTtcXG5cXHR2ZWM0IHZSZXN1bHQ7XFxuXFx0dlJlc3VsdC54eSA9IFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xcblxcdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcXG5cXHR2UmVzdWx0LncgPSBmcmFjdCggTGUgKTtcXG5cXHR2UmVzdWx0LnogPSAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xcblxcdHJldHVybiB2UmVzdWx0O1xcbn1cXG5jb25zdCBtYXQzIGNMb2dMdXZJbnZlcnNlTSA9IG1hdDMoIDYuMDAxNCwgLTIuNzAwOCwgLTEuNzk5NiwgLTEuMzMyMCwgMy4xMDI5LCAtNS43NzIxLCAwLjMwMDgsIC0xLjA4ODIsIDUuNjI2OCApO1xcbnZlYzQgTG9nTHV2VG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XFxuXFx0ZmxvYXQgTGUgPSB2YWx1ZS56ICogMjU1LjAgKyB2YWx1ZS53O1xcblxcdHZlYzMgWHBfWV9YWVpwO1xcblxcdFhwX1lfWFlacC55ID0gZXhwMiggKCBMZSAtIDEyNy4wICkgLyAyLjAgKTtcXG5cXHRYcF9ZX1hZWnAueiA9IFhwX1lfWFlacC55IC8gdmFsdWUueTtcXG5cXHRYcF9ZX1hZWnAueCA9IHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcXG5cXHR2ZWMzIHZSR0IgPSBjTG9nTHV2SW52ZXJzZU0gKiBYcF9ZX1hZWnAucmdiO1xcblxcdHJldHVybiB2ZWM0KCBtYXgoIHZSR0IsIDAuMCApLCAxLjAgKTtcXG59XCI7XG5cbnZhciBlbnZtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2lmZGVmIEVOVl9XT1JMRFBPU1xcblxcdFxcdHZlYzMgY2FtZXJhVG9GcmFnO1xcblxcdFxcdGlmICggaXNPcnRob2dyYXBoaWMgKSB7XFxuXFx0XFx0XFx0Y2FtZXJhVG9GcmFnID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvRnJhZyA9IG5vcm1hbGl6ZSggdldvcmxkUG9zaXRpb24gLSBjYW1lcmFQb3NpdGlvbiApO1xcblxcdFxcdH1cXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCBjYW1lcmFUb0ZyYWcsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZWxzZVxcblxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxcblxcdFxcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHJlZmxlY3RWZWMsIDAuMCApO1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjNCBlbnZDb2xvciA9IHZlYzQoIDAuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpZm5kZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxcblxcdFxcdGVudkNvbG9yID0gZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZXFxuXFx0XFx0b3V0Z29pbmdMaWdodCA9IG1peCggb3V0Z29pbmdMaWdodCwgb3V0Z29pbmdMaWdodCAqIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xcblxcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxcblxcdFxcdG91dGdvaW5nTGlnaHQgKz0gZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9FTlZNQVBcXG5cXHR1bmlmb3JtIGZsb2F0IGVudk1hcEludGVuc2l0eTtcXG5cXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XFxuXFx0dW5pZm9ybSBpbnQgbWF4TWlwTGV2ZWw7XFxuXFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcXG5cXHQjZW5kaWZcXG5cXHRcXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXFxuXFx0XFx0I2RlZmluZSBFTlZfV09STERQT1NcXG5cXHQjZW5kaWZcXG5cXHQjaWZkZWYgRU5WX1dPUkxEUE9TXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcblxcdFxcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xcblxcdCNlbHNlXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgZW52bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fGRlZmluZWQoIFBIT05HIClcXG5cXHRcXHQjZGVmaW5lIEVOVl9XT1JMRFBPU1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBFTlZfV09STERQT1NcXG5cXHRcXHRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlJlZmxlY3Q7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBlbnZtYXBfdmVydGV4ID0gXCIjaWZkZWYgVVNFX0VOVk1BUFxcblxcdCNpZmRlZiBFTlZfV09STERQT1NcXG5cXHRcXHR2V29ybGRQb3NpdGlvbiA9IHdvcmxkUG9zaXRpb24ueHl6O1xcblxcdCNlbHNlXFxuXFx0XFx0dmVjMyBjYW1lcmFUb1ZlcnRleDtcXG5cXHRcXHRpZiAoIGlzT3J0aG9ncmFwaGljICkge1xcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2ZWMzKCAtIHZpZXdNYXRyaXhbIDAgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDEgXVsgMiBdLCAtIHZpZXdNYXRyaXhbIDIgXVsgMiBdICkgKTtcXG5cXHRcXHR9IGVsc2Uge1xcblxcdFxcdFxcdGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XFxuXFx0XFx0fVxcblxcdFxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXFxuXFx0XFx0XFx0dlJlZmxlY3QgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcXG5cXHRcXHQjZWxzZVxcblxcdFxcdFxcdHZSZWZsZWN0ID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIGZvZ192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfRk9HXFxuXFx0Zm9nRGVwdGggPSAtIG12UG9zaXRpb24uejtcXG4jZW5kaWZcIjtcblxudmFyIGZvZ19wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xcbiNlbmRpZlwiO1xuXG52YXIgZm9nX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0ZPR1xcblxcdCNpZmRlZiBGT0dfRVhQMlxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IDEuMCAtIGV4cCggLSBmb2dEZW5zaXR5ICogZm9nRGVuc2l0eSAqIGZvZ0RlcHRoICogZm9nRGVwdGggKTtcXG5cXHQjZWxzZVxcblxcdFxcdGZsb2F0IGZvZ0ZhY3RvciA9IHNtb290aHN0ZXAoIGZvZ05lYXIsIGZvZ0ZhciwgZm9nRGVwdGggKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IucmdiID0gbWl4KCBnbF9GcmFnQ29sb3IucmdiLCBmb2dDb2xvciwgZm9nRmFjdG9yICk7XFxuI2VuZGlmXCI7XG5cbnZhciBmb2dfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9GT0dcXG5cXHR1bmlmb3JtIHZlYzMgZm9nQ29sb3I7XFxuXFx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcXG5cXHQjaWZkZWYgRk9HX0VYUDJcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGZvZ05lYXI7XFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBmb2dGYXI7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50ID0gXCIjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XFxuI2VuZGlmXFxudmVjMyBnZXRHcmFkaWVudElycmFkaWFuY2UoIHZlYzMgbm9ybWFsLCB2ZWMzIGxpZ2h0RGlyZWN0aW9uICkge1xcblxcdGZsb2F0IGRvdE5MID0gZG90KCBub3JtYWwsIGxpZ2h0RGlyZWN0aW9uICk7XFxuXFx0dmVjMiBjb29yZCA9IHZlYzIoIGRvdE5MICogMC41ICsgMC41LCAwLjAgKTtcXG5cXHQjaWZkZWYgVVNFX0dSQURJRU5UTUFQXFxuXFx0XFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xcblxcdCNlbHNlXFxuXFx0XFx0cmV0dXJuICggY29vcmQueCA8IDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcXG5cXHQjZW5kaWZcXG59XCI7XG5cbnZhciBsaWdodG1hcF9mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHZlYzQgbGlnaHRNYXBUZXhlbD0gdGV4dHVyZTJEKCBsaWdodE1hcCwgdlV2MiApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9MSUdIVE1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xcblxcdHVuaWZvcm0gZmxvYXQgbGlnaHRNYXBJbnRlbnNpdHk7XFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfbGFtYmVydF92ZXJ0ZXggPSBcInZlYzMgZGlmZnVzZSA9IHZlYzMoIDEuMCApO1xcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XFxuZ2VvbWV0cnkucG9zaXRpb24gPSBtdlBvc2l0aW9uLnh5ejtcXG5nZW9tZXRyeS5ub3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuZ2VvbWV0cnkudmlld0RpciA9ICggaXNPcnRob2dyYXBoaWMgKSA/IHZlYzMoIDAsIDAsIDEgKSA6IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XFxuR2VvbWV0cmljQ29udGV4dCBiYWNrR2VvbWV0cnk7XFxuYmFja0dlb21ldHJ5LnBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XFxuYmFja0dlb21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XFxuYmFja0dlb21ldHJ5LnZpZXdEaXIgPSBnZW9tZXRyeS52aWV3RGlyO1xcbnZMaWdodEZyb250ID0gdmVjMyggMC4wICk7XFxudkluZGlyZWN0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcXG4jaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xcblxcdHZJbmRpcmVjdEJhY2sgPSB2ZWMzKCAwLjAgKTtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbmZsb2F0IGRvdE5MO1xcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xcbnZJbmRpcmVjdEZyb250ICs9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxudkluZGlyZWN0RnJvbnQgKz0gZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGxpZ2h0UHJvYmUsIGdlb21ldHJ5ICk7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZJbmRpcmVjdEJhY2sgKz0gZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcXG5cXHR2SW5kaXJlY3RCYWNrICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBiYWNrR2VvbWV0cnkgKTtcXG4jZW5kaWZcXG4jaWYgTlVNX1BPSU5UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9TUE9UX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHRcXHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHZJbmRpcmVjdEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcXG5cXHRcXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0XFx0dkluZGlyZWN0QmFjayArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGJhY2tHZW9tZXRyeSApO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3BhcnNfYmVnaW4gPSBcInVuaWZvcm0gYm9vbCByZWNlaXZlU2hhZG93O1xcbnVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcXG51bmlmb3JtIHZlYzMgbGlnaHRQcm9iZVsgOSBdO1xcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XFxuXFx0ZmxvYXQgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcXG5cXHR2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDEgXSAqIDIuMCAqIDAuNTExNjY0ICogeTtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDIgXSAqIDIuMCAqIDAuNTExNjY0ICogejtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDQgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHk7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xcblxcdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcXG5cXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDcgXSAqIDIuMCAqIDAuNDI5MDQzICogeCAqIHo7XFxuXFx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xcblxcdHJldHVybiByZXN1bHQ7XFxufVxcbnZlYzMgZ2V0TGlnaHRQcm9iZUlycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgbGlnaHRQcm9iZVsgOSBdLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xcblxcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBnZW9tZXRyeS5ub3JtYWwsIHZpZXdNYXRyaXggKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcXG5cXHRyZXR1cm4gaXJyYWRpYW5jZTtcXG59XFxudmVjMyBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGFtYmllbnRMaWdodENvbG9yICkge1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIGlycmFkaWFuY2U7XFxufVxcbiNpZiBOVU1fRElSX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodCB7XFxuXFx0XFx0dmVjMyBkaXJlY3Rpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHR9O1xcblxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0c1sgTlVNX0RJUl9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBEaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gZGlyZWN0aW9uYWxMaWdodC5jb2xvcjtcXG5cXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24gPSBkaXJlY3Rpb25hbExpZ2h0LmRpcmVjdGlvbjtcXG5cXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gdHJ1ZTtcXG5cXHR9XFxuI2VuZGlmXFxuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFBvaW50TGlnaHQge1xcblxcdFxcdHZlYzMgcG9zaXRpb247XFxuXFx0XFx0dmVjMyBjb2xvcjtcXG5cXHRcXHRmbG9hdCBkaXN0YW5jZTtcXG5cXHRcXHRmbG9hdCBkZWNheTtcXG5cXHR9O1xcblxcdHVuaWZvcm0gUG9pbnRMaWdodCBwb2ludExpZ2h0c1sgTlVNX1BPSU5UX0xJR0hUUyBdO1xcblxcdHZvaWQgZ2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFBvaW50TGlnaHQgcG9pbnRMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XFxuXFx0XFx0dmVjMyBsVmVjdG9yID0gcG9pbnRMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRkaXJlY3RMaWdodC5jb2xvciA9IHBvaW50TGlnaHQuY29sb3I7XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gcHVuY3R1YWxMaWdodEludGVuc2l0eVRvSXJyYWRpYW5jZUZhY3RvciggbGlnaHREaXN0YW5jZSwgcG9pbnRMaWdodC5kaXN0YW5jZSwgcG9pbnRMaWdodC5kZWNheSApO1xcblxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSAoIGRpcmVjdExpZ2h0LmNvbG9yICE9IHZlYzMoIDAuMCApICk7XFxuXFx0fVxcbiNlbmRpZlxcbiNpZiBOVU1fU1BPVF9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFNwb3RMaWdodCB7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIGNvbG9yO1xcblxcdFxcdGZsb2F0IGRpc3RhbmNlO1xcblxcdFxcdGZsb2F0IGRlY2F5O1xcblxcdFxcdGZsb2F0IGNvbmVDb3M7XFxuXFx0XFx0ZmxvYXQgcGVudW1icmFDb3M7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIFNwb3RMaWdodCBzcG90TGlnaHRzWyBOVU1fU1BPVF9MSUdIVFMgXTtcXG5cXHR2b2lkIGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIFNwb3RMaWdodCBzcG90TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIG91dCBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcdFxcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcXG5cXHRcXHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XFxuXFx0XFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xcblxcdFxcdFxcdGZsb2F0IHNwb3RFZmZlY3QgPSBzbW9vdGhzdGVwKCBzcG90TGlnaHQuY29uZUNvcywgc3BvdExpZ2h0LnBlbnVtYnJhQ29zLCBhbmdsZUNvcyApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yID0gc3BvdExpZ2h0LmNvbG9yO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xcblxcdFxcdFxcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xcblxcdFxcdH0gZWxzZSB7XFxuXFx0XFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgPSB2ZWMzKCAwLjAgKTtcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XFxuXFx0XFx0fVxcblxcdH1cXG4jZW5kaWZcXG4jaWYgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwXFxuXFx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xcblxcdFxcdHZlYzMgY29sb3I7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbjtcXG5cXHRcXHR2ZWMzIGhhbGZXaWR0aDtcXG5cXHRcXHR2ZWMzIGhhbGZIZWlnaHQ7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMTtcXHR1bmlmb3JtIHNhbXBsZXIyRCBsdGNfMjtcXG5cXHR1bmlmb3JtIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodHNbIE5VTV9SRUNUX0FSRUFfTElHSFRTIF07XFxuI2VuZGlmXFxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcXG5cXHRzdHJ1Y3QgSGVtaXNwaGVyZUxpZ2h0IHtcXG5cXHRcXHR2ZWMzIGRpcmVjdGlvbjtcXG5cXHRcXHR2ZWMzIHNreUNvbG9yO1xcblxcdFxcdHZlYzMgZ3JvdW5kQ29sb3I7XFxuXFx0fTtcXG5cXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcXG5cXHR2ZWMzIGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIEhlbWlzcGhlcmVMaWdodCBoZW1pTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnkgKSB7XFxuXFx0XFx0ZmxvYXQgZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgaGVtaUxpZ2h0LmRpcmVjdGlvbiApO1xcblxcdFxcdGZsb2F0IGhlbWlEaWZmdXNlV2VpZ2h0ID0gMC41ICogZG90TkwgKyAwLjU7XFxuXFx0XFx0dmVjMyBpcnJhZGlhbmNlID0gbWl4KCBoZW1pTGlnaHQuZ3JvdW5kQ29sb3IsIGhlbWlMaWdodC5za3lDb2xvciwgaGVtaURpZmZ1c2VXZWlnaHQgKTtcXG5cXHRcXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdHJldHVybiBpcnJhZGlhbmNlO1xcblxcdH1cXG4jZW5kaWZcIjtcblxudmFyIGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXFxuXFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRlJBQ1RJT05cXG5cXHRcXHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcXG5cXHQjZW5kaWZcXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcXG5cXHRcXHRcXHR2ZWMzIHF1ZXJ5VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHdvcmxkTm9ybWFsLngsIHdvcmxkTm9ybWFsLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVZlYywgZmxvYXQoIG1heE1JUExldmVsICkgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCB3b3JsZE5vcm1hbCwgMS4wICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdmVjNCggMC4wICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmV0dXJuIFBJICogZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG5cXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdGZsb2F0IHNpZ21hID0gUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xcblxcdFxcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcXG5cXHRcXHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xcblxcdH1cXG5cXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIHZpZXdEaXIsIGNvbnN0IGluIHZlYzMgbm9ybWFsLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcXG5cXHRcXHQjaWZkZWYgRU5WTUFQX01PREVfUkVGTEVDVElPTlxcblxcdFxcdFxcdHZlYzMgcmVmbGVjdFZlYyA9IHJlZmxlY3QoIC12aWV3RGlyLCBub3JtYWwgKTtcXG5cXHRcXHRcXHRyZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggLXZpZXdEaXIsIG5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0cmVmbGVjdFZlYyA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHJlZmxlY3RWZWMsIHZpZXdNYXRyaXggKTtcXG5cXHRcXHRmbG9hdCBzcGVjdWxhck1JUExldmVsID0gZ2V0U3BlY3VsYXJNSVBMZXZlbCggcm91Z2huZXNzLCBtYXhNSVBMZXZlbCApO1xcblxcdFxcdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXFxuXFx0XFx0XFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XFxuXFx0XFx0XFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZUxvZEVYVCggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZWxzZVxcblxcdFxcdFxcdFxcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZSggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHNwZWN1bGFyTUlQTGV2ZWwgKTtcXG5cXHRcXHRcXHQjZW5kaWZcXG5cXHRcXHRcXHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcXG5cXHRcXHRcXHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCByZWZsZWN0VmVjLCByb3VnaG5lc3MgKTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xcblxcdH1cXG4jZW5kaWZcIjtcblxudmFyIGxpZ2h0c190b29uX2ZyYWdtZW50ID0gXCJUb29uTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcIjtcblxudmFyIGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgVG9vbk1hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X1Rvb24oIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFRvb25NYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0aXJyYWRpYW5jZSAqPSBQSTtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3REaWZmdXNlX1Rvb24oIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gVG9vbk1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxuI2RlZmluZSBSRV9EaXJlY3RcXHRcXHRcXHRcXHRSRV9EaXJlY3RfVG9vblxcbiNkZWZpbmUgUkVfSW5kaXJlY3REaWZmdXNlXFx0XFx0UkVfSW5kaXJlY3REaWZmdXNlX1Rvb25cXG4jZGVmaW5lIE1hdGVyaWFsX0xpZ2h0UHJvYmVMT0QoIG1hdGVyaWFsIClcXHQoMClcIjtcblxudmFyIGxpZ2h0c19waG9uZ19mcmFnbWVudCA9IFwiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxubWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IHNwZWN1bGFyO1xcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggPSBzcGVjdWxhclN0cmVuZ3RoO1wiO1xuXG52YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSBcInZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG5cXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XFxuXFx0ZmxvYXQgc3BlY3VsYXJTaGluaW5lc3M7XFxuXFx0ZmxvYXQgc3BlY3VsYXJTdHJlbmd0aDtcXG59O1xcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcXG5cXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcXG5cXHRcXHRpcnJhZGlhbmNlICo9IFBJO1xcblxcdCNlbmRpZlxcblxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKz0gaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xcbn1cXG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbiNkZWZpbmUgUkVfRGlyZWN0XFx0XFx0XFx0XFx0UkVfRGlyZWN0X0JsaW5uUGhvbmdcXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVxcdFxcdFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nXFxuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXFx0KDApXCI7XG5cbnZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSBcIlBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWw7XFxubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XFxudmVjMyBkeHkgPSBtYXgoIGFicyggZEZkeCggZ2VvbWV0cnlOb3JtYWwgKSApLCBhYnMoIGRGZHkoIGdlb21ldHJ5Tm9ybWFsICkgKSApO1xcbmZsb2F0IGdlb21ldHJ5Um91Z2huZXNzID0gbWF4KCBtYXgoIGR4eS54LCBkeHkueSApLCBkeHkueiApO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWF4KCByb3VnaG5lc3NGYWN0b3IsIDAuMDUyNSApO21hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcbm1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzID0gbWluKCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgMS4wICk7XFxuI2lmZGVmIFJFRkxFQ1RJVklUWVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKiBwb3cyKCByZWZsZWN0aXZpdHkgKSApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcXG4jZWxzZVxcblxcdG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBtaXgoIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XFxuI2VuZGlmXFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IGNsZWFyY29hdDtcXG5cXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRNQVBcXG5cXHRcXHRtYXRlcmlhbC5jbGVhcmNvYXQgKj0gdGV4dHVyZTJEKCBjbGVhcmNvYXRNYXAsIHZVdiApLng7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQXFxuXFx0XFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICo9IHRleHR1cmUyRCggY2xlYXJjb2F0Um91Z2huZXNzTWFwLCB2VXYgKS55O1xcblxcdCNlbmRpZlxcblxcdG1hdGVyaWFsLmNsZWFyY29hdCA9IHNhdHVyYXRlKCBtYXRlcmlhbC5jbGVhcmNvYXQgKTtcXHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBtYXgoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgMC4wNTI1ICk7XFxuXFx0bWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICs9IGdlb21ldHJ5Um91Z2huZXNzO1xcblxcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IG1pbiggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCAxLjAgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1NIRUVOXFxuXFx0bWF0ZXJpYWwuc2hlZW5Db2xvciA9IHNoZWVuO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQgPSBcInN0cnVjdCBQaHlzaWNhbE1hdGVyaWFsIHtcXG5cXHR2ZWMzIGRpZmZ1c2VDb2xvcjtcXG5cXHRmbG9hdCBzcGVjdWxhclJvdWdobmVzcztcXG5cXHR2ZWMzIHNwZWN1bGFyQ29sb3I7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGZsb2F0IGNsZWFyY29hdDtcXG5cXHRmbG9hdCBjbGVhcmNvYXRSb3VnaG5lc3M7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9TSEVFTlxcblxcdHZlYzMgc2hlZW5Db2xvcjtcXG4jZW5kaWZcXG59O1xcbiNkZWZpbmUgTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAwLjE2XFxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcXG5mbG9hdCBjbGVhcmNvYXRESFJBcHByb3goIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gZmxvYXQgZG90TkwgKSB7XFxuXFx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcXG59XFxuI2lmIE5VTV9SRUNUX0FSRUFfTElHSFRTID4gMFxcblxcdHZvaWQgUkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsKCBjb25zdCBpbiBSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xcblxcdFxcdHZlYzMgbm9ybWFsID0gZ2VvbWV0cnkubm9ybWFsO1xcblxcdFxcdHZlYzMgdmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XFxuXFx0XFx0dmVjMyBwb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgbGlnaHRQb3MgPSByZWN0QXJlYUxpZ2h0LnBvc2l0aW9uO1xcblxcdFxcdHZlYzMgaGFsZldpZHRoID0gcmVjdEFyZWFMaWdodC5oYWxmV2lkdGg7XFxuXFx0XFx0dmVjMyBoYWxmSGVpZ2h0ID0gcmVjdEFyZWFMaWdodC5oYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzMgbGlnaHRDb2xvciA9IHJlY3RBcmVhTGlnaHQuY29sb3I7XFxuXFx0XFx0ZmxvYXQgcm91Z2huZXNzID0gbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3M7XFxuXFx0XFx0dmVjMyByZWN0Q29vcmRzWyA0IF07XFxuXFx0XFx0cmVjdENvb3Jkc1sgMCBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggLSBoYWxmSGVpZ2h0O1xcdFxcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcXG5cXHRcXHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XFxuXFx0XFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xcblxcdFxcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XFxuXFx0XFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XFxuXFx0XFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XFxuXFx0XFx0bWF0MyBtSW52ID0gbWF0MyhcXG5cXHRcXHRcXHR2ZWMzKCB0MS54LCAwLCB0MS55ICksXFxuXFx0XFx0XFx0dmVjMyggICAgMCwgMSwgICAgMCApLFxcblxcdFxcdFxcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxcblxcdFxcdCk7XFxuXFx0XFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XFxuXFx0fVxcbiNlbmRpZlxcbnZvaWQgUkVfRGlyZWN0X1BoeXNpY2FsKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCApIHtcXG5cXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcXG5cXHR2ZWMzIGlycmFkaWFuY2UgPSBkb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xcblxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdGlycmFkaWFuY2UgKj0gUEk7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIENMRUFSQ09BVFxcblxcdFxcdGZsb2F0IGNjRG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XFxuXFx0XFx0dmVjMyBjY0lycmFkaWFuY2UgPSBjY0RvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XFxuXFx0XFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXFxuXFx0XFx0XFx0Y2NJcnJhZGlhbmNlICo9IFBJO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSAwLjA7XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9TSEVFTlxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcXG5cXHRcXHRcXHRtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyxcXG5cXHRcXHRcXHRkaXJlY3RMaWdodC5kaXJlY3Rpb24sXFxuXFx0XFx0XFx0Z2VvbWV0cnksXFxuXFx0XFx0XFx0bWF0ZXJpYWwuc2hlZW5Db2xvclxcblxcdFxcdCk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XFxuXFx0I2VuZGlmXFxuXFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcXG59XFxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XFxuXFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XFxufVxcbnZvaWQgUkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbCggY29uc3QgaW4gdmVjMyByYWRpYW5jZSwgY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGNsZWFyY29hdFJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsLCBpbm91dCBSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCkge1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcXG5cXHRcXHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcXG5cXHRcXHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xcblxcdCNlbHNlXFxuXFx0XFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcXG5cXHR2ZWMzIHNpbmdsZVNjYXR0ZXJpbmcgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWMzIG11bHRpU2NhdHRlcmluZyA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XFxuXFx0QlJERl9TcGVjdWxhcl9NdWx0aXNjYXR0ZXJpbmdfRW52aXJvbm1lbnQoIGdlb21ldHJ5LCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcywgc2luZ2xlU2NhdHRlcmluZywgbXVsdGlTY2F0dGVyaW5nICk7XFxuXFx0dmVjMyBkaWZmdXNlID0gbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICogKCAxLjAgLSAoIHNpbmdsZVNjYXR0ZXJpbmcgKyBtdWx0aVNjYXR0ZXJpbmcgKSApO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcblxcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBkaWZmdXNlICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xcbn1cXG4jZGVmaW5lIFJFX0RpcmVjdFxcdFxcdFxcdFxcdFJFX0RpcmVjdF9QaHlzaWNhbFxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXFx0XFx0UkVfRGlyZWN0X1JlY3RBcmVhX1BoeXNpY2FsXFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcXHRcXHRSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWxcXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcXHRcXHRSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsXFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xcblxcdHJldHVybiBzYXR1cmF0ZSggcG93KCBkb3ROViArIGFtYmllbnRPY2NsdXNpb24sIGV4cDIoIC0gMTYuMCAqIHJvdWdobmVzcyAtIDEuMCApICkgLSAxLjAgKyBhbWJpZW50T2NjbHVzaW9uICk7XFxufVwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X2JlZ2luID0gXCJcXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xcbmdlb21ldHJ5LnBvc2l0aW9uID0gLSB2Vmlld1Bvc2l0aW9uO1xcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcXG5nZW9tZXRyeS52aWV3RGlyID0gKCBpc09ydGhvZ3JhcGhpYyApID8gdmVjMyggMCwgMCwgMSApIDogbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XFxuI2lmZGVmIENMRUFSQ09BVFxcblxcdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCA9IGNsZWFyY29hdE5vcm1hbDtcXG4jZW5kaWZcXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3c7XFxuXFx0I2VuZGlmXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRzWyBpIF07XFxuXFx0XFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xcblxcdFxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdHBvaW50TGlnaHRTaGFkb3cgPSBwb2ludExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHRTaGFkb3cuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodFNoYWRvdy5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0U2hhZG93LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG5cXHR9XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9lbmRcXG4jZW5kaWZcXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xcblxcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xcblxcdFxcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcXG5cXHRcXHRzcG90TGlnaHRTaGFkb3cgPSBzcG90TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggZGlyZWN0TGlnaHQudmlzaWJsZSwgcmVjZWl2ZVNoYWRvdyApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodFNoYWRvdy5zaGFkb3dCaWFzLCBzcG90TGlnaHRTaGFkb3cuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX0RJUl9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcXG5cXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XFxuXFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93O1xcblxcdCNlbmRpZlxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXHRcXHRkaXJlY3Rpb25hbExpZ2h0ID0gZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcXG5cXHRcXHRnZXREaXJlY3Rpb25hbERpcmVjdExpZ2h0SXJyYWRpYW5jZSggZGlyZWN0aW9uYWxMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fRElSX0xJR0hUX1NIQURPV1MgKVxcblxcdFxcdGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cgPSBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdGRpcmVjdExpZ2h0LmNvbG9yICo9IGFsbCggYnZlYzIoIGRpcmVjdExpZ2h0LnZpc2libGUsIHJlY2VpdmVTaGFkb3cgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0U2hhZG93LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHRTaGFkb3cuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodFNoYWRvdy5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuI2VuZGlmXFxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcXG5cXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xcblxcdFxcdHJlY3RBcmVhTGlnaHQgPSByZWN0QXJlYUxpZ2h0c1sgaSBdO1xcblxcdFxcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzMgaXJyYWRpYW5jZSA9IGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGFtYmllbnRMaWdodENvbG9yICk7XFxuXFx0aXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcXG5cXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0XFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xcblxcdFxcdFxcdGlycmFkaWFuY2UgKz0gZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xcblxcdFxcdH1cXG5cXHRcXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcXG5cXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XFxuXFx0dmVjMyBjbGVhcmNvYXRSYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xcbiNlbmRpZlwiO1xuXG52YXIgbGlnaHRzX2ZyYWdtZW50X21hcHMgPSBcIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxcblxcdCNpZmRlZiBVU0VfTElHSFRNQVBcXG5cXHRcXHR2ZWM0IGxpZ2h0TWFwVGV4ZWw9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSA9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdFxcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xcblxcdFxcdFxcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqPSBQSTtcXG5cXHRcXHQjZW5kaWZcXG5cXHRcXHRpcnJhZGlhbmNlICs9IGxpZ2h0TWFwSXJyYWRpYW5jZTtcXG5cXHQjZW5kaWZcXG5cXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXFxuXFx0XFx0aWJsSXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxcblxcdHJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xcblxcdCNpZmRlZiBDTEVBUkNPQVRcXG5cXHRcXHRjbGVhcmNvYXRSYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsaWdodHNfZnJhZ21lbnRfZW5kID0gXCIjaWYgZGVmaW5lZCggUkVfSW5kaXJlY3REaWZmdXNlIClcXG5cXHRSRV9JbmRpcmVjdERpZmZ1c2UoIGlycmFkaWFuY2UsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcXG4jZW5kaWZcXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXFxuXFx0UkVfSW5kaXJlY3RTcGVjdWxhciggcmFkaWFuY2UsIGlibElycmFkaWFuY2UsIGNsZWFyY29hdFJhZGlhbmNlLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxcblxcdGdsX0ZyYWdEZXB0aEVYVCA9IHZJc1BlcnNwZWN0aXZlID09IDAuMCA/IGdsX0ZyYWdDb29yZC56IDogbG9nMiggdkZyYWdEZXB0aCApICogbG9nRGVwdGhCdWZGQyAqIDAuNTtcXG4jZW5kaWZcIjtcblxudmFyIGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUYgKSAmJiBkZWZpbmVkKCBVU0VfTE9HREVQVEhCVUZfRVhUIClcXG5cXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxcblxcdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXFxuXFx0XFx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xcblxcdFxcdHZhcnlpbmcgZmxvYXQgdklzUGVyc3BlY3RpdmU7XFxuXFx0I2Vsc2VcXG5cXHRcXHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBsb2dkZXB0aGJ1Zl92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcXG5cXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxcblxcdFxcdHZGcmFnRGVwdGggPSAxLjAgKyBnbF9Qb3NpdGlvbi53O1xcblxcdFxcdHZJc1BlcnNwZWN0aXZlID0gZmxvYXQoIGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKSApO1xcblxcdCNlbHNlXFxuXFx0XFx0aWYgKCBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICkgKSB7XFxuXFx0XFx0XFx0Z2xfUG9zaXRpb24ueiA9IGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xcblxcdFxcdFxcdGdsX1Bvc2l0aW9uLnogKj0gZ2xfUG9zaXRpb24udztcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUFQXFxuXFx0dmVjNCB0ZXhlbENvbG9yID0gdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xcblxcdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XFxuXFx0ZGlmZnVzZUNvbG9yICo9IHRleGVsQ29sb3I7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXCI7XG5cbnZhciBtYXBfcGFydGljbGVfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR2ZWMyIHV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIGdsX1BvaW50Q29vcmQueCwgMS4wIC0gZ2xfUG9pbnRDb29yZC55LCAxICkgKS54eTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX01BUFxcblxcdHZlYzQgbWFwVGV4ZWwgPSB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcXG5cXHRkaWZmdXNlQ29sb3IgKj0gbWFwVGV4ZWxUb0xpbmVhciggbWFwVGV4ZWwgKTtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0FMUEhBTUFQXFxuXFx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdXYgKS5nO1xcbiNlbmRpZlwiO1xuXG52YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBVU0VfTUFQICkgfHwgZGVmaW5lZCggVVNFX0FMUEhBTUFQIClcXG5cXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XFxuI2VuZGlmXFxuI2lmZGVmIFVTRV9BTFBIQU1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgPSBtZXRhbG5lc3M7XFxuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsTWV0YWxuZXNzID0gdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xcblxcdG1ldGFsbmVzc0ZhY3RvciAqPSB0ZXhlbE1ldGFsbmVzcy5iO1xcbiNlbmRpZlwiO1xuXG52YXIgbWV0YWxuZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfTUVUQUxORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgbWV0YWxuZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGhub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX01PUlBITk9STUFMU1xcblxcdG9iamVjdE5vcm1hbCAqPSBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdG9iamVjdE5vcm1hbCArPSBtb3JwaE5vcm1hbDEgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcXG5cXHRvYmplY3ROb3JtYWwgKz0gbW9ycGhOb3JtYWwyICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAyIF07XFxuXFx0b2JqZWN0Tm9ybWFsICs9IG1vcnBoTm9ybWFsMyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcbiNlbmRpZlwiO1xuXG52YXIgbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEJhc2VJbmZsdWVuY2U7XFxuXFx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXFxuXFx0XFx0dW5pZm9ybSBmbG9hdCBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDggXTtcXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gZmxvYXQgbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA0IF07XFxuXFx0I2VuZGlmXFxuI2VuZGlmXCI7XG5cbnZhciBtb3JwaHRhcmdldF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXFxuXFx0dHJhbnNmb3JtZWQgKj0gbW9ycGhUYXJnZXRCYXNlSW5mbHVlbmNlO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMCBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xcblxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0MyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMyBdO1xcblxcdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NCAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNSBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NiAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xcblxcdFxcdHRyYW5zZm9ybWVkICs9IG1vcnBoVGFyZ2V0NyAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCJmbG9hdCBmYWNlRGlyZWN0aW9uID0gZ2xfRnJvbnRGYWNpbmcgPyAxLjAgOiAtIDEuMDtcXG4jaWZkZWYgRkxBVF9TSEFERURcXG5cXHR2ZWMzIGZkeCA9IHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIGZkeSA9IHZlYzMoIGRGZHkoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeSggdlZpZXdQb3NpdGlvbi56ICkgKTtcXG5cXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcXG4jZWxzZVxcblxcdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7XFxuXFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbCAqIGZhY2VEaXJlY3Rpb247XFxuXFx0I2VuZGlmXFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dmVjMyB0YW5nZW50ID0gbm9ybWFsaXplKCB2VGFuZ2VudCApO1xcblxcdFxcdHZlYzMgYml0YW5nZW50ID0gbm9ybWFsaXplKCB2Qml0YW5nZW50ICk7XFxuXFx0XFx0I2lmZGVmIERPVUJMRV9TSURFRFxcblxcdFxcdFxcdHRhbmdlbnQgPSB0YW5nZW50ICogZmFjZURpcmVjdGlvbjtcXG5cXHRcXHRcXHRiaXRhbmdlbnQgPSBiaXRhbmdlbnQgKiBmYWNlRGlyZWN0aW9uO1xcblxcdFxcdCNlbmRpZlxcblxcdFxcdCNpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQICkgfHwgZGVmaW5lZCggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKVxcblxcdFxcdFxcdG1hdDMgdlRCTiA9IG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgbm9ybWFsICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxudmVjMyBnZW9tZXRyeU5vcm1hbCA9IG5vcm1hbDtcIjtcblxudmFyIG5vcm1hbF9mcmFnbWVudF9tYXBzID0gXCIjaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXFxuXFx0bm9ybWFsID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHQjaWZkZWYgRkxJUF9TSURFRFxcblxcdFxcdG5vcm1hbCA9IC0gbm9ybWFsO1xcblxcdCNlbmRpZlxcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRub3JtYWwgPSBub3JtYWwgKiBmYWNlRGlyZWN0aW9uO1xcblxcdCNlbmRpZlxcblxcdG5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XFxuI2VsaWYgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXFxuXFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRtYXBOLnh5ICo9IG5vcm1hbFNjYWxlO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdG5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcXG5cXHQjZWxzZVxcblxcdFxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBtYXBOLCBmYWNlRGlyZWN0aW9uICk7XFxuXFx0I2VuZGlmXFxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxcblxcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWxBcmIoIC12Vmlld1Bvc2l0aW9uLCBub3JtYWwsIGRIZHh5X2Z3ZCgpLCBmYWNlRGlyZWN0aW9uICk7XFxuI2VuZGlmXCI7XG5cbnZhciBub3JtYWxtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBub3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xcbiNlbmRpZlxcbiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIG1hdDMgbm9ybWFsTWF0cml4O1xcbiNlbmRpZlxcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApICYmICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXFxuXFx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMyBtYXBOLCBmbG9hdCBmYWNlRGlyZWN0aW9uICkge1xcblxcdFxcdHZlYzMgcTAgPSB2ZWMzKCBkRmR4KCBleWVfcG9zLnggKSwgZEZkeCggZXllX3Bvcy55ICksIGRGZHgoIGV5ZV9wb3MueiApICk7XFxuXFx0XFx0dmVjMyBxMSA9IHZlYzMoIGRGZHkoIGV5ZV9wb3MueCApLCBkRmR5KCBleWVfcG9zLnkgKSwgZEZkeSggZXllX3Bvcy56ICkgKTtcXG5cXHRcXHR2ZWMyIHN0MCA9IGRGZHgoIHZVdi5zdCApO1xcblxcdFxcdHZlYzIgc3QxID0gZEZkeSggdlV2LnN0ICk7XFxuXFx0XFx0dmVjMyBOID0gc3VyZl9ub3JtO1xcblxcdFxcdHZlYzMgcTFwZXJwID0gY3Jvc3MoIHExLCBOICk7XFxuXFx0XFx0dmVjMyBxMHBlcnAgPSBjcm9zcyggTiwgcTAgKTtcXG5cXHRcXHR2ZWMzIFQgPSBxMXBlcnAgKiBzdDAueCArIHEwcGVycCAqIHN0MS54O1xcblxcdFxcdHZlYzMgQiA9IHExcGVycCAqIHN0MC55ICsgcTBwZXJwICogc3QxLnk7XFxuXFx0XFx0ZmxvYXQgZGV0ID0gbWF4KCBkb3QoIFQsIFQgKSwgZG90KCBCLCBCICkgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZSA9ICggZGV0ID09IDAuMCApID8gMC4wIDogZmFjZURpcmVjdGlvbiAqIGludmVyc2VzcXJ0KCBkZXQgKTtcXG5cXHRcXHRyZXR1cm4gbm9ybWFsaXplKCBUICogKCBtYXBOLnggKiBzY2FsZSApICsgQiAqICggbWFwTi55ICogc2NhbGUgKSArIE4gKiBtYXBOLnogKTtcXG5cXHR9XFxuI2VuZGlmXCI7XG5cbnZhciBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luID0gXCIjaWZkZWYgQ0xFQVJDT0FUXFxuXFx0dmVjMyBjbGVhcmNvYXROb3JtYWwgPSBnZW9tZXRyeU5vcm1hbDtcXG4jZW5kaWZcIjtcblxudmFyIGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcyA9IFwiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXFxuXFx0dmVjMyBjbGVhcmNvYXRNYXBOID0gdGV4dHVyZTJEKCBjbGVhcmNvYXROb3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcXG5cXHRjbGVhcmNvYXRNYXBOLnh5ICo9IGNsZWFyY29hdE5vcm1hbFNjYWxlO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdGNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIGNsZWFyY29hdE1hcE4gKTtcXG5cXHQjZWxzZVxcblxcdFxcdGNsZWFyY29hdE5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0TWFwTiwgZmFjZURpcmVjdGlvbiApO1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgY2xlYXJjb2F0X3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfQ0xFQVJDT0FUTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgY2xlYXJjb2F0TWFwO1xcbiNlbmRpZlxcbiNpZmRlZiBVU0VfQ0xFQVJDT0FUX1JPVUdITkVTU01BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdFJvdWdobmVzc01hcDtcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBjbGVhcmNvYXROb3JtYWxNYXA7XFxuXFx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xcbiNlbmRpZlwiO1xuXG52YXIgcGFja2luZyA9IFwidmVjMyBwYWNrTm9ybWFsVG9SR0IoIGNvbnN0IGluIHZlYzMgbm9ybWFsICkge1xcblxcdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xcbn1cXG52ZWMzIHVucGFja1JHQlRvTm9ybWFsKCBjb25zdCBpbiB2ZWMzIHJnYiApIHtcXG5cXHRyZXR1cm4gMi4wICogcmdiLnh5eiAtIDEuMDtcXG59XFxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcXG5jb25zdCB2ZWMzIFBhY2tGYWN0b3JzID0gdmVjMyggMjU2LiAqIDI1Ni4gKiAyNTYuLCAyNTYuICogMjU2LiwgMjU2LiApO1xcbmNvbnN0IHZlYzQgVW5wYWNrRmFjdG9ycyA9IFVucGFja0Rvd25zY2FsZSAvIHZlYzQoIFBhY2tGYWN0b3JzLCAxLiApO1xcbmNvbnN0IGZsb2F0IFNoaWZ0UmlnaHQ4ID0gMS4gLyAyNTYuO1xcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xcblxcdHZlYzQgciA9IHZlYzQoIGZyYWN0KCB2ICogUGFja0ZhY3RvcnMgKSwgdiApO1xcblxcdHIueXp3IC09IHIueHl6ICogU2hpZnRSaWdodDg7XFx0cmV0dXJuIHIgKiBQYWNrVXBzY2FsZTtcXG59XFxuZmxvYXQgdW5wYWNrUkdCQVRvRGVwdGgoIGNvbnN0IGluIHZlYzQgdiApIHtcXG5cXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XFxufVxcbnZlYzQgcGFjazJIYWxmVG9SR0JBKCB2ZWMyIHYgKSB7XFxuXFx0dmVjNCByID0gdmVjNCggdi54LCBmcmFjdCggdi54ICogMjU1LjAgKSwgdi55LCBmcmFjdCggdi55ICogMjU1LjAgKSk7XFxuXFx0cmV0dXJuIHZlYzQoIHIueCAtIHIueSAvIDI1NS4wLCByLnksIHIueiAtIHIudyAvIDI1NS4wLCByLncpO1xcbn1cXG52ZWMyIHVucGFja1JHQkFUbzJIYWxmKCB2ZWM0IHYgKSB7XFxuXFx0cmV0dXJuIHZlYzIoIHYueCArICggdi55IC8gMjU1LjAgKSwgdi56ICsgKCB2LncgLyAyNTUuMCApICk7XFxufVxcbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCB2aWV3WiArIG5lYXIgKSAvICggbmVhciAtIGZhciApO1xcbn1cXG5mbG9hdCBvcnRob2dyYXBoaWNEZXB0aFRvVmlld1ooIGNvbnN0IGluIGZsb2F0IGxpbmVhckNsaXBaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XFxuXFx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xcbn1cXG5mbG9hdCB2aWV3WlRvUGVyc3BlY3RpdmVEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcXG5cXHRyZXR1cm4gKCggbmVhciArIHZpZXdaICkgKiBmYXIgKSAvICgoIGZhciAtIG5lYXIgKSAqIHZpZXdaICk7XFxufVxcbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xcblxcdHJldHVybiAoIG5lYXIgKiBmYXIgKSAvICggKCBmYXIgLSBuZWFyICkgKiBpbnZDbGlwWiAtIGZhciApO1xcbn1cIjtcblxudmFyIHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQgPSBcIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiAqPSBnbF9GcmFnQ29sb3IuYTtcXG4jZW5kaWZcIjtcblxudmFyIHByb2plY3RfdmVydGV4ID0gXCJ2ZWM0IG12UG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuI2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0bXZQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogbXZQb3NpdGlvbjtcXG4jZW5kaWZcXG5tdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogbXZQb3NpdGlvbjtcXG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1wiO1xuXG52YXIgZGl0aGVyaW5nX2ZyYWdtZW50ID0gXCIjaWZkZWYgRElUSEVSSU5HXFxuXFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGRpdGhlcmluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlwiO1xuXG52YXIgZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBESVRIRVJJTkdcXG5cXHR2ZWMzIGRpdGhlcmluZyggdmVjMyBjb2xvciApIHtcXG5cXHRcXHRmbG9hdCBncmlkX3Bvc2l0aW9uID0gcmFuZCggZ2xfRnJhZ0Nvb3JkLnh5ICk7XFxuXFx0XFx0dmVjMyBkaXRoZXJfc2hpZnRfUkdCID0gdmVjMyggMC4yNSAvIDI1NS4wLCAtMC4yNSAvIDI1NS4wLCAwLjI1IC8gMjU1LjAgKTtcXG5cXHRcXHRkaXRoZXJfc2hpZnRfUkdCID0gbWl4KCAyLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCAtMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgZ3JpZF9wb3NpdGlvbiApO1xcblxcdFxcdHJldHVybiBjb2xvciArIGRpdGhlcl9zaGlmdF9SR0I7XFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX2ZyYWdtZW50ID0gXCJmbG9hdCByb3VnaG5lc3NGYWN0b3IgPSByb3VnaG5lc3M7XFxuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcXG5cXHR2ZWM0IHRleGVsUm91Z2huZXNzID0gdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xcblxcdHJvdWdobmVzc0ZhY3RvciAqPSB0ZXhlbFJvdWdobmVzcy5nO1xcbiNlbmRpZlwiO1xuXG52YXIgcm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXFxuXFx0dW5pZm9ybSBzYW1wbGVyMkQgcm91Z2huZXNzTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHRzdHJ1Y3QgRGlyZWN0aW9uYWxMaWdodFNoYWRvdyB7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93QmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dOb3JtYWxCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHR2ZWMyIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0fTtcXG5cXHRcXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwb3RTaGFkb3dNYXBbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0c3RydWN0IFBvaW50TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBQb2ludExpZ2h0U2hhZG93IHBvaW50TGlnaHRTaGFkb3dzWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdGZsb2F0IHRleHR1cmUyRENvbXBhcmUoIHNhbXBsZXIyRCBkZXB0aHMsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XFxuXFx0XFx0cmV0dXJuIHN0ZXAoIGNvbXBhcmUsIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIGRlcHRocywgdXYgKSApICk7XFxuXFx0fVxcblxcdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xcblxcdFxcdHJldHVybiB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XFxuXFx0XFx0ZmxvYXQgb2NjbHVzaW9uID0gMS4wO1xcblxcdFxcdHZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XFxuXFx0XFx0ZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcXG5cXHRcXHRpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkge1xcblxcdFxcdFxcdGZsb2F0IGRpc3RhbmNlID0gY29tcGFyZSAtIGRpc3RyaWJ1dGlvbi54IDtcXG5cXHRcXHRcXHRmbG9hdCB2YXJpYW5jZSA9IG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xcblxcdFxcdFxcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XFx0XFx0XFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XFx0XFx0XFx0b2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBvY2NsdXNpb247XFxuXFx0fVxcblxcdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XFxuXFx0XFx0ZmxvYXQgc2hhZG93ID0gMS4wO1xcblxcdFxcdHNoYWRvd0Nvb3JkLnh5eiAvPSBzaGFkb3dDb29yZC53O1xcblxcdFxcdHNoYWRvd0Nvb3JkLnogKz0gc2hhZG93QmlhcztcXG5cXHRcXHRidmVjNCBpbkZydXN0dW1WZWMgPSBidmVjNCAoIHNoYWRvd0Nvb3JkLnggPj0gMC4wLCBzaGFkb3dDb29yZC54IDw9IDEuMCwgc2hhZG93Q29vcmQueSA+PSAwLjAsIHNoYWRvd0Nvb3JkLnkgPD0gMS4wICk7XFxuXFx0XFx0Ym9vbCBpbkZydXN0dW0gPSBhbGwoIGluRnJ1c3R1bVZlYyApO1xcblxcdFxcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjID0gYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiA8PSAxLjAgKTtcXG5cXHRcXHRib29sIGZydXN0dW1UZXN0ID0gYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xcblxcdFxcdGlmICggZnJ1c3R1bVRlc3QgKSB7XFxuXFx0XFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHgwID0gLSB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeTAgPSAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0ZmxvYXQgZHkxID0gKyB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcXG5cXHRcXHRcXHRmbG9hdCBkeDIgPSBkeDAgLyAyLjA7XFxuXFx0XFx0XFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xcblxcdFxcdFxcdGZsb2F0IGR4MyA9IGR4MSAvIDIuMDtcXG5cXHRcXHRcXHRmbG9hdCBkeTMgPSBkeTEgLyAyLjA7XFxuXFx0XFx0XFx0c2hhZG93ID0gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDE3LjAgKTtcXG5cXHRcXHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXFxuXFx0XFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XFxuXFx0XFx0XFx0ZmxvYXQgZHggPSB0ZXhlbFNpemUueDtcXG5cXHRcXHRcXHRmbG9hdCBkeSA9IHRleGVsU2l6ZS55O1xcblxcdFxcdFxcdHZlYzIgdXYgPSBzaGFkb3dDb29yZC54eTtcXG5cXHRcXHRcXHR2ZWMyIGYgPSBmcmFjdCggdXYgKiBzaGFkb3dNYXBTaXplICsgMC41ICk7XFxuXFx0XFx0XFx0dXYgLT0gZiAqIHRleGVsU2l6ZTtcXG5cXHRcXHRcXHRzaGFkb3cgPSAoXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAwLjAsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHRleGVsU2l6ZSwgc2hhZG93Q29vcmQueiApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDAuMCApLCBzaGFkb3dDb29yZC56ICksXFxuXFx0XFx0XFx0XFx0XFx0IGYueCApICtcXG5cXHRcXHRcXHRcXHRtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0IHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnggKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMC4wLCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHQgdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCB1diArIHZlYzIoIDAuMCwgMi4wICogZHkgKSwgc2hhZG93Q29vcmQueiApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKSArXFxuXFx0XFx0XFx0XFx0bWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIC1keSApLCBzaGFkb3dDb29yZC56ICksIFxcblxcdFxcdFxcdFxcdFxcdCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHQgZi55ICkgK1xcblxcdFxcdFxcdFxcdG1peCggbWl4KCB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggLWR4LCAtZHkgKSwgc2hhZG93Q29vcmQueiApLCBcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAyLjAgKiBkeCwgLWR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBtaXgoIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgdXYgKyB2ZWMyKCAtZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSwgXFxuXFx0XFx0XFx0XFx0XFx0XFx0ICB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHV2ICsgdmVjMiggMi4wICogZHgsIDIuMCAqIGR5ICksIHNoYWRvd0Nvb3JkLnogKSxcXG5cXHRcXHRcXHRcXHRcXHRcXHQgIGYueCApLFxcblxcdFxcdFxcdFxcdFxcdCBmLnkgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbGlmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXFxuXFx0XFx0XFx0c2hhZG93ID0gVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiBzaGFkb3c7XFxuXFx0fVxcblxcdHZlYzIgY3ViZVRvVVYoIHZlYzMgdiwgZmxvYXQgdGV4ZWxTaXplWSApIHtcXG5cXHRcXHR2ZWMzIGFic1YgPSBhYnMoIHYgKTtcXG5cXHRcXHRmbG9hdCBzY2FsZVRvQ3ViZSA9IDEuMCAvIG1heCggYWJzVi54LCBtYXgoIGFic1YueSwgYWJzVi56ICkgKTtcXG5cXHRcXHRhYnNWICo9IHNjYWxlVG9DdWJlO1xcblxcdFxcdHYgKj0gc2NhbGVUb0N1YmUgKiAoIDEuMCAtIDIuMCAqIHRleGVsU2l6ZVkgKTtcXG5cXHRcXHR2ZWMyIHBsYW5hciA9IHYueHk7XFxuXFx0XFx0ZmxvYXQgYWxtb3N0QVRleGVsID0gMS41ICogdGV4ZWxTaXplWTtcXG5cXHRcXHRmbG9hdCBhbG1vc3RPbmUgPSAxLjAgLSBhbG1vc3RBVGV4ZWw7XFxuXFx0XFx0aWYgKCBhYnNWLnogPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGlmICggdi56ID4gMC4wIClcXG5cXHRcXHRcXHRcXHRwbGFuYXIueCA9IDQuMCAtIHYueDtcXG5cXHRcXHR9IGVsc2UgaWYgKCBhYnNWLnggPj0gYWxtb3N0T25lICkge1xcblxcdFxcdFxcdGZsb2F0IHNpZ25YID0gc2lnbiggdi54ICk7XFxuXFx0XFx0XFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xcblxcdFxcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XFxuXFx0XFx0XFx0ZmxvYXQgc2lnblkgPSBzaWduKCB2LnkgKTtcXG5cXHRcXHRcXHRwbGFuYXIueCA9IHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xcblxcdFxcdFxcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XFxuXFx0XFx0fVxcblxcdFxcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcXG5cXHR9XFxuXFx0ZmxvYXQgZ2V0UG9pbnRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkLCBmbG9hdCBzaGFkb3dDYW1lcmFOZWFyLCBmbG9hdCBzaGFkb3dDYW1lcmFGYXIgKSB7XFxuXFx0XFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvICggc2hhZG93TWFwU2l6ZSAqIHZlYzIoIDQuMCwgMi4wICkgKTtcXG5cXHRcXHR2ZWMzIGxpZ2h0VG9Qb3NpdGlvbiA9IHNoYWRvd0Nvb3JkLnh5ejtcXG5cXHRcXHRmbG9hdCBkcCA9ICggbGVuZ3RoKCBsaWdodFRvUG9zaXRpb24gKSAtIHNoYWRvd0NhbWVyYU5lYXIgKSAvICggc2hhZG93Q2FtZXJhRmFyIC0gc2hhZG93Q2FtZXJhTmVhciApO1xcdFxcdGRwICs9IHNoYWRvd0JpYXM7XFxuXFx0XFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcXG5cXHRcXHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxcblxcdFxcdFxcdHZlYzIgb2Zmc2V0ID0gdmVjMiggLSAxLCAxICkgKiBzaGFkb3dSYWRpdXMgKiB0ZXhlbFNpemUueTtcXG5cXHRcXHRcXHRyZXR1cm4gKFxcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXFxuXFx0XFx0XFx0XFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xcblxcdFxcdFxcdFxcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcXG5cXHRcXHRcXHRcXHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxcblxcdFxcdFxcdCkgKiAoIDEuMCAvIDkuMCApO1xcblxcdFxcdCNlbHNlXFxuXFx0XFx0XFx0cmV0dXJuIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICk7XFxuXFx0XFx0I2VuZGlmXFxuXFx0fVxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHR9O1xcblxcdFxcdHVuaWZvcm0gRGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0U2hhZG93c1sgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHRcXHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBTcG90TGlnaHRTaGFkb3cge1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0JpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93Tm9ybWFsQmlhcztcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dSYWRpdXM7XFxuXFx0XFx0XFx0dmVjMiBzaGFkb3dNYXBTaXplO1xcblxcdFxcdH07XFxuXFx0XFx0dW5pZm9ybSBTcG90TGlnaHRTaGFkb3cgc3BvdExpZ2h0U2hhZG93c1sgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcXG5cXHRcXHR1bmlmb3JtIG1hdDQgcG9pbnRTaGFkb3dNYXRyaXhbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XFxuXFx0XFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xcblxcdFxcdHN0cnVjdCBQb2ludExpZ2h0U2hhZG93IHtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dCaWFzO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd05vcm1hbEJpYXM7XFxuXFx0XFx0XFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xcblxcdFxcdFxcdHZlYzIgc2hhZG93TWFwU2l6ZTtcXG5cXHRcXHRcXHRmbG9hdCBzaGFkb3dDYW1lcmFOZWFyO1xcblxcdFxcdFxcdGZsb2F0IHNoYWRvd0NhbWVyYUZhcjtcXG5cXHRcXHR9O1xcblxcdFxcdHVuaWZvcm0gUG9pbnRMaWdodFNoYWRvdyBwb2ludExpZ2h0U2hhZG93c1sgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNoYWRvd21hcF92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0hBRE9XTUFQXFxuXFx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDAgfHwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0XFx0dmVjMyBzaGFkb3dXb3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XFxuXFx0XFx0dmVjNCBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcXG5cXHRcXHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogZGlyZWN0aW9uYWxMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XFxuXFx0XFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSA9IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xcblxcdFxcdHNoYWRvd1dvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uICsgdmVjNCggc2hhZG93V29ybGROb3JtYWwgKiBzcG90TGlnaHRTaGFkb3dzWyBpIF0uc2hhZG93Tm9ybWFsQmlhcywgMCApO1xcblxcdFxcdHZTcG90U2hhZG93Q29vcmRbIGkgXSA9IHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHNoYWRvd1dvcmxkUG9zaXRpb247XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcXG5cXHRcXHRzaGFkb3dXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbiArIHZlYzQoIHNoYWRvd1dvcmxkTm9ybWFsICogcG9pbnRMaWdodFNoYWRvd3NbIGkgXS5zaGFkb3dOb3JtYWxCaWFzLCAwICk7XFxuXFx0XFx0dlBvaW50U2hhZG93Q29vcmRbIGkgXSA9IHBvaW50U2hhZG93TWF0cml4WyBpIF0gKiBzaGFkb3dXb3JsZFBvc2l0aW9uO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgc2hhZG93bWFza19wYXJzX2ZyYWdtZW50ID0gXCJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xcblxcdGZsb2F0IHNoYWRvdyA9IDEuMDtcXG5cXHQjaWZkZWYgVVNFX1NIQURPV01BUFxcblxcdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXFxuXFx0RGlyZWN0aW9uYWxMaWdodFNoYWRvdyBkaXJlY3Rpb25hbExpZ2h0O1xcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3Bfc3RhcnRcXG5cXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xcblxcdH1cXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX2VuZFxcblxcdCNlbmRpZlxcblxcdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFNwb3RMaWdodFNoYWRvdyBzcG90TGlnaHQ7XFxuXFx0I3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxcblxcdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0U2hhZG93c1sgaSBdO1xcblxcdFxcdHNoYWRvdyAqPSByZWNlaXZlU2hhZG93ID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxcblxcdFBvaW50TGlnaHRTaGFkb3cgcG9pbnRMaWdodDtcXG5cXHQjcHJhZ21hIHVucm9sbF9sb29wX3N0YXJ0XFxuXFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XFxuXFx0XFx0cG9pbnRMaWdodCA9IHBvaW50TGlnaHRTaGFkb3dzWyBpIF07XFxuXFx0XFx0c2hhZG93ICo9IHJlY2VpdmVTaGFkb3cgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XFxuXFx0fVxcblxcdCNwcmFnbWEgdW5yb2xsX2xvb3BfZW5kXFxuXFx0I2VuZGlmXFxuXFx0I2VuZGlmXFxuXFx0cmV0dXJuIHNoYWRvdztcXG59XCI7XG5cbnZhciBza2luYmFzZV92ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfU0tJTk5JTkdcXG5cXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcXG5cXHRtYXQ0IGJvbmVNYXRZID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnkgKTtcXG5cXHRtYXQ0IGJvbmVNYXRaID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnogKTtcXG5cXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XFxuXFx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXhJbnZlcnNlO1xcblxcdCNpZmRlZiBCT05FX1RFWFRVUkVcXG5cXHRcXHR1bmlmb3JtIGhpZ2hwIHNhbXBsZXIyRCBib25lVGV4dHVyZTtcXG5cXHRcXHR1bmlmb3JtIGludCBib25lVGV4dHVyZVNpemU7XFxuXFx0XFx0bWF0NCBnZXRCb25lTWF0cml4KCBjb25zdCBpbiBmbG9hdCBpICkge1xcblxcdFxcdFxcdGZsb2F0IGogPSBpICogNC4wO1xcblxcdFxcdFxcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IHkgPSBmbG9vciggaiAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xcblxcdFxcdFxcdGZsb2F0IGR4ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xcblxcdFxcdFxcdHkgPSBkeSAqICggeSArIDAuNSApO1xcblxcdFxcdFxcdHZlYzQgdjEgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDAuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XFxuXFx0XFx0XFx0dmVjNCB2MyA9IHRleHR1cmUyRCggYm9uZVRleHR1cmUsIHZlYzIoIGR4ICogKCB4ICsgMi41ICksIHkgKSApO1xcblxcdFxcdFxcdHZlYzQgdjQgPSB0ZXh0dXJlMkQoIGJvbmVUZXh0dXJlLCB2ZWMyKCBkeCAqICggeCArIDMuNSApLCB5ICkgKTtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZWxzZVxcblxcdFxcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xcblxcdFxcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcXG5cXHRcXHRcXHRtYXQ0IGJvbmUgPSBib25lTWF0cmljZXNbIGludChpKSBdO1xcblxcdFxcdFxcdHJldHVybiBib25lO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG4jZW5kaWZcIjtcblxudmFyIHNraW5uaW5nX3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9TS0lOTklOR1xcblxcdHZlYzQgc2tpblZlcnRleCA9IGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WCAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lng7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XFxuXFx0c2tpbm5lZCArPSBib25lTWF0VyAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnc7XFxuXFx0dHJhbnNmb3JtZWQgPSAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcXG4jZW5kaWZcIjtcblxudmFyIHNraW5ub3JtYWxfdmVydGV4ID0gXCIjaWZkZWYgVVNFX1NLSU5OSU5HXFxuXFx0bWF0NCBza2luTWF0cml4ID0gbWF0NCggMC4wICk7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcXG5cXHRza2luTWF0cml4ICs9IHNraW5XZWlnaHQueSAqIGJvbmVNYXRZO1xcblxcdHNraW5NYXRyaXggKz0gc2tpbldlaWdodC56ICogYm9uZU1hdFo7XFxuXFx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0VztcXG5cXHRza2luTWF0cml4ID0gYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcXG5cXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHRvYmplY3RUYW5nZW50ID0gdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdFRhbmdlbnQsIDAuMCApICkueHl6O1xcblxcdCNlbmRpZlxcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfZnJhZ21lbnQgPSBcImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XFxuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHZlYzQgdGV4ZWxTcGVjdWxhciA9IHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xcblxcdHNwZWN1bGFyU3RyZW5ndGggPSB0ZXhlbFNwZWN1bGFyLnI7XFxuI2Vsc2VcXG5cXHRzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xcbiNlbmRpZlwiO1xuXG52YXIgc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxcblxcdHVuaWZvcm0gc2FtcGxlcjJEIHNwZWN1bGFyTWFwO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfZnJhZ21lbnQgPSBcIiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxcblxcdGdsX0ZyYWdDb2xvci5yZ2IgPSB0b25lTWFwcGluZyggZ2xfRnJhZ0NvbG9yLnJnYiApO1xcbiNlbmRpZlwiO1xuXG52YXIgdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCA9IFwiI2lmbmRlZiBzYXR1cmF0ZVxcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcXG4jZW5kaWZcXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XFxudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRyZXR1cm4gdG9uZU1hcHBpbmdFeHBvc3VyZSAqIGNvbG9yO1xcbn1cXG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZTtcXG5cXHRyZXR1cm4gc2F0dXJhdGUoIGNvbG9yIC8gKCB2ZWMzKCAxLjAgKSArIGNvbG9yICkgKTtcXG59XFxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcXG5cXHRjb2xvciAqPSB0b25lTWFwcGluZ0V4cG9zdXJlO1xcblxcdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xcblxcdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XFxufVxcbnZlYzMgUlJUQW5kT0RURml0KCB2ZWMzIHYgKSB7XFxuXFx0dmVjMyBhID0gdiAqICggdiArIDAuMDI0NTc4NiApIC0gMC4wMDAwOTA1Mzc7XFxuXFx0dmVjMyBiID0gdiAqICggMC45ODM3MjkgKiB2ICsgMC40MzI5NTEwICkgKyAwLjIzODA4MTtcXG5cXHRyZXR1cm4gYSAvIGI7XFxufVxcbnZlYzMgQUNFU0ZpbG1pY1RvbmVNYXBwaW5nKCB2ZWMzIGNvbG9yICkge1xcblxcdGNvbnN0IG1hdDMgQUNFU0lucHV0TWF0ID0gbWF0MyhcXG5cXHRcXHR2ZWMzKCAwLjU5NzE5LCAwLjA3NjAwLCAwLjAyODQwICksXFx0XFx0dmVjMyggMC4zNTQ1OCwgMC45MDgzNCwgMC4xMzM4MyApLFxcblxcdFxcdHZlYzMoIDAuMDQ4MjMsIDAuMDE1NjYsIDAuODM3NzcgKVxcblxcdCk7XFxuXFx0Y29uc3QgbWF0MyBBQ0VTT3V0cHV0TWF0ID0gbWF0MyhcXG5cXHRcXHR2ZWMzKCAgMS42MDQ3NSwgLTAuMTAyMDgsIC0wLjAwMzI3ICksXFx0XFx0dmVjMyggLTAuNTMxMDgsICAxLjEwODEzLCAtMC4wNzI3NiApLFxcblxcdFxcdHZlYzMoIC0wLjA3MzY3LCAtMC4wMDYwNSwgIDEuMDc2MDIgKVxcblxcdCk7XFxuXFx0Y29sb3IgKj0gdG9uZU1hcHBpbmdFeHBvc3VyZSAvIDAuNjtcXG5cXHRjb2xvciA9IEFDRVNJbnB1dE1hdCAqIGNvbG9yO1xcblxcdGNvbG9yID0gUlJUQW5kT0RURml0KCBjb2xvciApO1xcblxcdGNvbG9yID0gQUNFU091dHB1dE1hdCAqIGNvbG9yO1xcblxcdHJldHVybiBzYXR1cmF0ZSggY29sb3IgKTtcXG59XFxudmVjMyBDdXN0b21Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHsgcmV0dXJuIGNvbG9yOyB9XCI7XG5cbnZhciB0cmFuc21pc3Npb25tYXBfZnJhZ21lbnQgPSBcIiNpZmRlZiBVU0VfVFJBTlNNSVNTSU9OTUFQXFxuXFx0dG90YWxUcmFuc21pc3Npb24gKj0gdGV4dHVyZTJEKCB0cmFuc21pc3Npb25NYXAsIHZVdiApLnI7XFxuI2VuZGlmXCI7XG5cbnZhciB0cmFuc21pc3Npb25tYXBfcGFyc19mcmFnbWVudCA9IFwiI2lmZGVmIFVTRV9UUkFOU01JU1NJT05NQVBcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCB0cmFuc21pc3Npb25NYXA7XFxuI2VuZGlmXCI7XG5cbnZhciB1dl9wYXJzX2ZyYWdtZW50ID0gXCIjaWYgKCBkZWZpbmVkKCBVU0VfVVYgKSAmJiAhIGRlZmluZWQoIFVWU19WRVJURVhfT05MWSApIClcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2O1xcbiNlbmRpZlwiO1xuXG52YXIgdXZfcGFyc192ZXJ0ZXggPSBcIiNpZmRlZiBVU0VfVVZcXG5cXHQjaWZkZWYgVVZTX1ZFUlRFWF9PTkxZXFxuXFx0XFx0dmVjMiB2VXY7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2YXJ5aW5nIHZlYzIgdlV2O1xcblxcdCNlbmRpZlxcblxcdHVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcXG4jZW5kaWZcIjtcblxudmFyIHV2X3ZlcnRleCA9IFwiI2lmZGVmIFVTRV9VVlxcblxcdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc19mcmFnbWVudCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dmFyeWluZyB2ZWMyIHZVdjI7XFxuI2VuZGlmXCI7XG5cbnZhciB1djJfcGFyc192ZXJ0ZXggPSBcIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxcblxcdGF0dHJpYnV0ZSB2ZWMyIHV2MjtcXG5cXHR2YXJ5aW5nIHZlYzIgdlV2MjtcXG5cXHR1bmlmb3JtIG1hdDMgdXYyVHJhbnNmb3JtO1xcbiNlbmRpZlwiO1xuXG52YXIgdXYyX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXFxuXFx0dlV2MiA9ICggdXYyVHJhbnNmb3JtICogdmVjMyggdXYyLCAxICkgKS54eTtcXG4jZW5kaWZcIjtcblxudmFyIHdvcmxkcG9zX3ZlcnRleCA9IFwiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcXG5cXHR2ZWM0IHdvcmxkUG9zaXRpb24gPSB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XFxuXFx0I2lmZGVmIFVTRV9JTlNUQU5DSU5HXFxuXFx0XFx0d29ybGRQb3NpdGlvbiA9IGluc3RhbmNlTWF0cml4ICogd29ybGRQb3NpdGlvbjtcXG5cXHQjZW5kaWZcXG5cXHR3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB3b3JsZFBvc2l0aW9uO1xcbiNlbmRpZlwiO1xuXG52YXIgYmFja2dyb3VuZF9mcmFnID0gXCJ1bmlmb3JtIHNhbXBsZXIyRCB0MkQ7XFxudmFyeWluZyB2ZWMyIHZVdjtcXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcXG5cXHRnbF9GcmFnQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhDb2xvciApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIGJhY2tncm91bmRfdmVydCA9IFwidmFyeWluZyB2ZWMyIHZVdjtcXG51bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XFxudm9pZCBtYWluKCkge1xcblxcdHZVdiA9ICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCB1diwgMSApICkueHk7XFxuXFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcXG59XCI7XG5cbnZhciBjdWJlX2ZyYWcgPSBcIiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyB2UmVmbGVjdCA9IHZXb3JsZERpcmVjdGlvbjtcXG5cXHQjaW5jbHVkZSA8ZW52bWFwX2ZyYWdtZW50PlxcblxcdGdsX0ZyYWdDb2xvciA9IGVudkNvbG9yO1xcblxcdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgY3ViZV92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XFxufVwiO1xuXG52YXIgZGVwdGhfZnJhZyA9IFwiI2lmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMFxcblxcdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudmFyeWluZyB2ZWMyIHZIaWdoUHJlY2lzaW9uWlc7XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCAxLjAgKTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdGZsb2F0IGZyYWdDb29yZFogPSAwLjUgKiB2SGlnaFByZWNpc2lvblpXWzBdIC8gdkhpZ2hQcmVjaXNpb25aV1sxXSArIDAuNTtcXG5cXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggdmVjMyggMS4wIC0gZnJhZ0Nvb3JkWiApLCBvcGFjaXR5ICk7XFxuXFx0I2VsaWYgREVQVEhfUEFDS0lORyA9PSAzMjAxXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBmcmFnQ29vcmRaICk7XFxuXFx0I2VuZGlmXFxufVwiO1xuXG52YXIgZGVwdGhfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZhcnlpbmcgdmVjMiB2SGlnaFByZWNpc2lvblpXO1xcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZIaWdoUHJlY2lzaW9uWlcgPSBnbF9Qb3NpdGlvbi56dztcXG59XCI7XG5cbnZhciBkaXN0YW5jZVJHQkFfZnJhZyA9IFwiI2RlZmluZSBESVNUQU5DRVxcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcXG51bmlmb3JtIGZsb2F0IG5lYXJEaXN0YW5jZTtcXG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluICgpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRmbG9hdCBkaXN0ID0gbGVuZ3RoKCB2V29ybGRQb3NpdGlvbiAtIHJlZmVyZW5jZVBvc2l0aW9uICk7XFxuXFx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xcblxcdGRpc3QgPSBzYXR1cmF0ZSggZGlzdCApO1xcblxcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZGlzdCApO1xcbn1cIjtcblxudmFyIGRpc3RhbmNlUkdCQV92ZXJ0ID0gXCIjZGVmaW5lIERJU1RBTkNFXFxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcXG5cXHRcXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdFxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0XFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XFxufVwiO1xuXG52YXIgZXF1aXJlY3RfZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgdEVxdWlyZWN0O1xcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG52b2lkIG1haW4oKSB7XFxuXFx0dmVjMyBkaXJlY3Rpb24gPSBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xcblxcdHZlYzIgc2FtcGxlVVYgPSBlcXVpcmVjdFV2KCBkaXJlY3Rpb24gKTtcXG5cXHR2ZWM0IHRleENvbG9yID0gdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBlcXVpcmVjdF92ZXJ0ID0gXCJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xcbiNpbmNsdWRlIDxjb21tb24+XFxudm9pZCBtYWluKCkge1xcblxcdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxufVwiO1xuXG52YXIgbGluZWRhc2hlZF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxudW5pZm9ybSBmbG9hdCBkYXNoU2l6ZTtcXG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcXG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdGlmICggbW9kKCB2TGluZURpc3RhbmNlLCB0b3RhbFNpemUgKSA+IGRhc2hTaXplICkge1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIGxpbmVkYXNoZWRfdmVydCA9IFwidW5pZm9ybSBmbG9hdCBzY2FsZTtcXG5hdHRyaWJ1dGUgZmxvYXQgbGluZURpc3RhbmNlO1xcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0dkxpbmVEaXN0YW5jZSA9IHNjYWxlICogbGluZURpc3RhbmNlO1xcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hiYXNpY19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHQjaWZkZWYgVVNFX0xJR0hUTUFQXFxuXFx0XFxuXFx0XFx0dmVjNCBsaWdodE1hcFRleGVsPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICk7XFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IGxpZ2h0TWFwVGV4ZWxUb0xpbmVhciggbGlnaHRNYXBUZXhlbCApLnJnYiAqIGxpZ2h0TWFwSW50ZW5zaXR5O1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZlYzMoIDEuMCApO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNoYmFzaWNfdmVydCA9IFwiI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpZmRlZiBVU0VfRU5WTUFQXFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNobGFtYmVydF9mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcXG52YXJ5aW5nIHZlYzMgdkluZGlyZWN0RnJvbnQ7XFxuI2lmZGVmIERPVUJMRV9TSURFRFxcblxcdHZhcnlpbmcgdmVjMyB2TGlnaHRCYWNrO1xcblxcdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hc2tfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxcblxcdCNpZmRlZiBET1VCTEVfU0lERURcXG5cXHRcXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gKCBnbF9Gcm9udEZhY2luZyApID8gdkluZGlyZWN0RnJvbnQgOiB2SW5kaXJlY3RCYWNrO1xcblxcdCNlbHNlXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHZJbmRpcmVjdEZyb250O1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsaWdodG1hcF9mcmFnbWVudD5cXG5cXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKj0gQlJERl9EaWZmdXNlX0xhbWJlcnQoIGRpZmZ1c2VDb2xvci5yZ2IgKTtcXG5cXHQjaWZkZWYgRE9VQkxFX1NJREVEXFxuXFx0XFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcXG5cXHQjZWxzZVxcblxcdFxcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgPSB2TGlnaHRGcm9udDtcXG5cXHQjZW5kaWZcXG5cXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XFxuXFx0I2luY2x1ZGUgPGFvbWFwX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XFxuXFx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobGFtYmVydF92ZXJ0ID0gXCIjZGVmaW5lIExBTUJFUlRcXG52YXJ5aW5nIHZlYzMgdkxpZ2h0RnJvbnQ7XFxudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xcbiNpZmRlZiBET1VCTEVfU0lERURcXG5cXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcXG5cXHR2YXJ5aW5nIHZlYzMgdkluZGlyZWN0QmFjaztcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGVudm1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX2ZyYWcgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdHZlYzMgdmlld0RpciA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xcblxcdHZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcXG5cXHR2ZWMzIHkgPSBjcm9zcyggdmlld0RpciwgeCApO1xcblxcdHZlYzIgdXYgPSB2ZWMyKCBkb3QoIHgsIG5vcm1hbCApLCBkb3QoIHksIG5vcm1hbCApICkgKiAwLjQ5NSArIDAuNTtcXG5cXHQjaWZkZWYgVVNFX01BVENBUFxcblxcdFxcdHZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcXG5cXHRcXHRtYXRjYXBDb2xvciA9IG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XFxuXFx0I2Vsc2VcXG5cXHRcXHR2ZWM0IG1hdGNhcENvbG9yID0gdmVjNCggMS4wICk7XFxuXFx0I2VuZGlmXFxuXFx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNobWF0Y2FwX3ZlcnQgPSBcIiNkZWZpbmUgTUFUQ0FQXFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdFxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxufVwiO1xuXG52YXIgbWVzaHRvb25fZnJhZyA9IFwiI2RlZmluZSBUT09OXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfdG9vbl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XFxuXFx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XFxuXFx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcXG5cXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X2JlZ2luPlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c190b29uX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZGl0aGVyaW5nX2ZyYWdtZW50Plxcbn1cIjtcblxudmFyIG1lc2h0b29uX3ZlcnQgPSBcIiNkZWZpbmUgVE9PTlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hwaG9uZ19mcmFnID0gXCIjZGVmaW5lIFBIT05HXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcXG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YnNkZnM+XFxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxcbiNpbmNsdWRlIDxsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XFxuXFx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcXG5cXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgbWVzaHBob25nX3ZlcnQgPSBcIiNkZWZpbmUgUEhPTkdcXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxlbnZtYXBfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxcblxcdCNpbmNsdWRlIDx1djJfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gXCIjZGVmaW5lIFNUQU5EQVJEXFxuI2lmZGVmIFBIWVNJQ0FMXFxuXFx0I2RlZmluZSBSRUZMRUNUSVZJVFlcXG5cXHQjZGVmaW5lIENMRUFSQ09BVFxcblxcdCNkZWZpbmUgVFJBTlNNSVNTSU9OXFxuI2VuZGlmXFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XFxudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xcbnVuaWZvcm0gZmxvYXQgbWV0YWxuZXNzO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaWZkZWYgVFJBTlNNSVNTSU9OXFxuXFx0dW5pZm9ybSBmbG9hdCB0cmFuc21pc3Npb247XFxuI2VuZGlmXFxuI2lmZGVmIFJFRkxFQ1RJVklUWVxcblxcdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xcbiNlbmRpZlxcbiNpZmRlZiBDTEVBUkNPQVRcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdDtcXG5cXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcXG4jZW5kaWZcXG4jaWZkZWYgVVNFX1NIRUVOXFxuXFx0dW5pZm9ybSB2ZWMzIHNoZWVuO1xcbiNlbmRpZlxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8cGFja2luZz5cXG4jaW5jbHVkZSA8ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YW9tYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8dHJhbnNtaXNzaW9ubWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGJzZGZzPlxcbiNpbmNsdWRlIDxjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cXG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGVhcmNvYXRfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xcblxcdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XFxuXFx0I2lmZGVmIFRSQU5TTUlTU0lPTlxcblxcdFxcdGZsb2F0IHRvdGFsVHJhbnNtaXNzaW9uID0gdHJhbnNtaXNzaW9uO1xcblxcdCNlbmRpZlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8cm91Z2huZXNzbWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cXG5cXHQjaW5jbHVkZSA8ZW1pc3NpdmVtYXBfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHRyYW5zbWlzc2lvbm1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfYmVnaW4+XFxuXFx0I2luY2x1ZGUgPGxpZ2h0c19mcmFnbWVudF9tYXBzPlxcblxcdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxcblxcdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xcblxcdCNpZmRlZiBUUkFOU01JU1NJT05cXG5cXHRcXHRkaWZmdXNlQ29sb3IuYSAqPSBtaXgoIHNhdHVyYXRlKCAxLiAtIHRvdGFsVHJhbnNtaXNzaW9uICsgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICkgKSwgMS4wLCBtZXRhbG5lc3MgKTtcXG5cXHQjZW5kaWZcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBtZXNocGh5c2ljYWxfdmVydCA9IFwiI2RlZmluZSBTVEFOREFSRFxcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNpZm5kZWYgRkxBVF9TSEFERURcXG5cXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dlRhbmdlbnQgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xcblxcdFxcdHZCaXRhbmdlbnQgPSBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XFxuXFx0I2VuZGlmXFxuI2VuZGlmXFxuXFx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XFxuXFx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XFxuXFx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbnZhciBub3JtYWxfZnJhZyA9IFwiI2RlZmluZSBOT1JNQUxcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcXG5cXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcXG4jZW5kaWZcXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuXFx0I2lmZGVmIFVTRV9UQU5HRU5UXFxuXFx0XFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xcblxcdFxcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xcblxcdCNlbmRpZlxcbiNlbmRpZlxcbiNpbmNsdWRlIDxwYWNraW5nPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxidW1wbWFwX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cXG5cXHQjaW5jbHVkZSA8bm9ybWFsX2ZyYWdtZW50X21hcHM+XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xcbn1cIjtcblxudmFyIG5vcm1hbF92ZXJ0ID0gXCIjZGVmaW5lIE5PUk1BTFxcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuI2lmbmRlZiBGTEFUX1NIQURFRFxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcblxcdCNpZmRlZiBVU0VfVEFOR0VOVFxcblxcdFxcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcXG5cXHRcXHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cXG4jaWZuZGVmIEZMQVRfU0hBREVEXFxuXFx0dk5vcm1hbCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcXG5cXHQjaWZkZWYgVVNFX1RBTkdFTlRcXG5cXHRcXHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XFxuXFx0XFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcXG5cXHQjZW5kaWZcXG4jZW5kaWZcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxcblxcdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xcbiNlbmRpZlxcbn1cIjtcblxudmFyIHBvaW50c19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XFxuI2luY2x1ZGUgPGNvbW1vbj5cXG4jaW5jbHVkZSA8Y29sb3JfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8bWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cXG52b2lkIG1haW4oKSB7XFxuXFx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cXG5cXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcXG5cXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcXG5cXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cXG5cXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcXG5cXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgcG9pbnRzX3ZlcnQgPSBcInVuaWZvcm0gZmxvYXQgc2l6ZTtcXG51bmlmb3JtIGZsb2F0IHNjYWxlO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XFxuXFx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcXG5cXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxcblxcdFxcdGJvb2wgaXNQZXJzcGVjdGl2ZSA9IGlzUGVyc3BlY3RpdmVNYXRyaXgoIHByb2plY3Rpb25NYXRyaXggKTtcXG5cXHRcXHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKj0gKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XFxuXFx0I2VuZGlmXFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxmb2dfdmVydGV4Plxcbn1cIjtcblxudmFyIHNoYWRvd19mcmFnID0gXCJ1bmlmb3JtIHZlYzMgY29sb3I7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxic2Rmcz5cXG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XFxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XFxudm9pZCBtYWluKCkge1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xcblxcdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XFxufVwiO1xuXG52YXIgc2hhZG93X3ZlcnQgPSBcIiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cXG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxcblxcdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxcblxcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XFxuXFx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XFxufVwiO1xuXG52YXIgc3ByaXRlX2ZyYWcgPSBcInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG4jaW5jbHVkZSA8Y29tbW9uPlxcbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxcbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cXG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XFxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50PlxcbnZvaWQgbWFpbigpIHtcXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxcblxcdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xcblxcdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xcblxcdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cXG5cXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxcblxcdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xcblxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XFxuXFx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxcblxcdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XFxuXFx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cXG59XCI7XG5cbnZhciBzcHJpdGVfdmVydCA9IFwidW5pZm9ybSBmbG9hdCByb3RhdGlvbjtcXG51bmlmb3JtIHZlYzIgY2VudGVyO1xcbiNpbmNsdWRlIDxjb21tb24+XFxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XFxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxcbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XFxudm9pZCBtYWluKCkge1xcblxcdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XFxuXFx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XFxuXFx0dmVjMiBzY2FsZTtcXG5cXHRzY2FsZS54ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMCBdLngsIG1vZGVsTWF0cml4WyAwIF0ueSwgbW9kZWxNYXRyaXhbIDAgXS56ICkgKTtcXG5cXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcXG5cXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cXG5cXHRcXHRib29sIGlzUGVyc3BlY3RpdmUgPSBpc1BlcnNwZWN0aXZlTWF0cml4KCBwcm9qZWN0aW9uTWF0cml4ICk7XFxuXFx0XFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKj0gLSBtdlBvc2l0aW9uLno7XFxuXFx0I2VuZGlmXFxuXFx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcXG5cXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcXG5cXHRyb3RhdGVkUG9zaXRpb24ueCA9IGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54IC0gc2luKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XFxuXFx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xcblxcdG12UG9zaXRpb24ueHkgKz0gcm90YXRlZFBvc2l0aW9uO1xcblxcdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG12UG9zaXRpb247XFxuXFx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cXG5cXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cXG59XCI7XG5cbmNvbnN0IFNoYWRlckNodW5rID0ge1xuXHRhbHBoYW1hcF9mcmFnbWVudDogYWxwaGFtYXBfZnJhZ21lbnQsXG5cdGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ6IGFscGhhbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LFxuXHRhb21hcF9mcmFnbWVudDogYW9tYXBfZnJhZ21lbnQsXG5cdGFvbWFwX3BhcnNfZnJhZ21lbnQ6IGFvbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LFxuXHRiZWdpbm5vcm1hbF92ZXJ0ZXg6IGJlZ2lubm9ybWFsX3ZlcnRleCxcblx0YnNkZnM6IGJzZGZzLFxuXHRidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQsXG5cdGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50OiBjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudCxcblx0Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsXG5cdGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXgsXG5cdGNvbG9yX2ZyYWdtZW50OiBjb2xvcl9mcmFnbWVudCxcblx0Y29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCxcblx0Y29sb3JfcGFyc192ZXJ0ZXg6IGNvbG9yX3BhcnNfdmVydGV4LFxuXHRjb2xvcl92ZXJ0ZXg6IGNvbG9yX3ZlcnRleCxcblx0Y29tbW9uOiBjb21tb24sXG5cdGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudDogY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50LFxuXHRkZWZhdWx0bm9ybWFsX3ZlcnRleDogZGVmYXVsdG5vcm1hbF92ZXJ0ZXgsXG5cdGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LFxuXHRkaXNwbGFjZW1lbnRtYXBfdmVydGV4OiBkaXNwbGFjZW1lbnRtYXBfdmVydGV4LFxuXHRlbWlzc2l2ZW1hcF9mcmFnbWVudDogZW1pc3NpdmVtYXBfZnJhZ21lbnQsXG5cdGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsXG5cdGVuY29kaW5nc19mcmFnbWVudDogZW5jb2RpbmdzX2ZyYWdtZW50LFxuXHRlbmNvZGluZ3NfcGFyc19mcmFnbWVudDogZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQsXG5cdGVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LFxuXHRlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudCxcblx0ZW52bWFwX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCxcblx0ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50LFxuXHRlbnZtYXBfdmVydGV4OiBlbnZtYXBfdmVydGV4LFxuXHRmb2dfdmVydGV4OiBmb2dfdmVydGV4LFxuXHRmb2dfcGFyc192ZXJ0ZXg6IGZvZ19wYXJzX3ZlcnRleCxcblx0Zm9nX2ZyYWdtZW50OiBmb2dfZnJhZ21lbnQsXG5cdGZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCxcblx0Z3JhZGllbnRtYXBfcGFyc19mcmFnbWVudDogZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudCxcblx0bGlnaHRtYXBfZnJhZ21lbnQ6IGxpZ2h0bWFwX2ZyYWdtZW50LFxuXHRsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LFxuXHRsaWdodHNfbGFtYmVydF92ZXJ0ZXg6IGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCxcblx0bGlnaHRzX3BhcnNfYmVnaW46IGxpZ2h0c19wYXJzX2JlZ2luLFxuXHRsaWdodHNfdG9vbl9mcmFnbWVudDogbGlnaHRzX3Rvb25fZnJhZ21lbnQsXG5cdGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c190b29uX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waG9uZ19mcmFnbWVudDogbGlnaHRzX3Bob25nX2ZyYWdtZW50LFxuXHRsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19waHlzaWNhbF9mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50LFxuXHRsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsXG5cdGxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLFxuXHRsaWdodHNfZnJhZ21lbnRfbWFwczogbGlnaHRzX2ZyYWdtZW50X21hcHMsXG5cdGxpZ2h0c19mcmFnbWVudF9lbmQ6IGxpZ2h0c19mcmFnbWVudF9lbmQsXG5cdGxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudDogbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCxcblx0bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4LFxuXHRsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCxcblx0bWFwX2ZyYWdtZW50OiBtYXBfZnJhZ21lbnQsXG5cdG1hcF9wYXJzX2ZyYWdtZW50OiBtYXBfcGFyc19mcmFnbWVudCxcblx0bWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsXG5cdG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudCxcblx0bWV0YWxuZXNzbWFwX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfZnJhZ21lbnQsXG5cdG1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCxcblx0bW9ycGhub3JtYWxfdmVydGV4OiBtb3JwaG5vcm1hbF92ZXJ0ZXgsXG5cdG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4OiBtb3JwaHRhcmdldF9wYXJzX3ZlcnRleCxcblx0bW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsXG5cdG5vcm1hbF9mcmFnbWVudF9iZWdpbjogbm9ybWFsX2ZyYWdtZW50X2JlZ2luLFxuXHRub3JtYWxfZnJhZ21lbnRfbWFwczogbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCxcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbjogY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbixcblx0Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMsXG5cdGNsZWFyY29hdF9wYXJzX2ZyYWdtZW50OiBjbGVhcmNvYXRfcGFyc19mcmFnbWVudCxcblx0cGFja2luZzogcGFja2luZyxcblx0cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCxcblx0cHJvamVjdF92ZXJ0ZXg6IHByb2plY3RfdmVydGV4LFxuXHRkaXRoZXJpbmdfZnJhZ21lbnQ6IGRpdGhlcmluZ19mcmFnbWVudCxcblx0ZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LFxuXHRyb3VnaG5lc3NtYXBfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9mcmFnbWVudCxcblx0cm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IHJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50LFxuXHRzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsXG5cdHNoYWRvd21hcF9wYXJzX3ZlcnRleDogc2hhZG93bWFwX3BhcnNfdmVydGV4LFxuXHRzaGFkb3dtYXBfdmVydGV4OiBzaGFkb3dtYXBfdmVydGV4LFxuXHRzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCxcblx0c2tpbmJhc2VfdmVydGV4OiBza2luYmFzZV92ZXJ0ZXgsXG5cdHNraW5uaW5nX3BhcnNfdmVydGV4OiBza2lubmluZ19wYXJzX3ZlcnRleCxcblx0c2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsXG5cdHNraW5ub3JtYWxfdmVydGV4OiBza2lubm9ybWFsX3ZlcnRleCxcblx0c3BlY3VsYXJtYXBfZnJhZ21lbnQ6IHNwZWN1bGFybWFwX2ZyYWdtZW50LFxuXHRzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LFxuXHR0b25lbWFwcGluZ19mcmFnbWVudDogdG9uZW1hcHBpbmdfZnJhZ21lbnQsXG5cdHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IHRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQsXG5cdHRyYW5zbWlzc2lvbm1hcF9mcmFnbWVudDogdHJhbnNtaXNzaW9ubWFwX2ZyYWdtZW50LFxuXHR0cmFuc21pc3Npb25tYXBfcGFyc19mcmFnbWVudDogdHJhbnNtaXNzaW9ubWFwX3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsXG5cdHV2X3BhcnNfdmVydGV4OiB1dl9wYXJzX3ZlcnRleCxcblx0dXZfdmVydGV4OiB1dl92ZXJ0ZXgsXG5cdHV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCxcblx0dXYyX3BhcnNfdmVydGV4OiB1djJfcGFyc192ZXJ0ZXgsXG5cdHV2Ml92ZXJ0ZXg6IHV2Ml92ZXJ0ZXgsXG5cdHdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LFxuXG5cdGJhY2tncm91bmRfZnJhZzogYmFja2dyb3VuZF9mcmFnLFxuXHRiYWNrZ3JvdW5kX3ZlcnQ6IGJhY2tncm91bmRfdmVydCxcblx0Y3ViZV9mcmFnOiBjdWJlX2ZyYWcsXG5cdGN1YmVfdmVydDogY3ViZV92ZXJ0LFxuXHRkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLFxuXHRkZXB0aF92ZXJ0OiBkZXB0aF92ZXJ0LFxuXHRkaXN0YW5jZVJHQkFfZnJhZzogZGlzdGFuY2VSR0JBX2ZyYWcsXG5cdGRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCxcblx0ZXF1aXJlY3RfZnJhZzogZXF1aXJlY3RfZnJhZyxcblx0ZXF1aXJlY3RfdmVydDogZXF1aXJlY3RfdmVydCxcblx0bGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsXG5cdGxpbmVkYXNoZWRfdmVydDogbGluZWRhc2hlZF92ZXJ0LFxuXHRtZXNoYmFzaWNfZnJhZzogbWVzaGJhc2ljX2ZyYWcsXG5cdG1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCxcblx0bWVzaGxhbWJlcnRfZnJhZzogbWVzaGxhbWJlcnRfZnJhZyxcblx0bWVzaGxhbWJlcnRfdmVydDogbWVzaGxhbWJlcnRfdmVydCxcblx0bWVzaG1hdGNhcF9mcmFnOiBtZXNobWF0Y2FwX2ZyYWcsXG5cdG1lc2htYXRjYXBfdmVydDogbWVzaG1hdGNhcF92ZXJ0LFxuXHRtZXNodG9vbl9mcmFnOiBtZXNodG9vbl9mcmFnLFxuXHRtZXNodG9vbl92ZXJ0OiBtZXNodG9vbl92ZXJ0LFxuXHRtZXNocGhvbmdfZnJhZzogbWVzaHBob25nX2ZyYWcsXG5cdG1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCxcblx0bWVzaHBoeXNpY2FsX2ZyYWc6IG1lc2hwaHlzaWNhbF9mcmFnLFxuXHRtZXNocGh5c2ljYWxfdmVydDogbWVzaHBoeXNpY2FsX3ZlcnQsXG5cdG5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZyxcblx0bm9ybWFsX3ZlcnQ6IG5vcm1hbF92ZXJ0LFxuXHRwb2ludHNfZnJhZzogcG9pbnRzX2ZyYWcsXG5cdHBvaW50c192ZXJ0OiBwb2ludHNfdmVydCxcblx0c2hhZG93X2ZyYWc6IHNoYWRvd19mcmFnLFxuXHRzaGFkb3dfdmVydDogc2hhZG93X3ZlcnQsXG5cdHNwcml0ZV9mcmFnOiBzcHJpdGVfZnJhZyxcblx0c3ByaXRlX3ZlcnQ6IHNwcml0ZV92ZXJ0XG59O1xuXG4vKipcbiAqIFVuaWZvcm1zIGxpYnJhcnkgZm9yIHNoYXJlZCB3ZWJnbCBzaGFkZXJzXG4gKi9cblxuY29uc3QgVW5pZm9ybXNMaWIgPSB7XG5cblx0Y29tbW9uOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0dXYyVHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cblx0XHRhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXG5cdH0sXG5cblx0c3BlY3VsYXJtYXA6IHtcblxuXHRcdHNwZWN1bGFyTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cblx0fSxcblxuXHRlbnZtYXA6IHtcblxuXHRcdGVudk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGZsaXBFbnZNYXA6IHsgdmFsdWU6IC0gMSB9LFxuXHRcdHJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0cmVmcmFjdGlvblJhdGlvOiB7IHZhbHVlOiAwLjk4IH0sXG5cdFx0bWF4TWlwTGV2ZWw6IHsgdmFsdWU6IDAgfVxuXG5cdH0sXG5cblx0YW9tYXA6IHtcblxuXHRcdGFvTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0YW9NYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bGlnaHRtYXA6IHtcblxuXHRcdGxpZ2h0TWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0bGlnaHRNYXBJbnRlbnNpdHk6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0ZW1pc3NpdmVtYXA6IHtcblxuXHRcdGVtaXNzaXZlTWFwOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdGJ1bXBtYXA6IHtcblxuXHRcdGJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRidW1wU2NhbGU6IHsgdmFsdWU6IDEgfVxuXG5cdH0sXG5cblx0bm9ybWFsbWFwOiB7XG5cblx0XHRub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRub3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9XG5cblx0fSxcblxuXHRkaXNwbGFjZW1lbnRtYXA6IHtcblxuXHRcdGRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGRpc3BsYWNlbWVudFNjYWxlOiB7IHZhbHVlOiAxIH0sXG5cdFx0ZGlzcGxhY2VtZW50QmlhczogeyB2YWx1ZTogMCB9XG5cblx0fSxcblxuXHRyb3VnaG5lc3NtYXA6IHtcblxuXHRcdHJvdWdobmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRtZXRhbG5lc3NtYXA6IHtcblxuXHRcdG1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9XG5cblx0fSxcblxuXHRncmFkaWVudG1hcDoge1xuXG5cdFx0Z3JhZGllbnRNYXA6IHsgdmFsdWU6IG51bGwgfVxuXG5cdH0sXG5cblx0Zm9nOiB7XG5cblx0XHRmb2dEZW5zaXR5OiB7IHZhbHVlOiAwLjAwMDI1IH0sXG5cdFx0Zm9nTmVhcjogeyB2YWx1ZTogMSB9LFxuXHRcdGZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LFxuXHRcdGZvZ0NvbG9yOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZmZmZmZmICkgfVxuXG5cdH0sXG5cblx0bGlnaHRzOiB7XG5cblx0XHRhbWJpZW50TGlnaHRDb2xvcjogeyB2YWx1ZTogW10gfSxcblxuXHRcdGxpZ2h0UHJvYmU6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGRpcmVjdGlvbjoge30sXG5cdFx0XHRjb2xvcjoge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbExpZ2h0U2hhZG93czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdHNoYWRvd0JpYXM6IHt9LFxuXHRcdFx0c2hhZG93Tm9ybWFsQmlhczoge30sXG5cdFx0XHRzaGFkb3dSYWRpdXM6IHt9LFxuXHRcdFx0c2hhZG93TWFwU2l6ZToge31cblx0XHR9IH0sXG5cblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHNwb3RMaWdodHM6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRjb2xvcjoge30sXG5cdFx0XHRwb3NpdGlvbjoge30sXG5cdFx0XHRkaXJlY3Rpb246IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9LFxuXHRcdFx0Y29uZUNvczoge30sXG5cdFx0XHRwZW51bWJyYUNvczoge30sXG5cdFx0XHRkZWNheToge31cblx0XHR9IH0sXG5cblx0XHRzcG90TGlnaHRTaGFkb3dzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0c2hhZG93Qmlhczoge30sXG5cdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiB7fSxcblx0XHRcdHNoYWRvd1JhZGl1czoge30sXG5cdFx0XHRzaGFkb3dNYXBTaXplOiB7fVxuXHRcdH0gfSxcblxuXHRcdHNwb3RTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0c3BvdFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSxcblxuXHRcdHBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0Y29sb3I6IHt9LFxuXHRcdFx0cG9zaXRpb246IHt9LFxuXHRcdFx0ZGVjYXk6IHt9LFxuXHRcdFx0ZGlzdGFuY2U6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRMaWdodFNoYWRvd3M6IHsgdmFsdWU6IFtdLCBwcm9wZXJ0aWVzOiB7XG5cdFx0XHRzaGFkb3dCaWFzOiB7fSxcblx0XHRcdHNoYWRvd05vcm1hbEJpYXM6IHt9LFxuXHRcdFx0c2hhZG93UmFkaXVzOiB7fSxcblx0XHRcdHNoYWRvd01hcFNpemU6IHt9LFxuXHRcdFx0c2hhZG93Q2FtZXJhTmVhcjoge30sXG5cdFx0XHRzaGFkb3dDYW1lcmFGYXI6IHt9XG5cdFx0fSB9LFxuXG5cdFx0cG9pbnRTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sXG5cdFx0cG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sXG5cblx0XHRoZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczoge1xuXHRcdFx0ZGlyZWN0aW9uOiB7fSxcblx0XHRcdHNreUNvbG9yOiB7fSxcblx0XHRcdGdyb3VuZENvbG9yOiB7fVxuXHRcdH0gfSxcblxuXHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBSZWN0QXJlYUxpZ2h0IEJSREYgZGF0YSBuZWVkcyB0byBiZSBtb3ZlZCBmcm9tIGV4YW1wbGUgdG8gbWFpbiBzcmNcblx0XHRyZWN0QXJlYUxpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHtcblx0XHRcdGNvbG9yOiB7fSxcblx0XHRcdHBvc2l0aW9uOiB7fSxcblx0XHRcdHdpZHRoOiB7fSxcblx0XHRcdGhlaWdodDoge31cblx0XHR9IH0sXG5cblx0XHRsdGNfMTogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGx0Y18yOiB7IHZhbHVlOiBudWxsIH1cblxuXHR9LFxuXG5cdHBvaW50czoge1xuXG5cdFx0ZGlmZnVzZTogeyB2YWx1ZTogbmV3IENvbG9yKCAweGVlZWVlZSApIH0sXG5cdFx0b3BhY2l0eTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2l6ZTogeyB2YWx1ZTogMS4wIH0sXG5cdFx0c2NhbGU6IHsgdmFsdWU6IDEuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH0sXG5cblx0c3ByaXRlOiB7XG5cblx0XHRkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4ZWVlZWVlICkgfSxcblx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSxcblx0XHRjZW50ZXI6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApIH0sXG5cdFx0cm90YXRpb246IHsgdmFsdWU6IDAuMCB9LFxuXHRcdG1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdGFscGhhTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0dXZUcmFuc2Zvcm06IHsgdmFsdWU6IG5ldyBNYXRyaXgzKCkgfVxuXG5cdH1cblxufTtcblxuY29uc3QgU2hhZGVyTGliID0ge1xuXG5cdGJhc2ljOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaGJhc2ljX2ZyYWdcblxuXHR9LFxuXG5cdGxhbWJlcnQ6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnXG5cblx0fSxcblxuXHRwaG9uZzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLnNwZWN1bGFybWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW52bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYW9tYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmVtaXNzaXZlbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdHtcblx0XHRcdFx0ZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMDAgKSB9LFxuXHRcdFx0XHRzcGVjdWxhcjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDExMTExMSApIH0sXG5cdFx0XHRcdHNoaW5pbmVzczogeyB2YWx1ZTogMzAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaG9uZ19mcmFnXG5cblx0fSxcblxuXHRzdGFuZGFyZDoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmNvbW1vbixcblx0XHRcdFVuaWZvcm1zTGliLmVudm1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmFvbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubGlnaHRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmJ1bXBtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfSxcblx0XHRcdFx0cm91Z2huZXNzOiB7IHZhbHVlOiAxLjAgfSxcblx0XHRcdFx0bWV0YWxuZXNzOiB7IHZhbHVlOiAwLjAgfSxcblx0XHRcdFx0ZW52TWFwSW50ZW5zaXR5OiB7IHZhbHVlOiAxIH0gLy8gdGVtcG9yYXJ5XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWdcblxuXHR9LFxuXG5cdHRvb246IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5hb21hcCxcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2csXG5cdFx0XHRVbmlmb3Jtc0xpYi5saWdodHMsXG5cdFx0XHR7XG5cdFx0XHRcdGVtaXNzaXZlOiB7IHZhbHVlOiBuZXcgQ29sb3IoIDB4MDAwMDAwICkgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHRvb25fZnJhZ1xuXG5cdH0sXG5cblx0bWF0Y2FwOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuYnVtcG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLm5vcm1hbG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0bWF0Y2FwOiB7IHZhbHVlOiBudWxsIH1cblx0XHRcdH1cblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaG1hdGNhcF9mcmFnXG5cblx0fSxcblxuXHRwb2ludHM6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5wb2ludHMsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c192ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfZnJhZ1xuXG5cdH0sXG5cblx0ZGFzaGVkOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZm9nLFxuXHRcdFx0e1xuXHRcdFx0XHRzY2FsZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRkYXNoU2l6ZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHR0b3RhbFNpemU6IHsgdmFsdWU6IDIgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubGluZWRhc2hlZF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWdcblxuXHR9LFxuXG5cdGRlcHRoOiB7XG5cblx0XHR1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggW1xuXHRcdFx0VW5pZm9ybXNMaWIuY29tbW9uLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwXG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF9mcmFnXG5cblx0fSxcblxuXHRub3JtYWw6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5idW1wbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIubm9ybWFsbWFwLFxuXHRcdFx0VW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLFxuXHRcdFx0e1xuXHRcdFx0XHRvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfVxuXHRcdFx0fVxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm5vcm1hbF9mcmFnXG5cblx0fSxcblxuXHRzcHJpdGU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5zcHJpdGUsXG5cdFx0XHRVbmlmb3Jtc0xpYi5mb2dcblx0XHRdICksXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLnNwcml0ZV92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfZnJhZ1xuXG5cdH0sXG5cblx0YmFja2dyb3VuZDoge1xuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdHV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sXG5cdFx0XHR0MkQ6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5iYWNrZ3JvdW5kX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfZnJhZ1xuXG5cdH0sXG5cdC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly9cdEN1YmUgbWFwIHNoYWRlclxuXHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdGN1YmU6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5lbnZtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5jdWJlX3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZ1xuXG5cdH0sXG5cblx0ZXF1aXJlY3Q6IHtcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHR0RXF1aXJlY3Q6IHsgdmFsdWU6IG51bGwgfSxcblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LFxuXHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF9mcmFnXG5cblx0fSxcblxuXHRkaXN0YW5jZVJHQkE6IHtcblxuXHRcdHVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbXG5cdFx0XHRVbmlmb3Jtc0xpYi5jb21tb24sXG5cdFx0XHRVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsXG5cdFx0XHR7XG5cdFx0XHRcdHJlZmVyZW5jZVBvc2l0aW9uOiB7IHZhbHVlOiBuZXcgVmVjdG9yMygpIH0sXG5cdFx0XHRcdG5lYXJEaXN0YW5jZTogeyB2YWx1ZTogMSB9LFxuXHRcdFx0XHRmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9XG5cdFx0XHR9XG5cdFx0XSApLFxuXG5cdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfdmVydCxcblx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX2ZyYWdcblxuXHR9LFxuXG5cdHNoYWRvdzoge1xuXG5cdFx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRcdFVuaWZvcm1zTGliLmxpZ2h0cyxcblx0XHRcdFVuaWZvcm1zTGliLmZvZyxcblx0XHRcdHtcblx0XHRcdFx0Y29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciggMHgwMDAwMCApIH0sXG5cdFx0XHRcdG9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9XG5cdFx0XHR9LFxuXHRcdF0gKSxcblxuXHRcdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuc2hhZG93X3ZlcnQsXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnXG5cblx0fVxuXG59O1xuXG5TaGFkZXJMaWIucGh5c2ljYWwgPSB7XG5cblx0dW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFtcblx0XHRTaGFkZXJMaWIuc3RhbmRhcmQudW5pZm9ybXMsXG5cdFx0e1xuXHRcdFx0Y2xlYXJjb2F0OiB7IHZhbHVlOiAwIH0sXG5cdFx0XHRjbGVhcmNvYXRNYXA6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdGNsZWFyY29hdFJvdWdobmVzczogeyB2YWx1ZTogMCB9LFxuXHRcdFx0Y2xlYXJjb2F0Um91Z2huZXNzTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRjbGVhcmNvYXROb3JtYWxTY2FsZTogeyB2YWx1ZTogbmV3IFZlY3RvcjIoIDEsIDEgKSB9LFxuXHRcdFx0Y2xlYXJjb2F0Tm9ybWFsTWFwOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHRzaGVlbjogeyB2YWx1ZTogbmV3IENvbG9yKCAweDAwMDAwMCApIH0sXG5cdFx0XHR0cmFuc21pc3Npb246IHsgdmFsdWU6IDAgfSxcblx0XHRcdHRyYW5zbWlzc2lvbk1hcDogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdH1cblx0XSApLFxuXG5cdHZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX3ZlcnQsXG5cdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfZnJhZ1xuXG59O1xuXG5mdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBjdWJlbWFwcywgc3RhdGUsIG9iamVjdHMsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRjb25zdCBjbGVhckNvbG9yID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHRsZXQgY2xlYXJBbHBoYSA9IDA7XG5cblx0bGV0IHBsYW5lTWVzaDtcblx0bGV0IGJveE1lc2g7XG5cblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IDA7XG5cdGxldCBjdXJyZW50VG9uZW1hcHBpbmcgPSBudWxsO1xuXG5cdGZ1bmN0aW9uIHJlbmRlciggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApIHtcblxuXHRcdGxldCBiYWNrZ3JvdW5kID0gc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSA/IHNjZW5lLmJhY2tncm91bmQgOiBudWxsO1xuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kICYmIGJhY2tncm91bmQuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRiYWNrZ3JvdW5kID0gY3ViZW1hcHMuZ2V0KCBiYWNrZ3JvdW5kICk7XG5cblx0XHR9XG5cblx0XHQvLyBJZ25vcmUgYmFja2dyb3VuZCBpbiBBUlxuXHRcdC8vIFRPRE86IFJlY29uc2lkZXIgdGhpcy5cblxuXHRcdGNvbnN0IHhyID0gcmVuZGVyZXIueHI7XG5cdFx0Y29uc3Qgc2Vzc2lvbiA9IHhyLmdldFNlc3Npb24gJiYgeHIuZ2V0U2Vzc2lvbigpO1xuXG5cdFx0aWYgKCBzZXNzaW9uICYmIHNlc3Npb24uZW52aXJvbm1lbnRCbGVuZE1vZGUgPT09ICdhZGRpdGl2ZScgKSB7XG5cblx0XHRcdGJhY2tncm91bmQgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkge1xuXG5cdFx0XHRzZXRDbGVhciggY2xlYXJDb2xvciwgY2xlYXJBbHBoYSApO1xuXG5cdFx0fSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7XG5cblx0XHRcdHNldENsZWFyKCBiYWNrZ3JvdW5kLCAxICk7XG5cdFx0XHRmb3JjZUNsZWFyID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7XG5cblx0XHRcdHJlbmRlcmVyLmNsZWFyKCByZW5kZXJlci5hdXRvQ2xlYXJDb2xvciwgcmVuZGVyZXIuYXV0b0NsZWFyRGVwdGgsIHJlbmRlcmVyLmF1dG9DbGVhclN0ZW5jaWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYmFja2dyb3VuZCAmJiAoIGJhY2tncm91bmQuaXNDdWJlVGV4dHVyZSB8fCBiYWNrZ3JvdW5kLm1hcHBpbmcgPT09IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nICkgKSB7XG5cblx0XHRcdGlmICggYm94TWVzaCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJveE1lc2ggPSBuZXcgTWVzaChcblx0XHRcdFx0XHRuZXcgQm94R2VvbWV0cnkoIDEsIDEsIDEgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsJyxcblx0XHRcdFx0XHRcdHVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBTaGFkZXJMaWIuY3ViZS51bmlmb3JtcyApLFxuXHRcdFx0XHRcdFx0dmVydGV4U2hhZGVyOiBTaGFkZXJMaWIuY3ViZS52ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRcdFx0XHRmcmFnbWVudFNoYWRlcjogU2hhZGVyTGliLmN1YmUuZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRcdFx0XHRzaWRlOiBCYWNrU2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRib3hNZXNoLmdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ25vcm1hbCcgKTtcblx0XHRcdFx0Ym94TWVzaC5nZW9tZXRyeS5kZWxldGVBdHRyaWJ1dGUoICd1dicgKTtcblxuXHRcdFx0XHRib3hNZXNoLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdFx0XHRcdHRoaXMubWF0cml4V29ybGQuY29weVBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIGVuYWJsZSBjb2RlIGluamVjdGlvbiBmb3Igbm9uLWJ1aWx0LWluIG1hdGVyaWFsXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggYm94TWVzaC5tYXRlcmlhbCwgJ2Vudk1hcCcsIHtcblxuXHRcdFx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy51bmlmb3Jtcy5lbnZNYXAudmFsdWU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdG9iamVjdHMudXBkYXRlKCBib3hNZXNoICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5lbnZNYXAudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0Ym94TWVzaC5tYXRlcmlhbC51bmlmb3Jtcy5mbGlwRW52TWFwLnZhbHVlID0gKCBiYWNrZ3JvdW5kLmlzQ3ViZVRleHR1cmUgJiYgYmFja2dyb3VuZC5fbmVlZHNGbGlwRW52TWFwICkgPyAtIDEgOiAxO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0Ym94TWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdFx0Y3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kO1xuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSBiYWNrZ3JvdW5kLnZlcnNpb247XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyA9IHJlbmRlcmVyLnRvbmVNYXBwaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0XG5cdFx0XHRyZW5kZXJMaXN0LnVuc2hpZnQoIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7XG5cblx0XHRcdGlmICggcGxhbmVNZXNoID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoID0gbmV3IE1lc2goXG5cdFx0XHRcdFx0bmV3IFBsYW5lR2VvbWV0cnkoIDIsIDIgKSxcblx0XHRcdFx0XHRuZXcgU2hhZGVyTWF0ZXJpYWwoIHtcblx0XHRcdFx0XHRcdG5hbWU6ICdCYWNrZ3JvdW5kTWF0ZXJpYWwnLFxuXHRcdFx0XHRcdFx0dW5pZm9ybXM6IGNsb25lVW5pZm9ybXMoIFNoYWRlckxpYi5iYWNrZ3JvdW5kLnVuaWZvcm1zICksXG5cdFx0XHRcdFx0XHR2ZXJ0ZXhTaGFkZXI6IFNoYWRlckxpYi5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlcixcblx0XHRcdFx0XHRcdGZyYWdtZW50U2hhZGVyOiBTaGFkZXJMaWIuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixcblx0XHRcdFx0XHRcdHNpZGU6IEZyb250U2lkZSxcblx0XHRcdFx0XHRcdGRlcHRoVGVzdDogZmFsc2UsXG5cdFx0XHRcdFx0XHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0XHRcdFx0XHRcdGZvZzogZmFsc2Vcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRwbGFuZU1lc2guZ2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbm9ybWFsJyApO1xuXG5cdFx0XHRcdC8vIGVuYWJsZSBjb2RlIGluamVjdGlvbiBmb3Igbm9uLWJ1aWx0LWluIG1hdGVyaWFsXG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggcGxhbmVNZXNoLm1hdGVyaWFsLCAnbWFwJywge1xuXG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnVuaWZvcm1zLnQyRC52YWx1ZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0b2JqZWN0cy51cGRhdGUoIHBsYW5lTWVzaCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy50MkQudmFsdWUgPSBiYWNrZ3JvdW5kO1xuXG5cdFx0XHRpZiAoIGJhY2tncm91bmQubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRiYWNrZ3JvdW5kLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBiYWNrZ3JvdW5kLm1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGN1cnJlbnRCYWNrZ3JvdW5kICE9PSBiYWNrZ3JvdW5kIHx8XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiAhPT0gYmFja2dyb3VuZC52ZXJzaW9uIHx8XG5cdFx0XHRcdGN1cnJlbnRUb25lbWFwcGluZyAhPT0gcmVuZGVyZXIudG9uZU1hcHBpbmcgKSB7XG5cblx0XHRcdFx0cGxhbmVNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRjdXJyZW50QmFja2dyb3VuZCA9IGJhY2tncm91bmQ7XG5cdFx0XHRcdGN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IGJhY2tncm91bmQudmVyc2lvbjtcblx0XHRcdFx0Y3VycmVudFRvbmVtYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XG5cblx0XHRcdH1cblxuXG5cdFx0XHQvLyBwdXNoIHRvIHRoZSBwcmUtc29ydGVkIG9wYXF1ZSByZW5kZXIgbGlzdFxuXHRcdFx0cmVuZGVyTGlzdC51bnNoaWZ0KCBwbGFuZU1lc2gsIHBsYW5lTWVzaC5nZW9tZXRyeSwgcGxhbmVNZXNoLm1hdGVyaWFsLCAwLCAwLCBudWxsICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldENsZWFyKCBjb2xvciwgYWxwaGEgKSB7XG5cblx0XHRzdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLCBhbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdHJldHVybiBjbGVhckNvbG9yO1xuXG5cdFx0fSxcblx0XHRzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSA9IDEgKSB7XG5cblx0XHRcdGNsZWFyQ29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0Z2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gY2xlYXJBbHBoYTtcblxuXHRcdH0sXG5cdFx0c2V0Q2xlYXJBbHBoYTogZnVuY3Rpb24gKCBhbHBoYSApIHtcblxuXHRcdFx0Y2xlYXJBbHBoYSA9IGFscGhhO1xuXHRcdFx0c2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTtcblxuXHRcdH0sXG5cdFx0cmVuZGVyOiByZW5kZXJcblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQmluZGluZ1N0YXRlcyggZ2wsIGV4dGVuc2lvbnMsIGF0dHJpYnV0ZXMsIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNDkyMSApO1xuXG5cdGNvbnN0IGV4dGVuc2lvbiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMiA/IG51bGwgOiBleHRlbnNpb25zLmdldCggJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0JyApO1xuXHRjb25zdCB2YW9BdmFpbGFibGUgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgfHwgZXh0ZW5zaW9uICE9PSBudWxsO1xuXG5cdGNvbnN0IGJpbmRpbmdTdGF0ZXMgPSB7fTtcblxuXHRjb25zdCBkZWZhdWx0U3RhdGUgPSBjcmVhdGVCaW5kaW5nU3RhdGUoIG51bGwgKTtcblx0bGV0IGN1cnJlbnRTdGF0ZSA9IGRlZmF1bHRTdGF0ZTtcblxuXHRmdW5jdGlvbiBzZXR1cCggb2JqZWN0LCBtYXRlcmlhbCwgcHJvZ3JhbSwgZ2VvbWV0cnksIGluZGV4ICkge1xuXG5cdFx0bGV0IHVwZGF0ZUJ1ZmZlcnMgPSBmYWxzZTtcblxuXHRcdGlmICggdmFvQXZhaWxhYmxlICkge1xuXG5cdFx0XHRjb25zdCBzdGF0ZSA9IGdldEJpbmRpbmdTdGF0ZSggZ2VvbWV0cnksIHByb2dyYW0sIG1hdGVyaWFsICk7XG5cblx0XHRcdGlmICggY3VycmVudFN0YXRlICE9PSBzdGF0ZSApIHtcblxuXHRcdFx0XHRjdXJyZW50U3RhdGUgPSBzdGF0ZTtcblx0XHRcdFx0YmluZFZlcnRleEFycmF5T2JqZWN0KCBjdXJyZW50U3RhdGUub2JqZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dXBkYXRlQnVmZmVycyA9IG5lZWRzVXBkYXRlKCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdFx0aWYgKCB1cGRhdGVCdWZmZXJzICkgc2F2ZUNhY2hlKCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHdpcmVmcmFtZSA9ICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHRcdGlmICggY3VycmVudFN0YXRlLmdlb21ldHJ5ICE9PSBnZW9tZXRyeS5pZCB8fFxuXHRcdFx0XHRjdXJyZW50U3RhdGUucHJvZ3JhbSAhPT0gcHJvZ3JhbS5pZCB8fFxuXHRcdFx0XHRjdXJyZW50U3RhdGUud2lyZWZyYW1lICE9PSB3aXJlZnJhbWUgKSB7XG5cblx0XHRcdFx0Y3VycmVudFN0YXRlLmdlb21ldHJ5ID0gZ2VvbWV0cnkuaWQ7XG5cdFx0XHRcdGN1cnJlbnRTdGF0ZS5wcm9ncmFtID0gcHJvZ3JhbS5pZDtcblx0XHRcdFx0Y3VycmVudFN0YXRlLndpcmVmcmFtZSA9IHdpcmVmcmFtZTtcblxuXHRcdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoID09PSB0cnVlICkge1xuXG5cdFx0XHR1cGRhdGVCdWZmZXJzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBpbmRleCwgMzQ5NjMgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdXBkYXRlQnVmZmVycyApIHtcblxuXHRcdFx0c2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGdsLmJpbmRCdWZmZXIoIDM0OTYzLCBhdHRyaWJ1dGVzLmdldCggaW5kZXggKS5idWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhBcnJheU9iamVjdCgpIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGdsLmNyZWF0ZVZlcnRleEFycmF5KCk7XG5cblx0XHRyZXR1cm4gZXh0ZW5zaW9uLmNyZWF0ZVZlcnRleEFycmF5T0VTKCk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggdmFvICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gZ2wuYmluZFZlcnRleEFycmF5KCB2YW8gKTtcblxuXHRcdHJldHVybiBleHRlbnNpb24uYmluZFZlcnRleEFycmF5T0VTKCB2YW8gKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVsZXRlVmVydGV4QXJyYXlPYmplY3QoIHZhbyApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGdsLmRlbGV0ZVZlcnRleEFycmF5KCB2YW8gKTtcblxuXHRcdHJldHVybiBleHRlbnNpb24uZGVsZXRlVmVydGV4QXJyYXlPRVMoIHZhbyApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRCaW5kaW5nU3RhdGUoIGdlb21ldHJ5LCBwcm9ncmFtLCBtYXRlcmlhbCApIHtcblxuXHRcdGNvbnN0IHdpcmVmcmFtZSA9ICggbWF0ZXJpYWwud2lyZWZyYW1lID09PSB0cnVlICk7XG5cblx0XHRsZXQgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRpZiAoIHByb2dyYW1NYXAgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbU1hcCA9IHt9O1xuXHRcdFx0YmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9IHByb2dyYW1NYXA7XG5cblx0XHR9XG5cblx0XHRsZXQgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF07XG5cblx0XHRpZiAoIHN0YXRlTWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHN0YXRlTWFwID0ge307XG5cdFx0XHRwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPSBzdGF0ZU1hcDtcblxuXHRcdH1cblxuXHRcdGxldCBzdGF0ZSA9IHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdGlmICggc3RhdGUgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3RhdGUgPSBjcmVhdGVCaW5kaW5nU3RhdGUoIGNyZWF0ZVZlcnRleEFycmF5T2JqZWN0KCkgKTtcblx0XHRcdHN0YXRlTWFwWyB3aXJlZnJhbWUgXSA9IHN0YXRlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHN0YXRlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVCaW5kaW5nU3RhdGUoIHZhbyApIHtcblxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBbXTtcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IFtdO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZURpdmlzb3JzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzOyBpICsrICkge1xuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSA9IDA7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cblx0XHRcdC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9uIG5vbi1WQU8gc3VwcG9ydCBicm93c2VyXG5cdFx0XHRnZW9tZXRyeTogbnVsbCxcblx0XHRcdHByb2dyYW06IG51bGwsXG5cdFx0XHR3aXJlZnJhbWU6IGZhbHNlLFxuXG5cdFx0XHRuZXdBdHRyaWJ1dGVzOiBuZXdBdHRyaWJ1dGVzLFxuXHRcdFx0ZW5hYmxlZEF0dHJpYnV0ZXM6IGVuYWJsZWRBdHRyaWJ1dGVzLFxuXHRcdFx0YXR0cmlidXRlRGl2aXNvcnM6IGF0dHJpYnV0ZURpdmlzb3JzLFxuXHRcdFx0b2JqZWN0OiB2YW8sXG5cdFx0XHRhdHRyaWJ1dGVzOiB7fSxcblx0XHRcdGluZGV4OiBudWxsXG5cblx0XHR9O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBuZWVkc1VwZGF0ZSggZ2VvbWV0cnksIGluZGV4ICkge1xuXG5cdFx0Y29uc3QgY2FjaGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5hdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRsZXQgYXR0cmlidXRlc051bSA9IDA7XG5cblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRjb25zdCBjYWNoZWRBdHRyaWJ1dGUgPSBjYWNoZWRBdHRyaWJ1dGVzWyBrZXkgXTtcblx0XHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlID0gZ2VvbWV0cnlBdHRyaWJ1dGVzWyBrZXkgXTtcblxuXHRcdFx0aWYgKCBjYWNoZWRBdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIHJldHVybiB0cnVlO1xuXG5cdFx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZS5hdHRyaWJ1dGUgIT09IGdlb21ldHJ5QXR0cmlidXRlICkgcmV0dXJuIHRydWU7XG5cblx0XHRcdGlmICggY2FjaGVkQXR0cmlidXRlLmRhdGEgIT09IGdlb21ldHJ5QXR0cmlidXRlLmRhdGEgKSByZXR1cm4gdHJ1ZTtcblxuXHRcdFx0YXR0cmlidXRlc051bSArKztcblxuXHRcdH1cblxuXHRcdGlmICggY3VycmVudFN0YXRlLmF0dHJpYnV0ZXNOdW0gIT09IGF0dHJpYnV0ZXNOdW0gKSByZXR1cm4gdHJ1ZTtcblxuXHRcdGlmICggY3VycmVudFN0YXRlLmluZGV4ICE9PSBpbmRleCApIHJldHVybiB0cnVlO1xuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzYXZlQ2FjaGUoIGdlb21ldHJ5LCBpbmRleCApIHtcblxuXHRcdGNvbnN0IGNhY2hlID0ge307XG5cdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0bGV0IGF0dHJpYnV0ZXNOdW0gPSAwO1xuXG5cdFx0Zm9yICggY29uc3Qga2V5IGluIGF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdO1xuXG5cdFx0XHRjb25zdCBkYXRhID0ge307XG5cdFx0XHRkYXRhLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUuZGF0YSApIHtcblxuXHRcdFx0XHRkYXRhLmRhdGEgPSBhdHRyaWJ1dGUuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjYWNoZVsga2V5IF0gPSBkYXRhO1xuXG5cdFx0XHRhdHRyaWJ1dGVzTnVtICsrO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudFN0YXRlLmF0dHJpYnV0ZXMgPSBjYWNoZTtcblx0XHRjdXJyZW50U3RhdGUuYXR0cmlidXRlc051bSA9IGF0dHJpYnV0ZXNOdW07XG5cblx0XHRjdXJyZW50U3RhdGUuaW5kZXggPSBpbmRleDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdEF0dHJpYnV0ZXMoKSB7XG5cblx0XHRjb25zdCBuZXdBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLm5ld0F0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0bmV3QXR0cmlidXRlc1sgaSBdID0gMDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIDAgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICkge1xuXG5cdFx0Y29uc3QgbmV3QXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5uZXdBdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGVuYWJsZWRBdHRyaWJ1dGVzID0gY3VycmVudFN0YXRlLmVuYWJsZWRBdHRyaWJ1dGVzO1xuXHRcdGNvbnN0IGF0dHJpYnV0ZURpdmlzb3JzID0gY3VycmVudFN0YXRlLmF0dHJpYnV0ZURpdmlzb3JzO1xuXG5cdFx0bmV3QXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxO1xuXG5cdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPT09IDAgKSB7XG5cblx0XHRcdGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KCBhdHRyaWJ1dGUgKTtcblx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIGF0dHJpYnV0ZURpdmlzb3JzWyBhdHRyaWJ1dGUgXSAhPT0gbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gZ2wgOiBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cblx0XHRcdGV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ3ZlcnRleEF0dHJpYkRpdmlzb3InIDogJ3ZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRScgXSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7XG5cdFx0XHRhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpIHtcblxuXHRcdGNvbnN0IG5ld0F0dHJpYnV0ZXMgPSBjdXJyZW50U3RhdGUubmV3QXR0cmlidXRlcztcblx0XHRjb25zdCBlbmFibGVkQXR0cmlidXRlcyA9IGN1cnJlbnRTdGF0ZS5lbmFibGVkQXR0cmlidXRlcztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBlbmFibGVkQXR0cmlidXRlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0aWYgKCBlbmFibGVkQXR0cmlidXRlc1sgaSBdICE9PSBuZXdBdHRyaWJ1dGVzWyBpIF0gKSB7XG5cblx0XHRcdFx0Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KCBpICk7XG5cdFx0XHRcdGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCApIHtcblxuXHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyID09PSB0cnVlICYmICggdHlwZSA9PT0gNTEyNCB8fCB0eXBlID09PSA1MTI1ICkgKSB7XG5cblx0XHRcdGdsLnZlcnRleEF0dHJpYklQb2ludGVyKCBpbmRleCwgc2l6ZSwgdHlwZSwgc3RyaWRlLCBvZmZzZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIGluZGV4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG9iamVjdCwgbWF0ZXJpYWwsIHByb2dyYW0sIGdlb21ldHJ5ICkge1xuXG5cdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgPT09IGZhbHNlICYmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCB8fCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkgKSB7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApID09PSBudWxsICkgcmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0aW5pdEF0dHJpYnV0ZXMoKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWxEZWZhdWx0QXR0cmlidXRlVmFsdWVzID0gbWF0ZXJpYWwuZGVmYXVsdEF0dHJpYnV0ZVZhbHVlcztcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gcHJvZ3JhbUF0dHJpYnV0ZXMgKSB7XG5cblx0XHRcdGNvbnN0IHByb2dyYW1BdHRyaWJ1dGUgPSBwcm9ncmFtQXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRpZiAoIHByb2dyYW1BdHRyaWJ1dGUgPj0gMCApIHtcblxuXHRcdFx0XHRjb25zdCBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdO1xuXG5cdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSBnZW9tZXRyeUF0dHJpYnV0ZS5ub3JtYWxpemVkO1xuXHRcdFx0XHRcdGNvbnN0IHNpemUgPSBnZW9tZXRyeUF0dHJpYnV0ZS5pdGVtU2l6ZTtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeUF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblx0XHRcdFx0XHRjb25zdCBieXRlc1BlckVsZW1lbnQgPSBhdHRyaWJ1dGUuYnl0ZXNQZXJFbGVtZW50O1xuXG5cdFx0XHRcdFx0aWYgKCBnZW9tZXRyeUF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBkYXRhID0gZ2VvbWV0cnlBdHRyaWJ1dGUuZGF0YTtcblx0XHRcdFx0XHRcdGNvbnN0IHN0cmlkZSA9IGRhdGEuc3RyaWRlO1xuXHRcdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0O1xuXG5cdFx0XHRcdFx0XHRpZiAoIGRhdGEgJiYgZGF0YS5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyICkge1xuXG5cdFx0XHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZGF0YS5tZXNoUGVyQXR0cmlidXRlICogZGF0YS5jb3VudDtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlciApO1xuXHRcdFx0XHRcdFx0dmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlICogYnl0ZXNQZXJFbGVtZW50LCBvZmZzZXQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSwgZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSApO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggZ2VvbWV0cnkuX21heEluc3RhbmNlQ291bnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50O1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRnbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVyICk7XG5cdFx0XHRcdFx0XHR2ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCAwLCAwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIGlmICggbmFtZSA9PT0gJ2luc3RhbmNlTWF0cml4JyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBvYmplY3QuaW5zdGFuY2VNYXRyaXggKTtcblxuXHRcdFx0XHRcdC8vIFRPRE8gQXR0cmlidXRlIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGNvbnRleHQgcmVzdG9yZVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUgPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0Y29uc3QgYnVmZmVyID0gYXR0cmlidXRlLmJ1ZmZlcjtcblx0XHRcdFx0XHRjb25zdCB0eXBlID0gYXR0cmlidXRlLnR5cGU7XG5cblx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlICsgMCwgMSApO1xuXHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUgKyAxLCAxICk7XG5cdFx0XHRcdFx0ZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvciggcHJvZ3JhbUF0dHJpYnV0ZSArIDIsIDEgKTtcblx0XHRcdFx0XHRlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlICsgMywgMSApO1xuXG5cdFx0XHRcdFx0Z2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlciApO1xuXG5cdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSArIDAsIDQsIHR5cGUsIGZhbHNlLCA2NCwgMCApO1xuXHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUgKyAxLCA0LCB0eXBlLCBmYWxzZSwgNjQsIDE2ICk7XG5cdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSArIDIsIDQsIHR5cGUsIGZhbHNlLCA2NCwgMzIgKTtcblx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlICsgMywgNCwgdHlwZSwgZmFsc2UsIDY0LCA0OCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG5hbWUgPT09ICdpbnN0YW5jZUNvbG9yJyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0KCBvYmplY3QuaW5zdGFuY2VDb2xvciApO1xuXG5cdFx0XHRcdFx0Ly8gVE9ETyBBdHRyaWJ1dGUgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gY29udGV4dCByZXN0b3JlXG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7XG5cblx0XHRcdFx0XHRjb25zdCBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyO1xuXHRcdFx0XHRcdGNvbnN0IHR5cGUgPSBhdHRyaWJ1dGUudHlwZTtcblxuXHRcdFx0XHRcdGVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIDEgKTtcblxuXHRcdFx0XHRcdGdsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGUsIDMsIHR5cGUsIGZhbHNlLCAxMiwgMCApO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXNbIG5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0c3dpdGNoICggdmFsdWUubGVuZ3RoICkge1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgMjpcblx0XHRcdFx0XHRcdFx0XHRnbC52ZXJ0ZXhBdHRyaWIyZnYoIHByb2dyYW1BdHRyaWJ1dGUsIHZhbHVlICk7XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHRcdFx0XHRcdGdsLnZlcnRleEF0dHJpYjNmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHRcdFx0Z2wudmVydGV4QXR0cmliMWZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlcygpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0cmVzZXQoKTtcblxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcblxuXHRcdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5SWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3QgcHJvZ3JhbUlkIGluIHByb2dyYW1NYXAgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcblxuXHRcdFx0XHRmb3IgKCBjb25zdCB3aXJlZnJhbWUgaW4gc3RhdGVNYXAgKSB7XG5cblx0XHRcdFx0XHRkZWxldGVWZXJ0ZXhBcnJheU9iamVjdCggc3RhdGVNYXBbIHdpcmVmcmFtZSBdLm9iamVjdCApO1xuXG5cdFx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVsZXRlIHByb2dyYW1NYXBbIHByb2dyYW1JZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBiaW5kaW5nU3RhdGVzWyBnZW9tZXRyeUlkIF07XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VTdGF0ZXNPZkdlb21ldHJ5KCBnZW9tZXRyeSApIHtcblxuXHRcdGlmICggYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5LmlkIF07XG5cblx0XHRmb3IgKCBjb25zdCBwcm9ncmFtSWQgaW4gcHJvZ3JhbU1hcCApIHtcblxuXHRcdFx0Y29uc3Qgc3RhdGVNYXAgPSBwcm9ncmFtTWFwWyBwcm9ncmFtSWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xuXG5cdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XG5cblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbUlkIF07XG5cblx0XHR9XG5cblx0XHRkZWxldGUgYmluZGluZ1N0YXRlc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVsZWFzZVN0YXRlc09mUHJvZ3JhbSggcHJvZ3JhbSApIHtcblxuXHRcdGZvciAoIGNvbnN0IGdlb21ldHJ5SWQgaW4gYmluZGluZ1N0YXRlcyApIHtcblxuXHRcdFx0Y29uc3QgcHJvZ3JhbU1hcCA9IGJpbmRpbmdTdGF0ZXNbIGdlb21ldHJ5SWQgXTtcblxuXHRcdFx0aWYgKCBwcm9ncmFtTWFwWyBwcm9ncmFtLmlkIF0gPT09IHVuZGVmaW5lZCApIGNvbnRpbnVlO1xuXG5cdFx0XHRjb25zdCBzdGF0ZU1hcCA9IHByb2dyYW1NYXBbIHByb2dyYW0uaWQgXTtcblxuXHRcdFx0Zm9yICggY29uc3Qgd2lyZWZyYW1lIGluIHN0YXRlTWFwICkge1xuXG5cdFx0XHRcdGRlbGV0ZVZlcnRleEFycmF5T2JqZWN0KCBzdGF0ZU1hcFsgd2lyZWZyYW1lIF0ub2JqZWN0ICk7XG5cblx0XHRcdFx0ZGVsZXRlIHN0YXRlTWFwWyB3aXJlZnJhbWUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRkZWxldGUgcHJvZ3JhbU1hcFsgcHJvZ3JhbS5pZCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZXNldCgpIHtcblxuXHRcdHJlc2V0RGVmYXVsdFN0YXRlKCk7XG5cblx0XHRpZiAoIGN1cnJlbnRTdGF0ZSA9PT0gZGVmYXVsdFN0YXRlICkgcmV0dXJuO1xuXG5cdFx0Y3VycmVudFN0YXRlID0gZGVmYXVsdFN0YXRlO1xuXHRcdGJpbmRWZXJ0ZXhBcnJheU9iamVjdCggY3VycmVudFN0YXRlLm9iamVjdCApO1xuXG5cdH1cblxuXHQvLyBmb3IgYmFja3dhcmQtY29tcGF0aWxpYml0eVxuXG5cdGZ1bmN0aW9uIHJlc2V0RGVmYXVsdFN0YXRlKCkge1xuXG5cdFx0ZGVmYXVsdFN0YXRlLmdlb21ldHJ5ID0gbnVsbDtcblx0XHRkZWZhdWx0U3RhdGUucHJvZ3JhbSA9IG51bGw7XG5cdFx0ZGVmYXVsdFN0YXRlLndpcmVmcmFtZSA9IGZhbHNlO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0c2V0dXA6IHNldHVwLFxuXHRcdHJlc2V0OiByZXNldCxcblx0XHRyZXNldERlZmF1bHRTdGF0ZTogcmVzZXREZWZhdWx0U3RhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZSxcblx0XHRyZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeTogcmVsZWFzZVN0YXRlc09mR2VvbWV0cnksXG5cdFx0cmVsZWFzZVN0YXRlc09mUHJvZ3JhbTogcmVsZWFzZVN0YXRlc09mUHJvZ3JhbSxcblxuXHRcdGluaXRBdHRyaWJ1dGVzOiBpbml0QXR0cmlidXRlcyxcblx0XHRlbmFibGVBdHRyaWJ1dGU6IGVuYWJsZUF0dHJpYnV0ZSxcblx0XHRkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXNcblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0bGV0IG1vZGU7XG5cblx0ZnVuY3Rpb24gc2V0TW9kZSggdmFsdWUgKSB7XG5cblx0XHRtb2RlID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0FycmF5cyggbW9kZSwgc3RhcnQsIGNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIDEgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBzdGFydCwgY291bnQsIHByaW1jb3VudCApIHtcblxuXHRcdGlmICggcHJpbWNvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0bGV0IGV4dGVuc2lvbiwgbWV0aG9kTmFtZTtcblxuXHRcdGlmICggaXNXZWJHTDIgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGdsO1xuXHRcdFx0bWV0aG9kTmFtZSA9ICdkcmF3QXJyYXlzSW5zdGFuY2VkJztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTtcblx0XHRcdG1ldGhvZE5hbWUgPSAnZHJhd0FycmF5c0luc3RhbmNlZEFOR0xFJztcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMQnVmZmVyUmVuZGVyZXI6IHVzaW5nIFRIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5IGJ1dCBoYXJkd2FyZSBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbiBBTkdMRV9pbnN0YW5jZWRfYXJyYXlzLicgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRleHRlbnNpb25bIG1ldGhvZE5hbWUgXSggbW9kZSwgc3RhcnQsIGNvdW50LCBwcmltY291bnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgcHJpbWNvdW50ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0dGhpcy5zZXRNb2RlID0gc2V0TW9kZTtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHtcblxuXHRsZXQgbWF4QW5pc290cm9weTtcblxuXHRmdW5jdGlvbiBnZXRNYXhBbmlzb3Ryb3B5KCkge1xuXG5cdFx0aWYgKCBtYXhBbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgKSByZXR1cm4gbWF4QW5pc290cm9weTtcblxuXHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gZ2wuZ2V0UGFyYW1ldGVyKCBleHRlbnNpb24uTUFYX1RFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhUICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtYXhBbmlzb3Ryb3B5ID0gMDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXhBbmlzb3Ryb3B5O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRNYXhQcmVjaXNpb24oIHByZWNpc2lvbiApIHtcblxuXHRcdGlmICggcHJlY2lzaW9uID09PSAnaGlnaHAnICkge1xuXG5cdFx0XHRpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggMzU2MzMsIDM2MzM4ICkucHJlY2lzaW9uID4gMCAmJlxuXHRcdFx0XHRnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMyLCAzNjMzOCApLnByZWNpc2lvbiA+IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuICdoaWdocCc7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJlY2lzaW9uID0gJ21lZGl1bXAnO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHtcblxuXHRcdFx0aWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMzLCAzNjMzNyApLnByZWNpc2lvbiA+IDAgJiZcblx0XHRcdFx0Z2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCAzNTYzMiwgMzYzMzcgKS5wcmVjaXNpb24gPiAwICkge1xuXG5cdFx0XHRcdHJldHVybiAnbWVkaXVtcCc7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiAnbG93cCc7XG5cblx0fVxuXG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cdGNvbnN0IGlzV2ViR0wyID0gKCB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0ICkgfHxcblx0XHQoIHR5cGVvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJDb21wdXRlUmVuZGVyaW5nQ29udGV4dCApO1xuXHQvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG5cblx0bGV0IHByZWNpc2lvbiA9IHBhcmFtZXRlcnMucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZWNpc2lvbiA6ICdoaWdocCc7XG5cdGNvbnN0IG1heFByZWNpc2lvbiA9IGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICk7XG5cblx0aWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTtcblx0XHRwcmVjaXNpb24gPSBtYXhQcmVjaXNpb247XG5cblx0fVxuXG5cdGNvbnN0IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPSBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgPT09IHRydWU7XG5cblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM0OTMwICk7XG5cdGNvbnN0IG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNTY2MCApO1xuXHRjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzM3OSApO1xuXHRjb25zdCBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzQwNzYgKTtcblxuXHRjb25zdCBtYXhBdHRyaWJ1dGVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNDkyMSApO1xuXHRjb25zdCBtYXhWZXJ0ZXhVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggMzYzNDcgKTtcblx0Y29uc3QgbWF4VmFyeWluZ3MgPSBnbC5nZXRQYXJhbWV0ZXIoIDM2MzQ4ICk7XG5cdGNvbnN0IG1heEZyYWdtZW50VW5pZm9ybXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM2MzQ5ICk7XG5cblx0Y29uc3QgdmVydGV4VGV4dHVyZXMgPSBtYXhWZXJ0ZXhUZXh0dXJlcyA+IDA7XG5cdGNvbnN0IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyA9IGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdGNvbnN0IGZsb2F0VmVydGV4VGV4dHVyZXMgPSB2ZXJ0ZXhUZXh0dXJlcyAmJiBmbG9hdEZyYWdtZW50VGV4dHVyZXM7XG5cblx0Y29uc3QgbWF4U2FtcGxlcyA9IGlzV2ViR0wyID8gZ2wuZ2V0UGFyYW1ldGVyKCAzNjE4MyApIDogMDtcblxuXHRyZXR1cm4ge1xuXG5cdFx0aXNXZWJHTDI6IGlzV2ViR0wyLFxuXG5cdFx0Z2V0TWF4QW5pc290cm9weTogZ2V0TWF4QW5pc290cm9weSxcblx0XHRnZXRNYXhQcmVjaXNpb246IGdldE1heFByZWNpc2lvbixcblxuXHRcdHByZWNpc2lvbjogcHJlY2lzaW9uLFxuXHRcdGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsXG5cblx0XHRtYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsXG5cdFx0bWF4VmVydGV4VGV4dHVyZXM6IG1heFZlcnRleFRleHR1cmVzLFxuXHRcdG1heFRleHR1cmVTaXplOiBtYXhUZXh0dXJlU2l6ZSxcblx0XHRtYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsXG5cblx0XHRtYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLFxuXHRcdG1heFZlcnRleFVuaWZvcm1zOiBtYXhWZXJ0ZXhVbmlmb3Jtcyxcblx0XHRtYXhWYXJ5aW5nczogbWF4VmFyeWluZ3MsXG5cdFx0bWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcyxcblxuXHRcdHZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcyxcblx0XHRmbG9hdEZyYWdtZW50VGV4dHVyZXM6IGZsb2F0RnJhZ21lbnRUZXh0dXJlcyxcblx0XHRmbG9hdFZlcnRleFRleHR1cmVzOiBmbG9hdFZlcnRleFRleHR1cmVzLFxuXG5cdFx0bWF4U2FtcGxlczogbWF4U2FtcGxlc1xuXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xDbGlwcGluZyggcHJvcGVydGllcyApIHtcblxuXHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0bGV0IGdsb2JhbFN0YXRlID0gbnVsbCxcblx0XHRudW1HbG9iYWxQbGFuZXMgPSAwLFxuXHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2UsXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXG5cdGNvbnN0IHBsYW5lID0gbmV3IFBsYW5lKCksXG5cdFx0dmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksXG5cblx0XHR1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07XG5cblx0dGhpcy51bmlmb3JtID0gdW5pZm9ybTtcblx0dGhpcy5udW1QbGFuZXMgPSAwO1xuXHR0aGlzLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0dGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGVuYWJsZWQgPVxuXHRcdFx0cGxhbmVzLmxlbmd0aCAhPT0gMCB8fFxuXHRcdFx0ZW5hYmxlTG9jYWxDbGlwcGluZyB8fFxuXHRcdFx0Ly8gZW5hYmxlIHN0YXRlIG9mIHByZXZpb3VzIGZyYW1lIC0gdGhlIGNsaXBwaW5nIGNvZGUgaGFzIHRvXG5cdFx0XHQvLyBydW4gYW5vdGhlciBmcmFtZSBpbiBvcmRlciB0byByZXNldCB0aGUgc3RhdGU6XG5cdFx0XHRudW1HbG9iYWxQbGFuZXMgIT09IDAgfHxcblx0XHRcdGxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXG5cdFx0bG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBlbmFibGVMb2NhbENsaXBwaW5nO1xuXG5cdFx0Z2xvYmFsU3RhdGUgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgMCApO1xuXHRcdG51bUdsb2JhbFBsYW5lcyA9IHBsYW5lcy5sZW5ndGg7XG5cblx0XHRyZXR1cm4gZW5hYmxlZDtcblxuXHR9O1xuXG5cdHRoaXMuYmVnaW5TaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IHRydWU7XG5cdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdH07XG5cblx0dGhpcy5lbmRTaGFkb3dzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlO1xuXHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U3RhdGUgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBjYW1lcmEsIHVzZUNhY2hlICkge1xuXG5cdFx0Y29uc3QgcGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMsXG5cdFx0XHRjbGlwSW50ZXJzZWN0aW9uID0gbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbixcblx0XHRcdGNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cblx0XHRjb25zdCBtYXRlcmlhbFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggbWF0ZXJpYWwgKTtcblxuXHRcdGlmICggISBsb2NhbENsaXBwaW5nRW5hYmxlZCB8fCBwbGFuZXMgPT09IG51bGwgfHwgcGxhbmVzLmxlbmd0aCA9PT0gMCB8fCByZW5kZXJpbmdTaGFkb3dzICYmICEgY2xpcFNoYWRvd3MgKSB7XG5cblx0XHRcdC8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmdcblxuXHRcdFx0aWYgKCByZW5kZXJpbmdTaGFkb3dzICkge1xuXG5cdFx0XHRcdC8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nXG5cblx0XHRcdFx0cHJvamVjdFBsYW5lcyggbnVsbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlc2V0R2xvYmFsU3RhdGUoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3Qgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLFxuXHRcdFx0XHRsR2xvYmFsID0gbkdsb2JhbCAqIDQ7XG5cblx0XHRcdGxldCBkc3RBcnJheSA9IG1hdGVyaWFsUHJvcGVydGllcy5jbGlwcGluZ1N0YXRlIHx8IG51bGw7XG5cblx0XHRcdHVuaWZvcm0udmFsdWUgPSBkc3RBcnJheTsgLy8gZW5zdXJlIHVuaXF1ZSBzdGF0ZVxuXG5cdFx0XHRkc3RBcnJheSA9IHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBsR2xvYmFsLCB1c2VDYWNoZSApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IGxHbG9iYWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0ZHN0QXJyYXlbIGkgXSA9IGdsb2JhbFN0YXRlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmNsaXBwaW5nU3RhdGUgPSBkc3RBcnJheTtcblx0XHRcdHRoaXMubnVtSW50ZXJzZWN0aW9uID0gY2xpcEludGVyc2VjdGlvbiA/IHRoaXMubnVtUGxhbmVzIDogMDtcblx0XHRcdHRoaXMubnVtUGxhbmVzICs9IG5HbG9iYWw7XG5cblx0XHR9XG5cblxuXHR9O1xuXG5cdGZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7XG5cblx0XHRpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkge1xuXG5cdFx0XHR1bmlmb3JtLnZhbHVlID0gZ2xvYmFsU3RhdGU7XG5cdFx0XHR1bmlmb3JtLm5lZWRzVXBkYXRlID0gbnVtR2xvYmFsUGxhbmVzID4gMDtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm51bVBsYW5lcyA9IG51bUdsb2JhbFBsYW5lcztcblx0XHRzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgZHN0T2Zmc2V0LCBza2lwVHJhbnNmb3JtICkge1xuXG5cdFx0Y29uc3QgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwO1xuXHRcdGxldCBkc3RBcnJheSA9IG51bGw7XG5cblx0XHRpZiAoIG5QbGFuZXMgIT09IDAgKSB7XG5cblx0XHRcdGRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTtcblxuXHRcdFx0aWYgKCBza2lwVHJhbnNmb3JtICE9PSB0cnVlIHx8IGRzdEFycmF5ID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGZsYXRTaXplID0gZHN0T2Zmc2V0ICsgblBsYW5lcyAqIDQsXG5cdFx0XHRcdFx0dmlld01hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2U7XG5cblx0XHRcdFx0dmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRpZiAoIGRzdEFycmF5ID09PSBudWxsIHx8IGRzdEFycmF5Lmxlbmd0aCA8IGZsYXRTaXplICkge1xuXG5cdFx0XHRcdFx0ZHN0QXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBmbGF0U2l6ZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkge1xuXG5cdFx0XHRcdFx0cGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTtcblxuXHRcdFx0XHRcdHBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTtcblx0XHRcdFx0XHRkc3RBcnJheVsgaTQgKyAzIF0gPSBwbGFuZS5jb25zdGFudDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5O1xuXHRcdFx0dW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzO1xuXHRcdHNjb3BlLm51bUludGVyc2VjdGlvbiA9IDA7XG5cblx0XHRyZXR1cm4gZHN0QXJyYXk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIFdlYkdMQ3ViZU1hcHMoIHJlbmRlcmVyICkge1xuXG5cdGxldCBjdWJlbWFwcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0ZnVuY3Rpb24gbWFwVGV4dHVyZU1hcHBpbmcoIHRleHR1cmUsIG1hcHBpbmcgKSB7XG5cblx0XHRpZiAoIG1hcHBpbmcgPT09IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nICkge1xuXG5cdFx0XHR0ZXh0dXJlLm1hcHBpbmcgPSBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHtcblxuXHRcdFx0dGV4dHVyZS5tYXBwaW5nID0gQ3ViZVJlZnJhY3Rpb25NYXBwaW5nO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggdGV4dHVyZSApIHtcblxuXHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzVGV4dHVyZSApIHtcblxuXHRcdFx0Y29uc3QgbWFwcGluZyA9IHRleHR1cmUubWFwcGluZztcblxuXHRcdFx0aWYgKCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyB8fCBtYXBwaW5nID09PSBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZyApIHtcblxuXHRcdFx0XHRpZiAoIGN1YmVtYXBzLmhhcyggdGV4dHVyZSApICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgY3ViZW1hcCA9IGN1YmVtYXBzLmdldCggdGV4dHVyZSApLnRleHR1cmU7XG5cdFx0XHRcdFx0cmV0dXJuIG1hcFRleHR1cmVNYXBwaW5nKCBjdWJlbWFwLCB0ZXh0dXJlLm1hcHBpbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc3QgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlO1xuXG5cdFx0XHRcdFx0aWYgKCBpbWFnZSAmJiBpbWFnZS5oZWlnaHQgPiAwICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IG5ldyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIGltYWdlLmhlaWdodCAvIDIgKTtcblx0XHRcdFx0XHRcdHJlbmRlclRhcmdldC5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZSggcmVuZGVyZXIsIHRleHR1cmUgKTtcblx0XHRcdFx0XHRcdGN1YmVtYXBzLnNldCggdGV4dHVyZSwgcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0XHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdFx0XHR0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbWFwVGV4dHVyZU1hcHBpbmcoIHJlbmRlclRhcmdldC50ZXh0dXJlLCB0ZXh0dXJlLm1hcHBpbmcgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIGltYWdlIG5vdCB5ZXQgcmVhZHkuIHRyeSB0aGUgY29udmVyc2lvbiBuZXh0IGZyYW1lXG5cblx0XHRcdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHRleHR1cmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRjb25zdCBjdWJlbWFwID0gY3ViZW1hcHMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIGN1YmVtYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y3ViZW1hcHMuZGVsZXRlKCB0ZXh0dXJlICk7XG5cdFx0XHRjdWJlbWFwLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdGN1YmVtYXBzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xFeHRlbnNpb25zKCBnbCApIHtcblxuXHRjb25zdCBleHRlbnNpb25zID0ge307XG5cblx0ZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uKCBuYW1lICkge1xuXG5cdFx0aWYgKCBleHRlbnNpb25zWyBuYW1lIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbnNbIG5hbWUgXTtcblxuXHRcdH1cblxuXHRcdGxldCBleHRlbnNpb247XG5cblx0XHRzd2l0Y2ggKCBuYW1lICkge1xuXG5cdFx0XHRjYXNlICdXRUJHTF9kZXB0aF90ZXh0dXJlJzpcblx0XHRcdFx0ZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfV0VCR0xfZGVwdGhfdGV4dHVyZScgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyc6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0Yyc6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnOlxuXHRcdFx0XHRleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggbmFtZSApO1xuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uc1sgbmFtZSBdID0gZXh0ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdGhhczogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0XHRyZXR1cm4gZ2V0RXh0ZW5zaW9uKCBuYW1lICkgIT09IG51bGw7XG5cblx0XHR9LFxuXG5cdFx0aW5pdDogZnVuY3Rpb24gKCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0XHRcdGlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkge1xuXG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVwdGhfdGV4dHVyZScgKTtcblx0XHRcdFx0Z2V0RXh0ZW5zaW9uKCAnT0VTX3RleHR1cmVfZmxvYXQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApO1xuXHRcdFx0XHRnZXRFeHRlbnNpb24oICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU19lbGVtZW50X2luZGV4X3VpbnQnICk7XG5cdFx0XHRcdGdldEV4dGVuc2lvbiggJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0JyApO1xuXHRcdFx0XHRnZXRFeHRlbnNpb24oICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdldEV4dGVuc2lvbiggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKTtcblx0XHRcdGdldEV4dGVuc2lvbiggJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCcgKTtcblxuXHRcdH0sXG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHtcblxuXHRcdFx0Y29uc3QgZXh0ZW5zaW9uID0gZ2V0RXh0ZW5zaW9uKCBuYW1lICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6ICcgKyBuYW1lICsgJyBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4dGVuc2lvbjtcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMR2VvbWV0cmllcyggZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMgKSB7XG5cblx0Y29uc3QgZ2VvbWV0cmllcyA9IHt9O1xuXHRjb25zdCB3aXJlZnJhbWVBdHRyaWJ1dGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBvbkdlb21ldHJ5RGlzcG9zZSggZXZlbnQgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IGV2ZW50LnRhcmdldDtcblxuXHRcdGlmICggZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBnZW9tZXRyeS5pbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Zm9yICggY29uc3QgbmFtZSBpbiBnZW9tZXRyeS5hdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnJlbW92ZSggZ2VvbWV0cnkuYXR0cmlidXRlc1sgbmFtZSBdICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7XG5cblx0XHRkZWxldGUgZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGNvbnN0IGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBhdHRyaWJ1dGUgKSB7XG5cblx0XHRcdGF0dHJpYnV0ZXMucmVtb3ZlKCBhdHRyaWJ1dGUgKTtcblx0XHRcdHdpcmVmcmFtZUF0dHJpYnV0ZXMuZGVsZXRlKCBnZW9tZXRyeSApO1xuXG5cdFx0fVxuXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZHZW9tZXRyeSggZ2VvbWV0cnkgKTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0ZGVsZXRlIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50O1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGluZm8ubWVtb3J5Lmdlb21ldHJpZXMgLS07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0LCBnZW9tZXRyeSApIHtcblxuXHRcdGlmICggZ2VvbWV0cmllc1sgZ2VvbWV0cnkuaWQgXSA9PT0gdHJ1ZSApIHJldHVybiBnZW9tZXRyeTtcblxuXHRcdGdlb21ldHJ5LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTtcblxuXHRcdGdlb21ldHJpZXNbIGdlb21ldHJ5LmlkIF0gPSB0cnVlO1xuXG5cdFx0aW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKztcblxuXHRcdHJldHVybiBnZW9tZXRyeTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBnZW9tZXRyeSApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5QXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBVcGRhdGluZyBpbmRleCBidWZmZXIgaW4gVkFPIG5vdy4gU2VlIFdlYkdMQmluZGluZ1N0YXRlcy5cblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gZ2VvbWV0cnlBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggZ2VvbWV0cnlBdHRyaWJ1dGVzWyBuYW1lIF0sIDM0OTYyICk7XG5cblx0XHR9XG5cblx0XHQvLyBtb3JwaCB0YXJnZXRzXG5cblx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRhdHRyaWJ1dGVzLnVwZGF0ZSggYXJyYXlbIGkgXSwgMzQ5NjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdGNvbnN0IGdlb21ldHJ5UG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdGxldCB2ZXJzaW9uID0gMDtcblxuXHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5O1xuXHRcdFx0dmVyc2lvbiA9IGdlb21ldHJ5SW5kZXgudmVyc2lvbjtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdGNvbnN0IGEgPSBhcnJheVsgaSArIDAgXTtcblx0XHRcdFx0Y29uc3QgYiA9IGFycmF5WyBpICsgMSBdO1xuXHRcdFx0XHRjb25zdCBjID0gYXJyYXlbIGkgKyAyIF07XG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBiLCBjLCBjLCBhICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gZ2VvbWV0cnlQb3NpdGlvbi5hcnJheTtcblx0XHRcdHZlcnNpb24gPSBnZW9tZXRyeVBvc2l0aW9uLnZlcnNpb247XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gaSArIDA7XG5cdFx0XHRcdGNvbnN0IGIgPSBpICsgMTtcblx0XHRcdFx0Y29uc3QgYyA9IGkgKyAyO1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApO1xuXHRcdGF0dHJpYnV0ZS52ZXJzaW9uID0gdmVyc2lvbjtcblxuXHRcdC8vIFVwZGF0aW5nIGluZGV4IGJ1ZmZlciBpbiBWQU8gbm93LiBTZWUgV2ViR0xCaW5kaW5nU3RhdGVzXG5cblx0XHQvL1xuXG5cdFx0Y29uc3QgcHJldmlvdXNBdHRyaWJ1dGUgPSB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTtcblxuXHRcdGlmICggcHJldmlvdXNBdHRyaWJ1dGUgKSBhdHRyaWJ1dGVzLnJlbW92ZSggcHJldmlvdXNBdHRyaWJ1dGUgKTtcblxuXHRcdC8vXG5cblx0XHR3aXJlZnJhbWVBdHRyaWJ1dGVzLnNldCggZ2VvbWV0cnksIGF0dHJpYnV0ZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICkge1xuXG5cdFx0Y29uc3QgY3VycmVudEF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApO1xuXG5cdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlICkge1xuXG5cdFx0XHRjb25zdCBnZW9tZXRyeUluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cblx0XHRcdGlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyBpZiB0aGUgYXR0cmlidXRlIGlzIG9ic29sZXRlLCBjcmVhdGUgYSBuZXcgb25lXG5cblx0XHRcdFx0aWYgKCBjdXJyZW50QXR0cmlidXRlLnZlcnNpb24gPCBnZW9tZXRyeUluZGV4LnZlcnNpb24gKSB7XG5cblx0XHRcdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5ICk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGdldCxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblxuXHRcdGdldFdpcmVmcmFtZUF0dHJpYnV0ZTogZ2V0V2lyZWZyYW1lQXR0cmlidXRlXG5cblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblxuXHRsZXQgbW9kZTtcblxuXHRmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHtcblxuXHRcdG1vZGUgPSB2YWx1ZTtcblxuXHR9XG5cblx0bGV0IHR5cGUsIGJ5dGVzUGVyRWxlbWVudDtcblxuXHRmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7XG5cblx0XHR0eXBlID0gdmFsdWUudHlwZTtcblx0XHRieXRlc1BlckVsZW1lbnQgPSB2YWx1ZS5ieXRlc1BlckVsZW1lbnQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkge1xuXG5cdFx0Z2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTtcblxuXHRcdGluZm8udXBkYXRlKCBjb3VudCwgbW9kZSwgMSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJJbnN0YW5jZXMoIHN0YXJ0LCBjb3VudCwgcHJpbWNvdW50ICkge1xuXG5cdFx0aWYgKCBwcmltY291bnQgPT09IDAgKSByZXR1cm47XG5cblx0XHRsZXQgZXh0ZW5zaW9uLCBtZXRob2ROYW1lO1xuXG5cdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZ2w7XG5cdFx0XHRtZXRob2ROYW1lID0gJ2RyYXdFbGVtZW50c0luc3RhbmNlZCc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7XG5cdFx0XHRtZXRob2ROYW1lID0gJ2RyYXdFbGVtZW50c0luc3RhbmNlZEFOR0xFJztcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMSW5kZXhlZEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZXh0ZW5zaW9uWyBtZXRob2ROYW1lIF0oIG1vZGUsIGNvdW50LCB0eXBlLCBzdGFydCAqIGJ5dGVzUGVyRWxlbWVudCwgcHJpbWNvdW50ICk7XG5cblx0XHRpbmZvLnVwZGF0ZSggY291bnQsIG1vZGUsIHByaW1jb3VudCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdHRoaXMuc2V0TW9kZSA9IHNldE1vZGU7XG5cdHRoaXMuc2V0SW5kZXggPSBzZXRJbmRleDtcblx0dGhpcy5yZW5kZXIgPSByZW5kZXI7XG5cdHRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMSW5mbyggZ2wgKSB7XG5cblx0Y29uc3QgbWVtb3J5ID0ge1xuXHRcdGdlb21ldHJpZXM6IDAsXG5cdFx0dGV4dHVyZXM6IDBcblx0fTtcblxuXHRjb25zdCByZW5kZXIgPSB7XG5cdFx0ZnJhbWU6IDAsXG5cdFx0Y2FsbHM6IDAsXG5cdFx0dHJpYW5nbGVzOiAwLFxuXHRcdHBvaW50czogMCxcblx0XHRsaW5lczogMFxuXHR9O1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggY291bnQsIG1vZGUsIGluc3RhbmNlQ291bnQgKSB7XG5cblx0XHRyZW5kZXIuY2FsbHMgKys7XG5cblx0XHRzd2l0Y2ggKCBtb2RlICkge1xuXG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdHJlbmRlci50cmlhbmdsZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAzICk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAvIDIgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0cmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMSApO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHRyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqIGNvdW50O1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHRyZW5kZXIucG9pbnRzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZm86IFVua25vd24gZHJhdyBtb2RlOicsIG1vZGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0cmVuZGVyLmZyYW1lICsrO1xuXHRcdHJlbmRlci5jYWxscyA9IDA7XG5cdFx0cmVuZGVyLnRyaWFuZ2xlcyA9IDA7XG5cdFx0cmVuZGVyLnBvaW50cyA9IDA7XG5cdFx0cmVuZGVyLmxpbmVzID0gMDtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRtZW1vcnk6IG1lbW9yeSxcblx0XHRyZW5kZXI6IHJlbmRlcixcblx0XHRwcm9ncmFtczogbnVsbCxcblx0XHRhdXRvUmVzZXQ6IHRydWUsXG5cdFx0cmVzZXQ6IHJlc2V0LFxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gbnVtZXJpY2FsU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYVsgMCBdIC0gYlsgMCBdO1xuXG59XG5cbmZ1bmN0aW9uIGFic051bWVyaWNhbFNvcnQoIGEsIGIgKSB7XG5cblx0cmV0dXJuIE1hdGguYWJzKCBiWyAxIF0gKSAtIE1hdGguYWJzKCBhWyAxIF0gKTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wgKSB7XG5cblx0Y29uc3QgaW5mbHVlbmNlc0xpc3QgPSB7fTtcblx0Y29uc3QgbW9ycGhJbmZsdWVuY2VzID0gbmV3IEZsb2F0MzJBcnJheSggOCApO1xuXG5cdGNvbnN0IHdvcmtJbmZsdWVuY2VzID0gW107XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgODsgaSArKyApIHtcblxuXHRcdHdvcmtJbmZsdWVuY2VzWyBpIF0gPSBbIGksIDAgXTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApIHtcblxuXHRcdGNvbnN0IG9iamVjdEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzO1xuXG5cdFx0Ly8gV2hlbiBvYmplY3QgZG9lc24ndCBoYXZlIG1vcnBoIHRhcmdldCBpbmZsdWVuY2VzIGRlZmluZWQsIHdlIHRyZWF0IGl0IGFzIGEgMC1sZW5ndGggYXJyYXlcblx0XHQvLyBUaGlzIGlzIGltcG9ydGFudCB0byBtYWtlIHN1cmUgd2Ugc2V0IHVwIG1vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZSAvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1xuXG5cdFx0Y29uc3QgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkID8gMCA6IG9iamVjdEluZmx1ZW5jZXMubGVuZ3RoO1xuXG5cdFx0bGV0IGluZmx1ZW5jZXMgPSBpbmZsdWVuY2VzTGlzdFsgZ2VvbWV0cnkuaWQgXTtcblxuXHRcdGlmICggaW5mbHVlbmNlcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBpbml0aWFsaXNlIGxpc3RcblxuXHRcdFx0aW5mbHVlbmNlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0aW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07XG5cblx0XHRcdH1cblxuXHRcdFx0aW5mbHVlbmNlc0xpc3RbIGdlb21ldHJ5LmlkIF0gPSBpbmZsdWVuY2VzO1xuXG5cdFx0fVxuXG5cdFx0Ly8gQ29sbGVjdCBpbmZsdWVuY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTtcblxuXHRcdFx0aW5mbHVlbmNlWyAwIF0gPSBpO1xuXHRcdFx0aW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07XG5cblx0XHR9XG5cblx0XHRpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggaSA8IGxlbmd0aCAmJiBpbmZsdWVuY2VzWyBpIF1bIDEgXSApIHtcblxuXHRcdFx0XHR3b3JrSW5mbHVlbmNlc1sgaSBdWyAwIF0gPSBpbmZsdWVuY2VzWyBpIF1bIDAgXTtcblx0XHRcdFx0d29ya0luZmx1ZW5jZXNbIGkgXVsgMSBdID0gaW5mbHVlbmNlc1sgaSBdWyAxIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0d29ya0luZmx1ZW5jZXNbIGkgXVsgMCBdID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG5cdFx0XHRcdHdvcmtJbmZsdWVuY2VzWyBpIF1bIDEgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHdvcmtJbmZsdWVuY2VzLnNvcnQoIG51bWVyaWNhbFNvcnQgKTtcblxuXHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9IG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7XG5cblx0XHRsZXQgbW9ycGhJbmZsdWVuY2VzU3VtID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGluZmx1ZW5jZSA9IHdvcmtJbmZsdWVuY2VzWyBpIF07XG5cdFx0XHRjb25zdCBpbmRleCA9IGluZmx1ZW5jZVsgMCBdO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBpbmZsdWVuY2VbIDEgXTtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIgJiYgdmFsdWUgKSB7XG5cblx0XHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApICE9PSBtb3JwaFRhcmdldHNbIGluZGV4IF0gKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdtb3JwaFRhcmdldCcgKyBpLCBtb3JwaFRhcmdldHNbIGluZGV4IF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApICE9PSBtb3JwaE5vcm1hbHNbIGluZGV4IF0gKSB7XG5cblx0XHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdtb3JwaE5vcm1hbCcgKyBpLCBtb3JwaE5vcm1hbHNbIGluZGV4IF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTtcblx0XHRcdFx0bW9ycGhJbmZsdWVuY2VzU3VtICs9IHZhbHVlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggbW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lmhhc0F0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdGdlb21ldHJ5LmRlbGV0ZUF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBtb3JwaE5vcm1hbHMgJiYgZ2VvbWV0cnkuaGFzQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Z2VvbWV0cnkuZGVsZXRlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRtb3JwaEluZmx1ZW5jZXNbIGkgXSA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEdMU0wgc2hhZGVyIHVzZXMgZm9ybXVsYSBiYXNlaW5mbHVlbmNlICogYmFzZSArIHN1bSh0YXJnZXQgKiBpbmZsdWVuY2UpXG5cdFx0Ly8gVGhpcyBhbGxvd3MgdXMgdG8gc3dpdGNoIGJldHdlZW4gYWJzb2x1dGUgbW9ycGhzIGFuZCByZWxhdGl2ZSBtb3JwaHMgd2l0aG91dCBjaGFuZ2luZyBzaGFkZXIgY29kZVxuXHRcdC8vIFdoZW4gYmFzZWluZmx1ZW5jZSA9IDEgLSBzdW0oaW5mbHVlbmNlKSwgdGhlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG8gc3VtKCh0YXJnZXQgLSBiYXNlKSAqIGluZmx1ZW5jZSlcblx0XHRjb25zdCBtb3JwaEJhc2VJbmZsdWVuY2UgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHNSZWxhdGl2ZSA/IDEgOiAxIC0gbW9ycGhJbmZsdWVuY2VzU3VtO1xuXG5cdFx0cHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0QmFzZUluZmx1ZW5jZScsIG1vcnBoQmFzZUluZmx1ZW5jZSApO1xuXHRcdHByb2dyYW0uZ2V0VW5pZm9ybXMoKS5zZXRWYWx1ZSggZ2wsICdtb3JwaFRhcmdldEluZmx1ZW5jZXMnLCBtb3JwaEluZmx1ZW5jZXMgKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdHVwZGF0ZTogdXBkYXRlXG5cblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdsLCBnZW9tZXRyaWVzLCBhdHRyaWJ1dGVzLCBpbmZvICkge1xuXG5cdGxldCB1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkge1xuXG5cdFx0Y29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5O1xuXHRcdGNvbnN0IGJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cmllcy5nZXQoIG9iamVjdCwgZ2VvbWV0cnkgKTtcblxuXHRcdC8vIFVwZGF0ZSBvbmNlIHBlciBmcmFtZVxuXG5cdFx0aWYgKCB1cGRhdGVNYXAuZ2V0KCBidWZmZXJnZW9tZXRyeSApICE9PSBmcmFtZSApIHtcblxuXHRcdFx0Z2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7XG5cblx0XHRcdHVwZGF0ZU1hcC5zZXQoIGJ1ZmZlcmdlb21ldHJ5LCBmcmFtZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5oYXNFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uSW5zdGFuY2VkTWVzaERpc3Bvc2UgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGF0dHJpYnV0ZXMudXBkYXRlKCBvYmplY3QuaW5zdGFuY2VNYXRyaXgsIDM0OTYyICk7XG5cblx0XHRcdGlmICggb2JqZWN0Lmluc3RhbmNlQ29sb3IgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0YXR0cmlidXRlcy51cGRhdGUoIG9iamVjdC5pbnN0YW5jZUNvbG9yLCAzNDk2MiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYnVmZmVyZ2VvbWV0cnk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHR1cGRhdGVNYXAgPSBuZXcgV2Vha01hcCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvbkluc3RhbmNlZE1lc2hEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IGluc3RhbmNlZE1lc2ggPSBldmVudC50YXJnZXQ7XG5cblx0XHRpbnN0YW5jZWRNZXNoLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25JbnN0YW5jZWRNZXNoRGlzcG9zZSApO1xuXG5cdFx0YXR0cmlidXRlcy5yZW1vdmUoIGluc3RhbmNlZE1lc2guaW5zdGFuY2VNYXRyaXggKTtcblxuXHRcdGlmICggaW5zdGFuY2VkTWVzaC5pbnN0YW5jZUNvbG9yICE9PSBudWxsICkgYXR0cmlidXRlcy5yZW1vdmUoIGluc3RhbmNlZE1lc2guaW5zdGFuY2VDb2xvciApO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXG5cdFx0dXBkYXRlOiB1cGRhdGUsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXG5cdH07XG5cbn1cblxuY2xhc3MgRGF0YVRleHR1cmUyREFycmF5IGV4dGVuZHMgVGV4dHVyZSB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEgPSBudWxsLCB3aWR0aCA9IDEsIGhlaWdodCA9IDEsIGRlcHRoID0gMSApIHtcblxuXHRcdHN1cGVyKCBudWxsICk7XG5cblx0XHR0aGlzLmltYWdlID0geyBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXHRcdHRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjtcblxuXHRcdHRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nO1xuXG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuRGF0YVRleHR1cmUyREFycmF5LnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlMkRBcnJheSA9IHRydWU7XG5cbmNsYXNzIERhdGFUZXh0dXJlM0QgZXh0ZW5kcyBUZXh0dXJlIHtcblxuXHRjb25zdHJ1Y3RvciggZGF0YSA9IG51bGwsIHdpZHRoID0gMSwgaGVpZ2h0ID0gMSwgZGVwdGggPSAxICkge1xuXG5cdFx0Ly8gV2UncmUgZ29pbmcgdG8gYWRkIC5zZXRYWFgoKSBtZXRob2RzIGZvciBzZXR0aW5nIHByb3BlcnRpZXMgbGF0ZXIuXG5cdFx0Ly8gVXNlcnMgY2FuIHN0aWxsIHNldCBpbiBEYXRhVGV4dHVyZTNEIGRpcmVjdGx5LlxuXHRcdC8vXG5cdFx0Ly9cdGNvbnN0IHRleHR1cmUgPSBuZXcgVEhSRUUuRGF0YVRleHR1cmUzRCggZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTtcblx0XHQvLyBcdHRleHR1cmUuYW5pc290cm9weSA9IDE2O1xuXHRcdC8vXG5cdFx0Ly8gU2VlICMxNDgzOVxuXG5cdFx0c3VwZXIoIG51bGwgKTtcblxuXHRcdHRoaXMuaW1hZ2UgPSB7IGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoIH07XG5cblx0XHR0aGlzLm1hZ0ZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBOZWFyZXN0RmlsdGVyO1xuXG5cdFx0dGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdHRoaXMuZmxpcFkgPSBmYWxzZTtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdH1cblxufVxuXG5EYXRhVGV4dHVyZTNELnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0QgPSB0cnVlO1xuXG4vKipcbiAqIFVuaWZvcm1zIG9mIGEgcHJvZ3JhbS5cbiAqIFRob3NlIGZvcm0gYSB0cmVlIHN0cnVjdHVyZSB3aXRoIGEgc3BlY2lhbCB0b3AtbGV2ZWwgY29udGFpbmVyIGZvciB0aGUgcm9vdCxcbiAqIHdoaWNoIHlvdSBnZXQgYnkgY2FsbGluZyAnbmV3IFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICknLlxuICpcbiAqXG4gKiBQcm9wZXJ0aWVzIG9mIGlubmVyIG5vZGVzIGluY2x1ZGluZyB0aGUgdG9wLWxldmVsIGNvbnRhaW5lcjpcbiAqXG4gKiAuc2VxIC0gYXJyYXkgb2YgbmVzdGVkIHVuaWZvcm1zXG4gKiAubWFwIC0gbmVzdGVkIHVuaWZvcm1zIGJ5IG5hbWVcbiAqXG4gKlxuICogTWV0aG9kcyBvZiBhbGwgbm9kZXMgZXhjZXB0IHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIHZhbHVlLCBbdGV4dHVyZXNdIClcbiAqXG4gKiBcdFx0dXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocylcbiAqICBcdHRoZSAndGV4dHVyZXMnIHBhcmFtZXRlciBpcyBuZWVkZWQgZm9yIHNhbXBsZXIgdW5pZm9ybXNcbiAqXG4gKlxuICogU3RhdGljIG1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKTpcbiAqXG4gKiAudXBsb2FkKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzIClcbiAqXG4gKiBcdFx0c2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZSdcbiAqXG4gKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXFcbiAqXG4gKiBcdFx0ZmlsdGVycyAnc2VxJyBlbnRyaWVzIHdpdGggY29ycmVzcG9uZGluZyBlbnRyeSBpbiB2YWx1ZXNcbiAqXG4gKlxuICogTWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAodGV4dHVyZXMgZmFjdG9yaXphdGlvbnMpOlxuICpcbiAqIC5zZXRWYWx1ZSggZ2wsIG5hbWUsIHZhbHVlLCB0ZXh0dXJlcyApXG4gKlxuICogXHRcdHNldHMgdW5pZm9ybSB3aXRoICBuYW1lICduYW1lJyB0byAndmFsdWUnXG4gKlxuICogLnNldE9wdGlvbmFsKCBnbCwgb2JqLCBwcm9wIClcbiAqXG4gKiBcdFx0bGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0XG4gKlxuICovXG5cbmNvbnN0IGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7XG5jb25zdCBlbXB0eVRleHR1cmUyZEFycmF5ID0gbmV3IERhdGFUZXh0dXJlMkRBcnJheSgpO1xuY29uc3QgZW1wdHlUZXh0dXJlM2QgPSBuZXcgRGF0YVRleHR1cmUzRCgpO1xuY29uc3QgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG4vLyAtLS0gVXRpbGl0aWVzIC0tLVxuXG4vLyBBcnJheSBDYWNoZXMgKHByb3ZpZGUgdHlwZWQgYXJyYXlzIGZvciB0ZW1wb3JhcnkgYnkgc2l6ZSlcblxuY29uc3QgYXJyYXlDYWNoZUYzMiA9IFtdO1xuY29uc3QgYXJyYXlDYWNoZUkzMiA9IFtdO1xuXG4vLyBGbG9hdDMyQXJyYXkgY2FjaGVzIHVzZWQgZm9yIHVwbG9hZGluZyBNYXRyaXggdW5pZm9ybXNcblxuY29uc3QgbWF0NGFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggMTYgKTtcbmNvbnN0IG1hdDNhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDkgKTtcbmNvbnN0IG1hdDJhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDQgKTtcblxuLy8gRmxhdHRlbmluZyBmb3IgYXJyYXlzIG9mIHZlY3RvcnMgYW5kIG1hdHJpY2VzXG5cbmZ1bmN0aW9uIGZsYXR0ZW4oIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7XG5cblx0Y29uc3QgZmlyc3RFbGVtID0gYXJyYXlbIDAgXTtcblxuXHRpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7XG5cdC8vIHVub3B0aW1pemVkOiAhIGlzTmFOKCBmaXJzdEVsZW0gKVxuXHQvLyBzZWUgaHR0cDovL2phY2tzb25kdW5zdGFuLmNvbS9hcnRpY2xlcy85ODNcblxuXHRjb25zdCBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZTtcblx0bGV0IHIgPSBhcnJheUNhY2hlRjMyWyBuIF07XG5cblx0aWYgKCByID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyID0gbmV3IEZsb2F0MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVGMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGlmICggbkJsb2NrcyAhPT0gMCApIHtcblxuXHRcdGZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7XG5cblx0XHRcdG9mZnNldCArPSBibG9ja1NpemU7XG5cdFx0XHRhcnJheVsgaSBdLnRvQXJyYXkoIHIsIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcjtcblxufVxuXG5mdW5jdGlvbiBhcnJheXNFcXVhbCggYSwgYiApIHtcblxuXHRpZiAoIGEubGVuZ3RoICE9PSBiLmxlbmd0aCApIHJldHVybiBmYWxzZTtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBhLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRpZiAoIGFbIGkgXSAhPT0gYlsgaSBdICkgcmV0dXJuIGZhbHNlO1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG5mdW5jdGlvbiBjb3B5QXJyYXkoIGEsIGIgKSB7XG5cblx0Zm9yICggbGV0IGkgPSAwLCBsID0gYi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0YVsgaSBdID0gYlsgaSBdO1xuXG5cdH1cblxufVxuXG4vLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvblxuXG5mdW5jdGlvbiBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApIHtcblxuXHRsZXQgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTtcblxuXHRpZiAoIHIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdHIgPSBuZXcgSW50MzJBcnJheSggbiApO1xuXHRcdGFycmF5Q2FjaGVJMzJbIG4gXSA9IHI7XG5cblx0fVxuXG5cdGZvciAoIGxldCBpID0gMDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdHJbIGkgXSA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHR9XG5cblx0cmV0dXJuIHI7XG5cbn1cblxuLy8gLS0tIFNldHRlcnMgLS0tXG5cbi8vIE5vdGU6IERlZmluaW5nIHRoZXNlIG1ldGhvZHMgZXh0ZXJuYWxseSwgYmVjYXVzZSB0aGV5IGNvbWUgaW4gYSBidW5jaFxuLy8gYW5kIHRoaXMgd2F5IHRoZWlyIG5hbWVzIG1pbmlmeS5cblxuLy8gU2luZ2xlIHNjYWxhclxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggY2FjaGVbIDAgXSA9PT0gdiApIHJldHVybjtcblxuXHRnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNhY2hlWyAwIF0gPSB2O1xuXG59XG5cbi8vIFNpbmdsZSBmbG9hdCB2ZWN0b3IgKGZyb20gZmxhdCBhcnJheSBvciBUSFJFRS5WZWN0b3JOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzZiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggdi54ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYueCB8fCBjYWNoZVsgMSBdICE9PSB2LnkgfHwgY2FjaGVbIDIgXSAhPT0gdi56ICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi54O1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYueTtcblx0XHRcdGNhY2hlWyAyIF0gPSB2Lno7XG5cblx0XHR9XG5cblx0fSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGNhY2hlWyAwIF0gIT09IHYuciB8fCBjYWNoZVsgMSBdICE9PSB2LmcgfHwgY2FjaGVbIDIgXSAhPT0gdi5iICkge1xuXG5cdFx0XHRnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi5yLCB2LmcsIHYuYiApO1xuXG5cdFx0XHRjYWNoZVsgMCBdID0gdi5yO1xuXHRcdFx0Y2FjaGVbIDEgXSA9IHYuZztcblx0XHRcdGNhY2hlWyAyIF0gPSB2LmI7XG5cblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGYoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7XG5cblx0XHRcdGdsLnVuaWZvcm00ZiggdGhpcy5hZGRyLCB2LngsIHYueSwgdi56LCB2LncgKTtcblxuXHRcdFx0Y2FjaGVbIDAgXSA9IHYueDtcblx0XHRcdGNhY2hlWyAxIF0gPSB2Lnk7XG5cdFx0XHRjYWNoZVsgMiBdID0gdi56O1xuXHRcdFx0Y2FjaGVbIDMgXSA9IHYudztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm00ZnYoIHRoaXMuYWRkciwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH1cblxufVxuXG4vLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgVEhSRUUuTWF0cml4TilcblxuZnVuY3Rpb24gc2V0VmFsdWVNMiggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHRjb25zdCBlbGVtZW50cyA9IHYuZWxlbWVudHM7XG5cblx0aWYgKCBlbGVtZW50cyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXgyZnYoIHRoaXMuYWRkciwgZmFsc2UsIHYgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIGVsZW1lbnRzICkgKSByZXR1cm47XG5cblx0XHRtYXQyYXJyYXkuc2V0KCBlbGVtZW50cyApO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgbWF0MmFycmF5ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCBlbGVtZW50cyApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0zKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdGNvbnN0IGVsZW1lbnRzID0gdi5lbGVtZW50cztcblxuXHRpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdFx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjtcblxuXHRcdG1hdDNhcnJheS5zZXQoIGVsZW1lbnRzICk7XG5cblx0XHRnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTtcblxuXHRcdGNvcHlBcnJheSggY2FjaGUsIGVsZW1lbnRzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTQoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgZWxlbWVudHMgPSB2LmVsZW1lbnRzO1xuXG5cdGlmICggZWxlbWVudHMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0XHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCB2ICk7XG5cblx0XHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCBlbGVtZW50cyApICkgcmV0dXJuO1xuXG5cdFx0bWF0NGFycmF5LnNldCggZWxlbWVudHMgKTtcblxuXHRcdGdsLnVuaWZvcm1NYXRyaXg0ZnYoIHRoaXMuYWRkciwgZmFsc2UsIG1hdDRhcnJheSApO1xuXG5cdFx0Y29weUFycmF5KCBjYWNoZSwgZWxlbWVudHMgKTtcblxuXHR9XG5cbn1cblxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjFpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gU2luZ2xlIGludGVnZXIgLyBib29sZWFuIHZlY3RvciAoZnJvbSBmbGF0IGFycmF5KVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNGkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG4vLyBTaW5nbGUgdW5zaWduZWQgaW50ZWdlclxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxdWkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gPT09IHYgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTF1aSggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y2FjaGVbIDAgXSA9IHY7XG5cbn1cblxuLy8gU2luZ2xlIHVuc2lnbmVkIGludGVnZXIgdmVjdG9yIChmcm9tIGZsYXQgYXJyYXkpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJ1aSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47XG5cblx0Z2wudW5pZm9ybTJ1aXYoIHRoaXMuYWRkciwgdiApO1xuXG5cdGNvcHlBcnJheSggY2FjaGUsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzdWkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuO1xuXG5cdGdsLnVuaWZvcm0zdWl2KCB0aGlzLmFkZHIsIHYgKTtcblxuXHRjb3B5QXJyYXkoIGNhY2hlLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWNHVpKCBnbCwgdiApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0aWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjtcblxuXHRnbC51bmlmb3JtNHVpdiggdGhpcy5hZGRyLCB2ICk7XG5cblx0Y29weUFycmF5KCBjYWNoZSwgdiApO1xuXG59XG5cblxuLy8gU2luZ2xlIHRleHR1cmUgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMSggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHR0ZXh0dXJlcy5zYWZlU2V0VGV4dHVyZTJEKCB2IHx8IGVtcHR5VGV4dHVyZSwgdW5pdCApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVDNEMSggZ2wsIHYsIHRleHR1cmVzICkge1xuXG5cdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblx0Y29uc3QgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtcblxuXHRpZiAoIGNhY2hlWyAwIF0gIT09IHVuaXQgKSB7XG5cblx0XHRnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdW5pdCApO1xuXHRcdGNhY2hlWyAwIF0gPSB1bml0O1xuXG5cdH1cblxuXHR0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoIHYgfHwgZW1wdHlUZXh0dXJlM2QsIHVuaXQgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2KCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHRjb25zdCB1bml0ID0gdGV4dHVyZXMuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO1xuXG5cdGlmICggY2FjaGVbIDAgXSAhPT0gdW5pdCApIHtcblxuXHRcdGdsLnVuaWZvcm0xaSggdGhpcy5hZGRyLCB1bml0ICk7XG5cdFx0Y2FjaGVbIDAgXSA9IHVuaXQ7XG5cblx0fVxuXG5cdHRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZSggdiB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVUMkRBcnJheTEoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdGNvbnN0IHVuaXQgPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7XG5cblx0aWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkge1xuXG5cdFx0Z2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTtcblx0XHRjYWNoZVsgMCBdID0gdW5pdDtcblxuXHR9XG5cblx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIHYgfHwgZW1wdHlUZXh0dXJlMmRBcnJheSwgdW5pdCApO1xuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIHRoZSBzaW5ndWxhciBjYXNlXG5cbmZ1bmN0aW9uIGdldFNpbmd1bGFyU2V0dGVyKCB0eXBlICkge1xuXG5cdHN3aXRjaCAoIHR5cGUgKSB7XG5cblx0XHRjYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlVjFmOyAvLyBGTE9BVFxuXHRcdGNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmY7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZjsgLy8gX1ZFQzNcblx0XHRjYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRmOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWE6IHJldHVybiBzZXRWYWx1ZU0yOyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNMzsgLy8gX01BVDNcblx0XHRjYXNlIDB4OGI1YzogcmV0dXJuIHNldFZhbHVlTTQ7IC8vIF9NQVQ0XG5cblx0XHRjYXNlIDB4MTQwNDogY2FzZSAweDhiNTY6IHJldHVybiBzZXRWYWx1ZVYxaTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmk7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWVWM2k7IC8vIF9WRUMzXG5cdFx0Y2FzZSAweDhiNTU6IGNhc2UgMHg4YjU5OiByZXR1cm4gc2V0VmFsdWVWNGk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aTsgLy8gVUlOVFxuXHRcdGNhc2UgMHg4ZGM2OiByZXR1cm4gc2V0VmFsdWVWMnVpOyAvLyBfVkVDMlxuXHRcdGNhc2UgMHg4ZGM3OiByZXR1cm4gc2V0VmFsdWVWM3VpOyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpOyAvLyBfVkVDNFxuXG5cdFx0Y2FzZSAweDhiNWU6IC8vIFNBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGQ2NjogLy8gU0FNUExFUl9FWFRFUk5BTF9PRVNcblx0XHRjYXNlIDB4OGRjYTogLy8gSU5UX1NBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGRkMjogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfMkRcblx0XHRjYXNlIDB4OGI2MjogLy8gU0FNUExFUl8yRF9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQxO1xuXG5cdFx0Y2FzZSAweDhiNWY6IC8vIFNBTVBMRVJfM0Rcblx0XHRjYXNlIDB4OGRjYjogLy8gSU5UX1NBTVBMRVJfM0Rcblx0XHRjYXNlIDB4OGRkMzogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfM0Rcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQzRDE7XG5cblx0XHRjYXNlIDB4OGI2MDogLy8gU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkY2M6IC8vIElOVF9TQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRkNDogLy8gVU5TSUdORURfSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGM1OiAvLyBTQU1QTEVSX0NVQkVfU0hBRE9XXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUNjtcblxuXHRcdGNhc2UgMHg4ZGMxOiAvLyBTQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkY2Y6IC8vIElOVF9TQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkZDc6IC8vIFVOU0lHTkVEX0lOVF9TQU1QTEVSXzJEX0FSUkFZXG5cdFx0Y2FzZSAweDhkYzQ6IC8vIFNBTVBMRVJfMkRfQVJSQVlfU0hBRE9XXG5cdFx0XHRyZXR1cm4gc2V0VmFsdWVUMkRBcnJheTE7XG5cblx0fVxuXG59XG5cblxuLy8gQXJyYXkgb2Ygc2NhbGFyc1xuXG5mdW5jdGlvbiBzZXRWYWx1ZVYxZkFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBBcnJheSBvZiB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkgb3IgYXJyYXkgb2YgVEhSRUUuVmVjdG9yTilcblxuZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMiApO1xuXG5cdGdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlVjNmQXJyYXkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDMgKTtcblxuXHRnbC51bmlmb3JtM2Z2KCB0aGlzLmFkZHIsIGRhdGEgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0ZkFycmF5KCBnbCwgdiApIHtcblxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA0ICk7XG5cblx0Z2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZyb20gZmxhdCBhcnJheSBvciBhcnJheSBvZiBUSFJFRS5NYXRyaXhOKVxuXG5mdW5jdGlvbiBzZXRWYWx1ZU0yQXJyYXkoIGdsLCB2ICkge1xuXG5cdGNvbnN0IGRhdGEgPSBmbGF0dGVuKCB2LCB0aGlzLnNpemUsIDQgKTtcblxuXHRnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVNM0FycmF5KCBnbCwgdiApIHtcblxuXHRjb25zdCBkYXRhID0gZmxhdHRlbiggdiwgdGhpcy5zaXplLCA5ICk7XG5cblx0Z2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZGF0YSApO1xuXG59XG5cbmZ1bmN0aW9uIHNldFZhbHVlTTRBcnJheSggZ2wsIHYgKSB7XG5cblx0Y29uc3QgZGF0YSA9IGZsYXR0ZW4oIHYsIHRoaXMuc2l6ZSwgMTYgKTtcblxuXHRnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgaW50ZWdlciAvIGJvb2xlYW5cblxuZnVuY3Rpb24gc2V0VmFsdWVWMWlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTFpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgaW50ZWdlciAvIGJvb2xlYW4gdmVjdG9ycyAoZnJvbSBmbGF0IGFycmF5KVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYyaUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVYzaUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtNGl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG4vLyBBcnJheSBvZiB1bnNpZ25lZCBpbnRlZ2VyXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjF1aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMXVpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuLy8gQXJyYXkgb2YgdW5zaWduZWQgaW50ZWdlciB2ZWN0b3JzIChmcm9tIGZsYXQgYXJyYXkpXG5cbmZ1bmN0aW9uIHNldFZhbHVlVjJ1aUFycmF5KCBnbCwgdiApIHtcblxuXHRnbC51bmlmb3JtMnVpdiggdGhpcy5hZGRyLCB2ICk7XG5cbn1cblxuZnVuY3Rpb24gc2V0VmFsdWVWM3VpQXJyYXkoIGdsLCB2ICkge1xuXG5cdGdsLnVuaWZvcm0zdWl2KCB0aGlzLmFkZHIsIHYgKTtcblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVY0dWlBcnJheSggZ2wsIHYgKSB7XG5cblx0Z2wudW5pZm9ybTR1aXYoIHRoaXMuYWRkciwgdiApO1xuXG59XG5cblxuLy8gQXJyYXkgb2YgdGV4dHVyZXMgKDJEIC8gQ3ViZSlcblxuZnVuY3Rpb24gc2V0VmFsdWVUMUFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7XG5cblx0Y29uc3QgbiA9IHYubGVuZ3RoO1xuXG5cdGNvbnN0IHVuaXRzID0gYWxsb2NUZXhVbml0cyggdGV4dHVyZXMsIG4gKTtcblxuXHRnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0dGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBzZXRWYWx1ZVQ2QXJyYXkoIGdsLCB2LCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBuID0gdi5sZW5ndGg7XG5cblx0Y29uc3QgdW5pdHMgPSBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApO1xuXG5cdGdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHR0ZXh0dXJlcy5zYWZlU2V0VGV4dHVyZUN1YmUoIHZbIGkgXSB8fCBlbXB0eUN1YmVUZXh0dXJlLCB1bml0c1sgaSBdICk7XG5cblx0fVxuXG59XG5cbi8vIEhlbHBlciB0byBwaWNrIHRoZSByaWdodCBzZXR0ZXIgZm9yIGEgcHVyZSAoYm90dG9tLWxldmVsKSBhcnJheVxuXG5mdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7XG5cblx0c3dpdGNoICggdHlwZSApIHtcblxuXHRcdGNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWZBcnJheTsgLy8gRkxPQVRcblx0XHRjYXNlIDB4OGI1MDogcmV0dXJuIHNldFZhbHVlVjJmQXJyYXk7IC8vIF9WRUMyXG5cdFx0Y2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZkFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGZBcnJheTsgLy8gX1ZFQzRcblxuXHRcdGNhc2UgMHg4YjVhOiByZXR1cm4gc2V0VmFsdWVNMkFycmF5OyAvLyBfTUFUMlxuXHRcdGNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNM0FycmF5OyAvLyBfTUFUM1xuXHRcdGNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNEFycmF5OyAvLyBfTUFUNFxuXG5cdFx0Y2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWlBcnJheTsgLy8gSU5ULCBCT09MXG5cdFx0Y2FzZSAweDhiNTM6IGNhc2UgMHg4YjU3OiByZXR1cm4gc2V0VmFsdWVWMmlBcnJheTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGI1NDogY2FzZSAweDhiNTg6IHJldHVybiBzZXRWYWx1ZVYzaUFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpQXJyYXk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4MTQwNTogcmV0dXJuIHNldFZhbHVlVjF1aUFycmF5OyAvLyBVSU5UXG5cdFx0Y2FzZSAweDhkYzY6IHJldHVybiBzZXRWYWx1ZVYydWlBcnJheTsgLy8gX1ZFQzJcblx0XHRjYXNlIDB4OGRjNzogcmV0dXJuIHNldFZhbHVlVjN1aUFycmF5OyAvLyBfVkVDM1xuXHRcdGNhc2UgMHg4ZGM4OiByZXR1cm4gc2V0VmFsdWVWNHVpQXJyYXk7IC8vIF9WRUM0XG5cblx0XHRjYXNlIDB4OGI1ZTogLy8gU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZDY2OiAvLyBTQU1QTEVSX0VYVEVSTkFMX09FU1xuXHRcdGNhc2UgMHg4ZGNhOiAvLyBJTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4ZGQyOiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl8yRFxuXHRcdGNhc2UgMHg4YjYyOiAvLyBTQU1QTEVSXzJEX1NIQURPV1xuXHRcdFx0cmV0dXJuIHNldFZhbHVlVDFBcnJheTtcblxuXHRcdGNhc2UgMHg4YjYwOiAvLyBTQU1QTEVSX0NVQkVcblx0XHRjYXNlIDB4OGRjYzogLy8gSU5UX1NBTVBMRVJfQ1VCRVxuXHRcdGNhc2UgMHg4ZGQ0OiAvLyBVTlNJR05FRF9JTlRfU0FNUExFUl9DVUJFXG5cdFx0Y2FzZSAweDhkYzU6IC8vIFNBTVBMRVJfQ1VCRV9TSEFET1dcblx0XHRcdHJldHVybiBzZXRWYWx1ZVQ2QXJyYXk7XG5cblx0fVxuXG59XG5cbi8vIC0tLSBVbmlmb3JtIENsYXNzZXMgLS0tXG5cbmZ1bmN0aW9uIFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblx0dGhpcy5hZGRyID0gYWRkcjtcblx0dGhpcy5jYWNoZSA9IFtdO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0U2luZ3VsYXJTZXR0ZXIoIGFjdGl2ZUluZm8udHlwZSApO1xuXG5cdC8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUdcblxufVxuXG5mdW5jdGlvbiBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHtcblxuXHR0aGlzLmlkID0gaWQ7XG5cdHRoaXMuYWRkciA9IGFkZHI7XG5cdHRoaXMuY2FjaGUgPSBbXTtcblx0dGhpcy5zaXplID0gYWN0aXZlSW5mby5zaXplO1xuXHR0aGlzLnNldFZhbHVlID0gZ2V0UHVyZUFycmF5U2V0dGVyKCBhY3RpdmVJbmZvLnR5cGUgKTtcblxuXHQvLyB0aGlzLnBhdGggPSBhY3RpdmVJbmZvLm5hbWU7IC8vIERFQlVHXG5cbn1cblxuUHVyZUFycmF5VW5pZm9ybS5wcm90b3R5cGUudXBkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdGlmICggZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBjYWNoZS5sZW5ndGggIT09IGRhdGEubGVuZ3RoICkge1xuXG5cdFx0dGhpcy5jYWNoZSA9IG5ldyBGbG9hdDMyQXJyYXkoIGRhdGEubGVuZ3RoICk7XG5cblx0fVxuXG5cdGNvcHlBcnJheSggY2FjaGUsIGRhdGEgKTtcblxufTtcblxuZnVuY3Rpb24gU3RydWN0dXJlZFVuaWZvcm0oIGlkICkge1xuXG5cdHRoaXMuaWQgPSBpZDtcblxuXHR0aGlzLnNlcSA9IFtdO1xuXHR0aGlzLm1hcCA9IHt9O1xuXG59XG5cblN0cnVjdHVyZWRVbmlmb3JtLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIHZhbHVlLCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCBzZXEgPSB0aGlzLnNlcTtcblxuXHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0Y29uc3QgdSA9IHNlcVsgaSBdO1xuXHRcdHUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdLCB0ZXh0dXJlcyApO1xuXG5cdH1cblxufTtcblxuLy8gLS0tIFRvcC1sZXZlbCAtLS1cblxuLy8gUGFyc2VyIC0gYnVpbGRzIHVwIHRoZSBwcm9wZXJ0eSB0cmVlIGZyb20gdGhlIHBhdGggc3RyaW5nc1xuXG5jb25zdCBSZVBhdGhQYXJ0ID0gLyhcXHcrKShcXF0pPyhcXFt8XFwuKT8vZztcblxuLy8gZXh0cmFjdHNcbi8vIFx0LSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpXG4vLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KVxuLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3JpcHQpXG4vL1xuLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmRcbi8vIGFsbG93IHN0cmFpZ2h0Zm9yd2FyZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzXG4vLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy5cblxuZnVuY3Rpb24gYWRkVW5pZm9ybSggY29udGFpbmVyLCB1bmlmb3JtT2JqZWN0ICkge1xuXG5cdGNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApO1xuXHRjb250YWluZXIubWFwWyB1bmlmb3JtT2JqZWN0LmlkIF0gPSB1bmlmb3JtT2JqZWN0O1xuXG59XG5cbmZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkge1xuXG5cdGNvbnN0IHBhdGggPSBhY3RpdmVJbmZvLm5hbWUsXG5cdFx0cGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoO1xuXG5cdC8vIHJlc2V0IFJlZ0V4cCBvYmplY3QsIGJlY2F1c2Ugb2YgdGhlIGVhcmx5IGV4aXQgb2YgYSBwcmV2aW91cyBydW5cblx0UmVQYXRoUGFydC5sYXN0SW5kZXggPSAwO1xuXG5cdHdoaWxlICggdHJ1ZSApIHtcblxuXHRcdGNvbnN0IG1hdGNoID0gUmVQYXRoUGFydC5leGVjKCBwYXRoICksXG5cdFx0XHRtYXRjaEVuZCA9IFJlUGF0aFBhcnQubGFzdEluZGV4O1xuXG5cdFx0bGV0IGlkID0gbWF0Y2hbIDEgXTtcblx0XHRjb25zdCBpZElzSW5kZXggPSBtYXRjaFsgMiBdID09PSAnXScsXG5cdFx0XHRzdWJzY3JpcHQgPSBtYXRjaFsgMyBdO1xuXG5cdFx0aWYgKCBpZElzSW5kZXggKSBpZCA9IGlkIHwgMDsgLy8gY29udmVydCB0byBpbnRlZ2VyXG5cblx0XHRpZiAoIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkIHx8IHN1YnNjcmlwdCA9PT0gJ1snICYmIG1hdGNoRW5kICsgMiA9PT0gcGF0aExlbmd0aCApIHtcblxuXHRcdFx0Ly8gYmFyZSBuYW1lIG9yIFwicHVyZVwiIGJvdHRvbS1sZXZlbCBhcnJheSBcIlswXVwiIHN1ZmZpeFxuXG5cdFx0XHRhZGRVbmlmb3JtKCBjb250YWluZXIsIHN1YnNjcmlwdCA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0bmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOlxuXHRcdFx0XHRuZXcgUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSApO1xuXG5cdFx0XHRicmVhaztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdFxuXG5cdFx0XHRjb25zdCBtYXAgPSBjb250YWluZXIubWFwO1xuXHRcdFx0bGV0IG5leHQgPSBtYXBbIGlkIF07XG5cblx0XHRcdGlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdG5leHQgPSBuZXcgU3RydWN0dXJlZFVuaWZvcm0oIGlkICk7XG5cdFx0XHRcdGFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnRhaW5lciA9IG5leHQ7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbi8vIFJvb3QgQ29udGFpbmVyXG5cbmZ1bmN0aW9uIFdlYkdMVW5pZm9ybXMoIGdsLCBwcm9ncmFtICkge1xuXG5cdHRoaXMuc2VxID0gW107XG5cdHRoaXMubWFwID0ge307XG5cblx0Y29uc3QgbiA9IGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIDM1NzE4ICk7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbjsgKysgaSApIHtcblxuXHRcdGNvbnN0IGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksXG5cdFx0XHRhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTtcblxuXHRcdHBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApO1xuXG5cdH1cblxufVxuXG5XZWJHTFVuaWZvcm1zLnByb3RvdHlwZS5zZXRWYWx1ZSA9IGZ1bmN0aW9uICggZ2wsIG5hbWUsIHZhbHVlLCB0ZXh0dXJlcyApIHtcblxuXHRjb25zdCB1ID0gdGhpcy5tYXBbIG5hbWUgXTtcblxuXHRpZiAoIHUgIT09IHVuZGVmaW5lZCApIHUuc2V0VmFsdWUoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKTtcblxufTtcblxuV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBmdW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7XG5cblx0Y29uc3QgdiA9IG9iamVjdFsgbmFtZSBdO1xuXG5cdGlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTtcblxufTtcblxuXG4vLyBTdGF0aWMgaW50ZXJmYWNlXG5cbldlYkdMVW5pZm9ybXMudXBsb2FkID0gZnVuY3Rpb24gKCBnbCwgc2VxLCB2YWx1ZXMsIHRleHR1cmVzICkge1xuXG5cdGZvciAoIGxldCBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRjb25zdCB1ID0gc2VxWyBpIF0sXG5cdFx0XHR2ID0gdmFsdWVzWyB1LmlkIF07XG5cblx0XHRpZiAoIHYubmVlZHNVcGRhdGUgIT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkXG5cdFx0XHR1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwgdGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHR9XG5cbn07XG5cbldlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlID0gZnVuY3Rpb24gKCBzZXEsIHZhbHVlcyApIHtcblxuXHRjb25zdCByID0gW107XG5cblx0Zm9yICggbGV0IGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdGNvbnN0IHUgPSBzZXFbIGkgXTtcblx0XHRpZiAoIHUuaWQgaW4gdmFsdWVzICkgci5wdXNoKCB1ICk7XG5cblx0fVxuXG5cdHJldHVybiByO1xuXG59O1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRlciggZ2wsIHR5cGUsIHN0cmluZyApIHtcblxuXHRjb25zdCBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTtcblxuXHRnbC5zaGFkZXJTb3VyY2UoIHNoYWRlciwgc3RyaW5nICk7XG5cdGdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApO1xuXG5cdHJldHVybiBzaGFkZXI7XG5cbn1cblxubGV0IHByb2dyYW1JZENvdW50ID0gMDtcblxuZnVuY3Rpb24gYWRkTGluZU51bWJlcnMoIHN0cmluZyApIHtcblxuXHRjb25zdCBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xcbicgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07XG5cblx0fVxuXG5cdHJldHVybiBsaW5lcy5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdldEVuY29kaW5nQ29tcG9uZW50cyggZW5jb2RpbmcgKSB7XG5cblx0c3dpdGNoICggZW5jb2RpbmcgKSB7XG5cblx0XHRjYXNlIExpbmVhckVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBzUkdCRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnc1JHQicsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JFRW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnUkdCRScsICcoIHZhbHVlICknIF07XG5cdFx0Y2FzZSBSR0JNN0VuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgNy4wICknIF07XG5cdFx0Y2FzZSBSR0JNMTZFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JNJywgJyggdmFsdWUsIDE2LjAgKScgXTtcblx0XHRjYXNlIFJHQkRFbmNvZGluZzpcblx0XHRcdHJldHVybiBbICdSR0JEJywgJyggdmFsdWUsIDI1Ni4wICknIF07XG5cdFx0Y2FzZSBHYW1tYUVuY29kaW5nOlxuXHRcdFx0cmV0dXJuIFsgJ0dhbW1hJywgJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApJyBdO1xuXHRcdGNhc2UgTG9nTHV2RW5jb2Rpbmc6XG5cdFx0XHRyZXR1cm4gWyAnTG9nTHV2JywgJyggdmFsdWUgKScgXTtcblx0XHRkZWZhdWx0OlxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCBlbmNvZGluZzonLCBlbmNvZGluZyApO1xuXHRcdFx0cmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFNoYWRlckVycm9ycyggZ2wsIHNoYWRlciwgdHlwZSApIHtcblxuXHRjb25zdCBzdGF0dXMgPSBnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoIHNoYWRlciwgMzU3MTMgKTtcblx0Y29uc3QgbG9nID0gZ2wuZ2V0U2hhZGVySW5mb0xvZyggc2hhZGVyICkudHJpbSgpO1xuXG5cdGlmICggc3RhdHVzICYmIGxvZyA9PT0gJycgKSByZXR1cm4gJyc7XG5cblx0Ly8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb25cblx0Ly8gY29uc29sZS5sb2coICcqKicgKyB0eXBlICsgJyoqJywgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfZGVidWdfc2hhZGVycycgKS5nZXRUcmFuc2xhdGVkU2hhZGVyU291cmNlKCBzaGFkZXIgKSApO1xuXG5cdGNvbnN0IHNvdXJjZSA9IGdsLmdldFNoYWRlclNvdXJjZSggc2hhZGVyICk7XG5cblx0cmV0dXJuICdUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICcgKyB0eXBlICsgJ1xcbicgKyBsb2cgKyBhZGRMaW5lTnVtYmVycyggc291cmNlICk7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7XG5cbn1cblxuZnVuY3Rpb24gZ2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCBmdW5jdGlvbk5hbWUsIGVuY29kaW5nICkge1xuXG5cdGNvbnN0IGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7XG5cdHJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvJyArIGNvbXBvbmVudHNbIDAgXSArIGNvbXBvbmVudHNbIDEgXSArICc7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7XG5cblx0bGV0IHRvbmVNYXBwaW5nTmFtZTtcblxuXHRzd2l0Y2ggKCB0b25lTWFwcGluZyApIHtcblxuXHRcdGNhc2UgTGluZWFyVG9uZU1hcHBpbmc6XG5cdFx0XHR0b25lTWFwcGluZ05hbWUgPSAnTGluZWFyJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBSZWluaGFyZFRvbmVNYXBwaW5nOlxuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ1JlaW5oYXJkJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDaW5lb25Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdPcHRpbWl6ZWRDaW5lb24nO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRjYXNlIEFDRVNGaWxtaWNUb25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdBQ0VTRmlsbWljJztcblx0XHRcdGJyZWFrO1xuXG5cdFx0Y2FzZSBDdXN0b21Ub25lTWFwcGluZzpcblx0XHRcdHRvbmVNYXBwaW5nTmFtZSA9ICdDdXN0b20nO1xuXHRcdFx0YnJlYWs7XG5cblx0XHRkZWZhdWx0OlxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBVbnN1cHBvcnRlZCB0b25lTWFwcGluZzonLCB0b25lTWFwcGluZyApO1xuXHRcdFx0dG9uZU1hcHBpbmdOYW1lID0gJ0xpbmVhcic7XG5cblx0fVxuXG5cdHJldHVybiAndmVjMyAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjMyBjb2xvciApIHsgcmV0dXJuICcgKyB0b25lTWFwcGluZ05hbWUgKyAnVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0nO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRXh0ZW5zaW9ucyggcGFyYW1ldGVycyApIHtcblxuXHRjb25zdCBjaHVua3MgPSBbXG5cdFx0KCBwYXJhbWV0ZXJzLmV4dGVuc2lvbkRlcml2YXRpdmVzIHx8IHBhcmFtZXRlcnMuZW52TWFwQ3ViZVVWIHx8IHBhcmFtZXRlcnMuYnVtcE1hcCB8fCBwYXJhbWV0ZXJzLnRhbmdlbnRTcGFjZU5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCB8fCBwYXJhbWV0ZXJzLmZsYXRTaGFkaW5nIHx8IHBhcmFtZXRlcnMuc2hhZGVySUQgPT09ICdwaHlzaWNhbCcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uRnJhZ0RlcHRoIHx8IHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciApICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGggPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uRHJhd0J1ZmZlcnMgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvbkRyYXdCdWZmZXJzICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZHJhd19idWZmZXJzIDogcmVxdWlyZScgOiAnJyxcblx0XHQoIHBhcmFtZXRlcnMuZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25TaGFkZXJUZXh0dXJlTG9kID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJ1xuXHRdO1xuXG5cdHJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHtcblxuXHRjb25zdCBjaHVua3MgPSBbXTtcblxuXHRmb3IgKCBjb25zdCBuYW1lIGluIGRlZmluZXMgKSB7XG5cblx0XHRjb25zdCB2YWx1ZSA9IGRlZmluZXNbIG5hbWUgXTtcblxuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkgY29udGludWU7XG5cblx0XHRjaHVua3MucHVzaCggJyNkZWZpbmUgJyArIG5hbWUgKyAnICcgKyB2YWx1ZSApO1xuXG5cdH1cblxuXHRyZXR1cm4gY2h1bmtzLmpvaW4oICdcXG4nICk7XG5cbn1cblxuZnVuY3Rpb24gZmV0Y2hBdHRyaWJ1dGVMb2NhdGlvbnMoIGdsLCBwcm9ncmFtICkge1xuXG5cdGNvbnN0IGF0dHJpYnV0ZXMgPSB7fTtcblxuXHRjb25zdCBuID0gZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgMzU3MjEgKTtcblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBuOyBpICsrICkge1xuXG5cdFx0Y29uc3QgaW5mbyA9IGdsLmdldEFjdGl2ZUF0dHJpYiggcHJvZ3JhbSwgaSApO1xuXHRcdGNvbnN0IG5hbWUgPSBpbmZvLm5hbWU7XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApO1xuXG5cdFx0YXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTtcblxuXHR9XG5cblx0cmV0dXJuIGF0dHJpYnV0ZXM7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZyAhPT0gJyc7XG5cbn1cblxuZnVuY3Rpb24gcmVwbGFjZUxpZ2h0TnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9ESVJfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtRGlyTGlnaHRzIClcblx0XHQucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtUG9pbnRMaWdodHMgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX0hFTUlfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtSGVtaUxpZ2h0cyApXG5cdFx0LnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRfU0hBRE9XUy9nLCBwYXJhbWV0ZXJzLm51bVNwb3RMaWdodFNoYWRvd3MgKVxuXHRcdC5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1Qb2ludExpZ2h0U2hhZG93cyApO1xuXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggL05VTV9DTElQUElOR19QTEFORVMvZywgcGFyYW1ldGVycy5udW1DbGlwcGluZ1BsYW5lcyApXG5cdFx0LnJlcGxhY2UoIC9VTklPTl9DTElQUElOR19QTEFORVMvZywgKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uICkgKTtcblxufVxuXG4vLyBSZXNvbHZlIEluY2x1ZGVzXG5cbmNvbnN0IGluY2x1ZGVQYXR0ZXJuID0gL15bIFxcdF0qI2luY2x1ZGUgKzwoW1xcd1xcZC4vXSspPi9nbTtcblxuZnVuY3Rpb24gcmVzb2x2ZUluY2x1ZGVzKCBzdHJpbmcgKSB7XG5cblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBpbmNsdWRlUGF0dGVybiwgaW5jbHVkZVJlcGxhY2VyICk7XG5cbn1cblxuZnVuY3Rpb24gaW5jbHVkZVJlcGxhY2VyKCBtYXRjaCwgaW5jbHVkZSApIHtcblxuXHRjb25zdCBzdHJpbmcgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdO1xuXG5cdGlmICggc3RyaW5nID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdDYW4gbm90IHJlc29sdmUgI2luY2x1ZGUgPCcgKyBpbmNsdWRlICsgJz4nICk7XG5cblx0fVxuXG5cdHJldHVybiByZXNvbHZlSW5jbHVkZXMoIHN0cmluZyApO1xuXG59XG5cbi8vIFVucm9sbCBMb29wc1xuXG5jb25zdCBkZXByZWNhdGVkVW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcFtcXHNdKz9mb3IgXFwoIGludCBpIFxcPSAoXFxkKylcXDsgaSA8IChcXGQrKVxcOyBpIFxcK1xcKyBcXCkgXFx7KFtcXHNcXFNdKz8pKD89XFx9KVxcfS9nO1xuY29uc3QgdW5yb2xsTG9vcFBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydFxccytmb3JcXHMqXFwoXFxzKmludFxccytpXFxzKj1cXHMqKFxcZCspXFxzKjtcXHMqaVxccyo8XFxzKihcXGQrKVxccyo7XFxzKmlcXHMqXFwrXFwrXFxzKlxcKVxccyp7KFtcXHNcXFNdKz8pfVxccysjcHJhZ21hIHVucm9sbF9sb29wX2VuZC9nO1xuXG5mdW5jdGlvbiB1bnJvbGxMb29wcyggc3RyaW5nICkge1xuXG5cdHJldHVybiBzdHJpbmdcblx0XHQucmVwbGFjZSggdW5yb2xsTG9vcFBhdHRlcm4sIGxvb3BSZXBsYWNlciApXG5cdFx0LnJlcGxhY2UoIGRlcHJlY2F0ZWRVbnJvbGxMb29wUGF0dGVybiwgZGVwcmVjYXRlZExvb3BSZXBsYWNlciApO1xuXG59XG5cbmZ1bmN0aW9uIGRlcHJlY2F0ZWRMb29wUmVwbGFjZXIoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1dlYkdMUHJvZ3JhbTogI3ByYWdtYSB1bnJvbGxfbG9vcCBzaGFkZXIgc3ludGF4IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgI3ByYWdtYSB1bnJvbGxfbG9vcF9zdGFydCBzeW50YXggaW5zdGVhZC4nICk7XG5cdHJldHVybiBsb29wUmVwbGFjZXIoIG1hdGNoLCBzdGFydCwgZW5kLCBzbmlwcGV0ICk7XG5cbn1cblxuZnVuY3Rpb24gbG9vcFJlcGxhY2VyKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHtcblxuXHRsZXQgc3RyaW5nID0gJyc7XG5cblx0Zm9yICggbGV0IGkgPSBwYXJzZUludCggc3RhcnQgKTsgaSA8IHBhcnNlSW50KCBlbmQgKTsgaSArKyApIHtcblxuXHRcdHN0cmluZyArPSBzbmlwcGV0XG5cdFx0XHQucmVwbGFjZSggL1xcW1xccyppXFxzKlxcXS9nLCAnWyAnICsgaSArICcgXScgKVxuXHRcdFx0LnJlcGxhY2UoIC9VTlJPTExFRF9MT09QX0lOREVYL2csIGkgKTtcblxuXHR9XG5cblx0cmV0dXJuIHN0cmluZztcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApIHtcblxuXHRsZXQgcHJlY2lzaW9uc3RyaW5nID0gJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGZsb2F0O1xcbnByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnO1xuXG5cdGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdoaWdocCcgKSB7XG5cblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gJ1xcbiNkZWZpbmUgSElHSF9QUkVDSVNJT04nO1xuXG5cdH0gZWxzZSBpZiAoIHBhcmFtZXRlcnMucHJlY2lzaW9uID09PSAnbWVkaXVtcCcgKSB7XG5cblx0XHRwcmVjaXNpb25zdHJpbmcgKz0gJ1xcbiNkZWZpbmUgTUVESVVNX1BSRUNJU0lPTic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdsb3dwJyApIHtcblxuXHRcdHByZWNpc2lvbnN0cmluZyArPSAnXFxuI2RlZmluZSBMT1dfUFJFQ0lTSU9OJztcblxuXHR9XG5cblx0cmV0dXJuIHByZWNpc2lvbnN0cmluZztcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVNoYWRvd01hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0bGV0IHNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfQkFTSUMnO1xuXG5cdGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTb2Z0U2hhZG93TWFwICkge1xuXG5cdFx0c2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCc7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBWU01TaGFkb3dNYXAgKSB7XG5cblx0XHRzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1ZTTSc7XG5cblx0fVxuXG5cdHJldHVybiBzaGFkb3dNYXBUeXBlRGVmaW5lO1xuXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW52TWFwVHlwZURlZmluZSggcGFyYW1ldGVycyApIHtcblxuXHRsZXQgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuZW52TWFwICkge1xuXG5cdFx0c3dpdGNoICggcGFyYW1ldGVycy5lbnZNYXBNb2RlICkge1xuXG5cdFx0XHRjYXNlIEN1YmVSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOlxuXHRcdFx0XHRlbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkUnO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzpcblx0XHRcdGNhc2UgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRcdGVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfQ1VCRV9VVic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwVHlwZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcE1vZGVEZWZpbmUoIHBhcmFtZXRlcnMgKSB7XG5cblx0bGV0IGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGTEVDVElPTic7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuZW52TWFwTW9kZSApIHtcblxuXHRcdFx0Y2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6XG5cdFx0XHRjYXNlIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOlxuXG5cdFx0XHRcdGVudk1hcE1vZGVEZWZpbmUgPSAnRU5WTUFQX01PREVfUkVGUkFDVElPTic7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gZW52TWFwTW9kZURlZmluZTtcblxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVudk1hcEJsZW5kaW5nRGVmaW5lKCBwYXJhbWV0ZXJzICkge1xuXG5cdGxldCBlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTk9ORSc7XG5cblx0aWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHtcblxuXHRcdHN3aXRjaCAoIHBhcmFtZXRlcnMuY29tYmluZSApIHtcblxuXHRcdFx0Y2FzZSBNdWx0aXBseU9wZXJhdGlvbjpcblx0XHRcdFx0ZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgTWl4T3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTUlYJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgQWRkT3BlcmF0aW9uOlxuXHRcdFx0XHRlbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfQUREJztcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiBlbnZNYXBCbGVuZGluZ0RlZmluZTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApIHtcblxuXHRjb25zdCBnbCA9IHJlbmRlcmVyLmdldENvbnRleHQoKTtcblxuXHRjb25zdCBkZWZpbmVzID0gcGFyYW1ldGVycy5kZWZpbmVzO1xuXG5cdGxldCB2ZXJ0ZXhTaGFkZXIgPSBwYXJhbWV0ZXJzLnZlcnRleFNoYWRlcjtcblx0bGV0IGZyYWdtZW50U2hhZGVyID0gcGFyYW1ldGVycy5mcmFnbWVudFNoYWRlcjtcblxuXHRjb25zdCBzaGFkb3dNYXBUeXBlRGVmaW5lID0gZ2VuZXJhdGVTaGFkb3dNYXBUeXBlRGVmaW5lKCBwYXJhbWV0ZXJzICk7XG5cdGNvbnN0IGVudk1hcFR5cGVEZWZpbmUgPSBnZW5lcmF0ZUVudk1hcFR5cGVEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblx0Y29uc3QgZW52TWFwTW9kZURlZmluZSA9IGdlbmVyYXRlRW52TWFwTW9kZURlZmluZSggcGFyYW1ldGVycyApO1xuXHRjb25zdCBlbnZNYXBCbGVuZGluZ0RlZmluZSA9IGdlbmVyYXRlRW52TWFwQmxlbmRpbmdEZWZpbmUoIHBhcmFtZXRlcnMgKTtcblxuXG5cdGNvbnN0IGdhbW1hRmFjdG9yRGVmaW5lID0gKCByZW5kZXJlci5nYW1tYUZhY3RvciA+IDAgKSA/IHJlbmRlcmVyLmdhbW1hRmFjdG9yIDogMS4wO1xuXG5cdGNvbnN0IGN1c3RvbUV4dGVuc2lvbnMgPSBwYXJhbWV0ZXJzLmlzV2ViR0wyID8gJycgOiBnZW5lcmF0ZUV4dGVuc2lvbnMoIHBhcmFtZXRlcnMgKTtcblxuXHRjb25zdCBjdXN0b21EZWZpbmVzID0gZ2VuZXJhdGVEZWZpbmVzKCBkZWZpbmVzICk7XG5cblx0Y29uc3QgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcblxuXHRsZXQgcHJlZml4VmVydGV4LCBwcmVmaXhGcmFnbWVudDtcblx0bGV0IHZlcnNpb25TdHJpbmcgPSBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID8gJyN2ZXJzaW9uICcgKyBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uICsgJ1xcbicgOiAnJztcblxuXHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdHByZWZpeFZlcnRleCA9IFtcblxuXHRcdFx0Y3VzdG9tRGVmaW5lc1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0XHRpZiAoIHByZWZpeFZlcnRleC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhWZXJ0ZXggKz0gJ1xcbic7XG5cblx0XHR9XG5cblx0XHRwcmVmaXhGcmFnbWVudCA9IFtcblxuXHRcdFx0Y3VzdG9tRXh0ZW5zaW9ucyxcblx0XHRcdGN1c3RvbURlZmluZXNcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0aWYgKCBwcmVmaXhGcmFnbWVudC5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRwcmVmaXhGcmFnbWVudCArPSAnXFxuJztcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXG5cdFx0XHRnZW5lcmF0ZVByZWNpc2lvbiggcGFyYW1ldGVycyApLFxuXG5cdFx0XHQnI2RlZmluZSBTSEFERVJfTkFNRSAnICsgcGFyYW1ldGVycy5zaGFkZXJOYW1lLFxuXG5cdFx0XHRjdXN0b21EZWZpbmVzLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLmluc3RhbmNpbmcgPyAnI2RlZmluZSBVU0VfSU5TVEFOQ0lORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuaW5zdGFuY2luZ0NvbG9yID8gJyNkZWZpbmUgVVNFX0lOU1RBTkNJTkdfQ09MT1InIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJyxcblxuXHRcdFx0JyNkZWZpbmUgR0FNTUFfRkFDVE9SICcgKyBnYW1tYUZhY3RvckRlZmluZSxcblxuXHRcdFx0JyNkZWZpbmUgTUFYX0JPTkVTICcgKyBwYXJhbWV0ZXJzLm1heEJvbmVzLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0TWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuY2xlYXJjb2F0Um91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX0NMRUFSQ09BVF9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kaXNwbGFjZW1lbnRNYXAgJiYgcGFyYW1ldGVycy5zdXBwb3J0c1ZlcnRleFRleHR1cmVzID8gJyNkZWZpbmUgVVNFX0RJU1BMQUNFTUVOVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXAgPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4QWxwaGFzID8gJyNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdnMgPyAnI2RlZmluZSBVU0VfVVYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnV2c1ZlcnRleE9ubHkgPyAnI2RlZmluZSBVVlNfVkVSVEVYX09OTFknIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5za2lubmluZyA/ICcjZGVmaW5lIFVTRV9TS0lOTklORycgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudXNlVmVydGV4VGV4dHVyZSA/ICcjZGVmaW5lIEJPTkVfVEVYVFVSRScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPyAnI2RlZmluZSBVU0VfTU9SUEhUQVJHRVRTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5tb3JwaE5vcm1hbHMgJiYgcGFyYW1ldGVycy5mbGF0U2hhZGluZyA9PT0gZmFsc2UgPyAnI2RlZmluZSBVU0VfTU9SUEhOT1JNQUxTJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuc2l6ZUF0dGVudWF0aW9uID8gJyNkZWZpbmUgVVNFX1NJWkVBVFRFTlVBVElPTicgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgJiYgcGFyYW1ldGVycy5yZW5kZXJlckV4dGVuc2lvbkZyYWdEZXB0aCApID8gJyNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGX0VYVCcgOiAnJyxcblxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIG1hdDQgcHJvamVjdGlvbk1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gbWF0NCB2aWV3TWF0cml4OycsXG5cdFx0XHQndW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDsnLFxuXHRcdFx0J3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLFxuXHRcdFx0J3VuaWZvcm0gYm9vbCBpc09ydGhvZ3JhcGhpYzsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9JTlNUQU5DSU5HJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIG1hdDQgaW5zdGFuY2VNYXRyaXg7JyxcblxuXHRcdFx0JyNlbmRpZicsXG5cblx0XHRcdCcjaWZkZWYgVVNFX0lOU1RBTkNJTkdfQ09MT1InLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBpbnN0YW5jZUNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnYXR0cmlidXRlIHZlYzMgcG9zaXRpb247Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7Jyxcblx0XHRcdCdhdHRyaWJ1dGUgdmVjMiB1djsnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9UQU5HRU5UJyxcblxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgdGFuZ2VudDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0JyNpZiBkZWZpbmVkKCBVU0VfQ09MT1JfQUxQSEEgKScsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IGNvbG9yOycsXG5cblx0XHRcdCcjZWxpZiBkZWZpbmVkKCBVU0VfQ09MT1IgKScsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMnLFxuXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDA7Jyxcblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsXG5cdFx0XHQnXHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDM7JyxcblxuXHRcdFx0J1x0I2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLFxuXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDE7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLFxuXG5cdFx0XHQnXHQjZWxzZScsXG5cblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ0OycsXG5cdFx0XHQnXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsnLFxuXHRcdFx0J1x0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7Jyxcblx0XHRcdCdcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ3OycsXG5cblx0XHRcdCdcdCNlbmRpZicsXG5cblx0XHRcdCcjZW5kaWYnLFxuXG5cdFx0XHQnI2lmZGVmIFVTRV9TS0lOTklORycsXG5cblx0XHRcdCdcdGF0dHJpYnV0ZSB2ZWM0IHNraW5JbmRleDsnLFxuXHRcdFx0J1x0YXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLFxuXG5cdFx0XHQnI2VuZGlmJyxcblxuXHRcdFx0J1xcbidcblxuXHRcdF0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXFxuJyApO1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cblx0XHRcdGN1c3RvbUV4dGVuc2lvbnMsXG5cblx0XHRcdGdlbmVyYXRlUHJlY2lzaW9uKCBwYXJhbWV0ZXJzICksXG5cblx0XHRcdCcjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBwYXJhbWV0ZXJzLnNoYWRlck5hbWUsXG5cblx0XHRcdGN1c3RvbURlZmluZXMsXG5cblx0XHRcdHBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCArICggcGFyYW1ldGVycy5hbHBoYVRlc3QgJSAxID8gJycgOiAnLjAnICkgOiAnJywgLy8gYWRkICcuMCcgaWYgaW50ZWdlclxuXG5cdFx0XHQnI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLFxuXG5cdFx0XHQoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nICkgPyAnI2RlZmluZSBVU0VfRk9HJyA6ICcnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZ0V4cDIgKSA/ICcjZGVmaW5lIEZPR19FWFAyJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1hdGNhcCA/ICcjZGVmaW5lIFVTRV9NQVRDQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmNsZWFyY29hdFJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfUk9VR0hORVNTTUFQJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc3BlY3VsYXJNYXAgPyAnI2RlZmluZSBVU0VfU1BFQ1VMQVJNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnJvdWdobmVzc01hcCA/ICcjZGVmaW5lIFVTRV9ST1VHSE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLm1ldGFsbmVzc01hcCA/ICcjZGVmaW5lIFVTRV9NRVRBTE5FU1NNQVAnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmFscGhhTWFwID8gJyNkZWZpbmUgVVNFX0FMUEhBTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnNoZWVuID8gJyNkZWZpbmUgVVNFX1NIRUVOJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy50cmFuc21pc3Npb25NYXAgPyAnI2RlZmluZSBVU0VfVFJBTlNNSVNTSU9OTUFQJyA6ICcnLFxuXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyB8fCBwYXJhbWV0ZXJzLmluc3RhbmNpbmdDb2xvciA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMudmVydGV4QWxwaGFzID8gJyNkZWZpbmUgVVNFX0NPTE9SX0FMUEhBJyA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy52ZXJ0ZXhVdnMgPyAnI2RlZmluZSBVU0VfVVYnIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLnV2c1ZlcnRleE9ubHkgPyAnI2RlZmluZSBVVlNfVkVSVEVYX09OTFknIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kb3VibGVTaWRlZCA/ICcjZGVmaW5lIERPVUJMRV9TSURFRCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuZmxpcFNpZGVkID8gJyNkZWZpbmUgRkxJUF9TSURFRCcgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhID8gJyNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQScgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyA/ICcjZGVmaW5lIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFMnIDogJycsXG5cblx0XHRcdHBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJyxcblx0XHRcdCggcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICYmIHBhcmFtZXRlcnMucmVuZGVyZXJFeHRlbnNpb25GcmFnRGVwdGggKSA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQnIDogJycsXG5cblx0XHRcdCggKCBwYXJhbWV0ZXJzLmV4dGVuc2lvblNoYWRlclRleHR1cmVMT0QgfHwgcGFyYW1ldGVycy5lbnZNYXAgKSAmJiBwYXJhbWV0ZXJzLnJlbmRlcmVyRXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxvZCApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLFxuXG5cdFx0XHQndW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7Jyxcblx0XHRcdCd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247Jyxcblx0XHRcdCd1bmlmb3JtIGJvb2wgaXNPcnRob2dyYXBoaWM7JyxcblxuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyAnI2RlZmluZSBUT05FX01BUFBJTkcnIDogJycsXG5cdFx0XHQoIHBhcmFtZXRlcnMudG9uZU1hcHBpbmcgIT09IE5vVG9uZU1hcHBpbmcgKSA/IFNoYWRlckNodW5rWyAndG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudCcgXSA6ICcnLCAvLyB0aGlzIGNvZGUgaXMgcmVxdWlyZWQgaGVyZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgdGhlIHRvbmVNYXBwaW5nKCkgZnVuY3Rpb24gZGVmaW5lZCBiZWxvd1xuXHRcdFx0KCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBnZXRUb25lTWFwcGluZ0Z1bmN0aW9uKCAndG9uZU1hcHBpbmcnLCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICkgOiAnJyxcblxuXHRcdFx0cGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsXG5cblx0XHRcdFNoYWRlckNodW5rWyAnZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQnIF0sIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93XG5cdFx0XHRwYXJhbWV0ZXJzLm1hcCA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubWF0Y2FwID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWF0Y2FwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubWF0Y2FwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0cGFyYW1ldGVycy5lbnZNYXAgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsXG5cdFx0XHRwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbWlzc2l2ZU1hcEVuY29kaW5nICkgOiAnJyxcblx0XHRcdHBhcmFtZXRlcnMubGlnaHRNYXAgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdsaWdodE1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmxpZ2h0TWFwRW5jb2RpbmcgKSA6ICcnLFxuXHRcdFx0Z2V0VGV4ZWxFbmNvZGluZ0Z1bmN0aW9uKCAnbGluZWFyVG9PdXRwdXRUZXhlbCcsIHBhcmFtZXRlcnMub3V0cHV0RW5jb2RpbmcgKSxcblxuXHRcdFx0cGFyYW1ldGVycy5kZXB0aFBhY2tpbmcgPyAnI2RlZmluZSBERVBUSF9QQUNLSU5HICcgKyBwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA6ICcnLFxuXG5cdFx0XHQnXFxuJ1xuXG5cdFx0XS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcXG4nICk7XG5cblx0fVxuXG5cdHZlcnRleFNoYWRlciA9IHJlc29sdmVJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7XG5cdHZlcnRleFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXHR2ZXJ0ZXhTaGFkZXIgPSByZXBsYWNlQ2xpcHBpbmdQbGFuZU51bXMoIHZlcnRleFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdGZyYWdtZW50U2hhZGVyID0gcmVzb2x2ZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApO1xuXHRmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VMaWdodE51bXMoIGZyYWdtZW50U2hhZGVyLCBwYXJhbWV0ZXJzICk7XG5cdGZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCBmcmFnbWVudFNoYWRlciwgcGFyYW1ldGVycyApO1xuXG5cdHZlcnRleFNoYWRlciA9IHVucm9sbExvb3BzKCB2ZXJ0ZXhTaGFkZXIgKTtcblx0ZnJhZ21lbnRTaGFkZXIgPSB1bnJvbGxMb29wcyggZnJhZ21lbnRTaGFkZXIgKTtcblxuXHRpZiAoIHBhcmFtZXRlcnMuaXNXZWJHTDIgJiYgcGFyYW1ldGVycy5pc1Jhd1NoYWRlck1hdGVyaWFsICE9PSB0cnVlICkge1xuXG5cdFx0Ly8gR0xTTCAzLjAgY29udmVyc2lvbiBmb3IgYnVpbHQtaW4gbWF0ZXJpYWxzIGFuZCBTaGFkZXJNYXRlcmlhbFxuXG5cdFx0dmVyc2lvblN0cmluZyA9ICcjdmVyc2lvbiAzMDAgZXNcXG4nO1xuXG5cdFx0cHJlZml4VmVydGV4ID0gW1xuXHRcdFx0JyNkZWZpbmUgYXR0cmlidXRlIGluJyxcblx0XHRcdCcjZGVmaW5lIHZhcnlpbmcgb3V0Jyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlJ1xuXHRcdF0uam9pbiggJ1xcbicgKSArICdcXG4nICsgcHJlZml4VmVydGV4O1xuXG5cdFx0cHJlZml4RnJhZ21lbnQgPSBbXG5cdFx0XHQnI2RlZmluZSB2YXJ5aW5nIGluJyxcblx0XHRcdCggcGFyYW1ldGVycy5nbHNsVmVyc2lvbiA9PT0gR0xTTDMgKSA/ICcnIDogJ291dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsnLFxuXHRcdFx0KCBwYXJhbWV0ZXJzLmdsc2xWZXJzaW9uID09PSBHTFNMMyApID8gJycgOiAnI2RlZmluZSBnbF9GcmFnQ29sb3IgcGNfZnJhZ0NvbG9yJyxcblx0XHRcdCcjZGVmaW5lIGdsX0ZyYWdEZXB0aEVYVCBnbF9GcmFnRGVwdGgnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZTJEIHRleHR1cmUnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmUgdGV4dHVyZScsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRQcm9qIHRleHR1cmVQcm9qJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRExvZEVYVCB0ZXh0dXJlTG9kJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2pMb2RFWFQgdGV4dHVyZVByb2pMb2QnLFxuXHRcdFx0JyNkZWZpbmUgdGV4dHVyZUN1YmVMb2RFWFQgdGV4dHVyZUxvZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlMkRHcmFkRVhUIHRleHR1cmVHcmFkJyxcblx0XHRcdCcjZGVmaW5lIHRleHR1cmUyRFByb2pHcmFkRVhUIHRleHR1cmVQcm9qR3JhZCcsXG5cdFx0XHQnI2RlZmluZSB0ZXh0dXJlQ3ViZUdyYWRFWFQgdGV4dHVyZUdyYWQnXG5cdFx0XS5qb2luKCAnXFxuJyApICsgJ1xcbicgKyBwcmVmaXhGcmFnbWVudDtcblxuXHR9XG5cblx0Y29uc3QgdmVydGV4R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhWZXJ0ZXggKyB2ZXJ0ZXhTaGFkZXI7XG5cdGNvbnN0IGZyYWdtZW50R2xzbCA9IHZlcnNpb25TdHJpbmcgKyBwcmVmaXhGcmFnbWVudCArIGZyYWdtZW50U2hhZGVyO1xuXG5cdC8vIGNvbnNvbGUubG9nKCAnKlZFUlRFWConLCB2ZXJ0ZXhHbHNsICk7XG5cdC8vIGNvbnNvbGUubG9nKCAnKkZSQUdNRU5UKicsIGZyYWdtZW50R2xzbCApO1xuXG5cdGNvbnN0IGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMywgdmVydGV4R2xzbCApO1xuXHRjb25zdCBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMiwgZnJhZ21lbnRHbHNsICk7XG5cblx0Z2wuYXR0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHRnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHQvLyBGb3JjZSBhIHBhcnRpY3VsYXIgYXR0cmlidXRlIHRvIGluZGV4IDAuXG5cblx0aWYgKCBwYXJhbWV0ZXJzLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgcGFyYW1ldGVycy5pbmRleDBBdHRyaWJ1dGVOYW1lICk7XG5cblx0fSBlbHNlIGlmICggcGFyYW1ldGVycy5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHQvLyBwcm9ncmFtcyB3aXRoIG1vcnBoVGFyZ2V0cyBkaXNwbGFjZSBwb3NpdGlvbiBvdXQgb2YgYXR0cmlidXRlIDBcblx0XHRnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTtcblxuXHR9XG5cblx0Z2wubGlua1Byb2dyYW0oIHByb2dyYW0gKTtcblxuXHQvLyBjaGVjayBmb3IgbGluayBlcnJvcnNcblx0aWYgKCByZW5kZXJlci5kZWJ1Zy5jaGVja1NoYWRlckVycm9ycyApIHtcblxuXHRcdGNvbnN0IHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTtcblx0XHRjb25zdCB2ZXJ0ZXhMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbFZlcnRleFNoYWRlciApLnRyaW0oKTtcblx0XHRjb25zdCBmcmFnbWVudExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsRnJhZ21lbnRTaGFkZXIgKS50cmltKCk7XG5cblx0XHRsZXQgcnVubmFibGUgPSB0cnVlO1xuXHRcdGxldCBoYXZlRGlhZ25vc3RpY3MgPSB0cnVlO1xuXG5cdFx0aWYgKCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxNCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0cnVubmFibGUgPSBmYWxzZTtcblxuXHRcdFx0Y29uc3QgdmVydGV4RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgZ2xWZXJ0ZXhTaGFkZXIsICd2ZXJ0ZXgnICk7XG5cdFx0XHRjb25zdCBmcmFnbWVudEVycm9ycyA9IGdldFNoYWRlckVycm9ycyggZ2wsIGdsRnJhZ21lbnRTaGFkZXIsICdmcmFnbWVudCcgKTtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUHJvZ3JhbTogc2hhZGVyIGVycm9yOiAnLCBnbC5nZXRFcnJvcigpLCAnMzU3MTUnLCBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxNSApLCAnZ2wuZ2V0UHJvZ3JhbUluZm9Mb2cnLCBwcm9ncmFtTG9nLCB2ZXJ0ZXhFcnJvcnMsIGZyYWdtZW50RXJyb3JzICk7XG5cblx0XHR9IGVsc2UgaWYgKCBwcm9ncmFtTG9nICE9PSAnJyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApO1xuXG5cdFx0fSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7XG5cblx0XHRcdGhhdmVEaWFnbm9zdGljcyA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBoYXZlRGlhZ25vc3RpY3MgKSB7XG5cblx0XHRcdHRoaXMuZGlhZ25vc3RpY3MgPSB7XG5cblx0XHRcdFx0cnVubmFibGU6IHJ1bm5hYmxlLFxuXG5cdFx0XHRcdHByb2dyYW1Mb2c6IHByb2dyYW1Mb2csXG5cblx0XHRcdFx0dmVydGV4U2hhZGVyOiB7XG5cblx0XHRcdFx0XHRsb2c6IHZlcnRleExvZyxcblx0XHRcdFx0XHRwcmVmaXg6IHByZWZpeFZlcnRleFxuXG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0ZnJhZ21lbnRTaGFkZXI6IHtcblxuXHRcdFx0XHRcdGxvZzogZnJhZ21lbnRMb2csXG5cdFx0XHRcdFx0cHJlZml4OiBwcmVmaXhGcmFnbWVudFxuXG5cdFx0XHRcdH1cblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQ2xlYW4gdXBcblxuXHQvLyBDcmFzaGVzIGluIGlPUzkgYW5kIGlPUzEwLiAjMTg0MDJcblx0Ly8gZ2wuZGV0YWNoU2hhZGVyKCBwcm9ncmFtLCBnbFZlcnRleFNoYWRlciApO1xuXHQvLyBnbC5kZXRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTtcblxuXHRnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7XG5cdGdsLmRlbGV0ZVNoYWRlciggZ2xGcmFnbWVudFNoYWRlciApO1xuXG5cdC8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9uc1xuXG5cdGxldCBjYWNoZWRVbmlmb3JtcztcblxuXHR0aGlzLmdldFVuaWZvcm1zID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCBjYWNoZWRVbmlmb3JtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjYWNoZWRVbmlmb3JtcyA9IG5ldyBXZWJHTFVuaWZvcm1zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZFVuaWZvcm1zO1xuXG5cdH07XG5cblx0Ly8gc2V0IHVwIGNhY2hpbmcgZm9yIGF0dHJpYnV0ZSBsb2NhdGlvbnNcblxuXHRsZXQgY2FjaGVkQXR0cmlidXRlcztcblxuXHR0aGlzLmdldEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIGNhY2hlZEF0dHJpYnV0ZXMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y2FjaGVkQXR0cmlidXRlcyA9IGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlZEF0dHJpYnV0ZXM7XG5cblx0fTtcblxuXHQvLyBmcmVlIHJlc291cmNlXG5cblx0dGhpcy5kZXN0cm95ID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmluZGluZ1N0YXRlcy5yZWxlYXNlU3RhdGVzT2ZQcm9ncmFtKCB0aGlzICk7XG5cblx0XHRnbC5kZWxldGVQcm9ncmFtKCBwcm9ncmFtICk7XG5cdFx0dGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkO1xuXG5cdH07XG5cblx0Ly9cblxuXHR0aGlzLm5hbWUgPSBwYXJhbWV0ZXJzLnNoYWRlck5hbWU7XG5cdHRoaXMuaWQgPSBwcm9ncmFtSWRDb3VudCArKztcblx0dGhpcy5jYWNoZUtleSA9IGNhY2hlS2V5O1xuXHR0aGlzLnVzZWRUaW1lcyA9IDE7XG5cdHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG5cdHRoaXMudmVydGV4U2hhZGVyID0gZ2xWZXJ0ZXhTaGFkZXI7XG5cdHRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyO1xuXG5cdHJldHVybiB0aGlzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUHJvZ3JhbXMoIHJlbmRlcmVyLCBjdWJlbWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApIHtcblxuXHRjb25zdCBwcm9ncmFtcyA9IFtdO1xuXG5cdGNvbnN0IGlzV2ViR0wyID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyO1xuXHRjb25zdCBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gY2FwYWJpbGl0aWVzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXI7XG5cdGNvbnN0IGZsb2F0VmVydGV4VGV4dHVyZXMgPSBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcztcblx0Y29uc3QgbWF4VmVydGV4VW5pZm9ybXMgPSBjYXBhYmlsaXRpZXMubWF4VmVydGV4VW5pZm9ybXM7XG5cdGNvbnN0IHZlcnRleFRleHR1cmVzID0gY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzO1xuXG5cdGxldCBwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMucHJlY2lzaW9uO1xuXG5cdGNvbnN0IHNoYWRlcklEcyA9IHtcblx0XHRNZXNoRGVwdGhNYXRlcmlhbDogJ2RlcHRoJyxcblx0XHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsXG5cdFx0TWVzaE5vcm1hbE1hdGVyaWFsOiAnbm9ybWFsJyxcblx0XHRNZXNoQmFzaWNNYXRlcmlhbDogJ2Jhc2ljJyxcblx0XHRNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsXG5cdFx0TWVzaFBob25nTWF0ZXJpYWw6ICdwaG9uZycsXG5cdFx0TWVzaFRvb25NYXRlcmlhbDogJ3Rvb24nLFxuXHRcdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hQaHlzaWNhbE1hdGVyaWFsOiAncGh5c2ljYWwnLFxuXHRcdE1lc2hNYXRjYXBNYXRlcmlhbDogJ21hdGNhcCcsXG5cdFx0TGluZUJhc2ljTWF0ZXJpYWw6ICdiYXNpYycsXG5cdFx0TGluZURhc2hlZE1hdGVyaWFsOiAnZGFzaGVkJyxcblx0XHRQb2ludHNNYXRlcmlhbDogJ3BvaW50cycsXG5cdFx0U2hhZG93TWF0ZXJpYWw6ICdzaGFkb3cnLFxuXHRcdFNwcml0ZU1hdGVyaWFsOiAnc3ByaXRlJ1xuXHR9O1xuXG5cdGNvbnN0IHBhcmFtZXRlck5hbWVzID0gW1xuXHRcdCdwcmVjaXNpb24nLCAnaXNXZWJHTDInLCAnc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcycsICdvdXRwdXRFbmNvZGluZycsICdpbnN0YW5jaW5nJywgJ2luc3RhbmNpbmdDb2xvcicsXG5cdFx0J21hcCcsICdtYXBFbmNvZGluZycsICdtYXRjYXAnLCAnbWF0Y2FwRW5jb2RpbmcnLCAnZW52TWFwJywgJ2Vudk1hcE1vZGUnLCAnZW52TWFwRW5jb2RpbmcnLCAnZW52TWFwQ3ViZVVWJyxcblx0XHQnbGlnaHRNYXAnLCAnbGlnaHRNYXBFbmNvZGluZycsICdhb01hcCcsICdlbWlzc2l2ZU1hcCcsICdlbWlzc2l2ZU1hcEVuY29kaW5nJywgJ2J1bXBNYXAnLCAnbm9ybWFsTWFwJywgJ29iamVjdFNwYWNlTm9ybWFsTWFwJywgJ3RhbmdlbnRTcGFjZU5vcm1hbE1hcCcsICdjbGVhcmNvYXRNYXAnLCAnY2xlYXJjb2F0Um91Z2huZXNzTWFwJywgJ2NsZWFyY29hdE5vcm1hbE1hcCcsICdkaXNwbGFjZW1lbnRNYXAnLCAnc3BlY3VsYXJNYXAnLFxuXHRcdCdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2dyYWRpZW50TWFwJyxcblx0XHQnYWxwaGFNYXAnLCAnY29tYmluZScsICd2ZXJ0ZXhDb2xvcnMnLCAndmVydGV4QWxwaGFzJywgJ3ZlcnRleFRhbmdlbnRzJywgJ3ZlcnRleFV2cycsICd1dnNWZXJ0ZXhPbmx5JywgJ2ZvZycsICd1c2VGb2cnLCAnZm9nRXhwMicsXG5cdFx0J2ZsYXRTaGFkaW5nJywgJ3NpemVBdHRlbnVhdGlvbicsICdsb2dhcml0aG1pY0RlcHRoQnVmZmVyJywgJ3NraW5uaW5nJyxcblx0XHQnbWF4Qm9uZXMnLCAndXNlVmVydGV4VGV4dHVyZScsICdtb3JwaFRhcmdldHMnLCAnbW9ycGhOb3JtYWxzJywgJ3ByZW11bHRpcGxpZWRBbHBoYScsXG5cdFx0J251bURpckxpZ2h0cycsICdudW1Qb2ludExpZ2h0cycsICdudW1TcG90TGlnaHRzJywgJ251bUhlbWlMaWdodHMnLCAnbnVtUmVjdEFyZWFMaWdodHMnLFxuXHRcdCdudW1EaXJMaWdodFNoYWRvd3MnLCAnbnVtUG9pbnRMaWdodFNoYWRvd3MnLCAnbnVtU3BvdExpZ2h0U2hhZG93cycsXG5cdFx0J3NoYWRvd01hcEVuYWJsZWQnLCAnc2hhZG93TWFwVHlwZScsICd0b25lTWFwcGluZycsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsXG5cdFx0J2FscGhhVGVzdCcsICdkb3VibGVTaWRlZCcsICdmbGlwU2lkZWQnLCAnbnVtQ2xpcHBpbmdQbGFuZXMnLCAnbnVtQ2xpcEludGVyc2VjdGlvbicsICdkZXB0aFBhY2tpbmcnLCAnZGl0aGVyaW5nJyxcblx0XHQnc2hlZW4nLCAndHJhbnNtaXNzaW9uTWFwJ1xuXHRdO1xuXG5cdGZ1bmN0aW9uIGdldE1heEJvbmVzKCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBza2VsZXRvbiA9IG9iamVjdC5za2VsZXRvbjtcblx0XHRjb25zdCBib25lcyA9IHNrZWxldG9uLmJvbmVzO1xuXG5cdFx0aWYgKCBmbG9hdFZlcnRleFRleHR1cmVzICkge1xuXG5cdFx0XHRyZXR1cm4gMTAyNDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWRcblx0XHRcdC8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKVxuXHRcdFx0Ly9cblx0XHRcdC8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zXG5cdFx0XHQvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnNcblx0XHRcdC8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSlcblxuXHRcdFx0Y29uc3QgblZlcnRleFVuaWZvcm1zID0gbWF4VmVydGV4VW5pZm9ybXM7XG5cdFx0XHRjb25zdCBuVmVydGV4TWF0cmljZXMgPSBNYXRoLmZsb29yKCAoIG5WZXJ0ZXhVbmlmb3JtcyAtIDIwICkgLyA0ICk7XG5cblx0XHRcdGNvbnN0IG1heEJvbmVzID0gTWF0aC5taW4oIG5WZXJ0ZXhNYXRyaWNlcywgYm9uZXMubGVuZ3RoICk7XG5cblx0XHRcdGlmICggbWF4Qm9uZXMgPCBib25lcy5sZW5ndGggKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogU2tlbGV0b24gaGFzICcgKyBib25lcy5sZW5ndGggKyAnIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAnICsgbWF4Qm9uZXMgKyAnLicgKTtcblx0XHRcdFx0cmV0dXJuIDA7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1heEJvbmVzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXAgKSB7XG5cblx0XHRsZXQgZW5jb2Rpbmc7XG5cblx0XHRpZiAoIG1hcCAmJiBtYXAuaXNUZXh0dXJlICkge1xuXG5cdFx0XHRlbmNvZGluZyA9IG1hcC5lbmNvZGluZztcblxuXHRcdH0gZWxzZSBpZiAoIG1hcCAmJiBtYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtcy5nZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwOiBkb25cXCd0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuJyApO1xuXHRcdFx0ZW5jb2RpbmcgPSBtYXAudGV4dHVyZS5lbmNvZGluZztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGVuY29kaW5nID0gTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZW5jb2Rpbmc7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIHNjZW5lLCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBmb2cgPSBzY2VuZS5mb2c7XG5cdFx0Y29uc3QgZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXG5cdFx0Y29uc3QgZW52TWFwID0gY3ViZW1hcHMuZ2V0KCBtYXRlcmlhbC5lbnZNYXAgfHwgZW52aXJvbm1lbnQgKTtcblxuXHRcdGNvbnN0IHNoYWRlcklEID0gc2hhZGVySURzWyBtYXRlcmlhbC50eXBlIF07XG5cblx0XHQvLyBoZXVyaXN0aWNzIHRvIGNyZWF0ZSBzaGFkZXIgcGFyYW1ldGVycyBhY2NvcmRpbmcgdG8gbGlnaHRzIGluIHRoZSBzY2VuZVxuXHRcdC8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpXG5cblx0XHRjb25zdCBtYXhCb25lcyA9IG9iamVjdC5pc1NraW5uZWRNZXNoID8gZ2V0TWF4Qm9uZXMoIG9iamVjdCApIDogMDtcblxuXHRcdGlmICggbWF0ZXJpYWwucHJlY2lzaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTtcblxuXHRcdFx0aWYgKCBwcmVjaXNpb24gIT09IG1hdGVyaWFsLnByZWNpc2lvbiApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczonLCBtYXRlcmlhbC5wcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIHByZWNpc2lvbiwgJ2luc3RlYWQuJyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXQgdmVydGV4U2hhZGVyLCBmcmFnbWVudFNoYWRlcjtcblxuXHRcdGlmICggc2hhZGVySUQgKSB7XG5cblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcblxuXHRcdFx0dmVydGV4U2hhZGVyID0gc2hhZGVyLnZlcnRleFNoYWRlcjtcblx0XHRcdGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmVydGV4U2hhZGVyID0gbWF0ZXJpYWwudmVydGV4U2hhZGVyO1xuXHRcdFx0ZnJhZ21lbnRTaGFkZXIgPSBtYXRlcmlhbC5mcmFnbWVudFNoYWRlcjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGN1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblxuXHRcdGNvbnN0IHBhcmFtZXRlcnMgPSB7XG5cblx0XHRcdGlzV2ViR0wyOiBpc1dlYkdMMixcblxuXHRcdFx0c2hhZGVySUQ6IHNoYWRlcklELFxuXHRcdFx0c2hhZGVyTmFtZTogbWF0ZXJpYWwudHlwZSxcblxuXHRcdFx0dmVydGV4U2hhZGVyOiB2ZXJ0ZXhTaGFkZXIsXG5cdFx0XHRmcmFnbWVudFNoYWRlcjogZnJhZ21lbnRTaGFkZXIsXG5cdFx0XHRkZWZpbmVzOiBtYXRlcmlhbC5kZWZpbmVzLFxuXG5cdFx0XHRpc1Jhd1NoYWRlck1hdGVyaWFsOiBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsID09PSB0cnVlLFxuXHRcdFx0Z2xzbFZlcnNpb246IG1hdGVyaWFsLmdsc2xWZXJzaW9uLFxuXG5cdFx0XHRwcmVjaXNpb246IHByZWNpc2lvbixcblxuXHRcdFx0aW5zdGFuY2luZzogb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCA9PT0gdHJ1ZSxcblx0XHRcdGluc3RhbmNpbmdDb2xvcjogb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCA9PT0gdHJ1ZSAmJiBvYmplY3QuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCxcblxuXHRcdFx0c3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczogdmVydGV4VGV4dHVyZXMsXG5cdFx0XHRvdXRwdXRFbmNvZGluZzogKCBjdXJyZW50UmVuZGVyVGFyZ2V0ICE9PSBudWxsICkgPyBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUgKSA6IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nLFxuXHRcdFx0bWFwOiAhISBtYXRlcmlhbC5tYXAsXG5cdFx0XHRtYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwubWFwICksXG5cdFx0XHRtYXRjYXA6ICEhIG1hdGVyaWFsLm1hdGNhcCxcblx0XHRcdG1hdGNhcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXRjYXAgKSxcblx0XHRcdGVudk1hcDogISEgZW52TWFwLFxuXHRcdFx0ZW52TWFwTW9kZTogZW52TWFwICYmIGVudk1hcC5tYXBwaW5nLFxuXHRcdFx0ZW52TWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIGVudk1hcCApLFxuXHRcdFx0ZW52TWFwQ3ViZVVWOiAoICEhIGVudk1hcCApICYmICggKCBlbnZNYXAubWFwcGluZyA9PT0gQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcgKSB8fCAoIGVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZyApICksXG5cdFx0XHRsaWdodE1hcDogISEgbWF0ZXJpYWwubGlnaHRNYXAsXG5cdFx0XHRsaWdodE1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5saWdodE1hcCApLFxuXHRcdFx0YW9NYXA6ICEhIG1hdGVyaWFsLmFvTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXA6ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwLFxuXHRcdFx0ZW1pc3NpdmVNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSxcblx0XHRcdGJ1bXBNYXA6ICEhIG1hdGVyaWFsLmJ1bXBNYXAsXG5cdFx0XHRub3JtYWxNYXA6ICEhIG1hdGVyaWFsLm5vcm1hbE1hcCxcblx0XHRcdG9iamVjdFNwYWNlTm9ybWFsTWFwOiBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID09PSBPYmplY3RTcGFjZU5vcm1hbE1hcCxcblx0XHRcdHRhbmdlbnRTcGFjZU5vcm1hbE1hcDogbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwLFxuXHRcdFx0Y2xlYXJjb2F0TWFwOiAhISBtYXRlcmlhbC5jbGVhcmNvYXRNYXAsXG5cdFx0XHRjbGVhcmNvYXRSb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCxcblx0XHRcdGNsZWFyY29hdE5vcm1hbE1hcDogISEgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLFxuXHRcdFx0ZGlzcGxhY2VtZW50TWFwOiAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsXG5cdFx0XHRyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCxcblx0XHRcdG1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLFxuXHRcdFx0c3BlY3VsYXJNYXA6ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwLFxuXHRcdFx0YWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLFxuXG5cdFx0XHRncmFkaWVudE1hcDogISEgbWF0ZXJpYWwuZ3JhZGllbnRNYXAsXG5cblx0XHRcdHNoZWVuOiAhISBtYXRlcmlhbC5zaGVlbixcblxuXHRcdFx0dHJhbnNtaXNzaW9uTWFwOiAhISBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAsXG5cblx0XHRcdGNvbWJpbmU6IG1hdGVyaWFsLmNvbWJpbmUsXG5cblx0XHRcdHZlcnRleFRhbmdlbnRzOiAoIG1hdGVyaWFsLm5vcm1hbE1hcCAmJiBtYXRlcmlhbC52ZXJ0ZXhUYW5nZW50cyApLFxuXHRcdFx0dmVydGV4Q29sb3JzOiBtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMsXG5cdFx0XHR2ZXJ0ZXhBbHBoYXM6IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNCxcblx0XHRcdHZlcnRleFV2czogISEgbWF0ZXJpYWwubWFwIHx8ICEhIG1hdGVyaWFsLmJ1bXBNYXAgfHwgISEgbWF0ZXJpYWwubm9ybWFsTWFwIHx8ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwIHx8ICEhIG1hdGVyaWFsLmFscGhhTWFwIHx8ICEhIG1hdGVyaWFsLmVtaXNzaXZlTWFwIHx8ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCB8fCAhISBtYXRlcmlhbC5tZXRhbG5lc3NNYXAgfHwgISEgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwIHx8ICEhIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwIHx8ICEhIG1hdGVyaWFsLnRyYW5zbWlzc2lvbk1hcCxcblx0XHRcdHV2c1ZlcnRleE9ubHk6ICEgKCAhISBtYXRlcmlhbC5tYXAgfHwgISEgbWF0ZXJpYWwuYnVtcE1hcCB8fCAhISBtYXRlcmlhbC5ub3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgfHwgISEgbWF0ZXJpYWwuYWxwaGFNYXAgfHwgISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgfHwgISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwIHx8ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwICkgJiYgISEgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwLFxuXG5cdFx0XHRmb2c6ICEhIGZvZyxcblx0XHRcdHVzZUZvZzogbWF0ZXJpYWwuZm9nLFxuXHRcdFx0Zm9nRXhwMjogKCBmb2cgJiYgZm9nLmlzRm9nRXhwMiApLFxuXG5cdFx0XHRmbGF0U2hhZGluZzogISEgbWF0ZXJpYWwuZmxhdFNoYWRpbmcsXG5cblx0XHRcdHNpemVBdHRlbnVhdGlvbjogbWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uLFxuXHRcdFx0bG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcjogbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixcblxuXHRcdFx0c2tpbm5pbmc6IG1hdGVyaWFsLnNraW5uaW5nICYmIG1heEJvbmVzID4gMCxcblx0XHRcdG1heEJvbmVzOiBtYXhCb25lcyxcblx0XHRcdHVzZVZlcnRleFRleHR1cmU6IGZsb2F0VmVydGV4VGV4dHVyZXMsXG5cblx0XHRcdG1vcnBoVGFyZ2V0czogbWF0ZXJpYWwubW9ycGhUYXJnZXRzLFxuXHRcdFx0bW9ycGhOb3JtYWxzOiBtYXRlcmlhbC5tb3JwaE5vcm1hbHMsXG5cblx0XHRcdG51bURpckxpZ2h0czogbGlnaHRzLmRpcmVjdGlvbmFsLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRzOiBsaWdodHMucG9pbnQubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0czogbGlnaHRzLnNwb3QubGVuZ3RoLFxuXHRcdFx0bnVtUmVjdEFyZWFMaWdodHM6IGxpZ2h0cy5yZWN0QXJlYS5sZW5ndGgsXG5cdFx0XHRudW1IZW1pTGlnaHRzOiBsaWdodHMuaGVtaS5sZW5ndGgsXG5cblx0XHRcdG51bURpckxpZ2h0U2hhZG93czogbGlnaHRzLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCxcblx0XHRcdG51bVBvaW50TGlnaHRTaGFkb3dzOiBsaWdodHMucG9pbnRTaGFkb3dNYXAubGVuZ3RoLFxuXHRcdFx0bnVtU3BvdExpZ2h0U2hhZG93czogbGlnaHRzLnNwb3RTaGFkb3dNYXAubGVuZ3RoLFxuXG5cdFx0XHRudW1DbGlwcGluZ1BsYW5lczogY2xpcHBpbmcubnVtUGxhbmVzLFxuXHRcdFx0bnVtQ2xpcEludGVyc2VjdGlvbjogY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLFxuXG5cdFx0XHRkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZyxcblxuXHRcdFx0c2hhZG93TWFwRW5hYmxlZDogcmVuZGVyZXIuc2hhZG93TWFwLmVuYWJsZWQgJiYgc2hhZG93cy5sZW5ndGggPiAwLFxuXHRcdFx0c2hhZG93TWFwVHlwZTogcmVuZGVyZXIuc2hhZG93TWFwLnR5cGUsXG5cblx0XHRcdHRvbmVNYXBwaW5nOiBtYXRlcmlhbC50b25lTWFwcGVkID8gcmVuZGVyZXIudG9uZU1hcHBpbmcgOiBOb1RvbmVNYXBwaW5nLFxuXHRcdFx0cGh5c2ljYWxseUNvcnJlY3RMaWdodHM6IHJlbmRlcmVyLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzLFxuXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSxcblxuXHRcdFx0YWxwaGFUZXN0OiBtYXRlcmlhbC5hbHBoYVRlc3QsXG5cdFx0XHRkb3VibGVTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gRG91YmxlU2lkZSxcblx0XHRcdGZsaXBTaWRlZDogbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUsXG5cblx0XHRcdGRlcHRoUGFja2luZzogKCBtYXRlcmlhbC5kZXB0aFBhY2tpbmcgIT09IHVuZGVmaW5lZCApID8gbWF0ZXJpYWwuZGVwdGhQYWNraW5nIDogZmFsc2UsXG5cblx0XHRcdGluZGV4MEF0dHJpYnV0ZU5hbWU6IG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUsXG5cblx0XHRcdGV4dGVuc2lvbkRlcml2YXRpdmVzOiBtYXRlcmlhbC5leHRlbnNpb25zICYmIG1hdGVyaWFsLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMsXG5cdFx0XHRleHRlbnNpb25GcmFnRGVwdGg6IG1hdGVyaWFsLmV4dGVuc2lvbnMgJiYgbWF0ZXJpYWwuZXh0ZW5zaW9ucy5mcmFnRGVwdGgsXG5cdFx0XHRleHRlbnNpb25EcmF3QnVmZmVyczogbWF0ZXJpYWwuZXh0ZW5zaW9ucyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLmRyYXdCdWZmZXJzLFxuXHRcdFx0ZXh0ZW5zaW9uU2hhZGVyVGV4dHVyZUxPRDogbWF0ZXJpYWwuZXh0ZW5zaW9ucyAmJiBtYXRlcmlhbC5leHRlbnNpb25zLnNoYWRlclRleHR1cmVMT0QsXG5cblx0XHRcdHJlbmRlcmVyRXh0ZW5zaW9uRnJhZ0RlcHRoOiBpc1dlYkdMMiB8fCBleHRlbnNpb25zLmhhcyggJ0VYVF9mcmFnX2RlcHRoJyApLFxuXHRcdFx0cmVuZGVyZXJFeHRlbnNpb25EcmF3QnVmZmVyczogaXNXZWJHTDIgfHwgZXh0ZW5zaW9ucy5oYXMoICdXRUJHTF9kcmF3X2J1ZmZlcnMnICksXG5cdFx0XHRyZW5kZXJlckV4dGVuc2lvblNoYWRlclRleHR1cmVMb2Q6IGlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuaGFzKCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSxcblxuXHRcdFx0Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5OiBtYXRlcmlhbC5jdXN0b21Qcm9ncmFtQ2FjaGVLZXkoKVxuXG5cdFx0fTtcblxuXHRcdHJldHVybiBwYXJhbWV0ZXJzO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtQ2FjaGVLZXkoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRjb25zdCBhcnJheSA9IFtdO1xuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICkge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnNoYWRlcklEICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmZyYWdtZW50U2hhZGVyICk7XG5cdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLnZlcnRleFNoYWRlciApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBwYXJhbWV0ZXJzLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Zm9yICggY29uc3QgbmFtZSBpbiBwYXJhbWV0ZXJzLmRlZmluZXMgKSB7XG5cblx0XHRcdFx0YXJyYXkucHVzaCggbmFtZSApO1xuXHRcdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzLmRlZmluZXNbIG5hbWUgXSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHBhcmFtZXRlcnMuaXNSYXdTaGFkZXJNYXRlcmlhbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHBhcmFtZXRlck5hbWVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhcnJheS5wdXNoKCBwYXJhbWV0ZXJzWyBwYXJhbWV0ZXJOYW1lc1sgaSBdIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRhcnJheS5wdXNoKCByZW5kZXJlci5vdXRwdXRFbmNvZGluZyApO1xuXHRcdFx0YXJyYXkucHVzaCggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgKTtcblxuXHRcdH1cblxuXHRcdGFycmF5LnB1c2goIHBhcmFtZXRlcnMuY3VzdG9tUHJvZ3JhbUNhY2hlS2V5ICk7XG5cblx0XHRyZXR1cm4gYXJyYXkuam9pbigpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRVbmlmb3JtcyggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCBzaGFkZXJJRCA9IHNoYWRlcklEc1sgbWF0ZXJpYWwudHlwZSBdO1xuXHRcdGxldCB1bmlmb3JtcztcblxuXHRcdGlmICggc2hhZGVySUQgKSB7XG5cblx0XHRcdGNvbnN0IHNoYWRlciA9IFNoYWRlckxpYlsgc2hhZGVySUQgXTtcblx0XHRcdHVuaWZvcm1zID0gVW5pZm9ybXNVdGlscy5jbG9uZSggc2hhZGVyLnVuaWZvcm1zICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR1bmlmb3JtcyA9IG1hdGVyaWFsLnVuaWZvcm1zO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuaWZvcm1zO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBhY3F1aXJlUHJvZ3JhbSggcGFyYW1ldGVycywgY2FjaGVLZXkgKSB7XG5cblx0XHRsZXQgcHJvZ3JhbTtcblxuXHRcdC8vIENoZWNrIGlmIGNvZGUgaGFzIGJlZW4gYWxyZWFkeSBjb21waWxlZFxuXHRcdGZvciAoIGxldCBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHtcblxuXHRcdFx0Y29uc3QgcHJlZXhpc3RpbmdQcm9ncmFtID0gcHJvZ3JhbXNbIHAgXTtcblxuXHRcdFx0aWYgKCBwcmVleGlzdGluZ1Byb2dyYW0uY2FjaGVLZXkgPT09IGNhY2hlS2V5ICkge1xuXG5cdFx0XHRcdHByb2dyYW0gPSBwcmVleGlzdGluZ1Byb2dyYW07XG5cdFx0XHRcdCsrIHByb2dyYW0udXNlZFRpbWVzO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cHJvZ3JhbSA9IG5ldyBXZWJHTFByb2dyYW0oIHJlbmRlcmVyLCBjYWNoZUtleSwgcGFyYW1ldGVycywgYmluZGluZ1N0YXRlcyApO1xuXHRcdFx0cHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb2dyYW07XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtICkge1xuXG5cdFx0aWYgKCAtLSBwcm9ncmFtLnVzZWRUaW1lcyA9PT0gMCApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGZyb20gdW5vcmRlcmVkIHNldFxuXHRcdFx0Y29uc3QgaSA9IHByb2dyYW1zLmluZGV4T2YoIHByb2dyYW0gKTtcblx0XHRcdHByb2dyYW1zWyBpIF0gPSBwcm9ncmFtc1sgcHJvZ3JhbXMubGVuZ3RoIC0gMSBdO1xuXHRcdFx0cHJvZ3JhbXMucG9wKCk7XG5cblx0XHRcdC8vIEZyZWUgV2ViR0wgcmVzb3VyY2VzXG5cdFx0XHRwcm9ncmFtLmRlc3Ryb3koKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXRQYXJhbWV0ZXJzOiBnZXRQYXJhbWV0ZXJzLFxuXHRcdGdldFByb2dyYW1DYWNoZUtleTogZ2V0UHJvZ3JhbUNhY2hlS2V5LFxuXHRcdGdldFVuaWZvcm1zOiBnZXRVbmlmb3Jtcyxcblx0XHRhY3F1aXJlUHJvZ3JhbTogYWNxdWlyZVByb2dyYW0sXG5cdFx0cmVsZWFzZVByb2dyYW06IHJlbGVhc2VQcm9ncmFtLFxuXHRcdC8vIEV4cG9zZWQgZm9yIHJlc291cmNlIG1vbml0b3JpbmcgJiBlcnJvciBmZWVkYmFjayB2aWEgcmVuZGVyZXIuaW5mbzpcblx0XHRwcm9ncmFtczogcHJvZ3JhbXNcblx0fTtcblxufVxuXG5mdW5jdGlvbiBXZWJHTFByb3BlcnRpZXMoKSB7XG5cblx0bGV0IHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdGZ1bmN0aW9uIGdldCggb2JqZWN0ICkge1xuXG5cdFx0bGV0IG1hcCA9IHByb3BlcnRpZXMuZ2V0KCBvYmplY3QgKTtcblxuXHRcdGlmICggbWFwID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hcCA9IHt9O1xuXHRcdFx0cHJvcGVydGllcy5zZXQoIG9iamVjdCwgbWFwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwO1xuXG5cdH1cblxuXHRmdW5jdGlvbiByZW1vdmUoIG9iamVjdCApIHtcblxuXHRcdHByb3BlcnRpZXMuZGVsZXRlKCBvYmplY3QgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlKCBvYmplY3QsIGtleSwgdmFsdWUgKSB7XG5cblx0XHRwcm9wZXJ0aWVzLmdldCggb2JqZWN0IClbIGtleSBdID0gdmFsdWU7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG5cblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGdldCxcblx0XHRyZW1vdmU6IHJlbW92ZSxcblx0XHR1cGRhdGU6IHVwZGF0ZSxcblx0XHRkaXNwb3NlOiBkaXNwb3NlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7XG5cblx0aWYgKCBhLmdyb3VwT3JkZXIgIT09IGIuZ3JvdXBPcmRlciApIHtcblxuXHRcdHJldHVybiBhLmdyb3VwT3JkZXIgLSBiLmdyb3VwT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS5yZW5kZXJPcmRlciAhPT0gYi5yZW5kZXJPcmRlciApIHtcblxuXHRcdHJldHVybiBhLnJlbmRlck9yZGVyIC0gYi5yZW5kZXJPcmRlcjtcblxuXHR9IGVsc2UgaWYgKCBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHtcblxuXHRcdHJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7XG5cblx0fSBlbHNlIGlmICggYS5tYXRlcmlhbC5pZCAhPT0gYi5tYXRlcmlhbC5pZCApIHtcblxuXHRcdHJldHVybiBhLm1hdGVyaWFsLmlkIC0gYi5tYXRlcmlhbC5pZDtcblxuXHR9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHtcblxuXHRcdHJldHVybiBhLnogLSBiLno7XG5cblx0fSBlbHNlIHtcblxuXHRcdHJldHVybiBhLmlkIC0gYi5pZDtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlKCBhLCBiICkge1xuXG5cdGlmICggYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyO1xuXG5cdH0gZWxzZSBpZiAoIGEucmVuZGVyT3JkZXIgIT09IGIucmVuZGVyT3JkZXIgKSB7XG5cblx0XHRyZXR1cm4gYS5yZW5kZXJPcmRlciAtIGIucmVuZGVyT3JkZXI7XG5cblx0fSBlbHNlIGlmICggYS56ICE9PSBiLnogKSB7XG5cblx0XHRyZXR1cm4gYi56IC0gYS56O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRyZXR1cm4gYS5pZCAtIGIuaWQ7XG5cblx0fVxuXG59XG5cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0KCBwcm9wZXJ0aWVzICkge1xuXG5cdGNvbnN0IHJlbmRlckl0ZW1zID0gW107XG5cdGxldCByZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRjb25zdCBvcGFxdWUgPSBbXTtcblx0Y29uc3QgdHJhbnNwYXJlbnQgPSBbXTtcblxuXHRjb25zdCBkZWZhdWx0UHJvZ3JhbSA9IHsgaWQ6IC0gMSB9O1xuXG5cdGZ1bmN0aW9uIGluaXQoKSB7XG5cblx0XHRyZW5kZXJJdGVtc0luZGV4ID0gMDtcblxuXHRcdG9wYXF1ZS5sZW5ndGggPSAwO1xuXHRcdHRyYW5zcGFyZW50Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldE5leHRSZW5kZXJJdGVtKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRsZXQgcmVuZGVySXRlbSA9IHJlbmRlckl0ZW1zWyByZW5kZXJJdGVtc0luZGV4IF07XG5cdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHRpZiAoIHJlbmRlckl0ZW0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0cmVuZGVySXRlbSA9IHtcblx0XHRcdFx0aWQ6IG9iamVjdC5pZCxcblx0XHRcdFx0b2JqZWN0OiBvYmplY3QsXG5cdFx0XHRcdGdlb21ldHJ5OiBnZW9tZXRyeSxcblx0XHRcdFx0bWF0ZXJpYWw6IG1hdGVyaWFsLFxuXHRcdFx0XHRwcm9ncmFtOiBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbSB8fCBkZWZhdWx0UHJvZ3JhbSxcblx0XHRcdFx0Z3JvdXBPcmRlcjogZ3JvdXBPcmRlcixcblx0XHRcdFx0cmVuZGVyT3JkZXI6IG9iamVjdC5yZW5kZXJPcmRlcixcblx0XHRcdFx0ejogeixcblx0XHRcdFx0Z3JvdXA6IGdyb3VwXG5cdFx0XHR9O1xuXG5cdFx0XHRyZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdID0gcmVuZGVySXRlbTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7XG5cdFx0XHRyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDtcblx0XHRcdHJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0XHRcdHJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtIHx8IGRlZmF1bHRQcm9ncmFtO1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cE9yZGVyID0gZ3JvdXBPcmRlcjtcblx0XHRcdHJlbmRlckl0ZW0ucmVuZGVyT3JkZXIgPSBvYmplY3QucmVuZGVyT3JkZXI7XG5cdFx0XHRyZW5kZXJJdGVtLnogPSB6O1xuXHRcdFx0cmVuZGVySXRlbS5ncm91cCA9IGdyb3VwO1xuXG5cdFx0fVxuXG5cdFx0cmVuZGVySXRlbXNJbmRleCArKztcblxuXHRcdHJldHVybiByZW5kZXJJdGVtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRjb25zdCByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkucHVzaCggcmVuZGVySXRlbSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1bnNoaWZ0KCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXBPcmRlciwgeiwgZ3JvdXAgKSB7XG5cblx0XHRjb25zdCByZW5kZXJJdGVtID0gZ2V0TmV4dFJlbmRlckl0ZW0oIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCB6LCBncm91cCApO1xuXG5cdFx0KCBtYXRlcmlhbC50cmFuc3BhcmVudCA9PT0gdHJ1ZSA/IHRyYW5zcGFyZW50IDogb3BhcXVlICkudW5zaGlmdCggcmVuZGVySXRlbSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzb3J0KCBjdXN0b21PcGFxdWVTb3J0LCBjdXN0b21UcmFuc3BhcmVudFNvcnQgKSB7XG5cblx0XHRpZiAoIG9wYXF1ZS5sZW5ndGggPiAxICkgb3BhcXVlLnNvcnQoIGN1c3RvbU9wYXF1ZVNvcnQgfHwgcGFpbnRlclNvcnRTdGFibGUgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50Lmxlbmd0aCA+IDEgKSB0cmFuc3BhcmVudC5zb3J0KCBjdXN0b21UcmFuc3BhcmVudFNvcnQgfHwgcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGZpbmlzaCgpIHtcblxuXHRcdC8vIENsZWFyIHJlZmVyZW5jZXMgZnJvbSBpbmFjdGl2ZSByZW5kZXJJdGVtcyBpbiB0aGUgbGlzdFxuXG5cdFx0Zm9yICggbGV0IGkgPSByZW5kZXJJdGVtc0luZGV4LCBpbCA9IHJlbmRlckl0ZW1zLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCByZW5kZXJJdGVtID0gcmVuZGVySXRlbXNbIGkgXTtcblxuXHRcdFx0aWYgKCByZW5kZXJJdGVtLmlkID09PSBudWxsICkgYnJlYWs7XG5cblx0XHRcdHJlbmRlckl0ZW0uaWQgPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5vYmplY3QgPSBudWxsO1xuXHRcdFx0cmVuZGVySXRlbS5nZW9tZXRyeSA9IG51bGw7XG5cdFx0XHRyZW5kZXJJdGVtLm1hdGVyaWFsID0gbnVsbDtcblx0XHRcdHJlbmRlckl0ZW0ucHJvZ3JhbSA9IG51bGw7XG5cdFx0XHRyZW5kZXJJdGVtLmdyb3VwID0gbnVsbDtcblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblxuXHRcdG9wYXF1ZTogb3BhcXVlLFxuXHRcdHRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCxcblxuXHRcdGluaXQ6IGluaXQsXG5cdFx0cHVzaDogcHVzaCxcblx0XHR1bnNoaWZ0OiB1bnNoaWZ0LFxuXHRcdGZpbmlzaDogZmluaXNoLFxuXG5cdFx0c29ydDogc29ydFxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdHMoIHByb3BlcnRpZXMgKSB7XG5cblx0bGV0IGxpc3RzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCByZW5kZXJDYWxsRGVwdGggKSB7XG5cblx0XHRsZXQgbGlzdDtcblxuXHRcdGlmICggbGlzdHMuaGFzKCBzY2VuZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0bGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoIHByb3BlcnRpZXMgKTtcblx0XHRcdGxpc3RzLnNldCggc2NlbmUsIFsgbGlzdCBdICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSBsaXN0cy5nZXQoIHNjZW5lICkubGVuZ3RoICkge1xuXG5cdFx0XHRcdGxpc3QgPSBuZXcgV2ViR0xSZW5kZXJMaXN0KCBwcm9wZXJ0aWVzICk7XG5cdFx0XHRcdGxpc3RzLmdldCggc2NlbmUgKS5wdXNoKCBsaXN0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0bGlzdCA9IGxpc3RzLmdldCggc2NlbmUgKVsgcmVuZGVyQ2FsbERlcHRoIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBsaXN0O1xuXG5cdH1cblxuXHRmdW5jdGlvbiBkaXNwb3NlKCkge1xuXG5cdFx0bGlzdHMgPSBuZXcgV2Vha01hcCgpO1xuXG5cdH1cblxuXHRyZXR1cm4ge1xuXHRcdGdldDogZ2V0LFxuXHRcdGRpc3Bvc2U6IGRpc3Bvc2Vcblx0fTtcblxufVxuXG5mdW5jdGlvbiBVbmlmb3Jtc0NhY2hlKCkge1xuXG5cdGNvbnN0IGxpZ2h0cyA9IHt9O1xuXG5cdHJldHVybiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICggbGlnaHQgKSB7XG5cblx0XHRcdGlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGxpZ2h0c1sgbGlnaHQuaWQgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgdW5pZm9ybXM7XG5cblx0XHRcdHN3aXRjaCAoIGxpZ2h0LnR5cGUgKSB7XG5cblx0XHRcdFx0Y2FzZSAnRGlyZWN0aW9uYWxMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKClcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1Nwb3RMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSxcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdGRpc3RhbmNlOiAwLFxuXHRcdFx0XHRcdFx0Y29uZUNvczogMCxcblx0XHRcdFx0XHRcdHBlbnVtYnJhQ29zOiAwLFxuXHRcdFx0XHRcdFx0ZGVjYXk6IDBcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ1BvaW50TGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0cG9zaXRpb246IG5ldyBWZWN0b3IzKCksXG5cdFx0XHRcdFx0XHRjb2xvcjogbmV3IENvbG9yKCksXG5cdFx0XHRcdFx0XHRkaXN0YW5jZTogMCxcblx0XHRcdFx0XHRcdGRlY2F5OiAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXHRcdFx0XHRcdHVuaWZvcm1zID0ge1xuXHRcdFx0XHRcdFx0ZGlyZWN0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0c2t5Q29sb3I6IG5ldyBDb2xvcigpLFxuXHRcdFx0XHRcdFx0Z3JvdW5kQ29sb3I6IG5ldyBDb2xvcigpXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdSZWN0QXJlYUxpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdGNvbG9yOiBuZXcgQ29sb3IoKSxcblx0XHRcdFx0XHRcdHBvc2l0aW9uOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZldpZHRoOiBuZXcgVmVjdG9yMygpLFxuXHRcdFx0XHRcdFx0aGFsZkhlaWdodDogbmV3IFZlY3RvcjMoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cbmZ1bmN0aW9uIFNoYWRvd1VuaWZvcm1zQ2FjaGUoKSB7XG5cblx0Y29uc3QgbGlnaHRzID0ge307XG5cblx0cmV0dXJuIHtcblxuXHRcdGdldDogZnVuY3Rpb24gKCBsaWdodCApIHtcblxuXHRcdFx0aWYgKCBsaWdodHNbIGxpZ2h0LmlkIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gbGlnaHRzWyBsaWdodC5pZCBdO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB1bmlmb3JtcztcblxuXHRcdFx0c3dpdGNoICggbGlnaHQudHlwZSApIHtcblxuXHRcdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnU3BvdExpZ2h0Jzpcblx0XHRcdFx0XHR1bmlmb3JtcyA9IHtcblx0XHRcdFx0XHRcdHNoYWRvd0JpYXM6IDAsXG5cdFx0XHRcdFx0XHRzaGFkb3dOb3JtYWxCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93UmFkaXVzOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93TWFwU2l6ZTogbmV3IFZlY3RvcjIoKVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cdFx0XHRcdFx0dW5pZm9ybXMgPSB7XG5cdFx0XHRcdFx0XHRzaGFkb3dCaWFzOiAwLFxuXHRcdFx0XHRcdFx0c2hhZG93Tm9ybWFsQmlhczogMCxcblx0XHRcdFx0XHRcdHNoYWRvd1JhZGl1czogMSxcblx0XHRcdFx0XHRcdHNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksXG5cdFx0XHRcdFx0XHRzaGFkb3dDYW1lcmFOZWFyOiAxLFxuXHRcdFx0XHRcdFx0c2hhZG93Q2FtZXJhRmFyOiAxMDAwXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHQvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zXG5cblx0XHRcdH1cblxuXHRcdFx0bGlnaHRzWyBsaWdodC5pZCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdHJldHVybiB1bmlmb3JtcztcblxuXHRcdH1cblxuXHR9O1xuXG59XG5cblxuXG5sZXQgbmV4dFZlcnNpb24gPSAwO1xuXG5mdW5jdGlvbiBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QoIGxpZ2h0QSwgbGlnaHRCICkge1xuXG5cdHJldHVybiAoIGxpZ2h0Qi5jYXN0U2hhZG93ID8gMSA6IDAgKSAtICggbGlnaHRBLmNhc3RTaGFkb3cgPyAxIDogMCApO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMTGlnaHRzKCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgY2FjaGUgPSBuZXcgVW5pZm9ybXNDYWNoZSgpO1xuXG5cdGNvbnN0IHNoYWRvd0NhY2hlID0gU2hhZG93VW5pZm9ybXNDYWNoZSgpO1xuXG5cdGNvbnN0IHN0YXRlID0ge1xuXG5cdFx0dmVyc2lvbjogMCxcblxuXHRcdGhhc2g6IHtcblx0XHRcdGRpcmVjdGlvbmFsTGVuZ3RoOiAtIDEsXG5cdFx0XHRwb2ludExlbmd0aDogLSAxLFxuXHRcdFx0c3BvdExlbmd0aDogLSAxLFxuXHRcdFx0cmVjdEFyZWFMZW5ndGg6IC0gMSxcblx0XHRcdGhlbWlMZW5ndGg6IC0gMSxcblxuXHRcdFx0bnVtRGlyZWN0aW9uYWxTaGFkb3dzOiAtIDEsXG5cdFx0XHRudW1Qb2ludFNoYWRvd3M6IC0gMSxcblx0XHRcdG51bVNwb3RTaGFkb3dzOiAtIDFcblx0XHR9LFxuXG5cdFx0YW1iaWVudDogWyAwLCAwLCAwIF0sXG5cdFx0cHJvYmU6IFtdLFxuXHRcdGRpcmVjdGlvbmFsOiBbXSxcblx0XHRkaXJlY3Rpb25hbFNoYWRvdzogW10sXG5cdFx0ZGlyZWN0aW9uYWxTaGFkb3dNYXA6IFtdLFxuXHRcdGRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSxcblx0XHRzcG90OiBbXSxcblx0XHRzcG90U2hhZG93OiBbXSxcblx0XHRzcG90U2hhZG93TWFwOiBbXSxcblx0XHRzcG90U2hhZG93TWF0cml4OiBbXSxcblx0XHRyZWN0QXJlYTogW10sXG5cdFx0cmVjdEFyZWFMVEMxOiBudWxsLFxuXHRcdHJlY3RBcmVhTFRDMjogbnVsbCxcblx0XHRwb2ludDogW10sXG5cdFx0cG9pbnRTaGFkb3c6IFtdLFxuXHRcdHBvaW50U2hhZG93TWFwOiBbXSxcblx0XHRwb2ludFNoYWRvd01hdHJpeDogW10sXG5cdFx0aGVtaTogW11cblxuXHR9O1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSBzdGF0ZS5wcm9iZS5wdXNoKCBuZXcgVmVjdG9yMygpICk7XG5cblx0Y29uc3QgdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7XG5cdGNvbnN0IG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpO1xuXHRjb25zdCBtYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCk7XG5cblx0ZnVuY3Rpb24gc2V0dXAoIGxpZ2h0cyApIHtcblxuXHRcdGxldCByID0gMCwgZyA9IDAsIGIgPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHN0YXRlLnByb2JlWyBpIF0uc2V0KCAwLCAwLCAwICk7XG5cblx0XHRsZXQgZGlyZWN0aW9uYWxMZW5ndGggPSAwO1xuXHRcdGxldCBwb2ludExlbmd0aCA9IDA7XG5cdFx0bGV0IHNwb3RMZW5ndGggPSAwO1xuXHRcdGxldCByZWN0QXJlYUxlbmd0aCA9IDA7XG5cdFx0bGV0IGhlbWlMZW5ndGggPSAwO1xuXG5cdFx0bGV0IG51bURpcmVjdGlvbmFsU2hhZG93cyA9IDA7XG5cdFx0bGV0IG51bVBvaW50U2hhZG93cyA9IDA7XG5cdFx0bGV0IG51bVNwb3RTaGFkb3dzID0gMDtcblxuXHRcdGxpZ2h0cy5zb3J0KCBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9IGxpZ2h0LmNvbG9yO1xuXHRcdFx0Y29uc3QgaW50ZW5zaXR5ID0gbGlnaHQuaW50ZW5zaXR5O1xuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTtcblxuXHRcdFx0Y29uc3Qgc2hhZG93TWFwID0gKCBsaWdodC5zaGFkb3cgJiYgbGlnaHQuc2hhZG93Lm1hcCApID8gbGlnaHQuc2hhZG93Lm1hcC50ZXh0dXJlIDogbnVsbDtcblxuXHRcdFx0aWYgKCBsaWdodC5pc0FtYmllbnRMaWdodCApIHtcblxuXHRcdFx0XHRyICs9IGNvbG9yLnIgKiBpbnRlbnNpdHk7XG5cdFx0XHRcdGcgKz0gY29sb3IuZyAqIGludGVuc2l0eTtcblx0XHRcdFx0YiArPSBjb2xvci5iICogaW50ZW5zaXR5O1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0xpZ2h0UHJvYmUgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgOTsgaiArKyApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnByb2JlWyBqIF0uYWRkU2NhbGVkVmVjdG9yKCBsaWdodC5zaC5jb2VmZmljaWVudHNbIGogXSwgaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0aWYgKCBsaWdodC5jYXN0U2hhZG93ICkge1xuXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRcdFx0Y29uc3Qgc2hhZG93VW5pZm9ybXMgPSBzaGFkb3dDYWNoZS5nZXQoIGxpZ2h0ICk7XG5cblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dCaWFzID0gc2hhZG93LmJpYXM7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93Tm9ybWFsQmlhcyA9IHNoYWRvdy5ub3JtYWxCaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd1JhZGl1cyA9IHNoYWRvdy5yYWRpdXM7XG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplO1xuXG5cdFx0XHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3Jtcztcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdFx0XHRudW1EaXJlY3Rpb25hbFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsWyBkaXJlY3Rpb25hbExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0ZGlyZWN0aW9uYWxMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzU3BvdExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5jb25lQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICk7XG5cdFx0XHRcdHVuaWZvcm1zLnBlbnVtYnJhQ29zID0gTWF0aC5jb3MoIGxpZ2h0LmFuZ2xlICogKCAxIC0gbGlnaHQucGVudW1icmEgKSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblxuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dbIHNwb3RMZW5ndGggXSA9IHNoYWRvd1VuaWZvcm1zO1xuXHRcdFx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXBbIHNwb3RMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4WyBzcG90TGVuZ3RoIF0gPSBsaWdodC5zaGFkb3cubWF0cml4O1xuXG5cdFx0XHRcdFx0bnVtU3BvdFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnNwb3RbIHNwb3RMZW5ndGggXSA9IHVuaWZvcm1zO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTtcblxuXHRcdFx0XHQvLyAoYSkgaW50ZW5zaXR5IGlzIHRoZSB0b3RhbCB2aXNpYmxlIGxpZ2h0IGVtaXR0ZWRcblx0XHRcdFx0Ly91bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICogTWF0aC5QSSApICk7XG5cblx0XHRcdFx0Ly8gKGIpIGludGVuc2l0eSBpcyB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgbGlnaHRcblx0XHRcdFx0dW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0c3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRyZWN0QXJlYUxlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGxpZ2h0LmludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlO1xuXHRcdFx0XHR1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5O1xuXG5cdFx0XHRcdGlmICggbGlnaHQuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvdyA9IGxpZ2h0LnNoYWRvdztcblxuXHRcdFx0XHRcdGNvbnN0IHNoYWRvd1VuaWZvcm1zID0gc2hhZG93Q2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdFx0c2hhZG93VW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd05vcm1hbEJpYXMgPSBzaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd01hcFNpemUgPSBzaGFkb3cubWFwU2l6ZTtcblx0XHRcdFx0XHRzaGFkb3dVbmlmb3Jtcy5zaGFkb3dDYW1lcmFOZWFyID0gc2hhZG93LmNhbWVyYS5uZWFyO1xuXHRcdFx0XHRcdHNoYWRvd1VuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyO1xuXG5cdFx0XHRcdFx0c3RhdGUucG9pbnRTaGFkb3dbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dVbmlmb3Jtcztcblx0XHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hcFsgcG9pbnRMZW5ndGggXSA9IHNoYWRvd01hcDtcblx0XHRcdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeFsgcG9pbnRMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7XG5cblx0XHRcdFx0XHRudW1Qb2ludFNoYWRvd3MgKys7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdID0gdW5pZm9ybXM7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApO1xuXHRcdFx0XHR1bmlmb3Jtcy5ncm91bmRDb2xvci5jb3B5KCBsaWdodC5ncm91bmRDb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtcztcblxuXHRcdFx0XHRoZW1pTGVuZ3RoICsrO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlY3RBcmVhTGVuZ3RoID4gMCApIHtcblxuXHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7XG5cblx0XHRcdFx0Ly8gV2ViR0wgMlxuXG5cdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xO1xuXHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzIgPSBVbmlmb3Jtc0xpYi5MVENfRkxPQVRfMjtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBXZWJHTCAxXG5cblx0XHRcdFx0aWYgKCBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0X2xpbmVhcicgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMSA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8xO1xuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19GTE9BVF8yO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICkgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHRzdGF0ZS5yZWN0QXJlYUxUQzEgPSBVbmlmb3Jtc0xpYi5MVENfSEFMRl8xO1xuXHRcdFx0XHRcdHN0YXRlLnJlY3RBcmVhTFRDMiA9IFVuaWZvcm1zTGliLkxUQ19IQUxGXzI7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVbmFibGUgdG8gdXNlIFJlY3RBcmVhTGlnaHQuIE1pc3NpbmcgV2ViR0wgZXh0ZW5zaW9ucy4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hbWJpZW50WyAwIF0gPSByO1xuXHRcdHN0YXRlLmFtYmllbnRbIDEgXSA9IGc7XG5cdFx0c3RhdGUuYW1iaWVudFsgMiBdID0gYjtcblxuXHRcdGNvbnN0IGhhc2ggPSBzdGF0ZS5oYXNoO1xuXG5cdFx0aWYgKCBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoICE9PSBkaXJlY3Rpb25hbExlbmd0aCB8fFxuXHRcdFx0aGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHxcblx0XHRcdGhhc2guc3BvdExlbmd0aCAhPT0gc3BvdExlbmd0aCB8fFxuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCAhPT0gcmVjdEFyZWFMZW5ndGggfHxcblx0XHRcdGhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fFxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgIT09IG51bURpcmVjdGlvbmFsU2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1Qb2ludFNoYWRvd3MgIT09IG51bVBvaW50U2hhZG93cyB8fFxuXHRcdFx0aGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgKSB7XG5cblx0XHRcdHN0YXRlLmRpcmVjdGlvbmFsLmxlbmd0aCA9IGRpcmVjdGlvbmFsTGVuZ3RoO1xuXHRcdFx0c3RhdGUuc3BvdC5sZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0c3RhdGUucmVjdEFyZWEubGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7XG5cdFx0XHRzdGF0ZS5wb2ludC5sZW5ndGggPSBwb2ludExlbmd0aDtcblx0XHRcdHN0YXRlLmhlbWkubGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3cubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3cubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUucG9pbnRTaGFkb3dNYXAubGVuZ3RoID0gbnVtUG9pbnRTaGFkb3dzO1xuXHRcdFx0c3RhdGUuc3BvdFNoYWRvdy5sZW5ndGggPSBudW1TcG90U2hhZG93cztcblx0XHRcdHN0YXRlLnNwb3RTaGFkb3dNYXAubGVuZ3RoID0gbnVtU3BvdFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7XG5cdFx0XHRzdGF0ZS5zcG90U2hhZG93TWF0cml4Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzO1xuXG5cdFx0XHRoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7XG5cdFx0XHRoYXNoLnBvaW50TGVuZ3RoID0gcG9pbnRMZW5ndGg7XG5cdFx0XHRoYXNoLnNwb3RMZW5ndGggPSBzcG90TGVuZ3RoO1xuXHRcdFx0aGFzaC5yZWN0QXJlYUxlbmd0aCA9IHJlY3RBcmVhTGVuZ3RoO1xuXHRcdFx0aGFzaC5oZW1pTGVuZ3RoID0gaGVtaUxlbmd0aDtcblxuXHRcdFx0aGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7XG5cdFx0XHRoYXNoLm51bVBvaW50U2hhZG93cyA9IG51bVBvaW50U2hhZG93cztcblx0XHRcdGhhc2gubnVtU3BvdFNoYWRvd3MgPSBudW1TcG90U2hhZG93cztcblxuXHRcdFx0c3RhdGUudmVyc2lvbiA9IG5leHRWZXJzaW9uICsrO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cFZpZXcoIGxpZ2h0cywgY2FtZXJhICkge1xuXG5cdFx0bGV0IGRpcmVjdGlvbmFsTGVuZ3RoID0gMDtcblx0XHRsZXQgcG9pbnRMZW5ndGggPSAwO1xuXHRcdGxldCBzcG90TGVuZ3RoID0gMDtcblx0XHRsZXQgcmVjdEFyZWFMZW5ndGggPSAwO1xuXHRcdGxldCBoZW1pTGVuZ3RoID0gMDtcblxuXHRcdGNvbnN0IHZpZXdNYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGxpZ2h0ID0gbGlnaHRzWyBpIF07XG5cblx0XHRcdGlmICggbGlnaHQuaXNEaXJlY3Rpb25hbExpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuZGlyZWN0aW9uYWxbIGRpcmVjdGlvbmFsTGVuZ3RoIF07XG5cblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc3ViKCB2ZWN0b3IzICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHRkaXJlY3Rpb25hbExlbmd0aCArKztcblxuXHRcdFx0fSBlbHNlIGlmICggbGlnaHQuaXNTcG90TGlnaHQgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybXMgPSBzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF07XG5cblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTtcblxuXHRcdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHR2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbiggdmlld01hdHJpeCApO1xuXG5cdFx0XHRcdHNwb3RMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUmVjdEFyZWFMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnJlY3RBcmVhWyByZWN0QXJlYUxlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0Ly8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9yc1xuXHRcdFx0XHRtYXRyaXg0Mi5pZGVudGl0eSgpO1xuXHRcdFx0XHRtYXRyaXg0LmNvcHkoIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdG1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0bWF0cml4NDIuZXh0cmFjdFJvdGF0aW9uKCBtYXRyaXg0ICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7XG5cdFx0XHRcdHVuaWZvcm1zLmhhbGZIZWlnaHQuc2V0KCAwLjAsIGxpZ2h0LmhlaWdodCAqIDAuNSwgMC4wICk7XG5cblx0XHRcdFx0dW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTtcblx0XHRcdFx0dW5pZm9ybXMuaGFsZkhlaWdodC5hcHBseU1hdHJpeDQoIG1hdHJpeDQyICk7XG5cblx0XHRcdFx0cmVjdEFyZWFMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCApIHtcblxuXHRcdFx0XHRjb25zdCB1bmlmb3JtcyA9IHN0YXRlLnBvaW50WyBwb2ludExlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTtcblx0XHRcdFx0dW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7XG5cblx0XHRcdFx0cG9pbnRMZW5ndGggKys7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGxpZ2h0LmlzSGVtaXNwaGVyZUxpZ2h0ICkge1xuXG5cdFx0XHRcdGNvbnN0IHVuaWZvcm1zID0gc3RhdGUuaGVtaVsgaGVtaUxlbmd0aCBdO1xuXG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTtcblx0XHRcdFx0dW5pZm9ybXMuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdGhlbWlMZW5ndGggKys7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHtcblx0XHRzZXR1cDogc2V0dXAsXG5cdFx0c2V0dXBWaWV3OiBzZXR1cFZpZXcsXG5cdFx0c3RhdGU6IHN0YXRlXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdGNvbnN0IGxpZ2h0cyA9IG5ldyBXZWJHTExpZ2h0cyggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cblx0Y29uc3QgbGlnaHRzQXJyYXkgPSBbXTtcblx0Y29uc3Qgc2hhZG93c0FycmF5ID0gW107XG5cblx0ZnVuY3Rpb24gaW5pdCgpIHtcblxuXHRcdGxpZ2h0c0FycmF5Lmxlbmd0aCA9IDA7XG5cdFx0c2hhZG93c0FycmF5Lmxlbmd0aCA9IDA7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHB1c2hMaWdodCggbGlnaHQgKSB7XG5cblx0XHRsaWdodHNBcnJheS5wdXNoKCBsaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHtcblxuXHRcdHNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXR1cExpZ2h0cygpIHtcblxuXHRcdGxpZ2h0cy5zZXR1cCggbGlnaHRzQXJyYXkgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0dXBMaWdodHNWaWV3KCBjYW1lcmEgKSB7XG5cblx0XHRsaWdodHMuc2V0dXBWaWV3KCBsaWdodHNBcnJheSwgY2FtZXJhICk7XG5cblx0fVxuXG5cdGNvbnN0IHN0YXRlID0ge1xuXHRcdGxpZ2h0c0FycmF5OiBsaWdodHNBcnJheSxcblx0XHRzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSxcblxuXHRcdGxpZ2h0czogbGlnaHRzXG5cdH07XG5cblx0cmV0dXJuIHtcblx0XHRpbml0OiBpbml0LFxuXHRcdHN0YXRlOiBzdGF0ZSxcblx0XHRzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsXG5cdFx0c2V0dXBMaWdodHNWaWV3OiBzZXR1cExpZ2h0c1ZpZXcsXG5cblx0XHRwdXNoTGlnaHQ6IHB1c2hMaWdodCxcblx0XHRwdXNoU2hhZG93OiBwdXNoU2hhZG93XG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZXMoIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHtcblxuXHRsZXQgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTtcblxuXHRmdW5jdGlvbiBnZXQoIHNjZW5lLCByZW5kZXJDYWxsRGVwdGggPSAwICkge1xuXG5cdFx0bGV0IHJlbmRlclN0YXRlO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZXMuaGFzKCBzY2VuZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0cmVuZGVyU3RhdGUgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZSggZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICk7XG5cdFx0XHRyZW5kZXJTdGF0ZXMuc2V0KCBzY2VuZSwgWyByZW5kZXJTdGF0ZSBdICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIHJlbmRlckNhbGxEZXB0aCA+PSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApLmxlbmd0aCApIHtcblxuXHRcdFx0XHRyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblx0XHRcdFx0cmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKS5wdXNoKCByZW5kZXJTdGF0ZSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKVsgcmVuZGVyQ2FsbERlcHRoIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZW5kZXJTdGF0ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzcG9zZSgpIHtcblxuXHRcdHJlbmRlclN0YXRlcyA9IG5ldyBXZWFrTWFwKCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBnZXQsXG5cdFx0ZGlzcG9zZTogZGlzcG9zZVxuXHR9O1xuXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LFxuICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PlxuICogfVxuICovXG5cbmNsYXNzIE1lc2hEZXB0aE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IEJhc2ljRGVwdGhQYWNraW5nO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cblx0XHR0aGlzLm1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gMTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSAwO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cblx0XHR0aGlzLmZvZyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmRlcHRoUGFja2luZyA9IHNvdXJjZS5kZXB0aFBhY2tpbmc7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWwgPSB0cnVlO1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKlxuICogIHJlZmVyZW5jZVBvc2l0aW9uOiA8ZmxvYXQ+LFxuICogIG5lYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqICBmYXJEaXN0YW5jZTogPGZsb2F0PixcbiAqXG4gKiAgc2tpbm5pbmc6IDxib29sPixcbiAqICBtb3JwaFRhcmdldHM6IDxib29sPixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD5cbiAqXG4gKiB9XG4gKi9cblxuY2xhc3MgTWVzaERpc3RhbmNlTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJztcblxuXHRcdHRoaXMucmVmZXJlbmNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXHRcdHRoaXMubmVhckRpc3RhbmNlID0gMTtcblx0XHR0aGlzLmZhckRpc3RhbmNlID0gMTAwMDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHRcdHRoaXMuZm9nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7XG5cdFx0dGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlO1xuXHRcdHRoaXMuZmFyRGlzdGFuY2UgPSBzb3VyY2UuZmFyRGlzdGFuY2U7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5NZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7XG5cbnZhciB2c21fZnJhZyA9IFwidW5pZm9ybSBzYW1wbGVyMkQgc2hhZG93X3Bhc3M7XFxudW5pZm9ybSB2ZWMyIHJlc29sdXRpb247XFxudW5pZm9ybSBmbG9hdCByYWRpdXM7XFxuI2luY2x1ZGUgPHBhY2tpbmc+XFxudm9pZCBtYWluKCkge1xcblxcdGZsb2F0IG1lYW4gPSAwLjA7XFxuXFx0ZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xcblxcdGZsb2F0IGRlcHRoID0gdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggc2hhZG93X3Bhc3MsICggZ2xfRnJhZ0Nvb3JkLnh5ICkgLyByZXNvbHV0aW9uICkgKTtcXG5cXHRmb3IgKCBmbG9hdCBpID0gLTEuMDsgaSA8IDEuMCA7IGkgKz0gU0FNUExFX1JBVEUpIHtcXG5cXHRcXHQjaWZkZWYgSE9SSVpPTlRBTF9QQVNTXFxuXFx0XFx0XFx0dmVjMiBkaXN0cmlidXRpb24gPSB1bnBhY2tSR0JBVG8ySGFsZiggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XFxuXFx0XFx0XFx0bWVhbiArPSBkaXN0cmlidXRpb24ueDtcXG5cXHRcXHRcXHRzcXVhcmVkX21lYW4gKz0gZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSArIGRpc3RyaWJ1dGlvbi54ICogZGlzdHJpYnV0aW9uLng7XFxuXFx0XFx0I2Vsc2VcXG5cXHRcXHRcXHRmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgaSApICogcmFkaXVzICkgLyByZXNvbHV0aW9uICkgKTtcXG5cXHRcXHRcXHRtZWFuICs9IGRlcHRoO1xcblxcdFxcdFxcdHNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoO1xcblxcdFxcdCNlbmRpZlxcblxcdH1cXG5cXHRtZWFuID0gbWVhbiAqIEhBTEZfU0FNUExFX1JBVEU7XFxuXFx0c3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcXG5cXHRmbG9hdCBzdGRfZGV2ID0gc3FydCggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4gKTtcXG5cXHRnbF9GcmFnQ29sb3IgPSBwYWNrMkhhbGZUb1JHQkEoIHZlYzIoIG1lYW4sIHN0ZF9kZXYgKSApO1xcbn1cIjtcblxudmFyIHZzbV92ZXJ0ID0gXCJ2b2lkIG1haW4oKSB7XFxuXFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XFxufVwiO1xuXG5mdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgX2NhcGFiaWxpdGllcyApIHtcblxuXHRsZXQgX2ZydXN0dW0gPSBuZXcgRnJ1c3R1bSgpO1xuXG5cdGNvbnN0IF9zaGFkb3dNYXBTaXplID0gbmV3IFZlY3RvcjIoKSxcblx0XHRfdmlld3BvcnRTaXplID0gbmV3IFZlY3RvcjIoKSxcblxuXHRcdF92aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCksXG5cblx0XHRfZGVwdGhNYXRlcmlhbHMgPSBbXSxcblx0XHRfZGlzdGFuY2VNYXRlcmlhbHMgPSBbXSxcblxuXHRcdF9tYXRlcmlhbENhY2hlID0ge30sXG5cblx0XHRfbWF4VGV4dHVyZVNpemUgPSBfY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplO1xuXG5cdGNvbnN0IHNoYWRvd1NpZGUgPSB7IDA6IEJhY2tTaWRlLCAxOiBGcm9udFNpZGUsIDI6IERvdWJsZVNpZGUgfTtcblxuXHRjb25zdCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsID0gbmV3IFNoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRkZWZpbmVzOiB7XG5cdFx0XHRTQU1QTEVfUkFURTogMi4wIC8gOC4wLFxuXHRcdFx0SEFMRl9TQU1QTEVfUkFURTogMS4wIC8gOC4wXG5cdFx0fSxcblxuXHRcdHVuaWZvcm1zOiB7XG5cdFx0XHRzaGFkb3dfcGFzczogeyB2YWx1ZTogbnVsbCB9LFxuXHRcdFx0cmVzb2x1dGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjIoKSB9LFxuXHRcdFx0cmFkaXVzOiB7IHZhbHVlOiA0LjAgfVxuXHRcdH0sXG5cblx0XHR2ZXJ0ZXhTaGFkZXI6IHZzbV92ZXJ0LFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IHZzbV9mcmFnXG5cblx0fSApO1xuXG5cdGNvbnN0IHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbCA9IHNoYWRvd01hdGVyaWFsVmVydGljYWwuY2xvbmUoKTtcblx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLmRlZmluZXMuSE9SSVpPTlRBTF9QQVNTID0gMTtcblxuXHRjb25zdCBmdWxsU2NyZWVuVHJpID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdGZ1bGxTY3JlZW5Ucmkuc2V0QXR0cmlidXRlKFxuXHRcdCdwb3NpdGlvbicsXG5cdFx0bmV3IEJ1ZmZlckF0dHJpYnV0ZShcblx0XHRcdG5ldyBGbG9hdDMyQXJyYXkoIFsgLSAxLCAtIDEsIDAuNSwgMywgLSAxLCAwLjUsIC0gMSwgMywgMC41IF0gKSxcblx0XHRcdDNcblx0XHQpXG5cdCk7XG5cblx0Y29uc3QgZnVsbFNjcmVlbk1lc2ggPSBuZXcgTWVzaCggZnVsbFNjcmVlblRyaSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCApO1xuXG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmF1dG9VcGRhdGUgPSB0cnVlO1xuXHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0dGhpcy50eXBlID0gUENGU2hhZG93TWFwO1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBsaWdodHMsIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXHRcdGlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0aWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Y29uc3QgY3VycmVudFJlbmRlclRhcmdldCA9IF9yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcblx0XHRjb25zdCBhY3RpdmVDdWJlRmFjZSA9IF9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpO1xuXHRcdGNvbnN0IGFjdGl2ZU1pcG1hcExldmVsID0gX3JlbmRlcmVyLmdldEFjdGl2ZU1pcG1hcExldmVsKCk7XG5cblx0XHRjb25zdCBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7XG5cblx0XHQvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC5cblx0XHRfc3RhdGUuc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKTtcblx0XHRfc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggMSwgMSwgMSwgMSApO1xuXHRcdF9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTtcblx0XHRfc3RhdGUuc2V0U2Npc3NvclRlc3QoIGZhbHNlICk7XG5cblx0XHQvLyByZW5kZXIgZGVwdGggbWFwXG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbGlnaHRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsaWdodCA9IGxpZ2h0c1sgaSBdO1xuXHRcdFx0Y29uc3Qgc2hhZG93ID0gbGlnaHQuc2hhZG93O1xuXG5cdFx0XHRpZiAoIHNoYWRvdyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOicsIGxpZ2h0LCAnaGFzIG5vIHNoYWRvdy4nICk7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggc2hhZG93LmF1dG9VcGRhdGUgPT09IGZhbHNlICYmIHNoYWRvdy5uZWVkc1VwZGF0ZSA9PT0gZmFsc2UgKSBjb250aW51ZTtcblxuXHRcdFx0X3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblxuXHRcdFx0Y29uc3Qgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpO1xuXG5cdFx0XHRfc2hhZG93TWFwU2l6ZS5tdWx0aXBseSggc2hhZG93RnJhbWVFeHRlbnRzICk7XG5cblx0XHRcdF92aWV3cG9ydFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTtcblxuXHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplIHx8IF9zaGFkb3dNYXBTaXplLnkgPiBfbWF4VGV4dHVyZVNpemUgKSB7XG5cblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gX21heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ID0gTWF0aC5mbG9vciggX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnggKTtcblx0XHRcdFx0XHRfc2hhZG93TWFwU2l6ZS54ID0gX3ZpZXdwb3J0U2l6ZS54ICogc2hhZG93RnJhbWVFeHRlbnRzLng7XG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueCA9IF92aWV3cG9ydFNpemUueDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfc2hhZG93TWFwU2l6ZS55ID4gX21heFRleHR1cmVTaXplICkge1xuXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS55ID0gTWF0aC5mbG9vciggX21heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnkgKTtcblx0XHRcdFx0XHRfc2hhZG93TWFwU2l6ZS55ID0gX3ZpZXdwb3J0U2l6ZS55ICogc2hhZG93RnJhbWVFeHRlbnRzLnk7XG5cdFx0XHRcdFx0c2hhZG93Lm1hcFNpemUueSA9IF92aWV3cG9ydFNpemUueTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICYmICEgc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcblxuXHRcdFx0XHRjb25zdCBwYXJzID0geyBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciwgbWFnRmlsdGVyOiBMaW5lYXJGaWx0ZXIsIGZvcm1hdDogUkdCQUZvcm1hdCB9O1xuXG5cdFx0XHRcdHNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTtcblx0XHRcdFx0c2hhZG93Lm1hcC50ZXh0dXJlLm5hbWUgPSBsaWdodC5uYW1lICsgJy5zaGFkb3dNYXAnO1xuXG5cdFx0XHRcdHNoYWRvdy5tYXBQYXNzID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cblx0XHRcdFx0c2hhZG93LmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzaGFkb3cubWFwID09PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IHBhcnMgPSB7IG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlciwgbWFnRmlsdGVyOiBOZWFyZXN0RmlsdGVyLCBmb3JtYXQ6IFJHQkFGb3JtYXQgfTtcblxuXHRcdFx0XHRzaGFkb3cubWFwID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7XG5cdFx0XHRcdHNoYWRvdy5tYXAudGV4dHVyZS5uYW1lID0gbGlnaHQubmFtZSArICcuc2hhZG93TWFwJztcblxuXHRcdFx0XHRzaGFkb3cuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwICk7XG5cdFx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblxuXHRcdFx0Y29uc3Qgdmlld3BvcnRDb3VudCA9IHNoYWRvdy5nZXRWaWV3cG9ydENvdW50KCk7XG5cblx0XHRcdGZvciAoIGxldCB2cCA9IDA7IHZwIDwgdmlld3BvcnRDb3VudDsgdnAgKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgdmlld3BvcnQgPSBzaGFkb3cuZ2V0Vmlld3BvcnQoIHZwICk7XG5cblx0XHRcdFx0X3ZpZXdwb3J0LnNldChcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC54LFxuXHRcdFx0XHRcdF92aWV3cG9ydFNpemUueSAqIHZpZXdwb3J0LnksXG5cdFx0XHRcdFx0X3ZpZXdwb3J0U2l6ZS54ICogdmlld3BvcnQueixcblx0XHRcdFx0XHRfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC53XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0X3N0YXRlLnZpZXdwb3J0KCBfdmlld3BvcnQgKTtcblxuXHRcdFx0XHRzaGFkb3cudXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2cCApO1xuXG5cdFx0XHRcdF9mcnVzdHVtID0gc2hhZG93LmdldEZydXN0dW0oKTtcblxuXHRcdFx0XHRyZW5kZXJPYmplY3QoIHNjZW5lLCBjYW1lcmEsIHNoYWRvdy5jYW1lcmEsIGxpZ2h0LCB0aGlzLnR5cGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBkbyBibHVyIHBhc3MgZm9yIFZTTVxuXG5cdFx0XHRpZiAoICEgc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHtcblxuXHRcdFx0XHRWU01QYXNzKCBzaGFkb3csIGNhbWVyYSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNoYWRvdy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0c2NvcGUubmVlZHNVcGRhdGUgPSBmYWxzZTtcblxuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xuXG5cdH07XG5cblx0ZnVuY3Rpb24gVlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggZnVsbFNjcmVlbk1lc2ggKTtcblxuXHRcdC8vIHZlcnRpY2FsIHBhc3NcblxuXHRcdHNoYWRvd01hdGVyaWFsVmVydGljYWwudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWUgPSBzaGFkb3cubWFwLnRleHR1cmU7XG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlID0gc2hhZG93Lm1hcFNpemU7XG5cdFx0c2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXBQYXNzICk7XG5cdFx0X3JlbmRlcmVyLmNsZWFyKCk7XG5cdFx0X3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCwgZnVsbFNjcmVlbk1lc2gsIG51bGwgKTtcblxuXHRcdC8vIGhvcml6b250YWwgcGFzc1xuXG5cdFx0c2hhZG93TWF0ZXJpYWxIb3Jpem9udGFsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcFBhc3MudGV4dHVyZTtcblx0XHRzaGFkb3dNYXRlcmlhbEhvcml6b250YWwudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZSA9IHNoYWRvdy5tYXBTaXplO1xuXHRcdHNoYWRvd01hdGVyaWFsSG9yaXpvbnRhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzO1xuXHRcdF9yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHNoYWRvdy5tYXAgKTtcblx0XHRfcmVuZGVyZXIuY2xlYXIoKTtcblx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBzaGFkb3dNYXRlcmlhbEhvcml6b250YWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWxWYXJpYW50KCB1c2VNb3JwaGluZywgdXNlU2tpbm5pbmcsIHVzZUluc3RhbmNpbmcgKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IHVzZU1vcnBoaW5nIDw8IDAgfCB1c2VTa2lubmluZyA8PCAxIHwgdXNlSW5zdGFuY2luZyA8PCAyO1xuXG5cdFx0bGV0IG1hdGVyaWFsID0gX2RlcHRoTWF0ZXJpYWxzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBtYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRtYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCgge1xuXG5cdFx0XHRcdGRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZyxcblxuXHRcdFx0XHRtb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLFxuXHRcdFx0XHRza2lubmluZzogdXNlU2tpbm5pbmdcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRfZGVwdGhNYXRlcmlhbHNbIGluZGV4IF0gPSBtYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRlcmlhbDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQoIHVzZU1vcnBoaW5nLCB1c2VTa2lubmluZywgdXNlSW5zdGFuY2luZyApIHtcblxuXHRcdGNvbnN0IGluZGV4ID0gdXNlTW9ycGhpbmcgPDwgMCB8IHVzZVNraW5uaW5nIDw8IDEgfCB1c2VJbnN0YW5jaW5nIDw8IDI7XG5cblx0XHRsZXQgbWF0ZXJpYWwgPSBfZGlzdGFuY2VNYXRlcmlhbHNbIGluZGV4IF07XG5cblx0XHRpZiAoIG1hdGVyaWFsID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdG1hdGVyaWFsID0gbmV3IE1lc2hEaXN0YW5jZU1hdGVyaWFsKCB7XG5cblx0XHRcdFx0bW9ycGhUYXJnZXRzOiB1c2VNb3JwaGluZyxcblx0XHRcdFx0c2tpbm5pbmc6IHVzZVNraW5uaW5nXG5cblx0XHRcdH0gKTtcblxuXHRcdFx0X2Rpc3RhbmNlTWF0ZXJpYWxzWyBpbmRleCBdID0gbWF0ZXJpYWw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWw7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhTmVhciwgc2hhZG93Q2FtZXJhRmFyLCB0eXBlICkge1xuXG5cdFx0bGV0IHJlc3VsdCA9IG51bGw7XG5cblx0XHRsZXQgZ2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGVwdGhNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0bGV0IGN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURlcHRoTWF0ZXJpYWw7XG5cblx0XHRpZiAoIGxpZ2h0LmlzUG9pbnRMaWdodCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2V0TWF0ZXJpYWxWYXJpYW50ID0gZ2V0RGlzdGFuY2VNYXRlcmlhbFZhcmlhbnQ7XG5cdFx0XHRjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EaXN0YW5jZU1hdGVyaWFsO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBjdXN0b21NYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsZXQgdXNlTW9ycGhpbmcgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXNlTW9ycGhpbmcgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbi5sZW5ndGggPiAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB1c2VTa2lubmluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoID09PSB0cnVlICkge1xuXG5cdFx0XHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHR1c2VTa2lubmluZyA9IHRydWU7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMU2hhZG93TWFwOiBUSFJFRS5Ta2lubmVkTWVzaCB3aXRoIG1hdGVyaWFsLnNraW5uaW5nIHNldCB0byBmYWxzZTonLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgdXNlSW5zdGFuY2luZyA9IG9iamVjdC5pc0luc3RhbmNlZE1lc2ggPT09IHRydWU7XG5cblx0XHRcdHJlc3VsdCA9IGdldE1hdGVyaWFsVmFyaWFudCggdXNlTW9ycGhpbmcsIHVzZVNraW5uaW5nLCB1c2VJbnN0YW5jaW5nICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRyZXN1bHQgPSBjdXN0b21NYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdGlmICggX3JlbmRlcmVyLmxvY2FsQ2xpcHBpbmdFbmFibGVkICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmXG5cdFx0XHRcdG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzLmxlbmd0aCAhPT0gMCApIHtcblxuXHRcdFx0Ly8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgYSB1bmlxdWUgbWF0ZXJpYWwgaW5zdGFuY2UgcmVmbGVjdGluZyB0aGVcblx0XHRcdC8vIGFwcHJvcHJpYXRlIHN0YXRlXG5cblx0XHRcdGNvbnN0IGtleUEgPSByZXN1bHQudXVpZCwga2V5QiA9IG1hdGVyaWFsLnV1aWQ7XG5cblx0XHRcdGxldCBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbHNGb3JWYXJpYW50ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9O1xuXHRcdFx0XHRfbWF0ZXJpYWxDYWNoZVsga2V5QSBdID0gbWF0ZXJpYWxzRm9yVmFyaWFudDtcblxuXHRcdFx0fVxuXG5cdFx0XHRsZXQgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07XG5cblx0XHRcdGlmICggY2FjaGVkTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpO1xuXHRcdFx0XHRtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF0gPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDtcblxuXHRcdH1cblxuXHRcdHJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTtcblx0XHRyZXN1bHQud2lyZWZyYW1lID0gbWF0ZXJpYWwud2lyZWZyYW1lO1xuXG5cdFx0aWYgKCB0eXBlID09PSBWU01TaGFkb3dNYXAgKSB7XG5cblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogbWF0ZXJpYWwuc2lkZTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9PSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdO1xuXG5cdFx0fVxuXG5cdFx0cmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7XG5cdFx0cmVzdWx0LmNsaXBwaW5nUGxhbmVzID0gbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXM7XG5cdFx0cmVzdWx0LmNsaXBJbnRlcnNlY3Rpb24gPSBtYXRlcmlhbC5jbGlwSW50ZXJzZWN0aW9uO1xuXG5cdFx0cmVzdWx0LndpcmVmcmFtZUxpbmV3aWR0aCA9IG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoO1xuXG5cdFx0aWYgKCBsaWdodC5pc1BvaW50TGlnaHQgPT09IHRydWUgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgPT09IHRydWUgKSB7XG5cblx0XHRcdHJlc3VsdC5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7XG5cdFx0XHRyZXN1bHQubmVhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhTmVhcjtcblx0XHRcdHJlc3VsdC5mYXJEaXN0YW5jZSA9IHNoYWRvd0NhbWVyYUZhcjtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdCggb2JqZWN0LCBjYW1lcmEsIHNoYWRvd0NhbWVyYSwgbGlnaHQsIHR5cGUgKSB7XG5cblx0XHRpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdGNvbnN0IHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTtcblxuXHRcdGlmICggdmlzaWJsZSAmJiAoIG9iamVjdC5pc01lc2ggfHwgb2JqZWN0LmlzTGluZSB8fCBvYmplY3QuaXNQb2ludHMgKSApIHtcblxuXHRcdFx0aWYgKCAoIG9iamVjdC5jYXN0U2hhZG93IHx8ICggb2JqZWN0LnJlY2VpdmVTaGFkb3cgJiYgdHlwZSA9PT0gVlNNU2hhZG93TWFwICkgKSAmJiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSApIHtcblxuXHRcdFx0XHRvYmplY3QubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIG9iamVjdC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRcdGNvbnN0IGdlb21ldHJ5ID0gX29iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGsgXTtcblx0XHRcdFx0XHRcdGNvbnN0IGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGRlcHRoTWF0ZXJpYWwgPSBnZXREZXB0aE1hdGVyaWFsKCBvYmplY3QsIGdlb21ldHJ5LCBncm91cE1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIsIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHRfcmVuZGVyZXIucmVuZGVyQnVmZmVyRGlyZWN0KCBzaGFkb3dDYW1lcmEsIG51bGwsIGdlb21ldHJ5LCBkZXB0aE1hdGVyaWFsLCBvYmplY3QsIGdyb3VwICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBsaWdodCwgc2hhZG93Q2FtZXJhLm5lYXIsIHNoYWRvd0NhbWVyYS5mYXIsIHR5cGUgKTtcblxuXHRcdFx0XHRcdF9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgbnVsbCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRyZW5kZXJPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgc2hhZG93Q2FtZXJhLCBsaWdodCwgdHlwZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBXZWJHTFN0YXRlKCBnbCwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkge1xuXG5cdGNvbnN0IGlzV2ViR0wyID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyO1xuXG5cdGZ1bmN0aW9uIENvbG9yQnVmZmVyKCkge1xuXG5cdFx0bGV0IGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0Y29uc3QgY29sb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRcdGxldCBjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRjb25zdCBjdXJyZW50Q29sb3JDbGVhciA9IG5ldyBWZWN0b3I0KCAwLCAwLCAwLCAwICk7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRDb2xvck1hc2sgIT09IGNvbG9yTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmNvbG9yTWFzayggY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzaywgY29sb3JNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudENvbG9yTWFzayA9IGNvbG9yTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIHByZW11bHRpcGxpZWRBbHBoYSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHIgKj0gYTsgZyAqPSBhOyBiICo9IGE7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbG9yLnNldCggciwgZywgYiwgYSApO1xuXG5cdFx0XHRcdGlmICggY3VycmVudENvbG9yQ2xlYXIuZXF1YWxzKCBjb2xvciApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGdsLmNsZWFyQ29sb3IoIHIsIGcsIGIsIGEgKTtcblx0XHRcdFx0XHRjdXJyZW50Q29sb3JDbGVhci5jb3B5KCBjb2xvciApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50Q29sb3JNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudENvbG9yQ2xlYXIuc2V0KCAtIDEsIDAsIDAsIDAgKTsgLy8gc2V0IHRvIGludmFsaWQgc3RhdGVcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7XG5cblx0XHRsZXQgbG9ja2VkID0gZmFsc2U7XG5cblx0XHRsZXQgY3VycmVudERlcHRoTWFzayA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnREZXB0aEZ1bmMgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50RGVwdGhDbGVhciA9IG51bGw7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzZXRUZXN0OiBmdW5jdGlvbiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoIGRlcHRoVGVzdCApIHtcblxuXHRcdFx0XHRcdGVuYWJsZSggMjkyOSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRkaXNhYmxlKCAyOTI5ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIGRlcHRoTWFzayApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7XG5cdFx0XHRcdFx0Y3VycmVudERlcHRoTWFzayA9IGRlcHRoTWFzaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoRnVuYyAhPT0gZGVwdGhGdW5jICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkZXB0aEZ1bmMgKSB7XG5cblx0XHRcdFx0XHRcdHN3aXRjaCAoIGRlcHRoRnVuYyApIHtcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5ldmVyRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxMiApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgQWx3YXlzRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOSApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgTGVzc0RlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTMgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIExlc3NFcXVhbERlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTUgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxOCApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGNhc2UgR3JlYXRlckRlcHRoOlxuXG5cdFx0XHRcdFx0XHRcdFx0Z2wuZGVwdGhGdW5jKCA1MTYgKTtcblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0XHRjYXNlIE5vdEVxdWFsRGVwdGg6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNyApO1xuXHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRnbC5kZXB0aEZ1bmMoIDUxNSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIGRlcHRoICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudERlcHRoQ2xlYXIgIT09IGRlcHRoICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJEZXB0aCggZGVwdGggKTtcblx0XHRcdFx0XHRjdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0cmVzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRsb2NrZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRjdXJyZW50RGVwdGhNYXNrID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudERlcHRoRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDtcblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHtcblxuXHRcdGxldCBsb2NrZWQgPSBmYWxzZTtcblxuXHRcdGxldCBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbFJlZiA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsO1xuXHRcdGxldCBjdXJyZW50U3RlbmNpbFpGYWlsID0gbnVsbDtcblx0XHRsZXQgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7XG5cdFx0bGV0IGN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsO1xuXG5cdFx0cmV0dXJuIHtcblxuXHRcdFx0c2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRpZiAoICEgbG9ja2VkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBzdGVuY2lsVGVzdCApIHtcblxuXHRcdFx0XHRcdFx0ZW5hYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRkaXNhYmxlKCAyOTYwICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRNYXNrOiBmdW5jdGlvbiAoIHN0ZW5jaWxNYXNrICkge1xuXG5cdFx0XHRcdGlmICggY3VycmVudFN0ZW5jaWxNYXNrICE9PSBzdGVuY2lsTWFzayAmJiAhIGxvY2tlZCApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxNYXNrKCBzdGVuY2lsTWFzayApO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSxcblxuXHRcdFx0c2V0RnVuYzogZnVuY3Rpb24gKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxSZWYgIT09IHN0ZW5jaWxSZWYgfHxcblx0XHRcdFx0ICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHtcblxuXHRcdFx0XHRcdGdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gc3RlbmNpbFJlZjtcblx0XHRcdFx0XHRjdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gc3RlbmNpbE1hc2s7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRzZXRPcDogZnVuY3Rpb24gKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbEZhaWwgIT09IHN0ZW5jaWxGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8XG5cdFx0XHRcdCAgICAgY3VycmVudFN0ZW5jaWxaUGFzcyAhPT0gc3RlbmNpbFpQYXNzICkge1xuXG5cdFx0XHRcdFx0Z2wuc3RlbmNpbE9wKCBzdGVuY2lsRmFpbCwgc3RlbmNpbFpGYWlsLCBzdGVuY2lsWlBhc3MgKTtcblxuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IHN0ZW5jaWxGYWlsO1xuXHRcdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxaUGFzcyA9IHN0ZW5jaWxaUGFzcztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGxvY2s7XG5cblx0XHRcdH0sXG5cblx0XHRcdHNldENsZWFyOiBmdW5jdGlvbiAoIHN0ZW5jaWwgKSB7XG5cblx0XHRcdFx0aWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkge1xuXG5cdFx0XHRcdFx0Z2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7XG5cdFx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IHN0ZW5jaWw7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRyZXNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGxvY2tlZCA9IGZhbHNlO1xuXG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRnVuYyA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxGdW5jTWFzayA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsRmFpbCA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50U3RlbmNpbFpQYXNzID0gbnVsbDtcblx0XHRcdFx0Y3VycmVudFN0ZW5jaWxDbGVhciA9IG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdC8vXG5cblx0Y29uc3QgY29sb3JCdWZmZXIgPSBuZXcgQ29sb3JCdWZmZXIoKTtcblx0Y29uc3QgZGVwdGhCdWZmZXIgPSBuZXcgRGVwdGhCdWZmZXIoKTtcblx0Y29uc3Qgc3RlbmNpbEJ1ZmZlciA9IG5ldyBTdGVuY2lsQnVmZmVyKCk7XG5cblx0bGV0IGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRsZXQgeHJGcmFtZWJ1ZmZlciA9IG51bGw7XG5cdGxldCBjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnMgPSB7fTtcblxuXHRsZXQgY3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdGxldCBjdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7XG5cdGxldCBjdXJyZW50QmxlbmRpbmcgPSBudWxsO1xuXHRsZXQgY3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRsZXQgY3VycmVudEJsZW5kU3JjID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZERzdCA9IG51bGw7XG5cdGxldCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZFNyY0FscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblx0bGV0IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdGxldCBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDtcblx0bGV0IGN1cnJlbnRDdWxsRmFjZSA9IG51bGw7XG5cblx0bGV0IGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdGxldCBjdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IG51bGw7XG5cdGxldCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDtcblxuXHRjb25zdCBtYXhUZXh0dXJlcyA9IGdsLmdldFBhcmFtZXRlciggMzU2NjEgKTtcblxuXHRsZXQgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7XG5cdGxldCB2ZXJzaW9uID0gMDtcblx0Y29uc3QgZ2xWZXJzaW9uID0gZ2wuZ2V0UGFyYW1ldGVyKCA3OTM4ICk7XG5cblx0aWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7XG5cblx0XHR2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTCAoXFxkKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApO1xuXHRcdGxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAxLjAgKTtcblxuXHR9IGVsc2UgaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ09wZW5HTCBFUycgKSAhPT0gLSAxICkge1xuXG5cdFx0dmVyc2lvbiA9IHBhcnNlRmxvYXQoIC9eT3BlbkdMIEVTIChcXGQpLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7XG5cdFx0bGluZVdpZHRoQXZhaWxhYmxlID0gKCB2ZXJzaW9uID49IDIuMCApO1xuXG5cdH1cblxuXHRsZXQgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDtcblx0bGV0IGN1cnJlbnRCb3VuZFRleHR1cmVzID0ge307XG5cblx0Y29uc3QgY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XG5cdGNvbnN0IGN1cnJlbnRWaWV3cG9ydCA9IG5ldyBWZWN0b3I0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblxuXHRmdW5jdGlvbiBjcmVhdGVUZXh0dXJlKCB0eXBlLCB0YXJnZXQsIGNvdW50ICkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KCA0ICk7IC8vIDQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggZGVmYXVsdCB1bnBhY2sgYWxpZ25tZW50IG9mIDQuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdGdsLmJpbmRUZXh0dXJlKCB0eXBlLCB0ZXh0dXJlICk7XG5cdFx0Z2wudGV4UGFyYW1ldGVyaSggdHlwZSwgMTAyNDEsIDk3MjggKTtcblx0XHRnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCAxMDI0MCwgOTcyOCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdGdsLnRleEltYWdlMkQoIHRhcmdldCArIGksIDAsIDY0MDgsIDEsIDEsIDAsIDY0MDgsIDUxMjEsIGRhdGEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxuXHRjb25zdCBlbXB0eVRleHR1cmVzID0ge307XG5cdGVtcHR5VGV4dHVyZXNbIDM1NTMgXSA9IGNyZWF0ZVRleHR1cmUoIDM1NTMsIDM1NTMsIDEgKTtcblx0ZW1wdHlUZXh0dXJlc1sgMzQwNjcgXSA9IGNyZWF0ZVRleHR1cmUoIDM0MDY3LCAzNDA2OSwgNiApO1xuXG5cdC8vIGluaXRcblxuXHRjb2xvckJ1ZmZlci5zZXRDbGVhciggMCwgMCwgMCwgMSApO1xuXHRkZXB0aEJ1ZmZlci5zZXRDbGVhciggMSApO1xuXHRzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7XG5cblx0ZW5hYmxlKCAyOTI5ICk7XG5cdGRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7XG5cblx0c2V0RmxpcFNpZGVkKCBmYWxzZSApO1xuXHRzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7XG5cdGVuYWJsZSggMjg4NCApO1xuXG5cdHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBlbmFibGUoIGlkICkge1xuXG5cdFx0aWYgKCBlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdICE9PSB0cnVlICkge1xuXG5cdFx0XHRnbC5lbmFibGUoIGlkICk7XG5cdFx0XHRlbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZGlzYWJsZSggaWQgKSB7XG5cblx0XHRpZiAoIGVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gIT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5kaXNhYmxlKCBpZCApO1xuXHRcdFx0ZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBiaW5kWFJGcmFtZWJ1ZmZlciggZnJhbWVidWZmZXIgKSB7XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICE9PSB4ckZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRnbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHR4ckZyYW1lYnVmZmVyID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApIHtcblxuXHRcdGlmICggZnJhbWVidWZmZXIgPT09IG51bGwgJiYgeHJGcmFtZWJ1ZmZlciAhPT0gbnVsbCApIGZyYW1lYnVmZmVyID0geHJGcmFtZWJ1ZmZlcjsgLy8gdXNlIGFjdGl2ZSBYUiBmcmFtZWJ1ZmZlciBpZiBhdmFpbGFibGVcblxuXHRcdGlmICggY3VycmVudEJvdW5kRnJhbWVidWZmZXJzWyB0YXJnZXQgXSAhPT0gZnJhbWVidWZmZXIgKSB7XG5cblx0XHRcdGdsLmJpbmRGcmFtZWJ1ZmZlciggdGFyZ2V0LCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRjdXJyZW50Qm91bmRGcmFtZWJ1ZmZlcnNbIHRhcmdldCBdID0gZnJhbWVidWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVzZVByb2dyYW0oIHByb2dyYW0gKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkge1xuXG5cdFx0XHRnbC51c2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdGN1cnJlbnRQcm9ncmFtID0gcHJvZ3JhbTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdGNvbnN0IGVxdWF0aW9uVG9HTCA9IHtcblx0XHRbIEFkZEVxdWF0aW9uIF06IDMyNzc0LFxuXHRcdFsgU3VidHJhY3RFcXVhdGlvbiBdOiAzMjc3OCxcblx0XHRbIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uIF06IDMyNzc5XG5cdH07XG5cblx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdGVxdWF0aW9uVG9HTFsgTWluRXF1YXRpb24gXSA9IDMyNzc1O1xuXHRcdGVxdWF0aW9uVG9HTFsgTWF4RXF1YXRpb24gXSA9IDMyNzc2O1xuXG5cdH0gZWxzZSB7XG5cblx0XHRjb25zdCBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cblx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0ZXF1YXRpb25Ub0dMWyBNaW5FcXVhdGlvbiBdID0gZXh0ZW5zaW9uLk1JTl9FWFQ7XG5cdFx0XHRlcXVhdGlvblRvR0xbIE1heEVxdWF0aW9uIF0gPSBleHRlbnNpb24uTUFYX0VYVDtcblxuXHRcdH1cblxuXHR9XG5cblx0Y29uc3QgZmFjdG9yVG9HTCA9IHtcblx0XHRbIFplcm9GYWN0b3IgXTogMCxcblx0XHRbIE9uZUZhY3RvciBdOiAxLFxuXHRcdFsgU3JjQ29sb3JGYWN0b3IgXTogNzY4LFxuXHRcdFsgU3JjQWxwaGFGYWN0b3IgXTogNzcwLFxuXHRcdFsgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciBdOiA3NzYsXG5cdFx0WyBEc3RDb2xvckZhY3RvciBdOiA3NzQsXG5cdFx0WyBEc3RBbHBoYUZhY3RvciBdOiA3NzIsXG5cdFx0WyBPbmVNaW51c1NyY0NvbG9yRmFjdG9yIF06IDc2OSxcblx0XHRbIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgXTogNzcxLFxuXHRcdFsgT25lTWludXNEc3RDb2xvckZhY3RvciBdOiA3NzUsXG5cdFx0WyBPbmVNaW51c0RzdEFscGhhRmFjdG9yIF06IDc3M1xuXHR9O1xuXG5cdGZ1bmN0aW9uIHNldEJsZW5kaW5nKCBibGVuZGluZywgYmxlbmRFcXVhdGlvbiwgYmxlbmRTcmMsIGJsZW5kRHN0LCBibGVuZEVxdWF0aW9uQWxwaGEsIGJsZW5kU3JjQWxwaGEsIGJsZW5kRHN0QWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHtcblxuXHRcdGlmICggYmxlbmRpbmcgPT09IE5vQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRkaXNhYmxlKCAzMDQyICk7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRlbmFibGUoIDMwNDIgKTtcblx0XHRcdGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZGluZyAhPT0gQ3VzdG9tQmxlbmRpbmcgKSB7XG5cblx0XHRcdGlmICggYmxlbmRpbmcgIT09IGN1cnJlbnRCbGVuZGluZyB8fCBwcmVtdWx0aXBsaWVkQWxwaGEgIT09IGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSApIHtcblxuXHRcdFx0XHRpZiAoIGN1cnJlbnRCbGVuZEVxdWF0aW9uICE9PSBBZGRFcXVhdGlvbiB8fCBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICE9PSBBZGRFcXVhdGlvbiApIHtcblxuXHRcdFx0XHRcdGdsLmJsZW5kRXF1YXRpb24oIDMyNzc0ICk7XG5cblx0XHRcdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IEFkZEVxdWF0aW9uO1xuXHRcdFx0XHRcdGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgKSB7XG5cblx0XHRcdFx0XHRzd2l0Y2ggKCBibGVuZGluZyApIHtcblxuXHRcdFx0XHRcdFx0Y2FzZSBOb3JtYWxCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDEsIDc3MSwgMSwgNzcxICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRjYXNlIEFkZGl0aXZlQmxlbmRpbmc6XG5cdFx0XHRcdFx0XHRcdGdsLmJsZW5kRnVuYyggMSwgMSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggMCwgMCwgNzY5LCA3NzEgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRcdGNhc2UgTXVsdGlwbHlCbGVuZGluZzpcblx0XHRcdFx0XHRcdFx0Z2wuYmxlbmRGdW5jU2VwYXJhdGUoIDAsIDc2OCwgMCwgNzcwICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogJywgYmxlbmRpbmcgKTtcblx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHN3aXRjaCAoIGJsZW5kaW5nICkge1xuXG5cdFx0XHRcdFx0XHRjYXNlIE5vcm1hbEJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggNzcwLCA3NzEsIDEsIDc3MSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDc3MCwgMSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBTdWJ0cmFjdGl2ZUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDAsIDc2OSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0Y2FzZSBNdWx0aXBseUJsZW5kaW5nOlxuXHRcdFx0XHRcdFx0XHRnbC5ibGVuZEZ1bmMoIDAsIDc2OCApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICcsIGJsZW5kaW5nICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50QmxlbmREc3QgPSBudWxsO1xuXHRcdFx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0XHRcdGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDtcblxuXHRcdFx0XHRjdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZztcblx0XHRcdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gcHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGN1c3RvbSBibGVuZGluZ1xuXG5cdFx0YmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247XG5cdFx0YmxlbmRTcmNBbHBoYSA9IGJsZW5kU3JjQWxwaGEgfHwgYmxlbmRTcmM7XG5cdFx0YmxlbmREc3RBbHBoYSA9IGJsZW5kRHN0QWxwaGEgfHwgYmxlbmREc3Q7XG5cblx0XHRpZiAoIGJsZW5kRXF1YXRpb24gIT09IGN1cnJlbnRCbGVuZEVxdWF0aW9uIHx8IGJsZW5kRXF1YXRpb25BbHBoYSAhPT0gY3VycmVudEJsZW5kRXF1YXRpb25BbHBoYSApIHtcblxuXHRcdFx0Z2wuYmxlbmRFcXVhdGlvblNlcGFyYXRlKCBlcXVhdGlvblRvR0xbIGJsZW5kRXF1YXRpb24gXSwgZXF1YXRpb25Ub0dMWyBibGVuZEVxdWF0aW9uQWxwaGEgXSApO1xuXG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbiA9IGJsZW5kRXF1YXRpb247XG5cdFx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBibGVuZFNyYyAhPT0gY3VycmVudEJsZW5kU3JjIHx8IGJsZW5kRHN0ICE9PSBjdXJyZW50QmxlbmREc3QgfHwgYmxlbmRTcmNBbHBoYSAhPT0gY3VycmVudEJsZW5kU3JjQWxwaGEgfHwgYmxlbmREc3RBbHBoYSAhPT0gY3VycmVudEJsZW5kRHN0QWxwaGEgKSB7XG5cblx0XHRcdGdsLmJsZW5kRnVuY1NlcGFyYXRlKCBmYWN0b3JUb0dMWyBibGVuZFNyYyBdLCBmYWN0b3JUb0dMWyBibGVuZERzdCBdLCBmYWN0b3JUb0dMWyBibGVuZFNyY0FscGhhIF0sIGZhY3RvclRvR0xbIGJsZW5kRHN0QWxwaGEgXSApO1xuXG5cdFx0XHRjdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYztcblx0XHRcdGN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0O1xuXHRcdFx0Y3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhO1xuXHRcdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7XG5cdFx0Y3VycmVudFByZW11bHRpcGxlZEFscGhhID0gbnVsbDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApIHtcblxuXHRcdG1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGVcblx0XHRcdD8gZGlzYWJsZSggMjg4NCApXG5cdFx0XHQ6IGVuYWJsZSggMjg4NCApO1xuXG5cdFx0bGV0IGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTtcblx0XHRpZiAoIGZyb250RmFjZUNXICkgZmxpcFNpZGVkID0gISBmbGlwU2lkZWQ7XG5cblx0XHRzZXRGbGlwU2lkZWQoIGZsaXBTaWRlZCApO1xuXG5cdFx0KCBtYXRlcmlhbC5ibGVuZGluZyA9PT0gTm9ybWFsQmxlbmRpbmcgJiYgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPT09IGZhbHNlIClcblx0XHRcdD8gc2V0QmxlbmRpbmcoIE5vQmxlbmRpbmcgKVxuXHRcdFx0OiBzZXRCbGVuZGluZyggbWF0ZXJpYWwuYmxlbmRpbmcsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb24sIG1hdGVyaWFsLmJsZW5kU3JjLCBtYXRlcmlhbC5ibGVuZERzdCwgbWF0ZXJpYWwuYmxlbmRFcXVhdGlvbkFscGhhLCBtYXRlcmlhbC5ibGVuZFNyY0FscGhhLCBtYXRlcmlhbC5ibGVuZERzdEFscGhhLCBtYXRlcmlhbC5wcmVtdWx0aXBsaWVkQWxwaGEgKTtcblxuXHRcdGRlcHRoQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLmRlcHRoRnVuYyApO1xuXHRcdGRlcHRoQnVmZmVyLnNldFRlc3QoIG1hdGVyaWFsLmRlcHRoVGVzdCApO1xuXHRcdGRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTtcblx0XHRjb2xvckJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5jb2xvcldyaXRlICk7XG5cblx0XHRjb25zdCBzdGVuY2lsV3JpdGUgPSBtYXRlcmlhbC5zdGVuY2lsV3JpdGU7XG5cdFx0c3RlbmNpbEJ1ZmZlci5zZXRUZXN0KCBzdGVuY2lsV3JpdGUgKTtcblx0XHRpZiAoIHN0ZW5jaWxXcml0ZSApIHtcblxuXHRcdFx0c3RlbmNpbEJ1ZmZlci5zZXRNYXNrKCBtYXRlcmlhbC5zdGVuY2lsV3JpdGVNYXNrICk7XG5cdFx0XHRzdGVuY2lsQnVmZmVyLnNldEZ1bmMoIG1hdGVyaWFsLnN0ZW5jaWxGdW5jLCBtYXRlcmlhbC5zdGVuY2lsUmVmLCBtYXRlcmlhbC5zdGVuY2lsRnVuY01hc2sgKTtcblx0XHRcdHN0ZW5jaWxCdWZmZXIuc2V0T3AoIG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyApO1xuXG5cdFx0fVxuXG5cdFx0c2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7XG5cblx0XHRtYXRlcmlhbC5hbHBoYVRvQ292ZXJhZ2UgPT09IHRydWVcblx0XHRcdD8gZW5hYmxlKCAzMjkyNiApXG5cdFx0XHQ6IGRpc2FibGUoIDMyOTI2ICk7XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHtcblxuXHRcdFx0aWYgKCBmbGlwU2lkZWQgKSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCAyMzA0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Z2wuZnJvbnRGYWNlKCAyMzA1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y3VycmVudEZsaXBTaWRlZCA9IGZsaXBTaWRlZDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkge1xuXG5cdFx0aWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkge1xuXG5cdFx0XHRlbmFibGUoIDI4ODQgKTtcblxuXHRcdFx0aWYgKCBjdWxsRmFjZSAhPT0gY3VycmVudEN1bGxGYWNlICkge1xuXG5cdFx0XHRcdGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlQmFjayApIHtcblxuXHRcdFx0XHRcdGdsLmN1bGxGYWNlKCAxMDI5ICk7XG5cblx0XHRcdFx0fSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggMTAyOCApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbC5jdWxsRmFjZSggMTAzMiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggMjg4NCApO1xuXG5cdFx0fVxuXG5cdFx0Y3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldExpbmVXaWR0aCggd2lkdGggKSB7XG5cblx0XHRpZiAoIHdpZHRoICE9PSBjdXJyZW50TGluZVdpZHRoICkge1xuXG5cdFx0XHRpZiAoIGxpbmVXaWR0aEF2YWlsYWJsZSApIGdsLmxpbmVXaWR0aCggd2lkdGggKTtcblxuXHRcdFx0Y3VycmVudExpbmVXaWR0aCA9IHdpZHRoO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRQb2x5Z29uT2Zmc2V0KCBwb2x5Z29uT2Zmc2V0LCBmYWN0b3IsIHVuaXRzICkge1xuXG5cdFx0aWYgKCBwb2x5Z29uT2Zmc2V0ICkge1xuXG5cdFx0XHRlbmFibGUoIDMyODIzICk7XG5cblx0XHRcdGlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHtcblxuXHRcdFx0XHRnbC5wb2x5Z29uT2Zmc2V0KCBmYWN0b3IsIHVuaXRzICk7XG5cblx0XHRcdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBmYWN0b3I7XG5cdFx0XHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSB1bml0cztcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0ZGlzYWJsZSggMzI4MjMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gc2V0U2Npc3NvclRlc3QoIHNjaXNzb3JUZXN0ICkge1xuXG5cdFx0aWYgKCBzY2lzc29yVGVzdCApIHtcblxuXHRcdFx0ZW5hYmxlKCAzMDg5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRkaXNhYmxlKCAzMDg5ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIHRleHR1cmVcblxuXHRmdW5jdGlvbiBhY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKSB7XG5cblx0XHRpZiAoIHdlYmdsU2xvdCA9PT0gdW5kZWZpbmVkICkgd2ViZ2xTbG90ID0gMzM5ODQgKyBtYXhUZXh0dXJlcyAtIDE7XG5cblx0XHRpZiAoIGN1cnJlbnRUZXh0dXJlU2xvdCAhPT0gd2ViZ2xTbG90ICkge1xuXG5cdFx0XHRnbC5hY3RpdmVUZXh0dXJlKCB3ZWJnbFNsb3QgKTtcblx0XHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IHdlYmdsU2xvdDtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkge1xuXG5cdFx0aWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7XG5cblx0XHRcdGFjdGl2ZVRleHR1cmUoKTtcblxuXHRcdH1cblxuXHRcdGxldCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRib3VuZFRleHR1cmUgPSB7IHR5cGU6IHVuZGVmaW5lZCwgdGV4dHVyZTogdW5kZWZpbmVkIH07XG5cdFx0XHRjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF0gPSBib3VuZFRleHR1cmU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZS50eXBlICE9PSB3ZWJnbFR5cGUgfHwgYm91bmRUZXh0dXJlLnRleHR1cmUgIT09IHdlYmdsVGV4dHVyZSApIHtcblxuXHRcdFx0Z2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7XG5cblx0XHRcdGJvdW5kVGV4dHVyZS50eXBlID0gd2ViZ2xUeXBlO1xuXHRcdFx0Ym91bmRUZXh0dXJlLnRleHR1cmUgPSB3ZWJnbFRleHR1cmU7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVuYmluZFRleHR1cmUoKSB7XG5cblx0XHRjb25zdCBib3VuZFRleHR1cmUgPSBjdXJyZW50Qm91bmRUZXh0dXJlc1sgY3VycmVudFRleHR1cmVTbG90IF07XG5cblx0XHRpZiAoIGJvdW5kVGV4dHVyZSAhPT0gdW5kZWZpbmVkICYmIGJvdW5kVGV4dHVyZS50eXBlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGdsLmJpbmRUZXh0dXJlKCBib3VuZFRleHR1cmUudHlwZSwgbnVsbCApO1xuXG5cdFx0XHRib3VuZFRleHR1cmUudHlwZSA9IHVuZGVmaW5lZDtcblx0XHRcdGJvdW5kVGV4dHVyZS50ZXh0dXJlID0gdW5kZWZpbmVkO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHtcblxuXHRcdHRyeSB7XG5cblx0XHRcdGdsLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlMkQoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTJELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleEltYWdlM0QoKSB7XG5cblx0XHR0cnkge1xuXG5cdFx0XHRnbC50ZXhJbWFnZTNELmFwcGx5KCBnbCwgYXJndW1lbnRzICk7XG5cblx0XHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOicsIGVycm9yICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vXG5cblx0ZnVuY3Rpb24gc2Npc3Nvciggc2Npc3NvciApIHtcblxuXHRcdGlmICggY3VycmVudFNjaXNzb3IuZXF1YWxzKCBzY2lzc29yICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTtcblx0XHRcdGN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdmlld3BvcnQoIHZpZXdwb3J0ICkge1xuXG5cdFx0aWYgKCBjdXJyZW50Vmlld3BvcnQuZXF1YWxzKCB2aWV3cG9ydCApID09PSBmYWxzZSApIHtcblxuXHRcdFx0Z2wudmlld3BvcnQoIHZpZXdwb3J0LngsIHZpZXdwb3J0LnksIHZpZXdwb3J0LnosIHZpZXdwb3J0LncgKTtcblx0XHRcdGN1cnJlbnRWaWV3cG9ydC5jb3B5KCB2aWV3cG9ydCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHJlc2V0KCkge1xuXG5cdFx0Ly8gcmVzZXQgc3RhdGVcblxuXHRcdGdsLmRpc2FibGUoIDMwNDIgKTtcblx0XHRnbC5kaXNhYmxlKCAyODg0ICk7XG5cdFx0Z2wuZGlzYWJsZSggMjkyOSApO1xuXHRcdGdsLmRpc2FibGUoIDMyODIzICk7XG5cdFx0Z2wuZGlzYWJsZSggMzA4OSApO1xuXHRcdGdsLmRpc2FibGUoIDI5NjAgKTtcblx0XHRnbC5kaXNhYmxlKCAzMjkyNiApO1xuXG5cdFx0Z2wuYmxlbmRFcXVhdGlvbiggMzI3NzQgKTtcblx0XHRnbC5ibGVuZEZ1bmMoIDEsIDAgKTtcblx0XHRnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggMSwgMCwgMSwgMCApO1xuXG5cdFx0Z2wuY29sb3JNYXNrKCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlICk7XG5cdFx0Z2wuY2xlYXJDb2xvciggMCwgMCwgMCwgMCApO1xuXG5cdFx0Z2wuZGVwdGhNYXNrKCB0cnVlICk7XG5cdFx0Z2wuZGVwdGhGdW5jKCA1MTMgKTtcblx0XHRnbC5jbGVhckRlcHRoKCAxICk7XG5cblx0XHRnbC5zdGVuY2lsTWFzayggMHhmZmZmZmZmZiApO1xuXHRcdGdsLnN0ZW5jaWxGdW5jKCA1MTksIDAsIDB4ZmZmZmZmZmYgKTtcblx0XHRnbC5zdGVuY2lsT3AoIDc2ODAsIDc2ODAsIDc2ODAgKTtcblx0XHRnbC5jbGVhclN0ZW5jaWwoIDAgKTtcblxuXHRcdGdsLmN1bGxGYWNlKCAxMDI5ICk7XG5cdFx0Z2wuZnJvbnRGYWNlKCAyMzA1ICk7XG5cblx0XHRnbC5wb2x5Z29uT2Zmc2V0KCAwLCAwICk7XG5cblx0XHRnbC5hY3RpdmVUZXh0dXJlKCAzMzk4NCApO1xuXG5cdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgbnVsbCApO1xuXG5cdFx0aWYgKCBpc1dlYkdMMiA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOSwgbnVsbCApO1xuXHRcdFx0Z2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOCwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0Z2wudXNlUHJvZ3JhbSggbnVsbCApO1xuXG5cdFx0Z2wubGluZVdpZHRoKCAxICk7XG5cblx0XHRnbC5zY2lzc29yKCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblx0XHRnbC52aWV3cG9ydCggMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0ICk7XG5cblx0XHQvLyByZXNldCBpbnRlcm5hbHNcblxuXHRcdGVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTtcblxuXHRcdGN1cnJlbnRUZXh0dXJlU2xvdCA9IG51bGw7XG5cdFx0Y3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTtcblxuXHRcdHhyRnJhbWVidWZmZXIgPSBudWxsO1xuXHRcdGN1cnJlbnRCb3VuZEZyYW1lYnVmZmVycyA9IHt9O1xuXG5cdFx0Y3VycmVudFByb2dyYW0gPSBudWxsO1xuXG5cdFx0Y3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRcdGN1cnJlbnRCbGVuZGluZyA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRXF1YXRpb24gPSBudWxsO1xuXHRcdGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRHN0ID0gbnVsbDtcblx0XHRjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDtcblx0XHRjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7XG5cdFx0Y3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsO1xuXHRcdGN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IGZhbHNlO1xuXG5cdFx0Y3VycmVudEZsaXBTaWRlZCA9IG51bGw7XG5cdFx0Y3VycmVudEN1bGxGYWNlID0gbnVsbDtcblxuXHRcdGN1cnJlbnRMaW5lV2lkdGggPSBudWxsO1xuXG5cdFx0Y3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsO1xuXHRcdGN1cnJlbnRQb2x5Z29uT2Zmc2V0VW5pdHMgPSBudWxsO1xuXG5cdFx0Y3VycmVudFNjaXNzb3Iuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblx0XHRjdXJyZW50Vmlld3BvcnQuc2V0KCAwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQgKTtcblxuXHRcdGNvbG9yQnVmZmVyLnJlc2V0KCk7XG5cdFx0ZGVwdGhCdWZmZXIucmVzZXQoKTtcblx0XHRzdGVuY2lsQnVmZmVyLnJlc2V0KCk7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRidWZmZXJzOiB7XG5cdFx0XHRjb2xvcjogY29sb3JCdWZmZXIsXG5cdFx0XHRkZXB0aDogZGVwdGhCdWZmZXIsXG5cdFx0XHRzdGVuY2lsOiBzdGVuY2lsQnVmZmVyXG5cdFx0fSxcblxuXHRcdGVuYWJsZTogZW5hYmxlLFxuXHRcdGRpc2FibGU6IGRpc2FibGUsXG5cblx0XHRiaW5kRnJhbWVidWZmZXI6IGJpbmRGcmFtZWJ1ZmZlcixcblx0XHRiaW5kWFJGcmFtZWJ1ZmZlcjogYmluZFhSRnJhbWVidWZmZXIsXG5cblx0XHR1c2VQcm9ncmFtOiB1c2VQcm9ncmFtLFxuXG5cdFx0c2V0QmxlbmRpbmc6IHNldEJsZW5kaW5nLFxuXHRcdHNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCxcblxuXHRcdHNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLFxuXHRcdHNldEN1bGxGYWNlOiBzZXRDdWxsRmFjZSxcblxuXHRcdHNldExpbmVXaWR0aDogc2V0TGluZVdpZHRoLFxuXHRcdHNldFBvbHlnb25PZmZzZXQ6IHNldFBvbHlnb25PZmZzZXQsXG5cblx0XHRzZXRTY2lzc29yVGVzdDogc2V0U2Npc3NvclRlc3QsXG5cblx0XHRhY3RpdmVUZXh0dXJlOiBhY3RpdmVUZXh0dXJlLFxuXHRcdGJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSxcblx0XHR1bmJpbmRUZXh0dXJlOiB1bmJpbmRUZXh0dXJlLFxuXHRcdGNvbXByZXNzZWRUZXhJbWFnZTJEOiBjb21wcmVzc2VkVGV4SW1hZ2UyRCxcblx0XHR0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELFxuXHRcdHRleEltYWdlM0Q6IHRleEltYWdlM0QsXG5cblx0XHRzY2lzc29yOiBzY2lzc29yLFxuXHRcdHZpZXdwb3J0OiB2aWV3cG9ydCxcblxuXHRcdHJlc2V0OiByZXNldFxuXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApIHtcblxuXHRjb25zdCBpc1dlYkdMMiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMjtcblx0Y29uc3QgbWF4VGV4dHVyZXMgPSBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXM7XG5cdGNvbnN0IG1heEN1YmVtYXBTaXplID0gY2FwYWJpbGl0aWVzLm1heEN1YmVtYXBTaXplO1xuXHRjb25zdCBtYXhUZXh0dXJlU2l6ZSA9IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlU2l6ZTtcblx0Y29uc3QgbWF4U2FtcGxlcyA9IGNhcGFiaWxpdGllcy5tYXhTYW1wbGVzO1xuXG5cdGNvbnN0IF92aWRlb1RleHR1cmVzID0gbmV3IFdlYWtNYXAoKTtcblx0bGV0IF9jYW52YXM7XG5cblx0Ly8gY29yZG92YSBpT1MgKGFzIG9mIDUuMCkgc3RpbGwgdXNlcyBVSVdlYlZpZXcsIHdoaWNoIHByb3ZpZGVzIE9mZnNjcmVlbkNhbnZhcyxcblx0Ly8gYWxzbyBPZmZzY3JlZW5DYW52YXMuZ2V0Q29udGV4dChcIndlYmdsXCIpLCBidXQgbm90IE9mZnNjcmVlbkNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhXG5cdC8vIFNvbWUgaW1wbGVtZW50YXRpb25zIG1heSBvbmx5IGltcGxlbWVudCBPZmZzY3JlZW5DYW52YXMgcGFydGlhbGx5IChlLmcuIGxhY2tpbmcgMmQpLlxuXG5cdGxldCB1c2VPZmZzY3JlZW5DYW52YXMgPSBmYWxzZTtcblxuXHR0cnkge1xuXG5cdFx0dXNlT2Zmc2NyZWVuQ2FudmFzID0gdHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCdcblx0XHRcdCYmICggbmV3IE9mZnNjcmVlbkNhbnZhcyggMSwgMSApLmdldENvbnRleHQoICcyZCcgKSApICE9PSBudWxsO1xuXG5cdH0gY2F0Y2ggKCBlcnIgKSB7XG5cblx0XHQvLyBJZ25vcmUgYW55IGVycm9yc1xuXG5cdH1cblxuXHRmdW5jdGlvbiBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHQvLyBVc2UgT2Zmc2NyZWVuQ2FudmFzIHdoZW4gYXZhaWxhYmxlLiBTcGVjaWFsbHkgbmVlZGVkIGluIHdlYiB3b3JrZXJzXG5cblx0XHRyZXR1cm4gdXNlT2Zmc2NyZWVuQ2FudmFzID9cblx0XHRcdG5ldyBPZmZzY3JlZW5DYW52YXMoIHdpZHRoLCBoZWlnaHQgKSA6XG5cdFx0XHRkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVzaXplSW1hZ2UoIGltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIG5lZWRzTmV3Q2FudmFzLCBtYXhTaXplICkge1xuXG5cdFx0bGV0IHNjYWxlID0gMTtcblxuXHRcdC8vIGhhbmRsZSBjYXNlIGlmIHRleHR1cmUgZXhjZWVkcyBtYXggc2l6ZVxuXG5cdFx0aWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHtcblxuXHRcdFx0c2NhbGUgPSBtYXhTaXplIC8gTWF0aC5tYXgoIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgcGVyZm9ybSByZXNpemUgaWYgbmVjZXNzYXJ5XG5cblx0XHRpZiAoIHNjYWxlIDwgMSB8fCBuZWVkc1Bvd2VyT2ZUd28gPT09IHRydWUgKSB7XG5cblx0XHRcdC8vIG9ubHkgcGVyZm9ybSByZXNpemUgZm9yIGNlcnRhaW4gaW1hZ2UgdHlwZXNcblxuXHRcdFx0aWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fFxuXHRcdFx0XHQoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHx8XG5cdFx0XHRcdCggdHlwZW9mIEltYWdlQml0bWFwICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEltYWdlQml0bWFwICkgKSB7XG5cblx0XHRcdFx0Y29uc3QgZmxvb3IgPSBuZWVkc1Bvd2VyT2ZUd28gPyBNYXRoVXRpbHMuZmxvb3JQb3dlck9mVHdvIDogTWF0aC5mbG9vcjtcblxuXHRcdFx0XHRjb25zdCB3aWR0aCA9IGZsb29yKCBzY2FsZSAqIGltYWdlLndpZHRoICk7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IGZsb29yKCBzY2FsZSAqIGltYWdlLmhlaWdodCApO1xuXG5cdFx0XHRcdGlmICggX2NhbnZhcyA9PT0gdW5kZWZpbmVkICkgX2NhbnZhcyA9IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0XHRcdC8vIGN1YmUgdGV4dHVyZXMgY2FuJ3QgcmV1c2UgdGhlIHNhbWUgY2FudmFzXG5cblx0XHRcdFx0Y29uc3QgY2FudmFzID0gbmVlZHNOZXdDYW52YXMgPyBjcmVhdGVDYW52YXMoIHdpZHRoLCBoZWlnaHQgKSA6IF9jYW52YXM7XG5cblx0XHRcdFx0Y2FudmFzLndpZHRoID0gd2lkdGg7XG5cdFx0XHRcdGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRcdFx0Y29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCAnMmQnICk7XG5cdFx0XHRcdGNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCApO1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaGFzIGJlZW4gcmVzaXplZCBmcm9tICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKSB0byAoJyArIHdpZHRoICsgJ3gnICsgaGVpZ2h0ICsgJykuJyApO1xuXG5cdFx0XHRcdHJldHVybiBjYW52YXM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCAnZGF0YScgaW4gaW1hZ2UgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBJbWFnZSBpbiBEYXRhVGV4dHVyZSBpcyB0b28gYmlnICgnICsgaW1hZ2Uud2lkdGggKyAneCcgKyBpbWFnZS5oZWlnaHQgKyAnKS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBpbWFnZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGltYWdlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBpc1Bvd2VyT2ZUd28oIGltYWdlICkge1xuXG5cdFx0cmV0dXJuIE1hdGhVdGlscy5pc1Bvd2VyT2ZUd28oIGltYWdlLndpZHRoICkgJiYgTWF0aFV0aWxzLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHRleHR1cmVOZWVkc1Bvd2VyT2ZUd28oIHRleHR1cmUgKSB7XG5cblx0XHRpZiAoIGlzV2ViR0wyICkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHxcblx0XHRcdCggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdHJldHVybiB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyAmJiBzdXBwb3J0c01pcHMgJiZcblx0XHRcdHRleHR1cmUubWluRmlsdGVyICE9PSBOZWFyZXN0RmlsdGVyICYmIHRleHR1cmUubWluRmlsdGVyICE9PSBMaW5lYXJGaWx0ZXI7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIGdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRfZ2wuZ2VuZXJhdGVNaXBtYXAoIHRhcmdldCApO1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IE1hdGgubG9nMiggTWF0aC5tYXgoIHdpZHRoLCBoZWlnaHQgKSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdCggaW50ZXJuYWxGb3JtYXROYW1lLCBnbEZvcm1hdCwgZ2xUeXBlICkge1xuXG5cdFx0aWYgKCBpc1dlYkdMMiA9PT0gZmFsc2UgKSByZXR1cm4gZ2xGb3JtYXQ7XG5cblx0XHRpZiAoIGludGVybmFsRm9ybWF0TmFtZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBfZ2xbIGludGVybmFsRm9ybWF0TmFtZSBdICE9PSB1bmRlZmluZWQgKSByZXR1cm4gX2dsWyBpbnRlcm5hbEZvcm1hdE5hbWUgXTtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byB1c2Ugbm9uLWV4aXN0aW5nIFdlYkdMIGludGVybmFsIGZvcm1hdCBcXCcnICsgaW50ZXJuYWxGb3JtYXROYW1lICsgJ1xcJycgKTtcblxuXHRcdH1cblxuXHRcdGxldCBpbnRlcm5hbEZvcm1hdCA9IGdsRm9ybWF0O1xuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwMyApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI2O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI1O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzIxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwNyApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODM3O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODQzO1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMyODQ5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBnbEZvcm1hdCA9PT0gNjQwOCApIHtcblxuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODM2O1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDM0ODQyO1xuXHRcdFx0aWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMyODU2O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBpbnRlcm5hbEZvcm1hdCA9PT0gMzMzMjUgfHwgaW50ZXJuYWxGb3JtYXQgPT09IDMzMzI2IHx8XG5cdFx0XHRpbnRlcm5hbEZvcm1hdCA9PT0gMzQ4NDIgfHwgaW50ZXJuYWxGb3JtYXQgPT09IDM0ODM2ICkge1xuXG5cdFx0XHRleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW50ZXJuYWxGb3JtYXQ7XG5cblx0fVxuXG5cdC8vIEZhbGxiYWNrIGZpbHRlcnMgZm9yIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG5cblx0ZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7XG5cblx0XHRpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciApIHtcblxuXHRcdFx0cmV0dXJuIDk3Mjg7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gOTcyOTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBvblRleHR1cmVEaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IHRleHR1cmUgPSBldmVudC50YXJnZXQ7XG5cblx0XHR0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHtcblxuXHRcdFx0X3ZpZGVvVGV4dHVyZXMuZGVsZXRlKCB0ZXh0dXJlICk7XG5cblx0XHR9XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25SZW5kZXJUYXJnZXREaXNwb3NlKCBldmVudCApIHtcblxuXHRcdGNvbnN0IHJlbmRlclRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuXHRcdHJlbmRlclRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0ZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRpbmZvLm1lbW9yeS50ZXh0dXJlcyAtLTtcblxuXHR9XG5cblx0Ly9cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlVGV4dHVyZSggdGV4dHVyZSApIHtcblxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdF9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gZGVhbGxvY2F0ZVJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3QgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTtcblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuO1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRfZ2wuZGVsZXRlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdH1cblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRfZ2wuZGVsZXRlRnJhbWVidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICkgX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciApO1xuXHRcdFx0aWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICk7XG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyICkgX2dsLmRlbGV0ZVJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgKTtcblxuXHRcdH1cblxuXHRcdHByb3BlcnRpZXMucmVtb3ZlKCB0ZXh0dXJlICk7XG5cdFx0cHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldCApO1xuXG5cdH1cblxuXHQvL1xuXG5cdGxldCB0ZXh0dXJlVW5pdHMgPSAwO1xuXG5cdGZ1bmN0aW9uIHJlc2V0VGV4dHVyZVVuaXRzKCkge1xuXG5cdFx0dGV4dHVyZVVuaXRzID0gMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gYWxsb2NhdGVUZXh0dXJlVW5pdCgpIHtcblxuXHRcdGNvbnN0IHRleHR1cmVVbml0ID0gdGV4dHVyZVVuaXRzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVW5pdCA+PSBtYXhUZXh0dXJlcyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAnICsgdGV4dHVyZVVuaXQgKyAnIHRleHR1cmUgdW5pdHMgd2hpbGUgdGhpcyBHUFUgc3VwcG9ydHMgb25seSAnICsgbWF4VGV4dHVyZXMgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVVbml0cyArPSAxO1xuXG5cdFx0cmV0dXJuIHRleHR1cmVVbml0O1xuXG5cdH1cblxuXHQvL1xuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdGlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHVwZGF0ZVZpZGVvVGV4dHVyZSggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHRjb25zdCBpbWFnZSA9IHRleHR1cmUuaW1hZ2U7XG5cblx0XHRcdGlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyB1bmRlZmluZWQnICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlJyApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmUyREFycmF5KCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7XG5cdFx0c3RhdGUuYmluZFRleHR1cmUoIDM1ODY2LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBzZXRUZXh0dXJlM0QoIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7XG5cblx0XHRpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7XG5cblx0XHRcdHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzI4NzksIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkge1xuXG5cdFx0XHR1cGxvYWRDdWJlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNDA2NywgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHR9XG5cblx0Y29uc3Qgd3JhcHBpbmdUb0dMID0ge1xuXHRcdFsgUmVwZWF0V3JhcHBpbmcgXTogMTA0OTcsXG5cdFx0WyBDbGFtcFRvRWRnZVdyYXBwaW5nIF06IDMzMDcxLFxuXHRcdFsgTWlycm9yZWRSZXBlYXRXcmFwcGluZyBdOiAzMzY0OFxuXHR9O1xuXG5cdGNvbnN0IGZpbHRlclRvR0wgPSB7XG5cdFx0WyBOZWFyZXN0RmlsdGVyIF06IDk3MjgsXG5cdFx0WyBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciBdOiA5OTg0LFxuXHRcdFsgTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciBdOiA5OTg2LFxuXG5cdFx0WyBMaW5lYXJGaWx0ZXIgXTogOTcyOSxcblx0XHRbIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgXTogOTk4NSxcblx0XHRbIExpbmVhck1pcG1hcExpbmVhckZpbHRlciBdOiA5OTg3XG5cdH07XG5cblx0ZnVuY3Rpb24gc2V0VGV4dHVyZVBhcmFtZXRlcnMoIHRleHR1cmVUeXBlLCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSB7XG5cblx0XHRpZiAoIHN1cHBvcnRzTWlwcyApIHtcblxuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0Miwgd3JhcHBpbmdUb0dMWyB0ZXh0dXJlLndyYXBTIF0gKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDMsIHdyYXBwaW5nVG9HTFsgdGV4dHVyZS53cmFwVCBdICk7XG5cblx0XHRcdGlmICggdGV4dHVyZVR5cGUgPT09IDMyODc5IHx8IHRleHR1cmVUeXBlID09PSAzNTg2NiApIHtcblxuXHRcdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDMyODgyLCB3cmFwcGluZ1RvR0xbIHRleHR1cmUud3JhcFIgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDAsIGZpbHRlclRvR0xbIHRleHR1cmUubWFnRmlsdGVyIF0gKTtcblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDEsIGZpbHRlclRvR0xbIHRleHR1cmUubWluRmlsdGVyIF0gKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDIsIDMzMDcxICk7XG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQzLCAzMzA3MSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVUeXBlID09PSAzMjg3OSB8fCB0ZXh0dXJlVHlwZSA9PT0gMzU4NjYgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAzMjg4MiwgMzMwNzEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLicgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQwLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5tYWdGaWx0ZXIgKSApO1xuXHRcdFx0X2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MSwgZmlsdGVyRmFsbGJhY2soIHRleHR1cmUubWluRmlsdGVyICkgKTtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTmVhcmVzdEZpbHRlciAmJiB0ZXh0dXJlLm1pbkZpbHRlciAhPT0gTGluZWFyRmlsdGVyICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgaXMgbm90IHBvd2VyIG9mIHR3by4gVGV4dHVyZS5taW5GaWx0ZXIgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5OZWFyZXN0RmlsdGVyIG9yIFRIUkVFLkxpbmVhckZpbHRlci4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICYmIGV4dGVuc2lvbnMuaGFzKCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApID09PSBmYWxzZSApIHJldHVybjsgLy8gdmVyaWZ5IGV4dGVuc2lvbiBmb3IgV2ViR0wgMSBhbmQgV2ViR0wgMlxuXHRcdFx0aWYgKCBpc1dlYkdMMiA9PT0gZmFsc2UgJiYgKCB0ZXh0dXJlLnR5cGUgPT09IEhhbGZGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5oYXMoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhcicgKSA9PT0gZmFsc2UgKSApIHJldHVybjsgLy8gdmVyaWZ5IGV4dGVuc2lvbiBmb3IgV2ViR0wgMSBvbmx5XG5cblx0XHRcdGlmICggdGV4dHVyZS5hbmlzb3Ryb3B5ID4gMSB8fCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgKSB7XG5cblx0XHRcdFx0X2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApO1xuXHRcdFx0XHRwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fY3VycmVudEFuaXNvdHJvcHkgPSB0ZXh0dXJlLmFuaXNvdHJvcHk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9IHRydWU7XG5cblx0XHRcdHRleHR1cmUuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblRleHR1cmVEaXNwb3NlICk7XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTtcblxuXHRcdFx0aW5mby5tZW1vcnkudGV4dHVyZXMgKys7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0bGV0IHRleHR1cmVUeXBlID0gMzU1MztcblxuXHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHRleHR1cmVUeXBlID0gMzU4NjY7XG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUzRCApIHRleHR1cmVUeXBlID0gMzI4Nzk7XG5cblx0XHRpbml0VGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUgKTtcblxuXHRcdHN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApO1xuXHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDAsIHRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQxLCB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTcsIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MywgMCApO1xuXG5cdFx0Y29uc3QgbmVlZHNQb3dlck9mVHdvID0gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApICYmIGlzUG93ZXJPZlR3byggdGV4dHVyZS5pbWFnZSApID09PSBmYWxzZTtcblx0XHRjb25zdCBpbWFnZSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIGZhbHNlLCBtYXhUZXh0dXJlU2l6ZSApO1xuXG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCBpbWFnZSApIHx8IGlzV2ViR0wyLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0bGV0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApLFxuXHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCB0ZXh0dXJlLmludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlICk7XG5cblx0XHRzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApO1xuXG5cdFx0bGV0IG1pcG1hcDtcblx0XHRjb25zdCBtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLmlzRGVwdGhUZXh0dXJlICkge1xuXG5cdFx0XHQvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YVxuXG5cdFx0XHRnbEludGVybmFsRm9ybWF0ID0gNjQwMjtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmUudHlwZSA9PT0gRmxvYXRUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM2MDEyO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDMzMTkwO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoIHRleHR1cmUudHlwZSA9PT0gVW5zaWduZWRJbnQyNDhUeXBlICkge1xuXG5cdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM1MDU2O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzMxODk7IC8vIFdlYkdMMiByZXF1aXJlcyBzaXplZCBpbnRlcm5hbGZvcm1hdCBmb3IgZ2xUZXhJbWFnZTJEXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgZGVwdGggdGV4dHVyZSByZXF1aXJlcyBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyB2YWxpZGF0aW9uIGNoZWNrcyBmb3IgV2ViR0wgMVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCAmJiBnbEludGVybmFsRm9ybWF0ID09PSA2NDAyICkge1xuXG5cdFx0XHRcdC8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZVxuXHRcdFx0XHQvLyBERVBUSF9DT01QT05FTlQgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX1NIT1JUIG9yIFVOU0lHTkVEX0lOVFxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkU2hvcnRUeXBlICYmIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRJbnRUeXBlICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVXNlIFVuc2lnbmVkU2hvcnRUeXBlIG9yIFVuc2lnbmVkSW50VHlwZSBmb3IgRGVwdGhGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTtcblxuXHRcdFx0XHRcdHRleHR1cmUudHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgJiYgZ2xJbnRlcm5hbEZvcm1hdCA9PT0gNjQwMiApIHtcblxuXHRcdFx0XHQvLyBEZXB0aCBzdGVuY2lsIHRleHR1cmVzIG5lZWQgdGhlIERFUFRIX1NURU5DSUwgaW50ZXJuYWwgZm9ybWF0XG5cdFx0XHRcdC8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKVxuXHRcdFx0XHRnbEludGVybmFsRm9ybWF0ID0gMzQwNDE7XG5cblx0XHRcdFx0Ly8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlXG5cdFx0XHRcdC8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLlxuXHRcdFx0XHQvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLylcblx0XHRcdFx0aWYgKCB0ZXh0dXJlLnR5cGUgIT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuJyApO1xuXG5cdFx0XHRcdFx0dGV4dHVyZS50eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXHRcdFx0XHRcdGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvL1xuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBudWxsICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUgKSB7XG5cblx0XHRcdC8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlXG5cdFx0XHQvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHNcblx0XHRcdC8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVsc1xuXG5cdFx0XHRpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBzdXBwb3J0c01pcHMgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRtaXBtYXAgPSBtaXBtYXBzWyBpIF07XG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzU1MywgaSwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAuZGF0YSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHtcblxuXHRcdFx0XHRcdGlmICggZ2xGb3JtYXQgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAudXBsb2FkVGV4dHVyZSgpJyApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHR9IGVsc2UgaWYgKCB0ZXh0dXJlLmlzRGF0YVRleHR1cmUyREFycmF5ICkge1xuXG5cdFx0XHRzdGF0ZS50ZXhJbWFnZTNEKCAzNTg2NiwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTtcblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0fSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlM0QgKSB7XG5cblx0XHRcdHN0YXRlLnRleEltYWdlM0QoIDMyODc5LCAwLCBnbEludGVybmFsRm9ybWF0LCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0LCBpbWFnZS5kZXB0aCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApO1xuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IDA7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyByZWd1bGFyIFRleHR1cmUgKGltYWdlLCB2aWRlbywgY2FudmFzKVxuXG5cdFx0XHQvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZVxuXHRcdFx0Ly8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzXG5cdFx0XHQvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHNcblxuXHRcdFx0aWYgKCBtaXBtYXBzLmxlbmd0aCA+IDAgJiYgc3VwcG9ydHNNaXBzICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0bWlwbWFwID0gbWlwbWFwc1sgaSBdO1xuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXHRcdFx0XHR0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM1NTMsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlICk7XG5cdFx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7XG5cblx0XHRcdGdlbmVyYXRlTWlwbWFwKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZSwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApO1xuXG5cdFx0fVxuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uID0gdGV4dHVyZS52ZXJzaW9uO1xuXG5cdFx0aWYgKCB0ZXh0dXJlLm9uVXBkYXRlICkgdGV4dHVyZS5vblVwZGF0ZSggdGV4dHVyZSApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGxvYWRDdWJlVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKSB7XG5cblx0XHRpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2ICkgcmV0dXJuO1xuXG5cdFx0aW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICk7XG5cblx0XHRzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTtcblx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7XG5cblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQwLCB0ZXh0dXJlLmZsaXBZICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MSwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMzE3LCB0ZXh0dXJlLnVucGFja0FsaWdubWVudCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDMsIDAgKTtcblxuXHRcdGNvbnN0IGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSB8fCB0ZXh0dXJlLmltYWdlWyAwIF0uaXNDb21wcmVzc2VkVGV4dHVyZSApICk7XG5cdFx0Y29uc3QgaXNEYXRhVGV4dHVyZSA9ICggdGV4dHVyZS5pbWFnZVsgMCBdICYmIHRleHR1cmUuaW1hZ2VbIDAgXS5pc0RhdGFUZXh0dXJlICk7XG5cblx0XHRjb25zdCBjdWJlSW1hZ2UgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDY7IGkgKysgKSB7XG5cblx0XHRcdGlmICggISBpc0NvbXByZXNzZWQgJiYgISBpc0RhdGFUZXh0dXJlICkge1xuXG5cdFx0XHRcdGN1YmVJbWFnZVsgaSBdID0gcmVzaXplSW1hZ2UoIHRleHR1cmUuaW1hZ2VbIGkgXSwgZmFsc2UsIHRydWUsIG1heEN1YmVtYXBTaXplICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y3ViZUltYWdlWyBpIF0gPSBpc0RhdGFUZXh0dXJlID8gdGV4dHVyZS5pbWFnZVsgaSBdLmltYWdlIDogdGV4dHVyZS5pbWFnZVsgaSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBpbWFnZSA9IGN1YmVJbWFnZVsgMCBdLFxuXHRcdFx0c3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCBpbWFnZSApIHx8IGlzV2ViR0wyLFxuXHRcdFx0Z2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApLFxuXHRcdFx0Z2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICksXG5cdFx0XHRnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblxuXHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCAzNDA2NywgdGV4dHVyZSwgc3VwcG9ydHNNaXBzICk7XG5cblx0XHRsZXQgbWlwbWFwcztcblxuXHRcdGlmICggaXNDb21wcmVzc2VkICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdG1pcG1hcHMgPSBjdWJlSW1hZ2VbIGkgXS5taXBtYXBzO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG1pcG1hcHMubGVuZ3RoOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgbWlwbWFwID0gbWlwbWFwc1sgaiBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCQUZvcm1hdCAmJiB0ZXh0dXJlLmZvcm1hdCAhPT0gUkdCRm9ybWF0ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGdsRm9ybWF0ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRcdHN0YXRlLmNvbXByZXNzZWRUZXhJbWFnZTJEKCAzNDA2OSArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBBdHRlbXB0IHRvIGxvYWQgdW5zdXBwb3J0ZWQgY29tcHJlc3NlZCB0ZXh0dXJlIGZvcm1hdCBpbiAuc2V0VGV4dHVyZUN1YmUoKScgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCBqLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXAud2lkdGgsIG1pcG1hcC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5kYXRhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRtaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRcdGlmICggaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcEltYWdlID0gbWlwbWFwLmltYWdlWyBpIF0uaW1hZ2U7XG5cblx0XHRcdFx0XHRcdHN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcEltYWdlLndpZHRoLCBtaXBtYXBJbWFnZS5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcEltYWdlLmRhdGEgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCAwLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBjdWJlSW1hZ2VbIGkgXSApO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IG1pcG1hcCA9IG1pcG1hcHNbIGogXTtcblxuXHRcdFx0XHRcdFx0c3RhdGUudGV4SW1hZ2UyRCggMzQwNjkgKyBpLCBqICsgMSwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmltYWdlWyBpIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHQvLyBXZSBhc3N1bWUgaW1hZ2VzIGZvciBjdWJlIG1hcCBoYXZlIHRoZSBzYW1lIHNpemUuXG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggMzQwNjcsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTtcblxuXHR9XG5cblx0Ly8gUmVuZGVyIHRhcmdldHNcblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyXG5cdGZ1bmN0aW9uIHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXHRcdGNvbnN0IGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApO1xuXHRcdGNvbnN0IGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggdGV4dHVyZS5pbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSApO1xuXG5cdFx0aWYgKCB0ZXh0dXJlVGFyZ2V0ID09PSAzMjg3OSB8fCB0ZXh0dXJlVGFyZ2V0ID09PSAzNTg2NiApIHtcblxuXHRcdFx0c3RhdGUudGV4SW1hZ2UzRCggdGV4dHVyZVRhcmdldCwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0LCByZW5kZXJUYXJnZXQuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHN0YXRlLnRleEltYWdlMkQoIHRleHR1cmVUYXJnZXQsIDAsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCBhdHRhY2htZW50LCB0ZXh0dXJlVGFyZ2V0LCBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7XG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgbnVsbCApO1xuXG5cdH1cblxuXHQvLyBTZXR1cCBzdG9yYWdlIGZvciBpbnRlcm5hbCBkZXB0aC9zdGVuY2lsIGJ1ZmZlcnMgYW5kIGJpbmQgdG8gY29ycmVjdCBmcmFtZWJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7XG5cblx0XHRcdGxldCBnbEludGVybmFsRm9ybWF0ID0gMzMxODk7XG5cblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZSApIHtcblxuXHRcdFx0XHRjb25zdCBkZXB0aFRleHR1cmUgPSByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlO1xuXG5cdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlICYmIGRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0XHRcdGlmICggZGVwdGhUZXh0dXJlLnR5cGUgPT09IEZsb2F0VHlwZSApIHtcblxuXHRcdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDM2MDEyO1xuXG5cdFx0XHRcdFx0fSBlbHNlIGlmICggZGVwdGhUZXh0dXJlLnR5cGUgPT09IFVuc2lnbmVkSW50VHlwZSApIHtcblxuXHRcdFx0XHRcdFx0Z2xJbnRlcm5hbEZvcm1hdCA9IDMzMTkwO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzYwOTYsIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciAmJiByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIHtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgMzUwNTYsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdF9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgMzQwNDEsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKCAzNjE2MCwgMzMzMDYsIDM2MTYxLCByZW5kZXJidWZmZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblxuXHRcdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXHRcdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7XG5cdFx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblxuXHRcdFx0aWYgKCBpc011bHRpc2FtcGxlICkge1xuXG5cdFx0XHRcdGNvbnN0IHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0XHRfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgZ2xJbnRlcm5hbEZvcm1hdCwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoIDM2MTYxLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKVxuXHRmdW5jdGlvbiBzZXR1cERlcHRoVGV4dHVyZSggZnJhbWVidWZmZXIsIHJlbmRlclRhcmdldCApIHtcblxuXHRcdGNvbnN0IGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApO1xuXHRcdGlmICggaXNDdWJlICkgdGhyb3cgbmV3IEVycm9yKCAnRGVwdGggVGV4dHVyZSB3aXRoIGN1YmUgcmVuZGVyIHRhcmdldHMgaXMgbm90IHN1cHBvcnRlZCcgKTtcblxuXHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIGZyYW1lYnVmZmVyICk7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICYmIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUgKSApIHtcblxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCAncmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFRIUkVFLkRlcHRoVGV4dHVyZScgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwbG9hZCBhbiBlbXB0eSBkZXB0aCB0ZXh0dXJlIHdpdGggZnJhbWVidWZmZXIgc2l6ZVxuXHRcdGlmICggISBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlIHx8XG5cdFx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGggIT09IHJlbmRlclRhcmdldC53aWR0aCB8fFxuXHRcdFx0XHRyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS53aWR0aCA9IHJlbmRlclRhcmdldC53aWR0aDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gcmVuZGVyVGFyZ2V0LmhlaWdodDtcblx0XHRcdHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHRjb25zdCB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHtcblxuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzYwOTYsIDM1NTMsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHRfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCAzMzMwNiwgMzU1Mywgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gU2V0dXAgR0wgcmVzb3VyY2VzIGZvciBhIG5vbi10ZXh0dXJlIGRlcHRoIGJ1ZmZlclxuXHRmdW5jdGlvbiBzZXR1cERlcHRoUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHtcblxuXHRcdFx0aWYgKCBpc0N1YmUgKSB0aHJvdyBuZXcgRXJyb3IoICd0YXJnZXQuZGVwdGhUZXh0dXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ3ViZSByZW5kZXIgdGFyZ2V0cycgKTtcblxuXHRcdFx0c2V0dXBEZXB0aFRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gW107XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpO1xuXHRcdFx0XHRcdHNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApO1xuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblx0XHRcdFx0c2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBmYWxzZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBudWxsICk7XG5cblx0fVxuXG5cdC8vIFNldCB1cCBHTCByZXNvdXJjZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0XG5cdGZ1bmN0aW9uIHNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cblx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXHRcdGNvbnN0IHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTtcblxuXHRcdHJlbmRlclRhcmdldC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSApO1xuXG5cdFx0dGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgPSBfZ2wuY3JlYXRlVGV4dHVyZSgpO1xuXHRcdHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjtcblxuXHRcdGluZm8ubWVtb3J5LnRleHR1cmVzICsrO1xuXG5cdFx0Y29uc3QgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgPT09IHRydWUgKTtcblx0XHRjb25zdCBpc011bHRpc2FtcGxlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ID09PSB0cnVlICk7XG5cdFx0Y29uc3QgaXNSZW5kZXJUYXJnZXQzRCA9IHRleHR1cmUuaXNEYXRhVGV4dHVyZTNEIHx8IHRleHR1cmUuaXNEYXRhVGV4dHVyZTJEQXJyYXk7XG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSB8fCBpc1dlYkdMMjtcblxuXHRcdC8vIEhhbmRsZXMgV2ViR0wyIFJHQkZvcm1hdCBmYWxsYmFjayAtICMxODg1OFxuXG5cdFx0aWYgKCBpc1dlYkdMMiAmJiB0ZXh0dXJlLmZvcm1hdCA9PT0gUkdCRm9ybWF0ICYmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgfHwgdGV4dHVyZS50eXBlID09PSBIYWxmRmxvYXRUeXBlICkgKSB7XG5cblx0XHRcdHRleHR1cmUuZm9ybWF0ID0gUkdCQUZvcm1hdDtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogUmVuZGVyaW5nIHRvIHRleHR1cmVzIHdpdGggUkdCIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLiBVc2luZyBSR0JBIGZvcm1hdCBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdC8vIFNldHVwIGZyYW1lYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG5cblx0XHRcdGlmICggaXNNdWx0aXNhbXBsZSApIHtcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgPSBfZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcblx0XHRcdFx0XHRyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTtcblxuXHRcdFx0XHRcdF9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKTtcblx0XHRcdFx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKTtcblx0XHRcdFx0XHRjb25zdCBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIHRleHR1cmUuaW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUgKTtcblx0XHRcdFx0XHRjb25zdCBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7XG5cdFx0XHRcdFx0X2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTtcblx0XHRcdFx0XHRfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIDM2MTYwLCAzNjA2NCwgMzYxNjEsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyICk7XG5cdFx0XHRcdFx0X2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0XHRcdFx0cmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIgPSBfZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG5cdFx0XHRcdFx0XHRzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoUmVuZGVyYnVmZmVyLCByZW5kZXJUYXJnZXQsIHRydWUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIG51bGwgKTtcblxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU2V0dXAgY29sb3IgYnVmZmVyXG5cblx0XHRpZiAoIGlzQ3ViZSApIHtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApO1xuXHRcdFx0c2V0VGV4dHVyZVBhcmFtZXRlcnMoIDM0MDY3LCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgNjsgaSArKyApIHtcblxuXHRcdFx0XHRzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgMzQwNjkgKyBpICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlTWlwbWFwKCAzNDA2NywgdGV4dHVyZSwgcmVuZGVyVGFyZ2V0LndpZHRoLCByZW5kZXJUYXJnZXQuaGVpZ2h0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCBudWxsICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsZXQgZ2xUZXh0dXJlVHlwZSA9IDM1NTM7XG5cblx0XHRcdGlmICggaXNSZW5kZXJUYXJnZXQzRCApIHtcblxuXHRcdFx0XHQvLyBSZW5kZXIgdGFyZ2V0cyBjb250YWluaW5nIGxheWVycywgaS5lOiBUZXh0dXJlIDNEIGFuZCAyZCBhcnJheXNcblxuXHRcdFx0XHRpZiAoIGlzV2ViR0wyICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgaXNUZXh0dXJlM0QgPSB0ZXh0dXJlLmlzRGF0YVRleHR1cmUzRDtcblx0XHRcdFx0XHRnbFRleHR1cmVUeXBlID0gaXNUZXh0dXJlM0QgPyAzMjg3OSA6IDM1ODY2O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkgb25seSBzdXBwb3J0ZWQgd2l0aCBXZWJHTDIuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRzdGF0ZS5iaW5kVGV4dHVyZSggZ2xUZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTtcblx0XHRcdHNldFRleHR1cmVQYXJhbWV0ZXJzKCBnbFRleHR1cmVUeXBlLCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTtcblx0XHRcdHNldHVwRnJhbWVCdWZmZXJUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgZ2xUZXh0dXJlVHlwZSApO1xuXG5cdFx0XHRpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7XG5cblx0XHRcdFx0Z2VuZXJhdGVNaXBtYXAoIDM1NTMsIHRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCAzNTUzLCBudWxsICk7XG5cblx0XHR9XG5cblx0XHQvLyBTZXR1cCBkZXB0aCBhbmQgc3RlbmNpbCBidWZmZXJzXG5cblx0XHRpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHtcblxuXHRcdFx0c2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlO1xuXG5cdFx0Y29uc3Qgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSB8fCBpc1dlYkdMMjtcblxuXHRcdGlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCB0ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSApIHtcblxuXHRcdFx0Y29uc3QgdGFyZ2V0ID0gcmVuZGVyVGFyZ2V0LmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ID8gMzQwNjcgOiAzNTUzO1xuXHRcdFx0Y29uc3Qgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTtcblxuXHRcdFx0c3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgd2ViZ2xUZXh0dXJlICk7XG5cdFx0XHRnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTtcblx0XHRcdHN0YXRlLmJpbmRUZXh0dXJlKCB0YXJnZXQsIG51bGwgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApIHtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHtcblxuXHRcdFx0XHRjb25zdCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYwMDgsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7XG5cdFx0XHRcdHN0YXRlLmJpbmRGcmFtZWJ1ZmZlciggMzYwMDksIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyICk7XG5cblx0XHRcdFx0Y29uc3Qgd2lkdGggPSByZW5kZXJUYXJnZXQud2lkdGg7XG5cdFx0XHRcdGNvbnN0IGhlaWdodCA9IHJlbmRlclRhcmdldC5oZWlnaHQ7XG5cdFx0XHRcdGxldCBtYXNrID0gMTYzODQ7XG5cblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgKSBtYXNrIHw9IDI1Njtcblx0XHRcdFx0aWYgKCByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIG1hc2sgfD0gMTAyNDtcblxuXHRcdFx0XHRfZ2wuYmxpdEZyYW1lYnVmZmVyKCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtYXNrLCA5NzI4ICk7XG5cblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTsgLy8gc2VlICMxODkwNVxuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuICggaXNXZWJHTDIgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApID9cblx0XHRcdE1hdGgubWluKCBtYXhTYW1wbGVzLCByZW5kZXJUYXJnZXQuc2FtcGxlcyApIDogMDtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlVmlkZW9UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0Y29uc3QgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTtcblxuXHRcdC8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZVxuXG5cdFx0aWYgKCBfdmlkZW9UZXh0dXJlcy5nZXQoIHRleHR1cmUgKSAhPT0gZnJhbWUgKSB7XG5cblx0XHRcdF92aWRlb1RleHR1cmVzLnNldCggdGV4dHVyZSwgZnJhbWUgKTtcblx0XHRcdHRleHR1cmUudXBkYXRlKCk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cblx0bGV0IHdhcm5lZFRleHR1cmUyRCA9IGZhbHNlO1xuXHRsZXQgd2FybmVkVGV4dHVyZUN1YmUgPSBmYWxzZTtcblxuXHRmdW5jdGlvbiBzYWZlU2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICkge1xuXG5cdFx0aWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0aWYgKCB3YXJuZWRUZXh0dXJlMkQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRDogZG9uXFwndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLicgKTtcblx0XHRcdFx0d2FybmVkVGV4dHVyZTJEID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlO1xuXG5cdFx0fVxuXG5cdFx0c2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNhZmVTZXRUZXh0dXJlQ3ViZSggdGV4dHVyZSwgc2xvdCApIHtcblxuXHRcdGlmICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzV2ViR0xDdWJlUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRpZiAoIHdhcm5lZFRleHR1cmVDdWJlID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZTogZG9uXFwndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuJyApO1xuXHRcdFx0XHR3YXJuZWRUZXh0dXJlQ3ViZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0dGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTtcblxuXHRcdH1cblxuXG5cdFx0c2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKTtcblxuXHR9XG5cblx0Ly9cblxuXHR0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0O1xuXHR0aGlzLnJlc2V0VGV4dHVyZVVuaXRzID0gcmVzZXRUZXh0dXJlVW5pdHM7XG5cblx0dGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2V0VGV4dHVyZTJEQXJyYXkgPSBzZXRUZXh0dXJlMkRBcnJheTtcblx0dGhpcy5zZXRUZXh0dXJlM0QgPSBzZXRUZXh0dXJlM0Q7XG5cdHRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTtcblx0dGhpcy5zZXR1cFJlbmRlclRhcmdldCA9IHNldHVwUmVuZGVyVGFyZ2V0O1xuXHR0aGlzLnVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCA9IHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcDtcblx0dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCA9IHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0O1xuXG5cdHRoaXMuc2FmZVNldFRleHR1cmUyRCA9IHNhZmVTZXRUZXh0dXJlMkQ7XG5cdHRoaXMuc2FmZVNldFRleHR1cmVDdWJlID0gc2FmZVNldFRleHR1cmVDdWJlO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMVXRpbHMoIGdsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKSB7XG5cblx0Y29uc3QgaXNXZWJHTDIgPSBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7XG5cblx0ZnVuY3Rpb24gY29udmVydCggcCApIHtcblxuXHRcdGxldCBleHRlbnNpb247XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkQnl0ZVR5cGUgKSByZXR1cm4gNTEyMTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiAzMjgxOTtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSApIHJldHVybiAzMjgyMDtcblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ1NjVUeXBlICkgcmV0dXJuIDMzNjM1O1xuXG5cdFx0aWYgKCBwID09PSBCeXRlVHlwZSApIHJldHVybiA1MTIwO1xuXHRcdGlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIDUxMjI7XG5cdFx0aWYgKCBwID09PSBVbnNpZ25lZFNob3J0VHlwZSApIHJldHVybiA1MTIzO1xuXHRcdGlmICggcCA9PT0gSW50VHlwZSApIHJldHVybiA1MTI0O1xuXHRcdGlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIDUxMjU7XG5cdFx0aWYgKCBwID09PSBGbG9hdFR5cGUgKSByZXR1cm4gNTEyNjtcblxuXHRcdGlmICggcCA9PT0gSGFsZkZsb2F0VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiA1MTMxO1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybiBleHRlbnNpb24uSEFMRl9GTE9BVF9PRVM7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gQWxwaGFGb3JtYXQgKSByZXR1cm4gNjQwNjtcblx0XHRpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiA2NDA3O1xuXHRcdGlmICggcCA9PT0gUkdCQUZvcm1hdCApIHJldHVybiA2NDA4O1xuXHRcdGlmICggcCA9PT0gTHVtaW5hbmNlRm9ybWF0ICkgcmV0dXJuIDY0MDk7XG5cdFx0aWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiA2NDEwO1xuXHRcdGlmICggcCA9PT0gRGVwdGhGb3JtYXQgKSByZXR1cm4gNjQwMjtcblx0XHRpZiAoIHAgPT09IERlcHRoU3RlbmNpbEZvcm1hdCApIHJldHVybiAzNDA0MTtcblx0XHRpZiAoIHAgPT09IFJlZEZvcm1hdCApIHJldHVybiA2NDAzO1xuXG5cdFx0Ly8gV2ViR0wyIGZvcm1hdHMuXG5cblx0XHRpZiAoIHAgPT09IFJlZEludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDQ7XG5cdFx0aWYgKCBwID09PSBSR0Zvcm1hdCApIHJldHVybiAzMzMxOTtcblx0XHRpZiAoIHAgPT09IFJHSW50ZWdlckZvcm1hdCApIHJldHVybiAzMzMyMDtcblx0XHRpZiAoIHAgPT09IFJHQkludGVnZXJGb3JtYXQgKSByZXR1cm4gMzYyNDg7XG5cdFx0aWYgKCBwID09PSBSR0JBSW50ZWdlckZvcm1hdCApIHJldHVybiAzNjI0OTtcblxuXHRcdGlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIHAgPT09IFJHQl9TM1RDX0RYVDFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUMV9FWFQ7XG5cdFx0XHRcdGlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTtcblxuXHRcdFx0aWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfMkJQUFYxX0lNRztcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9QVlJUQ180QlBQVjFfSU1HO1xuXHRcdFx0XHRpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzFfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMxJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX0VUQzFfV0VCR0w7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0IHx8IHAgPT09IFJHQkFfRVRDMl9FQUNfRm9ybWF0ICkge1xuXG5cdFx0XHRleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9ldGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGlmICggcCA9PT0gUkdCX0VUQzJfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQjhfRVRDMjtcblx0XHRcdFx0aWYgKCBwID09PSBSR0JBX0VUQzJfRUFDX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBOF9FVEMyX0VBQztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBwID09PSBSR0JBX0FTVENfNHg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfNXg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzh4NV9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFJHQkFfQVNUQ184eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gUkdCQV9BU1RDXzEweDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4MTBfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ18xMngxMl9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfNXg0X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzZ4Nl9Gb3JtYXQgfHwgcCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg1X0Zvcm1hdCB8fFxuXHRcdFx0cCA9PT0gU1JHQjhfQUxQSEE4X0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0IHx8IHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0IHx8XG5cdFx0XHRwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHg4X0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQgfHxcblx0XHRcdHAgPT09IFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBTUkdCOF9BTFBIQThfQVNUQ18xMngxMl9Gb3JtYXQgKSB7XG5cblx0XHRcdGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7XG5cblx0XHRcdGlmICggZXh0ZW5zaW9uICE9PSBudWxsICkge1xuXG5cdFx0XHRcdC8vIFRPRE8gQ29tcGxldGU/XG5cblx0XHRcdFx0cmV0dXJuIHA7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcCA9PT0gUkdCQV9CUFRDX0Zvcm1hdCApIHtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9icHRjJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHQvLyBUT0RPIENvbXBsZXRlP1xuXG5cdFx0XHRcdHJldHVybiBwO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHAgPT09IFVuc2lnbmVkSW50MjQ4VHlwZSApIHtcblxuXHRcdFx0aWYgKCBpc1dlYkdMMiApIHJldHVybiAzNDA0MjtcblxuXHRcdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApO1xuXG5cdFx0XHRpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRyZXR1cm4gZXh0ZW5zaW9uLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTtcblxufVxuXG5jbGFzcyBBcnJheUNhbWVyYSBleHRlbmRzIFBlcnNwZWN0aXZlQ2FtZXJhIHtcblxuXHRjb25zdHJ1Y3RvciggYXJyYXkgPSBbXSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLmNhbWVyYXMgPSBhcnJheTtcblxuXHR9XG5cbn1cblxuQXJyYXlDYW1lcmEucHJvdG90eXBlLmlzQXJyYXlDYW1lcmEgPSB0cnVlO1xuXG5jbGFzcyBHcm91cCBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnR3JvdXAnO1xuXG5cdH1cblxufVxuXG5Hcm91cC5wcm90b3R5cGUuaXNHcm91cCA9IHRydWU7XG5cbmZ1bmN0aW9uIFdlYlhSQ29udHJvbGxlcigpIHtcblxuXHR0aGlzLl90YXJnZXRSYXkgPSBudWxsO1xuXHR0aGlzLl9ncmlwID0gbnVsbDtcblx0dGhpcy5faGFuZCA9IG51bGw7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggV2ViWFJDb250cm9sbGVyLnByb3RvdHlwZSwge1xuXG5cdGNvbnN0cnVjdG9yOiBXZWJYUkNvbnRyb2xsZXIsXG5cblx0Z2V0SGFuZFNwYWNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2hhbmQgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2hhbmQgPSBuZXcgR3JvdXAoKTtcblx0XHRcdHRoaXMuX2hhbmQubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5faGFuZC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHRcdHRoaXMuX2hhbmQuam9pbnRzID0ge307XG5cdFx0XHR0aGlzLl9oYW5kLmlucHV0U3RhdGUgPSB7IHBpbmNoaW5nOiBmYWxzZSB9O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2hhbmQ7XG5cblx0fSxcblxuXHRnZXRUYXJnZXRSYXlTcGFjZTogZnVuY3Rpb24gKCkge1xuXG5cdFx0aWYgKCB0aGlzLl90YXJnZXRSYXkgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX3RhcmdldFJheSA9IG5ldyBHcm91cCgpO1xuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdHRoaXMuX3RhcmdldFJheS52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fdGFyZ2V0UmF5O1xuXG5cdH0sXG5cblx0Z2V0R3JpcFNwYWNlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2dyaXAgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2dyaXAgPSBuZXcgR3JvdXAoKTtcblx0XHRcdHRoaXMuX2dyaXAubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fZ3JpcDtcblxuXHR9LFxuXG5cdGRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LmRpc3BhdGNoRXZlbnQoIGV2ZW50ICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX2dyaXAgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2dyaXAuZGlzcGF0Y2hFdmVudCggZXZlbnQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5faGFuZCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5faGFuZC5kaXNwYXRjaEV2ZW50KCBldmVudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRkaXNjb25uZWN0OiBmdW5jdGlvbiAoIGlucHV0U291cmNlICkge1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cblx0XHRpZiAoIHRoaXMuX3RhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGFyZ2V0UmF5LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5fZ3JpcCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fZ3JpcC52aXNpYmxlID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuX2hhbmQgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2hhbmQudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR1cGRhdGU6IGZ1bmN0aW9uICggaW5wdXRTb3VyY2UsIGZyYW1lLCByZWZlcmVuY2VTcGFjZSApIHtcblxuXHRcdGxldCBpbnB1dFBvc2UgPSBudWxsO1xuXHRcdGxldCBncmlwUG9zZSA9IG51bGw7XG5cdFx0bGV0IGhhbmRQb3NlID0gbnVsbDtcblxuXHRcdGNvbnN0IHRhcmdldFJheSA9IHRoaXMuX3RhcmdldFJheTtcblx0XHRjb25zdCBncmlwID0gdGhpcy5fZ3JpcDtcblx0XHRjb25zdCBoYW5kID0gdGhpcy5faGFuZDtcblxuXHRcdGlmICggaW5wdXRTb3VyY2UgJiYgZnJhbWUuc2Vzc2lvbi52aXNpYmlsaXR5U3RhdGUgIT09ICd2aXNpYmxlLWJsdXJyZWQnICkge1xuXG5cdFx0XHRpZiAoIHRhcmdldFJheSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRpbnB1dFBvc2UgPSBmcmFtZS5nZXRQb3NlKCBpbnB1dFNvdXJjZS50YXJnZXRSYXlTcGFjZSwgcmVmZXJlbmNlU3BhY2UgKTtcblxuXHRcdFx0XHRpZiAoIGlucHV0UG9zZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZnJvbUFycmF5KCBpbnB1dFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRcdHRhcmdldFJheS5tYXRyaXguZGVjb21wb3NlKCB0YXJnZXRSYXkucG9zaXRpb24sIHRhcmdldFJheS5yb3RhdGlvbiwgdGFyZ2V0UmF5LnNjYWxlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFuZCAmJiBpbnB1dFNvdXJjZS5oYW5kICkge1xuXG5cdFx0XHRcdGhhbmRQb3NlID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3IgKCBjb25zdCBpbnB1dGpvaW50IG9mIGlucHV0U291cmNlLmhhbmQudmFsdWVzKCkgKSB7XG5cblx0XHRcdFx0XHQvLyBVcGRhdGUgdGhlIGpvaW50cyBncm91cHMgd2l0aCB0aGUgWFJKb2ludCBwb3Nlc1xuXHRcdFx0XHRcdGNvbnN0IGpvaW50UG9zZSA9IGZyYW1lLmdldEpvaW50UG9zZSggaW5wdXRqb2ludCwgcmVmZXJlbmNlU3BhY2UgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZC5qb2ludHNbIGlucHV0am9pbnQuam9pbnROYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gVGhlIHRyYW5zZm9ybSBvZiB0aGlzIGpvaW50IHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBqb2ludCBwb3NlIG9uIGVhY2ggZnJhbWVcblx0XHRcdFx0XHRcdGNvbnN0IGpvaW50ID0gbmV3IEdyb3VwKCk7XG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRqb2ludC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXSA9IGpvaW50O1xuXHRcdFx0XHRcdFx0Ly8gPz9cblx0XHRcdFx0XHRcdGhhbmQuYWRkKCBqb2ludCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3Qgam9pbnQgPSBoYW5kLmpvaW50c1sgaW5wdXRqb2ludC5qb2ludE5hbWUgXTtcblxuXHRcdFx0XHRcdGlmICggam9pbnRQb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHRqb2ludC5tYXRyaXguZnJvbUFycmF5KCBqb2ludFBvc2UudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRcdFx0am9pbnQubWF0cml4LmRlY29tcG9zZSggam9pbnQucG9zaXRpb24sIGpvaW50LnJvdGF0aW9uLCBqb2ludC5zY2FsZSApO1xuXHRcdFx0XHRcdFx0am9pbnQuam9pbnRSYWRpdXMgPSBqb2ludFBvc2UucmFkaXVzO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0am9pbnQudmlzaWJsZSA9IGpvaW50UG9zZSAhPT0gbnVsbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3VzdG9tIGV2ZW50c1xuXG5cdFx0XHRcdC8vIENoZWNrIHBpbmNoelxuXHRcdFx0XHRjb25zdCBpbmRleFRpcCA9IGhhbmQuam9pbnRzWyAnaW5kZXgtZmluZ2VyLXRpcCcgXTtcblx0XHRcdFx0Y29uc3QgdGh1bWJUaXAgPSBoYW5kLmpvaW50c1sgJ3RodW1iLXRpcCcgXTtcblx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSBpbmRleFRpcC5wb3NpdGlvbi5kaXN0YW5jZVRvKCB0aHVtYlRpcC5wb3NpdGlvbiApO1xuXG5cdFx0XHRcdGNvbnN0IGRpc3RhbmNlVG9QaW5jaCA9IDAuMDI7XG5cdFx0XHRcdGNvbnN0IHRocmVzaG9sZCA9IDAuMDA1O1xuXG5cdFx0XHRcdGlmICggaGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nICYmIGRpc3RhbmNlID4gZGlzdGFuY2VUb1BpbmNoICsgdGhyZXNob2xkICkge1xuXG5cdFx0XHRcdFx0aGFuZC5pbnB1dFN0YXRlLnBpbmNoaW5nID0gZmFsc2U7XG5cdFx0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAncGluY2hlbmQnLFxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9IGVsc2UgaWYgKCAhIGhhbmQuaW5wdXRTdGF0ZS5waW5jaGluZyAmJiBkaXN0YW5jZSA8PSBkaXN0YW5jZVRvUGluY2ggLSB0aHJlc2hvbGQgKSB7XG5cblx0XHRcdFx0XHRoYW5kLmlucHV0U3RhdGUucGluY2hpbmcgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ3BpbmNoc3RhcnQnLFxuXHRcdFx0XHRcdFx0aGFuZGVkbmVzczogaW5wdXRTb3VyY2UuaGFuZGVkbmVzcyxcblx0XHRcdFx0XHRcdHRhcmdldDogdGhpc1xuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aWYgKCBncmlwICE9PSBudWxsICYmIGlucHV0U291cmNlLmdyaXBTcGFjZSApIHtcblxuXHRcdFx0XHRcdGdyaXBQb3NlID0gZnJhbWUuZ2V0UG9zZSggaW5wdXRTb3VyY2UuZ3JpcFNwYWNlLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0XHRcdFx0aWYgKCBncmlwUG9zZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRcdFx0Z3JpcC5tYXRyaXguZnJvbUFycmF5KCBncmlwUG9zZS50cmFuc2Zvcm0ubWF0cml4ICk7XG5cdFx0XHRcdFx0XHRncmlwLm1hdHJpeC5kZWNvbXBvc2UoIGdyaXAucG9zaXRpb24sIGdyaXAucm90YXRpb24sIGdyaXAuc2NhbGUgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGFyZ2V0UmF5ICE9PSBudWxsICkge1xuXG5cdFx0XHR0YXJnZXRSYXkudmlzaWJsZSA9ICggaW5wdXRQb3NlICE9PSBudWxsICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGdyaXAgIT09IG51bGwgKSB7XG5cblx0XHRcdGdyaXAudmlzaWJsZSA9ICggZ3JpcFBvc2UgIT09IG51bGwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaGFuZCAhPT0gbnVsbCApIHtcblxuXHRcdFx0aGFuZC52aXNpYmxlID0gKCBoYW5kUG9zZSAhPT0gbnVsbCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmZ1bmN0aW9uIFdlYlhSTWFuYWdlciggcmVuZGVyZXIsIGdsICkge1xuXG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblx0Y29uc3Qgc3RhdGUgPSByZW5kZXJlci5zdGF0ZTtcblxuXHRsZXQgc2Vzc2lvbiA9IG51bGw7XG5cblx0bGV0IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSAxLjA7XG5cblx0bGV0IHJlZmVyZW5jZVNwYWNlID0gbnVsbDtcblx0bGV0IHJlZmVyZW5jZVNwYWNlVHlwZSA9ICdsb2NhbC1mbG9vcic7XG5cblx0bGV0IHBvc2UgPSBudWxsO1xuXG5cdGNvbnN0IGNvbnRyb2xsZXJzID0gW107XG5cdGNvbnN0IGlucHV0U291cmNlc01hcCA9IG5ldyBNYXAoKTtcblxuXHQvL1xuXG5cdGNvbnN0IGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYUwudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGNvbnN0IGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTtcblx0Y2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7XG5cdGNhbWVyYVIudmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXG5cdGNvbnN0IGNhbWVyYXMgPSBbIGNhbWVyYUwsIGNhbWVyYVIgXTtcblxuXHRjb25zdCBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSgpO1xuXHRjYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAxICk7XG5cdGNhbWVyYVZSLmxheWVycy5lbmFibGUoIDIgKTtcblxuXHRsZXQgX2N1cnJlbnREZXB0aE5lYXIgPSBudWxsO1xuXHRsZXQgX2N1cnJlbnREZXB0aEZhciA9IG51bGw7XG5cblx0Ly9cblxuXHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHR0aGlzLmlzUHJlc2VudGluZyA9IGZhbHNlO1xuXG5cdHRoaXMuZ2V0Q29udHJvbGxlciA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRUYXJnZXRSYXlTcGFjZSgpO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDb250cm9sbGVyR3JpcCA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRHcmlwU3BhY2UoKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0SGFuZCA9IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRsZXQgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpbmRleCBdO1xuXG5cdFx0aWYgKCBjb250cm9sbGVyID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIgPSBuZXcgV2ViWFJDb250cm9sbGVyKCk7XG5cdFx0XHRjb250cm9sbGVyc1sgaW5kZXggXSA9IGNvbnRyb2xsZXI7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gY29udHJvbGxlci5nZXRIYW5kU3BhY2UoKTtcblxuXHR9O1xuXG5cdC8vXG5cblx0ZnVuY3Rpb24gb25TZXNzaW9uRXZlbnQoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgY29udHJvbGxlciA9IGlucHV0U291cmNlc01hcC5nZXQoIGV2ZW50LmlucHV0U291cmNlICk7XG5cblx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdGNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiBldmVudC50eXBlLCBkYXRhOiBldmVudC5pbnB1dFNvdXJjZSB9ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uU2Vzc2lvbkVuZCgpIHtcblxuXHRcdGlucHV0U291cmNlc01hcC5mb3JFYWNoKCBmdW5jdGlvbiAoIGNvbnRyb2xsZXIsIGlucHV0U291cmNlICkge1xuXG5cdFx0XHRjb250cm9sbGVyLmRpc2Nvbm5lY3QoIGlucHV0U291cmNlICk7XG5cblx0XHR9ICk7XG5cblx0XHRpbnB1dFNvdXJjZXNNYXAuY2xlYXIoKTtcblxuXHRcdF9jdXJyZW50RGVwdGhOZWFyID0gbnVsbDtcblx0XHRfY3VycmVudERlcHRoRmFyID0gbnVsbDtcblxuXHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIvcmVuZGVyaW5nIHN0YXRlXG5cblx0XHRzdGF0ZS5iaW5kWFJGcmFtZWJ1ZmZlciggbnVsbCApO1xuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCkgKTtcblxuXHRcdC8vXG5cblx0XHRhbmltYXRpb24uc3RvcCgpO1xuXG5cdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gZmFsc2U7XG5cblx0XHRzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uZW5kJyB9ICk7XG5cblx0fVxuXG5cdHRoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3RvciA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gdmFsdWU7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIGZyYW1lYnVmZmVyIHNjYWxlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0cmVmZXJlbmNlU3BhY2VUeXBlID0gdmFsdWU7XG5cblx0XHRpZiAoIHNjb3BlLmlzUHJlc2VudGluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBDYW5ub3QgY2hhbmdlIHJlZmVyZW5jZSBzcGFjZSB0eXBlIHdoaWxlIHByZXNlbnRpbmcuJyApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5nZXRSZWZlcmVuY2VTcGFjZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiByZWZlcmVuY2VTcGFjZTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBzZXNzaW9uO1xuXG5cdH07XG5cblx0dGhpcy5zZXRTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdHNlc3Npb24gPSB2YWx1ZTtcblxuXHRcdGlmICggc2Vzc2lvbiAhPT0gbnVsbCApIHtcblxuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnc2VsZWN0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdHN0YXJ0Jywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdGVuZCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplJywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NxdWVlemVzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7XG5cdFx0XHRzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzcXVlZXplZW5kJywgb25TZXNzaW9uRXZlbnQgKTtcblx0XHRcdHNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ2VuZCcsIG9uU2Vzc2lvbkVuZCApO1xuXHRcdFx0c2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXRzb3VyY2VzY2hhbmdlJywgb25JbnB1dFNvdXJjZXNDaGFuZ2UgKTtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdsLmdldENvbnRleHRBdHRyaWJ1dGVzKCk7XG5cblx0XHRcdGlmICggYXR0cmlidXRlcy54ckNvbXBhdGlibGUgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0YXdhaXQgZ2wubWFrZVhSQ29tcGF0aWJsZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGxheWVySW5pdCA9IHtcblx0XHRcdFx0YW50aWFsaWFzOiBhdHRyaWJ1dGVzLmFudGlhbGlhcyxcblx0XHRcdFx0YWxwaGE6IGF0dHJpYnV0ZXMuYWxwaGEsXG5cdFx0XHRcdGRlcHRoOiBhdHRyaWJ1dGVzLmRlcHRoLFxuXHRcdFx0XHRzdGVuY2lsOiBhdHRyaWJ1dGVzLnN0ZW5jaWwsXG5cdFx0XHRcdGZyYW1lYnVmZmVyU2NhbGVGYWN0b3I6IGZyYW1lYnVmZmVyU2NhbGVGYWN0b3Jcblx0XHRcdH07XG5cblx0XHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuXHRcdFx0Y29uc3QgYmFzZUxheWVyID0gbmV3IFhSV2ViR0xMYXllciggc2Vzc2lvbiwgZ2wsIGxheWVySW5pdCApO1xuXG5cdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7IGJhc2VMYXllcjogYmFzZUxheWVyIH0gKTtcblxuXHRcdFx0cmVmZXJlbmNlU3BhY2UgPSBhd2FpdCBzZXNzaW9uLnJlcXVlc3RSZWZlcmVuY2VTcGFjZSggcmVmZXJlbmNlU3BhY2VUeXBlICk7XG5cblx0XHRcdGFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZXNzaW9uICk7XG5cdFx0XHRhbmltYXRpb24uc3RhcnQoKTtcblxuXHRcdFx0c2NvcGUuaXNQcmVzZW50aW5nID0gdHJ1ZTtcblxuXHRcdFx0c2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbnN0YXJ0JyB9ICk7XG5cblx0XHR9XG5cblx0fTtcblxuXHRmdW5jdGlvbiBvbklucHV0U291cmNlc0NoYW5nZSggZXZlbnQgKSB7XG5cblx0XHRjb25zdCBpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlcztcblxuXHRcdC8vIEFzc2lnbiBpbnB1dFNvdXJjZXMgdG8gYXZhaWxhYmxlIGNvbnRyb2xsZXJzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjb250cm9sbGVycy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlucHV0U291cmNlc01hcC5zZXQoIGlucHV0U291cmNlc1sgaSBdLCBjb250cm9sbGVyc1sgaSBdICk7XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgZGlzY29ubmVjdGVkXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5yZW1vdmVkLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgaW5wdXRTb3VyY2UgPSBldmVudC5yZW1vdmVkWyBpIF07XG5cdFx0XHRjb25zdCBjb250cm9sbGVyID0gaW5wdXRTb3VyY2VzTWFwLmdldCggaW5wdXRTb3VyY2UgKTtcblxuXHRcdFx0aWYgKCBjb250cm9sbGVyICkge1xuXG5cdFx0XHRcdGNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzY29ubmVjdGVkJywgZGF0YTogaW5wdXRTb3VyY2UgfSApO1xuXHRcdFx0XHRpbnB1dFNvdXJjZXNNYXAuZGVsZXRlKCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBOb3RpZnkgY29ubmVjdGVkXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBldmVudC5hZGRlZC5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGlucHV0U291cmNlID0gZXZlbnQuYWRkZWRbIGkgXTtcblx0XHRcdGNvbnN0IGNvbnRyb2xsZXIgPSBpbnB1dFNvdXJjZXNNYXAuZ2V0KCBpbnB1dFNvdXJjZSApO1xuXG5cdFx0XHRpZiAoIGNvbnRyb2xsZXIgKSB7XG5cblx0XHRcdFx0Y29udHJvbGxlci5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdjb25uZWN0ZWQnLCBkYXRhOiBpbnB1dFNvdXJjZSB9ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly9cblxuXHRjb25zdCBjYW1lcmFMUG9zID0gbmV3IFZlY3RvcjMoKTtcblx0Y29uc3QgY2FtZXJhUlBvcyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0LyoqXG5cdCAqIEFzc3VtZXMgMiBjYW1lcmFzIHRoYXQgYXJlIHBhcmFsbGVsIGFuZCBzaGFyZSBhbiBYLWF4aXMsIGFuZCB0aGF0XG5cdCAqIHRoZSBjYW1lcmFzJyBwcm9qZWN0aW9uIGFuZCB3b3JsZCBtYXRyaWNlcyBoYXZlIGFscmVhZHkgYmVlbiBzZXQuXG5cdCAqIEFuZCB0aGF0IG5lYXIgYW5kIGZhciBwbGFuZXMgYXJlIGlkZW50aWNhbCBmb3IgYm90aCBjYW1lcmFzLlxuXHQgKiBWaXN1YWxpemF0aW9uIG9mIHRoaXMgdGVjaG5pcXVlOiBodHRwczovL2NvbXB1dGVyZ3JhcGhpY3Muc3RhY2tleGNoYW5nZS5jb20vYS80NzY1XG5cdCAqL1xuXHRmdW5jdGlvbiBzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmEsIGNhbWVyYUwsIGNhbWVyYVIgKSB7XG5cblx0XHRjYW1lcmFMUG9zLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhTC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYVJQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFSLm1hdHJpeFdvcmxkICk7XG5cblx0XHRjb25zdCBpcGQgPSBjYW1lcmFMUG9zLmRpc3RhbmNlVG8oIGNhbWVyYVJQb3MgKTtcblxuXHRcdGNvbnN0IHByb2pMID0gY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xuXHRcdGNvbnN0IHByb2pSID0gY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzO1xuXG5cdFx0Ly8gVlIgc3lzdGVtcyB3aWxsIGhhdmUgaWRlbnRpY2FsIGZhciBhbmQgbmVhciBwbGFuZXMsIGFuZFxuXHRcdC8vIG1vc3QgbGlrZWx5IGlkZW50aWNhbCB0b3AgYW5kIGJvdHRvbSBmcnVzdHVtIGV4dGVudHMuXG5cdFx0Ly8gVXNlIHRoZSBsZWZ0IGNhbWVyYSBmb3IgdGhlc2UgdmFsdWVzLlxuXHRcdGNvbnN0IG5lYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gLSAxICk7XG5cdFx0Y29uc3QgZmFyID0gcHJvakxbIDE0IF0gLyAoIHByb2pMWyAxMCBdICsgMSApO1xuXHRcdGNvbnN0IHRvcEZvdiA9ICggcHJvakxbIDkgXSArIDEgKSAvIHByb2pMWyA1IF07XG5cdFx0Y29uc3QgYm90dG9tRm92ID0gKCBwcm9qTFsgOSBdIC0gMSApIC8gcHJvakxbIDUgXTtcblxuXHRcdGNvbnN0IGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdO1xuXHRcdGNvbnN0IHJpZ2h0Rm92ID0gKCBwcm9qUlsgOCBdICsgMSApIC8gcHJvalJbIDAgXTtcblx0XHRjb25zdCBsZWZ0ID0gbmVhciAqIGxlZnRGb3Y7XG5cdFx0Y29uc3QgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7XG5cblx0XHQvLyBDYWxjdWxhdGUgdGhlIG5ldyBjYW1lcmEncyBwb3NpdGlvbiBvZmZzZXQgZnJvbSB0aGVcblx0XHQvLyBsZWZ0IGNhbWVyYS4geE9mZnNldCBzaG91bGQgYmUgcm91Z2hseSBoYWxmIGBpcGRgLlxuXHRcdGNvbnN0IHpPZmZzZXQgPSBpcGQgLyAoIC0gbGVmdEZvdiArIHJpZ2h0Rm92ICk7XG5cdFx0Y29uc3QgeE9mZnNldCA9IHpPZmZzZXQgKiAtIGxlZnRGb3Y7XG5cblx0XHQvLyBUT0RPOiBCZXR0ZXIgd2F5IHRvIGFwcGx5IHRoaXMgb2Zmc2V0P1xuXHRcdGNhbWVyYUwubWF0cml4V29ybGQuZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTtcblx0XHRjYW1lcmEudHJhbnNsYXRlWCggeE9mZnNldCApO1xuXHRcdGNhbWVyYS50cmFuc2xhdGVaKCB6T2Zmc2V0ICk7XG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApO1xuXHRcdGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cblx0XHQvLyBGaW5kIHRoZSB1bmlvbiBvZiB0aGUgZnJ1c3R1bSB2YWx1ZXMgb2YgdGhlIGNhbWVyYXMgYW5kIHNjYWxlXG5cdFx0Ly8gdGhlIHZhbHVlcyBzbyB0aGF0IHRoZSBuZWFyIHBsYW5lJ3MgcG9zaXRpb24gZG9lcyBub3QgY2hhbmdlIGluIHdvcmxkIHNwYWNlLFxuXHRcdC8vIGFsdGhvdWdoIG11c3Qgbm93IGJlIHJlbGF0aXZlIHRvIHRoZSBuZXcgdW5pb24gY2FtZXJhLlxuXHRcdGNvbnN0IG5lYXIyID0gbmVhciArIHpPZmZzZXQ7XG5cdFx0Y29uc3QgZmFyMiA9IGZhciArIHpPZmZzZXQ7XG5cdFx0Y29uc3QgbGVmdDIgPSBsZWZ0IC0geE9mZnNldDtcblx0XHRjb25zdCByaWdodDIgPSByaWdodCArICggaXBkIC0geE9mZnNldCApO1xuXHRcdGNvbnN0IHRvcDIgPSB0b3BGb3YgKiBmYXIgLyBmYXIyICogbmVhcjI7XG5cdFx0Y29uc3QgYm90dG9tMiA9IGJvdHRvbUZvdiAqIGZhciAvIGZhcjIgKiBuZWFyMjtcblxuXHRcdGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZSggbGVmdDIsIHJpZ2h0MiwgdG9wMiwgYm90dG9tMiwgbmVhcjIsIGZhcjIgKTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gdXBkYXRlQ2FtZXJhKCBjYW1lcmEsIHBhcmVudCApIHtcblxuXHRcdGlmICggcGFyZW50ID09PSBudWxsICkge1xuXG5cdFx0XHRjYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHBhcmVudC5tYXRyaXhXb3JsZCwgY2FtZXJhLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHR9XG5cblx0dGhpcy5nZXRDYW1lcmEgPSBmdW5jdGlvbiAoIGNhbWVyYSApIHtcblxuXHRcdGNhbWVyYVZSLm5lYXIgPSBjYW1lcmFSLm5lYXIgPSBjYW1lcmFMLm5lYXIgPSBjYW1lcmEubmVhcjtcblx0XHRjYW1lcmFWUi5mYXIgPSBjYW1lcmFSLmZhciA9IGNhbWVyYUwuZmFyID0gY2FtZXJhLmZhcjtcblxuXHRcdGlmICggX2N1cnJlbnREZXB0aE5lYXIgIT09IGNhbWVyYVZSLm5lYXIgfHwgX2N1cnJlbnREZXB0aEZhciAhPT0gY2FtZXJhVlIuZmFyICkge1xuXG5cdFx0XHQvLyBOb3RlIHRoYXQgdGhlIG5ldyByZW5kZXJTdGF0ZSB3b24ndCBhcHBseSB1bnRpbCB0aGUgbmV4dCBmcmFtZS4gU2VlICMxODMyMFxuXG5cdFx0XHRzZXNzaW9uLnVwZGF0ZVJlbmRlclN0YXRlKCB7XG5cdFx0XHRcdGRlcHRoTmVhcjogY2FtZXJhVlIubmVhcixcblx0XHRcdFx0ZGVwdGhGYXI6IGNhbWVyYVZSLmZhclxuXHRcdFx0fSApO1xuXG5cdFx0XHRfY3VycmVudERlcHRoTmVhciA9IGNhbWVyYVZSLm5lYXI7XG5cdFx0XHRfY3VycmVudERlcHRoRmFyID0gY2FtZXJhVlIuZmFyO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50ID0gY2FtZXJhLnBhcmVudDtcblx0XHRjb25zdCBjYW1lcmFzID0gY2FtZXJhVlIuY2FtZXJhcztcblxuXHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhVlIsIHBhcmVudCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2FtZXJhcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHVwZGF0ZUNhbWVyYSggY2FtZXJhc1sgaSBdLCBwYXJlbnQgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBjYW1lcmEgYW5kIGl0cyBjaGlsZHJlblxuXG5cdFx0Y2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYVZSLm1hdHJpeFdvcmxkICk7XG5cdFx0Y2FtZXJhLm1hdHJpeC5jb3B5KCBjYW1lcmFWUi5tYXRyaXggKTtcblx0XHRjYW1lcmEubWF0cml4LmRlY29tcG9zZSggY2FtZXJhLnBvc2l0aW9uLCBjYW1lcmEucXVhdGVybmlvbiwgY2FtZXJhLnNjYWxlICk7XG5cblx0XHRjb25zdCBjaGlsZHJlbiA9IGNhbWVyYS5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNoaWxkcmVuWyBpIF0udXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTtcblxuXHRcdH1cblxuXHRcdC8vIHVwZGF0ZSBwcm9qZWN0aW9uIG1hdHJpeCBmb3IgcHJvcGVyIHZpZXcgZnJ1c3R1bSBjdWxsaW5nXG5cblx0XHRpZiAoIGNhbWVyYXMubGVuZ3RoID09PSAyICkge1xuXG5cdFx0XHRzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFWUiwgY2FtZXJhTCwgY2FtZXJhUiApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYXNzdW1lIHNpbmdsZSBjYW1lcmEgc2V0dXAgKEFSKVxuXG5cdFx0XHRjYW1lcmFWUi5wcm9qZWN0aW9uTWF0cml4LmNvcHkoIGNhbWVyYUwucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhbWVyYVZSO1xuXG5cdH07XG5cblx0Ly8gQW5pbWF0aW9uIExvb3BcblxuXHRsZXQgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDtcblxuXHRmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHtcblxuXHRcdHBvc2UgPSBmcmFtZS5nZXRWaWV3ZXJQb3NlKCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0aWYgKCBwb3NlICE9PSBudWxsICkge1xuXG5cdFx0XHRjb25zdCB2aWV3cyA9IHBvc2Uudmlld3M7XG5cdFx0XHRjb25zdCBiYXNlTGF5ZXIgPSBzZXNzaW9uLnJlbmRlclN0YXRlLmJhc2VMYXllcjtcblxuXHRcdFx0c3RhdGUuYmluZFhSRnJhbWVidWZmZXIoIGJhc2VMYXllci5mcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHRsZXQgY2FtZXJhVlJOZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0XHQvLyBjaGVjayBpZiBpdCdzIG5lY2Vzc2FyeSB0byByZWJ1aWxkIGNhbWVyYVZSJ3MgY2FtZXJhIGxpc3RcblxuXHRcdFx0aWYgKCB2aWV3cy5sZW5ndGggIT09IGNhbWVyYVZSLmNhbWVyYXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNhbWVyYVZSLmNhbWVyYXMubGVuZ3RoID0gMDtcblx0XHRcdFx0Y2FtZXJhVlJOZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdmlld3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IHZpZXcgPSB2aWV3c1sgaSBdO1xuXHRcdFx0XHRjb25zdCB2aWV3cG9ydCA9IGJhc2VMYXllci5nZXRWaWV3cG9ydCggdmlldyApO1xuXG5cdFx0XHRcdGNvbnN0IGNhbWVyYSA9IGNhbWVyYXNbIGkgXTtcblx0XHRcdFx0Y2FtZXJhLm1hdHJpeC5mcm9tQXJyYXkoIHZpZXcudHJhbnNmb3JtLm1hdHJpeCApO1xuXHRcdFx0XHRjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoIHZpZXcucHJvamVjdGlvbk1hdHJpeCApO1xuXHRcdFx0XHRjYW1lcmEudmlld3BvcnQuc2V0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC53aWR0aCwgdmlld3BvcnQuaGVpZ2h0ICk7XG5cblx0XHRcdFx0aWYgKCBpID09PSAwICkge1xuXG5cdFx0XHRcdFx0Y2FtZXJhVlIubWF0cml4LmNvcHkoIGNhbWVyYS5tYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBjYW1lcmFWUk5lZWRzVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Y2FtZXJhVlIuY2FtZXJhcy5wdXNoKCBjYW1lcmEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjb25zdCBpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlcztcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07XG5cdFx0XHRjb25zdCBpbnB1dFNvdXJjZSA9IGlucHV0U291cmNlc1sgaSBdO1xuXG5cdFx0XHRjb250cm9sbGVyLnVwZGF0ZSggaW5wdXRTb3VyY2UsIGZyYW1lLCByZWZlcmVuY2VTcGFjZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgKSBvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2soIHRpbWUsIGZyYW1lICk7XG5cblx0fVxuXG5cdGNvbnN0IGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpO1xuXHRhbmltYXRpb24uc2V0QW5pbWF0aW9uTG9vcCggb25BbmltYXRpb25GcmFtZSApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblxuXHR9O1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHt9O1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIFdlYlhSTWFuYWdlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTtcblxuZnVuY3Rpb24gV2ViR0xNYXRlcmlhbHMoIHByb3BlcnRpZXMgKSB7XG5cblx0ZnVuY3Rpb24gcmVmcmVzaEZvZ1VuaWZvcm1zKCB1bmlmb3JtcywgZm9nICkge1xuXG5cdFx0dW5pZm9ybXMuZm9nQ29sb3IudmFsdWUuY29weSggZm9nLmNvbG9yICk7XG5cblx0XHRpZiAoIGZvZy5pc0ZvZyApIHtcblxuXHRcdFx0dW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyO1xuXHRcdFx0dW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjtcblxuXHRcdH0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmZvZ0RlbnNpdHkudmFsdWUgPSBmb2cuZGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIHVuaWZvcm1zLCBtYXRlcmlhbCwgcGl4ZWxSYXRpbywgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXHRcdFx0cmVmcmVzaFVuaWZvcm1zTGFtYmVydCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNUb29uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNDb21tb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0cmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNNYXRjYXAoIHVuaWZvcm1zLCBtYXRlcmlhbCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoRGVwdGhNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0RlcHRoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNEaXN0YW5jZSggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hOb3JtYWxNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblx0XHRcdHJlZnJlc2hVbmlmb3Jtc05vcm1hbCggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc0xpbmVCYXNpY01hdGVyaWFsICkge1xuXG5cdFx0XHRyZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRyZWZyZXNoVW5pZm9ybXNEYXNoKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNQb2ludHNNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCApO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHtcblxuXHRcdFx0cmVmcmVzaFVuaWZvcm1zU3ByaXRlcyggdW5pZm9ybXMsIG1hdGVyaWFsICk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5jb2xvci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICkge1xuXG5cdFx0XHRtYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTsgLy8gIzE1NTgxXG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNvbG9yICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmFscGhhTWFwLnZhbHVlID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZW52TWFwID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICkuZW52TWFwO1xuXG5cdFx0aWYgKCBlbnZNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVudk1hcC52YWx1ZSA9IGVudk1hcDtcblxuXHRcdFx0dW5pZm9ybXMuZmxpcEVudk1hcC52YWx1ZSA9ICggZW52TWFwLmlzQ3ViZVRleHR1cmUgJiYgZW52TWFwLl9uZWVkc0ZsaXBFbnZNYXAgKSA/IC0gMSA6IDE7XG5cblx0XHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTtcblx0XHRcdHVuaWZvcm1zLnJlZnJhY3Rpb25SYXRpby52YWx1ZSA9IG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbztcblxuXHRcdFx0Y29uc3QgbWF4TWlwTGV2ZWwgPSBwcm9wZXJ0aWVzLmdldCggZW52TWFwICkuX19tYXhNaXBMZXZlbDtcblxuXHRcdFx0aWYgKCBtYXhNaXBMZXZlbCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gbWF4TWlwTGV2ZWw7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5O1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hb01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYW9NYXAudmFsdWUgPSBtYXRlcmlhbC5hb01hcDtcblx0XHRcdHVuaWZvcm1zLmFvTWFwSW50ZW5zaXR5LnZhbHVlID0gbWF0ZXJpYWwuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR9XG5cblx0XHQvLyB1diByZXBlYXQgYW5kIG9mZnNldCBzZXR0aW5nIHByaW9yaXRpZXNcblx0XHQvLyAxLiBjb2xvciBtYXBcblx0XHQvLyAyLiBzcGVjdWxhciBtYXBcblx0XHQvLyAzLiBkaXNwbGFjZW1lbnRNYXAgbWFwXG5cdFx0Ly8gNC4gbm9ybWFsIG1hcFxuXHRcdC8vIDUuIGJ1bXAgbWFwXG5cdFx0Ly8gNi4gcm91Z2huZXNzTWFwIG1hcFxuXHRcdC8vIDcuIG1ldGFsbmVzc01hcCBtYXBcblx0XHQvLyA4LiBhbHBoYU1hcCBtYXBcblx0XHQvLyA5LiBlbWlzc2l2ZU1hcCBtYXBcblx0XHQvLyAxMC4gY2xlYXJjb2F0IG1hcFxuXHRcdC8vIDExLiBjbGVhcmNvYXQgbm9ybWFsIG1hcFxuXHRcdC8vIDEyLiBjbGVhcmNvYXQgcm91Z2huZXNzTWFwIG1hcFxuXG5cdFx0bGV0IHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnNwZWN1bGFyTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuc3BlY3VsYXJNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYnVtcE1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1ldGFsbmVzc01hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0TWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAuaXNXZWJHTFJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwID0gdXZTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXZTY2FsZU1hcC5tYXRyaXhBdXRvVXBkYXRlID09PSB0cnVlICkge1xuXG5cdFx0XHRcdHV2U2NhbGVNYXAudXBkYXRlTWF0cml4KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0dW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggdXZTY2FsZU1hcC5tYXRyaXggKTtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllcyBmb3IgdXYyXG5cdFx0Ly8gMS4gYW8gbWFwXG5cdFx0Ly8gMi4gbGlnaHQgbWFwXG5cblx0XHRsZXQgdXYyU2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFvTWFwICkge1xuXG5cdFx0XHR1djJTY2FsZU1hcCA9IG1hdGVyaWFsLmFvTWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwubGlnaHRNYXAgKSB7XG5cblx0XHRcdHV2MlNjYWxlTWFwID0gbWF0ZXJpYWwubGlnaHRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2MlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG5cdFx0XHRpZiAoIHV2MlNjYWxlTWFwLmlzV2ViR0xSZW5kZXJUYXJnZXQgKSB7XG5cblx0XHRcdFx0dXYyU2NhbGVNYXAgPSB1djJTY2FsZU1hcC50ZXh0dXJlO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdXYyU2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1djJTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51djJUcmFuc2Zvcm0udmFsdWUuY29weSggdXYyU2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xpbmUoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGFzaCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMuZGFzaFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZTtcblx0XHR1bmlmb3Jtcy50b3RhbFNpemUudmFsdWUgPSBtYXRlcmlhbC5kYXNoU2l6ZSArIG1hdGVyaWFsLmdhcFNpemU7XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUG9pbnRzKCB1bmlmb3JtcywgbWF0ZXJpYWwsIHBpeGVsUmF0aW8sIGhlaWdodCApIHtcblxuXHRcdHVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTtcblx0XHR1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTtcblx0XHR1bmlmb3Jtcy5zaXplLnZhbHVlID0gbWF0ZXJpYWwuc2l6ZSAqIHBpeGVsUmF0aW87XG5cdFx0dW5pZm9ybXMuc2NhbGUudmFsdWUgPSBoZWlnaHQgKiAwLjU7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYWxwaGFNYXAudmFsdWUgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdC8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllc1xuXHRcdC8vIDEuIGNvbG9yIG1hcFxuXHRcdC8vIDIuIGFscGhhIG1hcFxuXG5cdFx0bGV0IHV2U2NhbGVNYXA7XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1hcCApIHtcblxuXHRcdFx0dXZTY2FsZU1hcCA9IG1hdGVyaWFsLm1hcDtcblxuXHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwuYWxwaGFNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIHV2U2NhbGVNYXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0aWYgKCB1dlNjYWxlTWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0dXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR1bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCB1dlNjYWxlTWFwLm1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTcHJpdGVzKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7XG5cdFx0dW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7XG5cdFx0dW5pZm9ybXMucm90YXRpb24udmFsdWUgPSBtYXRlcmlhbC5yb3RhdGlvbjtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5tYXAudmFsdWUgPSBtYXRlcmlhbC5tYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmFscGhhTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXYgcmVwZWF0IGFuZCBvZmZzZXQgc2V0dGluZyBwcmlvcml0aWVzXG5cdFx0Ly8gMS4gY29sb3IgbWFwXG5cdFx0Ly8gMi4gYWxwaGEgbWFwXG5cblx0XHRsZXQgdXZTY2FsZU1hcDtcblxuXHRcdGlmICggbWF0ZXJpYWwubWFwICkge1xuXG5cdFx0XHR1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwO1xuXG5cdFx0fSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7XG5cblx0XHRcdHV2U2NhbGVNYXAgPSBtYXRlcmlhbC5hbHBoYU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggdXZTY2FsZU1hcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIHV2U2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHR1dlNjYWxlTWFwLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHVuaWZvcm1zLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoIHV2U2NhbGVNYXAubWF0cml4ICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHR1bmlmb3Jtcy5zcGVjdWxhci52YWx1ZS5jb3B5KCBtYXRlcmlhbC5zcGVjdWxhciApO1xuXHRcdHVuaWZvcm1zLnNoaW5pbmVzcy52YWx1ZSA9IE1hdGgubWF4KCBtYXRlcmlhbC5zaGluaW5lc3MsIDFlLTQgKTsgLy8gdG8gcHJldmVudCBwb3coIDAuMCwgMC4wIClcblxuXHRcdGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmdyYWRpZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZ3JhZGllbnRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5idW1wTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDtcblx0XHRcdHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDtcblx0XHRcdHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0dW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzO1xuXHRcdHVuaWZvcm1zLm1ldGFsbmVzcy52YWx1ZSA9IG1hdGVyaWFsLm1ldGFsbmVzcztcblxuXHRcdGlmICggbWF0ZXJpYWwucm91Z2huZXNzTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubWV0YWxuZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHRcdGNvbnN0IGVudk1hcCA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLmVudk1hcDtcblxuXHRcdGlmICggZW52TWFwICkge1xuXG5cdFx0XHQvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb25cblx0XHRcdHVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zUGh5c2ljYWwoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdHJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTtcblxuXHRcdHVuaWZvcm1zLnJlZmxlY3Rpdml0eS52YWx1ZSA9IG1hdGVyaWFsLnJlZmxlY3Rpdml0eTsgLy8gYWxzbyBwYXJ0IG9mIHVuaWZvcm1zIGNvbW1vblxuXG5cdFx0dW5pZm9ybXMuY2xlYXJjb2F0LnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0O1xuXHRcdHVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcztcblx0XHRpZiAoIG1hdGVyaWFsLnNoZWVuICkgdW5pZm9ybXMuc2hlZW4udmFsdWUuY29weSggbWF0ZXJpYWwuc2hlZW4gKTtcblxuXHRcdGlmICggbWF0ZXJpYWwuY2xlYXJjb2F0TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXRNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXRNYXA7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzc01hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzTWFwO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cdFx0XHR1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXA7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7XG5cblx0XHRcdFx0dW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zLnRyYW5zbWlzc2lvbi52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zbWlzc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWwudHJhbnNtaXNzaW9uTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy50cmFuc21pc3Npb25NYXAudmFsdWUgPSBtYXRlcmlhbC50cmFuc21pc3Npb25NYXA7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc01hdGNhcCggdW5pZm9ybXMsIG1hdGVyaWFsICkge1xuXG5cdFx0aWYgKCBtYXRlcmlhbC5tYXRjYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLm1hdGNhcC52YWx1ZSA9IG1hdGVyaWFsLm1hdGNhcDtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7XG5cdFx0XHR1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7XG5cdFx0XHRpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7XG5cdFx0XHR1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zRGVwdGgoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHtcblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRcdHVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0fVxuXG5cdFx0dW5pZm9ybXMucmVmZXJlbmNlUG9zaXRpb24udmFsdWUuY29weSggbWF0ZXJpYWwucmVmZXJlbmNlUG9zaXRpb24gKTtcblx0XHR1bmlmb3Jtcy5uZWFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5uZWFyRGlzdGFuY2U7XG5cdFx0dW5pZm9ybXMuZmFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5mYXJEaXN0YW5jZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7XG5cblx0XHRpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwO1xuXHRcdFx0dW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlO1xuXHRcdFx0aWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHtcblxuXHRcdFx0dW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwO1xuXHRcdFx0dW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTtcblx0XHRcdGlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkge1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0XHR1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdFx0dW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7XG5cdFx0cmVmcmVzaEZvZ1VuaWZvcm1zOiByZWZyZXNoRm9nVW5pZm9ybXMsXG5cdFx0cmVmcmVzaE1hdGVyaWFsVW5pZm9ybXM6IHJlZnJlc2hNYXRlcmlhbFVuaWZvcm1zXG5cdH07XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2FudmFzRWxlbWVudCgpIHtcblxuXHRjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2NhbnZhcycgKTtcblx0Y2FudmFzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXHRyZXR1cm4gY2FudmFzO1xuXG59XG5cbmZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7XG5cblx0cGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307XG5cblx0Y29uc3QgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGNyZWF0ZUNhbnZhc0VsZW1lbnQoKSxcblx0XHRfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCxcblxuXHRcdF9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSxcblx0XHRfZGVwdGggPSBwYXJhbWV0ZXJzLmRlcHRoICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmRlcHRoIDogdHJ1ZSxcblx0XHRfc3RlbmNpbCA9IHBhcmFtZXRlcnMuc3RlbmNpbCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5zdGVuY2lsIDogdHJ1ZSxcblx0XHRfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsXG5cdFx0X3ByZW11bHRpcGxpZWRBbHBoYSA9IHBhcmFtZXRlcnMucHJlbXVsdGlwbGllZEFscGhhICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSA6IHRydWUsXG5cdFx0X3ByZXNlcnZlRHJhd2luZ0J1ZmZlciA9IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnByZXNlcnZlRHJhd2luZ0J1ZmZlciA6IGZhbHNlLFxuXHRcdF9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCcsXG5cdFx0X2ZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgPSBwYXJhbWV0ZXJzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCA6IGZhbHNlO1xuXG5cdGxldCBjdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7XG5cdGxldCBjdXJyZW50UmVuZGVyU3RhdGUgPSBudWxsO1xuXG5cdC8vIHJlbmRlcigpIGNhbiBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gYSBjYWxsYmFjayB0cmlnZ2VyZWQgYnkgYW5vdGhlciByZW5kZXIuXG5cdC8vIFdlIHRyYWNrIHRoaXMgc28gdGhhdCB0aGUgbmVzdGVkIHJlbmRlciBjYWxsIGdldHMgaXRzIGxpc3QgYW5kIHN0YXRlIGlzb2xhdGVkIGZyb20gdGhlIHBhcmVudCByZW5kZXIgY2FsbC5cblxuXHRjb25zdCByZW5kZXJMaXN0U3RhY2sgPSBbXTtcblx0Y29uc3QgcmVuZGVyU3RhdGVTdGFjayA9IFtdO1xuXG5cdC8vIHB1YmxpYyBwcm9wZXJ0aWVzXG5cblx0dGhpcy5kb21FbGVtZW50ID0gX2NhbnZhcztcblxuXHQvLyBEZWJ1ZyBjb25maWd1cmF0aW9uIGNvbnRhaW5lclxuXHR0aGlzLmRlYnVnID0ge1xuXG5cdFx0LyoqXG5cdFx0ICogRW5hYmxlcyBlcnJvciBjaGVja2luZyBhbmQgcmVwb3J0aW5nIHdoZW4gc2hhZGVyIHByb2dyYW1zIGFyZSBiZWluZyBjb21waWxlZFxuXHRcdCAqIEB0eXBlIHtib29sZWFufVxuXHRcdCAqL1xuXHRcdGNoZWNrU2hhZGVyRXJyb3JzOiB0cnVlXG5cdH07XG5cblx0Ly8gY2xlYXJpbmdcblxuXHR0aGlzLmF1dG9DbGVhciA9IHRydWU7XG5cdHRoaXMuYXV0b0NsZWFyQ29sb3IgPSB0cnVlO1xuXHR0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTtcblx0dGhpcy5hdXRvQ2xlYXJTdGVuY2lsID0gdHJ1ZTtcblxuXHQvLyBzY2VuZSBncmFwaFxuXG5cdHRoaXMuc29ydE9iamVjdHMgPSB0cnVlO1xuXG5cdC8vIHVzZXItZGVmaW5lZCBjbGlwcGluZ1xuXG5cdHRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTtcblx0dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXG5cdC8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZ1xuXG5cdHRoaXMuZ2FtbWFGYWN0b3IgPSAyLjA7XHQvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcblx0dGhpcy5vdXRwdXRFbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXG5cdC8vIHBoeXNpY2FsIGxpZ2h0c1xuXG5cdHRoaXMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPSBmYWxzZTtcblxuXHQvLyB0b25lIG1hcHBpbmdcblxuXHR0aGlzLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcblx0dGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xuXG5cdC8vIGludGVybmFsIHByb3BlcnRpZXNcblxuXHRjb25zdCBfdGhpcyA9IHRoaXM7XG5cblx0bGV0IF9pc0NvbnRleHRMb3N0ID0gZmFsc2U7XG5cblx0Ly8gaW50ZXJuYWwgc3RhdGUgY2FjaGVcblxuXHRsZXQgX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7XG5cdGxldCBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsID0gMDtcblx0bGV0IF9jdXJyZW50UmVuZGVyVGFyZ2V0ID0gbnVsbDtcblx0bGV0IF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblxuXHRsZXQgX2N1cnJlbnRDYW1lcmEgPSBudWxsO1xuXG5cdGNvbnN0IF9jdXJyZW50Vmlld3BvcnQgPSBuZXcgVmVjdG9yNCgpO1xuXHRjb25zdCBfY3VycmVudFNjaXNzb3IgPSBuZXcgVmVjdG9yNCgpO1xuXHRsZXQgX2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGw7XG5cblx0Ly9cblxuXHRsZXQgX3dpZHRoID0gX2NhbnZhcy53aWR0aDtcblx0bGV0IF9oZWlnaHQgPSBfY2FudmFzLmhlaWdodDtcblxuXHRsZXQgX3BpeGVsUmF0aW8gPSAxO1xuXHRsZXQgX29wYXF1ZVNvcnQgPSBudWxsO1xuXHRsZXQgX3RyYW5zcGFyZW50U29ydCA9IG51bGw7XG5cblx0Y29uc3QgX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApO1xuXHRjb25zdCBfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKTtcblx0bGV0IF9zY2lzc29yVGVzdCA9IGZhbHNlO1xuXG5cdC8vIGZydXN0dW1cblxuXHRjb25zdCBfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XG5cblx0Ly8gY2xpcHBpbmdcblxuXHRsZXQgX2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlO1xuXHRsZXQgX2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7XG5cblx0Ly8gY2FtZXJhIG1hdHJpY2VzIGNhY2hlXG5cblx0Y29uc3QgX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5cdGNvbnN0IF92ZWN0b3IzID0gbmV3IFZlY3RvcjMoKTtcblxuXHRjb25zdCBfZW1wdHlTY2VuZSA9IHsgYmFja2dyb3VuZDogbnVsbCwgZm9nOiBudWxsLCBlbnZpcm9ubWVudDogbnVsbCwgb3ZlcnJpZGVNYXRlcmlhbDogbnVsbCwgaXNTY2VuZTogdHJ1ZSB9O1xuXG5cdGZ1bmN0aW9uIGdldFRhcmdldFBpeGVsUmF0aW8oKSB7XG5cblx0XHRyZXR1cm4gX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgPyBfcGl4ZWxSYXRpbyA6IDE7XG5cblx0fVxuXG5cdC8vIGluaXRpYWxpemVcblxuXHRsZXQgX2dsID0gX2NvbnRleHQ7XG5cblx0ZnVuY3Rpb24gZ2V0Q29udGV4dCggY29udGV4dE5hbWVzLCBjb250ZXh0QXR0cmlidXRlcyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRleHROYW1lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGNvbnRleHROYW1lID0gY29udGV4dE5hbWVzWyBpIF07XG5cdFx0XHRjb25zdCBjb250ZXh0ID0gX2NhbnZhcy5nZXRDb250ZXh0KCBjb250ZXh0TmFtZSwgY29udGV4dEF0dHJpYnV0ZXMgKTtcblx0XHRcdGlmICggY29udGV4dCAhPT0gbnVsbCApIHJldHVybiBjb250ZXh0O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cblx0fVxuXG5cdHRyeSB7XG5cblx0XHRjb25zdCBjb250ZXh0QXR0cmlidXRlcyA9IHtcblx0XHRcdGFscGhhOiBfYWxwaGEsXG5cdFx0XHRkZXB0aDogX2RlcHRoLFxuXHRcdFx0c3RlbmNpbDogX3N0ZW5jaWwsXG5cdFx0XHRhbnRpYWxpYXM6IF9hbnRpYWxpYXMsXG5cdFx0XHRwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsXG5cdFx0XHRwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsXG5cdFx0XHRwb3dlclByZWZlcmVuY2U6IF9wb3dlclByZWZlcmVuY2UsXG5cdFx0XHRmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBfZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdFxuXHRcdH07XG5cblx0XHQvLyBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSByZWdpc3RlcmVkIGJlZm9yZSBXZWJHTCBjb250ZXh0IGlzIGNyZWF0ZWQsIHNlZSAjMTI3NTNcblxuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMuYWRkRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdGlmICggX2dsID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zdCBjb250ZXh0TmFtZXMgPSBbICd3ZWJnbDInLCAnd2ViZ2wnLCAnZXhwZXJpbWVudGFsLXdlYmdsJyBdO1xuXG5cdFx0XHRpZiAoIF90aGlzLmlzV2ViR0wxUmVuZGVyZXIgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0Y29udGV4dE5hbWVzLnNoaWZ0KCk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2dsID0gZ2V0Q29udGV4dCggY29udGV4dE5hbWVzLCBjb250ZXh0QXR0cmlidXRlcyApO1xuXG5cdFx0XHRpZiAoIF9nbCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRpZiAoIGdldENvbnRleHQoIGNvbnRleHROYW1lcyApICkge1xuXG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCAnRXJyb3IgY3JlYXRpbmcgV2ViR0wgY29udGV4dCB3aXRoIHlvdXIgc2VsZWN0ZWQgYXR0cmlidXRlcy4nICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggJ0Vycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQuJyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gU29tZSBleHBlcmltZW50YWwtd2ViZ2wgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBoYXZlIGdldFNoYWRlclByZWNpc2lvbkZvcm1hdFxuXG5cdFx0aWYgKCBfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHsgJ3JhbmdlTWluJzogMSwgJ3JhbmdlTWF4JzogMSwgJ3ByZWNpc2lvbic6IDEgfTtcblxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9IGNhdGNoICggZXJyb3IgKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogJyArIGVycm9yLm1lc3NhZ2UgKTtcblx0XHR0aHJvdyBlcnJvcjtcblxuXHR9XG5cblx0bGV0IGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcywgc3RhdGUsIGluZm87XG5cdGxldCBwcm9wZXJ0aWVzLCB0ZXh0dXJlcywgY3ViZW1hcHMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7XG5cdGxldCBwcm9ncmFtQ2FjaGUsIG1hdGVyaWFscywgcmVuZGVyTGlzdHMsIHJlbmRlclN0YXRlcywgY2xpcHBpbmcsIHNoYWRvd01hcDtcblxuXHRsZXQgYmFja2dyb3VuZCwgbW9ycGh0YXJnZXRzLCBidWZmZXJSZW5kZXJlciwgaW5kZXhlZEJ1ZmZlclJlbmRlcmVyO1xuXG5cdGxldCB1dGlscywgYmluZGluZ1N0YXRlcztcblxuXHRmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkge1xuXG5cdFx0ZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApO1xuXG5cdFx0Y2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTtcblxuXHRcdGV4dGVuc2lvbnMuaW5pdCggY2FwYWJpbGl0aWVzICk7XG5cblx0XHR1dGlscyA9IG5ldyBXZWJHTFV0aWxzKCBfZ2wsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXG5cdFx0c3RhdGUgPSBuZXcgV2ViR0xTdGF0ZSggX2dsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTtcblx0XHRwcm9wZXJ0aWVzID0gbmV3IFdlYkdMUHJvcGVydGllcygpO1xuXHRcdHRleHR1cmVzID0gbmV3IFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKTtcblx0XHRjdWJlbWFwcyA9IG5ldyBXZWJHTEN1YmVNYXBzKCBfdGhpcyApO1xuXHRcdGF0dHJpYnV0ZXMgPSBuZXcgV2ViR0xBdHRyaWJ1dGVzKCBfZ2wsIGNhcGFiaWxpdGllcyApO1xuXHRcdGJpbmRpbmdTdGF0ZXMgPSBuZXcgV2ViR0xCaW5kaW5nU3RhdGVzKCBfZ2wsIGV4dGVuc2lvbnMsIGF0dHJpYnV0ZXMsIGNhcGFiaWxpdGllcyApO1xuXHRcdGdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIGluZm8sIGJpbmRpbmdTdGF0ZXMgKTtcblx0XHRvYmplY3RzID0gbmV3IFdlYkdMT2JqZWN0cyggX2dsLCBnZW9tZXRyaWVzLCBhdHRyaWJ1dGVzLCBpbmZvICk7XG5cdFx0bW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTtcblx0XHRjbGlwcGluZyA9IG5ldyBXZWJHTENsaXBwaW5nKCBwcm9wZXJ0aWVzICk7XG5cdFx0cHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBjdWJlbWFwcywgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBiaW5kaW5nU3RhdGVzLCBjbGlwcGluZyApO1xuXHRcdG1hdGVyaWFscyA9IG5ldyBXZWJHTE1hdGVyaWFscyggcHJvcGVydGllcyApO1xuXHRcdHJlbmRlckxpc3RzID0gbmV3IFdlYkdMUmVuZGVyTGlzdHMoIHByb3BlcnRpZXMgKTtcblx0XHRyZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApO1xuXHRcdGJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgY3ViZW1hcHMsIHN0YXRlLCBvYmplY3RzLCBfcHJlbXVsdGlwbGllZEFscGhhICk7XG5cdFx0c2hhZG93TWFwID0gbmV3IFdlYkdMU2hhZG93TWFwKCBfdGhpcywgb2JqZWN0cywgY2FwYWJpbGl0aWVzICk7XG5cblx0XHRidWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEJ1ZmZlclJlbmRlcmVyKCBfZ2wsIGV4dGVuc2lvbnMsIGluZm8sIGNhcGFiaWxpdGllcyApO1xuXHRcdGluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKTtcblxuXHRcdGluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7XG5cblx0XHRfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7XG5cdFx0X3RoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7XG5cdFx0X3RoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG5cdFx0X3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0cztcblx0XHRfdGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7XG5cdFx0X3RoaXMuc3RhdGUgPSBzdGF0ZTtcblx0XHRfdGhpcy5pbmZvID0gaW5mbztcblxuXHR9XG5cblx0aW5pdEdMQ29udGV4dCgpO1xuXG5cdC8vIHhyXG5cblx0Y29uc3QgeHIgPSBuZXcgV2ViWFJNYW5hZ2VyKCBfdGhpcywgX2dsICk7XG5cblx0dGhpcy54ciA9IHhyO1xuXG5cdC8vIEFQSVxuXG5cdHRoaXMuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfZ2w7XG5cblx0fTtcblxuXHR0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpO1xuXG5cdH07XG5cblx0dGhpcy5mb3JjZUNvbnRleHRMb3NzID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7XG5cdFx0aWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ubG9zZUNvbnRleHQoKTtcblxuXHR9O1xuXG5cdHRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfbG9zZV9jb250ZXh0JyApO1xuXHRcdGlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLnJlc3RvcmVDb250ZXh0KCk7XG5cblx0fTtcblxuXHR0aGlzLmdldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3BpeGVsUmF0aW87XG5cblx0fTtcblxuXHR0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuO1xuXG5cdFx0X3BpeGVsUmF0aW8gPSB2YWx1ZTtcblxuXHRcdHRoaXMuc2V0U2l6ZSggX3dpZHRoLCBfaGVpZ2h0LCBmYWxzZSApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRTaXplID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiAuZ2V0c2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQnICk7XG5cblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldCggX3dpZHRoLCBfaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFNpemUgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQsIHVwZGF0ZVN0eWxlICkge1xuXG5cdFx0aWYgKCB4ci5pc1ByZXNlbnRpbmcgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENhblxcJ3QgY2hhbmdlIHNpemUgd2hpbGUgVlIgZGV2aWNlIGlzIHByZXNlbnRpbmcuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0X3dpZHRoID0gd2lkdGg7XG5cdFx0X2hlaWdodCA9IGhlaWdodDtcblxuXHRcdF9jYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCB3aWR0aCAqIF9waXhlbFJhdGlvICk7XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBfcGl4ZWxSYXRpbyApO1xuXG5cdFx0aWYgKCB1cGRhdGVTdHlsZSAhPT0gZmFsc2UgKSB7XG5cblx0XHRcdF9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7XG5cdFx0XHRfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG5cblx0XHR9XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiAuZ2V0ZHJhd2luZ0J1ZmZlclNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50JyApO1xuXG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCAqIF9waXhlbFJhdGlvLCBfaGVpZ2h0ICogX3BpeGVsUmF0aW8gKS5mbG9vcigpO1xuXG5cdH07XG5cblx0dGhpcy5zZXREcmF3aW5nQnVmZmVyU2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgcGl4ZWxSYXRpbyApIHtcblxuXHRcdF93aWR0aCA9IHdpZHRoO1xuXHRcdF9oZWlnaHQgPSBoZWlnaHQ7XG5cblx0XHRfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87XG5cblx0XHRfY2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggd2lkdGggKiBwaXhlbFJhdGlvICk7XG5cdFx0X2NhbnZhcy5oZWlnaHQgPSBNYXRoLmZsb29yKCBoZWlnaHQgKiBwaXhlbFJhdGlvICk7XG5cblx0XHR0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0fTtcblxuXHR0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQnICk7XG5cblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIF9jdXJyZW50Vmlld3BvcnQgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggX3ZpZXdwb3J0ICk7XG5cblx0fTtcblxuXHR0aGlzLnNldFZpZXdwb3J0ID0gZnVuY3Rpb24gKCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuXG5cdFx0aWYgKCB4LmlzVmVjdG9yNCApIHtcblxuXHRcdFx0X3ZpZXdwb3J0LnNldCggeC54LCB4LnksIHgueiwgeC53ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfdmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG5cblx0XHR9XG5cblx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpICk7XG5cblx0fTtcblxuXHR0aGlzLmdldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRcdHJldHVybiB0YXJnZXQuY29weSggX3NjaXNzb3IgKTtcblxuXHR9O1xuXG5cdHRoaXMuc2V0U2Npc3NvciA9IGZ1bmN0aW9uICggeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcblxuXHRcdGlmICggeC5pc1ZlY3RvcjQgKSB7XG5cblx0XHRcdF9zY2lzc29yLnNldCggeC54LCB4LnksIHgueiwgeC53ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRfc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCkgKTtcblxuXHR9O1xuXG5cdHRoaXMuZ2V0U2Npc3NvclRlc3QgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gX3NjaXNzb3JUZXN0O1xuXG5cdH07XG5cblx0dGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRcdHN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7XG5cblx0fTtcblxuXHR0aGlzLnNldE9wYXF1ZVNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcblxuXHRcdF9vcGFxdWVTb3J0ID0gbWV0aG9kO1xuXG5cdH07XG5cblx0dGhpcy5zZXRUcmFuc3BhcmVudFNvcnQgPSBmdW5jdGlvbiAoIG1ldGhvZCApIHtcblxuXHRcdF90cmFuc3BhcmVudFNvcnQgPSBtZXRob2Q7XG5cblx0fTtcblxuXHQvLyBDbGVhcmluZ1xuXG5cdHRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdFx0aWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldENsZWFyQ29sb3IoKSBub3cgcmVxdWlyZXMgYSBDb2xvciBhcyBhbiBhcmd1bWVudCcgKTtcblxuXHRcdFx0dGFyZ2V0ID0gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmNvcHkoIGJhY2tncm91bmQuZ2V0Q2xlYXJDb2xvcigpICk7XG5cblx0fTtcblxuXHR0aGlzLnNldENsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRiYWNrZ3JvdW5kLnNldENsZWFyQ29sb3IuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApO1xuXG5cdH07XG5cblx0dGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpO1xuXG5cdH07XG5cblx0dGhpcy5zZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0YmFja2dyb3VuZC5zZXRDbGVhckFscGhhLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXIgPSBmdW5jdGlvbiAoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRcdGxldCBiaXRzID0gMDtcblxuXHRcdGlmICggY29sb3IgPT09IHVuZGVmaW5lZCB8fCBjb2xvciApIGJpdHMgfD0gMTYzODQ7XG5cdFx0aWYgKCBkZXB0aCA9PT0gdW5kZWZpbmVkIHx8IGRlcHRoICkgYml0cyB8PSAyNTY7XG5cdFx0aWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gMTAyNDtcblxuXHRcdF9nbC5jbGVhciggYml0cyApO1xuXG5cdH07XG5cblx0dGhpcy5jbGVhckNvbG9yID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggdHJ1ZSwgZmFsc2UsIGZhbHNlICk7XG5cblx0fTtcblxuXHR0aGlzLmNsZWFyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmNsZWFyKCBmYWxzZSwgdHJ1ZSwgZmFsc2UgKTtcblxuXHR9O1xuXG5cdHRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0dGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7XG5cblx0fTtcblxuXHQvL1xuXG5cdHRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApO1xuXHRcdF9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dHJlc3RvcmVkJywgb25Db250ZXh0UmVzdG9yZSwgZmFsc2UgKTtcblxuXHRcdHJlbmRlckxpc3RzLmRpc3Bvc2UoKTtcblx0XHRyZW5kZXJTdGF0ZXMuZGlzcG9zZSgpO1xuXHRcdHByb3BlcnRpZXMuZGlzcG9zZSgpO1xuXHRcdGN1YmVtYXBzLmRpc3Bvc2UoKTtcblx0XHRvYmplY3RzLmRpc3Bvc2UoKTtcblx0XHRiaW5kaW5nU3RhdGVzLmRpc3Bvc2UoKTtcblxuXHRcdHhyLmRpc3Bvc2UoKTtcblxuXHRcdHhyLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzZXNzaW9uc3RhcnQnLCBvblhSU2Vzc2lvblN0YXJ0ICk7XG5cdFx0eHIucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xuXG5cdFx0YW5pbWF0aW9uLnN0b3AoKTtcblxuXHR9O1xuXG5cdC8vIEV2ZW50c1xuXG5cdGZ1bmN0aW9uIG9uQ29udGV4dExvc3QoIGV2ZW50ICkge1xuXG5cdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQ29udGV4dCBMb3N0LicgKTtcblxuXHRcdF9pc0NvbnRleHRMb3N0ID0gdHJ1ZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7XG5cblx0XHRjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApO1xuXG5cdFx0X2lzQ29udGV4dExvc3QgPSBmYWxzZTtcblxuXHRcdGNvbnN0IGluZm9BdXRvUmVzZXQgPSBpbmZvLmF1dG9SZXNldDtcblx0XHRjb25zdCBzaGFkb3dNYXBFbmFibGVkID0gc2hhZG93TWFwLmVuYWJsZWQ7XG5cdFx0Y29uc3Qgc2hhZG93TWFwQXV0b1VwZGF0ZSA9IHNoYWRvd01hcC5hdXRvVXBkYXRlO1xuXHRcdGNvbnN0IHNoYWRvd01hcE5lZWRzVXBkYXRlID0gc2hhZG93TWFwLm5lZWRzVXBkYXRlO1xuXHRcdGNvbnN0IHNoYWRvd01hcFR5cGUgPSBzaGFkb3dNYXAudHlwZTtcblxuXHRcdGluaXRHTENvbnRleHQoKTtcblxuXHRcdGluZm8uYXV0b1Jlc2V0ID0gaW5mb0F1dG9SZXNldDtcblx0XHRzaGFkb3dNYXAuZW5hYmxlZCA9IHNoYWRvd01hcEVuYWJsZWQ7XG5cdFx0c2hhZG93TWFwLmF1dG9VcGRhdGUgPSBzaGFkb3dNYXBBdXRvVXBkYXRlO1xuXHRcdHNoYWRvd01hcC5uZWVkc1VwZGF0ZSA9IHNoYWRvd01hcE5lZWRzVXBkYXRlO1xuXHRcdHNoYWRvd01hcC50eXBlID0gc2hhZG93TWFwVHlwZTtcblxuXHR9XG5cblx0ZnVuY3Rpb24gb25NYXRlcmlhbERpc3Bvc2UoIGV2ZW50ICkge1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7XG5cblx0XHRtYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7XG5cblx0XHRkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8vIEJ1ZmZlciBkZWFsbG9jYXRpb25cblxuXHRmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkge1xuXG5cdFx0cmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZXMoIG1hdGVyaWFsICk7XG5cblx0XHRwcm9wZXJ0aWVzLnJlbW92ZSggbWF0ZXJpYWwgKTtcblxuXHR9XG5cblxuXHRmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlcyggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCBwcm9ncmFtcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW1zO1xuXG5cdFx0aWYgKCBwcm9ncmFtcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRwcm9ncmFtcy5mb3JFYWNoKCBmdW5jdGlvbiAoIHByb2dyYW0gKSB7XG5cblx0XHRcdFx0cHJvZ3JhbUNhY2hlLnJlbGVhc2VQcm9ncmFtKCBwcm9ncmFtICk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gQnVmZmVyIHJlbmRlcmluZ1xuXG5cdGZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICkge1xuXG5cdFx0b2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7XG5cblx0XHRcdF90aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICk7XG5cblx0XHR9ICk7XG5cblx0fVxuXG5cdHRoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlID0gZnVuY3Rpb24gKCBvYmplY3QsIHByb2dyYW0gKSB7XG5cblx0XHRiaW5kaW5nU3RhdGVzLmluaXRBdHRyaWJ1dGVzKCk7XG5cblx0XHRjb25zdCBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyAmJiAhIGJ1ZmZlcnMubm9ybWFsICkgYnVmZmVycy5ub3JtYWwgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzVXZzICYmICEgYnVmZmVycy51diApIGJ1ZmZlcnMudXYgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cdFx0aWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7XG5cblx0XHRjb25zdCBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpO1xuXG5cdFx0aWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICkge1xuXG5cdFx0XHRfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMucG9zaXRpb24gKTtcblx0XHRcdF9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIDM1MDQ4ICk7XG5cblx0XHRcdGJpbmRpbmdTdGF0ZXMuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiApO1xuXHRcdFx0X2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCA1MTI2LCBmYWxzZSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHtcblxuXHRcdFx0X2dsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXJzLm5vcm1hbCApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3Qubm9ybWFsQXJyYXksIDM1MDQ4ICk7XG5cblx0XHRcdGJpbmRpbmdTdGF0ZXMuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwgKTtcblx0XHRcdF9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlcy5ub3JtYWwsIDMsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNVdnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy51diApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QudXZBcnJheSwgMzUwNDggKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLnV2ICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMudXYsIDIsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIG9iamVjdC5oYXNDb2xvcnMgKSB7XG5cblx0XHRcdF9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy5jb2xvciApO1xuXHRcdFx0X2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QuY29sb3JBcnJheSwgMzUwNDggKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7XG5cdFx0XHRfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIDUxMjYsIGZhbHNlLCAwLCAwICk7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nU3RhdGVzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7XG5cblx0XHRfZ2wuZHJhd0FycmF5cyggNCwgMCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHRvYmplY3QuY291bnQgPSAwO1xuXG5cdH07XG5cblx0dGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgc2NlbmUsIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApIHtcblxuXHRcdGlmICggc2NlbmUgPT09IG51bGwgKSBzY2VuZSA9IF9lbXB0eVNjZW5lOyAvLyByZW5kZXJCdWZmZXJEaXJlY3Qgc2Vjb25kIHBhcmFtZXRlciB1c2VkIHRvIGJlIGZvZyAoY291bGQgYmUgbnVsbClcblxuXHRcdGNvbnN0IGZyb250RmFjZUNXID0gKCBvYmplY3QuaXNNZXNoICYmIG9iamVjdC5tYXRyaXhXb3JsZC5kZXRlcm1pbmFudCgpIDwgMCApO1xuXG5cdFx0Y29uc3QgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKTtcblxuXHRcdHN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCwgZnJvbnRGYWNlQ1cgKTtcblxuXHRcdC8vXG5cblx0XHRsZXQgaW5kZXggPSBnZW9tZXRyeS5pbmRleDtcblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aWYgKCBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkIHx8IHBvc2l0aW9uLmNvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0fSBlbHNlIGlmICggaW5kZXguY291bnQgPT09IDAgKSB7XG5cblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRsZXQgcmFuZ2VGYWN0b3IgPSAxO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdGluZGV4ID0gZ2VvbWV0cmllcy5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7XG5cdFx0XHRyYW5nZUZhY3RvciA9IDI7XG5cblx0XHR9XG5cblx0XHRpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyB8fCBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgKSB7XG5cblx0XHRcdG1vcnBodGFyZ2V0cy51cGRhdGUoIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBwcm9ncmFtICk7XG5cblx0XHR9XG5cblx0XHRiaW5kaW5nU3RhdGVzLnNldHVwKCBvYmplY3QsIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSwgaW5kZXggKTtcblxuXHRcdGxldCBhdHRyaWJ1dGU7XG5cdFx0bGV0IHJlbmRlcmVyID0gYnVmZmVyUmVuZGVyZXI7XG5cblx0XHRpZiAoIGluZGV4ICE9PSBudWxsICkge1xuXG5cdFx0XHRhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTtcblxuXHRcdFx0cmVuZGVyZXIgPSBpbmRleGVkQnVmZmVyUmVuZGVyZXI7XG5cdFx0XHRyZW5kZXJlci5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0Y29uc3QgZGF0YUNvdW50ID0gKCBpbmRleCAhPT0gbnVsbCApID8gaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudDtcblxuXHRcdGNvbnN0IHJhbmdlU3RhcnQgPSBnZW9tZXRyeS5kcmF3UmFuZ2Uuc3RhcnQgKiByYW5nZUZhY3Rvcjtcblx0XHRjb25zdCByYW5nZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7XG5cblx0XHRjb25zdCBncm91cFN0YXJ0ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5zdGFydCAqIHJhbmdlRmFjdG9yIDogMDtcblx0XHRjb25zdCBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7XG5cblx0XHRjb25zdCBkcmF3U3RhcnQgPSBNYXRoLm1heCggcmFuZ2VTdGFydCwgZ3JvdXBTdGFydCApO1xuXHRcdGNvbnN0IGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7XG5cblx0XHRjb25zdCBkcmF3Q291bnQgPSBNYXRoLm1heCggMCwgZHJhd0VuZCAtIGRyYXdTdGFydCArIDEgKTtcblxuXHRcdGlmICggZHJhd0NvdW50ID09PSAwICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdGlmICggb2JqZWN0LmlzTWVzaCApIHtcblxuXHRcdFx0aWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0c3RhdGUuc2V0TGluZVdpZHRoKCBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTtcblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZSApIHtcblxuXHRcdFx0bGV0IGxpbmVXaWR0aCA9IG1hdGVyaWFsLmxpbmV3aWR0aDtcblxuXHRcdFx0aWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsXG5cblx0XHRcdHN0YXRlLnNldExpbmVXaWR0aCggbGluZVdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzTGluZVNlZ21lbnRzICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDEgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGluZUxvb3AgKSB7XG5cblx0XHRcdFx0cmVuZGVyZXIuc2V0TW9kZSggMiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDMgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzUG9pbnRzICkge1xuXG5cdFx0XHRyZW5kZXJlci5zZXRNb2RlKCAwICk7XG5cblx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7XG5cblx0XHRcdHJlbmRlcmVyLnNldE1vZGUoIDQgKTtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0LmlzSW5zdGFuY2VkTWVzaCApIHtcblxuXHRcdFx0cmVuZGVyZXIucmVuZGVySW5zdGFuY2VzKCBkcmF3U3RhcnQsIGRyYXdDb3VudCwgb2JqZWN0LmNvdW50ICk7XG5cblx0XHR9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBpbnN0YW5jZUNvdW50ID0gTWF0aC5taW4oIGdlb21ldHJ5Lmluc3RhbmNlQ291bnQsIGdlb21ldHJ5Ll9tYXhJbnN0YW5jZUNvdW50ICk7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlckluc3RhbmNlcyggZHJhd1N0YXJ0LCBkcmF3Q291bnQsIGluc3RhbmNlQ291bnQgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggZHJhd1N0YXJ0LCBkcmF3Q291bnQgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdC8vIENvbXBpbGVcblxuXHR0aGlzLmNvbXBpbGUgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApO1xuXHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5pbml0KCk7XG5cblx0XHRzY2VuZS50cmF2ZXJzZVZpc2libGUoIGZ1bmN0aW9uICggb2JqZWN0ICkge1xuXG5cdFx0XHRpZiAoIG9iamVjdC5pc0xpZ2h0ICYmIG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApICkge1xuXG5cdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApO1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmNhc3RTaGFkb3cgKSB7XG5cblx0XHRcdFx0XHRjdXJyZW50UmVuZGVyU3RhdGUucHVzaFNoYWRvdyggb2JqZWN0ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoKTtcblxuXHRcdHNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7XG5cblx0XHRcdGlmICggbWF0ZXJpYWwgKSB7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBtYXRlcmlhbCApICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbWF0ZXJpYWwubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbDIgPSBtYXRlcmlhbFsgaSBdO1xuXG5cdFx0XHRcdFx0XHRnZXRQcm9ncmFtKCBtYXRlcmlhbDIsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Z2V0UHJvZ3JhbSggbWF0ZXJpYWwsIHNjZW5lLCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gKTtcblxuXHR9O1xuXG5cdC8vIEFuaW1hdGlvbiBMb29wXG5cblx0bGV0IG9uQW5pbWF0aW9uRnJhbWVDYWxsYmFjayA9IG51bGw7XG5cblx0ZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSggdGltZSApIHtcblxuXHRcdGlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lICk7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIG9uWFJTZXNzaW9uU3RhcnQoKSB7XG5cblx0XHRhbmltYXRpb24uc3RvcCgpO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBvblhSU2Vzc2lvbkVuZCgpIHtcblxuXHRcdGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdH1cblxuXHRjb25zdCBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb24oKTtcblx0YW5pbWF0aW9uLnNldEFuaW1hdGlvbkxvb3AoIG9uQW5pbWF0aW9uRnJhbWUgKTtcblxuXHRpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkgYW5pbWF0aW9uLnNldENvbnRleHQoIHdpbmRvdyApO1xuXG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0XHRvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjaztcblx0XHR4ci5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApO1xuXG5cdFx0KCBjYWxsYmFjayA9PT0gbnVsbCApID8gYW5pbWF0aW9uLnN0b3AoKSA6IGFuaW1hdGlvbi5zdGFydCgpO1xuXG5cdH07XG5cblx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25zdGFydCcsIG9uWFJTZXNzaW9uU3RhcnQgKTtcblx0eHIuYWRkRXZlbnRMaXN0ZW5lciggJ3Nlc3Npb25lbmQnLCBvblhSU2Vzc2lvbkVuZCApO1xuXG5cdC8vIFJlbmRlcmluZ1xuXG5cdHRoaXMucmVuZGVyID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkge1xuXG5cdFx0bGV0IHJlbmRlclRhcmdldCwgZm9yY2VDbGVhcjtcblxuXHRcdGlmICggYXJndW1lbnRzWyAyIF0gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIHJlbmRlclRhcmdldCBhcmd1bWVudCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGluc3RlYWQuJyApO1xuXHRcdFx0cmVuZGVyVGFyZ2V0ID0gYXJndW1lbnRzWyAyIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50c1sgMyBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLicgKTtcblx0XHRcdGZvcmNlQ2xlYXIgPSBhcmd1bWVudHNbIDMgXTtcblxuXHRcdH1cblxuXHRcdGlmICggY2FtZXJhICE9PSB1bmRlZmluZWQgJiYgY2FtZXJhLmlzQ2FtZXJhICE9PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggX2lzQ29udGV4dExvc3QgPT09IHRydWUgKSByZXR1cm47XG5cblx0XHQvLyB1cGRhdGUgc2NlbmUgZ3JhcGhcblxuXHRcdGlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHQvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtXG5cblx0XHRpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdGlmICggeHIuZW5hYmxlZCA9PT0gdHJ1ZSAmJiB4ci5pc1ByZXNlbnRpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdGNhbWVyYSA9IHhyLmdldENhbWVyYSggY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXHRcdGlmICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApIHNjZW5lLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0IHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRjdXJyZW50UmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSwgcmVuZGVyU3RhdGVTdGFjay5sZW5ndGggKTtcblx0XHRjdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpO1xuXG5cdFx0cmVuZGVyU3RhdGVTdGFjay5wdXNoKCBjdXJyZW50UmVuZGVyU3RhdGUgKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0X2ZydXN0dW0uc2V0RnJvbVByb2plY3Rpb25NYXRyaXgoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSB0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkO1xuXHRcdF9jbGlwcGluZ0VuYWJsZWQgPSBjbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCByZW5kZXJMaXN0U3RhY2subGVuZ3RoICk7XG5cdFx0Y3VycmVudFJlbmRlckxpc3QuaW5pdCgpO1xuXG5cdFx0cmVuZGVyTGlzdFN0YWNrLnB1c2goIGN1cnJlbnRSZW5kZXJMaXN0ICk7XG5cblx0XHRwcm9qZWN0T2JqZWN0KCBzY2VuZSwgY2FtZXJhLCAwLCBfdGhpcy5zb3J0T2JqZWN0cyApO1xuXG5cdFx0Y3VycmVudFJlbmRlckxpc3QuZmluaXNoKCk7XG5cblx0XHRpZiAoIF90aGlzLnNvcnRPYmplY3RzID09PSB0cnVlICkge1xuXG5cdFx0XHRjdXJyZW50UmVuZGVyTGlzdC5zb3J0KCBfb3BhcXVlU29ydCwgX3RyYW5zcGFyZW50U29ydCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggX2NsaXBwaW5nRW5hYmxlZCA9PT0gdHJ1ZSApIGNsaXBwaW5nLmJlZ2luU2hhZG93cygpO1xuXG5cdFx0Y29uc3Qgc2hhZG93c0FycmF5ID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLnNoYWRvd3NBcnJheTtcblxuXHRcdHNoYWRvd01hcC5yZW5kZXIoIHNoYWRvd3NBcnJheSwgc2NlbmUsIGNhbWVyYSApO1xuXG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCk7XG5cdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzVmlldyggY2FtZXJhICk7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSBjbGlwcGluZy5lbmRTaGFkb3dzKCk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCB0aGlzLmluZm8uYXV0b1Jlc2V0ID09PSB0cnVlICkgdGhpcy5pbmZvLnJlc2V0KCk7XG5cblx0XHRpZiAoIHJlbmRlclRhcmdldCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0YmFja2dyb3VuZC5yZW5kZXIoIGN1cnJlbnRSZW5kZXJMaXN0LCBzY2VuZSwgY2FtZXJhLCBmb3JjZUNsZWFyICk7XG5cblx0XHQvLyByZW5kZXIgc2NlbmVcblxuXHRcdGNvbnN0IG9wYXF1ZU9iamVjdHMgPSBjdXJyZW50UmVuZGVyTGlzdC5vcGFxdWU7XG5cdFx0Y29uc3QgdHJhbnNwYXJlbnRPYmplY3RzID0gY3VycmVudFJlbmRlckxpc3QudHJhbnNwYXJlbnQ7XG5cblx0XHRpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoID4gMCApIHJlbmRlck9iamVjdHMoIG9wYXF1ZU9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTtcblx0XHRpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggPiAwICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmdcblxuXHRcdFx0dGV4dHVyZXMudXBkYXRlUmVuZGVyVGFyZ2V0TWlwbWFwKCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0XHQvLyByZXNvbHZlIG11bHRpc2FtcGxlIHJlbmRlcmJ1ZmZlcnMgdG8gYSBzaW5nbGUtc2FtcGxlIHRleHR1cmUgaWYgbmVjZXNzYXJ5XG5cblx0XHRcdHRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGlmICggc2NlbmUuaXNTY2VuZSA9PT0gdHJ1ZSApIHNjZW5lLm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhICk7XG5cblx0XHQvLyBFbnN1cmUgZGVwdGggYnVmZmVyIHdyaXRpbmcgaXMgZW5hYmxlZCBzbyBpdCBjYW4gYmUgY2xlYXJlZCBvbiBuZXh0IHJlbmRlclxuXG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5kZXB0aC5zZXRNYXNrKCB0cnVlICk7XG5cdFx0c3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7XG5cblx0XHRzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApO1xuXG5cdFx0Ly8gX2dsLmZpbmlzaCgpO1xuXG5cdFx0YmluZGluZ1N0YXRlcy5yZXNldERlZmF1bHRTdGF0ZSgpO1xuXHRcdF9jdXJyZW50TWF0ZXJpYWxJZCA9IC0gMTtcblx0XHRfY3VycmVudENhbWVyYSA9IG51bGw7XG5cblx0XHRyZW5kZXJTdGF0ZVN0YWNrLnBvcCgpO1xuXG5cdFx0aWYgKCByZW5kZXJTdGF0ZVN0YWNrLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlU3RhY2tbIHJlbmRlclN0YXRlU3RhY2subGVuZ3RoIC0gMSBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlclN0YXRlID0gbnVsbDtcblxuXHRcdH1cblxuXHRcdHJlbmRlckxpc3RTdGFjay5wb3AoKTtcblxuXHRcdGlmICggcmVuZGVyTGlzdFN0YWNrLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0ID0gcmVuZGVyTGlzdFN0YWNrWyByZW5kZXJMaXN0U3RhY2subGVuZ3RoIC0gMSBdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y3VycmVudFJlbmRlckxpc3QgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0ZnVuY3Rpb24gcHJvamVjdE9iamVjdCggb2JqZWN0LCBjYW1lcmEsIGdyb3VwT3JkZXIsIHNvcnRPYmplY3RzICkge1xuXG5cdFx0aWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHRjb25zdCB2aXNpYmxlID0gb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEubGF5ZXJzICk7XG5cblx0XHRpZiAoIHZpc2libGUgKSB7XG5cblx0XHRcdGlmICggb2JqZWN0LmlzR3JvdXAgKSB7XG5cblx0XHRcdFx0Z3JvdXBPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTE9EICkge1xuXG5cdFx0XHRcdGlmICggb2JqZWN0LmF1dG9VcGRhdGUgPT09IHRydWUgKSBvYmplY3QudXBkYXRlKCBjYW1lcmEgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTGlnaHQgKSB7XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnB1c2hMaWdodCggb2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHtcblxuXHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c1Nwcml0ZSggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggbWF0ZXJpYWwudmlzaWJsZSApIHtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSBpZiAoIG9iamVjdC5pc0ltbWVkaWF0ZVJlbmRlck9iamVjdCApIHtcblxuXHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBvYmplY3QubWF0cml4V29ybGQgKVxuXHRcdFx0XHRcdFx0LmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBudWxsLCBvYmplY3QubWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHtcblxuXHRcdFx0XHRpZiAoIG9iamVjdC5pc1NraW5uZWRNZXNoICkge1xuXG5cdFx0XHRcdFx0Ly8gdXBkYXRlIHNrZWxldG9uIG9ubHkgb25jZSBpbiBhIGZyYW1lXG5cblx0XHRcdFx0XHRpZiAoIG9iamVjdC5za2VsZXRvbi5mcmFtZSAhPT0gaW5mby5yZW5kZXIuZnJhbWUgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi51cGRhdGUoKTtcblx0XHRcdFx0XHRcdG9iamVjdC5za2VsZXRvbi5mcmFtZSA9IGluZm8ucmVuZGVyLmZyYW1lO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHNvcnRPYmplY3RzICkge1xuXG5cdFx0XHRcdFx0XHRfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApXG5cdFx0XHRcdFx0XHRcdC5hcHBseU1hdHJpeDQoIF9wcm9qU2NyZWVuTWF0cml4ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTtcblx0XHRcdFx0XHRjb25zdCBtYXRlcmlhbCA9IG9iamVjdC5tYXRlcmlhbDtcblxuXHRcdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgaSBdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjMueiwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7XG5cblx0XHRcdFx0XHRcdGN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yMy56LCBudWxsICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHByb2plY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIGNhbWVyYSwgZ3JvdXBPcmRlciwgc29ydE9iamVjdHMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0ZnVuY3Rpb24gcmVuZGVyT2JqZWN0cyggcmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IG92ZXJyaWRlTWF0ZXJpYWwgPSBzY2VuZS5pc1NjZW5lID09PSB0cnVlID8gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA6IG51bGw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0O1xuXHRcdFx0Y29uc3QgZ2VvbWV0cnkgPSByZW5kZXJJdGVtLmdlb21ldHJ5O1xuXHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBvdmVycmlkZU1hdGVyaWFsID09PSBudWxsID8gcmVuZGVySXRlbS5tYXRlcmlhbCA6IG92ZXJyaWRlTWF0ZXJpYWw7XG5cdFx0XHRjb25zdCBncm91cCA9IHJlbmRlckl0ZW0uZ3JvdXA7XG5cblx0XHRcdGlmICggY2FtZXJhLmlzQXJyYXlDYW1lcmEgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSBjYW1lcmFzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgY2FtZXJhMiA9IGNhbWVyYXNbIGogXTtcblxuXHRcdFx0XHRcdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCBjYW1lcmEyLmxheWVycyApICkge1xuXG5cdFx0XHRcdFx0XHRzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBjYW1lcmEyLnZpZXdwb3J0ICkgKTtcblxuXHRcdFx0XHRcdFx0Y3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzVmlldyggY2FtZXJhMiApO1xuXG5cdFx0XHRcdFx0XHRyZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYTIsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApIHtcblxuXHRcdG9iamVjdC5vbkJlZm9yZVJlbmRlciggX3RoaXMsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTtcblxuXHRcdG9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7XG5cdFx0b2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblxuXHRcdGlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkge1xuXG5cdFx0XHRjb25zdCBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZSwgbWF0ZXJpYWwsIG9iamVjdCApO1xuXG5cdFx0XHRzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwgKTtcblxuXHRcdFx0YmluZGluZ1N0YXRlcy5yZXNldCgpO1xuXG5cdFx0XHRyZW5kZXJPYmplY3RJbW1lZGlhdGUoIG9iamVjdCwgcHJvZ3JhbSApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X3RoaXMucmVuZGVyQnVmZmVyRGlyZWN0KCBjYW1lcmEsIHNjZW5lLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cCApO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApIHtcblxuXHRcdGlmICggc2NlbmUuaXNTY2VuZSAhPT0gdHJ1ZSApIHNjZW5lID0gX2VtcHR5U2NlbmU7IC8vIHNjZW5lIGNvdWxkIGJlIGEgTWVzaCwgTGluZSwgUG9pbnRzLCAuLi5cblxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXG5cdFx0Y29uc3QgbGlnaHRzID0gY3VycmVudFJlbmRlclN0YXRlLnN0YXRlLmxpZ2h0cztcblx0XHRjb25zdCBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5O1xuXG5cdFx0Y29uc3QgbGlnaHRzU3RhdGVWZXJzaW9uID0gbGlnaHRzLnN0YXRlLnZlcnNpb247XG5cblx0XHRjb25zdCBwYXJhbWV0ZXJzID0gcHJvZ3JhbUNhY2hlLmdldFBhcmFtZXRlcnMoIG1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgc2NlbmUsIG9iamVjdCApO1xuXHRcdGNvbnN0IHByb2dyYW1DYWNoZUtleSA9IHByb2dyYW1DYWNoZS5nZXRQcm9ncmFtQ2FjaGVLZXkoIHBhcmFtZXRlcnMgKTtcblxuXHRcdGxldCBwcm9ncmFtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtcztcblxuXHRcdC8vIGFsd2F5cyB1cGRhdGUgZW52aXJvbm1lbnQgYW5kIGZvZyAtIGNoYW5naW5nIHRoZXNlIHRyaWdnZXIgYW4gZ2V0UHJvZ3JhbSBjYWxsLCBidXQgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBwcm9ncmFtIGRvZXNuJ3QgY2hhbmdlXG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMuZW52aXJvbm1lbnQgPSBtYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsID8gc2NlbmUuZW52aXJvbm1lbnQgOiBudWxsO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5mb2cgPSBzY2VuZS5mb2c7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCA9IGN1YmVtYXBzLmdldCggbWF0ZXJpYWwuZW52TWFwIHx8IG1hdGVyaWFsUHJvcGVydGllcy5lbnZpcm9ubWVudCApO1xuXG5cdFx0aWYgKCBwcm9ncmFtcyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBuZXcgbWF0ZXJpYWxcblxuXHRcdFx0bWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvbk1hdGVyaWFsRGlzcG9zZSApO1xuXG5cdFx0XHRwcm9ncmFtcyA9IG5ldyBNYXAoKTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtcyA9IHByb2dyYW1zO1xuXG5cdFx0fVxuXG5cdFx0bGV0IHByb2dyYW0gPSBwcm9ncmFtcy5nZXQoIHByb2dyYW1DYWNoZUtleSApO1xuXG5cdFx0aWYgKCBwcm9ncmFtICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIGVhcmx5IG91dCBpZiBwcm9ncmFtIGFuZCBsaWdodCBzdGF0ZSBpcyBpZGVudGljYWxcblxuXHRcdFx0aWYgKCBtYXRlcmlhbFByb3BlcnRpZXMuY3VycmVudFByb2dyYW0gPT09IHByb2dyYW0gJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9PT0gbGlnaHRzU3RhdGVWZXJzaW9uICkge1xuXG5cdFx0XHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdFx0XHRyZXR1cm4gcHJvZ3JhbTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cGFyYW1ldGVycy51bmlmb3JtcyA9IHByb2dyYW1DYWNoZS5nZXRVbmlmb3JtcyggbWF0ZXJpYWwgKTtcblxuXHRcdFx0bWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBwYXJhbWV0ZXJzLCBfdGhpcyApO1xuXG5cdFx0XHRwcm9ncmFtID0gcHJvZ3JhbUNhY2hlLmFjcXVpcmVQcm9ncmFtKCBwYXJhbWV0ZXJzLCBwcm9ncmFtQ2FjaGVLZXkgKTtcblx0XHRcdHByb2dyYW1zLnNldCggcHJvZ3JhbUNhY2hlS2V5LCBwcm9ncmFtICk7XG5cblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcyA9IHBhcmFtZXRlcnMudW5pZm9ybXM7XG5cblx0XHR9XG5cblx0XHRjb25zdCB1bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcblxuXHRcdGlmICggKCAhIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgISBtYXRlcmlhbC5pc1Jhd1NoYWRlck1hdGVyaWFsICkgfHwgbWF0ZXJpYWwuY2xpcHBpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gY2xpcHBpbmcudW5pZm9ybTtcblxuXHRcdH1cblxuXHRcdHVwZGF0ZUNvbW1vbk1hdGVyaWFsUHJvcGVydGllcyggbWF0ZXJpYWwsIHBhcmFtZXRlcnMgKTtcblxuXHRcdC8vIHN0b3JlIHRoZSBsaWdodCBzZXR1cCBpdCB3YXMgY3JlYXRlZCBmb3JcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyA9IG1hdGVyaWFsTmVlZHNMaWdodHMoIG1hdGVyaWFsICk7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjtcblxuXHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICkge1xuXG5cdFx0XHQvLyB3aXJlIHVwIHRoZSBtYXRlcmlhbCB0byB0aGlzIHJlbmRlcmVyJ3MgbGlnaHRpbmcgc3RhdGVcblxuXHRcdFx0dW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IudmFsdWUgPSBsaWdodHMuc3RhdGUuYW1iaWVudDtcblx0XHRcdHVuaWZvcm1zLmxpZ2h0UHJvYmUudmFsdWUgPSBsaWdodHMuc3RhdGUucHJvYmU7XG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsTGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90O1xuXHRcdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMucmVjdEFyZWFMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUucmVjdEFyZWE7XG5cdFx0XHR1bmlmb3Jtcy5sdGNfMS52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzE7XG5cdFx0XHR1bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYUxUQzI7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludExpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludDtcblx0XHRcdHVuaWZvcm1zLnBvaW50TGlnaHRTaGFkb3dzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93O1xuXHRcdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pO1xuXG5cdFx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcDtcblx0XHRcdHVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWFwO1xuXHRcdFx0dW5pZm9ybXMuc3BvdFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5zcG90U2hhZG93TWF0cml4O1xuXHRcdFx0dW5pZm9ybXMucG9pbnRTaGFkb3dNYXAudmFsdWUgPSBsaWdodHMuc3RhdGUucG9pbnRTaGFkb3dNYXA7XG5cdFx0XHR1bmlmb3Jtcy5wb2ludFNoYWRvd01hdHJpeC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeDtcblx0XHRcdC8vIFRPRE8gKGFiZWxuYXRpb24pOiBhZGQgYXJlYSBsaWdodHMgc2hhZG93IGluZm8gdG8gdW5pZm9ybXNcblxuXHRcdH1cblxuXHRcdGNvbnN0IHByb2dVbmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKTtcblx0XHRjb25zdCB1bmlmb3Jtc0xpc3QgPSBXZWJHTFVuaWZvcm1zLnNlcVdpdGhWYWx1ZSggcHJvZ1VuaWZvcm1zLnNlcSwgdW5pZm9ybXMgKTtcblxuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5jdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHRmdW5jdGlvbiB1cGRhdGVDb21tb25NYXRlcmlhbFByb3BlcnRpZXMoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7XG5cblx0XHRtYXRlcmlhbFByb3BlcnRpZXMub3V0cHV0RW5jb2RpbmcgPSBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID0gcGFyYW1ldGVycy5pbnN0YW5jaW5nO1xuXHRcdG1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IHBhcmFtZXRlcnMubnVtQ2xpcHBpbmdQbGFuZXM7XG5cdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiA9IHBhcmFtZXRlcnMubnVtQ2xpcEludGVyc2VjdGlvbjtcblx0XHRtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzID0gcGFyYW1ldGVycy52ZXJ0ZXhBbHBoYXM7XG5cblx0fVxuXG5cdGZ1bmN0aW9uIHNldFByb2dyYW0oIGNhbWVyYSwgc2NlbmUsIG1hdGVyaWFsLCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIHNjZW5lLmlzU2NlbmUgIT09IHRydWUgKSBzY2VuZSA9IF9lbXB0eVNjZW5lOyAvLyBzY2VuZSBjb3VsZCBiZSBhIE1lc2gsIExpbmUsIFBvaW50cywgLi4uXG5cblx0XHR0ZXh0dXJlcy5yZXNldFRleHR1cmVVbml0cygpO1xuXG5cdFx0Y29uc3QgZm9nID0gc2NlbmUuZm9nO1xuXHRcdGNvbnN0IGVudmlyb25tZW50ID0gbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCA/IHNjZW5lLmVudmlyb25tZW50IDogbnVsbDtcblx0XHRjb25zdCBlbmNvZGluZyA9ICggX2N1cnJlbnRSZW5kZXJUYXJnZXQgPT09IG51bGwgKSA/IF90aGlzLm91dHB1dEVuY29kaW5nIDogX2N1cnJlbnRSZW5kZXJUYXJnZXQudGV4dHVyZS5lbmNvZGluZztcblx0XHRjb25zdCBlbnZNYXAgPSBjdWJlbWFwcy5nZXQoIG1hdGVyaWFsLmVudk1hcCB8fCBlbnZpcm9ubWVudCApO1xuXHRcdGNvbnN0IHZlcnRleEFscGhhcyA9IG1hdGVyaWFsLnZlcnRleENvbG9ycyA9PT0gdHJ1ZSAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvciAmJiBvYmplY3QuZ2VvbWV0cnkuYXR0cmlidXRlcy5jb2xvci5pdGVtU2l6ZSA9PT0gNDtcblxuXHRcdGNvbnN0IG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApO1xuXHRcdGNvbnN0IGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7XG5cblx0XHRpZiAoIF9jbGlwcGluZ0VuYWJsZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdGlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkID09PSB0cnVlIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7XG5cblx0XHRcdFx0Y29uc3QgdXNlQ2FjaGUgPVxuXHRcdFx0XHRcdGNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiZcblx0XHRcdFx0XHRtYXRlcmlhbC5pZCA9PT0gX2N1cnJlbnRNYXRlcmlhbElkO1xuXG5cdFx0XHRcdC8vIHdlIG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggc29tZSBDbGlwcGluZ0dyb3VwXG5cdFx0XHRcdC8vIG9iamVjdCBpbnN0ZWFkIG9mIHRoZSBtYXRlcmlhbCwgb25jZSBpdCBiZWNvbWVzIGZlYXNpYmxlXG5cdFx0XHRcdC8vICgjODQ2NSwgIzgzNzkpXG5cdFx0XHRcdGNsaXBwaW5nLnNldFN0YXRlKCBtYXRlcmlhbCwgY2FtZXJhLCB1c2VDYWNoZSApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0bGV0IG5lZWRzUHJvZ3JhbUNoYW5nZSA9IGZhbHNlO1xuXG5cdFx0aWYgKCBtYXRlcmlhbC52ZXJzaW9uID09PSBtYXRlcmlhbFByb3BlcnRpZXMuX192ZXJzaW9uICkge1xuXG5cdFx0XHRpZiAoIG1hdGVyaWFsUHJvcGVydGllcy5uZWVkc0xpZ2h0cyAmJiAoIG1hdGVyaWFsUHJvcGVydGllcy5saWdodHNTdGF0ZVZlcnNpb24gIT09IGxpZ2h0cy5zdGF0ZS52ZXJzaW9uICkgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm91dHB1dEVuY29kaW5nICE9PSBlbmNvZGluZyApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3QuaXNJbnN0YW5jZWRNZXNoICYmIG1hdGVyaWFsUHJvcGVydGllcy5pbnN0YW5jaW5nID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCAhIG9iamVjdC5pc0luc3RhbmNlZE1lc2ggJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmluc3RhbmNpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLmVudk1hcCAhPT0gZW52TWFwICkge1xuXG5cdFx0XHRcdG5lZWRzUHJvZ3JhbUNoYW5nZSA9IHRydWU7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMuZm9nICE9PSBmb2cgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSB1bmRlZmluZWQgJiZcblx0XHRcdFx0KCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IGNsaXBwaW5nLm51bVBsYW5lcyB8fFxuXHRcdFx0XHRtYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uICE9PSBjbGlwcGluZy5udW1JbnRlcnNlY3Rpb24gKSApIHtcblxuXHRcdFx0XHRuZWVkc1Byb2dyYW1DaGFuZ2UgPSB0cnVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMudmVydGV4QWxwaGFzICE9PSB2ZXJ0ZXhBbHBoYXMgKSB7XG5cblx0XHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0bmVlZHNQcm9ncmFtQ2hhbmdlID0gdHJ1ZTtcblx0XHRcdG1hdGVyaWFsUHJvcGVydGllcy5fX3ZlcnNpb24gPSBtYXRlcmlhbC52ZXJzaW9uO1xuXG5cdFx0fVxuXG5cdFx0Ly9cblxuXHRcdGxldCBwcm9ncmFtID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLmN1cnJlbnRQcm9ncmFtO1xuXG5cdFx0aWYgKCBuZWVkc1Byb2dyYW1DaGFuZ2UgPT09IHRydWUgKSB7XG5cblx0XHRcdHByb2dyYW0gPSBnZXRQcm9ncmFtKCBtYXRlcmlhbCwgc2NlbmUsIG9iamVjdCApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IHJlZnJlc2hQcm9ncmFtID0gZmFsc2U7XG5cdFx0bGV0IHJlZnJlc2hNYXRlcmlhbCA9IGZhbHNlO1xuXHRcdGxldCByZWZyZXNoTGlnaHRzID0gZmFsc2U7XG5cblx0XHRjb25zdCBwX3VuaWZvcm1zID0gcHJvZ3JhbS5nZXRVbmlmb3JtcygpLFxuXHRcdFx0bV91bmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3JtcztcblxuXHRcdGlmICggc3RhdGUudXNlUHJvZ3JhbSggcHJvZ3JhbS5wcm9ncmFtICkgKSB7XG5cblx0XHRcdHJlZnJlc2hQcm9ncmFtID0gdHJ1ZTtcblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGlmICggbWF0ZXJpYWwuaWQgIT09IF9jdXJyZW50TWF0ZXJpYWxJZCApIHtcblxuXHRcdFx0X2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7XG5cblx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIHJlZnJlc2hQcm9ncmFtIHx8IF9jdXJyZW50Q2FtZXJhICE9PSBjYW1lcmEgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3Byb2plY3Rpb25NYXRyaXgnLCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0XHRpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkge1xuXG5cdFx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ2xvZ0RlcHRoQnVmRkMnLFxuXHRcdFx0XHRcdDIuMCAvICggTWF0aC5sb2coIGNhbWVyYS5mYXIgKyAxLjAgKSAvIE1hdGguTE4yICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSBjYW1lcmEgKSB7XG5cblx0XHRcdFx0X2N1cnJlbnRDYW1lcmEgPSBjYW1lcmE7XG5cblx0XHRcdFx0Ly8gbGlnaHRpbmcgdW5pZm9ybXMgZGVwZW5kIG9uIHRoZSBjYW1lcmEgc28gZW5mb3JjZSBhbiB1cGRhdGVcblx0XHRcdFx0Ly8gbm93LCBpbiBjYXNlIHRoaXMgbWF0ZXJpYWwgc3VwcG9ydHMgbGlnaHRzIC0gb3IgbGF0ZXIsIHdoZW5cblx0XHRcdFx0Ly8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOlxuXG5cdFx0XHRcdHJlZnJlc2hNYXRlcmlhbCA9IHRydWU7XHRcdC8vIHNldCB0byB0cnVlIG9uIG1hdGVyaWFsIGNoYW5nZVxuXHRcdFx0XHRyZWZyZXNoTGlnaHRzID0gdHJ1ZTtcdFx0Ly8gcmVtYWlucyBzZXQgdW50aWwgdXBkYXRlIGRvbmVcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zXG5cdFx0XHQvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5lbnZNYXAgKSB7XG5cblx0XHRcdFx0Y29uc3QgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uO1xuXG5cdFx0XHRcdGlmICggdUNhbVBvcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dUNhbVBvcy5zZXRWYWx1ZSggX2dsLFxuXHRcdFx0XHRcdFx0X3ZlY3RvcjMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaExhbWJlcnRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCApIHtcblxuXHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdpc09ydGhvZ3JhcGhpYycsIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9PT0gdHJ1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWwuaXNNZXNoUGhvbmdNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc01lc2hUb29uTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzTWVzaEJhc2ljTWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fFxuXHRcdFx0XHRtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsIHx8XG5cdFx0XHRcdG1hdGVyaWFsLmlzU2hhZG93TWF0ZXJpYWwgfHxcblx0XHRcdFx0bWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2tpbm5pbmcgdW5pZm9ybXMgbXVzdCBiZSBzZXQgZXZlbiBpZiBtYXRlcmlhbCBkaWRuJ3QgY2hhbmdlXG5cdFx0Ly8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzXG5cdFx0Ly8gb3RoZXJ3aXNlIHRleHR1cmVzIHVzZWQgZm9yIHNraW5uaW5nIGNhbiB0YWtlIG92ZXIgdGV4dHVyZSB1bml0cyByZXNlcnZlZCBmb3Igb3RoZXIgbWF0ZXJpYWwgdGV4dHVyZXNcblxuXHRcdGlmICggbWF0ZXJpYWwuc2tpbm5pbmcgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTtcblx0XHRcdHBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7XG5cblx0XHRcdGNvbnN0IHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uO1xuXG5cdFx0XHRpZiAoIHNrZWxldG9uICkge1xuXG5cdFx0XHRcdGNvbnN0IGJvbmVzID0gc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0aWYgKCBjYXBhYmlsaXRpZXMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggc2tlbGV0b24uYm9uZVRleHR1cmUgPT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscylcblx0XHRcdFx0XHRcdC8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNClcblx0XHRcdFx0XHRcdC8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpXG5cdFx0XHRcdFx0XHQvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNilcblx0XHRcdFx0XHRcdC8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKVxuXHRcdFx0XHRcdFx0Ly8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpXG5cblxuXHRcdFx0XHRcdFx0bGV0IHNpemUgPSBNYXRoLnNxcnQoIGJvbmVzLmxlbmd0aCAqIDQgKTsgLy8gNCBwaXhlbHMgbmVlZGVkIGZvciAxIG1hdHJpeFxuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGhVdGlscy5jZWlsUG93ZXJPZlR3byggc2l6ZSApO1xuXHRcdFx0XHRcdFx0c2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbFxuXHRcdFx0XHRcdFx0Ym9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXNcblxuXHRcdFx0XHRcdFx0Y29uc3QgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7XG5cblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVNYXRyaWNlcyA9IGJvbmVNYXRyaWNlcztcblx0XHRcdFx0XHRcdHNrZWxldG9uLmJvbmVUZXh0dXJlID0gYm9uZVRleHR1cmU7XG5cdFx0XHRcdFx0XHRza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgPSBzaXplO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnYm9uZVRleHR1cmUnLCBza2VsZXRvbi5ib25lVGV4dHVyZSwgdGV4dHVyZXMgKTtcblx0XHRcdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0cF91bmlmb3Jtcy5zZXRPcHRpb25hbCggX2dsLCBza2VsZXRvbiwgJ2JvbmVNYXRyaWNlcycgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggcmVmcmVzaE1hdGVyaWFsIHx8IG1hdGVyaWFsUHJvcGVydGllcy5yZWNlaXZlU2hhZG93ICE9PSBvYmplY3QucmVjZWl2ZVNoYWRvdyApIHtcblxuXHRcdFx0bWF0ZXJpYWxQcm9wZXJ0aWVzLnJlY2VpdmVTaGFkb3cgPSBvYmplY3QucmVjZWl2ZVNoYWRvdztcblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3JlY2VpdmVTaGFkb3cnLCBvYmplY3QucmVjZWl2ZVNoYWRvdyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCByZWZyZXNoTWF0ZXJpYWwgKSB7XG5cblx0XHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ3RvbmVNYXBwaW5nRXhwb3N1cmUnLCBfdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlICk7XG5cblx0XHRcdGlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLm5lZWRzTGlnaHRzICkge1xuXG5cdFx0XHRcdC8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm9cblxuXHRcdFx0XHQvLyBub3RlOiBhbGwgbGlnaHRpbmcgdW5pZm9ybXMgYXJlIGFsd2F5cyBzZXQgY29ycmVjdGx5XG5cdFx0XHRcdC8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXJcblx0XHRcdFx0Ly8gdmFsdWVzXG5cdFx0XHRcdC8vXG5cdFx0XHRcdC8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXRcblx0XHRcdFx0Ly8gdGhlIEdMIHN0YXRlIHdoZW4gcmVxdWlyZWRcblxuXHRcdFx0XHRtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHJlZnJlc2ggdW5pZm9ybXMgY29tbW9uIHRvIHNldmVyYWwgbWF0ZXJpYWxzXG5cblx0XHRcdGlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbHMucmVmcmVzaEZvZ1VuaWZvcm1zKCBtX3VuaWZvcm1zLCBmb2cgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbHMucmVmcmVzaE1hdGVyaWFsVW5pZm9ybXMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsLCBfcGl4ZWxSYXRpbywgX2hlaWdodCApO1xuXG5cdFx0XHRXZWJHTFVuaWZvcm1zLnVwbG9hZCggX2dsLCBtYXRlcmlhbFByb3BlcnRpZXMudW5pZm9ybXNMaXN0LCBtX3VuaWZvcm1zLCB0ZXh0dXJlcyApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0V2ViR0xVbmlmb3Jtcy51cGxvYWQoIF9nbCwgbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCwgbV91bmlmb3JtcywgdGV4dHVyZXMgKTtcblx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zTmVlZFVwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBtYXRlcmlhbC5pc1Nwcml0ZU1hdGVyaWFsICkge1xuXG5cdFx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdjZW50ZXInLCBvYmplY3QuY2VudGVyICk7XG5cblx0XHR9XG5cblx0XHQvLyBjb21tb24gbWF0cmljZXNcblxuXHRcdHBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTtcblx0XHRwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdub3JtYWxNYXRyaXgnLCBvYmplY3Qubm9ybWFsTWF0cml4ICk7XG5cdFx0cF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbW9kZWxNYXRyaXgnLCBvYmplY3QubWF0cml4V29ybGQgKTtcblxuXHRcdHJldHVybiBwcm9ncmFtO1xuXG5cdH1cblxuXHQvLyBJZiB1bmlmb3JtcyBhcmUgbWFya2VkIGFzIGNsZWFuLCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgbG9hZGVkIHRvIHRoZSBHUFUuXG5cblx0ZnVuY3Rpb24gbWFya1VuaWZvcm1zTGlnaHRzTmVlZHNVcGRhdGUoIHVuaWZvcm1zLCB2YWx1ZSApIHtcblxuXHRcdHVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0dW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5kaXJlY3Rpb25hbExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnBvaW50TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMucG9pbnRMaWdodFNoYWRvd3MubmVlZHNVcGRhdGUgPSB2YWx1ZTtcblx0XHR1bmlmb3Jtcy5zcG90TGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuc3BvdExpZ2h0U2hhZG93cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXHRcdHVuaWZvcm1zLnJlY3RBcmVhTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7XG5cdFx0dW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRmdW5jdGlvbiBtYXRlcmlhbE5lZWRzTGlnaHRzKCBtYXRlcmlhbCApIHtcblxuXHRcdHJldHVybiBtYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsIHx8IG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHxcblx0XHRcdG1hdGVyaWFsLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgfHwgbWF0ZXJpYWwuaXNTaGFkb3dNYXRlcmlhbCB8fFxuXHRcdFx0KCBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmIG1hdGVyaWFsLmxpZ2h0cyA9PT0gdHJ1ZSApO1xuXG5cdH1cblxuXHR0aGlzLmdldEFjdGl2ZUN1YmVGYWNlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlQ3ViZUZhY2U7XG5cblx0fTtcblxuXHR0aGlzLmdldEFjdGl2ZU1pcG1hcExldmVsID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0cmV0dXJuIF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWw7XG5cblx0fTtcblxuXHR0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0UmVuZGVyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGFjdGl2ZUN1YmVGYWNlID0gMCwgYWN0aXZlTWlwbWFwTGV2ZWwgPSAwICkge1xuXG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7XG5cdFx0X2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IGFjdGl2ZUN1YmVGYWNlO1xuXHRcdF9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSBhY3RpdmVNaXBtYXBMZXZlbDtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICYmIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXIgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGV4dHVyZXMuc2V0dXBSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXG5cdFx0fVxuXG5cdFx0bGV0IGZyYW1lYnVmZmVyID0gbnVsbDtcblx0XHRsZXQgaXNDdWJlID0gZmFsc2U7XG5cdFx0bGV0IGlzUmVuZGVyVGFyZ2V0M0QgPSBmYWxzZTtcblxuXHRcdGlmICggcmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlID0gcmVuZGVyVGFyZ2V0LnRleHR1cmU7XG5cblx0XHRcdGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlM0QgfHwgdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHtcblxuXHRcdFx0XHRpc1JlbmRlclRhcmdldDNEID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBfX3dlYmdsRnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0XHRpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMQ3ViZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IF9fd2ViZ2xGcmFtZWJ1ZmZlclsgYWN0aXZlQ3ViZUZhY2UgXTtcblx0XHRcdFx0aXNDdWJlID0gdHJ1ZTtcblxuXHRcdFx0fSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCApIHtcblxuXHRcdFx0XHRmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0ZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7XG5cblx0XHRcdH1cblxuXHRcdFx0X2N1cnJlbnRWaWV3cG9ydC5jb3B5KCByZW5kZXJUYXJnZXQudmlld3BvcnQgKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCByZW5kZXJUYXJnZXQuc2Npc3NvciApO1xuXHRcdFx0X2N1cnJlbnRTY2lzc29yVGVzdCA9IHJlbmRlclRhcmdldC5zY2lzc29yVGVzdDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdF9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKTtcblx0XHRcdF9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCk7XG5cdFx0XHRfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0O1xuXG5cdFx0fVxuXG5cdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblxuXHRcdHN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7XG5cdFx0c3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yICk7XG5cdFx0c3RhdGUuc2V0U2Npc3NvclRlc3QoIF9jdXJyZW50U2Npc3NvclRlc3QgKTtcblxuXHRcdGlmICggaXNDdWJlICkge1xuXG5cdFx0XHRjb25zdCB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApO1xuXHRcdFx0X2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzYwNjQsIDM0MDY5ICsgYWN0aXZlQ3ViZUZhY2UsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlLCBhY3RpdmVNaXBtYXBMZXZlbCApO1xuXG5cdFx0fSBlbHNlIGlmICggaXNSZW5kZXJUYXJnZXQzRCApIHtcblxuXHRcdFx0Y29uc3QgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0LnRleHR1cmUgKTtcblx0XHRcdGNvbnN0IGxheWVyID0gYWN0aXZlQ3ViZUZhY2UgfHwgMDtcblx0XHRcdF9nbC5mcmFtZWJ1ZmZlclRleHR1cmVMYXllciggMzYxNjAsIDM2MDY0LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSwgYWN0aXZlTWlwbWFwTGV2ZWwgfHwgMCwgbGF5ZXIgKTtcblxuXHRcdH1cblxuXHR9O1xuXG5cdHRoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscyA9IGZ1bmN0aW9uICggcmVuZGVyVGFyZ2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBidWZmZXIsIGFjdGl2ZUN1YmVGYWNlSW5kZXggKSB7XG5cblx0XHRpZiAoICEgKCByZW5kZXJUYXJnZXQgJiYgcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXQgKSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBUSFJFRS5XZWJHTFJlbmRlclRhcmdldC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRsZXQgZnJhbWVidWZmZXIgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyO1xuXG5cdFx0aWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQgJiYgYWN0aXZlQ3ViZUZhY2VJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZUluZGV4IF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGZyYW1lYnVmZmVyICkge1xuXG5cdFx0XHRzdGF0ZS5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBmcmFtZWJ1ZmZlciApO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGNvbnN0IHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTtcblx0XHRcdFx0Y29uc3QgdGV4dHVyZUZvcm1hdCA9IHRleHR1cmUuZm9ybWF0O1xuXHRcdFx0XHRjb25zdCB0ZXh0dXJlVHlwZSA9IHRleHR1cmUudHlwZTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCAzNTczOSApICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGhhbGZGbG9hdFN1cHBvcnRlZEJ5RXh0ID0gKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSApICYmICggZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnICkgfHwgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgJiYgZXh0ZW5zaW9ucy5oYXMoICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKTtcblxuXHRcdFx0XHRpZiAoIHRleHR1cmVUeXBlICE9PSBVbnNpZ25lZEJ5dGVUeXBlICYmIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICkgIT09IF9nbC5nZXRQYXJhbWV0ZXIoIDM1NzM4ICkgJiYgLy8gRWRnZSBhbmQgQ2hyb21lIE1hYyA8IDUyICgjOTUxMylcblx0XHRcdFx0XHQhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmhhcyggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuaGFzKCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94XG5cdFx0XHRcdFx0ISBoYWxmRmxvYXRTdXBwb3J0ZWRCeUV4dCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyggMzYxNjAgKSA9PT0gMzYwNTMgKSB7XG5cblx0XHRcdFx0XHQvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpXG5cblx0XHRcdFx0XHRpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkge1xuXG5cdFx0XHRcdFx0XHRfZ2wucmVhZFBpeGVscyggeCwgeSwgd2lkdGgsIGhlaWdodCwgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlVHlwZSApLCBidWZmZXIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4nICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGZpbmFsbHkge1xuXG5cdFx0XHRcdC8vIHJlc3RvcmUgZnJhbWVidWZmZXIgb2YgY3VycmVudCByZW5kZXIgdGFyZ2V0IGlmIG5lY2Vzc2FyeVxuXG5cdFx0XHRcdGNvbnN0IGZyYW1lYnVmZmVyID0gKCBfY3VycmVudFJlbmRlclRhcmdldCAhPT0gbnVsbCApID8gcHJvcGVydGllcy5nZXQoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICkuX193ZWJnbEZyYW1lYnVmZmVyIDogbnVsbDtcblx0XHRcdFx0c3RhdGUuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5jb3B5RnJhbWVidWZmZXJUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCB0ZXh0dXJlLCBsZXZlbCA9IDAgKSB7XG5cblx0XHRjb25zdCBsZXZlbFNjYWxlID0gTWF0aC5wb3coIDIsIC0gbGV2ZWwgKTtcblx0XHRjb25zdCB3aWR0aCA9IE1hdGguZmxvb3IoIHRleHR1cmUuaW1hZ2Uud2lkdGggKiBsZXZlbFNjYWxlICk7XG5cdFx0Y29uc3QgaGVpZ2h0ID0gTWF0aC5mbG9vciggdGV4dHVyZS5pbWFnZS5oZWlnaHQgKiBsZXZlbFNjYWxlICk7XG5cdFx0Y29uc3QgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApO1xuXG5cdFx0dGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7XG5cblx0XHRfZ2wuY29weVRleEltYWdlMkQoIDM1NTMsIGxldmVsLCBnbEZvcm1hdCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGhlaWdodCwgMCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5jb3B5VGV4dHVyZVRvVGV4dHVyZSA9IGZ1bmN0aW9uICggcG9zaXRpb24sIHNyY1RleHR1cmUsIGRzdFRleHR1cmUsIGxldmVsID0gMCApIHtcblxuXHRcdGNvbnN0IHdpZHRoID0gc3JjVGV4dHVyZS5pbWFnZS53aWR0aDtcblx0XHRjb25zdCBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDtcblx0XHRjb25zdCBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUuZm9ybWF0ICk7XG5cdFx0Y29uc3QgZ2xUeXBlID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS50eXBlICk7XG5cblx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkQoIGRzdFRleHR1cmUsIDAgKTtcblxuXHRcdC8vIEFzIGFub3RoZXIgdGV4dHVyZSB1cGxvYWQgbWF5IGhhdmUgY2hhbmdlZCBwaXhlbFN0b3JlaVxuXHRcdC8vIHBhcmFtZXRlcnMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBjb3JyZWN0IGZvciB0aGUgZHN0VGV4dHVyZVxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDAsIGRzdFRleHR1cmUuZmxpcFkgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDM3NDQxLCBkc3RUZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTcsIGRzdFRleHR1cmUudW5wYWNrQWxpZ25tZW50ICk7XG5cblx0XHRpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSApIHtcblxuXHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlLmRhdGEgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggc3JjVGV4dHVyZS5pc0NvbXByZXNzZWRUZXh0dXJlICkge1xuXG5cdFx0XHRcdF9nbC5jb21wcmVzc2VkVGV4U3ViSW1hZ2UyRCggMzU1MywgbGV2ZWwsIHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHNyY1RleHR1cmUubWlwbWFwc1sgMCBdLndpZHRoLCBzcmNUZXh0dXJlLm1pcG1hcHNbIDAgXS5oZWlnaHQsIGdsRm9ybWF0LCBzcmNUZXh0dXJlLm1pcG1hcHNbIDAgXS5kYXRhICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0X2dsLnRleFN1YkltYWdlMkQoIDM1NTMsIGxldmVsLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIEdlbmVyYXRlIG1pcG1hcHMgb25seSB3aGVuIGNvcHlpbmcgbGV2ZWwgMFxuXHRcdGlmICggbGV2ZWwgPT09IDAgJiYgZHN0VGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgKSBfZ2wuZ2VuZXJhdGVNaXBtYXAoIDM1NTMgKTtcblxuXHRcdHN0YXRlLnVuYmluZFRleHR1cmUoKTtcblxuXHR9O1xuXG5cdHRoaXMuY29weVRleHR1cmVUb1RleHR1cmUzRCA9IGZ1bmN0aW9uICggc291cmNlQm94LCBwb3NpdGlvbiwgc3JjVGV4dHVyZSwgZHN0VGV4dHVyZSwgbGV2ZWwgPSAwICkge1xuXG5cdFx0aWYgKCBfdGhpcy5pc1dlYkdMMVJlbmRlcmVyICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyLmNvcHlUZXh0dXJlVG9UZXh0dXJlM0Q6IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBkYXRhIH0gPSBzcmNUZXh0dXJlLmltYWdlO1xuXHRcdGNvbnN0IGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS5mb3JtYXQgKTtcblx0XHRjb25zdCBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCBkc3RUZXh0dXJlLnR5cGUgKTtcblx0XHRsZXQgZ2xUYXJnZXQ7XG5cblx0XHRpZiAoIGRzdFRleHR1cmUuaXNEYXRhVGV4dHVyZTNEICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlM0QoIGRzdFRleHR1cmUsIDAgKTtcblx0XHRcdGdsVGFyZ2V0ID0gMzI4Nzk7XG5cblx0XHR9IGVsc2UgaWYgKCBkc3RUZXh0dXJlLmlzRGF0YVRleHR1cmUyREFycmF5ICkge1xuXG5cdFx0XHR0ZXh0dXJlcy5zZXRUZXh0dXJlMkRBcnJheSggZHN0VGV4dHVyZSwgMCApO1xuXHRcdFx0Z2xUYXJnZXQgPSAzNTg2NjtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIuY29weVRleHR1cmVUb1RleHR1cmUzRDogb25seSBzdXBwb3J0cyBUSFJFRS5EYXRhVGV4dHVyZTNEIGFuZCBUSFJFRS5EYXRhVGV4dHVyZTJEQXJyYXkuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzNzQ0MCwgZHN0VGV4dHVyZS5mbGlwWSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzc0NDEsIGRzdFRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNywgZHN0VGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTtcblxuXHRcdGNvbnN0IHVucGFja1Jvd0xlbiA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTQgKTtcblx0XHRjb25zdCB1bnBhY2tJbWFnZUhlaWdodCA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMyODc4ICk7XG5cdFx0Y29uc3QgdW5wYWNrU2tpcFBpeGVscyA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTYgKTtcblx0XHRjb25zdCB1bnBhY2tTa2lwUm93cyA9IF9nbC5nZXRQYXJhbWV0ZXIoIDMzMTUgKTtcblx0XHRjb25zdCB1bnBhY2tTa2lwSW1hZ2VzID0gX2dsLmdldFBhcmFtZXRlciggMzI4NzcgKTtcblxuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNCwgd2lkdGggKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc4LCBoZWlnaHQgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMzMTYsIHNvdXJjZUJveC5taW4ueCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNSwgc291cmNlQm94Lm1pbi55ICk7XG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMjg3Nywgc291cmNlQm94Lm1pbi56ICk7XG5cblx0XHRfZ2wudGV4U3ViSW1hZ2UzRChcblx0XHRcdGdsVGFyZ2V0LFxuXHRcdFx0bGV2ZWwsXG5cdFx0XHRwb3NpdGlvbi54LFxuXHRcdFx0cG9zaXRpb24ueSxcblx0XHRcdHBvc2l0aW9uLnosXG5cdFx0XHRzb3VyY2VCb3gubWF4LnggLSBzb3VyY2VCb3gubWluLnggKyAxLFxuXHRcdFx0c291cmNlQm94Lm1heC55IC0gc291cmNlQm94Lm1pbi55ICsgMSxcblx0XHRcdHNvdXJjZUJveC5tYXgueiAtIHNvdXJjZUJveC5taW4ueiArIDEsXG5cdFx0XHRnbEZvcm1hdCxcblx0XHRcdGdsVHlwZSxcblx0XHRcdGRhdGFcblx0XHQpO1xuXG5cdFx0X2dsLnBpeGVsU3RvcmVpKCAzMzE0LCB1bnBhY2tSb3dMZW4gKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc4LCB1bnBhY2tJbWFnZUhlaWdodCApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNiwgdW5wYWNrU2tpcFBpeGVscyApO1xuXHRcdF9nbC5waXhlbFN0b3JlaSggMzMxNSwgdW5wYWNrU2tpcFJvd3MgKTtcblx0XHRfZ2wucGl4ZWxTdG9yZWkoIDMyODc3LCB1bnBhY2tTa2lwSW1hZ2VzICk7XG5cblx0XHQvLyBHZW5lcmF0ZSBtaXBtYXBzIG9ubHkgd2hlbiBjb3B5aW5nIGxldmVsIDBcblx0XHRpZiAoIGxldmVsID09PSAwICYmIGRzdFRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICkgX2dsLmdlbmVyYXRlTWlwbWFwKCBnbFRhcmdldCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5pbml0VGV4dHVyZSA9IGZ1bmN0aW9uICggdGV4dHVyZSApIHtcblxuXHRcdHRleHR1cmVzLnNldFRleHR1cmUyRCggdGV4dHVyZSwgMCApO1xuXG5cdFx0c3RhdGUudW5iaW5kVGV4dHVyZSgpO1xuXG5cdH07XG5cblx0dGhpcy5yZXNldFN0YXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdFx0X2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDA7XG5cdFx0X2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IDA7XG5cdFx0X2N1cnJlbnRSZW5kZXJUYXJnZXQgPSBudWxsO1xuXG5cdFx0c3RhdGUucmVzZXQoKTtcblx0XHRiaW5kaW5nU3RhdGVzLnJlc2V0KCk7XG5cblx0fTtcblxuXHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0X19USFJFRV9ERVZUT09MU19fLmRpc3BhdGNoRXZlbnQoIG5ldyBDdXN0b21FdmVudCggJ29ic2VydmUnLCB7IGRldGFpbDogdGhpcyB9ICkgKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZlxuXG5cdH1cblxufVxuXG5jbGFzcyBXZWJHTDFSZW5kZXJlciBleHRlbmRzIFdlYkdMUmVuZGVyZXIge31cblxuV2ViR0wxUmVuZGVyZXIucHJvdG90eXBlLmlzV2ViR0wxUmVuZGVyZXIgPSB0cnVlO1xuXG5jbGFzcyBGb2dFeHAyIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGRlbnNpdHkgPSAwLjAwMDI1ICkge1xuXG5cdFx0dGhpcy5uYW1lID0gJyc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXHRcdHRoaXMuZGVuc2l0eSA9IGRlbnNpdHk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLCB0aGlzLmRlbnNpdHkgKTtcblxuXHR9XG5cblx0dG9KU09OKCAvKiBtZXRhICovICkge1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHR5cGU6ICdGb2dFeHAyJyxcblx0XHRcdGNvbG9yOiB0aGlzLmNvbG9yLmdldEhleCgpLFxuXHRcdFx0ZGVuc2l0eTogdGhpcy5kZW5zaXR5XG5cdFx0fTtcblxuXHR9XG5cbn1cblxuRm9nRXhwMi5wcm90b3R5cGUuaXNGb2dFeHAyID0gdHJ1ZTtcblxuY2xhc3MgRm9nIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIG5lYXIgPSAxLCBmYXIgPSAxMDAwICkge1xuXG5cdFx0dGhpcy5uYW1lID0gJyc7XG5cblx0XHR0aGlzLmNvbG9yID0gbmV3IENvbG9yKCBjb2xvciApO1xuXG5cdFx0dGhpcy5uZWFyID0gbmVhcjtcblx0XHR0aGlzLmZhciA9IGZhcjtcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IEZvZyggdGhpcy5jb2xvciwgdGhpcy5uZWFyLCB0aGlzLmZhciApO1xuXG5cdH1cblxuXHR0b0pTT04oIC8qIG1ldGEgKi8gKSB7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0dHlwZTogJ0ZvZycsXG5cdFx0XHRjb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSxcblx0XHRcdG5lYXI6IHRoaXMubmVhcixcblx0XHRcdGZhcjogdGhpcy5mYXJcblx0XHR9O1xuXG5cdH1cblxufVxuXG5Gb2cucHJvdG90eXBlLmlzRm9nID0gdHJ1ZTtcblxuY2xhc3MgU2NlbmUgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NjZW5lJztcblxuXHRcdHRoaXMuYmFja2dyb3VuZCA9IG51bGw7XG5cdFx0dGhpcy5lbnZpcm9ubWVudCA9IG51bGw7XG5cdFx0dGhpcy5mb2cgPSBudWxsO1xuXG5cdFx0dGhpcy5vdmVycmlkZU1hdGVyaWFsID0gbnVsbDtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyXG5cblx0XHRpZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdFx0XHRfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG5cblx0XHR9XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdGlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmVudmlyb25tZW50ICE9PSBudWxsICkgdGhpcy5lbnZpcm9ubWVudCA9IHNvdXJjZS5lbnZpcm9ubWVudC5jbG9uZSgpO1xuXHRcdGlmICggc291cmNlLmZvZyAhPT0gbnVsbCApIHRoaXMuZm9nID0gc291cmNlLmZvZy5jbG9uZSgpO1xuXG5cdFx0aWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7XG5cblx0XHR0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYmFja2dyb3VuZCAhPT0gbnVsbCApIGRhdGEub2JqZWN0LmJhY2tncm91bmQgPSB0aGlzLmJhY2tncm91bmQudG9KU09OKCBtZXRhICk7XG5cdFx0aWYgKCB0aGlzLmVudmlyb25tZW50ICE9PSBudWxsICkgZGF0YS5vYmplY3QuZW52aXJvbm1lbnQgPSB0aGlzLmVudmlyb25tZW50LnRvSlNPTiggbWV0YSApO1xuXHRcdGlmICggdGhpcy5mb2cgIT09IG51bGwgKSBkYXRhLm9iamVjdC5mb2cgPSB0aGlzLmZvZy50b0pTT04oKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufVxuXG5TY2VuZS5wcm90b3R5cGUuaXNTY2VuZSA9IHRydWU7XG5cbmZ1bmN0aW9uIEludGVybGVhdmVkQnVmZmVyKCBhcnJheSwgc3RyaWRlICkge1xuXG5cdHRoaXMuYXJyYXkgPSBhcnJheTtcblx0dGhpcy5zdHJpZGUgPSBzdHJpZGU7XG5cdHRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gc3RyaWRlIDogMDtcblxuXHR0aGlzLnVzYWdlID0gU3RhdGljRHJhd1VzYWdlO1xuXHR0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG5cdHRoaXMudXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywge1xuXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7XG5cblx0fVxuXG59ICk7XG5cbk9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGlzSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0b25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sXG5cblx0c2V0VXNhZ2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnVzYWdlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApO1xuXHRcdHRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7XG5cdFx0dGhpcy5zdHJpZGUgPSBzb3VyY2Uuc3RyaWRlO1xuXHRcdHRoaXMudXNhZ2UgPSBzb3VyY2UudXNhZ2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkge1xuXG5cdFx0aW5kZXgxICo9IHRoaXMuc3RyaWRlO1xuXHRcdGluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0dGhpcy5hcnJheS5zZXQoIHZhbHVlLCBvZmZzZXQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICggZGF0YSApIHtcblxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnMgPSB7fTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5hcnJheS5idWZmZXIuX3V1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdID0gdGhpcy5hcnJheS5zbGljZSggMCApLmJ1ZmZlcjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGFycmF5ID0gbmV3IHRoaXMuYXJyYXkuY29uc3RydWN0b3IoIGRhdGEuYXJyYXlCdWZmZXJzWyB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCBdICk7XG5cblx0XHRjb25zdCBpYiA9IG5ldyBJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHRoaXMuc3RyaWRlICk7XG5cdFx0aWIuc2V0VXNhZ2UoIHRoaXMudXNhZ2UgKTtcblxuXHRcdHJldHVybiBpYjtcblxuXHR9LFxuXG5cdG9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkge1xuXG5cdFx0dGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0aWYgKCBkYXRhLmFycmF5QnVmZmVycyA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRkYXRhLmFycmF5QnVmZmVycyA9IHt9O1xuXG5cdFx0fVxuXG5cdFx0Ly8gZ2VuZXJhdGUgVVVJRCBmb3IgYXJyYXkgYnVmZmVyIGlmIG5lY2Vzc2FyeVxuXG5cdFx0aWYgKCB0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmFycmF5LmJ1ZmZlci5fdXVpZCA9IE1hdGhVdGlscy5nZW5lcmF0ZVVVSUQoKTtcblxuXHRcdH1cblxuXHRcdGlmICggZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0ZGF0YS5hcnJheUJ1ZmZlcnNbIHRoaXMuYXJyYXkuYnVmZmVyLl91dWlkIF0gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggbmV3IFVpbnQzMkFycmF5KCB0aGlzLmFycmF5LmJ1ZmZlciApICk7XG5cblx0XHR9XG5cblx0XHQvL1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHV1aWQ6IHRoaXMudXVpZCxcblx0XHRcdGJ1ZmZlcjogdGhpcy5hcnJheS5idWZmZXIuX3V1aWQsXG5cdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRzdHJpZGU6IHRoaXMuc3RyaWRlXG5cdFx0fTtcblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX3ZlY3RvciQ2ID0gbmV3IFZlY3RvcjMoKTtcblxuZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkge1xuXG5cdHRoaXMubmFtZSA9ICcnO1xuXG5cdHRoaXMuZGF0YSA9IGludGVybGVhdmVkQnVmZmVyO1xuXHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cdHRoaXMub2Zmc2V0ID0gb2Zmc2V0O1xuXG5cdHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7XG5cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGNvdW50OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5jb3VudDtcblxuXHRcdH1cblxuXHR9LFxuXG5cdGFycmF5OiB7XG5cblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdG5lZWRzVXBkYXRlOiB7XG5cblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdHRoaXMuZGF0YS5uZWVkc1VwZGF0ZSA9IHZhbHVlO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5PYmplY3QuYXNzaWduKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHtcblxuXHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5kYXRhLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYuYXBwbHlNYXRyaXg0KCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDYueCwgX3ZlY3RvciQ2LnksIF92ZWN0b3IkNi56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGFwcGx5Tm9ybWFsTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYuYXBwbHlOb3JtYWxNYXRyaXgoIG0gKTtcblxuXHRcdFx0dGhpcy5zZXRYWVooIGksIF92ZWN0b3IkNi54LCBfdmVjdG9yJDYueSwgX3ZlY3RvciQ2LnogKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0dHJhbnNmb3JtRGlyZWN0aW9uOiBmdW5jdGlvbiAoIG0gKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0X3ZlY3RvciQ2LnggPSB0aGlzLmdldFgoIGkgKTtcblx0XHRcdF92ZWN0b3IkNi55ID0gdGhpcy5nZXRZKCBpICk7XG5cdFx0XHRfdmVjdG9yJDYueiA9IHRoaXMuZ2V0WiggaSApO1xuXG5cdFx0XHRfdmVjdG9yJDYudHJhbnNmb3JtRGlyZWN0aW9uKCBtICk7XG5cblx0XHRcdHRoaXMuc2V0WFlaKCBpLCBfdmVjdG9yJDYueCwgX3ZlY3RvciQ2LnksIF92ZWN0b3IkNi56ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFg6IGZ1bmN0aW9uICggaW5kZXgsIHggKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0IF0gPSB4O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkge1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7XG5cblx0XHR0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMiBdID0gejtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0VzogZnVuY3Rpb24gKCBpbmRleCwgdyApIHtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAzIF0gPSB3O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTtcblxuXHR9LFxuXG5cdGdldFk6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXTtcblxuXHR9LFxuXG5cdGdldFo6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDIgXTtcblxuXHR9LFxuXG5cdGdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTtcblxuXHR9LFxuXG5cdHNldFhZOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5ICkge1xuXG5cdFx0aW5kZXggPSBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldDtcblxuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAwIF0gPSB4O1xuXHRcdHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7XG5cblx0XHRpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDIgXSA9IHo7XG5cdFx0dGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5jbG9uZSgpOiBDbG9uaW5nIGFuIGludGVybGF2ZWQgYnVmZmVyIGF0dHJpYnV0ZSB3aWxsIGRlaW50ZXJsZWF2ZSBidWZmZXIgZGF0YS4nICk7XG5cblx0XHRcdGNvbnN0IGFycmF5ID0gW107XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMuY291bnQ7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgaW5kZXggPSBpICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0O1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbVNpemU7IGogKysgKSB7XG5cblx0XHRcdFx0XHRhcnJheS5wdXNoKCB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgaiBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgdGhpcy5hcnJheS5jb25zdHJ1Y3RvciggYXJyYXkgKSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5ub3JtYWxpemVkICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPSB7fTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGRhdGEuaW50ZXJsZWF2ZWRCdWZmZXJzWyB0aGlzLmRhdGEudXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0ZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPSB0aGlzLmRhdGEuY2xvbmUoIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSwgdGhpcy5pdGVtU2l6ZSwgdGhpcy5vZmZzZXQsIHRoaXMubm9ybWFsaXplZCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dG9KU09OOiBmdW5jdGlvbiAoIGRhdGEgKSB7XG5cblx0XHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc29sZS5sb2coICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS50b0pTT04oKTogU2VyaWFsaXppbmcgYW4gaW50ZXJsYXZlZCBidWZmZXIgYXR0cmlidXRlIHdpbGwgZGVpbnRlcmxlYXZlIGJ1ZmZlciBkYXRhLicgKTtcblxuXHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5jb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGkgKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgdGhpcy5pdGVtU2l6ZTsgaiArKyApIHtcblxuXHRcdFx0XHRcdGFycmF5LnB1c2goIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyBqIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZGVpbnRlcmxlYXZlIGRhdGEgYW5kIHNhdmUgaXQgYXMgYW4gb3JkaW5hcnkgYnVmZmVyIGF0dHJpYnV0ZSBmb3Igbm93XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLFxuXHRcdFx0XHR0eXBlOiB0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsXG5cdFx0XHRcdGFycmF5OiBhcnJheSxcblx0XHRcdFx0bm9ybWFsaXplZDogdGhpcy5ub3JtYWxpemVkXG5cdFx0XHR9O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gc2F2ZSBhcyB0cnVlIGludGVybGF2ZWQgYXR0cmlidHVlXG5cblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnMgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVycyA9IHt9O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggZGF0YS5pbnRlcmxlYXZlZEJ1ZmZlcnNbIHRoaXMuZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkYXRhLmludGVybGVhdmVkQnVmZmVyc1sgdGhpcy5kYXRhLnV1aWQgXSA9IHRoaXMuZGF0YS50b0pTT04oIGRhdGEgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXHRcdFx0XHRpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcblx0XHRcdFx0ZGF0YTogdGhpcy5kYXRhLnV1aWQsXG5cdFx0XHRcdG9mZnNldDogdGhpcy5vZmZzZXQsXG5cdFx0XHRcdG5vcm1hbGl6ZWQ6IHRoaXMubm9ybWFsaXplZFxuXHRcdFx0fTtcblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgcm90YXRpb246IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBTcHJpdGVNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5yb3RhdGlvbiA9IDA7XG5cblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0XHR0aGlzLnRyYW5zcGFyZW50ID0gdHJ1ZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7XG5cblx0XHR0aGlzLnJvdGF0aW9uID0gc291cmNlLnJvdGF0aW9uO1xuXG5cdFx0dGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsID0gdHJ1ZTtcblxubGV0IF9nZW9tZXRyeTtcblxuY29uc3QgX2ludGVyc2VjdFBvaW50ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3dvcmxkU2NhbGUgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbXZQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY29uc3QgX2FsaWduZWRQb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcbmNvbnN0IF9yb3RhdGVkUG9zaXRpb24gPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdmlld1dvcmxkTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuXG5jb25zdCBfdkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdkIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdkMgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNvbnN0IF91dkEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5jb25zdCBfdXZCID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMigpO1xuY29uc3QgX3V2QyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjIoKTtcblxuY2xhc3MgU3ByaXRlIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCBtYXRlcmlhbCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU3ByaXRlJztcblxuXHRcdGlmICggX2dlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9nZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0XHRjb25zdCBmbG9hdDMyQXJyYXkgPSBuZXcgRmxvYXQzMkFycmF5KCBbXG5cdFx0XHRcdC0gMC41LCAtIDAuNSwgMCwgMCwgMCxcblx0XHRcdFx0MC41LCAtIDAuNSwgMCwgMSwgMCxcblx0XHRcdFx0MC41LCAwLjUsIDAsIDEsIDEsXG5cdFx0XHRcdC0gMC41LCAwLjUsIDAsIDAsIDFcblx0XHRcdF0gKTtcblxuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGZsb2F0MzJBcnJheSwgNSApO1xuXG5cdFx0XHRfZ2VvbWV0cnkuc2V0SW5kZXgoIFsgMCwgMSwgMixcdDAsIDIsIDMgXSApO1xuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMywgMCwgZmFsc2UgKSApO1xuXHRcdFx0X2dlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMiwgMywgZmFsc2UgKSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTtcblx0XHR0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpO1xuXG5cdFx0dGhpcy5jZW50ZXIgPSBuZXcgVmVjdG9yMiggMC41LCAwLjUgKTtcblxuXHR9XG5cblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhID09PSBudWxsICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU3ByaXRlOiBcIlJheWNhc3Rlci5jYW1lcmFcIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyApO1xuXG5cdFx0fVxuXG5cdFx0X3dvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7XG5cblx0XHRfdmlld1dvcmxkTWF0cml4LmNvcHkoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHR0aGlzLm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCByYXljYXN0ZXIuY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0X212UG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1vZGVsVmlld01hdHJpeCApO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIuY2FtZXJhLmlzUGVyc3BlY3RpdmVDYW1lcmEgJiYgdGhpcy5tYXRlcmlhbC5zaXplQXR0ZW51YXRpb24gPT09IGZhbHNlICkge1xuXG5cdFx0XHRfd29ybGRTY2FsZS5tdWx0aXBseVNjYWxhciggLSBfbXZQb3NpdGlvbi56ICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCByb3RhdGlvbiA9IHRoaXMubWF0ZXJpYWwucm90YXRpb247XG5cdFx0bGV0IHNpbiwgY29zO1xuXG5cdFx0aWYgKCByb3RhdGlvbiAhPT0gMCApIHtcblxuXHRcdFx0Y29zID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7XG5cdFx0XHRzaW4gPSBNYXRoLnNpbiggcm90YXRpb24gKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNlbnRlciA9IHRoaXMuY2VudGVyO1xuXG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkEuc2V0KCAtIDAuNSwgLSAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cdFx0dHJhbnNmb3JtVmVydGV4KCBfdkIuc2V0KCAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApO1xuXHRcdHRyYW5zZm9ybVZlcnRleCggX3ZDLnNldCggMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7XG5cblx0XHRfdXZBLnNldCggMCwgMCApO1xuXHRcdF91dkIuc2V0KCAxLCAwICk7XG5cdFx0X3V2Qy5zZXQoIDEsIDEgKTtcblxuXHRcdC8vIGNoZWNrIGZpcnN0IHRyaWFuZ2xlXG5cdFx0bGV0IGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZCLCBfdkMsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBzZWNvbmQgdHJpYW5nbGVcblx0XHRcdHRyYW5zZm9ybVZlcnRleCggX3ZCLnNldCggLSAwLjUsIDAuNSwgMCApLCBfbXZQb3NpdGlvbiwgY2VudGVyLCBfd29ybGRTY2FsZSwgc2luLCBjb3MgKTtcblx0XHRcdF91dkIuc2V0KCAwLCAxICk7XG5cblx0XHRcdGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSwgX3ZDLCBfdkIsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTtcblx0XHRcdGlmICggaW50ZXJzZWN0ID09PSBudWxsICkge1xuXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0UG9pbnQgKTtcblxuXHRcdGlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47XG5cblx0XHRpbnRlcnNlY3RzLnB1c2goIHtcblxuXHRcdFx0ZGlzdGFuY2U6IGRpc3RhbmNlLFxuXHRcdFx0cG9pbnQ6IF9pbnRlcnNlY3RQb2ludC5jbG9uZSgpLFxuXHRcdFx0dXY6IFRyaWFuZ2xlLmdldFVWKCBfaW50ZXJzZWN0UG9pbnQsIF92QSwgX3ZCLCBfdkMsIF91dkEsIF91dkIsIF91dkMsIG5ldyBWZWN0b3IyKCkgKSxcblx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdH0gKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHRpZiAoIHNvdXJjZS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRoaXMuY2VudGVyLmNvcHkoIHNvdXJjZS5jZW50ZXIgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU3ByaXRlLnByb3RvdHlwZS5pc1Nwcml0ZSA9IHRydWU7XG5cbmZ1bmN0aW9uIHRyYW5zZm9ybVZlcnRleCggdmVydGV4UG9zaXRpb24sIG12UG9zaXRpb24sIGNlbnRlciwgc2NhbGUsIHNpbiwgY29zICkge1xuXG5cdC8vIGNvbXB1dGUgcG9zaXRpb24gaW4gY2FtZXJhIHNwYWNlXG5cdF9hbGlnbmVkUG9zaXRpb24uc3ViVmVjdG9ycyggdmVydGV4UG9zaXRpb24sIGNlbnRlciApLmFkZFNjYWxhciggMC41ICkubXVsdGlwbHkoIHNjYWxlICk7XG5cblx0Ly8gdG8gY2hlY2sgaWYgcm90YXRpb24gaXMgbm90IHplcm9cblx0aWYgKCBzaW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdF9yb3RhdGVkUG9zaXRpb24ueCA9ICggY29zICogX2FsaWduZWRQb3NpdGlvbi54ICkgLSAoIHNpbiAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xuXHRcdF9yb3RhdGVkUG9zaXRpb24ueSA9ICggc2luICogX2FsaWduZWRQb3NpdGlvbi54ICkgKyAoIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHRfcm90YXRlZFBvc2l0aW9uLmNvcHkoIF9hbGlnbmVkUG9zaXRpb24gKTtcblxuXHR9XG5cblxuXHR2ZXJ0ZXhQb3NpdGlvbi5jb3B5KCBtdlBvc2l0aW9uICk7XG5cdHZlcnRleFBvc2l0aW9uLnggKz0gX3JvdGF0ZWRQb3NpdGlvbi54O1xuXHR2ZXJ0ZXhQb3NpdGlvbi55ICs9IF9yb3RhdGVkUG9zaXRpb24ueTtcblxuXHQvLyB0cmFuc2Zvcm0gdG8gd29ybGQgc3BhY2Vcblx0dmVydGV4UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfdmlld1dvcmxkTWF0cml4ICk7XG5cbn1cblxuY29uc3QgX3YxJDIgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjIkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgTE9EIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX2N1cnJlbnRMZXZlbCA9IDA7XG5cblx0XHR0aGlzLnR5cGUgPSAnTE9EJztcblxuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cdFx0XHRsZXZlbHM6IHtcblx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdFx0dmFsdWU6IFtdXG5cdFx0XHR9LFxuXHRcdFx0aXNMT0Q6IHtcblx0XHRcdFx0dmFsdWU6IHRydWUsXG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdFx0dGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCBmYWxzZSApO1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gc291cmNlLmxldmVscztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBsZXZlbCA9IGxldmVsc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmFkZExldmVsKCBsZXZlbC5vYmplY3QuY2xvbmUoKSwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHNvdXJjZS5hdXRvVXBkYXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZExldmVsKCBvYmplY3QsIGRpc3RhbmNlID0gMCApIHtcblxuXHRcdGRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7XG5cblx0XHRjb25zdCBsZXZlbHMgPSB0aGlzLmxldmVscztcblxuXHRcdGxldCBsO1xuXG5cdFx0Zm9yICggbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBsIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGxldmVscy5zcGxpY2UoIGwsIDAsIHsgZGlzdGFuY2U6IGRpc3RhbmNlLCBvYmplY3Q6IG9iamVjdCB9ICk7XG5cblx0XHR0aGlzLmFkZCggb2JqZWN0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q3VycmVudExldmVsKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnRMZXZlbDtcblxuXHR9XG5cblx0Z2V0T2JqZWN0Rm9yRGlzdGFuY2UoIGRpc3RhbmNlICkge1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRsZXQgaSwgbDtcblxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlIDwgbGV2ZWxzWyBpIF0uZGlzdGFuY2UgKSB7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cblx0cmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkge1xuXG5cdFx0Y29uc3QgbGV2ZWxzID0gdGhpcy5sZXZlbHM7XG5cblx0XHRpZiAoIGxldmVscy5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRfdjEkMi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubWF0cml4V29ybGQgKTtcblxuXHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfdjEkMiApO1xuXG5cdFx0XHR0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKCBkaXN0YW5jZSApLnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGUoIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0aWYgKCBsZXZlbHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0X3YxJDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTtcblx0XHRcdF92MiQxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApO1xuXG5cdFx0XHRjb25zdCBkaXN0YW5jZSA9IF92MSQyLmRpc3RhbmNlVG8oIF92MiQxICkgLyBjYW1lcmEuem9vbTtcblxuXHRcdFx0bGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRsZXQgaSwgbDtcblxuXHRcdFx0Zm9yICggaSA9IDEsIGwgPSBsZXZlbHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkge1xuXG5cdFx0XHRcdFx0bGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7XG5cdFx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY3VycmVudExldmVsID0gaSAtIDE7XG5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0bGV2ZWxzWyBpIF0ub2JqZWN0LnZpc2libGUgPSBmYWxzZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgKSBkYXRhLm9iamVjdC5hdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHRkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTtcblxuXHRcdGNvbnN0IGxldmVscyA9IHRoaXMubGV2ZWxzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBpIF07XG5cblx0XHRcdGRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7XG5cdFx0XHRcdG9iamVjdDogbGV2ZWwub2JqZWN0LnV1aWQsXG5cdFx0XHRcdGRpc3RhbmNlOiBsZXZlbC5kaXN0YW5jZVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9iYXNlUG9zaXRpb24gPSBuZXcgVmVjdG9yMygpO1xuXG5jb25zdCBfc2tpbkluZGV4ID0gbmV3IFZlY3RvcjQoKTtcbmNvbnN0IF9za2luV2VpZ2h0ID0gbmV3IFZlY3RvcjQoKTtcblxuY29uc3QgX3ZlY3RvciQ1ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9tYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBTa2lubmVkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsICkge1xuXG5cdE1lc2guY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0dGhpcy50eXBlID0gJ1NraW5uZWRNZXNoJztcblxuXHR0aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJztcblx0dGhpcy5iaW5kTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7XG5cbn1cblxuU2tpbm5lZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCxcblxuXHRpc1NraW5uZWRNZXNoOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0TWVzaC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuYmluZE1vZGUgPSBzb3VyY2UuYmluZE1vZGU7XG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIHNvdXJjZS5iaW5kTWF0cml4ICk7XG5cdFx0dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5jb3B5KCBzb3VyY2UuYmluZE1hdHJpeEludmVyc2UgKTtcblxuXHRcdHRoaXMuc2tlbGV0b24gPSBzb3VyY2Uuc2tlbGV0b247XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGJpbmQ6IGZ1bmN0aW9uICggc2tlbGV0b24sIGJpbmRNYXRyaXggKSB7XG5cblx0XHR0aGlzLnNrZWxldG9uID0gc2tlbGV0b247XG5cblx0XHRpZiAoIGJpbmRNYXRyaXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApO1xuXG5cdFx0XHR0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHRcdGJpbmRNYXRyaXggPSB0aGlzLm1hdHJpeFdvcmxkO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5iaW5kTWF0cml4LmNvcHkoIGJpbmRNYXRyaXggKTtcblx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIGJpbmRNYXRyaXggKS5pbnZlcnQoKTtcblxuXHR9LFxuXG5cdHBvc2U6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuc2tlbGV0b24ucG9zZSgpO1xuXG5cdH0sXG5cblx0bm9ybWFsaXplU2tpbldlaWdodHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IHZlY3RvciA9IG5ldyBWZWN0b3I0KCk7XG5cblx0XHRjb25zdCBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBza2luV2VpZ2h0LmNvdW50OyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0dmVjdG9yLnggPSBza2luV2VpZ2h0LmdldFgoIGkgKTtcblx0XHRcdHZlY3Rvci55ID0gc2tpbldlaWdodC5nZXRZKCBpICk7XG5cdFx0XHR2ZWN0b3IueiA9IHNraW5XZWlnaHQuZ2V0WiggaSApO1xuXHRcdFx0dmVjdG9yLncgPSBza2luV2VpZ2h0LmdldFcoIGkgKTtcblxuXHRcdFx0Y29uc3Qgc2NhbGUgPSAxLjAgLyB2ZWN0b3IubWFuaGF0dGFuTGVuZ3RoKCk7XG5cblx0XHRcdGlmICggc2NhbGUgIT09IEluZmluaXR5ICkge1xuXG5cdFx0XHRcdHZlY3Rvci5tdWx0aXBseVNjYWxhciggc2NhbGUgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR2ZWN0b3Iuc2V0KCAxLCAwLCAwLCAwICk7IC8vIGRvIHNvbWV0aGluZyByZWFzb25hYmxlXG5cblx0XHRcdH1cblxuXHRcdFx0c2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB2ZWN0b3IudyApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0dXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7XG5cblx0XHRNZXNoLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmJpbmRNb2RlID09PSAnYXR0YWNoZWQnICkge1xuXG5cdFx0XHR0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHRcdH0gZWxzZSBpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdkZXRhY2hlZCcgKSB7XG5cblx0XHRcdHRoaXMuYmluZE1hdHJpeEludmVyc2UuY29weSggdGhpcy5iaW5kTWF0cml4ICkuaW52ZXJ0KCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Ta2lubmVkTWVzaDogVW5yZWNvZ25pemVkIGJpbmRNb2RlOiAnICsgdGhpcy5iaW5kTW9kZSApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0Ym9uZVRyYW5zZm9ybTogZnVuY3Rpb24gKCBpbmRleCwgdGFyZ2V0ICkge1xuXG5cdFx0Y29uc3Qgc2tlbGV0b24gPSB0aGlzLnNrZWxldG9uO1xuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdF9za2luSW5kZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luSW5kZXgsIGluZGV4ICk7XG5cdFx0X3NraW5XZWlnaHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuYXR0cmlidXRlcy5za2luV2VpZ2h0LCBpbmRleCApO1xuXG5cdFx0X2Jhc2VQb3NpdGlvbi5mcm9tQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLCBpbmRleCApLmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4ICk7XG5cblx0XHR0YXJnZXQuc2V0KCAwLCAwLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA0OyBpICsrICkge1xuXG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBfc2tpbldlaWdodC5nZXRDb21wb25lbnQoIGkgKTtcblxuXHRcdFx0aWYgKCB3ZWlnaHQgIT09IDAgKSB7XG5cblx0XHRcdFx0Y29uc3QgYm9uZUluZGV4ID0gX3NraW5JbmRleC5nZXRDb21wb25lbnQoIGkgKTtcblxuXHRcdFx0XHRfbWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIHNrZWxldG9uLmJvbmVzWyBib25lSW5kZXggXS5tYXRyaXhXb3JsZCwgc2tlbGV0b24uYm9uZUludmVyc2VzWyBib25lSW5kZXggXSApO1xuXG5cdFx0XHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIF92ZWN0b3IkNS5jb3B5KCBfYmFzZVBvc2l0aW9uICkuYXBwbHlNYXRyaXg0KCBfbWF0cml4ICksIHdlaWdodCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LmFwcGx5TWF0cml4NCggdGhpcy5iaW5kTWF0cml4SW52ZXJzZSApO1xuXG5cdH1cblxufSApO1xuXG5mdW5jdGlvbiBCb25lKCkge1xuXG5cdE9iamVjdDNELmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnQm9uZSc7XG5cbn1cblxuQm9uZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBCb25lLFxuXG5cdGlzQm9uZTogdHJ1ZVxuXG59ICk7XG5cbmNvbnN0IF9vZmZzZXRNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfaWRlbnRpdHlNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5cbmNsYXNzIFNrZWxldG9uIHtcblxuXHRjb25zdHJ1Y3RvciggYm9uZXMgPSBbXSwgYm9uZUludmVyc2VzID0gW10gKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR0aGlzLmJvbmVzID0gYm9uZXMuc2xpY2UoIDAgKTtcblx0XHR0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcztcblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG51bGw7XG5cblx0XHR0aGlzLmJvbmVUZXh0dXJlID0gbnVsbDtcblx0XHR0aGlzLmJvbmVUZXh0dXJlU2l6ZSA9IDA7XG5cblx0XHR0aGlzLmZyYW1lID0gLSAxO1xuXG5cdFx0dGhpcy5pbml0KCk7XG5cblx0fVxuXG5cdGluaXQoKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cblx0XHR0aGlzLmJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIGJvbmVzLmxlbmd0aCAqIDE2ICk7XG5cblx0XHQvLyBjYWxjdWxhdGUgaW52ZXJzZSBib25lIG1hdHJpY2VzIGlmIG5lY2Vzc2FyeVxuXG5cdFx0aWYgKCBib25lSW52ZXJzZXMubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHR0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBoYW5kbGUgc3BlY2lhbCBjYXNlXG5cblx0XHRcdGlmICggYm9uZXMubGVuZ3RoICE9PSBib25lSW52ZXJzZXMubGVuZ3RoICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBOdW1iZXIgb2YgaW52ZXJzZSBib25lIG1hdHJpY2VzIGRvZXMgbm90IG1hdGNoIGFtb3VudCBvZiBib25lcy4nICk7XG5cblx0XHRcdFx0dGhpcy5ib25lSW52ZXJzZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIG5ldyBNYXRyaXg0KCkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Y2FsY3VsYXRlSW52ZXJzZXMoKSB7XG5cblx0XHR0aGlzLmJvbmVJbnZlcnNlcy5sZW5ndGggPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGludmVyc2UgPSBuZXcgTWF0cml4NCgpO1xuXG5cdFx0XHRpZiAoIHRoaXMuYm9uZXNbIGkgXSApIHtcblxuXHRcdFx0XHRpbnZlcnNlLmNvcHkoIHRoaXMuYm9uZXNbIGkgXS5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0cG9zZSgpIHtcblxuXHRcdC8vIHJlY292ZXIgdGhlIGJpbmQtdGltZSB3b3JsZCBtYXRyaWNlc1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZSApIHtcblxuXHRcdFx0XHRib25lLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKS5pbnZlcnQoKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgbG9jYWwgbWF0cmljZXMsIHBvc2l0aW9ucywgcm90YXRpb25zIGFuZCBzY2FsZXNcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBib25lID0gdGhpcy5ib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUgKSB7XG5cblx0XHRcdFx0aWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7XG5cblx0XHRcdFx0XHRib25lLm1hdHJpeC5jb3B5KCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApLmludmVydCgpO1xuXHRcdFx0XHRcdGJvbmUubWF0cml4Lm11bHRpcGx5KCBib25lLm1hdHJpeFdvcmxkICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGJvbmUubWF0cml4LmNvcHkoIGJvbmUubWF0cml4V29ybGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ym9uZS5tYXRyaXguZGVjb21wb3NlKCBib25lLnBvc2l0aW9uLCBib25lLnF1YXRlcm5pb24sIGJvbmUuc2NhbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cdFx0Y29uc3QgYm9uZUludmVyc2VzID0gdGhpcy5ib25lSW52ZXJzZXM7XG5cdFx0Y29uc3QgYm9uZU1hdHJpY2VzID0gdGhpcy5ib25lTWF0cmljZXM7XG5cdFx0Y29uc3QgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlO1xuXG5cdFx0Ly8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdC8vIGNvbXB1dGUgdGhlIG9mZnNldCBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgb3JpZ2luYWwgdHJhbnNmb3JtXG5cblx0XHRcdGNvbnN0IG1hdHJpeCA9IGJvbmVzWyBpIF0gPyBib25lc1sgaSBdLm1hdHJpeFdvcmxkIDogX2lkZW50aXR5TWF0cml4O1xuXG5cdFx0XHRfb2Zmc2V0TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIG1hdHJpeCwgYm9uZUludmVyc2VzWyBpIF0gKTtcblx0XHRcdF9vZmZzZXRNYXRyaXgudG9BcnJheSggYm9uZU1hdHJpY2VzLCBpICogMTYgKTtcblxuXHRcdH1cblxuXHRcdGlmICggYm9uZVRleHR1cmUgIT09IG51bGwgKSB7XG5cblx0XHRcdGJvbmVUZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IFNrZWxldG9uKCB0aGlzLmJvbmVzLCB0aGlzLmJvbmVJbnZlcnNlcyApO1xuXG5cdH1cblxuXHRnZXRCb25lQnlOYW1lKCBuYW1lICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07XG5cblx0XHRcdGlmICggYm9uZS5uYW1lID09PSBuYW1lICkge1xuXG5cdFx0XHRcdHJldHVybiBib25lO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdH1cblxuXHRkaXNwb3NlKCApIHtcblxuXHRcdGlmICggdGhpcy5ib25lVGV4dHVyZSAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5ib25lVGV4dHVyZS5kaXNwb3NlKCk7XG5cblx0XHRcdHRoaXMuYm9uZVRleHR1cmUgPSBudWxsO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiwgYm9uZXMgKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBqc29uLnV1aWQ7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmJvbmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHV1aWQgPSBqc29uLmJvbmVzWyBpIF07XG5cdFx0XHRsZXQgYm9uZSA9IGJvbmVzWyB1dWlkIF07XG5cblx0XHRcdGlmICggYm9uZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNrZWxldG9uOiBObyBib25lIGZvdW5kIHdpdGggVVVJRDonLCB1dWlkICk7XG5cdFx0XHRcdGJvbmUgPSBuZXcgQm9uZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuYm9uZXMucHVzaCggYm9uZSApO1xuXHRcdFx0dGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIGpzb24uYm9uZUludmVyc2VzWyBpIF0gKSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5pbml0KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHtcblx0XHRcdG1ldGFkYXRhOiB7XG5cdFx0XHRcdHZlcnNpb246IDQuNSxcblx0XHRcdFx0dHlwZTogJ1NrZWxldG9uJyxcblx0XHRcdFx0Z2VuZXJhdG9yOiAnU2tlbGV0b24udG9KU09OJ1xuXHRcdFx0fSxcblx0XHRcdGJvbmVzOiBbXSxcblx0XHRcdGJvbmVJbnZlcnNlczogW11cblx0XHR9O1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXG5cdFx0Y29uc3QgYm9uZXMgPSB0aGlzLmJvbmVzO1xuXHRcdGNvbnN0IGJvbmVJbnZlcnNlcyA9IHRoaXMuYm9uZUludmVyc2VzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gYm9uZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgYm9uZSA9IGJvbmVzWyBpIF07XG5cdFx0XHRkYXRhLmJvbmVzLnB1c2goIGJvbmUudXVpZCApO1xuXG5cdFx0XHRjb25zdCBib25lSW52ZXJzZSA9IGJvbmVJbnZlcnNlc1sgaSBdO1xuXHRcdFx0ZGF0YS5ib25lSW52ZXJzZXMucHVzaCggYm9uZUludmVyc2UudG9BcnJheSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuY29uc3QgX2luc3RhbmNlTG9jYWxNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2luc3RhbmNlV29ybGRNYXRyaXggPSBuZXcgTWF0cml4NCgpO1xuXG5jb25zdCBfaW5zdGFuY2VJbnRlcnNlY3RzID0gW107XG5cbmNvbnN0IF9tZXNoID0gbmV3IE1lc2goKTtcblxuZnVuY3Rpb24gSW5zdGFuY2VkTWVzaCggZ2VvbWV0cnksIG1hdGVyaWFsLCBjb3VudCApIHtcblxuXHRNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMuaW5zdGFuY2VNYXRyaXggPSBuZXcgQnVmZmVyQXR0cmlidXRlKCBuZXcgRmxvYXQzMkFycmF5KCBjb3VudCAqIDE2ICksIDE2ICk7XG5cdHRoaXMuaW5zdGFuY2VDb2xvciA9IG51bGw7XG5cblx0dGhpcy5jb3VudCA9IGNvdW50O1xuXG5cdHRoaXMuZnJ1c3R1bUN1bGxlZCA9IGZhbHNlO1xuXG59XG5cbkluc3RhbmNlZE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbnN0YW5jZWRNZXNoLFxuXG5cdGlzSW5zdGFuY2VkTWVzaDogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE1lc2gucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmluc3RhbmNlTWF0cml4LmNvcHkoIHNvdXJjZS5pbnN0YW5jZU1hdHJpeCApO1xuXG5cdFx0aWYgKCBzb3VyY2UuaW5zdGFuY2VDb2xvciAhPT0gbnVsbCApIHRoaXMuaW5zdGFuY2VDb2xvciA9IHNvdXJjZS5pbnN0YW5jZUNvbG9yLmNsb25lKCk7XG5cblx0XHR0aGlzLmNvdW50ID0gc291cmNlLmNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRnZXRDb2xvckF0OiBmdW5jdGlvbiAoIGluZGV4LCBjb2xvciApIHtcblxuXHRcdGNvbG9yLmZyb21BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcblxuXHR9LFxuXG5cdGdldE1hdHJpeEF0OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRtYXRyaXguZnJvbUFycmF5KCB0aGlzLmluc3RhbmNlTWF0cml4LmFycmF5LCBpbmRleCAqIDE2ICk7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDtcblx0XHRjb25zdCByYXljYXN0VGltZXMgPSB0aGlzLmNvdW50O1xuXG5cdFx0X21lc2guZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXHRcdF9tZXNoLm1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDtcblxuXHRcdGlmICggX21lc2gubWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjtcblxuXHRcdGZvciAoIGxldCBpbnN0YW5jZUlkID0gMDsgaW5zdGFuY2VJZCA8IHJheWNhc3RUaW1lczsgaW5zdGFuY2VJZCArKyApIHtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIHRoZSB3b3JsZCBtYXRyaXggZm9yIGVhY2ggaW5zdGFuY2VcblxuXHRcdFx0dGhpcy5nZXRNYXRyaXhBdCggaW5zdGFuY2VJZCwgX2luc3RhbmNlTG9jYWxNYXRyaXggKTtcblxuXHRcdFx0X2luc3RhbmNlV29ybGRNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggbWF0cml4V29ybGQsIF9pbnN0YW5jZUxvY2FsTWF0cml4ICk7XG5cblx0XHRcdC8vIHRoZSBtZXNoIHJlcHJlc2VudHMgdGhpcyBzaW5nbGUgaW5zdGFuY2VcblxuXHRcdFx0X21lc2gubWF0cml4V29ybGQgPSBfaW5zdGFuY2VXb3JsZE1hdHJpeDtcblxuXHRcdFx0X21lc2gucmF5Y2FzdCggcmF5Y2FzdGVyLCBfaW5zdGFuY2VJbnRlcnNlY3RzICk7XG5cblx0XHRcdC8vIHByb2Nlc3MgdGhlIHJlc3VsdCBvZiByYXljYXN0XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IF9pbnN0YW5jZUludGVyc2VjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBpbnRlcnNlY3QgPSBfaW5zdGFuY2VJbnRlcnNlY3RzWyBpIF07XG5cdFx0XHRcdGludGVyc2VjdC5pbnN0YW5jZUlkID0gaW5zdGFuY2VJZDtcblx0XHRcdFx0aW50ZXJzZWN0Lm9iamVjdCA9IHRoaXM7XG5cdFx0XHRcdGludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0X2luc3RhbmNlSW50ZXJzZWN0cy5sZW5ndGggPSAwO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0c2V0Q29sb3JBdDogZnVuY3Rpb24gKCBpbmRleCwgY29sb3IgKSB7XG5cblx0XHRpZiAoIHRoaXMuaW5zdGFuY2VDb2xvciA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5pbnN0YW5jZUNvbG9yID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggdGhpcy5jb3VudCAqIDMgKSwgMyApO1xuXG5cdFx0fVxuXG5cdFx0Y29sb3IudG9BcnJheSggdGhpcy5pbnN0YW5jZUNvbG9yLmFycmF5LCBpbmRleCAqIDMgKTtcblxuXHR9LFxuXG5cdHNldE1hdHJpeEF0OiBmdW5jdGlvbiAoIGluZGV4LCBtYXRyaXggKSB7XG5cblx0XHRtYXRyaXgudG9BcnJheSggdGhpcy5pbnN0YW5jZU1hdHJpeC5hcnJheSwgaW5kZXggKiAxNiApO1xuXG5cdH0sXG5cblx0dXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7XG5cblx0fSxcblxuXHRkaXNwb3NlOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTtcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBsaW5ld2lkdGg6IDxmbG9hdD4sXG4gKiAgbGluZWNhcDogXCJyb3VuZFwiLFxuICogIGxpbmVqb2luOiBcInJvdW5kXCJcbiAqIH1cbiAqL1xuXG5jbGFzcyBMaW5lQmFzaWNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubGluZXdpZHRoID0gMTtcblx0XHR0aGlzLmxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMubGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoO1xuXHRcdHRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwO1xuXHRcdHRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47XG5cblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTGluZUJhc2ljTWF0ZXJpYWwucHJvdG90eXBlLmlzTGluZUJhc2ljTWF0ZXJpYWwgPSB0cnVlO1xuXG5jb25zdCBfc3RhcnQkMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfZW5kJDEgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2ludmVyc2VNYXRyaXgkMSA9IG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfcmF5JDEgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlJDEgPSBuZXcgU3BoZXJlKCk7XG5cbmZ1bmN0aW9uIExpbmUoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lJztcblxuXHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnk7XG5cdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblxuXHR0aGlzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpO1xuXG59XG5cbkxpbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogTGluZSxcblxuXHRpc0xpbmU6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBzb3VyY2UubWF0ZXJpYWw7XG5cdFx0dGhpcy5nZW9tZXRyeSA9IHNvdXJjZS5nZW9tZXRyeTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0Y29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0Ly8gd2UgYXNzdW1lIG5vbi1pbmRleGVkIGdlb21ldHJ5XG5cblx0XHRcdGlmICggZ2VvbWV0cnkuaW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc3QgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uO1xuXHRcdFx0XHRjb25zdCBsaW5lRGlzdGFuY2VzID0gWyAwIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9zaXRpb25BdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0X3N0YXJ0JDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgLSAxICk7XG5cdFx0XHRcdFx0X2VuZCQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgXSArPSBfc3RhcnQkMS5kaXN0YW5jZVRvKCBfZW5kJDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0cmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkO1xuXHRcdGNvbnN0IHRocmVzaG9sZCA9IHJheWNhc3Rlci5wYXJhbXMuTGluZS50aHJlc2hvbGQ7XG5cdFx0Y29uc3QgZHJhd1JhbmdlID0gZ2VvbWV0cnkuZHJhd1JhbmdlO1xuXG5cdFx0Ly8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5XG5cblx0XHRpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRfc3BoZXJlJDEuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTtcblx0XHRfc3BoZXJlJDEuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdF9zcGhlcmUkMS5yYWRpdXMgKz0gdGhyZXNob2xkO1xuXG5cdFx0aWYgKCByYXljYXN0ZXIucmF5LmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMSApID09PSBmYWxzZSApIHJldHVybjtcblxuXHRcdC8vXG5cblx0XHRfaW52ZXJzZU1hdHJpeCQxLmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheSQxLmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4JDEgKTtcblxuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkID0gdGhyZXNob2xkIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApO1xuXHRcdGNvbnN0IGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkO1xuXG5cdFx0Y29uc3QgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB2RW5kID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBpbnRlclNlZ21lbnQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBzdGVwID0gdGhpcy5pc0xpbmVTZWdtZW50cyA/IDIgOiAxO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBpbmRleCA9IGdlb21ldHJ5LmluZGV4O1xuXHRcdFx0Y29uc3QgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7XG5cdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGlmICggaW5kZXggIT09IG51bGwgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBpbmRleC5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgYSA9IGluZGV4LmdldFgoIGkgKTtcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXguZ2V0WCggaSArIDEgKTtcblxuXHRcdFx0XHRcdHZTdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xuXHRcdFx0XHRcdHZFbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGIgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gbG9jYWxUaHJlc2hvbGRTcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc3Qgc3RhcnQgPSBNYXRoLm1heCggMCwgZHJhd1JhbmdlLnN0YXJ0ICk7XG5cdFx0XHRcdGNvbnN0IGVuZCA9IE1hdGgubWluKCBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudCwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gc3RhcnQsIGwgPSBlbmQgLSAxOyBpIDwgbDsgaSArPSBzdGVwICkge1xuXG5cdFx0XHRcdFx0dlN0YXJ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICk7XG5cdFx0XHRcdFx0dkVuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSArIDEgKTtcblxuXHRcdFx0XHRcdGNvbnN0IGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTtcblxuXHRcdFx0XHRcdGlmICggZGlzdFNxID4gbG9jYWxUaHJlc2hvbGRTcSApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvblxuXG5cdFx0XHRcdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApO1xuXG5cdFx0XHRcdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aW50ZXJzZWN0cy5wdXNoKCB7XG5cblx0XHRcdFx0XHRcdGRpc3RhbmNlOiBkaXN0YW5jZSxcblx0XHRcdFx0XHRcdC8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/P1xuXHRcdFx0XHRcdFx0Ly8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksXG5cdFx0XHRcdFx0XHRwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksXG5cdFx0XHRcdFx0XHRpbmRleDogaSxcblx0XHRcdFx0XHRcdGZhY2U6IG51bGwsXG5cdFx0XHRcdFx0XHRmYWNlSW5kZXg6IG51bGwsXG5cdFx0XHRcdFx0XHRvYmplY3Q6IHRoaXNcblxuXHRcdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVwZGF0ZU1vcnBoVGFyZ2V0czogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXM7XG5cdFx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApO1xuXG5cdFx0XHRpZiAoIGtleXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zdCBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sga2V5c1sgMCBdIF07XG5cblx0XHRcdFx0aWYgKCBtb3JwaEF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBbXTtcblx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwLCBtbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgbSA8IG1sOyBtICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBuYW1lID0gbW9ycGhBdHRyaWJ1dGVbIG0gXS5uYW1lIHx8IFN0cmluZyggbSApO1xuXG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7XG5cdFx0XHRcdFx0XHR0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGNvbnN0IG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cztcblxuXHRcdFx0aWYgKCBtb3JwaFRhcmdldHMgIT09IHVuZGVmaW5lZCAmJiBtb3JwaFRhcmdldHMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTGluZS51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuY29uc3QgX3N0YXJ0ID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9lbmQgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdHRoaXMudHlwZSA9ICdMaW5lU2VnbWVudHMnO1xuXG59XG5cbkxpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVTZWdtZW50cyxcblxuXHRpc0xpbmVTZWdtZW50czogdHJ1ZSxcblxuXHRjb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5O1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkge1xuXG5cdFx0XHQvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnlcblxuXHRcdFx0aWYgKCBnZW9tZXRyeS5pbmRleCA9PT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zdCBwb3NpdGlvbkF0dHJpYnV0ZSA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRcdGNvbnN0IGxpbmVEaXN0YW5jZXMgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBwb3NpdGlvbkF0dHJpYnV0ZS5jb3VudDsgaSA8IGw7IGkgKz0gMiApIHtcblxuXHRcdFx0XHRcdF9zdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXHRcdFx0XHRcdF9lbmQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKyAxICk7XG5cblx0XHRcdFx0XHRsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdO1xuXHRcdFx0XHRcdGxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBfc3RhcnQuZGlzdGFuY2VUbyggX2VuZCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbGluZURpc3RhbmNlcywgMSApICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGluZVNlZ21lbnRzLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4nICk7XG5cblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBMaW5lTG9vcCBleHRlbmRzIExpbmUge1xuXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUxvb3AnO1xuXG5cdH1cblxufVxuXG5MaW5lTG9vcC5wcm90b3R5cGUuaXNMaW5lTG9vcCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIHNpemU6IDxmbG9hdD4sXG4gKiAgc2l6ZUF0dGVudWF0aW9uOiA8Ym9vbD5cbiAqXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBQb2ludHNNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5zaXplID0gMTtcblx0XHR0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7XG5cblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplO1xuXHRcdHRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjtcblxuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5Qb2ludHNNYXRlcmlhbC5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbCA9IHRydWU7XG5cbmNvbnN0IF9pbnZlcnNlTWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcbmNvbnN0IF9yYXkgPSBuZXcgUmF5KCk7XG5jb25zdCBfc3BoZXJlID0gbmV3IFNwaGVyZSgpO1xuY29uc3QgX3Bvc2l0aW9uJDIgPSBuZXcgVmVjdG9yMygpO1xuXG5mdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCksIG1hdGVyaWFsID0gbmV3IFBvaW50c01hdGVyaWFsKCkgKSB7XG5cblx0T2JqZWN0M0QuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMudHlwZSA9ICdQb2ludHMnO1xuXG5cdHRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeTtcblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7XG5cbn1cblxuUG9pbnRzLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFBvaW50cyxcblxuXHRpc1BvaW50czogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdE9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tYXRlcmlhbCA9IHNvdXJjZS5tYXRlcmlhbDtcblx0XHR0aGlzLmdlb21ldHJ5ID0gc291cmNlLmdlb21ldHJ5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblx0XHRjb25zdCBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7XG5cdFx0Y29uc3QgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkO1xuXHRcdGNvbnN0IGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTtcblxuXHRcdC8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheVxuXG5cdFx0aWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0X3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApO1xuXHRcdF9zcGhlcmUuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXHRcdF9zcGhlcmUucmFkaXVzICs9IHRocmVzaG9sZDtcblxuXHRcdGlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly9cblxuXHRcdF9pbnZlcnNlTWF0cml4LmNvcHkoIG1hdHJpeFdvcmxkICkuaW52ZXJ0KCk7XG5cdFx0X3JheS5jb3B5KCByYXljYXN0ZXIucmF5ICkuYXBwbHlNYXRyaXg0KCBfaW52ZXJzZU1hdHJpeCApO1xuXG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGQgPSB0aHJlc2hvbGQgLyAoICggdGhpcy5zY2FsZS54ICsgdGhpcy5zY2FsZS55ICsgdGhpcy5zY2FsZS56ICkgLyAzICk7XG5cdFx0Y29uc3QgbG9jYWxUaHJlc2hvbGRTcSA9IGxvY2FsVGhyZXNob2xkICogbG9jYWxUaHJlc2hvbGQ7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7XG5cblx0XHRcdGNvbnN0IGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRjb25zdCBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlcztcblx0XHRcdGNvbnN0IHBvc2l0aW9uQXR0cmlidXRlID0gYXR0cmlidXRlcy5wb3NpdGlvbjtcblxuXHRcdFx0aWYgKCBpbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgaWwgPSBlbmQ7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleC5nZXRYKCBpICk7XG5cblx0XHRcdFx0XHRfcG9zaXRpb24kMi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgYSApO1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24kMiwgYSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTtcblx0XHRcdFx0Y29uc3QgZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uQXR0cmlidXRlLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9IGVuZDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRfcG9zaXRpb24kMi5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApO1xuXG5cdFx0XHRcdFx0dGVzdFBvaW50KCBfcG9zaXRpb24kMiwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlBvaW50cy5yYXljYXN0KCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHR1cGRhdGVNb3JwaFRhcmdldHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTtcblxuXHRcdGlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGVzID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzO1xuXHRcdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKCBtb3JwaEF0dHJpYnV0ZXMgKTtcblxuXHRcdFx0aWYgKCBrZXlzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc3QgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdO1xuXG5cdFx0XHRcdGlmICggbW9ycGhBdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzID0gW107XG5cdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnkgPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBtID0gMCwgbWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IG0gPCBtbDsgbSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTtcblxuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCggMCApO1xuXHRcdFx0XHRcdFx0dGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnlbIG5hbWUgXSA9IG07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldHMgPSBnZW9tZXRyeS5tb3JwaFRhcmdldHM7XG5cblx0XHRcdGlmICggbW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgJiYgbW9ycGhUYXJnZXRzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXgsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIG9iamVjdCApIHtcblxuXHRjb25zdCByYXlQb2ludERpc3RhbmNlU3EgPSBfcmF5LmRpc3RhbmNlU3FUb1BvaW50KCBwb2ludCApO1xuXG5cdGlmICggcmF5UG9pbnREaXN0YW5jZVNxIDwgbG9jYWxUaHJlc2hvbGRTcSApIHtcblxuXHRcdGNvbnN0IGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdF9yYXkuY2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGludGVyc2VjdFBvaW50ICk7XG5cdFx0aW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApO1xuXG5cdFx0Y29uc3QgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlcnNlY3RQb2ludCApO1xuXG5cdFx0aWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybjtcblxuXHRcdGludGVyc2VjdHMucHVzaCgge1xuXG5cdFx0XHRkaXN0YW5jZTogZGlzdGFuY2UsXG5cdFx0XHRkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLFxuXHRcdFx0cG9pbnQ6IGludGVyc2VjdFBvaW50LFxuXHRcdFx0aW5kZXg6IGluZGV4LFxuXHRcdFx0ZmFjZTogbnVsbCxcblx0XHRcdG9iamVjdDogb2JqZWN0XG5cblx0XHR9ICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIFZpZGVvVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkge1xuXG5cdFx0c3VwZXIoIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTtcblxuXHRcdHRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JGb3JtYXQ7XG5cblx0XHR0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdHRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHR0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0ZnVuY3Rpb24gdXBkYXRlVmlkZW8oKSB7XG5cblx0XHRcdHNjb3BlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblx0XHRcdHZpZGVvLnJlcXVlc3RWaWRlb0ZyYW1lQ2FsbGJhY2soIHVwZGF0ZVZpZGVvICk7XG5cblx0XHR9XG5cblx0XHRpZiAoICdyZXF1ZXN0VmlkZW9GcmFtZUNhbGxiYWNrJyBpbiB2aWRlbyApIHtcblxuXHRcdFx0dmlkZW8ucmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjayggdXBkYXRlVmlkZW8gKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuaW1hZ2UgKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdHVwZGF0ZSgpIHtcblxuXHRcdGNvbnN0IHZpZGVvID0gdGhpcy5pbWFnZTtcblx0XHRjb25zdCBoYXNWaWRlb0ZyYW1lQ2FsbGJhY2sgPSAncmVxdWVzdFZpZGVvRnJhbWVDYWxsYmFjaycgaW4gdmlkZW87XG5cblx0XHRpZiAoIGhhc1ZpZGVvRnJhbWVDYWxsYmFjayA9PT0gZmFsc2UgJiYgdmlkZW8ucmVhZHlTdGF0ZSA+PSB2aWRlby5IQVZFX0NVUlJFTlRfREFUQSApIHtcblxuXHRcdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cblZpZGVvVGV4dHVyZS5wcm90b3R5cGUuaXNWaWRlb1RleHR1cmUgPSB0cnVlO1xuXG5jbGFzcyBDb21wcmVzc2VkVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkge1xuXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTtcblxuXHRcdHRoaXMuaW1hZ2UgPSB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTtcblx0XHR0aGlzLm1pcG1hcHMgPSBtaXBtYXBzO1xuXG5cdFx0Ly8gbm8gZmxpcHBpbmcgZm9yIGN1YmUgdGV4dHVyZXNcblx0XHQvLyAoYWxzbyBmbGlwcGluZyBkb2Vzbid0IHdvcmsgZm9yIGNvbXByZXNzZWQgdGV4dHVyZXMgKVxuXG5cdFx0dGhpcy5mbGlwWSA9IGZhbHNlO1xuXG5cdFx0Ly8gY2FuJ3QgZ2VuZXJhdGUgbWlwbWFwcyBmb3IgY29tcHJlc3NlZCB0ZXh0dXJlc1xuXHRcdC8vIG1pcHMgbXVzdCBiZSBlbWJlZGRlZCBpbiBERFMgZmlsZXNcblxuXHRcdHRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7XG5cblx0fVxuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlLnByb3RvdHlwZS5pc0NvbXByZXNzZWRUZXh0dXJlID0gdHJ1ZTtcblxuY2xhc3MgQ2FudmFzVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApIHtcblxuXHRcdHN1cGVyKCBjYW52YXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0fVxuXG59XG5cbkNhbnZhc1RleHR1cmUucHJvdG90eXBlLmlzQ2FudmFzVGV4dHVyZSA9IHRydWU7XG5cbmNsYXNzIERlcHRoVGV4dHVyZSBleHRlbmRzIFRleHR1cmUge1xuXG5cdGNvbnN0cnVjdG9yKCB3aWR0aCwgaGVpZ2h0LCB0eXBlLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBhbmlzb3Ryb3B5LCBmb3JtYXQgKSB7XG5cblx0XHRmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0O1xuXG5cdFx0aWYgKCBmb3JtYXQgIT09IERlcHRoRm9ybWF0ICYmIGZvcm1hdCAhPT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7XG5cdFx0aWYgKCB0eXBlID09PSB1bmRlZmluZWQgJiYgZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB0eXBlID0gVW5zaWduZWRJbnQyNDhUeXBlO1xuXG5cdFx0c3VwZXIoIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSApO1xuXG5cdFx0dGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9O1xuXG5cdFx0dGhpcy5tYWdGaWx0ZXIgPSBtYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1hZ0ZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cdFx0dGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IE5lYXJlc3RGaWx0ZXI7XG5cblx0XHR0aGlzLmZsaXBZID0gZmFsc2U7XG5cdFx0dGhpcy5nZW5lcmF0ZU1pcG1hcHNcdD0gZmFsc2U7XG5cblx0fVxuXG5cbn1cblxuRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5pc0RlcHRoVGV4dHVyZSA9IHRydWU7XG5cbmNsYXNzIENpcmNsZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBzZWdtZW50cyA9IDgsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDaXJjbGVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdHNlZ21lbnRzOiBzZWdtZW50cyxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0c2VnbWVudHMgPSBNYXRoLm1heCggMywgc2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Ly8gY2VudGVyIHBvaW50XG5cblx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cdFx0dXZzLnB1c2goIDAuNSwgMC41ICk7XG5cblx0XHRmb3IgKCBsZXQgcyA9IDAsIGkgPSAzOyBzIDw9IHNlZ21lbnRzOyBzICsrLCBpICs9IDMgKSB7XG5cblx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgcyAvIHNlZ21lbnRzICogdGhldGFMZW5ndGg7XG5cblx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHR2ZXJ0ZXgueSA9IHJhZGl1cyAqIE1hdGguc2luKCBzZWdtZW50ICk7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdG5vcm1hbHMucHVzaCggMCwgMCwgMSApO1xuXG5cdFx0XHQvLyB1dnNcblxuXHRcdFx0dXYueCA9ICggdmVydGljZXNbIGkgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cdFx0XHR1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGluZGljZXMucHVzaCggaSwgaSArIDEsIDAgKTtcblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBDeWxpbmRlckdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXNUb3AgPSAxLCByYWRpdXNCb3R0b20gPSAxLCBoZWlnaHQgPSAxLCByYWRpYWxTZWdtZW50cyA9IDgsIGhlaWdodFNlZ21lbnRzID0gMSwgb3BlbkVuZGVkID0gZmFsc2UsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKiAyICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnQ3lsaW5kZXJHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXNUb3A6IHJhZGl1c1RvcCxcblx0XHRcdHJhZGl1c0JvdHRvbTogcmFkaXVzQm90dG9tLFxuXHRcdFx0aGVpZ2h0OiBoZWlnaHQsXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRvcGVuRW5kZWQ6IG9wZW5FbmRlZCxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXHRcdGhlaWdodFNlZ21lbnRzID0gTWF0aC5mbG9vciggaGVpZ2h0U2VnbWVudHMgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgaW5kZXhBcnJheSA9IFtdO1xuXHRcdGNvbnN0IGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXHRcdGxldCBncm91cFN0YXJ0ID0gMDtcblxuXHRcdC8vIGdlbmVyYXRlIGdlb21ldHJ5XG5cblx0XHRnZW5lcmF0ZVRvcnNvKCk7XG5cblx0XHRpZiAoIG9wZW5FbmRlZCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7XG5cdFx0XHRpZiAoIHJhZGl1c0JvdHRvbSA+IDAgKSBnZW5lcmF0ZUNhcCggZmFsc2UgKTtcblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVUb3JzbygpIHtcblxuXHRcdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGxldCBncm91cENvdW50ID0gMDtcblxuXHRcdFx0Ly8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWxcblx0XHRcdGNvbnN0IHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDtcblxuXHRcdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPD0gaGVpZ2h0U2VnbWVudHM7IHkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgaW5kZXhSb3cgPSBbXTtcblxuXHRcdFx0XHRjb25zdCB2ID0geSAvIGhlaWdodFNlZ21lbnRzO1xuXG5cdFx0XHRcdC8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvd1xuXG5cdFx0XHRcdGNvbnN0IHJhZGl1cyA9IHYgKiAoIHJhZGl1c0JvdHRvbSAtIHJhZGl1c1RvcCApICsgcmFkaXVzVG9wO1xuXG5cdFx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0XHRjb25zdCB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7XG5cblx0XHRcdFx0XHRjb25zdCBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApO1xuXHRcdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cblx0XHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHRcdHZlcnRleC54ID0gcmFkaXVzICogc2luVGhldGE7XG5cdFx0XHRcdFx0dmVydGV4LnkgPSAtIHYgKiBoZWlnaHQgKyBoYWxmSGVpZ2h0O1xuXHRcdFx0XHRcdHZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0XHRub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7XG5cdFx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0XHQvLyB1dlxuXG5cdFx0XHRcdFx0dXZzLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdFx0XHQvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvd1xuXG5cdFx0XHRcdFx0aW5kZXhSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbm93IHNhdmUgdmVydGljZXMgb2YgdGhlIHJvdyBpbiBvdXIgaW5kZXggYXJyYXlcblxuXHRcdFx0XHRpbmRleEFycmF5LnB1c2goIGluZGV4Um93ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPCByYWRpYWxTZWdtZW50czsgeCArKyApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHtcblxuXHRcdFx0XHRcdC8vIHdlIHVzZSB0aGUgaW5kZXggYXJyYXkgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IGluZGljZXNcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSBpbmRleEFycmF5WyB5IF1bIHggXTtcblx0XHRcdFx0XHRjb25zdCBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdO1xuXHRcdFx0XHRcdGNvbnN0IGMgPSBpbmRleEFycmF5WyB5ICsgMSBdWyB4ICsgMSBdO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSBpbmRleEFycmF5WyB5IF1bIHggKyAxIF07XG5cblx0XHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdFx0aW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdFx0XHQvLyB1cGRhdGUgZ3JvdXAgY291bnRlclxuXG5cdFx0XHRcdFx0Z3JvdXBDb3VudCArPSA2O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgMCApO1xuXG5cdFx0XHQvLyBjYWxjdWxhdGUgbmV3IHN0YXJ0IHZhbHVlIGZvciBncm91cHNcblxuXHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVDYXAoIHRvcCApIHtcblxuXHRcdFx0Ly8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4U3RhcnQgPSBpbmRleDtcblxuXHRcdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXHRcdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0XHRjb25zdCByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tO1xuXHRcdFx0Y29uc3Qgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxO1xuXG5cdFx0XHQvLyBmaXJzdCB3ZSBnZW5lcmF0ZSB0aGUgY2VudGVyIHZlcnRleCBkYXRhIG9mIHRoZSBjYXAuXG5cdFx0XHQvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSxcblx0XHRcdC8vIHdlIG11c3QgZ2VuZXJhdGUgYSBjZW50ZXIgdmVydGV4IHBlciBmYWNlL3NlZ21lbnRcblxuXHRcdFx0Zm9yICggbGV0IHggPSAxOyB4IDw9IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIGhhbGZIZWlnaHQgKiBzaWduLCAwICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggMC41LCAwLjUgKTtcblxuXHRcdFx0XHQvLyBpbmNyZWFzZSBpbmRleFxuXG5cdFx0XHRcdGluZGV4ICsrO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHNhdmUgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGNlbnRlciB2ZXJ0ZXhcblx0XHRcdGNvbnN0IGNlbnRlckluZGV4RW5kID0gaW5kZXg7XG5cblx0XHRcdC8vIG5vdyB3ZSBnZW5lcmF0ZSB0aGUgc3Vycm91bmRpbmcgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgeCA9IDA7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IHggLyByYWRpYWxTZWdtZW50cztcblx0XHRcdFx0Y29uc3QgdGhldGEgPSB1ICogdGhldGFMZW5ndGggKyB0aGV0YVN0YXJ0O1xuXG5cdFx0XHRcdGNvbnN0IGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7XG5cdFx0XHRcdGNvbnN0IHNpblRoZXRhID0gTWF0aC5zaW4oIHRoZXRhICk7XG5cblx0XHRcdFx0Ly8gdmVydGV4XG5cblx0XHRcdFx0dmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTtcblx0XHRcdFx0dmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjtcblx0XHRcdFx0dmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggMCwgc2lnbiwgMCApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXYueCA9ICggY29zVGhldGEgKiAwLjUgKSArIDAuNTtcblx0XHRcdFx0dXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7XG5cdFx0XHRcdHV2cy5wdXNoKCB1di54LCB1di55ICk7XG5cblx0XHRcdFx0Ly8gaW5jcmVhc2UgaW5kZXhcblxuXHRcdFx0XHRpbmRleCArKztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRcdGZvciAoIGxldCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGMgPSBjZW50ZXJJbmRleFN0YXJ0ICsgeDtcblx0XHRcdFx0Y29uc3QgaSA9IGNlbnRlckluZGV4RW5kICsgeDtcblxuXHRcdFx0XHRpZiAoIHRvcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdC8vIGZhY2UgdG9wXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGksIGkgKyAxLCBjICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGZhY2UgYm90dG9tXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGkgKyAxLCBpLCBjICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGdyb3VwQ291bnQgKz0gMztcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydFxuXG5cdFx0XHRzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgdG9wID09PSB0cnVlID8gMSA6IDIgKTtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzXG5cblx0XHRcdGdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgQ29uZUdlb21ldHJ5IGV4dGVuZHMgQ3lsaW5kZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGhlaWdodCA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgaGVpZ2h0U2VnbWVudHMgPSAxLCBvcGVuRW5kZWQgPSBmYWxzZSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlciggMCwgcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ0NvbmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGhlaWdodDogaGVpZ2h0LFxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0aGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLFxuXHRcdFx0b3BlbkVuZGVkOiBvcGVuRW5kZWQsXG5cdFx0XHR0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LFxuXHRcdFx0dGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoXG5cdFx0fTtcblxuXHR9XG5cbn1cblxuY2xhc3MgUG9seWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHZlcnRpY2VzOiB2ZXJ0aWNlcyxcblx0XHRcdGluZGljZXM6IGluZGljZXMsXG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGRldGFpbDogZGV0YWlsXG5cdFx0fTtcblxuXHRcdC8vIGRlZmF1bHQgYnVmZmVyIGRhdGFcblxuXHRcdGNvbnN0IHZlcnRleEJ1ZmZlciA9IFtdO1xuXHRcdGNvbnN0IHV2QnVmZmVyID0gW107XG5cblx0XHQvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhXG5cblx0XHRzdWJkaXZpZGUoIGRldGFpbCApO1xuXG5cdFx0Ly8gYWxsIHZlcnRpY2VzIHNob3VsZCBsaWUgb24gYSBjb25jZXB0dWFsIHNwaGVyZSB3aXRoIGEgZ2l2ZW4gcmFkaXVzXG5cblx0XHRhcHBseVJhZGl1cyggcmFkaXVzICk7XG5cblx0XHQvLyBmaW5hbGx5LCBjcmVhdGUgdGhlIHV2IGRhdGFcblxuXHRcdGdlbmVyYXRlVVZzKCk7XG5cblx0XHQvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0ZXhCdWZmZXIsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlci5zbGljZSgpLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QnVmZmVyLCAyICkgKTtcblxuXHRcdGlmICggZGV0YWlsID09PSAwICkge1xuXG5cdFx0XHR0aGlzLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7IC8vIGZsYXQgbm9ybWFsc1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7IC8vIHNtb290aCBub3JtYWxzXG5cblx0XHR9XG5cblx0XHQvLyBoZWxwZXIgZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBzdWJkaXZpZGUoIGRldGFpbCApIHtcblxuXHRcdFx0Y29uc3QgYSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRjb25zdCBiID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGMgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyBpdGVyYXRlIG92ZXIgYWxsIGZhY2VzIGFuZCBhcHBseSBhIHN1YmRpdmlzb24gd2l0aCB0aGUgZ2l2ZW4gZGV0YWlsIHZhbHVlXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0Ly8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZVxuXG5cdFx0XHRcdGdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTtcblx0XHRcdFx0Z2V0VmVydGV4QnlJbmRleCggaW5kaWNlc1sgaSArIDEgXSwgYiApO1xuXHRcdFx0XHRnZXRWZXJ0ZXhCeUluZGV4KCBpbmRpY2VzWyBpICsgMiBdLCBjICk7XG5cblx0XHRcdFx0Ly8gcGVyZm9ybSBzdWJkaXZpc2lvblxuXG5cdFx0XHRcdHN1YmRpdmlkZUZhY2UoIGEsIGIsIGMsIGRldGFpbCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzdWJkaXZpZGVGYWNlKCBhLCBiLCBjLCBkZXRhaWwgKSB7XG5cblx0XHRcdGNvbnN0IGNvbHMgPSBkZXRhaWwgKyAxO1xuXG5cdFx0XHQvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvblxuXG5cdFx0XHRjb25zdCB2ID0gW107XG5cblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIHZlcnRpY2VzIGZvciB0aGlzIHN1YmRpdmlzaW9uXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBjb2xzOyBpICsrICkge1xuXG5cdFx0XHRcdHZbIGkgXSA9IFtdO1xuXG5cdFx0XHRcdGNvbnN0IGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cdFx0XHRcdGNvbnN0IGJqID0gYi5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7XG5cblx0XHRcdFx0Y29uc3Qgcm93cyA9IGNvbHMgLSBpO1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByb3dzOyBqICsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBqID09PSAwICYmIGkgPT09IGNvbHMgKSB7XG5cblx0XHRcdFx0XHRcdHZbIGkgXVsgaiBdID0gYWo7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR2WyBpIF1bIGogXSA9IGFqLmNsb25lKCkubGVycCggYmosIGogLyByb3dzICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMiAqICggY29scyAtIGkgKSAtIDE7IGogKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBrID0gTWF0aC5mbG9vciggaiAvIDIgKTtcblxuXHRcdFx0XHRcdGlmICggaiAlIDIgPT09IDAgKSB7XG5cblx0XHRcdFx0XHRcdHB1c2hWZXJ0ZXgoIHZbIGkgXVsgayArIDEgXSApO1xuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0cHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrICsgMSBdICk7XG5cdFx0XHRcdFx0XHRwdXNoVmVydGV4KCB2WyBpICsgMSBdWyBrIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGFwcGx5UmFkaXVzKCByYWRpdXMgKSB7XG5cblx0XHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciB0aGUgZW50aXJlIGJ1ZmZlciBhbmQgYXBwbHkgdGhlIHJhZGl1cyB0byBlYWNoIHZlcnRleFxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0XHR2ZXJ0ZXgubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIHJhZGl1cyApO1xuXG5cdFx0XHRcdHZlcnRleEJ1ZmZlclsgaSArIDAgXSA9IHZlcnRleC54O1xuXHRcdFx0XHR2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTtcblx0XHRcdFx0dmVydGV4QnVmZmVyWyBpICsgMiBdID0gdmVydGV4Lno7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7XG5cblx0XHRcdFx0dmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07XG5cdFx0XHRcdHZlcnRleC55ID0gdmVydGV4QnVmZmVyWyBpICsgMSBdO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHZlcnRleEJ1ZmZlclsgaSArIDIgXTtcblxuXHRcdFx0XHRjb25zdCB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTtcblx0XHRcdFx0Y29uc3QgdiA9IGluY2xpbmF0aW9uKCB2ZXJ0ZXggKSAvIE1hdGguUEkgKyAwLjU7XG5cdFx0XHRcdHV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29ycmVjdFVWcygpO1xuXG5cdFx0XHRjb3JyZWN0U2VhbSgpO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gY29ycmVjdFNlYW0oKSB7XG5cblx0XHRcdC8vIGhhbmRsZSBjYXNlIHdoZW4gZmFjZSBzdHJhZGRsZXMgdGhlIHNlYW0sIHNlZSAjMzI2OVxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHtcblxuXHRcdFx0XHQvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2VcblxuXHRcdFx0XHRjb25zdCB4MCA9IHV2QnVmZmVyWyBpICsgMCBdO1xuXHRcdFx0XHRjb25zdCB4MSA9IHV2QnVmZmVyWyBpICsgMiBdO1xuXHRcdFx0XHRjb25zdCB4MiA9IHV2QnVmZmVyWyBpICsgNCBdO1xuXG5cdFx0XHRcdGNvbnN0IG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7XG5cdFx0XHRcdGNvbnN0IG1pbiA9IE1hdGgubWluKCB4MCwgeDEsIHgyICk7XG5cblx0XHRcdFx0Ly8gMC45IGlzIHNvbWV3aGF0IGFyYml0cmFyeVxuXG5cdFx0XHRcdGlmICggbWF4ID4gMC45ICYmIG1pbiA8IDAuMSApIHtcblxuXHRcdFx0XHRcdGlmICggeDAgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDAgXSArPSAxO1xuXHRcdFx0XHRcdGlmICggeDEgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDIgXSArPSAxO1xuXHRcdFx0XHRcdGlmICggeDIgPCAwLjIgKSB1dkJ1ZmZlclsgaSArIDQgXSArPSAxO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkge1xuXG5cdFx0XHR2ZXJ0ZXhCdWZmZXIucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2V0VmVydGV4QnlJbmRleCggaW5kZXgsIHZlcnRleCApIHtcblxuXHRcdFx0Y29uc3Qgc3RyaWRlID0gaW5kZXggKiAzO1xuXG5cdFx0XHR2ZXJ0ZXgueCA9IHZlcnRpY2VzWyBzdHJpZGUgKyAwIF07XG5cdFx0XHR2ZXJ0ZXgueSA9IHZlcnRpY2VzWyBzdHJpZGUgKyAxIF07XG5cdFx0XHR2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBjb3JyZWN0VVZzKCkge1xuXG5cdFx0XHRjb25zdCBhID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IGIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdFx0Y29uc3QgYyA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdGNvbnN0IGNlbnRyb2lkID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdFx0Y29uc3QgdXZBID0gbmV3IFZlY3RvcjIoKTtcblx0XHRcdGNvbnN0IHV2QiA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0XHRjb25zdCB1dkMgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgdmVydGV4QnVmZmVyLmxlbmd0aDsgaSArPSA5LCBqICs9IDYgKSB7XG5cblx0XHRcdFx0YS5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDAgXSwgdmVydGV4QnVmZmVyWyBpICsgMSBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAyIF0gKTtcblx0XHRcdFx0Yi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTtcblx0XHRcdFx0Yy5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDYgXSwgdmVydGV4QnVmZmVyWyBpICsgNyBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA4IF0gKTtcblxuXHRcdFx0XHR1dkEuc2V0KCB1dkJ1ZmZlclsgaiArIDAgXSwgdXZCdWZmZXJbIGogKyAxIF0gKTtcblx0XHRcdFx0dXZCLnNldCggdXZCdWZmZXJbIGogKyAyIF0sIHV2QnVmZmVyWyBqICsgMyBdICk7XG5cdFx0XHRcdHV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApO1xuXG5cdFx0XHRcdGNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTtcblxuXHRcdFx0XHRjb25zdCBhemkgPSBhemltdXRoKCBjZW50cm9pZCApO1xuXG5cdFx0XHRcdGNvcnJlY3RVViggdXZBLCBqICsgMCwgYSwgYXppICk7XG5cdFx0XHRcdGNvcnJlY3RVViggdXZCLCBqICsgMiwgYiwgYXppICk7XG5cdFx0XHRcdGNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGNvcnJlY3RVViggdXYsIHN0cmlkZSwgdmVjdG9yLCBhemltdXRoICkge1xuXG5cdFx0XHRpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHtcblxuXHRcdFx0XHR1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoICggdmVjdG9yLnggPT09IDAgKSAmJiAoIHZlY3Rvci56ID09PSAwICkgKSB7XG5cblx0XHRcdFx0dXZCdWZmZXJbIHN0cmlkZSBdID0gYXppbXV0aCAvIDIgLyBNYXRoLlBJICsgMC41O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBBbmdsZSBhcm91bmQgdGhlIFkgYXhpcywgY291bnRlci1jbG9ja3dpc2Ugd2hlbiBsb29raW5nIGZyb20gYWJvdmUuXG5cblx0XHRmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7XG5cblx0XHRcdHJldHVybiBNYXRoLmF0YW4yKCB2ZWN0b3IueiwgLSB2ZWN0b3IueCApO1xuXG5cdFx0fVxuXG5cblx0XHQvLyBBbmdsZSBhYm92ZSB0aGUgWFogcGxhbmUuXG5cblx0XHRmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkge1xuXG5cdFx0XHRyZXR1cm4gTWF0aC5hdGFuMiggLSB2ZWN0b3IueSwgTWF0aC5zcXJ0KCAoIHZlY3Rvci54ICogdmVjdG9yLnggKSArICggdmVjdG9yLnogKiB2ZWN0b3IueiApICkgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgRG9kZWNhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xuXG5cdFx0Y29uc3QgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuXHRcdGNvbnN0IHIgPSAxIC8gdDtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXG5cdFx0XHQvLyAoXHUwMEIxMSwgXHUwMEIxMSwgXHUwMEIxMSlcblx0XHRcdC0gMSwgLSAxLCAtIDEsXHQtIDEsIC0gMSwgMSxcblx0XHRcdC0gMSwgMSwgLSAxLCAtIDEsIDEsIDEsXG5cdFx0XHQxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLFxuXHRcdFx0MSwgMSwgLSAxLCAxLCAxLCAxLFxuXG5cdFx0XHQvLyAoMCwgXHUwMEIxMS9cdTAzQzYsIFx1MDBCMVx1MDNDNilcblx0XHRcdDAsIC0gciwgLSB0LCAwLCAtIHIsIHQsXG5cdFx0XHQwLCByLCAtIHQsIDAsIHIsIHQsXG5cblx0XHRcdC8vIChcdTAwQjExL1x1MDNDNiwgXHUwMEIxXHUwM0M2LCAwKVxuXHRcdFx0LSByLCAtIHQsIDAsIC0gciwgdCwgMCxcblx0XHRcdHIsIC0gdCwgMCwgciwgdCwgMCxcblxuXHRcdFx0Ly8gKFx1MDBCMVx1MDNDNiwgMCwgXHUwMEIxMS9cdTAzQzYpXG5cdFx0XHQtIHQsIDAsIC0gciwgdCwgMCwgLSByLFxuXHRcdFx0LSB0LCAwLCByLCB0LCAwLCByXG5cdFx0XTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXG5cdFx0XHQzLCAxMSwgNywgXHQzLCA3LCAxNSwgXHQzLCAxNSwgMTMsXG5cdFx0XHQ3LCAxOSwgMTcsIFx0NywgMTcsIDYsIFx0NywgNiwgMTUsXG5cdFx0XHQxNywgNCwgOCwgXHQxNywgOCwgMTAsIFx0MTcsIDEwLCA2LFxuXHRcdFx0OCwgMCwgMTYsIFx0OCwgMTYsIDIsIFx0OCwgMiwgMTAsXG5cdFx0XHQwLCAxMiwgMSwgXHQwLCAxLCAxOCwgXHQwLCAxOCwgMTYsXG5cdFx0XHQ2LCAxMCwgMiwgXHQ2LCAyLCAxMywgXHQ2LCAxMywgMTUsXG5cdFx0XHQyLCAxNiwgMTgsIFx0MiwgMTgsIDMsIFx0MiwgMywgMTMsXG5cdFx0XHQxOCwgMSwgOSwgXHQxOCwgOSwgMTEsIFx0MTgsIDExLCAzLFxuXHRcdFx0NCwgMTQsIDEyLCBcdDQsIDEyLCAwLCBcdDQsIDAsIDgsXG5cdFx0XHQxMSwgOSwgNSwgXHQxMSwgNSwgMTksIFx0MTEsIDE5LCA3LFxuXHRcdFx0MTksIDUsIDE0LCBcdDE5LCAxNCwgNCwgXHQxOSwgNCwgMTcsXG5cdFx0XHQxLCAxMiwgMTQsIFx0MSwgMTQsIDUsIFx0MSwgNSwgOVxuXHRcdF07XG5cblx0XHRzdXBlciggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxuXHRcdH07XG5cblx0fVxuXG59XG5cbmNvbnN0IF92MCA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfdjEkMSA9IG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF90cmlhbmdsZSA9IG5ldyBUcmlhbmdsZSgpO1xuXG5jbGFzcyBFZGdlc0dlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBnZW9tZXRyeSwgdGhyZXNob2xkQW5nbGUgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0VkZ2VzR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0dGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlXG5cdFx0fTtcblxuXHRcdHRocmVzaG9sZEFuZ2xlID0gKCB0aHJlc2hvbGRBbmdsZSAhPT0gdW5kZWZpbmVkICkgPyB0aHJlc2hvbGRBbmdsZSA6IDE7XG5cblx0XHRpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgPT09IHRydWUgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FZGdlc0dlb21ldHJ5IG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJlY2lzaW9uUG9pbnRzID0gNDtcblx0XHRjb25zdCBwcmVjaXNpb24gPSBNYXRoLnBvdyggMTAsIHByZWNpc2lvblBvaW50cyApO1xuXHRcdGNvbnN0IHRocmVzaG9sZERvdCA9IE1hdGguY29zKCBNYXRoVXRpbHMuREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7XG5cblx0XHRjb25zdCBpbmRleEF0dHIgPSBnZW9tZXRyeS5nZXRJbmRleCgpO1xuXHRcdGNvbnN0IHBvc2l0aW9uQXR0ciA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHRcdGNvbnN0IGluZGV4Q291bnQgPSBpbmRleEF0dHIgPyBpbmRleEF0dHIuY291bnQgOiBwb3NpdGlvbkF0dHIuY291bnQ7XG5cblx0XHRjb25zdCBpbmRleEFyciA9IFsgMCwgMCwgMCBdO1xuXHRcdGNvbnN0IHZlcnRLZXlzID0gWyAnYScsICdiJywgJ2MnIF07XG5cdFx0Y29uc3QgaGFzaGVzID0gbmV3IEFycmF5KCAzICk7XG5cblx0XHRjb25zdCBlZGdlRGF0YSA9IHt9O1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgaW5kZXhDb3VudDsgaSArPSAzICkge1xuXG5cdFx0XHRpZiAoIGluZGV4QXR0ciApIHtcblxuXHRcdFx0XHRpbmRleEFyclsgMCBdID0gaW5kZXhBdHRyLmdldFgoIGkgKTtcblx0XHRcdFx0aW5kZXhBcnJbIDEgXSA9IGluZGV4QXR0ci5nZXRYKCBpICsgMSApO1xuXHRcdFx0XHRpbmRleEFyclsgMiBdID0gaW5kZXhBdHRyLmdldFgoIGkgKyAyICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0aW5kZXhBcnJbIDAgXSA9IGk7XG5cdFx0XHRcdGluZGV4QXJyWyAxIF0gPSBpICsgMTtcblx0XHRcdFx0aW5kZXhBcnJbIDIgXSA9IGkgKyAyO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHsgYSwgYiwgYyB9ID0gX3RyaWFuZ2xlO1xuXHRcdFx0YS5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHIsIGluZGV4QXJyWyAwIF0gKTtcblx0XHRcdGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleEFyclsgMSBdICk7XG5cdFx0XHRjLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0ciwgaW5kZXhBcnJbIDIgXSApO1xuXHRcdFx0X3RyaWFuZ2xlLmdldE5vcm1hbCggX25vcm1hbCApO1xuXG5cdFx0XHQvLyBjcmVhdGUgaGFzaGVzIGZvciB0aGUgZWRnZSBmcm9tIHRoZSB2ZXJ0aWNlc1xuXHRcdFx0aGFzaGVzWyAwIF0gPSBgJHsgTWF0aC5yb3VuZCggYS54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBhLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGEueiAqIHByZWNpc2lvbiApIH1gO1xuXHRcdFx0aGFzaGVzWyAxIF0gPSBgJHsgTWF0aC5yb3VuZCggYi54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBiLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGIueiAqIHByZWNpc2lvbiApIH1gO1xuXHRcdFx0aGFzaGVzWyAyIF0gPSBgJHsgTWF0aC5yb3VuZCggYy54ICogcHJlY2lzaW9uICkgfSwkeyBNYXRoLnJvdW5kKCBjLnkgKiBwcmVjaXNpb24gKSB9LCR7IE1hdGgucm91bmQoIGMueiAqIHByZWNpc2lvbiApIH1gO1xuXG5cdFx0XHQvLyBza2lwIGRlZ2VuZXJhdGUgdHJpYW5nbGVzXG5cdFx0XHRpZiAoIGhhc2hlc1sgMCBdID09PSBoYXNoZXNbIDEgXSB8fCBoYXNoZXNbIDEgXSA9PT0gaGFzaGVzWyAyIF0gfHwgaGFzaGVzWyAyIF0gPT09IGhhc2hlc1sgMCBdICkge1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGl0ZXJhdGUgb3ZlciBldmVyeSBlZGdlXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCAzOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIGdldCB0aGUgZmlyc3QgYW5kIG5leHQgdmVydGV4IG1ha2luZyB1cCB0aGUgZWRnZVxuXHRcdFx0XHRjb25zdCBqTmV4dCA9ICggaiArIDEgKSAlIDM7XG5cdFx0XHRcdGNvbnN0IHZlY0hhc2gwID0gaGFzaGVzWyBqIF07XG5cdFx0XHRcdGNvbnN0IHZlY0hhc2gxID0gaGFzaGVzWyBqTmV4dCBdO1xuXHRcdFx0XHRjb25zdCB2MCA9IF90cmlhbmdsZVsgdmVydEtleXNbIGogXSBdO1xuXHRcdFx0XHRjb25zdCB2MSA9IF90cmlhbmdsZVsgdmVydEtleXNbIGpOZXh0IF0gXTtcblxuXHRcdFx0XHRjb25zdCBoYXNoID0gYCR7IHZlY0hhc2gwIH1fJHsgdmVjSGFzaDEgfWA7XG5cdFx0XHRcdGNvbnN0IHJldmVyc2VIYXNoID0gYCR7IHZlY0hhc2gxIH1fJHsgdmVjSGFzaDAgfWA7XG5cblx0XHRcdFx0aWYgKCByZXZlcnNlSGFzaCBpbiBlZGdlRGF0YSAmJiBlZGdlRGF0YVsgcmV2ZXJzZUhhc2ggXSApIHtcblxuXHRcdFx0XHRcdC8vIGlmIHdlIGZvdW5kIGEgc2libGluZyBlZGdlIGFkZCBpdCBpbnRvIHRoZSB2ZXJ0ZXggYXJyYXkgaWZcblx0XHRcdFx0XHQvLyBpdCBtZWV0cyB0aGUgYW5nbGUgdGhyZXNob2xkIGFuZCBkZWxldGUgdGhlIGVkZ2UgZnJvbSB0aGUgbWFwLlxuXHRcdFx0XHRcdGlmICggX25vcm1hbC5kb3QoIGVkZ2VEYXRhWyByZXZlcnNlSGFzaCBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHtcblxuXHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjAueCwgdjAueSwgdjAueiApO1xuXHRcdFx0XHRcdFx0dmVydGljZXMucHVzaCggdjEueCwgdjEueSwgdjEueiApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWRnZURhdGFbIHJldmVyc2VIYXNoIF0gPSBudWxsO1xuXG5cdFx0XHRcdH0gZWxzZSBpZiAoICEgKCBoYXNoIGluIGVkZ2VEYXRhICkgKSB7XG5cblx0XHRcdFx0XHQvLyBpZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBlZGdlIGhlcmUgdGhlbiBza2lwIGFkZGluZyBhIG5ldyBvbmVcblx0XHRcdFx0XHRlZGdlRGF0YVsgaGFzaCBdID0ge1xuXG5cdFx0XHRcdFx0XHRpbmRleDA6IGluZGV4QXJyWyBqIF0sXG5cdFx0XHRcdFx0XHRpbmRleDE6IGluZGV4QXJyWyBqTmV4dCBdLFxuXHRcdFx0XHRcdFx0bm9ybWFsOiBfbm9ybWFsLmNsb25lKCksXG5cblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gaXRlcmF0ZSBvdmVyIGFsbCByZW1haW5pbmcsIHVubWF0Y2hlZCBlZGdlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIHZlcnRleCBhcnJheVxuXHRcdGZvciAoIGNvbnN0IGtleSBpbiBlZGdlRGF0YSApIHtcblxuXHRcdFx0aWYgKCBlZGdlRGF0YVsga2V5IF0gKSB7XG5cblx0XHRcdFx0Y29uc3QgeyBpbmRleDAsIGluZGV4MSB9ID0gZWRnZURhdGFbIGtleSBdO1xuXHRcdFx0XHRfdjAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDAgKTtcblx0XHRcdFx0X3YxJDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyLCBpbmRleDEgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCBfdjAueCwgX3YwLnksIF92MC56ICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIF92MSQxLngsIF92MSQxLnksIF92MSQxLnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cblx0fVxuXG59XG5cbi8qKlxuICogUG9ydCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvZWFyY3V0ICh2Mi4yLjIpXG4gKi9cblxuY29uc3QgRWFyY3V0ID0ge1xuXG5cdHRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7XG5cblx0XHRkaW0gPSBkaW0gfHwgMjtcblxuXHRcdGNvbnN0IGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuXHRcdGNvbnN0IG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGg7XG5cdFx0bGV0IG91dGVyTm9kZSA9IGxpbmtlZExpc3QoIGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUgKTtcblx0XHRjb25zdCB0cmlhbmdsZXMgPSBbXTtcblxuXHRcdGlmICggISBvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2ICkgcmV0dXJuIHRyaWFuZ2xlcztcblxuXHRcdGxldCBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplO1xuXG5cdFx0aWYgKCBoYXNIb2xlcyApIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKTtcblxuXHRcdC8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveFxuXHRcdGlmICggZGF0YS5sZW5ndGggPiA4MCAqIGRpbSApIHtcblxuXHRcdFx0bWluWCA9IG1heFggPSBkYXRhWyAwIF07XG5cdFx0XHRtaW5ZID0gbWF4WSA9IGRhdGFbIDEgXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSBkaW07IGkgPCBvdXRlckxlbjsgaSArPSBkaW0gKSB7XG5cblx0XHRcdFx0eCA9IGRhdGFbIGkgXTtcblx0XHRcdFx0eSA9IGRhdGFbIGkgKyAxIF07XG5cdFx0XHRcdGlmICggeCA8IG1pblggKSBtaW5YID0geDtcblx0XHRcdFx0aWYgKCB5IDwgbWluWSApIG1pblkgPSB5O1xuXHRcdFx0XHRpZiAoIHggPiBtYXhYICkgbWF4WCA9IHg7XG5cdFx0XHRcdGlmICggeSA+IG1heFkgKSBtYXhZID0geTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBtaW5YLCBtaW5ZIGFuZCBpbnZTaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuXHRcdFx0aW52U2l6ZSA9IE1hdGgubWF4KCBtYXhYIC0gbWluWCwgbWF4WSAtIG1pblkgKTtcblx0XHRcdGludlNpemUgPSBpbnZTaXplICE9PSAwID8gMSAvIGludlNpemUgOiAwO1xuXG5cdFx0fVxuXG5cdFx0ZWFyY3V0TGlua2VkKCBvdXRlck5vZGUsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0XHRyZXR1cm4gdHJpYW5nbGVzO1xuXG5cdH1cblxufTtcblxuLy8gY3JlYXRlIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IGZyb20gcG9seWdvbiBwb2ludHMgaW4gdGhlIHNwZWNpZmllZCB3aW5kaW5nIG9yZGVyXG5mdW5jdGlvbiBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGNsb2Nrd2lzZSApIHtcblxuXHRsZXQgaSwgbGFzdDtcblxuXHRpZiAoIGNsb2Nrd2lzZSA9PT0gKCBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSA+IDAgKSApIHtcblxuXHRcdGZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdGZvciAoIGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltICkgbGFzdCA9IGluc2VydE5vZGUoIGksIGRhdGFbIGkgXSwgZGF0YVsgaSArIDEgXSwgbGFzdCApO1xuXG5cdH1cblxuXHRpZiAoIGxhc3QgJiYgZXF1YWxzKCBsYXN0LCBsYXN0Lm5leHQgKSApIHtcblxuXHRcdHJlbW92ZU5vZGUoIGxhc3QgKTtcblx0XHRsYXN0ID0gbGFzdC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gbGFzdDtcblxufVxuXG4vLyBlbGltaW5hdGUgY29saW5lYXIgb3IgZHVwbGljYXRlIHBvaW50c1xuZnVuY3Rpb24gZmlsdGVyUG9pbnRzKCBzdGFydCwgZW5kICkge1xuXG5cdGlmICggISBzdGFydCApIHJldHVybiBzdGFydDtcblx0aWYgKCAhIGVuZCApIGVuZCA9IHN0YXJ0O1xuXG5cdGxldCBwID0gc3RhcnQsXG5cdFx0YWdhaW47XG5cdGRvIHtcblxuXHRcdGFnYWluID0gZmFsc2U7XG5cblx0XHRpZiAoICEgcC5zdGVpbmVyICYmICggZXF1YWxzKCBwLCBwLm5leHQgKSB8fCBhcmVhKCBwLnByZXYsIHAsIHAubmV4dCApID09PSAwICkgKSB7XG5cblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHAgPSBlbmQgPSBwLnByZXY7XG5cdFx0XHRpZiAoIHAgPT09IHAubmV4dCApIGJyZWFrO1xuXHRcdFx0YWdhaW4gPSB0cnVlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cCA9IHAubmV4dDtcblxuXHRcdH1cblxuXHR9IHdoaWxlICggYWdhaW4gfHwgcCAhPT0gZW5kICk7XG5cblx0cmV0dXJuIGVuZDtcblxufVxuXG4vLyBtYWluIGVhciBzbGljaW5nIGxvb3Agd2hpY2ggdHJpYW5ndWxhdGVzIGEgcG9seWdvbiAoZ2l2ZW4gYXMgYSBsaW5rZWQgbGlzdClcbmZ1bmN0aW9uIGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgcGFzcyApIHtcblxuXHRpZiAoICEgZWFyICkgcmV0dXJuO1xuXG5cdC8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcblx0aWYgKCAhIHBhc3MgJiYgaW52U2l6ZSApIGluZGV4Q3VydmUoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXG5cdGxldCBzdG9wID0gZWFyLFxuXHRcdHByZXYsIG5leHQ7XG5cblx0Ly8gaXRlcmF0ZSB0aHJvdWdoIGVhcnMsIHNsaWNpbmcgdGhlbSBvbmUgYnkgb25lXG5cdHdoaWxlICggZWFyLnByZXYgIT09IGVhci5uZXh0ICkge1xuXG5cdFx0cHJldiA9IGVhci5wcmV2O1xuXHRcdG5leHQgPSBlYXIubmV4dDtcblxuXHRcdGlmICggaW52U2l6ZSA/IGlzRWFySGFzaGVkKCBlYXIsIG1pblgsIG1pblksIGludlNpemUgKSA6IGlzRWFyKCBlYXIgKSApIHtcblxuXHRcdFx0Ly8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBwcmV2LmkgLyBkaW0gKTtcblx0XHRcdHRyaWFuZ2xlcy5wdXNoKCBlYXIuaSAvIGRpbSApO1xuXHRcdFx0dHJpYW5nbGVzLnB1c2goIG5leHQuaSAvIGRpbSApO1xuXG5cdFx0XHRyZW1vdmVOb2RlKCBlYXIgKTtcblxuXHRcdFx0Ly8gc2tpcHBpbmcgdGhlIG5leHQgdmVydGV4IGxlYWRzIHRvIGxlc3Mgc2xpdmVyIHRyaWFuZ2xlc1xuXHRcdFx0ZWFyID0gbmV4dC5uZXh0O1xuXHRcdFx0c3RvcCA9IG5leHQubmV4dDtcblxuXHRcdFx0Y29udGludWU7XG5cblx0XHR9XG5cblx0XHRlYXIgPSBuZXh0O1xuXG5cdFx0Ly8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcblx0XHRpZiAoIGVhciA9PT0gc3RvcCApIHtcblxuXHRcdFx0Ly8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cblx0XHRcdGlmICggISBwYXNzICkge1xuXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZmlsdGVyUG9pbnRzKCBlYXIgKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIDEgKTtcblxuXHRcdFx0XHQvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBwYXNzID09PSAxICkge1xuXG5cdFx0XHRcdGVhciA9IGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltICk7XG5cdFx0XHRcdGVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApO1xuXG5cdFx0XHRcdC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG5cblx0XHRcdH0gZWxzZSBpZiAoIHBhc3MgPT09IDIgKSB7XG5cblx0XHRcdFx0c3BsaXRFYXJjdXQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRicmVhaztcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gY2hlY2sgd2hldGhlciBhIHBvbHlnb24gbm9kZSBmb3JtcyBhIHZhbGlkIGVhciB3aXRoIGFkamFjZW50IG5vZGVzXG5mdW5jdGlvbiBpc0VhciggZWFyICkge1xuXG5cdGNvbnN0IGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyXG5cdGxldCBwID0gZWFyLm5leHQubmV4dDtcblxuXHR3aGlsZSAoIHAgIT09IGVhci5wcmV2ICkge1xuXG5cdFx0aWYgKCBwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH1cblxuXHRyZXR1cm4gdHJ1ZTtcblxufVxuXG5mdW5jdGlvbiBpc0Vhckhhc2hlZCggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdGNvbnN0IGEgPSBlYXIucHJldixcblx0XHRiID0gZWFyLFxuXHRcdGMgPSBlYXIubmV4dDtcblxuXHRpZiAoIGFyZWEoIGEsIGIsIGMgKSA+PSAwICkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG5cdC8vIHRyaWFuZ2xlIGJib3g7IG1pbiAmIG1heCBhcmUgY2FsY3VsYXRlZCBsaWtlIHRoaXMgZm9yIHNwZWVkXG5cdGNvbnN0IG1pblRYID0gYS54IDwgYi54ID8gKCBhLnggPCBjLnggPyBhLnggOiBjLnggKSA6ICggYi54IDwgYy54ID8gYi54IDogYy54ICksXG5cdFx0bWluVFkgPSBhLnkgPCBiLnkgPyAoIGEueSA8IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPCBjLnkgPyBiLnkgOiBjLnkgKSxcblx0XHRtYXhUWCA9IGEueCA+IGIueCA/ICggYS54ID4gYy54ID8gYS54IDogYy54ICkgOiAoIGIueCA+IGMueCA/IGIueCA6IGMueCApLFxuXHRcdG1heFRZID0gYS55ID4gYi55ID8gKCBhLnkgPiBjLnkgPyBhLnkgOiBjLnkgKSA6ICggYi55ID4gYy55ID8gYi55IDogYy55ICk7XG5cblx0Ly8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcblx0Y29uc3QgbWluWiA9IHpPcmRlciggbWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICksXG5cdFx0bWF4WiA9IHpPcmRlciggbWF4VFgsIG1heFRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7XG5cblx0bGV0IHAgPSBlYXIucHJldlosXG5cdFx0biA9IGVhci5uZXh0WjtcblxuXHQvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBib3RoIGRpcmVjdGlvbnNcblx0d2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5wcmV2WjtcblxuXHRcdGlmICggbiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiZcblx0XHRcdHBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkgKSAmJlxuXHRcdFx0YXJlYSggbi5wcmV2LCBuLCBuLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlO1xuXHRcdG4gPSBuLm5leHRaO1xuXG5cdH1cblxuXHQvLyBsb29rIGZvciByZW1haW5pbmcgcG9pbnRzIGluIGRlY3JlYXNpbmcgei1vcmRlclxuXHR3aGlsZSAoIHAgJiYgcC56ID49IG1pblogKSB7XG5cblx0XHRpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG5cdFx0XHRwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiZcblx0XHRcdGFyZWEoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTtcblx0XHRwID0gcC5wcmV2WjtcblxuXHR9XG5cblx0Ly8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBpbmNyZWFzaW5nIHotb3JkZXJcblx0d2hpbGUgKCBuICYmIG4ueiA8PSBtYXhaICkge1xuXG5cdFx0aWYgKCBuICE9PSBlYXIucHJldiAmJiBuICE9PSBlYXIubmV4dCAmJlxuXHRcdFx0cG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBuLngsIG4ueSApICYmXG5cdFx0XHRhcmVhKCBuLnByZXYsIG4sIG4ubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7XG5cdFx0biA9IG4ubmV4dFo7XG5cblx0fVxuXG5cdHJldHVybiB0cnVlO1xuXG59XG5cbi8vIGdvIHRocm91Z2ggYWxsIHBvbHlnb24gbm9kZXMgYW5kIGN1cmUgc21hbGwgbG9jYWwgc2VsZi1pbnRlcnNlY3Rpb25zXG5mdW5jdGlvbiBjdXJlTG9jYWxJbnRlcnNlY3Rpb25zKCBzdGFydCwgdHJpYW5nbGVzLCBkaW0gKSB7XG5cblx0bGV0IHAgPSBzdGFydDtcblx0ZG8ge1xuXG5cdFx0Y29uc3QgYSA9IHAucHJldixcblx0XHRcdGIgPSBwLm5leHQubmV4dDtcblxuXHRcdGlmICggISBlcXVhbHMoIGEsIGIgKSAmJiBpbnRlcnNlY3RzKCBhLCBwLCBwLm5leHQsIGIgKSAmJiBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICkge1xuXG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7XG5cdFx0XHR0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7XG5cblx0XHRcdC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcblx0XHRcdHJlbW92ZU5vZGUoIHAgKTtcblx0XHRcdHJlbW92ZU5vZGUoIHAubmV4dCApO1xuXG5cdFx0XHRwID0gc3RhcnQgPSBiO1xuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RhcnQgKTtcblxuXHRyZXR1cm4gZmlsdGVyUG9pbnRzKCBwICk7XG5cbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KCBzdGFydCwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gbG9vayBmb3IgYSB2YWxpZCBkaWFnb25hbCB0aGF0IGRpdmlkZXMgdGhlIHBvbHlnb24gaW50byB0d29cblx0bGV0IGEgPSBzdGFydDtcblx0ZG8ge1xuXG5cdFx0bGV0IGIgPSBhLm5leHQubmV4dDtcblx0XHR3aGlsZSAoIGIgIT09IGEucHJldiApIHtcblxuXHRcdFx0aWYgKCBhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoIGEsIGIgKSApIHtcblxuXHRcdFx0XHQvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG5cdFx0XHRcdGxldCBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7XG5cblx0XHRcdFx0Ly8gZmlsdGVyIGNvbGluZWFyIHBvaW50cyBhcm91bmQgdGhlIGN1dHNcblx0XHRcdFx0YSA9IGZpbHRlclBvaW50cyggYSwgYS5uZXh0ICk7XG5cdFx0XHRcdGMgPSBmaWx0ZXJQb2ludHMoIGMsIGMubmV4dCApO1xuXG5cdFx0XHRcdC8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmXG5cdFx0XHRcdGVhcmN1dExpbmtlZCggYSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTtcblx0XHRcdFx0ZWFyY3V0TGlua2VkKCBjLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdH1cblxuXHRcdFx0YiA9IGIubmV4dDtcblxuXHRcdH1cblxuXHRcdGEgPSBhLm5leHQ7XG5cblx0fSB3aGlsZSAoIGEgIT09IHN0YXJ0ICk7XG5cbn1cblxuLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlc1xuZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHtcblxuXHRjb25zdCBxdWV1ZSA9IFtdO1xuXHRsZXQgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG5cdGZvciAoIGkgPSAwLCBsZW4gPSBob2xlSW5kaWNlcy5sZW5ndGg7IGkgPCBsZW47IGkgKysgKSB7XG5cblx0XHRzdGFydCA9IGhvbGVJbmRpY2VzWyBpIF0gKiBkaW07XG5cdFx0ZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoO1xuXHRcdGxpc3QgPSBsaW5rZWRMaXN0KCBkYXRhLCBzdGFydCwgZW5kLCBkaW0sIGZhbHNlICk7XG5cdFx0aWYgKCBsaXN0ID09PSBsaXN0Lm5leHQgKSBsaXN0LnN0ZWluZXIgPSB0cnVlO1xuXHRcdHF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTtcblxuXHR9XG5cblx0cXVldWUuc29ydCggY29tcGFyZVggKTtcblxuXHQvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodFxuXHRmb3IgKCBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGVsaW1pbmF0ZUhvbGUoIHF1ZXVlWyBpIF0sIG91dGVyTm9kZSApO1xuXHRcdG91dGVyTm9kZSA9IGZpbHRlclBvaW50cyggb3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCApO1xuXG5cdH1cblxuXHRyZXR1cm4gb3V0ZXJOb2RlO1xuXG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKCBhLCBiICkge1xuXG5cdHJldHVybiBhLnggLSBiLng7XG5cbn1cblxuLy8gZmluZCBhIGJyaWRnZSBiZXR3ZWVuIHZlcnRpY2VzIHRoYXQgY29ubmVjdHMgaG9sZSB3aXRoIGFuIG91dGVyIHJpbmcgYW5kIGFuZCBsaW5rIGl0XG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlKCBob2xlLCBvdXRlck5vZGUgKSB7XG5cblx0b3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApO1xuXHRpZiAoIG91dGVyTm9kZSApIHtcblxuXHRcdGNvbnN0IGIgPSBzcGxpdFBvbHlnb24oIG91dGVyTm9kZSwgaG9sZSApO1xuXG5cdFx0Ly8gZmlsdGVyIGNvbGxpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzXG5cdFx0ZmlsdGVyUG9pbnRzKCBvdXRlck5vZGUsIG91dGVyTm9kZS5uZXh0ICk7XG5cdFx0ZmlsdGVyUG9pbnRzKCBiLCBiLm5leHQgKTtcblxuXHR9XG5cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApIHtcblxuXHRsZXQgcCA9IG91dGVyTm9kZTtcblx0Y29uc3QgaHggPSBob2xlLng7XG5cdGNvbnN0IGh5ID0gaG9sZS55O1xuXHRsZXQgcXggPSAtIEluZmluaXR5LCBtO1xuXG5cdC8vIGZpbmQgYSBzZWdtZW50IGludGVyc2VjdGVkIGJ5IGEgcmF5IGZyb20gdGhlIGhvbGUncyBsZWZ0bW9zdCBwb2ludCB0byB0aGUgbGVmdDtcblx0Ly8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuXHRkbyB7XG5cblx0XHRpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkge1xuXG5cdFx0XHRjb25zdCB4ID0gcC54ICsgKCBoeSAtIHAueSApICogKCBwLm5leHQueCAtIHAueCApIC8gKCBwLm5leHQueSAtIHAueSApO1xuXHRcdFx0aWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHtcblxuXHRcdFx0XHRxeCA9IHg7XG5cdFx0XHRcdGlmICggeCA9PT0gaHggKSB7XG5cblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLnkgKSByZXR1cm4gcDtcblx0XHRcdFx0XHRpZiAoIGh5ID09PSBwLm5leHQueSApIHJldHVybiBwLm5leHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IG91dGVyTm9kZSApO1xuXG5cdGlmICggISBtICkgcmV0dXJuIG51bGw7XG5cblx0aWYgKCBoeCA9PT0gcXggKSByZXR1cm4gbTsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbGVmdG1vc3QgZW5kcG9pbnRcblxuXHQvLyBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBvZiBob2xlIHBvaW50LCBzZWdtZW50IGludGVyc2VjdGlvbiBhbmQgZW5kcG9pbnQ7XG5cdC8vIGlmIHRoZXJlIGFyZSBubyBwb2ludHMgZm91bmQsIHdlIGhhdmUgYSB2YWxpZCBjb25uZWN0aW9uO1xuXHQvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG5cdGNvbnN0IHN0b3AgPSBtLFxuXHRcdG14ID0gbS54LFxuXHRcdG15ID0gbS55O1xuXHRsZXQgdGFuTWluID0gSW5maW5pdHksIHRhbjtcblxuXHRwID0gbTtcblxuXHRkbyB7XG5cblx0XHRpZiAoIGh4ID49IHAueCAmJiBwLnggPj0gbXggJiYgaHggIT09IHAueCAmJlxuXHRcdFx0XHRwb2ludEluVHJpYW5nbGUoIGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55ICkgKSB7XG5cblx0XHRcdHRhbiA9IE1hdGguYWJzKCBoeSAtIHAueSApIC8gKCBoeCAtIHAueCApOyAvLyB0YW5nZW50aWFsXG5cblx0XHRcdGlmICggbG9jYWxseUluc2lkZSggcCwgaG9sZSApICYmICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgKCBwLnggPiBtLnggfHwgKCBwLnggPT09IG0ueCAmJiBzZWN0b3JDb250YWluc1NlY3RvciggbSwgcCApICkgKSApICkgKSB7XG5cblx0XHRcdFx0bSA9IHA7XG5cdFx0XHRcdHRhbk1pbiA9IHRhbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gc3RvcCApO1xuXG5cdHJldHVybiBtO1xuXG59XG5cbi8vIHdoZXRoZXIgc2VjdG9yIGluIHZlcnRleCBtIGNvbnRhaW5zIHNlY3RvciBpbiB2ZXJ0ZXggcCBpbiB0aGUgc2FtZSBjb29yZGluYXRlc1xuZnVuY3Rpb24gc2VjdG9yQ29udGFpbnNTZWN0b3IoIG0sIHAgKSB7XG5cblx0cmV0dXJuIGFyZWEoIG0ucHJldiwgbSwgcC5wcmV2ICkgPCAwICYmIGFyZWEoIHAubmV4dCwgbSwgbS5uZXh0ICkgPCAwO1xuXG59XG5cbi8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXJcbmZ1bmN0aW9uIGluZGV4Q3VydmUoIHN0YXJ0LCBtaW5YLCBtaW5ZLCBpbnZTaXplICkge1xuXG5cdGxldCBwID0gc3RhcnQ7XG5cdGRvIHtcblxuXHRcdGlmICggcC56ID09PSBudWxsICkgcC56ID0gek9yZGVyKCBwLngsIHAueSwgbWluWCwgbWluWSwgaW52U2l6ZSApO1xuXHRcdHAucHJldlogPSBwLnByZXY7XG5cdFx0cC5uZXh0WiA9IHAubmV4dDtcblx0XHRwID0gcC5uZXh0O1xuXG5cdH0gd2hpbGUgKCBwICE9PSBzdGFydCApO1xuXG5cdHAucHJldloubmV4dFogPSBudWxsO1xuXHRwLnByZXZaID0gbnVsbDtcblxuXHRzb3J0TGlua2VkKCBwICk7XG5cbn1cblxuLy8gU2ltb24gVGF0aGFtJ3MgbGlua2VkIGxpc3QgbWVyZ2Ugc29ydCBhbGdvcml0aG1cbi8vIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vYWxnb3JpdGhtcy9saXN0c29ydC5odG1sXG5mdW5jdGlvbiBzb3J0TGlua2VkKCBsaXN0ICkge1xuXG5cdGxldCBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcblx0XHRpblNpemUgPSAxO1xuXG5cdGRvIHtcblxuXHRcdHAgPSBsaXN0O1xuXHRcdGxpc3QgPSBudWxsO1xuXHRcdHRhaWwgPSBudWxsO1xuXHRcdG51bU1lcmdlcyA9IDA7XG5cblx0XHR3aGlsZSAoIHAgKSB7XG5cblx0XHRcdG51bU1lcmdlcyArKztcblx0XHRcdHEgPSBwO1xuXHRcdFx0cFNpemUgPSAwO1xuXHRcdFx0Zm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7XG5cblx0XHRcdFx0cFNpemUgKys7XG5cdFx0XHRcdHEgPSBxLm5leHRaO1xuXHRcdFx0XHRpZiAoICEgcSApIGJyZWFrO1xuXG5cdFx0XHR9XG5cblx0XHRcdHFTaXplID0gaW5TaXplO1xuXG5cdFx0XHR3aGlsZSAoIHBTaXplID4gMCB8fCAoIHFTaXplID4gMCAmJiBxICkgKSB7XG5cblx0XHRcdFx0aWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7XG5cblx0XHRcdFx0XHRlID0gcDtcblx0XHRcdFx0XHRwID0gcC5uZXh0Wjtcblx0XHRcdFx0XHRwU2l6ZSAtLTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0ZSA9IHE7XG5cdFx0XHRcdFx0cSA9IHEubmV4dFo7XG5cdFx0XHRcdFx0cVNpemUgLS07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGFpbCApIHRhaWwubmV4dFogPSBlO1xuXHRcdFx0XHRlbHNlIGxpc3QgPSBlO1xuXG5cdFx0XHRcdGUucHJldlogPSB0YWlsO1xuXHRcdFx0XHR0YWlsID0gZTtcblxuXHRcdFx0fVxuXG5cdFx0XHRwID0gcTtcblxuXHRcdH1cblxuXHRcdHRhaWwubmV4dFogPSBudWxsO1xuXHRcdGluU2l6ZSAqPSAyO1xuXG5cdH0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7XG5cblx0cmV0dXJuIGxpc3Q7XG5cbn1cblxuLy8gei1vcmRlciBvZiBhIHBvaW50IGdpdmVuIGNvb3JkcyBhbmQgaW52ZXJzZSBvZiB0aGUgbG9uZ2VyIHNpZGUgb2YgZGF0YSBiYm94XG5mdW5jdGlvbiB6T3JkZXIoIHgsIHksIG1pblgsIG1pblksIGludlNpemUgKSB7XG5cblx0Ly8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZVxuXHR4ID0gMzI3NjcgKiAoIHggLSBtaW5YICkgKiBpbnZTaXplO1xuXHR5ID0gMzI3NjcgKiAoIHkgLSBtaW5ZICkgKiBpbnZTaXplO1xuXG5cdHggPSAoIHggfCAoIHggPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR4ID0gKCB4IHwgKCB4IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eCA9ICggeCB8ICggeCA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHggPSAoIHggfCAoIHggPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHkgPSAoIHkgfCAoIHkgPDwgOCApICkgJiAweDAwRkYwMEZGO1xuXHR5ID0gKCB5IHwgKCB5IDw8IDQgKSApICYgMHgwRjBGMEYwRjtcblx0eSA9ICggeSB8ICggeSA8PCAyICkgKSAmIDB4MzMzMzMzMzM7XG5cdHkgPSAoIHkgfCAoIHkgPDwgMSApICkgJiAweDU1NTU1NTU1O1xuXG5cdHJldHVybiB4IHwgKCB5IDw8IDEgKTtcblxufVxuXG4vLyBmaW5kIHRoZSBsZWZ0bW9zdCBub2RlIG9mIGEgcG9seWdvbiByaW5nXG5mdW5jdGlvbiBnZXRMZWZ0bW9zdCggc3RhcnQgKSB7XG5cblx0bGV0IHAgPSBzdGFydCxcblx0XHRsZWZ0bW9zdCA9IHN0YXJ0O1xuXHRkbyB7XG5cblx0XHRpZiAoIHAueCA8IGxlZnRtb3N0LnggfHwgKCBwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSApICkgbGVmdG1vc3QgPSBwO1xuXHRcdHAgPSBwLm5leHQ7XG5cblx0fSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7XG5cblx0cmV0dXJuIGxlZnRtb3N0O1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZSggYXgsIGF5LCBieCwgYnksIGN4LCBjeSwgcHgsIHB5ICkge1xuXG5cdHJldHVybiAoIGN4IC0gcHggKSAqICggYXkgLSBweSApIC0gKCBheCAtIHB4ICkgKiAoIGN5IC0gcHkgKSA+PSAwICYmXG5cdFx0XHQoIGF4IC0gcHggKSAqICggYnkgLSBweSApIC0gKCBieCAtIHB4ICkgKiAoIGF5IC0gcHkgKSA+PSAwICYmXG5cdFx0XHQoIGJ4IC0gcHggKSAqICggY3kgLSBweSApIC0gKCBjeCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSA+PSAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKCBhLCBiICkge1xuXG5cdHJldHVybiBhLm5leHQuaSAhPT0gYi5pICYmIGEucHJldi5pICE9PSBiLmkgJiYgISBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApICYmIC8vIGRvbmVzJ3QgaW50ZXJzZWN0IG90aGVyIGVkZ2VzXG5cdFx0KCBsb2NhbGx5SW5zaWRlKCBhLCBiICkgJiYgbG9jYWxseUluc2lkZSggYiwgYSApICYmIG1pZGRsZUluc2lkZSggYSwgYiApICYmIC8vIGxvY2FsbHkgdmlzaWJsZVxuXHRcdCggYXJlYSggYS5wcmV2LCBhLCBiLnByZXYgKSB8fCBhcmVhKCBhLCBiLnByZXYsIGIgKSApIHx8IC8vIGRvZXMgbm90IGNyZWF0ZSBvcHBvc2l0ZS1mYWNpbmcgc2VjdG9yc1xuXHRcdGVxdWFscyggYSwgYiApICYmIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPiAwICYmIGFyZWEoIGIucHJldiwgYiwgYi5uZXh0ICkgPiAwICk7IC8vIHNwZWNpYWwgemVyby1sZW5ndGggY2FzZVxuXG59XG5cbi8vIHNpZ25lZCBhcmVhIG9mIGEgdHJpYW5nbGVcbmZ1bmN0aW9uIGFyZWEoIHAsIHEsIHIgKSB7XG5cblx0cmV0dXJuICggcS55IC0gcC55ICkgKiAoIHIueCAtIHEueCApIC0gKCBxLnggLSBwLnggKSAqICggci55IC0gcS55ICk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWxcbmZ1bmN0aW9uIGVxdWFscyggcDEsIHAyICkge1xuXG5cdHJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7XG5cbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyggcDEsIHExLCBwMiwgcTIgKSB7XG5cblx0Y29uc3QgbzEgPSBzaWduKCBhcmVhKCBwMSwgcTEsIHAyICkgKTtcblx0Y29uc3QgbzIgPSBzaWduKCBhcmVhKCBwMSwgcTEsIHEyICkgKTtcblx0Y29uc3QgbzMgPSBzaWduKCBhcmVhKCBwMiwgcTIsIHAxICkgKTtcblx0Y29uc3QgbzQgPSBzaWduKCBhcmVhKCBwMiwgcTIsIHExICkgKTtcblxuXHRpZiAoIG8xICE9PSBvMiAmJiBvMyAhPT0gbzQgKSByZXR1cm4gdHJ1ZTsgLy8gZ2VuZXJhbCBjYXNlXG5cblx0aWYgKCBvMSA9PT0gMCAmJiBvblNlZ21lbnQoIHAxLCBwMiwgcTEgKSApIHJldHVybiB0cnVlOyAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xsaW5lYXIgYW5kIHAyIGxpZXMgb24gcDFxMVxuXHRpZiAoIG8yID09PSAwICYmIG9uU2VnbWVudCggcDEsIHEyLCBxMSApICkgcmV0dXJuIHRydWU7IC8vIHAxLCBxMSBhbmQgcTIgYXJlIGNvbGxpbmVhciBhbmQgcTIgbGllcyBvbiBwMXExXG5cdGlmICggbzMgPT09IDAgJiYgb25TZWdtZW50KCBwMiwgcDEsIHEyICkgKSByZXR1cm4gdHJ1ZTsgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29sbGluZWFyIGFuZCBwMSBsaWVzIG9uIHAycTJcblx0aWYgKCBvNCA9PT0gMCAmJiBvblNlZ21lbnQoIHAyLCBxMSwgcTIgKSApIHJldHVybiB0cnVlOyAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xsaW5lYXIgYW5kIHExIGxpZXMgb24gcDJxMlxuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBmb3IgY29sbGluZWFyIHBvaW50cyBwLCBxLCByLCBjaGVjayBpZiBwb2ludCBxIGxpZXMgb24gc2VnbWVudCBwclxuZnVuY3Rpb24gb25TZWdtZW50KCBwLCBxLCByICkge1xuXG5cdHJldHVybiBxLnggPD0gTWF0aC5tYXgoIHAueCwgci54ICkgJiYgcS54ID49IE1hdGgubWluKCBwLngsIHIueCApICYmIHEueSA8PSBNYXRoLm1heCggcC55LCByLnkgKSAmJiBxLnkgPj0gTWF0aC5taW4oIHAueSwgci55ICk7XG5cbn1cblxuZnVuY3Rpb24gc2lnbiggbnVtICkge1xuXG5cdHJldHVybiBudW0gPiAwID8gMSA6IG51bSA8IDAgPyAtIDEgOiAwO1xuXG59XG5cbi8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzXG5mdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApIHtcblxuXHRsZXQgcCA9IGE7XG5cdGRvIHtcblxuXHRcdGlmICggcC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmXG5cdFx0XHRcdGludGVyc2VjdHMoIHAsIHAubmV4dCwgYSwgYiApICkgcmV0dXJuIHRydWU7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBmYWxzZTtcblxufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoIGEsIGIgKSB7XG5cblx0cmV0dXJuIGFyZWEoIGEucHJldiwgYSwgYS5uZXh0ICkgPCAwID9cblx0XHRhcmVhKCBhLCBiLCBhLm5leHQgKSA+PSAwICYmIGFyZWEoIGEsIGEucHJldiwgYiApID49IDAgOlxuXHRcdGFyZWEoIGEsIGIsIGEucHJldiApIDwgMCB8fCBhcmVhKCBhLCBhLm5leHQsIGIgKSA8IDA7XG5cbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoIGEsIGIgKSB7XG5cblx0bGV0IHAgPSBhLFxuXHRcdGluc2lkZSA9IGZhbHNlO1xuXHRjb25zdCBweCA9ICggYS54ICsgYi54ICkgLyAyLFxuXHRcdHB5ID0gKCBhLnkgKyBiLnkgKSAvIDI7XG5cdGRvIHtcblxuXHRcdGlmICggKCAoIHAueSA+IHB5ICkgIT09ICggcC5uZXh0LnkgPiBweSApICkgJiYgcC5uZXh0LnkgIT09IHAueSAmJlxuXHRcdFx0XHQoIHB4IDwgKCBwLm5leHQueCAtIHAueCApICogKCBweSAtIHAueSApIC8gKCBwLm5leHQueSAtIHAueSApICsgcC54ICkgKVxuXHRcdFx0aW5zaWRlID0gISBpbnNpZGU7XG5cdFx0cCA9IHAubmV4dDtcblxuXHR9IHdoaWxlICggcCAhPT0gYSApO1xuXG5cdHJldHVybiBpbnNpZGU7XG5cbn1cblxuLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvO1xuLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nXG5mdW5jdGlvbiBzcGxpdFBvbHlnb24oIGEsIGIgKSB7XG5cblx0Y29uc3QgYTIgPSBuZXcgTm9kZSggYS5pLCBhLngsIGEueSApLFxuXHRcdGIyID0gbmV3IE5vZGUoIGIuaSwgYi54LCBiLnkgKSxcblx0XHRhbiA9IGEubmV4dCxcblx0XHRicCA9IGIucHJldjtcblxuXHRhLm5leHQgPSBiO1xuXHRiLnByZXYgPSBhO1xuXG5cdGEyLm5leHQgPSBhbjtcblx0YW4ucHJldiA9IGEyO1xuXG5cdGIyLm5leHQgPSBhMjtcblx0YTIucHJldiA9IGIyO1xuXG5cdGJwLm5leHQgPSBiMjtcblx0YjIucHJldiA9IGJwO1xuXG5cdHJldHVybiBiMjtcblxufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZSggaSwgeCwgeSwgbGFzdCApIHtcblxuXHRjb25zdCBwID0gbmV3IE5vZGUoIGksIHgsIHkgKTtcblxuXHRpZiAoICEgbGFzdCApIHtcblxuXHRcdHAucHJldiA9IHA7XG5cdFx0cC5uZXh0ID0gcDtcblxuXHR9IGVsc2Uge1xuXG5cdFx0cC5uZXh0ID0gbGFzdC5uZXh0O1xuXHRcdHAucHJldiA9IGxhc3Q7XG5cdFx0bGFzdC5uZXh0LnByZXYgPSBwO1xuXHRcdGxhc3QubmV4dCA9IHA7XG5cblx0fVxuXG5cdHJldHVybiBwO1xuXG59XG5cbmZ1bmN0aW9uIHJlbW92ZU5vZGUoIHAgKSB7XG5cblx0cC5uZXh0LnByZXYgPSBwLnByZXY7XG5cdHAucHJldi5uZXh0ID0gcC5uZXh0O1xuXG5cdGlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaO1xuXHRpZiAoIHAubmV4dFogKSBwLm5leHRaLnByZXZaID0gcC5wcmV2WjtcblxufVxuXG5mdW5jdGlvbiBOb2RlKCBpLCB4LCB5ICkge1xuXG5cdC8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheVxuXHR0aGlzLmkgPSBpO1xuXG5cdC8vIHZlcnRleCBjb29yZGluYXRlc1xuXHR0aGlzLnggPSB4O1xuXHR0aGlzLnkgPSB5O1xuXG5cdC8vIHByZXZpb3VzIGFuZCBuZXh0IHZlcnRleCBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuXHR0aGlzLnByZXYgPSBudWxsO1xuXHR0aGlzLm5leHQgPSBudWxsO1xuXG5cdC8vIHotb3JkZXIgY3VydmUgdmFsdWVcblx0dGhpcy56ID0gbnVsbDtcblxuXHQvLyBwcmV2aW91cyBhbmQgbmV4dCBub2RlcyBpbiB6LW9yZGVyXG5cdHRoaXMucHJldlogPSBudWxsO1xuXHR0aGlzLm5leHRaID0gbnVsbDtcblxuXHQvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludFxuXHR0aGlzLnN0ZWluZXIgPSBmYWxzZTtcblxufVxuXG5mdW5jdGlvbiBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSB7XG5cblx0bGV0IHN1bSA9IDA7XG5cdGZvciAoIGxldCBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltICkge1xuXG5cdFx0c3VtICs9ICggZGF0YVsgaiBdIC0gZGF0YVsgaSBdICkgKiAoIGRhdGFbIGkgKyAxIF0gKyBkYXRhWyBqICsgMSBdICk7XG5cdFx0aiA9IGk7XG5cblx0fVxuXG5cdHJldHVybiBzdW07XG5cbn1cblxuY29uc3QgU2hhcGVVdGlscyA9IHtcblxuXHQvLyBjYWxjdWxhdGUgYXJlYSBvZiB0aGUgY29udG91ciBwb2x5Z29uXG5cblx0YXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkge1xuXG5cdFx0Y29uc3QgbiA9IGNvbnRvdXIubGVuZ3RoO1xuXHRcdGxldCBhID0gMC4wO1xuXG5cdFx0Zm9yICggbGV0IHAgPSBuIC0gMSwgcSA9IDA7IHEgPCBuOyBwID0gcSArKyApIHtcblxuXHRcdFx0YSArPSBjb250b3VyWyBwIF0ueCAqIGNvbnRvdXJbIHEgXS55IC0gY29udG91clsgcSBdLnggKiBjb250b3VyWyBwIF0ueTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhICogMC41O1xuXG5cdH0sXG5cblx0aXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkge1xuXG5cdFx0cmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwO1xuXG5cdH0sXG5cblx0dHJpYW5ndWxhdGVTaGFwZTogZnVuY3Rpb24gKCBjb250b3VyLCBob2xlcyApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107IC8vIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgbGlrZSBbIHgwLHkwLCB4MSx5MSwgeDIseTIsIC4uLiBdXG5cdFx0Y29uc3QgaG9sZUluZGljZXMgPSBbXTsgLy8gYXJyYXkgb2YgaG9sZSBpbmRpY2VzXG5cdFx0Y29uc3QgZmFjZXMgPSBbXTsgLy8gZmluYWwgYXJyYXkgb2YgdmVydGV4IGluZGljZXMgbGlrZSBbIFsgYSxiLGQgXSwgWyBiLGMsZCBdIF1cblxuXHRcdHJlbW92ZUR1cEVuZFB0cyggY29udG91ciApO1xuXHRcdGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICk7XG5cblx0XHQvL1xuXG5cdFx0bGV0IGhvbGVJbmRleCA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0aG9sZXMuZm9yRWFjaCggcmVtb3ZlRHVwRW5kUHRzICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBob2xlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGhvbGVJbmRpY2VzLnB1c2goIGhvbGVJbmRleCApO1xuXHRcdFx0aG9sZUluZGV4ICs9IGhvbGVzWyBpIF0ubGVuZ3RoO1xuXHRcdFx0YWRkQ29udG91ciggdmVydGljZXMsIGhvbGVzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vXG5cblx0XHRjb25zdCB0cmlhbmdsZXMgPSBFYXJjdXQudHJpYW5ndWxhdGUoIHZlcnRpY2VzLCBob2xlSW5kaWNlcyApO1xuXG5cdFx0Ly9cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRyaWFuZ2xlcy5sZW5ndGg7IGkgKz0gMyApIHtcblxuXHRcdFx0ZmFjZXMucHVzaCggdHJpYW5nbGVzLnNsaWNlKCBpLCBpICsgMyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFjZXM7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHtcblxuXHRjb25zdCBsID0gcG9pbnRzLmxlbmd0aDtcblxuXHRpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7XG5cblx0XHRwb2ludHMucG9wKCk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGFkZENvbnRvdXIoIHZlcnRpY2VzLCBjb250b3VyICkge1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0dmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTtcblx0XHR2ZXJ0aWNlcy5wdXNoKCBjb250b3VyWyBpIF0ueSApO1xuXG5cdH1cblxufVxuXG4vKipcbiAqIENyZWF0ZXMgZXh0cnVkZWQgZ2VvbWV0cnkgZnJvbSBhIHBhdGggc2hhcGUuXG4gKlxuICogcGFyYW1ldGVycyA9IHtcbiAqXG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICogIHN0ZXBzOiA8aW50PiwgLy8gbnVtYmVyIG9mIHBvaW50cyBmb3Igei1zaWRlIGV4dHJ1c2lvbnMgLyB1c2VkIGZvciBzdWJkaXZpZGluZyBzZWdtZW50cyBvZiBleHRydWRlIHNwbGluZSB0b29cbiAqICBkZXB0aDogPGZsb2F0PiwgLy8gRGVwdGggdG8gZXh0cnVkZSB0aGUgc2hhcGVcbiAqXG4gKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWxcbiAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0aGUgb3JpZ2luYWwgc2hhcGUgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgKGluY2x1ZGluZyBiZXZlbE9mZnNldCkgaXMgYmV2ZWxcbiAqICBiZXZlbE9mZnNldDogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHNoYXBlIG91dGxpbmUgZG9lcyBiZXZlbCBzdGFydFxuICogIGJldmVsU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgYmV2ZWwgbGF5ZXJzXG4gKlxuICogIGV4dHJ1ZGVQYXRoOiA8VEhSRUUuQ3VydmU+IC8vIGN1cnZlIHRvIGV4dHJ1ZGUgc2hhcGUgYWxvbmdcbiAqXG4gKiAgVVZHZW5lcmF0b3I6IDxPYmplY3Q+IC8vIG9iamVjdCB0aGF0IHByb3ZpZGVzIFVWIGdlbmVyYXRvciBmdW5jdGlvbnNcbiAqXG4gKiB9XG4gKi9cblxuY2xhc3MgRXh0cnVkZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBzaGFwZXMsIG9wdGlvbnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRzaGFwZXM6IHNoYXBlcyxcblx0XHRcdG9wdGlvbnM6IG9wdGlvbnNcblx0XHR9O1xuXG5cdFx0c2hhcGVzID0gQXJyYXkuaXNBcnJheSggc2hhcGVzICkgPyBzaGFwZXMgOiBbIHNoYXBlcyBdO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgdmVydGljZXNBcnJheSA9IFtdO1xuXHRcdGNvbnN0IHV2QXJyYXkgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBzaGFwZSA9IHNoYXBlc1sgaSBdO1xuXHRcdFx0YWRkU2hhcGUoIHNoYXBlICk7XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlc0FycmF5LCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2QXJyYXksIDIgKSApO1xuXG5cdFx0dGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xuXG5cdFx0Ly8gZnVuY3Rpb25zXG5cblx0XHRmdW5jdGlvbiBhZGRTaGFwZSggc2hhcGUgKSB7XG5cblx0XHRcdGNvbnN0IHBsYWNlaG9sZGVyID0gW107XG5cblx0XHRcdC8vIG9wdGlvbnNcblxuXHRcdFx0Y29uc3QgY3VydmVTZWdtZW50cyA9IG9wdGlvbnMuY3VydmVTZWdtZW50cyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jdXJ2ZVNlZ21lbnRzIDogMTI7XG5cdFx0XHRjb25zdCBzdGVwcyA9IG9wdGlvbnMuc3RlcHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlcHMgOiAxO1xuXHRcdFx0bGV0IGRlcHRoID0gb3B0aW9ucy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aCA6IDEwMDtcblxuXHRcdFx0bGV0IGJldmVsRW5hYmxlZCA9IG9wdGlvbnMuYmV2ZWxFbmFibGVkICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsRW5hYmxlZCA6IHRydWU7XG5cdFx0XHRsZXQgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjtcblx0XHRcdGxldCBiZXZlbFNpemUgPSBvcHRpb25zLmJldmVsU2l6ZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbFNpemUgOiBiZXZlbFRoaWNrbmVzcyAtIDI7XG5cdFx0XHRsZXQgYmV2ZWxPZmZzZXQgPSBvcHRpb25zLmJldmVsT2Zmc2V0ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsT2Zmc2V0IDogMDtcblx0XHRcdGxldCBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzO1xuXG5cdFx0XHRjb25zdCBleHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGg7XG5cblx0XHRcdGNvbnN0IHV2Z2VuID0gb3B0aW9ucy5VVkdlbmVyYXRvciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5VVkdlbmVyYXRvciA6IFdvcmxkVVZHZW5lcmF0b3I7XG5cblx0XHRcdC8vIGRlcHJlY2F0ZWQgb3B0aW9uc1xuXG5cdFx0XHRpZiAoIG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4nICk7XG5cdFx0XHRcdGRlcHRoID0gb3B0aW9ucy5hbW91bnQ7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly9cblxuXHRcdFx0bGV0IGV4dHJ1ZGVQdHMsIGV4dHJ1ZGVCeVBhdGggPSBmYWxzZTtcblx0XHRcdGxldCBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7XG5cblx0XHRcdGlmICggZXh0cnVkZVBhdGggKSB7XG5cblx0XHRcdFx0ZXh0cnVkZVB0cyA9IGV4dHJ1ZGVQYXRoLmdldFNwYWNlZFBvaW50cyggc3RlcHMgKTtcblxuXHRcdFx0XHRleHRydWRlQnlQYXRoID0gdHJ1ZTtcblx0XHRcdFx0YmV2ZWxFbmFibGVkID0gZmFsc2U7IC8vIGJldmVscyBub3Qgc3VwcG9ydGVkIGZvciBwYXRoIGV4dHJ1c2lvblxuXG5cdFx0XHRcdC8vIFNFVFVQIFROQiB2YXJpYWJsZXNcblxuXHRcdFx0XHQvLyBUT0RPMSAtIGhhdmUgYSAuaXNDbG9zZWQgaW4gc3BsaW5lP1xuXG5cdFx0XHRcdHNwbGluZVR1YmUgPSBleHRydWRlUGF0aC5jb21wdXRlRnJlbmV0RnJhbWVzKCBzdGVwcywgZmFsc2UgKTtcblxuXHRcdFx0XHQvLyBjb25zb2xlLmxvZyhzcGxpbmVUdWJlLCAnc3BsaW5lVHViZScsIHNwbGluZVR1YmUubm9ybWFscy5sZW5ndGgsICdzdGVwcycsIHN0ZXBzLCAnZXh0cnVkZVB0cycsIGV4dHJ1ZGVQdHMubGVuZ3RoKTtcblxuXHRcdFx0XHRiaW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0XHRcdHBvc2l0aW9uMiA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkXG5cblx0XHRcdGlmICggISBiZXZlbEVuYWJsZWQgKSB7XG5cblx0XHRcdFx0YmV2ZWxTZWdtZW50cyA9IDA7XG5cdFx0XHRcdGJldmVsVGhpY2tuZXNzID0gMDtcblx0XHRcdFx0YmV2ZWxTaXplID0gMDtcblx0XHRcdFx0YmV2ZWxPZmZzZXQgPSAwO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvblxuXG5cdFx0XHRjb25zdCBzaGFwZVBvaW50cyA9IHNoYXBlLmV4dHJhY3RQb2ludHMoIGN1cnZlU2VnbWVudHMgKTtcblxuXHRcdFx0bGV0IHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7XG5cdFx0XHRjb25zdCBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzO1xuXG5cdFx0XHRjb25zdCByZXZlcnNlID0gISBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCB2ZXJ0aWNlcyApO1xuXG5cdFx0XHRpZiAoIHJldmVyc2UgKSB7XG5cblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7XG5cblx0XHRcdFx0Ly8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi5cblxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7XG5cblx0XHRcdFx0XHRcdGhvbGVzWyBoIF0gPSBhaG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblxuXHRcdFx0Y29uc3QgZmFjZXMgPSBTaGFwZVV0aWxzLnRyaWFuZ3VsYXRlU2hhcGUoIHZlcnRpY2VzLCBob2xlcyApO1xuXG5cdFx0XHQvKiBWZXJ0aWNlcyAqL1xuXG5cdFx0XHRjb25zdCBjb250b3VyID0gdmVydGljZXM7IC8vIHZlcnRpY2VzIGhhcyBhbGwgcG9pbnRzIGJ1dCBjb250b3VyIGhhcyBvbmx5IHBvaW50cyBvZiBjaXJjdW1mZXJlbmNlXG5cblx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cblx0XHRcdFx0dmVydGljZXMgPSB2ZXJ0aWNlcy5jb25jYXQoIGFob2xlICk7XG5cblx0XHRcdH1cblxuXG5cdFx0XHRmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHtcblxuXHRcdFx0XHRpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0JyApO1xuXG5cdFx0XHRcdHJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCB2bGVuID0gdmVydGljZXMubGVuZ3RoLCBmbGVuID0gZmFjZXMubGVuZ3RoO1xuXG5cblx0XHRcdC8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnRcblxuXG5cdFx0XHRmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7XG5cblx0XHRcdFx0Ly8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91clxuXHRcdFx0XHQvLyAgIHNoaWZ0ZWQgYnkgMSB1bml0IChsZW5ndGggb2Ygbm9ybWFsaXplZCB2ZWN0b3IpIHRvIHRoZSBsZWZ0XG5cdFx0XHRcdC8vIGlmIHdlIHdhbGsgYWxvbmcgY29udG91ciBjbG9ja3dpc2UsIHRoaXMgbmV3IGNvbnRvdXIgaXMgb3V0c2lkZSB0aGUgb2xkIG9uZVxuXHRcdFx0XHQvL1xuXHRcdFx0XHQvLyBpblB0JyBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGluZXMgcGFyYWxsZWwgdG8gdGhlIHR3b1xuXHRcdFx0XHQvLyAgYWRqYWNlbnQgZWRnZXMgb2YgaW5QdCBhdCBhIGRpc3RhbmNlIG9mIDEgdW5pdCBvbiB0aGUgbGVmdCBzaWRlLlxuXG5cdFx0XHRcdGxldCB2X3RyYW5zX3gsIHZfdHJhbnNfeSwgc2hyaW5rX2J5OyAvLyByZXN1bHRpbmcgdHJhbnNsYXRpb24gdmVjdG9yIGZvciBpblB0XG5cblx0XHRcdFx0Ly8gZ29vZCByZWFkaW5nIGZvciBnZW9tZXRyeSBhbGdvcml0aG1zIChoZXJlOiBsaW5lLWxpbmUgaW50ZXJzZWN0aW9uKVxuXHRcdFx0XHQvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbFxuXG5cdFx0XHRcdGNvbnN0IHZfcHJldl94ID0gaW5QdC54IC0gaW5QcmV2LngsXG5cdFx0XHRcdFx0dl9wcmV2X3kgPSBpblB0LnkgLSBpblByZXYueTtcblx0XHRcdFx0Y29uc3Qgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCxcblx0XHRcdFx0XHR2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55O1xuXG5cdFx0XHRcdGNvbnN0IHZfcHJldl9sZW5zcSA9ICggdl9wcmV2X3ggKiB2X3ByZXZfeCArIHZfcHJldl95ICogdl9wcmV2X3kgKTtcblxuXHRcdFx0XHQvLyBjaGVjayBmb3IgY29sbGluZWFyIGVkZ2VzXG5cdFx0XHRcdGNvbnN0IGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0aWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgY29sbGluZWFyXG5cblx0XHRcdFx0XHQvLyBsZW5ndGggb2YgdmVjdG9ycyBmb3Igbm9ybWFsaXppbmdcblxuXHRcdFx0XHRcdGNvbnN0IHZfcHJldl9sZW4gPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXHRcdFx0XHRcdGNvbnN0IHZfbmV4dF9sZW4gPSBNYXRoLnNxcnQoIHZfbmV4dF94ICogdl9uZXh0X3ggKyB2X25leHRfeSAqIHZfbmV4dF95ICk7XG5cblx0XHRcdFx0XHQvLyBzaGlmdCBhZGphY2VudCBwb2ludHMgYnkgdW5pdCB2ZWN0b3JzIHRvIHRoZSBsZWZ0XG5cblx0XHRcdFx0XHRjb25zdCBwdFByZXZTaGlmdF94ID0gKCBpblByZXYueCAtIHZfcHJldl95IC8gdl9wcmV2X2xlbiApO1xuXHRcdFx0XHRcdGNvbnN0IHB0UHJldlNoaWZ0X3kgPSAoIGluUHJldi55ICsgdl9wcmV2X3ggLyB2X3ByZXZfbGVuICk7XG5cblx0XHRcdFx0XHRjb25zdCBwdE5leHRTaGlmdF94ID0gKCBpbk5leHQueCAtIHZfbmV4dF95IC8gdl9uZXh0X2xlbiApO1xuXHRcdFx0XHRcdGNvbnN0IHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7XG5cblx0XHRcdFx0XHQvLyBzY2FsaW5nIGZhY3RvciBmb3Igdl9wcmV2IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdFx0Y29uc3Qgc2YgPSAoICggcHROZXh0U2hpZnRfeCAtIHB0UHJldlNoaWZ0X3ggKSAqIHZfbmV4dF95IC1cblx0XHRcdFx0XHRcdFx0KCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvXG5cdFx0XHRcdFx0XHQoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7XG5cblx0XHRcdFx0XHQvLyB2ZWN0b3IgZnJvbSBpblB0IHRvIGludGVyc2VjdGlvbiBwb2ludFxuXG5cdFx0XHRcdFx0dl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApO1xuXHRcdFx0XHRcdHZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTtcblxuXHRcdFx0XHRcdC8vIERvbid0IG5vcm1hbGl6ZSEsIG90aGVyd2lzZSBzaGFycCBjb3JuZXJzIGJlY29tZSB1Z2x5XG5cdFx0XHRcdFx0Ly8gIGJ1dCBwcmV2ZW50IGNyYXp5IHNwaWtlc1xuXHRcdFx0XHRcdGNvbnN0IHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApO1xuXHRcdFx0XHRcdGlmICggdl90cmFuc19sZW5zcSA8PSAyICkge1xuXG5cdFx0XHRcdFx0XHRyZXR1cm4gbmV3IFZlY3RvcjIoIHZfdHJhbnNfeCwgdl90cmFuc195ICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfdHJhbnNfbGVuc3EgLyAyICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgY29sbGluZWFyIGVkZ2VzXG5cblx0XHRcdFx0XHRsZXQgZGlyZWN0aW9uX2VxID0gZmFsc2U7IC8vIGFzc3VtZXM6IG9wcG9zaXRlXG5cblx0XHRcdFx0XHRpZiAoIHZfcHJldl94ID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHRcdGlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRpZiAoIHZfcHJldl94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHZfbmV4dF94IDwgLSBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGRpcmVjdGlvbl9lcSA9IHRydWU7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggTWF0aC5zaWduKCB2X3ByZXZfeSApID09PSBNYXRoLnNpZ24oIHZfbmV4dF95ICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRkaXJlY3Rpb25fZXEgPSB0cnVlO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBkaXJlY3Rpb25fZXEgKSB7XG5cblx0XHRcdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwiV2FybmluZzogbGluZXMgYXJlIGEgc3RyYWlnaHQgc2VxdWVuY2VcIik7XG5cdFx0XHRcdFx0XHR2X3RyYW5zX3ggPSAtIHZfcHJldl95O1xuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3g7XG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gY29uc29sZS5sb2coXCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZVwiKTtcblx0XHRcdFx0XHRcdHZfdHJhbnNfeCA9IHZfcHJldl94O1xuXHRcdFx0XHRcdFx0dl90cmFuc195ID0gdl9wcmV2X3k7XG5cdFx0XHRcdFx0XHRzaHJpbmtfYnkgPSBNYXRoLnNxcnQoIHZfcHJldl9sZW5zcSAvIDIgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3ggLyBzaHJpbmtfYnksIHZfdHJhbnNfeSAvIHNocmlua19ieSApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0Y29uc3QgY29udG91ck1vdmVtZW50cyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkge1xuXG5cdFx0XHRcdGlmICggaiA9PT0gaWwgKSBqID0gMDtcblx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdC8vICAoaiktLS0oaSktLS0oaylcblx0XHRcdFx0Ly8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspXG5cblx0XHRcdFx0Y29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBob2xlc01vdmVtZW50cyA9IFtdO1xuXHRcdFx0bGV0IG9uZUhvbGVNb3ZlbWVudHMsIHZlcnRpY2VzTW92ZW1lbnRzID0gY29udG91ck1vdmVtZW50cy5jb25jYXQoKTtcblxuXHRcdFx0Zm9yICggbGV0IGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblxuXHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gW107XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aCwgaiA9IGlsIC0gMSwgayA9IGkgKyAxOyBpIDwgaWw7IGkgKyssIGogKyssIGsgKysgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGogPT09IGlsICkgaiA9IDA7XG5cdFx0XHRcdFx0aWYgKCBrID09PSBpbCApIGsgPSAwO1xuXG5cdFx0XHRcdFx0Ly8gIChqKS0tLShpKS0tLShrKVxuXHRcdFx0XHRcdG9uZUhvbGVNb3ZlbWVudHNbIGkgXSA9IGdldEJldmVsVmVjKCBhaG9sZVsgaSBdLCBhaG9sZVsgaiBdLCBhaG9sZVsgayBdICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGhvbGVzTW92ZW1lbnRzLnB1c2goIG9uZUhvbGVNb3ZlbWVudHMgKTtcblx0XHRcdFx0dmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdC8vIExvb3AgYmV2ZWxTZWdtZW50cywgMSBmb3IgdGhlIGZyb250LCAxIGZvciB0aGUgYmFja1xuXG5cdFx0XHRmb3IgKCBsZXQgYiA9IDA7IGIgPCBiZXZlbFNlZ21lbnRzOyBiICsrICkge1xuXG5cdFx0XHRcdC8vZm9yICggYiA9IGJldmVsU2VnbWVudHM7IGIgPiAwOyBiIC0tICkge1xuXG5cdFx0XHRcdGNvbnN0IHQgPSBiIC8gYmV2ZWxTZWdtZW50cztcblx0XHRcdFx0Y29uc3QgeiA9IGJldmVsVGhpY2tuZXNzICogTWF0aC5jb3MoIHQgKiBNYXRoLlBJIC8gMiApO1xuXHRcdFx0XHRjb25zdCBicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0O1xuXG5cdFx0XHRcdC8vIGNvbnRyYWN0IHNoYXBlXG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gc2NhbGVQdDIoIGNvbnRvdXJbIGkgXSwgY29udG91ck1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0diggdmVydC54LCB2ZXJ0LnksIC0geiApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBleHBhbmQgaG9sZXNcblxuXHRcdFx0XHRmb3IgKCBsZXQgaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhaG9sZSA9IGhvbGVzWyBoIF07XG5cdFx0XHRcdFx0b25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYWhvbGUubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApO1xuXG5cdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgLSB6ICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJzID0gYmV2ZWxTaXplICsgYmV2ZWxPZmZzZXQ7XG5cblx0XHRcdC8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTtcblxuXHRcdFx0XHRpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHtcblxuXHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCAwICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgMCBdLnksIGV4dHJ1ZGVQdHNbIDAgXS54ICk7XG5cblx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0Ymlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTtcblxuXHRcdFx0XHRcdHBvc2l0aW9uMi5jb3B5KCBleHRydWRlUHRzWyAwIF0gKS5hZGQoIG5vcm1hbCApLmFkZCggYmlub3JtYWwgKTtcblxuXHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi5cblx0XHRcdC8vIEluY2x1ZGluZyBmcm9udCBmYWNpbmcgdmVydGljZXNcblxuXHRcdFx0Zm9yICggbGV0IHMgPSAxOyBzIDw9IHN0ZXBzOyBzICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCB2ZXJ0ID0gYmV2ZWxFbmFibGVkID8gc2NhbGVQdDIoIHZlcnRpY2VzWyBpIF0sIHZlcnRpY2VzTW92ZW1lbnRzWyBpIF0sIGJzICkgOiB2ZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRcdFx0aWYgKCAhIGV4dHJ1ZGVCeVBhdGggKSB7XG5cblx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCAvIHN0ZXBzICogcyApO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gdiggdmVydC54LCB2ZXJ0LnkgKyBleHRydWRlUHRzWyBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueCApO1xuXG5cdFx0XHRcdFx0XHRub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7XG5cdFx0XHRcdFx0XHRiaW5vcm1hbC5jb3B5KCBzcGxpbmVUdWJlLmJpbm9ybWFsc1sgcyBdICkubXVsdGlwbHlTY2FsYXIoIHZlcnQueSApO1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7XG5cblx0XHRcdFx0XHRcdHYoIHBvc2l0aW9uMi54LCBwb3NpdGlvbjIueSwgcG9zaXRpb24yLnogKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXG5cdFx0XHQvLyBBZGQgYmV2ZWwgc2VnbWVudHMgcGxhbmVzXG5cblx0XHRcdC8vZm9yICggYiA9IDE7IGIgPD0gYmV2ZWxTZWdtZW50czsgYiArKyApIHtcblx0XHRcdGZvciAoIGxldCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHtcblxuXHRcdFx0XHRjb25zdCB0ID0gYiAvIGJldmVsU2VnbWVudHM7XG5cdFx0XHRcdGNvbnN0IHogPSBiZXZlbFRoaWNrbmVzcyAqIE1hdGguY29zKCB0ICogTWF0aC5QSSAvIDIgKTtcblx0XHRcdFx0Y29uc3QgYnMgPSBiZXZlbFNpemUgKiBNYXRoLnNpbiggdCAqIE1hdGguUEkgLyAyICkgKyBiZXZlbE9mZnNldDtcblxuXHRcdFx0XHQvLyBjb250cmFjdCBzaGFwZVxuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjb250b3VyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTtcblx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGV4cGFuZCBob2xlc1xuXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0XHRvbmVIb2xlTW92ZW1lbnRzID0gaG9sZXNNb3ZlbWVudHNbIGggXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7XG5cblx0XHRcdFx0XHRcdGlmICggISBleHRydWRlQnlQYXRoICkge1xuXG5cdFx0XHRcdFx0XHRcdHYoIHZlcnQueCwgdmVydC55LCBkZXB0aCArIHogKTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHR2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnksIGV4dHJ1ZGVQdHNbIHN0ZXBzIC0gMSBdLnggKyB6ICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0LyogRmFjZXMgKi9cblxuXHRcdFx0Ly8gVG9wIGFuZCBib3R0b20gZmFjZXNcblxuXHRcdFx0YnVpbGRMaWRGYWNlcygpO1xuXG5cdFx0XHQvLyBTaWRlcyBmYWNlc1xuXG5cdFx0XHRidWlsZFNpZGVGYWNlcygpO1xuXG5cblx0XHRcdC8vLy8vICBJbnRlcm5hbCBmdW5jdGlvbnNcblxuXHRcdFx0ZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHtcblxuXHRcdFx0XHRjb25zdCBzdGFydCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMztcblxuXHRcdFx0XHRpZiAoIGJldmVsRW5hYmxlZCApIHtcblxuXHRcdFx0XHRcdGxldCBsYXllciA9IDA7IC8vIHN0ZXBzICsgMVxuXHRcdFx0XHRcdGxldCBvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0XHQvLyBCb3R0b20gZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGxheWVyID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjtcblx0XHRcdFx0XHRvZmZzZXQgPSB2bGVuICogbGF5ZXI7XG5cblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAyIF0gKyBvZmZzZXQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gQm90dG9tIGZhY2VzXG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBmbGVuOyBpICsrICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBmYWNlID0gZmFjZXNbIGkgXTtcblx0XHRcdFx0XHRcdGYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBUb3AgZmFjZXNcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGZhY2UgPSBmYWNlc1sgaSBdO1xuXHRcdFx0XHRcdFx0ZjMoIGZhY2VbIDAgXSArIHZsZW4gKiBzdGVwcywgZmFjZVsgMSBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAyIF0gKyB2bGVuICogc3RlcHMgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlXG5cblx0XHRcdGZ1bmN0aW9uIGJ1aWxkU2lkZUZhY2VzKCkge1xuXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gdmVydGljZXNBcnJheS5sZW5ndGggLyAzO1xuXHRcdFx0XHRsZXQgbGF5ZXJvZmZzZXQgPSAwO1xuXHRcdFx0XHRzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICk7XG5cdFx0XHRcdGxheWVyb2Zmc2V0ICs9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIGxldCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGFob2xlID0gaG9sZXNbIGggXTtcblx0XHRcdFx0XHRzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApO1xuXG5cdFx0XHRcdFx0Ly8sIHRydWVcblx0XHRcdFx0XHRsYXllcm9mZnNldCArPSBhaG9sZS5sZW5ndGg7XG5cblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0c2NvcGUuYWRkR3JvdXAoIHN0YXJ0LCB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDMgLSBzdGFydCwgMSApO1xuXG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApIHtcblxuXHRcdFx0XHRsZXQgaSA9IGNvbnRvdXIubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggLS0gaSA+PSAwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgaiA9IGk7XG5cdFx0XHRcdFx0bGV0IGsgPSBpIC0gMTtcblx0XHRcdFx0XHRpZiAoIGsgPCAwICkgayA9IGNvbnRvdXIubGVuZ3RoIC0gMTtcblxuXHRcdFx0XHRcdC8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMgPSAwLCBzbCA9ICggc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMiApOyBzIDwgc2w7IHMgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHNsZW4xID0gdmxlbiAqIHM7XG5cdFx0XHRcdFx0XHRjb25zdCBzbGVuMiA9IHZsZW4gKiAoIHMgKyAxICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSxcblx0XHRcdFx0XHRcdFx0YiA9IGxheWVyb2Zmc2V0ICsgayArIHNsZW4xLFxuXHRcdFx0XHRcdFx0XHRjID0gbGF5ZXJvZmZzZXQgKyBrICsgc2xlbjIsXG5cdFx0XHRcdFx0XHRcdGQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjtcblxuXHRcdFx0XHRcdFx0ZjQoIGEsIGIsIGMsIGQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gdiggeCwgeSwgeiApIHtcblxuXHRcdFx0XHRwbGFjZWhvbGRlci5wdXNoKCB4ICk7XG5cdFx0XHRcdHBsYWNlaG9sZGVyLnB1c2goIHkgKTtcblx0XHRcdFx0cGxhY2Vob2xkZXIucHVzaCggeiApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0ZnVuY3Rpb24gZjMoIGEsIGIsIGMgKSB7XG5cblx0XHRcdFx0YWRkVmVydGV4KCBhICk7XG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlVG9wVVYoIHNjb3BlLCB2ZXJ0aWNlc0FycmF5LCBuZXh0SW5kZXggLSAzLCBuZXh0SW5kZXggLSAyLCBuZXh0SW5kZXggLSAxICk7XG5cblx0XHRcdFx0YWRkVVYoIHV2c1sgMCBdICk7XG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmdW5jdGlvbiBmNCggYSwgYiwgYywgZCApIHtcblxuXHRcdFx0XHRhZGRWZXJ0ZXgoIGEgKTtcblx0XHRcdFx0YWRkVmVydGV4KCBiICk7XG5cdFx0XHRcdGFkZFZlcnRleCggZCApO1xuXG5cdFx0XHRcdGFkZFZlcnRleCggYiApO1xuXHRcdFx0XHRhZGRWZXJ0ZXgoIGMgKTtcblx0XHRcdFx0YWRkVmVydGV4KCBkICk7XG5cblxuXHRcdFx0XHRjb25zdCBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7XG5cdFx0XHRcdGNvbnN0IHV2cyA9IHV2Z2VuLmdlbmVyYXRlU2lkZVdhbGxVViggc2NvcGUsIHZlcnRpY2VzQXJyYXksIG5leHRJbmRleCAtIDYsIG5leHRJbmRleCAtIDMsIG5leHRJbmRleCAtIDIsIG5leHRJbmRleCAtIDEgKTtcblxuXHRcdFx0XHRhZGRVViggdXZzWyAwIF0gKTtcblx0XHRcdFx0YWRkVVYoIHV2c1sgMSBdICk7XG5cdFx0XHRcdGFkZFVWKCB1dnNbIDMgXSApO1xuXG5cdFx0XHRcdGFkZFVWKCB1dnNbIDEgXSApO1xuXHRcdFx0XHRhZGRVViggdXZzWyAyIF0gKTtcblx0XHRcdFx0YWRkVVYoIHV2c1sgMyBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0ZnVuY3Rpb24gYWRkVmVydGV4KCBpbmRleCApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAwIF0gKTtcblx0XHRcdFx0dmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7XG5cdFx0XHRcdHZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDIgXSApO1xuXG5cdFx0XHR9XG5cblxuXHRcdFx0ZnVuY3Rpb24gYWRkVVYoIHZlY3RvcjIgKSB7XG5cblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnggKTtcblx0XHRcdFx0dXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRjb25zdCBzaGFwZXMgPSB0aGlzLnBhcmFtZXRlcnMuc2hhcGVzO1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLnBhcmFtZXRlcnMub3B0aW9ucztcblxuXHRcdHJldHVybiB0b0pTT04kMSggc2hhcGVzLCBvcHRpb25zLCBkYXRhICk7XG5cblx0fVxuXG59XG5cbmNvbnN0IFdvcmxkVVZHZW5lcmF0b3IgPSB7XG5cblx0Z2VuZXJhdGVUb3BVVjogZnVuY3Rpb24gKCBnZW9tZXRyeSwgdmVydGljZXMsIGluZGV4QSwgaW5kZXhCLCBpbmRleEMgKSB7XG5cblx0XHRjb25zdCBhX3ggPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyBdO1xuXHRcdGNvbnN0IGFfeSA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMSBdO1xuXHRcdGNvbnN0IGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07XG5cdFx0Y29uc3QgYl95ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAxIF07XG5cdFx0Y29uc3QgY194ID0gdmVydGljZXNbIGluZGV4QyAqIDMgXTtcblx0XHRjb25zdCBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRuZXcgVmVjdG9yMiggYV94LCBhX3kgKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGNfeCwgY195IClcblx0XHRdO1xuXG5cdH0sXG5cblx0Z2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkge1xuXG5cdFx0Y29uc3QgYV94ID0gdmVydGljZXNbIGluZGV4QSAqIDMgXTtcblx0XHRjb25zdCBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTtcblx0XHRjb25zdCBhX3ogPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDIgXTtcblx0XHRjb25zdCBiX3ggPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyBdO1xuXHRcdGNvbnN0IGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdO1xuXHRcdGNvbnN0IGJfeiA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMiBdO1xuXHRcdGNvbnN0IGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07XG5cdFx0Y29uc3QgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07XG5cdFx0Y29uc3QgY196ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAyIF07XG5cdFx0Y29uc3QgZF94ID0gdmVydGljZXNbIGluZGV4RCAqIDMgXTtcblx0XHRjb25zdCBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTtcblx0XHRjb25zdCBkX3ogPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDIgXTtcblxuXHRcdGlmICggTWF0aC5hYnMoIGFfeSAtIGJfeSApIDwgMC4wMSApIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl94LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3gsIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGFfeSwgMSAtIGFfeiApLFxuXHRcdFx0XHRuZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksXG5cdFx0XHRcdG5ldyBWZWN0b3IyKCBjX3ksIDEgLSBjX3ogKSxcblx0XHRcdFx0bmV3IFZlY3RvcjIoIGRfeSwgMSAtIGRfeiApXG5cdFx0XHRdO1xuXG5cdFx0fVxuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gdG9KU09OJDEoIHNoYXBlcywgb3B0aW9ucywgZGF0YSApIHtcblxuXHRkYXRhLnNoYXBlcyA9IFtdO1xuXG5cdGlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGkgXTtcblxuXHRcdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGUudXVpZCApO1xuXG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHRkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApO1xuXG5cdH1cblxuXHRpZiAoIG9wdGlvbnMuZXh0cnVkZVBhdGggIT09IHVuZGVmaW5lZCApIGRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG9wdGlvbnMuZXh0cnVkZVBhdGgudG9KU09OKCk7XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuY2xhc3MgSWNvc2FoZWRyb25HZW9tZXRyeSBleHRlbmRzIFBvbHloZWRyb25HZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIGRldGFpbCA9IDAgKSB7XG5cblx0XHRjb25zdCB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtcblx0XHRcdC0gMSwgdCwgMCwgXHQxLCB0LCAwLCBcdC0gMSwgLSB0LCAwLCBcdDEsIC0gdCwgMCxcblx0XHRcdDAsIC0gMSwgdCwgXHQwLCAxLCB0LFx0MCwgLSAxLCAtIHQsIFx0MCwgMSwgLSB0LFxuXHRcdFx0dCwgMCwgLSAxLCBcdHQsIDAsIDEsIFx0LSB0LCAwLCAtIDEsIFx0LSB0LCAwLCAxXG5cdFx0XTtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXG5cdFx0XHQwLCAxMSwgNSwgXHQwLCA1LCAxLCBcdDAsIDEsIDcsIFx0MCwgNywgMTAsIFx0MCwgMTAsIDExLFxuXHRcdFx0MSwgNSwgOSwgXHQ1LCAxMSwgNCxcdDExLCAxMCwgMixcdDEwLCA3LCA2LFx0NywgMSwgOCxcblx0XHRcdDMsIDksIDQsIFx0MywgNCwgMixcdDMsIDIsIDYsXHQzLCA2LCA4LFx0MywgOCwgOSxcblx0XHRcdDQsIDksIDUsIFx0MiwgNCwgMTEsXHQ2LCAyLCAxMCxcdDgsIDYsIDcsXHQ5LCA4LCAxXG5cdFx0XTtcblxuXHRcdHN1cGVyKCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0ZGV0YWlsOiBkZXRhaWxcblx0XHR9O1xuXG5cdH1cblxufVxuXG5jbGFzcyBMYXRoZUdlb21ldHJ5IGV4dGVuZHMgQnVmZmVyR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMsIHNlZ21lbnRzID0gMTIsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0xhdGhlR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cG9pbnRzOiBwb2ludHMsXG5cdFx0XHRzZWdtZW50czogc2VnbWVudHMsXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aFxuXHRcdH07XG5cblx0XHRzZWdtZW50cyA9IE1hdGguZmxvb3IoIHNlZ21lbnRzICk7XG5cblx0XHQvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdXG5cblx0XHRwaGlMZW5ndGggPSBNYXRoVXRpbHMuY2xhbXAoIHBoaUxlbmd0aCwgMCwgTWF0aC5QSSAqIDIgKTtcblxuXHRcdC8vIGJ1ZmZlcnNcblxuXHRcdGNvbnN0IGluZGljZXMgPSBbXTtcblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgaW52ZXJzZVNlZ21lbnRzID0gMS4wIC8gc2VnbWVudHM7XG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDtcblxuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHBoaSApO1xuXHRcdFx0Y29uc3QgY29zID0gTWF0aC5jb3MoIHBoaSApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIHZlcnRleFxuXG5cdFx0XHRcdHZlcnRleC54ID0gcG9pbnRzWyBqIF0ueCAqIHNpbjtcblx0XHRcdFx0dmVydGV4LnkgPSBwb2ludHNbIGogXS55O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHBvaW50c1sgaiBdLnggKiBjb3M7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXYueCA9IGkgLyBzZWdtZW50cztcblx0XHRcdFx0dXYueSA9IGogLyAoIHBvaW50cy5sZW5ndGggLSAxICk7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgKCBwb2ludHMubGVuZ3RoIC0gMSApOyBqICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGJhc2UgPSBqICsgaSAqIHBvaW50cy5sZW5ndGg7XG5cblx0XHRcdFx0Y29uc3QgYSA9IGJhc2U7XG5cdFx0XHRcdGNvbnN0IGIgPSBiYXNlICsgcG9pbnRzLmxlbmd0aDtcblx0XHRcdFx0Y29uc3QgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTtcblx0XHRcdFx0Y29uc3QgZCA9IGJhc2UgKyAxO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHRcdC8vIGdlbmVyYXRlIG5vcm1hbHNcblxuXHRcdHRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcblxuXHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBjbG9zZWQsIHdlIG5lZWQgdG8gYXZlcmFnZSB0aGUgbm9ybWFscyBhbG9uZyB0aGUgc2VhbS5cblx0XHQvLyBiZWNhdXNlIHRoZSBjb3JyZXNwb25kaW5nIHZlcnRpY2VzIGFyZSBpZGVudGljYWwgKGJ1dCBzdGlsbCBoYXZlIGRpZmZlcmVudCBVVnMpLlxuXG5cdFx0aWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkge1xuXG5cdFx0XHRjb25zdCBub3JtYWxzID0gdGhpcy5hdHRyaWJ1dGVzLm5vcm1hbC5hcnJheTtcblx0XHRcdGNvbnN0IG4xID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IG4yID0gbmV3IFZlY3RvcjMoKTtcblx0XHRcdGNvbnN0IG4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHQvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzXG5cblx0XHRcdGNvbnN0IGJhc2UgPSBzZWdtZW50cyAqIHBvaW50cy5sZW5ndGggKiAzO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGogPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSArKywgaiArPSAzICkge1xuXG5cdFx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGZpcnN0IGxpbmVcblxuXHRcdFx0XHRuMS54ID0gbm9ybWFsc1sgaiArIDAgXTtcblx0XHRcdFx0bjEueSA9IG5vcm1hbHNbIGogKyAxIF07XG5cdFx0XHRcdG4xLnogPSBub3JtYWxzWyBqICsgMiBdO1xuXG5cdFx0XHRcdC8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZVxuXG5cdFx0XHRcdG4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTtcblx0XHRcdFx0bjIueSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMSBdO1xuXHRcdFx0XHRuMi56ID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF07XG5cblx0XHRcdFx0Ly8gYXZlcmFnZSBub3JtYWxzXG5cblx0XHRcdFx0bi5hZGRWZWN0b3JzKCBuMSwgbjIgKS5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHQvLyBhc3NpZ24gdGhlIG5ldyB2YWx1ZXMgdG8gYm90aCBub3JtYWxzXG5cblx0XHRcdFx0bm9ybWFsc1sgaiArIDAgXSA9IG5vcm1hbHNbIGJhc2UgKyBqICsgMCBdID0gbi54O1xuXHRcdFx0XHRub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7XG5cdFx0XHRcdG5vcm1hbHNbIGogKyAyIF0gPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXSA9IG4uejtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5jbGFzcyBPY3RhaGVkcm9uR2VvbWV0cnkgZXh0ZW5kcyBQb2x5aGVkcm9uR2VvbWV0cnkge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCBkZXRhaWwgPSAwICkge1xuXG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXG5cdFx0XHQxLCAwLCAwLCBcdC0gMSwgMCwgMCxcdDAsIDEsIDAsXG5cdFx0XHQwLCAtIDEsIDAsIFx0MCwgMCwgMSxcdDAsIDAsIC0gMVxuXHRcdF07XG5cblx0XHRjb25zdCBpbmRpY2VzID0gW1xuXHRcdFx0MCwgMiwgNCxcdDAsIDQsIDMsXHQwLCAzLCA1LFxuXHRcdFx0MCwgNSwgMixcdDEsIDIsIDUsXHQxLCA1LCAzLFxuXHRcdFx0MSwgMywgNCxcdDEsIDQsIDJcblx0XHRdO1xuXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ09jdGFoZWRyb25HZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdGRldGFpbDogZGV0YWlsXG5cdFx0fTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5XG4gKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHBzOi8vcHJpZGVvdXQubmV0L2Jsb2cvb2xkL2Jsb2cvaW5kZXguaHRtbEBwPTQ0Lmh0bWxcbiAqL1xuXG5mdW5jdGlvbiBQYXJhbWV0cmljR2VvbWV0cnkoIGZ1bmMsIHNsaWNlcywgc3RhY2tzICkge1xuXG5cdEJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JztcblxuXHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0ZnVuYzogZnVuYyxcblx0XHRzbGljZXM6IHNsaWNlcyxcblx0XHRzdGFja3M6IHN0YWNrc1xuXHR9O1xuXG5cdC8vIGJ1ZmZlcnNcblxuXHRjb25zdCBpbmRpY2VzID0gW107XG5cdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0Y29uc3QgdXZzID0gW107XG5cblx0Y29uc3QgRVBTID0gMC4wMDAwMTtcblxuXHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdGNvbnN0IHAwID0gbmV3IFZlY3RvcjMoKSwgcDEgPSBuZXcgVmVjdG9yMygpO1xuXHRjb25zdCBwdSA9IG5ldyBWZWN0b3IzKCksIHB2ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRpZiAoIGZ1bmMubGVuZ3RoIDwgMyApIHtcblxuXHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5QYXJhbWV0cmljR2VvbWV0cnk6IEZ1bmN0aW9uIG11c3Qgbm93IG1vZGlmeSBhIFZlY3RvcjMgYXMgdGhpcmQgcGFyYW1ldGVyLicgKTtcblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdGNvbnN0IHNsaWNlQ291bnQgPSBzbGljZXMgKyAxO1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8PSBzdGFja3M7IGkgKysgKSB7XG5cblx0XHRjb25zdCB2ID0gaSAvIHN0YWNrcztcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSBzbGljZXM7IGogKysgKSB7XG5cblx0XHRcdGNvbnN0IHUgPSBqIC8gc2xpY2VzO1xuXG5cdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0ZnVuYyggdSwgdiwgcDAgKTtcblx0XHRcdHZlcnRpY2VzLnB1c2goIHAwLngsIHAwLnksIHAwLnogKTtcblxuXHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdC8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzXG5cblx0XHRcdGlmICggdSAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUgKyBFUFMsIHYsIHAxICk7XG5cdFx0XHRcdHB1LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdiAtIEVQUyA+PSAwICkge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAwLCBwMSApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGZ1bmMoIHUsIHYgKyBFUFMsIHAxICk7XG5cdFx0XHRcdHB2LnN1YlZlY3RvcnMoIHAxLCBwMCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGNyb3NzIHByb2R1Y3Qgb2YgdGFuZ2VudCB2ZWN0b3JzIHJldHVybnMgc3VyZmFjZSBub3JtYWxcblxuXHRcdFx0bm9ybWFsLmNyb3NzVmVjdG9ycyggcHUsIHB2ICkubm9ybWFsaXplKCk7XG5cdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0Ly8gdXZcblxuXHRcdFx0dXZzLnB1c2goIHUsIHYgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gZ2VuZXJhdGUgaW5kaWNlc1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IHN0YWNrczsgaSArKyApIHtcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHtcblxuXHRcdFx0Y29uc3QgYSA9IGkgKiBzbGljZUNvdW50ICsgajtcblx0XHRcdGNvbnN0IGIgPSBpICogc2xpY2VDb3VudCArIGogKyAxO1xuXHRcdFx0Y29uc3QgYyA9ICggaSArIDEgKSAqIHNsaWNlQ291bnQgKyBqICsgMTtcblx0XHRcdGNvbnN0IGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajtcblxuXHRcdFx0Ly8gZmFjZXMgb25lIGFuZCB0d29cblxuXHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG59XG5cblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTtcblBhcmFtZXRyaWNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQYXJhbWV0cmljR2VvbWV0cnk7XG5cbmNsYXNzIFJpbmdHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggaW5uZXJSYWRpdXMgPSAwLjUsIG91dGVyUmFkaXVzID0gMSwgdGhldGFTZWdtZW50cyA9IDgsIHBoaVNlZ21lbnRzID0gMSwgdGhldGFTdGFydCA9IDAsIHRoZXRhTGVuZ3RoID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1JpbmdHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsXG5cdFx0XHRvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsXG5cdFx0XHR0aGV0YVNlZ21lbnRzOiB0aGV0YVNlZ21lbnRzLFxuXHRcdFx0cGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLFxuXHRcdFx0dGhldGFTdGFydDogdGhldGFTdGFydCxcblx0XHRcdHRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aFxuXHRcdH07XG5cblx0XHR0aGV0YVNlZ21lbnRzID0gTWF0aC5tYXgoIDMsIHRoZXRhU2VnbWVudHMgKTtcblx0XHRwaGlTZWdtZW50cyA9IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gc29tZSBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRsZXQgcmFkaXVzID0gaW5uZXJSYWRpdXM7XG5cdFx0Y29uc3QgcmFkaXVzU3RlcCA9ICggKCBvdXRlclJhZGl1cyAtIGlubmVyUmFkaXVzICkgLyBwaGlTZWdtZW50cyApO1xuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGogPSAwOyBqIDw9IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdGhldGFTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHQvLyB2YWx1ZXMgYXJlIGdlbmVyYXRlIGZyb20gdGhlIGluc2lkZSBvZiB0aGUgcmluZyB0byB0aGUgb3V0c2lkZVxuXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnQgPSB0aGV0YVN0YXJ0ICsgaSAvIHRoZXRhU2VnbWVudHMgKiB0aGV0YUxlbmd0aDtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7XG5cdFx0XHRcdHZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0bm9ybWFscy5wdXNoKCAwLCAwLCAxICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1di54ID0gKCB2ZXJ0ZXgueCAvIG91dGVyUmFkaXVzICsgMSApIC8gMjtcblx0XHRcdFx0dXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7XG5cblx0XHRcdFx0dXZzLnB1c2goIHV2LngsIHV2LnkgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmNyZWFzZSB0aGUgcmFkaXVzIGZvciBuZXh0IHJvdyBvZiB2ZXJ0aWNlc1xuXG5cdFx0XHRyYWRpdXMgKz0gcmFkaXVzU3RlcDtcblxuXHRcdH1cblxuXHRcdC8vIGluZGljZXNcblxuXHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHBoaVNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRjb25zdCB0aGV0YVNlZ21lbnRMZXZlbCA9IGogKiAoIHRoZXRhU2VnbWVudHMgKyAxICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc2VnbWVudCA9IGkgKyB0aGV0YVNlZ21lbnRMZXZlbDtcblxuXHRcdFx0XHRjb25zdCBhID0gc2VnbWVudDtcblx0XHRcdFx0Y29uc3QgYiA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMTtcblx0XHRcdFx0Y29uc3QgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjtcblx0XHRcdFx0Y29uc3QgZCA9IHNlZ21lbnQgKyAxO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgU2hhcGVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3Rvciggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzID0gMTIgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdTaGFwZUdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHNoYXBlczogc2hhcGVzLFxuXHRcdFx0Y3VydmVTZWdtZW50czogY3VydmVTZWdtZW50c1xuXHRcdH07XG5cblx0XHQvLyBidWZmZXJzXG5cblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cdFx0Y29uc3QgdmVydGljZXMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgdXZzID0gW107XG5cblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRsZXQgZ3JvdXBTdGFydCA9IDA7XG5cdFx0bGV0IGdyb3VwQ291bnQgPSAwO1xuXG5cdFx0Ly8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yIFwic2hhcGVzXCIgcGFyYW1ldGVyXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHtcblxuXHRcdFx0YWRkU2hhcGUoIHNoYXBlcyApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRhZGRTaGFwZSggc2hhcGVzWyBpIF0gKTtcblxuXHRcdFx0XHR0aGlzLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCBpICk7IC8vIGVuYWJsZXMgTXVsdGlNYXRlcmlhbCBzdXBwb3J0XG5cblx0XHRcdFx0Z3JvdXBTdGFydCArPSBncm91cENvdW50O1xuXHRcdFx0XHRncm91cENvdW50ID0gMDtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblxuXHRcdC8vIGhlbHBlciBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHtcblxuXHRcdFx0Y29uc3QgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzO1xuXHRcdFx0Y29uc3QgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApO1xuXG5cdFx0XHRsZXQgc2hhcGVWZXJ0aWNlcyA9IHBvaW50cy5zaGFwZTtcblx0XHRcdGNvbnN0IHNoYXBlSG9sZXMgPSBwb2ludHMuaG9sZXM7XG5cblx0XHRcdC8vIGNoZWNrIGRpcmVjdGlvbiBvZiB2ZXJ0aWNlc1xuXG5cdFx0XHRpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0c2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpO1xuXG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBTaGFwZVV0aWxzLmlzQ2xvY2tXaXNlKCBzaGFwZUhvbGUgKSA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHRcdHNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7XG5cblx0XHRcdC8vIGpvaW4gdmVydGljZXMgb2YgaW5uZXIgYW5kIG91dGVyIHBhdGhzIHRvIGEgc2luZ2xlIGFycmF5XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNoYXBlSG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZUhvbGUgPSBzaGFwZUhvbGVzWyBpIF07XG5cdFx0XHRcdHNoYXBlVmVydGljZXMgPSBzaGFwZVZlcnRpY2VzLmNvbmNhdCggc2hhcGVIb2xlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gdmVydGljZXMsIG5vcm1hbHMsIHV2c1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzaGFwZVZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdmVydGV4ID0gc2hhcGVWZXJ0aWNlc1sgaSBdO1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgMCApO1xuXHRcdFx0XHRub3JtYWxzLnB1c2goIDAsIDAsIDEgKTtcblx0XHRcdFx0dXZzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSApOyAvLyB3b3JsZCB1dnNcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBpbmNpZGVzXG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZmFjZSA9IGZhY2VzWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgYSA9IGZhY2VbIDAgXSArIGluZGV4T2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBiID0gZmFjZVsgMSBdICsgaW5kZXhPZmZzZXQ7XG5cdFx0XHRcdGNvbnN0IGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDtcblxuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTtcblx0XHRcdFx0Z3JvdXBDb3VudCArPSAzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7XG5cblx0XHRyZXR1cm4gdG9KU09OKCBzaGFwZXMsIGRhdGEgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gdG9KU09OKCBzaGFwZXMsIGRhdGEgKSB7XG5cblx0ZGF0YS5zaGFwZXMgPSBbXTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gc2hhcGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHNoYXBlID0gc2hhcGVzWyBpIF07XG5cblx0XHRcdGRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTtcblxuXHRcdH1cblxuXHR9IGVsc2Uge1xuXG5cdFx0ZGF0YS5zaGFwZXMucHVzaCggc2hhcGVzLnV1aWQgKTtcblxuXHR9XG5cblx0cmV0dXJuIGRhdGE7XG5cbn1cblxuY2xhc3MgU3BoZXJlR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHdpZHRoU2VnbWVudHMgPSA4LCBoZWlnaHRTZWdtZW50cyA9IDYsIHBoaVN0YXJ0ID0gMCwgcGhpTGVuZ3RoID0gTWF0aC5QSSAqIDIsIHRoZXRhU3RhcnQgPSAwLCB0aGV0YUxlbmd0aCA9IE1hdGguUEkgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdTcGhlcmVHZW9tZXRyeSc7XG5cblx0XHR0aGlzLnBhcmFtZXRlcnMgPSB7XG5cdFx0XHRyYWRpdXM6IHJhZGl1cyxcblx0XHRcdHdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsXG5cdFx0XHRoZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsXG5cdFx0XHRwaGlTdGFydDogcGhpU3RhcnQsXG5cdFx0XHRwaGlMZW5ndGg6IHBoaUxlbmd0aCxcblx0XHRcdHRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsXG5cdFx0XHR0aGV0YUxlbmd0aDogdGhldGFMZW5ndGhcblx0XHR9O1xuXG5cdFx0d2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgKTtcblx0XHRoZWlnaHRTZWdtZW50cyA9IE1hdGgubWF4KCAyLCBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApICk7XG5cblx0XHRjb25zdCB0aGV0YUVuZCA9IE1hdGgubWluKCB0aGV0YVN0YXJ0ICsgdGhldGFMZW5ndGgsIE1hdGguUEkgKTtcblxuXHRcdGxldCBpbmRleCA9IDA7XG5cdFx0Y29uc3QgZ3JpZCA9IFtdO1xuXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGl5ID0gMDsgaXkgPD0gaGVpZ2h0U2VnbWVudHM7IGl5ICsrICkge1xuXG5cdFx0XHRjb25zdCB2ZXJ0aWNlc1JvdyA9IFtdO1xuXG5cdFx0XHRjb25zdCB2ID0gaXkgLyBoZWlnaHRTZWdtZW50cztcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlIGZvciB0aGUgcG9sZXNcblxuXHRcdFx0bGV0IHVPZmZzZXQgPSAwO1xuXG5cdFx0XHRpZiAoIGl5ID09IDAgJiYgdGhldGFTdGFydCA9PSAwICkge1xuXG5cdFx0XHRcdHVPZmZzZXQgPSAwLjUgLyB3aWR0aFNlZ21lbnRzO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpeSA9PSBoZWlnaHRTZWdtZW50cyAmJiB0aGV0YUVuZCA9PSBNYXRoLlBJICkge1xuXG5cdFx0XHRcdHVPZmZzZXQgPSAtIDAuNSAvIHdpZHRoU2VnbWVudHM7XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPD0gd2lkdGhTZWdtZW50czsgaXggKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IGl4IC8gd2lkdGhTZWdtZW50cztcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTtcblx0XHRcdFx0dmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLmNvcyggdGhldGFTdGFydCArIHYgKiB0aGV0YUxlbmd0aCApO1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IHJhZGl1cyAqIE1hdGguc2luKCBwaGlTdGFydCArIHUgKiBwaGlMZW5ndGggKSAqIE1hdGguc2luKCB0aGV0YVN0YXJ0ICsgdiAqIHRoZXRhTGVuZ3RoICk7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC5jb3B5KCB2ZXJ0ZXggKS5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7XG5cblx0XHRcdFx0Ly8gdXZcblxuXHRcdFx0XHR1dnMucHVzaCggdSArIHVPZmZzZXQsIDEgLSB2ICk7XG5cblx0XHRcdFx0dmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRncmlkLnB1c2goIHZlcnRpY2VzUm93ICk7XG5cblx0XHR9XG5cblx0XHQvLyBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaXkgPSAwOyBpeSA8IGhlaWdodFNlZ21lbnRzOyBpeSArKyApIHtcblxuXHRcdFx0Zm9yICggbGV0IGl4ID0gMDsgaXggPCB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHtcblxuXHRcdFx0XHRjb25zdCBhID0gZ3JpZFsgaXkgXVsgaXggKyAxIF07XG5cdFx0XHRcdGNvbnN0IGIgPSBncmlkWyBpeSBdWyBpeCBdO1xuXHRcdFx0XHRjb25zdCBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07XG5cdFx0XHRcdGNvbnN0IGQgPSBncmlkWyBpeSArIDEgXVsgaXggKyAxIF07XG5cblx0XHRcdFx0aWYgKCBpeSAhPT0gMCB8fCB0aGV0YVN0YXJ0ID4gMCApIGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEluZGV4KCBpbmRpY2VzICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApICk7XG5cdFx0dGhpcy5zZXRBdHRyaWJ1dGUoICd1dicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBUZXRyYWhlZHJvbkdlb21ldHJ5IGV4dGVuZHMgUG9seWhlZHJvbkdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMSwgZGV0YWlsID0gMCApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXHRcdFx0MSwgMSwgMSwgXHQtIDEsIC0gMSwgMSwgXHQtIDEsIDEsIC0gMSwgXHQxLCAtIDEsIC0gMVxuXHRcdF07XG5cblx0XHRjb25zdCBpbmRpY2VzID0gW1xuXHRcdFx0MiwgMSwgMCwgXHQwLCAzLCAyLFx0MSwgMywgMCxcdDIsIDMsIDFcblx0XHRdO1xuXG5cdFx0c3VwZXIoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRkZXRhaWw6IGRldGFpbFxuXHRcdH07XG5cblx0fVxuXG59XG5cbi8qKlxuICogVGV4dCA9IDNEIFRleHRcbiAqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGZvbnQ6IDxUSFJFRS5Gb250PiwgLy8gZm9udFxuICpcbiAqICBzaXplOiA8ZmxvYXQ+LCAvLyBzaXplIG9mIHRoZSB0ZXh0XG4gKiAgaGVpZ2h0OiA8ZmxvYXQ+LCAvLyB0aGlja25lc3MgdG8gZXh0cnVkZSB0ZXh0XG4gKiAgY3VydmVTZWdtZW50czogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgb24gdGhlIGN1cnZlc1xuICpcbiAqICBiZXZlbEVuYWJsZWQ6IDxib29sPiwgLy8gdHVybiBvbiBiZXZlbFxuICogIGJldmVsVGhpY2tuZXNzOiA8ZmxvYXQ+LCAvLyBob3cgZGVlcCBpbnRvIHRleHQgYmV2ZWwgZ29lc1xuICogIGJldmVsU2l6ZTogPGZsb2F0PiwgLy8gaG93IGZhciBmcm9tIHRleHQgb3V0bGluZSAoaW5jbHVkaW5nIGJldmVsT2Zmc2V0KSBpcyBiZXZlbFxuICogIGJldmVsT2Zmc2V0OiA8ZmxvYXQ+IC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgZG9lcyBiZXZlbCBzdGFydFxuICogfVxuICovXG5cbmNsYXNzIFRleHRHZW9tZXRyeSBleHRlbmRzIEV4dHJ1ZGVHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHRleHQsIHBhcmFtZXRlcnMgPSB7fSApIHtcblxuXHRcdGNvbnN0IGZvbnQgPSBwYXJhbWV0ZXJzLmZvbnQ7XG5cblx0XHRpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LicgKTtcblx0XHRcdHJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHNoYXBlcyA9IGZvbnQuZ2VuZXJhdGVTaGFwZXMoIHRleHQsIHBhcmFtZXRlcnMuc2l6ZSApO1xuXG5cdFx0Ly8gdHJhbnNsYXRlIHBhcmFtZXRlcnMgdG8gRXh0cnVkZUdlb21ldHJ5IEFQSVxuXG5cdFx0cGFyYW1ldGVycy5kZXB0aCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwO1xuXG5cdFx0Ly8gZGVmYXVsdHNcblxuXHRcdGlmICggcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbFRoaWNrbmVzcyA9IDEwO1xuXHRcdGlmICggcGFyYW1ldGVycy5iZXZlbFNpemUgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxTaXplID0gODtcblx0XHRpZiAoIHBhcmFtZXRlcnMuYmV2ZWxFbmFibGVkID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0c3VwZXIoIHNoYXBlcywgcGFyYW1ldGVycyApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1RleHRHZW9tZXRyeSc7XG5cblx0fVxuXG59XG5cbmNsYXNzIFRvcnVzR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHJhZGlhbFNlZ21lbnRzID0gOCwgdHVidWxhclNlZ21lbnRzID0gNiwgYXJjID0gTWF0aC5QSSAqIDIgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdUb3J1c0dlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0dHViZTogdHViZSxcblx0XHRcdHJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cyxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0YXJjOiBhcmNcblx0XHR9O1xuXG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXHRcdHR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgY2VudGVyID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHQvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBhcmM7XG5cdFx0XHRcdGNvbnN0IHYgPSBqIC8gcmFkaWFsU2VnbWVudHMgKiBNYXRoLlBJICogMjtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9ICggcmFkaXVzICsgdHViZSAqIE1hdGguY29zKCB2ICkgKSAqIE1hdGguY29zKCB1ICk7XG5cdFx0XHRcdHZlcnRleC55ID0gKCByYWRpdXMgKyB0dWJlICogTWF0aC5jb3MoIHYgKSApICogTWF0aC5zaW4oIHUgKTtcblx0XHRcdFx0dmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7XG5cblx0XHRcdFx0Ly8gbm9ybWFsXG5cblx0XHRcdFx0Y2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApO1xuXHRcdFx0XHRjZW50ZXIueSA9IHJhZGl1cyAqIE1hdGguc2luKCB1ICk7XG5cdFx0XHRcdG5vcm1hbC5zdWJWZWN0b3JzKCB2ZXJ0ZXgsIGNlbnRlciApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpIC0gMTtcblx0XHRcdFx0Y29uc3QgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7XG5cdFx0XHRcdGNvbnN0IGMgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqICggaiAtIDEgKSArIGk7XG5cdFx0XHRcdGNvbnN0IGQgPSAoIHR1YnVsYXJTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXG5cdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0aW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7XG5cdFx0XHRcdGluZGljZXMucHVzaCggYiwgYywgZCApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBidWlsZCBnZW9tZXRyeVxuXG5cdFx0dGhpcy5zZXRJbmRleCggaW5kaWNlcyApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApO1xuXHRcdHRoaXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgVG9ydXNLbm90R2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHR1YmUgPSAwLjQsIHR1YnVsYXJTZWdtZW50cyA9IDY0LCByYWRpYWxTZWdtZW50cyA9IDgsIHAgPSAyLCBxID0gMyApIHtcblxuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy50eXBlID0gJ1RvcnVzS25vdEdlb21ldHJ5JztcblxuXHRcdHRoaXMucGFyYW1ldGVycyA9IHtcblx0XHRcdHJhZGl1czogcmFkaXVzLFxuXHRcdFx0dHViZTogdHViZSxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0cmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0cDogcCxcblx0XHRcdHE6IHFcblx0XHR9O1xuXG5cdFx0dHVidWxhclNlZ21lbnRzID0gTWF0aC5mbG9vciggdHVidWxhclNlZ21lbnRzICk7XG5cdFx0cmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0Ly8gYnVmZmVyc1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IFtdO1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3Qgbm9ybWFscyA9IFtdO1xuXHRcdGNvbnN0IHV2cyA9IFtdO1xuXG5cdFx0Ly8gaGVscGVyIHZhcmlhYmxlc1xuXG5cdFx0Y29uc3QgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Y29uc3QgUDEgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IFAyID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdGNvbnN0IEIgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IFQgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IE4gPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2c1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDw9IHR1YnVsYXJTZWdtZW50czsgKysgaSApIHtcblxuXHRcdFx0Ly8gdGhlIHJhZGlhbiBcInVcIiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlIG9mIHRoZSBjdXJyZW50IHR1YnVsYXIgc2VnZW1lbnRcblxuXHRcdFx0Y29uc3QgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdC8vIG5vdyB3ZSBjYWxjdWxhdGUgdHdvIHBvaW50cy4gUDEgaXMgb3VyIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlLCBQMiBpcyBhIGxpdHRsZSBmYXJ0aGVyIGFoZWFkLlxuXHRcdFx0Ly8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgXCJjb29yZGluYXRlIHNwYWNlXCIsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmVydGV4IHBvc2l0aW9uc1xuXG5cdFx0XHRjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgUDEgKTtcblx0XHRcdGNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSArIDAuMDEsIHAsIHEsIHJhZGl1cywgUDIgKTtcblxuXHRcdFx0Ly8gY2FsY3VsYXRlIG9ydGhvbm9ybWFsIGJhc2lzXG5cblx0XHRcdFQuc3ViVmVjdG9ycyggUDIsIFAxICk7XG5cdFx0XHROLmFkZFZlY3RvcnMoIFAyLCBQMSApO1xuXHRcdFx0Qi5jcm9zc1ZlY3RvcnMoIFQsIE4gKTtcblx0XHRcdE4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7XG5cblx0XHRcdC8vIG5vcm1hbGl6ZSBCLCBOLiBUIGNhbiBiZSBpZ25vcmVkLCB3ZSBkb24ndCB1c2UgaXRcblxuXHRcdFx0Qi5ub3JtYWxpemUoKTtcblx0XHRcdE4ubm9ybWFsaXplKCk7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgKysgaiApIHtcblxuXHRcdFx0XHQvLyBub3cgY2FsY3VsYXRlIHRoZSB2ZXJ0aWNlcy4gdGhleSBhcmUgbm90aGluZyBtb3JlIHRoYW4gYW4gZXh0cnVzaW9uIG9mIHRoZSB0b3J1cyBjdXJ2ZS5cblx0XHRcdFx0Ly8gYmVjYXVzZSB3ZSBleHRydWRlIGEgc2hhcGUgaW4gdGhlIHh5LXBsYW5lLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNhbGN1bGF0ZSBhIHotdmFsdWUuXG5cblx0XHRcdFx0Y29uc3QgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyO1xuXHRcdFx0XHRjb25zdCBjeCA9IC0gdHViZSAqIE1hdGguY29zKCB2ICk7XG5cdFx0XHRcdGNvbnN0IGN5ID0gdHViZSAqIE1hdGguc2luKCB2ICk7XG5cblx0XHRcdFx0Ly8gbm93IGNhbGN1bGF0ZSB0aGUgZmluYWwgdmVydGV4IHBvc2l0aW9uLlxuXHRcdFx0XHQvLyBmaXJzdCB3ZSBvcmllbnQgdGhlIGV4dHJ1c2lvbiB3aXRoIG91ciBiYXNpcyB2ZWN0b3MsIHRoZW4gd2UgYWRkIGl0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZVxuXG5cdFx0XHRcdHZlcnRleC54ID0gUDEueCArICggY3ggKiBOLnggKyBjeSAqIEIueCApO1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTtcblx0XHRcdFx0dmVydGV4LnogPSBQMS56ICsgKCBjeCAqIE4ueiArIGN5ICogQi56ICk7XG5cblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbCAoUDEgaXMgYWx3YXlzIHRoZSBjZW50ZXIvb3JpZ2luIG9mIHRoZSBleHRydXNpb24sIHRodXMgd2UgY2FuIHVzZSBpdCB0byBjYWxjdWxhdGUgdGhlIG5vcm1hbClcblxuXHRcdFx0XHRub3JtYWwuc3ViVmVjdG9ycyggdmVydGV4LCBQMSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRcdG5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApO1xuXG5cdFx0XHRcdC8vIHV2XG5cblx0XHRcdFx0dXZzLnB1c2goIGkgLyB0dWJ1bGFyU2VnbWVudHMgKTtcblx0XHRcdFx0dXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBnZW5lcmF0ZSBpbmRpY2VzXG5cblx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gcmFkaWFsU2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gaW5kaWNlc1xuXG5cdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHRjb25zdCBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7XG5cdFx0XHRcdGNvbnN0IGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7XG5cdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHQvLyBmYWNlc1xuXG5cdFx0XHRcdGluZGljZXMucHVzaCggYSwgYiwgZCApO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0XHQvLyB0aGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIHRvcnVzIGN1cnZlXG5cblx0XHRmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7XG5cblx0XHRcdGNvbnN0IGN1ID0gTWF0aC5jb3MoIHUgKTtcblx0XHRcdGNvbnN0IHN1ID0gTWF0aC5zaW4oIHUgKTtcblx0XHRcdGNvbnN0IHF1T3ZlclAgPSBxIC8gcCAqIHU7XG5cdFx0XHRjb25zdCBjcyA9IE1hdGguY29zKCBxdU92ZXJQICk7XG5cblx0XHRcdHBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7XG5cdFx0XHRwb3NpdGlvbi55ID0gcmFkaXVzICogKCAyICsgY3MgKSAqIHN1ICogMC41O1xuXHRcdFx0cG9zaXRpb24ueiA9IHJhZGl1cyAqIE1hdGguc2luKCBxdU92ZXJQICkgKiAwLjU7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNsYXNzIFR1YmVHZW9tZXRyeSBleHRlbmRzIEJ1ZmZlckdlb21ldHJ5IHtcblxuXHRjb25zdHJ1Y3RvciggcGF0aCwgdHVidWxhclNlZ21lbnRzID0gNjQsIHJhZGl1cyA9IDEsIHJhZGlhbFNlZ21lbnRzID0gOCwgY2xvc2VkID0gZmFsc2UgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdUdWJlR2VvbWV0cnknO1xuXG5cdFx0dGhpcy5wYXJhbWV0ZXJzID0ge1xuXHRcdFx0cGF0aDogcGF0aCxcblx0XHRcdHR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLFxuXHRcdFx0cmFkaXVzOiByYWRpdXMsXG5cdFx0XHRyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsXG5cdFx0XHRjbG9zZWQ6IGNsb3NlZFxuXHRcdH07XG5cblx0XHRjb25zdCBmcmFtZXMgPSBwYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHR1YnVsYXJTZWdtZW50cywgY2xvc2VkICk7XG5cblx0XHQvLyBleHBvc2UgaW50ZXJuYWxzXG5cblx0XHR0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzO1xuXHRcdHRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzO1xuXHRcdHRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFscztcblxuXHRcdC8vIGhlbHBlciB2YXJpYWJsZXNcblxuXHRcdGNvbnN0IHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Y29uc3Qgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTtcblx0XHRjb25zdCB1diA9IG5ldyBWZWN0b3IyKCk7XG5cdFx0bGV0IFAgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Ly8gYnVmZmVyXG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IG5vcm1hbHMgPSBbXTtcblx0XHRjb25zdCB1dnMgPSBbXTtcblx0XHRjb25zdCBpbmRpY2VzID0gW107XG5cblx0XHQvLyBjcmVhdGUgYnVmZmVyIGRhdGFcblxuXHRcdGdlbmVyYXRlQnVmZmVyRGF0YSgpO1xuXG5cdFx0Ly8gYnVpbGQgZ2VvbWV0cnlcblxuXHRcdHRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTtcblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7XG5cblx0XHQvLyBmdW5jdGlvbnNcblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlQnVmZmVyRGF0YSgpIHtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdGdlbmVyYXRlU2VnbWVudCggaSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHNcblx0XHRcdC8vIGF0IHRoZSByZWd1bGFyIHBvc2l0aW9uIG9uIHRoZSBnaXZlbiBwYXRoXG5cdFx0XHQvL1xuXHRcdFx0Ly8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcilcblxuXHRcdFx0Z2VuZXJhdGVTZWdtZW50KCAoIGNsb3NlZCA9PT0gZmFsc2UgKSA/IHR1YnVsYXJTZWdtZW50cyA6IDAgKTtcblxuXHRcdFx0Ly8gdXZzIGFyZSBnZW5lcmF0ZWQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbi5cblx0XHRcdC8vIHRoaXMgbWFrZXMgaXQgZWFzeSBjb21wdXRlIGNvcnJlY3QgdmFsdWVzIGZvciBjbG9zZWQgZ2VvbWV0cmllc1xuXG5cdFx0XHRnZW5lcmF0ZVVWcygpO1xuXG5cdFx0XHQvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlc1xuXG5cdFx0XHRnZW5lcmF0ZUluZGljZXMoKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlU2VnbWVudCggaSApIHtcblxuXHRcdFx0Ly8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aFxuXG5cdFx0XHRQID0gcGF0aC5nZXRQb2ludEF0KCBpIC8gdHVidWxhclNlZ21lbnRzLCBQICk7XG5cblx0XHRcdC8vIHJldHJpZXZlIGNvcnJlc3BvbmRpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbFxuXG5cdFx0XHRjb25zdCBOID0gZnJhbWVzLm5vcm1hbHNbIGkgXTtcblx0XHRcdGNvbnN0IEIgPSBmcmFtZXMuYmlub3JtYWxzWyBpIF07XG5cblx0XHRcdC8vIGdlbmVyYXRlIG5vcm1hbHMgYW5kIHZlcnRpY2VzIGZvciB0aGUgY3VycmVudCBzZWdtZW50XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHRjb25zdCB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7XG5cblx0XHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHYgKTtcblx0XHRcdFx0Y29uc3QgY29zID0gLSBNYXRoLmNvcyggdiApO1xuXG5cdFx0XHRcdC8vIG5vcm1hbFxuXG5cdFx0XHRcdG5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTtcblx0XHRcdFx0bm9ybWFsLnkgPSAoIGNvcyAqIE4ueSArIHNpbiAqIEIueSApO1xuXHRcdFx0XHRub3JtYWwueiA9ICggY29zICogTi56ICsgc2luICogQi56ICk7XG5cdFx0XHRcdG5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHRub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTtcblxuXHRcdFx0XHQvLyB2ZXJ0ZXhcblxuXHRcdFx0XHR2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54O1xuXHRcdFx0XHR2ZXJ0ZXgueSA9IFAueSArIHJhZGl1cyAqIG5vcm1hbC55O1xuXHRcdFx0XHR2ZXJ0ZXgueiA9IFAueiArIHJhZGl1cyAqIG5vcm1hbC56O1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gZ2VuZXJhdGVJbmRpY2VzKCkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDE7IGogPD0gdHVidWxhclNlZ21lbnRzOyBqICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApO1xuXHRcdFx0XHRcdGNvbnN0IGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTtcblx0XHRcdFx0XHRjb25zdCBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpO1xuXHRcdFx0XHRcdGNvbnN0IGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTtcblxuXHRcdFx0XHRcdC8vIGZhY2VzXG5cblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTtcblx0XHRcdFx0XHRpbmRpY2VzLnB1c2goIGIsIGMsIGQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8PSByYWRpYWxTZWdtZW50czsgaiArKyApIHtcblxuXHRcdFx0XHRcdHV2LnggPSBpIC8gdHVidWxhclNlZ21lbnRzO1xuXHRcdFx0XHRcdHV2LnkgPSBqIC8gcmFkaWFsU2VnbWVudHM7XG5cblx0XHRcdFx0XHR1dnMucHVzaCggdXYueCwgdXYueSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApO1xuXG5cdFx0ZGF0YS5wYXRoID0gdGhpcy5wYXJhbWV0ZXJzLnBhdGgudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuY2xhc3MgV2lyZWZyYW1lR2VvbWV0cnkgZXh0ZW5kcyBCdWZmZXJHZW9tZXRyeSB7XG5cblx0Y29uc3RydWN0b3IoIGdlb21ldHJ5ICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLnR5cGUgPSAnV2lyZWZyYW1lR2VvbWV0cnknO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ID09PSB0cnVlICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBidWZmZXJcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cblx0XHQvLyBoZWxwZXIgdmFyaWFibGVzXG5cblx0XHRjb25zdCBlZGdlID0gWyAwLCAwIF0sIGVkZ2VzID0ge307XG5cblx0XHRjb25zdCB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0aWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gaW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0XHRjb25zdCBpbmRpY2VzID0gZ2VvbWV0cnkuaW5kZXg7XG5cdFx0XHRsZXQgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzO1xuXG5cdFx0XHRpZiAoIGdyb3Vwcy5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdFx0Z3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhbGwgZWdlcyB3aXRob3V0IGR1cGxpY2F0ZXNcblxuXHRcdFx0Zm9yICggbGV0IG8gPSAwLCBvbCA9IGdyb3Vwcy5sZW5ndGg7IG8gPCBvbDsgKysgbyApIHtcblxuXHRcdFx0XHRjb25zdCBncm91cCA9IGdyb3Vwc1sgbyBdO1xuXG5cdFx0XHRcdGNvbnN0IHN0YXJ0ID0gZ3JvdXAuc3RhcnQ7XG5cdFx0XHRcdGNvbnN0IGNvdW50ID0gZ3JvdXAuY291bnQ7XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkge1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgMzsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZWRnZTEgPSBpbmRpY2VzLmdldFgoIGkgKyBqICk7XG5cdFx0XHRcdFx0XHRjb25zdCBlZGdlMiA9IGluZGljZXMuZ2V0WCggaSArICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHRcdGVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzXG5cdFx0XHRcdFx0XHRlZGdlWyAxIF0gPSBNYXRoLm1heCggZWRnZTEsIGVkZ2UyICk7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTtcblxuXHRcdFx0XHRcdFx0aWYgKCBlZGdlc1sga2V5IF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRlZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9O1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIGdlbmVyYXRlIHZlcnRpY2VzXG5cblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBlZGdlcyApIHtcblxuXHRcdFx0XHRjb25zdCBlID0gZWRnZXNbIGtleSBdO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDEgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgZS5pbmRleDIgKTtcblx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeVxuXG5cdFx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9ICggcG9zaXRpb24uY291bnQgLyAzICk7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IDM7IGogKysgKSB7XG5cblx0XHRcdFx0XHQvLyB0aHJlZSBlZGdlcyBwZXIgdHJpYW5nbGUsIGFuIGVkZ2UgaXMgcmVwcmVzZW50ZWQgYXMgKGluZGV4MSwgaW5kZXgyKVxuXHRcdFx0XHRcdC8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKVxuXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXgxID0gMyAqIGkgKyBqO1xuXHRcdFx0XHRcdHZlcnRleC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgaW5kZXgxICk7XG5cdFx0XHRcdFx0dmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApO1xuXG5cdFx0XHRcdFx0Y29uc3QgaW5kZXgyID0gMyAqIGkgKyAoICggaiArIDEgKSAlIDMgKTtcblx0XHRcdFx0XHR2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApO1xuXHRcdFx0XHRcdHZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIGJ1aWxkIGdlb21ldHJ5XG5cblx0XHR0aGlzLnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblxuXHR9XG5cbn1cblxudmFyIEdlb21ldHJpZXMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7XG5cdF9fcHJvdG9fXzogbnVsbCxcblx0Qm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LFxuXHRCb3hCdWZmZXJHZW9tZXRyeTogQm94R2VvbWV0cnksXG5cdENpcmNsZUdlb21ldHJ5OiBDaXJjbGVHZW9tZXRyeSxcblx0Q2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LFxuXHRDb25lR2VvbWV0cnk6IENvbmVHZW9tZXRyeSxcblx0Q29uZUJ1ZmZlckdlb21ldHJ5OiBDb25lR2VvbWV0cnksXG5cdEN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdEN5bGluZGVyQnVmZmVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksXG5cdERvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSxcblx0RG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LFxuXHRFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LFxuXHRFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSxcblx0RXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBFeHRydWRlR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uR2VvbWV0cnksXG5cdExhdGhlR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdExhdGhlQnVmZmVyR2VvbWV0cnk6IExhdGhlR2VvbWV0cnksXG5cdE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LFxuXHRPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IE9jdGFoZWRyb25HZW9tZXRyeSxcblx0UGFyYW1ldHJpY0dlb21ldHJ5OiBQYXJhbWV0cmljR2VvbWV0cnksXG5cdFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTogUGFyYW1ldHJpY0dlb21ldHJ5LFxuXHRQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQbGFuZUJ1ZmZlckdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LFxuXHRQb2x5aGVkcm9uR2VvbWV0cnk6IFBvbHloZWRyb25HZW9tZXRyeSxcblx0UG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksXG5cdFJpbmdHZW9tZXRyeTogUmluZ0dlb21ldHJ5LFxuXHRSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSxcblx0U2hhcGVHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVHZW9tZXRyeSxcblx0U3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LFxuXHRTcGhlcmVCdWZmZXJHZW9tZXRyeTogU3BoZXJlR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksXG5cdFRleHRHZW9tZXRyeTogVGV4dEdlb21ldHJ5LFxuXHRUZXh0QnVmZmVyR2VvbWV0cnk6IFRleHRHZW9tZXRyeSxcblx0VG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNCdWZmZXJHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSxcblx0VG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LFxuXHRUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9ydXNLbm90R2VvbWV0cnksXG5cdFR1YmVHZW9tZXRyeTogVHViZUdlb21ldHJ5LFxuXHRUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSxcblx0V2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5XG59KTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8VEhSRUUuQ29sb3I+XG4gKiB9XG4gKi9cblxuY2xhc3MgU2hhZG93TWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NoYWRvd01hdGVyaWFsJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4MDAwMDAwICk7XG5cdFx0dGhpcy50cmFuc3BhcmVudCA9IHRydWU7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlO1xuXG5jbGFzcyBSYXdTaGFkZXJNYXRlcmlhbCBleHRlbmRzIFNoYWRlck1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCBwYXJhbWV0ZXJzICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnUmF3U2hhZGVyTWF0ZXJpYWwnO1xuXG5cdH1cblxufVxuXG5SYXdTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LFxuICogIG1ldGFsbmVzczogPGZsb2F0PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksXG4gKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+LFxuICpcbiAqICBmbGF0U2hhZGluZzogPGJvb2w+XG4gKiB9XG4gKi9cblxuZnVuY3Rpb24gTWVzaFN0YW5kYXJkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7XG5cblx0TWF0ZXJpYWwuY2FsbCggdGhpcyApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLnR5cGUgPSAnTWVzaFN0YW5kYXJkTWF0ZXJpYWwnO1xuXG5cdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2Vcblx0dGhpcy5yb3VnaG5lc3MgPSAxLjA7XG5cdHRoaXMubWV0YWxuZXNzID0gMC4wO1xuXG5cdHRoaXMubWFwID0gbnVsbDtcblxuXHR0aGlzLmxpZ2h0TWFwID0gbnVsbDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmFvTWFwID0gbnVsbDtcblx0dGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDtcblxuXHR0aGlzLmVtaXNzaXZlID0gbmV3IENvbG9yKCAweDAwMDAwMCApO1xuXHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHR0aGlzLmVtaXNzaXZlTWFwID0gbnVsbDtcblxuXHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0dGhpcy5ub3JtYWxNYXAgPSBudWxsO1xuXHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gbnVsbDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBudWxsO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gbnVsbDtcblxuXHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHR0aGlzLmVudk1hcCA9IG51bGw7XG5cdHRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODtcblxuXHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0dGhpcy52ZXJ0ZXhUYW5nZW50cyA9IGZhbHNlO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoU3RhbmRhcmRNYXRlcmlhbDtcblxuTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoU3RhbmRhcmRNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHsgJ1NUQU5EQVJEJzogJycgfTtcblxuXHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHR0aGlzLnJvdWdobmVzcyA9IHNvdXJjZS5yb3VnaG5lc3M7XG5cdHRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzcztcblxuXHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0dGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDtcblx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0dGhpcy5yb3VnaG5lc3NNYXAgPSBzb3VyY2Uucm91Z2huZXNzTWFwO1xuXG5cdHRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDtcblxuXHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdHRoaXMuZW52TWFwID0gc291cmNlLmVudk1hcDtcblx0dGhpcy5lbnZNYXBJbnRlbnNpdHkgPSBzb3VyY2UuZW52TWFwSW50ZW5zaXR5O1xuXG5cdHRoaXMucmVmcmFjdGlvblJhdGlvID0gc291cmNlLnJlZnJhY3Rpb25SYXRpbztcblxuXHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7XG5cdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcblxuXHR0aGlzLnZlcnRleFRhbmdlbnRzID0gc291cmNlLnZlcnRleFRhbmdlbnRzO1xuXG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vKipcbiAqIHBhcmFtZXRlcnMgPSB7XG4gKiAgY2xlYXJjb2F0OiA8ZmxvYXQ+LFxuICogIGNsZWFyY29hdE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBjbGVhcmNvYXRSb3VnaG5lc3M6IDxmbG9hdD4sXG4gKiAgY2xlYXJjb2F0Um91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGNsZWFyY29hdE5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKiAgY2xlYXJjb2F0Tm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgaW9yOiA8ZmxvYXQ+LFxuICpcbiAqICBzaGVlbjogPENvbG9yPixcbiAqXG4gKiAgdHJhbnNtaXNzaW9uOiA8ZmxvYXQ+LFxuICogIHRyYW5zbWlzc2lvbk1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKVxuICogfVxuICovXG5cbmZ1bmN0aW9uIE1lc2hQaHlzaWNhbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTtcblxuXHR0aGlzLmRlZmluZXMgPSB7XG5cblx0XHQnU1RBTkRBUkQnOiAnJyxcblx0XHQnUEhZU0lDQUwnOiAnJ1xuXG5cdH07XG5cblx0dGhpcy50eXBlID0gJ01lc2hQaHlzaWNhbE1hdGVyaWFsJztcblxuXHR0aGlzLmNsZWFyY29hdCA9IDAuMDtcblx0dGhpcy5jbGVhcmNvYXRNYXAgPSBudWxsO1xuXHR0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IDAuMDtcblx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBudWxsO1xuXHR0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblx0dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBudWxsO1xuXG5cdHRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNFxuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lvcicsIHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0cmV0dXJuICggMSArIDAuNCAqIHRoaXMucmVmbGVjdGl2aXR5ICkgLyAoIDEgLSAwLjQgKiB0aGlzLnJlZmxlY3Rpdml0eSApO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggaW9yICkge1xuXG5cdFx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IE1hdGhVdGlscy5jbGFtcCggMi41ICogKCBpb3IgLSAxICkgLyAoIGlvciArIDEgKSwgMCwgMSApO1xuXG5cdFx0fVxuXHR9ICk7XG5cblx0dGhpcy5zaGVlbiA9IG51bGw7IC8vIG51bGwgd2lsbCBkaXNhYmxlIHNoZWVuIGJzZGZcblxuXHR0aGlzLnRyYW5zbWlzc2lvbiA9IDAuMDtcblx0dGhpcy50cmFuc21pc3Npb25NYXAgPSBudWxsO1xuXG5cdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cbn1cblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7XG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDtcblxuTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgPSB0cnVlO1xuXG5NZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdHRoaXMuZGVmaW5lcyA9IHtcblxuXHRcdCdTVEFOREFSRCc6ICcnLFxuXHRcdCdQSFlTSUNBTCc6ICcnXG5cblx0fTtcblxuXHR0aGlzLmNsZWFyY29hdCA9IHNvdXJjZS5jbGVhcmNvYXQ7XG5cdHRoaXMuY2xlYXJjb2F0TWFwID0gc291cmNlLmNsZWFyY29hdE1hcDtcblx0dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MgPSBzb3VyY2UuY2xlYXJjb2F0Um91Z2huZXNzO1xuXHR0aGlzLmNsZWFyY29hdFJvdWdobmVzc01hcCA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3NNYXA7XG5cdHRoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwID0gc291cmNlLmNsZWFyY29hdE5vcm1hbE1hcDtcblx0dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZS5jb3B5KCBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTtcblxuXHR0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7XG5cblx0aWYgKCBzb3VyY2Uuc2hlZW4gKSB7XG5cblx0XHR0aGlzLnNoZWVuID0gKCB0aGlzLnNoZWVuIHx8IG5ldyBDb2xvcigpICkuY29weSggc291cmNlLnNoZWVuICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdHRoaXMuc2hlZW4gPSBudWxsO1xuXG5cdH1cblxuXHR0aGlzLnRyYW5zbWlzc2lvbiA9IHNvdXJjZS50cmFuc21pc3Npb247XG5cdHRoaXMudHJhbnNtaXNzaW9uTWFwID0gc291cmNlLnRyYW5zbWlzc2lvbk1hcDtcblxuXHRyZXR1cm4gdGhpcztcblxufTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBzcGVjdWxhcjogPGhleD4sXG4gKiAgc2hpbmluZXNzOiA8ZmxvYXQ+LFxuICogIG9wYWNpdHk6IDxmbG9hdD4sXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgbGlnaHRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbGlnaHRNYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgYW9NYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYW9NYXBJbnRlbnNpdHk6IDxmbG9hdD5cbiAqXG4gKiAgZW1pc3NpdmU6IDxoZXg+LFxuICogIGVtaXNzaXZlSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKiAgZW1pc3NpdmVNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LFxuICpcbiAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgbm9ybWFsTWFwVHlwZTogVEhSRUUuVGFuZ2VudFNwYWNlTm9ybWFsTWFwLFxuICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sXG4gKlxuICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PixcbiAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseU9wZXJhdGlvbixcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4sXG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoUGhvbmdNYXRlcmlhbCBleHRlbmRzIE1hdGVyaWFsIHtcblxuXHRjb25zdHJ1Y3RvciggcGFyYW1ldGVycyApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTWVzaFBob25nTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXHRcdHRoaXMuc3BlY3VsYXIgPSBuZXcgQ29sb3IoIDB4MTExMTExICk7XG5cdFx0dGhpcy5zaGluaW5lc3MgPSAzMDtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLnNwZWN1bGFyTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuYWxwaGFNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBudWxsO1xuXHRcdHRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gMTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IGZhbHNlO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gMTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSAncm91bmQnO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSAncm91bmQnO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTtcblxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTtcblx0XHR0aGlzLnNwZWN1bGFyLmNvcHkoIHNvdXJjZS5zcGVjdWxhciApO1xuXHRcdHRoaXMuc2hpbmluZXNzID0gc291cmNlLnNoaW5pbmVzcztcblxuXHRcdHRoaXMubWFwID0gc291cmNlLm1hcDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7XG5cdFx0dGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdHRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7XG5cdFx0dGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTtcblxuXHRcdHRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7XG5cdFx0dGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5O1xuXG5cdFx0dGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7XG5cdFx0dGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlO1xuXG5cdFx0dGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHR0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbk1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hQaG9uZ01hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqXG4gKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PlxuICpcbiAqICBlbWlzc2l2ZTogPGhleD4sXG4gKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD5cbiAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoVG9vbk1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9O1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hUb29uTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblx0XHR0aGlzLmdyYWRpZW50TWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7XG5cblx0XHR0aGlzLnNraW5uaW5nID0gZmFsc2U7XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlO1xuXG5cdFx0dGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXG5cdFx0dGhpcy5tYXAgPSBzb3VyY2UubWFwO1xuXHRcdHRoaXMuZ3JhZGllbnRNYXAgPSBzb3VyY2UuZ3JhZGllbnRNYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVjYXAgPSBzb3VyY2Uud2lyZWZyYW1lTGluZWNhcDtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gc291cmNlLndpcmVmcmFtZUxpbmVqb2luO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbk1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGJ1bXBTY2FsZTogPGZsb2F0PixcbiAqXG4gKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCxcbiAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LFxuICpcbiAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sXG4gKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PixcbiAqXG4gKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sXG4gKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+XG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD4sXG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTm9ybWFsTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ01lc2hOb3JtYWxNYXRlcmlhbCc7XG5cblx0XHR0aGlzLmJ1bXBNYXAgPSBudWxsO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gMTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gbnVsbDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBUYW5nZW50U3BhY2VOb3JtYWxNYXA7XG5cdFx0dGhpcy5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cblx0XHR0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDtcblxuXHRcdHRoaXMud2lyZWZyYW1lID0gZmFsc2U7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxO1xuXG5cdFx0dGhpcy5mb2cgPSBmYWxzZTtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwO1xuXHRcdHRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTtcblxuXHRcdHRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDtcblx0XHR0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTtcblx0XHR0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7XG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXG5cdFx0dGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZztcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7XG5cdFx0dGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzO1xuXG5cdFx0dGhpcy5mbGF0U2hhZGluZyA9IHNvdXJjZS5mbGF0U2hhZGluZztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5NZXNoTm9ybWFsTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaE5vcm1hbE1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+XG4gKlxuICogIGVtaXNzaXZlOiA8aGV4PixcbiAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PlxuICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSxcbiAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSxcbiAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sXG4gKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LFxuICpcbiAqICB3aXJlZnJhbWU6IDxib29sZWFuPixcbiAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sXG4gKlxuICogIHNraW5uaW5nOiA8Ym9vbD4sXG4gKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sXG4gKiAgbW9ycGhOb3JtYWxzOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTGFtYmVydE1hdGVyaWFsIGV4dGVuZHMgTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2VcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblxuXHRcdHRoaXMubGlnaHRNYXAgPSBudWxsO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7XG5cblx0XHR0aGlzLmFvTWFwID0gbnVsbDtcblx0XHR0aGlzLmFvTWFwSW50ZW5zaXR5ID0gMS4wO1xuXG5cdFx0dGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciggMHgwMDAwMDAgKTtcblx0XHR0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IG51bGw7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuZW52TWFwID0gbnVsbDtcblx0XHR0aGlzLmNvbWJpbmUgPSBNdWx0aXBseU9wZXJhdGlvbjtcblx0XHR0aGlzLnJlZmxlY3Rpdml0eSA9IDE7XG5cdFx0dGhpcy5yZWZyYWN0aW9uUmF0aW8gPSAwLjk4O1xuXG5cdFx0dGhpcy53aXJlZnJhbWUgPSBmYWxzZTtcblx0XHR0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJztcblx0XHR0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJztcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwO1xuXHRcdHRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwO1xuXHRcdHRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7XG5cblx0XHR0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApO1xuXHRcdHRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7XG5cdFx0dGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTtcblxuXHRcdHRoaXMuc3BlY3VsYXJNYXAgPSBzb3VyY2Uuc3BlY3VsYXJNYXA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gc291cmNlLmFscGhhTWFwO1xuXG5cdFx0dGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwO1xuXHRcdHRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lO1xuXHRcdHRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTtcblx0XHR0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87XG5cblx0XHR0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7XG5cdFx0dGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwO1xuXHRcdHRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47XG5cblx0XHR0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nO1xuXHRcdHRoaXMubW9ycGhUYXJnZXRzID0gc291cmNlLm1vcnBoVGFyZ2V0cztcblx0XHR0aGlzLm1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTtcblxuLyoqXG4gKiBwYXJhbWV0ZXJzID0ge1xuICogIGNvbG9yOiA8aGV4PixcbiAqICBvcGFjaXR5OiA8ZmxvYXQ+LFxuICpcbiAqICBtYXRjYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksXG4gKlxuICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqXG4gKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBidW1wU2NhbGU6IDxmbG9hdD4sXG4gKlxuICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSxcbiAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsXG4gKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPixcbiAqXG4gKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LFxuICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sXG4gKlxuICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLFxuICpcbiAqICBza2lubmluZzogPGJvb2w+LFxuICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LFxuICogIG1vcnBoTm9ybWFsczogPGJvb2w+XG4gKlxuICogIGZsYXRTaGFkaW5nOiA8Ym9vbD5cbiAqIH1cbiAqL1xuXG5jbGFzcyBNZXNoTWF0Y2FwTWF0ZXJpYWwgZXh0ZW5kcyBNYXRlcmlhbCB7XG5cblx0Y29uc3RydWN0b3IoIHBhcmFtZXRlcnMgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcblxuXHRcdHRoaXMudHlwZSA9ICdNZXNoTWF0Y2FwTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZVxuXG5cdFx0dGhpcy5tYXRjYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5tYXAgPSBudWxsO1xuXG5cdFx0dGhpcy5idW1wTWFwID0gbnVsbDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IDE7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IG51bGw7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwO1xuXHRcdHRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApO1xuXG5cdFx0dGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7XG5cblx0XHR0aGlzLmFscGhhTWFwID0gbnVsbDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7XG5cblx0XHR0aGlzLmZsYXRTaGFkaW5nID0gZmFsc2U7XG5cblx0XHR0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApO1xuXG5cdH1cblxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kZWZpbmVzID0geyAnTUFUQ0FQJzogJycgfTtcblxuXHRcdHRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7XG5cblx0XHR0aGlzLm1hdGNhcCA9IHNvdXJjZS5tYXRjYXA7XG5cblx0XHR0aGlzLm1hcCA9IHNvdXJjZS5tYXA7XG5cblx0XHR0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDtcblx0XHR0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7XG5cblx0XHR0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7XG5cdFx0dGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7XG5cdFx0dGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTtcblxuXHRcdHRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDtcblx0XHR0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlO1xuXHRcdHRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzO1xuXG5cdFx0dGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDtcblxuXHRcdHRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7XG5cdFx0dGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzO1xuXHRcdHRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFscztcblxuXHRcdHRoaXMuZmxhdFNoYWRpbmcgPSBzb3VyY2UuZmxhdFNoYWRpbmc7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuTWVzaE1hdGNhcE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbCA9IHRydWU7XG5cbi8qKlxuICogcGFyYW1ldGVycyA9IHtcbiAqICBjb2xvcjogPGhleD4sXG4gKiAgb3BhY2l0eTogPGZsb2F0PixcbiAqXG4gKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LFxuICpcbiAqICBzY2FsZTogPGZsb2F0PixcbiAqICBkYXNoU2l6ZTogPGZsb2F0PixcbiAqICBnYXBTaXplOiA8ZmxvYXQ+XG4gKiB9XG4gKi9cblxuY2xhc3MgTGluZURhc2hlZE1hdGVyaWFsIGV4dGVuZHMgTGluZUJhc2ljTWF0ZXJpYWwge1xuXG5cdGNvbnN0cnVjdG9yKCBwYXJhbWV0ZXJzICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdMaW5lRGFzaGVkTWF0ZXJpYWwnO1xuXG5cdFx0dGhpcy5zY2FsZSA9IDE7XG5cdFx0dGhpcy5kYXNoU2l6ZSA9IDM7XG5cdFx0dGhpcy5nYXBTaXplID0gMTtcblxuXHRcdHRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5zY2FsZSA9IHNvdXJjZS5zY2FsZTtcblx0XHR0aGlzLmRhc2hTaXplID0gc291cmNlLmRhc2hTaXplO1xuXHRcdHRoaXMuZ2FwU2l6ZSA9IHNvdXJjZS5nYXBTaXplO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkxpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuaXNMaW5lRGFzaGVkTWF0ZXJpYWwgPSB0cnVlO1xuXG52YXIgTWF0ZXJpYWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoe1xuXHRfX3Byb3RvX186IG51bGwsXG5cdFNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCxcblx0U3ByaXRlTWF0ZXJpYWw6IFNwcml0ZU1hdGVyaWFsLFxuXHRSYXdTaGFkZXJNYXRlcmlhbDogUmF3U2hhZGVyTWF0ZXJpYWwsXG5cdFNoYWRlck1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbCxcblx0UG9pbnRzTWF0ZXJpYWw6IFBvaW50c01hdGVyaWFsLFxuXHRNZXNoUGh5c2ljYWxNYXRlcmlhbDogTWVzaFBoeXNpY2FsTWF0ZXJpYWwsXG5cdE1lc2hTdGFuZGFyZE1hdGVyaWFsOiBNZXNoU3RhbmRhcmRNYXRlcmlhbCxcblx0TWVzaFBob25nTWF0ZXJpYWw6IE1lc2hQaG9uZ01hdGVyaWFsLFxuXHRNZXNoVG9vbk1hdGVyaWFsOiBNZXNoVG9vbk1hdGVyaWFsLFxuXHRNZXNoTm9ybWFsTWF0ZXJpYWw6IE1lc2hOb3JtYWxNYXRlcmlhbCxcblx0TWVzaExhbWJlcnRNYXRlcmlhbDogTWVzaExhbWJlcnRNYXRlcmlhbCxcblx0TWVzaERlcHRoTWF0ZXJpYWw6IE1lc2hEZXB0aE1hdGVyaWFsLFxuXHRNZXNoRGlzdGFuY2VNYXRlcmlhbDogTWVzaERpc3RhbmNlTWF0ZXJpYWwsXG5cdE1lc2hCYXNpY01hdGVyaWFsOiBNZXNoQmFzaWNNYXRlcmlhbCxcblx0TWVzaE1hdGNhcE1hdGVyaWFsOiBNZXNoTWF0Y2FwTWF0ZXJpYWwsXG5cdExpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLFxuXHRMaW5lQmFzaWNNYXRlcmlhbDogTGluZUJhc2ljTWF0ZXJpYWwsXG5cdE1hdGVyaWFsOiBNYXRlcmlhbFxufSk7XG5cbmNvbnN0IEFuaW1hdGlvblV0aWxzID0ge1xuXG5cdC8vIHNhbWUgYXMgQXJyYXkucHJvdG90eXBlLnNsaWNlLCBidXQgYWxzbyB3b3JrcyBvbiB0eXBlZCBhcnJheXNcblx0YXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7XG5cblx0XHRpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggYXJyYXkgKSApIHtcblxuXHRcdFx0Ly8gaW4gaW9zOSBhcnJheS5zdWJhcnJheShmcm9tLCB1bmRlZmluZWQpIHdpbGwgcmV0dXJuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBidXQgYXJyYXkuc3ViYXJyYXkoZnJvbSkgb3IgYXJyYXkuc3ViYXJyYXkoZnJvbSwgbGVuKSBpcyBjb3JyZWN0XG5cdFx0XHRyZXR1cm4gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBhcnJheS5zdWJhcnJheSggZnJvbSwgdG8gIT09IHVuZGVmaW5lZCA/IHRvIDogYXJyYXkubGVuZ3RoICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBhcnJheS5zbGljZSggZnJvbSwgdG8gKTtcblxuXHR9LFxuXG5cdC8vIGNvbnZlcnRzIGFuIGFycmF5IHRvIGEgc3BlY2lmaWMgdHlwZVxuXHRjb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xvbmUgKSB7XG5cblx0XHRpZiAoICEgYXJyYXkgfHwgLy8gbGV0ICd1bmRlZmluZWQnIGFuZCAnbnVsbCcgcGFzc1xuXHRcdFx0ISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgdHlwZSggYXJyYXkgKTsgLy8gY3JlYXRlIHR5cGVkIGFycmF5XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFycmF5ICk7IC8vIGNyZWF0ZSBBcnJheVxuXG5cdH0sXG5cblx0aXNUeXBlZEFycmF5OiBmdW5jdGlvbiAoIG9iamVjdCApIHtcblxuXHRcdHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoIG9iamVjdCApICYmXG5cdFx0XHQhICggb2JqZWN0IGluc3RhbmNlb2YgRGF0YVZpZXcgKTtcblxuXHR9LFxuXG5cdC8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkXG5cdGdldEtleWZyYW1lT3JkZXI6IGZ1bmN0aW9uICggdGltZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBjb21wYXJlVGltZSggaSwgaiApIHtcblxuXHRcdFx0cmV0dXJuIHRpbWVzWyBpIF0gLSB0aW1lc1sgaiBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgbiA9IHRpbWVzLmxlbmd0aDtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkoIG4gKTtcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG47ICsrIGkgKSByZXN1bHRbIGkgXSA9IGk7XG5cblx0XHRyZXN1bHQuc29ydCggY29tcGFyZVRpbWUgKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fSxcblxuXHQvLyB1c2VzIHRoZSBhcnJheSBwcmV2aW91c2x5IHJldHVybmVkIGJ5ICdnZXRLZXlmcmFtZU9yZGVyJyB0byBzb3J0IGRhdGFcblx0c29ydGVkQXJyYXk6IGZ1bmN0aW9uICggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkge1xuXG5cdFx0Y29uc3QgblZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9LFxuXG5cdC8vIGZ1bmN0aW9uIGZvciBwYXJzaW5nIEFPUyBrZXlmcmFtZSBmb3JtYXRzXG5cdGZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHtcblxuXHRcdGxldCBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTtcblxuXHRcdHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRsZXQgdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07XG5cdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhXG5cblx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cblx0XHRcdGRvIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHR0aW1lcy5wdXNoKCBrZXkudGltZSApO1xuXHRcdFx0XHRcdHZhbHVlcy5wdXNoLmFwcGx5KCB2YWx1ZXMsIHZhbHVlICk7IC8vIHB1c2ggYWxsIGVsZW1lbnRzXG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyAuLi5hc3N1bWUgVEhSRUUuTWF0aC1pc2hcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWUudG9BcnJheSggdmFsdWVzLCB2YWx1ZXMubGVuZ3RoICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gb3RoZXJ3aXNlIHB1c2ggYXMtaXNcblxuXHRcdFx0ZG8ge1xuXG5cdFx0XHRcdHZhbHVlID0ga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdHRpbWVzLnB1c2goIGtleS50aW1lICk7XG5cdFx0XHRcdFx0dmFsdWVzLnB1c2goIHZhbHVlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGtleSA9IGpzb25LZXlzWyBpICsrIF07XG5cblx0XHRcdH0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0c3ViY2xpcDogZnVuY3Rpb24gKCBzb3VyY2VDbGlwLCBuYW1lLCBzdGFydEZyYW1lLCBlbmRGcmFtZSwgZnBzID0gMzAgKSB7XG5cblx0XHRjb25zdCBjbGlwID0gc291cmNlQ2xpcC5jbG9uZSgpO1xuXG5cdFx0Y2xpcC5uYW1lID0gbmFtZTtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgY2xpcC50cmFja3MubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCB0cmFjayA9IGNsaXAudHJhY2tzWyBpIF07XG5cdFx0XHRjb25zdCB2YWx1ZVNpemUgPSB0cmFjay5nZXRWYWx1ZVNpemUoKTtcblxuXHRcdFx0Y29uc3QgdGltZXMgPSBbXTtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDA7IGogPCB0cmFjay50aW1lcy5sZW5ndGg7ICsrIGogKSB7XG5cblx0XHRcdFx0Y29uc3QgZnJhbWUgPSB0cmFjay50aW1lc1sgaiBdICogZnBzO1xuXG5cdFx0XHRcdGlmICggZnJhbWUgPCBzdGFydEZyYW1lIHx8IGZyYW1lID49IGVuZEZyYW1lICkgY29udGludWU7XG5cblx0XHRcdFx0dGltZXMucHVzaCggdHJhY2sudGltZXNbIGogXSApO1xuXG5cdFx0XHRcdGZvciAoIGxldCBrID0gMDsgayA8IHZhbHVlU2l6ZTsgKysgayApIHtcblxuXHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB0cmFjay52YWx1ZXNbIGogKiB2YWx1ZVNpemUgKyBrIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0aW1lcy5sZW5ndGggPT09IDAgKSBjb250aW51ZTtcblxuXHRcdFx0dHJhY2sudGltZXMgPSBBbmltYXRpb25VdGlscy5jb252ZXJ0QXJyYXkoIHRpbWVzLCB0cmFjay50aW1lcy5jb25zdHJ1Y3RvciApO1xuXHRcdFx0dHJhY2sudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRyYWNrLnZhbHVlcy5jb25zdHJ1Y3RvciApO1xuXG5cdFx0XHR0cmFja3MucHVzaCggdHJhY2sgKTtcblxuXHRcdH1cblxuXHRcdGNsaXAudHJhY2tzID0gdHJhY2tzO1xuXG5cdFx0Ly8gZmluZCBtaW5pbXVtIC50aW1lcyB2YWx1ZSBhY3Jvc3MgYWxsIHRyYWNrcyBpbiB0aGUgdHJpbW1lZCBjbGlwXG5cblx0XHRsZXQgbWluU3RhcnRUaW1lID0gSW5maW5pdHk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGlmICggbWluU3RhcnRUaW1lID4gY2xpcC50cmFja3NbIGkgXS50aW1lc1sgMCBdICkge1xuXG5cdFx0XHRcdG1pblN0YXJ0VGltZSA9IGNsaXAudHJhY2tzWyBpIF0udGltZXNbIDAgXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2hpZnQgYWxsIHRyYWNrcyBzdWNoIHRoYXQgY2xpcCBiZWdpbnMgYXQgdD0wXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjbGlwLnRyYWNrcy5sZW5ndGg7ICsrIGkgKSB7XG5cblx0XHRcdGNsaXAudHJhY2tzWyBpIF0uc2hpZnQoIC0gMSAqIG1pblN0YXJ0VGltZSApO1xuXG5cdFx0fVxuXG5cdFx0Y2xpcC5yZXNldER1cmF0aW9uKCk7XG5cblx0XHRyZXR1cm4gY2xpcDtcblxuXHR9LFxuXG5cdG1ha2VDbGlwQWRkaXRpdmU6IGZ1bmN0aW9uICggdGFyZ2V0Q2xpcCwgcmVmZXJlbmNlRnJhbWUgPSAwLCByZWZlcmVuY2VDbGlwID0gdGFyZ2V0Q2xpcCwgZnBzID0gMzAgKSB7XG5cblx0XHRpZiAoIGZwcyA8PSAwICkgZnBzID0gMzA7XG5cblx0XHRjb25zdCBudW1UcmFja3MgPSByZWZlcmVuY2VDbGlwLnRyYWNrcy5sZW5ndGg7XG5cdFx0Y29uc3QgcmVmZXJlbmNlVGltZSA9IHJlZmVyZW5jZUZyYW1lIC8gZnBzO1xuXG5cdFx0Ly8gTWFrZSBlYWNoIHRyYWNrJ3MgdmFsdWVzIHJlbGF0aXZlIHRvIHRoZSB2YWx1ZXMgYXQgdGhlIHJlZmVyZW5jZSBmcmFtZVxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IG51bVRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2sgPSByZWZlcmVuY2VDbGlwLnRyYWNrc1sgaSBdO1xuXHRcdFx0Y29uc3QgcmVmZXJlbmNlVHJhY2tUeXBlID0gcmVmZXJlbmNlVHJhY2suVmFsdWVUeXBlTmFtZTtcblxuXHRcdFx0Ly8gU2tpcCB0aGlzIHRyYWNrIGlmIGl0J3Mgbm9uLW51bWVyaWNcblx0XHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnYm9vbCcgfHwgcmVmZXJlbmNlVHJhY2tUeXBlID09PSAnc3RyaW5nJyApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBGaW5kIHRoZSB0cmFjayBpbiB0aGUgdGFyZ2V0IGNsaXAgd2hvc2UgbmFtZSBhbmQgdHlwZSBtYXRjaGVzIHRoZSByZWZlcmVuY2UgdHJhY2tcblx0XHRcdGNvbnN0IHRhcmdldFRyYWNrID0gdGFyZ2V0Q2xpcC50cmFja3MuZmluZCggZnVuY3Rpb24gKCB0cmFjayApIHtcblxuXHRcdFx0XHRyZXR1cm4gdHJhY2submFtZSA9PT0gcmVmZXJlbmNlVHJhY2submFtZVxuXHRcdFx0XHRcdCYmIHRyYWNrLlZhbHVlVHlwZU5hbWUgPT09IHJlZmVyZW5jZVRyYWNrVHlwZTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIHRhcmdldFRyYWNrID09PSB1bmRlZmluZWQgKSBjb250aW51ZTtcblxuXHRcdFx0bGV0IHJlZmVyZW5jZU9mZnNldCA9IDA7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VWYWx1ZVNpemUgPSByZWZlcmVuY2VUcmFjay5nZXRWYWx1ZVNpemUoKTtcblxuXHRcdFx0aWYgKCByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudC5pc0ludGVycG9sYW50RmFjdG9yeU1ldGhvZEdMVEZDdWJpY1NwbGluZSApIHtcblxuXHRcdFx0XHRyZWZlcmVuY2VPZmZzZXQgPSByZWZlcmVuY2VWYWx1ZVNpemUgLyAzO1xuXG5cdFx0XHR9XG5cblx0XHRcdGxldCB0YXJnZXRPZmZzZXQgPSAwO1xuXHRcdFx0Y29uc3QgdGFyZ2V0VmFsdWVTaXplID0gdGFyZ2V0VHJhY2suZ2V0VmFsdWVTaXplKCk7XG5cblx0XHRcdGlmICggdGFyZ2V0VHJhY2suY3JlYXRlSW50ZXJwb2xhbnQuaXNJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RHTFRGQ3ViaWNTcGxpbmUgKSB7XG5cblx0XHRcdFx0dGFyZ2V0T2Zmc2V0ID0gdGFyZ2V0VmFsdWVTaXplIC8gMztcblxuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBsYXN0SW5kZXggPSByZWZlcmVuY2VUcmFjay50aW1lcy5sZW5ndGggLSAxO1xuXHRcdFx0bGV0IHJlZmVyZW5jZVZhbHVlO1xuXG5cdFx0XHQvLyBGaW5kIHRoZSB2YWx1ZSB0byBzdWJ0cmFjdCBvdXQgb2YgdGhlIHRyYWNrXG5cdFx0XHRpZiAoIHJlZmVyZW5jZVRpbWUgPD0gcmVmZXJlbmNlVHJhY2sudGltZXNbIDAgXSApIHtcblxuXHRcdFx0XHQvLyBSZWZlcmVuY2UgZnJhbWUgaXMgZWFybGllciB0aGFuIHRoZSBmaXJzdCBrZXlmcmFtZSwgc28ganVzdCB1c2UgdGhlIGZpcnN0IGtleWZyYW1lXG5cdFx0XHRcdGNvbnN0IHN0YXJ0SW5kZXggPSByZWZlcmVuY2VPZmZzZXQ7XG5cdFx0XHRcdGNvbnN0IGVuZEluZGV4ID0gcmVmZXJlbmNlVmFsdWVTaXplIC0gcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRyZWZlcmVuY2VWYWx1ZSA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHJlZmVyZW5jZVRyYWNrLnZhbHVlcywgc3RhcnRJbmRleCwgZW5kSW5kZXggKTtcblxuXHRcdFx0fSBlbHNlIGlmICggcmVmZXJlbmNlVGltZSA+PSByZWZlcmVuY2VUcmFjay50aW1lc1sgbGFzdEluZGV4IF0gKSB7XG5cblx0XHRcdFx0Ly8gUmVmZXJlbmNlIGZyYW1lIGlzIGFmdGVyIHRoZSBsYXN0IGtleWZyYW1lLCBzbyBqdXN0IHVzZSB0aGUgbGFzdCBrZXlmcmFtZVxuXHRcdFx0XHRjb25zdCBzdGFydEluZGV4ID0gbGFzdEluZGV4ICogcmVmZXJlbmNlVmFsdWVTaXplICsgcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggKyByZWZlcmVuY2VWYWx1ZVNpemUgLSByZWZlcmVuY2VPZmZzZXQ7XG5cdFx0XHRcdHJlZmVyZW5jZVZhbHVlID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggcmVmZXJlbmNlVHJhY2sudmFsdWVzLCBzdGFydEluZGV4LCBlbmRJbmRleCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEludGVycG9sYXRlIHRvIHRoZSByZWZlcmVuY2UgdmFsdWVcblx0XHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSByZWZlcmVuY2VUcmFjay5jcmVhdGVJbnRlcnBvbGFudCgpO1xuXHRcdFx0XHRjb25zdCBzdGFydEluZGV4ID0gcmVmZXJlbmNlT2Zmc2V0O1xuXHRcdFx0XHRjb25zdCBlbmRJbmRleCA9IHJlZmVyZW5jZVZhbHVlU2l6ZSAtIHJlZmVyZW5jZU9mZnNldDtcblx0XHRcdFx0aW50ZXJwb2xhbnQuZXZhbHVhdGUoIHJlZmVyZW5jZVRpbWUgKTtcblx0XHRcdFx0cmVmZXJlbmNlVmFsdWUgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCBpbnRlcnBvbGFudC5yZXN1bHRCdWZmZXIsIHN0YXJ0SW5kZXgsIGVuZEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29uanVnYXRlIHRoZSBxdWF0ZXJuaW9uXG5cdFx0XHRpZiAoIHJlZmVyZW5jZVRyYWNrVHlwZSA9PT0gJ3F1YXRlcm5pb24nICkge1xuXG5cdFx0XHRcdGNvbnN0IHJlZmVyZW5jZVF1YXQgPSBuZXcgUXVhdGVybmlvbigpLmZyb21BcnJheSggcmVmZXJlbmNlVmFsdWUgKS5ub3JtYWxpemUoKS5jb25qdWdhdGUoKTtcblx0XHRcdFx0cmVmZXJlbmNlUXVhdC50b0FycmF5KCByZWZlcmVuY2VWYWx1ZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1YnRyYWN0IHRoZSByZWZlcmVuY2UgdmFsdWUgZnJvbSBhbGwgb2YgdGhlIHRyYWNrIHZhbHVlc1xuXG5cdFx0XHRjb25zdCBudW1UaW1lcyA9IHRhcmdldFRyYWNrLnRpbWVzLmxlbmd0aDtcblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IG51bVRpbWVzOyArKyBqICkge1xuXG5cdFx0XHRcdGNvbnN0IHZhbHVlU3RhcnQgPSBqICogdGFyZ2V0VmFsdWVTaXplICsgdGFyZ2V0T2Zmc2V0O1xuXG5cdFx0XHRcdGlmICggcmVmZXJlbmNlVHJhY2tUeXBlID09PSAncXVhdGVybmlvbicgKSB7XG5cblx0XHRcdFx0XHQvLyBNdWx0aXBseSB0aGUgY29uanVnYXRlIGZvciBxdWF0ZXJuaW9uIHRyYWNrIHR5cGVzXG5cdFx0XHRcdFx0UXVhdGVybmlvbi5tdWx0aXBseVF1YXRlcm5pb25zRmxhdChcblx0XHRcdFx0XHRcdHRhcmdldFRyYWNrLnZhbHVlcyxcblx0XHRcdFx0XHRcdHZhbHVlU3RhcnQsXG5cdFx0XHRcdFx0XHRyZWZlcmVuY2VWYWx1ZSxcblx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHR0YXJnZXRUcmFjay52YWx1ZXMsXG5cdFx0XHRcdFx0XHR2YWx1ZVN0YXJ0XG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVFbmQgPSB0YXJnZXRWYWx1ZVNpemUgLSB0YXJnZXRPZmZzZXQgKiAyO1xuXG5cdFx0XHRcdFx0Ly8gU3VidHJhY3QgZWFjaCB2YWx1ZSBmb3IgYWxsIG90aGVyIG51bWVyaWMgdHJhY2sgdHlwZXNcblx0XHRcdFx0XHRmb3IgKCBsZXQgayA9IDA7IGsgPCB2YWx1ZUVuZDsgKysgayApIHtcblxuXHRcdFx0XHRcdFx0dGFyZ2V0VHJhY2sudmFsdWVzWyB2YWx1ZVN0YXJ0ICsgayBdIC09IHJlZmVyZW5jZVZhbHVlWyBrIF07XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR0YXJnZXRDbGlwLmJsZW5kTW9kZSA9IEFkZGl0aXZlQW5pbWF0aW9uQmxlbmRNb2RlO1xuXG5cdFx0cmV0dXJuIHRhcmdldENsaXA7XG5cblx0fVxuXG59O1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgaW50ZXJwb2xhbnRzIG92ZXIgcGFyYW1ldHJpYyBzYW1wbGVzLlxuICpcbiAqIFRoZSBwYXJhbWV0ZXIgZG9tYWluIGlzIG9uZSBkaW1lbnNpb25hbCwgdHlwaWNhbGx5IHRoZSB0aW1lIG9yIGEgcGF0aFxuICogYWxvbmcgYSBjdXJ2ZSBkZWZpbmVkIGJ5IHRoZSBkYXRhLlxuICpcbiAqIFRoZSBzYW1wbGUgdmFsdWVzIGNhbiBoYXZlIGFueSBkaW1lbnNpb25hbGl0eSBhbmQgZGVyaXZlZCBjbGFzc2VzIG1heVxuICogYXBwbHkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbnMgdG8gdGhlIGRhdGEuXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW50ZXJ2YWwgc2VlayBpbiBhIFRlbXBsYXRlIE1ldGhvZCwgZGVmZXJyaW5nXG4gKiB0aGUgYWN0dWFsIGludGVycG9sYXRpb24gdG8gZGVyaXZlZCBjbGFzc2VzLlxuICpcbiAqIFRpbWUgY29tcGxleGl0eSBpcyBPKDEpIGZvciBsaW5lYXIgYWNjZXNzIGNyb3NzaW5nIGF0IG1vc3QgdHdvIHBvaW50c1xuICogYW5kIE8obG9nIE4pIGZvciByYW5kb20gYWNjZXNzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgcG9zaXRpb25zLlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKlxuICogXHRcdGh0dHA6Ly93d3cub29kZXNpZ24uY29tL3RlbXBsYXRlLW1ldGhvZC1wYXR0ZXJuLmh0bWxcbiAqXG4gKi9cblxuZnVuY3Rpb24gSW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0dGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMgPSBwYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdHRoaXMuX2NhY2hlZEluZGV4ID0gMDtcblxuXHR0aGlzLnJlc3VsdEJ1ZmZlciA9IHJlc3VsdEJ1ZmZlciAhPT0gdW5kZWZpbmVkID9cblx0XHRyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7XG5cdHRoaXMuc2FtcGxlVmFsdWVzID0gc2FtcGxlVmFsdWVzO1xuXHR0aGlzLnZhbHVlU2l6ZSA9IHNhbXBsZVNpemU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggSW50ZXJwb2xhbnQucHJvdG90eXBlLCB7XG5cblx0ZXZhbHVhdGU6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdFx0bGV0IGkxID0gdGhpcy5fY2FjaGVkSW5kZXgsXG5cdFx0XHR0MSA9IHBwWyBpMSBdLFxuXHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHR2YWxpZGF0ZV9pbnRlcnZhbDoge1xuXG5cdFx0XHRzZWVrOiB7XG5cblx0XHRcdFx0bGV0IHJpZ2h0O1xuXG5cdFx0XHRcdGxpbmVhcl9zY2FuOiB7XG5cblx0XHRcdFx0XHQvLy0gU2VlIGh0dHA6Ly9qc3BlcmYuY29tL2NvbXBhcmlzb24tdG8tdW5kZWZpbmVkLzNcblx0XHRcdFx0XHQvLy0gc2xvd2VyIGNvZGU6XG5cdFx0XHRcdFx0Ly8tXG5cdFx0XHRcdFx0Ly8tIFx0XHRcdFx0aWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0Zm9yd2FyZF9zY2FuOiBpZiAoICEgKCB0IDwgdDEgKSApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkge1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdDEgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGlmICggdCA8IHQwICkgYnJlYWsgZm9yd2FyZF9zY2FuO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYWZ0ZXIgZW5kXG5cblx0XHRcdFx0XHRcdFx0XHRpMSA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MCA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0MSA9IHBwWyArKyBpMSBdO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdCA8IHQxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWxcblx0XHRcdFx0XHRcdFx0XHRicmVhayBzZWVrO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4XG5cdFx0XHRcdFx0XHRyaWdodCA9IHBwLmxlbmd0aDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8tIHNsb3dlciBjb2RlOlxuXHRcdFx0XHRcdC8vLVx0XHRcdFx0XHRpZiAoIHQgPCB0MCB8fCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGlmICggISAoIHQgPj0gdDAgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbG9vcGluZz9cblxuXHRcdFx0XHRcdFx0Y29uc3QgdDFnbG9iYWwgPSBwcFsgMSBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHQgPCB0MWdsb2JhbCApIHtcblxuXHRcdFx0XHRcdFx0XHRpMSA9IDI7IC8vICsgMSwgdXNpbmcgdGhlIHNjYW4gZm9yIHRoZSBkZXRhaWxzXG5cdFx0XHRcdFx0XHRcdHQwID0gdDFnbG9iYWw7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gbGluZWFyIHJldmVyc2Ugc2NhblxuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgZ2l2ZVVwQXQgPSBpMSAtIDI7IDsgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gYmVmb3JlIHN0YXJ0XG5cblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IDA7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRpZiAoIGkxID09PSBnaXZlVXBBdCApIGJyZWFrOyAvLyB0aGlzIGxvb3BcblxuXHRcdFx0XHRcdFx0XHR0MSA9IHQwO1xuXHRcdFx0XHRcdFx0XHR0MCA9IHBwWyAtLSBpMSAtIDEgXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHQgPj0gdDAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbFxuXHRcdFx0XHRcdFx0XHRcdGJyZWFrIHNlZWs7XG5cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleFxuXHRcdFx0XHRcdFx0cmlnaHQgPSBpMTtcblx0XHRcdFx0XHRcdGkxID0gMDtcblx0XHRcdFx0XHRcdGJyZWFrIGxpbmVhcl9zY2FuO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdGhlIGludGVydmFsIGlzIHZhbGlkXG5cblx0XHRcdFx0XHRicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDtcblxuXHRcdFx0XHR9IC8vIGxpbmVhciBzY2FuXG5cblx0XHRcdFx0Ly8gYmluYXJ5IHNlYXJjaFxuXG5cdFx0XHRcdHdoaWxlICggaTEgPCByaWdodCApIHtcblxuXHRcdFx0XHRcdGNvbnN0IG1pZCA9ICggaTEgKyByaWdodCApID4+PiAxO1xuXG5cdFx0XHRcdFx0aWYgKCB0IDwgcHBbIG1pZCBdICkge1xuXG5cdFx0XHRcdFx0XHRyaWdodCA9IG1pZDtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGkxID0gbWlkICsgMTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dDEgPSBwcFsgaTEgXTtcblx0XHRcdFx0dDAgPSBwcFsgaTEgLSAxIF07XG5cblx0XHRcdFx0Ly8gY2hlY2sgYm91bmRhcnkgY2FzZXMsIGFnYWluXG5cblx0XHRcdFx0aWYgKCB0MCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSAwO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0MSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aTEgPSBwcC5sZW5ndGg7XG5cdFx0XHRcdFx0dGhpcy5fY2FjaGVkSW5kZXggPSBpMTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hZnRlckVuZF8oIGkxIC0gMSwgdDAsIHQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0gLy8gc2Vla1xuXG5cdFx0XHR0aGlzLl9jYWNoZWRJbmRleCA9IGkxO1xuXG5cdFx0XHR0aGlzLmludGVydmFsQ2hhbmdlZF8oIGkxLCB0MCwgdDEgKTtcblxuXHRcdH0gLy8gdmFsaWRhdGVfaW50ZXJ2YWxcblxuXHRcdHJldHVybiB0aGlzLmludGVycG9sYXRlXyggaTEsIHQwLCB0LCB0MSApO1xuXG5cdH0sXG5cblx0c2V0dGluZ3M6IG51bGwsIC8vIG9wdGlvbmFsLCBzdWJjbGFzcy1zcGVjaWZpYyBzZXR0aW5ncyBzdHJ1Y3R1cmVcblx0Ly8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuXG5cblx0Ly8gLS0tIFByb3RlY3RlZCBpbnRlcmZhY2VcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7fSxcblxuXHRnZXRTZXR0aW5nc186IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXztcblxuXHR9LFxuXG5cdGNvcHlTYW1wbGVWYWx1ZV86IGZ1bmN0aW9uICggaW5kZXggKSB7XG5cblx0XHQvLyBjb3BpZXMgYSBzYW1wbGUgdmFsdWUgdG8gdGhlIHJlc3VsdCBidWZmZXJcblxuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLFxuXHRcdFx0dmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IGluZGV4ICogc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdHJlc3VsdFsgaSBdID0gdmFsdWVzWyBvZmZzZXQgKyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH0sXG5cblx0Ly8gVGVtcGxhdGUgbWV0aG9kcyBmb3IgZGVyaXZlZCBjbGFzc2VzOlxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCAnY2FsbCB0byBhYnN0cmFjdCBtZXRob2QnICk7XG5cdFx0Ly8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlclxuXG5cdH0sXG5cblx0aW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCAvKiBpMSwgdDAsIHQxICovICkge1xuXG5cdFx0Ly8gZW1wdHlcblxuXHR9XG5cbn0gKTtcblxuLy8gREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlXG5PYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHtcblxuXHQvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRiZWZvcmVTdGFydF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG5cdC8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlclxuXHRhZnRlckVuZF86IEludGVycG9sYW50LnByb3RvdHlwZS5jb3B5U2FtcGxlVmFsdWVfLFxuXG59ICk7XG5cbi8qKlxuICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC5cbiAqXG4gKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlXG4gKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zXG4gKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC5cbiAqL1xuXG5mdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkge1xuXG5cdEludGVycG9sYW50LmNhbGwoIHRoaXMsIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKTtcblxuXHR0aGlzLl93ZWlnaHRQcmV2ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXRQcmV2ID0gLSAwO1xuXHR0aGlzLl93ZWlnaHROZXh0ID0gLSAwO1xuXHR0aGlzLl9vZmZzZXROZXh0ID0gLSAwO1xuXG59XG5cbkN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogQ3ViaWNJbnRlcnBvbGFudCxcblxuXHREZWZhdWx0U2V0dGluZ3NfOiB7XG5cblx0XHRlbmRpbmdTdGFydDogWmVyb0N1cnZhdHVyZUVuZGluZyxcblx0XHRlbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHR9LFxuXG5cdGludGVydmFsQ2hhbmdlZF86IGZ1bmN0aW9uICggaTEsIHQwLCB0MSApIHtcblxuXHRcdGNvbnN0IHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnM7XG5cdFx0bGV0IGlQcmV2ID0gaTEgLSAyLFxuXHRcdFx0aU5leHQgPSBpMSArIDEsXG5cblx0XHRcdHRQcmV2ID0gcHBbIGlQcmV2IF0sXG5cdFx0XHR0TmV4dCA9IHBwWyBpTmV4dCBdO1xuXG5cdFx0aWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzd2l0Y2ggKCB0aGlzLmdldFNldHRpbmdzXygpLmVuZGluZ1N0YXJ0ICkge1xuXG5cdFx0XHRcdGNhc2UgWmVyb1Nsb3BlRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gZicodDApID0gMFxuXHRcdFx0XHRcdGlQcmV2ID0gaTE7XG5cdFx0XHRcdFx0dFByZXYgPSAyICogdDAgLSB0MTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgV3JhcEFyb3VuZEVuZGluZzpcblxuXHRcdFx0XHRcdC8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZVxuXHRcdFx0XHRcdGlQcmV2ID0gcHAubGVuZ3RoIC0gMjtcblx0XHRcdFx0XHR0UHJldiA9IHQwICsgcHBbIGlQcmV2IF0gLSBwcFsgaVByZXYgKyAxIF07XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cblx0XHRcdFx0XHQvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpUHJldiA9IGkxO1xuXHRcdFx0XHRcdHRQcmV2ID0gdDE7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdE5leHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7XG5cblx0XHRcdFx0Y2FzZSBaZXJvU2xvcGVFbmRpbmc6XG5cblx0XHRcdFx0XHQvLyBmJyh0TikgPSAwXG5cdFx0XHRcdFx0aU5leHQgPSBpMTtcblx0XHRcdFx0XHR0TmV4dCA9IDIgKiB0MSAtIHQwO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBXcmFwQXJvdW5kRW5kaW5nOlxuXG5cdFx0XHRcdFx0Ly8gdXNlIHRoZSBvdGhlciBlbmQgb2YgdGhlIGN1cnZlXG5cdFx0XHRcdFx0aU5leHQgPSAxO1xuXHRcdFx0XHRcdHROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGRlZmF1bHQ6IC8vIFplcm9DdXJ2YXR1cmVFbmRpbmdcblxuXHRcdFx0XHRcdC8vIGYnJyh0TikgPSAwLCBhLmsuYS4gTmF0dXJhbCBTcGxpbmVcblx0XHRcdFx0XHRpTmV4dCA9IGkxIC0gMTtcblx0XHRcdFx0XHR0TmV4dCA9IHQwO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplO1xuXG5cdFx0dGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApO1xuXHRcdHRoaXMuX3dlaWdodE5leHQgPSBoYWxmRHQgLyAoIHROZXh0IC0gdDEgKTtcblx0XHR0aGlzLl9vZmZzZXRQcmV2ID0gaVByZXYgKiBzdHJpZGU7XG5cdFx0dGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlO1xuXG5cdH0sXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG8xID0gaTEgKiBzdHJpZGUsXHRcdG8wID0gbzEgLSBzdHJpZGUsXG5cdFx0XHRvUCA9IHRoaXMuX29mZnNldFByZXYsIFx0b04gPSB0aGlzLl9vZmZzZXROZXh0LFxuXHRcdFx0d1AgPSB0aGlzLl93ZWlnaHRQcmV2LFx0d04gPSB0aGlzLl93ZWlnaHROZXh0LFxuXG5cdFx0XHRwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLFxuXHRcdFx0cHAgPSBwICogcCxcblx0XHRcdHBwcCA9IHBwICogcDtcblxuXHRcdC8vIGV2YWx1YXRlIHBvbHlub21pYWxzXG5cblx0XHRjb25zdCBzUCA9IC0gd1AgKiBwcHAgKyAyICogd1AgKiBwcCAtIHdQICogcDtcblx0XHRjb25zdCBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7XG5cdFx0Y29uc3QgczEgPSAoIC0gMSAtIHdOICkgKiBwcHAgKyAoIDEuNSArIHdOICkgKiBwcCArIDAuNSAqIHA7XG5cdFx0Y29uc3Qgc04gPSB3TiAqIHBwcCAtIHdOICogcHA7XG5cblx0XHQvLyBjb21iaW5lIGRhdGEgbGluZWFybHlcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0c1AgKiB2YWx1ZXNbIG9QICsgaSBdICtcblx0XHRcdFx0XHRzMCAqIHZhbHVlc1sgbzAgKyBpIF0gK1xuXHRcdFx0XHRcdHMxICogdmFsdWVzWyBvMSArIGkgXSArXG5cdFx0XHRcdFx0c04gKiB2YWx1ZXNbIG9OICsgaSBdO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cbkxpbmVhckludGVycG9sYW50LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVycG9sYW50LnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IExpbmVhckludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkge1xuXG5cdFx0Y29uc3QgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcyxcblx0XHRcdHN0cmlkZSA9IHRoaXMudmFsdWVTaXplLFxuXG5cdFx0XHRvZmZzZXQxID0gaTEgKiBzdHJpZGUsXG5cdFx0XHRvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0MSA9ICggdCAtIHQwICkgLyAoIHQxIC0gdDAgKSxcblx0XHRcdHdlaWdodDAgPSAxIC0gd2VpZ2h0MTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRyZXN1bHRbIGkgXSA9XG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQwICsgaSBdICogd2VpZ2h0MCArXG5cdFx0XHRcdFx0dmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cblx0fVxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEludGVycG9sYW50IHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBzYW1wbGUgdmFsdWUgYXQgdGhlIHBvc2l0aW9uIHByZWNlZWRpbmdcbiAqIHRoZSBwYXJhbWV0ZXIuXG4gKi9cblxuZnVuY3Rpb24gRGlzY3JldGVJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHtcblxuXHRJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7XG5cbn1cblxuRGlzY3JldGVJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBEaXNjcmV0ZUludGVycG9sYW50LFxuXG5cdGludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIEtleWZyYW1lVHJhY2sge1xuXG5cdGNvbnN0cnVjdG9yKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSB0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayBuYW1lIGlzIHVuZGVmaW5lZCcgKTtcblx0XHRpZiAoIHRpbWVzID09PSB1bmRlZmluZWQgfHwgdGltZXMubGVuZ3RoID09PSAwICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogbm8ga2V5ZnJhbWVzIGluIHRyYWNrIG5hbWVkICcgKyBuYW1lICk7XG5cblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXG5cdFx0dGhpcy50aW1lcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdGltZXMsIHRoaXMuVGltZUJ1ZmZlclR5cGUgKTtcblx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdmFsdWVzLCB0aGlzLlZhbHVlQnVmZmVyVHlwZSApO1xuXG5cdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCBpbnRlcnBvbGF0aW9uIHx8IHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24gKTtcblxuXHR9XG5cblx0Ly8gU2VyaWFsaXphdGlvbiAoaW4gc3RhdGljIGNvbnRleHQsIGJlY2F1c2Ugb2YgY29uc3RydWN0b3IgaW52b2NhdGlvblxuXHQvLyBhbmQgYXV0b21hdGljIGludm9jYXRpb24gb2YgLnRvSlNPTik6XG5cblx0c3RhdGljIHRvSlNPTiggdHJhY2sgKSB7XG5cblx0XHRjb25zdCB0cmFja1R5cGUgPSB0cmFjay5jb25zdHJ1Y3RvcjtcblxuXHRcdGxldCBqc29uO1xuXG5cdFx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgdG9KU09OIG1ldGhvZFxuXHRcdGlmICggdHJhY2tUeXBlLnRvSlNPTiAhPT0gdGhpcy50b0pTT04gKSB7XG5cblx0XHRcdGpzb24gPSB0cmFja1R5cGUudG9KU09OKCB0cmFjayApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIHRoZSBkYXRhIGNhbiBiZSBzZXJpYWxpemVkIGFzLWlzXG5cdFx0XHRqc29uID0ge1xuXG5cdFx0XHRcdCduYW1lJzogdHJhY2submFtZSxcblx0XHRcdFx0J3RpbWVzJzogQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0cmFjay50aW1lcywgQXJyYXkgKSxcblx0XHRcdFx0J3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApXG5cblx0XHRcdH07XG5cblx0XHRcdGNvbnN0IGludGVycG9sYXRpb24gPSB0cmFjay5nZXRJbnRlcnBvbGF0aW9uKCk7XG5cblx0XHRcdGlmICggaW50ZXJwb2xhdGlvbiAhPT0gdHJhY2suRGVmYXVsdEludGVycG9sYXRpb24gKSB7XG5cblx0XHRcdFx0anNvbi5pbnRlcnBvbGF0aW9uID0gaW50ZXJwb2xhdGlvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0anNvbi50eXBlID0gdHJhY2suVmFsdWVUeXBlTmFtZTsgLy8gbWFuZGF0b3J5XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGUoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH1cblxuXHRJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIoIHJlc3VsdCApIHtcblxuXHRcdHJldHVybiBuZXcgTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IEN1YmljSW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTtcblxuXHR9XG5cblx0c2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdGxldCBmYWN0b3J5TWV0aG9kO1xuXG5cdFx0c3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHtcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZURpc2NyZXRlOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIEludGVycG9sYXRlTGluZWFyOlxuXG5cdFx0XHRcdGZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBJbnRlcnBvbGF0ZVNtb290aDpcblxuXHRcdFx0XHRmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cblx0XHRpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgbWVzc2FnZSA9ICd1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAnICtcblx0XHRcdFx0dGhpcy5WYWx1ZVR5cGVOYW1lICsgJyBrZXlmcmFtZSB0cmFjayBuYW1lZCAnICsgdGhpcy5uYW1lO1xuXG5cdFx0XHRpZiAoIHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCwgdW5sZXNzIHRoZSBkZWZhdWx0IGl0c2VsZiBpcyBtZXNzZWQgdXBcblx0XHRcdFx0aWYgKCBpbnRlcnBvbGF0aW9uICE9PSB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0dGhpcy5zZXRJbnRlcnBvbGF0aW9uKCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggbWVzc2FnZSApOyAvLyBmYXRhbCwgaW4gdGhpcyBjYXNlXG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLktleWZyYW1lVHJhY2s6JywgbWVzc2FnZSApO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNyZWF0ZUludGVycG9sYW50ID0gZmFjdG9yeU1ldGhvZDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRJbnRlcnBvbGF0aW9uKCkge1xuXG5cdFx0c3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlO1xuXG5cdFx0XHRjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOlxuXG5cdFx0XHRcdHJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjtcblxuXHRcdFx0Y2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDpcblxuXHRcdFx0XHRyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7XG5cblx0XHR9XG5cblx0fVxuXG5cdGdldFZhbHVlU2l6ZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnZhbHVlcy5sZW5ndGggLyB0aGlzLnRpbWVzLmxlbmd0aDtcblxuXHR9XG5cblx0Ly8gbW92ZSBhbGwga2V5ZnJhbWVzIGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMgaW4gdGltZVxuXHRzaGlmdCggdGltZU9mZnNldCApIHtcblxuXHRcdGlmICggdGltZU9mZnNldCAhPT0gMC4wICkge1xuXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHQvLyBzY2FsZSBhbGwga2V5ZnJhbWUgdGltZXMgYnkgYSBmYWN0b3IgKHVzZWZ1bCBmb3IgZnJhbWUgPC0+IHNlY29uZHMgY29udmVyc2lvbnMpXG5cdHNjYWxlKCB0aW1lU2NhbGUgKSB7XG5cblx0XHRpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkge1xuXG5cdFx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXM7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IHRpbWVzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHR0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIHJlbW92ZXMga2V5ZnJhbWVzIGJlZm9yZSBhbmQgYWZ0ZXIgYW5pbWF0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYW55IHZhbHVlcyB3aXRoaW4gdGhlIHJhbmdlIFtzdGFydFRpbWUsIGVuZFRpbWVdLlxuXHQvLyBJTVBPUlRBTlQ6IFdlIGRvIG5vdCBzaGlmdCBhcm91bmQga2V5cyB0byB0aGUgc3RhcnQgb2YgdGhlIHRyYWNrIHRpbWUsIGJlY2F1c2UgZm9yIGludGVycG9sYXRlZCBrZXlzIHRoaXMgd2lsbCBjaGFuZ2UgdGhlaXIgdmFsdWVzXG5cdHRyaW0oIHN0YXJ0VGltZSwgZW5kVGltZSApIHtcblxuXHRcdGNvbnN0IHRpbWVzID0gdGhpcy50aW1lcyxcblx0XHRcdG5LZXlzID0gdGltZXMubGVuZ3RoO1xuXG5cdFx0bGV0IGZyb20gPSAwLFxuXHRcdFx0dG8gPSBuS2V5cyAtIDE7XG5cblx0XHR3aGlsZSAoIGZyb20gIT09IG5LZXlzICYmIHRpbWVzWyBmcm9tIF0gPCBzdGFydFRpbWUgKSB7XG5cblx0XHRcdCsrIGZyb207XG5cblx0XHR9XG5cblx0XHR3aGlsZSAoIHRvICE9PSAtIDEgJiYgdGltZXNbIHRvIF0gPiBlbmRUaW1lICkge1xuXG5cdFx0XHQtLSB0bztcblxuXHRcdH1cblxuXHRcdCsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kXG5cblx0XHRpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkge1xuXG5cdFx0XHQvLyBlbXB0eSB0cmFja3MgYXJlIGZvcmJpZGRlbiwgc28ga2VlcCBhdCBsZWFzdCBvbmUga2V5ZnJhbWVcblx0XHRcdGlmICggZnJvbSA+PSB0byApIHtcblxuXHRcdFx0XHR0byA9IE1hdGgubWF4KCB0bywgMSApO1xuXHRcdFx0XHRmcm9tID0gdG8gLSAxO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHN0cmlkZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7XG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIGZyb20sIHRvICk7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCBmcm9tICogc3RyaWRlLCB0byAqIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIGVuc3VyZSB3ZSBkbyBub3QgZ2V0IGEgR2FyYmFnZUluR2FyYmFnZU91dCBzaXR1YXRpb24sIG1ha2Ugc3VyZSB0cmFja3MgYXJlIGF0IGxlYXN0IG1pbmltYWxseSB2aWFibGVcblx0dmFsaWRhdGUoKSB7XG5cblx0XHRsZXQgdmFsaWQgPSB0cnVlO1xuXG5cdFx0Y29uc3QgdmFsdWVTaXplID0gdGhpcy5nZXRWYWx1ZVNpemUoKTtcblx0XHRpZiAoIHZhbHVlU2l6ZSAtIE1hdGguZmxvb3IoIHZhbHVlU2l6ZSApICE9PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLicsIHRoaXMgKTtcblx0XHRcdHZhbGlkID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRjb25zdCB0aW1lcyA9IHRoaXMudGltZXMsXG5cdFx0XHR2YWx1ZXMgPSB0aGlzLnZhbHVlcyxcblxuXHRcdFx0bktleXMgPSB0aW1lcy5sZW5ndGg7XG5cblx0XHRpZiAoIG5LZXlzID09PSAwICkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApO1xuXHRcdFx0dmFsaWQgPSBmYWxzZTtcblxuXHRcdH1cblxuXHRcdGxldCBwcmV2VGltZSA9IG51bGw7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjdXJyVGltZSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdGlmICggdHlwZW9mIGN1cnJUaW1lID09PSAnbnVtYmVyJyAmJiBpc05hTiggY3VyclRpbWUgKSApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBwcmV2VGltZSAhPT0gbnVsbCAmJiBwcmV2VGltZSA+IGN1cnJUaW1lICkge1xuXG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTtcblx0XHRcdFx0dmFsaWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdFx0cHJldlRpbWUgPSBjdXJyVGltZTtcblxuXHRcdH1cblxuXHRcdGlmICggdmFsdWVzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggQW5pbWF0aW9uVXRpbHMuaXNUeXBlZEFycmF5KCB2YWx1ZXMgKSApIHtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSB2YWx1ZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgdmFsdWUgPSB2YWx1ZXNbIGkgXTtcblxuXHRcdFx0XHRcdGlmICggaXNOYU4oIHZhbHVlICkgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBWYWx1ZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgdmFsdWUgKTtcblx0XHRcdFx0XHRcdHZhbGlkID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB2YWxpZDtcblxuXHR9XG5cblx0Ly8gcmVtb3ZlcyBlcXVpdmFsZW50IHNlcXVlbnRpYWwga2V5cyBhcyBjb21tb24gaW4gbW9ycGggdGFyZ2V0IHNlcXVlbmNlc1xuXHQvLyAoMCwwLDAsMCwxLDEsMSwwLDAsMCwwLDAsMCwwKSAtLT4gKDAsMCwxLDEsMCwwKVxuXHRvcHRpbWl6ZSgpIHtcblxuXHRcdC8vIHRpbWVzIG9yIHZhbHVlcyBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgdHJhY2tzLCBzbyBvdmVyd3JpdGluZyBpcyB1bnNhZmVcblx0XHRjb25zdCB0aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudGltZXMgKSxcblx0XHRcdHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzICksXG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFZhbHVlU2l6ZSgpLFxuXG5cdFx0XHRzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLFxuXG5cdFx0XHRsYXN0SW5kZXggPSB0aW1lcy5sZW5ndGggLSAxO1xuXG5cdFx0bGV0IHdyaXRlSW5kZXggPSAxO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAxOyBpIDwgbGFzdEluZGV4OyArKyBpICkge1xuXG5cdFx0XHRsZXQga2VlcCA9IGZhbHNlO1xuXG5cdFx0XHRjb25zdCB0aW1lID0gdGltZXNbIGkgXTtcblx0XHRcdGNvbnN0IHRpbWVOZXh0ID0gdGltZXNbIGkgKyAxIF07XG5cblx0XHRcdC8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWVcblxuXHRcdFx0aWYgKCB0aW1lICE9PSB0aW1lTmV4dCAmJiAoIGkgIT09IDEgfHwgdGltZSAhPT0gdGltZXNbIDAgXSApICkge1xuXG5cdFx0XHRcdGlmICggISBzbW9vdGhJbnRlcnBvbGF0aW9uICkge1xuXG5cdFx0XHRcdFx0Ly8gcmVtb3ZlIHVubmVjZXNzYXJ5IGtleWZyYW1lcyBzYW1lIGFzIHRoZWlyIG5laWdoYm9yc1xuXG5cdFx0XHRcdFx0Y29uc3Qgb2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdG9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsXG5cdFx0XHRcdFx0XHRvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07XG5cblx0XHRcdFx0XHRcdGlmICggdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0UCArIGogXSB8fFxuXHRcdFx0XHRcdFx0XHR2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXROICsgaiBdICkge1xuXG5cdFx0XHRcdFx0XHRcdGtlZXAgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRrZWVwID0gdHJ1ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0Ly8gaW4tcGxhY2UgY29tcGFjdGlvblxuXG5cdFx0XHRpZiAoIGtlZXAgKSB7XG5cblx0XHRcdFx0aWYgKCBpICE9PSB3cml0ZUluZGV4ICkge1xuXG5cdFx0XHRcdFx0dGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07XG5cblx0XHRcdFx0XHRjb25zdCByZWFkT2Zmc2V0ID0gaSAqIHN0cmlkZSxcblx0XHRcdFx0XHRcdHdyaXRlT2Zmc2V0ID0gd3JpdGVJbmRleCAqIHN0cmlkZTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHR2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHQrKyB3cml0ZUluZGV4O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBmbHVzaCBsYXN0IGtleWZyYW1lIChjb21wYWN0aW9uIGxvb2tzIGFoZWFkKVxuXG5cdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHR0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRmb3IgKCBsZXQgcmVhZE9mZnNldCA9IGxhc3RJbmRleCAqIHN0cmlkZSwgd3JpdGVPZmZzZXQgPSB3cml0ZUluZGV4ICogc3RyaWRlLCBqID0gMDsgaiAhPT0gc3RyaWRlOyArKyBqICkge1xuXG5cdFx0XHRcdHZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07XG5cblx0XHRcdH1cblxuXHRcdFx0Kysgd3JpdGVJbmRleDtcblxuXHRcdH1cblxuXHRcdGlmICggd3JpdGVJbmRleCAhPT0gdGltZXMubGVuZ3RoICkge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTtcblx0XHRcdHRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnRpbWVzID0gdGltZXM7XG5cdFx0XHR0aGlzLnZhbHVlcyA9IHZhbHVlcztcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdGNvbnN0IHRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGhpcy50aW1lcywgMCApO1xuXHRcdGNvbnN0IHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCAwICk7XG5cblx0XHRjb25zdCBUeXBlZEtleWZyYW1lVHJhY2sgPSB0aGlzLmNvbnN0cnVjdG9yO1xuXHRcdGNvbnN0IHRyYWNrID0gbmV3IFR5cGVkS2V5ZnJhbWVUcmFjayggdGhpcy5uYW1lLCB0aW1lcywgdmFsdWVzICk7XG5cblx0XHQvLyBJbnRlcnBvbGFudCBhcmd1bWVudCB0byBjb25zdHJ1Y3RvciBpcyBub3Qgc2F2ZWQsIHNvIGNvcHkgdGhlIGZhY3RvcnkgbWV0aG9kIGRpcmVjdGx5LlxuXHRcdHRyYWNrLmNyZWF0ZUludGVycG9sYW50ID0gdGhpcy5jcmVhdGVJbnRlcnBvbGFudDtcblxuXHRcdHJldHVybiB0cmFjaztcblxuXHR9XG5cbn1cblxuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVGltZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBGbG9hdDMyQXJyYXk7XG5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlTGluZWFyO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgQm9vbGVhbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIEJvb2xlYW5LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7fVxuXG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdib29sJztcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5WYWx1ZUJ1ZmZlclR5cGUgPSBBcnJheTtcbkJvb2xlYW5LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XG5Cb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyID0gdW5kZWZpbmVkO1xuQm9vbGVhbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIFRyYWNrIG9mIGtleWZyYW1lIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBjb2xvci5cbiAqL1xuY2xhc3MgQ29sb3JLZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7fVxuXG5Db2xvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnY29sb3InO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgbnVtZXJpYyBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIE51bWJlcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHt9XG5cbk51bWJlcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAnbnVtYmVyJztcblxuLyoqXG4gKiBTcGhlcmljYWwgbGluZWFyIHVuaXQgcXVhdGVybmlvbiBpbnRlcnBvbGFudC5cbiAqL1xuXG5mdW5jdGlvbiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHBhcmFtZXRlclBvc2l0aW9ucywgc2FtcGxlVmFsdWVzLCBzYW1wbGVTaXplLCByZXN1bHRCdWZmZXIgKSB7XG5cblx0SW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApO1xuXG59XG5cblF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsXG5cblx0aW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7XG5cblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlcixcblx0XHRcdHZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdGFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApO1xuXG5cdFx0bGV0IG9mZnNldCA9IGkxICogc3RyaWRlO1xuXG5cdFx0Zm9yICggbGV0IGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkge1xuXG5cdFx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggcmVzdWx0LCAwLCB2YWx1ZXMsIG9mZnNldCAtIHN0cmlkZSwgdmFsdWVzLCBvZmZzZXQsIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEEgVHJhY2sgb2YgcXVhdGVybmlvbiBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrIGV4dGVuZHMgS2V5ZnJhbWVUcmFjayB7XG5cblx0SW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyKCByZXN1bHQgKSB7XG5cblx0XHRyZXR1cm4gbmV3IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApO1xuXG5cdH1cblxufVxuXG5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdxdWF0ZXJuaW9uJztcbi8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWRcblF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlTGluZWFyO1xuUXVhdGVybmlvbktleWZyYW1lVHJhY2sucHJvdG90eXBlLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aCA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3NcbiAqL1xuY2xhc3MgU3RyaW5nS2V5ZnJhbWVUcmFjayBleHRlbmRzIEtleWZyYW1lVHJhY2sge31cblxuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVUeXBlTmFtZSA9ICdzdHJpbmcnO1xuU3RyaW5nS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUuVmFsdWVCdWZmZXJUeXBlID0gQXJyYXk7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5EZWZhdWx0SW50ZXJwb2xhdGlvbiA9IEludGVycG9sYXRlRGlzY3JldGU7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXIgPSB1bmRlZmluZWQ7XG5TdHJpbmdLZXlmcmFtZVRyYWNrLnByb3RvdHlwZS5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGggPSB1bmRlZmluZWQ7XG5cbi8qKlxuICogQSBUcmFjayBvZiB2ZWN0b3JlZCBrZXlmcmFtZSB2YWx1ZXMuXG4gKi9cbmNsYXNzIFZlY3RvcktleWZyYW1lVHJhY2sgZXh0ZW5kcyBLZXlmcmFtZVRyYWNrIHt9XG5cblZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlLlZhbHVlVHlwZU5hbWUgPSAndmVjdG9yJztcblxuY2xhc3MgQW5pbWF0aW9uQ2xpcCB7XG5cblx0Y29uc3RydWN0b3IoIG5hbWUsIGR1cmF0aW9uID0gLSAxLCB0cmFja3MsIGJsZW5kTW9kZSA9IE5vcm1hbEFuaW1hdGlvbkJsZW5kTW9kZSApIHtcblxuXHRcdHRoaXMubmFtZSA9IG5hbWU7XG5cdFx0dGhpcy50cmFja3MgPSB0cmFja3M7XG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xuXG5cdFx0dGhpcy51dWlkID0gTWF0aFV0aWxzLmdlbmVyYXRlVVVJRCgpO1xuXG5cdFx0Ly8gdGhpcyBtZWFucyBpdCBzaG91bGQgZmlndXJlIG91dCBpdHMgZHVyYXRpb24gYnkgc2Nhbm5pbmcgdGhlIHRyYWNrc1xuXHRcdGlmICggdGhpcy5kdXJhdGlvbiA8IDAgKSB7XG5cblx0XHRcdHRoaXMucmVzZXREdXJhdGlvbigpO1xuXG5cdFx0fVxuXG5cdH1cblxuXG5cdHN0YXRpYyBwYXJzZSgganNvbiApIHtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdLFxuXHRcdFx0anNvblRyYWNrcyA9IGpzb24udHJhY2tzLFxuXHRcdFx0ZnJhbWVUaW1lID0gMS4wIC8gKCBqc29uLmZwcyB8fCAxLjAgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGpzb25UcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uVHJhY2tzWyBpIF0gKS5zY2FsZSggZnJhbWVUaW1lICkgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcygganNvbi5uYW1lLCBqc29uLmR1cmF0aW9uLCB0cmFja3MsIGpzb24uYmxlbmRNb2RlICk7XG5cdFx0Y2xpcC51dWlkID0ganNvbi51dWlkO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG5cdHN0YXRpYyB0b0pTT04oIGNsaXAgKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSBbXSxcblx0XHRcdGNsaXBUcmFja3MgPSBjbGlwLnRyYWNrcztcblxuXHRcdGNvbnN0IGpzb24gPSB7XG5cblx0XHRcdCduYW1lJzogY2xpcC5uYW1lLFxuXHRcdFx0J2R1cmF0aW9uJzogY2xpcC5kdXJhdGlvbixcblx0XHRcdCd0cmFja3MnOiB0cmFja3MsXG5cdFx0XHQndXVpZCc6IGNsaXAudXVpZCxcblx0XHRcdCdibGVuZE1vZGUnOiBjbGlwLmJsZW5kTW9kZVxuXG5cdFx0fTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGNsaXBUcmFja3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHR0cmFja3MucHVzaCggS2V5ZnJhbWVUcmFjay50b0pTT04oIGNsaXBUcmFja3NbIGkgXSApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cblx0c3RhdGljIENyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlKCBuYW1lLCBtb3JwaFRhcmdldFNlcXVlbmNlLCBmcHMsIG5vTG9vcCApIHtcblxuXHRcdGNvbnN0IG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoO1xuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgbnVtTW9ycGhUYXJnZXRzOyBpICsrICkge1xuXG5cdFx0XHRsZXQgdGltZXMgPSBbXTtcblx0XHRcdGxldCB2YWx1ZXMgPSBbXTtcblxuXHRcdFx0dGltZXMucHVzaChcblx0XHRcdFx0KCBpICsgbnVtTW9ycGhUYXJnZXRzIC0gMSApICUgbnVtTW9ycGhUYXJnZXRzLFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTtcblxuXHRcdFx0dmFsdWVzLnB1c2goIDAsIDEsIDAgKTtcblxuXHRcdFx0Y29uc3Qgb3JkZXIgPSBBbmltYXRpb25VdGlscy5nZXRLZXlmcmFtZU9yZGVyKCB0aW1lcyApO1xuXHRcdFx0dGltZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdGltZXMsIDEsIG9yZGVyICk7XG5cdFx0XHR2YWx1ZXMgPSBBbmltYXRpb25VdGlscy5zb3J0ZWRBcnJheSggdmFsdWVzLCAxLCBvcmRlciApO1xuXG5cdFx0XHQvLyBpZiB0aGVyZSBpcyBhIGtleSBhdCB0aGUgZmlyc3QgZnJhbWUsIGR1cGxpY2F0ZSBpdCBhcyB0aGVcblx0XHRcdC8vIGxhc3QgZnJhbWUgYXMgd2VsbCBmb3IgcGVyZmVjdCBsb29wLlxuXHRcdFx0aWYgKCAhIG5vTG9vcCAmJiB0aW1lc1sgMCBdID09PSAwICkge1xuXG5cdFx0XHRcdHRpbWVzLnB1c2goIG51bU1vcnBoVGFyZ2V0cyApO1xuXHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWVzWyAwIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0cmFja3MucHVzaChcblx0XHRcdFx0bmV3IE51bWJlcktleWZyYW1lVHJhY2soXG5cdFx0XHRcdFx0Jy5tb3JwaFRhcmdldEluZmx1ZW5jZXNbJyArIG1vcnBoVGFyZ2V0U2VxdWVuY2VbIGkgXS5uYW1lICsgJ10nLFxuXHRcdFx0XHRcdHRpbWVzLCB2YWx1ZXNcblx0XHRcdFx0KS5zY2FsZSggMS4wIC8gZnBzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgdGhpcyggbmFtZSwgLSAxLCB0cmFja3MgKTtcblxuXHR9XG5cblx0c3RhdGljIGZpbmRCeU5hbWUoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkge1xuXG5cdFx0bGV0IGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5O1xuXG5cdFx0aWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7XG5cblx0XHRcdGNvbnN0IG8gPSBvYmplY3RPckNsaXBBcnJheTtcblx0XHRcdGNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9ucztcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGlmICggY2xpcEFycmF5WyBpIF0ubmFtZSA9PT0gbmFtZSApIHtcblxuXHRcdFx0XHRyZXR1cm4gY2xpcEFycmF5WyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH1cblxuXHRzdGF0aWMgQ3JlYXRlQ2xpcHNGcm9tTW9ycGhUYXJnZXRTZXF1ZW5jZXMoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7XG5cblx0XHRjb25zdCBhbmltYXRpb25Ub01vcnBoVGFyZ2V0cyA9IHt9O1xuXG5cdFx0Ly8gdGVzdGVkIHdpdGggaHR0cHM6Ly9yZWdleDEwMS5jb20vIG9uIHRyaWNrIHNlcXVlbmNlc1xuXHRcdC8vIHN1Y2ggZmxhbWluZ29fZmx5QV8wMDMsIGZsYW1pbmdvX3J1bjFfMDAzLCBjcmRlYXRoMDA1OVxuXHRcdGNvbnN0IHBhdHRlcm4gPSAvXihbXFx3LV0qPykoW1xcZF0rKSQvO1xuXG5cdFx0Ly8gc29ydCBtb3JwaCB0YXJnZXQgbmFtZXMgaW50byBhbmltYXRpb24gZ3JvdXBzIGJhc2VkXG5cdFx0Ly8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDJcblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdO1xuXHRcdFx0Y29uc3QgcGFydHMgPSBtb3JwaFRhcmdldC5uYW1lLm1hdGNoKCBwYXR0ZXJuICk7XG5cblx0XHRcdGlmICggcGFydHMgJiYgcGFydHMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0XHRjb25zdCBuYW1lID0gcGFydHNbIDEgXTtcblxuXHRcdFx0XHRsZXQgYW5pbWF0aW9uTW9ycGhUYXJnZXRzID0gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXTtcblxuXHRcdFx0XHRpZiAoICEgYW5pbWF0aW9uTW9ycGhUYXJnZXRzICkge1xuXG5cdFx0XHRcdFx0YW5pbWF0aW9uVG9Nb3JwaFRhcmdldHNbIG5hbWUgXSA9IGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IFtdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgY2xpcHMgPSBbXTtcblxuXHRcdGZvciAoIGNvbnN0IG5hbWUgaW4gYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgKSB7XG5cblx0XHRcdGNsaXBzLnB1c2goIHRoaXMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBjbGlwcztcblxuXHR9XG5cblx0Ly8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0XG5cdHN0YXRpYyBwYXJzZUFuaW1hdGlvbiggYW5pbWF0aW9uLCBib25lcyApIHtcblxuXHRcdGlmICggISBhbmltYXRpb24gKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLicgKTtcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHtcblxuXHRcdFx0Ly8gb25seSByZXR1cm4gdHJhY2sgaWYgdGhlcmUgYXJlIGFjdHVhbGx5IGtleXMuXG5cdFx0XHRpZiAoIGFuaW1hdGlvbktleXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XG5cdFx0XHRcdGNvbnN0IHZhbHVlcyA9IFtdO1xuXG5cdFx0XHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBhbmltYXRpb25LZXlzLCB0aW1lcywgdmFsdWVzLCBwcm9wZXJ0eU5hbWUgKTtcblxuXHRcdFx0XHQvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluXG5cdFx0XHRcdGlmICggdGltZXMubGVuZ3RoICE9PSAwICkge1xuXG5cdFx0XHRcdFx0ZGVzdFRyYWNrcy5wdXNoKCBuZXcgdHJhY2tUeXBlKCB0cmFja05hbWUsIHRpbWVzLCB2YWx1ZXMgKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHRcdGNvbnN0IHRyYWNrcyA9IFtdO1xuXG5cdFx0Y29uc3QgY2xpcE5hbWUgPSBhbmltYXRpb24ubmFtZSB8fCAnZGVmYXVsdCc7XG5cdFx0Y29uc3QgZnBzID0gYW5pbWF0aW9uLmZwcyB8fCAzMDtcblx0XHRjb25zdCBibGVuZE1vZGUgPSBhbmltYXRpb24uYmxlbmRNb2RlO1xuXG5cdFx0Ly8gYXV0b21hdGljIGxlbmd0aCBkZXRlcm1pbmF0aW9uIGluIEFuaW1hdGlvbkNsaXAuXG5cdFx0bGV0IGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7XG5cblx0XHRjb25zdCBoaWVyYXJjaHlUcmFja3MgPSBhbmltYXRpb24uaGllcmFyY2h5IHx8IFtdO1xuXG5cdFx0Zm9yICggbGV0IGggPSAwOyBoIDwgaGllcmFyY2h5VHJhY2tzLmxlbmd0aDsgaCArKyApIHtcblxuXHRcdFx0Y29uc3QgYW5pbWF0aW9uS2V5cyA9IGhpZXJhcmNoeVRyYWNrc1sgaCBdLmtleXM7XG5cblx0XHRcdC8vIHNraXAgZW1wdHkgdHJhY2tzXG5cdFx0XHRpZiAoICEgYW5pbWF0aW9uS2V5cyB8fCBhbmltYXRpb25LZXlzLmxlbmd0aCA9PT0gMCApIGNvbnRpbnVlO1xuXG5cdFx0XHQvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHNcblx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHQvLyBmaWd1cmUgb3V0IGFsbCBtb3JwaCB0YXJnZXRzIHVzZWQgaW4gdGhpcyB0cmFja1xuXHRcdFx0XHRjb25zdCBtb3JwaFRhcmdldE5hbWVzID0ge307XG5cblx0XHRcdFx0bGV0IGs7XG5cblx0XHRcdFx0Zm9yICggayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHtcblxuXHRcdFx0XHRcdGlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHtcblxuXHRcdFx0XHRcdFx0Zm9yICggbGV0IG0gPSAwOyBtIDwgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IG0gKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0bW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gY3JlYXRlIGEgdHJhY2sgZm9yIGVhY2ggbW9ycGggdGFyZ2V0IHdpdGggYWxsIHplcm9cblx0XHRcdFx0Ly8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2hcblx0XHRcdFx0Ly8gdGhlIG1vcnBoVGFyZ2V0IGlzIG5hbWVkLlxuXHRcdFx0XHRmb3IgKCBjb25zdCBtb3JwaFRhcmdldE5hbWUgaW4gbW9ycGhUYXJnZXROYW1lcyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHRpbWVzID0gW107XG5cdFx0XHRcdFx0Y29uc3QgdmFsdWVzID0gW107XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgbSA9IDA7IG0gIT09IGFuaW1hdGlvbktleXNbIGsgXS5tb3JwaFRhcmdldHMubGVuZ3RoOyArKyBtICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBhbmltYXRpb25LZXkgPSBhbmltYXRpb25LZXlzWyBrIF07XG5cblx0XHRcdFx0XHRcdHRpbWVzLnB1c2goIGFuaW1hdGlvbktleS50aW1lICk7XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggKCBhbmltYXRpb25LZXkubW9ycGhUYXJnZXQgPT09IG1vcnBoVGFyZ2V0TmFtZSApID8gMSA6IDAgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRyYWNrcy5wdXNoKCBuZXcgTnVtYmVyS2V5ZnJhbWVUcmFjayggJy5tb3JwaFRhcmdldEluZmx1ZW5jZVsnICsgbW9ycGhUYXJnZXROYW1lICsgJ10nLCB0aW1lcywgdmFsdWVzICkgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb25cblxuXHRcdFx0XHRjb25zdCBib25lTmFtZSA9ICcuYm9uZXNbJyArIGJvbmVzWyBoIF0ubmFtZSArICddJztcblxuXHRcdFx0XHRhZGROb25lbXB0eVRyYWNrKFxuXHRcdFx0XHRcdFZlY3RvcktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5wb3NpdGlvbicsXG5cdFx0XHRcdFx0YW5pbWF0aW9uS2V5cywgJ3BvcycsIHRyYWNrcyApO1xuXG5cdFx0XHRcdGFkZE5vbmVtcHR5VHJhY2soXG5cdFx0XHRcdFx0UXVhdGVybmlvbktleWZyYW1lVHJhY2ssIGJvbmVOYW1lICsgJy5xdWF0ZXJuaW9uJyxcblx0XHRcdFx0XHRhbmltYXRpb25LZXlzLCAncm90JywgdHJhY2tzICk7XG5cblx0XHRcdFx0YWRkTm9uZW1wdHlUcmFjayhcblx0XHRcdFx0XHRWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcuc2NhbGUnLFxuXHRcdFx0XHRcdGFuaW1hdGlvbktleXMsICdzY2wnLCB0cmFja3MgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCB0cmFja3MubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGNsaXAgPSBuZXcgdGhpcyggY2xpcE5hbWUsIGR1cmF0aW9uLCB0cmFja3MsIGJsZW5kTW9kZSApO1xuXG5cdFx0cmV0dXJuIGNsaXA7XG5cblx0fVxuXG5cdHJlc2V0RHVyYXRpb24oKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSB0aGlzLnRyYWNrcztcblx0XHRsZXQgZHVyYXRpb24gPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gdHJhY2tzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0aGlzLnRyYWNrc1sgaSBdO1xuXG5cdFx0XHRkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRyaW0oKSB7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMudHJhY2tzWyBpIF0udHJpbSggMCwgdGhpcy5kdXJhdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHZhbGlkYXRlKCkge1xuXG5cdFx0bGV0IHZhbGlkID0gdHJ1ZTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dmFsaWQgPSB2YWxpZCAmJiB0aGlzLnRyYWNrc1sgaSBdLnZhbGlkYXRlKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsaWQ7XG5cblx0fVxuXG5cdG9wdGltaXplKCkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy50cmFja3MubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRjb25zdCB0cmFja3MgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dHJhY2tzLnB1c2goIHRoaXMudHJhY2tzWyBpIF0uY2xvbmUoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm5hbWUsIHRoaXMuZHVyYXRpb24sIHRyYWNrcywgdGhpcy5ibGVuZE1vZGUgKTtcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9KU09OKCB0aGlzICk7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGdldFRyYWNrVHlwZUZvclZhbHVlVHlwZU5hbWUoIHR5cGVOYW1lICkge1xuXG5cdHN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cblx0XHRjYXNlICdzY2FsYXInOlxuXHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0Y2FzZSAnZmxvYXQnOlxuXHRcdGNhc2UgJ251bWJlcic6XG5cdFx0Y2FzZSAnaW50ZWdlcic6XG5cblx0XHRcdHJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAndmVjdG9yJzpcblx0XHRjYXNlICd2ZWN0b3IyJzpcblx0XHRjYXNlICd2ZWN0b3IzJzpcblx0XHRjYXNlICd2ZWN0b3I0JzpcblxuXHRcdFx0cmV0dXJuIFZlY3RvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdjb2xvcic6XG5cblx0XHRcdHJldHVybiBDb2xvcktleWZyYW1lVHJhY2s7XG5cblx0XHRjYXNlICdxdWF0ZXJuaW9uJzpcblxuXHRcdFx0cmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrO1xuXG5cdFx0Y2FzZSAnYm9vbCc6XG5cdFx0Y2FzZSAnYm9vbGVhbic6XG5cblx0XHRcdHJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjaztcblxuXHRcdGNhc2UgJ3N0cmluZyc6XG5cblx0XHRcdHJldHVybiBTdHJpbmdLZXlmcmFtZVRyYWNrO1xuXG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogJyArIHR5cGVOYW1lICk7XG5cbn1cblxuZnVuY3Rpb24gcGFyc2VLZXlmcmFtZVRyYWNrKCBqc29uICkge1xuXG5cdGlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTtcblxuXHR9XG5cblx0Y29uc3QgdHJhY2tUeXBlID0gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7XG5cblx0aWYgKCBqc29uLnRpbWVzID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRjb25zdCB0aW1lcyA9IFtdLCB2YWx1ZXMgPSBbXTtcblxuXHRcdEFuaW1hdGlvblV0aWxzLmZsYXR0ZW5KU09OKCBqc29uLmtleXMsIHRpbWVzLCB2YWx1ZXMsICd2YWx1ZScgKTtcblxuXHRcdGpzb24udGltZXMgPSB0aW1lcztcblx0XHRqc29uLnZhbHVlcyA9IHZhbHVlcztcblxuXHR9XG5cblx0Ly8gZGVyaXZlZCBjbGFzc2VzIGNhbiBkZWZpbmUgYSBzdGF0aWMgcGFyc2UgbWV0aG9kXG5cdGlmICggdHJhY2tUeXBlLnBhcnNlICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRyZXR1cm4gdHJhY2tUeXBlLnBhcnNlKCBqc29uICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSBhIGNvbnN0cnVjdG9yIGNvbXBhdGlibGUgd2l0aCB0aGUgYmFzZVxuXHRcdHJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTtcblxuXHR9XG5cbn1cblxuY29uc3QgQ2FjaGUgPSB7XG5cblx0ZW5hYmxlZDogZmFsc2UsXG5cblx0ZmlsZXM6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24gKCBrZXksIGZpbGUgKSB7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHQvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkNhY2hlJywgJ0FkZGluZyBrZXk6Jywga2V5ICk7XG5cblx0XHR0aGlzLmZpbGVzWyBrZXkgXSA9IGZpbGU7XG5cblx0fSxcblxuXHRnZXQ6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0aWYgKCB0aGlzLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuO1xuXG5cdFx0Ly8gY29uc29sZS5sb2coICdUSFJFRS5DYWNoZScsICdDaGVja2luZyBrZXk6Jywga2V5ICk7XG5cblx0XHRyZXR1cm4gdGhpcy5maWxlc1sga2V5IF07XG5cblx0fSxcblxuXHRyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkge1xuXG5cdFx0ZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdO1xuXG5cdH0sXG5cblx0Y2xlYXI6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMuZmlsZXMgPSB7fTtcblxuXHR9XG5cbn07XG5cbmZ1bmN0aW9uIExvYWRpbmdNYW5hZ2VyKCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdGxldCBpc0xvYWRpbmcgPSBmYWxzZTtcblx0bGV0IGl0ZW1zTG9hZGVkID0gMDtcblx0bGV0IGl0ZW1zVG90YWwgPSAwO1xuXHRsZXQgdXJsTW9kaWZpZXIgPSB1bmRlZmluZWQ7XG5cdGNvbnN0IGhhbmRsZXJzID0gW107XG5cblx0Ly8gUmVmZXIgdG8gIzU2ODkgZm9yIHRoZSByZWFzb24gd2h5IHdlIGRvbid0IHNldCAub25TdGFydFxuXHQvLyBpbiB0aGUgY29uc3RydWN0b3JcblxuXHR0aGlzLm9uU3RhcnQgPSB1bmRlZmluZWQ7XG5cdHRoaXMub25Mb2FkID0gb25Mb2FkO1xuXHR0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzO1xuXHR0aGlzLm9uRXJyb3IgPSBvbkVycm9yO1xuXG5cdHRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpdGVtc1RvdGFsICsrO1xuXG5cdFx0aWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkge1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uU3RhcnQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlzTG9hZGluZyA9IHRydWU7XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FbmQgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRcdGl0ZW1zTG9hZGVkICsrO1xuXG5cdFx0aWYgKCBzY29wZS5vblByb2dyZXNzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTtcblxuXHRcdH1cblxuXHRcdGlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7XG5cblx0XHRcdGlzTG9hZGluZyA9IGZhbHNlO1xuXG5cdFx0XHRpZiAoIHNjb3BlLm9uTG9hZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHNjb3BlLm9uTG9hZCgpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fTtcblxuXHR0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0aWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm9uRXJyb3IoIHVybCApO1xuXG5cdFx0fVxuXG5cdH07XG5cblx0dGhpcy5yZXNvbHZlVVJMID0gZnVuY3Rpb24gKCB1cmwgKSB7XG5cblx0XHRpZiAoIHVybE1vZGlmaWVyICkge1xuXG5cdFx0XHRyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVybDtcblxuXHR9O1xuXG5cdHRoaXMuc2V0VVJMTW9kaWZpZXIgPSBmdW5jdGlvbiAoIHRyYW5zZm9ybSApIHtcblxuXHRcdHVybE1vZGlmaWVyID0gdHJhbnNmb3JtO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fTtcblxuXHR0aGlzLmFkZEhhbmRsZXIgPSBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7XG5cblx0XHRoYW5kbGVycy5wdXNoKCByZWdleCwgbG9hZGVyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdHRoaXMucmVtb3ZlSGFuZGxlciA9IGZ1bmN0aW9uICggcmVnZXggKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IGhhbmRsZXJzLmluZGV4T2YoIHJlZ2V4ICk7XG5cblx0XHRpZiAoIGluZGV4ICE9PSAtIDEgKSB7XG5cblx0XHRcdGhhbmRsZXJzLnNwbGljZSggaW5kZXgsIDIgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH07XG5cblx0dGhpcy5nZXRIYW5kbGVyID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkge1xuXG5cdFx0XHRjb25zdCByZWdleCA9IGhhbmRsZXJzWyBpIF07XG5cdFx0XHRjb25zdCBsb2FkZXIgPSBoYW5kbGVyc1sgaSArIDEgXTtcblxuXHRcdFx0aWYgKCByZWdleC5nbG9iYWwgKSByZWdleC5sYXN0SW5kZXggPSAwOyAvLyBzZWUgIzE3OTIwXG5cblx0XHRcdGlmICggcmVnZXgudGVzdCggZmlsZSApICkge1xuXG5cdFx0XHRcdHJldHVybiBsb2FkZXI7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdH07XG5cbn1cblxuY29uc3QgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCk7XG5cbmZ1bmN0aW9uIExvYWRlciggbWFuYWdlciApIHtcblxuXHR0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjtcblxuXHR0aGlzLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XG5cdHRoaXMud2l0aENyZWRlbnRpYWxzID0gZmFsc2U7XG5cdHRoaXMucGF0aCA9ICcnO1xuXHR0aGlzLnJlc291cmNlUGF0aCA9ICcnO1xuXHR0aGlzLnJlcXVlc3RIZWFkZXIgPSB7fTtcblxufVxuXG5PYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7XG5cblx0bG9hZDogZnVuY3Rpb24gKCAvKiB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciAqLyApIHt9LFxuXG5cdGxvYWRBc3luYzogZnVuY3Rpb24gKCB1cmwsIG9uUHJvZ3Jlc3MgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRyZXR1cm4gbmV3IFByb21pc2UoIGZ1bmN0aW9uICggcmVzb2x2ZSwgcmVqZWN0ICkge1xuXG5cdFx0XHRzY29wZS5sb2FkKCB1cmwsIHJlc29sdmUsIG9uUHJvZ3Jlc3MsIHJlamVjdCApO1xuXG5cdFx0fSApO1xuXG5cdH0sXG5cblx0cGFyc2U6IGZ1bmN0aW9uICggLyogZGF0YSAqLyApIHt9LFxuXG5cdHNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIGNyb3NzT3JpZ2luICkge1xuXG5cdFx0dGhpcy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0V2l0aENyZWRlbnRpYWxzOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy53aXRoQ3JlZGVudGlhbHMgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFBhdGg6IGZ1bmN0aW9uICggcGF0aCApIHtcblxuXHRcdHRoaXMucGF0aCA9IHBhdGg7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXNvdXJjZVBhdGg6IGZ1bmN0aW9uICggcmVzb3VyY2VQYXRoICkge1xuXG5cdFx0dGhpcy5yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiAoIHJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHR0aGlzLnJlcXVlc3RIZWFkZXIgPSByZXF1ZXN0SGVhZGVyO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jb25zdCBsb2FkaW5nID0ge307XG5cbmZ1bmN0aW9uIEZpbGVMb2FkZXIoIG1hbmFnZXIgKSB7XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxufVxuXG5GaWxlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBGaWxlTG9hZGVyLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7XG5cblx0XHRpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsO1xuXG5cdFx0dXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApO1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTtcblxuXHRcdGlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTtcblxuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCAwICk7XG5cblx0XHRcdHJldHVybiBjYWNoZWQ7XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBpZiByZXF1ZXN0IGlzIGR1cGxpY2F0ZVxuXG5cdFx0aWYgKCBsb2FkaW5nWyB1cmwgXSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsb2FkaW5nWyB1cmwgXS5wdXNoKCB7XG5cblx0XHRcdFx0b25Mb2FkOiBvbkxvYWQsXG5cdFx0XHRcdG9uUHJvZ3Jlc3M6IG9uUHJvZ3Jlc3MsXG5cdFx0XHRcdG9uRXJyb3I6IG9uRXJyb3JcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHQvLyBDaGVjayBmb3IgZGF0YTogVVJJXG5cdFx0Y29uc3QgZGF0YVVyaVJlZ2V4ID0gL15kYXRhOiguKj8pKDtiYXNlNjQpPywoLiopJC87XG5cdFx0Y29uc3QgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTtcblx0XHRsZXQgcmVxdWVzdDtcblxuXHRcdC8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5XG5cdFx0aWYgKCBkYXRhVXJpUmVnZXhSZXN1bHQgKSB7XG5cblx0XHRcdGNvbnN0IG1pbWVUeXBlID0gZGF0YVVyaVJlZ2V4UmVzdWx0WyAxIF07XG5cdFx0XHRjb25zdCBpc0Jhc2U2NCA9ICEhIGRhdGFVcmlSZWdleFJlc3VsdFsgMiBdO1xuXG5cdFx0XHRsZXQgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdO1xuXHRcdFx0ZGF0YSA9IGRlY29kZVVSSUNvbXBvbmVudCggZGF0YSApO1xuXG5cdFx0XHRpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IGF0b2IoIGRhdGEgKTtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRsZXQgcmVzcG9uc2U7XG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRcdHN3aXRjaCAoIHJlc3BvbnNlVHlwZSApIHtcblxuXHRcdFx0XHRcdGNhc2UgJ2FycmF5YnVmZmVyJzpcblx0XHRcdFx0XHRjYXNlICdibG9iJzpcblxuXHRcdFx0XHRcdFx0Y29uc3QgdmlldyA9IG5ldyBVaW50OEFycmF5KCBkYXRhLmxlbmd0aCApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHR2aWV3WyBpIF0gPSBkYXRhLmNoYXJDb2RlQXQoIGkgKTtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkge1xuXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlID0gbmV3IEJsb2IoIFsgdmlldy5idWZmZXIgXSwgeyB0eXBlOiBtaW1lVHlwZSB9ICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSB2aWV3LmJ1ZmZlcjtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2RvY3VtZW50JzpcblxuXHRcdFx0XHRcdFx0Y29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKCBkYXRhLCBtaW1lVHlwZSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ2pzb24nOlxuXG5cdFx0XHRcdFx0XHRyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OiAvLyAndGV4dCcgb3Igb3RoZXJcblxuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBkYXRhO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2FpdCBmb3IgbmV4dCBicm93c2VyIHRpY2sgbGlrZSBzdGFuZGFyZCBYTUxIdHRwUmVxdWVzdCBldmVudCBkaXNwYXRjaGluZyBkb2VzXG5cdFx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCByZXNwb25zZSApO1xuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0XHR9LCAwICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHQvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXNcblx0XHRcdFx0c2V0VGltZW91dCggZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdFx0aWYgKCBvbkVycm9yICkgb25FcnJvciggZXJyb3IgKTtcblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHRcdH0sIDAgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gSW5pdGlhbGlzZSBhcnJheSBmb3IgZHVwbGljYXRlIHJlcXVlc3RzXG5cblx0XHRcdGxvYWRpbmdbIHVybCBdID0gW107XG5cblx0XHRcdGxvYWRpbmdbIHVybCBdLnB1c2goIHtcblxuXHRcdFx0XHRvbkxvYWQ6IG9uTG9hZCxcblx0XHRcdFx0b25Qcm9ncmVzczogb25Qcm9ncmVzcyxcblx0XHRcdFx0b25FcnJvcjogb25FcnJvclxuXG5cdFx0XHR9ICk7XG5cblx0XHRcdHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuXHRcdFx0cmVxdWVzdC5vcGVuKCAnR0VUJywgdXJsLCB0cnVlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBmdW5jdGlvbiAoIGV2ZW50ICkge1xuXG5cdFx0XHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTtcblxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0aWYgKCB0aGlzLnN0YXR1cyA9PT0gMjAwIHx8IHRoaXMuc3RhdHVzID09PSAwICkge1xuXG5cdFx0XHRcdFx0Ly8gU29tZSBicm93c2VycyByZXR1cm4gSFRUUCBTdGF0dXMgMCB3aGVuIHVzaW5nIG5vbi1odHRwIHByb3RvY29sXG5cdFx0XHRcdFx0Ly8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy5cblxuXHRcdFx0XHRcdGlmICggdGhpcy5zdGF0dXMgPT09IDAgKSBjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTtcblxuXHRcdFx0XHRcdC8vIEFkZCB0byBjYWNoZSBvbmx5IG9uIEhUVFAgc3VjY2Vzcywgc28gdGhhdCB3ZSBkbyBub3QgY2FjaGVcblx0XHRcdFx0XHQvLyBlcnJvciByZXNwb25zZSBib2RpZXMgYXMgcHJvcGVyIHJlc3BvbnNlcyB0byByZXF1ZXN0cy5cblx0XHRcdFx0XHRDYWNoZS5hZGQoIHVybCwgcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdwcm9ncmVzcycsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIGZhbHNlICk7XG5cblx0XHRcdHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgZnVuY3Rpb24gKCBldmVudCApIHtcblxuXHRcdFx0XHRjb25zdCBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTtcblxuXHRcdFx0XHRkZWxldGUgbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9LCBmYWxzZSApO1xuXG5cdFx0XHRyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdhYm9ydCcsIGZ1bmN0aW9uICggZXZlbnQgKSB7XG5cblx0XHRcdFx0Y29uc3QgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07XG5cblx0XHRcdFx0ZGVsZXRlIGxvYWRpbmdbIHVybCBdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sub25FcnJvciApIGNhbGxiYWNrLm9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgZmFsc2UgKTtcblxuXHRcdFx0aWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTtcblx0XHRcdGlmICggdGhpcy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCApIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7XG5cblx0XHRcdGlmICggcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlICkgcmVxdWVzdC5vdmVycmlkZU1pbWVUeXBlKCB0aGlzLm1pbWVUeXBlICE9PSB1bmRlZmluZWQgPyB0aGlzLm1pbWVUeXBlIDogJ3RleHQvcGxhaW4nICk7XG5cblx0XHRcdGZvciAoIGNvbnN0IGhlYWRlciBpbiB0aGlzLnJlcXVlc3RIZWFkZXIgKSB7XG5cblx0XHRcdFx0cmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0LnNlbmQoIG51bGwgKTtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXG5cdH0sXG5cblx0c2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTtcblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldE1pbWVUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5taW1lVHlwZSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBBbmltYXRpb25Mb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwganNvbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGNsaXAgPSBBbmltYXRpb25DbGlwLnBhcnNlKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0YW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYW5pbWF0aW9ucztcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBCYXNlIGNsYXNzIHRvIGJsb2NrIGJhc2VkIHRleHR1cmVzIGxvYWRlciAoZGRzLCBwdnIsIC4uLilcbiAqXG4gKiBTdWIgY2xhc3NlcyBoYXZlIHRvIGltcGxlbWVudCB0aGUgcGFyc2UoKSBtZXRob2Qgd2hpY2ggd2lsbCBiZSB1c2VkIGluIGxvYWQoKS5cbiAqL1xuXG5mdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cbkNvbXByZXNzZWRUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcixcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0Y29uc3QgaW1hZ2VzID0gW107XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggdGhpcy5yZXF1ZXN0SGVhZGVyICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XG5cblx0XHRsZXQgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsWyBpIF0sIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGltYWdlc1sgaSBdID0ge1xuXHRcdFx0XHRcdHdpZHRoOiB0ZXhEYXRhcy53aWR0aCxcblx0XHRcdFx0XHRoZWlnaHQ6IHRleERhdGFzLmhlaWdodCxcblx0XHRcdFx0XHRmb3JtYXQ6IHRleERhdGFzLmZvcm1hdCxcblx0XHRcdFx0XHRtaXBtYXBzOiB0ZXhEYXRhcy5taXBtYXBzXG5cdFx0XHRcdH07XG5cblx0XHRcdFx0bG9hZGVkICs9IDE7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2VzO1xuXHRcdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0O1xuXHRcdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSB1cmwubGVuZ3RoOyBpIDwgaWw7ICsrIGkgKSB7XG5cblx0XHRcdFx0bG9hZFRleHR1cmUoIGkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gY29tcHJlc3NlZCBjdWJlbWFwIHRleHR1cmUgc3RvcmVkIGluIGEgc2luZ2xlIEREUyBmaWxlXG5cblx0XHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHRcdGNvbnN0IHRleERhdGFzID0gc2NvcGUucGFyc2UoIGJ1ZmZlciwgdHJ1ZSApO1xuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMuaXNDdWJlbWFwICkge1xuXG5cdFx0XHRcdFx0Y29uc3QgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50O1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgZiBdID0geyBtaXBtYXBzOiBbXSB9O1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0ZXhEYXRhcy5taXBtYXBDb3VudDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5taXBtYXBzLnB1c2goIHRleERhdGFzLm1pcG1hcHNbIGYgKiB0ZXhEYXRhcy5taXBtYXBDb3VudCArIGkgXSApO1xuXHRcdFx0XHRcdFx0XHRpbWFnZXNbIGYgXS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7XG5cdFx0XHRcdFx0XHRcdGltYWdlc1sgZiBdLmhlaWdodCA9IHRleERhdGFzLmhlaWdodDtcblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZSA9IGltYWdlcztcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGFzLndpZHRoO1xuXHRcdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0O1xuXHRcdFx0XHRcdHRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggdGV4RGF0YXMubWlwbWFwQ291bnQgPT09IDEgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7XG5cdFx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBJbWFnZUxvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7XG5cblx0XHR1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApO1xuXG5cdFx0aWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApO1xuXG5cdFx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHRcdH0sIDAgKTtcblxuXHRcdFx0cmV0dXJuIGNhY2hlZDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGltYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdpbWcnICk7XG5cblx0XHRmdW5jdGlvbiBvbkltYWdlTG9hZCgpIHtcblxuXHRcdFx0aW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTtcblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdFx0Q2FjaGUuYWRkKCB1cmwsIHRoaXMgKTtcblxuXHRcdFx0aWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRoaXMgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIG9uSW1hZ2VFcnJvciggZXZlbnQgKSB7XG5cblx0XHRcdGltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgb25JbWFnZUxvYWQsIGZhbHNlICk7XG5cdFx0XHRpbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7XG5cblx0XHRcdGlmICggb25FcnJvciApIG9uRXJyb3IoIGV2ZW50ICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9XG5cblx0XHRpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApO1xuXHRcdGltYWdlLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTtcblxuXHRcdGlmICggdXJsLnN1YnN0ciggMCwgNSApICE9PSAnZGF0YTonICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjtcblxuXHRcdH1cblxuXHRcdHNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTtcblxuXHRcdGltYWdlLnNyYyA9IHVybDtcblxuXHRcdHJldHVybiBpbWFnZTtcblxuXHR9XG5cbn1cblxuY2xhc3MgQ3ViZVRleHR1cmVMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpO1xuXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsZXQgbG9hZGVkID0gMDtcblxuXHRcdGZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkge1xuXG5cdFx0XHRsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHRcdHRleHR1cmUuaW1hZ2VzWyBpIF0gPSBpbWFnZTtcblxuXHRcdFx0XHRsb2FkZWQgKys7XG5cblx0XHRcdFx0aWYgKCBsb2FkZWQgPT09IDYgKSB7XG5cblx0XHRcdFx0XHR0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkge1xuXG5cdFx0XHRsb2FkVGV4dHVyZSggaSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmU7XG5cblx0fVxuXG59XG5cbi8qKlxuICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKVxuICpcbiAqIFN1YiBjbGFzc2VzIGhhdmUgdG8gaW1wbGVtZW50IHRoZSBwYXJzZSgpIG1ldGhvZCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gbG9hZCgpLlxuICovXG5cbmZ1bmN0aW9uIERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdExvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7XG5cbn1cblxuRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IERhdGFUZXh0dXJlTG9hZGVyLFxuXG5cdGxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCB0ZXh0dXJlID0gbmV3IERhdGFUZXh0dXJlKCk7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cdFx0bG9hZGVyLnNldFdpdGhDcmVkZW50aWFscyggc2NvcGUud2l0aENyZWRlbnRpYWxzICk7XG5cdFx0bG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRcdGNvbnN0IHRleERhdGEgPSBzY29wZS5wYXJzZSggYnVmZmVyICk7XG5cblx0XHRcdGlmICggISB0ZXhEYXRhICkgcmV0dXJuO1xuXG5cdFx0XHRpZiAoIHRleERhdGEuaW1hZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmltYWdlID0gdGV4RGF0YS5pbWFnZTtcblxuXHRcdFx0fSBlbHNlIGlmICggdGV4RGF0YS5kYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5pbWFnZS53aWR0aCA9IHRleERhdGEud2lkdGg7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gdGV4RGF0YS5oZWlnaHQ7XG5cdFx0XHRcdHRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHR0ZXh0dXJlLndyYXBTID0gdGV4RGF0YS53cmFwUyAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cdFx0XHR0ZXh0dXJlLndyYXBUID0gdGV4RGF0YS53cmFwVCAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS53cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7XG5cblx0XHRcdHRleHR1cmUubWFnRmlsdGVyID0gdGV4RGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyO1xuXHRcdFx0dGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7XG5cblx0XHRcdHRleHR1cmUuYW5pc290cm9weSA9IHRleERhdGEuYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5hbmlzb3Ryb3B5IDogMTtcblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmVuY29kaW5nICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5lbmNvZGluZyA9IHRleERhdGEuZW5jb2Rpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0dGV4dHVyZS5mbGlwWSA9IHRleERhdGEuZmxpcFk7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLmZvcm1hdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YS5mb3JtYXQ7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLnR5cGUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7XG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLm1pcG1hcHMgPSB0ZXhEYXRhLm1pcG1hcHM7XG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOyAvLyBwcmVzdW1hYmx5Li4uXG5cblx0XHRcdH1cblxuXHRcdFx0aWYgKCB0ZXhEYXRhLm1pcG1hcENvdW50ID09PSAxICkge1xuXG5cdFx0XHRcdHRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggdGV4RGF0YS5nZW5lcmF0ZU1pcG1hcHMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHR0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IHRleERhdGEuZ2VuZXJhdGVNaXBtYXBzO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSwgdGV4RGF0YSApO1xuXG5cdFx0fSwgb25Qcm9ncmVzcywgb25FcnJvciApO1xuXG5cblx0XHRyZXR1cm4gdGV4dHVyZTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHtcblxuXHRMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApO1xuXG59XG5cblRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IFRleHR1cmVMb2FkZXIsXG5cblx0bG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHRleHR1cmUgPSBuZXcgVGV4dHVyZSgpO1xuXG5cdFx0Y29uc3QgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTtcblx0XHRsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7XG5cblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIGltYWdlICkge1xuXG5cdFx0XHR0ZXh0dXJlLmltYWdlID0gaW1hZ2U7XG5cblx0XHRcdC8vIEpQRUdzIGNhbid0IGhhdmUgYW4gYWxwaGEgY2hhbm5lbCwgc28gbWVtb3J5IGNhbiBiZSBzYXZlZCBieSBzdG9yaW5nIHRoZW0gYXMgUkdCLlxuXHRcdFx0Y29uc3QgaXNKUEVHID0gdXJsLnNlYXJjaCggL1xcLmpwZT9nKCR8XFw/KS9pICkgPiAwIHx8IHVybC5zZWFyY2goIC9eZGF0YVxcOmltYWdlXFwvanBlZy8gKSA9PT0gMDtcblxuXHRcdFx0dGV4dHVyZS5mb3JtYXQgPSBpc0pQRUcgPyBSR0JGb3JtYXQgOiBSR0JBRm9ybWF0O1xuXHRcdFx0dGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdGlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0b25Mb2FkKCB0ZXh0dXJlICk7XG5cblx0XHRcdH1cblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlO1xuXG5cdH1cblxufSApO1xuXG4vKipcbiAqIEV4dGVuc2libGUgY3VydmUgb2JqZWN0LlxuICpcbiAqIFNvbWUgY29tbW9uIG9mIGN1cnZlIG1ldGhvZHM6XG4gKiAuZ2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICksIC5nZXRUYW5nZW50KCB0LCBvcHRpb25hbFRhcmdldCApXG4gKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKVxuICogLmdldFBvaW50cygpLCAuZ2V0U3BhY2VkUG9pbnRzKClcbiAqIC5nZXRMZW5ndGgoKVxuICogLnVwZGF0ZUFyY0xlbmd0aHMoKVxuICpcbiAqIFRoaXMgZm9sbG93aW5nIGN1cnZlcyBpbmhlcml0IGZyb20gVEhSRUUuQ3VydmU6XG4gKlxuICogLS0gMkQgY3VydmVzIC0tXG4gKiBUSFJFRS5BcmNDdXJ2ZVxuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZVxuICogVEhSRUUuRWxsaXBzZUN1cnZlXG4gKiBUSFJFRS5MaW5lQ3VydmVcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlXG4gKiBUSFJFRS5TcGxpbmVDdXJ2ZVxuICpcbiAqIC0tIDNEIGN1cnZlcyAtLVxuICogVEhSRUUuQ2F0bXVsbFJvbUN1cnZlM1xuICogVEhSRUUuQ3ViaWNCZXppZXJDdXJ2ZTNcbiAqIFRIUkVFLkxpbmVDdXJ2ZTNcbiAqIFRIUkVFLlF1YWRyYXRpY0JlemllckN1cnZlM1xuICpcbiAqIEEgc2VyaWVzIG9mIGN1cnZlcyBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYSBUSFJFRS5DdXJ2ZVBhdGguXG4gKlxuICoqL1xuXG5mdW5jdGlvbiBDdXJ2ZSgpIHtcblxuXHR0aGlzLnR5cGUgPSAnQ3VydmUnO1xuXG5cdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwO1xuXG59XG5cbk9iamVjdC5hc3NpZ24oIEN1cnZlLnByb3RvdHlwZSwge1xuXG5cdC8vIFZpcnR1YWwgYmFzZSBjbGFzcyBtZXRob2QgdG8gb3ZlcndyaXRlIGFuZCBpbXBsZW1lbnQgaW4gc3ViY2xhc3Nlc1xuXHQvL1x0LSB0IFswIC4uIDFdXG5cblx0Z2V0UG9pbnQ6IGZ1bmN0aW9uICggLyogdCwgb3B0aW9uYWxUYXJnZXQgKi8gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLmdldFBvaW50KCkgbm90IGltcGxlbWVudGVkLicgKTtcblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9LFxuXG5cdC8vIEdldCBwb2ludCBhdCByZWxhdGl2ZSBwb3NpdGlvbiBpbiBjdXJ2ZSBhY2NvcmRpbmcgdG8gYXJjIGxlbmd0aFxuXHQvLyAtIHUgWzAgLi4gMV1cblxuXHRnZXRQb2ludEF0OiBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgdCA9IHRoaXMuZ2V0VXRvVG1hcHBpbmcoIHUgKTtcblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9LFxuXG5cdC8vIEdldCBzZXF1ZW5jZSBvZiBwb2ludHMgdXNpbmcgZ2V0UG9pbnQoIHQgKVxuXG5cdGdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgPSA1ICkge1xuXG5cdFx0Y29uc3QgcG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgZCA9IDA7IGQgPD0gZGl2aXNpb25zOyBkICsrICkge1xuXG5cdFx0XHRwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1IClcblxuXHRnZXRTcGFjZWRQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zID0gNSApIHtcblxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnRBdCggZCAvIGRpdmlzaW9ucyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH0sXG5cblx0Ly8gR2V0IHRvdGFsIGN1cnZlIGFyYyBsZW5ndGhcblxuXHRnZXRMZW5ndGg6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuZ3Roc1sgbGVuZ3Rocy5sZW5ndGggLSAxIF07XG5cblx0fSxcblxuXHQvLyBHZXQgbGlzdCBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3Roc1xuXG5cdGdldExlbmd0aHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkge1xuXG5cdFx0aWYgKCBkaXZpc2lvbnMgPT09IHVuZGVmaW5lZCApIGRpdmlzaW9ucyA9IHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0aWYgKCB0aGlzLmNhY2hlQXJjTGVuZ3RocyAmJlxuXHRcdFx0KCB0aGlzLmNhY2hlQXJjTGVuZ3Rocy5sZW5ndGggPT09IGRpdmlzaW9ucyArIDEgKSAmJlxuXHRcdFx0ISB0aGlzLm5lZWRzVXBkYXRlICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7XG5cblx0XHR9XG5cblx0XHR0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7XG5cblx0XHRjb25zdCBjYWNoZSA9IFtdO1xuXHRcdGxldCBjdXJyZW50LCBsYXN0ID0gdGhpcy5nZXRQb2ludCggMCApO1xuXHRcdGxldCBzdW0gPSAwO1xuXG5cdFx0Y2FjaGUucHVzaCggMCApO1xuXG5cdFx0Zm9yICggbGV0IHAgPSAxOyBwIDw9IGRpdmlzaW9uczsgcCArKyApIHtcblxuXHRcdFx0Y3VycmVudCA9IHRoaXMuZ2V0UG9pbnQoIHAgLyBkaXZpc2lvbnMgKTtcblx0XHRcdHN1bSArPSBjdXJyZW50LmRpc3RhbmNlVG8oIGxhc3QgKTtcblx0XHRcdGNhY2hlLnB1c2goIHN1bSApO1xuXHRcdFx0bGFzdCA9IGN1cnJlbnQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlQXJjTGVuZ3RocyA9IGNhY2hlO1xuXG5cdFx0cmV0dXJuIGNhY2hlOyAvLyB7IHN1bXM6IGNhY2hlLCBzdW06IHN1bSB9OyBTdW0gaXMgaW4gdGhlIGxhc3QgZWxlbWVudC5cblxuXHR9LFxuXG5cdHVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdH0sXG5cblx0Ly8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudFxuXG5cdGdldFV0b1RtYXBwaW5nOiBmdW5jdGlvbiAoIHUsIGRpc3RhbmNlICkge1xuXG5cdFx0Y29uc3QgYXJjTGVuZ3RocyA9IHRoaXMuZ2V0TGVuZ3RocygpO1xuXG5cdFx0bGV0IGkgPSAwO1xuXHRcdGNvbnN0IGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7XG5cblx0XHRsZXQgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXRcblxuXHRcdGlmICggZGlzdGFuY2UgKSB7XG5cblx0XHRcdHRhcmdldEFyY0xlbmd0aCA9IGRpc3RhbmNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGFyZ2V0QXJjTGVuZ3RoID0gdSAqIGFyY0xlbmd0aHNbIGlsIC0gMSBdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gYmluYXJ5IHNlYXJjaCBmb3IgdGhlIGluZGV4IHdpdGggbGFyZ2VzdCB2YWx1ZSBzbWFsbGVyIHRoYW4gdGFyZ2V0IHUgZGlzdGFuY2VcblxuXHRcdGxldCBsb3cgPSAwLCBoaWdoID0gaWwgLSAxLCBjb21wYXJpc29uO1xuXG5cdFx0d2hpbGUgKCBsb3cgPD0gaGlnaCApIHtcblxuXHRcdFx0aSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzXG5cblx0XHRcdGNvbXBhcmlzb24gPSBhcmNMZW5ndGhzWyBpIF0gLSB0YXJnZXRBcmNMZW5ndGg7XG5cblx0XHRcdGlmICggY29tcGFyaXNvbiA8IDAgKSB7XG5cblx0XHRcdFx0bG93ID0gaSArIDE7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBhcmlzb24gPiAwICkge1xuXG5cdFx0XHRcdGhpZ2ggPSBpIC0gMTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRoaWdoID0gaTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Ly8gRE9ORVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpID0gaGlnaDtcblxuXHRcdGlmICggYXJjTGVuZ3Roc1sgaSBdID09PSB0YXJnZXRBcmNMZW5ndGggKSB7XG5cblx0XHRcdHJldHVybiBpIC8gKCBpbCAtIDEgKTtcblxuXHRcdH1cblxuXHRcdC8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzXG5cblx0XHRjb25zdCBsZW5ndGhCZWZvcmUgPSBhcmNMZW5ndGhzWyBpIF07XG5cdFx0Y29uc3QgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdO1xuXG5cdFx0Y29uc3Qgc2VnbWVudExlbmd0aCA9IGxlbmd0aEFmdGVyIC0gbGVuZ3RoQmVmb3JlO1xuXG5cdFx0Ly8gZGV0ZXJtaW5lIHdoZXJlIHdlIGFyZSBiZXR3ZWVuIHRoZSAnYmVmb3JlJyBhbmQgJ2FmdGVyJyBwb2ludHNcblxuXHRcdGNvbnN0IHNlZ21lbnRGcmFjdGlvbiA9ICggdGFyZ2V0QXJjTGVuZ3RoIC0gbGVuZ3RoQmVmb3JlICkgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0Ly8gYWRkIHRoYXQgZnJhY3Rpb25hbCBhbW91bnQgdG8gdFxuXG5cdFx0Y29uc3QgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTtcblxuXHRcdHJldHVybiB0O1xuXG5cdH0sXG5cblx0Ly8gUmV0dXJucyBhIHVuaXQgdmVjdG9yIHRhbmdlbnQgYXQgdFxuXHQvLyBJbiBjYXNlIGFueSBzdWIgY3VydmUgZG9lcyBub3QgaW1wbGVtZW50IGl0cyB0YW5nZW50IGRlcml2YXRpb24sXG5cdC8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50XG5cdC8vIHdoaWNoIHNlZW1zIHRvIGdpdmUgYSByZWFzb25hYmxlIGFwcHJveGltYXRpb25cblxuXHRnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZGVsdGEgPSAwLjAwMDE7XG5cdFx0bGV0IHQxID0gdCAtIGRlbHRhO1xuXHRcdGxldCB0MiA9IHQgKyBkZWx0YTtcblxuXHRcdC8vIENhcHBpbmcgaW4gY2FzZSBvZiBkYW5nZXJcblxuXHRcdGlmICggdDEgPCAwICkgdDEgPSAwO1xuXHRcdGlmICggdDIgPiAxICkgdDIgPSAxO1xuXG5cdFx0Y29uc3QgcHQxID0gdGhpcy5nZXRQb2ludCggdDEgKTtcblx0XHRjb25zdCBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApO1xuXG5cdFx0Y29uc3QgdGFuZ2VudCA9IG9wdGlvbmFsVGFyZ2V0IHx8ICggKCBwdDEuaXNWZWN0b3IyICkgPyBuZXcgVmVjdG9yMigpIDogbmV3IFZlY3RvcjMoKSApO1xuXG5cdFx0dGFuZ2VudC5jb3B5KCBwdDIgKS5zdWIoIHB0MSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRhbmdlbnQ7XG5cblx0fSxcblxuXHRnZXRUYW5nZW50QXQ6IGZ1bmN0aW9uICggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApO1xuXHRcdHJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fSxcblxuXHRjb21wdXRlRnJlbmV0RnJhbWVzOiBmdW5jdGlvbiAoIHNlZ21lbnRzLCBjbG9zZWQgKSB7XG5cblx0XHQvLyBzZWUgaHR0cDovL3d3dy5jcy5pbmRpYW5hLmVkdS9wdWIvdGVjaHJlcG9ydHMvVFI0MjUucGRmXG5cblx0XHRjb25zdCBub3JtYWwgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0Y29uc3QgdGFuZ2VudHMgPSBbXTtcblx0XHRjb25zdCBub3JtYWxzID0gW107XG5cdFx0Y29uc3QgYmlub3JtYWxzID0gW107XG5cblx0XHRjb25zdCB2ZWMgPSBuZXcgVmVjdG9yMygpO1xuXHRcdGNvbnN0IG1hdCA9IG5ldyBNYXRyaXg0KCk7XG5cblx0XHQvLyBjb21wdXRlIHRoZSB0YW5nZW50IHZlY3RvcnMgZm9yIGVhY2ggc2VnbWVudCBvbiB0aGUgY3VydmVcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgdSA9IGkgLyBzZWdtZW50cztcblxuXHRcdFx0dGFuZ2VudHNbIGkgXSA9IHRoaXMuZ2V0VGFuZ2VudEF0KCB1LCBuZXcgVmVjdG9yMygpICk7XG5cdFx0XHR0YW5nZW50c1sgaSBdLm5vcm1hbGl6ZSgpO1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VsZWN0IGFuIGluaXRpYWwgbm9ybWFsIHZlY3RvciBwZXJwZW5kaWN1bGFyIHRvIHRoZSBmaXJzdCB0YW5nZW50IHZlY3Rvcixcblx0XHQvLyBhbmQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbWluaW11bSB0YW5nZW50IHh5eiBjb21wb25lbnRcblxuXHRcdG5vcm1hbHNbIDAgXSA9IG5ldyBWZWN0b3IzKCk7XG5cdFx0Ymlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpO1xuXHRcdGxldCBtaW4gPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdGNvbnN0IHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApO1xuXHRcdGNvbnN0IHR5ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueSApO1xuXHRcdGNvbnN0IHR6ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueiApO1xuXG5cdFx0aWYgKCB0eCA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR4O1xuXHRcdFx0bm9ybWFsLnNldCggMSwgMCwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eSA8PSBtaW4gKSB7XG5cblx0XHRcdG1pbiA9IHR5O1xuXHRcdFx0bm9ybWFsLnNldCggMCwgMSwgMCApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB0eiA8PSBtaW4gKSB7XG5cblx0XHRcdG5vcm1hbC5zZXQoIDAsIDAsIDEgKTtcblxuXHRcdH1cblxuXHRcdHZlYy5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0bm9ybWFsc1sgMCBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIDAgXSwgdmVjICk7XG5cdFx0Ymlub3JtYWxzWyAwIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWxzWyAwIF0gKTtcblxuXG5cdFx0Ly8gY29tcHV0ZSB0aGUgc2xvd2x5LXZhcnlpbmcgbm9ybWFsIGFuZCBiaW5vcm1hbCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlXG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdG5vcm1hbHNbIGkgXSA9IG5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0gPSBiaW5vcm1hbHNbIGkgLSAxIF0uY2xvbmUoKTtcblxuXHRcdFx0dmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTtcblxuXHRcdFx0aWYgKCB2ZWMubGVuZ3RoKCkgPiBOdW1iZXIuRVBTSUxPTiApIHtcblxuXHRcdFx0XHR2ZWMubm9ybWFsaXplKCk7XG5cblx0XHRcdFx0Y29uc3QgdGhldGEgPSBNYXRoLmFjb3MoIE1hdGhVdGlscy5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnNcblxuXHRcdFx0XHRub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdmVjLCB0aGV0YSApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Ymlub3JtYWxzWyBpIF0uY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgaSBdLCBub3JtYWxzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdC8vIGlmIHRoZSBjdXJ2ZSBpcyBjbG9zZWQsIHBvc3Rwcm9jZXNzIHRoZSB2ZWN0b3JzIHNvIHRoZSBmaXJzdCBhbmQgbGFzdCBub3JtYWwgdmVjdG9ycyBhcmUgdGhlIHNhbWVcblxuXHRcdGlmICggY2xvc2VkID09PSB0cnVlICkge1xuXG5cdFx0XHRsZXQgdGhldGEgPSBNYXRoLmFjb3MoIE1hdGhVdGlscy5jbGFtcCggbm9ybWFsc1sgMCBdLmRvdCggbm9ybWFsc1sgc2VnbWVudHMgXSApLCAtIDEsIDEgKSApO1xuXHRcdFx0dGhldGEgLz0gc2VnbWVudHM7XG5cblx0XHRcdGlmICggdGFuZ2VudHNbIDAgXS5kb3QoIHZlYy5jcm9zc1ZlY3RvcnMoIG5vcm1hbHNbIDAgXSwgbm9ybWFsc1sgc2VnbWVudHMgXSApICkgPiAwICkge1xuXG5cdFx0XHRcdHRoZXRhID0gLSB0aGV0YTtcblxuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7XG5cblx0XHRcdFx0Ly8gdHdpc3QgYSBsaXR0bGUuLi5cblx0XHRcdFx0bm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHRhbmdlbnRzWyBpIF0sIHRoZXRhICogaSApICk7XG5cdFx0XHRcdGJpbm9ybWFsc1sgaSBdLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgXSwgbm9ybWFsc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHR0YW5nZW50czogdGFuZ2VudHMsXG5cdFx0XHRub3JtYWxzOiBub3JtYWxzLFxuXHRcdFx0Ymlub3JtYWxzOiBiaW5vcm1hbHNcblx0XHR9O1xuXG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uICgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9LFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnMgPSBzb3VyY2UuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSB7XG5cdFx0XHRtZXRhZGF0YToge1xuXHRcdFx0XHR2ZXJzaW9uOiA0LjUsXG5cdFx0XHRcdHR5cGU6ICdDdXJ2ZScsXG5cdFx0XHRcdGdlbmVyYXRvcjogJ0N1cnZlLnRvSlNPTidcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0ZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9ucztcblx0XHRkYXRhLnR5cGUgPSB0aGlzLnR5cGU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9LFxuXG5cdGZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7XG5cblx0XHR0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIEVsbGlwc2VDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggYVggPSAwLCBhWSA9IDAsIHhSYWRpdXMgPSAxLCB5UmFkaXVzID0gMSwgYVN0YXJ0QW5nbGUgPSAwLCBhRW5kQW5nbGUgPSBNYXRoLlBJICogMiwgYUNsb2Nrd2lzZSA9IGZhbHNlLCBhUm90YXRpb24gPSAwICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdFbGxpcHNlQ3VydmUnO1xuXG5cdFx0dGhpcy5hWCA9IGFYO1xuXHRcdHRoaXMuYVkgPSBhWTtcblxuXHRcdHRoaXMueFJhZGl1cyA9IHhSYWRpdXM7XG5cdFx0dGhpcy55UmFkaXVzID0geVJhZGl1cztcblxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZTtcblx0XHR0aGlzLmFFbmRBbmdsZSA9IGFFbmRBbmdsZTtcblxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IGFDbG9ja3dpc2U7XG5cblx0XHR0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpO1xuXG5cdFx0Y29uc3QgdHdvUGkgPSBNYXRoLlBJICogMjtcblx0XHRsZXQgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTtcblx0XHRjb25zdCBzYW1lUG9pbnRzID0gTWF0aC5hYnMoIGRlbHRhQW5nbGUgKSA8IE51bWJlci5FUFNJTE9OO1xuXG5cdFx0Ly8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJXG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7XG5cdFx0d2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpO1xuXG5cdFx0aWYgKCBkZWx0YUFuZ2xlIDwgTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdGlmICggc2FtZVBvaW50cyApIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gMDtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gdHdvUGk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHtcblxuXHRcdFx0aWYgKCBkZWx0YUFuZ2xlID09PSB0d29QaSApIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gLSB0d29QaTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRkZWx0YUFuZ2xlID0gZGVsdGFBbmdsZSAtIHR3b1BpO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBhbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGUgKyB0ICogZGVsdGFBbmdsZTtcblx0XHRsZXQgeCA9IHRoaXMuYVggKyB0aGlzLnhSYWRpdXMgKiBNYXRoLmNvcyggYW5nbGUgKTtcblx0XHRsZXQgeSA9IHRoaXMuYVkgKyB0aGlzLnlSYWRpdXMgKiBNYXRoLnNpbiggYW5nbGUgKTtcblxuXHRcdGlmICggdGhpcy5hUm90YXRpb24gIT09IDAgKSB7XG5cblx0XHRcdGNvbnN0IGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApO1xuXHRcdFx0Y29uc3Qgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7XG5cblx0XHRcdGNvbnN0IHR4ID0geCAtIHRoaXMuYVg7XG5cdFx0XHRjb25zdCB0eSA9IHkgLSB0aGlzLmFZO1xuXG5cdFx0XHQvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuXG5cdFx0XHR4ID0gdHggKiBjb3MgLSB0eSAqIHNpbiArIHRoaXMuYVg7XG5cdFx0XHR5ID0gdHggKiBzaW4gKyB0eSAqIGNvcyArIHRoaXMuYVk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnQuc2V0KCB4LCB5ICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5hWCA9IHNvdXJjZS5hWDtcblx0XHR0aGlzLmFZID0gc291cmNlLmFZO1xuXG5cdFx0dGhpcy54UmFkaXVzID0gc291cmNlLnhSYWRpdXM7XG5cdFx0dGhpcy55UmFkaXVzID0gc291cmNlLnlSYWRpdXM7XG5cblx0XHR0aGlzLmFTdGFydEFuZ2xlID0gc291cmNlLmFTdGFydEFuZ2xlO1xuXHRcdHRoaXMuYUVuZEFuZ2xlID0gc291cmNlLmFFbmRBbmdsZTtcblxuXHRcdHRoaXMuYUNsb2Nrd2lzZSA9IHNvdXJjZS5hQ2xvY2t3aXNlO1xuXG5cdFx0dGhpcy5hUm90YXRpb24gPSBzb3VyY2UuYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEuYVggPSB0aGlzLmFYO1xuXHRcdGRhdGEuYVkgPSB0aGlzLmFZO1xuXG5cdFx0ZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzO1xuXHRcdGRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1cztcblxuXHRcdGRhdGEuYVN0YXJ0QW5nbGUgPSB0aGlzLmFTdGFydEFuZ2xlO1xuXHRcdGRhdGEuYUVuZEFuZ2xlID0gdGhpcy5hRW5kQW5nbGU7XG5cblx0XHRkYXRhLmFDbG9ja3dpc2UgPSB0aGlzLmFDbG9ja3dpc2U7XG5cblx0XHRkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMuYVggPSBqc29uLmFYO1xuXHRcdHRoaXMuYVkgPSBqc29uLmFZO1xuXG5cdFx0dGhpcy54UmFkaXVzID0ganNvbi54UmFkaXVzO1xuXHRcdHRoaXMueVJhZGl1cyA9IGpzb24ueVJhZGl1cztcblxuXHRcdHRoaXMuYVN0YXJ0QW5nbGUgPSBqc29uLmFTdGFydEFuZ2xlO1xuXHRcdHRoaXMuYUVuZEFuZ2xlID0ganNvbi5hRW5kQW5nbGU7XG5cblx0XHR0aGlzLmFDbG9ja3dpc2UgPSBqc29uLmFDbG9ja3dpc2U7XG5cblx0XHR0aGlzLmFSb3RhdGlvbiA9IGpzb24uYVJvdGF0aW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBBcmNDdXJ2ZSBleHRlbmRzIEVsbGlwc2VDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHN1cGVyKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdBcmNDdXJ2ZSc7XG5cblx0fVxuXG59XG5cbkFyY0N1cnZlLnByb3RvdHlwZS5pc0FyY0N1cnZlID0gdHJ1ZTtcblxuLyoqXG4gKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZ1xuICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuXG4gKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZlxuICpcbiAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbVxuICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNVxuICovXG5cblxuLypcbkJhc2VkIG9uIGFuIG9wdGltaXplZCBjKysgc29sdXRpb24gaW5cbiAtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvOTQ4OTczNi9jYXRtdWxsLXJvbS1jdXJ2ZS13aXRoLW5vLWN1c3BzLWFuZC1uby1zZWxmLWludGVyc2VjdGlvbnMvXG4gLSBodHRwOi8vaWRlb25lLmNvbS9Ob0ViVk1cblxuVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLFxuYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsXG53aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuXG4qL1xuXG5mdW5jdGlvbiBDdWJpY1BvbHkoKSB7XG5cblx0bGV0IGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDtcblxuXHQvKlxuXHQgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsXG5cdCAqICAgcChzKSA9IGMwICsgYzEqcyArIGMyKnNeMiArIGMzKnNeM1xuXHQgKiBzdWNoIHRoYXRcblx0ICogICBwKDApID0geDAsIHAoMSkgPSB4MVxuXHQgKiAgYW5kXG5cdCAqICAgcCcoMCkgPSB0MCwgcCcoMSkgPSB0MS5cblx0ICovXG5cdGZ1bmN0aW9uIGluaXQoIHgwLCB4MSwgdDAsIHQxICkge1xuXG5cdFx0YzAgPSB4MDtcblx0XHRjMSA9IHQwO1xuXHRcdGMyID0gLSAzICogeDAgKyAzICogeDEgLSAyICogdDAgLSB0MTtcblx0XHRjMyA9IDIgKiB4MCAtIDIgKiB4MSArIHQwICsgdDE7XG5cblx0fVxuXG5cdHJldHVybiB7XG5cblx0XHRpbml0Q2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgdGVuc2lvbiApIHtcblxuXHRcdFx0aW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApO1xuXG5cdFx0fSxcblxuXHRcdGluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHtcblxuXHRcdFx0Ly8gY29tcHV0ZSB0YW5nZW50cyB3aGVuIHBhcmFtZXRlcml6ZWQgaW4gW3QxLHQyXVxuXHRcdFx0bGV0IHQxID0gKCB4MSAtIHgwICkgLyBkdDAgLSAoIHgyIC0geDAgKSAvICggZHQwICsgZHQxICkgKyAoIHgyIC0geDEgKSAvIGR0MTtcblx0XHRcdGxldCB0MiA9ICggeDIgLSB4MSApIC8gZHQxIC0gKCB4MyAtIHgxICkgLyAoIGR0MSArIGR0MiApICsgKCB4MyAtIHgyICkgLyBkdDI7XG5cblx0XHRcdC8vIHJlc2NhbGUgdGFuZ2VudHMgZm9yIHBhcmFtZXRyaXphdGlvbiBpbiBbMCwxXVxuXHRcdFx0dDEgKj0gZHQxO1xuXHRcdFx0dDIgKj0gZHQxO1xuXG5cdFx0XHRpbml0KCB4MSwgeDIsIHQxLCB0MiApO1xuXG5cdFx0fSxcblxuXHRcdGNhbGM6IGZ1bmN0aW9uICggdCApIHtcblxuXHRcdFx0Y29uc3QgdDIgPSB0ICogdDtcblx0XHRcdGNvbnN0IHQzID0gdDIgKiB0O1xuXHRcdFx0cmV0dXJuIGMwICsgYzEgKiB0ICsgYzIgKiB0MiArIGMzICogdDM7XG5cblx0XHR9XG5cblx0fTtcblxufVxuXG4vL1xuXG5jb25zdCB0bXAgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgcHggPSBuZXcgQ3ViaWNQb2x5KCksIHB5ID0gbmV3IEN1YmljUG9seSgpLCBweiA9IG5ldyBDdWJpY1BvbHkoKTtcblxuY2xhc3MgQ2F0bXVsbFJvbUN1cnZlMyBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggcG9pbnRzID0gW10sIGNsb3NlZCA9IGZhbHNlLCBjdXJ2ZVR5cGUgPSAnY2VudHJpcGV0YWwnLCB0ZW5zaW9uID0gMC41ICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDYXRtdWxsUm9tQ3VydmUzJztcblxuXHRcdHRoaXMucG9pbnRzID0gcG9pbnRzO1xuXHRcdHRoaXMuY2xvc2VkID0gY2xvc2VkO1xuXHRcdHRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlO1xuXHRcdHRoaXMudGVuc2lvbiA9IHRlbnNpb247XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0Y29uc3QgcG9pbnRzID0gdGhpcy5wb2ludHM7XG5cdFx0Y29uc3QgbCA9IHBvaW50cy5sZW5ndGg7XG5cblx0XHRjb25zdCBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7XG5cdFx0bGV0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHRcdGxldCB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7XG5cblx0XHRpZiAoIHRoaXMuY2xvc2VkICkge1xuXG5cdFx0XHRpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7XG5cblx0XHR9IGVsc2UgaWYgKCB3ZWlnaHQgPT09IDAgJiYgaW50UG9pbnQgPT09IGwgLSAxICkge1xuXG5cdFx0XHRpbnRQb2ludCA9IGwgLSAyO1xuXHRcdFx0d2VpZ2h0ID0gMTtcblxuXHRcdH1cblxuXHRcdGxldCBwMCwgcDM7IC8vIDQgcG9pbnRzIChwMSAmIHAyIGRlZmluZWQgYmVsb3cpXG5cblx0XHRpZiAoIHRoaXMuY2xvc2VkIHx8IGludFBvaW50ID4gMCApIHtcblxuXHRcdFx0cDAgPSBwb2ludHNbICggaW50UG9pbnQgLSAxICkgJSBsIF07XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBleHRyYXBvbGF0ZSBmaXJzdCBwb2ludFxuXHRcdFx0dG1wLnN1YlZlY3RvcnMoIHBvaW50c1sgMCBdLCBwb2ludHNbIDEgXSApLmFkZCggcG9pbnRzWyAwIF0gKTtcblx0XHRcdHAwID0gdG1wO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50ICUgbCBdO1xuXHRcdGNvbnN0IHAyID0gcG9pbnRzWyAoIGludFBvaW50ICsgMSApICUgbCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkge1xuXG5cdFx0XHRwMyA9IHBvaW50c1sgKCBpbnRQb2ludCArIDIgKSAlIGwgXTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIGV4dHJhcG9sYXRlIGxhc3QgcG9pbnRcblx0XHRcdHRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7XG5cdFx0XHRwMyA9IHRtcDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHtcblxuXHRcdFx0Ly8gaW5pdCBDZW50cmlwZXRhbCAvIENob3JkYWwgQ2F0bXVsbC1Sb21cblx0XHRcdGNvbnN0IHBvdyA9IHRoaXMuY3VydmVUeXBlID09PSAnY2hvcmRhbCcgPyAwLjUgOiAwLjI1O1xuXHRcdFx0bGV0IGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7XG5cdFx0XHRsZXQgZHQxID0gTWF0aC5wb3coIHAxLmRpc3RhbmNlVG9TcXVhcmVkKCBwMiApLCBwb3cgKTtcblx0XHRcdGxldCBkdDIgPSBNYXRoLnBvdyggcDIuZGlzdGFuY2VUb1NxdWFyZWQoIHAzICksIHBvdyApO1xuXG5cdFx0XHQvLyBzYWZldHkgY2hlY2sgZm9yIHJlcGVhdGVkIHBvaW50c1xuXHRcdFx0aWYgKCBkdDEgPCAxZS00ICkgZHQxID0gMS4wO1xuXHRcdFx0aWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxO1xuXHRcdFx0aWYgKCBkdDIgPCAxZS00ICkgZHQyID0gZHQxO1xuXG5cdFx0XHRweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTtcblx0XHRcdHB5LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgZHQwLCBkdDEsIGR0MiApO1xuXHRcdFx0cHouaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCBkdDAsIGR0MSwgZHQyICk7XG5cblx0XHR9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkge1xuXG5cdFx0XHRweC5pbml0Q2F0bXVsbFJvbSggcDAueCwgcDEueCwgcDIueCwgcDMueCwgdGhpcy50ZW5zaW9uICk7XG5cdFx0XHRweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7XG5cdFx0XHRwei5pbml0Q2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgdGhpcy50ZW5zaW9uICk7XG5cblx0XHR9XG5cblx0XHRwb2ludC5zZXQoXG5cdFx0XHRweC5jYWxjKCB3ZWlnaHQgKSxcblx0XHRcdHB5LmNhbGMoIHdlaWdodCApLFxuXHRcdFx0cHouY2FsYyggd2VpZ2h0IClcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsb3NlZCA9IHNvdXJjZS5jbG9zZWQ7XG5cdFx0dGhpcy5jdXJ2ZVR5cGUgPSBzb3VyY2UuY3VydmVUeXBlO1xuXHRcdHRoaXMudGVuc2lvbiA9IHNvdXJjZS50ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IHRoaXMucG9pbnRzWyBpIF07XG5cdFx0XHRkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTtcblxuXHRcdH1cblxuXHRcdGRhdGEuY2xvc2VkID0gdGhpcy5jbG9zZWQ7XG5cdFx0ZGF0YS5jdXJ2ZVR5cGUgPSB0aGlzLmN1cnZlVHlwZTtcblx0XHRkYXRhLnRlbnNpb24gPSB0aGlzLnRlbnNpb247XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy5wb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTtcblx0XHRcdHRoaXMucG9pbnRzLnB1c2goIG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCBwb2ludCApICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkO1xuXHRcdHRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7XG5cdFx0dGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkNhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMyA9IHRydWU7XG5cbi8qKlxuICogQmV6aWVyIEN1cnZlcyBmb3JtdWxhcyBvYnRhaW5lZCBmcm9tXG4gKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JcdTAwRTl6aWVyX2N1cnZlXG4gKi9cblxuZnVuY3Rpb24gQ2F0bXVsbFJvbSggdCwgcDAsIHAxLCBwMiwgcDMgKSB7XG5cblx0Y29uc3QgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTtcblx0Y29uc3QgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTtcblx0Y29uc3QgdDIgPSB0ICogdDtcblx0Y29uc3QgdDMgPSB0ICogdDI7XG5cdHJldHVybiAoIDIgKiBwMSAtIDIgKiBwMiArIHYwICsgdjEgKSAqIHQzICsgKCAtIDMgKiBwMSArIDMgKiBwMiAtIDIgKiB2MCAtIHYxICkgKiB0MiArIHYwICogdCArIHAxO1xuXG59XG5cbi8vXG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAwKCB0LCBwICkge1xuXG5cdGNvbnN0IGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogcDtcblxufVxuXG5mdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRyZXR1cm4gMiAqICggMSAtIHQgKSAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyKCB0LCBwMCwgcDEsIHAyICkge1xuXG5cdHJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICtcblx0XHRRdWFkcmF0aWNCZXppZXJQMiggdCwgcDIgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBDdWJpY0JlemllclAwKCB0LCBwICkge1xuXG5cdGNvbnN0IGsgPSAxIC0gdDtcblx0cmV0dXJuIGsgKiBrICogayAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHtcblxuXHRjb25zdCBrID0gMSAtIHQ7XG5cdHJldHVybiAzICogayAqIGsgKiB0ICogcDtcblxufVxuXG5mdW5jdGlvbiBDdWJpY0JlemllclAyKCB0LCBwICkge1xuXG5cdHJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwO1xuXG59XG5cbmZ1bmN0aW9uIEN1YmljQmV6aWVyUDMoIHQsIHAgKSB7XG5cblx0cmV0dXJuIHQgKiB0ICogdCAqIHA7XG5cbn1cblxuZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkge1xuXG5cdHJldHVybiBDdWJpY0JlemllclAwKCB0LCBwMCApICsgQ3ViaWNCZXppZXJQMSggdCwgcDEgKSArIEN1YmljQmV6aWVyUDIoIHQsIHAyICkgK1xuXHRcdEN1YmljQmV6aWVyUDMoIHQsIHAzICk7XG5cbn1cblxuY2xhc3MgQ3ViaWNCZXppZXJDdXJ2ZSBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMigpLCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSwgdjMgPSBuZXcgVmVjdG9yMigpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlJztcblxuXHRcdHRoaXMudjAgPSB2MDtcblx0XHR0aGlzLnYxID0gdjE7XG5cdFx0dGhpcy52MiA9IHYyO1xuXHRcdHRoaXMudjMgPSB2MztcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7XG5cblx0XHRwb2ludC5zZXQoXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLFxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcG9pbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cdFx0dGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XG5cblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYzID0gdGhpcy52My50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cdFx0dGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5DdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBDdWJpY0JlemllckN1cnZlMyBleHRlbmRzIEN1cnZlIHtcblxuXHRjb25zdHJ1Y3RvciggdjAgPSBuZXcgVmVjdG9yMygpLCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSwgdjMgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDdWJpY0JlemllckN1cnZlMyc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2Mjtcblx0XHR0aGlzLnYzID0gdjM7XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0Y29uc3QgdjAgPSB0aGlzLnYwLCB2MSA9IHRoaXMudjEsIHYyID0gdGhpcy52MiwgdjMgPSB0aGlzLnYzO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0Q3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSxcblx0XHRcdEN1YmljQmV6aWVyKCB0LCB2MC55LCB2MS55LCB2Mi55LCB2My55ICksXG5cdFx0XHRDdWJpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiwgdjMueiApXG5cdFx0KTtcblxuXHRcdHJldHVybiBwb2ludDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblx0XHR0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7XG5cdFx0ZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpO1xuXHRcdGRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblx0XHR0aGlzLnYzLmZyb21BcnJheSgganNvbi52MyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuY2xhc3MgTGluZUN1cnZlIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IyKCksIHYyID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlJztcblxuXHRcdHRoaXMudjEgPSB2MTtcblx0XHR0aGlzLnYyID0gdjI7XG5cblx0fVxuXG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IyKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHQvLyBMaW5lIGN1cnZlIGlzIGxpbmVhciwgc28gd2UgY2FuIG92ZXJ3cml0ZSBkZWZhdWx0IGdldFBvaW50QXRcblx0Z2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTtcblxuXHR9XG5cblx0Z2V0VGFuZ2VudCggdCwgb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0XHRjb25zdCB0YW5nZW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTtcblxuXHRcdHRhbmdlbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0cmV0dXJuIHRhbmdlbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTtcblx0XHR0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBMaW5lQ3VydmUzIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MSA9IG5ldyBWZWN0b3IzKCksIHYyID0gbmV3IFZlY3RvcjMoKSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGluZUN1cnZlMyc7XG5cdFx0dGhpcy5pc0xpbmVDdXJ2ZTMgPSB0cnVlO1xuXG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cdGdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRjb25zdCBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0O1xuXG5cdFx0aWYgKCB0ID09PSAxICkge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7XG5cdFx0XHRwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblx0Ly8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0XG5cdGdldFBvaW50QXQoIHUsIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7XG5cblx0fVxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTtcblx0XHR0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIFF1YWRyYXRpY0JlemllckN1cnZlIGV4dGVuZHMgQ3VydmUge1xuXG5cdGNvbnN0cnVjdG9yKCB2MCA9IG5ldyBWZWN0b3IyKCksIHYxID0gbmV3IFZlY3RvcjIoKSwgdjIgPSBuZXcgVmVjdG9yMigpICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZSc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKVxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcG9pbnQ7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTtcblx0XHR0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApO1xuXHRcdHRoaXMudjIuY29weSggc291cmNlLnYyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS52MCA9IHRoaXMudjAudG9BcnJheSgpO1xuXHRcdGRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTtcblx0XHRkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHRzdXBlci5mcm9tSlNPTigganNvbiApO1xuXG5cdFx0dGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTtcblx0XHR0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApO1xuXHRcdHRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUgPSB0cnVlO1xuXG5jbGFzcyBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMgZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIHYwID0gbmV3IFZlY3RvcjMoKSwgdjEgPSBuZXcgVmVjdG9yMygpLCB2MiA9IG5ldyBWZWN0b3IzKCkgKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ1F1YWRyYXRpY0JlemllckN1cnZlMyc7XG5cblx0XHR0aGlzLnYwID0gdjA7XG5cdFx0dGhpcy52MSA9IHYxO1xuXHRcdHRoaXMudjIgPSB2MjtcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjMoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyO1xuXG5cdFx0cG9pbnQuc2V0KFxuXHRcdFx0UXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksXG5cdFx0XHRRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnkgKSxcblx0XHRcdFF1YWRyYXRpY0JlemllciggdCwgdjAueiwgdjEueiwgdjIueiApXG5cdFx0KTtcblxuXHRcdHJldHVybiBwb2ludDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApO1xuXHRcdHRoaXMudjEuY29weSggc291cmNlLnYxICk7XG5cdFx0dGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCk7XG5cblx0XHRkYXRhLnYwID0gdGhpcy52MC50b0FycmF5KCk7XG5cdFx0ZGF0YS52MSA9IHRoaXMudjEudG9BcnJheSgpO1xuXHRcdGRhdGEudjIgPSB0aGlzLnYyLnRvQXJyYXkoKTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLnYwLmZyb21BcnJheSgganNvbi52MCApO1xuXHRcdHRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7XG5cdFx0dGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5RdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTtcblxuY2xhc3MgU3BsaW5lQ3VydmUgZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoIHBvaW50cyA9IFtdICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdTcGxpbmVDdXJ2ZSc7XG5cblx0XHR0aGlzLnBvaW50cyA9IHBvaW50cztcblxuXHR9XG5cblx0Z2V0UG9pbnQoIHQsIG9wdGlvbmFsVGFyZ2V0ID0gbmV3IFZlY3RvcjIoKSApIHtcblxuXHRcdGNvbnN0IHBvaW50ID0gb3B0aW9uYWxUYXJnZXQ7XG5cblx0XHRjb25zdCBwb2ludHMgPSB0aGlzLnBvaW50cztcblx0XHRjb25zdCBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDtcblxuXHRcdGNvbnN0IGludFBvaW50ID0gTWF0aC5mbG9vciggcCApO1xuXHRcdGNvbnN0IHdlaWdodCA9IHAgLSBpbnRQb2ludDtcblxuXHRcdGNvbnN0IHAwID0gcG9pbnRzWyBpbnRQb2ludCA9PT0gMCA/IGludFBvaW50IDogaW50UG9pbnQgLSAxIF07XG5cdFx0Y29uc3QgcDEgPSBwb2ludHNbIGludFBvaW50IF07XG5cdFx0Y29uc3QgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdO1xuXHRcdGNvbnN0IHAzID0gcG9pbnRzWyBpbnRQb2ludCA+IHBvaW50cy5sZW5ndGggLSAzID8gcG9pbnRzLmxlbmd0aCAtIDEgOiBpbnRQb2ludCArIDIgXTtcblxuXHRcdHBvaW50LnNldChcblx0XHRcdENhdG11bGxSb20oIHdlaWdodCwgcDAueCwgcDEueCwgcDIueCwgcDMueCApLFxuXHRcdFx0Q2F0bXVsbFJvbSggd2VpZ2h0LCBwMC55LCBwMS55LCBwMi55LCBwMy55IClcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHBvaW50O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gc291cmNlLnBvaW50c1sgaSBdO1xuXG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS5wb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTtcblx0XHRcdGRhdGEucG9pbnRzLnB1c2goIHBvaW50LnRvQXJyYXkoKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMucG9pbnRzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBwb2ludCA9IGpzb24ucG9pbnRzWyBpIF07XG5cdFx0XHR0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblNwbGluZUN1cnZlLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlID0gdHJ1ZTtcblxudmFyIEN1cnZlcyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHtcblx0X19wcm90b19fOiBudWxsLFxuXHRBcmNDdXJ2ZTogQXJjQ3VydmUsXG5cdENhdG11bGxSb21DdXJ2ZTM6IENhdG11bGxSb21DdXJ2ZTMsXG5cdEN1YmljQmV6aWVyQ3VydmU6IEN1YmljQmV6aWVyQ3VydmUsXG5cdEN1YmljQmV6aWVyQ3VydmUzOiBDdWJpY0JlemllckN1cnZlMyxcblx0RWxsaXBzZUN1cnZlOiBFbGxpcHNlQ3VydmUsXG5cdExpbmVDdXJ2ZTogTGluZUN1cnZlLFxuXHRMaW5lQ3VydmUzOiBMaW5lQ3VydmUzLFxuXHRRdWFkcmF0aWNCZXppZXJDdXJ2ZTogUXVhZHJhdGljQmV6aWVyQ3VydmUsXG5cdFF1YWRyYXRpY0JlemllckN1cnZlMzogUXVhZHJhdGljQmV6aWVyQ3VydmUzLFxuXHRTcGxpbmVDdXJ2ZTogU3BsaW5lQ3VydmVcbn0pO1xuXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAqXHRDdXJ2ZWQgUGF0aCAtIGEgY3VydmUgcGF0aCBpcyBzaW1wbHkgYSBhcnJheSBvZiBjb25uZWN0ZWRcbiAqICBjdXJ2ZXMsIGJ1dCByZXRhaW5zIHRoZSBhcGkgb2YgYSBjdXJ2ZVxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5jbGFzcyBDdXJ2ZVBhdGggZXh0ZW5kcyBDdXJ2ZSB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7XG5cblx0XHR0aGlzLmN1cnZlcyA9IFtdO1xuXHRcdHRoaXMuYXV0b0Nsb3NlID0gZmFsc2U7IC8vIEF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBwYXRoXG5cblx0fVxuXG5cdGFkZCggY3VydmUgKSB7XG5cblx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZSApO1xuXG5cdH1cblxuXHRjbG9zZVBhdGgoKSB7XG5cblx0XHQvLyBBZGQgYSBsaW5lIGN1cnZlIGlmIHN0YXJ0IGFuZCBlbmQgb2YgbGluZXMgYXJlIG5vdCBjb25uZWN0ZWRcblx0XHRjb25zdCBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApO1xuXHRcdGNvbnN0IGVuZFBvaW50ID0gdGhpcy5jdXJ2ZXNbIHRoaXMuY3VydmVzLmxlbmd0aCAtIDEgXS5nZXRQb2ludCggMSApO1xuXG5cdFx0aWYgKCAhIHN0YXJ0UG9pbnQuZXF1YWxzKCBlbmRQb2ludCApICkge1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgTGluZUN1cnZlKCBlbmRQb2ludCwgc3RhcnRQb2ludCApICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIFRvIGdldCBhY2N1cmF0ZSBwb2ludCB3aXRoIHJlZmVyZW5jZSB0b1xuXHQvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsXG5cdC8vIGZvbGxvd2luZyBoYXMgdG8gYmUgZG9uZTpcblxuXHQvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duXG5cdC8vIDIuIExvY2F0ZSBhbmQgaWRlbnRpZnkgdHlwZSBvZiBjdXJ2ZVxuXHQvLyAzLiBHZXQgdCBmb3IgdGhlIGN1cnZlXG5cdC8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKVxuXG5cdGdldFBvaW50KCB0ICkge1xuXG5cdFx0Y29uc3QgZCA9IHQgKiB0aGlzLmdldExlbmd0aCgpO1xuXHRcdGNvbnN0IGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7XG5cdFx0bGV0IGkgPSAwO1xuXG5cdFx0Ly8gVG8gdGhpbmsgYWJvdXQgYm91bmRhcmllcyBwb2ludHMuXG5cblx0XHR3aGlsZSAoIGkgPCBjdXJ2ZUxlbmd0aHMubGVuZ3RoICkge1xuXG5cdFx0XHRpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGlmZiA9IGN1cnZlTGVuZ3Roc1sgaSBdIC0gZDtcblx0XHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHRcdGNvbnN0IHNlZ21lbnRMZW5ndGggPSBjdXJ2ZS5nZXRMZW5ndGgoKTtcblx0XHRcdFx0Y29uc3QgdSA9IHNlZ21lbnRMZW5ndGggPT09IDAgPyAwIDogMSAtIGRpZmYgLyBzZWdtZW50TGVuZ3RoO1xuXG5cdFx0XHRcdHJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KCB1ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aSArKztcblxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Ly8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkXG5cblx0fVxuXG5cdC8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW5cblx0Ly8gVEhSRUUuQ3VydmUsIGdldExlbmd0aCgpIGRlcGVuZHMgb24gZ2V0UG9pbnQoKSBidXQgaW4gVEhSRUUuQ3VydmVQYXRoXG5cdC8vIGdldFBvaW50KCkgZGVwZW5kcyBvbiBnZXRMZW5ndGhcblxuXHRnZXRMZW5ndGgoKSB7XG5cblx0XHRjb25zdCBsZW5zID0gdGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtcblx0XHRyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07XG5cblx0fVxuXG5cdC8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC5cblx0dXBkYXRlQXJjTGVuZ3RocygpIHtcblxuXHRcdHRoaXMubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdHRoaXMuY2FjaGVMZW5ndGhzID0gbnVsbDtcblx0XHR0aGlzLmdldEN1cnZlTGVuZ3RocygpO1xuXG5cdH1cblxuXHQvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW1cblx0Ly8gV2UgY2Fubm90IG92ZXJ3cml0ZSBnZXRMZW5ndGhzKCkgYmVjYXVzZSBVdG9UIG1hcHBpbmcgdXNlcyBpdC5cblxuXHRnZXRDdXJ2ZUxlbmd0aHMoKSB7XG5cblx0XHQvLyBXZSB1c2UgY2FjaGUgdmFsdWVzIGlmIGN1cnZlcyBhbmQgY2FjaGUgYXJyYXkgYXJlIHNhbWUgbGVuZ3RoXG5cblx0XHRpZiAoIHRoaXMuY2FjaGVMZW5ndGhzICYmIHRoaXMuY2FjaGVMZW5ndGhzLmxlbmd0aCA9PT0gdGhpcy5jdXJ2ZXMubGVuZ3RoICkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM7XG5cblx0XHR9XG5cblx0XHQvLyBHZXQgbGVuZ3RoIG9mIHN1Yi1jdXJ2ZVxuXHRcdC8vIFB1c2ggc3VtcyBpbnRvIGNhY2hlZCBhcnJheVxuXG5cdFx0Y29uc3QgbGVuZ3RocyA9IFtdO1xuXHRcdGxldCBzdW1zID0gMDtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHN1bXMgKz0gdGhpcy5jdXJ2ZXNbIGkgXS5nZXRMZW5ndGgoKTtcblx0XHRcdGxlbmd0aHMucHVzaCggc3VtcyApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYWNoZUxlbmd0aHMgPSBsZW5ndGhzO1xuXG5cdFx0cmV0dXJuIGxlbmd0aHM7XG5cblx0fVxuXG5cdGdldFNwYWNlZFBvaW50cyggZGl2aXNpb25zID0gNDAgKSB7XG5cblx0XHRjb25zdCBwb2ludHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCB0aGlzLmdldFBvaW50KCBpIC8gZGl2aXNpb25zICkgKTtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5hdXRvQ2xvc2UgKSB7XG5cblx0XHRcdHBvaW50cy5wdXNoKCBwb2ludHNbIDAgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvaW50cztcblxuXHR9XG5cblx0Z2V0UG9pbnRzKCBkaXZpc2lvbnMgPSAxMiApIHtcblxuXHRcdGNvbnN0IHBvaW50cyA9IFtdO1xuXHRcdGxldCBsYXN0O1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBjdXJ2ZXMgPSB0aGlzLmN1cnZlczsgaSA8IGN1cnZlcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGN1cnZlID0gY3VydmVzWyBpIF07XG5cdFx0XHRjb25zdCByZXNvbHV0aW9uID0gKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSApID8gZGl2aXNpb25zICogMlxuXHRcdFx0XHQ6ICggY3VydmUgJiYgKCBjdXJ2ZS5pc0xpbmVDdXJ2ZSB8fCBjdXJ2ZS5pc0xpbmVDdXJ2ZTMgKSApID8gMVxuXHRcdFx0XHRcdDogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlICkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoXG5cdFx0XHRcdFx0XHQ6IGRpdmlzaW9ucztcblxuXHRcdFx0Y29uc3QgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7XG5cblx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IHB0cy5sZW5ndGg7IGogKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgcG9pbnQgPSBwdHNbIGogXTtcblxuXHRcdFx0XHRpZiAoIGxhc3QgJiYgbGFzdC5lcXVhbHMoIHBvaW50ICkgKSBjb250aW51ZTsgLy8gZW5zdXJlcyBubyBjb25zZWN1dGl2ZSBwb2ludHMgYXJlIGR1cGxpY2F0ZXNcblxuXHRcdFx0XHRwb2ludHMucHVzaCggcG9pbnQgKTtcblx0XHRcdFx0bGFzdCA9IHBvaW50O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuYXV0b0Nsb3NlICYmIHBvaW50cy5sZW5ndGggPiAxICYmICEgcG9pbnRzWyBwb2ludHMubGVuZ3RoIC0gMSBdLmVxdWFscyggcG9pbnRzWyAwIF0gKSApIHtcblxuXHRcdFx0cG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9pbnRzO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBzb3VyY2UuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGN1cnZlID0gc291cmNlLmN1cnZlc1sgaSBdO1xuXG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBjdXJ2ZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IHNvdXJjZS5hdXRvQ2xvc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS5hdXRvQ2xvc2UgPSB0aGlzLmF1dG9DbG9zZTtcblx0XHRkYXRhLmN1cnZlcyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gdGhpcy5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgY3VydmUgPSB0aGlzLmN1cnZlc1sgaSBdO1xuXHRcdFx0ZGF0YS5jdXJ2ZXMucHVzaCggY3VydmUudG9KU09OKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxuXHRmcm9tSlNPTigganNvbiApIHtcblxuXHRcdHN1cGVyLmZyb21KU09OKCBqc29uICk7XG5cblx0XHR0aGlzLmF1dG9DbG9zZSA9IGpzb24uYXV0b0Nsb3NlO1xuXHRcdHRoaXMuY3VydmVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjdXJ2ZSA9IGpzb24uY3VydmVzWyBpIF07XG5cdFx0XHR0aGlzLmN1cnZlcy5wdXNoKCBuZXcgQ3VydmVzWyBjdXJ2ZS50eXBlIF0oKS5mcm9tSlNPTiggY3VydmUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIFBhdGggZXh0ZW5kcyBDdXJ2ZVBhdGgge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XG5cblx0XHRzdXBlcigpO1xuXHRcdHRoaXMudHlwZSA9ICdQYXRoJztcblxuXHRcdHRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdGlmICggcG9pbnRzICkge1xuXG5cdFx0XHR0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMubGluZVRvKCBwb2ludHNbIGkgXS54LCBwb2ludHNbIGkgXS55ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bW92ZVRvKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuc2V0KCB4LCB5ICk7IC8vIFRPRE8gY29uc2lkZXIgcmVmZXJlbmNpbmcgdmVjdG9ycyBpbnN0ZWFkIG9mIGNvcHlpbmc/XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bGluZVRvKCB4LCB5ICkge1xuXG5cdFx0Y29uc3QgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7XG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggeCwgeSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IFF1YWRyYXRpY0JlemllckN1cnZlKFxuXHRcdFx0dGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSxcblx0XHRcdG5ldyBWZWN0b3IyKCBhQ1B4LCBhQ1B5ICksXG5cdFx0XHRuZXcgVmVjdG9yMiggYVgsIGFZIClcblx0XHQpO1xuXG5cdFx0dGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEN1YmljQmV6aWVyQ3VydmUoXG5cdFx0XHR0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDF4LCBhQ1AxeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFDUDJ4LCBhQ1AyeSApLFxuXHRcdFx0bmV3IFZlY3RvcjIoIGFYLCBhWSApXG5cdFx0KTtcblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5zZXQoIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNwbGluZVRocnUoIHB0cyAvKkFycmF5IG9mIFZlY3RvciovICkge1xuXG5cdFx0Y29uc3QgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7XG5cblx0XHRjb25zdCBjdXJ2ZSA9IG5ldyBTcGxpbmVDdXJ2ZSggbnB0cyApO1xuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHR0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBwdHNbIHB0cy5sZW5ndGggLSAxIF0gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdGNvbnN0IHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDtcblx0XHRjb25zdCB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7XG5cblx0XHR0aGlzLmFic2FyYyggYVggKyB4MCwgYVkgKyB5MCwgYVJhZGl1cyxcblx0XHRcdGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhYnNhcmMoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHtcblxuXHRcdHRoaXMuYWJzZWxsaXBzZSggYVgsIGFZLCBhUmFkaXVzLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZWxsaXBzZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKSB7XG5cblx0XHRjb25zdCB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7XG5cdFx0Y29uc3QgeTAgPSB0aGlzLmN1cnJlbnRQb2ludC55O1xuXG5cdFx0dGhpcy5hYnNlbGxpcHNlKCBhWCArIHgwLCBhWSArIHkwLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRhYnNlbGxpcHNlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHtcblxuXHRcdGNvbnN0IGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTtcblxuXHRcdGlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Ly8gaWYgYSBwcmV2aW91cyBjdXJ2ZSBpcyBwcmVzZW50LCBhdHRlbXB0IHRvIGpvaW5cblx0XHRcdGNvbnN0IGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApO1xuXG5cdFx0XHRpZiAoICEgZmlyc3RQb2ludC5lcXVhbHMoIHRoaXMuY3VycmVudFBvaW50ICkgKSB7XG5cblx0XHRcdFx0dGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7XG5cblx0XHRjb25zdCBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApO1xuXHRcdHRoaXMuY3VycmVudFBvaW50LmNvcHkoIGxhc3RQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5jdXJyZW50UG9pbnQuY29weSggc291cmNlLmN1cnJlbnRQb2ludCApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHRvSlNPTigpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBzdXBlci50b0pTT04oKTtcblxuXHRcdGRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSgganNvbi5jdXJyZW50UG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5jbGFzcyBTaGFwZSBleHRlbmRzIFBhdGgge1xuXG5cdGNvbnN0cnVjdG9yKCBwb2ludHMgKSB7XG5cblx0XHRzdXBlciggcG9pbnRzICk7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnU2hhcGUnO1xuXG5cdFx0dGhpcy5ob2xlcyA9IFtdO1xuXG5cdH1cblxuXHRnZXRQb2ludHNIb2xlcyggZGl2aXNpb25zICkge1xuXG5cdFx0Y29uc3QgaG9sZXNQdHMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aG9sZXNQdHNbIGkgXSA9IHRoaXMuaG9sZXNbIGkgXS5nZXRQb2ludHMoIGRpdmlzaW9ucyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhvbGVzUHRzO1xuXG5cdH1cblxuXHQvLyBnZXQgcG9pbnRzIG9mIHNoYXBlIGFuZCBob2xlcyAoa2V5cG9pbnRzIGJhc2VkIG9uIHNlZ21lbnRzIHBhcmFtZXRlcilcblxuXHRleHRyYWN0UG9pbnRzKCBkaXZpc2lvbnMgKSB7XG5cblx0XHRyZXR1cm4ge1xuXG5cdFx0XHRzaGFwZTogdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApLFxuXHRcdFx0aG9sZXM6IHRoaXMuZ2V0UG9pbnRzSG9sZXMoIGRpdmlzaW9ucyApXG5cblx0XHR9O1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHNvdXJjZS5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBob2xlID0gc291cmNlLmhvbGVzWyBpIF07XG5cblx0XHRcdHRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9KU09OKCkge1xuXG5cdFx0Y29uc3QgZGF0YSA9IHN1cGVyLnRvSlNPTigpO1xuXG5cdFx0ZGF0YS51dWlkID0gdGhpcy51dWlkO1xuXHRcdGRhdGEuaG9sZXMgPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgaG9sZSA9IHRoaXMuaG9sZXNbIGkgXTtcblx0XHRcdGRhdGEuaG9sZXMucHVzaCggaG9sZS50b0pTT04oKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG5cdGZyb21KU09OKCBqc29uICkge1xuXG5cdFx0c3VwZXIuZnJvbUpTT04oIGpzb24gKTtcblxuXHRcdHRoaXMudXVpZCA9IGpzb24udXVpZDtcblx0XHR0aGlzLmhvbGVzID0gW107XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGhvbGUgPSBqc29uLmhvbGVzWyBpIF07XG5cdFx0XHR0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoKCkuZnJvbUpTT04oIGhvbGUgKSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIExpZ2h0IGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnTGlnaHQnO1xuXG5cdFx0dGhpcy5jb2xvciA9IG5ldyBDb2xvciggY29sb3IgKTtcblx0XHR0aGlzLmludGVuc2l0eSA9IGludGVuc2l0eTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApO1xuXHRcdHRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7XG5cdFx0ZGF0YS5vYmplY3QuaW50ZW5zaXR5ID0gdGhpcy5pbnRlbnNpdHk7XG5cblx0XHRpZiAoIHRoaXMuZ3JvdW5kQ29sb3IgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0Lmdyb3VuZENvbG9yID0gdGhpcy5ncm91bmRDb2xvci5nZXRIZXgoKTtcblxuXHRcdGlmICggdGhpcy5kaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGlzdGFuY2UgPSB0aGlzLmRpc3RhbmNlO1xuXHRcdGlmICggdGhpcy5hbmdsZSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuYW5nbGUgPSB0aGlzLmFuZ2xlO1xuXHRcdGlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5O1xuXHRcdGlmICggdGhpcy5wZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QucGVudW1icmEgPSB0aGlzLnBlbnVtYnJhO1xuXG5cdFx0aWYgKCB0aGlzLnNoYWRvdyAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3Quc2hhZG93ID0gdGhpcy5zaGFkb3cudG9KU09OKCk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuTGlnaHQucHJvdG90eXBlLmlzTGlnaHQgPSB0cnVlO1xuXG5jbGFzcyBIZW1pc3BoZXJlTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ICkge1xuXG5cdFx0c3VwZXIoIHNreUNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdIZW1pc3BoZXJlTGlnaHQnO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy5ncm91bmRDb2xvciA9IG5ldyBDb2xvciggZ3JvdW5kQ29sb3IgKTtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0TGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7XG5cblx0XHR0aGlzLmdyb3VuZENvbG9yLmNvcHkoIHNvdXJjZS5ncm91bmRDb2xvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkhlbWlzcGhlcmVMaWdodC5wcm90b3R5cGUuaXNIZW1pc3BoZXJlTGlnaHQgPSB0cnVlO1xuXG5jb25zdCBfcHJvalNjcmVlbk1hdHJpeCQxID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2xvb2tUYXJnZXQkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCBjYW1lcmEgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IGNhbWVyYTtcblxuXHRcdHRoaXMuYmlhcyA9IDA7XG5cdFx0dGhpcy5ub3JtYWxCaWFzID0gMDtcblx0XHR0aGlzLnJhZGl1cyA9IDE7XG5cblx0XHR0aGlzLm1hcFNpemUgPSBuZXcgVmVjdG9yMiggNTEyLCA1MTIgKTtcblxuXHRcdHRoaXMubWFwID0gbnVsbDtcblx0XHR0aGlzLm1hcFBhc3MgPSBudWxsO1xuXHRcdHRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTtcblxuXHRcdHRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7XG5cdFx0dGhpcy5uZWVkc1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5fZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7XG5cdFx0dGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTtcblxuXHRcdHRoaXMuX3ZpZXdwb3J0Q291bnQgPSAxO1xuXG5cdFx0dGhpcy5fdmlld3BvcnRzID0gW1xuXG5cdFx0XHRuZXcgVmVjdG9yNCggMCwgMCwgMSwgMSApXG5cblx0XHRdO1xuXG5cdH1cblxuXHRnZXRWaWV3cG9ydENvdW50KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7XG5cblx0fVxuXG5cdGdldEZydXN0dW0oKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJ1c3R1bTtcblxuXHR9XG5cblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0ICkge1xuXG5cdFx0Y29uc3Qgc2hhZG93Q2FtZXJhID0gdGhpcy5jYW1lcmE7XG5cdFx0Y29uc3Qgc2hhZG93TWF0cml4ID0gdGhpcy5tYXRyaXg7XG5cblx0XHRfbGlnaHRQb3NpdGlvbldvcmxkJDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdHNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkJDEgKTtcblxuXHRcdF9sb29rVGFyZ2V0JDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTtcblx0XHRzaGFkb3dDYW1lcmEubG9va0F0KCBfbG9va1RhcmdldCQxICk7XG5cdFx0c2hhZG93Q2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7XG5cblx0XHRfcHJvalNjcmVlbk1hdHJpeCQxLm11bHRpcGx5TWF0cmljZXMoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXgkMSApO1xuXG5cdFx0c2hhZG93TWF0cml4LnNldChcblx0XHRcdDAuNSwgMC4wLCAwLjAsIDAuNSxcblx0XHRcdDAuMCwgMC41LCAwLjAsIDAuNSxcblx0XHRcdDAuMCwgMC4wLCAwLjUsIDAuNSxcblx0XHRcdDAuMCwgMC4wLCAwLjAsIDEuMFxuXHRcdCk7XG5cblx0XHRzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7XG5cdFx0c2hhZG93TWF0cml4Lm11bHRpcGx5KCBzaGFkb3dDYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cblx0fVxuXG5cdGdldFZpZXdwb3J0KCB2aWV3cG9ydEluZGV4ICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1sgdmlld3BvcnRJbmRleCBdO1xuXG5cdH1cblxuXHRnZXRGcmFtZUV4dGVudHMoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHR0aGlzLmNhbWVyYSA9IHNvdXJjZS5jYW1lcmEuY2xvbmUoKTtcblxuXHRcdHRoaXMuYmlhcyA9IHNvdXJjZS5iaWFzO1xuXHRcdHRoaXMucmFkaXVzID0gc291cmNlLnJhZGl1cztcblxuXHRcdHRoaXMubWFwU2l6ZS5jb3B5KCBzb3VyY2UubWFwU2l6ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHR0b0pTT04oKSB7XG5cblx0XHRjb25zdCBvYmplY3QgPSB7fTtcblxuXHRcdGlmICggdGhpcy5iaWFzICE9PSAwICkgb2JqZWN0LmJpYXMgPSB0aGlzLmJpYXM7XG5cdFx0aWYgKCB0aGlzLm5vcm1hbEJpYXMgIT09IDAgKSBvYmplY3Qubm9ybWFsQmlhcyA9IHRoaXMubm9ybWFsQmlhcztcblx0XHRpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzO1xuXHRcdGlmICggdGhpcy5tYXBTaXplLnggIT09IDUxMiB8fCB0aGlzLm1hcFNpemUueSAhPT0gNTEyICkgb2JqZWN0Lm1hcFNpemUgPSB0aGlzLm1hcFNpemUudG9BcnJheSgpO1xuXG5cdFx0b2JqZWN0LmNhbWVyYSA9IHRoaXMuY2FtZXJhLnRvSlNPTiggZmFsc2UgKS5vYmplY3Q7XG5cdFx0ZGVsZXRlIG9iamVjdC5jYW1lcmEubWF0cml4O1xuXG5cdFx0cmV0dXJuIG9iamVjdDtcblxuXHR9XG5cbn1cblxuY2xhc3MgU3BvdExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggNTAsIDEsIDAuNSwgNTAwICkgKTtcblxuXHRcdHRoaXMuZm9jdXMgPSAxO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaWNlcyggbGlnaHQgKSB7XG5cblx0XHRjb25zdCBjYW1lcmEgPSB0aGlzLmNhbWVyYTtcblxuXHRcdGNvbnN0IGZvdiA9IE1hdGhVdGlscy5SQUQyREVHICogMiAqIGxpZ2h0LmFuZ2xlICogdGhpcy5mb2N1cztcblx0XHRjb25zdCBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0O1xuXHRcdGNvbnN0IGZhciA9IGxpZ2h0LmRpc3RhbmNlIHx8IGNhbWVyYS5mYXI7XG5cblx0XHRpZiAoIGZvdiAhPT0gY2FtZXJhLmZvdiB8fCBhc3BlY3QgIT09IGNhbWVyYS5hc3BlY3QgfHwgZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZm92ID0gZm92O1xuXHRcdFx0Y2FtZXJhLmFzcGVjdCA9IGFzcGVjdDtcblx0XHRcdGNhbWVyYS5mYXIgPSBmYXI7XG5cdFx0XHRjYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0fVxuXG5cdFx0c3VwZXIudXBkYXRlTWF0cmljZXMoIGxpZ2h0ICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5mb2N1cyA9IHNvdXJjZS5mb2N1cztcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5TcG90TGlnaHRTaGFkb3cucHJvdG90eXBlLmlzU3BvdExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgU3BvdExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG5cdGNvbnN0cnVjdG9yKCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSA9IDAsIGFuZ2xlID0gTWF0aC5QSSAvIDMsIHBlbnVtYnJhID0gMCwgZGVjYXkgPSAxICkge1xuXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdTcG90TGlnaHQnO1xuXG5cdFx0dGhpcy5wb3NpdGlvbi5jb3B5KCBPYmplY3QzRC5EZWZhdWx0VXAgKTtcblx0XHR0aGlzLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdFx0dGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gYW5nbGU7XG5cdFx0dGhpcy5wZW51bWJyYSA9IHBlbnVtYnJhO1xuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTsgLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgU3BvdExpZ2h0U2hhZG93KCk7XG5cblx0fVxuXG5cdGdldCBwb3dlcigpIHtcblxuXHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0cmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogTWF0aC5QSTtcblxuXHR9XG5cblx0c2V0IHBvd2VyKCBwb3dlciApIHtcblxuXHRcdC8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS5cblx0XHQvLyByZWY6IGVxdWF0aW9uICgxNykgZnJvbSBodHRwczovL3NlYmxhZ2FyZGUuZmlsZXMud29yZHByZXNzLmNvbS8yMDE1LzA3L2NvdXJzZV9ub3Rlc19tb3ZpbmdfZnJvc3RiaXRlX3RvX3Bicl92MzIucGRmXG5cdFx0dGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IHNvdXJjZS5kaXN0YW5jZTtcblx0XHR0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlO1xuXHRcdHRoaXMucGVudW1icmEgPSBzb3VyY2UucGVudW1icmE7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cbn1cblxuU3BvdExpZ2h0LnByb3RvdHlwZS5pc1Nwb3RMaWdodCA9IHRydWU7XG5cbmNvbnN0IF9wcm9qU2NyZWVuTWF0cml4ID0gLypAX19QVVJFX18qLyBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2xpZ2h0UG9zaXRpb25Xb3JsZCA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9sb29rVGFyZ2V0ID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBQb2ludExpZ2h0U2hhZG93IGV4dGVuZHMgTGlnaHRTaGFkb3cge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0c3VwZXIoIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTtcblxuXHRcdHRoaXMuX2ZyYW1lRXh0ZW50cyA9IG5ldyBWZWN0b3IyKCA0LCAyICk7XG5cblx0XHR0aGlzLl92aWV3cG9ydENvdW50ID0gNjtcblxuXHRcdHRoaXMuX3ZpZXdwb3J0cyA9IFtcblx0XHRcdC8vIFRoZXNlIHZpZXdwb3J0cyBtYXAgYSBjdWJlLW1hcCBvbnRvIGEgMkQgdGV4dHVyZSB3aXRoIHRoZVxuXHRcdFx0Ly8gZm9sbG93aW5nIG9yaWVudGF0aW9uOlxuXHRcdFx0Ly9cblx0XHRcdC8vICB4elhaXG5cdFx0XHQvLyAgIHkgWVxuXHRcdFx0Ly9cblx0XHRcdC8vIFggLSBQb3NpdGl2ZSB4IGRpcmVjdGlvblxuXHRcdFx0Ly8geCAtIE5lZ2F0aXZlIHggZGlyZWN0aW9uXG5cdFx0XHQvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb25cblx0XHRcdC8vIHkgLSBOZWdhdGl2ZSB5IGRpcmVjdGlvblxuXHRcdFx0Ly8gWiAtIFBvc2l0aXZlIHogZGlyZWN0aW9uXG5cdFx0XHQvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb25cblxuXHRcdFx0Ly8gcG9zaXRpdmUgWFxuXHRcdFx0bmV3IFZlY3RvcjQoIDIsIDEsIDEsIDEgKSxcblx0XHRcdC8vIG5lZ2F0aXZlIFhcblx0XHRcdG5ldyBWZWN0b3I0KCAwLCAxLCAxLCAxICksXG5cdFx0XHQvLyBwb3NpdGl2ZSBaXG5cdFx0XHRuZXcgVmVjdG9yNCggMywgMSwgMSwgMSApLFxuXHRcdFx0Ly8gbmVnYXRpdmUgWlxuXHRcdFx0bmV3IFZlY3RvcjQoIDEsIDEsIDEsIDEgKSxcblx0XHRcdC8vIHBvc2l0aXZlIFlcblx0XHRcdG5ldyBWZWN0b3I0KCAzLCAwLCAxLCAxICksXG5cdFx0XHQvLyBuZWdhdGl2ZSBZXG5cdFx0XHRuZXcgVmVjdG9yNCggMSwgMCwgMSwgMSApXG5cdFx0XTtcblxuXHRcdHRoaXMuX2N1YmVEaXJlY3Rpb25zID0gW1xuXHRcdFx0bmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFxuXHRcdFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgLSAxLCAwIClcblx0XHRdO1xuXG5cdFx0dGhpcy5fY3ViZVVwcyA9IFtcblx0XHRcdG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksXG5cdFx0XHRuZXcgVmVjdG9yMyggMCwgMSwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLFx0bmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApXG5cdFx0XTtcblxuXHR9XG5cblx0dXBkYXRlTWF0cmljZXMoIGxpZ2h0LCB2aWV3cG9ydEluZGV4ID0gMCApIHtcblxuXHRcdGNvbnN0IGNhbWVyYSA9IHRoaXMuY2FtZXJhO1xuXHRcdGNvbnN0IHNoYWRvd01hdHJpeCA9IHRoaXMubWF0cml4O1xuXG5cdFx0Y29uc3QgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjtcblxuXHRcdGlmICggZmFyICE9PSBjYW1lcmEuZmFyICkge1xuXG5cdFx0XHRjYW1lcmEuZmFyID0gZmFyO1xuXHRcdFx0Y2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuXHRcdH1cblxuXHRcdF9saWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdGNhbWVyYS5wb3NpdGlvbi5jb3B5KCBfbGlnaHRQb3NpdGlvbldvcmxkICk7XG5cblx0XHRfbG9va1RhcmdldC5jb3B5KCBjYW1lcmEucG9zaXRpb24gKTtcblx0XHRfbG9va1RhcmdldC5hZGQoIHRoaXMuX2N1YmVEaXJlY3Rpb25zWyB2aWV3cG9ydEluZGV4IF0gKTtcblx0XHRjYW1lcmEudXAuY29weSggdGhpcy5fY3ViZVVwc1sgdmlld3BvcnRJbmRleCBdICk7XG5cdFx0Y2FtZXJhLmxvb2tBdCggX2xvb2tUYXJnZXQgKTtcblx0XHRjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHNoYWRvd01hdHJpeC5tYWtlVHJhbnNsYXRpb24oIC0gX2xpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIF9saWdodFBvc2l0aW9uV29ybGQueSwgLSBfbGlnaHRQb3NpdGlvbldvcmxkLnogKTtcblxuXHRcdF9wcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7XG5cdFx0dGhpcy5fZnJ1c3R1bS5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggX3Byb2pTY3JlZW5NYXRyaXggKTtcblxuXHR9XG5cbn1cblxuUG9pbnRMaWdodFNoYWRvdy5wcm90b3R5cGUuaXNQb2ludExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgUG9pbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UgPSAwLCBkZWNheSA9IDEgKSB7XG5cblx0XHRzdXBlciggY29sb3IsIGludGVuc2l0eSApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHQnO1xuXG5cdFx0dGhpcy5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuXHRcdHRoaXMuZGVjYXkgPSBkZWNheTsgLy8gZm9yIHBoeXNpY2FsbHkgY29ycmVjdCBsaWdodHMsIHNob3VsZCBiZSAyLlxuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgUG9pbnRMaWdodFNoYWRvdygpO1xuXG5cdH1cblxuXHRnZXQgcG93ZXIoKSB7XG5cblx0XHQvLyBpbnRlbnNpdHkgPSBwb3dlciBwZXIgc29saWQgYW5nbGUuXG5cdFx0Ly8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZlxuXHRcdHJldHVybiB0aGlzLmludGVuc2l0eSAqIDQgKiBNYXRoLlBJO1xuXG5cdH1cblxuXHRzZXQgcG93ZXIoIHBvd2VyICkge1xuXG5cdFx0Ly8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLlxuXHRcdC8vIHJlZjogZXF1YXRpb24gKDE1KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGZcblx0XHR0aGlzLmludGVuc2l0eSA9IHBvd2VyIC8gKCA0ICogTWF0aC5QSSApO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBzb3VyY2UuZGlzdGFuY2U7XG5cdFx0dGhpcy5kZWNheSA9IHNvdXJjZS5kZWNheTtcblxuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cblBvaW50TGlnaHQucHJvdG90eXBlLmlzUG9pbnRMaWdodCA9IHRydWU7XG5cbmNsYXNzIE9ydGhvZ3JhcGhpY0NhbWVyYSBleHRlbmRzIENhbWVyYSB7XG5cblx0Y29uc3RydWN0b3IoIGxlZnQgPSAtIDEsIHJpZ2h0ID0gMSwgdG9wID0gMSwgYm90dG9tID0gLSAxLCBuZWFyID0gMC4xLCBmYXIgPSAyMDAwICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnO1xuXG5cdFx0dGhpcy56b29tID0gMTtcblx0XHR0aGlzLnZpZXcgPSBudWxsO1xuXG5cdFx0dGhpcy5sZWZ0ID0gbGVmdDtcblx0XHR0aGlzLnJpZ2h0ID0gcmlnaHQ7XG5cdFx0dGhpcy50b3AgPSB0b3A7XG5cdFx0dGhpcy5ib3R0b20gPSBib3R0b207XG5cblx0XHR0aGlzLm5lYXIgPSBuZWFyO1xuXHRcdHRoaXMuZmFyID0gZmFyO1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSwgcmVjdXJzaXZlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlLCByZWN1cnNpdmUgKTtcblxuXHRcdHRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0O1xuXHRcdHRoaXMucmlnaHQgPSBzb3VyY2UucmlnaHQ7XG5cdFx0dGhpcy50b3AgPSBzb3VyY2UudG9wO1xuXHRcdHRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTtcblx0XHR0aGlzLm5lYXIgPSBzb3VyY2UubmVhcjtcblx0XHR0aGlzLmZhciA9IHNvdXJjZS5mYXI7XG5cblx0XHR0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTtcblx0XHR0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRWaWV3T2Zmc2V0KCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0XHRpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy52aWV3ID0ge1xuXHRcdFx0XHRlbmFibGVkOiB0cnVlLFxuXHRcdFx0XHRmdWxsV2lkdGg6IDEsXG5cdFx0XHRcdGZ1bGxIZWlnaHQ6IDEsXG5cdFx0XHRcdG9mZnNldFg6IDAsXG5cdFx0XHRcdG9mZnNldFk6IDAsXG5cdFx0XHRcdHdpZHRoOiAxLFxuXHRcdFx0XHRoZWlnaHQ6IDFcblx0XHRcdH07XG5cblx0XHR9XG5cblx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7XG5cdFx0dGhpcy52aWV3LmZ1bGxXaWR0aCA9IGZ1bGxXaWR0aDtcblx0XHR0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7XG5cdFx0dGhpcy52aWV3Lm9mZnNldFggPSB4O1xuXHRcdHRoaXMudmlldy5vZmZzZXRZID0geTtcblx0XHR0aGlzLnZpZXcud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0O1xuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdGNsZWFyVmlld09mZnNldCgpIHtcblxuXHRcdGlmICggdGhpcy52aWV3ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLnZpZXcuZW5hYmxlZCA9IGZhbHNlO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG5cblx0fVxuXG5cdHVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSB7XG5cblx0XHRjb25zdCBkeCA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gKCAyICogdGhpcy56b29tICk7XG5cdFx0Y29uc3QgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApO1xuXHRcdGNvbnN0IGN4ID0gKCB0aGlzLnJpZ2h0ICsgdGhpcy5sZWZ0ICkgLyAyO1xuXHRcdGNvbnN0IGN5ID0gKCB0aGlzLnRvcCArIHRoaXMuYm90dG9tICkgLyAyO1xuXG5cdFx0bGV0IGxlZnQgPSBjeCAtIGR4O1xuXHRcdGxldCByaWdodCA9IGN4ICsgZHg7XG5cdFx0bGV0IHRvcCA9IGN5ICsgZHk7XG5cdFx0bGV0IGJvdHRvbSA9IGN5IC0gZHk7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHtcblxuXHRcdFx0Y29uc3Qgc2NhbGVXID0gKCB0aGlzLnJpZ2h0IC0gdGhpcy5sZWZ0ICkgLyB0aGlzLnZpZXcuZnVsbFdpZHRoIC8gdGhpcy56b29tO1xuXHRcdFx0Y29uc3Qgc2NhbGVIID0gKCB0aGlzLnRvcCAtIHRoaXMuYm90dG9tICkgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCAvIHRoaXMuem9vbTtcblxuXHRcdFx0bGVmdCArPSBzY2FsZVcgKiB0aGlzLnZpZXcub2Zmc2V0WDtcblx0XHRcdHJpZ2h0ID0gbGVmdCArIHNjYWxlVyAqIHRoaXMudmlldy53aWR0aDtcblx0XHRcdHRvcCAtPSBzY2FsZUggKiB0aGlzLnZpZXcub2Zmc2V0WTtcblx0XHRcdGJvdHRvbSA9IHRvcCAtIHNjYWxlSCAqIHRoaXMudmlldy5oZWlnaHQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXgubWFrZU9ydGhvZ3JhcGhpYyggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0aGlzLm5lYXIsIHRoaXMuZmFyICk7XG5cblx0XHR0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApLmludmVydCgpO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC56b29tID0gdGhpcy56b29tO1xuXHRcdGRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7XG5cdFx0ZGF0YS5vYmplY3QucmlnaHQgPSB0aGlzLnJpZ2h0O1xuXHRcdGRhdGEub2JqZWN0LnRvcCA9IHRoaXMudG9wO1xuXHRcdGRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tO1xuXHRcdGRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7XG5cdFx0ZGF0YS5vYmplY3QuZmFyID0gdGhpcy5mYXI7XG5cblx0XHRpZiAoIHRoaXMudmlldyAhPT0gbnVsbCApIGRhdGEub2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgdGhpcy52aWV3ICk7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuT3J0aG9ncmFwaGljQ2FtZXJhLnByb3RvdHlwZS5pc09ydGhvZ3JhcGhpY0NhbWVyYSA9IHRydWU7XG5cbmNsYXNzIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cgZXh0ZW5kcyBMaWdodFNoYWRvdyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlciggbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggLSA1LCA1LCA1LCAtIDUsIDAuNSwgNTAwICkgKTtcblxuXHR9XG5cbn1cblxuRGlyZWN0aW9uYWxMaWdodFNoYWRvdy5wcm90b3R5cGUuaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93ID0gdHJ1ZTtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApO1xuXHRcdHRoaXMudXBkYXRlTWF0cml4KCk7XG5cblx0XHR0aGlzLnRhcmdldCA9IG5ldyBPYmplY3QzRCgpO1xuXG5cdFx0dGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMudGFyZ2V0ID0gc291cmNlLnRhcmdldC5jbG9uZSgpO1xuXHRcdHRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbkRpcmVjdGlvbmFsTGlnaHQucHJvdG90eXBlLmlzRGlyZWN0aW9uYWxMaWdodCA9IHRydWU7XG5cbmNsYXNzIEFtYmllbnRMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSApIHtcblxuXHRcdHN1cGVyKCBjb2xvciwgaW50ZW5zaXR5ICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQW1iaWVudExpZ2h0JztcblxuXHR9XG5cbn1cblxuQW1iaWVudExpZ2h0LnByb3RvdHlwZS5pc0FtYmllbnRMaWdodCA9IHRydWU7XG5cbmNsYXNzIFJlY3RBcmVhTGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoID0gMTAsIGhlaWdodCA9IDEwICkge1xuXG5cdFx0c3VwZXIoIGNvbG9yLCBpbnRlbnNpdHkgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdSZWN0QXJlYUxpZ2h0JztcblxuXHRcdHRoaXMud2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodDtcblxuXHR9XG5cblx0Y29weSggc291cmNlICkge1xuXG5cdFx0c3VwZXIuY29weSggc291cmNlICk7XG5cblx0XHR0aGlzLndpZHRoID0gc291cmNlLndpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0ZGF0YS5vYmplY3QuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn1cblxuUmVjdEFyZWFMaWdodC5wcm90b3R5cGUuaXNSZWN0QXJlYUxpZ2h0ID0gdHJ1ZTtcblxuLyoqXG4gKiBQcmltYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG4gKlxuICogU2Vjb25kYXJ5IHJlZmVyZW5jZTpcbiAqICAgaHR0cHM6Ly93d3cucHBzbG9hbi5vcmcvcHVibGljYXRpb25zL1N0dXBpZFNIMzYucGRmXG4gKi9cblxuLy8gMy1iYW5kIFNIIGRlZmluZWQgYnkgOSBjb2VmZmljaWVudHNcblxuY2xhc3MgU3BoZXJpY2FsSGFybW9uaWNzMyB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLmNvZWZmaWNpZW50cyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHMucHVzaCggbmV3IFZlY3RvcjMoKSApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRzZXQoIGNvZWZmaWNpZW50cyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uY29weSggY29lZmZpY2llbnRzWyBpIF0gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR6ZXJvKCkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5zZXQoIDAsIDAsIDAgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHQvLyBnZXQgdGhlIHJhZGlhbmNlIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG5vcm1hbFxuXHQvLyB0YXJnZXQgaXMgYSBWZWN0b3IzXG5cdGdldEF0KCBub3JtYWwsIHRhcmdldCApIHtcblxuXHRcdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoXG5cblx0XHRjb25zdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xuXG5cdFx0Y29uc3QgY29lZmYgPSB0aGlzLmNvZWZmaWNpZW50cztcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuMjgyMDk1ICk7XG5cblx0XHQvLyBiYW5kIDFcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMSBdLCAwLjQ4ODYwMyAqIHkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMiBdLCAwLjQ4ODYwMyAqIHogKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgMyBdLCAwLjQ4ODYwMyAqIHggKTtcblxuXHRcdC8vIGJhbmQgMlxuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA0IF0sIDEuMDkyNTQ4ICogKCB4ICogeSApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDUgXSwgMS4wOTI1NDggKiAoIHkgKiB6ICkgKTtcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNiBdLCAwLjMxNTM5MiAqICggMy4wICogeiAqIHogLSAxLjAgKSApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA3IF0sIDEuMDkyNTQ4ICogKCB4ICogeiApICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDggXSwgMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKSApO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0Ly8gZ2V0IHRoZSBpcnJhZGlhbmNlIChyYWRpYW5jZSBjb252b2x2ZWQgd2l0aCBjb3NpbmUgbG9iZSkgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbm9ybWFsXG5cdC8vIHRhcmdldCBpcyBhIFZlY3RvcjNcblx0Ly8gaHR0cHM6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvcGFwZXJzL2Vudm1hcC9lbnZtYXAucGRmXG5cdGdldElycmFkaWFuY2VBdCggbm9ybWFsLCB0YXJnZXQgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcblxuXHRcdGNvbnN0IGNvZWZmID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHQvLyBiYW5kIDBcblx0XHR0YXJnZXQuY29weSggY29lZmZbIDAgXSApLm11bHRpcGx5U2NhbGFyKCAwLjg4NjIyNyApOyAvLyBcdTAzQzAgKiAwLjI4MjA5NVxuXG5cdFx0Ly8gYmFuZCAxXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDEgXSwgMi4wICogMC41MTE2NjQgKiB5ICk7IC8vICggMiAqIFx1MDNDMCAvIDMgKSAqIDAuNDg4NjAzXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDIgXSwgMi4wICogMC41MTE2NjQgKiB6ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDMgXSwgMi4wICogMC41MTE2NjQgKiB4ICk7XG5cblx0XHQvLyBiYW5kIDJcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNCBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB5ICk7IC8vICggXHUwM0MwIC8gNCApICogMS4wOTI1NDhcblx0XHR0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCBjb2VmZlsgNSBdLCAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6ICk7XG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDYgXSwgMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7IC8vICggXHUwM0MwIC8gNCApICogMC4zMTUzOTIgKiAzXG5cdFx0dGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggY29lZmZbIDcgXSwgMi4wICogMC40MjkwNDMgKiB4ICogeiApO1xuXHRcdHRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIGNvZWZmWyA4IF0sIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICkgKTsgLy8gKCBcdTAzQzAgLyA0ICkgKiAwLjU0NjI3NFxuXG5cdFx0cmV0dXJuIHRhcmdldDtcblxuXHR9XG5cblx0YWRkKCBzaCApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkKCBzaC5jb2VmZmljaWVudHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGFkZFNjYWxlZFNIKCBzaCwgcyApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0uYWRkU2NhbGVkVmVjdG9yKCBzaC5jb2VmZmljaWVudHNbIGkgXSwgcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNjYWxlKCBzICkge1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgOTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5jb2VmZmljaWVudHNbIGkgXS5tdWx0aXBseVNjYWxhciggcyApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGxlcnAoIHNoLCBhbHBoYSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuY29lZmZpY2llbnRzWyBpIF0ubGVycCggc2guY29lZmZpY2llbnRzWyBpIF0sIGFscGhhICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBzaCApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IDk7IGkgKysgKSB7XG5cblx0XHRcdGlmICggISB0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmVxdWFscyggc2guY29lZmZpY2llbnRzWyBpIF0gKSApIHtcblxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXG5cdH1cblxuXHRjb3B5KCBzaCApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldCggc2guY29lZmZpY2llbnRzICk7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxuXHRmcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS5mcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgKyAoIGkgKiAzICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0FycmF5KCBhcnJheSA9IFtdLCBvZmZzZXQgPSAwICkge1xuXG5cdFx0Y29uc3QgY29lZmZpY2llbnRzID0gdGhpcy5jb2VmZmljaWVudHM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA5OyBpICsrICkge1xuXG5cdFx0XHRjb2VmZmljaWVudHNbIGkgXS50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICsgKCBpICogMyApICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXk7XG5cblx0fVxuXG5cdC8vIGV2YWx1YXRlIHRoZSBiYXNpcyBmdW5jdGlvbnNcblx0Ly8gc2hCYXNpcyBpcyBhbiBBcnJheVsgOSBdXG5cdHN0YXRpYyBnZXRCYXNpc0F0KCBub3JtYWwsIHNoQmFzaXMgKSB7XG5cblx0XHQvLyBub3JtYWwgaXMgYXNzdW1lZCB0byBiZSB1bml0IGxlbmd0aFxuXG5cdFx0Y29uc3QgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejtcblxuXHRcdC8vIGJhbmQgMFxuXHRcdHNoQmFzaXNbIDAgXSA9IDAuMjgyMDk1O1xuXG5cdFx0Ly8gYmFuZCAxXG5cdFx0c2hCYXNpc1sgMSBdID0gMC40ODg2MDMgKiB5O1xuXHRcdHNoQmFzaXNbIDIgXSA9IDAuNDg4NjAzICogejtcblx0XHRzaEJhc2lzWyAzIF0gPSAwLjQ4ODYwMyAqIHg7XG5cblx0XHQvLyBiYW5kIDJcblx0XHRzaEJhc2lzWyA0IF0gPSAxLjA5MjU0OCAqIHggKiB5O1xuXHRcdHNoQmFzaXNbIDUgXSA9IDEuMDkyNTQ4ICogeSAqIHo7XG5cdFx0c2hCYXNpc1sgNiBdID0gMC4zMTUzOTIgKiAoIDMgKiB6ICogeiAtIDEgKTtcblx0XHRzaEJhc2lzWyA3IF0gPSAxLjA5MjU0OCAqIHggKiB6O1xuXHRcdHNoQmFzaXNbIDggXSA9IDAuNTQ2Mjc0ICogKCB4ICogeCAtIHkgKiB5ICk7XG5cblx0fVxuXG59XG5cblNwaGVyaWNhbEhhcm1vbmljczMucHJvdG90eXBlLmlzU3BoZXJpY2FsSGFybW9uaWNzMyA9IHRydWU7XG5cbmNsYXNzIExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodCB7XG5cblx0Y29uc3RydWN0b3IoIHNoID0gbmV3IFNwaGVyaWNhbEhhcm1vbmljczMoKSwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdFx0dGhpcy5zaCA9IHNoO1xuXG5cdH1cblxuXHRjb3B5KCBzb3VyY2UgKSB7XG5cblx0XHRzdXBlci5jb3B5KCBzb3VyY2UgKTtcblxuXHRcdHRoaXMuc2guY29weSggc291cmNlLnNoICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZnJvbUpTT04oIGpzb24gKSB7XG5cblx0XHR0aGlzLmludGVuc2l0eSA9IGpzb24uaW50ZW5zaXR5OyAvLyBUT0RPOiBNb3ZlIHRoaXMgYml0IHRvIExpZ2h0LmZyb21KU09OKCk7XG5cdFx0dGhpcy5zaC5mcm9tQXJyYXkoIGpzb24uc2ggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR0b0pTT04oIG1ldGEgKSB7XG5cblx0XHRjb25zdCBkYXRhID0gc3VwZXIudG9KU09OKCBtZXRhICk7XG5cblx0XHRkYXRhLm9iamVjdC5zaCA9IHRoaXMuc2gudG9BcnJheSgpO1xuXG5cdFx0cmV0dXJuIGRhdGE7XG5cblx0fVxuXG59XG5cbkxpZ2h0UHJvYmUucHJvdG90eXBlLmlzTGlnaHRQcm9iZSA9IHRydWU7XG5cbmNsYXNzIE1hdGVyaWFsTG9hZGVyIGV4dGVuZHMgTG9hZGVyIHtcblxuXHRjb25zdHJ1Y3RvciggbWFuYWdlciApIHtcblxuXHRcdHN1cGVyKCBtYW5hZ2VyICk7XG5cdFx0dGhpcy50ZXh0dXJlcyA9IHt9O1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzO1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHtcblxuXHRcdFx0aWYgKCB0ZXh0dXJlc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0ZXh0dXJlc1sgbmFtZSBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWF0ZXJpYWxzWyBqc29uLnR5cGUgXSgpO1xuXG5cdFx0aWYgKCBqc29uLnV1aWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnV1aWQgPSBqc29uLnV1aWQ7XG5cdFx0aWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7XG5cdFx0aWYgKCBqc29uLmNvbG9yICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuY29sb3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNvbG9yLnNldEhleCgganNvbi5jb2xvciApO1xuXHRcdGlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzO1xuXHRcdGlmICgganNvbi5tZXRhbG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1ldGFsbmVzcyA9IGpzb24ubWV0YWxuZXNzO1xuXHRcdGlmICgganNvbi5zaGVlbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hlZW4gPSBuZXcgQ29sb3IoKS5zZXRIZXgoIGpzb24uc2hlZW4gKTtcblx0XHRpZiAoIGpzb24uZW1pc3NpdmUgIT09IHVuZGVmaW5lZCAmJiBtYXRlcmlhbC5lbWlzc2l2ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmUuc2V0SGV4KCBqc29uLmVtaXNzaXZlICk7XG5cdFx0aWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgJiYgbWF0ZXJpYWwuc3BlY3VsYXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyLnNldEhleCgganNvbi5zcGVjdWxhciApO1xuXHRcdGlmICgganNvbi5zaGluaW5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNoaW5pbmVzcyA9IGpzb24uc2hpbmluZXNzO1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdCA9IGpzb24uY2xlYXJjb2F0O1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXRSb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyA9IGpzb24uY2xlYXJjb2F0Um91Z2huZXNzO1xuXHRcdGlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nO1xuXHRcdGlmICgganNvbi5mbGF0U2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLmZsYXRTaGFkaW5nO1xuXHRcdGlmICgganNvbi5ibGVuZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYmxlbmRpbmcgPSBqc29uLmJsZW5kaW5nO1xuXHRcdGlmICgganNvbi5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb21iaW5lID0ganNvbi5jb21iaW5lO1xuXHRcdGlmICgganNvbi5zaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaWRlID0ganNvbi5zaWRlO1xuXHRcdGlmICgganNvbi5zaGFkb3dTaWRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaGFkb3dTaWRlID0ganNvbi5zaGFkb3dTaWRlO1xuXHRcdGlmICgganNvbi5vcGFjaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5vcGFjaXR5ID0ganNvbi5vcGFjaXR5O1xuXHRcdGlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50O1xuXHRcdGlmICgganNvbi5hbHBoYVRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVGVzdCA9IGpzb24uYWxwaGFUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFRlc3QgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRlcHRoVGVzdCA9IGpzb24uZGVwdGhUZXN0O1xuXHRcdGlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlO1xuXHRcdGlmICgganNvbi5jb2xvcldyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb2xvcldyaXRlID0ganNvbi5jb2xvcldyaXRlO1xuXG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFdyaXRlID0ganNvbi5zdGVuY2lsV3JpdGU7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxXcml0ZU1hc2sgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxXcml0ZU1hc2sgPSBqc29uLnN0ZW5jaWxXcml0ZU1hc2s7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRnVuYyA9IGpzb24uc3RlbmNpbEZ1bmM7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxSZWYgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnN0ZW5jaWxSZWYgPSBqc29uLnN0ZW5jaWxSZWY7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGdW5jTWFzayAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbEZ1bmNNYXNrID0ganNvbi5zdGVuY2lsRnVuY01hc2s7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxGYWlsICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zdGVuY2lsRmFpbCA9IGpzb24uc3RlbmNpbEZhaWw7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaRmFpbCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpGYWlsID0ganNvbi5zdGVuY2lsWkZhaWw7XG5cdFx0aWYgKCBqc29uLnN0ZW5jaWxaUGFzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc3RlbmNpbFpQYXNzID0ganNvbi5zdGVuY2lsWlBhc3M7XG5cblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWUgPSBqc29uLndpcmVmcmFtZTtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZXdpZHRoICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5ld2lkdGggPSBqc29uLndpcmVmcmFtZUxpbmV3aWR0aDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDtcblx0XHRpZiAoIGpzb24ud2lyZWZyYW1lTGluZWpvaW4gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmVqb2luID0ganNvbi53aXJlZnJhbWVMaW5lam9pbjtcblxuXHRcdGlmICgganNvbi5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm90YXRpb24gPSBqc29uLnJvdGF0aW9uO1xuXG5cdFx0aWYgKCBqc29uLmxpbmV3aWR0aCAhPT0gMSApIG1hdGVyaWFsLmxpbmV3aWR0aCA9IGpzb24ubGluZXdpZHRoO1xuXHRcdGlmICgganNvbi5kYXNoU2l6ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGFzaFNpemUgPSBqc29uLmRhc2hTaXplO1xuXHRcdGlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplO1xuXHRcdGlmICgganNvbi5zY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2NhbGUgPSBqc29uLnNjYWxlO1xuXG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXQgPSBqc29uLnBvbHlnb25PZmZzZXQ7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3IgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnBvbHlnb25PZmZzZXRGYWN0b3IgPSBqc29uLnBvbHlnb25PZmZzZXRGYWN0b3I7XG5cdFx0aWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7XG5cblx0XHRpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZztcblx0XHRpZiAoIGpzb24ubW9ycGhUYXJnZXRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgPSBqc29uLm1vcnBoVGFyZ2V0cztcblx0XHRpZiAoIGpzb24ubW9ycGhOb3JtYWxzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tb3JwaE5vcm1hbHMgPSBqc29uLm1vcnBoTm9ybWFscztcblx0XHRpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZztcblxuXHRcdGlmICgganNvbi5hbHBoYVRvQ292ZXJhZ2UgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFscGhhVG9Db3ZlcmFnZSA9IGpzb24uYWxwaGFUb0NvdmVyYWdlO1xuXHRcdGlmICgganNvbi5wcmVtdWx0aXBsaWVkQWxwaGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSA9IGpzb24ucHJlbXVsdGlwbGllZEFscGhhO1xuXG5cdFx0aWYgKCBqc29uLnZlcnRleFRhbmdlbnRzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhUYW5nZW50cyA9IGpzb24udmVydGV4VGFuZ2VudHM7XG5cblx0XHRpZiAoIGpzb24udmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmlzaWJsZSA9IGpzb24udmlzaWJsZTtcblxuXHRcdGlmICgganNvbi50b25lTWFwcGVkICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50b25lTWFwcGVkID0ganNvbi50b25lTWFwcGVkO1xuXG5cdFx0aWYgKCBqc29uLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHRpZiAoIGpzb24udmVydGV4Q29sb3JzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGlmICggdHlwZW9mIGpzb24udmVydGV4Q29sb3JzID09PSAnbnVtYmVyJyApIHtcblxuXHRcdFx0XHRtYXRlcmlhbC52ZXJ0ZXhDb2xvcnMgPSAoIGpzb24udmVydGV4Q29sb3JzID4gMCApID8gdHJ1ZSA6IGZhbHNlO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdG1hdGVyaWFsLnZlcnRleENvbG9ycyA9IGpzb24udmVydGV4Q29sb3JzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBTaGFkZXIgTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi51bmlmb3JtcyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCBjb25zdCBuYW1lIGluIGpzb24udW5pZm9ybXMgKSB7XG5cblx0XHRcdFx0Y29uc3QgdW5pZm9ybSA9IGpzb24udW5pZm9ybXNbIG5hbWUgXTtcblxuXHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdID0ge307XG5cblx0XHRcdFx0c3dpdGNoICggdW5pZm9ybS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAndCc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gZ2V0VGV4dHVyZSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdjJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgQ29sb3IoKS5zZXRIZXgoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAndjInOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ3YzJzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICd2NCc6XG5cdFx0XHRcdFx0XHRtYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjQoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnbTMnOlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBNYXRyaXgzKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ200Jzpcblx0XHRcdFx0XHRcdG1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRcdFx0bWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IHVuaWZvcm0udmFsdWU7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGpzb24uZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVmaW5lcyA9IGpzb24uZGVmaW5lcztcblx0XHRpZiAoIGpzb24udmVydGV4U2hhZGVyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52ZXJ0ZXhTaGFkZXIgPSBqc29uLnZlcnRleFNoYWRlcjtcblx0XHRpZiAoIGpzb24uZnJhZ21lbnRTaGFkZXIgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyID0ganNvbi5mcmFnbWVudFNoYWRlcjtcblxuXHRcdGlmICgganNvbi5leHRlbnNpb25zICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGNvbnN0IGtleSBpbiBqc29uLmV4dGVuc2lvbnMgKSB7XG5cblx0XHRcdFx0bWF0ZXJpYWwuZXh0ZW5zaW9uc1sga2V5IF0gPSBqc29uLmV4dGVuc2lvbnNbIGtleSBdO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHQvLyBEZXByZWNhdGVkXG5cblx0XHRpZiAoIGpzb24uc2hhZGluZyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZmxhdFNoYWRpbmcgPSBqc29uLnNoYWRpbmcgPT09IDE7IC8vIFRIUkVFLkZsYXRTaGFkaW5nXG5cblx0XHQvLyBmb3IgUG9pbnRzTWF0ZXJpYWxcblxuXHRcdGlmICgganNvbi5zaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zaXplID0ganNvbi5zaXplO1xuXHRcdGlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uO1xuXG5cdFx0Ly8gbWFwc1xuXG5cdFx0aWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTtcblx0XHRpZiAoIGpzb24ubWF0Y2FwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tYXRjYXAgPSBnZXRUZXh0dXJlKCBqc29uLm1hdGNhcCApO1xuXG5cdFx0aWYgKCBqc29uLmFscGhhTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYU1hcCA9IGdldFRleHR1cmUoIGpzb24uYWxwaGFNYXAgKTtcblxuXHRcdGlmICgganNvbi5idW1wTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5idW1wTWFwID0gZ2V0VGV4dHVyZSgganNvbi5idW1wTWFwICk7XG5cdFx0aWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7XG5cblx0XHRpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApO1xuXHRcdGlmICgganNvbi5ub3JtYWxNYXBUeXBlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXBUeXBlID0ganNvbi5ub3JtYWxNYXBUeXBlO1xuXHRcdGlmICgganNvbi5ub3JtYWxTY2FsZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRsZXQgbm9ybWFsU2NhbGUgPSBqc29uLm5vcm1hbFNjYWxlO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIEJsZW5kZXIgZXhwb3J0ZXIgdXNlZCB0byBleHBvcnQgYSBzY2FsYXIuIFNlZSAjNzQ1OVxuXG5cdFx0XHRcdG5vcm1hbFNjYWxlID0gWyBub3JtYWxTY2FsZSwgbm9ybWFsU2NhbGUgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRtYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50U2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlID0ganNvbi5kaXNwbGFjZW1lbnRTY2FsZTtcblx0XHRpZiAoIGpzb24uZGlzcGxhY2VtZW50QmlhcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhcyA9IGpzb24uZGlzcGxhY2VtZW50QmlhcztcblxuXHRcdGlmICgganNvbi5yb3VnaG5lc3NNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzc01hcCA9IGdldFRleHR1cmUoIGpzb24ucm91Z2huZXNzTWFwICk7XG5cdFx0aWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTtcblxuXHRcdGlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7XG5cdFx0aWYgKCBqc29uLmVtaXNzaXZlSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSA9IGpzb24uZW1pc3NpdmVJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uc3BlY3VsYXJNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNwZWN1bGFyTWFwID0gZ2V0VGV4dHVyZSgganNvbi5zcGVjdWxhck1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmVudk1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW52TWFwID0gZ2V0VGV4dHVyZSgganNvbi5lbnZNYXAgKTtcblx0XHRpZiAoIGpzb24uZW52TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbnZNYXBJbnRlbnNpdHkgPSBqc29uLmVudk1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5yZWZsZWN0aXZpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZmxlY3Rpdml0eSA9IGpzb24ucmVmbGVjdGl2aXR5O1xuXHRcdGlmICgganNvbi5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvO1xuXG5cdFx0aWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTtcblx0XHRpZiAoIGpzb24ubGlnaHRNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5ID0ganNvbi5saWdodE1hcEludGVuc2l0eTtcblxuXHRcdGlmICgganNvbi5hb01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYW9NYXAgPSBnZXRUZXh0dXJlKCBqc29uLmFvTWFwICk7XG5cdFx0aWYgKCBqc29uLmFvTWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hb01hcEludGVuc2l0eSA9IGpzb24uYW9NYXBJbnRlbnNpdHk7XG5cblx0XHRpZiAoIGpzb24uZ3JhZGllbnRNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmdyYWRpZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5ncmFkaWVudE1hcCApO1xuXG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY2xlYXJjb2F0TWFwID0gZ2V0VGV4dHVyZSgganNvbi5jbGVhcmNvYXRNYXAgKTtcblx0XHRpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3NNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdFJvdWdobmVzc01hcCApO1xuXHRcdGlmICgganNvbi5jbGVhcmNvYXROb3JtYWxNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCA9IGdldFRleHR1cmUoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICk7XG5cdFx0aWYgKCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBqc29uLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7XG5cblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb24gPSBqc29uLnRyYW5zbWlzc2lvbjtcblx0XHRpZiAoIGpzb24udHJhbnNtaXNzaW9uTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC50cmFuc21pc3Npb25NYXAgPSBnZXRUZXh0dXJlKCBqc29uLnRyYW5zbWlzc2lvbk1hcCApO1xuXG5cdFx0cmV0dXJuIG1hdGVyaWFsO1xuXG5cdH1cblxuXHRzZXRUZXh0dXJlcyggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnRleHR1cmVzID0gdmFsdWU7XG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNvbnN0IExvYWRlclV0aWxzID0ge1xuXG5cdGRlY29kZVRleHQ6IGZ1bmN0aW9uICggYXJyYXkgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoIGFycmF5ICk7XG5cblx0XHR9XG5cblx0XHQvLyBBdm9pZCB0aGUgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgc2hvcnRjdXQsIHdoaWNoXG5cdFx0Ly8gdGhyb3dzIGEgXCJtYXhpbXVtIGNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiIGVycm9yIGZvciBsYXJnZSBhcnJheXMuXG5cblx0XHRsZXQgcyA9ICcnO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHQvLyBJbXBsaWNpdGx5IGFzc3VtZXMgbGl0dGxlLWVuZGlhbi5cblx0XHRcdHMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggYXJyYXlbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0dHJ5IHtcblxuXHRcdFx0Ly8gbWVyZ2VzIG11bHRpLWJ5dGUgdXRmLTggY2hhcmFjdGVycy5cblxuXHRcdFx0cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCggZXNjYXBlKCBzICkgKTtcblxuXHRcdH0gY2F0Y2ggKCBlICkgeyAvLyBzZWUgIzE2MzU4XG5cblx0XHRcdHJldHVybiBzO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0ZXh0cmFjdFVybEJhc2U6IGZ1bmN0aW9uICggdXJsICkge1xuXG5cdFx0Y29uc3QgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApO1xuXG5cdFx0aWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7XG5cblx0XHRyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7XG5cblx0fVxuXG59O1xuXG5mdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHtcblxuXHRCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy50eXBlID0gJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Jztcblx0dGhpcy5pbnN0YW5jZUNvdW50ID0gSW5maW5pdHk7XG5cbn1cblxuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksXG5cblx0aXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSxcblxuXHRjb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHtcblxuXHRcdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5pbnN0YW5jZUNvdW50ID0gc291cmNlLmluc3RhbmNlQ291bnQ7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fSxcblxuXHR0b0pTT046IGZ1bmN0aW9uICgpIHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTtcblxuXHRcdGRhdGEuaW5zdGFuY2VDb3VudCA9IHRoaXMuaW5zdGFuY2VDb3VudDtcblxuXHRcdGRhdGEuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA9IHRydWU7XG5cblx0XHRyZXR1cm4gZGF0YTtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7XG5cblx0aWYgKCB0eXBlb2YgKCBub3JtYWxpemVkICkgPT09ICdudW1iZXInICkge1xuXG5cdFx0bWVzaFBlckF0dHJpYnV0ZSA9IG5vcm1hbGl6ZWQ7XG5cblx0XHRub3JtYWxpemVkID0gZmFsc2U7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuJyApO1xuXG5cdH1cblxuXHRCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICksIHtcblxuXHRjb25zdHJ1Y3RvcjogSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlLFxuXG5cdGlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiB0cnVlLFxuXG5cdGNvcHk6IGZ1bmN0aW9uICggc291cmNlICkge1xuXG5cdFx0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApO1xuXG5cdFx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKClcdHtcblxuXHRcdGNvbnN0IGRhdGEgPSBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7XG5cblx0XHRkYXRhLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRkYXRhLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlID0gdHJ1ZTtcblxuXHRcdHJldHVybiBkYXRhO1xuXG5cdH1cblxufSApO1xuXG5jbGFzcyBCdWZmZXJHZW9tZXRyeUxvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTtcblx0XHRsb2FkZXIuc2V0UmVxdWVzdEhlYWRlciggc2NvcGUucmVxdWVzdEhlYWRlciApO1xuXHRcdGxvYWRlci5zZXRXaXRoQ3JlZGVudGlhbHMoIHNjb3BlLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXJNYXAgPSB7fTtcblx0XHRjb25zdCBhcnJheUJ1ZmZlck1hcCA9IHt9O1xuXG5cdFx0ZnVuY3Rpb24gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24sIHV1aWQgKSB7XG5cblx0XHRcdGlmICggaW50ZXJsZWF2ZWRCdWZmZXJNYXBbIHV1aWQgXSAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGludGVybGVhdmVkQnVmZmVyTWFwWyB1dWlkIF07XG5cblx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVycyA9IGpzb24uaW50ZXJsZWF2ZWRCdWZmZXJzO1xuXHRcdFx0Y29uc3QgaW50ZXJsZWF2ZWRCdWZmZXIgPSBpbnRlcmxlYXZlZEJ1ZmZlcnNbIHV1aWQgXTtcblxuXHRcdFx0Y29uc3QgYnVmZmVyID0gZ2V0QXJyYXlCdWZmZXIoIGpzb24sIGludGVybGVhdmVkQnVmZmVyLmJ1ZmZlciApO1xuXG5cdFx0XHRjb25zdCBhcnJheSA9IGdldFR5cGVkQXJyYXkoIGludGVybGVhdmVkQnVmZmVyLnR5cGUsIGJ1ZmZlciApO1xuXHRcdFx0Y29uc3QgaWIgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBpbnRlcmxlYXZlZEJ1ZmZlci5zdHJpZGUgKTtcblx0XHRcdGliLnV1aWQgPSBpbnRlcmxlYXZlZEJ1ZmZlci51dWlkO1xuXG5cdFx0XHRpbnRlcmxlYXZlZEJ1ZmZlck1hcFsgdXVpZCBdID0gaWI7XG5cblx0XHRcdHJldHVybiBpYjtcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldEFycmF5QnVmZmVyKCBqc29uLCB1dWlkICkge1xuXG5cdFx0XHRpZiAoIGFycmF5QnVmZmVyTWFwWyB1dWlkIF0gIT09IHVuZGVmaW5lZCApIHJldHVybiBhcnJheUJ1ZmZlck1hcFsgdXVpZCBdO1xuXG5cdFx0XHRjb25zdCBhcnJheUJ1ZmZlcnMgPSBqc29uLmFycmF5QnVmZmVycztcblx0XHRcdGNvbnN0IGFycmF5QnVmZmVyID0gYXJyYXlCdWZmZXJzWyB1dWlkIF07XG5cblx0XHRcdGNvbnN0IGFiID0gbmV3IFVpbnQzMkFycmF5KCBhcnJheUJ1ZmZlciApLmJ1ZmZlcjtcblxuXHRcdFx0YXJyYXlCdWZmZXJNYXBbIHV1aWQgXSA9IGFiO1xuXG5cdFx0XHRyZXR1cm4gYWI7XG5cblx0XHR9XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IGpzb24uaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSA/IG5ldyBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHRjb25zdCBpbmRleCA9IGpzb24uZGF0YS5pbmRleDtcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgdHlwZWRBcnJheSA9IGdldFR5cGVkQXJyYXkoIGluZGV4LnR5cGUsIGluZGV4LmFycmF5ICk7XG5cdFx0XHRnZW9tZXRyeS5zZXRJbmRleCggbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgMSApICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7XG5cblx0XHRmb3IgKCBjb25zdCBrZXkgaW4gYXR0cmlidXRlcyApIHtcblxuXHRcdFx0Y29uc3QgYXR0cmlidXRlID0gYXR0cmlidXRlc1sga2V5IF07XG5cdFx0XHRsZXQgYnVmZmVyQXR0cmlidXRlO1xuXG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVybGVhdmVkQnVmZmVyID0gZ2V0SW50ZXJsZWF2ZWRCdWZmZXIoIGpzb24uZGF0YSwgYXR0cmlidXRlLmRhdGEgKTtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUub2Zmc2V0LCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGNvbnN0IHR5cGVkQXJyYXkgPSBnZXRUeXBlZEFycmF5KCBhdHRyaWJ1dGUudHlwZSwgYXR0cmlidXRlLmFycmF5ICk7XG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciA9IGF0dHJpYnV0ZS5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA/IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSA6IEJ1ZmZlckF0dHJpYnV0ZTtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7XG5cdFx0XHRpZiAoIGF0dHJpYnV0ZS51c2FnZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLnNldFVzYWdlKCBhdHRyaWJ1dGUudXNhZ2UgKTtcblxuXHRcdFx0aWYgKCBhdHRyaWJ1dGUudXBkYXRlUmFuZ2UgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUudXBkYXRlUmFuZ2Uub2Zmc2V0ID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlLm9mZnNldDtcblx0XHRcdFx0YnVmZmVyQXR0cmlidXRlLnVwZGF0ZVJhbmdlLmNvdW50ID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlLmNvdW50O1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgga2V5LCBidWZmZXJBdHRyaWJ1dGUgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IG1vcnBoQXR0cmlidXRlcyA9IGpzb24uZGF0YS5tb3JwaEF0dHJpYnV0ZXM7XG5cblx0XHRpZiAoIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0Zm9yICggY29uc3Qga2V5IGluIG1vcnBoQXR0cmlidXRlcyApIHtcblxuXHRcdFx0XHRjb25zdCBhdHRyaWJ1dGVBcnJheSA9IG1vcnBoQXR0cmlidXRlc1sga2V5IF07XG5cblx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gYXR0cmlidXRlQXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVBcnJheVsgaSBdO1xuXHRcdFx0XHRcdGxldCBidWZmZXJBdHRyaWJ1dGU7XG5cblx0XHRcdFx0XHRpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkge1xuXG5cdFx0XHRcdFx0XHRjb25zdCBpbnRlcmxlYXZlZEJ1ZmZlciA9IGdldEludGVybGVhdmVkQnVmZmVyKCBqc29uLmRhdGEsIGF0dHJpYnV0ZS5kYXRhICk7XG5cdFx0XHRcdFx0XHRidWZmZXJBdHRyaWJ1dGUgPSBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5vZmZzZXQsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRjb25zdCB0eXBlZEFycmF5ID0gZ2V0VHlwZWRBcnJheSggYXR0cmlidXRlLnR5cGUsIGF0dHJpYnV0ZS5hcnJheSApO1xuXHRcdFx0XHRcdFx0YnVmZmVyQXR0cmlidXRlID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKCBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTtcblx0XHRcdFx0XHRhcnJheS5wdXNoKCBidWZmZXJBdHRyaWJ1dGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRjb25zdCBtb3JwaFRhcmdldHNSZWxhdGl2ZSA9IGpzb24uZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZTtcblxuXHRcdGlmICggbW9ycGhUYXJnZXRzUmVsYXRpdmUgKSB7XG5cblx0XHRcdGdlb21ldHJ5Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGdyb3VwcyA9IGpzb24uZGF0YS5ncm91cHMgfHwganNvbi5kYXRhLmRyYXdjYWxscyB8fCBqc29uLmRhdGEub2Zmc2V0cztcblxuXHRcdGlmICggZ3JvdXBzICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGdyb3Vwcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgZ3JvdXAgPSBncm91cHNbIGkgXTtcblxuXHRcdFx0XHRnZW9tZXRyeS5hZGRHcm91cCggZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4ICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IGJvdW5kaW5nU3BoZXJlID0ganNvbi5kYXRhLmJvdW5kaW5nU3BoZXJlO1xuXG5cdFx0aWYgKCBib3VuZGluZ1NwaGVyZSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0XHRpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNlbnRlci5mcm9tQXJyYXkoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSggY2VudGVyLCBib3VuZGluZ1NwaGVyZS5yYWRpdXMgKTtcblxuXHRcdH1cblxuXHRcdGlmICgganNvbi5uYW1lICkgZ2VvbWV0cnkubmFtZSA9IGpzb24ubmFtZTtcblx0XHRpZiAoIGpzb24udXNlckRhdGEgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7XG5cblx0XHRyZXR1cm4gZ2VvbWV0cnk7XG5cblx0fVxuXG59XG5cbmNsYXNzIE9iamVjdExvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IHBhdGggPSAoIHRoaXMucGF0aCA9PT0gJycgKSA/IExvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCB1cmwgKSA6IHRoaXMucGF0aDtcblx0XHR0aGlzLnJlc291cmNlUGF0aCA9IHRoaXMucmVzb3VyY2VQYXRoIHx8IHBhdGg7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHtcblxuXHRcdFx0bGV0IGpzb24gPSBudWxsO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlcnJvciApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgIT09IHVuZGVmaW5lZCApIG9uRXJyb3IoIGVycm9yICk7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXFwndCBwYXJzZSAnICsgdXJsICsgJy4nLCBlcnJvci5tZXNzYWdlICk7XG5cblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1ldGFkYXRhID0ganNvbi5tZXRhZGF0YTtcblxuXHRcdFx0aWYgKCBtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8IG1ldGFkYXRhLnR5cGUgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdnZW9tZXRyeScgKSB7XG5cblx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogQ2FuXFwndCBsb2FkICcgKyB1cmwgKTtcblx0XHRcdFx0cmV0dXJuO1xuXG5cdFx0XHR9XG5cblx0XHRcdHNjb3BlLnBhcnNlKCBqc29uLCBvbkxvYWQgKTtcblxuXHRcdH0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTtcblxuXHR9XG5cblx0cGFyc2UoIGpzb24sIG9uTG9hZCApIHtcblxuXHRcdGNvbnN0IGFuaW1hdGlvbnMgPSB0aGlzLnBhcnNlQW5pbWF0aW9ucygganNvbi5hbmltYXRpb25zICk7XG5cdFx0Y29uc3Qgc2hhcGVzID0gdGhpcy5wYXJzZVNoYXBlcygganNvbi5zaGFwZXMgKTtcblx0XHRjb25zdCBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7XG5cblx0XHRjb25zdCBpbWFnZXMgPSB0aGlzLnBhcnNlSW1hZ2VzKCBqc29uLmltYWdlcywgZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTtcblxuXHRcdH0gKTtcblxuXHRcdGNvbnN0IHRleHR1cmVzID0gdGhpcy5wYXJzZVRleHR1cmVzKCBqc29uLnRleHR1cmVzLCBpbWFnZXMgKTtcblx0XHRjb25zdCBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTtcblxuXHRcdGNvbnN0IG9iamVjdCA9IHRoaXMucGFyc2VPYmplY3QoIGpzb24ub2JqZWN0LCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMsIGFuaW1hdGlvbnMgKTtcblx0XHRjb25zdCBza2VsZXRvbnMgPSB0aGlzLnBhcnNlU2tlbGV0b25zKCBqc29uLnNrZWxldG9ucywgb2JqZWN0ICk7XG5cblx0XHR0aGlzLmJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICk7XG5cblx0XHQvL1xuXG5cdFx0aWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0bGV0IGhhc0ltYWdlcyA9IGZhbHNlO1xuXG5cdFx0XHRmb3IgKCBjb25zdCB1dWlkIGluIGltYWdlcyApIHtcblxuXHRcdFx0XHRpZiAoIGltYWdlc1sgdXVpZCBdIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCApIHtcblxuXHRcdFx0XHRcdGhhc0ltYWdlcyA9IHRydWU7XG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzSW1hZ2VzID09PSBmYWxzZSApIG9uTG9hZCggb2JqZWN0ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqZWN0O1xuXG5cdH1cblxuXHRwYXJzZVNoYXBlcygganNvbiApIHtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTtcblxuXHRcdFx0XHRzaGFwZXNbIHNoYXBlLnV1aWQgXSA9IHNoYXBlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gc2hhcGVzO1xuXG5cdH1cblxuXHRwYXJzZVNrZWxldG9ucygganNvbiwgb2JqZWN0ICkge1xuXG5cdFx0Y29uc3Qgc2tlbGV0b25zID0ge307XG5cdFx0Y29uc3QgYm9uZXMgPSB7fTtcblxuXHRcdC8vIGdlbmVyYXRlIGJvbmUgbG9va3VwIHRhYmxlXG5cblx0XHRvYmplY3QudHJhdmVyc2UoIGZ1bmN0aW9uICggY2hpbGQgKSB7XG5cblx0XHRcdGlmICggY2hpbGQuaXNCb25lICkgYm9uZXNbIGNoaWxkLnV1aWQgXSA9IGNoaWxkO1xuXG5cdFx0fSApO1xuXG5cdFx0Ly8gY3JlYXRlIHNrZWxldG9uc1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IG5ldyBTa2VsZXRvbigpLmZyb21KU09OKCBqc29uWyBpIF0sIGJvbmVzICk7XG5cblx0XHRcdFx0c2tlbGV0b25zWyBza2VsZXRvbi51dWlkIF0gPSBza2VsZXRvbjtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNrZWxldG9ucztcblxuXHR9XG5cblx0cGFyc2VHZW9tZXRyaWVzKCBqc29uLCBzaGFwZXMgKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyaWVzID0ge307XG5cdFx0bGV0IGdlb21ldHJ5U2hhcGVzO1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGJ1ZmZlckdlb21ldHJ5TG9hZGVyID0gbmV3IEJ1ZmZlckdlb21ldHJ5TG9hZGVyKCk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRsZXQgZ2VvbWV0cnk7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0JveEdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdCb3hCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLndpZHRoLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXB0aCxcblx0XHRcdFx0XHRcdFx0ZGF0YS53aWR0aFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRlcHRoU2VnbWVudHNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ2lyY2xlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU3RhcnQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1c1RvcCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXNCb3R0b20sXG5cdFx0XHRcdFx0XHRcdGRhdGEuaGVpZ2h0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGlhbFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodFNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wZW5FbmRlZCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YVN0YXJ0LFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhTGVuZ3RoXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0NvbmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnQ29uZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmhlaWdodCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5vcGVuRW5kZWQsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdTcGhlcmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnU3BoZXJlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEud2lkdGhTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5oZWlnaHRTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGgsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdEb2RlY2FoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0ljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmRldGFpbFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdSaW5nR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLmlubmVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm91dGVyUmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnRoZXRhU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucGhpU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudGhldGFTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS50aGV0YUxlbmd0aFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0dlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdUb3J1c0J1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaXVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnR1YmUsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLmFyY1xuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRjYXNlICdUb3J1c0tub3RHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVG9ydXNLbm90QnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpdXMsXG5cdFx0XHRcdFx0XHRcdGRhdGEudHViZSxcblx0XHRcdFx0XHRcdFx0ZGF0YS50dWJ1bGFyU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucmFkaWFsU2VnbWVudHMsXG5cdFx0XHRcdFx0XHRcdGRhdGEucCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5xXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1R1YmVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnVHViZUJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Ly8gVGhpcyBvbmx5IHdvcmtzIGZvciBidWlsdC1pbiBjdXJ2ZXMgKGUuZy4gQ2F0bXVsbFJvbUN1cnZlMykuXG5cdFx0XHRcdFx0XHQvLyBVc2VyIGRlZmluZWQgY3VydmVzIG9yIGluc3RhbmNlcyBvZiBDdXJ2ZVBhdGggd2lsbCBub3QgYmUgZGVzZXJpYWxpemVkLlxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdG5ldyBDdXJ2ZXNbIGRhdGEucGF0aC50eXBlIF0oKS5mcm9tSlNPTiggZGF0YS5wYXRoICksXG5cdFx0XHRcdFx0XHRcdGRhdGEudHVidWxhclNlZ21lbnRzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5yYWRpYWxTZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jbG9zZWRcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVHZW9tZXRyeSc6XG5cdFx0XHRcdFx0Y2FzZSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc6XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRkYXRhLnBvaW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5zZWdtZW50cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlTdGFydCxcblx0XHRcdFx0XHRcdFx0ZGF0YS5waGlMZW5ndGhcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnUG9seWhlZHJvbkdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXShcblx0XHRcdFx0XHRcdFx0ZGF0YS52ZXJ0aWNlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5pbmRpY2VzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLnJhZGl1cyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5kZXRhaWxzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKFxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyxcblx0XHRcdFx0XHRcdFx0ZGF0YS5jdXJ2ZVNlZ21lbnRzXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXG5cdFx0XHRcdFx0Y2FzZSAnRXh0cnVkZUdlb21ldHJ5Jzpcblx0XHRcdFx0XHRjYXNlICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOlxuXG5cdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcyA9IFtdO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gZGF0YS5zaGFwZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2hhcGUgPSBzaGFwZXNbIGRhdGEuc2hhcGVzWyBqIF0gXTtcblxuXHRcdFx0XHRcdFx0XHRnZW9tZXRyeVNoYXBlcy5wdXNoKCBzaGFwZSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IGV4dHJ1ZGVQYXRoID0gZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0ZGF0YS5vcHRpb25zLmV4dHJ1ZGVQYXRoID0gbmV3IEN1cnZlc1sgZXh0cnVkZVBhdGgudHlwZSBdKCkuZnJvbUpTT04oIGV4dHJ1ZGVQYXRoICk7XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oXG5cdFx0XHRcdFx0XHRcdGdlb21ldHJ5U2hhcGVzLFxuXHRcdFx0XHRcdFx0XHRkYXRhLm9wdGlvbnNcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0Y2FzZSAnQnVmZmVyR2VvbWV0cnknOlxuXHRcdFx0XHRcdGNhc2UgJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Z2VvbWV0cnkgPSBidWZmZXJHZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRcdGNhc2UgJ0dlb21ldHJ5JzpcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogTG9hZGluZyBcIkdlb21ldHJ5XCIgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlLicgKTtcblxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgXCInICsgZGF0YS50eXBlICsgJ1wiJyApO1xuXG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2VvbWV0cnkudXVpZCA9IGRhdGEudXVpZDtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTtcblx0XHRcdFx0aWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ID09PSB0cnVlICYmIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIGdlb21ldHJ5LnVzZXJEYXRhID0gZGF0YS51c2VyRGF0YTtcblxuXHRcdFx0XHRnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZ2VvbWV0cmllcztcblxuXHR9XG5cblx0cGFyc2VNYXRlcmlhbHMoIGpzb24sIHRleHR1cmVzICkge1xuXG5cdFx0Y29uc3QgY2FjaGUgPSB7fTsgLy8gTXVsdGlNYXRlcmlhbFxuXHRcdGNvbnN0IG1hdGVyaWFscyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGxvYWRlciA9IG5ldyBNYXRlcmlhbExvYWRlcigpO1xuXHRcdFx0bG9hZGVyLnNldFRleHR1cmVzKCB0ZXh0dXJlcyApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkge1xuXG5cdFx0XHRcdFx0Ly8gRGVwcmVjYXRlZFxuXG5cdFx0XHRcdFx0Y29uc3QgYXJyYXkgPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMDsgaiA8IGRhdGEubWF0ZXJpYWxzLmxlbmd0aDsgaiArKyApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgbWF0ZXJpYWwgPSBkYXRhLm1hdGVyaWFsc1sgaiBdO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZVsgbWF0ZXJpYWwudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGFycmF5LnB1c2goIGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBhcnJheTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0aWYgKCBjYWNoZVsgZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Y2FjaGVbIGRhdGEudXVpZCBdID0gbG9hZGVyLnBhcnNlKCBkYXRhICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRtYXRlcmlhbHNbIGRhdGEudXVpZCBdID0gY2FjaGVbIGRhdGEudXVpZCBdO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hdGVyaWFscztcblxuXHR9XG5cblx0cGFyc2VBbmltYXRpb25zKCBqc29uICkge1xuXG5cdFx0Y29uc3QgYW5pbWF0aW9ucyA9IHt9O1xuXG5cdFx0aWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBqc29uWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGRhdGEgKTtcblxuXHRcdFx0XHRhbmltYXRpb25zWyBjbGlwLnV1aWQgXSA9IGNsaXA7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBhbmltYXRpb25zO1xuXG5cdH1cblxuXHRwYXJzZUltYWdlcygganNvbiwgb25Mb2FkICkge1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXHRcdGNvbnN0IGltYWdlcyA9IHt9O1xuXG5cdFx0bGV0IGxvYWRlcjtcblxuXHRcdGZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHJldHVybiBsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgdW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXHRcdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgaW1hZ2UgPT09ICdzdHJpbmcnICkge1xuXG5cdFx0XHRcdGNvbnN0IHVybCA9IGltYWdlO1xuXG5cdFx0XHRcdGNvbnN0IHBhdGggPSAvXihcXC9cXC8pfChbYS16XSs6KFxcL1xcLyk/KS9pLnRlc3QoIHVybCApID8gdXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgdXJsO1xuXG5cdFx0XHRcdHJldHVybiBsb2FkSW1hZ2UoIHBhdGggKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIGltYWdlLmRhdGEgKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0ZGF0YTogZ2V0VHlwZWRBcnJheSggaW1hZ2UudHlwZSwgaW1hZ2UuZGF0YSApLFxuXHRcdFx0XHRcdFx0d2lkdGg6IGltYWdlLndpZHRoLFxuXHRcdFx0XHRcdFx0aGVpZ2h0OiBpbWFnZS5oZWlnaHRcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICYmIGpzb24ubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0Y29uc3QgbWFuYWdlciA9IG5ldyBMb2FkaW5nTWFuYWdlciggb25Mb2FkICk7XG5cblx0XHRcdGxvYWRlciA9IG5ldyBJbWFnZUxvYWRlciggbWFuYWdlciApO1xuXHRcdFx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGltYWdlID0ganNvblsgaSBdO1xuXHRcdFx0XHRjb25zdCB1cmwgPSBpbWFnZS51cmw7XG5cblx0XHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHtcblxuXHRcdFx0XHRcdC8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZVxuXG5cdFx0XHRcdFx0aW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGN1cnJlbnRVcmwgPSB1cmxbIGogXTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBjdXJyZW50VXJsICk7XG5cblx0XHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBkZXNlcmlhbGl6ZWRJbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBkZXNlcmlhbGl6ZWRJbWFnZSApO1xuXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBzcGVjaWFsIGNhc2U6IGhhbmRsZSBhcnJheSBvZiBkYXRhIHRleHR1cmVzIGZvciBjdWJlIHRleHR1cmVzXG5cblx0XHRcdFx0XHRcdFx0XHRpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBuZXcgRGF0YVRleHR1cmUoIGRlc2VyaWFsaXplZEltYWdlLmRhdGEsIGRlc2VyaWFsaXplZEltYWdlLndpZHRoLCBkZXNlcmlhbGl6ZWRJbWFnZS5oZWlnaHQgKSApO1xuXG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBsb2FkIHNpbmdsZSBpbWFnZVxuXG5cdFx0XHRcdFx0Y29uc3QgZGVzZXJpYWxpemVkSW1hZ2UgPSBkZXNlcmlhbGl6ZUltYWdlKCBpbWFnZS51cmwgKTtcblxuXHRcdFx0XHRcdGlmICggZGVzZXJpYWxpemVkSW1hZ2UgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0XHRcdGltYWdlc1sgaW1hZ2UudXVpZCBdID0gZGVzZXJpYWxpemVkSW1hZ2U7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gaW1hZ2VzO1xuXG5cdH1cblxuXHRwYXJzZVRleHR1cmVzKCBqc29uLCBpbWFnZXMgKSB7XG5cblx0XHRmdW5jdGlvbiBwYXJzZUNvbnN0YW50KCB2YWx1ZSwgdHlwZSApIHtcblxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlO1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VUZXh0dXJlOiBDb25zdGFudCBzaG91bGQgYmUgaW4gbnVtZXJpYyBmb3JtLicsIHZhbHVlICk7XG5cblx0XHRcdHJldHVybiB0eXBlWyB2YWx1ZSBdO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdGV4dHVyZXMgPSB7fTtcblxuXHRcdGlmICgganNvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGF0YSA9IGpzb25bIGkgXTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuaW1hZ2UgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogTm8gXCJpbWFnZVwiIHNwZWNpZmllZCBmb3InLCBkYXRhLnV1aWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgaW1hZ2UnLCBkYXRhLmltYWdlICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGxldCB0ZXh0dXJlO1xuXHRcdFx0XHRjb25zdCBpbWFnZSA9IGltYWdlc1sgZGF0YS5pbWFnZSBdO1xuXG5cdFx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggaW1hZ2UgKSApIHtcblxuXHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoIGltYWdlICk7XG5cblx0XHRcdFx0XHRpZiAoIGltYWdlLmxlbmd0aCA9PT0gNiApIHRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRpZiAoIGltYWdlICYmIGltYWdlLmRhdGEgKSB7XG5cblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGltYWdlLmRhdGEsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdHRleHR1cmUgPSBuZXcgVGV4dHVyZSggaW1hZ2UgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaW1hZ2UgKSB0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsgLy8gdGV4dHVyZXMgY2FuIGhhdmUgdW5kZWZpbmVkIGltYWdlIGRhdGFcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGV4dHVyZS51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0XHRcdGlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1hcHBpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFwcGluZyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWFwcGluZywgVEVYVFVSRV9NQVBQSU5HICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm9mZnNldCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5vZmZzZXQuZnJvbUFycmF5KCBkYXRhLm9mZnNldCApO1xuXHRcdFx0XHRpZiAoIGRhdGEucmVwZWF0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJlcGVhdC5mcm9tQXJyYXkoIGRhdGEucmVwZWF0ICk7XG5cdFx0XHRcdGlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnJvdGF0aW9uID0gZGF0YS5yb3RhdGlvbjtcblxuXHRcdFx0XHRpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cdFx0XHRcdFx0dGV4dHVyZS53cmFwVCA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMSBdLCBURVhUVVJFX1dSQVBQSU5HICk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7XG5cdFx0XHRcdGlmICggZGF0YS50eXBlICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnR5cGUgPSBkYXRhLnR5cGU7XG5cdFx0XHRcdGlmICggZGF0YS5lbmNvZGluZyAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5lbmNvZGluZyA9IGRhdGEuZW5jb2Rpbmc7XG5cblx0XHRcdFx0aWYgKCBkYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5taW5GaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1pbkZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLm1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5tYWdGaWx0ZXIgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hZ0ZpbHRlciwgVEVYVFVSRV9GSUxURVIgKTtcblx0XHRcdFx0aWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuZmxpcFkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZmxpcFkgPSBkYXRhLmZsaXBZO1xuXG5cdFx0XHRcdGlmICggZGF0YS5wcmVtdWx0aXBseUFscGhhICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnByZW11bHRpcGx5QWxwaGEgPSBkYXRhLnByZW11bHRpcGx5QWxwaGE7XG5cdFx0XHRcdGlmICggZGF0YS51bnBhY2tBbGlnbm1lbnQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudW5wYWNrQWxpZ25tZW50ID0gZGF0YS51bnBhY2tBbGlnbm1lbnQ7XG5cblx0XHRcdFx0dGV4dHVyZXNbIGRhdGEudXVpZCBdID0gdGV4dHVyZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRleHR1cmVzO1xuXG5cdH1cblxuXHRwYXJzZU9iamVjdCggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCBhbmltYXRpb25zICkge1xuXG5cdFx0bGV0IG9iamVjdDtcblxuXHRcdGZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkge1xuXG5cdFx0XHRpZiAoIGdlb21ldHJpZXNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBnZW9tZXRyaWVzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXRNYXRlcmlhbCggbmFtZSApIHtcblxuXHRcdFx0aWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRjb25zdCBhcnJheSA9IFtdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG5hbWUubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IHV1aWQgPSBuYW1lWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIG1hdGVyaWFsJywgdXVpZCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YXJyYXkucHVzaCggbWF0ZXJpYWxzWyB1dWlkIF0gKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGFycmF5O1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggbWF0ZXJpYWxzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0ZXJpYWxzWyBuYW1lIF07XG5cblx0XHR9XG5cblx0XHRsZXQgZ2VvbWV0cnksIG1hdGVyaWFsO1xuXG5cdFx0c3dpdGNoICggZGF0YS50eXBlICkge1xuXG5cdFx0XHRjYXNlICdTY2VuZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFNjZW5lKCk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmJhY2tncm91bmQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdGlmICggTnVtYmVyLmlzSW50ZWdlciggZGF0YS5iYWNrZ3JvdW5kICkgKSB7XG5cblx0XHRcdFx0XHRcdG9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yKCBkYXRhLmJhY2tncm91bmQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0aWYgKCBkYXRhLmZvZy50eXBlID09PSAnRm9nJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTtcblxuXHRcdFx0XHRcdH0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHtcblxuXHRcdFx0XHRcdFx0b2JqZWN0LmZvZyA9IG5ldyBGb2dFeHAyKCBkYXRhLmZvZy5jb2xvciwgZGF0YS5mb2cuZGVuc2l0eSApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggZGF0YS5mb3YsIGRhdGEuYXNwZWN0LCBkYXRhLm5lYXIsIGRhdGEuZmFyICk7XG5cblx0XHRcdFx0aWYgKCBkYXRhLmZvY3VzICE9PSB1bmRlZmluZWQgKSBvYmplY3QuZm9jdXMgPSBkYXRhLmZvY3VzO1xuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTtcblx0XHRcdFx0aWYgKCBkYXRhLmZpbG1PZmZzZXQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtT2Zmc2V0ID0gZGF0YS5maWxtT2Zmc2V0O1xuXHRcdFx0XHRpZiAoIGRhdGEudmlldyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpZXcgPSBPYmplY3QuYXNzaWduKCB7fSwgZGF0YS52aWV3ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ09ydGhvZ3JhcGhpY0NhbWVyYSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSggZGF0YS5sZWZ0LCBkYXRhLnJpZ2h0LCBkYXRhLnRvcCwgZGF0YS5ib3R0b20sIGRhdGEubmVhciwgZGF0YS5mYXIgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207XG5cdFx0XHRcdGlmICggZGF0YS52aWV3ICE9PSB1bmRlZmluZWQgKSBvYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCBkYXRhLnZpZXcgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnQW1iaWVudExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdEaXJlY3Rpb25hbExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgRGlyZWN0aW9uYWxMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRMaWdodCc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IFBvaW50TGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5LCBkYXRhLmRpc3RhbmNlLCBkYXRhLmRlY2F5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ1JlY3RBcmVhTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3BvdExpZ2h0JzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3BvdExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS5kaXN0YW5jZSwgZGF0YS5hbmdsZSwgZGF0YS5wZW51bWJyYSwgZGF0YS5kZWNheSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdIZW1pc3BoZXJlTGlnaHQnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBIZW1pc3BoZXJlTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuZ3JvdW5kQ29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0xpZ2h0UHJvYmUnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaWdodFByb2JlKCkuZnJvbUpTT04oIGRhdGEgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU2tpbm5lZE1lc2gnOlxuXG5cdFx0XHRcdGdlb21ldHJ5ID0gZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKTtcblx0XHRcdCBcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU2tpbm5lZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGlmICggZGF0YS5iaW5kTW9kZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmJpbmRNb2RlID0gZGF0YS5iaW5kTW9kZTtcblx0XHRcdFx0aWYgKCBkYXRhLmJpbmRNYXRyaXggIT09IHVuZGVmaW5lZCApIG9iamVjdC5iaW5kTWF0cml4LmZyb21BcnJheSggZGF0YS5iaW5kTWF0cml4ICk7XG5cdFx0XHRcdGlmICggZGF0YS5za2VsZXRvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNrZWxldG9uID0gZGF0YS5za2VsZXRvbjtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTWVzaCc6XG5cblx0XHRcdFx0Z2VvbWV0cnkgPSBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApO1xuXHRcdFx0XHRtYXRlcmlhbCA9IGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICk7XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdJbnN0YW5jZWRNZXNoJzpcblxuXHRcdFx0XHRnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7XG5cdFx0XHRcdG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTtcblx0XHRcdFx0Y29uc3QgY291bnQgPSBkYXRhLmNvdW50O1xuXHRcdFx0XHRjb25zdCBpbnN0YW5jZU1hdHJpeCA9IGRhdGEuaW5zdGFuY2VNYXRyaXg7XG5cdFx0XHRcdGNvbnN0IGluc3RhbmNlQ29sb3IgPSBkYXRhLmluc3RhbmNlQ29sb3I7XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEluc3RhbmNlZE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCwgY291bnQgKTtcblx0XHRcdFx0b2JqZWN0Lmluc3RhbmNlTWF0cml4ID0gbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggaW5zdGFuY2VNYXRyaXguYXJyYXkgKSwgMTYgKTtcblx0XHRcdFx0aWYgKCBpbnN0YW5jZUNvbG9yICE9PSB1bmRlZmluZWQgKSBvYmplY3QuaW5zdGFuY2VDb2xvciA9IG5ldyBCdWZmZXJBdHRyaWJ1dGUoIG5ldyBGbG9hdDMyQXJyYXkoIGluc3RhbmNlQ29sb3IuYXJyYXkgKSwgaW5zdGFuY2VDb2xvci5pdGVtU2l6ZSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMT0QnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMT0QoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IExpbmUoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnTGluZUxvb3AnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lTG9vcCggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlICdMaW5lU2VnbWVudHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnUG9pbnRDbG91ZCc6XG5cdFx0XHRjYXNlICdQb2ludHMnOlxuXG5cdFx0XHRcdG9iamVjdCA9IG5ldyBQb2ludHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnU3ByaXRlJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgU3ByaXRlKCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ0dyb3VwJzpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgR3JvdXAoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSAnQm9uZSc6XG5cblx0XHRcdFx0b2JqZWN0ID0gbmV3IEJvbmUoKTtcblxuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblxuXHRcdFx0XHRvYmplY3QgPSBuZXcgT2JqZWN0M0QoKTtcblxuXHRcdH1cblxuXHRcdG9iamVjdC51dWlkID0gZGF0YS51dWlkO1xuXG5cdFx0aWYgKCBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5uYW1lID0gZGF0YS5uYW1lO1xuXG5cdFx0aWYgKCBkYXRhLm1hdHJpeCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRvYmplY3QubWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTtcblxuXHRcdFx0aWYgKCBkYXRhLm1hdHJpeEF1dG9VcGRhdGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZGF0YS5tYXRyaXhBdXRvVXBkYXRlO1xuXHRcdFx0aWYgKCBvYmplY3QubWF0cml4QXV0b1VwZGF0ZSApIG9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBvYmplY3QucG9zaXRpb24sIG9iamVjdC5xdWF0ZXJuaW9uLCBvYmplY3Quc2NhbGUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdGlmICggZGF0YS5wb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnBvc2l0aW9uLmZyb21BcnJheSggZGF0YS5wb3NpdGlvbiApO1xuXHRcdFx0aWYgKCBkYXRhLnJvdGF0aW9uICE9PSB1bmRlZmluZWQgKSBvYmplY3Qucm90YXRpb24uZnJvbUFycmF5KCBkYXRhLnJvdGF0aW9uICk7XG5cdFx0XHRpZiAoIGRhdGEucXVhdGVybmlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnF1YXRlcm5pb24uZnJvbUFycmF5KCBkYXRhLnF1YXRlcm5pb24gKTtcblx0XHRcdGlmICggZGF0YS5zY2FsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNjYWxlLmZyb21BcnJheSggZGF0YS5zY2FsZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLmNhc3RTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5jYXN0U2hhZG93ID0gZGF0YS5jYXN0U2hhZG93O1xuXHRcdGlmICggZGF0YS5yZWNlaXZlU2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QucmVjZWl2ZVNoYWRvdyA9IGRhdGEucmVjZWl2ZVNoYWRvdztcblxuXHRcdGlmICggZGF0YS5zaGFkb3cgKSB7XG5cblx0XHRcdGlmICggZGF0YS5zaGFkb3cuYmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5iaWFzID0gZGF0YS5zaGFkb3cuYmlhcztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubm9ybWFsQmlhcyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5ub3JtYWxCaWFzID0gZGF0YS5zaGFkb3cubm9ybWFsQmlhcztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cucmFkaXVzICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LnJhZGl1cyA9IGRhdGEuc2hhZG93LnJhZGl1cztcblx0XHRcdGlmICggZGF0YS5zaGFkb3cubWFwU2l6ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheSggZGF0YS5zaGFkb3cubWFwU2l6ZSApO1xuXHRcdFx0aWYgKCBkYXRhLnNoYWRvdy5jYW1lcmEgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuY2FtZXJhID0gdGhpcy5wYXJzZU9iamVjdCggZGF0YS5zaGFkb3cuY2FtZXJhICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIGRhdGEudmlzaWJsZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnZpc2libGUgPSBkYXRhLnZpc2libGU7XG5cdFx0aWYgKCBkYXRhLmZydXN0dW1DdWxsZWQgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mcnVzdHVtQ3VsbGVkID0gZGF0YS5mcnVzdHVtQ3VsbGVkO1xuXHRcdGlmICggZGF0YS5yZW5kZXJPcmRlciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjtcblx0XHRpZiAoIGRhdGEudXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG9iamVjdC51c2VyRGF0YSA9IGRhdGEudXNlckRhdGE7XG5cdFx0aWYgKCBkYXRhLmxheWVycyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmxheWVycy5tYXNrID0gZGF0YS5sYXllcnM7XG5cblx0XHRpZiAoIGRhdGEuY2hpbGRyZW4gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBkYXRhLmNoaWxkcmVuO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0b2JqZWN0LmFkZCggdGhpcy5wYXJzZU9iamVjdCggY2hpbGRyZW5bIGkgXSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzLCBhbmltYXRpb25zICkgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLmFuaW1hdGlvbnMgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0QW5pbWF0aW9ucyA9IGRhdGEuYW5pbWF0aW9ucztcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgb2JqZWN0QW5pbWF0aW9ucy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdFx0Y29uc3QgdXVpZCA9IG9iamVjdEFuaW1hdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRvYmplY3QuYW5pbWF0aW9ucy5wdXNoKCBhbmltYXRpb25zWyB1dWlkIF0gKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCBkYXRhLnR5cGUgPT09ICdMT0QnICkge1xuXG5cdFx0XHRpZiAoIGRhdGEuYXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmF1dG9VcGRhdGUgPSBkYXRhLmF1dG9VcGRhdGU7XG5cblx0XHRcdGNvbnN0IGxldmVscyA9IGRhdGEubGV2ZWxzO1xuXG5cdFx0XHRmb3IgKCBsZXQgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGxldmVsID0gbGV2ZWxzWyBsIF07XG5cdFx0XHRcdGNvbnN0IGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7XG5cblx0XHRcdFx0aWYgKCBjaGlsZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0b2JqZWN0LmFkZExldmVsKCBjaGlsZCwgbGV2ZWwuZGlzdGFuY2UgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiBvYmplY3Q7XG5cblx0fVxuXG5cdGJpbmRTa2VsZXRvbnMoIG9iamVjdCwgc2tlbGV0b25zICkge1xuXG5cdFx0aWYgKCBPYmplY3Qua2V5cyggc2tlbGV0b25zICkubGVuZ3RoID09PSAwICkgcmV0dXJuO1xuXG5cdFx0b2JqZWN0LnRyYXZlcnNlKCBmdW5jdGlvbiAoIGNoaWxkICkge1xuXG5cdFx0XHRpZiAoIGNoaWxkLmlzU2tpbm5lZE1lc2ggPT09IHRydWUgJiYgY2hpbGQuc2tlbGV0b24gIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRjb25zdCBza2VsZXRvbiA9IHNrZWxldG9uc1sgY2hpbGQuc2tlbGV0b24gXTtcblxuXHRcdFx0XHRpZiAoIHNrZWxldG9uID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vIHNrZWxldG9uIGZvdW5kIHdpdGggVVVJRDonLCBjaGlsZC5za2VsZXRvbiApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRjaGlsZC5iaW5kKCBza2VsZXRvbiwgY2hpbGQuYmluZE1hdHJpeCApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSApO1xuXG5cdH1cblxuXHQvKiBERVBSRUNBVEVEICovXG5cblx0c2V0VGV4dHVyZVBhdGgoIHZhbHVlICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4nICk7XG5cdFx0cmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKCB2YWx1ZSApO1xuXG5cdH1cblxufVxuXG5jb25zdCBURVhUVVJFX01BUFBJTkcgPSB7XG5cdFVWTWFwcGluZzogVVZNYXBwaW5nLFxuXHRDdWJlUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVSZWZsZWN0aW9uTWFwcGluZyxcblx0Q3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsXG5cdEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZyxcblx0RXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLFxuXHRDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmcsXG5cdEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZ1xufTtcblxuY29uc3QgVEVYVFVSRV9XUkFQUElORyA9IHtcblx0UmVwZWF0V3JhcHBpbmc6IFJlcGVhdFdyYXBwaW5nLFxuXHRDbGFtcFRvRWRnZVdyYXBwaW5nOiBDbGFtcFRvRWRnZVdyYXBwaW5nLFxuXHRNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nXG59O1xuXG5jb25zdCBURVhUVVJFX0ZJTFRFUiA9IHtcblx0TmVhcmVzdEZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0TmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLFxuXHROZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLFxuXHRMaW5lYXJGaWx0ZXI6IExpbmVhckZpbHRlcixcblx0TGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcjogTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcixcblx0TGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXJcbn07XG5cbmZ1bmN0aW9uIEltYWdlQml0bWFwTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGlmICggdHlwZW9mIGNyZWF0ZUltYWdlQml0bWFwID09PSAndW5kZWZpbmVkJyApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBjcmVhdGVJbWFnZUJpdG1hcCgpIG5vdCBzdXBwb3J0ZWQuJyApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogZmV0Y2goKSBub3Qgc3VwcG9ydGVkLicgKTtcblxuXHR9XG5cblx0TG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTtcblxuXHR0aGlzLm9wdGlvbnMgPSB7IHByZW11bHRpcGx5QWxwaGE6ICdub25lJyB9O1xuXG59XG5cbkltYWdlQml0bWFwTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwge1xuXG5cdGNvbnN0cnVjdG9yOiBJbWFnZUJpdG1hcExvYWRlcixcblxuXHRpc0ltYWdlQml0bWFwTG9hZGVyOiB0cnVlLFxuXG5cdHNldE9wdGlvbnM6IGZ1bmN0aW9uIHNldE9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkge1xuXG5cdFx0aWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnO1xuXG5cdFx0aWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDtcblxuXHRcdHVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7XG5cblx0XHRpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0XHRcdHNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdFx0fSwgMCApO1xuXG5cdFx0XHRyZXR1cm4gY2FjaGVkO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZmV0Y2hPcHRpb25zID0ge307XG5cdFx0ZmV0Y2hPcHRpb25zLmNyZWRlbnRpYWxzID0gKCB0aGlzLmNyb3NzT3JpZ2luID09PSAnYW5vbnltb3VzJyApID8gJ3NhbWUtb3JpZ2luJyA6ICdpbmNsdWRlJztcblx0XHRmZXRjaE9wdGlvbnMuaGVhZGVycyA9IHRoaXMucmVxdWVzdEhlYWRlcjtcblxuXHRcdGZldGNoKCB1cmwsIGZldGNoT3B0aW9ucyApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkge1xuXG5cdFx0XHRyZXR1cm4gcmVzLmJsb2IoKTtcblxuXHRcdH0gKS50aGVuKCBmdW5jdGlvbiAoIGJsb2IgKSB7XG5cblx0XHRcdHJldHVybiBjcmVhdGVJbWFnZUJpdG1hcCggYmxvYiwgT2JqZWN0LmFzc2lnbiggc2NvcGUub3B0aW9ucywgeyBjb2xvclNwYWNlQ29udmVyc2lvbjogJ25vbmUnIH0gKSApO1xuXG5cdFx0fSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7XG5cblx0XHRcdENhY2hlLmFkZCggdXJsLCBpbWFnZUJpdG1hcCApO1xuXG5cdFx0XHRpZiAoIG9uTG9hZCApIG9uTG9hZCggaW1hZ2VCaXRtYXAgKTtcblxuXHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTtcblxuXHRcdH0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkge1xuXG5cdFx0XHRpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBlICk7XG5cblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTtcblx0XHRcdHNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7XG5cblx0XHR9ICk7XG5cblx0XHRzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7XG5cblx0fVxuXG59ICk7XG5cbmNsYXNzIFNoYXBlUGF0aCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLnR5cGUgPSAnU2hhcGVQYXRoJztcblxuXHRcdHRoaXMuY29sb3IgPSBuZXcgQ29sb3IoKTtcblxuXHRcdHRoaXMuc3ViUGF0aHMgPSBbXTtcblx0XHR0aGlzLmN1cnJlbnRQYXRoID0gbnVsbDtcblxuXHR9XG5cblx0bW92ZVRvKCB4LCB5ICkge1xuXG5cdFx0dGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoKCk7XG5cdFx0dGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7XG5cdFx0dGhpcy5jdXJyZW50UGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRsaW5lVG8oIHgsIHkgKSB7XG5cblx0XHR0aGlzLmN1cnJlbnRQYXRoLmxpbmVUbyggeCwgeSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGgucXVhZHJhdGljQ3VydmVUbyggYUNQeCwgYUNQeSwgYVgsIGFZICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0YmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguYmV6aWVyQ3VydmVUbyggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNwbGluZVRocnUoIHB0cyApIHtcblxuXHRcdHRoaXMuY3VycmVudFBhdGguc3BsaW5lVGhydSggcHRzICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dG9TaGFwZXMoIGlzQ0NXLCBub0hvbGVzICkge1xuXG5cdFx0ZnVuY3Rpb24gdG9TaGFwZXNOb0hvbGVzKCBpblN1YnBhdGhzICkge1xuXG5cdFx0XHRjb25zdCBzaGFwZXMgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IHRtcFBhdGggPSBpblN1YnBhdGhzWyBpIF07XG5cblx0XHRcdFx0Y29uc3QgdG1wU2hhcGUgPSBuZXcgU2hhcGUoKTtcblx0XHRcdFx0dG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7XG5cblx0XHRcdFx0c2hhcGVzLnB1c2goIHRtcFNoYXBlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGlzUG9pbnRJbnNpZGVQb2x5Z29uKCBpblB0LCBpblBvbHlnb24gKSB7XG5cblx0XHRcdGNvbnN0IHBvbHlMZW4gPSBpblBvbHlnb24ubGVuZ3RoO1xuXG5cdFx0XHQvLyBpblB0IG9uIHBvbHlnb24gY29udG91ciA9PiBpbW1lZGlhdGUgc3VjY2VzcyAgICBvclxuXHRcdFx0Ly8gdG9nZ2xpbmcgb2YgaW5zaWRlL291dHNpZGUgYXQgZXZlcnkgc2luZ2xlISBpbnRlcnNlY3Rpb24gcG9pbnQgb2YgYW4gZWRnZVxuXHRcdFx0Ly8gIHdpdGggdGhlIGhvcml6b250YWwgbGluZSB0aHJvdWdoIGluUHQsIGxlZnQgb2YgaW5QdFxuXHRcdFx0Ly8gIG5vdCBjb3VudGluZyBsb3dlclkgZW5kcG9pbnRzIG9mIGVkZ2VzIGFuZCB3aG9sZSBlZGdlcyBvbiB0aGF0IGxpbmVcblx0XHRcdGxldCBpbnNpZGUgPSBmYWxzZTtcblx0XHRcdGZvciAoIGxldCBwID0gcG9seUxlbiAtIDEsIHEgPSAwOyBxIDwgcG9seUxlbjsgcCA9IHEgKysgKSB7XG5cblx0XHRcdFx0bGV0IGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcCBdO1xuXHRcdFx0XHRsZXQgZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcSBdO1xuXG5cdFx0XHRcdGxldCBlZGdlRHggPSBlZGdlSGlnaFB0LnggLSBlZGdlTG93UHQueDtcblx0XHRcdFx0bGV0IGVkZ2VEeSA9IGVkZ2VIaWdoUHQueSAtIGVkZ2VMb3dQdC55O1xuXG5cdFx0XHRcdGlmICggTWF0aC5hYnMoIGVkZ2VEeSApID4gTnVtYmVyLkVQU0lMT04gKSB7XG5cblx0XHRcdFx0XHQvLyBub3QgcGFyYWxsZWxcblx0XHRcdFx0XHRpZiAoIGVkZ2VEeSA8IDAgKSB7XG5cblx0XHRcdFx0XHRcdGVkZ2VMb3dQdCA9IGluUG9seWdvblsgcSBdOyBlZGdlRHggPSAtIGVkZ2VEeDtcblx0XHRcdFx0XHRcdGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHAgXTsgZWRnZUR5ID0gLSBlZGdlRHk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoICggaW5QdC55IDwgZWRnZUxvd1B0LnkgKSB8fCAoIGluUHQueSA+IGVkZ2VIaWdoUHQueSApICkgXHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdFx0aWYgKCBpblB0LnkgPT09IGVkZ2VMb3dQdC55ICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIGluUHQueCA9PT0gZWRnZUxvd1B0LnggKVx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHQvLyBjb250aW51ZTtcdFx0XHRcdC8vIG5vIGludGVyc2VjdGlvbiBvciBlZGdlTG93UHQgPT4gZG9lc24ndCBjb3VudCAhISFcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHBlcnBFZGdlID0gZWRnZUR5ICogKCBpblB0LnggLSBlZGdlTG93UHQueCApIC0gZWRnZUR4ICogKCBpblB0LnkgLSBlZGdlTG93UHQueSApO1xuXHRcdFx0XHRcdFx0aWYgKCBwZXJwRWRnZSA9PT0gMCApXHRcdFx0XHRyZXR1cm5cdHRydWU7XHRcdC8vIGluUHQgaXMgb24gY29udG91ciA/XG5cdFx0XHRcdFx0XHRpZiAoIHBlcnBFZGdlIDwgMCApIFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHRpbnNpZGUgPSAhIGluc2lkZTtcdFx0Ly8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIHBhcmFsbGVsIG9yIGNvbGxpbmVhclxuXHRcdFx0XHRcdGlmICggaW5QdC55ICE9PSBlZGdlTG93UHQueSApIFx0XHRjb250aW51ZTtcdFx0XHQvLyBwYXJhbGxlbFxuXHRcdFx0XHRcdC8vIGVkZ2UgbGllcyBvbiB0aGUgc2FtZSBob3Jpem9udGFsIGxpbmUgYXMgaW5QdFxuXHRcdFx0XHRcdGlmICggKCAoIGVkZ2VIaWdoUHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlTG93UHQueCApICkgfHxcblx0XHRcdFx0XHRcdCAoICggZWRnZUxvd1B0LnggPD0gaW5QdC54ICkgJiYgKCBpblB0LnggPD0gZWRnZUhpZ2hQdC54ICkgKSApXHRcdHJldHVyblx0dHJ1ZTtcdC8vIGluUHQ6IFBvaW50IG9uIGNvbnRvdXIgIVxuXHRcdFx0XHRcdC8vIGNvbnRpbnVlO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm5cdGluc2lkZTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IGlzQ2xvY2tXaXNlID0gU2hhcGVVdGlscy5pc0Nsb2NrV2lzZTtcblxuXHRcdGNvbnN0IHN1YlBhdGhzID0gdGhpcy5zdWJQYXRocztcblx0XHRpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTtcblxuXHRcdGlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0bGV0IHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZTtcblx0XHRjb25zdCBzaGFwZXMgPSBbXTtcblxuXHRcdGlmICggc3ViUGF0aHMubGVuZ3RoID09PSAxICkge1xuXG5cdFx0XHR0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTtcblx0XHRcdHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7XG5cdFx0XHR0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblx0XHRcdHNoYXBlcy5wdXNoKCB0bXBTaGFwZSApO1xuXHRcdFx0cmV0dXJuIHNoYXBlcztcblxuXHRcdH1cblxuXHRcdGxldCBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApO1xuXHRcdGhvbGVzRmlyc3QgPSBpc0NDVyA/ICEgaG9sZXNGaXJzdCA6IGhvbGVzRmlyc3Q7XG5cblx0XHQvLyBjb25zb2xlLmxvZyhcIkhvbGVzIGZpcnN0XCIsIGhvbGVzRmlyc3QpO1xuXG5cdFx0Y29uc3QgYmV0dGVyU2hhcGVIb2xlcyA9IFtdO1xuXHRcdGNvbnN0IG5ld1NoYXBlcyA9IFtdO1xuXHRcdGxldCBuZXdTaGFwZUhvbGVzID0gW107XG5cdFx0bGV0IG1haW5JZHggPSAwO1xuXHRcdGxldCB0bXBQb2ludHM7XG5cblx0XHRuZXdTaGFwZXNbIG1haW5JZHggXSA9IHVuZGVmaW5lZDtcblx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdHRtcFBhdGggPSBzdWJQYXRoc1sgaSBdO1xuXHRcdFx0dG1wUG9pbnRzID0gdG1wUGF0aC5nZXRQb2ludHMoKTtcblx0XHRcdHNvbGlkID0gaXNDbG9ja1dpc2UoIHRtcFBvaW50cyApO1xuXHRcdFx0c29saWQgPSBpc0NDVyA/ICEgc29saWQgOiBzb2xpZDtcblxuXHRcdFx0aWYgKCBzb2xpZCApIHtcblxuXHRcdFx0XHRpZiAoICggISBob2xlc0ZpcnN0ICkgJiYgKCBuZXdTaGFwZXNbIG1haW5JZHggXSApIClcdG1haW5JZHggKys7XG5cblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0gPSB7IHM6IG5ldyBTaGFwZSgpLCBwOiB0bXBQb2ludHMgfTtcblx0XHRcdFx0bmV3U2hhcGVzWyBtYWluSWR4IF0ucy5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlcztcblxuXHRcdFx0XHRpZiAoIGhvbGVzRmlyc3QgKVx0bWFpbklkeCArKztcblx0XHRcdFx0bmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY3cnLCBpKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRuZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0ucHVzaCggeyBoOiB0bXBQYXRoLCBwOiB0bXBQb2ludHNbIDAgXSB9ICk7XG5cblx0XHRcdFx0Ly9jb25zb2xlLmxvZygnY2N3JywgaSk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vIG9ubHkgSG9sZXM/IC0+IHByb2JhYmx5IGFsbCBTaGFwZXMgd2l0aCB3cm9uZyBvcmllbnRhdGlvblxuXHRcdGlmICggISBuZXdTaGFwZXNbIDAgXSApXHRyZXR1cm5cdHRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTtcblxuXG5cdFx0aWYgKCBuZXdTaGFwZXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0bGV0IGFtYmlndW91cyA9IGZhbHNlO1xuXHRcdFx0Y29uc3QgdG9DaGFuZ2UgPSBbXTtcblxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0YmV0dGVyU2hhcGVIb2xlc1sgc0lkeCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggbGV0IHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7XG5cblx0XHRcdFx0Y29uc3Qgc2hvID0gbmV3U2hhcGVIb2xlc1sgc0lkeCBdO1xuXG5cdFx0XHRcdGZvciAoIGxldCBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7XG5cblx0XHRcdFx0XHRjb25zdCBobyA9IHNob1sgaElkeCBdO1xuXHRcdFx0XHRcdGxldCBob2xlX3VuYXNzaWduZWQgPSB0cnVlO1xuXG5cdFx0XHRcdFx0Zm9yICggbGV0IHMySWR4ID0gMDsgczJJZHggPCBuZXdTaGFwZXMubGVuZ3RoOyBzMklkeCArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBpc1BvaW50SW5zaWRlUG9seWdvbiggaG8ucCwgbmV3U2hhcGVzWyBzMklkeCBdLnAgKSApIHtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHNJZHggIT09IHMySWR4IClcdHRvQ2hhbmdlLnB1c2goIHsgZnJvbXM6IHNJZHgsIHRvczogczJJZHgsIGhvbGU6IGhJZHggfSApO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdGhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdGJldHRlclNoYXBlSG9sZXNbIHMySWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0YW1iaWd1b3VzID0gdHJ1ZTtcblxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggaG9sZV91bmFzc2lnbmVkICkge1xuXG5cdFx0XHRcdFx0XHRiZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdC8vIGNvbnNvbGUubG9nKFwiYW1iaWd1b3VzOiBcIiwgYW1iaWd1b3VzKTtcblxuXHRcdFx0aWYgKCB0b0NoYW5nZS5sZW5ndGggPiAwICkge1xuXG5cdFx0XHRcdC8vIGNvbnNvbGUubG9nKFwidG8gY2hhbmdlOiBcIiwgdG9DaGFuZ2UpO1xuXHRcdFx0XHRpZiAoICEgYW1iaWd1b3VzIClcdG5ld1NoYXBlSG9sZXMgPSBiZXR0ZXJTaGFwZUhvbGVzO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRsZXQgdG1wSG9sZXM7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGlsID0gbmV3U2hhcGVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkge1xuXG5cdFx0XHR0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7XG5cdFx0XHRzaGFwZXMucHVzaCggdG1wU2hhcGUgKTtcblx0XHRcdHRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdO1xuXG5cdFx0XHRmb3IgKCBsZXQgaiA9IDAsIGpsID0gdG1wSG9sZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7XG5cblx0XHRcdFx0dG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdC8vY29uc29sZS5sb2coXCJzaGFwZVwiLCBzaGFwZXMpO1xuXG5cdFx0cmV0dXJuIHNoYXBlcztcblxuXHR9XG5cbn1cblxuY2xhc3MgRm9udCB7XG5cblx0Y29uc3RydWN0b3IoIGRhdGEgKSB7XG5cblx0XHR0aGlzLnR5cGUgPSAnRm9udCc7XG5cblx0XHR0aGlzLmRhdGEgPSBkYXRhO1xuXG5cdH1cblxuXHRnZW5lcmF0ZVNoYXBlcyggdGV4dCwgc2l6ZSA9IDEwMCApIHtcblxuXHRcdGNvbnN0IHNoYXBlcyA9IFtdO1xuXHRcdGNvbnN0IHBhdGhzID0gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIHRoaXMuZGF0YSApO1xuXG5cdFx0Zm9yICggbGV0IHAgPSAwLCBwbCA9IHBhdGhzLmxlbmd0aDsgcCA8IHBsOyBwICsrICkge1xuXG5cdFx0XHRBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiBzaGFwZXM7XG5cblx0fVxuXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCBkYXRhICkge1xuXG5cdGNvbnN0IGNoYXJzID0gQXJyYXkuZnJvbSggdGV4dCApO1xuXHRjb25zdCBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247XG5cdGNvbnN0IGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7XG5cblx0Y29uc3QgcGF0aHMgPSBbXTtcblxuXHRsZXQgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwO1xuXG5cdGZvciAoIGxldCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdGNvbnN0IGNoYXIgPSBjaGFyc1sgaSBdO1xuXG5cdFx0aWYgKCBjaGFyID09PSAnXFxuJyApIHtcblxuXHRcdFx0b2Zmc2V0WCA9IDA7XG5cdFx0XHRvZmZzZXRZIC09IGxpbmVfaGVpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3QgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKTtcblx0XHRcdG9mZnNldFggKz0gcmV0Lm9mZnNldFg7XG5cdFx0XHRwYXRocy5wdXNoKCByZXQucGF0aCApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRyZXR1cm4gcGF0aHM7XG5cbn1cblxuZnVuY3Rpb24gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKSB7XG5cblx0Y29uc3QgZ2x5cGggPSBkYXRhLmdseXBoc1sgY2hhciBdIHx8IGRhdGEuZ2x5cGhzWyAnPycgXTtcblxuXHRpZiAoICEgZ2x5cGggKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRm9udDogY2hhcmFjdGVyIFwiJyArIGNoYXIgKyAnXCIgZG9lcyBub3QgZXhpc3RzIGluIGZvbnQgZmFtaWx5ICcgKyBkYXRhLmZhbWlseU5hbWUgKyAnLicgKTtcblxuXHRcdHJldHVybjtcblxuXHR9XG5cblx0Y29uc3QgcGF0aCA9IG5ldyBTaGFwZVBhdGgoKTtcblxuXHRsZXQgeCwgeSwgY3B4LCBjcHksIGNweDEsIGNweTEsIGNweDIsIGNweTI7XG5cblx0aWYgKCBnbHlwaC5vICkge1xuXG5cdFx0Y29uc3Qgb3V0bGluZSA9IGdseXBoLl9jYWNoZWRPdXRsaW5lIHx8ICggZ2x5cGguX2NhY2hlZE91dGxpbmUgPSBnbHlwaC5vLnNwbGl0KCAnICcgKSApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBsID0gb3V0bGluZS5sZW5ndGg7IGkgPCBsOyApIHtcblxuXHRcdFx0Y29uc3QgYWN0aW9uID0gb3V0bGluZVsgaSArKyBdO1xuXG5cdFx0XHRzd2l0Y2ggKCBhY3Rpb24gKSB7XG5cblx0XHRcdFx0Y2FzZSAnbSc6IC8vIG1vdmVUb1xuXG5cdFx0XHRcdFx0eCA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHR5ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5tb3ZlVG8oIHgsIHkgKTtcblxuXHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdGNhc2UgJ2wnOiAvLyBsaW5lVG9cblxuXHRcdFx0XHRcdHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7XG5cdFx0XHRcdFx0eSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblxuXHRcdFx0XHRcdHBhdGgubGluZVRvKCB4LCB5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdxJzogLy8gcXVhZHJhdGljQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cblx0XHRcdFx0XHRwYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGNweDEsIGNweTEsIGNweCwgY3B5ICk7XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRjYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUb1xuXG5cdFx0XHRcdFx0Y3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTtcblx0XHRcdFx0XHRjcHgxID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYO1xuXHRcdFx0XHRcdGNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7XG5cdFx0XHRcdFx0Y3B4MiA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDtcblx0XHRcdFx0XHRjcHkyID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRZO1xuXG5cdFx0XHRcdFx0cGF0aC5iZXppZXJDdXJ2ZVRvKCBjcHgxLCBjcHkxLCBjcHgyLCBjcHkyLCBjcHgsIGNweSApO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0cmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9O1xuXG59XG5cbkZvbnQucHJvdG90eXBlLmlzRm9udCA9IHRydWU7XG5cbmNsYXNzIEZvbnRMb2FkZXIgZXh0ZW5kcyBMb2FkZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBtYW5hZ2VyICkge1xuXG5cdFx0c3VwZXIoIG1hbmFnZXIgKTtcblxuXHR9XG5cblx0bG9hZCggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7XG5cblx0XHRjb25zdCBzY29wZSA9IHRoaXM7XG5cblx0XHRjb25zdCBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggdGhpcy5tYW5hZ2VyICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCBzY29wZS53aXRoQ3JlZGVudGlhbHMgKTtcblx0XHRsb2FkZXIubG9hZCggdXJsLCBmdW5jdGlvbiAoIHRleHQgKSB7XG5cblx0XHRcdGxldCBqc29uO1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0ICk7XG5cblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkZvbnRMb2FkZXI6IHR5cGVmYWNlLmpzIHN1cHBvcnQgaXMgYmVpbmcgZGVwcmVjYXRlZC4gVXNlIHR5cGVmYWNlLmpzb24gaW5zdGVhZC4nICk7XG5cdFx0XHRcdGpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgZm9udCA9IHNjb3BlLnBhcnNlKCBqc29uICk7XG5cblx0XHRcdGlmICggb25Mb2FkICkgb25Mb2FkKCBmb250ICk7XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG5cdHBhcnNlKCBqc29uICkge1xuXG5cdFx0cmV0dXJuIG5ldyBGb250KCBqc29uICk7XG5cblx0fVxuXG59XG5cbmxldCBfY29udGV4dDtcblxuY29uc3QgQXVkaW9Db250ZXh0ID0ge1xuXG5cdGdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGlmICggX2NvbnRleHQgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0X2NvbnRleHQgPSBuZXcgKCB3aW5kb3cuQXVkaW9Db250ZXh0IHx8IHdpbmRvdy53ZWJraXRBdWRpb0NvbnRleHQgKSgpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIF9jb250ZXh0O1xuXG5cdH0sXG5cblx0c2V0Q29udGV4dDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdF9jb250ZXh0ID0gdmFsdWU7XG5cblx0fVxuXG59O1xuXG5jbGFzcyBBdWRpb0xvYWRlciBleHRlbmRzIExvYWRlciB7XG5cblx0Y29uc3RydWN0b3IoIG1hbmFnZXIgKSB7XG5cblx0XHRzdXBlciggbWFuYWdlciApO1xuXG5cdH1cblxuXHRsb2FkKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdGNvbnN0IGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTtcblx0XHRsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7XG5cdFx0bG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApO1xuXHRcdGxvYWRlci5zZXRSZXF1ZXN0SGVhZGVyKCB0aGlzLnJlcXVlc3RIZWFkZXIgKTtcblx0XHRsb2FkZXIuc2V0V2l0aENyZWRlbnRpYWxzKCB0aGlzLndpdGhDcmVkZW50aWFscyApO1xuXHRcdGxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0XHR0cnkge1xuXG5cdFx0XHRcdC8vIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGJ1ZmZlci4gVGhlIGBkZWNvZGVBdWRpb0RhdGFgIG1ldGhvZFxuXHRcdFx0XHQvLyBkZXRhY2hlcyB0aGUgYnVmZmVyIHdoZW4gY29tcGxldGUsIHByZXZlbnRpbmcgcmV1c2UuXG5cdFx0XHRcdGNvbnN0IGJ1ZmZlckNvcHkgPSBidWZmZXIuc2xpY2UoIDAgKTtcblxuXHRcdFx0XHRjb25zdCBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblx0XHRcdFx0Y29udGV4dC5kZWNvZGVBdWRpb0RhdGEoIGJ1ZmZlckNvcHksIGZ1bmN0aW9uICggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHRcdFx0XHRvbkxvYWQoIGF1ZGlvQnVmZmVyICk7XG5cblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRpZiAoIG9uRXJyb3IgKSB7XG5cblx0XHRcdFx0XHRvbkVycm9yKCBlICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdGNvbnNvbGUuZXJyb3IoIGUgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0c2NvcGUubWFuYWdlci5pdGVtRXJyb3IoIHVybCApO1xuXG5cdFx0XHR9XG5cblx0XHR9LCBvblByb2dyZXNzLCBvbkVycm9yICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIEhlbWlzcGhlcmVMaWdodFByb2JlIGV4dGVuZHMgTGlnaHRQcm9iZSB7XG5cblx0Y29uc3RydWN0b3IoIHNreUNvbG9yLCBncm91bmRDb2xvciwgaW50ZW5zaXR5ID0gMSApIHtcblxuXHRcdHN1cGVyKCB1bmRlZmluZWQsIGludGVuc2l0eSApO1xuXG5cdFx0Y29uc3QgY29sb3IxID0gbmV3IENvbG9yKCkuc2V0KCBza3lDb2xvciApO1xuXHRcdGNvbnN0IGNvbG9yMiA9IG5ldyBDb2xvcigpLnNldCggZ3JvdW5kQ29sb3IgKTtcblxuXHRcdGNvbnN0IHNreSA9IG5ldyBWZWN0b3IzKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7XG5cdFx0Y29uc3QgZ3JvdW5kID0gbmV3IFZlY3RvcjMoIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdC8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHNob3VsZCA9IDEgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTtcblx0XHRjb25zdCBjMCA9IE1hdGguc3FydCggTWF0aC5QSSApO1xuXHRcdGNvbnN0IGMxID0gYzAgKiBNYXRoLnNxcnQoIDAuNzUgKTtcblxuXHRcdHRoaXMuc2guY29lZmZpY2llbnRzWyAwIF0uY29weSggc2t5ICkuYWRkKCBncm91bmQgKS5tdWx0aXBseVNjYWxhciggYzAgKTtcblx0XHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMSBdLmNvcHkoIHNreSApLnN1YiggZ3JvdW5kICkubXVsdGlwbHlTY2FsYXIoIGMxICk7XG5cblx0fVxuXG59XG5cbkhlbWlzcGhlcmVMaWdodFByb2JlLnByb3RvdHlwZS5pc0hlbWlzcGhlcmVMaWdodFByb2JlID0gdHJ1ZTtcblxuY2xhc3MgQW1iaWVudExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodFByb2JlIHtcblxuXHRjb25zdHJ1Y3RvciggY29sb3IsIGludGVuc2l0eSA9IDEgKSB7XG5cblx0XHRzdXBlciggdW5kZWZpbmVkLCBpbnRlbnNpdHkgKTtcblxuXHRcdGNvbnN0IGNvbG9yMSA9IG5ldyBDb2xvcigpLnNldCggY29sb3IgKTtcblxuXHRcdC8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHdvdWxkIGJlIDIgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTtcblx0XHR0aGlzLnNoLmNvZWZmaWNpZW50c1sgMCBdLnNldCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApLm11bHRpcGx5U2NhbGFyKCAyICogTWF0aC5zcXJ0KCBNYXRoLlBJICkgKTtcblxuXHR9XG5cbn1cblxuQW1iaWVudExpZ2h0UHJvYmUucHJvdG90eXBlLmlzQW1iaWVudExpZ2h0UHJvYmUgPSB0cnVlO1xuXG5jb25zdCBfZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpO1xuY29uc3QgX2V5ZUxlZnQgPSBuZXcgTWF0cml4NCgpO1xuXG5jbGFzcyBTdGVyZW9DYW1lcmEge1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXG5cdFx0dGhpcy50eXBlID0gJ1N0ZXJlb0NhbWVyYSc7XG5cblx0XHR0aGlzLmFzcGVjdCA9IDE7XG5cblx0XHR0aGlzLmV5ZVNlcCA9IDAuMDY0O1xuXG5cdFx0dGhpcy5jYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdFx0dGhpcy5jYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTtcblx0XHR0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7XG5cdFx0dGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTtcblx0XHR0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy5fY2FjaGUgPSB7XG5cdFx0XHRmb2N1czogbnVsbCxcblx0XHRcdGZvdjogbnVsbCxcblx0XHRcdGFzcGVjdDogbnVsbCxcblx0XHRcdG5lYXI6IG51bGwsXG5cdFx0XHRmYXI6IG51bGwsXG5cdFx0XHR6b29tOiBudWxsLFxuXHRcdFx0ZXllU2VwOiBudWxsXG5cdFx0fTtcblxuXHR9XG5cblx0dXBkYXRlKCBjYW1lcmEgKSB7XG5cblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuX2NhY2hlO1xuXG5cdFx0Y29uc3QgbmVlZHNVcGRhdGUgPSBjYWNoZS5mb2N1cyAhPT0gY2FtZXJhLmZvY3VzIHx8IGNhY2hlLmZvdiAhPT0gY2FtZXJhLmZvdiB8fFxuXHRcdFx0Y2FjaGUuYXNwZWN0ICE9PSBjYW1lcmEuYXNwZWN0ICogdGhpcy5hc3BlY3QgfHwgY2FjaGUubmVhciAhPT0gY2FtZXJhLm5lYXIgfHxcblx0XHRcdGNhY2hlLmZhciAhPT0gY2FtZXJhLmZhciB8fCBjYWNoZS56b29tICE9PSBjYW1lcmEuem9vbSB8fCBjYWNoZS5leWVTZXAgIT09IHRoaXMuZXllU2VwO1xuXG5cdFx0aWYgKCBuZWVkc1VwZGF0ZSApIHtcblxuXHRcdFx0Y2FjaGUuZm9jdXMgPSBjYW1lcmEuZm9jdXM7XG5cdFx0XHRjYWNoZS5mb3YgPSBjYW1lcmEuZm92O1xuXHRcdFx0Y2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0O1xuXHRcdFx0Y2FjaGUubmVhciA9IGNhbWVyYS5uZWFyO1xuXHRcdFx0Y2FjaGUuZmFyID0gY2FtZXJhLmZhcjtcblx0XHRcdGNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTtcblx0XHRcdGNhY2hlLmV5ZVNlcCA9IHRoaXMuZXllU2VwO1xuXG5cdFx0XHQvLyBPZmYtYXhpcyBzdGVyZW9zY29waWMgZWZmZWN0IGJhc2VkIG9uXG5cdFx0XHQvLyBodHRwOi8vcGF1bGJvdXJrZS5uZXQvc3RlcmVvZ3JhcGhpY3Mvc3RlcmVvcmVuZGVyL1xuXG5cdFx0XHRjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gY2FtZXJhLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKTtcblx0XHRcdGNvbnN0IGV5ZVNlcEhhbGYgPSBjYWNoZS5leWVTZXAgLyAyO1xuXHRcdFx0Y29uc3QgZXllU2VwT25Qcm9qZWN0aW9uID0gZXllU2VwSGFsZiAqIGNhY2hlLm5lYXIgLyBjYWNoZS5mb2N1cztcblx0XHRcdGNvbnN0IHltYXggPSAoIGNhY2hlLm5lYXIgKiBNYXRoLnRhbiggTWF0aFV0aWxzLkRFRzJSQUQgKiBjYWNoZS5mb3YgKiAwLjUgKSApIC8gY2FjaGUuem9vbTtcblx0XHRcdGxldCB4bWluLCB4bWF4O1xuXG5cdFx0XHQvLyB0cmFuc2xhdGUgeE9mZnNldFxuXG5cdFx0XHRfZXllTGVmdC5lbGVtZW50c1sgMTIgXSA9IC0gZXllU2VwSGFsZjtcblx0XHRcdF9leWVSaWdodC5lbGVtZW50c1sgMTIgXSA9IGV5ZVNlcEhhbGY7XG5cblx0XHRcdC8vIGZvciBsZWZ0IGV5ZVxuXG5cdFx0XHR4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uO1xuXHRcdFx0eG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247XG5cblx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDAgXSA9IDIgKiBjYWNoZS5uZWFyIC8gKCB4bWF4IC0geG1pbiApO1xuXHRcdFx0cHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgOCBdID0gKCB4bWF4ICsgeG1pbiApIC8gKCB4bWF4IC0geG1pbiApO1xuXG5cdFx0XHR0aGlzLmNhbWVyYUwucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBwcm9qZWN0aW9uTWF0cml4ICk7XG5cblx0XHRcdC8vIGZvciByaWdodCBleWVcblxuXHRcdFx0eG1pbiA9IC0geW1heCAqIGNhY2hlLmFzcGVjdCAtIGV5ZVNlcE9uUHJvamVjdGlvbjtcblx0XHRcdHhtYXggPSB5bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uO1xuXG5cdFx0XHRwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyAwIF0gPSAyICogY2FjaGUubmVhciAvICggeG1heCAtIHhtaW4gKTtcblx0XHRcdHByb2plY3Rpb25NYXRyaXguZWxlbWVudHNbIDggXSA9ICggeG1heCArIHhtaW4gKSAvICggeG1heCAtIHhtaW4gKTtcblxuXHRcdFx0dGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBfZXllTGVmdCApO1xuXHRcdHRoaXMuY2FtZXJhUi5tYXRyaXhXb3JsZC5jb3B5KCBjYW1lcmEubWF0cml4V29ybGQgKS5tdWx0aXBseSggX2V5ZVJpZ2h0ICk7XG5cblx0fVxuXG59XG5cbmNsYXNzIENsb2NrIHtcblxuXHRjb25zdHJ1Y3RvciggYXV0b1N0YXJ0ICkge1xuXG5cdFx0dGhpcy5hdXRvU3RhcnQgPSAoIGF1dG9TdGFydCAhPT0gdW5kZWZpbmVkICkgPyBhdXRvU3RhcnQgOiB0cnVlO1xuXG5cdFx0dGhpcy5zdGFydFRpbWUgPSAwO1xuXHRcdHRoaXMub2xkVGltZSA9IDA7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblxuXHR9XG5cblx0c3RhcnQoKSB7XG5cblx0XHR0aGlzLnN0YXJ0VGltZSA9IG5vdygpO1xuXG5cdFx0dGhpcy5vbGRUaW1lID0gdGhpcy5zdGFydFRpbWU7XG5cdFx0dGhpcy5lbGFwc2VkVGltZSA9IDA7XG5cdFx0dGhpcy5ydW5uaW5nID0gdHJ1ZTtcblxuXHR9XG5cblx0c3RvcCgpIHtcblxuXHRcdHRoaXMuZ2V0RWxhcHNlZFRpbWUoKTtcblx0XHR0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcblx0XHR0aGlzLmF1dG9TdGFydCA9IGZhbHNlO1xuXG5cdH1cblxuXHRnZXRFbGFwc2VkVGltZSgpIHtcblxuXHRcdHRoaXMuZ2V0RGVsdGEoKTtcblx0XHRyZXR1cm4gdGhpcy5lbGFwc2VkVGltZTtcblxuXHR9XG5cblx0Z2V0RGVsdGEoKSB7XG5cblx0XHRsZXQgZGlmZiA9IDA7XG5cblx0XHRpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0XHRyZXR1cm4gMDtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5ydW5uaW5nICkge1xuXG5cdFx0XHRjb25zdCBuZXdUaW1lID0gbm93KCk7XG5cblx0XHRcdGRpZmYgPSAoIG5ld1RpbWUgLSB0aGlzLm9sZFRpbWUgKSAvIDEwMDA7XG5cdFx0XHR0aGlzLm9sZFRpbWUgPSBuZXdUaW1lO1xuXG5cdFx0XHR0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gZGlmZjtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gbm93KCkge1xuXG5cdHJldHVybiAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsgLy8gc2VlICMxMDczMlxuXG59XG5cbmNvbnN0IF9wb3NpdGlvbiQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX3F1YXRlcm5pb24kMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFF1YXRlcm5pb24oKTtcbmNvbnN0IF9zY2FsZSQxID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX29yaWVudGF0aW9uJDEgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIEF1ZGlvTGlzdGVuZXIgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInO1xuXG5cdFx0dGhpcy5jb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTtcblxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0dGhpcy50aW1lRGVsdGEgPSAwO1xuXG5cdFx0Ly8gcHJpdmF0ZVxuXG5cdFx0dGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTtcblxuXHR9XG5cblx0Z2V0SW5wdXQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5nYWluO1xuXG5cdH1cblxuXHRyZW1vdmVGaWx0ZXIoKSB7XG5cblx0XHRpZiAoIHRoaXMuZmlsdGVyICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTtcblx0XHRcdHRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5nYWluLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXHRcdFx0dGhpcy5maWx0ZXIgPSBudWxsO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldEZpbHRlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlcjtcblxuXHR9XG5cblx0c2V0RmlsdGVyKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuZ2Fpbi5kaXNjb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdFx0dGhpcy5maWx0ZXIuZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLmZpbHRlciA9IHZhbHVlO1xuXHRcdHRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmZpbHRlciApO1xuXHRcdHRoaXMuZmlsdGVyLmNvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldE1hc3RlclZvbHVtZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9XG5cblx0c2V0TWFzdGVyVm9sdW1lKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0Y29uc3QgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7XG5cdFx0Y29uc3QgdXAgPSB0aGlzLnVwO1xuXG5cdFx0dGhpcy50aW1lRGVsdGEgPSB0aGlzLl9jbG9jay5nZXREZWx0YSgpO1xuXG5cdFx0dGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiQxLCBfcXVhdGVybmlvbiQxLCBfc2NhbGUkMSApO1xuXG5cdFx0X29yaWVudGF0aW9uJDEuc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDEgKTtcblxuXHRcdGlmICggbGlzdGVuZXIucG9zaXRpb25YICkge1xuXG5cdFx0XHQvLyBjb2RlIHBhdGggZm9yIENocm9tZSAoc2VlICMxNDM5MylcblxuXHRcdFx0Y29uc3QgZW5kVGltZSA9IHRoaXMuY29udGV4dC5jdXJyZW50VGltZSArIHRoaXMudGltZURlbHRhO1xuXG5cdFx0XHRsaXN0ZW5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbiQxLngsIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnBvc2l0aW9uWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDEueSwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMS56LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci5mb3J3YXJkWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uJDEueCwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIuZm9yd2FyZFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbiQxLnksIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24kMS56LCBlbmRUaW1lICk7XG5cdFx0XHRsaXN0ZW5lci51cFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLngsIGVuZFRpbWUgKTtcblx0XHRcdGxpc3RlbmVyLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueSwgZW5kVGltZSApO1xuXHRcdFx0bGlzdGVuZXIudXBaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC56LCBlbmRUaW1lICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRsaXN0ZW5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uJDEueCwgX3Bvc2l0aW9uJDEueSwgX3Bvc2l0aW9uJDEueiApO1xuXHRcdFx0bGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbiQxLngsIF9vcmllbnRhdGlvbiQxLnksIF9vcmllbnRhdGlvbiQxLnosIHVwLngsIHVwLnksIHVwLnogKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY2xhc3MgQXVkaW8gZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMudHlwZSA9ICdBdWRpbyc7XG5cblx0XHR0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7XG5cdFx0dGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDtcblxuXHRcdHRoaXMuZ2FpbiA9IHRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7XG5cdFx0dGhpcy5nYWluLmNvbm5lY3QoIGxpc3RlbmVyLmdldElucHV0KCkgKTtcblxuXHRcdHRoaXMuYXV0b3BsYXkgPSBmYWxzZTtcblxuXHRcdHRoaXMuYnVmZmVyID0gbnVsbDtcblx0XHR0aGlzLmRldHVuZSA9IDA7XG5cdFx0dGhpcy5sb29wID0gZmFsc2U7XG5cdFx0dGhpcy5sb29wU3RhcnQgPSAwO1xuXHRcdHRoaXMubG9vcEVuZCA9IDA7XG5cdFx0dGhpcy5vZmZzZXQgPSAwO1xuXHRcdHRoaXMuZHVyYXRpb24gPSB1bmRlZmluZWQ7XG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSAxO1xuXHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSB0cnVlO1xuXHRcdHRoaXMuc291cmNlID0gbnVsbDtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknO1xuXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gMDtcblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XG5cdFx0dGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG5cblx0XHR0aGlzLmZpbHRlcnMgPSBbXTtcblxuXHR9XG5cblx0Z2V0T3V0cHV0KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2FpbjtcblxuXHR9XG5cblx0c2V0Tm9kZVNvdXJjZSggYXVkaW9Ob2RlICkge1xuXG5cdFx0dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTtcblx0XHR0aGlzLnNvdXJjZVR5cGUgPSAnYXVkaW9Ob2RlJztcblx0XHR0aGlzLnNvdXJjZSA9IGF1ZGlvTm9kZTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRNZWRpYUVsZW1lbnRTb3VyY2UoIG1lZGlhRWxlbWVudCApIHtcblxuXHRcdHRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gZmFsc2U7XG5cdFx0dGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhTm9kZSc7XG5cdFx0dGhpcy5zb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlTWVkaWFFbGVtZW50U291cmNlKCBtZWRpYUVsZW1lbnQgKTtcblx0XHR0aGlzLmNvbm5lY3QoKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRNZWRpYVN0cmVhbVNvdXJjZSggbWVkaWFTdHJlYW0gKSB7XG5cblx0XHR0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9IGZhbHNlO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdtZWRpYVN0cmVhbU5vZGUnO1xuXHRcdHRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKCBtZWRpYVN0cmVhbSApO1xuXHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEJ1ZmZlciggYXVkaW9CdWZmZXIgKSB7XG5cblx0XHR0aGlzLmJ1ZmZlciA9IGF1ZGlvQnVmZmVyO1xuXHRcdHRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInO1xuXG5cdFx0aWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cGxheSggZGVsYXkgPSAwICkge1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IEF1ZGlvIGlzIGFscmVhZHkgcGxheWluZy4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fc3RhcnRlZEF0ID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgZGVsYXk7XG5cblx0XHRjb25zdCBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7XG5cdFx0c291cmNlLmJ1ZmZlciA9IHRoaXMuYnVmZmVyO1xuXHRcdHNvdXJjZS5sb29wID0gdGhpcy5sb29wO1xuXHRcdHNvdXJjZS5sb29wU3RhcnQgPSB0aGlzLmxvb3BTdGFydDtcblx0XHRzb3VyY2UubG9vcEVuZCA9IHRoaXMubG9vcEVuZDtcblx0XHRzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7XG5cdFx0c291cmNlLnN0YXJ0KCB0aGlzLl9zdGFydGVkQXQsIHRoaXMuX3Byb2dyZXNzICsgdGhpcy5vZmZzZXQsIHRoaXMuZHVyYXRpb24gKTtcblxuXHRcdHRoaXMuaXNQbGF5aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuc291cmNlID0gc291cmNlO1xuXG5cdFx0dGhpcy5zZXREZXR1bmUoIHRoaXMuZGV0dW5lICk7XG5cdFx0dGhpcy5zZXRQbGF5YmFja1JhdGUoIHRoaXMucGxheWJhY2tSYXRlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0KCk7XG5cblx0fVxuXG5cdHBhdXNlKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdC8vIHVwZGF0ZSBjdXJyZW50IHByb2dyZXNzXG5cblx0XHRcdHRoaXMuX3Byb2dyZXNzICs9IE1hdGgubWF4KCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLl9zdGFydGVkQXQsIDAgKSAqIHRoaXMucGxheWJhY2tSYXRlO1xuXG5cdFx0XHRpZiAoIHRoaXMubG9vcCA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0XHQvLyBlbnN1cmUgX3Byb2dyZXNzIGRvZXMgbm90IGV4Y2VlZCBkdXJhdGlvbiB3aXRoIGxvb3BlZCBhdWRpb3NcblxuXHRcdFx0XHR0aGlzLl9wcm9ncmVzcyA9IHRoaXMuX3Byb2dyZXNzICUgKCB0aGlzLmR1cmF0aW9uIHx8IHRoaXMuYnVmZmVyLmR1cmF0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zb3VyY2Uuc3RvcCgpO1xuXHRcdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cblx0XHRcdHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3RvcCgpIHtcblxuXHRcdGlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7XG5cdFx0XHRyZXR1cm47XG5cblx0XHR9XG5cblx0XHR0aGlzLl9wcm9ncmVzcyA9IDA7XG5cblx0XHR0aGlzLnNvdXJjZS5zdG9wKCk7XG5cdFx0dGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7XG5cdFx0dGhpcy5pc1BsYXlpbmcgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb25uZWN0KCkge1xuXG5cdFx0aWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuY29ubmVjdCggdGhpcy5maWx0ZXJzWyAwIF0gKTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7XG5cblx0XHRcdFx0dGhpcy5maWx0ZXJzWyBpIC0gMSBdLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgaSBdICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZGlzY29ubmVjdCgpIHtcblxuXHRcdGlmICggdGhpcy5maWx0ZXJzLmxlbmd0aCA+IDAgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdHRoaXMuZmlsdGVyc1sgaSAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsdGVyc1sgdGhpcy5maWx0ZXJzLmxlbmd0aCAtIDEgXS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRGaWx0ZXJzKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVycztcblxuXHR9XG5cblx0c2V0RmlsdGVycyggdmFsdWUgKSB7XG5cblx0XHRpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdO1xuXG5cdFx0aWYgKCB0aGlzLl9jb25uZWN0ZWQgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuZGlzY29ubmVjdCgpO1xuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5maWx0ZXJzID0gdmFsdWUuc2xpY2UoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXREZXR1bmUoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5kZXR1bmUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5zb3VyY2UuZGV0dW5lID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG9ubHkgc2V0IGRldHVuZSB3aGVuIGF2YWlsYWJsZVxuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSggdGhpcy5kZXR1bmUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldERldHVuZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmRldHVuZTtcblxuXHR9XG5cblx0Z2V0RmlsdGVyKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWyAwIF07XG5cblx0fVxuXG5cdHNldEZpbHRlciggZmlsdGVyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7XG5cblx0fVxuXG5cdHNldFBsYXliYWNrUmF0ZSggdmFsdWUgKSB7XG5cblx0XHRpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApO1xuXHRcdFx0cmV0dXJuO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5wbGF5YmFja1JhdGUgPSB2YWx1ZTtcblxuXHRcdGlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7XG5cblx0XHRcdHRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXRQbGF5YmFja1JhdGUoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGU7XG5cblx0fVxuXG5cdG9uRW5kZWQoKSB7XG5cblx0XHR0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuXG5cdH1cblxuXHRnZXRMb29wKCkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmxvb3A7XG5cblx0fVxuXG5cdHNldExvb3AoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdHRoaXMubG9vcCA9IHZhbHVlO1xuXG5cdFx0aWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHtcblxuXHRcdFx0dGhpcy5zb3VyY2UubG9vcCA9IHRoaXMubG9vcDtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wU3RhcnQoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5sb29wU3RhcnQgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wRW5kKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMubG9vcEVuZCA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldFZvbHVtZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZTtcblxuXHR9XG5cblx0c2V0Vm9sdW1lKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9wb3NpdGlvbiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9xdWF0ZXJuaW9uID0gLypAX19QVVJFX18qLyBuZXcgUXVhdGVybmlvbigpO1xuY29uc3QgX3NjYWxlID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX29yaWVudGF0aW9uID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBQb3NpdGlvbmFsQXVkaW8gZXh0ZW5kcyBBdWRpbyB7XG5cblx0Y29uc3RydWN0b3IoIGxpc3RlbmVyICkge1xuXG5cdFx0c3VwZXIoIGxpc3RlbmVyICk7XG5cblx0XHR0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTtcblx0XHR0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWwgPSAnSFJURic7XG5cdFx0dGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7XG5cblx0fVxuXG5cdGdldE91dHB1dCgpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lcjtcblxuXHR9XG5cblx0Z2V0UmVmRGlzdGFuY2UoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5wYW5uZXIucmVmRGlzdGFuY2U7XG5cblx0fVxuXG5cdHNldFJlZkRpc3RhbmNlKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJlZkRpc3RhbmNlID0gdmFsdWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Um9sbG9mZkZhY3RvcigpIHtcblxuXHRcdHJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yO1xuXG5cdH1cblxuXHRzZXRSb2xsb2ZmRmFjdG9yKCB2YWx1ZSApIHtcblxuXHRcdHRoaXMucGFubmVyLnJvbGxvZmZGYWN0b3IgPSB2YWx1ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRnZXREaXN0YW5jZU1vZGVsKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLmRpc3RhbmNlTW9kZWw7XG5cblx0fVxuXG5cdHNldERpc3RhbmNlTW9kZWwoIHZhbHVlICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGdldE1heERpc3RhbmNlKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlO1xuXG5cdH1cblxuXHRzZXRNYXhEaXN0YW5jZSggdmFsdWUgKSB7XG5cblx0XHR0aGlzLnBhbm5lci5tYXhEaXN0YW5jZSA9IHZhbHVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldERpcmVjdGlvbmFsQ29uZSggY29uZUlubmVyQW5nbGUsIGNvbmVPdXRlckFuZ2xlLCBjb25lT3V0ZXJHYWluICkge1xuXG5cdFx0dGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBjb25lSW5uZXJBbmdsZTtcblx0XHR0aGlzLnBhbm5lci5jb25lT3V0ZXJBbmdsZSA9IGNvbmVPdXRlckFuZ2xlO1xuXHRcdHRoaXMucGFubmVyLmNvbmVPdXRlckdhaW4gPSBjb25lT3V0ZXJHYWluO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApIHtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdFx0aWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gdHJ1ZSAmJiB0aGlzLmlzUGxheWluZyA9PT0gZmFsc2UgKSByZXR1cm47XG5cblx0XHR0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uLCBfcXVhdGVybmlvbiwgX3NjYWxlICk7XG5cblx0XHRfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiApO1xuXG5cdFx0Y29uc3QgcGFubmVyID0gdGhpcy5wYW5uZXI7XG5cblx0XHRpZiAoIHBhbm5lci5wb3NpdGlvblggKSB7XG5cblx0XHRcdC8vIGNvZGUgcGF0aCBmb3IgQ2hyb21lIGFuZCBGaXJlZm94IChzZWUgIzE0MzkzKVxuXG5cdFx0XHRjb25zdCBlbmRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy5saXN0ZW5lci50aW1lRGVsdGE7XG5cblx0XHRcdHBhbm5lci5wb3NpdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbi54LCBlbmRUaW1lICk7XG5cdFx0XHRwYW5uZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24ueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uLnosIGVuZFRpbWUgKTtcblx0XHRcdHBhbm5lci5vcmllbnRhdGlvblgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7XG5cdFx0XHRwYW5uZXIub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueSwgZW5kVGltZSApO1xuXHRcdFx0cGFubmVyLm9yaWVudGF0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnosIGVuZFRpbWUgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHBhbm5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uLngsIF9wb3NpdGlvbi55LCBfcG9zaXRpb24ueiApO1xuXHRcdFx0cGFubmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24ueCwgX29yaWVudGF0aW9uLnksIF9vcmllbnRhdGlvbi56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNsYXNzIEF1ZGlvQW5hbHlzZXIge1xuXG5cdGNvbnN0cnVjdG9yKCBhdWRpbywgZmZ0U2l6ZSA9IDIwNDggKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyID0gYXVkaW8uY29udGV4dC5jcmVhdGVBbmFseXNlcigpO1xuXHRcdHRoaXMuYW5hbHlzZXIuZmZ0U2l6ZSA9IGZmdFNpemU7XG5cblx0XHR0aGlzLmRhdGEgPSBuZXcgVWludDhBcnJheSggdGhpcy5hbmFseXNlci5mcmVxdWVuY3lCaW5Db3VudCApO1xuXG5cdFx0YXVkaW8uZ2V0T3V0cHV0KCkuY29ubmVjdCggdGhpcy5hbmFseXNlciApO1xuXG5cdH1cblxuXG5cdGdldEZyZXF1ZW5jeURhdGEoKSB7XG5cblx0XHR0aGlzLmFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKCB0aGlzLmRhdGEgKTtcblxuXHRcdHJldHVybiB0aGlzLmRhdGE7XG5cblx0fVxuXG5cdGdldEF2ZXJhZ2VGcmVxdWVuY3koKSB7XG5cblx0XHRsZXQgdmFsdWUgPSAwO1xuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0XHR2YWx1ZSArPSBkYXRhWyBpIF07XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDtcblxuXHR9XG5cbn1cblxuY2xhc3MgUHJvcGVydHlNaXhlciB7XG5cblx0Y29uc3RydWN0b3IoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7XG5cblx0XHR0aGlzLmJpbmRpbmcgPSBiaW5kaW5nO1xuXHRcdHRoaXMudmFsdWVTaXplID0gdmFsdWVTaXplO1xuXG5cdFx0bGV0IG1peEZ1bmN0aW9uLFxuXHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSxcblx0XHRcdHNldElkZW50aXR5O1xuXG5cdFx0Ly8gYnVmZmVyIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIHwgYWRkQWNjdSB8IChvcHRpb25hbCB3b3JrKSBdXG5cdFx0Ly9cblx0XHQvLyBpbnRlcnBvbGF0b3JzIGNhbiB1c2UgLmJ1ZmZlciBhcyB0aGVpciAucmVzdWx0XG5cdFx0Ly8gdGhlIGRhdGEgdGhlbiBnb2VzIHRvICdpbmNvbWluZydcblx0XHQvL1xuXHRcdC8vICdhY2N1MCcgYW5kICdhY2N1MScgYXJlIHVzZWQgZnJhbWUtaW50ZXJsZWF2ZWQgZm9yXG5cdFx0Ly8gdGhlIGN1bXVsYXRpdmUgcmVzdWx0IGFuZCBhcmUgY29tcGFyZWQgdG8gZGV0ZWN0XG5cdFx0Ly8gY2hhbmdlc1xuXHRcdC8vXG5cdFx0Ly8gJ29yaWcnIHN0b3JlcyB0aGUgb3JpZ2luYWwgc3RhdGUgb2YgdGhlIHByb3BlcnR5XG5cdFx0Ly9cblx0XHQvLyAnYWRkJyBpcyB1c2VkIGZvciBhZGRpdGl2ZSBjdW11bGF0aXZlIHJlc3VsdHNcblx0XHQvL1xuXHRcdC8vICd3b3JrJyBpcyBvcHRpb25hbCBhbmQgaXMgb25seSBwcmVzZW50IGZvciBxdWF0ZXJuaW9uIHR5cGVzLiBJdCBpcyB1c2VkXG5cdFx0Ly8gdG8gc3RvcmUgaW50ZXJtZWRpYXRlIHF1YXRlcm5pb24gbXVsdGlwbGljYXRpb24gcmVzdWx0c1xuXG5cdFx0c3dpdGNoICggdHlwZU5hbWUgKSB7XG5cblx0XHRcdGNhc2UgJ3F1YXRlcm5pb24nOlxuXHRcdFx0XHRtaXhGdW5jdGlvbiA9IHRoaXMuX3NsZXJwO1xuXHRcdFx0XHRtaXhGdW5jdGlvbkFkZGl0aXZlID0gdGhpcy5fc2xlcnBBZGRpdGl2ZTtcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5UXVhdGVybmlvbjtcblxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDYgKTtcblx0XHRcdFx0dGhpcy5fd29ya0luZGV4ID0gNTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgJ3N0cmluZyc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdFx0bWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7XG5cblx0XHRcdFx0Ly8gVXNlIHRoZSByZWd1bGFyIG1peCBmdW5jdGlvbiBhbmQgZm9yIGFkZGl0aXZlIG9uIHRoZXNlIHR5cGVzLFxuXHRcdFx0XHQvLyBhZGRpdGl2ZSBpcyBub3QgcmVsZXZhbnQgZm9yIG5vbi1udW1lcmljIHR5cGVzXG5cdFx0XHRcdG1peEZ1bmN0aW9uQWRkaXRpdmUgPSB0aGlzLl9zZWxlY3Q7XG5cblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5T3RoZXI7XG5cblx0XHRcdFx0dGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdG1peEZ1bmN0aW9uID0gdGhpcy5fbGVycDtcblx0XHRcdFx0bWl4RnVuY3Rpb25BZGRpdGl2ZSA9IHRoaXMuX2xlcnBBZGRpdGl2ZTtcblx0XHRcdFx0c2V0SWRlbnRpdHkgPSB0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYztcblxuXHRcdFx0XHR0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDY0QXJyYXkoIHZhbHVlU2l6ZSAqIDUgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbiA9IG1peEZ1bmN0aW9uO1xuXHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbkFkZGl0aXZlID0gbWl4RnVuY3Rpb25BZGRpdGl2ZTtcblx0XHR0aGlzLl9zZXRJZGVudGl0eSA9IHNldElkZW50aXR5O1xuXHRcdHRoaXMuX29yaWdJbmRleCA9IDM7XG5cdFx0dGhpcy5fYWRkSW5kZXggPSA0O1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XG5cblx0XHR0aGlzLnVzZUNvdW50ID0gMDtcblx0XHR0aGlzLnJlZmVyZW5jZUNvdW50ID0gMDtcblxuXHR9XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhY2N1PGk+J1xuXHRhY2N1bXVsYXRlKCBhY2N1SW5kZXgsIHdlaWdodCApIHtcblxuXHRcdC8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzXG5cdFx0Ly8gdGhlIHdlaWdodCBhbmQgc2hvdWxkbid0IGhhdmUgbWFkZSB0aGUgY2FsbCBpbiB0aGUgZmlyc3QgcGxhY2VcblxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRvZmZzZXQgPSBhY2N1SW5kZXggKiBzdHJpZGUgKyBzdHJpZGU7XG5cblx0XHRsZXQgY3VycmVudFdlaWdodCA9IHRoaXMuY3VtdWxhdGl2ZVdlaWdodDtcblxuXHRcdGlmICggY3VycmVudFdlaWdodCA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gaW5jb21pbmcgKiB3ZWlnaHRcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7XG5cblx0XHRcdFx0YnVmZmVyWyBvZmZzZXQgKyBpIF0gPSBidWZmZXJbIGkgXTtcblxuXHRcdFx0fVxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ID0gd2VpZ2h0O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gYWNjdU4gOj0gYWNjdU4gKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0XHRjdXJyZW50V2VpZ2h0ICs9IHdlaWdodDtcblx0XHRcdGNvbnN0IG1peCA9IHdlaWdodCAvIGN1cnJlbnRXZWlnaHQ7XG5cdFx0XHR0aGlzLl9taXhCdWZmZXJSZWdpb24oIGJ1ZmZlciwgb2Zmc2V0LCAwLCBtaXgsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gY3VycmVudFdlaWdodDtcblxuXHR9XG5cblx0Ly8gYWNjdW11bGF0ZSBkYXRhIGluIHRoZSAnaW5jb21pbmcnIHJlZ2lvbiBpbnRvICdhZGQnXG5cdGFjY3VtdWxhdGVBZGRpdGl2ZSggd2VpZ2h0ICkge1xuXG5cdFx0Y29uc3QgYnVmZmVyID0gdGhpcy5idWZmZXIsXG5cdFx0XHRzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSxcblx0XHRcdG9mZnNldCA9IHN0cmlkZSAqIHRoaXMuX2FkZEluZGV4O1xuXG5cdFx0aWYgKCB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9PT0gMCApIHtcblxuXHRcdFx0Ly8gYWRkID0gaWRlbnRpdHlcblxuXHRcdFx0dGhpcy5fc2V0SWRlbnRpdHkoKTtcblxuXHRcdH1cblxuXHRcdC8vIGFkZCA6PSBhZGQgKyBpbmNvbWluZyAqIHdlaWdodFxuXG5cdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCAwLCB3ZWlnaHQsIHN0cmlkZSApO1xuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodEFkZGl0aXZlICs9IHdlaWdodDtcblxuXHR9XG5cblx0Ly8gYXBwbHkgdGhlIHN0YXRlIG9mICdhY2N1PGk+JyB0byB0aGUgYmluZGluZyB3aGVuIGFjY3VzIGRpZmZlclxuXHRhcHBseSggYWNjdUluZGV4ICkge1xuXG5cdFx0Y29uc3Qgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cdFx0XHRidWZmZXIgPSB0aGlzLmJ1ZmZlcixcblx0XHRcdG9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSxcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0LFxuXHRcdFx0d2VpZ2h0QWRkaXRpdmUgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSxcblxuXHRcdFx0YmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdHRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7XG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0QWRkaXRpdmUgPSAwO1xuXG5cdFx0aWYgKCB3ZWlnaHQgPCAxICkge1xuXG5cdFx0XHQvLyBhY2N1TiA6PSBhY2N1TiArIG9yaWdpbmFsICogKCAxIC0gY3VtdWxhdGl2ZVdlaWdodCApXG5cblx0XHRcdGNvbnN0IG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XG5cblx0XHRcdHRoaXMuX21peEJ1ZmZlclJlZ2lvbihcblx0XHRcdFx0YnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApO1xuXG5cdFx0fVxuXG5cdFx0aWYgKCB3ZWlnaHRBZGRpdGl2ZSA+IDAgKSB7XG5cblx0XHRcdC8vIGFjY3VOIDo9IGFjY3VOICsgYWRkaXRpdmUgYWNjdU5cblxuXHRcdFx0dGhpcy5fbWl4QnVmZmVyUmVnaW9uQWRkaXRpdmUoIGJ1ZmZlciwgb2Zmc2V0LCB0aGlzLl9hZGRJbmRleCAqIHN0cmlkZSwgMSwgc3RyaWRlICk7XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IHN0cmlkZSArIHN0cmlkZTsgaSAhPT0gZTsgKysgaSApIHtcblxuXHRcdFx0aWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7XG5cblx0XHRcdFx0Ly8gdmFsdWUgaGFzIGNoYW5nZWQgLT4gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRcdFx0YmluZGluZy5zZXRWYWx1ZSggYnVmZmVyLCBvZmZzZXQgKTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzXG5cdHNhdmVPcmlnaW5hbFN0YXRlKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZyA9IHRoaXMuYmluZGluZztcblxuXHRcdGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyLFxuXHRcdFx0c3RyaWRlID0gdGhpcy52YWx1ZVNpemUsXG5cblx0XHRcdG9yaWdpbmFsVmFsdWVPZmZzZXQgPSBzdHJpZGUgKiB0aGlzLl9vcmlnSW5kZXg7XG5cblx0XHRiaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTtcblxuXHRcdC8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWxcblx0XHRmb3IgKCBsZXQgaSA9IHN0cmlkZSwgZSA9IG9yaWdpbmFsVmFsdWVPZmZzZXQ7IGkgIT09IGU7ICsrIGkgKSB7XG5cblx0XHRcdGJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTtcblxuXHRcdH1cblxuXHRcdC8vIEFkZCB0byBpZGVudGl0eSBmb3IgYWRkaXRpdmVcblx0XHR0aGlzLl9zZXRJZGVudGl0eSgpO1xuXG5cdFx0dGhpcy5jdW11bGF0aXZlV2VpZ2h0ID0gMDtcblx0XHR0aGlzLmN1bXVsYXRpdmVXZWlnaHRBZGRpdGl2ZSA9IDA7XG5cblx0fVxuXG5cdC8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nXG5cdHJlc3RvcmVPcmlnaW5hbFN0YXRlKCkge1xuXG5cdFx0Y29uc3Qgb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHRoaXMudmFsdWVTaXplICogMztcblx0XHR0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7XG5cblx0fVxuXG5cdF9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpIHtcblxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplO1xuXHRcdGNvbnN0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIHRoaXMudmFsdWVTaXplO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkgKysgKSB7XG5cblx0XHRcdHRoaXMuYnVmZmVyWyBpIF0gPSAwO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRfc2V0QWRkaXRpdmVJZGVudGl0eVF1YXRlcm5pb24oKSB7XG5cblx0XHR0aGlzLl9zZXRBZGRpdGl2ZUlkZW50aXR5TnVtZXJpYygpO1xuXHRcdHRoaXMuYnVmZmVyWyB0aGlzLl9hZGRJbmRleCAqIHRoaXMudmFsdWVTaXplICsgMyBdID0gMTtcblxuXHR9XG5cblx0X3NldEFkZGl0aXZlSWRlbnRpdHlPdGhlcigpIHtcblxuXHRcdGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLl9vcmlnSW5kZXggKiB0aGlzLnZhbHVlU2l6ZTtcblx0XHRjb25zdCB0YXJnZXRJbmRleCA9IHRoaXMuX2FkZEluZGV4ICogdGhpcy52YWx1ZVNpemU7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLnZhbHVlU2l6ZTsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5idWZmZXJbIHRhcmdldEluZGV4ICsgaSBdID0gdGhpcy5idWZmZXJbIHN0YXJ0SW5kZXggKyBpIF07XG5cblx0XHR9XG5cblx0fVxuXG5cblx0Ly8gbWl4IGZ1bmN0aW9uc1xuXG5cdF9zZWxlY3QoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGlmICggdCA+PSAwLjUgKSB7XG5cblx0XHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRcdGJ1ZmZlclsgZHN0T2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBzcmNPZmZzZXQgKyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHR9XG5cblx0X3NsZXJwKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkge1xuXG5cdFx0UXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTtcblxuXHR9XG5cblx0X3NsZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGNvbnN0IHdvcmtPZmZzZXQgPSB0aGlzLl93b3JrSW5kZXggKiBzdHJpZGU7XG5cblx0XHQvLyBTdG9yZSByZXN1bHQgaW4gaW50ZXJtZWRpYXRlIGJ1ZmZlciBvZmZzZXRcblx0XHRRdWF0ZXJuaW9uLm11bHRpcGx5UXVhdGVybmlvbnNGbGF0KCBidWZmZXIsIHdvcmtPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHNyY09mZnNldCApO1xuXG5cdFx0Ly8gU2xlcnAgdG8gdGhlIGludGVybWVkaWF0ZSByZXN1bHRcblx0XHRRdWF0ZXJuaW9uLnNsZXJwRmxhdCggYnVmZmVyLCBkc3RPZmZzZXQsIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIHdvcmtPZmZzZXQsIHQgKTtcblxuXHR9XG5cblx0X2xlcnAoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGNvbnN0IHMgPSAxIC0gdDtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSAqIHMgKyBidWZmZXJbIHNyY09mZnNldCArIGkgXSAqIHQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZXJwQWRkaXRpdmUoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBzcmNPZmZzZXQsIHQsIHN0cmlkZSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBqID0gZHN0T2Zmc2V0ICsgaTtcblxuXHRcdFx0YnVmZmVyWyBqIF0gPSBidWZmZXJbIGogXSArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuLy8gQ2hhcmFjdGVycyBbXS46LyBhcmUgcmVzZXJ2ZWQgZm9yIHRyYWNrIGJpbmRpbmcgc3ludGF4LlxuY29uc3QgX1JFU0VSVkVEX0NIQVJTX1JFID0gJ1xcXFxbXFxcXF1cXFxcLjpcXFxcLyc7XG5jb25zdCBfcmVzZXJ2ZWRSZSA9IG5ldyBSZWdFeHAoICdbJyArIF9SRVNFUlZFRF9DSEFSU19SRSArICddJywgJ2cnICk7XG5cbi8vIEF0dGVtcHRzIHRvIGFsbG93IG5vZGUgbmFtZXMgZnJvbSBhbnkgbGFuZ3VhZ2UuIEVTNSdzIGBcXHdgIHJlZ2V4cCBtYXRjaGVzXG4vLyBvbmx5IGxhdGluIGNoYXJhY3RlcnMsIGFuZCB0aGUgdW5pY29kZSBcXHB7TH0gaXMgbm90IHlldCBzdXBwb3J0ZWQuIFNvXG4vLyBpbnN0ZWFkLCB3ZSBleGNsdWRlIHJlc2VydmVkIGNoYXJhY3RlcnMgYW5kIG1hdGNoIGV2ZXJ5dGhpbmcgZWxzZS5cbmNvbnN0IF93b3JkQ2hhciA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7XG5jb25zdCBfd29yZENoYXJPckRvdCA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUucmVwbGFjZSggJ1xcXFwuJywgJycgKSArICddJztcblxuLy8gUGFyZW50IGRpcmVjdG9yaWVzLCBkZWxpbWl0ZWQgYnkgJy8nIG9yICc6Jy4gQ3VycmVudGx5IHVudXNlZCwgYnV0IG11c3Rcbi8vIGJlIG1hdGNoZWQgdG8gcGFyc2UgdGhlIHJlc3Qgb2YgdGhlIHRyYWNrIG5hbWUuXG5jb25zdCBfZGlyZWN0b3J5UmUgPSAvKCg/OldDK1tcXC86XSkqKS8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApO1xuXG4vLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy5cbmNvbnN0IF9ub2RlUmUgPSAvKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCAnV0NPRCcsIF93b3JkQ2hhck9yRG90ICk7XG5cbi8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWRcbi8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC5cbmNvbnN0IF9vYmplY3RSZSA9IC8oPzpcXC4oV0MrKSg/OlxcWyguKylcXF0pPyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XG5cbi8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heVxuLy8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy5cbmNvbnN0IF9wcm9wZXJ0eVJlID0gL1xcLihXQyspKD86XFxbKC4rKVxcXSk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDJywgX3dvcmRDaGFyICk7XG5cbmNvbnN0IF90cmFja1JlID0gbmV3IFJlZ0V4cCggJydcblx0KyAnXidcblx0KyBfZGlyZWN0b3J5UmVcblx0KyBfbm9kZVJlXG5cdCsgX29iamVjdFJlXG5cdCsgX3Byb3BlcnR5UmVcblx0KyAnJCdcbik7XG5cbmNvbnN0IF9zdXBwb3J0ZWRPYmplY3ROYW1lcyA9IFsgJ21hdGVyaWFsJywgJ21hdGVyaWFscycsICdib25lcycgXTtcblxuZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkge1xuXG5cdGNvbnN0IHBhcnNlZFBhdGggPSBvcHRpb25hbFBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7XG5cblx0dGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDtcblx0dGhpcy5fYmluZGluZ3MgPSB0YXJnZXRHcm91cC5zdWJzY3JpYmVfKCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwge1xuXG5cdGdldFZhbHVlOiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTsgLy8gYmluZCBhbGwgYmluZGluZ1xuXG5cdFx0Y29uc3QgZmlyc3RWYWxpZEluZGV4ID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLFxuXHRcdFx0YmluZGluZyA9IHRoaXMuX2JpbmRpbmdzWyBmaXJzdFZhbGlkSW5kZXggXTtcblxuXHRcdC8vIGFuZCBvbmx5IGNhbGwgLmdldFZhbHVlIG9uIHRoZSBmaXJzdFxuXHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRmb3IgKCBsZXQgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0YmluZGluZ3NbIGkgXS5zZXRWYWx1ZSggYXJyYXksIG9mZnNldCApO1xuXG5cdFx0fVxuXG5cdH0sXG5cblx0YmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLmJpbmQoKTtcblxuXHRcdH1cblxuXHR9LFxuXG5cdHVuYmluZDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGZvciAoIGxldCBpID0gdGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRiaW5kaW5nc1sgaSBdLnVuYmluZCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufSApO1xuXG5cbmZ1bmN0aW9uIFByb3BlcnR5QmluZGluZyggcm9vdE5vZGUsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0dGhpcy5wYXRoID0gcGF0aDtcblx0dGhpcy5wYXJzZWRQYXRoID0gcGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTtcblxuXHR0aGlzLm5vZGUgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHJvb3ROb2RlLCB0aGlzLnBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCByb290Tm9kZTtcblxuXHR0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7XG5cbn1cblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLCB7XG5cblx0Q29tcG9zaXRlOiBDb21wb3NpdGUsXG5cblx0Y3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHRpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkge1xuXG5cdFx0XHRyZXR1cm4gbmV3IFByb3BlcnR5QmluZGluZyggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0cmV0dXJuIG5ldyBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHQvKipcblx0ICogUmVwbGFjZXMgc3BhY2VzIHdpdGggdW5kZXJzY29yZXMgYW5kIHJlbW92ZXMgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycyBmcm9tXG5cdCAqIG5vZGUgbmFtZXMsIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggcGFyc2VUcmFja05hbWUoKS5cblx0ICpcblx0ICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTm9kZSBuYW1lIHRvIGJlIHNhbml0aXplZC5cblx0ICogQHJldHVybiB7c3RyaW5nfVxuXHQgKi9cblx0c2FuaXRpemVOb2RlTmFtZTogZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdFx0cmV0dXJuIG5hbWUucmVwbGFjZSggL1xccy9nLCAnXycgKS5yZXBsYWNlKCBfcmVzZXJ2ZWRSZSwgJycgKTtcblxuXHR9LFxuXG5cdHBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHtcblxuXHRcdGNvbnN0IG1hdGNoZXMgPSBfdHJhY2tSZS5leGVjKCB0cmFja05hbWUgKTtcblxuXHRcdGlmICggISBtYXRjaGVzICkge1xuXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdHMgPSB7XG5cdFx0XHQvLyBkaXJlY3RvcnlOYW1lOiBtYXRjaGVzWyAxIF0sIC8vICh0c2NodykgY3VycmVudGx5IHVudXNlZFxuXHRcdFx0bm9kZU5hbWU6IG1hdGNoZXNbIDIgXSxcblx0XHRcdG9iamVjdE5hbWU6IG1hdGNoZXNbIDMgXSxcblx0XHRcdG9iamVjdEluZGV4OiBtYXRjaGVzWyA0IF0sXG5cdFx0XHRwcm9wZXJ0eU5hbWU6IG1hdGNoZXNbIDUgXSwgLy8gcmVxdWlyZWRcblx0XHRcdHByb3BlcnR5SW5kZXg6IG1hdGNoZXNbIDYgXVxuXHRcdH07XG5cblx0XHRjb25zdCBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTtcblxuXHRcdGlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApO1xuXG5cdFx0XHQvLyBPYmplY3QgbmFtZXMgbXVzdCBiZSBjaGVja2VkIGFnYWluc3QgYW4gYWxsb3dsaXN0LiBPdGhlcndpc2UsIHRoZXJlXG5cdFx0XHQvLyBpcyBubyB3YXkgdG8gcGFyc2UgJ2Zvby5iYXIuYmF6JzogJ2JheicgbXVzdCBiZSBhIHByb3BlcnR5LCBidXRcblx0XHRcdC8vICdiYXInIGNvdWxkIGJlIHRoZSBvYmplY3ROYW1lLCBvciBwYXJ0IG9mIGEgbm9kZU5hbWUgKHdoaWNoIGNhblxuXHRcdFx0Ly8gaW5jbHVkZSAnLicgY2hhcmFjdGVycykuXG5cdFx0XHRpZiAoIF9zdXBwb3J0ZWRPYmplY3ROYW1lcy5pbmRleE9mKCBvYmplY3ROYW1lICkgIT09IC0gMSApIHtcblxuXHRcdFx0XHRyZXN1bHRzLm5vZGVOYW1lID0gcmVzdWx0cy5ub2RlTmFtZS5zdWJzdHJpbmcoIDAsIGxhc3REb3QgKTtcblx0XHRcdFx0cmVzdWx0cy5vYmplY3ROYW1lID0gb2JqZWN0TmFtZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0aWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7XG5cblx0XHRcdHRocm93IG5ldyBFcnJvciggJ1Byb3BlcnR5QmluZGluZzogY2FuIG5vdCBwYXJzZSBwcm9wZXJ0eU5hbWUgZnJvbSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHRzO1xuXG5cdH0sXG5cblx0ZmluZE5vZGU6IGZ1bmN0aW9uICggcm9vdCwgbm9kZU5hbWUgKSB7XG5cblx0XHRpZiAoICEgbm9kZU5hbWUgfHwgbm9kZU5hbWUgPT09ICcnIHx8IG5vZGVOYW1lID09PSAnLicgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7XG5cblx0XHRcdHJldHVybiByb290O1xuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gc2tlbGV0b24gYm9uZXMuXG5cdFx0aWYgKCByb290LnNrZWxldG9uICkge1xuXG5cdFx0XHRjb25zdCBib25lID0gcm9vdC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKCBub2RlTmFtZSApO1xuXG5cdFx0XHRpZiAoIGJvbmUgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRyZXR1cm4gYm9uZTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gc2VhcmNoIGludG8gbm9kZSBzdWJ0cmVlLlxuXHRcdGlmICggcm9vdC5jaGlsZHJlbiApIHtcblxuXHRcdFx0Y29uc3Qgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkge1xuXG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGNoaWxkTm9kZSA9IGNoaWxkcmVuWyBpIF07XG5cblx0XHRcdFx0XHRpZiAoIGNoaWxkTm9kZS5uYW1lID09PSBub2RlTmFtZSB8fCBjaGlsZE5vZGUudXVpZCA9PT0gbm9kZU5hbWUgKSB7XG5cblx0XHRcdFx0XHRcdHJldHVybiBjaGlsZE5vZGU7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCByZXN1bHQgPSBzZWFyY2hOb2RlU3VidHJlZSggY2hpbGROb2RlLmNoaWxkcmVuICk7XG5cblx0XHRcdFx0XHRpZiAoIHJlc3VsdCApIHJldHVybiByZXN1bHQ7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0XHR9O1xuXG5cdFx0XHRjb25zdCBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7XG5cblx0XHRcdGlmICggc3ViVHJlZU5vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHN1YlRyZWVOb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggUHJvcGVydHlCaW5kaW5nLnByb3RvdHlwZSwgeyAvLyBwcm90b3R5cGUsIGNvbnRpbnVlZFxuXG5cdC8vIHRoZXNlIGFyZSB1c2VkIHRvIFwiYmluZFwiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHlcblx0X2dldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblx0X3NldFZhbHVlX3VuYXZhaWxhYmxlOiBmdW5jdGlvbiAoKSB7fSxcblxuXHRCaW5kaW5nVHlwZToge1xuXHRcdERpcmVjdDogMCxcblx0XHRFbnRpcmVBcnJheTogMSxcblx0XHRBcnJheUVsZW1lbnQ6IDIsXG5cdFx0SGFzRnJvbVRvQXJyYXk6IDNcblx0fSxcblxuXHRWZXJzaW9uaW5nOiB7XG5cdFx0Tm9uZTogMCxcblx0XHROZWVkc1VwZGF0ZTogMSxcblx0XHRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyXG5cdH0sXG5cblx0R2V0dGVyQnlCaW5kaW5nVHlwZTogW1xuXG5cdFx0ZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0YnVmZmVyWyBvZmZzZXQgXSA9IHRoaXMubm9kZVsgdGhpcy5wcm9wZXJ0eU5hbWUgXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdGNvbnN0IHNvdXJjZSA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gc291cmNlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRidWZmZXJbIG9mZnNldCArKyBdID0gc291cmNlWyBpIF07XG5cblx0XHRcdH1cblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTtcblxuXHRcdH0sXG5cblx0XHRmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5LnRvQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cblx0XHR9XG5cblx0XSxcblxuXHRTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzogW1xuXG5cdFx0W1xuXHRcdFx0Ly8gRGlyZWN0XG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3RbIHRoaXMucHJvcGVydHlOYW1lIF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0XSwgW1xuXG5cdFx0XHQvLyBFbnRpcmVBcnJheVxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7XG5cblx0XHRcdFx0Y29uc3QgZGVzdCA9IHRoaXMucmVzb2x2ZWRQcm9wZXJ0eTtcblxuXHRcdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRcdGRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdLCBbXG5cblx0XHRcdC8vIEFycmF5RWxlbWVudFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnQoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH0sXG5cblx0XHRcdGZ1bmN0aW9uIHNldFZhbHVlX2FycmF5RWxlbWVudF9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTtcblx0XHRcdFx0dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRcdH1cblxuXHRcdF0sIFtcblxuXHRcdFx0Ly8gSGFzVG9Gcm9tQXJyYXlcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApIHtcblxuXHRcdFx0XHR0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApO1xuXG5cdFx0XHR9LFxuXG5cdFx0XHRmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdFx0fSxcblxuXHRcdFx0ZnVuY3Rpb24gc2V0VmFsdWVfZnJvbUFycmF5X3NldE1hdHJpeFdvcmxkTmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkge1xuXG5cdFx0XHRcdHRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7XG5cdFx0XHRcdHRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0XHR9XG5cblx0XHRdXG5cblx0XSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWVfdW5ib3VuZCggdGFyZ2V0QXJyYXksIG9mZnNldCApIHtcblxuXHRcdHRoaXMuYmluZCgpO1xuXHRcdHRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTtcblxuXHRcdC8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOlxuXHRcdC8vICdiaW5kJyBzZXRzICd0aGlzLmdldFZhbHVlJyAvICdzZXRWYWx1ZScgYW5kIHNoYWRvd3MgdGhlXG5cdFx0Ly8gcHJvdG90eXBlIHZlcnNpb24gb2YgdGhlc2UgbWV0aG9kcyB3aXRoIG9uZSB0aGF0IHJlcHJlc2VudHNcblx0XHQvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHNcblx0XHQvLyBiZWNvbWUgbm8tb3BzLlxuXG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLmJpbmQoKTtcblx0XHR0aGlzLnNldFZhbHVlKCBzb3VyY2VBcnJheSwgb2Zmc2V0ICk7XG5cblx0fSxcblxuXHQvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoXG5cdGJpbmQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdGxldCB0YXJnZXRPYmplY3QgPSB0aGlzLm5vZGU7XG5cdFx0Y29uc3QgcGFyc2VkUGF0aCA9IHRoaXMucGFyc2VkUGF0aDtcblxuXHRcdGNvbnN0IG9iamVjdE5hbWUgPSBwYXJzZWRQYXRoLm9iamVjdE5hbWU7XG5cdFx0Y29uc3QgcHJvcGVydHlOYW1lID0gcGFyc2VkUGF0aC5wcm9wZXJ0eU5hbWU7XG5cdFx0bGV0IHByb3BlcnR5SW5kZXggPSBwYXJzZWRQYXRoLnByb3BlcnR5SW5kZXg7XG5cblx0XHRpZiAoICEgdGFyZ2V0T2JqZWN0ICkge1xuXG5cdFx0XHR0YXJnZXRPYmplY3QgPSBQcm9wZXJ0eUJpbmRpbmcuZmluZE5vZGUoIHRoaXMucm9vdE5vZGUsIHBhcnNlZFBhdGgubm9kZU5hbWUgKSB8fCB0aGlzLnJvb3ROb2RlO1xuXG5cdFx0XHR0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7XG5cblx0XHR9XG5cblx0XHQvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvclxuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmF2YWlsYWJsZTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5fc2V0VmFsdWVfdW5hdmFpbGFibGU7XG5cblx0XHQvLyBlbnN1cmUgdGhlcmUgaXMgYSB2YWx1ZSBub2RlXG5cdFx0aWYgKCAhIHRhcmdldE9iamVjdCApIHtcblxuXHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogJyArIHRoaXMucGF0aCArICcgYnV0IGl0IHdhc25cXCd0IGZvdW5kLicgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGlmICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0bGV0IG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDtcblxuXHRcdFx0Ly8gc3BlY2lhbCBjYXNlcyB3ZXJlIHdlIG5lZWQgdG8gcmVhY2ggZGVlcGVyIGludG8gdGhlIGhpZXJhcmNoeSB0byBnZXQgdGhlIGZhY2UgbWF0ZXJpYWxzLi4uLlxuXHRcdFx0c3dpdGNoICggb2JqZWN0TmFtZSApIHtcblxuXHRcdFx0XHRjYXNlICdtYXRlcmlhbHMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3QubWF0ZXJpYWwubWF0ZXJpYWxzO1xuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSAnYm9uZXMnOlxuXG5cdFx0XHRcdFx0aWYgKCAhIHRhcmdldE9iamVjdC5za2VsZXRvbiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIGJvbmVzIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIHNrZWxldG9uLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHBvdGVudGlhbCBmdXR1cmUgb3B0aW1pemF0aW9uOiBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXJcblx0XHRcdFx0XHQvLyBhbmQgY29udmVydCB0aGUgaW50ZWdlciBzdHJpbmcgdG8gYSB0cnVlIGludGVnZXIuXG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Quc2tlbGV0b24uYm9uZXM7XG5cblx0XHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIGkgXS5uYW1lID09PSBvYmplY3RJbmRleCApIHtcblxuXHRcdFx0XHRcdFx0XHRvYmplY3RJbmRleCA9IGk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblxuXHRcdFx0XHRkZWZhdWx0OlxuXG5cdFx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gb2JqZWN0TmFtZSBvZiBub2RlIHVuZGVmaW5lZC4nLCB0aGlzICk7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3RbIG9iamVjdE5hbWUgXTtcblxuXHRcdFx0fVxuXG5cblx0XHRcdGlmICggb2JqZWN0SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4nLCB0aGlzLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdFsgb2JqZWN0SW5kZXggXTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Ly8gcmVzb2x2ZSBwcm9wZXJ0eVxuXHRcdGNvbnN0IG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07XG5cblx0XHRpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IFRyeWluZyB0byB1cGRhdGUgcHJvcGVydHkgZm9yIHRyYWNrOiAnICsgbm9kZU5hbWUgK1xuXHRcdFx0XHQnLicgKyBwcm9wZXJ0eU5hbWUgKyAnIGJ1dCBpdCB3YXNuXFwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdC8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZVxuXHRcdGxldCB2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk5vbmU7XG5cblx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblxuXHRcdGlmICggdGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlICE9PSB1bmRlZmluZWQgKSB7IC8vIG1hdGVyaWFsXG5cblx0XHRcdHZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7XG5cblx0XHR9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybVxuXG5cdFx0XHR2ZXJzaW9uaW5nID0gdGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGU7XG5cblx0XHR9XG5cblx0XHQvLyBkZXRlcm1pbmUgaG93IHRoZSBwcm9wZXJ0eSBnZXRzIGJvdW5kXG5cdFx0bGV0IGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7XG5cblx0XHRpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gYWNjZXNzIGEgc3ViIGVsZW1lbnQgb2YgdGhlIHByb3BlcnR5IGFycmF5IChvbmx5IHByaW1pdGl2ZXMgYXJlIHN1cHBvcnRlZCByaWdodCBub3cpXG5cblx0XHRcdGlmICggcHJvcGVydHlOYW1lID09PSAnbW9ycGhUYXJnZXRJbmZsdWVuY2VzJyApIHtcblxuXHRcdFx0XHQvLyBwb3RlbnRpYWwgb3B0aW1pemF0aW9uLCBza2lwIHRoaXMgaWYgcHJvcGVydHlJbmRleCBpcyBhbHJlYWR5IGFuIGludGVnZXIsIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci5cblxuXHRcdFx0XHQvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuXG5cdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkgKSB7XG5cblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCB0YXJnZXRPYmplY3QuZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHtcblxuXHRcdFx0XHRcdGlmICggISB0YXJnZXRPYmplY3QuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICkge1xuXG5cdFx0XHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLicsIHRoaXMgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICggdGFyZ2V0T2JqZWN0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgcHJvcGVydHlJbmRleCBdICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0XHRcdHByb3BlcnR5SW5kZXggPSB0YXJnZXRPYmplY3QubW9ycGhUYXJnZXREaWN0aW9uYXJ5WyBwcm9wZXJ0eUluZGV4IF07XG5cblx0XHRcdFx0XHR9XG5cblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBvbiBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJywgdGhpcyApO1xuXHRcdFx0XHRcdHJldHVybjtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdFx0YmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXHRcdFx0dGhpcy5wcm9wZXJ0eUluZGV4ID0gcHJvcGVydHlJbmRleDtcblxuXHRcdH0gZWxzZSBpZiAoIG5vZGVQcm9wZXJ0eS5mcm9tQXJyYXkgIT09IHVuZGVmaW5lZCAmJiBub2RlUHJvcGVydHkudG9BcnJheSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHQvLyBtdXN0IHVzZSBjb3B5IGZvciBPYmplY3QzRC5FdWxlci9RdWF0ZXJuaW9uXG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggbm9kZVByb3BlcnR5ICkgKSB7XG5cblx0XHRcdGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5FbnRpcmVBcnJheTtcblxuXHRcdFx0dGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5O1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5wcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7XG5cblx0XHR9XG5cblx0XHQvLyBzZWxlY3QgZ2V0dGVyIC8gc2V0dGVyXG5cdFx0dGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTtcblx0XHR0aGlzLnNldFZhbHVlID0gdGhpcy5TZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZ1sgYmluZGluZ1R5cGUgXVsgdmVyc2lvbmluZyBdO1xuXG5cdH0sXG5cblx0dW5iaW5kOiBmdW5jdGlvbiAoKSB7XG5cblx0XHR0aGlzLm5vZGUgPSBudWxsO1xuXG5cdFx0Ly8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZVxuXHRcdC8vIG5vdGU6IGF2b2lkaW5nIHRvIG11dGF0ZSB0aGUgc2hhcGUgb2YgJ3RoaXMnIHZpYSAnZGVsZXRlJ1xuXHRcdHRoaXMuZ2V0VmFsdWUgPSB0aGlzLl9nZXRWYWx1ZV91bmJvdW5kO1xuXHRcdHRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kO1xuXG5cdH1cblxufSApO1xuXG4vLyBERUNMQVJFIEFMSUFTIEFGVEVSIGFzc2lnbiBwcm90b3R5cGVcbk9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHtcblxuXHQvLyBpbml0aWFsIHN0YXRlIG9mIHRoZXNlIG1ldGhvZHMgdGhhdCBjYWxscyAnYmluZCdcblx0X2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsXG5cdF9zZXRWYWx1ZV91bmJvdW5kOiBQcm9wZXJ0eUJpbmRpbmcucHJvdG90eXBlLnNldFZhbHVlLFxuXG59ICk7XG5cbi8qKlxuICpcbiAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS5cbiAqXG4gKiBVc2FnZTpcbiAqXG4gKiAgLSBBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZVxuICogICAgY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci5cbiAqXG4gKiAgLSBJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLlxuICpcbiAqICAtIFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyXG4gKiAgICBpcyBydW5uaW5nLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAgT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlcixcbiAqICAgIHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmVcbiAqICAgIG9uIHRoZSBncm91cC5cbiAqXG4gKiBMaW1pdGF0aW9uOlxuICpcbiAqICAtIFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGVcbiAqICAgIGFsbCBvYmplY3RzIGluIHRoZSBncm91cC5cbiAqXG4gKiAgLSBBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhXG4gKiAgICB0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC5cbiAqL1xuXG5jbGFzcyBBbmltYXRpb25PYmplY3RHcm91cCB7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cblx0XHR0aGlzLnV1aWQgPSBNYXRoVXRpbHMuZ2VuZXJhdGVVVUlEKCk7XG5cblx0XHQvLyBjYWNoZWQgb2JqZWN0cyBmb2xsb3dlZCBieSB0aGUgYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9vYmplY3RzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoIGFyZ3VtZW50cyApO1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSAwOyAvLyB0aHJlc2hvbGRcblx0XHQvLyBub3RlOiByZWFkIGJ5IFByb3BlcnR5QmluZGluZy5Db21wb3NpdGVcblxuXHRcdGNvbnN0IGluZGljZXMgPSB7fTtcblx0XHR0aGlzLl9pbmRpY2VzQnlVVUlEID0gaW5kaWNlczsgLy8gZm9yIGJvb2trZWVwaW5nXG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRpbmRpY2VzWyBhcmd1bWVudHNbIGkgXS51dWlkIF0gPSBpO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy5fcGF0aHMgPSBbXTsgLy8gaW5zaWRlOiBzdHJpbmdcblx0XHR0aGlzLl9wYXJzZWRQYXRocyA9IFtdOyAvLyBpbnNpZGU6IHsgd2UgZG9uJ3QgY2FyZSwgaGVyZSB9XG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gaW5zaWRlOiBBcnJheTwgUHJvcGVydHlCaW5kaW5nID5cblx0XHR0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGggPSB7fTsgLy8gaW5zaWRlOiBpbmRpY2VzIGluIHRoZXNlIGFycmF5c1xuXG5cdFx0Y29uc3Qgc2NvcGUgPSB0aGlzO1xuXG5cdFx0dGhpcy5zdGF0cyA9IHtcblxuXHRcdFx0b2JqZWN0czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX29iamVjdHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRvdGFsIC0gc2NvcGUubkNhY2hlZE9iamVjdHNfO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRcdH1cblxuXHRcdH07XG5cblx0fVxuXG5cdGFkZCgpIHtcblxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0cGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocyxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRsZXQga25vd25PYmplY3QgPSB1bmRlZmluZWQsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQ7XG5cdFx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHQvLyB1bmtub3duIG9iamVjdCAtPiBhZGQgaXQgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRpbmRleCA9IG5PYmplY3RzICsrO1xuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBpbmRleDtcblx0XHRcdFx0b2JqZWN0cy5wdXNoKCBvYmplY3QgKTtcblxuXHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0Zm9yICggbGV0IGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0YmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRrbm93bk9iamVjdCA9IG9iamVjdHNbIGluZGV4IF07XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgdG8gdGhlIEFDVElWRSByZWdpb25cblxuXHRcdFx0XHRjb25zdCBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsXG5cdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXTtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4O1xuXHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBvYmplY3Q7XG5cblx0XHRcdFx0Ly8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5nc1xuXG5cdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRsYXN0Q2FjaGVkID0gYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRcdFx0XHRsZXQgYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cblx0XHRcdFx0XHRpZiAoIGJpbmRpbmcgPT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzXG5cdFx0XHRcdFx0XHQvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heVxuXHRcdFx0XHRcdFx0Ly8gb3IgbWF5IG5vdCBleGlzdFxuXG5cdFx0XHRcdFx0XHRiaW5kaW5nID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoc1sgaiBdLCBwYXJzZWRQYXRoc1sgaiBdICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBvYmplY3RzWyBpbmRleCBdICE9PSBrbm93bk9iamVjdCApIHtcblxuXHRcdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICtcblx0XHRcdFx0XHQnZGV0ZWN0ZWQuIENsZWFuIHRoZSBjYWNoZXMgb3IgcmVjcmVhdGUgeW91ciBpbmZyYXN0cnVjdHVyZSB3aGVuIHJlbG9hZGluZyBzY2VuZXMuJyApO1xuXG5cdFx0XHR9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmVcblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9XG5cblx0cmVtb3ZlKCkge1xuXG5cdFx0Y29uc3Qgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRuQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7XG5cblx0XHRsZXQgbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXztcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLFxuXHRcdFx0XHR1dWlkID0gb2JqZWN0LnV1aWQsXG5cdFx0XHRcdGluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRpZiAoIGluZGV4ICE9PSB1bmRlZmluZWQgJiYgaW5kZXggPj0gbkNhY2hlZE9iamVjdHMgKSB7XG5cblx0XHRcdFx0Ly8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdGNvbnN0IGxhc3RDYWNoZWRJbmRleCA9IG5DYWNoZWRPYmplY3RzICsrLFxuXHRcdFx0XHRcdGZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07XG5cblx0XHRcdFx0aW5kaWNlc0J5VVVJRFsgZmlyc3RBY3RpdmVPYmplY3QudXVpZCBdID0gaW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDtcblxuXHRcdFx0XHRpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBsYXN0Q2FjaGVkSW5kZXg7XG5cdFx0XHRcdG9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0O1xuXG5cdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRjb25zdCBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLFxuXHRcdFx0XHRcdFx0Zmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLFxuXHRcdFx0XHRcdFx0YmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTtcblxuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlO1xuXHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgbGFzdENhY2hlZEluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fSAvLyBmb3IgYXJndW1lbnRzXG5cblx0XHR0aGlzLm5DYWNoZWRPYmplY3RzXyA9IG5DYWNoZWRPYmplY3RzO1xuXG5cdH1cblxuXHQvLyByZW1vdmUgJiBmb3JnZXRcblx0dW5jYWNoZSgpIHtcblxuXHRcdGNvbnN0IG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLFxuXHRcdFx0aW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsXG5cdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0bGV0IG5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0Y29uc3Qgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sXG5cdFx0XHRcdHV1aWQgPSBvYmplY3QudXVpZCxcblx0XHRcdFx0aW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07XG5cblx0XHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBjYWNoZWQsIHNocmluayB0aGUgQ0FDSEVEIHJlZ2lvblxuXG5cdFx0XHRcdFx0Y29uc3QgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdENhY2hlZE9iamVjdCA9IG9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBjYWNoZWQgb2JqZWN0IHRha2VzIHRoaXMgb2JqZWN0J3MgcGxhY2Vcblx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXHRcdFx0XHRcdG9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0O1xuXG5cdFx0XHRcdFx0Ly8gbGFzdCBvYmplY3QgZ29lcyB0byB0aGUgYWN0aXZhdGVkIHNsb3QgYW5kIHBvcFxuXHRcdFx0XHRcdGluZGljZXNCeVVVSURbIGxhc3RPYmplY3QudXVpZCBdID0gZmlyc3RBY3RpdmVJbmRleDtcblx0XHRcdFx0XHRvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0O1xuXHRcdFx0XHRcdG9iamVjdHMucG9wKCk7XG5cblx0XHRcdFx0XHQvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzXG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGNvbnN0IGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF0sXG5cdFx0XHRcdFx0XHRcdGxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSxcblx0XHRcdFx0XHRcdFx0bGFzdCA9IGJpbmRpbmdzRm9yUGF0aFsgbGFzdEluZGV4IF07XG5cblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGxhc3RDYWNoZWQ7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSA9IGxhc3Q7XG5cdFx0XHRcdFx0XHRiaW5kaW5nc0ZvclBhdGgucG9wKCk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIG9iamVjdCBpcyBhY3RpdmUsIGp1c3Qgc3dhcCB3aXRoIHRoZSBsYXN0IGFuZCBwb3BcblxuXHRcdFx0XHRcdGNvbnN0IGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLFxuXHRcdFx0XHRcdFx0bGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdO1xuXG5cdFx0XHRcdFx0aWYgKCBsYXN0SW5kZXggPiAwICkge1xuXG5cdFx0XHRcdFx0XHRpbmRpY2VzQnlVVUlEWyBsYXN0T2JqZWN0LnV1aWQgXSA9IGluZGV4O1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0b2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7XG5cdFx0XHRcdFx0b2JqZWN0cy5wb3AoKTtcblxuXHRcdFx0XHRcdC8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3NcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHtcblxuXHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXTtcblxuXHRcdFx0XHRcdFx0YmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTtcblx0XHRcdFx0XHRcdGJpbmRpbmdzRm9yUGF0aC5wb3AoKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9IC8vIGNhY2hlZCBvciBhY3RpdmVcblxuXHRcdFx0fSAvLyBpZiBvYmplY3QgaXMga25vd25cblxuXHRcdH0gLy8gZm9yIGFyZ3VtZW50c1xuXG5cdFx0dGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0cztcblxuXHR9XG5cblx0Ly8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOlxuXG5cdHN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKSB7XG5cblx0XHQvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWRcblx0XHQvLyBhY2NvcmRpbmcgdG8gdGhlIGNvbnRhaW5lZCBvYmplY3RzIGluIHRoZSBncm91cFxuXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aDtcblx0XHRsZXQgaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF07XG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncztcblxuXHRcdGlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHJldHVybiBiaW5kaW5nc1sgaW5kZXggXTtcblxuXHRcdGNvbnN0IHBhdGhzID0gdGhpcy5fcGF0aHMsXG5cdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0b2JqZWN0cyA9IHRoaXMuX29iamVjdHMsXG5cdFx0XHRuT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLFxuXHRcdFx0bkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXyxcblx0XHRcdGJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTtcblxuXHRcdGluZGV4ID0gYmluZGluZ3MubGVuZ3RoO1xuXG5cdFx0aW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7XG5cblx0XHRwYXRocy5wdXNoKCBwYXRoICk7XG5cdFx0cGFyc2VkUGF0aHMucHVzaCggcGFyc2VkUGF0aCApO1xuXHRcdGJpbmRpbmdzLnB1c2goIGJpbmRpbmdzRm9yUGF0aCApO1xuXG5cdFx0Zm9yICggbGV0IGkgPSBuQ2FjaGVkT2JqZWN0cywgbiA9IG9iamVjdHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBvYmplY3QgPSBvYmplY3RzWyBpIF07XG5cdFx0XHRiaW5kaW5nc0ZvclBhdGhbIGkgXSA9IG5ldyBQcm9wZXJ0eUJpbmRpbmcoIG9iamVjdCwgcGF0aCwgcGFyc2VkUGF0aCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJpbmRpbmdzRm9yUGF0aDtcblxuXHR9XG5cblx0dW5zdWJzY3JpYmVfKCBwYXRoICkge1xuXG5cdFx0Ly8gdGVsbHMgdGhlIGdyb3VwIHRvIGZvcmdldCBhYm91dCBhIHByb3BlcnR5IHBhdGggYW5kIG5vIGxvbmdlclxuXHRcdC8vIHVwZGF0ZSB0aGUgYXJyYXkgcHJldmlvdXNseSBvYnRhaW5lZCB3aXRoICdzdWJzY3JpYmVfJ1xuXG5cdFx0Y29uc3QgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCxcblx0XHRcdGluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdO1xuXG5cdFx0aWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zdCBwYXRocyA9IHRoaXMuX3BhdGhzLFxuXHRcdFx0XHRwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLFxuXHRcdFx0XHRiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsXG5cdFx0XHRcdGxhc3RCaW5kaW5ncyA9IGJpbmRpbmdzWyBsYXN0QmluZGluZ3NJbmRleCBdLFxuXHRcdFx0XHRsYXN0QmluZGluZ3NQYXRoID0gcGF0aFsgbGFzdEJpbmRpbmdzSW5kZXggXTtcblxuXHRcdFx0aW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7XG5cblx0XHRcdGJpbmRpbmdzWyBpbmRleCBdID0gbGFzdEJpbmRpbmdzO1xuXHRcdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRcdHBhcnNlZFBhdGhzWyBpbmRleCBdID0gcGFyc2VkUGF0aHNbIGxhc3RCaW5kaW5nc0luZGV4IF07XG5cdFx0XHRwYXJzZWRQYXRocy5wb3AoKTtcblxuXHRcdFx0cGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTtcblx0XHRcdHBhdGhzLnBvcCgpO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5BbmltYXRpb25PYmplY3RHcm91cC5wcm90b3R5cGUuaXNBbmltYXRpb25PYmplY3RHcm91cCA9IHRydWU7XG5cbmNsYXNzIEFuaW1hdGlvbkFjdGlvbiB7XG5cblx0Y29uc3RydWN0b3IoIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgPSBudWxsLCBibGVuZE1vZGUgPSBjbGlwLmJsZW5kTW9kZSApIHtcblxuXHRcdHRoaXMuX21peGVyID0gbWl4ZXI7XG5cdFx0dGhpcy5fY2xpcCA9IGNsaXA7XG5cdFx0dGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290O1xuXHRcdHRoaXMuYmxlbmRNb2RlID0gYmxlbmRNb2RlO1xuXG5cdFx0Y29uc3QgdHJhY2tzID0gY2xpcC50cmFja3MsXG5cdFx0XHRuVHJhY2tzID0gdHJhY2tzLmxlbmd0aCxcblx0XHRcdGludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHtcblx0XHRcdGVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLFxuXHRcdFx0ZW5kaW5nRW5kOiBaZXJvQ3VydmF0dXJlRW5kaW5nXG5cdFx0fTtcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgaW50ZXJwb2xhbnQgPSB0cmFja3NbIGkgXS5jcmVhdGVJbnRlcnBvbGFudCggbnVsbCApO1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0gPSBpbnRlcnBvbGFudDtcblx0XHRcdGludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5ncztcblxuXHRcdH1cblxuXHRcdHRoaXMuX2ludGVycG9sYW50U2V0dGluZ3MgPSBpbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0dGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAvLyBib3VuZCBieSB0aGUgbWl4ZXJcblxuXHRcdC8vIGluc2lkZTogUHJvcGVydHlNaXhlciAobWFuYWdlZCBieSB0aGUgbWl4ZXIpXG5cdFx0dGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IG5ldyBBcnJheSggblRyYWNrcyApO1xuXG5cdFx0dGhpcy5fY2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXJcblx0XHR0aGlzLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsgLy8gZm9yIHRoZSBtZW1vcnkgbWFuYWdlclxuXG5cdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdHRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDtcblxuXHRcdHRoaXMubG9vcCA9IExvb3BSZXBlYXQ7XG5cdFx0dGhpcy5fbG9vcENvdW50ID0gLSAxO1xuXG5cdFx0Ly8gZ2xvYmFsIG1peGVyIHRpbWUgd2hlbiB0aGUgYWN0aW9uIGlzIHRvIGJlIHN0YXJ0ZWRcblx0XHQvLyBpdCdzIHNldCBiYWNrIHRvICdudWxsJyB1cG9uIHN0YXJ0IG9mIHRoZSBhY3Rpb25cblx0XHR0aGlzLl9zdGFydFRpbWUgPSBudWxsO1xuXG5cdFx0Ly8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvblxuXHRcdC8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3Bcblx0XHR0aGlzLnRpbWUgPSAwO1xuXG5cdFx0dGhpcy50aW1lU2NhbGUgPSAxO1xuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IDE7XG5cblx0XHR0aGlzLndlaWdodCA9IDE7XG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gMTtcblxuXHRcdHRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgLy8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZ1xuXG5cdFx0dGhpcy5wYXVzZWQgPSBmYWxzZTsgLy8gdHJ1ZSAtPiB6ZXJvIGVmZmVjdGl2ZSB0aW1lIHNjYWxlXG5cdFx0dGhpcy5lbmFibGVkID0gdHJ1ZTsgLy8gZmFsc2UgLT4gemVybyBlZmZlY3RpdmUgd2VpZ2h0XG5cblx0XHR0aGlzLmNsYW1wV2hlbkZpbmlzaGVkID0gZmFsc2U7Ly8ga2VlcCBmZWVkaW5nIHRoZSBsYXN0IGZyYW1lP1xuXG5cdFx0dGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID0gdHJ1ZTsvLyBmb3Igc21vb3RoIGludGVycG9sYXRpb24gdy9vIHNlcGFyYXRlXG5cdFx0dGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmRcblxuXHR9XG5cblx0Ly8gU3RhdGUgJiBTY2hlZHVsaW5nXG5cblx0cGxheSgpIHtcblxuXHRcdHRoaXMuX21peGVyLl9hY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHN0b3AoKSB7XG5cblx0XHR0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbiggdGhpcyApO1xuXG5cdFx0cmV0dXJuIHRoaXMucmVzZXQoKTtcblxuXHR9XG5cblx0cmVzZXQoKSB7XG5cblx0XHR0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXHRcdHRoaXMuZW5hYmxlZCA9IHRydWU7XG5cblx0XHR0aGlzLnRpbWUgPSAwOyAvLyByZXN0YXJ0IGNsaXBcblx0XHR0aGlzLl9sb29wQ291bnQgPSAtIDE7Ly8gZm9yZ2V0IHByZXZpb3VzIGxvb3BzXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gbnVsbDsvLyBmb3JnZXQgc2NoZWR1bGluZ1xuXG5cdFx0cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7XG5cblx0fVxuXG5cdGlzUnVubmluZygpIHtcblxuXHRcdHJldHVybiB0aGlzLmVuYWJsZWQgJiYgISB0aGlzLnBhdXNlZCAmJiB0aGlzLnRpbWVTY2FsZSAhPT0gMCAmJlxuXHRcdFx0dGhpcy5fc3RhcnRUaW1lID09PSBudWxsICYmIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH1cblxuXHQvLyByZXR1cm4gdHJ1ZSB3aGVuIHBsYXkgaGFzIGJlZW4gY2FsbGVkXG5cdGlzU2NoZWR1bGVkKCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApO1xuXG5cdH1cblxuXHRzdGFydEF0KCB0aW1lICkge1xuXG5cdFx0dGhpcy5fc3RhcnRUaW1lID0gdGltZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRMb29wKCBtb2RlLCByZXBldGl0aW9ucyApIHtcblxuXHRcdHRoaXMubG9vcCA9IG1vZGU7XG5cdFx0dGhpcy5yZXBldGl0aW9ucyA9IHJlcGV0aXRpb25zO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIFdlaWdodFxuXG5cdC8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nXG5cdC8vIGFsdGhvdWdoIC5lbmFibGVkID0gZmFsc2UgeWllbGRzIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLmVuYWJsZWQsIGJlY2F1c2UgaXQgd291bGQgYmUgY29uZnVzaW5nXG5cdHNldEVmZmVjdGl2ZVdlaWdodCggd2VpZ2h0ICkge1xuXG5cdFx0dGhpcy53ZWlnaHQgPSB3ZWlnaHQ7XG5cblx0XHQvLyBub3RlOiBzYW1lIGxvZ2ljIGFzIHdoZW4gdXBkYXRlZCBhdCBydW50aW1lXG5cdFx0dGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHR9XG5cblx0Ly8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZFxuXHRnZXRFZmZlY3RpdmVXZWlnaHQoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlV2VpZ2h0O1xuXG5cdH1cblxuXHRmYWRlSW4oIGR1cmF0aW9uICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApO1xuXG5cdH1cblxuXHRmYWRlT3V0KCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyggZHVyYXRpb24sIDEsIDAgKTtcblxuXHR9XG5cblx0Y3Jvc3NGYWRlRnJvbSggZmFkZU91dEFjdGlvbiwgZHVyYXRpb24sIHdhcnAgKSB7XG5cblx0XHRmYWRlT3V0QWN0aW9uLmZhZGVPdXQoIGR1cmF0aW9uICk7XG5cdFx0dGhpcy5mYWRlSW4oIGR1cmF0aW9uICk7XG5cblx0XHRpZiAoIHdhcnAgKSB7XG5cblx0XHRcdGNvbnN0IGZhZGVJbkR1cmF0aW9uID0gdGhpcy5fY2xpcC5kdXJhdGlvbixcblx0XHRcdFx0ZmFkZU91dER1cmF0aW9uID0gZmFkZU91dEFjdGlvbi5fY2xpcC5kdXJhdGlvbixcblxuXHRcdFx0XHRzdGFydEVuZFJhdGlvID0gZmFkZU91dER1cmF0aW9uIC8gZmFkZUluRHVyYXRpb24sXG5cdFx0XHRcdGVuZFN0YXJ0UmF0aW8gPSBmYWRlSW5EdXJhdGlvbiAvIGZhZGVPdXREdXJhdGlvbjtcblxuXHRcdFx0ZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7XG5cdFx0XHR0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjcm9zc0ZhZGVUbyggZmFkZUluQWN0aW9uLCBkdXJhdGlvbiwgd2FycCApIHtcblxuXHRcdHJldHVybiBmYWRlSW5BY3Rpb24uY3Jvc3NGYWRlRnJvbSggdGhpcywgZHVyYXRpb24sIHdhcnAgKTtcblxuXHR9XG5cblx0c3RvcEZhZGluZygpIHtcblxuXHRcdGNvbnN0IHdlaWdodEludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIHdlaWdodEludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHR0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IG51bGw7XG5cdFx0XHR0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIHdlaWdodEludGVycG9sYW50ICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gVGltZSBTY2FsZSBDb250cm9sXG5cblx0Ly8gc2V0IHRoZSB0aW1lIHNjYWxlIHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgd2FycGluZ1xuXHQvLyBhbHRob3VnaCAucGF1c2VkID0gdHJ1ZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHRpbWUgc2NhbGUgb2YgemVybywgdGhpc1xuXHQvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmdcblx0c2V0RWZmZWN0aXZlVGltZVNjYWxlKCB0aW1lU2NhbGUgKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHR0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aGlzLnBhdXNlZCA/IDAgOiB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH1cblxuXHQvLyByZXR1cm4gdGhlIHRpbWUgc2NhbGUgY29uc2lkZXJpbmcgd2FycGluZyBhbmQgLnBhdXNlZFxuXHRnZXRFZmZlY3RpdmVUaW1lU2NhbGUoKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlO1xuXG5cdH1cblxuXHRzZXREdXJhdGlvbiggZHVyYXRpb24gKSB7XG5cblx0XHR0aGlzLnRpbWVTY2FsZSA9IHRoaXMuX2NsaXAuZHVyYXRpb24gLyBkdXJhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0fVxuXG5cdHN5bmNXaXRoKCBhY3Rpb24gKSB7XG5cblx0XHR0aGlzLnRpbWUgPSBhY3Rpb24udGltZTtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IGFjdGlvbi50aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpO1xuXG5cdH1cblxuXHRoYWx0KCBkdXJhdGlvbiApIHtcblxuXHRcdHJldHVybiB0aGlzLndhcnAoIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSwgMCwgZHVyYXRpb24gKTtcblxuXHR9XG5cblx0d2FycCggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7XG5cblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLFxuXHRcdFx0bm93ID0gbWl4ZXIudGltZSxcblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0bGV0IGludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7XG5cblx0XHRpZiAoIGludGVycG9sYW50ID09PSBudWxsICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7XG5cdFx0XHR0aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0Y29uc3QgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsXG5cdFx0XHR2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7XG5cblx0XHR0aW1lc1sgMCBdID0gbm93O1xuXHRcdHRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjtcblxuXHRcdHZhbHVlc1sgMCBdID0gc3RhcnRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cdFx0dmFsdWVzWyAxIF0gPSBlbmRUaW1lU2NhbGUgLyB0aW1lU2NhbGU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c3RvcFdhcnBpbmcoKSB7XG5cblx0XHRjb25zdCB0aW1lU2NhbGVJbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0aWYgKCB0aW1lU2NhbGVJbnRlcnBvbGFudCAhPT0gbnVsbCApIHtcblxuXHRcdFx0dGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsO1xuXHRcdFx0dGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB0aW1lU2NhbGVJbnRlcnBvbGFudCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIE9iamVjdCBBY2Nlc3NvcnNcblxuXHRnZXRNaXhlcigpIHtcblxuXHRcdHJldHVybiB0aGlzLl9taXhlcjtcblxuXHR9XG5cblx0Z2V0Q2xpcCgpIHtcblxuXHRcdHJldHVybiB0aGlzLl9jbGlwO1xuXG5cdH1cblxuXHRnZXRSb290KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9taXhlci5fcm9vdDtcblxuXHR9XG5cblx0Ly8gSW50ZXJuYVxuXG5cdF91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICkge1xuXG5cdFx0Ly8gY2FsbGVkIGJ5IHRoZSBtaXhlclxuXG5cdFx0aWYgKCAhIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0Ly8gY2FsbCAuX3VwZGF0ZVdlaWdodCgpIHRvIHVwZGF0ZSAuX2VmZmVjdGl2ZVdlaWdodFxuXG5cdFx0XHR0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTtcblx0XHRcdHJldHVybjtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHN0YXJ0VGltZSA9IHRoaXMuX3N0YXJ0VGltZTtcblxuXHRcdGlmICggc3RhcnRUaW1lICE9PSBudWxsICkge1xuXG5cdFx0XHQvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvblxuXG5cdFx0XHRjb25zdCB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjtcblx0XHRcdGlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuOyAvLyB5ZXQgdG8gY29tZSAvIGRvbid0IGRlY2lkZSB3aGVuIGRlbHRhID0gMFxuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHN0YXJ0XG5cblx0XHRcdHRoaXMuX3N0YXJ0VGltZSA9IG51bGw7IC8vIHVuc2NoZWR1bGVcblx0XHRcdGRlbHRhVGltZSA9IHRpbWVEaXJlY3Rpb24gKiB0aW1lUnVubmluZztcblxuXHRcdH1cblxuXHRcdC8vIGFwcGx5IHRpbWUgc2NhbGUgYW5kIGFkdmFuY2UgdGltZVxuXG5cdFx0ZGVsdGFUaW1lICo9IHRoaXMuX3VwZGF0ZVRpbWVTY2FsZSggdGltZSApO1xuXHRcdGNvbnN0IGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7XG5cblx0XHQvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpblxuXHRcdC8vIGFuIGVmZmVjdGl2ZSB3ZWlnaHQgb2YgMFxuXG5cdFx0Y29uc3Qgd2VpZ2h0ID0gdGhpcy5fdXBkYXRlV2VpZ2h0KCB0aW1lICk7XG5cblx0XHRpZiAoIHdlaWdodCA+IDAgKSB7XG5cblx0XHRcdGNvbnN0IGludGVycG9sYW50cyA9IHRoaXMuX2ludGVycG9sYW50cztcblx0XHRcdGNvbnN0IHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5ncztcblxuXHRcdFx0c3dpdGNoICggdGhpcy5ibGVuZE1vZGUgKSB7XG5cblx0XHRcdFx0Y2FzZSBBZGRpdGl2ZUFuaW1hdGlvbkJsZW5kTW9kZTpcblxuXHRcdFx0XHRcdGZvciAoIGxldCBqID0gMCwgbSA9IGludGVycG9sYW50cy5sZW5ndGg7IGogIT09IG07ICsrIGogKSB7XG5cblx0XHRcdFx0XHRcdGludGVycG9sYW50c1sgaiBdLmV2YWx1YXRlKCBjbGlwVGltZSApO1xuXHRcdFx0XHRcdFx0cHJvcGVydHlNaXhlcnNbIGogXS5hY2N1bXVsYXRlQWRkaXRpdmUoIHdlaWdodCApO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdFx0Y2FzZSBOb3JtYWxBbmltYXRpb25CbGVuZE1vZGU6XG5cdFx0XHRcdGRlZmF1bHQ6XG5cblx0XHRcdFx0XHRmb3IgKCBsZXQgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkge1xuXG5cdFx0XHRcdFx0XHRpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTtcblx0XHRcdFx0XHRcdHByb3BlcnR5TWl4ZXJzWyBqIF0uYWNjdW11bGF0ZSggYWNjdUluZGV4LCB3ZWlnaHQgKTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRfdXBkYXRlV2VpZ2h0KCB0aW1lICkge1xuXG5cdFx0bGV0IHdlaWdodCA9IDA7XG5cblx0XHRpZiAoIHRoaXMuZW5hYmxlZCApIHtcblxuXHRcdFx0d2VpZ2h0ID0gdGhpcy53ZWlnaHQ7XG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0d2VpZ2h0ICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BGYWRpbmcoKTtcblxuXHRcdFx0XHRcdGlmICggaW50ZXJwb2xhbnRWYWx1ZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZmFkZWQgb3V0LCBkaXNhYmxlXG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZWQgPSBmYWxzZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IHdlaWdodDtcblx0XHRyZXR1cm4gd2VpZ2h0O1xuXG5cdH1cblxuXHRfdXBkYXRlVGltZVNjYWxlKCB0aW1lICkge1xuXG5cdFx0bGV0IHRpbWVTY2FsZSA9IDA7XG5cblx0XHRpZiAoICEgdGhpcy5wYXVzZWQgKSB7XG5cblx0XHRcdHRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlO1xuXG5cdFx0XHRjb25zdCBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O1xuXG5cdFx0XHRpZiAoIGludGVycG9sYW50ICE9PSBudWxsICkge1xuXG5cdFx0XHRcdGNvbnN0IGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07XG5cblx0XHRcdFx0dGltZVNjYWxlICo9IGludGVycG9sYW50VmFsdWU7XG5cblx0XHRcdFx0aWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7XG5cblx0XHRcdFx0XHR0aGlzLnN0b3BXYXJwaW5nKCk7XG5cblx0XHRcdFx0XHRpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gbW90aW9uIGhhcyBoYWx0ZWQsIHBhdXNlXG5cdFx0XHRcdFx0XHR0aGlzLnBhdXNlZCA9IHRydWU7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHQvLyB3YXJwIGRvbmUgLSBhcHBseSBmaW5hbCB0aW1lIHNjYWxlXG5cdFx0XHRcdFx0XHR0aGlzLnRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRpbWVTY2FsZTtcblx0XHRyZXR1cm4gdGltZVNjYWxlO1xuXG5cdH1cblxuXHRfdXBkYXRlVGltZSggZGVsdGFUaW1lICkge1xuXG5cdFx0Y29uc3QgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uO1xuXHRcdGNvbnN0IGxvb3AgPSB0aGlzLmxvb3A7XG5cblx0XHRsZXQgdGltZSA9IHRoaXMudGltZSArIGRlbHRhVGltZTtcblx0XHRsZXQgbG9vcENvdW50ID0gdGhpcy5fbG9vcENvdW50O1xuXG5cdFx0Y29uc3QgcGluZ1BvbmcgPSAoIGxvb3AgPT09IExvb3BQaW5nUG9uZyApO1xuXG5cdFx0aWYgKCBkZWx0YVRpbWUgPT09IDAgKSB7XG5cblx0XHRcdGlmICggbG9vcENvdW50ID09PSAtIDEgKSByZXR1cm4gdGltZTtcblxuXHRcdFx0cmV0dXJuICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSA/IGR1cmF0aW9uIC0gdGltZSA6IHRpbWU7XG5cblx0XHR9XG5cblx0XHRpZiAoIGxvb3AgPT09IExvb3BPbmNlICkge1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdHRoaXMuX2xvb3BDb3VudCA9IDA7XG5cdFx0XHRcdHRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7XG5cblx0XHRcdH1cblxuXHRcdFx0aGFuZGxlX3N0b3A6IHtcblxuXHRcdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gZHVyYXRpb247XG5cblx0XHRcdFx0fSBlbHNlIGlmICggdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0XHR0aW1lID0gMDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblxuXHRcdFx0XHRcdGJyZWFrIGhhbmRsZV9zdG9wO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7XG5cdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0dGhpcy50aW1lID0gdGltZTtcblxuXHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0dHlwZTogJ2ZpbmlzaGVkJywgYWN0aW9uOiB0aGlzLFxuXHRcdFx0XHRcdGRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDFcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgeyAvLyByZXBldGl0aXZlIFJlcGVhdCBvciBQaW5nUG9uZ1xuXG5cdFx0XHRpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkge1xuXG5cdFx0XHRcdC8vIGp1c3Qgc3RhcnRlZFxuXG5cdFx0XHRcdGlmICggZGVsdGFUaW1lID49IDAgKSB7XG5cblx0XHRcdFx0XHRsb29wQ291bnQgPSAwO1xuXG5cdFx0XHRcdFx0dGhpcy5fc2V0RW5kaW5ncyggdHJ1ZSwgdGhpcy5yZXBldGl0aW9ucyA9PT0gMCwgcGluZ1BvbmcgKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0Ly8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbFxuXHRcdFx0XHRcdC8vIHRyYW5zaXRpb24gdGhyb3VnaCB6ZXJvIGNvdW50cyBhcyBhIHJlcGV0aXRpb24sXG5cdFx0XHRcdFx0Ly8gc28gbGVhdmUgbG9vcENvdW50IGF0IC0xXG5cblx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCB0cnVlLCBwaW5nUG9uZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRpbWUgPj0gZHVyYXRpb24gfHwgdGltZSA8IDAgKSB7XG5cblx0XHRcdFx0Ly8gd3JhcCBhcm91bmRcblxuXHRcdFx0XHRjb25zdCBsb29wRGVsdGEgPSBNYXRoLmZsb29yKCB0aW1lIC8gZHVyYXRpb24gKTsgLy8gc2lnbmVkXG5cdFx0XHRcdHRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7XG5cblx0XHRcdFx0bG9vcENvdW50ICs9IE1hdGguYWJzKCBsb29wRGVsdGEgKTtcblxuXHRcdFx0XHRjb25zdCBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDtcblxuXHRcdFx0XHRpZiAoIHBlbmRpbmcgPD0gMCApIHtcblxuXHRcdFx0XHRcdC8vIGhhdmUgdG8gc3RvcCAoc3dpdGNoIHN0YXRlLCBjbGFtcCB0aW1lLCBmaXJlIGV2ZW50KVxuXG5cdFx0XHRcdFx0aWYgKCB0aGlzLmNsYW1wV2hlbkZpbmlzaGVkICkgdGhpcy5wYXVzZWQgPSB0cnVlO1xuXHRcdFx0XHRcdGVsc2UgdGhpcy5lbmFibGVkID0gZmFsc2U7XG5cblx0XHRcdFx0XHR0aW1lID0gZGVsdGFUaW1lID4gMCA/IGR1cmF0aW9uIDogMDtcblxuXHRcdFx0XHRcdHRoaXMudGltZSA9IHRpbWU7XG5cblx0XHRcdFx0XHR0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7XG5cdFx0XHRcdFx0XHR0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsXG5cdFx0XHRcdFx0XHRkaXJlY3Rpb246IGRlbHRhVGltZSA+IDAgPyAxIDogLSAxXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHQvLyBrZWVwIHJ1bm5pbmdcblxuXHRcdFx0XHRcdGlmICggcGVuZGluZyA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmRcblxuXHRcdFx0XHRcdFx0Y29uc3QgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7XG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHR0aGlzLl9zZXRFbmRpbmdzKCBmYWxzZSwgZmFsc2UsIHBpbmdQb25nICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLl9sb29wQ291bnQgPSBsb29wQ291bnQ7XG5cblx0XHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHRcdFx0dGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCgge1xuXHRcdFx0XHRcdFx0dHlwZTogJ2xvb3AnLCBhY3Rpb246IHRoaXMsIGxvb3BEZWx0YTogbG9vcERlbHRhXG5cdFx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR0aGlzLnRpbWUgPSB0aW1lO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gaW52ZXJ0IHRpbWUgZm9yIHRoZSBcInBvbmcgcm91bmRcIlxuXG5cdFx0XHRcdHJldHVybiBkdXJhdGlvbiAtIHRpbWU7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiB0aW1lO1xuXG5cdH1cblxuXHRfc2V0RW5kaW5ncyggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkge1xuXG5cdFx0Y29uc3Qgc2V0dGluZ3MgPSB0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO1xuXG5cdFx0aWYgKCBwaW5nUG9uZyApIHtcblxuXHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cdFx0XHRzZXR0aW5ncy5lbmRpbmdFbmQgPSBaZXJvU2xvcGVFbmRpbmc7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBhc3N1bWluZyBmb3IgTG9vcE9uY2UgYXRTdGFydCA9PSBhdEVuZCA9PSB0cnVlXG5cblx0XHRcdGlmICggYXRTdGFydCApIHtcblxuXHRcdFx0XHRzZXR0aW5ncy5lbmRpbmdTdGFydCA9IHRoaXMuemVyb1Nsb3BlQXRTdGFydCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBXcmFwQXJvdW5kRW5kaW5nO1xuXG5cdFx0XHR9XG5cblx0XHRcdGlmICggYXRFbmQgKSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kID0gdGhpcy56ZXJvU2xvcGVBdEVuZCA/IFplcm9TbG9wZUVuZGluZyA6IFplcm9DdXJ2YXR1cmVFbmRpbmc7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0c2V0dGluZ3MuZW5kaW5nRW5kIFx0ID0gV3JhcEFyb3VuZEVuZGluZztcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHRfc2NoZWR1bGVGYWRpbmcoIGR1cmF0aW9uLCB3ZWlnaHROb3csIHdlaWdodFRoZW4gKSB7XG5cblx0XHRjb25zdCBtaXhlciA9IHRoaXMuX21peGVyLCBub3cgPSBtaXhlci50aW1lO1xuXHRcdGxldCBpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50O1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHtcblxuXHRcdFx0aW50ZXJwb2xhbnQgPSBtaXhlci5fbGVuZENvbnRyb2xJbnRlcnBvbGFudCgpO1xuXHRcdFx0dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudDtcblxuXHRcdH1cblxuXHRcdGNvbnN0IHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLFxuXHRcdFx0dmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzO1xuXG5cdFx0dGltZXNbIDAgXSA9IG5vdztcblx0XHR2YWx1ZXNbIDAgXSA9IHdlaWdodE5vdztcblx0XHR0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247XG5cdFx0dmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIEFuaW1hdGlvbk1peGVyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHtcblxuXHRjb25zdHJ1Y3Rvciggcm9vdCApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9yb290ID0gcm9vdDtcblx0XHR0aGlzLl9pbml0TWVtb3J5TWFuYWdlcigpO1xuXHRcdHRoaXMuX2FjY3VJbmRleCA9IDA7XG5cdFx0dGhpcy50aW1lID0gMDtcblx0XHR0aGlzLnRpbWVTY2FsZSA9IDEuMDtcblxuXHR9XG5cblx0X2JpbmRBY3Rpb24oIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkge1xuXG5cdFx0Y29uc3Qgcm9vdCA9IGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHR0cmFja3MgPSBhY3Rpb24uX2NsaXAudHJhY2tzLFxuXHRcdFx0blRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsXG5cdFx0XHRiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5ncyxcblx0XHRcdGludGVycG9sYW50cyA9IGFjdGlvbi5faW50ZXJwb2xhbnRzLFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQsXG5cdFx0XHRiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZTtcblxuXHRcdGxldCBiaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRiaW5kaW5nc0J5TmFtZSA9IHt9O1xuXHRcdFx0YmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0gPSBiaW5kaW5nc0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHtcblxuXHRcdFx0Y29uc3QgdHJhY2sgPSB0cmFja3NbIGkgXSxcblx0XHRcdFx0dHJhY2tOYW1lID0gdHJhY2submFtZTtcblxuXHRcdFx0bGV0IGJpbmRpbmcgPSBiaW5kaW5nc0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdGJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdO1xuXG5cdFx0XHRcdGlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdFx0Ly8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93c1xuXG5cdFx0XHRcdFx0aWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkge1xuXG5cdFx0XHRcdFx0XHQrKyBiaW5kaW5nLnJlZmVyZW5jZUNvdW50O1xuXHRcdFx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb250aW51ZTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgcGF0aCA9IHByb3RvdHlwZUFjdGlvbiAmJiBwcm90b3R5cGVBY3Rpb24uXG5cdFx0XHRcdFx0X3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7XG5cblx0XHRcdFx0YmluZGluZyA9IG5ldyBQcm9wZXJ0eU1peGVyKFxuXHRcdFx0XHRcdFByb3BlcnR5QmluZGluZy5jcmVhdGUoIHJvb3QsIHRyYWNrTmFtZSwgcGF0aCApLFxuXHRcdFx0XHRcdHRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7XG5cblx0XHRcdFx0KysgYmluZGluZy5yZWZlcmVuY2VDb3VudDtcblx0XHRcdFx0dGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7XG5cblx0XHRcdFx0YmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7XG5cblx0XHRcdH1cblxuXHRcdFx0aW50ZXJwb2xhbnRzWyBpIF0ucmVzdWx0QnVmZmVyID0gYmluZGluZy5idWZmZXI7XG5cblx0XHR9XG5cblx0fVxuXG5cdF9hY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xuXG5cdFx0aWYgKCAhIHRoaXMuX2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSApIHtcblxuXHRcdFx0aWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7XG5cblx0XHRcdFx0Ly8gdGhpcyBhY3Rpb24gaGFzIGJlZW4gZm9yZ290dGVuIGJ5IHRoZSBjYWNoZSwgYnV0IHRoZSB1c2VyXG5cdFx0XHRcdC8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kXG5cblx0XHRcdFx0Y29uc3Qgcm9vdFV1aWQgPSAoIGFjdGlvbi5fbG9jYWxSb290IHx8IHRoaXMuX3Jvb3QgKS51dWlkLFxuXHRcdFx0XHRcdGNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsXG5cdFx0XHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0XHRcdHRoaXMuX2JpbmRBY3Rpb24oIGFjdGlvbixcblx0XHRcdFx0XHRhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApO1xuXG5cdFx0XHRcdHRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBpbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCBiaW5kaW5nLnVzZUNvdW50ICsrID09PSAwICkge1xuXG5cdFx0XHRcdFx0dGhpcy5fbGVuZEJpbmRpbmcoIGJpbmRpbmcgKTtcblx0XHRcdFx0XHRiaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7XG5cblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2xlbmRBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxuXHRfZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICkge1xuXG5cdFx0aWYgKCB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7XG5cblx0XHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0XHQvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7XG5cblx0XHRcdFx0Y29uc3QgYmluZGluZyA9IGJpbmRpbmdzWyBpIF07XG5cblx0XHRcdFx0aWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuX3Rha2VCYWNrQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VyXG5cblx0X2luaXRNZW1vcnlNYW5hZ2VyKCkge1xuXG5cdFx0dGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXNcblx0XHR0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7XG5cblx0XHR0aGlzLl9hY3Rpb25zQnlDbGlwID0ge307XG5cdFx0Ly8gaW5zaWRlOlxuXHRcdC8vIHtcblx0XHQvLyBcdGtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+IC0gdXNlZCBhcyBwcm90b3R5cGVzXG5cdFx0Ly8gXHRhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbiAtIGxvb2t1cFxuXHRcdC8vIH1cblxuXG5cdFx0dGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lc1xuXHRcdHRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7XG5cblx0XHR0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUgPSB7fTsgLy8gaW5zaWRlOiBNYXA8IG5hbWUsIFByb3BlcnR5TWl4ZXIgPlxuXG5cblx0XHR0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZVxuXHRcdHRoaXMuX25BY3RpdmVDb250cm9sSW50ZXJwb2xhbnRzID0gMDtcblxuXHRcdGNvbnN0IHNjb3BlID0gdGhpcztcblxuXHRcdHRoaXMuc3RhdHMgPSB7XG5cblx0XHRcdGFjdGlvbnM6IHtcblx0XHRcdFx0Z2V0IHRvdGFsKCkge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zO1xuXG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRiaW5kaW5nczoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDtcblxuXHRcdFx0XHR9LFxuXHRcdFx0XHRnZXQgaW5Vc2UoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5ncztcblxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0Y29udHJvbEludGVycG9sYW50czoge1xuXHRcdFx0XHRnZXQgdG90YWwoKSB7XG5cblx0XHRcdFx0XHRyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoO1xuXG5cdFx0XHRcdH0sXG5cdFx0XHRcdGdldCBpblVzZSgpIHtcblxuXHRcdFx0XHRcdHJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7XG5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fTtcblxuXHR9XG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIEFuaW1hdGlvbkFjdGlvbiBvYmplY3RzXG5cblx0X2lzQWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHRjb25zdCBpbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblx0XHRyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHR9XG5cblx0X2FkZEluYWN0aXZlQWN0aW9uKCBhY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRsZXQgYWN0aW9uc0ZvckNsaXAgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IHtcblxuXHRcdFx0XHRrbm93bkFjdGlvbnM6IFsgYWN0aW9uIF0sXG5cdFx0XHRcdGFjdGlvbkJ5Um9vdDoge31cblxuXHRcdFx0fTtcblxuXHRcdFx0YWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gMDtcblxuXHRcdFx0YWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSA9IGFjdGlvbnNGb3JDbGlwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Y29uc3Qga25vd25BY3Rpb25zID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zO1xuXG5cdFx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoO1xuXHRcdFx0a25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdFx0YWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7XG5cdFx0YWN0aW9ucy5wdXNoKCBhY3Rpb24gKTtcblxuXHRcdGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSA9IGFjdGlvbjtcblxuXHR9XG5cblx0X3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdLFxuXHRcdFx0Y2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleDtcblxuXHRcdGxhc3RJbmFjdGl2ZUFjdGlvbi5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdGFjdGlvbnMucG9wKCk7XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHRjb25zdCBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsXG5cdFx0XHRhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sXG5cdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLFxuXG5cdFx0XHRsYXN0S25vd25BY3Rpb24gPVxuXHRcdFx0XHRrbm93bkFjdGlvbnNGb3JDbGlwWyBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCAtIDEgXSxcblxuXHRcdFx0YnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDtcblxuXHRcdGxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7XG5cdFx0a25vd25BY3Rpb25zRm9yQ2xpcFsgYnlDbGlwQ2FjaGVJbmRleCBdID0gbGFzdEtub3duQWN0aW9uO1xuXHRcdGtub3duQWN0aW9uc0ZvckNsaXAucG9wKCk7XG5cblx0XHRhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBudWxsO1xuXG5cblx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3QsXG5cdFx0XHRyb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQ7XG5cblx0XHRkZWxldGUgYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBrbm93bkFjdGlvbnNGb3JDbGlwLmxlbmd0aCA9PT0gMCApIHtcblxuXHRcdFx0ZGVsZXRlIGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cblx0XHR9XG5cblx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKCBhY3Rpb24gKTtcblxuXHR9XG5cblx0X3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTtcblxuXHRcdFx0aWYgKCAtLSBiaW5kaW5nLnJlZmVyZW5jZUNvdW50ID09PSAwICkge1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZW5kQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHwgIGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyA+fCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYVxuXHRcdC8vICAgICAgICAgICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgICAgICAgICAgYSAgICAgICAgc1xuXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGxhc3RBY3RpdmVJbmRleCA9IHRoaXMuX25BY3RpdmVBY3Rpb25zICsrLFxuXG5cdFx0XHRmaXJzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBsYXN0QWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRmaXJzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjtcblxuXHR9XG5cblx0X3Rha2VCYWNrQWN0aW9uKCBhY3Rpb24gKSB7XG5cblx0XHQvLyBbICBhY3RpdmUgYWN0aW9ucyAgfCBpbmFjdGl2ZSBhY3Rpb25zIF1cblx0XHQvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF1cblx0XHQvLyAgICAgICAgYSAgICAgICAgc1xuXHRcdC8vICAgICAgICAgPC1zd2FwLT5cblx0XHQvLyAgICAgICAgcyAgICAgICAgYVxuXG5cdFx0Y29uc3QgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsXG5cdFx0XHRwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLFxuXG5cdFx0XHRsYXN0QWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRhY3Rpb24uX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247XG5cblx0XHRsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGFjdGlvbnNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUFjdGlvbjtcblxuXHR9XG5cblx0Ly8gTWVtb3J5IG1hbmFnZW1lbnQgZm9yIFByb3BlcnR5TWl4ZXIgb2JqZWN0c1xuXG5cdF9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKSB7XG5cblx0XHRjb25zdCBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSxcblx0XHRcdGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7XG5cblx0XHRsZXQgYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGJpbmRpbmdCeU5hbWUgPSB7fTtcblx0XHRcdGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdID0gYmluZGluZ0J5TmFtZTtcblxuXHRcdH1cblxuXHRcdGJpbmRpbmdCeU5hbWVbIHRyYWNrTmFtZSBdID0gYmluZGluZztcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBiaW5kaW5ncy5sZW5ndGg7XG5cdFx0YmluZGluZ3MucHVzaCggYmluZGluZyApO1xuXG5cdH1cblxuXHRfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICkge1xuXG5cdFx0Y29uc3QgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncyxcblx0XHRcdHByb3BCaW5kaW5nID0gYmluZGluZy5iaW5kaW5nLFxuXHRcdFx0cm9vdFV1aWQgPSBwcm9wQmluZGluZy5yb290Tm9kZS51dWlkLFxuXHRcdFx0dHJhY2tOYW1lID0gcHJvcEJpbmRpbmcucGF0aCxcblx0XHRcdGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLFxuXG5cdFx0XHRsYXN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGJpbmRpbmdzLmxlbmd0aCAtIDEgXSxcblx0XHRcdGNhY2hlSW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4O1xuXG5cdFx0bGFzdEluYWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IGNhY2hlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGNhY2hlSW5kZXggXSA9IGxhc3RJbmFjdGl2ZUJpbmRpbmc7XG5cdFx0YmluZGluZ3MucG9wKCk7XG5cblx0XHRkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07XG5cblx0XHRpZiAoIE9iamVjdC5rZXlzKCBiaW5kaW5nQnlOYW1lICkubGVuZ3RoID09PSAwICkge1xuXG5cdFx0XHRkZWxldGUgYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF07XG5cblx0XHR9XG5cblx0fVxuXG5cdF9sZW5kQmluZGluZyggYmluZGluZyApIHtcblxuXHRcdGNvbnN0IGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsXG5cdFx0XHRwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LFxuXG5cdFx0XHRsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQmluZGluZ3MgKyssXG5cblx0XHRcdGZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0YmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDtcblx0XHRiaW5kaW5nc1sgbGFzdEFjdGl2ZUluZGV4IF0gPSBiaW5kaW5nO1xuXG5cdFx0Zmlyc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7XG5cdFx0YmluZGluZ3NbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUJpbmRpbmc7XG5cblx0fVxuXG5cdF90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKSB7XG5cblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0cHJldkluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzLFxuXG5cdFx0XHRsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTtcblxuXHRcdGJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0YmluZGluZ3NbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gYmluZGluZztcblxuXHRcdGxhc3RBY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4O1xuXHRcdGJpbmRpbmdzWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVCaW5kaW5nO1xuXG5cdH1cblxuXG5cdC8vIE1lbW9yeSBtYW5hZ2VtZW50IG9mIEludGVycG9sYW50cyBmb3Igd2VpZ2h0IGFuZCB0aW1lIHNjYWxlXG5cblx0X2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSB7XG5cblx0XHRjb25zdCBpbnRlcnBvbGFudHMgPSB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzLFxuXHRcdFx0bGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMgKys7XG5cblx0XHRsZXQgaW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGxhc3RBY3RpdmVJbmRleCBdO1xuXG5cdFx0aWYgKCBpbnRlcnBvbGFudCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudChcblx0XHRcdFx0bmV3IEZsb2F0MzJBcnJheSggMiApLCBuZXcgRmxvYXQzMkFycmF5KCAyICksXG5cdFx0XHRcdDEsIHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgKTtcblxuXHRcdFx0aW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4O1xuXHRcdFx0aW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVycG9sYW50O1xuXG5cdH1cblxuXHRfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoIGludGVycG9sYW50ICkge1xuXG5cdFx0Y29uc3QgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cyxcblx0XHRcdHByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCxcblxuXHRcdFx0Zmlyc3RJbmFjdGl2ZUluZGV4ID0gLS0gdGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHMsXG5cblx0XHRcdGxhc3RBY3RpdmVJbnRlcnBvbGFudCA9IGludGVycG9sYW50c1sgZmlyc3RJbmFjdGl2ZUluZGV4IF07XG5cblx0XHRpbnRlcnBvbGFudC5fX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7XG5cdFx0aW50ZXJwb2xhbnRzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50O1xuXG5cdFx0bGFzdEFjdGl2ZUludGVycG9sYW50Ll9fY2FjaGVJbmRleCA9IHByZXZJbmRleDtcblx0XHRpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50O1xuXG5cdH1cblxuXHQvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldFxuXHQvLyBvYmplY3QgKHRoaXMgbWV0aG9kIGFsbG9jYXRlcyBhIGxvdCBvZiBkeW5hbWljIG1lbW9yeSBpbiBjYXNlIGFcblx0Ly8gcHJldmlvdXNseSB1bmtub3duIGNsaXAvcm9vdCBjb21iaW5hdGlvbiBpcyBzcGVjaWZpZWQpXG5cdGNsaXBBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCwgYmxlbmRNb2RlICkge1xuXG5cdFx0Y29uc3Qgcm9vdCA9IG9wdGlvbmFsUm9vdCB8fCB0aGlzLl9yb290LFxuXHRcdFx0cm9vdFV1aWQgPSByb290LnV1aWQ7XG5cblx0XHRsZXQgY2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/IEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcDtcblxuXHRcdGNvbnN0IGNsaXBVdWlkID0gY2xpcE9iamVjdCAhPT0gbnVsbCA/IGNsaXBPYmplY3QudXVpZCA6IGNsaXA7XG5cblx0XHRjb25zdCBhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07XG5cdFx0bGV0IHByb3RvdHlwZUFjdGlvbiA9IG51bGw7XG5cblx0XHRpZiAoIGJsZW5kTW9kZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRpZiAoIGNsaXBPYmplY3QgIT09IG51bGwgKSB7XG5cblx0XHRcdFx0YmxlbmRNb2RlID0gY2xpcE9iamVjdC5ibGVuZE1vZGU7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0YmxlbmRNb2RlID0gTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnN0IGV4aXN0aW5nQWN0aW9uID0gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGV4aXN0aW5nQWN0aW9uICE9PSB1bmRlZmluZWQgJiYgZXhpc3RpbmdBY3Rpb24uYmxlbmRNb2RlID09PSBibGVuZE1vZGUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIGV4aXN0aW5nQWN0aW9uO1xuXG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGtub3cgdGhlIGNsaXAsIHNvIHdlIGRvbid0IGhhdmUgdG8gcGFyc2UgYWxsXG5cdFx0XHQvLyB0aGUgYmluZGluZ3MgYWdhaW4gYnV0IGNhbiBqdXN0IGNvcHlcblx0XHRcdHByb3RvdHlwZUFjdGlvbiA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uc1sgMCBdO1xuXG5cdFx0XHQvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb25cblx0XHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApXG5cdFx0XHRcdGNsaXBPYmplY3QgPSBwcm90b3R5cGVBY3Rpb24uX2NsaXA7XG5cblx0XHR9XG5cblx0XHQvLyBjbGlwIG11c3QgYmUga25vd24gd2hlbiBzcGVjaWZpZWQgdmlhIHN0cmluZ1xuXHRcdGlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsO1xuXG5cdFx0Ly8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXRcblx0XHRjb25zdCBuZXdBY3Rpb24gPSBuZXcgQW5pbWF0aW9uQWN0aW9uKCB0aGlzLCBjbGlwT2JqZWN0LCBvcHRpb25hbFJvb3QsIGJsZW5kTW9kZSApO1xuXG5cdFx0dGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTtcblxuXHRcdC8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyXG5cdFx0dGhpcy5fYWRkSW5hY3RpdmVBY3Rpb24oIG5ld0FjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICk7XG5cblx0XHRyZXR1cm4gbmV3QWN0aW9uO1xuXG5cdH1cblxuXHQvLyBnZXQgYW4gZXhpc3RpbmcgYWN0aW9uXG5cdGV4aXN0aW5nQWN0aW9uKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7XG5cblx0XHRjb25zdCByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsXG5cdFx0XHRyb290VXVpZCA9IHJvb3QudXVpZCxcblxuXHRcdFx0Y2xpcE9iamVjdCA9IHR5cGVvZiBjbGlwID09PSAnc3RyaW5nJyA/XG5cdFx0XHRcdEFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCxcblxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCxcblxuXHRcdFx0YWN0aW9uc0ZvckNsaXAgPSB0aGlzLl9hY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0aWYgKCBhY3Rpb25zRm9yQ2xpcCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRyZXR1cm4gYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdIHx8IG51bGw7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblxuXHR9XG5cblx0Ly8gZGVhY3RpdmF0ZXMgYWxsIHByZXZpb3VzbHkgc2NoZWR1bGVkIGFjdGlvbnNcblx0c3RvcEFsbEFjdGlvbigpIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0bkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucztcblxuXHRcdGZvciAoIGxldCBpID0gbkFjdGlvbnMgLSAxOyBpID49IDA7IC0tIGkgKSB7XG5cblx0XHRcdGFjdGlvbnNbIGkgXS5zdG9wKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb25cblx0dXBkYXRlKCBkZWx0YVRpbWUgKSB7XG5cblx0XHRkZWx0YVRpbWUgKj0gdGhpcy50aW1lU2NhbGU7XG5cblx0XHRjb25zdCBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucyxcblx0XHRcdG5BY3Rpb25zID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMsXG5cblx0XHRcdHRpbWUgPSB0aGlzLnRpbWUgKz0gZGVsdGFUaW1lLFxuXHRcdFx0dGltZURpcmVjdGlvbiA9IE1hdGguc2lnbiggZGVsdGFUaW1lICksXG5cblx0XHRcdGFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxO1xuXG5cdFx0Ly8gcnVuIGFjdGl2ZSBhY3Rpb25zXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkge1xuXG5cdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zWyBpIF07XG5cblx0XHRcdGFjdGlvbi5fdXBkYXRlKCB0aW1lLCBkZWx0YVRpbWUsIHRpbWVEaXJlY3Rpb24sIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHNjZW5lIGdyYXBoXG5cblx0XHRjb25zdCBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLFxuXHRcdFx0bkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7XG5cblx0XHRcdGJpbmRpbmdzWyBpIF0uYXBwbHkoIGFjY3VJbmRleCApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdC8vIEFsbG93cyB5b3UgdG8gc2VlayB0byBhIHNwZWNpZmljIHRpbWUgaW4gYW4gYW5pbWF0aW9uLlxuXHRzZXRUaW1lKCB0aW1lSW5TZWNvbmRzICkge1xuXG5cdFx0dGhpcy50aW1lID0gMDsgLy8gWmVybyBvdXQgdGltZSBhdHRyaWJ1dGUgZm9yIEFuaW1hdGlvbk1peGVyIG9iamVjdDtcblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aGlzLl9hY3Rpb25zLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5fYWN0aW9uc1sgaSBdLnRpbWUgPSAwOyAvLyBaZXJvIG91dCB0aW1lIGF0dHJpYnV0ZSBmb3IgYWxsIGFzc29jaWF0ZWQgQW5pbWF0aW9uQWN0aW9uIG9iamVjdHMuXG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy51cGRhdGUoIHRpbWVJblNlY29uZHMgKTsgLy8gVXBkYXRlIHVzZWQgdG8gc2V0IGV4YWN0IHRpbWUuIFJldHVybnMgXCJ0aGlzXCIgQW5pbWF0aW9uTWl4ZXIgb2JqZWN0LlxuXG5cdH1cblxuXHQvLyByZXR1cm4gdGhpcyBtaXhlcidzIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHRnZXRSb290KCkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Jvb3Q7XG5cblx0fVxuXG5cdC8vIGZyZWUgYWxsIHJlc291cmNlcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgY2xpcFxuXHR1bmNhY2hlQ2xpcCggY2xpcCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLFxuXHRcdFx0Y2xpcFV1aWQgPSBjbGlwLnV1aWQsXG5cdFx0XHRhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcCxcblx0XHRcdGFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTtcblxuXHRcdGlmICggYWN0aW9uc0ZvckNsaXAgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZVxuXHRcdFx0Ly8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhblxuXHRcdFx0Ly8ganVzdCB0aHJvdyBhd2F5XG5cblx0XHRcdGNvbnN0IGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9ucztcblxuXHRcdFx0Zm9yICggbGV0IGkgPSAwLCBuID0gYWN0aW9uc1RvUmVtb3ZlLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHtcblxuXHRcdFx0XHRjb25zdCBhY3Rpb24gPSBhY3Rpb25zVG9SZW1vdmVbIGkgXTtcblxuXHRcdFx0XHR0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTtcblxuXHRcdFx0XHRjb25zdCBjYWNoZUluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LFxuXHRcdFx0XHRcdGxhc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGFjdGlvbnMubGVuZ3RoIC0gMSBdO1xuXG5cdFx0XHRcdGFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7XG5cdFx0XHRcdGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7XG5cblx0XHRcdFx0bGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDtcblx0XHRcdFx0YWN0aW9uc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQWN0aW9uO1xuXHRcdFx0XHRhY3Rpb25zLnBvcCgpO1xuXG5cdFx0XHRcdHRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZ3NGb3JBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdFxuXHR1bmNhY2hlUm9vdCggcm9vdCApIHtcblxuXHRcdGNvbnN0IHJvb3RVdWlkID0gcm9vdC51dWlkLFxuXHRcdFx0YWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXA7XG5cblx0XHRmb3IgKCBjb25zdCBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkge1xuXG5cdFx0XHRjb25zdCBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCxcblx0XHRcdFx0YWN0aW9uID0gYWN0aW9uQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0XHRpZiAoIGFjdGlvbiAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUFjdGlvbiggYWN0aW9uICk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLFxuXHRcdFx0YmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdO1xuXG5cdFx0aWYgKCBiaW5kaW5nQnlOYW1lICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGZvciAoIGNvbnN0IHRyYWNrTmFtZSBpbiBiaW5kaW5nQnlOYW1lICkge1xuXG5cdFx0XHRcdGNvbnN0IGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTtcblx0XHRcdFx0YmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpO1xuXHRcdFx0XHR0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdH1cblxuXHQvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlXG5cdHVuY2FjaGVBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApIHtcblxuXHRcdGNvbnN0IGFjdGlvbiA9IHRoaXMuZXhpc3RpbmdBY3Rpb24oIGNsaXAsIG9wdGlvbmFsUm9vdCApO1xuXG5cdFx0aWYgKCBhY3Rpb24gIT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApO1xuXHRcdFx0dGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5BbmltYXRpb25NaXhlci5wcm90b3R5cGUuX2NvbnRyb2xJbnRlcnBvbGFudHNSZXN1bHRCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KCAxICk7XG5cbmNsYXNzIFVuaWZvcm0ge1xuXG5cdGNvbnN0cnVjdG9yKCB2YWx1ZSApIHtcblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7XG5cdFx0XHR2YWx1ZSA9IGFyZ3VtZW50c1sgMSBdO1xuXG5cdFx0fVxuXG5cdFx0dGhpcy52YWx1ZSA9IHZhbHVlO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgVW5pZm9ybSggdGhpcy52YWx1ZS5jbG9uZSA9PT0gdW5kZWZpbmVkID8gdGhpcy52YWx1ZSA6IHRoaXMudmFsdWUuY2xvbmUoKSApO1xuXG5cdH1cblxufVxuXG5mdW5jdGlvbiBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciggYXJyYXksIHN0cmlkZSwgbWVzaFBlckF0dHJpYnV0ZSApIHtcblxuXHRJbnRlcmxlYXZlZEJ1ZmZlci5jYWxsKCB0aGlzLCBhcnJheSwgc3RyaWRlICk7XG5cblx0dGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxO1xuXG59XG5cbkluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSApLCB7XG5cblx0Y29uc3RydWN0b3I6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLFxuXG5cdGlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsXG5cblx0Y29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7XG5cblx0XHRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMubWVzaFBlckF0dHJpYnV0ZSA9IHNvdXJjZS5tZXNoUGVyQXR0cmlidXRlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0Y29uc3QgaWIgPSBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuY2xvbmUuY2FsbCggdGhpcywgZGF0YSApO1xuXG5cdFx0aWIubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTtcblxuXHRcdHJldHVybiBpYjtcblxuXHR9LFxuXG5cdHRvSlNPTjogZnVuY3Rpb24gKCBkYXRhICkge1xuXG5cdFx0Y29uc3QganNvbiA9IEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgZGF0YSApO1xuXG5cdFx0anNvbi5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyID0gdHJ1ZTtcblx0XHRqc29uLm1lc2hQZXJBdHRyaWJ1dGUgPSB0aGlzLm1lc2hQZXJBdHRyaWJ1dGU7XG5cblx0XHRyZXR1cm4ganNvbjtcblxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gR0xCdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciwgdHlwZSwgaXRlbVNpemUsIGVsZW1lbnRTaXplLCBjb3VudCApIHtcblxuXHR0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjtcblx0dGhpcy50eXBlID0gdHlwZTtcblx0dGhpcy5pdGVtU2l6ZSA9IGl0ZW1TaXplO1xuXHR0aGlzLmVsZW1lbnRTaXplID0gZWxlbWVudFNpemU7XG5cdHRoaXMuY291bnQgPSBjb3VudDtcblxuXHR0aGlzLnZlcnNpb24gPSAwO1xuXG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eSggR0xCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0aWYgKCB2YWx1ZSA9PT0gdHJ1ZSApIHRoaXMudmVyc2lvbiArKztcblxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmFzc2lnbiggR0xCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7XG5cblx0aXNHTEJ1ZmZlckF0dHJpYnV0ZTogdHJ1ZSxcblxuXHRzZXRCdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyICkge1xuXG5cdFx0dGhpcy5idWZmZXIgPSBidWZmZXI7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldFR5cGU6IGZ1bmN0aW9uICggdHlwZSwgZWxlbWVudFNpemUgKSB7XG5cblx0XHR0aGlzLnR5cGUgPSB0eXBlO1xuXHRcdHRoaXMuZWxlbWVudFNpemUgPSBlbGVtZW50U2l6ZTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH0sXG5cblx0c2V0SXRlbVNpemU6IGZ1bmN0aW9uICggaXRlbVNpemUgKSB7XG5cblx0XHR0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9LFxuXG5cdHNldENvdW50OiBmdW5jdGlvbiAoIGNvdW50ICkge1xuXG5cdFx0dGhpcy5jb3VudCA9IGNvdW50O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fSxcblxufSApO1xuXG5mdW5jdGlvbiBSYXljYXN0ZXIoIG9yaWdpbiwgZGlyZWN0aW9uLCBuZWFyID0gMCwgZmFyID0gSW5maW5pdHkgKSB7XG5cblx0dGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApO1xuXHQvLyBkaXJlY3Rpb24gaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkIChmb3IgYWNjdXJhdGUgZGlzdGFuY2UgY2FsY3VsYXRpb25zKVxuXG5cdHRoaXMubmVhciA9IG5lYXI7XG5cdHRoaXMuZmFyID0gZmFyO1xuXHR0aGlzLmNhbWVyYSA9IG51bGw7XG5cdHRoaXMubGF5ZXJzID0gbmV3IExheWVycygpO1xuXG5cdHRoaXMucGFyYW1zID0ge1xuXHRcdE1lc2g6IHt9LFxuXHRcdExpbmU6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0TE9EOiB7fSxcblx0XHRQb2ludHM6IHsgdGhyZXNob2xkOiAxIH0sXG5cdFx0U3ByaXRlOiB7fVxuXHR9O1xuXG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywge1xuXHRcdFBvaW50Q2xvdWQ6IHtcblx0XHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogcGFyYW1zLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBwYXJhbXMuUG9pbnRzLicgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXMuUG9pbnRzO1xuXG5cdFx0XHR9XG5cdFx0fVxuXHR9ICk7XG5cbn1cblxuZnVuY3Rpb24gYXNjU29ydCggYSwgYiApIHtcblxuXHRyZXR1cm4gYS5kaXN0YW5jZSAtIGIuZGlzdGFuY2U7XG5cbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkge1xuXG5cdGlmICggb2JqZWN0LmxheWVycy50ZXN0KCByYXljYXN0ZXIubGF5ZXJzICkgKSB7XG5cblx0XHRvYmplY3QucmF5Y2FzdCggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICk7XG5cblx0fVxuXG5cdGlmICggcmVjdXJzaXZlID09PSB0cnVlICkge1xuXG5cdFx0Y29uc3QgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47XG5cblx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRpbnRlcnNlY3RPYmplY3QoIGNoaWxkcmVuWyBpIF0sIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdHJ1ZSApO1xuXG5cdFx0fVxuXG5cdH1cblxufVxuXG5PYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0c2V0OiBmdW5jdGlvbiAoIG9yaWdpbiwgZGlyZWN0aW9uICkge1xuXG5cdFx0Ly8gZGlyZWN0aW9uIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZCAoZm9yIGFjY3VyYXRlIGRpc3RhbmNlIGNhbGN1bGF0aW9ucylcblxuXHRcdHRoaXMucmF5LnNldCggb3JpZ2luLCBkaXJlY3Rpb24gKTtcblxuXHR9LFxuXG5cdHNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7XG5cblx0XHRpZiAoIGNhbWVyYSAmJiBjYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7XG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTtcblx0XHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhO1xuXG5cdFx0fSBlbHNlIGlmICggY2FtZXJhICYmIGNhbWVyYS5pc09ydGhvZ3JhcGhpY0NhbWVyYSApIHtcblxuXHRcdFx0dGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhXG5cdFx0XHR0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApO1xuXHRcdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuUmF5Y2FzdGVyOiBVbnN1cHBvcnRlZCBjYW1lcmEgdHlwZTogJyArIGNhbWVyYS50eXBlICk7XG5cblx0XHR9XG5cblx0fSxcblxuXHRpbnRlcnNlY3RPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0LCByZWN1cnNpdmUgPSBmYWxzZSwgaW50ZXJzZWN0cyA9IFtdICkge1xuXG5cdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9LFxuXG5cdGludGVyc2VjdE9iamVjdHM6IGZ1bmN0aW9uICggb2JqZWN0cywgcmVjdXJzaXZlID0gZmFsc2UsIGludGVyc2VjdHMgPSBbXSApIHtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHtcblxuXHRcdFx0aW50ZXJzZWN0T2JqZWN0KCBvYmplY3RzWyBpIF0sIHRoaXMsIGludGVyc2VjdHMsIHJlY3Vyc2l2ZSApO1xuXG5cdFx0fVxuXG5cdFx0aW50ZXJzZWN0cy5zb3J0KCBhc2NTb3J0ICk7XG5cblx0XHRyZXR1cm4gaW50ZXJzZWN0cztcblxuXHR9XG5cbn0gKTtcblxuLyoqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwaGVyaWNhbF9jb29yZGluYXRlX3N5c3RlbVxuICpcbiAqIFRoZSBwb2xhciBhbmdsZSAocGhpKSBpcyBtZWFzdXJlZCBmcm9tIHRoZSBwb3NpdGl2ZSB5LWF4aXMuIFRoZSBwb3NpdGl2ZSB5LWF4aXMgaXMgdXAuXG4gKiBUaGUgYXppbXV0aGFsIGFuZ2xlICh0aGV0YSkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgcG9zaXRpdmUgei1heGlzLlxuICovXG5cbmNsYXNzIFNwaGVyaWNhbCB7XG5cblx0Y29uc3RydWN0b3IoIHJhZGl1cyA9IDEsIHBoaSA9IDAsIHRoZXRhID0gMCApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMucGhpID0gcGhpOyAvLyBwb2xhciBhbmdsZVxuXHRcdHRoaXMudGhldGEgPSB0aGV0YTsgLy8gYXppbXV0aGFsIGFuZ2xlXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0KCByYWRpdXMsIHBoaSwgdGhldGEgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLnBoaSA9IHBoaTtcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnBoaSA9IG90aGVyLnBoaTtcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Ly8gcmVzdHJpY3QgcGhpIHRvIGJlIGJldHdlZSBFUFMgYW5kIFBJLUVQU1xuXHRtYWtlU2FmZSgpIHtcblxuXHRcdGNvbnN0IEVQUyA9IDAuMDAwMDAxO1xuXHRcdHRoaXMucGhpID0gTWF0aC5tYXgoIEVQUywgTWF0aC5taW4oIE1hdGguUEkgLSBFUFMsIHRoaXMucGhpICkgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTtcblxuXHRcdGlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7XG5cblx0XHRcdHRoaXMudGhldGEgPSAwO1xuXHRcdFx0dGhpcy5waGkgPSAwO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHRcdHRoaXMucGhpID0gTWF0aC5hY29zKCBNYXRoVXRpbHMuY2xhbXAoIHkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuLyoqXG4gKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtXG4gKi9cblxuY2xhc3MgQ3lsaW5kcmljYWwge1xuXG5cdGNvbnN0cnVjdG9yKCByYWRpdXMgPSAxLCB0aGV0YSA9IDAsIHkgPSAwICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7IC8vIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB0byBhIHBvaW50IGluIHRoZSB4LXogcGxhbmVcblx0XHR0aGlzLnRoZXRhID0gdGhldGE7IC8vIGNvdW50ZXJjbG9ja3dpc2UgYW5nbGUgaW4gdGhlIHgteiBwbGFuZSBtZWFzdXJlZCBpbiByYWRpYW5zIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpc1xuXHRcdHRoaXMueSA9IHk7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lXG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0c2V0KCByYWRpdXMsIHRoZXRhLCB5ICkge1xuXG5cdFx0dGhpcy5yYWRpdXMgPSByYWRpdXM7XG5cdFx0dGhpcy50aGV0YSA9IHRoZXRhO1xuXHRcdHRoaXMueSA9IHk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggb3RoZXIgKSB7XG5cblx0XHR0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1cztcblx0XHR0aGlzLnRoZXRhID0gb3RoZXIudGhldGE7XG5cdFx0dGhpcy55ID0gb3RoZXIueTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tVmVjdG9yMyggdiApIHtcblxuXHRcdHJldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoIHYueCwgdi55LCB2LnogKTtcblxuXHR9XG5cblx0c2V0RnJvbUNhcnRlc2lhbkNvb3JkcyggeCwgeSwgeiApIHtcblxuXHRcdHRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHogKiB6ICk7XG5cdFx0dGhpcy50aGV0YSA9IE1hdGguYXRhbjIoIHgsIHogKTtcblx0XHR0aGlzLnkgPSB5O1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNsb25lKCkge1xuXG5cdFx0cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yJDQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IyKCk7XG5cbmNsYXNzIEJveDIge1xuXG5cdGNvbnN0cnVjdG9yKCBtaW4gPSBuZXcgVmVjdG9yMiggKyBJbmZpbml0eSwgKyBJbmZpbml0eSApLCBtYXggPSBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApICkge1xuXG5cdFx0dGhpcy5taW4gPSBtaW47XG5cdFx0dGhpcy5tYXggPSBtYXg7XG5cblx0fVxuXG5cdHNldCggbWluLCBtYXggKSB7XG5cblx0XHR0aGlzLm1pbi5jb3B5KCBtaW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBtYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRzZXRGcm9tUG9pbnRzKCBwb2ludHMgKSB7XG5cblx0XHR0aGlzLm1ha2VFbXB0eSgpO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHtcblxuXHRcdFx0dGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdHNldEZyb21DZW50ZXJBbmRTaXplKCBjZW50ZXIsIHNpemUgKSB7XG5cblx0XHRjb25zdCBoYWxmU2l6ZSA9IF92ZWN0b3IkNC5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApO1xuXHRcdHRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTtcblx0XHR0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y2xvbmUoKSB7XG5cblx0XHRyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7XG5cblx0fVxuXG5cdGNvcHkoIGJveCApIHtcblxuXHRcdHRoaXMubWluLmNvcHkoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0bWFrZUVtcHR5KCkge1xuXG5cdFx0dGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSArIEluZmluaXR5O1xuXHRcdHRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRpc0VtcHR5KCkge1xuXG5cdFx0Ly8gdGhpcyBpcyBhIG1vcmUgcm9idXN0IGNoZWNrIGZvciBlbXB0eSB0aGFuICggdm9sdW1lIDw9IDAgKSBiZWNhdXNlIHZvbHVtZSBjYW4gZ2V0IHBvc2l0aXZlIHdpdGggdHdvIG5lZ2F0aXZlIGF4ZXNcblxuXHRcdHJldHVybiAoIHRoaXMubWF4LnggPCB0aGlzLm1pbi54ICkgfHwgKCB0aGlzLm1heC55IDwgdGhpcy5taW4ueSApO1xuXG5cdH1cblxuXHRnZXRDZW50ZXIoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7XG5cblx0fVxuXG5cdGdldFNpemUoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRTaXplKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwICkgOiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5tYXgsIHRoaXMubWluICk7XG5cblx0fVxuXG5cdGV4cGFuZEJ5UG9pbnQoIHBvaW50ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBwb2ludCApO1xuXHRcdHRoaXMubWF4Lm1heCggcG9pbnQgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRleHBhbmRCeVZlY3RvciggdmVjdG9yICkge1xuXG5cdFx0dGhpcy5taW4uc3ViKCB2ZWN0b3IgKTtcblx0XHR0aGlzLm1heC5hZGQoIHZlY3RvciApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGV4cGFuZEJ5U2NhbGFyKCBzY2FsYXIgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7XG5cdFx0dGhpcy5tYXguYWRkU2NhbGFyKCBzY2FsYXIgKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHRjb250YWluc1BvaW50KCBwb2ludCApIHtcblxuXHRcdHJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fFxuXHRcdFx0cG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNvbnRhaW5zQm94KCBib3ggKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5taW4ueCA8PSBib3gubWluLnggJiYgYm94Lm1heC54IDw9IHRoaXMubWF4LnggJiZcblx0XHRcdHRoaXMubWluLnkgPD0gYm94Lm1pbi55ICYmIGJveC5tYXgueSA8PSB0aGlzLm1heC55O1xuXG5cdH1cblxuXHRnZXRQYXJhbWV0ZXIoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHQvLyBUaGlzIGNhbiBwb3RlbnRpYWxseSBoYXZlIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIGJveFxuXHRcdC8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuXG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IyKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGFyZ2V0LnNldChcblx0XHRcdCggcG9pbnQueCAtIHRoaXMubWluLnggKSAvICggdGhpcy5tYXgueCAtIHRoaXMubWluLnggKSxcblx0XHRcdCggcG9pbnQueSAtIHRoaXMubWluLnkgKSAvICggdGhpcy5tYXgueSAtIHRoaXMubWluLnkgKVxuXHRcdCk7XG5cblx0fVxuXG5cdGludGVyc2VjdHNCb3goIGJveCApIHtcblxuXHRcdC8vIHVzaW5nIDQgc3BsaXR0aW5nIHBsYW5lcyB0byBydWxlIG91dCBpbnRlcnNlY3Rpb25zXG5cblx0XHRyZXR1cm4gYm94Lm1heC54IDwgdGhpcy5taW4ueCB8fCBib3gubWluLnggPiB0aGlzLm1heC54IHx8XG5cdFx0XHRib3gubWF4LnkgPCB0aGlzLm1pbi55IHx8IGJveC5taW4ueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7XG5cblx0fVxuXG5cdGNsYW1wUG9pbnQoIHBvaW50LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMigpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VUb1BvaW50KCBwb2ludCApIHtcblxuXHRcdGNvbnN0IGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkNC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTtcblx0XHRyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTtcblxuXHR9XG5cblx0aW50ZXJzZWN0KCBib3ggKSB7XG5cblx0XHR0aGlzLm1pbi5tYXgoIGJveC5taW4gKTtcblx0XHR0aGlzLm1heC5taW4oIGJveC5tYXggKTtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxuXHR1bmlvbiggYm94ICkge1xuXG5cdFx0dGhpcy5taW4ubWluKCBib3gubWluICk7XG5cdFx0dGhpcy5tYXgubWF4KCBib3gubWF4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0dHJhbnNsYXRlKCBvZmZzZXQgKSB7XG5cblx0XHR0aGlzLm1pbi5hZGQoIG9mZnNldCApO1xuXHRcdHRoaXMubWF4LmFkZCggb2Zmc2V0ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBib3ggKSB7XG5cblx0XHRyZXR1cm4gYm94Lm1pbi5lcXVhbHMoIHRoaXMubWluICkgJiYgYm94Lm1heC5lcXVhbHMoIHRoaXMubWF4ICk7XG5cblx0fVxuXG59XG5cbkJveDIucHJvdG90eXBlLmlzQm94MiA9IHRydWU7XG5cbmNvbnN0IF9zdGFydFAgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5jb25zdCBfc3RhcnRFbmQgPSAvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCk7XG5cbmNsYXNzIExpbmUzIHtcblxuXHRjb25zdHJ1Y3Rvciggc3RhcnQgPSBuZXcgVmVjdG9yMygpLCBlbmQgPSBuZXcgVmVjdG9yMygpICkge1xuXG5cdFx0dGhpcy5zdGFydCA9IHN0YXJ0O1xuXHRcdHRoaXMuZW5kID0gZW5kO1xuXG5cdH1cblxuXHRzZXQoIHN0YXJ0LCBlbmQgKSB7XG5cblx0XHR0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7XG5cdFx0dGhpcy5lbmQuY29weSggZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Y29weSggbGluZSApIHtcblxuXHRcdHRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApO1xuXHRcdHRoaXMuZW5kLmNvcHkoIGxpbmUuZW5kICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0Z2V0Q2VudGVyKCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLnN0YXJ0LCB0aGlzLmVuZCApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHR9XG5cblx0ZGVsdGEoIHRhcmdldCApIHtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApO1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTtcblxuXHRcdH1cblxuXHRcdHJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTtcblxuXHR9XG5cblx0ZGlzdGFuY2VTcSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG9TcXVhcmVkKCB0aGlzLmVuZCApO1xuXG5cdH1cblxuXHRkaXN0YW5jZSgpIHtcblxuXHRcdHJldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8oIHRoaXMuZW5kICk7XG5cblx0fVxuXG5cdGF0KCB0LCB0YXJnZXQgKSB7XG5cblx0XHRpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTtcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzKCk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTtcblxuXHR9XG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlciggcG9pbnQsIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0X3N0YXJ0UC5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5zdGFydCApO1xuXHRcdF9zdGFydEVuZC5zdWJWZWN0b3JzKCB0aGlzLmVuZCwgdGhpcy5zdGFydCApO1xuXG5cdFx0Y29uc3Qgc3RhcnRFbmQyID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0RW5kICk7XG5cdFx0Y29uc3Qgc3RhcnRFbmRfc3RhcnRQID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0UCApO1xuXG5cdFx0bGV0IHQgPSBzdGFydEVuZF9zdGFydFAgLyBzdGFydEVuZDI7XG5cblx0XHRpZiAoIGNsYW1wVG9MaW5lICkge1xuXG5cdFx0XHR0ID0gTWF0aFV0aWxzLmNsYW1wKCB0LCAwLCAxICk7XG5cblx0XHR9XG5cblx0XHRyZXR1cm4gdDtcblxuXHR9XG5cblx0Y2xvc2VzdFBvaW50VG9Qb2ludCggcG9pbnQsIGNsYW1wVG9MaW5lLCB0YXJnZXQgKSB7XG5cblx0XHRjb25zdCB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTtcblxuXHRcdGlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7XG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yMygpO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZGVsdGEoIHRhcmdldCApLm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnN0YXJ0ICk7XG5cblx0fVxuXG5cdGFwcGx5TWF0cml4NCggbWF0cml4ICkge1xuXG5cdFx0dGhpcy5zdGFydC5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXHRcdHRoaXMuZW5kLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0ZXF1YWxzKCBsaW5lICkge1xuXG5cdFx0cmV0dXJuIGxpbmUuc3RhcnQuZXF1YWxzKCB0aGlzLnN0YXJ0ICkgJiYgbGluZS5lbmQuZXF1YWxzKCB0aGlzLmVuZCApO1xuXG5cdH1cblxuXHRjbG9uZSgpIHtcblxuXHRcdHJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gSW1tZWRpYXRlUmVuZGVyT2JqZWN0KCBtYXRlcmlhbCApIHtcblxuXHRPYmplY3QzRC5jYWxsKCB0aGlzICk7XG5cblx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTtcblxuXHR0aGlzLmhhc1Bvc2l0aW9ucyA9IGZhbHNlO1xuXHR0aGlzLmhhc05vcm1hbHMgPSBmYWxzZTtcblx0dGhpcy5oYXNDb2xvcnMgPSBmYWxzZTtcblx0dGhpcy5oYXNVdnMgPSBmYWxzZTtcblxuXHR0aGlzLnBvc2l0aW9uQXJyYXkgPSBudWxsO1xuXHR0aGlzLm5vcm1hbEFycmF5ID0gbnVsbDtcblx0dGhpcy5jb2xvckFycmF5ID0gbnVsbDtcblx0dGhpcy51dkFycmF5ID0gbnVsbDtcblxuXHR0aGlzLmNvdW50ID0gMDtcblxufVxuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7XG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW1tZWRpYXRlUmVuZGVyT2JqZWN0O1xuXG5JbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTtcblxuY29uc3QgX3ZlY3RvciQzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuXG5jbGFzcyBTcG90TGlnaHRIZWxwZXIgZXh0ZW5kcyBPYmplY3QzRCB7XG5cblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBjb2xvciApIHtcblxuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5saWdodCA9IGxpZ2h0O1xuXHRcdHRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTtcblxuXHRcdHRoaXMubWF0cml4ID0gbGlnaHQubWF0cml4V29ybGQ7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHR0aGlzLmNvbG9yID0gY29sb3I7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXG5cdFx0Y29uc3QgcG9zaXRpb25zID0gW1xuXHRcdFx0MCwgMCwgMCwgXHQwLCAwLCAxLFxuXHRcdFx0MCwgMCwgMCwgXHQxLCAwLCAxLFxuXHRcdFx0MCwgMCwgMCxcdC0gMSwgMCwgMSxcblx0XHRcdDAsIDAsIDAsIFx0MCwgMSwgMSxcblx0XHRcdDAsIDAsIDAsIFx0MCwgLSAxLCAxXG5cdFx0XTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDEsIGwgPSAzMjsgaSA8IGw7IGkgKyssIGogKysgKSB7XG5cblx0XHRcdGNvbnN0IHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7XG5cdFx0XHRjb25zdCBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyO1xuXG5cdFx0XHRwb3NpdGlvbnMucHVzaChcblx0XHRcdFx0TWF0aC5jb3MoIHAxICksIE1hdGguc2luKCBwMSApLCAxLFxuXHRcdFx0XHRNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDFcblx0XHRcdCk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdFx0dGhpcy5jb25lID0gbmV3IExpbmVTZWdtZW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHR9XG5cblx0ZGlzcG9zZSgpIHtcblxuXHRcdHRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdFx0dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHR9XG5cblx0dXBkYXRlKCkge1xuXG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0Y29uc3QgY29uZUxlbmd0aCA9IHRoaXMubGlnaHQuZGlzdGFuY2UgPyB0aGlzLmxpZ2h0LmRpc3RhbmNlIDogMTAwMDtcblx0XHRjb25zdCBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGNvbmVXaWR0aCwgY29uZVdpZHRoLCBjb25lTGVuZ3RoICk7XG5cblx0XHRfdmVjdG9yJDMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApO1xuXG5cdFx0dGhpcy5jb25lLmxvb2tBdCggX3ZlY3RvciQzICk7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHR9XG5cbn1cblxuY29uc3QgX3ZlY3RvciQyID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2JvbmVNYXRyaXggPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5jb25zdCBfbWF0cml4V29ybGRJbnYgPSAvKkBfX1BVUkVfXyovIG5ldyBNYXRyaXg0KCk7XG5cblxuY2xhc3MgU2tlbGV0b25IZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xuXG5cdGNvbnN0cnVjdG9yKCBvYmplY3QgKSB7XG5cblx0XHRjb25zdCBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xuXG5cdFx0Y29uc3QgY29sb3IxID0gbmV3IENvbG9yKCAwLCAwLCAxICk7XG5cdFx0Y29uc3QgY29sb3IyID0gbmV3IENvbG9yKCAwLCAxLCAwICk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCAwLCAwLCAwICk7XG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMS5yLCBjb2xvcjEuZywgY29sb3IxLmIgKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yMi5yLCBjb2xvcjIuZywgY29sb3IyLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1NrZWxldG9uSGVscGVyJztcblx0XHR0aGlzLmlzU2tlbGV0b25IZWxwZXIgPSB0cnVlO1xuXG5cdFx0dGhpcy5yb290ID0gb2JqZWN0O1xuXHRcdHRoaXMuYm9uZXMgPSBib25lcztcblxuXHRcdHRoaXMubWF0cml4ID0gb2JqZWN0Lm1hdHJpeFdvcmxkO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRjb25zdCBib25lcyA9IHRoaXMuYm9uZXM7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdF9tYXRyaXhXb3JsZEludi5jb3B5KCB0aGlzLnJvb3QubWF0cml4V29ybGQgKS5pbnZlcnQoKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgaiA9IDA7IGkgPCBib25lcy5sZW5ndGg7IGkgKysgKSB7XG5cblx0XHRcdGNvbnN0IGJvbmUgPSBib25lc1sgaSBdO1xuXG5cdFx0XHRpZiAoIGJvbmUucGFyZW50ICYmIGJvbmUucGFyZW50LmlzQm9uZSApIHtcblxuXHRcdFx0XHRfYm9uZU1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBfbWF0cml4V29ybGRJbnYsIGJvbmUubWF0cml4V29ybGQgKTtcblx0XHRcdFx0X3ZlY3RvciQyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTtcblx0XHRcdFx0cG9zaXRpb24uc2V0WFlaKCBqLCBfdmVjdG9yJDIueCwgX3ZlY3RvciQyLnksIF92ZWN0b3IkMi56ICk7XG5cblx0XHRcdFx0X2JvbmVNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggX21hdHJpeFdvcmxkSW52LCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApO1xuXHRcdFx0XHRfdmVjdG9yJDIuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBfYm9uZU1hdHJpeCApO1xuXHRcdFx0XHRwb3NpdGlvbi5zZXRYWVooIGogKyAxLCBfdmVjdG9yJDIueCwgX3ZlY3RvciQyLnksIF92ZWN0b3IkMi56ICk7XG5cblx0XHRcdFx0aiArPSAyO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7XG5cblx0XHRzdXBlci51cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKTtcblxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkge1xuXG5cdGNvbnN0IGJvbmVMaXN0ID0gW107XG5cblx0aWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHtcblxuXHRcdGJvbmVMaXN0LnB1c2goIG9iamVjdCApO1xuXG5cdH1cblxuXHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBvYmplY3QuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkge1xuXG5cdFx0Ym9uZUxpc3QucHVzaC5hcHBseSggYm9uZUxpc3QsIGdldEJvbmVMaXN0KCBvYmplY3QuY2hpbGRyZW5bIGkgXSApICk7XG5cblx0fVxuXG5cdHJldHVybiBib25lTGlzdDtcblxufVxuXG5jbGFzcyBQb2ludExpZ2h0SGVscGVyIGV4dGVuZHMgTWVzaCB7XG5cblx0Y29uc3RydWN0b3IoIGxpZ2h0LCBzcGhlcmVTaXplLCBjb2xvciApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IFNwaGVyZUdlb21ldHJ5KCBzcGhlcmVTaXplLCA0LCAyICk7XG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5jb2xvciA9IGNvbG9yO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvaW50TGlnaHRIZWxwZXInO1xuXG5cdFx0dGhpcy5tYXRyaXggPSB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkO1xuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXG5cdFx0Lypcblx0Ly8gVE9ETzogZGVsZXRlIHRoaXMgY29tbWVudD9cblx0Y29uc3QgZGlzdGFuY2VHZW9tZXRyeSA9IG5ldyBUSFJFRS5JY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCAxLCAyICk7XG5cdGNvbnN0IGRpc3RhbmNlTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGhleENvbG9yLCBmb2c6IGZhbHNlLCB3aXJlZnJhbWU6IHRydWUsIG9wYWNpdHk6IDAuMSwgdHJhbnNwYXJlbnQ6IHRydWUgfSApO1xuXG5cdHRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTtcblx0dGhpcy5saWdodERpc3RhbmNlID0gbmV3IFRIUkVFLk1lc2goIGRpc3RhbmNlR2VvbWV0cnksIGRpc3RhbmNlTWF0ZXJpYWwgKTtcblxuXHRjb25zdCBkID0gbGlnaHQuZGlzdGFuY2U7XG5cblx0aWYgKCBkID09PSAwLjAgKSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7XG5cblx0fVxuXG5cdHRoaXMuYWRkKCB0aGlzLmxpZ2h0RGlzdGFuY2UgKTtcblx0Ki9cblxuXHR9XG5cblx0ZGlzcG9zZSgpIHtcblxuXHRcdHRoaXMuZ2VvbWV0cnkuZGlzcG9zZSgpO1xuXHRcdHRoaXMubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0dGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXG5cdFx0fVxuXG5cdFx0Lypcblx0XHRjb25zdCBkID0gdGhpcy5saWdodC5kaXN0YW5jZTtcblxuXHRcdGlmICggZCA9PT0gMC4wICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0RGlzdGFuY2UudmlzaWJsZSA9IGZhbHNlO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSB0cnVlO1xuXHRcdFx0dGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApO1xuXG5cdFx0fVxuXHRcdCovXG5cblx0fVxuXG59XG5cbmNvbnN0IF92ZWN0b3IkMSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF9jb2xvcjEgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xuY29uc3QgX2NvbG9yMiA9IC8qQF9fUFVSRV9fKi8gbmV3IENvbG9yKCk7XG5cbmNsYXNzIEhlbWlzcGhlcmVMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IE9jdGFoZWRyb25HZW9tZXRyeSggc2l6ZSApO1xuXHRcdGdlb21ldHJ5LnJvdGF0ZVkoIE1hdGguUEkgKiAwLjUgKTtcblxuXHRcdHRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cdFx0aWYgKCB0aGlzLmNvbG9yID09PSB1bmRlZmluZWQgKSB0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycyA9IHRydWU7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApO1xuXHRcdGNvbnN0IGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uLmNvdW50ICogMyApO1xuXG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHR0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBtZXNoID0gdGhpcy5jaGlsZHJlblsgMCBdO1xuXG5cdFx0aWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdHRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRjb25zdCBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApO1xuXG5cdFx0XHRfY29sb3IxLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblx0XHRcdF9jb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApO1xuXG5cdFx0XHRmb3IgKCBsZXQgaSA9IDAsIGwgPSBjb2xvcnMuY291bnQ7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRcdGNvbnN0IGNvbG9yID0gKCBpIDwgKCBsIC8gMiApICkgPyBfY29sb3IxIDogX2NvbG9yMjtcblxuXHRcdFx0XHRjb2xvcnMuc2V0WFlaKCBpLCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdH1cblxuXHRcdFx0Y29sb3JzLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHRcdH1cblxuXHRcdG1lc2gubG9va0F0KCBfdmVjdG9yJDEuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICkubmVnYXRlKCkgKTtcblxuXHR9XG5cbn1cblxuY2xhc3MgR3JpZEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIHNpemUgPSAxMCwgZGl2aXNpb25zID0gMTAsIGNvbG9yMSA9IDB4NDQ0NDQ0LCBjb2xvcjIgPSAweDg4ODg4OCApIHtcblxuXHRcdGNvbG9yMSA9IG5ldyBDb2xvciggY29sb3IxICk7XG5cdFx0Y29sb3IyID0gbmV3IENvbG9yKCBjb2xvcjIgKTtcblxuXHRcdGNvbnN0IGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7XG5cdFx0Y29uc3Qgc3RlcCA9IHNpemUgLyBkaXZpc2lvbnM7XG5cdFx0Y29uc3QgaGFsZlNpemUgPSBzaXplIC8gMjtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW10sIGNvbG9ycyA9IFtdO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwLCBqID0gMCwgayA9IC0gaGFsZlNpemU7IGkgPD0gZGl2aXNpb25zOyBpICsrLCBrICs9IHN0ZXAgKSB7XG5cblx0XHRcdHZlcnRpY2VzLnB1c2goIC0gaGFsZlNpemUsIDAsIGssIGhhbGZTaXplLCAwLCBrICk7XG5cdFx0XHR2ZXJ0aWNlcy5wdXNoKCBrLCAwLCAtIGhhbGZTaXplLCBrLCAwLCBoYWxmU2l6ZSApO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblx0XHRcdGNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7XG5cdFx0XHRjb2xvci50b0FycmF5KCBjb2xvcnMsIGogKTsgaiArPSAzO1xuXHRcdFx0Y29sb3IudG9BcnJheSggY29sb3JzLCBqICk7IGogKz0gMztcblxuXHRcdH1cblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7XG5cblx0XHRjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdHcmlkSGVscGVyJztcblxuXHR9XG5cbn1cblxuY2xhc3MgUG9sYXJHcmlkSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcblxuXHRjb25zdHJ1Y3RvciggcmFkaXVzID0gMTAsIHJhZGlhbHMgPSAxNiwgY2lyY2xlcyA9IDgsIGRpdmlzaW9ucyA9IDY0LCBjb2xvcjEgPSAweDQ0NDQ0NCwgY29sb3IyID0gMHg4ODg4ODggKSB7XG5cblx0XHRjb2xvcjEgPSBuZXcgQ29sb3IoIGNvbG9yMSApO1xuXHRcdGNvbG9yMiA9IG5ldyBDb2xvciggY29sb3IyICk7XG5cblx0XHRjb25zdCB2ZXJ0aWNlcyA9IFtdO1xuXHRcdGNvbnN0IGNvbG9ycyA9IFtdO1xuXG5cdFx0Ly8gY3JlYXRlIHRoZSByYWRpYWxzXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPD0gcmFkaWFsczsgaSArKyApIHtcblxuXHRcdFx0Y29uc3QgdiA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTtcblxuXHRcdFx0Y29uc3QgeCA9IE1hdGguc2luKCB2ICkgKiByYWRpdXM7XG5cdFx0XHRjb25zdCB6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1cztcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0dmVydGljZXMucHVzaCggeCwgMCwgeiApO1xuXG5cdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHR9XG5cblx0XHQvLyBjcmVhdGUgdGhlIGNpcmNsZXNcblxuXHRcdGZvciAoIGxldCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjb2xvciA9ICggaSAmIDEgKSA/IGNvbG9yMSA6IGNvbG9yMjtcblxuXHRcdFx0Y29uc3QgciA9IHJhZGl1cyAtICggcmFkaXVzIC8gY2lyY2xlcyAqIGkgKTtcblxuXHRcdFx0Zm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zOyBqICsrICkge1xuXG5cdFx0XHRcdC8vIGZpcnN0IHZlcnRleFxuXG5cdFx0XHRcdGxldCB2ID0gKCBqIC8gZGl2aXNpb25zICkgKiAoIE1hdGguUEkgKiAyICk7XG5cblx0XHRcdFx0bGV0IHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdFx0bGV0IHogPSBNYXRoLmNvcyggdiApICogcjtcblxuXHRcdFx0XHR2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7XG5cdFx0XHRcdGNvbG9ycy5wdXNoKCBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iICk7XG5cblx0XHRcdFx0Ly8gc2Vjb25kIHZlcnRleFxuXG5cdFx0XHRcdHYgPSAoICggaiArIDEgKSAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApO1xuXG5cdFx0XHRcdHggPSBNYXRoLnNpbiggdiApICogcjtcblx0XHRcdFx0eiA9IE1hdGguY29zKCB2ICkgKiByO1xuXG5cdFx0XHRcdHZlcnRpY2VzLnB1c2goIHgsIDAsIHogKTtcblx0XHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogdHJ1ZSwgdG9uZU1hcHBlZDogZmFsc2UgfSApO1xuXG5cdFx0c3VwZXIoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BvbGFyR3JpZEhlbHBlcic7XG5cblx0fVxuXG59XG5cbmNvbnN0IF92MSA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MiA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcbmNvbnN0IF92MyA9IC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoKTtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodEhlbHBlciBleHRlbmRzIE9iamVjdDNEIHtcblxuXHRjb25zdHJ1Y3RvciggbGlnaHQsIHNpemUsIGNvbG9yICkge1xuXG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLmxpZ2h0ID0gbGlnaHQ7XG5cdFx0dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDtcblx0XHR0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblxuXHRcdHRoaXMuY29sb3IgPSBjb2xvcjtcblxuXHRcdGlmICggc2l6ZSA9PT0gdW5kZWZpbmVkICkgc2l6ZSA9IDE7XG5cblx0XHRsZXQgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbXG5cdFx0XHQtIHNpemUsIHNpemUsIDAsXG5cdFx0XHRzaXplLCBzaXplLCAwLFxuXHRcdFx0c2l6ZSwgLSBzaXplLCAwLFxuXHRcdFx0LSBzaXplLCAtIHNpemUsIDAsXG5cdFx0XHQtIHNpemUsIHNpemUsIDBcblx0XHRdLCAzICkgKTtcblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGZvZzogZmFsc2UsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdHRoaXMubGlnaHRQbGFuZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLmFkZCggdGhpcy5saWdodFBsYW5lICk7XG5cblx0XHRnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMCwgMSBdLCAzICkgKTtcblxuXHRcdHRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTtcblx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7XG5cdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHR9XG5cblx0dXBkYXRlKCkge1xuXG5cdFx0X3YxLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC5tYXRyaXhXb3JsZCApO1xuXHRcdF92Mi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7XG5cdFx0X3YzLnN1YlZlY3RvcnMoIF92MiwgX3YxICk7XG5cblx0XHR0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCBfdjIgKTtcblxuXHRcdGlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cdFx0XHR0aGlzLnRhcmdldExpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApO1xuXHRcdFx0dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMudGFyZ2V0TGluZS5sb29rQXQoIF92MiApO1xuXHRcdHRoaXMudGFyZ2V0TGluZS5zY2FsZS56ID0gX3YzLmxlbmd0aCgpO1xuXG5cdH1cblxufVxuXG5jb25zdCBfdmVjdG9yID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xuY29uc3QgX2NhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IENhbWVyYSgpO1xuXG4vKipcbiAqXHQtIHNob3dzIGZydXN0dW0sIGxpbmUgb2Ygc2lnaHQgYW5kIHVwIG9mIHRoZSBjYW1lcmFcbiAqXHQtIHN1aXRhYmxlIGZvciBmYXN0IHVwZGF0ZXNcbiAqIFx0LSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZVxuICpcdFx0aHR0cDovL2V2YW53LmdpdGh1Yi5jb20vbGlnaHRnbC5qcy90ZXN0cy9zaGFkb3dtYXAuaHRtbFxuICovXG5cbmNsYXNzIENhbWVyYUhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIGNhbWVyYSApIHtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IDB4ZmZmZmZmLCB2ZXJ0ZXhDb2xvcnM6IHRydWUsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKTtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW107XG5cdFx0Y29uc3QgY29sb3JzID0gW107XG5cblx0XHRjb25zdCBwb2ludE1hcCA9IHt9O1xuXG5cdFx0Ly8gY29sb3JzXG5cblx0XHRjb25zdCBjb2xvckZydXN0dW0gPSBuZXcgQ29sb3IoIDB4ZmZhYTAwICk7XG5cdFx0Y29uc3QgY29sb3JDb25lID0gbmV3IENvbG9yKCAweGZmMDAwMCApO1xuXHRcdGNvbnN0IGNvbG9yVXAgPSBuZXcgQ29sb3IoIDB4MDBhYWZmICk7XG5cdFx0Y29uc3QgY29sb3JUYXJnZXQgPSBuZXcgQ29sb3IoIDB4ZmZmZmZmICk7XG5cdFx0Y29uc3QgY29sb3JDcm9zcyA9IG5ldyBDb2xvciggMHgzMzMzMzMgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdGFkZExpbmUoICduMScsICduMicsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduMicsICduNCcsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduNCcsICduMycsIGNvbG9yRnJ1c3R1bSApO1xuXHRcdGFkZExpbmUoICduMycsICduMScsIGNvbG9yRnJ1c3R1bSApO1xuXG5cdFx0Ly8gZmFyXG5cblx0XHRhZGRMaW5lKCAnZjEnLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjInLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjQnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnZjMnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblxuXHRcdC8vIHNpZGVzXG5cblx0XHRhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjMnLCAnZjMnLCBjb2xvckZydXN0dW0gKTtcblx0XHRhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTtcblxuXHRcdC8vIGNvbmVcblxuXHRcdGFkZExpbmUoICdwJywgJ24xJywgY29sb3JDb25lICk7XG5cdFx0YWRkTGluZSggJ3AnLCAnbjInLCBjb2xvckNvbmUgKTtcblx0XHRhZGRMaW5lKCAncCcsICduMycsIGNvbG9yQ29uZSApO1xuXHRcdGFkZExpbmUoICdwJywgJ240JywgY29sb3JDb25lICk7XG5cblx0XHQvLyB1cFxuXG5cdFx0YWRkTGluZSggJ3UxJywgJ3UyJywgY29sb3JVcCApO1xuXHRcdGFkZExpbmUoICd1MicsICd1MycsIGNvbG9yVXAgKTtcblx0XHRhZGRMaW5lKCAndTMnLCAndTEnLCBjb2xvclVwICk7XG5cblx0XHQvLyB0YXJnZXRcblxuXHRcdGFkZExpbmUoICdjJywgJ3QnLCBjb2xvclRhcmdldCApO1xuXHRcdGFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7XG5cblx0XHQvLyBjcm9zc1xuXG5cdFx0YWRkTGluZSggJ2NuMScsICdjbjInLCBjb2xvckNyb3NzICk7XG5cdFx0YWRkTGluZSggJ2NuMycsICdjbjQnLCBjb2xvckNyb3NzICk7XG5cblx0XHRhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTtcblx0XHRhZGRMaW5lKCAnY2YzJywgJ2NmNCcsIGNvbG9yQ3Jvc3MgKTtcblxuXHRcdGZ1bmN0aW9uIGFkZExpbmUoIGEsIGIsIGNvbG9yICkge1xuXG5cdFx0XHRhZGRQb2ludCggYSwgY29sb3IgKTtcblx0XHRcdGFkZFBvaW50KCBiLCBjb2xvciApO1xuXG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHtcblxuXHRcdFx0dmVydGljZXMucHVzaCggMCwgMCwgMCApO1xuXHRcdFx0Y29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTtcblxuXHRcdFx0aWYgKCBwb2ludE1hcFsgaWQgXSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHBvaW50TWFwWyBpZCBdID0gW107XG5cblx0XHRcdH1cblxuXHRcdFx0cG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7XG5cblx0XHR9XG5cblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7XG5cdFx0Z2VvbWV0cnkuc2V0QXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTtcblxuXHRcdHRoaXMudHlwZSA9ICdDYW1lcmFIZWxwZXInO1xuXG5cdFx0dGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cdFx0aWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuXG5cdFx0dGhpcy5tYXRyaXggPSBjYW1lcmEubWF0cml4V29ybGQ7XG5cdFx0dGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cblx0XHR0aGlzLnBvaW50TWFwID0gcG9pbnRNYXA7XG5cblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdH1cblxuXHR1cGRhdGUoKSB7XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7XG5cdFx0Y29uc3QgcG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwO1xuXG5cdFx0Y29uc3QgdyA9IDEsIGggPSAxO1xuXG5cdFx0Ly8gd2UgbmVlZCBqdXN0IGNhbWVyYSBwcm9qZWN0aW9uIG1hdHJpeCBpbnZlcnNlXG5cdFx0Ly8gd29ybGQgbWF0cml4IG11c3QgYmUgaWRlbnRpdHlcblxuXHRcdF9jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weSggdGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKTtcblxuXHRcdC8vIGNlbnRlciAvIHRhcmdldFxuXG5cdFx0c2V0UG9pbnQoICdjJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAwLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ3QnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIDEgKTtcblxuXHRcdC8vIG5lYXJcblxuXHRcdHNldFBvaW50KCAnbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAtIDEgKTtcblx0XHRzZXRQb2ludCggJ24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICduNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgLSAxICk7XG5cblx0XHQvLyBmYXJcblxuXHRcdHNldFBvaW50KCAnZjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgLSBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmMycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCBoLCAxICk7XG5cdFx0c2V0UG9pbnQoICdmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgMSApO1xuXG5cdFx0Ly8gdXBcblxuXHRcdHNldFBvaW50KCAndTEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcgKiAwLjcsIGggKiAxLjEsIC0gMSApO1xuXHRcdHNldFBvaW50KCAndTInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICd1MycsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCAqIDIsIC0gMSApO1xuXG5cdFx0Ly8gY3Jvc3NcblxuXHRcdHNldFBvaW50KCAnY2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIDAsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSApO1xuXHRcdHNldFBvaW50KCAnY2YzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIDEgKTtcblx0XHRzZXRQb2ludCggJ2NmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgMSApO1xuXG5cdFx0c2V0UG9pbnQoICdjbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgMCwgLSAxICk7XG5cdFx0c2V0UG9pbnQoICdjbjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIDAsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY24zJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIC0gMSApO1xuXHRcdHNldFBvaW50KCAnY240JywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoLCAtIDEgKTtcblxuXHRcdGdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTtcblxuXHR9XG5cbn1cblxuXG5mdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHBvaW50TWFwLCBnZW9tZXRyeSwgY2FtZXJhLCB4LCB5LCB6ICkge1xuXG5cdF92ZWN0b3Iuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTtcblxuXHRjb25zdCBwb2ludHMgPSBwb2ludE1hcFsgcG9pbnQgXTtcblxuXHRpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTtcblxuXHRcdGZvciAoIGxldCBpID0gMCwgbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkge1xuXG5cdFx0XHRwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCBfdmVjdG9yLngsIF92ZWN0b3IueSwgX3ZlY3Rvci56ICk7XG5cblx0XHR9XG5cblx0fVxuXG59XG5cbmNvbnN0IF9ib3ggPSAvKkBfX1BVUkVfXyovIG5ldyBCb3gzKCk7XG5cbmNsYXNzIEJveEhlbHBlciBleHRlbmRzIExpbmVTZWdtZW50cyB7XG5cblx0Y29uc3RydWN0b3IoIG9iamVjdCwgY29sb3IgPSAweGZmZmYwMCApIHtcblxuXHRcdGNvbnN0IGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7XG5cdFx0Y29uc3QgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJBcnJheSggOCAqIDMgKTtcblxuXHRcdGNvbnN0IGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7XG5cdFx0Z2VvbWV0cnkuc2V0SW5kZXgoIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGluZGljZXMsIDEgKSApO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTtcblxuXHRcdHN1cGVyKCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgdG9uZU1hcHBlZDogZmFsc2UgfSApICk7XG5cblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0XHR0aGlzLnR5cGUgPSAnQm94SGVscGVyJztcblxuXHRcdHRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHR9XG5cblx0dXBkYXRlKCBvYmplY3QgKSB7XG5cblx0XHRpZiAoIG9iamVjdCAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7XG5cblx0XHR9XG5cblx0XHRpZiAoIHRoaXMub2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9ib3guc2V0RnJvbU9iamVjdCggdGhpcy5vYmplY3QgKTtcblxuXHRcdH1cblxuXHRcdGlmICggX2JveC5pc0VtcHR5KCkgKSByZXR1cm47XG5cblx0XHRjb25zdCBtaW4gPSBfYm94Lm1pbjtcblx0XHRjb25zdCBtYXggPSBfYm94Lm1heDtcblxuXHRcdC8qXG5cdFx0XHQ1X19fXzRcblx0XHQxL19fXzAvfFxuXHRcdHwgNl9ffF83XG5cdFx0Mi9fX18zL1xuXG5cdFx0MDogbWF4LngsIG1heC55LCBtYXguelxuXHRcdDE6IG1pbi54LCBtYXgueSwgbWF4Lnpcblx0XHQyOiBtaW4ueCwgbWluLnksIG1heC56XG5cdFx0MzogbWF4LngsIG1pbi55LCBtYXguelxuXHRcdDQ6IG1heC54LCBtYXgueSwgbWluLnpcblx0XHQ1OiBtaW4ueCwgbWF4LnksIG1pbi56XG5cdFx0NjogbWluLngsIG1pbi55LCBtaW4uelxuXHRcdDc6IG1heC54LCBtaW4ueSwgbWluLnpcblx0XHQqL1xuXG5cdFx0Y29uc3QgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247XG5cdFx0Y29uc3QgYXJyYXkgPSBwb3NpdGlvbi5hcnJheTtcblxuXHRcdGFycmF5WyAwIF0gPSBtYXgueDsgYXJyYXlbIDEgXSA9IG1heC55OyBhcnJheVsgMiBdID0gbWF4Lno7XG5cdFx0YXJyYXlbIDMgXSA9IG1pbi54OyBhcnJheVsgNCBdID0gbWF4Lnk7IGFycmF5WyA1IF0gPSBtYXguejtcblx0XHRhcnJheVsgNiBdID0gbWluLng7IGFycmF5WyA3IF0gPSBtaW4ueTsgYXJyYXlbIDggXSA9IG1heC56O1xuXHRcdGFycmF5WyA5IF0gPSBtYXgueDsgYXJyYXlbIDEwIF0gPSBtaW4ueTsgYXJyYXlbIDExIF0gPSBtYXguejtcblx0XHRhcnJheVsgMTIgXSA9IG1heC54OyBhcnJheVsgMTMgXSA9IG1heC55OyBhcnJheVsgMTQgXSA9IG1pbi56O1xuXHRcdGFycmF5WyAxNSBdID0gbWluLng7IGFycmF5WyAxNiBdID0gbWF4Lnk7IGFycmF5WyAxNyBdID0gbWluLno7XG5cdFx0YXJyYXlbIDE4IF0gPSBtaW4ueDsgYXJyYXlbIDE5IF0gPSBtaW4ueTsgYXJyYXlbIDIwIF0gPSBtaW4uejtcblx0XHRhcnJheVsgMjEgXSA9IG1heC54OyBhcnJheVsgMjIgXSA9IG1pbi55OyBhcnJheVsgMjMgXSA9IG1pbi56O1xuXG5cdFx0cG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlO1xuXG5cdFx0dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtcblxuXG5cdH1cblxuXHRzZXRGcm9tT2JqZWN0KCBvYmplY3QgKSB7XG5cblx0XHR0aGlzLm9iamVjdCA9IG9iamVjdDtcblx0XHR0aGlzLnVwZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdExpbmVTZWdtZW50cy5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTtcblxuXHRcdHRoaXMub2JqZWN0ID0gc291cmNlLm9iamVjdDtcblxuXHRcdHJldHVybiB0aGlzO1xuXG5cdH1cblxufVxuXG5jbGFzcyBCb3gzSGVscGVyIGV4dGVuZHMgTGluZVNlZ21lbnRzIHtcblxuXHRjb25zdHJ1Y3RvciggYm94LCBjb2xvciA9IDB4ZmZmZjAwICkge1xuXG5cdFx0Y29uc3QgaW5kaWNlcyA9IG5ldyBVaW50MTZBcnJheSggWyAwLCAxLCAxLCAyLCAyLCAzLCAzLCAwLCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA0LCAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IF0gKTtcblxuXHRcdGNvbnN0IHBvc2l0aW9ucyA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEsIC0gMSwgLSAxLCAxLCAtIDEsIC0gMSBdO1xuXG5cdFx0Y29uc3QgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblxuXHRcdGdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTtcblxuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdFx0dGhpcy5ib3ggPSBib3g7XG5cblx0XHR0aGlzLnR5cGUgPSAnQm94M0hlbHBlcic7XG5cblx0XHR0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRjb25zdCBib3ggPSB0aGlzLmJveDtcblxuXHRcdGlmICggYm94LmlzRW1wdHkoKSApIHJldHVybjtcblxuXHRcdGJveC5nZXRDZW50ZXIoIHRoaXMucG9zaXRpb24gKTtcblxuXHRcdGJveC5nZXRTaXplKCB0aGlzLnNjYWxlICk7XG5cblx0XHR0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKCAwLjUgKTtcblxuXHRcdHN1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApO1xuXG5cdH1cblxufVxuXG5jbGFzcyBQbGFuZUhlbHBlciBleHRlbmRzIExpbmUge1xuXG5cdGNvbnN0cnVjdG9yKCBwbGFuZSwgc2l6ZSA9IDEsIGhleCA9IDB4ZmZmZjAwICkge1xuXG5cdFx0Y29uc3QgY29sb3IgPSBoZXg7XG5cblx0XHRjb25zdCBwb3NpdGlvbnMgPSBbIDEsIC0gMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAwLCAwIF07XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7XG5cdFx0Z2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXG5cdFx0dGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJztcblxuXHRcdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHRcdHRoaXMuc2l6ZSA9IHNpemU7XG5cblx0XHRjb25zdCBwb3NpdGlvbnMyID0gWyAxLCAxLCAxLCAtIDEsIDEsIDEsIC0gMSwgLSAxLCAxLCAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgLSAxLCAxIF07XG5cblx0XHRjb25zdCBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRnZW9tZXRyeTIuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7XG5cdFx0Z2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1xuXG5cdFx0dGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICkgKSApO1xuXG5cdH1cblxuXHR1cGRhdGVNYXRyaXhXb3JsZCggZm9yY2UgKSB7XG5cblx0XHRsZXQgc2NhbGUgPSAtIHRoaXMucGxhbmUuY29uc3RhbnQ7XG5cblx0XHRpZiAoIE1hdGguYWJzKCBzY2FsZSApIDwgMWUtOCApIHNjYWxlID0gMWUtODsgLy8gc2lnbiBkb2VzIG5vdCBtYXR0ZXJcblxuXHRcdHRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLnNpemUsIDAuNSAqIHRoaXMuc2l6ZSwgc2NhbGUgKTtcblxuXHRcdHRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5zaWRlID0gKCBzY2FsZSA8IDAgKSA/IEJhY2tTaWRlIDogRnJvbnRTaWRlOyAvLyByZW5kZXJlciBmbGlwcyBzaWRlIHdoZW4gZGV0ZXJtaW5hbnQgPCAwOyBmbGlwcGluZyBub3Qgd2FudGVkIGhlcmVcblxuXHRcdHRoaXMubG9va0F0KCB0aGlzLnBsYW5lLm5vcm1hbCApO1xuXG5cdFx0c3VwZXIudXBkYXRlTWF0cml4V29ybGQoIGZvcmNlICk7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9heGlzID0gLypAX19QVVJFX18qLyBuZXcgVmVjdG9yMygpO1xubGV0IF9saW5lR2VvbWV0cnksIF9jb25lR2VvbWV0cnk7XG5cbmNsYXNzIEFycm93SGVscGVyIGV4dGVuZHMgT2JqZWN0M0Qge1xuXG5cdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRjb25zdHJ1Y3RvciggZGlyID0gbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSwgb3JpZ2luID0gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKSwgbGVuZ3RoID0gMSwgY29sb3IgPSAweGZmZmYwMCwgaGVhZExlbmd0aCA9IGxlbmd0aCAqIDAuMiwgaGVhZFdpZHRoID0gaGVhZExlbmd0aCAqIDAuMiApIHtcblxuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQXJyb3dIZWxwZXInO1xuXG5cdFx0aWYgKCBfbGluZUdlb21ldHJ5ID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdF9saW5lR2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRcdF9saW5lR2VvbWV0cnkuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggWyAwLCAwLCAwLCAwLCAxLCAwIF0sIDMgKSApO1xuXG5cdFx0XHRfY29uZUdlb21ldHJ5ID0gbmV3IEN5bGluZGVyR2VvbWV0cnkoIDAsIDAuNSwgMSwgNSwgMSApO1xuXHRcdFx0X2NvbmVHZW9tZXRyeS50cmFuc2xhdGUoIDAsIC0gMC41LCAwICk7XG5cblx0XHR9XG5cblx0XHR0aGlzLnBvc2l0aW9uLmNvcHkoIG9yaWdpbiApO1xuXG5cdFx0dGhpcy5saW5lID0gbmV3IExpbmUoIF9saW5lR2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXHRcdHRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0dGhpcy5hZGQoIHRoaXMubGluZSApO1xuXG5cdFx0dGhpcy5jb25lID0gbmV3IE1lc2goIF9jb25lR2VvbWV0cnksIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIHRvbmVNYXBwZWQ6IGZhbHNlIH0gKSApO1xuXHRcdHRoaXMuY29uZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0dGhpcy5hZGQoIHRoaXMuY29uZSApO1xuXG5cdFx0dGhpcy5zZXREaXJlY3Rpb24oIGRpciApO1xuXHRcdHRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApO1xuXG5cdH1cblxuXHRzZXREaXJlY3Rpb24oIGRpciApIHtcblxuXHRcdC8vIGRpciBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWRcblxuXHRcdGlmICggZGlyLnkgPiAwLjk5OTk5ICkge1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0KCAwLCAwLCAwLCAxICk7XG5cblx0XHR9IGVsc2UgaWYgKCBkaXIueSA8IC0gMC45OTk5OSApIHtcblxuXHRcdFx0dGhpcy5xdWF0ZXJuaW9uLnNldCggMSwgMCwgMCwgMCApO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0X2F4aXMuc2V0KCBkaXIueiwgMCwgLSBkaXIueCApLm5vcm1hbGl6ZSgpO1xuXG5cdFx0XHRjb25zdCByYWRpYW5zID0gTWF0aC5hY29zKCBkaXIueSApO1xuXG5cdFx0XHR0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUF4aXNBbmdsZSggX2F4aXMsIHJhZGlhbnMgKTtcblxuXHRcdH1cblxuXHR9XG5cblx0c2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGggPSBsZW5ndGggKiAwLjIsIGhlYWRXaWR0aCA9IGhlYWRMZW5ndGggKiAwLjIgKSB7XG5cblx0XHR0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMC4wMDAxLCBsZW5ndGggLSBoZWFkTGVuZ3RoICksIDEgKTsgLy8gc2VlICMxNzQ1OFxuXHRcdHRoaXMubGluZS51cGRhdGVNYXRyaXgoKTtcblxuXHRcdHRoaXMuY29uZS5zY2FsZS5zZXQoIGhlYWRXaWR0aCwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICk7XG5cdFx0dGhpcy5jb25lLnBvc2l0aW9uLnkgPSBsZW5ndGg7XG5cdFx0dGhpcy5jb25lLnVwZGF0ZU1hdHJpeCgpO1xuXG5cdH1cblxuXHRzZXRDb2xvciggY29sb3IgKSB7XG5cblx0XHR0aGlzLmxpbmUubWF0ZXJpYWwuY29sb3Iuc2V0KCBjb2xvciApO1xuXHRcdHRoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQoIGNvbG9yICk7XG5cblx0fVxuXG5cdGNvcHkoIHNvdXJjZSApIHtcblxuXHRcdHN1cGVyLmNvcHkoIHNvdXJjZSwgZmFsc2UgKTtcblxuXHRcdHRoaXMubGluZS5jb3B5KCBzb3VyY2UubGluZSApO1xuXHRcdHRoaXMuY29uZS5jb3B5KCBzb3VyY2UuY29uZSApO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cblx0fVxuXG59XG5cbmNsYXNzIEF4ZXNIZWxwZXIgZXh0ZW5kcyBMaW5lU2VnbWVudHMge1xuXG5cdGNvbnN0cnVjdG9yKCBzaXplID0gMSApIHtcblxuXHRcdGNvbnN0IHZlcnRpY2VzID0gW1xuXHRcdFx0MCwgMCwgMCxcdHNpemUsIDAsIDAsXG5cdFx0XHQwLCAwLCAwLFx0MCwgc2l6ZSwgMCxcblx0XHRcdDAsIDAsIDAsXHQwLCAwLCBzaXplXG5cdFx0XTtcblxuXHRcdGNvbnN0IGNvbG9ycyA9IFtcblx0XHRcdDEsIDAsIDAsXHQxLCAwLjYsIDAsXG5cdFx0XHQwLCAxLCAwLFx0MC42LCAxLCAwLFxuXHRcdFx0MCwgMCwgMSxcdDAsIDAuNiwgMVxuXHRcdF07XG5cblx0XHRjb25zdCBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpO1xuXHRcdGdlb21ldHJ5LnNldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTtcblx0XHRnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApO1xuXG5cdFx0Y29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiB0cnVlLCB0b25lTWFwcGVkOiBmYWxzZSB9ICk7XG5cblx0XHRzdXBlciggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cblx0XHR0aGlzLnR5cGUgPSAnQXhlc0hlbHBlcic7XG5cblx0fVxuXG59XG5cbmNvbnN0IF9mbG9hdFZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KCAxICk7XG5jb25zdCBfaW50MzJWaWV3ID0gbmV3IEludDMyQXJyYXkoIF9mbG9hdFZpZXcuYnVmZmVyICk7XG5cbmNvbnN0IERhdGFVdGlscyA9IHtcblxuXHQvLyBDb252ZXJ0cyBmbG9hdDMyIHRvIGZsb2F0MTYgKHN0b3JlZCBhcyB1aW50MTYgdmFsdWUpLlxuXG5cdHRvSGFsZkZsb2F0OiBmdW5jdGlvbiAoIHZhbCApIHtcblxuXHRcdC8vIFNvdXJjZTogaHR0cDovL2dhbWVkZXYuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzE3MzI2L2NvbnZlcnNpb24tb2YtYS1udW1iZXItZnJvbS1zaW5nbGUtcHJlY2lzaW9uLWZsb2F0aW5nLXBvaW50LXJlcHJlc2VudGF0aW9uLXRvLWEvMTc0MTAjMTc0MTBcblxuXHRcdC8qIFRoaXMgbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZSBPcGVuRVhSIGltcGxlbWVudGF0aW9uICh2ZXJ5IG9mdGVuXG5cdFx0KiB1c2VkLCBlZy4gaW4gT2dyZSksIHdpdGggdGhlIGFkZGl0aW9uYWwgYmVuZWZpdCBvZiByb3VuZGluZywgaW5zcGlyZWRcblx0XHQqIGJ5IEphbWVzIFR1cnNhP3MgaGFsZi1wcmVjaXNpb24gY29kZS4gKi9cblxuXHRcdF9mbG9hdFZpZXdbIDAgXSA9IHZhbDtcblx0XHRjb25zdCB4ID0gX2ludDMyVmlld1sgMCBdO1xuXG5cdFx0bGV0IGJpdHMgPSAoIHggPj4gMTYgKSAmIDB4ODAwMDsgLyogR2V0IHRoZSBzaWduICovXG5cdFx0bGV0IG0gPSAoIHggPj4gMTIgKSAmIDB4MDdmZjsgLyogS2VlcCBvbmUgZXh0cmEgYml0IGZvciByb3VuZGluZyAqL1xuXHRcdGNvbnN0IGUgPSAoIHggPj4gMjMgKSAmIDB4ZmY7IC8qIFVzaW5nIGludCBpcyBmYXN0ZXIgaGVyZSAqL1xuXG5cdFx0LyogSWYgemVybywgb3IgZGVub3JtYWwsIG9yIGV4cG9uZW50IHVuZGVyZmxvd3MgdG9vIG11Y2ggZm9yIGEgZGVub3JtYWxcblx0XHRcdCogaGFsZiwgcmV0dXJuIHNpZ25lZCB6ZXJvLiAqL1xuXHRcdGlmICggZSA8IDEwMyApIHJldHVybiBiaXRzO1xuXG5cdFx0LyogSWYgTmFOLCByZXR1cm4gTmFOLiBJZiBJbmYgb3IgZXhwb25lbnQgb3ZlcmZsb3csIHJldHVybiBJbmYuICovXG5cdFx0aWYgKCBlID4gMTQyICkge1xuXG5cdFx0XHRiaXRzIHw9IDB4N2MwMDtcblx0XHRcdC8qIElmIGV4cG9uZW50IHdhcyAweGZmIGFuZCBvbmUgbWFudGlzc2EgYml0IHdhcyBzZXQsIGl0IG1lYW5zIE5hTixcblx0XHRcdFx0XHRcdCogbm90IEluZiwgc28gbWFrZSBzdXJlIHdlIHNldCBvbmUgbWFudGlzc2EgYml0IHRvby4gKi9cblx0XHRcdGJpdHMgfD0gKCAoIGUgPT0gMjU1ICkgPyAwIDogMSApICYmICggeCAmIDB4MDA3ZmZmZmYgKTtcblx0XHRcdHJldHVybiBiaXRzO1xuXG5cdFx0fVxuXG5cdFx0LyogSWYgZXhwb25lbnQgdW5kZXJmbG93cyBidXQgbm90IHRvbyBtdWNoLCByZXR1cm4gYSBkZW5vcm1hbCAqL1xuXHRcdGlmICggZSA8IDExMyApIHtcblxuXHRcdFx0bSB8PSAweDA4MDA7XG5cdFx0XHQvKiBFeHRyYSByb3VuZGluZyBtYXkgb3ZlcmZsb3cgYW5kIHNldCBtYW50aXNzYSB0byAwIGFuZCBleHBvbmVudFxuXHRcdFx0XHQqIHRvIDEsIHdoaWNoIGlzIE9LLiAqL1xuXHRcdFx0Yml0cyB8PSAoIG0gPj4gKCAxMTQgLSBlICkgKSArICggKCBtID4+ICggMTEzIC0gZSApICkgJiAxICk7XG5cdFx0XHRyZXR1cm4gYml0cztcblxuXHRcdH1cblxuXHRcdGJpdHMgfD0gKCAoIGUgLSAxMTIgKSA8PCAxMCApIHwgKCBtID4+IDEgKTtcblx0XHQvKiBFeHRyYSByb3VuZGluZy4gQW4gb3ZlcmZsb3cgd2lsbCBzZXQgbWFudGlzc2EgdG8gMCBhbmQgaW5jcmVtZW50XG5cdFx0XHQqIHRoZSBleHBvbmVudCwgd2hpY2ggaXMgT0suICovXG5cdFx0Yml0cyArPSBtICYgMTtcblx0XHRyZXR1cm4gYml0cztcblxuXHR9XG5cbn07XG5cbmNvbnN0IExPRF9NSU4gPSA0O1xuY29uc3QgTE9EX01BWCA9IDg7XG5jb25zdCBTSVpFX01BWCA9IE1hdGgucG93KCAyLCBMT0RfTUFYICk7XG5cbi8vIFRoZSBzdGFuZGFyZCBkZXZpYXRpb25zIChyYWRpYW5zKSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4dHJhIG1pcHMuIFRoZXNlIGFyZVxuLy8gY2hvc2VuIHRvIGFwcHJveGltYXRlIGEgVHJvd2JyaWRnZS1SZWl0eiBkaXN0cmlidXRpb24gZnVuY3Rpb24gdGltZXMgdGhlXG4vLyBnZW9tZXRyaWMgc2hhZG93aW5nIGZ1bmN0aW9uLiBUaGVzZSBzaWdtYSB2YWx1ZXMgc3F1YXJlZCBtdXN0IG1hdGNoIHRoZVxuLy8gdmFyaWFuY2UgI2RlZmluZXMgaW4gY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50Lmdsc2wuanMuXG5jb25zdCBFWFRSQV9MT0RfU0lHTUEgPSBbIDAuMTI1LCAwLjIxNSwgMC4zNSwgMC40NDYsIDAuNTI2LCAwLjU4MiBdO1xuXG5jb25zdCBUT1RBTF9MT0RTID0gTE9EX01BWCAtIExPRF9NSU4gKyAxICsgRVhUUkFfTE9EX1NJR01BLmxlbmd0aDtcblxuLy8gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBibHVyIGZvciBsb29wLiBTbWFsbGVyIHNpZ21hcyB3aWxsIHVzZSBmZXdlclxuLy8gc2FtcGxlcyBhbmQgZXhpdCBlYXJseSwgYnV0IG5vdCByZWNvbXBpbGUgdGhlIHNoYWRlci5cbmNvbnN0IE1BWF9TQU1QTEVTID0gMjA7XG5cbmNvbnN0IEVOQ09ESU5HUyA9IHtcblx0WyBMaW5lYXJFbmNvZGluZyBdOiAwLFxuXHRbIHNSR0JFbmNvZGluZyBdOiAxLFxuXHRbIFJHQkVFbmNvZGluZyBdOiAyLFxuXHRbIFJHQk03RW5jb2RpbmcgXTogMyxcblx0WyBSR0JNMTZFbmNvZGluZyBdOiA0LFxuXHRbIFJHQkRFbmNvZGluZyBdOiA1LFxuXHRbIEdhbW1hRW5jb2RpbmcgXTogNlxufTtcblxuY29uc3QgYmFja2dyb3VuZE1hdGVyaWFsID0gbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7XG5cdHNpZGU6IEJhY2tTaWRlLFxuXHRkZXB0aFdyaXRlOiBmYWxzZSxcblx0ZGVwdGhUZXN0OiBmYWxzZSxcbn0gKTtcbmNvbnN0IGJhY2tncm91bmRCb3ggPSBuZXcgTWVzaCggbmV3IEJveEdlb21ldHJ5KCksIGJhY2tncm91bmRNYXRlcmlhbCApO1xuXG5jb25zdCBfZmxhdENhbWVyYSA9IC8qQF9fUFVSRV9fKi8gbmV3IE9ydGhvZ3JhcGhpY0NhbWVyYSgpO1xuY29uc3QgeyBfbG9kUGxhbmVzLCBfc2l6ZUxvZHMsIF9zaWdtYXMgfSA9IC8qQF9fUFVSRV9fKi8gX2NyZWF0ZVBsYW5lcygpO1xuY29uc3QgX2NsZWFyQ29sb3IgPSAvKkBfX1BVUkVfXyovIG5ldyBDb2xvcigpO1xubGV0IF9vbGRUYXJnZXQgPSBudWxsO1xuXG4vLyBHb2xkZW4gUmF0aW9cbmNvbnN0IFBISSA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyO1xuY29uc3QgSU5WX1BISSA9IDEgLyBQSEk7XG5cbi8vIFZlcnRpY2VzIG9mIGEgZG9kZWNhaGVkcm9uIChleGNlcHQgdGhlIG9wcG9zaXRlcywgd2hpY2ggcmVwcmVzZW50IHRoZVxuLy8gc2FtZSBheGlzKSwgdXNlZCBhcyBheGlzIGRpcmVjdGlvbnMgZXZlbmx5IHNwcmVhZCBvbiBhIHNwaGVyZS5cbmNvbnN0IF9heGlzRGlyZWN0aW9ucyA9IFtcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMSwgMSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAtIDEsIDEsIDEgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggMSwgMSwgLSAxICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gMSwgMSwgLSAxICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIDAsIFBISSwgSU5WX1BISSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCAwLCBQSEksIC0gSU5WX1BISSApLFxuXHQvKkBfX1BVUkVfXyovIG5ldyBWZWN0b3IzKCBJTlZfUEhJLCAwLCBQSEkgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggLSBJTlZfUEhJLCAwLCBQSEkgKSxcblx0LypAX19QVVJFX18qLyBuZXcgVmVjdG9yMyggUEhJLCBJTlZfUEhJLCAwICksXG5cdC8qQF9fUFVSRV9fKi8gbmV3IFZlY3RvcjMoIC0gUEhJLCBJTlZfUEhJLCAwICkgXTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGdlbmVyYXRlcyBhIFByZWZpbHRlcmVkLCBNaXBtYXBwZWQgUmFkaWFuY2UgRW52aXJvbm1lbnQgTWFwXG4gKiAoUE1SRU0pIGZyb20gYSBjdWJlTWFwIGVudmlyb25tZW50IHRleHR1cmUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudCBsZXZlbHMgb2ZcbiAqIGJsdXIgdG8gYmUgcXVpY2tseSBhY2Nlc3NlZCBiYXNlZCBvbiBtYXRlcmlhbCByb3VnaG5lc3MuIEl0IGlzIHBhY2tlZCBpbnRvIGFcbiAqIHNwZWNpYWwgQ3ViZVVWIGZvcm1hdCB0aGF0IGFsbG93cyB1cyB0byBwZXJmb3JtIGN1c3RvbSBpbnRlcnBvbGF0aW9uIHNvIHRoYXRcbiAqIHdlIGNhbiBzdXBwb3J0IG5vbmxpbmVhciBmb3JtYXRzIHN1Y2ggYXMgUkdCRS4gVW5saWtlIGEgdHJhZGl0aW9uYWwgbWlwbWFwXG4gKiBjaGFpbiwgaXQgb25seSBnb2VzIGRvd24gdG8gdGhlIExPRF9NSU4gbGV2ZWwgKGFib3ZlKSwgYW5kIHRoZW4gY3JlYXRlcyBleHRyYVxuICogZXZlbiBtb3JlIGZpbHRlcmVkICdtaXBzJyBhdCB0aGUgc2FtZSBMT0RfTUlOIHJlc29sdXRpb24sIGFzc29jaWF0ZWQgd2l0aFxuICogaGlnaGVyIHJvdWdobmVzcyBsZXZlbHMuIEluIHRoaXMgd2F5IHdlIG1haW50YWluIHJlc29sdXRpb24gdG8gc21vb3RobHlcbiAqIGludGVycG9sYXRlIGRpZmZ1c2UgbGlnaHRpbmcgd2hpbGUgbGltaXRpbmcgc2FtcGxpbmcgY29tcHV0YXRpb24uXG4gKlxuICogUGFwZXI6IEZhc3QsIEFjY3VyYXRlIEltYWdlLUJhc2VkIExpZ2h0aW5nXG4gKiBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzE1eThyX1VwS2xVOVN2VjRJTGIwQzNxQ1BlY1M4cHZMei92aWV3XG4qL1xuXG5mdW5jdGlvbiBjb252ZXJ0TGluZWFyVG9SR0JFKCBjb2xvciApIHtcblxuXHRjb25zdCBtYXhDb21wb25lbnQgPSBNYXRoLm1heCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApO1xuXHRjb25zdCBmRXhwID0gTWF0aC5taW4oIE1hdGgubWF4KCBNYXRoLmNlaWwoIE1hdGgubG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLSAxMjguMCApLCAxMjcuMCApO1xuXHRjb2xvci5tdWx0aXBseVNjYWxhciggTWF0aC5wb3coIDIuMCwgLSBmRXhwICkgKTtcblxuXHRjb25zdCBhbHBoYSA9ICggZkV4cCArIDEyOC4wICkgLyAyNTUuMDtcblx0cmV0dXJuIGFscGhhO1xuXG59XG5cbmNsYXNzIFBNUkVNR2VuZXJhdG9yIHtcblxuXHRjb25zdHJ1Y3RvciggcmVuZGVyZXIgKSB7XG5cblx0XHR0aGlzLl9yZW5kZXJlciA9IHJlbmRlcmVyO1xuXHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gbnVsbDtcblxuXHRcdHRoaXMuX2JsdXJNYXRlcmlhbCA9IF9nZXRCbHVyU2hhZGVyKCBNQVhfU0FNUExFUyApO1xuXHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gbnVsbDtcblx0XHR0aGlzLl9jdWJlbWFwU2hhZGVyID0gbnVsbDtcblxuXHRcdHRoaXMuX2NvbXBpbGVNYXRlcmlhbCggdGhpcy5fYmx1ck1hdGVyaWFsICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBHZW5lcmF0ZXMgYSBQTVJFTSBmcm9tIGEgc3VwcGxpZWQgU2NlbmUsIHdoaWNoIGNhbiBiZSBmYXN0ZXIgdGhhbiB1c2luZyBhblxuXHQgKiBpbWFnZSBpZiBuZXR3b3JraW5nIGJhbmR3aWR0aCBpcyBsb3cuIE9wdGlvbmFsIHNpZ21hIHNwZWNpZmllcyBhIGJsdXIgcmFkaXVzXG5cdCAqIGluIHJhZGlhbnMgdG8gYmUgYXBwbGllZCB0byB0aGUgc2NlbmUgYmVmb3JlIFBNUkVNIGdlbmVyYXRpb24uIE9wdGlvbmFsIG5lYXJcblx0ICogYW5kIGZhciBwbGFuZXMgZW5zdXJlIHRoZSBzY2VuZSBpcyByZW5kZXJlZCBpbiBpdHMgZW50aXJldHkgKHRoZSBjdWJlQ2FtZXJhXG5cdCAqIGlzIHBsYWNlZCBhdCB0aGUgb3JpZ2luKS5cblx0ICovXG5cdGZyb21TY2VuZSggc2NlbmUsIHNpZ21hID0gMCwgbmVhciA9IDAuMSwgZmFyID0gMTAwICkge1xuXG5cdFx0X29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cygpO1xuXG5cdFx0dGhpcy5fc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0aWYgKCBzaWdtYSA+IDAgKSB7XG5cblx0XHRcdHRoaXMuX2JsdXIoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgc2lnbWEgKTtcblxuXHRcdH1cblxuXHRcdHRoaXMuX2FwcGx5UE1SRU0oIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXHRcdHRoaXMuX2NsZWFudXAoIGN1YmVVVlJlbmRlclRhcmdldCApO1xuXG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gZXF1aXJlY3Rhbmd1bGFyIHRleHR1cmUsIHdoaWNoIGNhbiBiZSBlaXRoZXIgTERSXG5cdCAqIChSR0JGb3JtYXQpIG9yIEhEUiAoUkdCRUZvcm1hdCkuIFRoZSBpZGVhbCBpbnB1dCBpbWFnZSBzaXplIGlzIDFrICgxMDI0IHggNTEyKSxcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxuXHQgKi9cblx0ZnJvbUVxdWlyZWN0YW5ndWxhciggZXF1aXJlY3Rhbmd1bGFyICkge1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Zyb21UZXh0dXJlKCBlcXVpcmVjdGFuZ3VsYXIgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEdlbmVyYXRlcyBhIFBNUkVNIGZyb20gYW4gY3ViZW1hcCB0ZXh0dXJlLCB3aGljaCBjYW4gYmUgZWl0aGVyIExEUlxuXHQgKiAoUkdCRm9ybWF0KSBvciBIRFIgKFJHQkVGb3JtYXQpLiBUaGUgaWRlYWwgaW5wdXQgY3ViZSBzaXplIGlzIDI1NiB4IDI1Nixcblx0ICogYXMgdGhpcyBtYXRjaGVzIGJlc3Qgd2l0aCB0aGUgMjU2IHggMjU2IGN1YmVtYXAgb3V0cHV0LlxuXHQgKi9cblx0ZnJvbUN1YmVtYXAoIGN1YmVtYXAgKSB7XG5cblx0XHRyZXR1cm4gdGhpcy5fZnJvbVRleHR1cmUoIGN1YmVtYXAgKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFByZS1jb21waWxlcyB0aGUgY3ViZW1hcCBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcblx0ICogeW91ciB0ZXh0dXJlJ3MgbmV0d29yayBmZXRjaCBmb3IgaW5jcmVhc2VkIGNvbmN1cnJlbmN5LlxuXHQgKi9cblx0Y29tcGlsZUN1YmVtYXBTaGFkZXIoKSB7XG5cblx0XHRpZiAoIHRoaXMuX2N1YmVtYXBTaGFkZXIgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2N1YmVtYXBTaGFkZXIgPSBfZ2V0Q3ViZW1hcFNoYWRlcigpO1xuXHRcdFx0dGhpcy5fY29tcGlsZU1hdGVyaWFsKCB0aGlzLl9jdWJlbWFwU2hhZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBQcmUtY29tcGlsZXMgdGhlIGVxdWlyZWN0YW5ndWxhciBzaGFkZXIuIFlvdSBjYW4gZ2V0IGZhc3RlciBzdGFydC11cCBieSBpbnZva2luZyB0aGlzIG1ldGhvZCBkdXJpbmdcblx0ICogeW91ciB0ZXh0dXJlJ3MgbmV0d29yayBmZXRjaCBmb3IgaW5jcmVhc2VkIGNvbmN1cnJlbmN5LlxuXHQgKi9cblx0Y29tcGlsZUVxdWlyZWN0YW5ndWxhclNoYWRlcigpIHtcblxuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RTaGFkZXIgPT09IG51bGwgKSB7XG5cblx0XHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gX2dldEVxdWlyZWN0U2hhZGVyKCk7XG5cdFx0XHR0aGlzLl9jb21waWxlTWF0ZXJpYWwoIHRoaXMuX2VxdWlyZWN0U2hhZGVyICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwb3NlcyBvZiB0aGUgUE1SRU1HZW5lcmF0b3IncyBpbnRlcm5hbCBtZW1vcnkuIE5vdGUgdGhhdCBQTVJFTUdlbmVyYXRvciBpcyBhIHN0YXRpYyBjbGFzcyxcblx0ICogc28geW91IHNob3VsZCBub3QgbmVlZCBtb3JlIHRoYW4gb25lIFBNUkVNR2VuZXJhdG9yIG9iamVjdC4gSWYgeW91IGRvLCBjYWxsaW5nIGRpc3Bvc2UoKSBvblxuXHQgKiBvbmUgb2YgdGhlbSB3aWxsIGNhdXNlIGFueSBvdGhlcnMgdG8gYWxzbyBiZWNvbWUgdW51c2FibGUuXG5cdCAqL1xuXHRkaXNwb3NlKCkge1xuXG5cdFx0dGhpcy5fYmx1ck1hdGVyaWFsLmRpc3Bvc2UoKTtcblxuXHRcdGlmICggdGhpcy5fY3ViZW1hcFNoYWRlciAhPT0gbnVsbCApIHRoaXMuX2N1YmVtYXBTaGFkZXIuZGlzcG9zZSgpO1xuXHRcdGlmICggdGhpcy5fZXF1aXJlY3RTaGFkZXIgIT09IG51bGwgKSB0aGlzLl9lcXVpcmVjdFNoYWRlci5kaXNwb3NlKCk7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCBfbG9kUGxhbmVzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0X2xvZFBsYW5lc1sgaSBdLmRpc3Bvc2UoKTtcblxuXHRcdH1cblxuXHR9XG5cblx0Ly8gcHJpdmF0ZSBpbnRlcmZhY2VcblxuXHRfY2xlYW51cCggb3V0cHV0VGFyZ2V0ICkge1xuXG5cdFx0dGhpcy5fcGluZ1BvbmdSZW5kZXJUYXJnZXQuZGlzcG9zZSgpO1xuXHRcdHRoaXMuX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggX29sZFRhcmdldCApO1xuXHRcdG91dHB1dFRhcmdldC5zY2lzc29yVGVzdCA9IGZhbHNlO1xuXHRcdF9zZXRWaWV3cG9ydCggb3V0cHV0VGFyZ2V0LCAwLCAwLCBvdXRwdXRUYXJnZXQud2lkdGgsIG91dHB1dFRhcmdldC5oZWlnaHQgKTtcblxuXHR9XG5cblx0X2Zyb21UZXh0dXJlKCB0ZXh0dXJlICkge1xuXG5cdFx0X29sZFRhcmdldCA9IHRoaXMuX3JlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuXHRcdGNvbnN0IGN1YmVVVlJlbmRlclRhcmdldCA9IHRoaXMuX2FsbG9jYXRlVGFyZ2V0cyggdGV4dHVyZSApO1xuXHRcdHRoaXMuX3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5fYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0dGhpcy5fY2xlYW51cCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cblx0XHRyZXR1cm4gY3ViZVVWUmVuZGVyVGFyZ2V0O1xuXG5cdH1cblxuXHRfYWxsb2NhdGVUYXJnZXRzKCB0ZXh0dXJlICkgeyAvLyB3YXJuaW5nOiBudWxsIHRleHR1cmUgaXMgdmFsaWRcblxuXHRcdGNvbnN0IHBhcmFtcyA9IHtcblx0XHRcdG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0XHRcdG1pbkZpbHRlcjogTmVhcmVzdEZpbHRlcixcblx0XHRcdGdlbmVyYXRlTWlwbWFwczogZmFsc2UsXG5cdFx0XHR0eXBlOiBVbnNpZ25lZEJ5dGVUeXBlLFxuXHRcdFx0Zm9ybWF0OiBSR0JFRm9ybWF0LFxuXHRcdFx0ZW5jb2Rpbmc6IF9pc0xEUiggdGV4dHVyZSApID8gdGV4dHVyZS5lbmNvZGluZyA6IFJHQkVFbmNvZGluZyxcblx0XHRcdGRlcHRoQnVmZmVyOiBmYWxzZVxuXHRcdH07XG5cblx0XHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBfY3JlYXRlUmVuZGVyVGFyZ2V0KCBwYXJhbXMgKTtcblx0XHRjdWJlVVZSZW5kZXJUYXJnZXQuZGVwdGhCdWZmZXIgPSB0ZXh0dXJlID8gZmFsc2UgOiB0cnVlO1xuXHRcdHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0ID0gX2NyZWF0ZVJlbmRlclRhcmdldCggcGFyYW1zICk7XG5cdFx0cmV0dXJuIGN1YmVVVlJlbmRlclRhcmdldDtcblxuXHR9XG5cblx0X2NvbXBpbGVNYXRlcmlhbCggbWF0ZXJpYWwgKSB7XG5cblx0XHRjb25zdCB0bXBNZXNoID0gbmV3IE1lc2goIF9sb2RQbGFuZXNbIDAgXSwgbWF0ZXJpYWwgKTtcblx0XHR0aGlzLl9yZW5kZXJlci5jb21waWxlKCB0bXBNZXNoLCBfZmxhdENhbWVyYSApO1xuXG5cdH1cblxuXHRfc2NlbmVUb0N1YmVVViggc2NlbmUsIG5lYXIsIGZhciwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgZm92ID0gOTA7XG5cdFx0Y29uc3QgYXNwZWN0ID0gMTtcblx0XHRjb25zdCBjdWJlQ2FtZXJhID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7XG5cdFx0Y29uc3QgdXBTaWduID0gWyAxLCAtIDEsIDEsIDEsIDEsIDEgXTtcblx0XHRjb25zdCBmb3J3YXJkU2lnbiA9IFsgMSwgMSwgMSwgLSAxLCAtIDEsIC0gMSBdO1xuXHRcdGNvbnN0IHJlbmRlcmVyID0gdGhpcy5fcmVuZGVyZXI7XG5cblx0XHRjb25zdCBvcmlnaW5hbEF1dG9DbGVhciA9IHJlbmRlcmVyLmF1dG9DbGVhcjtcblx0XHRjb25zdCBvdXRwdXRFbmNvZGluZyA9IHJlbmRlcmVyLm91dHB1dEVuY29kaW5nO1xuXHRcdGNvbnN0IHRvbmVNYXBwaW5nID0gcmVuZGVyZXIudG9uZU1hcHBpbmc7XG5cdFx0cmVuZGVyZXIuZ2V0Q2xlYXJDb2xvciggX2NsZWFyQ29sb3IgKTtcblxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gTm9Ub25lTWFwcGluZztcblx0XHRyZW5kZXJlci5vdXRwdXRFbmNvZGluZyA9IExpbmVhckVuY29kaW5nO1xuXHRcdHJlbmRlcmVyLmF1dG9DbGVhciA9IGZhbHNlO1xuXG5cdFx0bGV0IHVzZVNvbGlkQ29sb3IgPSBmYWxzZTtcblx0XHRjb25zdCBiYWNrZ3JvdW5kID0gc2NlbmUuYmFja2dyb3VuZDtcblx0XHRpZiAoIGJhY2tncm91bmQgKSB7XG5cblx0XHRcdGlmICggYmFja2dyb3VuZC5pc0NvbG9yICkge1xuXG5cdFx0XHRcdGJhY2tncm91bmRNYXRlcmlhbC5jb2xvci5jb3B5KCBiYWNrZ3JvdW5kICkuY29udmVydFNSR0JUb0xpbmVhcigpO1xuXHRcdFx0XHRzY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcblxuXHRcdFx0XHRjb25zdCBhbHBoYSA9IGNvbnZlcnRMaW5lYXJUb1JHQkUoIGJhY2tncm91bmRNYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0XHRiYWNrZ3JvdW5kTWF0ZXJpYWwub3BhY2l0eSA9IGFscGhhO1xuXHRcdFx0XHR1c2VTb2xpZENvbG9yID0gdHJ1ZTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLmNvbG9yLmNvcHkoIF9jbGVhckNvbG9yICkuY29udmVydFNSR0JUb0xpbmVhcigpO1xuXG5cdFx0XHRjb25zdCBhbHBoYSA9IGNvbnZlcnRMaW5lYXJUb1JHQkUoIGJhY2tncm91bmRNYXRlcmlhbC5jb2xvciApO1xuXHRcdFx0YmFja2dyb3VuZE1hdGVyaWFsLm9wYWNpdHkgPSBhbHBoYTtcblx0XHRcdHVzZVNvbGlkQ29sb3IgPSB0cnVlO1xuXG5cdFx0fVxuXG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCA2OyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBjb2wgPSBpICUgMztcblx0XHRcdGlmICggY29sID09IDAgKSB7XG5cblx0XHRcdFx0Y3ViZUNhbWVyYS51cC5zZXQoIDAsIHVwU2lnblsgaSBdLCAwICk7XG5cdFx0XHRcdGN1YmVDYW1lcmEubG9va0F0KCBmb3J3YXJkU2lnblsgaSBdLCAwLCAwICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGNvbCA9PSAxICkge1xuXG5cdFx0XHRcdGN1YmVDYW1lcmEudXAuc2V0KCAwLCAwLCB1cFNpZ25bIGkgXSApO1xuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgZm9yd2FyZFNpZ25bIGkgXSwgMCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdGN1YmVDYW1lcmEudXAuc2V0KCAwLCB1cFNpZ25bIGkgXSwgMCApO1xuXHRcdFx0XHRjdWJlQ2FtZXJhLmxvb2tBdCggMCwgMCwgZm9yd2FyZFNpZ25bIGkgXSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdF9zZXRWaWV3cG9ydCggY3ViZVVWUmVuZGVyVGFyZ2V0LFxuXHRcdFx0XHRjb2wgKiBTSVpFX01BWCwgaSA+IDIgPyBTSVpFX01BWCA6IDAsIFNJWkVfTUFYLCBTSVpFX01BWCApO1xuXHRcdFx0cmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdWJlVVZSZW5kZXJUYXJnZXQgKTtcblxuXHRcdFx0aWYgKCB1c2VTb2xpZENvbG9yICkge1xuXG5cdFx0XHRcdHJlbmRlcmVyLnJlbmRlciggYmFja2dyb3VuZEJveCwgY3ViZUNhbWVyYSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdHJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGN1YmVDYW1lcmEgKTtcblxuXHRcdH1cblxuXHRcdHJlbmRlcmVyLnRvbmVNYXBwaW5nID0gdG9uZU1hcHBpbmc7XG5cdFx0cmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgPSBvdXRwdXRFbmNvZGluZztcblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBvcmlnaW5hbEF1dG9DbGVhcjtcblxuXHR9XG5cblx0X3RleHR1cmVUb0N1YmVVViggdGV4dHVyZSwgY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcblxuXHRcdGlmICggdGV4dHVyZS5pc0N1YmVUZXh0dXJlICkge1xuXG5cdFx0XHRpZiAoIHRoaXMuX2N1YmVtYXBTaGFkZXIgPT0gbnVsbCApIHtcblxuXHRcdFx0XHR0aGlzLl9jdWJlbWFwU2hhZGVyID0gX2dldEN1YmVtYXBTaGFkZXIoKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0aWYgKCB0aGlzLl9lcXVpcmVjdFNoYWRlciA9PSBudWxsICkge1xuXG5cdFx0XHRcdHRoaXMuX2VxdWlyZWN0U2hhZGVyID0gX2dldEVxdWlyZWN0U2hhZGVyKCk7XG5cblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdGNvbnN0IG1hdGVyaWFsID0gdGV4dHVyZS5pc0N1YmVUZXh0dXJlID8gdGhpcy5fY3ViZW1hcFNoYWRlciA6IHRoaXMuX2VxdWlyZWN0U2hhZGVyO1xuXHRcdGNvbnN0IG1lc2ggPSBuZXcgTWVzaCggX2xvZFBsYW5lc1sgMCBdLCBtYXRlcmlhbCApO1xuXG5cdFx0Y29uc3QgdW5pZm9ybXMgPSBtYXRlcmlhbC51bmlmb3JtcztcblxuXHRcdHVuaWZvcm1zWyAnZW52TWFwJyBdLnZhbHVlID0gdGV4dHVyZTtcblxuXHRcdGlmICggISB0ZXh0dXJlLmlzQ3ViZVRleHR1cmUgKSB7XG5cblx0XHRcdHVuaWZvcm1zWyAndGV4ZWxTaXplJyBdLnZhbHVlLnNldCggMS4wIC8gdGV4dHVyZS5pbWFnZS53aWR0aCwgMS4wIC8gdGV4dHVyZS5pbWFnZS5oZWlnaHQgKTtcblxuXHRcdH1cblxuXHRcdHVuaWZvcm1zWyAnaW5wdXRFbmNvZGluZycgXS52YWx1ZSA9IEVOQ09ESU5HU1sgdGV4dHVyZS5lbmNvZGluZyBdO1xuXHRcdHVuaWZvcm1zWyAnb3V0cHV0RW5jb2RpbmcnIF0udmFsdWUgPSBFTkNPRElOR1NbIGN1YmVVVlJlbmRlclRhcmdldC50ZXh0dXJlLmVuY29kaW5nIF07XG5cblx0XHRfc2V0Vmlld3BvcnQoIGN1YmVVVlJlbmRlclRhcmdldCwgMCwgMCwgMyAqIFNJWkVfTUFYLCAyICogU0laRV9NQVggKTtcblxuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggY3ViZVVWUmVuZGVyVGFyZ2V0ICk7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBtZXNoLCBfZmxhdENhbWVyYSApO1xuXG5cdH1cblxuXHRfYXBwbHlQTVJFTSggY3ViZVVWUmVuZGVyVGFyZ2V0ICkge1xuXG5cdFx0Y29uc3QgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlcjtcblx0XHRjb25zdCBhdXRvQ2xlYXIgPSByZW5kZXJlci5hdXRvQ2xlYXI7XG5cdFx0cmVuZGVyZXIuYXV0b0NsZWFyID0gZmFsc2U7XG5cblx0XHRmb3IgKCBsZXQgaSA9IDE7IGkgPCBUT1RBTF9MT0RTOyBpICsrICkge1xuXG5cdFx0XHRjb25zdCBzaWdtYSA9IE1hdGguc3FydCggX3NpZ21hc1sgaSBdICogX3NpZ21hc1sgaSBdIC0gX3NpZ21hc1sgaSAtIDEgXSAqIF9zaWdtYXNbIGkgLSAxIF0gKTtcblxuXHRcdFx0Y29uc3QgcG9sZUF4aXMgPSBfYXhpc0RpcmVjdGlvbnNbICggaSAtIDEgKSAlIF9heGlzRGlyZWN0aW9ucy5sZW5ndGggXTtcblxuXHRcdFx0dGhpcy5fYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBpIC0gMSwgaSwgc2lnbWEsIHBvbGVBeGlzICk7XG5cblx0XHR9XG5cblx0XHRyZW5kZXJlci5hdXRvQ2xlYXIgPSBhdXRvQ2xlYXI7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGlzIGlzIGEgdHdvLXBhc3MgR2F1c3NpYW4gYmx1ciBmb3IgYSBjdWJlbWFwLiBOb3JtYWxseSB0aGlzIGlzIGRvbmVcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LCBidXQgdGhpcyBicmVha3MgZG93biBvbiBhIGN1YmUuIEhlcmUgd2UgYXBwbHlcblx0ICogdGhlIGJsdXIgbGF0aXR1ZGluYWxseSAoYXJvdW5kIHRoZSBwb2xlcyksIGFuZCB0aGVuIGxvbmdpdHVkaW5hbGx5ICh0b3dhcmRzXG5cdCAqIHRoZSBwb2xlcykgdG8gYXBwcm94aW1hdGUgdGhlIG9ydGhvZ29uYWxseS1zZXBhcmFibGUgYmx1ci4gSXQgaXMgbGVhc3Rcblx0ICogYWNjdXJhdGUgYXQgdGhlIHBvbGVzLCBidXQgc3RpbGwgZG9lcyBhIGRlY2VudCBqb2IuXG5cdCAqL1xuXHRfYmx1ciggY3ViZVVWUmVuZGVyVGFyZ2V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYSwgcG9sZUF4aXMgKSB7XG5cblx0XHRjb25zdCBwaW5nUG9uZ1JlbmRlclRhcmdldCA9IHRoaXMuX3BpbmdQb25nUmVuZGVyVGFyZ2V0O1xuXG5cdFx0dGhpcy5faGFsZkJsdXIoXG5cdFx0XHRjdWJlVVZSZW5kZXJUYXJnZXQsXG5cdFx0XHRwaW5nUG9uZ1JlbmRlclRhcmdldCxcblx0XHRcdGxvZEluLFxuXHRcdFx0bG9kT3V0LFxuXHRcdFx0c2lnbWEsXG5cdFx0XHQnbGF0aXR1ZGluYWwnLFxuXHRcdFx0cG9sZUF4aXMgKTtcblxuXHRcdHRoaXMuX2hhbGZCbHVyKFxuXHRcdFx0cGluZ1BvbmdSZW5kZXJUYXJnZXQsXG5cdFx0XHRjdWJlVVZSZW5kZXJUYXJnZXQsXG5cdFx0XHRsb2RPdXQsXG5cdFx0XHRsb2RPdXQsXG5cdFx0XHRzaWdtYSxcblx0XHRcdCdsb25naXR1ZGluYWwnLFxuXHRcdFx0cG9sZUF4aXMgKTtcblxuXHR9XG5cblx0X2hhbGZCbHVyKCB0YXJnZXRJbiwgdGFyZ2V0T3V0LCBsb2RJbiwgbG9kT3V0LCBzaWdtYVJhZGlhbnMsIGRpcmVjdGlvbiwgcG9sZUF4aXMgKSB7XG5cblx0XHRjb25zdCByZW5kZXJlciA9IHRoaXMuX3JlbmRlcmVyO1xuXHRcdGNvbnN0IGJsdXJNYXRlcmlhbCA9IHRoaXMuX2JsdXJNYXRlcmlhbDtcblxuXHRcdGlmICggZGlyZWN0aW9uICE9PSAnbGF0aXR1ZGluYWwnICYmIGRpcmVjdGlvbiAhPT0gJ2xvbmdpdHVkaW5hbCcgKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoXG5cdFx0XHRcdCdibHVyIGRpcmVjdGlvbiBtdXN0IGJlIGVpdGhlciBsYXRpdHVkaW5hbCBvciBsb25naXR1ZGluYWwhJyApO1xuXG5cdFx0fVxuXG5cdFx0Ly8gTnVtYmVyIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYXQgd2hpY2ggdG8gY3V0IG9mZiB0aGUgZGlzY3JldGUgYXBwcm94aW1hdGlvbi5cblx0XHRjb25zdCBTVEFOREFSRF9ERVZJQVRJT05TID0gMztcblxuXHRcdGNvbnN0IGJsdXJNZXNoID0gbmV3IE1lc2goIF9sb2RQbGFuZXNbIGxvZE91dCBdLCBibHVyTWF0ZXJpYWwgKTtcblx0XHRjb25zdCBibHVyVW5pZm9ybXMgPSBibHVyTWF0ZXJpYWwudW5pZm9ybXM7XG5cblx0XHRjb25zdCBwaXhlbHMgPSBfc2l6ZUxvZHNbIGxvZEluIF0gLSAxO1xuXHRcdGNvbnN0IHJhZGlhbnNQZXJQaXhlbCA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IE1hdGguUEkgLyAoIDIgKiBwaXhlbHMgKSA6IDIgKiBNYXRoLlBJIC8gKCAyICogTUFYX1NBTVBMRVMgLSAxICk7XG5cdFx0Y29uc3Qgc2lnbWFQaXhlbHMgPSBzaWdtYVJhZGlhbnMgLyByYWRpYW5zUGVyUGl4ZWw7XG5cdFx0Y29uc3Qgc2FtcGxlcyA9IGlzRmluaXRlKCBzaWdtYVJhZGlhbnMgKSA/IDEgKyBNYXRoLmZsb29yKCBTVEFOREFSRF9ERVZJQVRJT05TICogc2lnbWFQaXhlbHMgKSA6IE1BWF9TQU1QTEVTO1xuXG5cdFx0aWYgKCBzYW1wbGVzID4gTUFYX1NBTVBMRVMgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggYHNpZ21hUmFkaWFucywgJHtcblx0XHRcdFx0c2lnbWFSYWRpYW5zfSwgaXMgdG9vIGxhcmdlIGFuZCB3aWxsIGNsaXAsIGFzIGl0IHJlcXVlc3RlZCAke1xuXHRcdFx0XHRzYW1wbGVzfSBzYW1wbGVzIHdoZW4gdGhlIG1heGltdW0gaXMgc2V0IHRvICR7TUFYX1NBTVBMRVN9YCApO1xuXG5cdFx0fVxuXG5cdFx0Y29uc3Qgd2VpZ2h0cyA9IFtdO1xuXHRcdGxldCBzdW0gPSAwO1xuXG5cdFx0Zm9yICggbGV0IGkgPSAwOyBpIDwgTUFYX1NBTVBMRVM7ICsrIGkgKSB7XG5cblx0XHRcdGNvbnN0IHggPSBpIC8gc2lnbWFQaXhlbHM7XG5cdFx0XHRjb25zdCB3ZWlnaHQgPSBNYXRoLmV4cCggLSB4ICogeCAvIDIgKTtcblx0XHRcdHdlaWdodHMucHVzaCggd2VpZ2h0ICk7XG5cblx0XHRcdGlmICggaSA9PSAwICkge1xuXG5cdFx0XHRcdHN1bSArPSB3ZWlnaHQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGkgPCBzYW1wbGVzICkge1xuXG5cdFx0XHRcdHN1bSArPSAyICogd2VpZ2h0O1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHRmb3IgKCBsZXQgaSA9IDA7IGkgPCB3ZWlnaHRzLmxlbmd0aDsgaSArKyApIHtcblxuXHRcdFx0d2VpZ2h0c1sgaSBdID0gd2VpZ2h0c1sgaSBdIC8gc3VtO1xuXG5cdFx0fVxuXG5cdFx0Ymx1clVuaWZvcm1zWyAnZW52TWFwJyBdLnZhbHVlID0gdGFyZ2V0SW4udGV4dHVyZTtcblx0XHRibHVyVW5pZm9ybXNbICdzYW1wbGVzJyBdLnZhbHVlID0gc2FtcGxlcztcblx0XHRibHVyVW5pZm9ybXNbICd3ZWlnaHRzJyBdLnZhbHVlID0gd2VpZ2h0cztcblx0XHRibHVyVW5pZm9ybXNbICdsYXRpdHVkaW5hbCcgXS52YWx1ZSA9IGRpcmVjdGlvbiA9PT0gJ2xhdGl0dWRpbmFsJztcblxuXHRcdGlmICggcG9sZUF4aXMgKSB7XG5cblx0XHRcdGJsdXJVbmlmb3Jtc1sgJ3BvbGVBeGlzJyBdLnZhbHVlID0gcG9sZUF4aXM7XG5cblx0XHR9XG5cblx0XHRibHVyVW5pZm9ybXNbICdkVGhldGEnIF0udmFsdWUgPSByYWRpYW5zUGVyUGl4ZWw7XG5cdFx0Ymx1clVuaWZvcm1zWyAnbWlwSW50JyBdLnZhbHVlID0gTE9EX01BWCAtIGxvZEluO1xuXHRcdGJsdXJVbmlmb3Jtc1sgJ2lucHV0RW5jb2RpbmcnIF0udmFsdWUgPSBFTkNPRElOR1NbIHRhcmdldEluLnRleHR1cmUuZW5jb2RpbmcgXTtcblx0XHRibHVyVW5pZm9ybXNbICdvdXRwdXRFbmNvZGluZycgXS52YWx1ZSA9IEVOQ09ESU5HU1sgdGFyZ2V0SW4udGV4dHVyZS5lbmNvZGluZyBdO1xuXG5cdFx0Y29uc3Qgb3V0cHV0U2l6ZSA9IF9zaXplTG9kc1sgbG9kT3V0IF07XG5cdFx0Y29uc3QgeCA9IDMgKiBNYXRoLm1heCggMCwgU0laRV9NQVggLSAyICogb3V0cHV0U2l6ZSApO1xuXHRcdGNvbnN0IHkgPSAoIGxvZE91dCA9PT0gMCA/IDAgOiAyICogU0laRV9NQVggKSArIDIgKiBvdXRwdXRTaXplICogKCBsb2RPdXQgPiBMT0RfTUFYIC0gTE9EX01JTiA/IGxvZE91dCAtIExPRF9NQVggKyBMT0RfTUlOIDogMCApO1xuXG5cdFx0X3NldFZpZXdwb3J0KCB0YXJnZXRPdXQsIHgsIHksIDMgKiBvdXRwdXRTaXplLCAyICogb3V0cHV0U2l6ZSApO1xuXHRcdHJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggdGFyZ2V0T3V0ICk7XG5cdFx0cmVuZGVyZXIucmVuZGVyKCBibHVyTWVzaCwgX2ZsYXRDYW1lcmEgKTtcblxuXHR9XG5cbn1cblxuZnVuY3Rpb24gX2lzTERSKCB0ZXh0dXJlICkge1xuXG5cdGlmICggdGV4dHVyZSA9PT0gdW5kZWZpbmVkIHx8IHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiBmYWxzZTtcblxuXHRyZXR1cm4gdGV4dHVyZS5lbmNvZGluZyA9PT0gTGluZWFyRW5jb2RpbmcgfHwgdGV4dHVyZS5lbmNvZGluZyA9PT0gc1JHQkVuY29kaW5nIHx8IHRleHR1cmUuZW5jb2RpbmcgPT09IEdhbW1hRW5jb2Rpbmc7XG5cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVBsYW5lcygpIHtcblxuXHRjb25zdCBfbG9kUGxhbmVzID0gW107XG5cdGNvbnN0IF9zaXplTG9kcyA9IFtdO1xuXHRjb25zdCBfc2lnbWFzID0gW107XG5cblx0bGV0IGxvZCA9IExPRF9NQVg7XG5cblx0Zm9yICggbGV0IGkgPSAwOyBpIDwgVE9UQUxfTE9EUzsgaSArKyApIHtcblxuXHRcdGNvbnN0IHNpemVMb2QgPSBNYXRoLnBvdyggMiwgbG9kICk7XG5cdFx0X3NpemVMb2RzLnB1c2goIHNpemVMb2QgKTtcblx0XHRsZXQgc2lnbWEgPSAxLjAgLyBzaXplTG9kO1xuXG5cdFx0aWYgKCBpID4gTE9EX01BWCAtIExPRF9NSU4gKSB7XG5cblx0XHRcdHNpZ21hID0gRVhUUkFfTE9EX1NJR01BWyBpIC0gTE9EX01BWCArIExPRF9NSU4gLSAxIF07XG5cblx0XHR9IGVsc2UgaWYgKCBpID09IDAgKSB7XG5cblx0XHRcdHNpZ21hID0gMDtcblxuXHRcdH1cblxuXHRcdF9zaWdtYXMucHVzaCggc2lnbWEgKTtcblxuXHRcdGNvbnN0IHRleGVsU2l6ZSA9IDEuMCAvICggc2l6ZUxvZCAtIDEgKTtcblx0XHRjb25zdCBtaW4gPSAtIHRleGVsU2l6ZSAvIDI7XG5cdFx0Y29uc3QgbWF4ID0gMSArIHRleGVsU2l6ZSAvIDI7XG5cdFx0Y29uc3QgdXYxID0gWyBtaW4sIG1pbiwgbWF4LCBtaW4sIG1heCwgbWF4LCBtaW4sIG1pbiwgbWF4LCBtYXgsIG1pbiwgbWF4IF07XG5cblx0XHRjb25zdCBjdWJlRmFjZXMgPSA2O1xuXHRcdGNvbnN0IHZlcnRpY2VzID0gNjtcblx0XHRjb25zdCBwb3NpdGlvblNpemUgPSAzO1xuXHRcdGNvbnN0IHV2U2l6ZSA9IDI7XG5cdFx0Y29uc3QgZmFjZUluZGV4U2l6ZSA9IDE7XG5cblx0XHRjb25zdCBwb3NpdGlvbiA9IG5ldyBGbG9hdDMyQXJyYXkoIHBvc2l0aW9uU2l6ZSAqIHZlcnRpY2VzICogY3ViZUZhY2VzICk7XG5cdFx0Y29uc3QgdXYgPSBuZXcgRmxvYXQzMkFycmF5KCB1dlNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xuXHRcdGNvbnN0IGZhY2VJbmRleCA9IG5ldyBGbG9hdDMyQXJyYXkoIGZhY2VJbmRleFNpemUgKiB2ZXJ0aWNlcyAqIGN1YmVGYWNlcyApO1xuXG5cdFx0Zm9yICggbGV0IGZhY2UgPSAwOyBmYWNlIDwgY3ViZUZhY2VzOyBmYWNlICsrICkge1xuXG5cdFx0XHRjb25zdCB4ID0gKCBmYWNlICUgMyApICogMiAvIDMgLSAxO1xuXHRcdFx0Y29uc3QgeSA9IGZhY2UgPiAyID8gMCA6IC0gMTtcblx0XHRcdGNvbnN0IGNvb3JkaW5hdGVzID0gW1xuXHRcdFx0XHR4LCB5LCAwLFxuXHRcdFx0XHR4ICsgMiAvIDMsIHksIDAsXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXG5cdFx0XHRcdHgsIHksIDAsXG5cdFx0XHRcdHggKyAyIC8gMywgeSArIDEsIDAsXG5cdFx0XHRcdHgsIHkgKyAxLCAwXG5cdFx0XHRdO1xuXHRcdFx0cG9zaXRpb24uc2V0KCBjb29yZGluYXRlcywgcG9zaXRpb25TaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cdFx0XHR1di5zZXQoIHV2MSwgdXZTaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cdFx0XHRjb25zdCBmaWxsID0gWyBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlLCBmYWNlIF07XG5cdFx0XHRmYWNlSW5kZXguc2V0KCBmaWxsLCBmYWNlSW5kZXhTaXplICogdmVydGljZXMgKiBmYWNlICk7XG5cblx0XHR9XG5cblx0XHRjb25zdCBwbGFuZXMgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgcG9zaXRpb25TaXplICkgKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1diwgdXZTaXplICkgKTtcblx0XHRwbGFuZXMuc2V0QXR0cmlidXRlKCAnZmFjZUluZGV4JywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggZmFjZUluZGV4LCBmYWNlSW5kZXhTaXplICkgKTtcblx0XHRfbG9kUGxhbmVzLnB1c2goIHBsYW5lcyApO1xuXG5cdFx0aWYgKCBsb2QgPiBMT0RfTUlOICkge1xuXG5cdFx0XHRsb2QgLS07XG5cblx0XHR9XG5cblx0fVxuXG5cdHJldHVybiB7IF9sb2RQbGFuZXMsIF9zaXplTG9kcywgX3NpZ21hcyB9O1xuXG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVSZW5kZXJUYXJnZXQoIHBhcmFtcyApIHtcblxuXHRjb25zdCBjdWJlVVZSZW5kZXJUYXJnZXQgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIDMgKiBTSVpFX01BWCwgMyAqIFNJWkVfTUFYLCBwYXJhbXMgKTtcblx0Y3ViZVVWUmVuZGVyVGFyZ2V0LnRleHR1cmUubWFwcGluZyA9IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nO1xuXHRjdWJlVVZSZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lID0gJ1BNUkVNLmN1YmVVdic7XG5cdGN1YmVVVlJlbmRlclRhcmdldC5zY2lzc29yVGVzdCA9IHRydWU7XG5cdHJldHVybiBjdWJlVVZSZW5kZXJUYXJnZXQ7XG5cbn1cblxuZnVuY3Rpb24gX3NldFZpZXdwb3J0KCB0YXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG5cblx0dGFyZ2V0LnZpZXdwb3J0LnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApO1xuXHR0YXJnZXQuc2Npc3Nvci5zZXQoIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcblxufVxuXG5mdW5jdGlvbiBfZ2V0Qmx1clNoYWRlciggbWF4U2FtcGxlcyApIHtcblxuXHRjb25zdCB3ZWlnaHRzID0gbmV3IEZsb2F0MzJBcnJheSggbWF4U2FtcGxlcyApO1xuXHRjb25zdCBwb2xlQXhpcyA9IG5ldyBWZWN0b3IzKCAwLCAxLCAwICk7XG5cdGNvbnN0IHNoYWRlck1hdGVyaWFsID0gbmV3IFJhd1NoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRuYW1lOiAnU3BoZXJpY2FsR2F1c3NpYW5CbHVyJyxcblxuXHRcdGRlZmluZXM6IHsgJ24nOiBtYXhTYW1wbGVzIH0sXG5cblx0XHR1bmlmb3Jtczoge1xuXHRcdFx0J2Vudk1hcCc6IHsgdmFsdWU6IG51bGwgfSxcblx0XHRcdCdzYW1wbGVzJzogeyB2YWx1ZTogMSB9LFxuXHRcdFx0J3dlaWdodHMnOiB7IHZhbHVlOiB3ZWlnaHRzIH0sXG5cdFx0XHQnbGF0aXR1ZGluYWwnOiB7IHZhbHVlOiBmYWxzZSB9LFxuXHRcdFx0J2RUaGV0YSc6IHsgdmFsdWU6IDAgfSxcblx0XHRcdCdtaXBJbnQnOiB7IHZhbHVlOiAwIH0sXG5cdFx0XHQncG9sZUF4aXMnOiB7IHZhbHVlOiBwb2xlQXhpcyB9LFxuXHRcdFx0J2lucHV0RW5jb2RpbmcnOiB7IHZhbHVlOiBFTkNPRElOR1NbIExpbmVhckVuY29kaW5nIF0gfSxcblx0XHRcdCdvdXRwdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9XG5cdFx0fSxcblxuXHRcdHZlcnRleFNoYWRlcjogX2dldENvbW1vblZlcnRleFNoYWRlcigpLFxuXG5cdFx0ZnJhZ21lbnRTaGFkZXI6IC8qIGdsc2wgKi9gXG5cblx0XHRcdHByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0XHR2YXJ5aW5nIHZlYzMgdk91dHB1dERpcmVjdGlvbjtcblxuXHRcdFx0dW5pZm9ybSBzYW1wbGVyMkQgZW52TWFwO1xuXHRcdFx0dW5pZm9ybSBpbnQgc2FtcGxlcztcblx0XHRcdHVuaWZvcm0gZmxvYXQgd2VpZ2h0c1sgbiBdO1xuXHRcdFx0dW5pZm9ybSBib29sIGxhdGl0dWRpbmFsO1xuXHRcdFx0dW5pZm9ybSBmbG9hdCBkVGhldGE7XG5cdFx0XHR1bmlmb3JtIGZsb2F0IG1pcEludDtcblx0XHRcdHVuaWZvcm0gdmVjMyBwb2xlQXhpcztcblxuXHRcdFx0JHsgX2dldEVuY29kaW5ncygpIH1cblxuXHRcdFx0I2RlZmluZSBFTlZNQVBfVFlQRV9DVUJFX1VWXG5cdFx0XHQjaW5jbHVkZSA8Y3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50PlxuXG5cdFx0XHR2ZWMzIGdldFNhbXBsZSggZmxvYXQgdGhldGEsIHZlYzMgYXhpcyApIHtcblxuXHRcdFx0XHRmbG9hdCBjb3NUaGV0YSA9IGNvcyggdGhldGEgKTtcblx0XHRcdFx0Ly8gUm9kcmlndWVzJyBheGlzLWFuZ2xlIHJvdGF0aW9uXG5cdFx0XHRcdHZlYzMgc2FtcGxlRGlyZWN0aW9uID0gdk91dHB1dERpcmVjdGlvbiAqIGNvc1RoZXRhXG5cdFx0XHRcdFx0KyBjcm9zcyggYXhpcywgdk91dHB1dERpcmVjdGlvbiApICogc2luKCB0aGV0YSApXG5cdFx0XHRcdFx0KyBheGlzICogZG90KCBheGlzLCB2T3V0cHV0RGlyZWN0aW9uICkgKiAoIDEuMCAtIGNvc1RoZXRhICk7XG5cblx0XHRcdFx0cmV0dXJuIGJpbGluZWFyQ3ViZVVWKCBlbnZNYXAsIHNhbXBsZURpcmVjdGlvbiwgbWlwSW50ICk7XG5cblx0XHRcdH1cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdHZlYzMgYXhpcyA9IGxhdGl0dWRpbmFsID8gcG9sZUF4aXMgOiBjcm9zcyggcG9sZUF4aXMsIHZPdXRwdXREaXJlY3Rpb24gKTtcblxuXHRcdFx0XHRpZiAoIGFsbCggZXF1YWwoIGF4aXMsIHZlYzMoIDAuMCApICkgKSApIHtcblxuXHRcdFx0XHRcdGF4aXMgPSB2ZWMzKCB2T3V0cHV0RGlyZWN0aW9uLnosIDAuMCwgLSB2T3V0cHV0RGlyZWN0aW9uLnggKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXhpcyA9IG5vcm1hbGl6ZSggYXhpcyApO1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIDAgXSAqIGdldFNhbXBsZSggMC4wLCBheGlzICk7XG5cblx0XHRcdFx0Zm9yICggaW50IGkgPSAxOyBpIDwgbjsgaSsrICkge1xuXG5cdFx0XHRcdFx0aWYgKCBpID49IHNhbXBsZXMgKSB7XG5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZmxvYXQgdGhldGEgPSBkVGhldGEgKiBmbG9hdCggaSApO1xuXHRcdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgKz0gd2VpZ2h0c1sgaSBdICogZ2V0U2FtcGxlKCAtMS4wICogdGhldGEsIGF4aXMgKTtcblx0XHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiICs9IHdlaWdodHNbIGkgXSAqIGdldFNhbXBsZSggdGhldGEsIGF4aXMgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHRgLFxuXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxuXG5cdH0gKTtcblxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XG5cbn1cblxuZnVuY3Rpb24gX2dldEVxdWlyZWN0U2hhZGVyKCkge1xuXG5cdGNvbnN0IHRleGVsU2l6ZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7XG5cdGNvbnN0IHNoYWRlck1hdGVyaWFsID0gbmV3IFJhd1NoYWRlck1hdGVyaWFsKCB7XG5cblx0XHRuYW1lOiAnRXF1aXJlY3Rhbmd1bGFyVG9DdWJlVVYnLFxuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHQndGV4ZWxTaXplJzogeyB2YWx1ZTogdGV4ZWxTaXplIH0sXG5cdFx0XHQnaW5wdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9LFxuXHRcdFx0J291dHB1dEVuY29kaW5nJzogeyB2YWx1ZTogRU5DT0RJTkdTWyBMaW5lYXJFbmNvZGluZyBdIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXG5cblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXIyRCBlbnZNYXA7XG5cdFx0XHR1bmlmb3JtIHZlYzIgdGV4ZWxTaXplO1xuXG5cdFx0XHQkeyBfZ2V0RW5jb2RpbmdzKCkgfVxuXG5cdFx0XHQjaW5jbHVkZSA8Y29tbW9uPlxuXG5cdFx0XHR2b2lkIG1haW4oKSB7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cblx0XHRcdFx0dmVjMyBvdXRwdXREaXJlY3Rpb24gPSBub3JtYWxpemUoIHZPdXRwdXREaXJlY3Rpb24gKTtcblx0XHRcdFx0dmVjMiB1diA9IGVxdWlyZWN0VXYoIG91dHB1dERpcmVjdGlvbiApO1xuXG5cdFx0XHRcdHZlYzIgZiA9IGZyYWN0KCB1diAvIHRleGVsU2l6ZSAtIDAuNSApO1xuXHRcdFx0XHR1diAtPSBmICogdGV4ZWxTaXplO1xuXHRcdFx0XHR2ZWMzIHRsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54ICs9IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIHRyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di55ICs9IHRleGVsU2l6ZS55O1xuXHRcdFx0XHR2ZWMzIGJyID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXHRcdFx0XHR1di54IC09IHRleGVsU2l6ZS54O1xuXHRcdFx0XHR2ZWMzIGJsID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZTJEICggZW52TWFwLCB1diApICkucmdiO1xuXG5cdFx0XHRcdHZlYzMgdG0gPSBtaXgoIHRsLCB0ciwgZi54ICk7XG5cdFx0XHRcdHZlYzMgYm0gPSBtaXgoIGJsLCBiciwgZi54ICk7XG5cdFx0XHRcdGdsX0ZyYWdDb2xvci5yZ2IgPSBtaXgoIHRtLCBibSwgZi55ICk7XG5cblx0XHRcdFx0Z2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7XG5cblx0XHRcdH1cblx0XHRgLFxuXG5cdFx0YmxlbmRpbmc6IE5vQmxlbmRpbmcsXG5cdFx0ZGVwdGhUZXN0OiBmYWxzZSxcblx0XHRkZXB0aFdyaXRlOiBmYWxzZVxuXG5cdH0gKTtcblxuXHRyZXR1cm4gc2hhZGVyTWF0ZXJpYWw7XG5cbn1cblxuZnVuY3Rpb24gX2dldEN1YmVtYXBTaGFkZXIoKSB7XG5cblx0Y29uc3Qgc2hhZGVyTWF0ZXJpYWwgPSBuZXcgUmF3U2hhZGVyTWF0ZXJpYWwoIHtcblxuXHRcdG5hbWU6ICdDdWJlbWFwVG9DdWJlVVYnLFxuXG5cdFx0dW5pZm9ybXM6IHtcblx0XHRcdCdlbnZNYXAnOiB7IHZhbHVlOiBudWxsIH0sXG5cdFx0XHQnaW5wdXRFbmNvZGluZyc6IHsgdmFsdWU6IEVOQ09ESU5HU1sgTGluZWFyRW5jb2RpbmcgXSB9LFxuXHRcdFx0J291dHB1dEVuY29kaW5nJzogeyB2YWx1ZTogRU5DT0RJTkdTWyBMaW5lYXJFbmNvZGluZyBdIH1cblx0XHR9LFxuXG5cdFx0dmVydGV4U2hhZGVyOiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCksXG5cblx0XHRmcmFnbWVudFNoYWRlcjogLyogZ2xzbCAqL2BcblxuXHRcdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0XHRwcmVjaXNpb24gbWVkaXVtcCBpbnQ7XG5cblx0XHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0XHR1bmlmb3JtIHNhbXBsZXJDdWJlIGVudk1hcDtcblxuXHRcdFx0JHsgX2dldEVuY29kaW5ncygpIH1cblxuXHRcdFx0dm9pZCBtYWluKCkge1xuXG5cdFx0XHRcdGdsX0ZyYWdDb2xvciA9IHZlYzQoIDAuMCwgMC4wLCAwLjAsIDEuMCApO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IucmdiID0gZW52TWFwVGV4ZWxUb0xpbmVhciggdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggLSB2T3V0cHV0RGlyZWN0aW9uLngsIHZPdXRwdXREaXJlY3Rpb24ueXogKSApICkucmdiO1xuXHRcdFx0XHRnbF9GcmFnQ29sb3IgPSBsaW5lYXJUb091dHB1dFRleGVsKCBnbF9GcmFnQ29sb3IgKTtcblxuXHRcdFx0fVxuXHRcdGAsXG5cblx0XHRibGVuZGluZzogTm9CbGVuZGluZyxcblx0XHRkZXB0aFRlc3Q6IGZhbHNlLFxuXHRcdGRlcHRoV3JpdGU6IGZhbHNlXG5cblx0fSApO1xuXG5cdHJldHVybiBzaGFkZXJNYXRlcmlhbDtcblxufVxuXG5mdW5jdGlvbiBfZ2V0Q29tbW9uVmVydGV4U2hhZGVyKCkge1xuXG5cdHJldHVybiAvKiBnbHNsICovYFxuXG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG5cdFx0cHJlY2lzaW9uIG1lZGl1bXAgaW50O1xuXG5cdFx0YXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cdFx0YXR0cmlidXRlIHZlYzIgdXY7XG5cdFx0YXR0cmlidXRlIGZsb2F0IGZhY2VJbmRleDtcblxuXHRcdHZhcnlpbmcgdmVjMyB2T3V0cHV0RGlyZWN0aW9uO1xuXG5cdFx0Ly8gUkggY29vcmRpbmF0ZSBzeXN0ZW07IFBNUkVNIGZhY2UtaW5kZXhpbmcgY29udmVudGlvblxuXHRcdHZlYzMgZ2V0RGlyZWN0aW9uKCB2ZWMyIHV2LCBmbG9hdCBmYWNlICkge1xuXG5cdFx0XHR1diA9IDIuMCAqIHV2IC0gMS4wO1xuXG5cdFx0XHR2ZWMzIGRpcmVjdGlvbiA9IHZlYzMoIHV2LCAxLjAgKTtcblxuXHRcdFx0aWYgKCBmYWNlID09IDAuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24uenl4OyAvLyAoIDEsIHYsIHUgKSBwb3MgeFxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDEuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24gPSBkaXJlY3Rpb24ueHp5O1xuXHRcdFx0XHRkaXJlY3Rpb24ueHogKj0gLTEuMDsgLy8gKCAtdSwgMSwgLXYgKSBwb3MgeVxuXG5cdFx0XHR9IGVsc2UgaWYgKCBmYWNlID09IDIuMCApIHtcblxuXHRcdFx0XHRkaXJlY3Rpb24ueCAqPSAtMS4wOyAvLyAoIC11LCB2LCAxICkgcG9zIHpcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSAzLjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnp5eDtcblx0XHRcdFx0ZGlyZWN0aW9uLnh6ICo9IC0xLjA7IC8vICggLTEsIHYsIC11ICkgbmVnIHhcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA0LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uID0gZGlyZWN0aW9uLnh6eTtcblx0XHRcdFx0ZGlyZWN0aW9uLnh5ICo9IC0xLjA7IC8vICggLXUsIC0xLCB2ICkgbmVnIHlcblxuXHRcdFx0fSBlbHNlIGlmICggZmFjZSA9PSA1LjAgKSB7XG5cblx0XHRcdFx0ZGlyZWN0aW9uLnogKj0gLTEuMDsgLy8gKCB1LCB2LCAtMSApIG5lZyB6XG5cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRpcmVjdGlvbjtcblxuXHRcdH1cblxuXHRcdHZvaWQgbWFpbigpIHtcblxuXHRcdFx0dk91dHB1dERpcmVjdGlvbiA9IGdldERpcmVjdGlvbiggdXYsIGZhY2VJbmRleCApO1xuXHRcdFx0Z2xfUG9zaXRpb24gPSB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG5cblx0XHR9XG5cdGA7XG5cbn1cblxuZnVuY3Rpb24gX2dldEVuY29kaW5ncygpIHtcblxuXHRyZXR1cm4gLyogZ2xzbCAqL2BcblxuXHRcdHVuaWZvcm0gaW50IGlucHV0RW5jb2Rpbmc7XG5cdFx0dW5pZm9ybSBpbnQgb3V0cHV0RW5jb2Rpbmc7XG5cblx0XHQjaW5jbHVkZSA8ZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ+XG5cblx0XHR2ZWM0IGlucHV0VGV4ZWxUb0xpbmVhciggdmVjNCB2YWx1ZSApIHtcblxuXHRcdFx0aWYgKCBpbnB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDEgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHNSR0JUb0xpbmVhciggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggaW5wdXRFbmNvZGluZyA9PSAyICkge1xuXG5cdFx0XHRcdHJldHVybiBSR0JFVG9MaW5lYXIoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIGlucHV0RW5jb2RpbmcgPT0gNCApIHtcblxuXHRcdFx0XHRyZXR1cm4gUkdCTVRvTGluZWFyKCB2YWx1ZSwgMTYuMCApO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBpbnB1dEVuY29kaW5nID09IDUgKSB7XG5cblx0XHRcdFx0cmV0dXJuIFJHQkRUb0xpbmVhciggdmFsdWUsIDI1Ni4wICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0cmV0dXJuIEdhbW1hVG9MaW5lYXIoIHZhbHVlLCAyLjIgKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0dmVjNCBsaW5lYXJUb091dHB1dFRleGVsKCB2ZWM0IHZhbHVlICkge1xuXG5cdFx0XHRpZiAoIG91dHB1dEVuY29kaW5nID09IDAgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCBvdXRwdXRFbmNvZGluZyA9PSAxICkge1xuXG5cdFx0XHRcdHJldHVybiBMaW5lYXJUb3NSR0IoIHZhbHVlICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDIgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCRSggdmFsdWUgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gMyApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JNKCB2YWx1ZSwgNy4wICk7XG5cblx0XHRcdH0gZWxzZSBpZiAoIG91dHB1dEVuY29kaW5nID09IDQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIExpbmVhclRvUkdCTSggdmFsdWUsIDE2LjAgKTtcblxuXHRcdFx0fSBlbHNlIGlmICggb3V0cHV0RW5jb2RpbmcgPT0gNSApIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9SR0JEKCB2YWx1ZSwgMjU2LjAgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRyZXR1cm4gTGluZWFyVG9HYW1tYSggdmFsdWUsIDIuMiApO1xuXG5cdFx0XHR9XG5cblx0XHR9XG5cblx0XHR2ZWM0IGVudk1hcFRleGVsVG9MaW5lYXIoIHZlYzQgY29sb3IgKSB7XG5cblx0XHRcdHJldHVybiBpbnB1dFRleGVsVG9MaW5lYXIoIGNvbG9yICk7XG5cblx0XHR9XG5cdGA7XG5cbn1cblxuY29uc3QgTGluZVN0cmlwID0gMDtcbmNvbnN0IExpbmVQaWVjZXMgPSAxO1xuY29uc3QgTm9Db2xvcnMgPSAwO1xuY29uc3QgRmFjZUNvbG9ycyA9IDE7XG5jb25zdCBWZXJ0ZXhDb2xvcnMgPSAyO1xuXG5mdW5jdGlvbiBNZXNoRmFjZU1hdGVyaWFsKCBtYXRlcmlhbHMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBtYXRlcmlhbHM7XG5cbn1cblxuZnVuY3Rpb24gTXVsdGlNYXRlcmlhbCggbWF0ZXJpYWxzID0gW10gKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7XG5cdG1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlO1xuXHRtYXRlcmlhbHMubWF0ZXJpYWxzID0gbWF0ZXJpYWxzO1xuXHRtYXRlcmlhbHMuY2xvbmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxzLnNsaWNlKCk7XG5cblx0fTtcblxuXHRyZXR1cm4gbWF0ZXJpYWxzO1xuXG59XG5cbmZ1bmN0aW9uIFBvaW50Q2xvdWQoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKCBtYXRlcmlhbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4nICk7XG5cdHJldHVybiBuZXcgU3ByaXRlKCBtYXRlcmlhbCApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW0gaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApO1xuXHRyZXR1cm4gbmV3IFBvaW50cyggZ2VvbWV0cnksIG1hdGVyaWFsICk7XG5cbn1cblxuZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTtcblx0cmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApO1xuXG59XG5cbmZ1bmN0aW9uIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5QYXJ0aWNsZUJhc2ljTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBQYXJ0aWNsZVN5c3RlbU1hdGVyaWFsKCBwYXJhbWV0ZXJzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7XG5cdHJldHVybiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKTtcblxufVxuXG5mdW5jdGlvbiBWZXJ0ZXgoIHgsIHksIHogKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVydGV4IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5WZWN0b3IzIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFZlY3RvcjMoIHgsIHksIHogKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBEeW5hbWljQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRHluYW1pY0J1ZmZlckF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSgpLnNldFVzYWdlKCBUSFJFRS5EeW5hbWljRHJhd1VzYWdlICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKS5zZXRVc2FnZSggRHluYW1pY0RyYXdVc2FnZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDhBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVWludDhBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50OENsYW1wZWRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50OENsYW1wZWRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDE2QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEludDMyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBVaW50MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbmZ1bmN0aW9uIEZsb2F0NjRBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GbG9hdDY0QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApO1xuXG59XG5cbi8vXG5cbkN1cnZlLmNyZWF0ZSA9IGZ1bmN0aW9uICggY29uc3RydWN0LCBnZXRQb2ludCApIHtcblxuXHRjb25zb2xlLmxvZyggJ1RIUkVFLkN1cnZlLmNyZWF0ZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQnICk7XG5cblx0Y29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApO1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0O1xuXHRjb25zdHJ1Y3QucHJvdG90eXBlLmdldFBvaW50ID0gZ2V0UG9pbnQ7XG5cblx0cmV0dXJuIGNvbnN0cnVjdDtcblxufTtcblxuLy9cblxuUGF0aC5wcm90b3R5cGUuZnJvbVBvaW50cyA9IGZ1bmN0aW9uICggcG9pbnRzICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBhdGg6IC5mcm9tUG9pbnRzKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbVBvaW50cygpLicgKTtcblx0cmV0dXJuIHRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7XG5cbn07XG5cbi8vXG5cbmZ1bmN0aW9uIEF4aXNIZWxwZXIoIHNpemUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuJyApO1xuXHRyZXR1cm4gbmV3IEF4ZXNIZWxwZXIoIHNpemUgKTtcblxufVxuXG5mdW5jdGlvbiBCb3VuZGluZ0JveEhlbHBlciggb2JqZWN0LCBjb2xvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKTtcblxufVxuXG5mdW5jdGlvbiBFZGdlc0hlbHBlciggb2JqZWN0LCBoZXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgTGluZVNlZ21lbnRzKCBuZXcgRWRnZXNHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTtcblxufVxuXG5HcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkdyaWRIZWxwZXI6IHNldENvbG9ycygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHBhc3MgdGhlbSBpbiB0aGUgY29uc3RydWN0b3IgaW5zdGVhZC4nICk7XG5cbn07XG5cblNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTtcblxufTtcblxuZnVuY3Rpb24gV2lyZWZyYW1lSGVscGVyKCBvYmplY3QsIGhleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IExpbmVTZWdtZW50cyggbmV3IFdpcmVmcmFtZUdlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApO1xuXG59XG5cbi8vXG5cbkxvYWRlci5wcm90b3R5cGUuZXh0cmFjdFVybEJhc2UgPSBmdW5jdGlvbiAoIHVybCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Mb2FkZXI6IC5leHRyYWN0VXJsQmFzZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5Mb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gTG9hZGVyVXRpbHMuZXh0cmFjdFVybEJhc2UoIHVybCApO1xuXG59O1xuXG5Mb2FkZXIuSGFuZGxlcnMgPSB7XG5cblx0YWRkOiBmdW5jdGlvbiAoIC8qIHJlZ2V4LCBsb2FkZXIgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5hZGQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuYWRkSGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH0sXG5cblx0Z2V0OiBmdW5jdGlvbiAoIC8qIGZpbGUgKi8gKSB7XG5cblx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTG9hZGVyOiBIYW5kbGVycy5nZXQoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgTG9hZGluZ01hbmFnZXIuZ2V0SGFuZGxlcigpIGluc3RlYWQuJyApO1xuXG5cdH1cblxufTtcblxuZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlhIUkxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkZpbGVMb2FkZXIuJyApO1xuXHRyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG5mdW5jdGlvbiBCaW5hcnlUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4nICk7XG5cdHJldHVybiBuZXcgRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKTtcblxufVxuXG4vL1xuXG5Cb3gyLnByb3RvdHlwZS5jZW50ZXIgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuQm94Mi5wcm90b3R5cGUuZW1wdHkgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaXNFbXB0eSgpO1xuXG59O1xuXG5Cb3gyLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveCA9IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7XG5cdHJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApO1xuXG59O1xuXG5Cb3gyLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7XG5cbn07XG5cbi8vXG5cbkJveDMucHJvdG90eXBlLmNlbnRlciA9IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG5Cb3gzLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pc0VtcHR5KCk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uQm94ID0gZnVuY3Rpb24gKCBib3ggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlID0gZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7XG5cbn07XG5cbkJveDMucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTtcblxufTtcblxuLy9cblxuU3BoZXJlLnByb3RvdHlwZS5lbXB0eSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TcGhlcmU6IC5lbXB0eSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmlzRW1wdHkoKS4nICk7XG5cdHJldHVybiB0aGlzLmlzRW1wdHkoKTtcblxufTtcblxuLy9cblxuRnJ1c3R1bS5wcm90b3R5cGUuc2V0RnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggbSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5GcnVzdHVtOiAuc2V0RnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qcm9qZWN0aW9uTWF0cml4KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zZXRGcm9tUHJvamVjdGlvbk1hdHJpeCggbSApO1xuXG59O1xuXG4vL1xuXG5MaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5MaW5lMzogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApO1xuXG59O1xuXG4vL1xuXG5NYXRoVXRpbHMucmFuZG9tMTYgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBNYXRoLnJhbmRvbSgpO1xuXG59O1xuXG5NYXRoVXRpbHMubmVhcmVzdFBvd2VyT2ZUd28gPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5uZWFyZXN0UG93ZXJPZlR3bygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZsb29yUG93ZXJPZlR3bygpLicgKTtcblx0cmV0dXJuIE1hdGhVdGlscy5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7XG5cbn07XG5cbk1hdGhVdGlscy5uZXh0UG93ZXJPZlR3byA9IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4nICk7XG5cdHJldHVybiBNYXRoVXRpbHMuY2VpbFBvd2VyT2ZUd28oIHZhbHVlICk7XG5cbn07XG5cbi8vXG5cbk1hdHJpeDMucHJvdG90eXBlLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0ID0gZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5mbGF0dGVuVG9BcnJheU9mZnNldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudG9BcnJheSgpIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy50b0FycmF5KCBhcnJheSwgb2Zmc2V0ICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXgzKCB0aGlzICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXgzOiAubXVsdGlwbHlWZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4My5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDMoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gYXR0cmlidXRlLmFwcGx5TWF0cml4MyggdGhpcyApO1xuXG59O1xuXG5NYXRyaXgzLnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbk1hdHJpeDMucHJvdG90eXBlLmdldEludmVyc2UgPSBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXhJbnYuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7IGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy5jb3B5KCBtYXRyaXggKS5pbnZlcnQoKTtcblxufTtcblxuLy9cblxuTWF0cml4NC5wcm90b3R5cGUuZXh0cmFjdFBvc2l0aW9uID0gZnVuY3Rpb24gKCBtICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7XG5cdHJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5mbGF0dGVuVG9BcnJheU9mZnNldCA9IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24gPSBmdW5jdGlvbiAoIHEgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTtcblx0cmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlUb0FycmF5ID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3I0ID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzQXJyYXkgPSBmdW5jdGlvbiAoIC8qIGEgKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVBeGlzID0gZnVuY3Rpb24gKCB2ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTtcblx0di50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUuY3Jvc3NWZWN0b3IgPSBmdW5jdGlvbiAoIHZlY3RvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVYID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVZID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVaID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5yb3RhdGVCeUF4aXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuTWF0cml4NC5wcm90b3R5cGUuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGF0dHJpYnV0ZS5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gYXR0cmlidXRlLmFwcGx5TWF0cml4NCggdGhpcyApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5hcHBseVRvVmVjdG9yM0FycmF5ID0gZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbk1hdHJpeDQucHJvdG90eXBlLm1ha2VGcnVzdHVtID0gZnVuY3Rpb24gKCBsZWZ0LCByaWdodCwgYm90dG9tLCB0b3AsIG5lYXIsIGZhciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApO1xuXG59O1xuXG5NYXRyaXg0LnByb3RvdHlwZS5nZXRJbnZlcnNlID0gZnVuY3Rpb24gKCBtYXRyaXggKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4SW52LmNvcHkoIG1hdHJpeCApLmludmVydCgpOyBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMuY29weSggbWF0cml4ICkuaW52ZXJ0KCk7XG5cbn07XG5cbi8vXG5cblBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTtcblxufTtcblxuLy9cblxuUXVhdGVybmlvbi5wcm90b3R5cGUubXVsdGlwbHlWZWN0b3IzID0gZnVuY3Rpb24gKCB2ZWN0b3IgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUXVhdGVybmlvbjogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBpcyBub3cgdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggcXVhdGVybmlvbiApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdmVjdG9yLmFwcGx5UXVhdGVybmlvbiggdGhpcyApO1xuXG59O1xuXG5RdWF0ZXJuaW9uLnByb3RvdHlwZS5pbnZlcnNlID0gZnVuY3Rpb24gKCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAuaW52ZXJzZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gaW52ZXJ0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnZlcnQoKTtcblxufTtcblxuLy9cblxuUmF5LnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkJveCA9IGZ1bmN0aW9uICggYm94ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7XG5cbn07XG5cblJheS5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25QbGFuZSA9IGZ1bmN0aW9uICggcGxhbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApO1xuXG59O1xuXG5SYXkucHJvdG90eXBlLmlzSW50ZXJzZWN0aW9uU3BoZXJlID0gZnVuY3Rpb24gKCBzcGhlcmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25TcGhlcmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzU3BoZXJlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKCBzcGhlcmUgKTtcblxufTtcblxuLy9cblxuVHJpYW5nbGUucHJvdG90eXBlLmFyZWEgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0QXJlYSgpO1xuXG59O1xuXG5UcmlhbmdsZS5wcm90b3R5cGUuYmFyeWNvb3JkRnJvbVBvaW50ID0gZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKTtcblxufTtcblxuVHJpYW5nbGUucHJvdG90eXBlLm1pZHBvaW50ID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5taWRwb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE1pZHBvaW50KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRNaWRwb2ludCggdGFyZ2V0ICk7XG5cbn07XG5cblRyaWFuZ2xlLnByb3RvdHlwZW5vcm1hbCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXROb3JtYWwoIHRhcmdldCApO1xuXG59O1xuXG5UcmlhbmdsZS5wcm90b3R5cGUucGxhbmUgPSBmdW5jdGlvbiAoIHRhcmdldCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLnBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0UGxhbmUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldFBsYW5lKCB0YXJnZXQgKTtcblxufTtcblxuVHJpYW5nbGUuYmFyeWNvb3JkRnJvbVBvaW50ID0gZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApO1xuXHRyZXR1cm4gVHJpYW5nbGUuZ2V0QmFyeWNvb3JkKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICk7XG5cbn07XG5cblRyaWFuZ2xlLm5vcm1hbCA9IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAubm9ybWFsKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Tm9ybWFsKCkuJyApO1xuXHRyZXR1cm4gVHJpYW5nbGUuZ2V0Tm9ybWFsKCBhLCBiLCBjLCB0YXJnZXQgKTtcblxufTtcblxuLy9cblxuU2hhcGUucHJvdG90eXBlLmV4dHJhY3RBbGxQb2ludHMgPSBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLmV4dHJhY3RBbGxQb2ludHMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmV4dHJhY3RQb2ludHMoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyggZGl2aXNpb25zICk7XG5cbn07XG5cblNoYXBlLnByb3RvdHlwZS5leHRydWRlID0gZnVuY3Rpb24gKCBvcHRpb25zICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTtcblxufTtcblxuU2hhcGUucHJvdG90eXBlLm1ha2VHZW9tZXRyeSA9IGZ1bmN0aW9uICggb3B0aW9ucyApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5TaGFwZTogLm1ha2VHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBTaGFwZUdlb21ldHJ5KCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiBuZXcgU2hhcGVHZW9tZXRyeSggdGhpcywgb3B0aW9ucyApO1xuXG59O1xuXG4vL1xuXG5WZWN0b3IyLnByb3RvdHlwZS5mcm9tQXR0cmlidXRlID0gZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTtcblxufTtcblxuVmVjdG9yMi5wcm90b3R5cGUuZGlzdGFuY2VUb01hbmhhdHRhbiA9IGZ1bmN0aW9uICggdiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7XG5cdHJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTtcblxufTtcblxuVmVjdG9yMi5wcm90b3R5cGUubGVuZ3RoTWFuaGF0dGFuID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7XG5cdHJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpO1xuXG59O1xuXG4vL1xuXG5WZWN0b3IzLnByb3RvdHlwZS5zZXRFdWxlckZyb21Sb3RhdGlvbk1hdHJpeCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuJyApO1xuXG59O1xuXG5WZWN0b3IzLnByb3RvdHlwZS5zZXRFdWxlckZyb21RdWF0ZXJuaW9uID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuJyApO1xuXG59O1xuXG5WZWN0b3IzLnByb3RvdHlwZS5nZXRQb3NpdGlvbkZyb21NYXRyaXggPSBmdW5jdGlvbiAoIG0gKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmdldFBvc2l0aW9uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhQb3NpdGlvbigpLicgKTtcblx0cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBtICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmdldFNjYWxlRnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggbSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4U2NhbGUoIG0gKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuZ2V0Q29sdW1uRnJvbU1hdHJpeCA9IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4nICk7XG5cdHJldHVybiB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG1hdHJpeCwgaW5kZXggKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuYXBwbHlQcm9qZWN0aW9uID0gZnVuY3Rpb24gKCBtICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuJyApO1xuXHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG0gKTtcblxufTtcblxuVmVjdG9yMy5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmRpc3RhbmNlVG9NYW5oYXR0YW4gPSBmdW5jdGlvbiAoIHYgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5EaXN0YW5jZVRvKCB2ICk7XG5cbn07XG5cblZlY3RvcjMucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxufTtcblxuLy9cblxuVmVjdG9yNC5wcm90b3R5cGUuZnJvbUF0dHJpYnV0ZSA9IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICk7XG5cbn07XG5cblZlY3RvcjQucHJvdG90eXBlLmxlbmd0aE1hbmhhdHRhbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3I0OiAubGVuZ3RoTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuTGVuZ3RoKCkuJyApO1xuXHRyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKTtcblxufTtcblxuLy9cblxuT2JqZWN0M0QucHJvdG90eXBlLmdldENoaWxkQnlOYW1lID0gZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7XG5cdHJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApO1xuXG59O1xuXG5PYmplY3QzRC5wcm90b3R5cGUucmVuZGVyRGVwdGggPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5yZW5kZXJEZXB0aCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnJlbmRlck9yZGVyLCBpbnN0ZWFkLicgKTtcblxufTtcblxuT2JqZWN0M0QucHJvdG90eXBlLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uICggZGlzdGFuY2UsIGF4aXMgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC50cmFuc2xhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKSBpbnN0ZWFkLicgKTtcblx0cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApO1xuXG59O1xuXG5PYmplY3QzRC5wcm90b3R5cGUuZ2V0V29ybGRSb3RhdGlvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4nICk7XG5cbn07XG5cbk9iamVjdDNELnByb3RvdHlwZS5hcHBseU1hdHJpeCA9IGZ1bmN0aW9uICggbWF0cml4ICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuYXBwbHlNYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5hcHBseU1hdHJpeDQoKS4nICk7XG5cdHJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbWF0cml4ICk7XG5cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBPYmplY3QzRC5wcm90b3R5cGUsIHtcblxuXHRldWxlck9yZGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTtcblx0XHRcdHRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dXNlUXVhdGVybmlvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4nICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5NZXNoLnByb3RvdHlwZS5zZXREcmF3TW9kZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaDogLnNldERyYXdNb2RlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4gVHJhbnNmb3JtIHlvdXIgZ2VvbWV0cnkgdmlhIEJ1ZmZlckdlb21ldHJ5VXRpbHMudG9UcmlhbmdsZXNEcmF3TW9kZSgpIGlmIG5lY2Vzc2FyeS4nICk7XG5cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoLnByb3RvdHlwZSwge1xuXG5cdGRyYXdNb2RlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5NZXNoOiAuZHJhd01vZGUgaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIHJlbmRlcmVyIG5vdyBhbHdheXMgYXNzdW1lcyBUSFJFRS5UcmlhbmdsZXNEcmF3TW9kZS4nICk7XG5cdFx0XHRyZXR1cm4gVHJpYW5nbGVzRHJhd01vZGU7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaDogLmRyYXdNb2RlIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSByZW5kZXJlciBub3cgYWx3YXlzIGFzc3VtZXMgVEhSRUUuVHJpYW5nbGVzRHJhd01vZGUuIFRyYW5zZm9ybSB5b3VyIGdlb21ldHJ5IHZpYSBCdWZmZXJHZW9tZXRyeVV0aWxzLnRvVHJpYW5nbGVzRHJhd01vZGUoKSBpZiBuZWNlc3NhcnkuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuU2tpbm5lZE1lc2gucHJvdG90eXBlLmluaXRCb25lcyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1cnZlLnByb3RvdHlwZSwgJ19fYXJjTGVuZ3RoRGl2aXNpb25zJywge1xuXG5cdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4nICk7XG5cdFx0cmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO1xuXG5cdH0sXG5cdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApO1xuXHRcdHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gdmFsdWU7XG5cblx0fVxuXG59ICk7XG5cbi8vXG5cblBlcnNwZWN0aXZlQ2FtZXJhLnByb3RvdHlwZS5zZXRMZW5zID0gZnVuY3Rpb24gKCBmb2NhbExlbmd0aCwgZmlsbUdhdWdlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gJyArXG5cdFx0XHQnVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuJyApO1xuXG5cdGlmICggZmlsbUdhdWdlICE9PSB1bmRlZmluZWQgKSB0aGlzLmZpbG1HYXVnZSA9IGZpbG1HYXVnZTtcblx0dGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTtcblxufTtcblxuLy9cblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwge1xuXHRvbmx5U2hhZG93OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAub25seVNoYWRvdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhRm92OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTGVmdDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFMZWZ0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5sZWZ0LicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5sZWZ0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVJpZ2h0OiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhVG9wOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhQm90dG9tOiB7XG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5ib3R0b20gPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93Q2FtZXJhTmVhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFOZWFyIGlzIG5vdyAuc2hhZG93LmNhbWVyYS5uZWFyLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmNhbWVyYS5uZWFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYUZhcjoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0NhbWVyYVZpc2libGU6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd0JpYXM6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93QmlhcyBpcyBub3cgLnNoYWRvdy5iaWFzLicgKTtcblx0XHRcdHRoaXMuc2hhZG93LmJpYXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93RGFya25lc3M6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwV2lkdGg6IHtcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93TWFwV2lkdGggaXMgbm93IC5zaGFkb3cubWFwU2l6ZS53aWR0aC4nICk7XG5cdFx0XHR0aGlzLnNoYWRvdy5tYXBTaXplLndpZHRoID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHNoYWRvd01hcEhlaWdodDoge1xuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuJyApO1xuXHRcdFx0dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxufSApO1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwge1xuXG5cdGxlbmd0aDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDtcblxuXHRcdH1cblx0fSxcblx0ZHluYW1pYzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy51c2FnZSA9PT0gRHluYW1pY0RyYXdVc2FnZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5keW5hbWljIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnNldFVzYWdlKCBEeW5hbWljRHJhd1VzYWdlICk7XG5cblx0XHR9XG5cdH1cblxufSApO1xuXG5CdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLnNldER5bmFtaWMgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogLnNldER5bmFtaWMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFVzYWdlKCkgaW5zdGVhZC4nICk7XG5cdHRoaXMuc2V0VXNhZ2UoIHZhbHVlID09PSB0cnVlID8gRHluYW1pY0RyYXdVc2FnZSA6IFN0YXRpY0RyYXdVc2FnZSApO1xuXHRyZXR1cm4gdGhpcztcblxufTtcblxuQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5SW5kaWNlc0FycmF5ID0gZnVuY3Rpb24gKCAvKiBpbmRpY2VzICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5jb3B5SW5kaWNlc0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn0sXG5cbkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuc2V0QXJyYXkgPSBmdW5jdGlvbiAoIC8qIGFycmF5ICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5zZXRBcnJheSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgQnVmZmVyR2VvbWV0cnkgLnNldEF0dHJpYnV0ZSB0byByZXBsYWNlL3Jlc2l6ZSBhdHRyaWJ1dGUgYnVmZmVycycgKTtcblxufTtcblxuLy9cblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZEluZGV4ID0gZnVuY3Rpb24gKCBpbmRleCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEluZGV4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0SW5kZXgoKS4nICk7XG5cdHRoaXMuc2V0SW5kZXgoIGluZGV4ICk7XG5cbn07XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5hZGRBdHRyaWJ1dGUgPSBmdW5jdGlvbiAoIG5hbWUsIGF0dHJpYnV0ZSApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEF0dHJpYnV0ZSgpLicgKTtcblxuXHRpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRBdHRyaWJ1dGUoKSBub3cgZXhwZWN0cyAoIG5hbWUsIGF0dHJpYnV0ZSApLicgKTtcblxuXHRcdHJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSggbmFtZSwgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggYXJndW1lbnRzWyAxIF0sIGFyZ3VtZW50c1sgMiBdICkgKTtcblxuXHR9XG5cblx0aWYgKCBuYW1lID09PSAnaW5kZXgnICkge1xuXG5cdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnkuYWRkQXR0cmlidXRlOiBVc2UgLnNldEluZGV4KCkgZm9yIGluZGV4IGF0dHJpYnV0ZS4nICk7XG5cdFx0dGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9XG5cblx0cmV0dXJuIHRoaXMuc2V0QXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUgKTtcblxufTtcblxuQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmFkZERyYXdDYWxsID0gZnVuY3Rpb24gKCBzdGFydCwgY291bnQsIGluZGV4T2Zmc2V0ICkge1xuXG5cdGlmICggaW5kZXhPZmZzZXQgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBubyBsb25nZXIgc3VwcG9ydHMgaW5kZXhPZmZzZXQuJyApO1xuXG5cdH1cblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLicgKTtcblx0dGhpcy5hZGRHcm91cCggc3RhcnQsIGNvdW50ICk7XG5cbn07XG5cbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jbGVhckRyYXdDYWxscyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmNsZWFyRHJhd0NhbGxzKCkgaXMgbm93IC5jbGVhckdyb3VwcygpLicgKTtcblx0dGhpcy5jbGVhckdyb3VwcygpO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29tcHV0ZU9mZnNldHMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlT2Zmc2V0cygpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlID0gZnVuY3Rpb24gKCBuYW1lICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAucmVtb3ZlQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZGVsZXRlQXR0cmlidXRlKCkuJyApO1xuXG5cdHJldHVybiB0aGlzLmRlbGV0ZUF0dHJpYnV0ZSggbmFtZSApO1xuXG59O1xuXG5CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuYXBwbHlNYXRyaXggPSBmdW5jdGlvbiAoIG1hdHJpeCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFwcGx5TWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuYXBwbHlNYXRyaXg0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQoIG1hdHJpeCApO1xuXG59O1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7XG5cblx0ZHJhd2NhbGxzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9LFxuXHRvZmZzZXRzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAub2Zmc2V0cyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZ3JvdXBzO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSwge1xuXG5cdG1heEluc3RhbmNlZENvdW50OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiAubWF4SW5zdGFuY2VkQ291bnQgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW5zdGFuY2VDb3VudC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5pbnN0YW5jZUNvdW50O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5OiAubWF4SW5zdGFuY2VkQ291bnQgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW5zdGFuY2VDb3VudC4nICk7XG5cdFx0XHR0aGlzLmluc3RhbmNlQ291bnQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7XG5cblx0bGluZVByZWNpc2lvbjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5SYXljYXN0ZXI6IC5saW5lUHJlY2lzaW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAucGFyYW1zLkxpbmUudGhyZXNob2xkIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyYW1zLkxpbmUudGhyZXNob2xkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3RlcjogLmxpbmVQcmVjaXNpb24gaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5wYXJhbXMuTGluZS50aHJlc2hvbGQgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnBhcmFtcy5MaW5lLnRocmVzaG9sZCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwge1xuXG5cdGR5bmFtaWM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuSW50ZXJsZWF2ZWRCdWZmZXI6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC51c2FnZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB0aGlzLnVzYWdlID09PSBEeW5hbWljRHJhd1VzYWdlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAudXNhZ2UgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnNldFVzYWdlKCB2YWx1ZSApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLnNldER5bmFtaWMgPSBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkludGVybGVhdmVkQnVmZmVyOiAuc2V0RHluYW1pYygpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0VXNhZ2UoKSBpbnN0ZWFkLicgKTtcblx0dGhpcy5zZXRVc2FnZSggdmFsdWUgPT09IHRydWUgPyBEeW5hbWljRHJhd1VzYWdlIDogU3RhdGljRHJhd1VzYWdlICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG5JbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUuc2V0QXJyYXkgPSBmdW5jdGlvbiAoIC8qIGFycmF5ICovICkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbnRlcmxlYXZlZEJ1ZmZlcjogLnNldEFycmF5IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBCdWZmZXJHZW9tZXRyeSAuc2V0QXR0cmlidXRlIHRvIHJlcGxhY2UvcmVzaXplIGF0dHJpYnV0ZSBidWZmZXJzJyApO1xuXG59O1xuXG4vL1xuXG5FeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLmdldEFycmF5cyA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbkV4dHJ1ZGVHZW9tZXRyeS5wcm90b3R5cGUuYWRkU2hhcGVMaXN0ID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5FeHRydWRlR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5hZGRTaGFwZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUdlb21ldHJ5OiAuYWRkU2hhcGUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuLy9cblxuU2NlbmUucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lOiAuZGlzcG9zZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG4vL1xuXG5Vbmlmb3JtLnByb3RvdHlwZS5vblVwZGF0ZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7XG5cdHJldHVybiB0aGlzO1xuXG59O1xuXG4vL1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7XG5cblx0d3JhcEFyb3VuZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBBcm91bmQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cblx0b3ZlcmRyYXc6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC5vdmVyZHJhdyBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cblx0d3JhcFJHQjoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLndyYXBSR0IgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cdFx0XHRyZXR1cm4gbmV3IENvbG9yKCk7XG5cblx0XHR9XG5cdH0sXG5cblx0c2hhZGluZzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTtcblxuXHRcdH1cblx0fSxcblxuXHRzdGVuY2lsTWFzazoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnN0ZW5jaWxNYXNrIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc3RlbmNpbEZ1bmNNYXNrIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuc3RlbmNpbEZ1bmNNYXNrO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLicgKyB0aGlzLnR5cGUgKyAnOiAuc3RlbmNpbE1hc2sgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zdGVuY2lsRnVuY01hc2sgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLnN0ZW5jaWxGdW5jTWFzayA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE1lc2hQaHlzaWNhbE1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdHRyYW5zcGFyZW5jeToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGh5c2ljYWxNYXRlcmlhbDogLnRyYW5zcGFyZW5jeSBoYXMgYmVlbiByZW5hbWVkIHRvIC50cmFuc21pc3Npb24uJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNtaXNzaW9uO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLk1lc2hQaHlzaWNhbE1hdGVyaWFsOiAudHJhbnNwYXJlbmN5IGhhcyBiZWVuIHJlbmFtZWQgdG8gLnRyYW5zbWlzc2lvbi4nICk7XG5cdFx0XHR0aGlzLnRyYW5zbWlzc2lvbiA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwge1xuXG5cdGRlcml2YXRpdmVzOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLlNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4nICk7XG5cdFx0XHR0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmNsZWFyVGFyZ2V0ID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY2xlYXJUYXJnZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnNldFJlbmRlclRhcmdldCgpIGFuZCAuY2xlYXIoKSBpbnN0ZWFkLicgKTtcblx0dGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApO1xuXHR0aGlzLmNsZWFyKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuYW5pbWF0ZSA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFuaW1hdGUoKSBpcyBub3cgLnNldEFuaW1hdGlvbkxvb3AoKS4nICk7XG5cdHRoaXMuc2V0QW5pbWF0aW9uTG9vcCggY2FsbGJhY2sgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0Q3VycmVudFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFJlbmRlclRhcmdldCgpIGlzIG5vdyAuZ2V0UmVuZGVyVGFyZ2V0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5nZXRSZW5kZXJUYXJnZXQoKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0TWF4QW5pc290cm9weSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4nICk7XG5cdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmdldFByZWNpc2lvbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLicgKTtcblx0cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnByZWNpc2lvbjtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUucmVzZXRHTFN0YXRlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5yZXNldEdMU3RhdGUoKSBpcyBub3cgLnN0YXRlLnJlc2V0KCkuJyApO1xuXHRyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU190ZXh0dXJlX2Zsb2F0XFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnT0VTX3RleHR1cmVfaGFsZl9mbG9hdFxcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c1N0YW5kYXJkRGVyaXZhdGl2ZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlc1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUFZSVEMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVQVlJUQygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFxcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Y1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzQmxlbmRNaW5NYXggPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcXCdFWFRfYmxlbmRfbWlubWF4XFwnICkuJyApO1xuXHRyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4nICk7XG5cdHJldHVybiB0aGlzLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcztcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc3VwcG9ydHNJbnN0YW5jZWRBcnJheXMgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1xcJyApLicgKTtcblx0cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5lbmFibGVTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuJyApO1xuXHR0aGlzLnNldFNjaXNzb3JUZXN0KCBib29sZWFuICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmluaXRNYXRlcmlhbCA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFkZFByZVBsdWdpbiA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFkZFBvc3RQbHVnaW4gPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFkZFBvc3RQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUudXBkYXRlU2hhZG93TWFwID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC51cGRhdGVTaGFkb3dNYXAoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc2V0RmFjZUN1bGxpbmcgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldEZhY2VDdWxsaW5nKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cbn07XG5cbldlYkdMUmVuZGVyZXIucHJvdG90eXBlLmFsbG9jVGV4dHVyZVVuaXQgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmFsbG9jVGV4dHVyZVVuaXQoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuc2V0VGV4dHVyZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zZXRUZXh0dXJlMkQgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUyRCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59O1xuXG5XZWJHTFJlbmRlcmVyLnByb3RvdHlwZS5zZXRUZXh0dXJlQ3ViZSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZUN1YmUoKSBoYXMgYmVlbiByZW1vdmVkLicgKTtcblxufTtcblxuV2ViR0xSZW5kZXJlci5wcm90b3R5cGUuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEFjdGl2ZU1pcE1hcExldmVsKCkgaXMgbm93IC5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTtcblxufTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7XG5cblx0c2hhZG93TWFwRW5hYmxlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAuZW5hYmxlZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLmVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwVHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTtcblx0XHRcdHRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0c2hhZG93TWFwQ3VsbEZhY2U6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGNvbnRleHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCk7XG5cblx0XHR9XG5cdH0sXG5cdHZyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC52ciBoYXMgYmVlbiByZW5hbWVkIHRvIC54cicgKTtcblx0XHRcdHJldHVybiB0aGlzLnhyO1xuXG5cdFx0fVxuXHR9LFxuXHRnYW1tYUlucHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYUlucHV0IGhhcyBiZWVuIHJlbW92ZWQuIFNldCB0aGUgZW5jb2RpbmcgZm9yIHRleHR1cmVzIHZpYSBUZXh0dXJlLmVuY29kaW5nIGluc3RlYWQuJyApO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdhbW1hSW5wdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IHRoZSBlbmNvZGluZyBmb3IgdGV4dHVyZXMgdmlhIFRleHR1cmUuZW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdGdhbW1hT3V0cHV0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5nYW1tYU91dHB1dCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgV2ViR0xSZW5kZXJlci5vdXRwdXRFbmNvZGluZyBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2FtbWFPdXRwdXQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IFdlYkdMUmVuZGVyZXIub3V0cHV0RW5jb2RpbmcgaW5zdGVhZC4nICk7XG5cdFx0XHR0aGlzLm91dHB1dEVuY29kaW5nID0gKCB2YWx1ZSA9PT0gdHJ1ZSApID8gc1JHQkVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7XG5cblx0XHR9XG5cdH0sXG5cdHRvbmVNYXBwaW5nV2hpdGVQb2ludDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAudG9uZU1hcHBpbmdXaGl0ZVBvaW50IGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXHRcdFx0cmV0dXJuIDEuMDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC50b25lTWFwcGluZ1doaXRlUG9pbnQgaGFzIGJlZW4gcmVtb3ZlZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cbn0gKTtcblxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMU2hhZG93TWFwLnByb3RvdHlwZSwge1xuXG5cdGN1bGxGYWNlOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggLyogY3VsbEZhY2UgKi8gKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7XG5cblx0XHR9XG5cdH0sXG5cdHJlbmRlclJldmVyc2VTaWRlZDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblxuXHRcdH1cblx0fSxcblx0cmVuZGVyU2luZ2xlU2lkZWQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApO1xuXG5cdFx0fVxuXHR9XG5cbn0gKTtcblxuZnVuY3Rpb24gV2ViR0xSZW5kZXJUYXJnZXRDdWJlKCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIGlzIG5vdyBXZWJHTEN1YmVSZW5kZXJUYXJnZXQoIHNpemUsIG9wdGlvbnMgKS4nICk7XG5cdHJldHVybiBuZXcgV2ViR0xDdWJlUmVuZGVyVGFyZ2V0KCB3aWR0aCwgb3B0aW9ucyApO1xuXG59XG5cbi8vXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUsIHtcblxuXHR3cmFwUzoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHR3cmFwVDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBUO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS53cmFwVCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRtYWdGaWx0ZXI6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5tYWdGaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1hZ0ZpbHRlci4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcjtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5tYWdGaWx0ZXIgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0bWluRmlsdGVyOiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdGFuaXNvdHJvcHk6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weTtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmFuaXNvdHJvcHkgaXMgbm93IC50ZXh0dXJlLmFuaXNvdHJvcHkuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLmFuaXNvdHJvcHkgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0b2Zmc2V0OiB7XG5cdFx0Z2V0OiBmdW5jdGlvbiAoKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS5vZmZzZXQ7XG5cblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUub2Zmc2V0ID0gdmFsdWU7XG5cblx0XHR9XG5cdH0sXG5cdHJlcGVhdDoge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTtcblx0XHRcdHJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0O1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApO1xuXHRcdFx0dGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRmb3JtYXQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmZvcm1hdDtcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmZvcm1hdCBpcyBub3cgLnRleHR1cmUuZm9ybWF0LicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5mb3JtYXQgPSB2YWx1ZTtcblxuXHRcdH1cblx0fSxcblx0dHlwZToge1xuXHRcdGdldDogZnVuY3Rpb24gKCkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnR5cGUgaXMgbm93IC50ZXh0dXJlLnR5cGUuJyApO1xuXHRcdFx0cmV0dXJuIHRoaXMudGV4dHVyZS50eXBlO1xuXG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7XG5cblx0XHRcdGNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7XG5cdFx0XHR0aGlzLnRleHR1cmUudHlwZSA9IHZhbHVlO1xuXG5cdFx0fVxuXHR9LFxuXHRnZW5lcmF0ZU1pcG1hcHM6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uICgpIHtcblxuXHRcdFx0Y29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7XG5cdFx0XHRyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcztcblxuXHRcdH0sXG5cdFx0c2V0OiBmdW5jdGlvbiAoIHZhbHVlICkge1xuXG5cdFx0XHRjb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTtcblx0XHRcdHRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTtcblxuXHRcdH1cblx0fVxuXG59ICk7XG5cbi8vXG5cbkF1ZGlvLnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24gKCBmaWxlICkge1xuXG5cdGNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7XG5cdGNvbnN0IHNjb3BlID0gdGhpcztcblx0Y29uc3QgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTtcblx0YXVkaW9Mb2FkZXIubG9hZCggZmlsZSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7XG5cblx0XHRzY29wZS5zZXRCdWZmZXIoIGJ1ZmZlciApO1xuXG5cdH0gKTtcblx0cmV0dXJuIHRoaXM7XG5cbn07XG5cblxuQXVkaW9BbmFseXNlci5wcm90b3R5cGUuZ2V0RGF0YSA9IGZ1bmN0aW9uICgpIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5BdWRpb0FuYWx5c2VyOiAuZ2V0RGF0YSgpIGlzIG5vdyAuZ2V0RnJlcXVlbmN5RGF0YSgpLicgKTtcblx0cmV0dXJuIHRoaXMuZ2V0RnJlcXVlbmN5RGF0YSgpO1xuXG59O1xuXG4vL1xuXG5DdWJlQ2FtZXJhLnByb3RvdHlwZS51cGRhdGVDdWJlTWFwID0gZnVuY3Rpb24gKCByZW5kZXJlciwgc2NlbmUgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLnVwZGF0ZUN1YmVNYXAoKSBpcyBub3cgLnVwZGF0ZSgpLicgKTtcblx0cmV0dXJuIHRoaXMudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTtcblxufTtcblxuQ3ViZUNhbWVyYS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7XG5cblx0Y29uc29sZS53YXJuKCAnVEhSRUUuQ3ViZUNhbWVyYTogLmNsZWFyKCkgaXMgbm93IC5yZW5kZXJUYXJnZXQuY2xlYXIoKS4nICk7XG5cdHJldHVybiB0aGlzLnJlbmRlclRhcmdldC5jbGVhciggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApO1xuXG59O1xuXG5JbWFnZVV0aWxzLmNyb3NzT3JpZ2luID0gdW5kZWZpbmVkO1xuXG5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlID0gZnVuY3Rpb24gKCB1cmwsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5UZXh0dXJlTG9hZGVyKCkgaW5zdGVhZC4nICk7XG5cblx0Y29uc3QgbG9hZGVyID0gbmV3IFRleHR1cmVMb2FkZXIoKTtcblx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0Y29uc3QgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmwsIG9uTG9hZCwgdW5kZWZpbmVkLCBvbkVycm9yICk7XG5cblx0aWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZztcblxuXHRyZXR1cm4gdGV4dHVyZTtcblxufTtcblxuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoIHVybHMsIG1hcHBpbmcsIG9uTG9hZCwgb25FcnJvciApIHtcblxuXHRjb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTtcblxuXHRjb25zdCBsb2FkZXIgPSBuZXcgQ3ViZVRleHR1cmVMb2FkZXIoKTtcblx0bG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7XG5cblx0Y29uc3QgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmxzLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApO1xuXG5cdGlmICggbWFwcGluZyApIHRleHR1cmUubWFwcGluZyA9IG1hcHBpbmc7XG5cblx0cmV0dXJuIHRleHR1cmU7XG5cbn07XG5cbkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlID0gZnVuY3Rpb24gKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG5JbWFnZVV0aWxzLmxvYWRDb21wcmVzc2VkVGV4dHVyZUN1YmUgPSBmdW5jdGlvbiAoKSB7XG5cblx0Y29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApO1xuXG59O1xuXG4vL1xuXG5mdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHtcblxuXHRjb25zb2xlLmVycm9yKCAnVEhSRUUuQ2FudmFzUmVuZGVyZXIgaGFzIGJlZW4gcmVtb3ZlZCcgKTtcblxufVxuXG4vL1xuXG5mdW5jdGlvbiBKU09OTG9hZGVyKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5KU09OTG9hZGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApO1xuXG59XG5cbi8vXG5cbmNvbnN0IFNjZW5lVXRpbHMgPSB7XG5cblx0Y3JlYXRlTXVsdGlNYXRlcmlhbE9iamVjdDogZnVuY3Rpb24gKCAvKiBnZW9tZXRyeSwgbWF0ZXJpYWxzICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0ZGV0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBwYXJlbnQsIHNjZW5lICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH0sXG5cblx0YXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkge1xuXG5cdFx0Y29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS91dGlscy9TY2VuZVV0aWxzLmpzJyApO1xuXG5cdH1cblxufTtcblxuLy9cblxuZnVuY3Rpb24gTGVuc0ZsYXJlKCkge1xuXG5cdGNvbnNvbGUuZXJyb3IoICdUSFJFRS5MZW5zRmxhcmUgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzbS9vYmplY3RzL0xlbnNmbGFyZS5qcycgKTtcblxufVxuXG5pZiAoIHR5cGVvZiBfX1RIUkVFX0RFVlRPT0xTX18gIT09ICd1bmRlZmluZWQnICkge1xuXG5cdC8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cdF9fVEhSRUVfREVWVE9PTFNfXy5kaXNwYXRjaEV2ZW50KCBuZXcgQ3VzdG9tRXZlbnQoICdyZWdpc3RlcicsIHsgZGV0YWlsOiB7XG5cdFx0cmV2aXNpb246IFJFVklTSU9OLFxuXHR9IH0gKSApO1xuXHQvKiBlc2xpbnQtZW5hYmxlIG5vLXVuZGVmICovXG5cbn1cblxuaWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyApIHtcblxuXHRpZiAoIHdpbmRvdy5fX1RIUkVFX18gKSB7XG5cblx0XHRjb25zb2xlLndhcm4oICdXQVJOSU5HOiBNdWx0aXBsZSBpbnN0YW5jZXMgb2YgVGhyZWUuanMgYmVpbmcgaW1wb3J0ZWQuJyApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHR3aW5kb3cuX19USFJFRV9fID0gUkVWSVNJT047XG5cblx0fVxuXG59XG5cbmV4cG9ydCB7IEFDRVNGaWxtaWNUb25lTWFwcGluZywgQWRkRXF1YXRpb24sIEFkZE9wZXJhdGlvbiwgQWRkaXRpdmVBbmltYXRpb25CbGVuZE1vZGUsIEFkZGl0aXZlQmxlbmRpbmcsIEFscGhhRm9ybWF0LCBBbHdheXNEZXB0aCwgQWx3YXlzU3RlbmNpbEZ1bmMsIEFtYmllbnRMaWdodCwgQW1iaWVudExpZ2h0UHJvYmUsIEFuaW1hdGlvbkNsaXAsIEFuaW1hdGlvbkxvYWRlciwgQW5pbWF0aW9uTWl4ZXIsIEFuaW1hdGlvbk9iamVjdEdyb3VwLCBBbmltYXRpb25VdGlscywgQXJjQ3VydmUsIEFycmF5Q2FtZXJhLCBBcnJvd0hlbHBlciwgQXVkaW8sIEF1ZGlvQW5hbHlzZXIsIEF1ZGlvQ29udGV4dCwgQXVkaW9MaXN0ZW5lciwgQXVkaW9Mb2FkZXIsIEF4ZXNIZWxwZXIsIEF4aXNIZWxwZXIsIEJhY2tTaWRlLCBCYXNpY0RlcHRoUGFja2luZywgQmFzaWNTaGFkb3dNYXAsIEJpbmFyeVRleHR1cmVMb2FkZXIsIEJvbmUsIEJvb2xlYW5LZXlmcmFtZVRyYWNrLCBCb3VuZGluZ0JveEhlbHBlciwgQm94MiwgQm94MywgQm94M0hlbHBlciwgQm94R2VvbWV0cnkgYXMgQm94QnVmZmVyR2VvbWV0cnksIEJveEdlb21ldHJ5LCBCb3hIZWxwZXIsIEJ1ZmZlckF0dHJpYnV0ZSwgQnVmZmVyR2VvbWV0cnksIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLCBCeXRlVHlwZSwgQ2FjaGUsIENhbWVyYSwgQ2FtZXJhSGVscGVyLCBDYW52YXNSZW5kZXJlciwgQ2FudmFzVGV4dHVyZSwgQ2F0bXVsbFJvbUN1cnZlMywgQ2luZW9uVG9uZU1hcHBpbmcsIENpcmNsZUdlb21ldHJ5IGFzIENpcmNsZUJ1ZmZlckdlb21ldHJ5LCBDaXJjbGVHZW9tZXRyeSwgQ2xhbXBUb0VkZ2VXcmFwcGluZywgQ2xvY2ssIENvbG9yLCBDb2xvcktleWZyYW1lVHJhY2ssIENvbXByZXNzZWRUZXh0dXJlLCBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciwgQ29uZUdlb21ldHJ5IGFzIENvbmVCdWZmZXJHZW9tZXRyeSwgQ29uZUdlb21ldHJ5LCBDdWJlQ2FtZXJhLCBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsIEN1YmVSZWZyYWN0aW9uTWFwcGluZywgQ3ViZVRleHR1cmUsIEN1YmVUZXh0dXJlTG9hZGVyLCBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZywgQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmcsIEN1YmljQmV6aWVyQ3VydmUsIEN1YmljQmV6aWVyQ3VydmUzLCBDdWJpY0ludGVycG9sYW50LCBDdWxsRmFjZUJhY2ssIEN1bGxGYWNlRnJvbnQsIEN1bGxGYWNlRnJvbnRCYWNrLCBDdWxsRmFjZU5vbmUsIEN1cnZlLCBDdXJ2ZVBhdGgsIEN1c3RvbUJsZW5kaW5nLCBDdXN0b21Ub25lTWFwcGluZywgQ3lsaW5kZXJHZW9tZXRyeSBhcyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LCBDeWxpbmRlckdlb21ldHJ5LCBDeWxpbmRyaWNhbCwgRGF0YVRleHR1cmUsIERhdGFUZXh0dXJlMkRBcnJheSwgRGF0YVRleHR1cmUzRCwgRGF0YVRleHR1cmVMb2FkZXIsIERhdGFVdGlscywgRGVjcmVtZW50U3RlbmNpbE9wLCBEZWNyZW1lbnRXcmFwU3RlbmNpbE9wLCBEZWZhdWx0TG9hZGluZ01hbmFnZXIsIERlcHRoRm9ybWF0LCBEZXB0aFN0ZW5jaWxGb3JtYXQsIERlcHRoVGV4dHVyZSwgRGlyZWN0aW9uYWxMaWdodCwgRGlyZWN0aW9uYWxMaWdodEhlbHBlciwgRGlzY3JldGVJbnRlcnBvbGFudCwgRG9kZWNhaGVkcm9uR2VvbWV0cnkgYXMgRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksIERvZGVjYWhlZHJvbkdlb21ldHJ5LCBEb3VibGVTaWRlLCBEc3RBbHBoYUZhY3RvciwgRHN0Q29sb3JGYWN0b3IsIER5bmFtaWNCdWZmZXJBdHRyaWJ1dGUsIER5bmFtaWNDb3B5VXNhZ2UsIER5bmFtaWNEcmF3VXNhZ2UsIER5bmFtaWNSZWFkVXNhZ2UsIEVkZ2VzR2VvbWV0cnksIEVkZ2VzSGVscGVyLCBFbGxpcHNlQ3VydmUsIEVxdWFsRGVwdGgsIEVxdWFsU3RlbmNpbEZ1bmMsIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLCBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywgRXVsZXIsIEV2ZW50RGlzcGF0Y2hlciwgRXh0cnVkZUdlb21ldHJ5IGFzIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwgRXh0cnVkZUdlb21ldHJ5LCBGYWNlQ29sb3JzLCBGaWxlTG9hZGVyLCBGbGF0U2hhZGluZywgRmxvYXQxNkJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQzMkF0dHJpYnV0ZSwgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXQ2NEF0dHJpYnV0ZSwgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSwgRmxvYXRUeXBlLCBGb2csIEZvZ0V4cDIsIEZvbnQsIEZvbnRMb2FkZXIsIEZyb250U2lkZSwgRnJ1c3R1bSwgR0xCdWZmZXJBdHRyaWJ1dGUsIEdMU0wxLCBHTFNMMywgR2FtbWFFbmNvZGluZywgR3JlYXRlckRlcHRoLCBHcmVhdGVyRXF1YWxEZXB0aCwgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMsIEdyZWF0ZXJTdGVuY2lsRnVuYywgR3JpZEhlbHBlciwgR3JvdXAsIEhhbGZGbG9hdFR5cGUsIEhlbWlzcGhlcmVMaWdodCwgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLCBIZW1pc3BoZXJlTGlnaHRQcm9iZSwgSWNvc2FoZWRyb25HZW9tZXRyeSBhcyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBJY29zYWhlZHJvbkdlb21ldHJ5LCBJbWFnZUJpdG1hcExvYWRlciwgSW1hZ2VMb2FkZXIsIEltYWdlVXRpbHMsIEltbWVkaWF0ZVJlbmRlck9iamVjdCwgSW5jcmVtZW50U3RlbmNpbE9wLCBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wLCBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUsIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LCBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlciwgSW5zdGFuY2VkTWVzaCwgSW50MTZBdHRyaWJ1dGUsIEludDE2QnVmZmVyQXR0cmlidXRlLCBJbnQzMkF0dHJpYnV0ZSwgSW50MzJCdWZmZXJBdHRyaWJ1dGUsIEludDhBdHRyaWJ1dGUsIEludDhCdWZmZXJBdHRyaWJ1dGUsIEludFR5cGUsIEludGVybGVhdmVkQnVmZmVyLCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSwgSW50ZXJwb2xhbnQsIEludGVycG9sYXRlRGlzY3JldGUsIEludGVycG9sYXRlTGluZWFyLCBJbnRlcnBvbGF0ZVNtb290aCwgSW52ZXJ0U3RlbmNpbE9wLCBKU09OTG9hZGVyLCBLZWVwU3RlbmNpbE9wLCBLZXlmcmFtZVRyYWNrLCBMT0QsIExhdGhlR2VvbWV0cnkgYXMgTGF0aGVCdWZmZXJHZW9tZXRyeSwgTGF0aGVHZW9tZXRyeSwgTGF5ZXJzLCBMZW5zRmxhcmUsIExlc3NEZXB0aCwgTGVzc0VxdWFsRGVwdGgsIExlc3NFcXVhbFN0ZW5jaWxGdW5jLCBMZXNzU3RlbmNpbEZ1bmMsIExpZ2h0LCBMaWdodFByb2JlLCBMaW5lLCBMaW5lMywgTGluZUJhc2ljTWF0ZXJpYWwsIExpbmVDdXJ2ZSwgTGluZUN1cnZlMywgTGluZURhc2hlZE1hdGVyaWFsLCBMaW5lTG9vcCwgTGluZVBpZWNlcywgTGluZVNlZ21lbnRzLCBMaW5lU3RyaXAsIExpbmVhckVuY29kaW5nLCBMaW5lYXJGaWx0ZXIsIExpbmVhckludGVycG9sYW50LCBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIsIExpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXIsIExpbmVhck1pcG1hcExpbmVhckZpbHRlciwgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciwgTGluZWFyVG9uZU1hcHBpbmcsIExvYWRlciwgTG9hZGVyVXRpbHMsIExvYWRpbmdNYW5hZ2VyLCBMb2dMdXZFbmNvZGluZywgTG9vcE9uY2UsIExvb3BQaW5nUG9uZywgTG9vcFJlcGVhdCwgTHVtaW5hbmNlQWxwaGFGb3JtYXQsIEx1bWluYW5jZUZvcm1hdCwgTU9VU0UsIE1hdGVyaWFsLCBNYXRlcmlhbExvYWRlciwgTWF0aFV0aWxzIGFzIE1hdGgsIE1hdGhVdGlscywgTWF0cml4MywgTWF0cml4NCwgTWF4RXF1YXRpb24sIE1lc2gsIE1lc2hCYXNpY01hdGVyaWFsLCBNZXNoRGVwdGhNYXRlcmlhbCwgTWVzaERpc3RhbmNlTWF0ZXJpYWwsIE1lc2hGYWNlTWF0ZXJpYWwsIE1lc2hMYW1iZXJ0TWF0ZXJpYWwsIE1lc2hNYXRjYXBNYXRlcmlhbCwgTWVzaE5vcm1hbE1hdGVyaWFsLCBNZXNoUGhvbmdNYXRlcmlhbCwgTWVzaFBoeXNpY2FsTWF0ZXJpYWwsIE1lc2hTdGFuZGFyZE1hdGVyaWFsLCBNZXNoVG9vbk1hdGVyaWFsLCBNaW5FcXVhdGlvbiwgTWlycm9yZWRSZXBlYXRXcmFwcGluZywgTWl4T3BlcmF0aW9uLCBNdWx0aU1hdGVyaWFsLCBNdWx0aXBseUJsZW5kaW5nLCBNdWx0aXBseU9wZXJhdGlvbiwgTmVhcmVzdEZpbHRlciwgTmVhcmVzdE1pcE1hcExpbmVhckZpbHRlciwgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIsIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsIE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLCBOZXZlckRlcHRoLCBOZXZlclN0ZW5jaWxGdW5jLCBOb0JsZW5kaW5nLCBOb0NvbG9ycywgTm9Ub25lTWFwcGluZywgTm9ybWFsQW5pbWF0aW9uQmxlbmRNb2RlLCBOb3JtYWxCbGVuZGluZywgTm90RXF1YWxEZXB0aCwgTm90RXF1YWxTdGVuY2lsRnVuYywgTnVtYmVyS2V5ZnJhbWVUcmFjaywgT2JqZWN0M0QsIE9iamVjdExvYWRlciwgT2JqZWN0U3BhY2VOb3JtYWxNYXAsIE9jdGFoZWRyb25HZW9tZXRyeSBhcyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksIE9jdGFoZWRyb25HZW9tZXRyeSwgT25lRmFjdG9yLCBPbmVNaW51c0RzdEFscGhhRmFjdG9yLCBPbmVNaW51c0RzdENvbG9yRmFjdG9yLCBPbmVNaW51c1NyY0FscGhhRmFjdG9yLCBPbmVNaW51c1NyY0NvbG9yRmFjdG9yLCBPcnRob2dyYXBoaWNDYW1lcmEsIFBDRlNoYWRvd01hcCwgUENGU29mdFNoYWRvd01hcCwgUE1SRU1HZW5lcmF0b3IsIFBhcmFtZXRyaWNHZW9tZXRyeSBhcyBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnksIFBhcmFtZXRyaWNHZW9tZXRyeSwgUGFydGljbGUsIFBhcnRpY2xlQmFzaWNNYXRlcmlhbCwgUGFydGljbGVTeXN0ZW0sIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwsIFBhdGgsIFBlcnNwZWN0aXZlQ2FtZXJhLCBQbGFuZSwgUGxhbmVHZW9tZXRyeSBhcyBQbGFuZUJ1ZmZlckdlb21ldHJ5LCBQbGFuZUdlb21ldHJ5LCBQbGFuZUhlbHBlciwgUG9pbnRDbG91ZCwgUG9pbnRDbG91ZE1hdGVyaWFsLCBQb2ludExpZ2h0LCBQb2ludExpZ2h0SGVscGVyLCBQb2ludHMsIFBvaW50c01hdGVyaWFsLCBQb2xhckdyaWRIZWxwZXIsIFBvbHloZWRyb25HZW9tZXRyeSBhcyBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksIFBvbHloZWRyb25HZW9tZXRyeSwgUG9zaXRpb25hbEF1ZGlvLCBQcm9wZXJ0eUJpbmRpbmcsIFByb3BlcnR5TWl4ZXIsIFF1YWRyYXRpY0JlemllckN1cnZlLCBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsIFF1YXRlcm5pb24sIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsIFJFVklTSU9OLCBSR0JBRGVwdGhQYWNraW5nLCBSR0JBRm9ybWF0LCBSR0JBSW50ZWdlckZvcm1hdCwgUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEweDVfRm9ybWF0LCBSR0JBX0FTVENfMTB4Nl9Gb3JtYXQsIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCwgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCwgUkdCQV9BU1RDXzR4NF9Gb3JtYXQsIFJHQkFfQVNUQ181eDRfRm9ybWF0LCBSR0JBX0FTVENfNXg1X0Zvcm1hdCwgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsIFJHQkFfQVNUQ182eDZfRm9ybWF0LCBSR0JBX0FTVENfOHg1X0Zvcm1hdCwgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsIFJHQkFfQVNUQ184eDhfRm9ybWF0LCBSR0JBX0JQVENfRm9ybWF0LCBSR0JBX0VUQzJfRUFDX0Zvcm1hdCwgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LCBSR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQsIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdCwgUkdCQV9TM1RDX0RYVDNfRm9ybWF0LCBSR0JBX1MzVENfRFhUNV9Gb3JtYXQsIFJHQkRFbmNvZGluZywgUkdCRUVuY29kaW5nLCBSR0JFRm9ybWF0LCBSR0JGb3JtYXQsIFJHQkludGVnZXJGb3JtYXQsIFJHQk0xNkVuY29kaW5nLCBSR0JNN0VuY29kaW5nLCBSR0JfRVRDMV9Gb3JtYXQsIFJHQl9FVEMyX0Zvcm1hdCwgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQsIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0LCBSR0JfUzNUQ19EWFQxX0Zvcm1hdCwgUkdGb3JtYXQsIFJHSW50ZWdlckZvcm1hdCwgUmF3U2hhZGVyTWF0ZXJpYWwsIFJheSwgUmF5Y2FzdGVyLCBSZWN0QXJlYUxpZ2h0LCBSZWRGb3JtYXQsIFJlZEludGVnZXJGb3JtYXQsIFJlaW5oYXJkVG9uZU1hcHBpbmcsIFJlcGVhdFdyYXBwaW5nLCBSZXBsYWNlU3RlbmNpbE9wLCBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiwgUmluZ0dlb21ldHJ5IGFzIFJpbmdCdWZmZXJHZW9tZXRyeSwgUmluZ0dlb21ldHJ5LCBTUkdCOF9BTFBIQThfQVNUQ18xMHgxMF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEweDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ18xMHg2X0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTB4OF9Gb3JtYXQsIFNSR0I4X0FMUEhBOF9BU1RDXzEyeDEwX0Zvcm1hdCwgU1JHQjhfQUxQSEE4X0FTVENfMTJ4MTJfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ180eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDRfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ181eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ182eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDVfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDZfRm9ybWF0LCBTUkdCOF9BTFBIQThfQVNUQ184eDhfRm9ybWF0LCBTY2VuZSwgU2NlbmVVdGlscywgU2hhZGVyQ2h1bmssIFNoYWRlckxpYiwgU2hhZGVyTWF0ZXJpYWwsIFNoYWRvd01hdGVyaWFsLCBTaGFwZSwgU2hhcGVHZW9tZXRyeSBhcyBTaGFwZUJ1ZmZlckdlb21ldHJ5LCBTaGFwZUdlb21ldHJ5LCBTaGFwZVBhdGgsIFNoYXBlVXRpbHMsIFNob3J0VHlwZSwgU2tlbGV0b24sIFNrZWxldG9uSGVscGVyLCBTa2lubmVkTWVzaCwgU21vb3RoU2hhZGluZywgU3BoZXJlLCBTcGhlcmVHZW9tZXRyeSBhcyBTcGhlcmVCdWZmZXJHZW9tZXRyeSwgU3BoZXJlR2VvbWV0cnksIFNwaGVyaWNhbCwgU3BoZXJpY2FsSGFybW9uaWNzMywgU3BsaW5lQ3VydmUsIFNwb3RMaWdodCwgU3BvdExpZ2h0SGVscGVyLCBTcHJpdGUsIFNwcml0ZU1hdGVyaWFsLCBTcmNBbHBoYUZhY3RvciwgU3JjQWxwaGFTYXR1cmF0ZUZhY3RvciwgU3JjQ29sb3JGYWN0b3IsIFN0YXRpY0NvcHlVc2FnZSwgU3RhdGljRHJhd1VzYWdlLCBTdGF0aWNSZWFkVXNhZ2UsIFN0ZXJlb0NhbWVyYSwgU3RyZWFtQ29weVVzYWdlLCBTdHJlYW1EcmF3VXNhZ2UsIFN0cmVhbVJlYWRVc2FnZSwgU3RyaW5nS2V5ZnJhbWVUcmFjaywgU3VidHJhY3RFcXVhdGlvbiwgU3VidHJhY3RpdmVCbGVuZGluZywgVE9VQ0gsIFRhbmdlbnRTcGFjZU5vcm1hbE1hcCwgVGV0cmFoZWRyb25HZW9tZXRyeSBhcyBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LCBUZXRyYWhlZHJvbkdlb21ldHJ5LCBUZXh0R2VvbWV0cnkgYXMgVGV4dEJ1ZmZlckdlb21ldHJ5LCBUZXh0R2VvbWV0cnksIFRleHR1cmUsIFRleHR1cmVMb2FkZXIsIFRvcnVzR2VvbWV0cnkgYXMgVG9ydXNCdWZmZXJHZW9tZXRyeSwgVG9ydXNHZW9tZXRyeSwgVG9ydXNLbm90R2VvbWV0cnkgYXMgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksIFRvcnVzS25vdEdlb21ldHJ5LCBUcmlhbmdsZSwgVHJpYW5nbGVGYW5EcmF3TW9kZSwgVHJpYW5nbGVTdHJpcERyYXdNb2RlLCBUcmlhbmdsZXNEcmF3TW9kZSwgVHViZUdlb21ldHJ5IGFzIFR1YmVCdWZmZXJHZW9tZXRyeSwgVHViZUdlb21ldHJ5LCBVVk1hcHBpbmcsIFVpbnQxNkF0dHJpYnV0ZSwgVWludDE2QnVmZmVyQXR0cmlidXRlLCBVaW50MzJBdHRyaWJ1dGUsIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwgVWludDhBdHRyaWJ1dGUsIFVpbnQ4QnVmZmVyQXR0cmlidXRlLCBVaW50OENsYW1wZWRBdHRyaWJ1dGUsIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSwgVW5pZm9ybSwgVW5pZm9ybXNMaWIsIFVuaWZvcm1zVXRpbHMsIFVuc2lnbmVkQnl0ZVR5cGUsIFVuc2lnbmVkSW50MjQ4VHlwZSwgVW5zaWduZWRJbnRUeXBlLCBVbnNpZ25lZFNob3J0NDQ0NFR5cGUsIFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwgVW5zaWduZWRTaG9ydDU2NVR5cGUsIFVuc2lnbmVkU2hvcnRUeXBlLCBWU01TaGFkb3dNYXAsIFZlY3RvcjIsIFZlY3RvcjMsIFZlY3RvcjQsIFZlY3RvcktleWZyYW1lVHJhY2ssIFZlcnRleCwgVmVydGV4Q29sb3JzLCBWaWRlb1RleHR1cmUsIFdlYkdMMVJlbmRlcmVyLCBXZWJHTEN1YmVSZW5kZXJUYXJnZXQsIFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQsIFdlYkdMUmVuZGVyVGFyZ2V0LCBXZWJHTFJlbmRlclRhcmdldEN1YmUsIFdlYkdMUmVuZGVyZXIsIFdlYkdMVXRpbHMsIFdpcmVmcmFtZUdlb21ldHJ5LCBXaXJlZnJhbWVIZWxwZXIsIFdyYXBBcm91bmRFbmRpbmcsIFhIUkxvYWRlciwgWmVyb0N1cnZhdHVyZUVuZGluZywgWmVyb0ZhY3RvciwgWmVyb1Nsb3BlRW5kaW5nLCBaZXJvU3RlbmNpbE9wLCBzUkdCRW5jb2RpbmcgfTtcbiIsICIvKipcbiAqIEBhdXRob3IgTGV3eSBCbHVlIC8gaHR0cHM6Ly9naXRodWIuY29tL2xvb2VlZVxuICovXG5cbmZ1bmN0aW9uIFRpbWUoKSB7XG5cblx0Ly8gS2VlcCB0cmFjayBvZiB0aW1lIHdoZW4gcGF1c2UoKSB3YXMgY2FsbGVkXG4gIGxldCBfcGF1c2VUaW1lO1xuXG5cdC8vIEtlZXAgdHJhY2sgb2YgdGltZSB3aGVuIGRlbHRhIHdhcyBsYXN0IGNoZWNrZWRcbiAgbGV0IF9sYXN0RGVsdGEgPSAwO1xuXG5cdC8vIEhvbGQgdGhlIHRpbWUgd2hlbiBzdGFydCgpIHdhcyBjYWxsZWRcblx0Ly8gVGhlcmUgaXMgbm8gcG9pbnQgaW4gZXhwb3NpbmcgdGhpcyBhcyBpdCdzIGVzc2VudGlhbGx5IGEgcmFuZG9tIG51bWJlclxuXHQvLyBhbmQgd2lsbCBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgcGVyZm9ybWFuY2Uubm93IG9yIERhdGUubm93IGlzIHVzZWRcbiAgbGV0IF9zdGFydFRpbWUgPSAwO1xuXG4gIHRoaXMucnVubmluZyA9IGZhbHNlO1xuICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG5cdC8vIFRoZSBzY2FsZSBhdCB3aGljaCB0aGUgdGltZSBpcyBwYXNzaW5nLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBzbG93IG1vdGlvbiBlZmZlY3RzLlxuICBsZXQgX3RpbWVTY2FsZSA9IDEuMDtcblx0Ly8gS2VlcCB0cmFjayBvZiBzY2FsZWQgdGltZSBhY3Jvc3Mgc2NhbGUgY2hhbmdlc1xuICBsZXQgX3RvdGFsVGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gMDtcbiAgbGV0IF90aW1lQXRMYXN0U2NhbGVDaGFuZ2UgPSAwO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7XG5cbiAgICBub3c6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiAoIHBlcmZvcm1hbmNlIHx8IERhdGUgKS5ub3coKTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICB0aW1lU2NhbGU6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiBfdGltZVNjYWxlO1xuXG4gICAgICB9LFxuXG4gICAgICBzZXQoIHZhbHVlICkge1xuXG4gICAgICAgIF90b3RhbFRpbWVBdExhc3RTY2FsZUNoYW5nZSA9IHRoaXMudG90YWxUaW1lO1xuICAgICAgICBfdGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gdGhpcy5ub3c7XG4gICAgICAgIF90aW1lU2NhbGUgPSB2YWx1ZTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICB1bnNjYWxlZFRvdGFsVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgcmV0dXJuICggdGhpcy5ydW5uaW5nICkgPyB0aGlzLm5vdyAtIF9zdGFydFRpbWUgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICAgIHRvdGFsVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgY29uc3QgZGlmZiA9ICggdGhpcy5ub3cgLSBfdGltZUF0TGFzdFNjYWxlQ2hhbmdlICkgKiB0aGlzLnRpbWVTY2FsZTtcblxuICAgICAgICByZXR1cm4gKCB0aGlzLnJ1bm5pbmcgKSA/IF90b3RhbFRpbWVBdExhc3RTY2FsZUNoYW5nZSArIGRpZmYgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICAgIC8vIFVuc2NhbGVkIHRpbWUgc2luY2UgZGVsdGEgd2FzIGxhc3QgY2hlY2tlZFxuICAgIHVuc2NhbGVkRGVsdGE6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzLm5vdyAtIF9sYXN0RGVsdGE7XG4gICAgICAgIF9sYXN0RGVsdGEgPSB0aGlzLm5vdztcblxuICAgICAgICByZXR1cm4gZGlmZjtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgICAvLyBTY2FsZWQgdGltZSBzaW5jZSBkZWx0YSB3YXMgbGFzdCBjaGVja2VkXG4gICAgZGVsdGE6IHtcblxuICAgICAgZ2V0KCkge1xuXG4gICAgICAgIHJldHVybiB0aGlzLnVuc2NhbGVkRGVsdGEgKiB0aGlzLnRpbWVTY2FsZTtcblxuICAgICAgfSxcblxuICAgIH0sXG5cbiAgfSApO1xuXG4gIHRoaXMuc3RhcnQgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIHRoaXMucGF1c2VkICkge1xuXG4gICAgICBjb25zdCBkaWZmID0gKCB0aGlzLm5vdyAtIF9wYXVzZVRpbWUgKTtcblxuICAgICAgX3N0YXJ0VGltZSArPSBkaWZmO1xuICAgICAgX2xhc3REZWx0YSArPSBkaWZmO1xuICAgICAgX3RpbWVBdExhc3RTY2FsZUNoYW5nZSArPSBkaWZmO1xuXG4gICAgfVx0ZWxzZSBpZiAoICF0aGlzLnJ1bm5pbmcgKSB7XG5cbiAgICAgIF9zdGFydFRpbWUgPSBfbGFzdERlbHRhID0gX3RpbWVBdExhc3RTY2FsZUNoYW5nZSA9IHRoaXMubm93O1xuXG4gICAgICBfdG90YWxUaW1lQXRMYXN0U2NhbGVDaGFuZ2UgPSAwO1xuXG4gICAgfVxuXG4gICAgdGhpcy5ydW5uaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnBhdXNlZCA9IGZhbHNlO1xuXG4gIH07XG5cblx0Ly8gUmVzZXQgYW5kIHN0b3AgY2xvY2tcbiAgdGhpcy5zdG9wID0gZnVuY3Rpb24gKCkge1xuXG4gICAgX3N0YXJ0VGltZSA9IDA7XG4gICAgX3RvdGFsVGltZUF0TGFzdFNjYWxlQ2hhbmdlID0gMDtcblxuICAgIHRoaXMucnVubmluZyA9IGZhbHNlO1xuXG4gIH07XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIF9wYXVzZVRpbWUgPSB0aGlzLm5vdztcblxuICAgIHRoaXMucGF1c2VkID0gdHJ1ZTtcblxuICB9O1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpbWUgO1xuIiwgImltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcbmltcG9ydCBUaW1lIGZyb20gJy4uL3V0aWxpdGllcy9UaW1lLmpzJztcblxuLyoqXG4gKiBAYXV0aG9yIExld3kgQmx1ZSAvIGh0dHBzOi8vZ2l0aHViLmNvbS9sb29lZWVcbiAqXG4gKi9cblxubGV0IF9jYW52YXM7XG5sZXQgX3NjZW5lO1xubGV0IF9jYW1lcmE7XG5sZXQgX3JlbmRlcmVyO1xuXG5sZXQgX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEO1xuXG5cbmZ1bmN0aW9uIEFwcCggY2FudmFzICkge1xuXG4gIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gIGlmICggY2FudmFzICE9PSB1bmRlZmluZWQgKSBfY2FudmFzID0gY2FudmFzO1xuXG4gIHRoaXMuYXV0b1JlbmRlciA9IHRydWU7XG5cbiAgdGhpcy5hdXRvUmVzaXplID0gdHJ1ZTtcblxuICB0aGlzLmZyYW1lQ291bnQgPSAwO1xuXG4gIHRoaXMuZGVsdGEgPSAwO1xuXG4gIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7XG4gIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICB0aGlzLnRpbWUgPSBuZXcgVGltZSgpO1xuXG4gIGNvbnN0IHNldFJlbmRlcmVyU2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggX3JlbmRlcmVyICkgX3JlbmRlcmVyLnNldFNpemUoIHNlbGYuY2FudmFzLmNsaWVudFdpZHRoLCBzZWxmLmNhbnZhcy5jbGllbnRIZWlnaHQsIGZhbHNlICk7XG5cbiAgfTtcblxuICBjb25zdCBzZXRDYW1lcmFBc3BlY3QgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBpZiAoIF9jYW1lcmEgKSB7XG4gICAgICBfY2FtZXJhLmFzcGVjdCA9IF9jYW52YXMuY2xpZW50V2lkdGggLyBfY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIF9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xuICAgIH1cblxuICB9O1xuXG4gIC8vIG5vdGU6IGdldHMgY2FsbGVkIGxhc3Qgd2hlbiBhdXRvUmVzaXplIGlzIG9uXG4gIHRoaXMub25XaW5kb3dSZXNpemUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICBjb25zdCBvbldpbmRvd1Jlc2l6ZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGlmICggIXNlbGYuYXV0b1Jlc2l6ZSApIHtcblxuICAgICAgc2VsZi5vbldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgcmV0dXJuO1xuXG4gICAgfVxuXG4gICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGNhbWVyYSBkb2Vzbid0IGV4aXN0IHlldFxuICAgIGlmICggIV9jYW1lcmEgKSByZXR1cm47XG5cbiAgICBpZiAoIF9jYW1lcmEudHlwZSAhPT0gJ1BlcnNwZWN0aXZlQ2FtZXJhJyApIHtcblxuICAgICAgY29uc29sZS53YXJuKCAnVEhSRUUuQXBwOiBBdXRvUmVzaXplIG9ubHkgd29ya3Mgd2l0aCBQZXJzcGVjdGl2ZUNhbWVyYScgKTtcbiAgICAgIHJldHVybjtcblxuICAgIH1cblxuICAgIHNldENhbWVyYUFzcGVjdCgpO1xuXG4gICAgc2V0UmVuZGVyZXJTaXplKCk7XG5cbiAgICBzZWxmLm9uV2luZG93UmVzaXplKCk7XG5cblxuICB9O1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCAncmVzaXplJywgb25XaW5kb3dSZXNpemUsIGZhbHNlICk7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIHRoaXMsIHtcblxuICAgIGNhbnZhczoge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgaWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSB7XG5cbiAgICAgICAgICBfY2FudmFzID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2NhbnZhcycgKSApO1xuICAgICAgICAgIF9jYW52YXMuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgIF9jYW52YXMuc3R5bGUud2lkdGggPSBfY2FudmFzLnN0eWxlLmhlaWdodCA9ICcxMDAlJztcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9jYW52YXM7XG5cbiAgICAgIH0sXG5cbiAgICAgIHNldCggbmV3Q2FudmFzICkge1xuXG4gICAgICAgIF9jYW52YXMgPSBuZXdDYW52YXM7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIGNhbWVyYToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgaWYgKCBfY2FtZXJhID09PSB1bmRlZmluZWQgKSB7XG5cbiAgICAgICAgICBfY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgdGhpcy5jYW52YXMuY2xpZW50V2lkdGggLyB0aGlzLmNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMCApO1xuXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX2NhbWVyYTtcblxuICAgICAgfSxcblxuICAgICAgc2V0KCBjYW1lcmEgKSB7XG5cbiAgICAgICAgX2NhbWVyYSA9IGNhbWVyYTtcbiAgICAgICAgc2V0Q2FtZXJhQXNwZWN0KCk7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHNjZW5lOiB7XG5cbiAgICAgIGdldCgpIHtcblxuICAgICAgICBpZiAoIF9zY2VuZSA9PT0gdW5kZWZpbmVkICkge1xuXG4gICAgICAgICAgX3NjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfc2NlbmU7XG5cbiAgICAgIH0sXG5cbiAgICAgIHNldCggc2NlbmUgKSB7XG5cbiAgICAgICAgX3NjZW5lID0gc2NlbmU7XG5cbiAgICAgIH0sXG4gICAgfSxcblxuICAgIHJlbmRlcmVyOiB7XG5cbiAgICAgIGdldCgpIHtcblxuICAgICAgICBpZiAoIF9yZW5kZXJlciA9PT0gdW5kZWZpbmVkICkge1xuXG4gICAgICAgICAgX3JlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoIHsgY2FudmFzOiB0aGlzLmNhbnZhcywgYW50aWFsaWFzOiB0cnVlIH0gKTtcbiAgICAgICAgICBfcmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyggd2luZG93LmRldmljZVBpeGVsUmF0aW8gKTtcbiAgICAgICAgICBfcmVuZGVyZXIuc2V0U2l6ZSggdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCwgZmFsc2UgKTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZW5kZXJlcjtcblxuICAgICAgfSxcblxuICAgICAgc2V0KCByZW5kZXJlciApIHtcblxuICAgICAgICBfcmVuZGVyZXIgPSByZW5kZXJlcjtcbiAgICAgICAgc2V0UmVuZGVyZXJTaXplKCk7XG5cbiAgICAgIH0sXG5cbiAgICB9LFxuXG4gICAgYXZlcmFnZUZyYW1lVGltZToge1xuXG4gICAgICBnZXQoKSB7XG5cbiAgICAgICAgcmV0dXJuICggdGhpcy5mcmFtZUNvdW50ICE9PSAwICkgPyB0aGlzLnRpbWUudW5zY2FsZWRUb3RhbFRpbWUgLyB0aGlzLmZyYW1lQ291bnQgOiAwO1xuXG4gICAgICB9LFxuXG4gICAgfSxcblxuICB9ICk7XG5cbiAgdGhpcy5wbGF5ID0gZnVuY3Rpb24gKCkge1xuXG4gICAgdGhpcy50aW1lLnN0YXJ0KCk7XG5cbiAgICB0aGlzLmlzUGxheWluZyA9IHRydWU7XG4gICAgdGhpcy5pc1BhdXNlZCA9IGZhbHNlO1xuXG4gICAgZnVuY3Rpb24gYW5pbWF0aW9uSGFuZGxlcigpIHtcblxuICAgICAgc2VsZi5mcmFtZUNvdW50ICsrO1xuICAgICAgc2VsZi5kZWx0YSA9IHNlbGYudGltZS5kZWx0YTtcblxuICAgICAgc2VsZi5vblVwZGF0ZSgpO1xuXG4gICAgICBpZiAoIHNlbGYuY29udHJvbHMgJiYgc2VsZi5jb250cm9scy5lbmFibGVEYW1waW5nICkgc2VsZi5jb250cm9scy51cGRhdGUoKTtcblxuICAgICAgaWYgKCBzZWxmLmF1dG9SZW5kZXIgKSBzZWxmLnJlbmRlcmVyLnJlbmRlciggc2VsZi5zY2VuZSwgc2VsZi5jYW1lcmEgKTtcblxuICAgICAgX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCAoKSA9PiB7IGFuaW1hdGlvbkhhbmRsZXIoKTsgfSApO1xuXG4gICAgfVxuXG4gICAgYW5pbWF0aW9uSGFuZGxlcigpO1xuXG4gIH07XG5cbiAgdGhpcy5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHRoaXMuaXNQYXVzZWQgPSB0cnVlO1xuXG4gICAgdGhpcy50aW1lLnBhdXNlKCk7XG5cbiAgICBjYW5jZWxBbmltYXRpb25GcmFtZSggX2N1cnJlbnRBbmltYXRpb25GcmFtZUlEICk7XG5cbiAgfTtcblxuICB0aGlzLnN0b3AgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICB0aGlzLmlzUGxheWluZyA9IGZhbHNlO1xuICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICAgIHRoaXMudGltZS5zdG9wKCk7XG4gICAgdGhpcy5mcmFtZUNvdW50ID0gMDtcblxuICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKCBfY3VycmVudEFuaW1hdGlvbkZyYW1lSUQgKTtcblxuICB9O1xuXG4gIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbiAoKSB7fTtcblxuICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uICggb2JqZWN0ICkge1xuICAgIGlmICggdHlwZW9mIG9iamVjdC50b0pTT04gPT09ICdmdW5jdGlvbicgKSB7XG4gICAgICBjb25zdCBqc29uID0gb2JqZWN0LnRvSlNPTigpO1xuXG4gICAgICB3aW5kb3cub3BlbiggJ2RhdGE6YXBwbGljYXRpb24vanNvbjsnICsgKCB3aW5kb3cuYnRvYVxuICAgICAgPyAnYmFzZTY0LCcgKyBidG9hKCBKU09OLnN0cmluZ2lmeSgganNvbiApIClcbiAgICAgIDogSlNPTi5zdHJpbmdpZnkoIGpzb24gKSApICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdBcHAudG9KU09OIGVycm9yOiBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIHRvSlNPTiBmdW5jdGlvbi4nICk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaW5pdENvbnRyb2xzID0gZnVuY3Rpb24gKCkge1xuXG4gICAgdGhpcy5jb250cm9scyA9IG5ldyBPcmJpdENvbnRyb2xzKCB0aGlzLmNhbWVyYSwgdGhpcy5jYW52YXMgKTtcblxuICAgIHRoaXMuY29udHJvbHMuZW5hYmxlRGFtcGluZyA9IHRydWU7XG4gICAgdGhpcy5jb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4yO1xuXG4gIH07XG5cbiAgdGhpcy5maXRDYW1lcmFUb09iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0LCB6b29tICkge1xuXG4gICAgem9vbSA9IHpvb20gfHwgMS4yNTtcblxuICAgIGNvbnN0IGJvdW5kaW5nQm94ID0gbmV3IFRIUkVFLkJveDMoKTtcblxuICAgIC8vIGdldCBib3VuZGluZyBib3ggb2Ygb2JqZWN0IC0gdGhpcyB3aWxsIGJlIHVzZWQgdG8gc2V0dXAgY29udHJvbHMgYW5kIGNhbWVyYVxuICAgIGJvdW5kaW5nQm94LnNldEZyb21PYmplY3QoIG9iamVjdCApO1xuXG4gICAgY29uc3QgY2VudGVyID0gYm91bmRpbmdCb3guZ2V0Q2VudGVyKCBuZXcgVEhSRUUuVmVjdG9yMygpICk7XG4gICAgY29uc3Qgc2l6ZSA9IGJvdW5kaW5nQm94LmdldFNpemUoIG5ldyBUSFJFRS5WZWN0b3IzKCkgKTtcblxuICAgIC8vIGdldCB0aGUgbWF4IHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveFxuICAgIGNvbnN0IG1heERpbSA9IE1hdGgubWF4KCBzaXplLngsIHNpemUueSwgc2l6ZS56ICk7XG4gICAgY29uc3QgZm92ID0gdGhpcy5jYW1lcmEuZm92ICogKCBNYXRoLlBJIC8gMTgwICk7XG4gICAgbGV0IGNhbWVyYVogPSBNYXRoLmFicyggbWF4RGltIC8gNCAqIE1hdGgudGFuKCBmb3YgKiAyICkgKTtcblxuICAgIGNhbWVyYVogKj0gem9vbTsgLy8gem9vbSBvdXQgYSBsaXR0bGUgc28gdGhhdCBvYmplY3RzIGRvbid0IGZpbGwgdGhlIHNjcmVlblxuXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ueiA9IGNhbWVyYVo7XG5cbiAgICBjb25zdCBtaW5aID0gYm91bmRpbmdCb3gubWluLno7XG4gICAgY29uc3QgY2FtZXJhVG9GYXJFZGdlID0gKCBtaW5aIDwgMCApID8gLW1pblogKyBjYW1lcmFaIDogY2FtZXJhWiAtIG1pblo7XG5cbiAgICB0aGlzLmNhbWVyYS5mYXIgPSBjYW1lcmFUb0ZhckVkZ2UgKiAzO1xuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcblxuICAgIGlmICggdGhpcy5jb250cm9scyApIHtcblxuICAgICAgLy8gc2V0IGNhbWVyYSB0byByb3RhdGUgYXJvdW5kIGNlbnRlciBvZiBsb2FkZWQgb2JqZWN0XG4gICAgICB0aGlzLmNvbnRyb2xzLnRhcmdldCA9IGNlbnRlcjtcblxuICAgICAgLy8gcHJldmVudCBjYW1lcmEgZnJvbSB6b29taW5nIG91dCBmYXIgZW5vdWdoIHRvIGNyZWF0ZSBmYXIgcGxhbmUgY3V0b2ZmXG4gICAgICB0aGlzLmNvbnRyb2xzLm1heERpc3RhbmNlID0gY2FtZXJhVG9GYXJFZGdlICogMjtcblxuICAgICAgdGhpcy5jb250cm9scy5zYXZlU3RhdGUoKTtcblxuICAgIH1cblxuICAgIHJldHVybiBib3VuZGluZ0JveDtcblxuICB9O1xuXG4gIC8vIHRha2UgYSBzY3JlZW5zaG90IGF0IGEgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodFxuICAvLyBhbmQgcmV0dXJuIGFuIGltZyBlbGVtZW50XG4gIHRoaXMudGFrZVNjcmVlbnNob3QgPSBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7XG5cbiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcblxuICAgIGlmICggd2lkdGggPiAwICYmIGhlaWdodCA+IDAgKSB7XG5cbiAgICAgIC8vIHNldCBjYW1lcmEgYW5kIHJlbmRlcmVyIHRvIHNjcmVlbnNob3Qgc2l6ZVxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoIHdpZHRoLCBoZWlnaHQsIGZhbHNlICk7XG5cbiAgICAgIC8vIHJlbmRlciBzY2VuZVxuICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoIHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCBudWxsLCBmYWxzZSApO1xuXG4gICAgICBpbWcuc3JjID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgpO1xuXG4gICAgICAvLyByZXNldCB0aGUgcmVuZGVyZXIgYW5kIGNhbWVyYSB0byBvcmlnaW5hbCBzaXplXG4gICAgICB0aGlzLmNhbWVyYS5hc3BlY3QgPSB0aGlzLmNhbnZhcy5jbGllbnRXaWR0aCAvIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodDtcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZSggdGhpcy5jYW52YXMuY2xpZW50V2lkdGgsIHRoaXMuY2FudmFzLmNsaWVudEhlaWdodCwgZmFsc2UgKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIHJlbmRlciBzY2VuZVxuICAgICAgdGhpcy5yZW5kZXJlci5yZW5kZXIoIHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhLCBudWxsLCBmYWxzZSApO1xuXG4gICAgICBpbWcuc3JjID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnRvRGF0YVVSTCgpO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGltZztcblxuICB9O1xuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEFwcDtcbiIsICJNYXRoLnNpbmggPSBNYXRoLnNpbmggfHwgZnVuY3Rpb24gc2luaCggeCApIHtcbiAgY29uc3QgeSA9IE1hdGguZXhwKCB4ICk7XG4gIHJldHVybiAoIHkgLSAxIC8geSApIC8gMjtcbn07XG5cbk1hdGguY29zaCA9IE1hdGguY29zaCB8fCBmdW5jdGlvbiBjb3NoKCB4ICkge1xuICBjb25zdCB5ID0gTWF0aC5leHAoIHggKTtcbiAgcmV0dXJuICggeSArIDEgLyB5ICkgLyAyO1xufTtcblxuTWF0aC5jb3QgPSBNYXRoLmNvdCB8fCBmdW5jdGlvbiBjb3QoIHggKSB7XG4gIHJldHVybiAxIC8gTWF0aC50YW4oIHggKTtcbn07XG4iLCAiXG5jb25zdCB3YXJuaW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyN3YXJuJyApO1xuXG5jb25zdCBwVmFsdWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3AtdmFsdWUnICk7XG5jb25zdCBxVmFsdWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3EtdmFsdWUnICk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjcC11cCcgKS5hZGRFdmVudExpc3RlbmVyKCAnY2xpY2snLCAoIGUgKSA9PiB7XG5cbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHBhcnNlSW50KCBwVmFsdWUuaW5uZXJIVE1MLCAxMCApO1xuICBpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gMTIgKSByZXR1cm47XG5cbiAgd2FybmluZy5jbGFzc0xpc3QuYWRkKCAnaGlkZScgKTtcbiAgcFZhbHVlLmlubmVySFRNTCA9IGN1cnJlbnRWYWx1ZSArIDE7XG5cbn0gKTtcblxuZG9jdW1lbnQucXVlcnlTZWxlY3RvciggJyNwLWRvd24nICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCBlICkgPT4ge1xuXG4gIGUucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBjdXJyZW50VmFsdWUgPSBwYXJzZUludCggcFZhbHVlLmlubmVySFRNTCwgMTAgKTtcblxuICBpZiAoIGN1cnJlbnRWYWx1ZSA9PT0gNCApIHJldHVybjtcblxuICBjb25zdCBuZXdWYWx1ZSA9IGN1cnJlbnRWYWx1ZSAtIDE7XG5cbiAgaWYgKCBuZXdWYWx1ZSA9PT0gNCAmJiBwYXJzZUludCggcVZhbHVlLmlubmVySFRNTCwgMTAgKSA9PT0gNCApIHtcblxuICAgIHdhcm5pbmcuY2xhc3NMaXN0LnJlbW92ZSggJ2hpZGUnICk7XG5cbiAgfVxuXG4gIHBWYWx1ZS5pbm5lckhUTUwgPSBuZXdWYWx1ZTtcblxufSApO1xuXG5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCAnI3EtdXAnICkuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgKCBlICkgPT4ge1xuXG4gIGUucHJldmVudERlZmF1bHQoKTtcblxuICBjb25zdCBjdXJyZW50VmFsdWUgPSBwYXJzZUludCggcVZhbHVlLmlubmVySFRNTCwgMTAgKTtcbiAgaWYgKCBjdXJyZW50VmFsdWUgPT09IDEyICkgcmV0dXJuO1xuXG4gIHdhcm5pbmcuY2xhc3NMaXN0LmFkZCggJ2hpZGUnICk7XG4gIHFWYWx1ZS5pbm5lckhUTUwgPSBjdXJyZW50VmFsdWUgKyAxO1xuXG59ICk7XG5cbmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoICcjcS1kb3duJyApLmFkZEV2ZW50TGlzdGVuZXIoICdjbGljaycsICggZSApID0+IHtcblxuICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgY29uc3QgY3VycmVudFZhbHVlID0gcGFyc2VJbnQoIHFWYWx1ZS5pbm5lckhUTUwsIDEwICk7XG5cbiAgaWYgKCBjdXJyZW50VmFsdWUgPT09IDQgKSByZXR1cm47XG5cbiAgY29uc3QgbmV3VmFsdWUgPSBjdXJyZW50VmFsdWUgLSAxO1xuXG4gIGlmICggbmV3VmFsdWUgPT09IDQgJiYgcGFyc2VJbnQoIHBWYWx1ZS5pbm5lckhUTUwsIDEwICkgPT09IDQgKSB7XG5cbiAgICB3YXJuaW5nLmNsYXNzTGlzdC5yZW1vdmUoICdoaWRlJyApO1xuXG4gIH1cblxuICBxVmFsdWUuaW5uZXJIVE1MID0gbmV3VmFsdWU7XG5cbn0gKTtcbiIsICIvLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICAgTUFUSCBGVU5DVElPTlNcbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gKCB4MSwgeTEsIHgyLCB5MiApID0+XG4gIE1hdGguc3FydCggKCB4MiAtIHgxICkgKiAoIHgyIC0geDEgKSArICggeTIgLSB5MSApICogKCB5MiAtIHkxICkgKTtcblxuLy8gZG9lcyB0aGUgbGluZSBjb25uZWN0aW5nIHAxLCBwMiBnbyB0aHJvdWdoIHRoZSBwb2ludCAoMCwwKT9cbmV4cG9ydCBjb25zdCB0aHJvdWdoT3JpZ2luID0gKCB4MSwgeTEsIHgyLCB5MiApID0+IHtcbiAgLy8gdmVydGljYWwgbGluZSB0aHJvdWdoIGNlbnRyZVxuICBpZiAoICggTWF0aC5hYnMoIHgxICkgPD0gMC4wMDAwMSApICYmICggTWF0aC5hYnMoIHgyICkgPD0gMC4wMDAwMSApICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHRlc3QgPSAoIC14MSAqIHkyICsgeDEgKiB5MSApIC8gKCB4MiAtIHgxICkgKyB5MTtcblxuICBpZiAoIE1hdGguYWJzKCB0ZXN0ICkgPD0gMC4wMDAwMSApIHJldHVybiB0cnVlO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5cbi8vIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgc21hbGxlciBhcmMgYmV0d2VlbiB0d28gYW5nbGVzIG9uIGEgZ2l2ZW4gY2lyY2xlXG5leHBvcnQgY29uc3QgYXJjTGVuZ3RoID0gKCByYWRpdXMsIHN0YXJ0QW5nbGUsIGVuZEFuZ2xlICkgPT4ge1xuICByZXR1cm4gKCBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgPiBNYXRoLlBJIClcbiAgICA/IHJhZGl1cyAqICggMiAqIE1hdGguUEkgLSBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgKVxuICAgIDogcmFkaXVzICogKCBNYXRoLmFicyggc3RhcnRBbmdsZSAtIGVuZEFuZ2xlICkgKTtcbn07XG5cbi8vIGZpbmQgdGhlIHR3byBwb2ludHMgYSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgb24gdGhlIGNpcmN1bWZlcmVuY2Ugb2YgYSBjaXJjbGVcbi8vIGluIHRoZSBkaXJlY3Rpb24gb2YgcG9pbnQyXG5leHBvcnQgY29uc3QgZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjID0gKCBhcmMsIHNwYWNpbmcgKSA9PiB7XG4gIGNvbnN0IGNvc1RoZXRhID0gLSggKCBzcGFjaW5nICogc3BhY2luZyApIC8gKCAyICogYXJjLnJhZGl1cyAqIGFyYy5yYWRpdXMgKSAtIDEgKTtcbiAgY29uc3Qgc2luVGhldGFQb3MgPSBNYXRoLnNxcnQoIDEgLSAoIGNvc1RoZXRhICogY29zVGhldGEgKSApO1xuICBjb25zdCBzaW5UaGV0YU5lZyA9IC1zaW5UaGV0YVBvcztcblxuICBjb25zdCB4UG9zID0gYXJjLmNlbnRyZS54ICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApIC0gc2luVGhldGFQb3NcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB4TmVnID0gYXJjLmNlbnRyZS54ICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApIC0gc2luVGhldGFOZWdcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB5UG9zID0gYXJjLmNlbnRyZS55ICsgc2luVGhldGFQb3NcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuICBjb25zdCB5TmVnID0gYXJjLmNlbnRyZS55ICsgc2luVGhldGFOZWdcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueCAtIGFyYy5jZW50cmUueCApICsgY29zVGhldGFcbiAgICAqICggYXJjLnN0YXJ0UG9pbnQueSAtIGFyYy5jZW50cmUueSApO1xuXG4gIGNvbnN0IGEgPSBkaXN0YW5jZSggeFBvcywgeVBvcywgYXJjLmVuZFBvaW50LngsIGFyYy5lbmRQb2ludC55ICk7XG4gIGNvbnN0IGIgPSBkaXN0YW5jZSggeE5lZywgeU5lZywgYXJjLmVuZFBvaW50LngsIGFyYy5lbmRQb2ludC55ICk7XG5cbiAgcmV0dXJuICggYSA8IGIgKSA/IHsgeDogeFBvcywgeTogeVBvcywgejogMCB9IDogeyB4OiB4TmVnLCB5OiB5TmVnLCB6OiAwIH07XG59O1xuXG4vLyBjYWxjdWxhdGUgdGhlIG5vcm1hbCB2ZWN0b3IgZ2l2ZW4gMiBwb2ludHNcbi8vIGV4cG9ydCBjb25zdCBub3JtYWxWZWN0b3IgPSAoIHgxLCB5MSwgeDIsIHkyICkgPT4ge1xuLy8gICBjb25zdCBkID0gZGlzdGFuY2UoIHgxLCB5MSwgeDIsIHkyICk7XG4vLyAgIHYxLnNldCggKCB4MiAtIHgxICkgLyBkLCAoIHkyIC0geTEgKSAvIGQsIDAgKTtcbi8vICAgcmV0dXJuIHYxO1xuLy8gICAvLyB7IHg6ICggeDIgLSB4MSApIC8gZCwgeTogKCB5MiAtIHkxICkgLyBkLCB6OiAwIH07XG4vLyB9O1xuXG4vLyBmaW5kIHRoZSBwb2ludCBhdCBhIGRpc3RhbmNlIGZyb20gcG9pbnQxIGFsb25nIGxpbmUgZGVmaW5lZCBieSBwb2ludDEsIHBvaW50Mixcbi8vIGluIHRoZSBkaXJlY3Rpb24gb2YgcG9pbnQyXG5leHBvcnQgY29uc3QgZGlyZWN0ZWRTcGFjZWRQb2ludE9uTGluZSA9ICggeDEsIHkxLCB4MiwgeTIsIHNwYWNpbmcgKSA9PiB7XG4gIGNvbnN0IGQgPSBkaXN0YW5jZSggeDEsIHkxLCB4MiwgeTIgKTtcbiAgLy8gY29uc3QgZHYgPSBub3JtYWxWZWN0b3IoIHgxLCB5MSwgeDIsIHkyICk7XG4gIHJldHVybiB7XG4gICAgeDogeDEgKyBzcGFjaW5nICogKCB4MiAtIHgxICkgLyBkLFxuICAgIHk6IHkxICsgc3BhY2luZyAqICggeTIgLSB5MSApIC8gZCxcbiAgICB6OiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5TWF0cmljZXMgPSAoIG0xLCBtMiApID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoIGxldCBpID0gMDsgaSA8IG0xLmxlbmd0aDsgaSsrICkge1xuICAgIHJlc3VsdFtpXSA9IFtdO1xuICAgIGZvciAoIGxldCBqID0gMDsgaiA8IG0yWzBdLmxlbmd0aDsgaisrICkge1xuICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICBmb3IgKCBsZXQgayA9IDA7IGsgPCBtMVswXS5sZW5ndGg7IGsrKyApIHtcbiAgICAgICAgc3VtICs9IG0xW2ldW2tdICogbTJba11bal07XG4gICAgICB9XG4gICAgICByZXN1bHRbaV1bal0gPSBzdW07XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBjcmVhdGUgbnhuIGlkZW50aXR5TWF0cml4XG5leHBvcnQgY29uc3QgaWRlbnRpdHlNYXRyaXggPSBuID0+XG4gIEFycmF5KCAuLi5uZXcgQXJyYXkoIG4gKSApLm1hcCggKCB4LCBpLCBhICkgPT5cbiAgICBhLm1hcCggKCB5LCBrICkgPT4ge1xuICAgICAgcmV0dXJuICggaSA9PT0gayApID8gMSA6IDA7XG4gICAgfSApLFxuICApO1xuXG5leHBvcnQgY29uc3QgaHlwZXJib2xvaWRDcm9zc1Byb2R1Y3QgPSAoIHgxLCB5MSwgejEsIHgyLCB5MiwgejIgKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDogeTEgKiB6MiAtIHoxICogeTIsXG4gICAgeTogejEgKiB4MiAtIHgxICogejIsXG4gICAgejogLXgxICogeTIgKyB5MSAqIHgyLFxuICB9O1xufVxuXG5leHBvcnQgY29uc3QgcG9pbmNhcmVUb0h5cGVyYm9sb2lkID0gKCB4LCB5ICkgPT4ge1xuICBjb25zdCBmYWN0b3IgPSAxIC8gKCAxIC0geCAqIHggLSB5ICogeSApO1xuICByZXR1cm4geyBcbiAgICB4OiAyICogZmFjdG9yICogeCxcbiAgICB5OiAyICogZmFjdG9yICogeSxcbiAgICB6OiBmYWN0b3IgKiAoIDEgKyB4ICogeCArIHkgKiB5ICksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaHlwZXJib2xvaWRUb1BvaW5jYXJlID0gKCB4LCB5LCB6ICkgPT4ge1xuICBjb25zdCBmYWN0b3IgPSAxIC8gKCAxICsgeiApO1xuICByZXR1cm4geyBcbiAgICB4OiBmYWN0b3IgKiB4LFxuICAgIHk6IGZhY3RvciAqIHksXG4gICAgejogMCxcbiAgfTtcbn07XG5cbi8vIG1vdmUgdGhlIHBvaW50IHRvIGh5cGVyYm9sb2lkIChXZWllcnN0cmFzcykgc3BhY2UsIGFwcGx5IHRoZSB0cmFuc2Zvcm0sIHRoZW4gbW92ZSBiYWNrXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtUG9pbnQgPSAoIHRyYW5zZm9ybSwgeCwgeSApID0+IHtcbiAgY29uc3QgbWF0ID0gdHJhbnNmb3JtLm1hdHJpeDtcbiAgY29uc3QgcCA9IHBvaW5jYXJlVG9IeXBlcmJvbG9pZCggeCwgeSApO1xuICBjb25zdCB4VCA9IHAueCAqIG1hdFswXVswXSArIHAueSAqIG1hdFswXVsxXSArIHAueiAqIG1hdFswXVsyXTtcbiAgY29uc3QgeVQgPSBwLnggKiBtYXRbMV1bMF0gKyBwLnkgKiBtYXRbMV1bMV0gKyBwLnogKiBtYXRbMV1bMl07XG4gIGNvbnN0IHpUID0gcC54ICogbWF0WzJdWzBdICsgcC55ICogbWF0WzJdWzFdICsgcC56ICogbWF0WzJdWzJdO1xuXG4gIHJldHVybiBoeXBlcmJvbG9pZFRvUG9pbmNhcmUoIHhULCB5VCwgelQgKTtcbn07XG5cbi8vIGFyZSB0aGUgYW5nbGVzIGFscGhhLCBiZXRhIGluIGNsb2Nrd2lzZSBvcmRlciBvbiB1bml0IGRpc2s/XG4vLyBleHBvcnQgY29uc3QgY2xvY2t3aXNlID0gKCBhbHBoYSwgYmV0YSApID0+IHtcbi8vICAgLy8gbGV0IGN3ID0gdHJ1ZTtcbi8vICAgY29uc3QgYSA9ICggYmV0YSA+IDMgKiBNYXRoLlBJIC8gMiAmJiBhbHBoYSA8IE1hdGguUEkgLyAyICk7XG4vLyAgIGNvbnN0IGIgPSAoIGJldGEgLSBhbHBoYSA+IE1hdGguUEkgKTtcbi8vICAgY29uc3QgYyA9ICggKCBhbHBoYSA+IGJldGEgKSAmJiAhKCBhbHBoYSAtIGJldGEgPiBNYXRoLlBJICkgKTtcbi8vICAgLy8gaWYgKGEgfHwgYiB8fCBjKSB7XG4vLyAgICAgLy8gY3cgPSBmYWxzZTtcbi8vICAgLy8gfVxuLy8gICAvLyByZXR1cm4gKGEgfHwgYiB8fCBjKSA/IGZhbHNlIDogdHJ1ZTtcbi8vICAgcmV0dXJuICEoIGEgfHwgYiB8fCBjICk7XG4vLyB9O1xuXG4vLyBleHBvcnQgY29uc3QgcmFuZG9tRmxvYXQgPSAoIG1pbiwgbWF4ICkgPT4gTWF0aC5yYW5kb20oKSAqICggbWF4IC0gbWluICkgKyBtaW47XG5cbi8vIGV4cG9ydCBjb25zdCByYW5kb21JbnQgPSAoIG1pbiwgbWF4ICkgPT4gTWF0aC5mbG9vciggTWF0aC5yYW5kb20oKSAqICggbWF4IC0gbWluICsgMSApICsgbWluICk7XG4iLCAiaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjLCBkaXJlY3RlZFNwYWNlZFBvaW50T25MaW5lLCBkaXN0YW5jZSB9IGZyb20gJy4uL3V0aWxpdGllcy9tYXRoRnVuY3Rpb25zLmpzJztcblxuLy8gVGhlIGxvbmdlc3QgZWRnZSB3aXRoIHJhZGl1cyA+IDAgc2hvdWxkIGJlIHVzZWQgdG8gY2FsY3VsYXRlIGhvdyBmaW5lbHlcbi8vIHRoZSBwb2x5Z29uIGdldHMgc3ViZGl2aWRlZFxuZnVuY3Rpb24gZmluZFN1YmRpdmlzaW9uRWRnZSggcG9seWdvbiApIHtcbiAgLy8gY3VydmF0dXJlID09PSAwIG1lYW5zIHRoaXMgZWRnZSBnb2VzIHRocm91Z2ggb3JpZ2luXG4gIC8vIGluIHdoaWNoIGNhc2Ugc3ViZGl2aWRlIGJhc2VkIG9uIG5leHQgbG9uZ2VzdCBlZGdlXG4gIGNvbnN0IGEgPSAoIHBvbHlnb24uZWRnZXNbMF0uY3VydmF0dXJlID09PSAwIClcbiAgICA/IDBcbiAgICA6IHBvbHlnb24uZWRnZXNbMF0uYXJjTGVuZ3RoO1xuICBjb25zdCBiID0gKCBwb2x5Z29uLmVkZ2VzWzFdLmN1cnZhdHVyZSA9PT0gMCApXG4gICAgPyAwXG4gICAgOiBwb2x5Z29uLmVkZ2VzWzFdLmFyY0xlbmd0aDtcbiAgY29uc3QgYyA9ICggcG9seWdvbi5lZGdlc1syXS5jdXJ2YXR1cmUgPT09IDAgKVxuICAgID8gMFxuICAgIDogcG9seWdvbi5lZGdlc1syXS5hcmNMZW5ndGg7XG4gIGlmICggYSA+IGIgJiYgYSA+IGMgKSByZXR1cm4gMDtcbiAgZWxzZSBpZiAoIGIgPiBjICkgcmV0dXJuIDE7XG4gIHJldHVybiAyO1xufVxuXG4vLyBTdWJkaXZpZGUgdGhlIGVkZ2UgaW50byBsZW5ndGhzIGNhbGN1bGF0ZWQgYnkgY2FsY3VsYXRlU3BhY2luZygpXG5mdW5jdGlvbiBzdWJkaXZpZGVIeXBlcmJvbGljQXJjKCBhcmMsIG51bURpdmlzaW9ucyApIHtcbiAgLy8gY2FsY3VsYXRlIHRoZSBzcGFjaW5nIGZvciBzdWJkaXZpZGluZyB0aGUgZWRnZSBpbnRvIGFuIGV2ZW4gbnVtYmVyIG9mIHBpZWNlcy5cbiAgLy8gRm9yIHRoZSBmaXJzdCAoIGxvbmdlc3QgKSBlZGdlIHRoaXMgd2lsbCBiZSBjYWxjdWxhdGVkIGJhc2VkIG9uIHNwYWNpbmdcbiAgLy8gdGhlbiBmb3IgdGhlIHJlc3Qgb2YgdGhlIGVkZ2VzIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mXG4gIC8vIHN1YmRpdmlzaW9ucyBvZiB0aGUgZmlyc3QgZWRnZSAoIHNvIHRoYXQgYWxsIGVkZ2VzIGFyZSBkaXZpZGVkIGludG8gYW4gZXF1YWxcbiAgLy8gbnVtYmVyIG9mIHBpZWNlcylcblxuICAvLyBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgcmVxdWlyZWQgdG8gYnJlYWsgdGhlIGFyYyBpbnRvIGFuXG4gIC8vIGV2ZW4gbnVtYmVyIG9mIHBpZWNlcyAob3IgMSBpbiBjYXNlIG9mIHRpbnkgcG9seWdvbnMpXG5cbiAgbnVtRGl2aXNpb25zID0gbnVtRGl2aXNpb25zIHx8ICggYXJjLmFyY0xlbmd0aCA+IDAuMDAxXG4gICAgPyAyICogTWF0aC5jZWlsKCBhcmMuYXJjTGVuZ3RoICkgLy8gY3VycmVudGx5IGFsd2F5cyA9IDJcbiAgICA6IDEgKTtcblxuICAvLyBjYWxjdWxhdGUgc3BhY2luZyBiYXNlZCBvbiBudW1iZXIgb2YgcG9pbnRzXG4gIGNvbnN0IHNwYWNpbmcgPSBhcmMuYXJjTGVuZ3RoIC8gbnVtRGl2aXNpb25zO1xuXG4gIGNvbnN0IHBvaW50cyA9IFthcmMuc3RhcnRQb2ludF07XG5cbiAgLy8gdGlueSBwZ29ucyBuZWFyIHRoZSBlZGdlcyBvZiB0aGUgZGlzayBkb24ndCBuZWVkIHRvIGJlIHN1YmRpdmlkZWRcbiAgaWYgKCBhcmMuYXJjTGVuZ3RoID4gc3BhY2luZyApIHtcbiAgICBsZXQgcCA9ICggIWFyYy5zdHJhaWdodExpbmUgKVxuICAgICAgPyBkaXJlY3RlZFNwYWNlZFBvaW50T25BcmMoIGFyYywgc3BhY2luZyApXG4gICAgICA6IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIGFyYy5zdGFydFBvaW50LngsIGFyYy5zdGFydFBvaW50LnksIGFyYy5lbmRQb2ludC54LCBhcmMuZW5kUG9pbnQueSwgc3BhY2luZyApO1xuICAgIHBvaW50cy5wdXNoKCBwICk7XG5cbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBudW1EaXZpc2lvbnMgLSAyOyBpKysgKSB7XG4gICAgICBwID0gKCAhYXJjLnN0cmFpZ2h0TGluZSApXG4gICAgICAgID8gZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjKCBhcmMsIHNwYWNpbmcgKVxuICAgICAgICA6IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIHAueCwgcC55LCBhcmMuZW5kUG9pbnQueCwgYXJjLmVuZFBvaW50LnksIHNwYWNpbmcgKTtcbiAgICAgIHBvaW50cy5wdXNoKCBwICk7XG4gICAgfVxuICB9XG4gIC8vIHB1c2ggdGhlIGZpbmFsIHZlcnRleFxuICBwb2ludHMucHVzaCggYXJjLmVuZFBvaW50ICk7XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuLy8gc3ViZGl2aWRlIHRoZSBzdWJkaXZpc2lvbiBlZGdlLCB0aGVuIHN1YmRpdmlkZSB0aGUgb3RoZXIgdHdvIGVkZ2VzIHdpdGggdGhlXG4vLyBzYW1lIG51bWJlciBvZiBwb2ludHMgYXMgdGhlIHN1YmRpdmlzaW9uXG5mdW5jdGlvbiBzdWJkaXZpZGVIeXBlcmJvbGljUG9seWdvbkVkZ2VzKCBwb2x5Z29uICkge1xuICBjb25zdCBzdWJkaXZpc2lvbkVkZ2UgPSBmaW5kU3ViZGl2aXNpb25FZGdlKCBwb2x5Z29uICk7XG5cbiAgY29uc3QgZm9yY2VEaXZpc2lvbnMgPSAzO1xuICBjb25zdCBlZGdlMVBvaW50cyA9IHN1YmRpdmlkZUh5cGVyYm9saWNBcmMoIHBvbHlnb24uZWRnZXNbc3ViZGl2aXNpb25FZGdlXSwgZm9yY2VEaXZpc2lvbnMgKTtcblxuICBjb25zdCBudW1EaXZpc2lvbnMgPSBlZGdlMVBvaW50cy5sZW5ndGggLSAxO1xuXG4gIHBvbHlnb24ubnVtRGl2aXNpb25zID0gbnVtRGl2aXNpb25zO1xuXG4gIGNvbnN0IGVkZ2UyUG9pbnRzID0gc3ViZGl2aWRlSHlwZXJib2xpY0FyYyggcG9seWdvbi5lZGdlc1soIHN1YmRpdmlzaW9uRWRnZSArIDEgKSAlIDNdLCBudW1EaXZpc2lvbnMgKTtcbiAgY29uc3QgZWRnZTNQb2ludHMgPSBzdWJkaXZpZGVIeXBlcmJvbGljQXJjKCBwb2x5Z29uLmVkZ2VzWyggc3ViZGl2aXNpb25FZGdlICsgMiApICUgM10sIG51bURpdmlzaW9ucyApO1xuXG4gIGNvbnN0IGVkZ2VzID0gW107XG5cbiAgZWRnZXNbc3ViZGl2aXNpb25FZGdlXSA9IGVkZ2UxUG9pbnRzO1xuICBlZGdlc1soIHN1YmRpdmlzaW9uRWRnZSArIDEgKSAlIDNdID0gZWRnZTJQb2ludHM7XG4gIGVkZ2VzWyggc3ViZGl2aXNpb25FZGdlICsgMiApICUgM10gPSBlZGdlM1BvaW50cztcblxuICByZXR1cm4gZWRnZXM7XG59XG5cbi8vIEFsdGVybmF0aXZlIHRvIHN1YmRpdmlkZUludGVyaW9yQXJjIHVzaW5nIGxpbmVzIGluc3RlYWQgb2YgYXJjc1xuLy8gKCBxdWFsaXR5IHNlZW1zIHRoZSBzYW1lIGFuZCBtYXkgYmUgZmFzdGVyIClcbmZ1bmN0aW9uIHN1YmRpdmlkZUxpbmUoIHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBudW1EaXZpc2lvbnMsIGFyY0luZGV4ICkge1xuICBjb25zdCBwb2ludHMgPSBbc3RhcnRQb2ludF07XG5cbiAgY29uc3QgZGl2aXNpb25zID0gbnVtRGl2aXNpb25zIC0gYXJjSW5kZXg7XG5cbiAgLy8gaWYgdGhlIGxpbmUgZ2V0IGRpdmlkZWQgYWRkIHBvaW50cyBhbG9uZyBsaW5lIHRvIG1lc2hcbiAgaWYgKCBkaXZpc2lvbnMgPiAxICkge1xuICAgIGNvbnN0IHNwYWNpbmcgPSBkaXN0YW5jZSggc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksIGVuZFBvaW50LngsIGVuZFBvaW50LnkgKSAvICggZGl2aXNpb25zICk7XG4gICAgbGV0IG5leHRQb2ludCA9IGRpcmVjdGVkU3BhY2VkUG9pbnRPbkxpbmUoIHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55LCBzcGFjaW5nICk7XG4gICAgZm9yICggbGV0IGogPSAwOyBqIDwgZGl2aXNpb25zIC0gMTsgaisrICkge1xuICAgICAgcG9pbnRzLnB1c2goIG5leHRQb2ludCApO1xuICAgICAgbmV4dFBvaW50ID0gZGlyZWN0ZWRTcGFjZWRQb2ludE9uTGluZSggbmV4dFBvaW50LngsIG5leHRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55LCBzcGFjaW5nICk7XG4gICAgfVxuICB9XG5cbiAgcG9pbnRzLnB1c2goIGVuZFBvaW50ICk7XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuLy8gR2l2ZW4gYSBoeXBlcmJvbGljIHBvbHlnb24sIHJldHVybiBhbiBhcnJheSByZXByZXNlbnRpbmcgYSBzdWJkaXZpZGVkICB0cmlhbmd1bGFyXG4vLyBtZXNoIGFjcm9zcyBpdCdzIHN1cmZhY2VcbmZ1bmN0aW9uIHN1YmRpdmlkZUh5cGVyYm9saWNQb2x5Z29uKCBwb2x5Z29uICkge1xuICBjb25zdCBzdWJkaXZpZGVkRWRnZXMgPSBzdWJkaXZpZGVIeXBlcmJvbGljUG9seWdvbkVkZ2VzKCBwb2x5Z29uICk7XG5cbiAgY29uc3QgbnVtRGl2aXNpb25zID0gcG9seWdvbi5udW1EaXZpc2lvbnM7XG5cbiAgY29uc3QgcG9pbnRzID0gW10uY29uY2F0KCBzdWJkaXZpZGVkRWRnZXNbMF0gKTtcblxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gdXNpbmcgZmxhdCBhcnJheSBhbmQgZXZlbnR1YWxseSBqdXN0IGltbWVkaWF0ZWx5IHBvcHVsYXRlIHRoZSBGbG9hdDMyQXJyYXlcbiAgLy8gY29uc3QgZmxhdFBvaW50cyA9IFtdO1xuXG4gIC8vIGZvciAoIGxldCBpID0gMDsgaSA8IHN1YmRpdmlkZWRFZGdlc1swXS5sZW5ndGg7IGkrKyApIHtcbiAgLy8gICBmbGF0UG9pbnRzLnB1c2goXG4gIC8vICAgICBzdWJkaXZpZGVkRWRnZXNbMF1baV0ueCxcbiAgLy8gICAgIHN1YmRpdmlkZWRFZGdlc1swXVtpXS55LFxuICAvLyAgICAgc3ViZGl2aWRlZEVkZ2VzWzBdW2ldLnosXG4gIC8vICAgKTtcbiAgLy8gfVxuXG4gIGZvciAoIGxldCBpID0gMTsgaSA8IG51bURpdmlzaW9uczsgaSsrICkge1xuICAgIGNvbnN0IHN0YXJ0UG9pbnQgPSBzdWJkaXZpZGVkRWRnZXNbMl1bKCBudW1EaXZpc2lvbnMgLSBpICldO1xuICAgIGNvbnN0IGVuZFBvaW50ID0gc3ViZGl2aWRlZEVkZ2VzWzFdW2ldO1xuICAgIC8vIHRoaXMuc3ViZGl2aWRlSW50ZXJpb3JBcmMoIHN0YXJ0UG9pbnQsIGVuZFBvaW50LCBpICk7XG4gICAgY29uc3QgbmV3UG9pbnRzID0gc3ViZGl2aWRlTGluZSggc3RhcnRQb2ludCwgZW5kUG9pbnQsIG51bURpdmlzaW9ucywgaSApO1xuXG4gICAgLy8gZm9yICggbGV0IGogPSAwOyBqIDwgbmV3UG9pbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgLy8gICBmbGF0UG9pbnRzLnB1c2goXG4gICAgLy8gICAgIG5ld1BvaW50c1tqXS54LFxuICAgIC8vICAgICBuZXdQb2ludHNbal0ueSxcbiAgICAvLyAgICAgbmV3UG9pbnRzW2pdLnosXG4gICAgLy8gICApO1xuICAgIC8vIH1cblxuICAgIHBvaW50cy5wdXNoKCAuLi5uZXdQb2ludHMgKTtcblxuICB9XG5cbiAgLy8gcHVzaCB0aGUgZmluYWwgdmVydGV4XG4gIHBvaW50cy5wdXNoKCBzdWJkaXZpZGVkRWRnZXNbMl1bMF0gKTtcblxuICAvLyBmbGF0UG9pbnRzLnB1c2goXG4gIC8vICAgc3ViZGl2aWRlZEVkZ2VzWzJdWzBdLngsXG4gIC8vICAgc3ViZGl2aWRlZEVkZ2VzWzJdWzBdLnksXG4gIC8vICAgc3ViZGl2aWRlZEVkZ2VzWzJdWzBdLnosXG4gIC8vICk7XG5cbiAgcmV0dXJuIHBvaW50cztcbn1cblxuLy8gY3JlYXRlIG9uZSBidWZmZXIgZ2VvbWV0cnkgcGVyIG1hdGVyaWFsICh0aWxlIHR5cGUpXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjcmVhdGVHZW9tZXRyaWVzKCB0aWxpbmcgKSB7XG4gIGxldCBwb3NpdGlvbkFJbmRleCA9IDA7XG4gIGxldCB1dkFJbmRleCA9IDA7XG5cbiAgbGV0IHBvc2l0aW9uQkluZGV4ID0gMDtcbiAgbGV0IHV2QkluZGV4ID0gMDtcblxuICBjb25zdCBwb3NpdGlvbnNBID0gW107XG4gIGNvbnN0IHV2c0EgPSBbXTtcblxuICBjb25zdCBwb3NpdGlvbnNCID0gW107XG4gIGNvbnN0IHV2c0IgPSBbXTtcblxuICBmdW5jdGlvbiBjcmVhdGVHZW9tZXRyeSggcG9seWdvbiApIHtcblxuICAgIGNvbnN0IHZlcnRpY2VzID0gc3ViZGl2aWRlSHlwZXJib2xpY1BvbHlnb24oIHBvbHlnb24gKTtcblxuICAgIGNvbnN0IGRpdmlzaW9ucyA9IHBvbHlnb24ubnVtRGl2aXNpb25zIHx8IDE7XG5cbiAgICBmdW5jdGlvbiBhZGRQb3NpdGlvbnNBbmRVdnMoIHBvc2l0aW9ucywgcG9zaXRpb25JbmRleCwgdXZzLCB1dkluZGV4ICkge1xuXG4gICAgICBjb25zdCBwID0gMSAvIGRpdmlzaW9ucztcblxuICAgICAgbGV0IGVkZ2VTdGFydGluZ1ZlcnRleCA9IDA7XG4gICAgICAvLyBsb29wIG92ZXIgZWFjaCBpbnRlcmlvciBlZGdlIG9mIHRoZSBwb2x5Z29uJ3Mgc3ViZGl2aW9uIG1lc2ggYW5kIGNyZWF0ZSBmYWNlcyBhbmQgdXZzXG4gICAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBkaXZpc2lvbnM7IGkrKyApIHtcbiAgICAgICAgLy8gZWRnZSBkaXZpc2lvbnMgcmVkdWNlIGJ5IG9uZSBmb3IgZWFjaCBpbnRlcmlvciBlZGdlXG4gICAgICAgIGNvbnN0IG0gPSBkaXZpc2lvbnMgLSBpICsgMTtcblxuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4XS54O1xuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4XS55O1xuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4XS56O1xuXG4gICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtXS54O1xuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbV0ueTtcbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG1dLno7XG5cblxuICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgMV0ueDtcbiAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIDFdLnk7XG4gICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyAxXS56O1xuXG4gICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSBpICogcDtcbiAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9IDA7XG4gICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGkgKyAxICkgKiBwO1xuICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gMDtcbiAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9ICggaSArIDEgKSAqIHA7XG4gICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSBwO1xuXG4gICAgICAgIC8vIHJhbmdlIG0tMiBiZWNhdXNlIHdlIGFyZSBpZ25vcmluZyB0aGUgZWRnZXMgZmlyc3QgdmVydGV4IHdoaWNoIHdhc1xuICAgICAgICAvLyB1c2VkIGluIHRoZSBwcmV2aW91cyBwb3NpdGlvbnMucHVzaFxuICAgICAgICAvLyBFYWNoIGxvb3AgY3JlYXRlcyAyIGZhY2VzXG4gICAgICAgIGZvciAoIGxldCBqID0gMDsgaiA8IG0gLSAyOyBqKysgKSB7XG5cbiAgICAgICAgICAvLyBGYWNlIDFcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDFdLng7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAxXS55O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMV0uejtcblxuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgal0ueDtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIGpdLnk7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyBqXS56O1xuXG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyAxICsgal0ueDtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIDEgKyBqXS55O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgMSArIGpdLno7XG5cbiAgICAgICAgICAvLyBGYWNlIDJcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDFdLng7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAxXS55O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMV0uejtcblxuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBtICsgMSArIGpdLng7XG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIG0gKyAxICsgal0ueTtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgbSArIDEgKyBqXS56O1xuXG4gICAgICAgICAgcG9zaXRpb25zWyBwb3NpdGlvbkluZGV4KysgXSA9IHZlcnRpY2VzW2VkZ2VTdGFydGluZ1ZlcnRleCArIGogKyAyXS54O1xuICAgICAgICAgIHBvc2l0aW9uc1sgcG9zaXRpb25JbmRleCsrIF0gPSB2ZXJ0aWNlc1tlZGdlU3RhcnRpbmdWZXJ0ZXggKyBqICsgMl0ueTtcbiAgICAgICAgICBwb3NpdGlvbnNbIHBvc2l0aW9uSW5kZXgrKyBdID0gdmVydGljZXNbZWRnZVN0YXJ0aW5nVmVydGV4ICsgaiArIDJdLno7XG5cbiAgICAgICAgICAvLyBGYWNlIDEgdXZzXG4gICAgICAgICAgdXZzW3V2SW5kZXgrK10gPSAoIGkgKyAxICsgaiApICogcDtcbiAgICAgICAgICB1dnNbdXZJbmRleCsrXSA9ICggMSArIGogKSAqIHA7XG4gICAgICAgICAgdXZzW3V2SW5kZXgrK10gPSAoIGkgKyAxICsgaiApICogcDtcbiAgICAgICAgICB1dnNbdXZJbmRleCsrXSA9IGogKiBwO1xuICAgICAgICAgIHV2c1t1dkluZGV4KytdID0gKCBpICsgaiArIDIgKSAqIHA7XG4gICAgICAgICAgdXZzW3V2SW5kZXgrK10gPSAoIGogKyAxICkgKiBwO1xuXG4gICAgICAgICAgLy8gRmFjZSAyIHV2c1xuICAgICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGkgKyAxICsgaiApICogcDtcbiAgICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gKCAxICsgaiApICogcDtcbiAgICAgICAgICB1dnNbIHV2SW5kZXgrKyBdID0gKCBpICsgMiArIGogKSAqIHA7XG4gICAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9ICggaiArIDEgKSAqIHA7XG4gICAgICAgICAgdXZzWyB1dkluZGV4KysgXSA9ICggaSArIGogKyAyICkgKiBwO1xuICAgICAgICAgIHV2c1sgdXZJbmRleCsrIF0gPSAoIGogKyAyICkgKiBwO1xuXG4gICAgICAgIH1cbiAgICAgICAgZWRnZVN0YXJ0aW5nVmVydGV4ICs9IG07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBbIHBvc2l0aW9uSW5kZXgsIHV2SW5kZXggXTtcbiAgICB9XG5cbiAgICBpZiAoIHBvbHlnb24ubWF0ZXJpYWxJbmRleCA9PT0gMCApIHtcbiAgICAgIFsgcG9zaXRpb25BSW5kZXgsIHV2QUluZGV4IF0gPSBhZGRQb3NpdGlvbnNBbmRVdnMoIHBvc2l0aW9uc0EsIHBvc2l0aW9uQUluZGV4LCB1dnNBLCB1dkFJbmRleCApO1xuICAgIH0gZWxzZSB7XG4gICAgICBbIHBvc2l0aW9uQkluZGV4LCB1dkJJbmRleCBdID0gYWRkUG9zaXRpb25zQW5kVXZzKCBwb3NpdGlvbnNCLCBwb3NpdGlvbkJJbmRleCwgdXZzQiwgdXZCSW5kZXggKTtcbiAgICB9XG5cbiAgfVxuXG4gIGNvbnN0IGJ1ZmZlckdlb21ldHJ5QSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xuICBjb25zdCBidWZmZXJHZW9tZXRyeUIgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcblxuICBmb3IgKCBsZXQgaSA9IDA7IGkgPCB0aWxpbmcubGVuZ3RoOyBpKysgKSB7XG4gICAgY3JlYXRlR2VvbWV0cnkoIHRpbGluZ1tpXSApO1xuICB9XG5cbiAgYnVmZmVyR2VvbWV0cnlBLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uc0EsIDMgKSApO1xuICBidWZmZXJHZW9tZXRyeUEuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzQSwgMiApICk7XG5cbiAgYnVmZmVyR2VvbWV0cnlCLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uc0IsIDMgKSApO1xuICBidWZmZXJHZW9tZXRyeUIuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgVEhSRUUuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzQiwgMiApICk7XG5cbiAgcmV0dXJuIFtidWZmZXJHZW9tZXRyeUEsIGJ1ZmZlckdlb21ldHJ5Ql07XG59XG5cbi8vIGZpbmQgdGhlIHBvaW50cyBhbG9uZyB0aGUgYXJjIGJldHdlZW4gb3Bwb3NpdGUgc3ViZGl2aW9ucyBvZiB0aGUgc2Vjb25kIHR3b1xuLy8gZWRnZXMgb2YgdGhlIHBvbHlnb24uIEVhY2ggc3Vic2VxdWVudCBhcmMgd2lsbCBoYXZlIG9uZSBsZXNzIHN1YmRpdmlzaW9uXG4vLyBmdW5jdGlvbiBzdWJkaXZpZGVJbnRlcmlvckFyYyggc3RhcnRQb2ludCwgZW5kUG9pbnQsIGFyY0luZGV4ICkge1xuLy8gICBjb25zdCBhcmMgPSBuZXcgSHlwZXJib2xpY0FyYyggc3RhcnRQb2ludCwgZW5kUG9pbnQgKTtcbi8vICAgdGhpcy5tZXNoLnB1c2goIHN0YXJ0UG9pbnQgKTtcblxuLy8gICAvLyBmb3IgZWFjaCBhcmMsIHRoZSBudW1iZXIgb2YgZGl2aXNpb25zIHdpbGwgYmUgcmVkdWNlZCBieSBvbmVcbi8vICAgY29uc3QgZGl2aXNpb25zID0gdGhpcy5udW1EaXZpc2lvbnMgLSBhcmNJbmRleDtcblxuLy8gICAvLyBpZiB0aGUgbGluZSBnZXQgZGl2aWRlZCBhZGQgcG9pbnRzIGFsb25nIGxpbmUgdG8gbWVzaFxuLy8gICBpZiAoIGRpdmlzaW9ucyA+IDEgKSB7XG4vLyAgICAgY29uc3Qgc3BhY2luZyA9IGRpc3RhbmNlKCBzdGFydFBvaW50LngsIHN0YXJ0UG9pbnQueSwgZW5kUG9pbnQueCwgZW5kUG9pbnQueSApIC8gKCBkaXZpc2lvbnMgKTtcbi8vICAgICBsZXQgbmV4dFBvaW50ID0gZGlyZWN0ZWRTcGFjZWRQb2ludE9uQXJjKCBhcmMsIHNwYWNpbmcgKTtcbi8vICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCBkaXZpc2lvbnMgLSAxOyBqKysgKSB7XG4vLyAgICAgICB0aGlzLm1lc2gucHVzaCggbmV4dFBvaW50ICk7XG4vLyAgICAgICBuZXh0UG9pbnQgPSBkaXJlY3RlZFNwYWNlZFBvaW50T25BcmMoIGFyYywgc3BhY2luZyApO1xuLy8gICAgIH1cbi8vICAgfVxuXG4vLyAgIHRoaXMubWVzaC5wdXNoKCBlbmRQb2ludCApO1xuLy8gfVxuIiwgImltcG9ydCB7IGRpc3RhbmNlLCBhcmNMZW5ndGgsIHRocm91Z2hPcmlnaW4sIHBvaW5jYXJlVG9IeXBlcmJvbG9pZCwgaHlwZXJib2xvaWRDcm9zc1Byb2R1Y3QsIHRyYW5zZm9ybVBvaW50IH0gZnJvbSAnLi9tYXRoRnVuY3Rpb25zLmpzJztcblxuLy8gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuLy8gKlxuLy8gKiAgSFlQRVJCT0xJQyBBUkMgQ0xBU1Ncbi8vICogIFJlcHJlc2VudHMgYSBoeXBlcmJvbGljIGFyYyBvbiB0aGUgUG9pbmNhcmUgZGlzaywgd2hpY2ggaXMgYVxuLy8gKiAgRXVjbGlkZWFuIHN0cmFpZ2h0IGxpbmUgaWYgaXQgZ29lcyB0aHJvdWdoIHRoZSBvcmlnaW5cbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuY2xhc3MgSHlwZXJib2xpY0FyYyB7XG4gIGNvbnN0cnVjdG9yKCBzdGFydFBvaW50LCBlbmRQb2ludCApIHtcbiAgICB0aGlzLnN0YXJ0UG9pbnQgPSBzdGFydFBvaW50O1xuICAgIHRoaXMuZW5kUG9pbnQgPSBlbmRQb2ludDtcblxuICAgIGlmICggdGhyb3VnaE9yaWdpbiggc3RhcnRQb2ludC54LCBzdGFydFBvaW50LnksIGVuZFBvaW50LngsIGVuZFBvaW50LnkgKSApIHtcbiAgICAgIHRoaXMuc3RyYWlnaHRMaW5lID0gdHJ1ZTtcbiAgICAgIHRoaXMuYXJjTGVuZ3RoID0gZGlzdGFuY2UoIHN0YXJ0UG9pbnQueCwgc3RhcnRQb2ludC55LCBlbmRQb2ludC54LCBlbmRQb2ludC55ICk7XG4gICAgICB0aGlzLmN1cnZhdHVyZSA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FsY3VsYXRlQXJjKCk7XG4gICAgICB0aGlzLmFyY0xlbmd0aCA9IGFyY0xlbmd0aCggdGhpcy5yYWRpdXMsIHRoaXMuc3RhcnRBbmdsZSwgdGhpcy5lbmRBbmdsZSApO1xuICAgICAgdGhpcy5jdXJ2YXR1cmUgPSAoIHRoaXMuYXJjTGVuZ3RoICkgLyAoIHRoaXMucmFkaXVzICk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBhcmMgdXNpbmcgRHVuaGFtJ3MgbWV0aG9kXG4gIGNhbGN1bGF0ZUFyYygpIHtcbiAgICAvLyBjYWxjdWxhdGUgY2VudHJlIG9mIHRoZSBjaXJjbGUgdGhlIGFyYyBsaWVzIG9uIHJlbGF0aXZlIHRvIHVuaXQgZGlza1xuICAgIGNvbnN0IGEgPSBwb2luY2FyZVRvSHlwZXJib2xvaWQoIHRoaXMuc3RhcnRQb2ludC54LCB0aGlzLnN0YXJ0UG9pbnQueSApO1xuICAgIGNvbnN0IGIgPSBwb2luY2FyZVRvSHlwZXJib2xvaWQoIHRoaXMuZW5kUG9pbnQueCwgdGhpcy5lbmRQb2ludC55ICk7XG4gICAgY29uc3QgaHAgPSBoeXBlcmJvbG9pZENyb3NzUHJvZHVjdCggYS54LCBhLnksIGEueiwgYi54LCBiLnksIGIueiApO1xuXG4gICAgY29uc3QgYXJjQ2VudHJlID0geyB4OiBocC54IC8gaHAueiwgeTogaHAueSAvIGhwLnosIHo6IDAgfTtcbiAgICBjb25zdCBhcmNSYWRpdXMgPSBNYXRoLnNxcnQoXG4gICAgICAoIHRoaXMuc3RhcnRQb2ludC54IC0gYXJjQ2VudHJlLnggKSAqICggdGhpcy5zdGFydFBvaW50LnggLSBhcmNDZW50cmUueCApXG4gICAgICArICggdGhpcy5zdGFydFBvaW50LnkgLSBhcmNDZW50cmUueSApICogKCB0aGlzLnN0YXJ0UG9pbnQueSAtIGFyY0NlbnRyZS55ICksXG4gICAgKTtcblxuICAgIC8vIHRyYW5zbGF0ZSBwb2ludHMgdG8gb3JpZ2luIGFuZCBjYWxjdWxhdGUgYXJjdGFuXG4gICAgdGhpcy5zdGFydEFuZ2xlID0gTWF0aC5hdGFuMihcbiAgICAgIHRoaXMuc3RhcnRQb2ludC55IC0gYXJjQ2VudHJlLnksXG4gICAgICB0aGlzLnN0YXJ0UG9pbnQueCAtIGFyY0NlbnRyZS54LFxuICAgICk7XG4gICAgdGhpcy5lbmRBbmdsZSA9IE1hdGguYXRhbjIoXG4gICAgICB0aGlzLmVuZFBvaW50LnkgLSBhcmNDZW50cmUueSxcbiAgICAgIHRoaXMuZW5kUG9pbnQueCAtIGFyY0NlbnRyZS54LFxuICAgICk7XG5cbiAgICAvLyBhbmdsZXMgYXJlIGluICgtcGksIHBpKSwgdHJhbnNmb3JtIHRvICgwLDJwaSlcbiAgICB0aGlzLnN0YXJ0QW5nbGUgPSAoIHRoaXMuc3RhcnRBbmdsZSA8IDAgKVxuICAgICAgICAgICAgICAgICAgICAgID8gMiAqIE1hdGguUEkgKyB0aGlzLnN0YXJ0QW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuc3RhcnRBbmdsZTtcbiAgICB0aGlzLmVuZEFuZ2xlID0gKCB0aGlzLmVuZEFuZ2xlIDwgMCApXG4gICAgICAgICAgICAgICAgICAgICAgPyAyICogTWF0aC5QSSArIHRoaXMuZW5kQW5nbGVcbiAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuZW5kQW5nbGU7XG5cbiAgICB0aGlzLmNlbnRyZSA9IGFyY0NlbnRyZTtcbiAgICB0aGlzLnJhZGl1cyA9IGFyY1JhZGl1cztcbiAgfVxuXG59XG5cbi8vICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICpcbi8vICogIChUUklBTkdVTEFSKSBIWVBFUkJPTElDIFBPTFlHT04gQ0xBU1Ncbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vIE5PVEU6IHNvbWV0aW1lcyBwb2x5Z29ucyB3aWxsIGJlIGJhY2t3YXJkcyBmYWNpbmcuIFNvbHZlZCB3aXRoIERvdWJsZVNpZGUgbWF0ZXJpYWxcbi8vIGJ1dCBtYXkgY2F1c2UgcHJvYmxlbXNcbi8vIG1hdGVyaWFsSW5kZXg6IHdoaWNoIHRpbGUgdG8gdXNlXG5leHBvcnQgY2xhc3MgSHlwZXJib2xpY1BvbHlnb24ge1xuICBjb25zdHJ1Y3RvciggdmVydGljZXMsIG1hdGVyaWFsSW5kZXggPSAwICkge1xuXG4gICAgdGhpcy5tYXRlcmlhbEluZGV4ID0gbWF0ZXJpYWxJbmRleDtcbiAgICB0aGlzLnZlcnRpY2VzID0gdmVydGljZXM7XG5cbiAgICB0aGlzLmVkZ2VzID0gW1xuICAgICAgbmV3IEh5cGVyYm9saWNBcmMoIHRoaXMudmVydGljZXNbMF0sIHRoaXMudmVydGljZXNbMV0gKSxcbiAgICAgIG5ldyBIeXBlcmJvbGljQXJjKCB0aGlzLnZlcnRpY2VzWzFdLCB0aGlzLnZlcnRpY2VzWzJdICksXG4gICAgICBuZXcgSHlwZXJib2xpY0FyYyggdGhpcy52ZXJ0aWNlc1syXSwgdGhpcy52ZXJ0aWNlc1swXSApLFxuICAgIF07XG4gIH1cblxuICAvLyBBcHBseSBhIFRyYW5zZm9ybSB0byB0aGUgcG9seWdvblxuICB0cmFuc2Zvcm0oIHRyYW5zZm9ybSwgbWF0ZXJpYWxJbmRleCA9IHRoaXMubWF0ZXJpYWxJbmRleCApIHtcbiAgICBjb25zdCBuZXdWZXJ0aWNlcyA9IFtdO1xuICAgIGZvciAoIGxldCBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgICBuZXdWZXJ0aWNlcy5wdXNoKCB0cmFuc2Zvcm1Qb2ludCggdHJhbnNmb3JtLCB0aGlzLnZlcnRpY2VzW2ldLngsIHRoaXMudmVydGljZXNbaV0ueSApICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBIeXBlcmJvbGljUG9seWdvbiggbmV3VmVydGljZXMsIG1hdGVyaWFsSW5kZXggKTtcbiAgfVxufVxuIiwgImltcG9ydCB7IGlkZW50aXR5TWF0cml4LCBtdWx0aXBseU1hdHJpY2VzIH0gZnJvbSAnLi9tYXRoRnVuY3Rpb25zLmpzJztcblxuLy8gVE9ETyBEb2N1bWVudCB0aGVzZSBjbGFzc2VzXG4vLyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4vLyAqXG4vLyAqICBUUkFOU0ZPUk0gQ0xBU1Ncbi8vICogIFJlcHJlc2VudHMgYSB0cmFuc2Zvcm1hdGlvbiBvZiBhIHBvaW50IGluIGh5cGVyYm9saWMgc3BhY2Vcbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbmV4cG9ydCBjbGFzcyBIeXBlcmJvbGljVHJhbnNmb3JtIHtcbiAgY29uc3RydWN0b3IoIG1hdHJpeCwgb3JpZW50YXRpb24sIHBvc2l0aW9uICkge1xuICAgIHRoaXMubWF0cml4ID0gbWF0cml4IHx8IGlkZW50aXR5TWF0cml4KCAzICk7XG4gICAgdGhpcy5vcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uO1xuICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbiB8fCBmYWxzZTsgLy8gcG9zaXRpb24gbm90IGFsd2F5cyByZXF1aXJlZFxuICB9XG5cbiAgbXVsdGlwbHkoIHRyYW5zZm9ybSApIHtcbiAgICBpZiAoICEoIHRyYW5zZm9ybSBpbnN0YW5jZW9mIEh5cGVyYm9saWNUcmFuc2Zvcm0gKSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoIGBFcnJvcjogJHt0cmFuc2Zvcm19IGlzIG5vdCBhIEh5cGVyYm9saWNUcmFuc2Zvcm1gICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG1hdCA9IG11bHRpcGx5TWF0cmljZXMoIHRyYW5zZm9ybS5tYXRyaXgsIHRoaXMubWF0cml4ICk7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0cmFuc2Zvcm0ucG9zaXRpb247XG4gICAgbGV0IG9yaWVudGF0aW9uID0gMTsgLy8gcm90YXRpb25cbiAgICBpZiAoIHRyYW5zZm9ybS5vcmllbnRhdGlvbiAqIHRoaXMub3JpZW50YXRpb24gPCAwICkge1xuICAgICAgb3JpZW50YXRpb24gPSAtMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBIeXBlcmJvbGljVHJhbnNmb3JtKCBtYXQsIG9yaWVudGF0aW9uLCBwb3NpdGlvbiApO1xuICB9XG59XG5cbi8vICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICpcbi8vICogIFRSQU5TRk9STUFUSU9OUyBDTEFTU1xuLy8gKlxuLy8gKlxuLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5leHBvcnQgY2xhc3MgSHlwZXJib2xpY1RyYW5zZm9ybWF0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCBwLCBxICkge1xuICAgIHRoaXMucCA9IHA7XG4gICAgdGhpcy5xID0gcTtcblxuICAgIHRoaXMuaW5pdEh5cG90ZW51c2VSZWZsZWN0aW9uKCk7XG4gICAgdGhpcy5pbml0RWRnZVJlZmxlY3Rpb24oKTtcbiAgICB0aGlzLmluaXRFZGdlQmlzZWN0b3JSZWZsZWN0aW9uKCk7XG5cbiAgICB0aGlzLnJvdDIgPSBtdWx0aXBseU1hdHJpY2VzKCB0aGlzLmVkZ2VSZWZsZWN0aW9uLm1hdHJpeCwgdGhpcy5lZGdlQmlzZWN0b3JSZWZsZWN0aW9uLm1hdHJpeCApO1xuXG4gICAgdGhpcy5pbml0UGdvblJvdGF0aW9ucygpO1xuICAgIHRoaXMuaW5pdEVkZ2VzKCk7XG4gICAgdGhpcy5pbml0RWRnZVRyYW5zZm9ybXMoKTtcblxuICAgIHRoaXMuaWRlbnRpdHkgPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggaWRlbnRpdHlNYXRyaXgoIDMgKSApO1xuICB9XG5cbiAgLy8gcmVmbGVjdCBhY3Jvc3MgdGhlIGh5cG90ZW51c2Ugb2YgdGhlIGZ1bmRhbWVudGFsIHJlZ2lvbiBvZiBhIHRlc3NlbGF0aW9uXG4gIGluaXRIeXBvdGVudXNlUmVmbGVjdGlvbigpIHtcbiAgICB0aGlzLmh5cFJlZmxlY3Rpb24gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggaWRlbnRpdHlNYXRyaXgoIDMgKSwgLTEgKTtcbiAgICB0aGlzLmh5cFJlZmxlY3Rpb24ubWF0cml4WzBdWzBdID0gTWF0aC5jb3MoIDIgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgdGhpcy5oeXBSZWZsZWN0aW9uLm1hdHJpeFswXVsxXSA9IE1hdGguc2luKCAyICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIHRoaXMuaHlwUmVmbGVjdGlvbi5tYXRyaXhbMV1bMF0gPSBNYXRoLnNpbiggMiAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICB0aGlzLmh5cFJlZmxlY3Rpb24ubWF0cml4WzFdWzFdID0gLU1hdGguY29zKCAyICogTWF0aC5QSSAvIHRoaXMucCApO1xuICB9XG5cbiAgLy8gcmVmbGVjdCBhY3Jvc3MgdGhlIGZpcnN0IGVkZ2Ugb2YgdGhlIHBvbHlnb24gKHdoaWNoIGNyb3NzZXMgdGhlIHJhZGl1c1xuICAvLyAoMCwwKSAtPiAoMCwxKSBvbiB1bml0IGRpc2spLiBDb21iaW5lZCB3aXRoIHJvdGF0aW9ucyB3ZSBjYW4gcmVmbGVjdFxuICAvLyBhY3Jvc3MgYW55IGVkZ2VcbiAgaW5pdEVkZ2VSZWZsZWN0aW9uKCkge1xuICAgIGNvbnN0IGNvc3AgPSBNYXRoLmNvcyggTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIGNvbnN0IHNpbnAgPSBNYXRoLnNpbiggTWF0aC5QSSAvIHRoaXMucCApO1xuICAgIGNvbnN0IGNvczJwID0gTWF0aC5jb3MoIDIgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgY29uc3Qgc2luMnAgPSBNYXRoLnNpbiggMiAqIE1hdGguUEkgLyB0aGlzLnAgKTtcblxuICAgIGNvbnN0IGNvc2hxID0gTWF0aC5jb3MoIE1hdGguUEkgLyB0aGlzLnEgKSAvIHNpbnA7XG4gICAgY29uc3Qgc2luaHEgPSBNYXRoLnNxcnQoIGNvc2hxICogY29zaHEgLSAxICk7XG5cbiAgICBjb25zdCBjb3NoMnEgPSAyICogY29zaHEgKiBjb3NocSAtIDE7XG4gICAgY29uc3Qgc2luaDJxID0gMiAqIHNpbmhxICogY29zaHE7XG4gICAgY29uc3QgbnVtID0gMjtcbiAgICBjb25zdCBkZW4gPSA2O1xuICAgIHRoaXMuZWRnZVJlZmxlY3Rpb24gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggaWRlbnRpdHlNYXRyaXgoIDMgKSwgLTEgKTtcbiAgICB0aGlzLmVkZ2VSZWZsZWN0aW9uLm1hdHJpeFswXVswXSA9IC1jb3NoMnE7XG4gICAgdGhpcy5lZGdlUmVmbGVjdGlvbi5tYXRyaXhbMF1bMl0gPSBzaW5oMnE7XG4gICAgdGhpcy5lZGdlUmVmbGVjdGlvbi5tYXRyaXhbMl1bMF0gPSAtc2luaDJxO1xuICAgIHRoaXMuZWRnZVJlZmxlY3Rpb24ubWF0cml4WzJdWzJdID0gY29zaDJxO1xuICB9XG5cbiAgaW5pdEVkZ2VCaXNlY3RvclJlZmxlY3Rpb24oKSB7XG4gICAgdGhpcy5lZGdlQmlzZWN0b3JSZWZsZWN0aW9uID0gbmV3IEh5cGVyYm9saWNUcmFuc2Zvcm0oIGlkZW50aXR5TWF0cml4KCAzICksIC0xICk7XG4gICAgdGhpcy5lZGdlQmlzZWN0b3JSZWZsZWN0aW9uLm1hdHJpeFsxXVsxXSA9IC0xO1xuICB9XG5cbiAgLy8gc2V0IHVwIGNsb2Nrd2lzZSBhbmQgYW50aWNsb2Nrd2lzZSByb3RhdGlvbnMgd2hpY2ggd2lsbCByb3RhdGUgYnlcbiAgLy8gUEkvKG51bWJlciBvZiBzaWRlcyBvZiBjZW50cmFsIHBvbHlnb24pXG4gIGluaXRQZ29uUm90YXRpb25zKCkge1xuICAgIHRoaXMucm90YXRlUG9seWdvbkNXID0gW107XG4gICAgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXID0gW107XG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5wOyBpKysgKSB7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DV1tpXSA9IG5ldyBIeXBlcmJvbGljVHJhbnNmb3JtKCBpZGVudGl0eU1hdHJpeCggMyApLCAxICk7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DV1tpXS5tYXRyaXhbMF1bMF0gPSBNYXRoLmNvcyggMiAqIGkgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DV1tpXS5tYXRyaXhbMF1bMV0gPSAtTWF0aC5zaW4oIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0ubWF0cml4WzFdWzBdID0gTWF0aC5zaW4oIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0ubWF0cml4WzFdWzFdID0gTWF0aC5jb3MoIDIgKiBpICogTWF0aC5QSSAvIHRoaXMucCApO1xuXG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbaV0gPSBuZXcgSHlwZXJib2xpY1RyYW5zZm9ybSggaWRlbnRpdHlNYXRyaXgoIDMgKSwgMSApO1xuICAgICAgdGhpcy5yb3RhdGVQb2x5Z29uQ0NXW2ldLm1hdHJpeFswXVswXSA9IE1hdGguY29zKCAyICogaSAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICAgIHRoaXMucm90YXRlUG9seWdvbkNDV1tpXS5tYXRyaXhbMF1bMV0gPSBNYXRoLnNpbiggMiAqIGkgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgICB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbaV0ubWF0cml4WzFdWzBdID0gLU1hdGguc2luKCAyICogaSAqIE1hdGguUEkgLyB0aGlzLnAgKTtcbiAgICAgIHRoaXMucm90YXRlUG9seWdvbkNDV1tpXS5tYXRyaXhbMV1bMV0gPSBNYXRoLmNvcyggMiAqIGkgKiBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgfVxuICB9XG5cbiAgLy8gb3JpZW50YXRpb246IGVpdGhlciByZWZsZWN0aW9uID0gLTEgT1Igcm90YXRpb24gPSAxXG4gIC8vIE5PVEU6IGhhcmQgY29kZWQgZm9yIENpcmNsZSBMaW1pdCBJXG4gIGluaXRFZGdlcygpIHtcbiAgICB0aGlzLmVkZ2VzID0gW107XG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5wOyBpKysgKSB7XG4gICAgICB0aGlzLmVkZ2VzLnB1c2goIHtcbiAgICAgICAgb3JpZW50YXRpb246IDEsXG4gICAgICAgIGFkamFjZW50RWRnZTogaSxcbiAgICAgIH0gKTtcbiAgICB9XG4gIH1cblxuICBpbml0RWRnZVRyYW5zZm9ybXMoKSB7XG4gICAgdGhpcy5lZGdlVHJhbnNmb3JtcyA9IFtdO1xuXG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5wOyBpKysgKSB7XG4gICAgICBjb25zdCBhZGogPSB0aGlzLmVkZ2VzW2ldLmFkamFjZW50RWRnZTtcbiAgICAgIC8vIENhc2UgMTogcmVmbGVjdGlvblxuICAgICAgaWYgKCB0aGlzLmVkZ2VzW2ldLm9yaWVudGF0aW9uID09PSAtMSApIHtcbiAgICAgICAgbGV0IG1hdCA9IG11bHRpcGx5TWF0cmljZXMoIHRoaXMucm90YXRlUG9seWdvbkNXW2ldLm1hdHJpeCwgdGhpcy5lZGdlUmVmbGVjdGlvbi5tYXRyaXggKTtcbiAgICAgICAgbWF0ID0gbXVsdGlwbHlNYXRyaWNlcyggbWF0LCB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbYWRqXS5tYXRyaXggKTtcbiAgICAgICAgdGhpcy5lZGdlVHJhbnNmb3Jtc1tpXSA9IG5ldyBIeXBlcmJvbGljVHJhbnNmb3JtKCBtYXQgKTtcbiAgICAgIH1cbiAgICAgIC8vIENhc2UgMjogcm90YXRpb25cbiAgICAgIGVsc2UgaWYgKCB0aGlzLmVkZ2VzW2ldLm9yaWVudGF0aW9uID09PSAxICkge1xuICAgICAgICBsZXQgbWF0ID0gbXVsdGlwbHlNYXRyaWNlcyggdGhpcy5yb3RhdGVQb2x5Z29uQ1dbaV0ubWF0cml4LCB0aGlzLnJvdDIgKTtcbiAgICAgICAgbWF0ID0gbXVsdGlwbHlNYXRyaWNlcyggbWF0LCB0aGlzLnJvdGF0ZVBvbHlnb25DQ1dbYWRqXS5tYXRyaXggKTtcbiAgICAgICAgdGhpcy5lZGdlVHJhbnNmb3Jtc1tpXSA9IG5ldyBIeXBlcmJvbGljVHJhbnNmb3JtKCBtYXQgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoICdpbml0RWRnZVRyYW5zZm9ybXMoKTogaW52YWxpZCBvcmllbnRhdGlvbiB2YWx1ZScgKTtcbiAgICAgICAgY29uc29sZS5lcnJvciggdGhpcy5lZGdlc1tpXSApO1xuICAgICAgfVxuICAgICAgdGhpcy5lZGdlVHJhbnNmb3Jtc1tpXS5vcmllbnRhdGlvbiA9IHRoaXMuZWRnZXNbYWRqXS5vcmllbnRhdGlvbjtcbiAgICAgIHRoaXMuZWRnZVRyYW5zZm9ybXNbaV0ucG9zaXRpb24gPSBhZGo7XG4gICAgfVxuICB9XG5cbiAgc2hpZnRUcmFucyggdHJhbnNmb3JtLCBzaGlmdCApIHtcbiAgICBjb25zdCBuZXdFZGdlID0gKCB0cmFuc2Zvcm0ucG9zaXRpb24gKyB0cmFuc2Zvcm0ub3JpZW50YXRpb24gKiBzaGlmdCArIDIgKiB0aGlzLnAgKSAlIHRoaXMucDtcbiAgICBpZiAoIG5ld0VkZ2UgPCAwIHx8IG5ld0VkZ2UgPiAoIHRoaXMucCAtIDEgKSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdFcnJvcjogc2hpZnRUcmFuIG5ld0VkZ2Ugb3V0IG9mIHJhbmdlLicgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRyYW5zZm9ybS5tdWx0aXBseSggdGhpcy5lZGdlVHJhbnNmb3Jtc1tuZXdFZGdlXSApO1xuICB9XG59XG5cbi8vICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICpcbi8vICogIFBBUkFNRVRFUlMgQ0xBU1Ncbi8vICpcbi8vICogIEFkYXB0ZWQgZnJvbSB0aGUgdGFibGUgb24gcGcgMTkgb2YgQWppdCBEYWphcidzIHRoZXNpcyAoU2VlIERvY3VtZW50cyBmb2xkZXIpXG4vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbmV4cG9ydCBjbGFzcyBIeXBlcmJvbGljUGFyYW1ldGVycyB7XG4gIGNvbnN0cnVjdG9yKCBwLCBxICkge1xuICAgIHRoaXMucCA9IHA7XG4gICAgdGhpcy5xID0gcTtcblxuICAgIHRoaXMubWluRXhwb3N1cmUgPSBxIC0gMjtcbiAgICB0aGlzLm1heEV4cG9zdXJlID0gcSAtIDE7XG4gIH1cblxuICBleHBvc3VyZSggbGF5ZXIsIHZlcnRleE51bSwgcGdvbk51bSApIHtcbiAgICBpZiAoIGxheWVyID09PSAwICkge1xuICAgICAgaWYgKCBwZ29uTnVtID09PSAwICkgeyAvLyBsYXllciAwLCBwZ29uIDBcbiAgICAgICAgaWYgKCB0aGlzLnEgPT09IDMgKSByZXR1cm4gdGhpcy5tYXhFeHBvc3VyZTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluRXhwb3N1cmU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5tYXhFeHBvc3VyZTsgLy8gbGF5ZXIgMCwgcGdvbiAhPSAwXG4gICAgfVxuICAgIGlmICggdmVydGV4TnVtID09PSAwICYmIHBnb25OdW0gPT09IDAgKSB7XG4gICAgICByZXR1cm4gdGhpcy5taW5FeHBvc3VyZTtcbiAgICB9IGVsc2UgaWYgKCB2ZXJ0ZXhOdW0gPT09IDAgKSB7XG4gICAgICBpZiAoIHRoaXMucSAhPT0gMyApIHJldHVybiB0aGlzLm1heEV4cG9zdXJlO1xuICAgICAgcmV0dXJuIHRoaXMubWluRXhwb3N1cmU7XG4gICAgfSBlbHNlIGlmICggcGdvbk51bSA9PT0gMCApIHtcbiAgICAgIGlmICggdGhpcy5xICE9PSAzICkgcmV0dXJuIHRoaXMubWluRXhwb3N1cmU7XG4gICAgICByZXR1cm4gdGhpcy5tYXhFeHBvc3VyZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWF4RXhwb3N1cmU7XG4gIH1cblxuICBwU2tpcCggZXhwb3N1cmUgKSB7XG4gICAgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5taW5FeHBvc3VyZSApIHtcbiAgICAgIGlmICggdGhpcy5xICE9PSAzICkgcmV0dXJuIDE7XG4gICAgICByZXR1cm4gMztcbiAgICB9IGVsc2UgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5tYXhFeHBvc3VyZSApIHtcbiAgICAgIGlmICggdGhpcy5wID09PSAzICkgcmV0dXJuIDE7XG4gICAgICBlbHNlIGlmICggdGhpcy5xID09PSAzICkgcmV0dXJuIDI7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvciggJ3BTa2lwOiB3cm9uZyBleHBvc3VyZSB2YWx1ZSEnICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcVNraXAoIGV4cG9zdXJlLCB2ZXJ0ZXhOdW0gKSB7XG4gICAgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5taW5FeHBvc3VyZSApIHtcbiAgICAgIGlmICggdmVydGV4TnVtID09PSAwICkge1xuICAgICAgICBpZiAoIHRoaXMucSAhPT0gMyApIHJldHVybiAtMTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBpZiAoIHRoaXMucCA9PT0gMyApIHJldHVybiAtMTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAoIGV4cG9zdXJlID09PSB0aGlzLm1heEV4cG9zdXJlICkge1xuICAgICAgaWYgKCB2ZXJ0ZXhOdW0gPT09IDAgKSB7XG4gICAgICAgIGlmICggdGhpcy5wID09PSAzIHx8IHRoaXMucSA9PT0gMyApIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvciggJ3FTa2lwOiB3cm9uZyBleHBvc3VyZSB2YWx1ZSEnICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmVydGljZXNUb0RvKCBleHBvc3VyZSApIHtcbiAgICBpZiAoIHRoaXMucCA9PT0gMyApIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5taW5FeHBvc3VyZSApIHtcbiAgICAgIGlmICggdGhpcy5xID09PSAzICkgcmV0dXJuIHRoaXMucCAtIDU7XG4gICAgICByZXR1cm4gdGhpcy5wIC0gMztcbiAgICB9IGVsc2UgaWYgKCBleHBvc3VyZSA9PT0gdGhpcy5tYXhFeHBvc3VyZSApIHtcbiAgICAgIGlmICggdGhpcy5xID09PSAzICkgcmV0dXJuIHRoaXMucCAtIDQ7XG4gICAgICByZXR1cm4gdGhpcy5wIC0gMjtcbiAgICB9XG4gICAgY29uc29sZS5lcnJvciggJ3ZlcnRpY2VzVG9Ebzogd3JvbmcgZXhwb3N1cmUgdmFsdWUhJyApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHBnb25zVG9EbyggZXhwb3N1cmUsIHZlcnRleE51bSApIHtcbiAgICBpZiAoIHRoaXMucSA9PT0gMyApIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKCB2ZXJ0ZXhOdW0gPT09IDAgKSByZXR1cm4gdGhpcy5xIC0gMztcbiAgICBlbHNlIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWluRXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucCA9PT0gMyApIHJldHVybiB0aGlzLnEgLSA0O1xuICAgICAgcmV0dXJuIHRoaXMucSAtIDI7XG4gICAgfSBlbHNlIGlmICggZXhwb3N1cmUgPT09IHRoaXMubWF4RXhwb3N1cmUgKSB7XG4gICAgICBpZiAoIHRoaXMucCA9PT0gMyApIHJldHVybiB0aGlzLnEgLSAzO1xuICAgICAgcmV0dXJuIHRoaXMucSAtIDI7XG4gICAgfVxuICAgIGNvbnNvbGUuZXJyb3IoICdwZ29uc1RvRG86IHdyb25nIGV4cG9zdXJlIHZhbHVlIScgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiIsICJpbXBvcnQge1xuICBIeXBlcmJvbGljUG9seWdvbiBhcyBQb2x5Z29uLFxufVxuZnJvbSAnLi9oeXBlcmJvbGljRW50aXRpZXMuanMnO1xuXG5pbXBvcnQge1xuICAvLyBIeXBlcmJvbGljVHJhbnNmb3JtIGFzIFRyYW5zZm9ybSxcbiAgSHlwZXJib2xpY1RyYW5zZm9ybWF0aW9ucyBhcyBUcmFuc2Zvcm1hdGlvbnMsXG4gIEh5cGVyYm9saWNQYXJhbWV0ZXJzIGFzIFBhcmFtZXRlcnMsXG59XG5mcm9tICcuL2h5cGVyYm9saWNVdGlsaXRpZXMuanMnO1xuXG5cbi8vICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbi8vICogICAgUkVHVUxBUiBIWVBFUkJPTElDIFRFU1NFTEFUSU9OIENMQVNTXG4vLyAqICAgIENyZWF0ZXMgYSByZWd1bGFyIFRlc3NlbGF0aW9uIG9mIHRoZSBQb2luY2FyZSBEaXNrIHVzaW5nIHRoZSB0ZWNobmlxdWVzXG4vLyAqICAgIGNyZWF0ZWQgYnkgQ294ZXRlciBhbmQgRHVuaGFtXG4vLyAqXG4vLyAqICAgIHNwZWMgPSB7XG4vLyAqICAgICAgd2lyZWZyYW1lOiB0cnVlL2ZhbHNlXG4vLyAqICAgICAgcDogbnVtYmVyIG9mIHNpZGVzIG9mIHAtZ29uXG4vLyAqICAgICAgcTogbnVtYmVyIG9mIHAtZ29ucyBtZWV0aW5nIGF0IGVhY2ggdmVydGV4XG4vLyAqICAgICAgdGV4dHVyZXM6IGFycmF5XG4vLyAqICAgICAgZWRnZUFkamFjZW5jeTogWyAobXVsdGlEaW0gYXJyYXkpXG4vLyAqICAgICAgICAgICAgICAgICAgICAgIFtcbi8vICogICAgICAgICAgICAgICAgICAgICAgICBlZGdlXzAgb3JpZW50YXRpb24gKC0xID0gcmVmbGVjdGlvbiwgMSA9IHJvdGF0aW9uKV0sXG4vLyAqICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV8wIGFkamFjZW5jeSAocmFuZ2UgcCAtIDEpXSxcbi8vICogICAgICAgICAgICAgICAgICAgICAgXSxcbi8vICogICAgICAgICAgICAgICAgICAgIC4uLlxuLy8gKiAgICAgICAgICAgICAgICAgICAgICBbZWRnZV9wIG9yaWVudGF0aW9uLCBlZGdlX3AgYWRqYWNlbmN5XVxuLy8gKiAgICAgICAgICAgICAgICAgICAgXSxcbi8vICogICAgICBtaW5Qb2x5Z29uU2l6ZTogc3RvcCBhdCBwb2x5Z29ucyBiZWxvdyB0aGlzIHNpemUsXG4vLyAqICAgIH1cbi8vICpcbi8vICpcbi8vICpcbi8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVndWxhckh5cGVyYm9saWNUZXNzZWxhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKCBzcGVjICkge1xuICAgIHRoaXMud2lyZWZyYW1lID0gc3BlYy53aXJlZnJhbWUgfHwgZmFsc2U7XG4gICAgdGhpcy50ZXh0dXJlcyA9IHNwZWMudGV4dHVyZXM7XG4gICAgdGhpcy5wID0gc3BlYy5wIHx8IDQ7XG4gICAgdGhpcy5xID0gc3BlYy5xIHx8IDY7XG5cbiAgICAvLyBTdG9wIGRyYXdpbmcgd2hlbiBwb2x5Z29ucyByZWFjaCB0aGlzIHNpemUgKG9uIHVuaXQgZGlzaylcbiAgICAvLyBhIHZhbHVlIG9mIGFib3V0IDAuMDIgc2VlbXMgdG8gYmUgdGhlIG1pbmltdW0gdGhhdCB3ZWJnbCBjYW4gaGFuZGxlIGVhc2lseS5cbiAgICB0aGlzLm1pblBvbHlnb25TaXplID0gc3BlYy5taW5Qb2x5Z29uU2l6ZSB8fCAwLjE7XG5cbiAgICBjb25zb2xlLmxvZyggJ3snLCB0aGlzLnAsICcsICcsIHRoaXMucSwgJ30gdGlsaW5nLicgKTtcblxuICAgIHRoaXMucGFyYW1zID0gbmV3IFBhcmFtZXRlcnMoIHRoaXMucCwgdGhpcy5xICk7XG4gICAgdGhpcy50cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybWF0aW9ucyggdGhpcy5wLCB0aGlzLnEgKTtcblxuICAgIGlmICggdGhpcy5jaGVja1BhcmFtcygpICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGZ1bmRhbWVudGFsUmVnaW9uIGNhbGN1bGF0aW9uIHVzaW5nIER1bmhhbSdzIG1ldGhvZFxuICAvLyB0aGlzIGlzIGEgcmlnaHQgYW5nbGUgdHJpYW5nbGUgYWJvdmUgdGhlIHJhZGl1cyBvbiB0aGUgbGluZSAoMCwwKSAtPiAoMCwxKVxuICAvLyBvZiB0aGUgY2VudHJhbCBwb2x5Z29uXG4gIGZ1bmRhbWVudGFsUmVnaW9uKCkge1xuICAgIGNvbnN0IGNvc2gyID0gTWF0aC5jb3QoIE1hdGguUEkgLyB0aGlzLnAgKSAqIE1hdGguY290KCBNYXRoLlBJIC8gdGhpcy5xICk7XG5cbiAgICBjb25zdCBzaW5oMiA9IE1hdGguc3FydCggY29zaDIgKiBjb3NoMiAtIDEgKTtcblxuICAgIGNvbnN0IGNvc2hxID0gTWF0aC5jb3MoIE1hdGguUEkgLyB0aGlzLnEgKSAvIE1hdGguc2luKCBNYXRoLlBJIC8gdGhpcy5wICk7XG4gICAgY29uc3Qgc2luaHEgPSBNYXRoLnNxcnQoIGNvc2hxICogY29zaHEgLSAxICk7XG5cbiAgICBjb25zdCByYWQyID0gc2luaDIgLyAoIGNvc2gyICsgMSApOyAvLyByYWRpdXMgb2YgY2lyY2xlIGNvbnRhaW5pbmcgbGF5ZXIgMFxuICAgIGNvbnN0IHgycHQgPSBzaW5ocSAvICggY29zaHEgKyAxICk7IC8vIHggY29vcmRpbmF0ZSBvZiB0aGlyZCB2ZXJ0ZXggb2YgdHJpYW5nbGVcblxuICAgIC8vIHBvaW50IGF0IGVuZCBvZiBoeXBvdGVudXNlIG9mIGZ1bmRhbWVudGFsIHJlZ2lvblxuICAgIGNvbnN0IHhxcHQgPSBNYXRoLmNvcyggTWF0aC5QSSAvIHRoaXMucCApICogcmFkMjtcbiAgICBjb25zdCB5cXB0ID0gTWF0aC5zaW4oIE1hdGguUEkgLyB0aGlzLnAgKSAqIHJhZDI7XG5cbiAgICAvLyBjcmVhdGUgcG9pbnRzIGFuZCBtb3ZlIHRoZW0gZnJvbSB0aGUgdW5pdCBkaXNrIHRvIG91ciByYWRpdXNcbiAgICBjb25zdCBwMSA9IHsgeDogeHFwdCwgeTogeXFwdCwgejogMCB9O1xuICAgIGNvbnN0IHAyID0geyB4OiB4MnB0LCB5OiAwLCB6OiAwIH07XG4gICAgLy8gY29uc3QgcDMgPSB0cmFuc2Zvcm1Qb2ludCggdGhpcy50cmFuc2Zvcm1zLmVkZ2VCaXNlY3RvclJlZmxlY3Rpb24sIHAxLngsIHAxLnkgKTtcbiAgICBjb25zdCB2ZXJ0aWNlcyA9IFt7IHg6IDAsIHk6IDAsIHo6IDAgfSwgcDEsIHAyXTtcblxuICAgIHJldHVybiBuZXcgUG9seWdvbiggdmVydGljZXMsIDAgKTtcbiAgfVxuXG4gIC8vIHRoaXMgaXMgYSBraXRlIHNoYXBlZCByZWdpb24gY29uc2lzdGluZyBvZiB0d28gY29waWVzIG9mIHRoZSBmdW5kYW1lbnRhbFxuICAvLyByZWdpb24gd2l0aCBkaWZmZXJlbnQgdGV4dHVyZXMgYXBwbGllZCB0byBjcmVhdGUgdGhlIGJhc2ljIHBhdHRlcm5cbiAgLy8gTk9URTogZm9yIHRoZSB0aW1lIGJlaW5nIGp1c3QgdXNpbmcgZWRnZSBiaXNlY3RvciByZWZsZWN0aW9uIHRvIHJlY3JlYXRlIENpcmNsZVxuICAvLyBMaW1pdCBJLCBvdGhlciBwYXR0ZXJucyB3aWxsIHJlcXVpcmUgZGlmZmVyZW50IG9wdGlvbnNcbiAgZnVuZGFtZW50YWxQYXR0ZXJuKCkge1xuICAgIGNvbnN0IHVwcGVyID0gdGhpcy5mdW5kYW1lbnRhbFJlZ2lvbigpO1xuICAgIGNvbnN0IGxvd2VyID0gdXBwZXIudHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbiwgMSApO1xuICAgIHJldHVybiBbdXBwZXIsIGxvd2VyXTtcbiAgfVxuXG4gIC8vIFRoZSBwYXR0ZXJuIGluIHRoZSBjZW50cmFsIHBvbHlnb24gaXMgbWFkZSB1cCBvZiB0cmFuc2Zvcm1lZCBjb3BpZXNcbiAgLy8gb2YgdGhlIGZ1bmRhbWVudGFsIHBhdHRlcm5cbiAgYnVpbGRDZW50cmFsUGF0dGVybigpIHtcbiAgICAvLyBhZGQgdGhlIGZpcnN0IHR3byBwb2x5Z29ucyB0byB0aGUgY2VudHJhbCBwYXR0ZXJuXG4gICAgY29uc3QgY2VudHJhbFBhdHRlcm4gPSB0aGlzLmZ1bmRhbWVudGFsUGF0dGVybigpO1xuXG4gICAgLy8gY3JlYXRlZCByZWZsZWN0ZWQgdmVyc2lvbnMgb2YgdGhlIHR3byBwYXR0ZXJuIHBpZWNlc1xuICAgIGNvbnN0IHVwcGVyUmVmbGVjdGVkID0gY2VudHJhbFBhdHRlcm5bMF0udHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbiApO1xuICAgIGNvbnN0IGxvd2VyUmVmbGVjdGVkID0gY2VudHJhbFBhdHRlcm5bMV0udHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMuZWRnZUJpc2VjdG9yUmVmbGVjdGlvbiApO1xuXG4gICAgLy8gYWRkIHRoZSByZXN0IG9mIHRoZSBwYXR0ZXJuIHBpZWNlcyB0byB0aGUgY2VudHJhbCBwYXR0ZXJuXG4gICAgZm9yICggbGV0IGkgPSAxOyBpIDwgdGhpcy5wOyBpKysgKSB7XG4gICAgICBpZiAoIGkgJSAyID09PSAxICkge1xuICAgICAgICBjZW50cmFsUGF0dGVybi5wdXNoKCB1cHBlclJlZmxlY3RlZC50cmFuc2Zvcm0oIHRoaXMudHJhbnNmb3Jtcy5yb3RhdGVQb2x5Z29uQ1dbaV0gKSApO1xuICAgICAgICBjZW50cmFsUGF0dGVybi5wdXNoKCBsb3dlclJlZmxlY3RlZC50cmFuc2Zvcm0oIHRoaXMudHJhbnNmb3Jtcy5yb3RhdGVQb2x5Z29uQ1dbaV0gKSApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2VudHJhbFBhdHRlcm4ucHVzaCggY2VudHJhbFBhdHRlcm5bMF0udHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMucm90YXRlUG9seWdvbkNXW2ldICkgKTtcbiAgICAgICAgY2VudHJhbFBhdHRlcm4ucHVzaCggY2VudHJhbFBhdHRlcm5bMV0udHJhbnNmb3JtKCB0aGlzLnRyYW5zZm9ybXMucm90YXRlUG9seWdvbkNXW2ldICkgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY2VudHJhbFBhdHRlcm47XG4gIH1cblxuICAvLyByZWN1cnNpdmVseSBidWlsZCB0aWxpbmcgZnJvbSB0cmFuc2Zvcm1lZCBjb3BpZXMgb2YgY2VudHJhbCBwYXR0ZXJuXG4gIGdlbmVyYXRlVGlsaW5nKCBkZXNpZ25Nb2RlID0gZmFsc2UgKSB7XG4gICAgY29uc3QgdGlsaW5nID0gdGhpcy5idWlsZENlbnRyYWxQYXR0ZXJuKCk7XG5cbiAgICBjb25zdCBwUmFuZ2UgPSBkZXNpZ25Nb2RlID8gMSA6IHRoaXMucDsgLy8gaWYgd2UgYXJlIGluIGRlc2lnbiBtb2RlIG9ubHkgZG8gb25lIGxvb3BcbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCBwUmFuZ2U7IGkrKyApIHtcbiAgICAgIGxldCBxVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1zLmVkZ2VUcmFuc2Zvcm1zW2ldO1xuXG4gICAgICBjb25zdCBxUmFuZ2UgPSBkZXNpZ25Nb2RlID8gMSA6IHRoaXMucSAtIDI7IC8vIGlmIHdlIGFyZSBpbiBkZXNpZ24gbW9kZSBvbmx5IGRvIG9uZSBsb29wXG4gICAgICBmb3IgKCBsZXQgaiA9IDA7IGogPCBxUmFuZ2U7IGorKyApIHtcbiAgICAgICAgaWYgKCAoIHRoaXMucCA9PT0gMyApICYmICggdGhpcy5xIC0gMyA9PT0gaiApICkge1xuICAgICAgICAgIHRoaXMuYWRkVHJhbnNmb3JtZWRQYXR0ZXJuKCB0aWxpbmcsIHFUcmFuc2Zvcm0gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmxheWVyUmVjdXJzaW9uKCB0aGlzLnBhcmFtcy5leHBvc3VyZSggMCwgaSwgaiApLCAxLCBxVHJhbnNmb3JtLCB0aWxpbmcsIGRlc2lnbk1vZGUgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoICggLTEgJSB0aGlzLnAgKSAhPT0gMCApIHtcbiAgICAgICAgICBxVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1zLnNoaWZ0VHJhbnMoIHFUcmFuc2Zvcm0sIC0xICk7IC8vIC0xIG1lYW5zIGNsb2Nrd2lzZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbGluZztcbiAgfVxuXG4gIC8vIGNhbGN1bGF0ZSB0aGUgcG9seWdvbnMgaW4gZWFjaCBsYXllciBhbmQgYWRkIHRoZW0gdG8gdGhpcy50aWxpbmdbXVxuICAvLyBUT0RPOiBiZXR0ZXIgZGVzaWduTW9kZVxuICBsYXllclJlY3Vyc2lvbiggZXhwb3N1cmUsIGxheWVyLCB0cmFuc2Zvcm0sIHRpbGluZywgZGVzaWduTW9kZSA9IGZhbHNlICkge1xuICAgIHRoaXMuYWRkVHJhbnNmb3JtZWRQYXR0ZXJuKCB0aWxpbmcsIHRyYW5zZm9ybSApO1xuICAgIC8vIHN0b3AgaWYgdGhlIGN1cnJlbnQgcGF0dGVybiBoYXMgcmVhY2hlZCB0aGUgbWluaW11bSBzaXplXG4gICAgLy8gVE9ETyBiZXR0ZXIgbWV0aG9kIGFzIHRoaXMgbGVhdmVzIGhvbGVzIGF0IHRoZSBlZGdlc1xuICAgIGlmICggdGlsaW5nW3RpbGluZy5sZW5ndGggLSAxXS5lZGdlc1swXS5hcmNMZW5ndGggPCB0aGlzLm1pblBvbHlnb25TaXplICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBwU2tpcCA9IHRoaXMucGFyYW1zLnBTa2lwKCBleHBvc3VyZSApO1xuICAgIGNvbnN0IHZlcnRpY2VzVG9EbyA9IHRoaXMucGFyYW1zLnZlcnRpY2VzVG9EbyggZXhwb3N1cmUgKTtcblxuICAgIGNvbnN0IHZlcnRpY2VzUmFuZ2UgPSBkZXNpZ25Nb2RlID8gMSA6IHZlcnRpY2VzVG9EbzsgLy8gaWYgd2UgYXJlIGluIGRlc2lnbiBtb2RlIG9ubHkgZG8gb25lIGxvb3BcbiAgICBmb3IgKCBsZXQgaSA9IDA7IGkgPCB2ZXJ0aWNlc1JhbmdlOyBpKysgKSB7XG4gICAgICBjb25zdCBwVHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm1zLnNoaWZ0VHJhbnMoIHRyYW5zZm9ybSwgcFNraXAgKTtcbiAgICAgIGxldCBxVHJhbnNmb3JtO1xuXG4gICAgICBjb25zdCBxU2tpcCA9IHRoaXMucGFyYW1zLnFTa2lwKCBleHBvc3VyZSwgaSApO1xuICAgICAgaWYgKCBxU2tpcCAlIHRoaXMucCAhPT0gMCApIHtcbiAgICAgICAgcVRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3Jtcy5zaGlmdFRyYW5zKCBwVHJhbnNmb3JtLCBxU2tpcCApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcVRyYW5zZm9ybSA9IHBUcmFuc2Zvcm07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBnb25zVG9EbyA9IHRoaXMucGFyYW1zLnBnb25zVG9EbyggZXhwb3N1cmUsIGkgKTtcblxuICAgICAgY29uc3QgcGdvbnNSYW5nZSA9IGRlc2lnbk1vZGUgPyAxIDogcGdvbnNUb0RvOyAvLyBpZiB3ZSBhcmUgaW4gZGVzaWduIG1vZGUgb25seSBkbyBvbmUgbG9vcFxuICAgICAgZm9yICggbGV0IGogPSAwOyBqIDwgcGdvbnNSYW5nZTsgaisrICkge1xuICAgICAgICBpZiAoICggdGhpcy5wID09PSAzICkgJiYgKCBqID09PSBwZ29uc1RvRG8gLSAxICkgKSB7XG4gICAgICAgICAgdGhpcy5hZGRUcmFuc2Zvcm1lZFBhdHRlcm4oIHRpbGluZywgcVRyYW5zZm9ybSApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubGF5ZXJSZWN1cnNpb24oIHRoaXMucGFyYW1zLmV4cG9zdXJlKCBsYXllciwgaSwgaiApLCBsYXllciArIDEsIHFUcmFuc2Zvcm0sIHRpbGluZyApO1xuICAgICAgICB9XG4gICAgICAgIGlmICggKCAtMSAlIHRoaXMucCApICE9PSAwICkge1xuICAgICAgICAgIHFUcmFuc2Zvcm0gPSB0aGlzLnRyYW5zZm9ybXMuc2hpZnRUcmFucyggcVRyYW5zZm9ybSwgLTEgKTsgLy8gLTEgbWVhbnMgY2xvY2t3aXNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHBTa2lwID0gKCBwU2tpcCArIDEgKSAlIHRoaXMucDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgZmlyc3QgcCoyIGVsZW1lbnRzIG9mIHRoZSB0aWxpbmcgaG9sZCB0aGUgY2VudHJhbCBwYXR0ZXJuXG4gIC8vIFRoZSB0cmFuc2Zvcm0gd2lsbCBiZSBhcHBsaWVkIHRvIHRoZXNlXG4gIGFkZFRyYW5zZm9ybWVkUGF0dGVybiggdGlsaW5nLCB0cmFuc2Zvcm0gKSB7XG4gICAgZm9yICggbGV0IGkgPSAwOyBpIDwgdGhpcy5wICogMjsgaSsrICkge1xuICAgICAgdGlsaW5nLnB1c2goIHRpbGluZ1tpXS50cmFuc2Zvcm0oIHRyYW5zZm9ybSApICk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIHRlc3NlbGF0aW9uIHJlcXVpcmVzIHRoYXQgKHAtMikocS0yKSA+IDQgdG8gd29yayAob3RoZXJ3aXNlIGl0IGlzXG4gIC8vIGVpdGhlciBhbiBlbGxpcHRpY2FsIG9yIGV1Y2xpZGVhbiB0ZXNzZWxhdGlvbik7XG4gIGNoZWNrUGFyYW1zKCkge1xuICAgIGlmICggKCB0aGlzLnAgLSAyICkgKiAoIHRoaXMucSAtIDIgKSA8PSA0ICkge1xuICAgICAgY29uc29sZS5lcnJvciggJ0h5cGVyYm9saWMgdGVzc2VsYXRpb25zIHJlcXVpcmUgdGhhdCAocC0yKShxLTIpID4gNCEnICk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCB0aGlzLnEgPCAzIHx8IGlzTmFOKCB0aGlzLnEgKSApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoICdUZXNzZWxhdGlvbiBlcnJvcjogYXQgbGVhc3QgMyBwLWdvbnMgbXVzdCBtZWV0IGF0IGVhY2ggdmVydGV4IScgKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoIHRoaXMucCA8IDMgfHwgaXNOYU4oIHRoaXMucCApICkge1xuICAgICAgY29uc29sZS5lcnJvciggJ1Rlc3NlbGF0aW9uIGVycm9yOiBwb2x5Z29uIG5lZWRzIGF0IGxlYXN0IDMgc2lkZXMhJyApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIiwgImltcG9ydCAqIGFzIFRIUkVFIGZyb20gXCJ0aHJlZVwiO1xuXG5pbXBvcnQgQXBwIGZyb20gXCIuL0FwcC9BcHAuanNcIjtcblxuaW1wb3J0IFwiLi91dGlsaXRpZXMvcG9seWZpbGxzLmpzXCI7XG5pbXBvcnQgXCIuL2NvbXBvbmVudHMvY29udHJvbHMuanNcIjtcblxuaW1wb3J0IGNyZWF0ZUdlb21ldHJpZXMgZnJvbSBcIi4vdXRpbGl0aWVzL2NyZWF0ZUdlb21ldHJpZXNcIjtcblxuaW1wb3J0IGJhc2ljVmVydCBmcm9tIFwiLi9zaGFkZXJzL2Jhc2ljLnZlcnRcIjtcbmltcG9ydCBiYXNpY0ZyYWcgZnJvbSBcIi4vc2hhZGVycy9iYXNpYy5mcmFnXCI7XG5cbmltcG9ydCBSZWd1bGFySHlwZXJib2xpY1Rlc3NlbGF0aW9uIGZyb20gXCIuL3V0aWxpdGllcy9SZWd1bGFySHlwZXJib2xpY1Rlc3NlbGF0aW9uLmpzXCI7XG5cblRIUkVFLkNhY2hlLmVuYWJsZWQgPSB0cnVlO1xuXG5jbGFzcyBNYWluIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBzZWxmLmFwcCA9IG5ldyBBcHAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNjYW52YXNcIikpO1xuXG4gICAgc2VsZi5hcHAuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCAwLCAxLjUpO1xuICAgIHNlbGYuYXBwLmNhbWVyYS5mYXIgPSA1O1xuICAgIHNlbGYuYXBwLmNhbWVyYS5hc3BlY3QgPSAxO1xuICAgIHNlbGYuYXBwLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgc2VsZi5hcHAuYXV0b1Jlc2l6ZSA9IGZhbHNlO1xuXG4gICAgc2VsZi5pbml0UFFDb250cm9scygpO1xuXG4gICAgc2VsZi5pbml0RHJhZ0Ryb3BDb250cm9scygpO1xuXG4gICAgc2VsZi5pbml0SW1hZ2VEb3dubG9hZGVyKCk7XG5cbiAgICBzZWxmLmluaXRTcGVjKCk7XG5cbiAgICBzZWxmLmluaXRNYXRlcmlhbHMoKTtcblxuICAgIHRoaXMuYnVpbGRUaWxpbmcoKTtcblxuICAgIHNlbGYuYXBwLm9uVXBkYXRlID0gZnVuY3Rpb24gKCkge307XG5cbiAgICBjb25zdCBjb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcnRpY2xlXCIpO1xuXG4gICAgbGV0IHNpZGUgPSBNYXRoLm1pbihjb250ZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQpIC0gMTY7XG5cbiAgICBjb25zdCBzZXRTaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgbmV3U2lkZSA9IE1hdGgubWluKGNvbnRlbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lckhlaWdodCkgLSAxNjtcbiAgICAgIGlmIChzaWRlICE9PSBuZXdTaWRlKSB7XG4gICAgICAgIHNpZGUgPSBuZXdTaWRlO1xuICAgICAgICBzZWxmLmFwcC5yZW5kZXJlci5zZXRTaXplKHNpZGUsIHNpZGUsIHRydWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzZXRTaXplKCk7XG5cbiAgICBjb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsICgpID0+IHtcbiAgICAgIHNldFNpemUoKTtcbiAgICB9KTtcblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsICgpID0+IHtcbiAgICAgIHNldFNpemUoKTtcbiAgICB9KTtcblxuICAgIHNlbGYuYXBwLnBsYXkoKTtcbiAgfVxuXG4gIGluaXRQUUNvbnRyb2xzKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgY29uc3QgcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjcC12YWx1ZVwiKTtcbiAgICBjb25zdCBxID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNxLXZhbHVlXCIpO1xuXG4gICAgY29uc3QgcFZhbHVlID0gKCkgPT4gcGFyc2VJbnQocC5pbm5lckhUTUwsIDEwKTtcblxuICAgIGNvbnN0IHFWYWx1ZSA9ICgpID0+IHBhcnNlSW50KHEuaW5uZXJIVE1MLCAxMCk7XG5cbiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld1AgPSBwVmFsdWUoKTtcbiAgICAgIGNvbnN0IG5ld1EgPSBxVmFsdWUoKTtcblxuICAgICAgaWYgKHRoaXMuc3BlYy5wID09PSBuZXdQICYmIHRoaXMuc3BlYy5xID09PSBuZXdRKSByZXR1cm47XG5cbiAgICAgIHRoaXMuc3BlYy5wID0gbmV3UDtcbiAgICAgIHRoaXMuc3BlYy5xID0gbmV3UTtcblxuICAgICAgLy8gVE9ETzogZGlzcGxheSBhIHdhcm5pbmcgaGVyZSBzYXlpbmcgcCwgcSBjYW4ndCBib3RoIGJlIDRcbiAgICAgIGlmIChwVmFsdWUoKSA9PT0gNCAmJiBxVmFsdWUoKSA9PT0gNCkgcmV0dXJuO1xuXG4gICAgICAvLyBBZGQgYSBzbGlnaHQgZGVsYXkgYmVmb3JlIHJlYnVpbGRpbmcgdGhlIHRpbGluZyB0byBhbGxvdyB0aGUgZGlzcGxheWVkXG4gICAgICAvLyB2YWx1ZSBwIC8gcSB0byB1cGRhdGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gc2VsZi5idWlsZFRpbGluZygpLCAxMCk7XG4gICAgfSk7XG5cbiAgICBvYnNlcnZlci5vYnNlcnZlKHAsIHsgY2hpbGRMaXN0OiB0cnVlIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUocSwgeyBjaGlsZExpc3Q6IHRydWUgfSk7XG4gIH1cblxuICBpbml0RHJhZ0Ryb3BDb250cm9scygpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcblxuICAgIGNvbnN0IGlkVG9UZXh0dXJlID0ge1xuICAgICAgJ2JsYWNrLXRpbGUnOiAwLFxuICAgICAgJ3doaXRlLXRpbGUnOiAxLFxuICAgIH07XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbWcudGlsZScpLmZvckVhY2goKHRpbGUpID0+IHtcbiAgICAgIHRpbGUuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ292ZXInLCAoZSkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9KTtcblxuICAgICAgdGlsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywoZSkgPT4ge1xuICAgICAgICBpZiAoIShlLnRhcmdldC5pZCBpbiBpZFRvVGV4dHVyZSkpIHJldHVybjtcblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmIChlLmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBlLmRhdGFUcmFuc2Zlci5pdGVtcykge1xuICAgICAgICAgICAgaWYgKGl0ZW0ua2luZCA9PT0gJ2ZpbGUnICYmIGl0ZW0udHlwZS5tYXRjaCggJ15pbWFnZS8oZ2lmfGpwZWd8cG5nfHdlYnApJCcpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpbGVEYXRhID0gaXRlbS5nZXRBc0ZpbGUoKTtcbiAgICAgICAgICAgICAgZS50YXJnZXQuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlRGF0YSk7XG5cbiAgICAgICAgICAgICAgc2VsZi5zcGVjLnRleHR1cmVzW2lkVG9UZXh0dXJlW2UudGFyZ2V0LmlkXV0gPSBlLnRhcmdldC5zcmM7XG4gICAgICAgICAgICAgIHNlbGYuaW5pdE1hdGVyaWFscygpO1xuICAgICAgICAgICAgICBzZWxmLmJ1aWxkVGlsaW5nKCk7XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLml0ZW1zLmNsZWFyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCAnRGF0YVRyYW5zZmVySXRlbUxpc3QgaW50ZXJmYWNlIHVuYXZhaWxhYmxlJyApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRJbWFnZURvd25sb2FkZXIoKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjY2FudmFzJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5ocmVmID0gc2VsZi5hcHAudGFrZVNjcmVlbnNob3QoMTAyNCwgMTAyNCkuc3JjO1xuICAgICAgYS5kb3dubG9hZCA9IGBoeXBlcmJvbGljLXRpbGluZy1wJHsgc2VsZi5zcGVjLnAgfS1xJHsgc2VsZi5zcGVjLnEgfS5wbmdgO1xuICAgICAgYS5jbGljaygpO1xuICAgIH0pO1xuICB9XG5cbiAgYnVpbGRUaWxpbmcoKSB7XG4gICAgdGhpcy5jbGVhclRpbGluZygpO1xuXG4gICAgY29uc29sZS50aW1lKFwiR2VuZXJhdGUgVGlsaW5nXCIpO1xuICAgIGNvbnN0IHRpbGluZyA9IG5ldyBSZWd1bGFySHlwZXJib2xpY1Rlc3NlbGF0aW9uKHRoaXMuc3BlYykuZ2VuZXJhdGVUaWxpbmcoXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBjb25zb2xlLnRpbWVFbmQoXCJHZW5lcmF0ZSBUaWxpbmdcIik7XG5cbiAgICBjb25zb2xlLnRpbWUoXCJEcmF3IFRpbGluZ1wiKTtcbiAgICB0aGlzLmdlbmVyYXRlRGlzayh0aWxpbmcpO1xuICAgIGNvbnNvbGUudGltZUVuZChcIkRyYXcgVGlsaW5nXCIpO1xuXG4gICAgLy8gY29uc29sZS5sb2coICdUaWxpbmcgbGVuZ3RoOiAnICsgdGlsaW5nLmxlbmd0aCApO1xuXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiN0aWxpbmctbGVuZ3RoXCIpLmlubmVySFRNTCA9IHRpbGluZy5sZW5ndGg7XG4gIH1cblxuICBjbGVhclRpbGluZygpIHtcbiAgICB3aGlsZSAodGhpcy5hcHAuc2NlbmUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gdGhpcy5hcHAuc2NlbmUuY2hpbGRyZW5bMF07XG4gICAgICBpZiAob2JqZWN0LnR5cGUgPT09IFwiTWVzaFwiKSB7XG4gICAgICAgIG9iamVjdC5nZW9tZXRyeS5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuYXBwLnNjZW5lLnJlbW92ZShvYmplY3QpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGluaXRTcGVjKCkge1xuICAgIGNvbnN0IGltYWdlc1BhdGggPSBcImFzc2V0cy90aWxlcy9cIjtcblxuICAgIHRoaXMuc3BlYyA9IHtcbiAgICAgIHdpcmVmcmFtZTogZmFsc2UsXG4gICAgICBwOiA2LFxuICAgICAgcTogNixcbiAgICAgIHJhZGl1czogMTAwLFxuICAgICAgdGV4dHVyZXM6IFtgJHtpbWFnZXNQYXRofWZpc2gtYmxhY2sucG5nYCwgYCR7aW1hZ2VzUGF0aH1maXNoLXdoaXRlLnBuZ2BdLFxuICAgICAgZWRnZUFkamFjZW5jeTogW1xuICAgICAgICAvLyBhcnJheSBvZiBsZW5ndGggcFxuICAgICAgICBbXG4gICAgICAgICAgMSwgLy8gZWRnZV8wIG9yaWVudGF0aW9uICgtMSA9IHJlZmxlY3Rpb24sIDEgPSByb3RhdGlvbilcbiAgICAgICAgICA1LCAvLyBlZGdlXzAgYWRqYWNlbmN5IChyYW5nZSBwIC0gMSlcbiAgICAgICAgXSxcbiAgICAgICAgWzEsIDRdLCAvLyBlZGdlXzEgb3JpZW50YXRpb24sIGFkamFjZW5jeVxuICAgICAgICBbMSwgM10sXG4gICAgICAgIFsxLCAyXSxcbiAgICAgICAgWzEsIDFdLFxuICAgICAgICBbMSwgMF0sXG4gICAgICBdLFxuICAgICAgbWluUG9seWdvblNpemU6IDAuMDEsXG4gICAgfTtcbiAgfVxuXG4gIGdlbmVyYXRlRGlzayh0aWxpbmcpIHtcbiAgICBjb25zdCBnZW9tZXRyaWVzID0gY3JlYXRlR2VvbWV0cmllcyh0aWxpbmcpO1xuXG4gICAgY29uc3QgbWVzaEEgPSBuZXcgVEhSRUUuTWVzaChcbiAgICAgIGdlb21ldHJpZXNbMF0sXG4gICAgICB0aGlzLnBhdHRlcm5bdGlsaW5nWzBdLm1hdGVyaWFsSW5kZXhdXG4gICAgKTtcbiAgICBjb25zdCBtZXNoQiA9IG5ldyBUSFJFRS5NZXNoKFxuICAgICAgZ2VvbWV0cmllc1sxXSxcbiAgICAgIHRoaXMucGF0dGVyblt0aWxpbmdbMV0ubWF0ZXJpYWxJbmRleF1cbiAgICApO1xuXG4gICAgdGhpcy5hcHAuc2NlbmUuYWRkKG1lc2hBKTsgLy8gYmxhY2sgZmlzaFxuICAgIHRoaXMuYXBwLnNjZW5lLmFkZChtZXNoQik7IC8vIHdoaXRlIGZpc2hcbiAgfVxuXG4gIGluaXRNYXRlcmlhbHMoKSB7XG4gICAgdGhpcy5wYXR0ZXJuID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3BlYy50ZXh0dXJlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGV4dHVyZSA9IG5ldyBUSFJFRS5UZXh0dXJlTG9hZGVyKCkubG9hZCh0aGlzLnNwZWMudGV4dHVyZXNbaV0pO1xuICAgICAgdGV4dHVyZS5hbmlzb3Ryb3B5ID0gdGhpcy5hcHAucmVuZGVyZXIuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKTtcblxuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuUmF3U2hhZGVyTWF0ZXJpYWwoe1xuICAgICAgICB1bmlmb3Jtczoge1xuICAgICAgICAgIHRpbGVUZXh0dXJlOiB7XG4gICAgICAgICAgICB2YWx1ZTogdGV4dHVyZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB2ZXJ0ZXhTaGFkZXI6IGJhc2ljVmVydCxcbiAgICAgICAgZnJhZ21lbnRTaGFkZXI6IGJhc2ljRnJhZyxcbiAgICAgICAgc2lkZTogVEhSRUUuRG91YmxlU2lkZSxcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnBhdHRlcm4ucHVzaChtYXRlcmlhbCk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IG1haW4gPSBuZXcgTWFpbigpO1xuXG5leHBvcnQgZGVmYXVsdCBtYWluO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0EsTUFBTSxXQUFXO0FBR2pCLE1BQU0sZUFBZTtBQUNyQixNQUFNLGVBQWU7QUFDckIsTUFBTSxnQkFBZ0I7QUFHdEIsTUFBTSxlQUFlO0FBQ3JCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sZUFBZTtBQUNyQixNQUFNLFlBQVk7QUFDbEIsTUFBTSxXQUFXO0FBQ2pCLE1BQU0sYUFBYTtBQUNuQixNQUFNLGNBQWM7QUFFcEIsTUFBTSxhQUFhO0FBQ25CLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sY0FBYztBQUNwQixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLDBCQUEwQjtB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QUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkM7QUFBQSxhQUVJO0FBQ0osZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQztBQUFBLGFBRUk7QUFDSixlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DO0FBQUEsYUFFSTtBQUNKLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkM7QUFBQSxhQUVJO0FBQ0osZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQztBQUFBLGFBRUk7QUFDSixlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DLGVBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFDbkMsZUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUNuQyxlQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQ25DO0FBQUE7QUFHQSxrQkFBUSxLQUFNLHFFQUFxRTtBQUFBO0FBSXJGLFVBQUssV0FBVztBQUFRLGFBQUs7QUFFN0IsYUFBTztBQUFBO0FBQUEsSUFJUixpQkFBa0IsTUFBTSxPQUFRO0FBTS9CLFlBQU0sWUFBWSxRQUFRLEdBQUcsSUFBSSxLQUFLLElBQUs7QUFFM0MsV0FBSyxLQUFLLEtBQUssSUFBSTtBQUNuQixXQUFLLEtBQUssS0FBSyxJQUFJO0FBQ25CLFdBQUssS0FBSyxLQUFLLElBQUk7QUFDbkIsV0FBSyxLQUFLLEtBQUssSUFBSztBQUVwQixXQUFLO0FBRUwsYUFBTztBQUFBO0FBQUEsSUFJUixzQkFBdUIsR0FBSTtBQU0xQixZQUFNLEtBQUssRUFBRSxVQUVaLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUN4QyxNQUFNLEdBQUksSUFBSyxNQUFNLEdBQUksSUFBSyxNQUFNLEdBQUksSUFDeEMsTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLElBQUssTUFBTSxHQUFJLEtBRXhDLFFBQVEsTUFBTSxNQUFNO0FBRXJCLFVBQUssUUFBUSxHQUFJO0FBRWhCLGNBQU0sSUFBSSxNQUFNLEtBQUssS0FBTSxRQUFRO0FBRW5DLGFBQUssS0FBSyxPQUFPO0FBQ2pCLGFBQUssS0FBTyxPQUFNLE9BQVE7QUFDMUIsYUFBSyxLQUFPLE9BQU0sT0FBUTtBQUMxQixhQUFLLEtBQU8sT0FBTSxPQUFRO0FBQUEsaUJBRWYsTUFBTSxPQUFPLE1BQU0sS0FBTTtBQUVwQyxjQUFNLElBQUksSUFBTSxLQUFLLEtBQU0sSUFBTSxNQUFNLE1BQU07QUFFN0MsYUFBSyxLQUFPLE9BQU0sT0FBUTtBQUMxQixhQUFLLEtBQUssT0FBTztBQUNqQixhQUFLLEtBQU8sT0FBTSxPQUFRO0FBQzFCLGFBQUssS0FBTyxPQUFNLE9BQVE7QUFBQSxpQkFFZixNQUFNLEtBQU07QUFFdkIsY0FBTSxJQUFJLElBQU0sS0FBSyxLQUFNLElBQU0sTUFBTSxNQUFNO0FBRTdDLGFBQUssS0FBTyxPQUFNLE9BQVE7QUFDMUIsYUFBSyxLQUFPLE9BQU0sT0FBUTtBQUMxQixhQUFLLEtBQUssT0FBTztBQUNqQixhQUFLLEtBQU8sT0FBTSxPQUFRO0FBQUEsYUFFcEI7QUFFTixjQUFNLElBQUksSUFBTSxLQUFLLEtBQU0sSUFBTSxNQUFNLE1BQU07QUFFN0MsYUFBSyxLQUFPLE9BQU0sT0FBUTtBQUMxQixhQUFLLEtBQU8sT0FBTSxPQUFRO0FBQzFCLGFBQUssS0FBTyxPQUFNLE9BQVE7QUFDMUIsYUFBSyxLQUFLLE9BQU87QUFBQTtBQUlsQixXQUFLO0FBRUwsYUFBTztBQUFBO0FBQUEsSUFJUixtQkFBb0IsT0FBTyxLQUFNO0FBSWhDLFVBQUksSUFBSSxNQUFNLElBQUssT0FBUTtBQUUzQixVQUFLLElBQUksT0FBTyxTQUFVO0FBSXpCLFlBQUk7QUFFSixZQUFLLEtBQUssSUFBSyxNQUFNLEtBQU0sS0FBSyxJQUFLLE1BQU0sSUFBTTtBQUVoRCxlQUFLLEtBQUssQ0FBRSxNQUFNO0FBQ2xCLGVBQUssS0FBSyxNQUFNO0FBQ2hCLGVBQUssS0FBSztBQUNWLGVBQUssS0FBSztBQUFBLGVBRUo7QUFFTixlQUFLLEtBQUs7QUFDVixlQUFLLEtBQUssQ0FBRSxNQUFNO0FBQ2xCLGVBQUssS0FBSyxNQUFNO0FBQ2hCLGVBQUssS0FBSztBQUFBO0FBQUEsYUFJTDtBQUlOLGFBQUssS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJO0FBQzFDLGFBQUssS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJO0FBQzFDLGFBQUssS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLE1BQU0sSUFBSSxJQUFJO0FBQzFDLGFBQUssS0FBSztBQUFBO0FBSVgsYUFBTyxLQUFLO0FBQUE7QUFBQSxJQUliLFFBQVMsR0FBSTtBQUVaLGFBQU8sSUFBSSxLQUFLLEtBQU0sS0FBSyxJQUFLLFVBQVUsTUFBTyxLQUFLLElBQUssSUFBSyxJQUFLO0FBQUE7QUFBQSxJQUl0RSxjQUFlLEdBQUcsTUFBTztBQUV4QixZQUFNLFFBQVEsS0FBSyxRQUFTO0FBRTVCLFVBQUssVUFBVTtBQUFJLGVBQU87QUFFMUIsWUFBTSxJQUFJLEtBQUssSUFBSyxHQUFHLE9BQU87QUFFOUIsV0FBSyxNQUFPLEdBQUc7QUFFZixhQUFPO0FBQUE7QUFBQSxJQUlSLFdBQVc7QUFFVixhQUFPLEtBQUssSUFBSyxHQUFHLEdBQUcsR0FBRztBQUFBO0FBQUEsSUFJM0IsU0FBUztBQUlSLGFBQU8sS0FBSztBQUFBO0FBQUEsSUFJYixZQUFZO0FBRVgsV0FBSyxNQUFNO0FBQ1gsV0FBSyxNQUFNO0FBQ1gsV0FBSyxNQUFNO0FBRVgsV0FBSztBQUVMLGFBQU87QUFBQTtBQUFBLElBSVIsSUFBSyxHQUFJO0FBRVIsYUFBTyxLQUFLLEtBQUssRUFBRSxLQUFLLEtBQUssS0FBSyxFQUFFLEtBQUssS0FBSyxLQUFLLEVBQUUsS0FBSyxLQUFLLEtBQUssRUFBRTtBQUFBO0FBQUEsSUFJdkUsV0FBVztBQUVWLGFBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLElBSW5GLFNBQVM7QUFFUixhQUFPLEtBQUssS0FBTSxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSztBQUFBO0FBQUEsSUFJOUYsWUFBWTtBQUVYLFVBQUksSUFBSSxLQUFLO0FBRWIsVUFBSyxNQUFNLEdBQUk7QUFFZCxhQUFLLEtBQUs7QUFDVixhQUFLLEtBQUs7QUFDVixhQUFLLEtBQUs7QUFDVixhQUFLLEtBQUs7QUFBQSxhQUVKO0FBRU4sWUFBSSxJQUFJO0FBRVIsYUFBSyxLQUFLLEtBQUssS0FBSztBQUNwQixhQUFLLEtBQUssS0FBSyxLQUFLO0FBQ3BCLGFBQUssS0FBSyxLQUFLLEtBQUs7QUFDcEIsYUFBSyxLQUFLLEtBQUssS0FBSztBQUFBO0FBSXJCLFdBQUs7QUFFTCxhQUFPO0FBQUE7QUFBQSxJQUlSLFNBQVUsR0FBRyxHQUFJO0FBRWhCLFVBQUssTUFBTSxRQUFZO0FBRXRCLGdCQUFRLEtBQU07QUFDZCxlQUFPLEtBQUssb0JBQXFCLEdBQUc7QUFBQTtBQUlyQyxhQUFPLEtBQUssb0JBQXFCLE1BQU07QUFBQTtBQUFBLElBSXhDLFlBQWEsR0FBSTtBQUVoQixhQUFPLEtBQUssb0JBQXFCLEdBQUc7QUFBQTtBQUFBLElBSXJDLG9CQUFxQixHQUFHLEdBQUk7QUFJM0IsWUFBTSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUU7QUFDbEQsWUFBTSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUUsSUFBSSxNQUFNLEVBQUU7QUFFbEQsV0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFDcEQsV0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFDcEQsV0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFDcEQsV0FBSyxLQUFLLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFFcEQsV0FBSztBQUVMLGFBQU87QUFBQTtBQUFBLElBSVIsTUFBTyxJQUFJLEdBQUk7QUFFZCxVQUFLLE1BQU07QUFBSSxlQUFPO0FBQ3RCLFVBQUssTUFBTTtBQUFJLGVBQU8sS0FBSyxLQUFNO0FBRWpDLFlBQU0sSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLO0FBSXRELFVBQUksZUFBZSxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUc7QUFFOUQsVUFBSyxlQUFlLEdBQUk7QUFFdkIsYUFBSyxLQUFLLENBQUUsR0FBRztBQUNmLGFBQUssS0FBSyxDQUFFLEdBQUc7QUFDZixhQUFLLEtBQUssQ0FBRSxHQUFHO0FBQ2YsYUFBSyxLQUFLLENBQUUsR0FBRztBQUVmLHVCQUFlLENBQUU7QUFBQSxhQUVYO0FBRU4sYUFBSyxLQUFNO0FBQUE7QUFJWixVQUFLLGdCQUFnQixHQUFNO0FBRTFCLGFBQUssS0FBSztBQUNWLGFBQUssS0FBSztBQUNWLGFBQUssS0FBSztBQUNWLGFBQUssS0FBSztBQUVWLGVBQU87QUFBQTtBQUlSLFlBQU0sa0JBQWtCLElBQU0sZUFBZTtBQUU3QyxVQUFLLG1CQUFtQixPQUFPLFNBQVU7QUFFeEMsY0FBTSxJQUFJLElBQUk7QUFDZCxhQUFLLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztBQUMzQixhQUFLLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztBQUMzQixhQUFLLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztBQUMzQixhQUFLLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSztBQUUzQixhQUFLO0FBQ0wsYUFBSztBQUVMLGVBQU87QUFBQTtBQUlSLFlBQU0sZUFBZSxLQUFLLEtBQU07QUFDaEMsWUFBTSxZQUFZLEtBQUssTUFBTyxjQUFjO0FBQzVDLFlBQU0sU0FBUyxLQUFLLElBQU8sS0FBSSxLQUFNLGFBQWMsY0FDbEQsU0FBUyxLQUFLLElBQUssSUFBSSxhQUFjO0FBRXRDLFdBQUssS0FBTyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQ25DLFdBQUssS0FBTyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQ25DLFdBQUssS0FBTyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBQ25DLFdBQUssS0FBTyxJQUFJLFNBQVMsS0FBSyxLQUFLO0FBRW5DLFdBQUs7QUFFTCxhQUFPO0FBQUE7QUFBQSxJQUlSLGlCQUFrQixJQUFJLElBQUksR0FBSTtBQUU3QixXQUFLLEtBQU0sSUFBSyxNQUFPLElBQUk7QUFBQTtBQUFBLElBSTVCLE9BQVEsWUFBYTtBQUVwQixhQUFTLFdBQVcsT0FBTyxLQUFLLE1BQVUsV0FBVyxPQUFPLEtBQUssTUFBVSxXQUFXLE9BQU8sS0FBSyxNQUFVLFdBQVcsT0FBTyxLQUFLO0FBQUE7QUFBQSxJQUlwSSxVQUFXLE9BQU8sU0FBUyxHQUFJO0FBRTlCLFdBQUssS0FBSyxNQUFPO0FBQ2pCLFdBQUssS0FBSyxNQUFPLFNBQVM7QUFDMUIsV0FBSyxLQUFLLE1BQU8sU0FBUztBQUMxQixXQUFLLEtBQUssTUFBTyxTQUFTO0FBRTFCLFdBQUs7QUFFTCxhQUFPO0FBQUE7QUFBQSxJQUlSLFFBQVMsUUFBUSxJQUFJLFNBQVMsR0FBSTtBQUVqQyxZQUFPLFVBQVcsS0FBSztBQUN2QixZQUFPLFNBQVMsS0FBTSxLQUFLO0FBQzNCLFlBQU8sU0FBUyxLQUFNLEtBQUs7QUFDM0IsWUFBTyxTQUFTLEtBQU0sS0FBSztBQUUzQixhQUFPO0FBQUE7QUFBQSxJQUlSLG9CQUFxQixXQUFXLE9BQVE7QUFFdkMsV0FBSyxLQUFLLFVBQVUsS0FBTTtBQUMxQixXQUFLLEtBQUssVUFBVSxLQUFNO0FBQzFCLFdBQUssS0FBSyxVQUFVLEtBQU07QUFDMUIsV0FBSyxLQUFLLFVBQVUsS0FBTTtBQUUxQixhQUFPO0FBQUE7QUFBQSxJQUlSLFVBQVcsVUFBVztBQUVyQixXQUFLLG9CQUFvQjtBQUV6QixhQUFPO0FBQUE7QUFBQSxJQUlSLG9CQUFvQjtBQUFBO0FBQUE7QUFJckIsYUFBVyxVQUFVLGVBQWU7QUFFcEMsc0JBQWM7QUFBQSxJQUViLFlBQWEsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLEdBQUk7QUFFbEMsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBQUE7QUFBQSxJQUlWLElBQUssR0FBRyxHQUFHLEdBQUk7QUFFZCxVQUFLLE1BQU07QUFBWSxZQUFJLEtBQUs7QUFFaEMsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBRVQsYUFBTztBQUFBO0FBQUEsSUFJUixVQUFXLFFBQVM7QUFFbkIsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBRVQsYUFBTztBQUFBO0FBQUEsSUFJUixLQUFNLEdBQUk7QUFFVCxXQUFLLElBQUk7QUFFVCxhQUFPO0FBQUE7QUFBQSxJQUlSLEtBQU0sR0FBSTtBQUVULFdBQUssSUFBSTtBQUVULGFBQU87QUFBQTtBQUFBLElBSVIsS0FBTSxHQUFJO0FBRVQsV0FBSyxJQUFJO0FBRVQsYUFBTztBQUFBO0FBQUEsSUFJUixhQUFjLE9BQU8sT0FBUTtBQUU1QixjQUFTO0FBQUEsYUFFSDtBQUFHLGVBQUssSUFBSTtBQUFPO0FBQUEsYUFDbkI7QUFBRyxlQUFLLElBQUk7QUFBTztBQUFBLGFBQ25CO0FBQUcsZUFBSyxJQUFJO0FBQU87QUFBQTtBQUNmLGdCQUFNLElBQUksTUFBTyw0QkFBNEI7QUFBQTtBQUl2RCxhQUFPO0FBQUE7QUFBQSxJQUlSLGFBQWMsT0FBUTtBQUVyQixjQUFTO0FBQUEsYUFFSDtBQUFHLGlCQUFPLEtBQUs7QUFBQSxhQUNmO0FBQUcsaUJBQU8sS0FBSztBQUFBLGFBQ2Y7QUFBRyxpQkFBTyxLQUFLO0FBQUE7QUFDWCxnQkFBTSxJQUFJLE1BQU8sNEJBQTRCO0FBQUE7QUFBQTtBQUFBLElBTXhELFFBQVE7QUFFUCxhQUFPLElBQUksS0FBSyxZQUFhLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztBQUFBO0FBQUEsSUFJbkQsS0FBTSxHQUFJO0FBRVQsV0FBSyxJQUFJLEVBQUU7QUFDWCxXQUFLLElBQUksRUFBRTtBQUNYLFdBQUssSUFBSSxFQUFFO0FBRVgsYUFBTztBQUFBO0FBQUEsSUFJUixJQUFLLEdBQUcsR0FBSTtBQUVYLFVBQUssTUFBTSxRQUFZO0FBRXRCLGdCQUFRLEtBQU07QUFDZCxlQUFPLEtBQUssV0FBWSxHQUFHO0FBQUE7QUFJNUIsV0FBSyxLQUFLLEVBQUU7QUFDWixXQUFLLEtBQUssRUFBRTtBQUNaLFdBQUssS0FBSyxFQUFFO0FBRVosYUFBTztBQUFBO0FBQUEsSUFJUixVQUFXLEdBQUk7QUFFZCxXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUs7QUFDVixXQUFLLEtBQUs7QUFFVixhQUFPO0FBQUE7QUFBQSxJQUlSLFdBQVksR0FBRyxHQUFJO0FBRWxCLFdBQUssSUFBSSxFQUFFLElBQUksRUFBRTtBQUNqQixXQUFLLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDakIsV0FBSyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBRWpCLGFBQU87QUFBQTtBQUFBLElBSVIsZ0JBQWlCLEdBQUcsR0FBSTtBQUV2QixXQUFLLEtBQUssRUFBRSxJQUFJO0FBQ2hCLFdBQUssS0FBSyxFQUFFLElBQUk7QUFDaEIsV0FBSyxLQUFLLEVBQUUsSUFBSTtBQUVoQixhQUFPO0FBQUE7QUFBQSxJQUlSLElBQUssR0FBRyxHQUFJO0FBRVgsVUFBSyxNQUFNLFFBQVk7QUFFdEIsZ0JBQVEsS0FBTTtBQUNkLGVBQU8sS0FBSyxXQUFZLEdBQUc7QUFBQTtBQUk1QixXQUFLLEtBQUssRUFBRTtBQUNaLFdBQUssS0FBSyxFQUFFO0FBQ1osV0FBSyxLQUFLLEVBQUU7QUFFWixhQUFPO0FBQUE7QUFBQSxJQUlSLFVBQVcsR0FBSTtBQUVkLFdBQUssS0FBSztBQUNWLFdBQUssS0FBSztBQUNWLFdBQUssS0FBSztBQUVWLGFBQU87QUFBQTtBQUFBLElBSVIsV0FBWSxHQUFHLEdBQUk7QUFFbEIsV0FBSyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2pCLFdBQUssSUFBSSxFQUFFLElBQUksRUFBRTtBQUNqQixXQUFLLElBQUksRUFBRSxJQUFJLEVBQUU7QUFFakIsYUFBTztBQUFBO0FBQUEsSUFJUixTQUFVLEdBQUcsR0FBSTtBQUVoQixVQUFLLE1BQU0sUUFBWTtBQUV0QixnQkFBUSxLQUFNO0FBQ2QsZUFBTyxLQUFLLGdCQUFpQixHQUFHO0FBQUE7QUFJakMsV0FBSyxLQUFLLEVBQUU7QUFDWixXQUFLLEtBQUssRUFBRTtBQUNaLFdBQUssS0FBSyxFQUFFO0FBRVosYUFBTztBQUFBO0FBQUEsSUFJUixlQUFnQixRQUFTO0FBRXhCLFdBQUssS0FBSztBQUNWLFdBQUssS0FBSztBQUNWLFdBQUssS0FBSztBQUVWLGFBQU87QUFBQTtBQUFBLElBSVIsZ0JBQWlCLEdBQUcsR0FBSTtBQUV2QixXQUFLLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDakIsV0FBSyxJQUFJLEVBQUUsSUFBSSxFQUFFO0FBQ2pCLFdBQUssSUFBSSxFQUFFLElBQUksRUFBRTtBQUVqQixhQUFPO0FBQUE7QUFBQSxJQUlSLFdBQVksT0FBUTtBQUVuQixVQUFLLENBQUksVUFBUyxNQUFNLFVBQVk7QUFFbkMsZ0JBQVEsTUFBTztBQUFBO0FBSWhCLGFBQU8sS0FBSyxnQkFBaUIsY0FBYyxhQUFjO0FBQUE7QUFBQSxJQUkxRCxlQUFnQixNQUFNLE9BQVE7QUFFN0IsYUFBTyxLQUFLLGdCQUFpQixjQUFjLGlCQUFrQixNQUFNO0FBQUE7QUFBQSxJQUlwRSxhQUFjLEdBQUk7QUFFakIsWUFBTSxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUssR0FBRyxJQUFJLEtBQUs7QUFDdkMsWUFBTSxJQUFJLEVBQUU7QUFFWixXQUFLLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxLQUFNO0FBQzVDLFdBQUssSUFBSSxFQUFHLEtBQU0sSUFBSSxFQUFHLEtBQU0sSUFBSSxFQUFHLEtBQU07QUFDNUMsV0FBSyxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTTtBQUU1QyxhQUFPO0FBQUE7QUFBQSxJQUlSLGtCQUFtQixHQUFJO0FBRXRCLGFBQU8sS0FBSyxhQUFjLEdBQUk7QUFBQTtBQUFBLElBSS9CLGFBQWMsR0FBSTtBQUVqQixZQUFNLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksS0FBSztBQUN2QyxZQUFNLElBQUksRUFBRTtBQUVaLFlBQU0sSUFBSSxJQUFNLEdBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsTUFBTyxJQUFJLEVBQUc7QUFFM0QsV0FBSyxJQUFNLEdBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsT0FBUztBQUM5RCxXQUFLLElBQU0sR0FBRyxLQUFNLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxPQUFTO0FBQzlELFdBQUssSUFBTSxHQUFHLEtBQU0sSUFBSSxFQUFHLEtBQU0sSUFBSSxFQUFHLE1BQU8sSUFBSSxFQUFHLE9BQVM7QUFFL0QsYUFBTztBQUFBO0FBQUEsSUFJUixnQkFBaUIsR0FBSTtBQUVwQixZQUFNLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksS0FBSztBQUN2QyxZQUFNLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRTtBQUkzQyxZQUFNLEtBQUssS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLO0FBQ2xDLFlBQU0sS0FBSyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFDbEMsWUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSztBQUNsQyxZQUFNLEtBQUssQ0FBRSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFJcEMsV0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUU7QUFDbEQsV0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUU7QUFDbEQsV0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUUsS0FBSyxLQUFLLENBQUU7QUFFbEQsYUFBTztBQUFBO0FBQUEsSUFJUixRQUFTLFFBQVM7QUFFakIsYUFBTyxLQUFLLGFBQWMsT0FBTyxvQkFBcUIsYUFBYyxPQUFPO0FBQUE7QUFBQSxJQUk1RSxVQUFXLFFBQVM7QUFFbkIsYUFBTyxLQUFLLGFBQWMsT0FBTyx5QkFBMEIsYUFBYyxPQUFPO0FBQUE7QUFBQSxJQUlqRixtQkFBb0IsR0FBSTtBQUt2QixZQUFNLElBQUksS0FBSyxHQUFHLElBQUksS0FBSyxHQUFHLElBQUksS0FBSztBQUN2QyxZQUFNLElBQUksRUFBRTtBQUVaLFdBQUssSUFBSSxFQUFHLEtBQU0sSUFBSSxFQUFHLEtBQU0sSUFBSSxFQUFHLEtBQU07QUFDNUMsV0FBSyxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTSxJQUFJLEVBQUcsS0FBTTtBQUM1QyxXQUFLLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxLQUFNLElBQUksRUFBRyxNQUFPO0FBRTdDLGFBQU8sS0FBSztBQUFBO0FBQUEsSUFJYixPQUFRLEdBQUk7QUFFWCxXQUFLLEtBQUssRUFBRTtBQUNaLFdBQUssS0FBSyxFQUFFO0FBQ1osV0FBSyxLQUFLLEVBQUU7QUFFWixhQUFPO0FBQUE7QUFBQSxJQUlSLGFBQWMsUUFBUztBQUV0QixhQUFPLEtBQUssZUFBZ0IsSUFBSTtBQUFBO0FBQUEsSUFJakMsSUFBSyxHQUFJO0FBRVIsV0FBSyxJQUFJLEtBQUssSUFBSyxLQUFLLEdBQUcsRUFBRTtBQUM3QixXQUFLLElBQUksS0FBSyxJQUFLLEtBQUssR0FBRyxFQUFFO0FBQzdCLFdBQUssSUFBSSxLQUFLLElBQUssS0FBSyxHQUFHLEVBQUU7QUFFN0IsYUFBTztBQUFBO0FBQUEsSUFJUixJQUFLLEdBQUk7QUFFUixXQUFLLElBQUksS0FBSyxJQUFLLEtBQUssR0FBRyxFQUFFO0FBQzdCLFdBQUssSUFBSSxLQUFLLElBQUssS0FBSyxHQUFHLEVBQUU7QUFDN0IsV0FBSyxJQUFJLEtBQUssSUFBSyxLQUFLLEdBQUcsRUFBRTtBQUU3QixhQUFPO0FBQUE7QUFBQSxJQUlSLE1BQU8sS0FBSyxLQUFNO0FBSWpCLFdBQUssSUFBSSxLQUFLLElBQUssSUFBSSxHQUFHLEtBQUssSUFBSyxJQUFJLEdBQUcsS0FBSztBQUNoRCxXQUFLLElBQUksS0FBSyxJQUFLLElBQUksR0FBRyxLQUFLLElBQUssSUFBSSxHQUFHLEtBQUs7QUFDaEQsV0FBSyxJQUFJLEtBQUssSUFBSyxJQUFJLEdBQUcsS0FBSyxJQUFLLElBQUksR0FBRyxLQUFLO0FBRWhELGFBQU87QUFBQTtBQUFBLElBSVIsWUFBYSxRQUFRLFFBQVM7QUFFN0IsV0FBSyxJQUFJLEtBQUssSUFBSyxRQUFRLEtBQUssSUFBSyxRQUFRLEtBQUs7QUFDbEQsV0FBSyxJQUFJLEtBQUssSUFBSyxRQUFRLEtBQUssSUFBSyxRQUFRLEtBQUs7QUFDbEQsV0FBSyxJQUFJLEtBQUssSUFBSyxRQUFRLEtBQUssSUFBSyxRQUFRLEtBQUs7QUFFbEQsYUFBTztBQUFBO0FBQUEsSUFJUixZQUFhLEtBQUssS0FBTTtBQUV2QixZQUFNLFNBQVMsS0FBSztBQUVwQixhQUFPLEtBQUssYUFBYyxVQUFVLEdBQUksZUFBZ0IsS0FBSyxJQUFLLEtBQUssS0FBSyxJQUFLLEtBQUs7QUFBQTtBQUFBLElBSXZGLFFBQVE7QUFFUCxXQUFLLElBQUksS0FBSyxNQUFPLEtBQUs7QUFDMUIsV0FBSyxJQUFJLEtBQUssTUFBTyxLQUFLO0FBQzFCLFdBQUssSUFBSSxLQUFLLE1BQU8sS0FBSztBQUUxQixhQUFPO0FBQUE7QUFBQSxJQUlSLE9BQU87QUFFTixXQUFLLElBQUksS0FBSyxLQUFNLEtBQUs7QUFDekIsV0FBSyxJQUFJLEtBQUssS0FBTSxLQUFLO0FBQ3pCLFdBQUssSUFBSSxLQUFLLEtBQU0sS0FBSztBQUV6QixhQUFPO0FBQUE7QUFBQSxJQUlSLFFBQVE7QUFFUCxXQUFLLElBQUksS0FBSyxNQUFPLEtBQUs7QUFDMUIsV0FBSyxJQUFJLEtBQUssTUFBTyxLQUFLO0FBQzFCLFdBQUssSUFBSSxLQUFLLE1BQU8sS0FBSztBQUUxQixhQUFPO0FBQUE7QUFBQSxJQUlSLGNBQWM7QUFFYixXQUFLLElBQU0sS0FBSyxJQUFJLElBQU0sS0FBSyxLQUFNLEtBQUssS0FBTSxLQUFLLE1BQU8sS0FBSztBQUNqRSxXQUFLLElBQU0sS0FBSyxJQUFJLElBQU0sS0FBSyxLQUFNLEtBQUssS0FBTSxLQUFLLE1BQU8sS0FBSztBQUNqRSxXQUFLLElBQU0sS0FBSyxJQUFJLElBQU0sS0FBSyxLQUFNLEtBQUssS0FBTSxLQUFLLE1BQU8sS0FBSztBQUVqRSxhQUFPO0FBQUE7QUFBQSxJQUlSLFNBQVM7QUFFUixXQUFLLElBQUksQ0FBRSxLQUFLO0FBQ2hCLFdBQUssSUFBSSxDQUFFLEtBQUs7QUFDaEIsV0FBSyxJQUFJLENBQUUsS0FBSztBQUVoQixhQUFPO0FBQUE7QUFBQSxJQUlSLElBQUssR0FBSTtBQUVSLGFBQU8sS0FBSyxJQUFJLEVBQUUsSUFBSSxLQUFLLElBQUksRUFBRSxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQUE7QUFBQSxJQU1qRCxXQUFXO0FBRVYsYUFBTyxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFBQTtBQUFBLElBSTFELFNBQVM7QUFFUixhQUFPLEtBQUssS0FBTSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLEtBQUs7QUFBQTtBQUFBLElBSXJFLGtCQUFrQjtBQUVqQixhQUFPLEtBQUssSUFBSyxLQUFLLEtBQU0sS0FBSyxJQUFLLEtBQUssS0FBTSxLQUFLLElBQUssS0FBSztBQUFBO0FBQUEsSUFJakUsWUFBWTtBQUVYLGFBQU8sS0FBSyxhQUFjLEtBQUssWUFBWTtBQUFBO0FBQUEsSUFJNUMsVUFBVyxRQUFTO0FBRW5CLGFBQU8sS0FBSyxZQUFZLGVBQWdCO0FBQUE7QUFBQSxJQUl6QyxLQUFNLEdBQUcsT0FBUTtBQUVoQixXQUFLLEtBQU8sR0FBRSxJQUFJLEtBQUssS0FBTTtBQUM3QixXQUFLLEtBQU8sR0FBRSxJQUFJLEtBQUssS0FBTTtBQUM3QixXQUFLLEtBQU8sR0FBRSxJQUFJLEtBQUssS0FBTTtBQUU3QixhQUFPO0FBQUE7QUFBQSxJQUlSLFlBQWEsSUFBSSxJQUFJLE9BQVE7QUFFNUIsV0FBSyxJQUFJLEdBQUcsSUFBTSxJQUFHLElBQUksR0FBRyxLQUFNO0FBQ2xDLFdBQUssSUFBSSxHQUFHLElBQU0sSUFBRyxJQUFJLEdBQUcsS0FBTTtBQUNsQyxXQUFLLElBQUksR0FBRyxJQUFNLElBQUcsSUFBSSxHQUFHLEtBQU07QUFFbEMsYUFBTztBQUFBO0FBQUEsSUFJUixNQUFPLEdBQUcsR0FBSTtBQUViLFVBQUssTUFBTSxRQUFZO0FBRXRCLGdCQUFRLEtBQU07QUFDZCxlQUFPLEtBQUssYUFBYyxHQUFHO0FBQUE7QUFJOUIsYUFBTyxLQUFLLGFBQWMsTUFBTTtBQUFBO0FBQUEsSUFJakMsYUFBYyxHQUFHLEdBQUk7QUFFcEIsWUFBTSxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUU7QUFDakMsWUFBTSxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUUsR0FBRyxLQUFLLEVBQUU7QUFFakMsV0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLO0FBQ3hCLFdBQUssSUFBSSxLQUFLLEtBQUssS0FBSztBQUN4QixXQUFLLElBQUksS0FBSyxLQUFLLEtBQUs7QUFFeEIsYUFBTztBQUFBO0FBQUEsSUFJUixnQkFBaUIsR0FBSTtBQUVwQixZQUFNLGNBQWMsRUFBRTtBQUV0QixVQUFLLGdCQUFnQjtBQUFJLGVBQU8sS0FBSyxJQUFLLEdBQUcsR0FBRztBQUVoRCxZQUFNLFNBQVMsRUFBRSxJQUFLLFFBQVM7QUFFL0IsYUFBTyxLQUFLLEtBQU0sR0FBSSxlQUFnQjtBQUFBO0FBQUEsSUFJdkMsZUFBZ0IsYUFBYztBQUU3QixnQkFBVSxLQUFNLE1BQU8sZ0JBQWlCO0FBRXhDLGFBQU8sS0FBSyxJQUFLO0FBQUE7QUFBQSxJQUlsQixRQUFTLFFBQVM7QUFLakIsYUFBTyxLQUFLLElBQUssVUFBVSxLQUFNLFFBQVMsZUFBZ0IsSUFBSSxLQUFLLElBQUs7QUFBQTtBQUFBLElBSXpFLFFBQVMsR0FBSTtBQUVaLFlBQU0sY0FBYyxLQUFLLEtBQU0sS0FBSyxhQUFhLEVBQUU7QUFFbkQsVUFBSyxnQkFBZ0I7QUFBSSxlQUFPLEtBQUssS0FBSztBQUUxQyxZQUFNLFFBQVEsS0FBSyxJQUFLLEtBQU07QUFJOUIsYUFBTyxLQUFLLEtBQU0sVUFBVSxNQUFPLE9BQU8sSUFBSztBQUFBO0FBQUEsSUFJaEQsV0FBWSxHQUFJO0FBRWYsYUFBTyxLQUFLLEtBQU0sS0FBSyxrQkFBbUI7QUFBQTtBQUFBLElBSTNDLGtCQUFtQixHQUFJO0FBRXRCLFlBQU0sS0FBSyxLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssS0FBSyxJQUFJLEVBQUUsR0FBRyxLQUFLLEtBQUssSUFBSSxFQUFFO0FBRTVELGFBQU8sS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLO0FBQUE7QUFBQSxJQUlqQyxvQkFBcUIsR0FBSTtBQUV4QixhQUFPLEtBQUssSUFBSyxLQUFLLElBQUksRUFBRSxLQUFNLEtBQUssSUFBSyxLQUFLLElBQUksRUFBRSxLQUFNLEtBQUssSUFBSyxLQUFLLElBQUksRUFBRTtBQUFBO0FBQUEsSUFJbkYsaUJBQWtCLEdBQUk7QUFFckIsYUFBTyxLQUFLLHVCQUF3QixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUU7QUFBQTtBQUFBLElBSXhELHVCQUF3QixRQUFRLEtBQUssT0FBUTtBQUU1QyxZQUFNLGVBQWUsS0FBSyxJQUFLLE9BQVE7QUFFdkMsV0FBSyxJQUFJLGVBQWUsS0FBSyxJQUFLO0FBQ2xDLFdBQUssSUFBSSxLQUFLLElBQUssT0FBUTtBQUMzQixXQUFLLElBQUksZUFBZSxLQUFLLElBQUs7QUFFbEMsYUFBTztBQUFBO0FBQUEsSUFJUixtQkFBb0IsR0FBSTtBQUV2QixhQUFPLEtBQUsseUJBQTBCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRTtBQUFBO0FBQUEsSUFJNUQseUJBQTBCLFFBQVEsT0FBTyxHQUFJO0FBRTVDLFdBQUssSUFBSSxTQUFTLEtBQUssSUFBSztBQUM1QixXQUFLLElBQUk7QUFDVCxXQUFLLElBQUksU0FBUyxLQUFLLElBQUs7QUFFNUIsYUFBTztBQUFBO0FBQUEsSUFJUixzQkFBdUIsR0FBSTtBQUUxQixZQUFNLElBQUksRUFBRTtBQUVaLFdBQUssSUFBSSxFQUFHO0FBQ1osV0FBSyxJQUFJLEVBQUc7QUFDWixXQUFLLElBQUksRUFBRztBQUVaLGFBQU87QUFBQTtBQUFBLElBSVIsbUJBQW9CLEdBQUk7QUFFdkIsWUFBTSxLQUFLLEtBQUssb0JBQXFCLEdBQUcsR0FBSTtBQUM1QyxZQUFNLEtBQUssS0FBSyxvQkFBcUIsR0FBRyxHQUFJO0FBQzVDLFlBQU0sS0FBSyxLQUFLLG9CQUFxQixHQUFHLEdBQUk7QUFFNUMsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBQ1QsV0FBSyxJQUFJO0FBRVQsYUFBTztBQUFBO0FBQUEsSUFJUixvQkFBcUIsR0FBRyxPQUFRO0FBRS9CLGFBQU8sS0FBSyxVQUFXLEVBQUUsVUFBVSxRQUFRO0FBQUE7QUFBQSxJQUk1QyxxQkFBc0IsR0FBRyxPQUFRO0FBRWhDLGFBQU8sS0FBSyxVQUFXLEVBQUUsVUFBVSxRQUFRO0FBQUE7QUFBQSxJQUk1QyxPQUFRLEdBQUk7QUFFWCxhQUFXLEVBQUUsTUFBTSxLQUFLLEtBQVMsRUFBRSxNQUFNLEtBQUssS0FBUyxFQUFFLE1BQU0sS0FBSztBQUFBO0FBQUEsSUFJckUsVUFBVyxPQUFPLFNBQVMsR0FBSTtBQUU5QixXQUFLLElBQUksTUFBTztBQUNoQixXQUFLLElBQUksTUFBTyxTQUFTO0FBQ3pCLFdBQUssSUFBSSxNQUFPLFNBQVM7QUFFekIsYUFBTztBQUFBO0FBQUEsSUFJUixRQUFTLFFBQVEsSUFBSSxTQUFTLEdBQUk7QUFFakMsWUFBTyxVQUFXLEtBQUs7QUFDdkIsWUFBTyxTQUFTLEtBQU0sS0FBSztBQUMzQixZQUFPLFNBQVMsS0FBTSxLQUFLO0FBRTNCLGFBQU87QUFBQTtBQUFBLElBSVIsb0JBQXFCLFdBQVcsT0FBTyxRQUFTO0FBRS9DLFVBQUssV0FBVyxRQUFZO0FBRTNCLGdCQUFRLEtBQU07QUFBQTtBQUlmLFdBQUssSUFBSSxVQUFVLEtBQU07QUFDekIsV0FBSyxJQUFJLFVBQVUsS0FBTTtBQUN6QixXQUFLLElBQUksVUFBVSxLQUFNO0FBRXpCLGFBQU87QUFBQTtBQUFBLElBSVIsU0FBUztBQUVSLFdBQUssSUFBSSxLQUFLO0FBQ2QsV0FBSyxJQUFJLEtBQUs7QUFDZCxXQUFLLElBQUksS0FBSztBQUVkLGFBQU87QUFBQTtBQUFBO0FBTVQsVUFBUSxVQUFVLFlBQVk7QUFFOUIsTUFBTSxZQUEwQixvQkFBSTtBQUNwQyxNQUFNLGdCQUE4QixvQkFBSTtBQUV4QyxtQkFBVztBQUFBLElBRVYsWUFBYSxNQUFNLElBQUksUUFBUyxVQUFZLFVBQVksV0FBYyxNQUFNLElBQUksUUFBUyxXQUFZLFdBQVksWUFBZTtBQUUvSCxXQUFLLE1BQU07QUFDWCxXQUFLLE1BQU07QUFBQTtBQUFBLElBSVosSUFBSyxLQUFLLEtBQU07QUFFZixXQUFLLElBQUksS0FBTTtBQUNmLFdBQUssSUFBSSxLQUFNO0FBRWYsYUFBTztBQUFBO0FBQUEsSUFJUixhQUFjLE9BQVE7QUFFckIsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBRVgsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBRVgsZUFBVSxJQUFJLEdBQUcsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHLEtBQUssR0FBSTtBQUVsRCxjQUFNLElBQUksTUFBTztBQUNqQixjQUFNLElBQUksTUFBTyxJQUFJO0FBQ3JCLGNBQU0sSUFBSSxNQUFPLElBQUk7QUFFckIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFFdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFBQTtBQUl4QixXQUFLLElBQUksSUFBSyxNQUFNLE1BQU07QUFDMUIsV0FBSyxJQUFJLElBQUssTUFBTSxNQUFNO0FBRTFCLGFBQU87QUFBQTtBQUFBLElBSVIsdUJBQXdCLFdBQVk7QUFFbkMsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBRVgsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBRVgsZUFBVSxJQUFJLEdBQUcsSUFBSSxVQUFVLE9BQU8sSUFBSSxHQUFHLEtBQU87QUFFbkQsY0FBTSxJQUFJLFVBQVUsS0FBTTtBQUMxQixjQUFNLElBQUksVUFBVSxLQUFNO0FBQzFCLGNBQU0sSUFBSSxVQUFVLEtBQU07QUFFMUIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFFdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFDdkIsWUFBSyxJQUFJO0FBQU8saUJBQU87QUFBQTtBQUl4QixXQUFLLElBQUksSUFBSyxNQUFNLE1BQU07QUFDMUIsV0FBSyxJQUFJLElBQUssTUFBTSxNQUFNO0FBRTFCLGFBQU87QUFBQTtBQUFBLElBSVIsY0FBZSxRQUFTO0FBRXZCLFdBQUs7QUFFTCxlQUFVLElBQUksR0FBRyxLQUFLLE9BQU8sUUFBUSxJQUFJLElBQUksS0FBTztBQUVuRCxhQUFLLGNBQWUsT0FBUTtBQUFBO0FBSTdCLGFBQU87QUFBQTtBQUFBLElBSVIscUJBQXNCLFFBQVEsTUFBTztBQUVwQyxZQUFNLFdBQVcsVUFBVSxLQUFNLE1BQU8sZUFBZ0I7QUFFeEQsV0FBSyxJQUFJLEtBQU0sUUFBUyxJQUFLO0FBQzdCLFdBQUssSUFBSSxLQUFNLFFBQVMsSUFBSztBQUU3QixhQUFPO0FBQUE7QUFBQSxJQUlSLGNBQWUsUUFBUztBQUV2QixXQUFLO0FBRUwsYUFBTyxLQUFLLGVBQWdCO0FBQUE7QUFBQSxJQUk3QixRQUFRO0FBRVAsYUFBTyxJQUFJLEtBQUssY0FBYyxLQUFNO0FBQUE7QUFBQSxJQUlyQyxLQUFNLEtBQU07QUFFWCxXQUFLLElBQUksS0FBTSxJQUFJO0FBQ25CLFdBQUssSUFBSSxLQUFNLElBQUk7QUFFbkIsYUFBTztBQUFBO0FBQUEsSUFJUixZQUFZO0FBRVgsV0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUk7QUFDdkMsV0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUk7QUFFdkMsYUFBTztBQUFBO0FBQUEsSUFJUixVQUFVO0FBSVQsYUFBUyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksS0FBUyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksS0FBUyxLQUFLLElBQUksSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBSTlGLFVBQVcsUUFBUztBQUVuQixVQUFLLFdBQVcsUUFBWTtBQUUzQixnQkFBUSxLQUFNO0FBQ2QsaUJBQVMsSUFBSTtBQUFBO0FBSWQsYUFBTyxLQUFLLFlBQVksT0FBTyxJQUFLLEdBQUcsR0FBRyxLQUFNLE9BQU8sV0FBWSxLQUFLLEtBQUssS0FBSyxLQUFNLGVBQWdCO0FBQUE7QUFBQSxJQUl6RyxRQUFTLFFBQVM7QUFFakIsVUFBSyxXQUFXLFFBQVk7QUFFM0IsZ0JBQVEsS0FBTTtBQUNkLGlCQUFTLElBQUk7QUFBQTtBQUlkLGFBQU8sS0FBSyxZQUFZLE9BQU8sSUFBSyxHQUFHLEdBQUcsS0FBTSxPQUFPLFdBQVksS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLElBSW5GLGNBQWUsT0FBUTtBQUV0QixXQUFLLElBQUksSUFBSztBQUNkLFdBQUssSUFBSSxJQUFLO0FBRWQsYUFBTztBQUFBO0FBQUEsSUFJUixlQUFnQixRQUFTO0FBRXhCLFdBQUssSUFBSSxJQUFLO0FBQ2QsV0FBSyxJQUFJLElBQUs7QUFFZCxhQUFPO0FBQUE7QUFBQSxJQUlSLGVBQWdCLFFBQVM7QUFFeEIsV0FBSyxJQUFJLFVBQVcsQ0FBRTtBQUN0QixXQUFLLElBQUksVUFBVztBQUVwQixhQUFPO0FBQUE7QUFBQSxJQUlSLGVBQWdCLFFBQVM7QUFLeEIsYUFBTyxrQkFBbUIsT0FBTztBQUVqQyxZQUFNLFdBQVcsT0FBTztBQUV4QixVQUFLLGFBQWEsUUFBWTtBQUU3QixZQUFLLFNBQVMsZ0JBQWdCLE1BQU87QUFFcEMsbUJBQVM7QUFBQTtBQUlWLGVBQU8sS0FBTSxTQUFTO0FBQ3RCLGVBQU8sYUFBYyxPQUFPO0FBRTVCLGFBQUssTUFBTztBQUFBO0FBSWIsWUFBTSxXQUFXLE9BQU87QUFFeEIsZUFBVSxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsSUFBSSxHQUFHLEtBQU87QUFFbkQsYUFBSyxlQUFnQixTQUFVO0FBQUE7QUFJaEMsYUFBTztBQUFBO0FBQUEsSUFJUixjQUFlLE9BQVE7QUFFdEIsYUFBTyxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxLQUNqRCxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxLQUMzQyxNQUFNLElBQUksS0FBSyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssSUFBSSxJQUFJLFFBQVE7QUFBQTtBQUFBLElBSXpELFlBQWEsS0FBTTtBQUVsQixhQUFPLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssSUFBSSxLQUN2RCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLElBQUksS0FDakQsS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxJQUFJO0FBQUE7QUFBQSxJQUluRCxhQUFjLE9BQU8sUUFBUztBQUs3QixVQUFLLFdBQVcsUUFBWTtBQUUzQixnQkFBUSxLQUFNO0FBQ2QsaUJBQVMsSUFBSTtBQUFBO0FBSWQsYUFBTyxPQUFPLElBQ1gsT0FBTSxJQUFJLEtBQUssSUFBSSxLQUFRLE1BQUssSUFBSSxJQUFJLEtBQUssSUFBSSxJQUNqRCxPQUFNLElBQUksS0FBSyxJQUFJLEtBQVEsTUFBSyxJQUFJLElBQUksS0FBSyxJQUFJLElBQ2pELE9BQU0sSUFBSSxLQUFLLElBQUksS0FBUSxNQUFLLElBQUksSUFBSSxLQUFLLElBQUk7QUFBQTtBQUFBLElBS3JELGNBQWUsS0FBTTtBQUdwQixhQUFPLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssSUFBSSxLQUNyRCxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksS0FDL0MsSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxJQUFJLElBQUksUUFBUTtBQUFBO0FBQUEsSUFJN0QsaUJBQWtCLFFBQVM7QUFHMUIsV0FBSyxXQUFZLE9BQU8sUUFBUTtBQUdoQyxhQUFPLFVBQVUsa0JBQW1CLE9BQU8sV0FBYyxPQUFPLFNBQVMsT0FBTztBQUFBO0FBQUEsSUFJakYsZ0JBQWlCLE9BQVE7QUFLeEIsVUFBSSxLQUFLO0FBRVQsVUFBSyxNQUFNLE9BQU8sSUFBSSxHQUFJO0FBRXpCLGNBQU0sTUFBTSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQ2hDLGNBQU0sTUFBTSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQUEsYUFFMUI7QUFFTixjQUFNLE1BQU0sT0FBTyxJQUFJLEtBQUssSUFBSTtBQUNoQyxjQUFNLE1BQU0sT0FBTyxJQUFJLEtBQUssSUFBSTtBQUFBO0FBSWpDLFVBQUssTUFBTSxPQUFPLElBQUksR0FBSTtBQUV6QixlQUFPLE1BQU0sT0FBTyxJQUFJLEtBQUssSUFBSTtBQUNqQyxlQUFPLE1BQU0sT0FBTyxJQUFJLEtBQUssSUFBSTtBQUFBLGFBRTNCO0FBRU4sZUFBTyxNQUFNLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFDakMsZUFBTyxNQUFNLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFBQTtBQUlsQyxVQUFLLE1BQU0sT0FBTyxJQUFJLEdBQUk7QUFFekIsZUFBTyxNQUFNLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFDakMsZUFBTyxNQUFNLE9BQU8sSUFBSSxLQUFLLElBQUk7QUFBQSxhQUUzQjtBQUVOLGVBQU8sTUFBTSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQ2pDLGVBQU8sTUFBTSxPQUFPLElBQUksS0FBSyxJQUFJO0FBQUE7QUFJbEMsYUFBUyxPQUFPLENBQUUsTUFBTSxZQUFZLE9BQU8sQ0FBRSxNQUFNO0FBQUE7QUFBQSxJQUlwRCxtQkFBb0IsVUFBVztBQUU5QixVQUFLLEtBQUssV0FBWTtBQUVyQixlQUFPO0FBQUE7QUFLUixXQUFLLFVBQVc7QUFDaEIsZUFBUyxXQUFZLEtBQUssS0FBSztBQUcvQixZQUFNLFdBQVksU0FBUyxHQUFHO0FBQzlCLFlBQU0sV0FBWSxTQUFTLEdBQUc7QUFDOUIsWUFBTSxXQUFZLFNBQVMsR0FBRztBQUc5QixVQUFJLFdBQVksT0FBTztBQUN2QixVQUFJLFdBQVksT0FBTztBQUN2QixVQUFJLFdBQVksT0FBTztBQUt2QixVQUFJLE9BQU87QUFBQSxRQUNWO0FBQUEsUUFBRyxDQUFFLElBQUk7QUFBQSxRQUFHLElBQUk7QUFBQSxRQUFHO0FBQUEsUUFBRyxDQUFFLElBQUk7QUFBQSxRQUFHLElBQUk7QUFBQSxRQUFHO0FBQUEsUUFBRyxDQUFFLElBQUk7QUFBQSxRQUFHLElBQUk7QUFBQSxRQUN0RCxJQUFJO0FBQUEsUUFBRztBQUFBLFFBQUcsQ0FBRSxJQUFJO0FBQUEsUUFBRyxJQUFJO0FBQUEsUUFBRztBQUFBLFFBQUcsQ0FBRSxJQUFJO0FBQUEsUUFBRyxJQUFJO0FBQUEsUUFBRztBQUFBLFFBQUcsQ0FBRSxJQUFJO0FBQUEsUUFDdEQsQ0FBRSxJQUFJO0FBQUEsUUFBRyxJQUFJO0FBQUEsUUFBRztBQUFBLFFBQUcsQ0FBRSxJQUFJO0FBQUEsUUFBRyxJQUFJO0FBQUEsUUFBRztBQUFBLFFBQUcsQ0FBRSxJQUFJO0FBQUEsUUFBRyxJQUFJO0FBQUEsUUFBRztBQUFBO0FBRXZELFVBQUssQ0FBRSxXQUFZLE1BQU0sT0FBTyxPQUFPLE9BQU8sV0FBYTtBQUUxRCxlQUFPO0FBQUE7QUFLUixhQUFPLENBQUUsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHO0FBQ2pDLFVBQUssQ0FBRSxXQUFZLE1BQU0sT0FBTyxPQUFPLE9BQU8sV0FBYTtBQUUxRCxlQUFPO0FBQUE7QUFNUixzQkFBZ0IsYUFBYyxLQUFLO0FBQ25DLGFBQU8sQ0FBRSxnQkFBZ0IsR0FBRyxnQkFBZ0IsR0FBRyxnQkFBZ0I7QUFFL0QsYUFBTyxXQUFZLE1BQU0sT0FBTyxPQUFPLE9BQU87QUFBQTtBQUFBLElBSS9DLFdBQVksT0FBTyxRQUFTO0FBRTNCLFVBQUssV0FBVyxRQUFZO0FBRTNCLGdCQUFRLEtBQU07QUFDZCxpQkFBUyxJQUFJO0FBQUE7QUFJZCxhQUFPLE9BQU8sS0FBTSxPQUFRLE1BQU8sS0FBSyxLQUFLLEtBQUs7QUFBQTtBQUFBLElBSW5ELGdCQUFpQixPQUFRO0FBRXhCLFlBQU0sZUFBZSxVQUFVLEtBQU0sT0FBUSxNQUFPLEtBQUssS0FBSyxLQUFLO0FBRW5FLGFBQU8sYUFBYSxJQUFLLE9BQVE7QUFBQTtBQUFBLElBSWxDLGtCQUFtQixRQUFTO0FBRTNCLFVBQUssV0FBVyxRQUFZO0FBRTNCLGdCQUFRLE1BQU87QUFBQTtBQUtoQixXQUFLLFVBQVcsT0FBTztBQUV2QixhQUFPLFNBQVMsS0FBSyxRQUFTLFdBQVksV0FBVztBQUVyRCxhQUFPO0FBQUE7QUFBQSxJQUlSLFVBQVcsS0FBTTtBQUVoQixXQUFLLElBQUksSUFBSyxJQUFJO0FBQ2xCLFdBQUssSUFBSSxJQUFLLElBQUk7QUFHbEIsVUFBSyxLQUFLO0FBQVksYUFBSztBQUUzQixhQUFPO0FBQUE7QUFBQSxJQUlSLE1BQU8sS0FBTTtBQUVaLFdBQUssSUFBSSxJQUFLLElBQUk7QUFDbEIsV0FBSyxJQUFJLElBQUssSUFBSTtBQUVsQixhQUFPO0FBQUE7QUFBQSxJQUlSLGFBQWMsUUFBUztBQUd0QixVQUFLLEtBQUs7QUFBWSxlQUFPO0FBRzdCLGNBQVMsR0FBSSxJQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFJLGFBQWM7QUFDckUsY0FBUyxHQUFJLElBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUksYUFBYztBQUNyRSxjQUFTLEdBQUksSUFBSyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBSSxhQUFjO0FBQ3JFLGNBQVMsR0FBSSxJQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFJLGFBQWM7QUFDckUsY0FBUyxHQUFJLElBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUksYUFBYztBQUNyRSxjQUFTLEdBQUksSUFBSyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBSSxhQUFjO0FBQ3JFLGNBQVMsR0FBSSxJQUFLLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFJLGFBQWM7QUFDckUsY0FBUyxHQUFJLElBQUssS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUksYUFBYztBQUVyRSxXQUFLLGNBQWU7QUFFcEIsYUFBTztBQUFBO0FBQUEsSUFJUixVQUFXLFFBQVM7QUFFbkIsV0FBSyxJQUFJLElBQUs7QUFDZCxXQUFLLElBQUksSUFBSztBQUVkLGFBQU87QUFBQTtBQUFBLElBSVIsT0FBUSxLQUFNO0FBRWIsYUFBTyxJQUFJLElBQUksT0FBUSxLQUFLLFFBQVMsSUFBSSxJQUFJLE9BQVEsS0FBSztBQUFBO0FBQUE7QUFNNUQsT0FBSyxVQUFVLFNBQVM7QUFFeEIsTUFBTSxVQUFVO0FBQUEsSUFDRCxvQkFBSTtBQUFBLElBQ0osb0JBQUk7QUFBQSxJQUNKLG9CQUFJO0FBQUEsSUFDSixvQkFBSTtBQUFBLElBQ0osb0JBQUk7QUFBQSxJQUNKLG9CQUFJO0FBQUEsSUFDSixvQkFBSTtBQUFBLElBQ0osb0JBQUk7QUFBQTtBQUduQixNQUFNLFlBQTBCLG9CQUFJO0FBRXBDLE1BQU0sU0FBdUIsb0JBQUk7QUFJakMsTUFBTSxRQUFzQixvQkFBSTtBQUNoQyxNQUFNLFFBQXNCLG9CQUFJO0FBQ2hDLE1BQU0sUUFBc0Isb0JBQUk7QUFJaEMsTUFBTSxNQUFvQixvQkFBSTtBQUM5QixNQUFNLE1BQW9CLG9CQUFJO0FBQzlCLE1BQU0sTUFBb0Isb0JBQUk7QUFFOUIsTUFBTSxVQUF3QixvQkFBSTtBQUNsQyxNQUFNLFdBQXlCLG9CQUFJO0FBQ25DLE1BQU0sa0JBQWdDLG9CQUFJO0FBQzFDLE1BQU0sWUFBMEIsb0JBQUk7QUFFcEMsc0JBQXFCLE1BQU0sSUFBSSxJQUFJLElBQUksU0FBVTtBQUVoRCxhQUFVLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUk7QUFFdEQsZ0JBQVUsVUFBVyxNQUFNO0FBRTNCLFlBQU0sSUFBSSxRQUFRLElBQUksS0FBSyxJQUFLLFVBQVUsS0FBTSxRQUFRLElBQUksS0FBSyxJQUFLLFVBQVUsS0FBTSxRQUFRLElBQUksS0FBSyxJQUFLLFVBQVU7QUFFdEgsWUFBTSxLQUFLLEdBQUcsSUFBSztBQUNuQixZQUFNLEtBQUssR0FBRyxJQUFLO0FBQ25CLFlBQU0sS0FBSyxHQUFHLElBQUs7QUFFbkIsVUFBSyxLQUFLLElBQUssQ0FBRSxLQUFLLElBQUssSUFBSSxJQUFJLEtBQU0sS0FBSyxJQUFLLElBQUksSUFBSSxPQUFTLEdBQUk7QUFJdkUsZUFBTztBQUFBO0FBQUE7QUFNVCxXQUFPO0FBQUE7QUFJUixNQUFNLFNBQXVCLG9CQUFJO0FBQ2pDLE1BQU0sUUFBc0Isb0JBQUk7QUFDaEMsTUFBTSxtQkFBaUMsb0JBQUk7QUFDM0MsTUFBTSxXQUF5QixvQkFBSTtBQUVuQyxxQkFBYTtBQUFBLElBRVosWUFBYSxTQUFTLElBQUksV0FBVyxTQUFTLElBQU07QUFFbkQsV0FBSyxTQUFTO0FBQ2QsV0FBSyxTQUFTO0FBQUE7QUFBQSxJQUlmLElBQUssUUFBUSxRQUFTO0FBRXJCLFdBQUssT0FBTyxLQUFNO0FBQ2xCLFdBQUssU0FBUztBQUVkLGFBQU87QUFBQTtBQUFBLElBSVIsY0FBZSxRQUFRLGdCQUFpQjtBQUV2QyxZQUFNLFNBQVMsS0FBSztBQUVwQixVQUFLLG1CQUFtQixRQUFZO0FBRW5DLGVBQU8sS0FBTTtBQUFBLGFBRVA7QUFFTixlQUFPLGNBQWUsUUFBUyxVQUFXO0FBQUE7QUFJM0MsVUFBSSxjQUFjO0FBRWxCLGVBQVUsSUFBSSxHQUFHLEtBQUssT0FBTyxRQUFRLElBQUksSUFBSSxLQUFPO0FBRW5ELHNCQUFjLEtBQUssSUFBSyxhQUFhLE9BQU8sa0JBQW1CLE9BQVE7QUFBQTtBQUl4RSxXQUFLLFNBQVMsS0FBSyxLQUFNO0FBRXpCLGFBQU87QUFBQTtBQUFBLElBSVIsS0FBTSxRQUFTO0FBRWQsV0FBSyxPQUFPLEtBQU0sT0FBTztBQUN6QixXQUFLLFNBQVMsT0FBTztBQUVyQixhQUFPO0FBQUE7QUFBQSxJQUlSLFVBQVU7QUFFVCxhQUFTLEtBQUssU0FBUztBQUFBO0FBQUEsSUFJeEIsWUFBWTtBQUVYLFdBQUssT0FBTyxJQUFLLEdBQUcsR0FBRztBQUN2QixXQUFLLFNBQVM7QUFFZCxhQUFPO0FBQUE7QUFBQSxJQUlSLGNBQWUsT0FBUTtBQUV0QixhQUFTLE1BQU0sa0JBQW1CLEtBQUssV0FBYyxLQUFLLFNBQVMsS0FBSztBQUFBO0FBQUEsSUFJekUsZ0JBQWlCLE9BQVE7QUFFeEIsYUFBUyxNQUFNLFdBQVksS0FBSyxVQUFXLEtBQUs7QUFBQTtBQUFBLElBSWpELGlCQUFrQixRQUFTO0FBRTFCLFlBQU0sWUFBWSxLQUFLLFNBQVMsT0FBTztBQUV2QyxhQUFPLE9BQU8sT0FBTyxrQkFBbUIsS0FBSyxXQUFjLFlBQVk7QUFBQTtBQUFBLElBSXhFLGNBQWUsS0FBTTtBQUVwQixhQUFPLElBQUksaUJBQWtCO0FBQUE7QUFBQSxJQUk5QixnQkFBaUIsT0FBUTtBQUV4QixhQUFPLEtBQUssSUFBSyxNQUFNLGdCQUFpQixLQUFLLFlBQWMsS0FBSztBQUFBO0FBQUEsSUFJakUsV0FBWSxPQUFPLFFBQVM7QUFFM0IsWUFBTSxnQkFBZ0IsS0FBSyxPQUFPLGtCQUFtQjtBQUVyRCxVQUFLLFdBQVcsUUFBWTtBQUUzQixnQkFBUSxLQUFNO0FBQ2QsaUJBQVMsSUFBSTtBQUFBO0FBSWQsYUFBTyxLQUFNO0FBRWIsVUFBSyxnQkFBa0IsS0FBSyxTQUFTLEtBQUssUUFBVztBQUVwRCxlQUFPLElBQUssS0FBSyxRQUFTO0FBQzFCLGVBQU8sZUFBZ0IsS0FBSyxRQUFTLElBQUssS0FBSztBQUFBO0FBSWhELGFBQU87QUFBQTtBQUFBLElBSVIsZUFBZ0IsUUFBUztBQUV4QixVQUFLLFdBQVcsUUFBWTtBQUUzQixnQkFBUSxLQUFNO0FBQ2QsaUJBQVMsSUFBSTtBQUFBO0FBSWQsVUFBSyxLQUFLLFdBQVk7QUFHckIsZUFBTztBQUNQLGVBQU87QUFBQTtBQUlSLGFBQU8sSUFBSyxLQUFLLFFBQVEsS0FBSztBQUM5QixhQUFPLGVBQWdCLEtBQUs7QUFFNUIsYUFBTztBQUFBO0FBQUEsSUFJUixhQUFjLFFBQVM7QUFFdEIsV0FBSyxPQUFPLGFBQWM7QUFDMUIsV0FBSyxTQUFTLEtBQUssU0FBUyxPQUFPO0FBRW5DLGFBQU87QUFBQTtBQUFBLElBSVIsVUFBVyxRQUFTO0FBRW5CLFdBQUssT0FBTyxJQUFLO0FBRWpCLGFBQU87QUFBQTtBQUFBLElBSVIsY0FBZSxPQUFRO0FBSXRCLGVBQVMsV0FBWSxPQUFPLEtBQUs7QUFFakMsWUFBTSxXQUFXLFNBQVM7QUFFMUIsVUFBSyxXQUFhLEtBQUssU0FBUyxLQUFLLFFBQVc7QUFFL0MsY0FBTSxTQUFTLEtBQUssS0FBTTtBQUMxQixjQUFNLG9CQUFzQixVQUFTLEtBQUssVUFBVztBQU1yRCxhQUFLLE9BQU8sSUFBSyxTQUFTLGVBQWdCLG9CQUFvQjtBQUM5RCxhQUFLLFVBQVU7QUFBQTtBQUloQixhQUFPO0FBQUE7QUFBQSxJQUlSLE1BQU8sUUFBUztBQVFmLHVCQUFpQixXQUFZLE9BQU8sUUFBUSxLQUFLLFFBQVMsWUFBWSxlQUFnQixPQUFPO0FBRTdGLFdBQUssY0FBZSxNQUFNLEtBQU0sT0FBTyxRQUFTLElBQUs7QUFDckQsV0FBSyxjQUFlLE1BQU0sS0FBTSxPQUFPLFFBQVMsSUFBSztBQUVyRCxhQUFPO0FBQUE7QUFBQSxJQUlSLE9BQVEsUUFBUztBQUVoQixhQUFPLE9BQU8sT0FBTyxPQUFRLEtBQUssV0FBYyxPQUFPLFdBQVcsS0FBSztBQUFBO0FBQUEsSUFJeEUsUUFBUTtBQUVQLGFBQU8sSUFBSSxLQUFLLGNBQWMsS0FBTTtBQUFBO0FBQUE7QUFNdEMsTUFBTSxZQUEwQixvQkFBSTtBQUNwQyxNQUFNLGFBQTJCLG9CQUFJO0FBQ3JDLE1BQU0sVUFBd0Isb0JBQUk7QUFDbEMsTUFBTSxRQUFzQixvQkFBSTtBQUVoQyxNQUFNLFNBQXVCLG9CQUFJO0FBQ2pDLE1BQU0sU0FBdUIsb0JBQUk7QUFDakMsTUFBTSxZQUEwQixvQkFBSTtBQUVwQyxrQkFBVTtBQUFBLElBRVQsWUFBYSxTQUFTLElBQUksV0FBVyxZQUFZLElBQUksUUFBUyxHQUFHLEdBQUcsS0FBUTtBQUUzRSxXQUFLLFNBQVM7QUFDZCxXQUFLLFlBQVk7QUFBQTtBQUFBLElBSWxCLElBQUssUUFBUSxXQUFZO0FBRXhCLFdBQUssT0FBTyxLQUFNO0FBQ2xCLFdBQUssVUFBVSxLQUFNO0FBRXJCLGFBQU87QUFBQTtBQUFBLElBSVIsS0FBTSxLQUFNO0FBRVgsV0FBSyxPQUFPLEtBQU0sSUFBSTtBQUN0QixXQUFLLFVBQVUsS0FBTSxJQUFJO0FBRXpCLGFBQU87QUFBQTtBQUFBLElBSVIsR0FBSSxHQUFHLFFBQVM7QUFFZixVQUFLLFdBQVcsUUFBWTtBQUUzQixnQkFBUSxLQUFNO0FBQ2QsaUJBQVMsSUFBSTtBQUFBO0FBSWQsYUFBTyxPQUFPLEtBQU0sS0FBSyxXQUFZLGVBQWdCLEdBQUksSUFBSyxLQUFLO0FBQUE7QUFBQSxJQUlwRSxPQUFRLEdBQUk7QUFFWCxXQUFLLFVBQVUsS0FBTSxHQUFJLElBQUssS0FBSyxRQUFTO0FBRTVDLGFBQU87QUFBQTtBQUFBLElBSVIsT0FBUSxHQUFJO0FBRVgsV0FBSyxPQUFPLEtBQU0sS0FBSyxHQUFJLEdBQUc7QUFFOUIsYUFBTztBQUFBO0FBQUEsSUFJUixvQkFBcUIsT0FBTyxRQUFTO0FBRXBDLFVBQUssV0FBVyxRQUFZO0FBRTNCLGdCQUFRLEtBQU07QUFDZCxpQkFBUyxJQUFJO0FBQUE7QUFJZCxhQUFPLFdBQVksT0FBTyxLQUFLO0FBRS9CLFlBQU0sb0JBQW9CLE9BQU8sSUFBSyxLQUFLO0FBRTNDLFVBQUssb0JBQW9CLEdBQUk7QUFFNUIsZUFBTyxPQUFPLEtBQU0sS0FBSztBQUFBO0FBSTFCLGFBQU8sT0FBTyxLQUFNLEtBQUssV0FBWSxlQUFnQixtQkFBb0IsSUFBSyxLQUFLO0FBQUE7QUFBQSxJQUlwRixnQkFBaUIsT0FBUTtBQUV4QixhQUFPLEtBQUssS0FBTSxLQUFLLGtCQUFtQjtBQUFBO0FBQUEsSUFJM0Msa0JBQW1CLE9BQVE7QUFFMUIsWUFBTSxvQkFBb0IsVUFBVSxXQUFZLE9BQU8sS0FBSyxRQUFTLElBQUssS0FBSztBQUkvRSxVQUFLLG9CQUFvQixHQUFJO0FBRTVCLGVBQU8sS0FBSyxPQUFPLGtCQUFtQjtBQUFBO0FBSXZDLGdCQUFVLEtBQU0sS0FBSyxXQUFZLGVBQWdCLG1CQUFvQixJQUFLLEtBQUs7QUFFL0UsYUFBTyxVQUFVLGtCQUFtQjtBQUFBO0FBQUEsSUFJckMsb0JBQXFCLElBQUksSUFBSSxvQkFBb0Isd0JBQXlCO0FBU3pFLGlCQUFXLEtBQU0sSUFBSyxJQUFLLElBQUssZUFBZ0I7QUFDaEQsY0FBUSxLQUFNLElBQUssSUFBSyxJQUFLO0FBQzdCLFlBQU0sS0FBTSxLQUFLLFFBQVMsSUFBSztBQUUvQixZQUFNLFlBQVksR0FBRyxXQUFZLE1BQU87QUFDeEMsWUFBTSxNQUFNLENBQUUsS0FBSyxVQUFVLElBQUs7QUFDbEMsWUFBTSxLQUFLLE1BQU0sSUFBSyxLQUFLO0FBQzNCLFlBQU0sS0FBSyxDQUFFLE1BQU0sSUFBSztBQUN4QixZQUFNLElBQUksTUFBTTtBQUNoQixZQUFNLE1BQU0sS0FBSyxJQUFLLElBQUksTUFBTTtBQUNoQyxVQUFJLElBQUksSUFBSSxTQUFTO0FBRXJCLFVBQUssTUFBTSxHQUFJO0FBSWQsYUFBSyxNQUFNLEtBQUs7QUFDaEIsYUFBSyxNQUFNLEtBQUs7QUFDaEIsaUJBQVMsWUFBWTtBQUVyQixZQUFLLE1BQU0sR0FBSTtBQUVkLGNBQUssTUFBTSxDQUFFLFFBQVM7QUFFckIsZ0JBQUssTUFBTSxRQUFTO0FBS25CLG9CQUFNLFNBQVMsSUFBSTtBQUNuQixvQkFBTTtBQUNOLG9CQUFNO0FBQ04sd0JBQVUsS0FBTyxNQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU8sS0FBTyxPQUFNLEtBQUssS0FBSyxJQUFJLE1BQU87QUFBQSxtQkFFeEU7QUFJTixtQkFBSztBQUNMLG1CQUFLLEtBQUssSUFBSyxHQUFHLENBQUksT0FBTSxLQUFLO0FBQ2pDLHdCQUFVLENBQUUsS0FBSyxLQUFLLEtBQU8sTUFBSyxJQUFJLE1BQU87QUFBQTtBQUFBLGlCQUl4QztBQUlOLGlCQUFLLENBQUU7QUFDUCxpQkFBSyxLQUFLLElBQUssR0FBRyxDQUFJLE9BQU0sS0FBSztBQUNqQyxzQkFBVSxDQUFFLEtBQUssS0FBSyxLQUFPLE1BQUssSUFBSSxNQUFPO0FBQUE7QUFBQSxlQUl4QztBQUVOLGNBQUssTUFBTSxDQUFFLFFBQVM7QUFJckIsaUJBQUssS0FBSyxJQUFLLEdBQUcsQ0FBSSxFQUFFLE1BQU0sWUFBWTtBQUMxQyxpQkFBTyxLQUFLLElBQU0sQ0FBRSxZQUFZLEtBQUssSUFBSyxLQUFLLElBQUssQ0FBRSxXQUFXLENBQUUsS0FBTTtBQUN6RSxzQkFBVSxDQUFFLEtBQUssS0FBSyxLQUFPLE1BQUssSUFBSSxNQUFPO0FBQUEscUJBRWxDLE1BQU0sUUFBUztBQUkxQixpQkFBSztBQUNMLGlCQUFLLEtBQUssSUFBSyxLQUFLLElBQUssQ0FBRSxXQUFXLENBQUUsS0FBTTtBQUM5QyxzQkFBVSxLQUFPLE1BQUssSUFBSSxNQUFPO0FBQUEsaUJBRTNCO0FBSU4saUJBQUssS0FBSyxJQUFLLEdBQUcsQ0FBSSxPQUFNLFlBQVk7QUFDeEMsaUJBQU8sS0FBSyxJQUFNLFlBQVksS0FBSyxJQUFLLEtBQUssSUFBSyxDQUFFLFdBQVcsQ0FBRSxLQUFNO0FBQ3ZFLHNCQUFVLENBQUUsS0FBSyxLQUFLLEtBQU8sTUFBSyxJQUFJLE1BQU87QUFBQTtBQUFBO0FBQUEsYUFNekM7QUFJTixhQUFPLE1BQU0sSUFBTSxDQUFFLFlBQVk7QUFDakMsYUFBSyxLQUFLLElBQUssR0FBRyxDQUFJLE9BQU0sS0FBSztBQUNqQyxrQkFBVSxDQUFFLEtBQUssS0FBSyxLQUFPLE1BQUssSUFBSSxNQUFPO0FBQUE7QUFJOUMsVUFBSyxvQkFBcUI7QUFFekIsMkJBQW1CLEtBQU0sS0FBSyxXQUFZLGVBQWdCLElBQUssSUFBSyxLQUFLO0FBQUE7QUFJMUUsVUFBSyx3QkFBeUI7QUFFN0IsK0JBQXVCLEtBQU0sU0FBVSxlQUFnQixJQUFLLElBQUs7QUFBQTtBQUlsRSxhQUFPO0FBQUE7QUFBQSxJQUlSLGdCQUFpQixRQUFRLFFBQVM7QUFFakMsZ0JBQVUsV0FBWSxPQUFPLFFBQVEsS0FBSztBQUMxQyxZQUFNLE1BQU0sVUFBVSxJQUFLLEtBQUs7QUFDaEMsWUFBTSxLQUFLLFVBQVUsSUFBSyxhQUFjLE1BQU07QUFDOUMsWUFBTSxVQUFVLE9BQU8sU0FBUyxPQUFPO0FBRXZDLFVBQUssS0FBSztBQUFVLGVBQU87QUFFM0IsWUFBTSxNQUFNLEtBQUssS0FBTSxVQUFVO0FBR2pDLFlBQU0sS0FBSyxNQUFNO0FBR2pCLFlBQU0sS0FBSyxNQUFNO0FBR2pCLFVBQUssS0FBSyxLQUFLLEtBQUs7QUFBSSxlQUFPO0FBSy9CLFVBQUssS0FBSztBQUFJLGVBQU8sS0FBSyxHQUFJLElBQUk7QUFHbEMsYUFBTyxLQUFLLEdBQUksSUFBSTtBQUFBO0FBQUEsSUFJckIsaUJBQWtCLFFBQVM7QUFFMUIsYUFBTyxLQUFLLGtCQUFtQixPQUFPLFdBQWMsT0FBTyxTQUFTLE9BQU87QUFBQTtBQUFBLElBSTVFLGdCQUFpQixPQUFRO0FBRXhCLFlBQU0sY0FBYyxNQUFNLE9BQU8sSUFBSyxLQUFLO0FBRTNDLFVBQUssZ0JBQWdCLEdBQUk7QUFHeEIsWUFBSyxNQUFNLGdCQUFpQixLQUFLLFlBQWEsR0FBSTtBQUVqRCxpQkFBTztBQUFBO0FBTVIsZUFBTztBQUFBO0FBSVIsWUFBTSxJQUFJLENBQUksTUFBSyxPQUFPLElBQUssTUFBTSxVQUFXLE1BQU0sWUFBYTtBQUluRSxhQUFPLEtBQUssSUFBSSxJQUFJO0FBQUE7QUFBQSxJQUlyQixlQUFnQixPQUFPLFFBQVM7QUFFL0IsWUFBTSxJQUFJLEtBQUssZ0JBQWlCO0FBRWhDLFVBQUssTUFBTSxNQUFPO0FBRWpCLGVBQU87QUFBQTtBQUlSLGFBQU8sS0FBSyxHQUFJLEdBQUc7QUFBQTtBQUFBLElBSXBCLGdCQUFpQixPQUFRO0FBSXhCLFlBQU0sY0FBYyxNQUFNLGdCQUFpQixLQUFLO0FBRWhELFVBQUssZ0JBQWdCLEdBQUk7QUFFeEIsZUFBTztBQUFBO0FBSVIsWUFBTSxjQUFjLE1BQU0sT0FBTyxJQUFLLEtBQUs7QUFFM0MsVUFBSyxjQUFjLGNBQWMsR0FBSTtBQUVwQyxlQUFPO0FBQUE7QUFNUixhQUFPO0FBQUE7QUFBQSxJQUlSLGFBQWMsS0FBSyxRQUFTO0FBRTNCLFVBQUksTUFBTSxNQUFNLE9BQU8sT0FBTyxPQUFPO0FBRXJDLFlBQU0sVUFBVSxJQUFJLEtBQUssVUFBVSxHQUNsQyxVQUFVLElBQUksS0FBSyxVQUFVLEdBQzdCLFVBQVUsSUFBSSxLQUFLLFVBQVU7QUFFOUIsWUFBTSxTQUFTLEtBQUs7QUFFcEIsVUFBSyxXQUFXLEdBQUk7QUFFbkIsZUFBUyxLQUFJLElBQUksSUFBSSxPQUFPLEtBQU07QUFDbEMsZUFBUyxLQUFJLElBQUksSUFBSSxPQUFPLEtBQU07QUFBQSxhQUU1QjtBQUVOLGVBQVMsS0FBSSxJQUFJLElBQUksT0FBTyxLQUFNO0FBQ2xDLGVBQVMsS0FBSSxJQUFJLElBQUksT0FBTyxLQUFNO0FBQUE7QUFJbkMsVUFBSyxXQUFXLEdBQUk7QUFFbkIsZ0JBQVUsS0FBSSxJQUFJLElBQUksT0FBTyxLQUFNO0FBQ25DLGdCQUFVLEtBQUksSUFBSSxJQUFJLE9BQU8sS0FBTTtBQUFBLGFBRTdCO0FBRU4sZ0JBQVUsS0FBSSxJQUFJLElBQUksT0FBTyxLQUFNO0FBQ25DLGdCQUFVLEtBQUksSUFBSSxJQUFJLE9BQU8sS0FBTTtBQUFBO0FBSXBDLFVBQU8sT0FBTyxTQUFhLFFBQVE7QUFBUyxlQUFPO0FBS25ELFVBQUssUUFBUSxRQUFRLFNBQVM7QUFBTyxlQUFPO0FBRTVDLFVBQUssUUFBUSxRQUFRLFNBQVM7QUFBTyxlQUFPO0FBRTVDLFVBQUssV0FBVyxHQUFJO0FBRW5CLGdCQUFVLEtBQUksSUFBSSxJQUFJLE9BQU8sS0FBTTtBQUNuQyxnQkFBVSxLQUFJLElBQUksSUFBSSxPQUFPLEtBQU07QUFBQSxhQUU3QjtBQUVOLGdCQUFVLEtBQUksSUFBSSxJQUFJLE9BQU8sS0FBTTtBQUNuQyxnQkFBVSxLQUFJLElBQUksSUFBSSxPQUFPLEtBQU07QUFBQTtBQUlwQyxVQUFPLE9BQU8sU0FBYSxRQUFRO0FBQVMsZUFBTztBQUVuRCxVQUFLLFFBQVEsUUFBUSxTQUFTO0FBQU8sZUFBTztBQUU1QyxVQUFLLFFBQVEsUUFBUSxTQUFTO0FBQU8sZUFBTztBQUk1QyxVQUFLLE9BQU87QUFBSSxlQUFPO0FBRXZCLGFBQU8sS0FBSyxHQUFJLFFBQVEsSUFBSSxPQUFPLE1BQU07QUFBQTtBQUFBLElBSTFDLGNBQWUsS0FBTTtBQUVwQixhQUFPLEtBQUssYUFBYyxLQUFLLGVBQWdCO0FBQUE7QUFBQSxJQUloRCxrQkFBbUIsR0FBRyxHQUFHLEdBQUcsaUJBQWlCLFFBQVM7QUFNckQsYUFBTyxXQUFZLEdBQUc7QUFDdEIsYUFBTyxXQUFZLEdBQUc7QUFDdEIsZ0JBQVUsYUFBYyxRQUFRO0FBT2hDLFVBQUksTUFBTSxLQUFLLFVBQVUsSUFBSztBQUM5QixVQUFJO0FBRUosVUFBSyxNQUFNLEdBQUk7QUFFZCxZQUFLO0FBQWtCLGlCQUFPO0FBQzlCLGdCQUFPO0FBQUEsaUJBRUksTUFBTSxHQUFJO0FBRXJCLGdCQUFPO0FBQ1AsY0FBTSxDQUFFO0FBQUEsYUFFRjtBQUVOLGVBQU87QUFBQTtBQUlSLFlBQU0sV0FBWSxLQUFLLFFBQVE7QUFDL0IsWUFBTSxTQUFTLFFBQU8sS0FBSyxVQUFVLElBQUssT0FBTyxhQUFjLE9BQU87QUFHdEUsVUFBSyxTQUFTLEdBQUk7QUFFakIsZUFBTztBQUFBO0FBSVIsWUFBTSxTQUFTLFFBQU8sS0FBSyxVQUFVLElBQUssT0FBTyxNQUFPO0FBR3hELFVBQUssU0FBUyxHQUFJO0FBRWpCLGVBQU87QUFBQTtBQUtSLFVBQUssU0FBUyxTQUFTLEtBQU07QUFFNUIsZUFBTztBQUFBO0FBS1IsWUFBTSxNQUFNLENBQUUsUUFBTyxNQUFNLElBQUs7QUFHaEMsVUFBSyxNQUFNLEdBQUk7QUFFZCxlQUFPO0FBQUE7QUFLUixhQUFPLEtBQUssR0FBSSxNQUFNLEtBQUs7QUFBQTtBQUFBLElBSTVCLGFBQWMsU0FBVTtBQUV2QixXQUFLLE9BQU8sYUFBYztBQUMxQixXQUFLLFVBQVUsbUJBQW9CO0FBRW5DLGFBQU87QUFBQTtBQUFBLElBSVIsT0FBUSxLQUFNO0FBRWIsYUFBTyxJQUFJLE9BQU8sT0FBUSxLQUFLLFdBQVksSUFBSSxVQUFVLE9BQVEsS0FBSztBQUFBO0FBQUEsSUFJdkUsUUFBUTtBQUVQLGFBQU8sSUFBSSxLQUFLLGNBQWMsS0FBTTtBQUFBO0FBQUE7QUFNdEMsc0JBQWM7QUFBQSxJQUViLGNBQWM7QUFFYixXQUFLLFdBQVc7QUFBQSxRQUVmO0FBQUEsUUFBRztBQUFBLFFBQUc7QUFBQSxRQUFHO0FBQUEsUUFDVDtBQUFBLFFBQUc7QUFBQSxRQUFHO0FBQUEsUUFBRztBQUFBLFFBQ1Q7QUFBQSxRQUFHO0FBQUEsUUFBRztBQUFBLFFBQUc7QUFBQSxRQUNUO0FBQUEsUUFBRztBQUFBLFFBQUc7QUFBQSxRQUFHO0FBQUE7QUFJVixVQUFLLFVBQVUsU0FBUyxHQUFJO0FBRTNCLGdCQUFRLE1BQU87QUFBQTtBQUFBO0FBQUEsSUFNakIsSUFBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFLLEtBQUssS0FBSyxLQUFNO0FBRXJGLFlBQU0sS0FBSyxLQUFLO0FBRWhCLFNBQUksS0FBTTtBQUFLLFNBQUksS0FBTTtBQUFLLFNBQUksS0FBTTtBQUFLLFNBQUksTUFBTztBQUN4RCxTQUFJLEtBQU07QUFBSyxTQUFJLEtBQU07QUFBSyxTQUFJLEtBQU07QUFBSyxTQUFJLE1BQU87QUFDeEQsU0FBSSxLQUFNO0FBQUssU0FBSSxLQUFNO0FBQUssU0FBSSxNQUFPO0FBQUssU0FBSSxNQUFPO0FBQ3pELFNBQUksS0FBTTtBQUFLLFNBQUksS0FBTTtBQUFLLFNBQUksTUFBTztBQUFLLFNBQUksTUFBTztBQUV6RCxhQUFPO0FBQUE7QUFBQSxJQUlSLFdBQVc7QUFFVixXQUFLLElBRUosR0FBRyxHQUFHLEdBQUcsR0FDVCxHQUFHLEdBQUcsR0FBRyxHQUNULEdBQUcsR0FBRyxHQUFHLEdBQ1QsR0FBRyxHQUFHLEdBQUc7QUFJVixhQUFPO0FBQUE7QUFBQSxJQUlSLFFBQVE7QUFFUCxhQUFPLElBQUksVUFBVSxVQUFXLEtBQUs7QUFBQTtBQUFBLElBSXRDLEtBQU0sR0FBSTtBQUVULFlBQU0sS0FBSyxLQUFLO0FBQ2hCLFlBQU0sS0FBSyxFQUFFO0FBRWIsU0FBSSxLQUFNLEdBQUk7QUFBSyxTQUFJLEtBQU0sR0FBSTtBQUFLLFNBQUksS0FBTSxHQUFJO0FBQUssU0FBSSxLQUFNLEdBQUk7QUFDdkUsU0FBSSxLQUFNLEdBQUk7QUFBSyxTQUFJLEtBQU0sR0FBSTtBQUFLLFNBQUksS0FBTSxHQUFJO0FBQUssU0FBSSxLQUFNLEdBQUk7QUFDdkUsU0FBSSxLQUFNLEdBQUk7QUFBSyxTQUFJLEtBQU0sR0FBSTtBQUFLLFNBQUksTUFBTyxHQUFJO0FBQU0sU0FBSSxNQUFPLEdBQUk7QUFDMUUsU0FBSSxNQUFPLEdBQUk7QUFBTSxTQUFJLE1BQU8sR0FBSTtBQUFNLFNBQUksTUFBTyxHQUFJO0FBQU0sU0FBSSxNQUFPLEdBQUk7QUFFOUUsYUFBTztBQUFBO0FBQUEsSUFJUixhQUFjLEdBQUk7QUFFakIsWUFBTSxLQUFLLEtBQUssVUFBVSxLQUFLLEVBQUU7QUFFakMsU0FBSSxNQUFPLEdBQUk7QUFDZixTQUFJLE1BQU8sR0FBSTtBQUNmLFNBQUksTUFBTyxHQUFJO0FBRWYsYUFBTztBQUFBO0FBQUEsSUFJUixlQUFnQixHQUFJO0FBRW5CLFlBQU0sS0FBSyxFQUFFO0FBRWIsV0FBSyxJQUVKLEdBQUksSUFBSyxHQUFJLElBQUssR0FBSSxJQUFLLEdBQzNCLEdBQUksSUFBSyxHQUFJLElBQUssR0FBSSxJQUFLLEdBQzNCLEdBQUksSUFBSyxHQUFJLElBQUssR0FBSSxJQUFLLEdBQzNCLEdBQUcsR0FBRyxHQUFHO0FBSVYsYUFBTztBQUFBO0FBQUEsSUFJUixhQUFjLE9BQU8sT0FBTyxPQUFRO0FBRW5DLFlBQU0sb0JBQXFCLE1BQU07QUFDakMsWUFBTSxvQkFBcUIsTUFBTTtBQUNqQyxZQUFNLG9CQUFxQixNQUFNO0FBRWpDLGFBQU87QUFBQTtBQUFBLElBSVIsVUFBVyxPQUFPLE9BQU8sT0FBUTtBQUVoQyxXQUFLLElBQ0osTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FDM0IsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FDM0IsTUFBTSxHQUFHLE1BQU0sR0FBRyxNQUFNLEdBQUcsR0FDM0IsR0FBRyxHQUFHLEdBQUc7QUFHVixhQUFPO0FBQUE7QUFBQSxJQUlSLGdCQUFpQixHQUFJO0FBSXBCLFlBQU0sS0FBSyxLQUFLO0FBQ2hCLFlBQU0sS0FBSyxFQUFFO0FBRWIsWUFBTSxTQUFTLElBQUksTUFBTSxvQkFBcUIsR0FBRyxHQUFJO0FBQ3JELFlBQU0sU0FBUyxJQUFJLE1BQU0sb0JBQXFCLEdBQUcsR0FBSTtBQUNyRCxZQUFNLFNBQVMsSUFBSSxNQUFNLG9CQUFxQixHQUFHLEdBQUk7QUFFckQsU0FBSSxLQUFNLEdBQUksS0FBTTtBQUNwQixTQUFJLEtBQU0sR0FBSSxLQUFNO0FBQ3BCLFNBQUksS0FBTSxHQUFJLEtBQU07QUFDcEIsU0FBSSxLQUFNO0FBRVYsU0FBSSxLQUFNLEdBQUksS0FBTTtBQUNwQixTQUFJLEtBQU0sR0FBSSxLQUFNO0FBQ3BCLFNBQUksS0FBTSxHQUFJLEtBQU07QUFDcEIsU0FBSSxLQUFNO0FBRVYsU0FBSSxLQUFNLEdBQUksS0FBTTtBQUNwQixTQUFJLEtBQU0sR0FBSSxLQUFNO0FBQ3BCLFNBQUksTUFBTyxHQUFJLE1BQU87QUFDdEIsU0FBSSxNQUFPO0FBRVgsU0FBSSxNQUFPO0FBQ1gsU0FBSSxNQUFPO0FBQ1gsU0FBSSxNQUFPO0FBQ1gsU0FBSSxNQUFPO0FBRVgsYUFBTztBQUFBO0FBQUEsSUFJUixzQkFBdUIsT0FBUTtBQUU5QixVQUFLLENBQUksVUFBUyxNQUFNLFVBQVk7QUFFbkMsZ0JBQVEsTUFBTztBQUFBO0FBSWhCLFlBQU0sS0FBSyxLQUFLO0FBRWhCLFlBQU0sSUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNLEdBQUcsSUFBSSxNQUFNO0FBQzFDLFlBQU0sSUFBSSxLQUFLLElBQUssSUFBSyxJQUFJLEtBQUssSUFBSztBQUN2QyxZQUFNLElBQUksS0FBSyxJQUFLLElBQUssSUFBSSxLQUFLLElBQUs7QUFDdkMsWUFBTSxJQUFJLEtBQUssSUFBSyxJQUFLLElBQUksS0FBSyxJQUFLO0FBRXZDLFVBQUssTUFBTSxVQUFVLE9BQVE7QUFFNUIsY0FBTSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUk7QUFFbkQsV0FBSSxLQUFNLElBQUk7QUFDZCxXQUFJLEtBQU0sQ0FBRSxJQUFJO0FBQ2hCLFdBQUksS0FBTTtBQUVWLFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLEtBQUssS0FBSztBQUNwQixXQUFJLEtBQU0sQ0FBRSxJQUFJO0FBRWhCLFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLEtBQUssS0FBSztBQUNwQixXQUFJLE1BQU8sSUFBSTtBQUFBLGlCQUVKLE1BQU0sVUFBVSxPQUFRO0FBRW5DLGNBQU0sS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJO0FBRW5ELFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLEtBQUssSUFBSTtBQUNuQixXQUFJLEtBQU0sSUFBSTtBQUVkLFdBQUksS0FBTSxJQUFJO0FBQ2QsV0FBSSxLQUFNLElBQUk7QUFDZCxXQUFJLEtBQU0sQ0FBRTtBQUVaLFdBQUksS0FBTSxLQUFLLElBQUk7QUFDbkIsV0FBSSxLQUFNLEtBQUssS0FBSztBQUNwQixXQUFJLE1BQU8sSUFBSTtBQUFBLGlCQUVKLE1BQU0sVUFBVSxPQUFRO0FBRW5DLGNBQU0sS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJO0FBRW5ELFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLENBQUUsSUFBSTtBQUNoQixXQUFJLEtBQU0sS0FBSyxLQUFLO0FBRXBCLFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLElBQUk7QUFDZCxXQUFJLEtBQU0sS0FBSyxLQUFLO0FBRXBCLFdBQUksS0FBTSxDQUFFLElBQUk7QUFDaEIsV0FBSSxLQUFNO0FBQ1YsV0FBSSxNQUFPLElBQUk7QUFBQSxpQkFFSixNQUFNLFVBQVUsT0FBUTtBQUVuQyxjQUFNLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSTtBQUVuRCxXQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBTSxLQUFLLElBQUk7QUFDbkIsV0FBSSxLQUFNLEtBQUssSUFBSTtBQUVuQixXQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBTSxLQUFLLElBQUk7QUFDbkIsV0FBSSxLQUFNLEtBQUssSUFBSTtBQUVuQixXQUFJLEtBQU0sQ0FBRTtBQUNaLFdBQUksS0FBTSxJQUFJO0FBQ2QsV0FBSSxNQUFPLElBQUk7QUFBQSxpQkFFSixNQUFNLFVBQVUsT0FBUTtBQUVuQyxjQUFNLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSTtBQUVuRCxXQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBTSxLQUFLLEtBQUs7QUFDcEIsV0FBSSxLQUFNLEtBQUssSUFBSTtBQUVuQixXQUFJLEtBQU07QUFDVixXQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBTSxDQUFFLElBQUk7QUFFaEIsV0FBSSxLQUFNLENBQUUsSUFBSTtBQUNoQixXQUFJLEtBQU0sS0FBSyxJQUFJO0FBQ25CLFdBQUksTUFBTyxLQUFLLEtBQUs7QUFBQSxpQkFFVixNQUFNLFVBQVUsT0FBUTtBQUVuQyxjQUFNLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSTtBQUVuRCxXQUFJLEtBQU0sSUFBSTtBQUNkLFdBQUksS0FBTSxDQUFFO0FBQ1osV0FBSSxLQUFNLElBQUk7QUFFZCxXQUFJLEtBQU0sS0FBSyxJQUFJO0FBQ25CLFdBQUksS0FBTSxJQUFJO0FBQ2QsV0FBSSxLQUFNLEtBQUssSUFBSTtBQUVuQixXQUFJLEtBQU0sS0FBSyxJQUFJO0FBQ25CLFdBQUksS0FBTSxJQUFJO0FBQ2QsV0FBSSxNQUFPLEtBQUssSUFBSTtBQUFBO0FBS3JCLFNBQUksS0FBTTtBQUNWLFNBQUksS0FBTTtBQUNWLFNBQUksTUFBTztBQUdYLFNBQUksTUFBTztBQUNYLFNBQUksTUFBTztBQUNYLFNBQUksTUFBTztBQUNYLFNBQUksTUFBTztBQUVYLGFBQU87QUFBQTtBQUFBLElBSVIsMkJBQTRCLEdBQUk7QUFFL0IsYUFBTyxLQUFLLFFBQVMsT0FBTyxHQUFHO0FBQUE7QUFBQSxJQUloQyxPQUFRLEtBQUssUUFBUSxJQUFLO0FBRXpCLFlBQU0sS0FBSyxLQUFLO0FBRWhCLFNBQUcsV0FBWSxLQUFLO0FBRXBCLFVBQUssR0FBRyxlQUFlLEdBQUk7QUFJMUIsV0FBRyxJQUFJO0FBQUE7QUFJUixTQUFHO0FBQ0gsU0FBRyxhQUFjLElBQUk7QUFFckIsVUFBSyxHQUFHLGVBQWUsR0FBSTtBQUkxQixZQUFLLEtBQUssSUFBSyxHQUFHLE9BQVEsR0FBSTtBQUU3QixhQUFHLEtBQUs7QUFBQSxlQUVGO0FBRU4sYUFBRyxLQUFLO0FBQUE7QUFJVCxXQUFHO0FBQ0gsV0FBRyxhQUFjLElBQUk7QUFBQTtBQUl0QixTQUFHO0FBQ0gsU0FBRyxhQUFjLElBQUk7QUFFckIsU0FBSSxLQUFNLEdBQUc7QUFBRyxTQUFJLEtBQU0sR0FBRztBQUFHLFNBQUksS0FBTSxHQUFHO0FBQzdDLFNBQUksS0FBTSxHQUFHO0FBQUcsU0FBSSxLQUFNLEdBQUc7QUFBRyxTQUFJLEtBQU0sR0FBRztBQUM3QyxTQUFJLEtBQU0sR0FBRztBQUFHLFNBQUksS0FBTSxHQUFHO0FBQUcsU0FBSSxNQUFPLEdBQUc7QUFFOUMsYUFBTztBQUFBO0FBQUEsSUFJUixTQUFVLEdBQUcsR0FBSTtBQUVoQixVQUFLLE1BQU0sUUFBWTtBQUV0QixnQkFBUSxLQUFNO0FBQ2QsZUFBTyxLQUFLLGlCQUFrQixHQUFHO0FBQUE7QUFJbEMsYUFBTyxLQUFLLGlCQUFrQixNQUFNO0FBQUE7QUFBQSxJQUlyQyxZQUFhLEdBQUk7QUFFaEIsYUFBTyxLQUFLLGlCQUFrQixHQUFHO0FBQUE7QUFBQSxJQUlsQyxpQkFBa0IsR0FBRyxHQUFJO0FBRXhCLFlBQU0sS0FBSyxFQUFFO0FBQ2IsWUFBTSxLQUFLLEVBQUU7QUFDYixZQUFNLEtBQUssS0FBSztBQUVoQixZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSTtBQUM3RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSTtBQUM3RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxLQUFNLE1BQU0sR0FBSTtBQUM5RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxLQUFNLE1BQU0sR0FBSTtBQUU5RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSTtBQUM3RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSTtBQUM3RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxLQUFNLE1BQU0sR0FBSTtBQUM5RCxZQUFNLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxLQUFNLE1BQU0sR0FBSTtBQUU5RCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLE1BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUVyRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLE1BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUVyRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLE1BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNyRCxTQUFJLE1BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUVyRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLEtBQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNwRCxTQUFJLE1BQU8sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTTtBQUNyRCxTQUFJLE1B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LElBQ3ZELE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxJQUFLLE1BQU0sR0FBSSxLQUFNLE1BQU0sR0FBSSxLQUN4RCxNQUFNLEdBQUksS0FBTSxNQUFNLEdBQUksS0FBTSxNQUFNLEdBQUksS0FBTSxNQUFNLEdBQUksS0FFMUQsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FDNUcsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FDNUcsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sS0FDNUcsTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFFN0csWUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU07QUFFdEQsVUFBSyxRQUFRO0FBQUksZUFBTyxLQUFLLElBQUssR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUc7QUFFL0UsWUFBTSxTQUFTLElBQUk7QUFFbkIsU0FBSSxLQUFNLE1BQU07QUFDaEIsU0FBSSxLQUFRLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFRO0FBQzFILFNBQUksS0FBUSxPQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBUTtBQUMxSCxTQUFJLEtBQVEsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQVE7QUFFMUgsU0FBSSxLQUFNLE1BQU07QUFDaEIsU0FBSSxLQUFRLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFRO0FBQzFILFNBQUksS0FBUSxPQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBUTtBQUMxSCxTQUFJLEtBQVEsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQVE7QUFFMUgsU0FBSSxLQUFNLE1BQU07QUFDaEIsU0FBSSxLQUFRLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxPQUFRO0FBQzFILFNBQUksTUFBUyxPQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sT0FBUTtBQUMzSCxTQUFJLE1BQVMsT0FBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE9BQVE7QUFFM0gsU0FBSSxNQUFPLE1BQU07QUFDakIsU0FBSSxNQUFTLE9BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxNQUFNLE1BQU0sTUFBTSxN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RXRCLE1BQUksa0JBQWtCO0FBRXRCLE1BQUksaUJBQWlCO0FBRXJCLE1BQUksaUJBQWlCO0FBRXJCLE1BQUksbUJBQW1CO0FBRXZCLE1BQUksbUJBQW1CO0FBRXZCLE1BQUksa0JBQWtCO0FBRXRCLE1BQUksa0JBQWtCO0FBRXRCLE1BQUksZ0JBQWdCO0FBRXBCLE1BQUksZ0JBQWdCO0FBRXBCLE1BQUksaUJBQWlCO0FBRXJCLE1BQUksaUJBQWlCO0FBRXJCLE1BQUksb0JBQW9CO0FBRXhCLE1BQUksb0JBQW9CO0FBRXhCLE1BQUksY0FBYztBQUVsQixNQUFJLGNBQWM7QUFFbEIsTUFBSSxjQUFjO0FBRWxCLE1BQUksY0FBYztBQUVsQixNQUFJLGNBQWM7QUFFbEIsTUFBSSxjQUFjO0FBRWxCLE1BQUksY0FBYztBQUVsQixNQUFJLGNBQWM7QUFFbEIsTUFBTSxjQUFjO0FBQUEsSUFDbkI7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUVBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBO0FBT0QsTUFBTSxjQUFjO0FBQUEsSUFFbkIsUUFBUTtBQUFBLE1BRVAsU0FBUyxDQUFFLE9BQU8sSUFBSSxNQUFPO0FBQUEsTUFDN0IsU0FBUyxDQUFFLE9BQU87QUFBQSxNQUVsQixLQUFLLENBQUUsT0FBTztBQUFBLE1BQ2Qs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 diff --git a/src/main.js b/src/main.js index 737fb0bf..1eb41fab 100644 --- a/src/main.js +++ b/src/main.js @@ -152,7 +152,7 @@ class Main { console.time("Generate Tiling"); const tiling = new RegularHyperbolicTesselation(this.spec).generateTiling( - false + true ); console.timeEnd("Generate Tiling"); diff --git a/src/utilities/createGeometries.js b/src/utilities/createGeometries.js index 892e35cb..708632f4 100644 --- a/src/utilities/createGeometries.js +++ b/src/utilities/createGeometries.js @@ -31,9 +31,9 @@ function subdivideHyperbolicArc( arc, numDivisions ) { // calculate the number of subdivisions required to break the arc into an // even number of pieces (or 1 in case of tiny polygons) - numDivisions = numDivisions || ( arc.arcLength > 0.001 ) + numDivisions = numDivisions || ( arc.arcLength > 0.001 ? 2 * Math.ceil( arc.arcLength ) // currently always = 2 - : 1; + : 1 ); // calculate spacing based on number of points const spacing = arc.arcLength / numDivisions; @@ -65,7 +65,8 @@ function subdivideHyperbolicArc( arc, numDivisions ) { function subdivideHyperbolicPolygonEdges( polygon ) { const subdivisionEdge = findSubdivisionEdge( polygon ); - const edge1Points = subdivideHyperbolicArc( polygon.edges[subdivisionEdge] ); + const forceDivisions = 3; + const edge1Points = subdivideHyperbolicArc( polygon.edges[subdivisionEdge], forceDivisions ); const numDivisions = edge1Points.length - 1; @@ -129,7 +130,7 @@ function subdivideHyperbolicPolygon( polygon ) { const startPoint = subdividedEdges[2][( numDivisions - i )]; const endPoint = subdividedEdges[1][i]; // this.subdivideInteriorArc( startPoint, endPoint, i ); - const newPoints = subdivideLine( startPoint, endPoint, i ); + const newPoints = subdivideLine( startPoint, endPoint, numDivisions, i ); // for ( let j = 0; j < newPoints.length; j++) { // flatPoints.push( @@ -256,30 +257,13 @@ export default function createGeometries( tiling ) { edgeStartingVertex += m; } + return [ positionIndex, uvIndex ]; } if ( polygon.materialIndex === 0 ) { - addPositionsAndUvs( positionsA, positionAIndex, uvsA, uvAIndex ); - if ( divisions === 1 ) { - positionAIndex += 9; - uvAIndex += 6; - } else if ( divisions === 2 ) { - positionAIndex += 36; - uvAIndex += 24; - } else { - console.error( 'Too many divisions!!' ); - } + [ positionAIndex, uvAIndex ] = addPositionsAndUvs( positionsA, positionAIndex, uvsA, uvAIndex ); } else { - addPositionsAndUvs( positionsB, positionBIndex, uvsB, uvBIndex ); - if ( divisions === 1 ) { - positionBIndex += 9; - uvBIndex += 6; - } else if ( divisions === 2 ) { - positionBIndex += 36; - uvBIndex += 24; - } else { - console.error( 'Too many divisions!!' ); - } + [ positionBIndex, uvBIndex ] = addPositionsAndUvs( positionsB, positionBIndex, uvsB, uvBIndex ); } }