UNPKG

@mapbox/tilebelt

Version:
212 lines 21.2 kB
const d2r = Math.PI / 180; const r2d = 180 / Math.PI; function tile2lon(x, z) { return (x / Math.pow(2, z)) * 360 - 180; } function tile2lat(y, z) { const n = Math.PI - (2 * Math.PI * y) / Math.pow(2, z); return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n))); } /** * Get the bbox of a tile * * const bbox = tileToBBOX([5, 10, 10]) * //=bbox */ export function tileToBBOX(tile) { const e = tile2lon(tile[0] + 1, tile[2]); const w = tile2lon(tile[0], tile[2]); const s = tile2lat(tile[1] + 1, tile[2]); const n = tile2lat(tile[1], tile[2]); return [w, s, e, n]; } /** * Get a geojson representation of a tile * * const poly = tileToGeoJSON([5, 10, 10]) * //=poly */ export function tileToGeoJSON(tile) { const bbox = tileToBBOX(tile); return { type: 'Polygon', coordinates: [ [ [bbox[0], bbox[3]], [bbox[0], bbox[1]], [bbox[2], bbox[1]], [bbox[2], bbox[3]], [bbox[0], bbox[3]], ], ], }; } /** * Get the tile for a point at a specified zoom level * * const tile = pointToTile(1, 1, 20) * //=tile */ export function pointToTile(lon, lat, z) { const tile = pointToTileFraction(lon, lat, z); tile[0] = Math.floor(tile[0]); tile[1] = Math.floor(tile[1]); return tile; } /** * Get the precise fractional tile location for a point at a zoom level * * const tile = pointToTileFraction(30.5, 50.5, 15) * //=tile */ export function pointToTileFraction(lon, lat, z) { const sin = Math.sin(lat * d2r); const z2 = Math.pow(2, z); let x = z2 * (lon / 360 + 0.5); const y = z2 * (0.5 - (0.25 * Math.log((1 + sin) / (1 - sin))) / Math.PI); // Wrap Tile X x = x % z2; if (x < 0) x = x + z2; return [x, y, z]; } /** * Get the 4 tiles one zoom level higher * * const tiles = getChildren([5, 10, 10]) * //=tiles */ export function getChildren(tile) { return [ [tile[0] * 2, tile[1] * 2, tile[2] + 1], [tile[0] * 2 + 1, tile[1] * 2, tile[2] + 1], [tile[0] * 2 + 1, tile[1] * 2 + 1, tile[2] + 1], [tile[0] * 2, tile[1] * 2 + 1, tile[2] + 1], ]; } /** * Get the tile one zoom level lower * * const tile = getParent([5, 10, 10]) * //=tile */ export function getParent(tile) { return [tile[0] >> 1, tile[1] >> 1, tile[2] - 1]; } export function getSiblings(tile) { return getChildren(getParent(tile)); } /** * Get the 3 sibling tiles for a tile * * const tiles = getSiblings([5, 10, 10]) * //=boolean */ export function hasSiblings(tile, tiles) { const siblings = getSiblings(tile); for (let i = 0; i < siblings.length; i++) { if (!hasTile(tiles, siblings[i])) return false; } return true; } /** * Check to see if an array of tiles contains a particular tile * * const tiles = [ * [0, 0, 5], * [0, 1, 5], * [1, 1, 5], * [1, 0, 5] * ] * hasTile(tiles, [0, 0, 5]) * //=boolean */ export function hasTile(tiles, tile) { for (let i = 0; i < tiles.length; i++) { if (tilesEqual(tiles[i], tile)) return true; } return false; } /** * Check to see if two tiles are the same * * tilesEqual([0, 1, 5], [0, 0, 5]) * //=boolean */ export function tilesEqual(tile1, tile2) { return (tile1[0] === tile2[0] && tile1[1] === tile2[1] && tile1[2] === tile2[2]); } /** * Get the quadkey for a tile * * const quadkey = tileToQuadkey([0, 1, 5]) * //=quadkey */ export function tileToQuadkey(tile) { let index = ''; for (let z = tile[2]; z > 0; z--) { let b = 0; const mask = 1 << (z - 1); if ((tile[0] & mask) !== 0) b++; if ((tile[1] & mask) !== 0) b += 2; index += b.toString(); } return index; } /** * Get the tile for a quadkey * * const tile = quadkeyToTile('00001033') * //=tile */ export function quadkeyToTile(quadkey) { let x = 0; let y = 0; const z = quadkey.length; for (let i = z; i > 0; i--) { const mask = 1 << (i - 1); const q = +quadkey[z - i]; if (q === 1) x |= mask; if (q === 2) y |= mask; if (q === 3) { x |= mask; y |= mask; } } return [x, y, z]; } function getBboxZoom(bbox) { const MAX_ZOOM = 28; for (let z = 0; z < MAX_ZOOM; z++) { const mask = 1 << (32 - (z + 1)); if ((bbox[0] & mask) !== (bbox[2] & mask) || (bbox[1] & mask) !== (bbox[3] & mask)) { return z; } } return MAX_ZOOM; } /** * Get the smallest tile to cover a bbox * * const tile = bboxToTile([ -178, 84, -177, 85 ]) * //=tile */ export function bboxToTile(bboxCoords) { const min = pointToTile(bboxCoords[0], bboxCoords[1], 32); const max = pointToTile(bboxCoords[2], bboxCoords[3], 32); const bbox = [min[0], min[1], max[0], max[1]]; const z = getBboxZoom(bbox); if (z === 0) return [0, 0, 0]; const x = bbox[0] >>> (32 - z); const y = bbox[1] >>> (32 - z); return [x, y, z]; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7QUFDMUIsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7QUFJMUIsU0FBUyxRQUFRLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDcEMsT0FBTyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUM7QUFDMUMsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ3BDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVU7SUFDbkMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNy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QUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDM0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzVDLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQVU7SUFDbEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBVTtJQUNwQyxPQUFPLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBQVUsRUFBRSxLQUFhO0lBQ25ELE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFB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RSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJCb3gsIEdlb21ldHJ5IH0gZnJvbSAnZ2VvanNvbic7XG5cbmNvbnN0IGQyciA9IE1hdGguUEkgLyAxODA7XG5jb25zdCByMmQgPSAxODAgLyBNYXRoLlBJO1xuXG5leHBvcnQgdHlwZSBUaWxlID0gW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5mdW5jdGlvbiB0aWxlMmxvbih4OiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAoeCAvIE1hdGgucG93KDIsIHopKSAqIDM2MCAtIDE4MDtcbn1cblxuZnVuY3Rpb24gdGlsZTJsYXQoeTogbnVtYmVyLCB6OiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBuID0gTWF0aC5QSSAtICgyICogTWF0aC5QSSAqIHkpIC8gTWF0aC5wb3coMiwgeik7XG4gIHJldHVybiByMmQgKiBNYXRoLmF0YW4oMC41ICogKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBiYm94IG9mIGEgdGlsZVxuICpcbiAqIGNvbnN0IGJib3ggPSB0aWxlVG9CQk9YKFs1LCAxMCwgMTBdKVxuICogLy89YmJveFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZVRvQkJPWCh0aWxlOiBUaWxlKTogQkJveCB7XG4gIGNvbnN0IGUgPSB0aWxlMmxvbih0aWxlWzBdICsgMSwgdGlsZVsyXSk7XG4gIGNvbnN0IHcgPSB0aWxlMmxvbih0aWxlWzBdLCB0aWxlWzJdKTtcbiAgY29uc3QgcyA9IHRpbGUybGF0KHRpbGVbMV0gKyAxLCB0aWxlWzJdKTtcbiAgY29uc3QgbiA9IHRpbGUybGF0KHRpbGVbMV0sIHRpbGVbMl0pO1xuICByZXR1cm4gW3csIHMsIGUsIG5dO1xufVxuXG4vKipcbiAqIEdldCBhIGdlb2pzb24gcmVwcmVzZW50YXRpb24gb2YgYSB0aWxlXG4gKlxuICogY29uc3QgcG9seSA9IHRpbGVUb0dlb0pTT04oWzUsIDEwLCAxMF0pXG4gKiAvLz1wb2x5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWxlVG9HZW9KU09OKHRpbGU6IFRpbGUpOiBHZW9tZXRyeSB7XG4gIGNvbnN0IGJib3ggPSB0aWxlVG9CQk9YKHRpbGUpO1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICBjb29yZGluYXRlczogW1xuICAgICAgW1xuICAgICAgICBbYmJveFswXSwgYmJveFszXV0sXG4gICAgICAgIFtiYm94WzBdLCBiYm94WzFdXSxcbiAgICAgICAgW2Jib3hbMl0sIGJib3hbMV1dLFxuICAgICAgICBbYmJveFsyXSwgYmJveFszXV0sXG4gICAgICAgIFtiYm94WzBdLCBiYm94WzNdXSxcbiAgICAgIF0sXG4gICAgXSxcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHRpbGUgZm9yIGEgcG9pbnQgYXQgYSBzcGVjaWZpZWQgem9vbSBsZXZlbFxuICpcbiAqIGNvbnN0IHRpbGUgPSBwb2ludFRvVGlsZSgxLCAxLCAyMClcbiAqIC8vPXRpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvaW50VG9UaWxlKGxvbjogbnVtYmVyLCBsYXQ6IG51bWJlciwgejogbnVtYmVyKTogVGlsZSB7XG4gIGNvbnN0IHRpbGUgPSBwb2ludFRvVGlsZUZyYWN0aW9uKGxvbiwgbGF0LCB6KTtcbiAgdGlsZVswXSA9IE1hdGguZmxvb3IodGlsZVswXSk7XG4gIHRpbGVbMV0gPSBNYXRoLmZsb29yKHRpbGVbMV0pO1xuICByZXR1cm4gdGlsZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHByZWNpc2UgZnJhY3Rpb25hbCB0aWxlIGxvY2F0aW9uIGZvciBhIHBvaW50IGF0IGEgem9vbSBsZXZlbFxuICpcbiAqIGNvbnN0IHRpbGUgPSBwb2ludFRvVGlsZUZyYWN0aW9uKDMwLjUsIDUwLjUsIDE1KVxuICogLy89dGlsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcG9pbnRUb1RpbGVGcmFjdGlvbihsb246IG51bWJlciwgbGF0OiBudW1iZXIsIHo6IG51bWJlcik6IFRpbGUge1xuICBjb25zdCBzaW4gPSBNYXRoLnNpbihsYXQgKiBkMnIpO1xuICBjb25zdCB6MiA9IE1hdGgucG93KDIsIHopO1xuICBsZXQgeCA9IHoyICogKGxvbiAvIDM2MCArIDAuNSk7XG4gIGNvbnN0IHkgPSB6MiAqICgwLjUgLSAoMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkpIC8gTWF0aC5QSSk7XG5cbiAgLy8gV3JhcCBUaWxlIFhcbiAgeCA9IHggJSB6MjtcbiAgaWYgKHggPCAwKSB4ID0geCArIHoyO1xuICByZXR1cm4gW3gsIHksIHpdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNCB0aWxlcyBvbmUgem9vbSBsZXZlbCBoaWdoZXJcbiAqXG4gKiBjb25zdCB0aWxlcyA9IGdldENoaWxkcmVuKFs1LCAxMCwgMTBdKVxuICogLy89dGlsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENoaWxkcmVuKHRpbGU6IFRpbGUpOiBUaWxlW10ge1xuICByZXR1cm4gW1xuICAgIFt0aWxlWzBdICogMiwgdGlsZVsxXSAqIDIsIHRpbGVbMl0gKyAxXSxcbiAgICBbdGlsZVswXSAqIDIgKyAxLCB0aWxlWzFdICogMiwgdGlsZVsyXSArIDFdLFxuICAgIFt0aWxlWzBdICogMiArIDEsIHRpbGVbMV0gKiAyICsgMSwgdGlsZVsyXSArIDFdLFxuICAgIFt0aWxlWzBdICogMiwgdGlsZVsxXSAqIDIgKyAxLCB0aWxlWzJdICsgMV0sXG4gIF07XG59XG5cbi8qKlxuICogR2V0IHRoZSB0aWxlIG9uZSB6b29tIGxldmVsIGxvd2VyXG4gKlxuICogY29uc3QgdGlsZSA9IGdldFBhcmVudChbNSwgMTAsIDEwXSlcbiAqIC8vPXRpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmVudCh0aWxlOiBUaWxlKTogVGlsZSB7XG4gIHJldHVybiBbdGlsZVswXSA+PiAxLCB0aWxlWzFdID4+IDEsIHRpbGVbMl0gLSAxXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNpYmxpbmdzKHRpbGU6IFRpbGUpOiBUaWxlW10ge1xuICByZXR1cm4gZ2V0Q2hpbGRyZW4oZ2V0UGFyZW50KHRpbGUpKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIDMgc2libGluZyB0aWxlcyBmb3IgYSB0aWxlXG4gKlxuICogY29uc3QgdGlsZXMgPSBnZXRTaWJsaW5ncyhbNSwgMTAsIDEwXSlcbiAqIC8vPWJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1NpYmxpbmdzKHRpbGU6IFRpbGUsIHRpbGVzOiBUaWxlW10pOiBib29sZWFuIHtcbiAgY29uc3Qgc2libGluZ3MgPSBnZXRTaWJsaW5ncyh0aWxlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWJsaW5ncy5sZW5ndGg7IGkrKykge1xuICAgIGlmICghaGFzVGlsZSh0aWxlcywgc2libGluZ3NbaV0pKSByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIGFuIGFycmF5IG9mIHRpbGVzIGNvbnRhaW5zIGEgcGFydGljdWxhciB0aWxlXG4gKlxuICogY29uc3QgdGlsZXMgPSBbXG4gKiAgICAgWzAsIDAsIDVdLFxuICogICAgIFswLCAxLCA1XSxcbiAqICAgICBbMSwgMSwgNV0sXG4gKiAgICAgWzEsIDAsIDVdXG4gKiBdXG4gKiBoYXNUaWxlKHRpbGVzLCBbMCwgMCwgNV0pXG4gKiAvLz1ib29sZWFuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUaWxlKHRpbGVzOiBUaWxlW10sIHRpbGU6IFRpbGUpOiBib29sZWFuIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0aWxlc0VxdWFsKHRpbGVzW2ldLCB0aWxlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIHRvIHNlZSBpZiB0d28gdGlsZXMgYXJlIHRoZSBzYW1lXG4gKlxuICogdGlsZXNFcXVhbChbMCwgMSwgNV0sIFswLCAwLCA1XSlcbiAqIC8vPWJvb2xlYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVzRXF1YWwodGlsZTE6IFRpbGUsIHRpbGUyOiBUaWxlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdGlsZTFbMF0gPT09IHRpbGUyWzBdICYmIHRpbGUxWzFdID09PSB0aWxlMlsxXSAmJiB0aWxlMVsyXSA9PT0gdGlsZTJbMl1cbiAgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHF1YWRrZXkgZm9yIGEgdGlsZVxuICpcbiAqIGNvbnN0IHF1YWRrZXkgPSB0aWxlVG9RdWFka2V5KFswLCAxLCA1XSlcbiAqIC8vPXF1YWRrZXlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVUb1F1YWRrZXkodGlsZTogVGlsZSk6IHN0cmluZyB7XG4gIGxldCBpbmRleCA9ICcnO1xuICBmb3IgKGxldCB6ID0gdGlsZVsyXTsgeiA+IDA7IHotLSkge1xuICAgIGxldCBiID0gMDtcbiAgICBjb25zdCBtYXNrID0gMSA8PCAoeiAtIDEpO1xuICAgIGlmICgodGlsZVswXSAmIG1hc2spICE9PSAwKSBiKys7XG4gICAgaWYgKCh0aWxlWzFdICYgbWFzaykgIT09IDApIGIgKz0gMjtcbiAgICBpbmRleCArPSBiLnRvU3RyaW5nKCk7XG4gIH1cbiAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEdldCB0aGUgdGlsZSBmb3IgYSBxdWFka2V5XG4gKlxuICogY29uc3QgdGlsZSA9IHF1YWRrZXlUb1RpbGUoJzAwMDAxMDMzJylcbiAqIC8vPXRpbGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1YWRrZXlUb1RpbGUocXVhZGtleTogc3RyaW5nKTogVGlsZSB7XG4gIGxldCB4ID0gMDtcbiAgbGV0IHkgPSAwO1xuICBjb25zdCB6ID0gcXVhZGtleS5sZW5ndGg7XG5cbiAgZm9yIChsZXQgaSA9IHo7IGkgPiAwOyBpLS0pIHtcbiAgICBjb25zdCBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgIGNvbnN0IHEgPSArcXVhZGtleVt6IC0gaV07XG4gICAgaWYgKHEgPT09IDEpIHggfD0gbWFzaztcbiAgICBpZiAocSA9PT0gMikgeSB8PSBtYXNrO1xuICAgIGlmIChxID09PSAzKSB7XG4gICAgICB4IHw9IG1hc2s7XG4gICAgICB5IHw9IG1hc2s7XG4gICAgfVxuICB9XG4gIHJldHVybiBbeCwgeSwgel07XG59XG5cbmZ1bmN0aW9uIGdldEJib3hab29tKGJib3g6IEJCb3gpOiBudW1iZXIge1xuICBjb25zdCBNQVhfWk9PTSA9IDI4O1xuICBmb3IgKGxldCB6ID0gMDsgeiA8IE1BWF9aT09NOyB6KyspIHtcbiAgICBjb25zdCBtYXNrID0gMSA8PCAoMzIgLSAoeiArIDEpKTtcbiAgICBpZiAoXG4gICAgICAoYmJveFswXSAmIG1hc2spICE9PSAoYmJveFsyXSAmIG1hc2spIHx8XG4gICAgICAoYmJveFsxXSAmIG1hc2spICE9PSAoYmJveFszXSAmIG1hc2spXG4gICAgKSB7XG4gICAgICByZXR1cm4gejtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gTUFYX1pPT007XG59XG5cbi8qKlxuICogR2V0IHRoZSBzbWFsbGVzdCB0aWxlIHRvIGNvdmVyIGEgYmJveFxuICpcbiAqIGNvbnN0IHRpbGUgPSBiYm94VG9UaWxlKFsgLTE3OCwgODQsIC0xNzcsIDg1IF0pXG4gKiAvLz10aWxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYm94VG9UaWxlKGJib3hDb29yZHM6IEJCb3gpOiBUaWxlIHtcbiAgY29uc3QgbWluID0gcG9pbnRUb1RpbGUoYmJveENvb3Jkc1swXSwgYmJveENvb3Jkc1sxXSwgMzIpO1xuICBjb25zdCBtYXggPSBwb2ludFRvVGlsZShiYm94Q29vcmRzWzJdLCBiYm94Q29vcmRzWzNdLCAzMik7XG4gIGNvbnN0IGJib3g6IEJCb3ggPSBbbWluWzBdLCBtaW5bMV0sIG1heFswXSwgbWF4WzFdXTtcblxuICBjb25zdCB6ID0gZ2V0QmJveFpvb20oYmJveCk7XG4gIGlmICh6ID09PSAwKSByZXR1cm4gWzAsIDAsIDBdO1xuICBjb25zdCB4ID0gYmJveFswXSA+Pj4gKDMyIC0geik7XG4gIGNvbnN0IHkgPSBiYm94WzFdID4+PiAoMzIgLSB6KTtcbiAgcmV0dXJuIFt4LCB5LCB6XTtcbn1cbiJdfQ==