UNPKG

@getopenpay/openpay-js-react

Version:

Accept payments through OpenPay, right on your site

6,719 lines 1.21 MB
import { r } from "./diag-api-DC4dxlqZ-DOFCnxry.js";
import { a, A } from "./ExportResult-BacsqwKA-wgTHEn_9.js";
import { f } from "./_commonjsHelpers-CdLE1o9f-ChUIkuR8.js";
var OTLPExporterBase = (
  /** @class */
  (function() {
    function m(l) {
      this._delegate = l;
    }
    return m.prototype.export = function(l, d) {
      this._delegate.export(l, d);
    }, m.prototype.forceFlush = function() {
      return this._delegate.forceFlush();
    }, m.prototype.shutdown = function() {
      return this._delegate.shutdown();
    }, m;
  })()
), __extends$1 = /* @__PURE__ */ (function() {
  var m = function(l, d) {
    return m = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(u, s) {
      u.__proto__ = s;
    } || function(u, s) {
      for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && (u[p] = s[p]);
    }, m(l, d);
  };
  return function(l, d) {
    if (typeof d != "function" && d !== null)
      throw new TypeError("Class extends value " + String(d) + " is not a constructor or null");
    m(l, d);
    function u() {
      this.constructor = l;
    }
    l.prototype = d === null ? Object.create(d) : (u.prototype = d.prototype, new u());
  };
})(), OTLPExporterError = (
  /** @class */
  (function(m) {
    __extends$1(l, m);
    function l(d, u, s) {
      var p = m.call(this, d) || this;
      return p.name = "OTLPExporterError", p.data = s, p.code = u, p;
    }
    return l;
  })(Error)
);
function validateTimeoutMillis(m) {
  if (!Number.isNaN(m) && Number.isFinite(m) && m > 0)
    return m;
  throw new Error("Configuration: timeoutMillis is invalid, expected number greater than 0 (actual: '" + m + "')");
}
function wrapStaticHeadersInFunction(m) {
  if (m != null)
    return function() {
      return m;
    };
}
function mergeOtlpSharedConfigurationWithDefaults(m, l, d) {
  var u, s, p, y, b, g;
  return {
    timeoutMillis: validateTimeoutMillis((s = (u = m.timeoutMillis) !== null && u !== void 0 ? u : l.timeoutMillis) !== null && s !== void 0 ? s : d.timeoutMillis),
    concurrencyLimit: (y = (p = m.concurrencyLimit) !== null && p !== void 0 ? p : l.concurrencyLimit) !== null && y !== void 0 ? y : d.concurrencyLimit,
    compression: (g = (b = m.compression) !== null && b !== void 0 ? b : l.compression) !== null && g !== void 0 ? g : d.compression
  };
}
function getSharedConfigurationDefaults() {
  return {
    timeoutMillis: 1e4,
    concurrencyLimit: 30,
    compression: "none"
  };
}
var __awaiter$2 = function(m, l, d, u) {
  function s(p) {
    return p instanceof d ? p : new d(function(y) {
      y(p);
    });
  }
  return new (d || (d = Promise))(function(p, y) {
    function b(t) {
      try {
        i(u.next(t));
      } catch (e) {
        y(e);
      }
    }
    function g(t) {
      try {
        i(u.throw(t));
      } catch (e) {
        y(e);
      }
    }
    function i(t) {
      t.done ? p(t.value) : s(t.value).then(b, g);
    }
    i((u = u.apply(m, [])).next());
  });
}, __generator$2 = function(m, l) {
  var d = { label: 0, sent: function() {
    if (p[0] & 1) throw p[1];
    return p[1];
  }, trys: [], ops: [] }, u, s, p, y;
  return y = { next: b(0), throw: b(1), return: b(2) }, typeof Symbol == "function" && (y[Symbol.iterator] = function() {
    return this;
  }), y;
  function b(i) {
    return function(t) {
      return g([i, t]);
    };
  }
  function g(i) {
    if (u) throw new TypeError("Generator is already executing.");
    for (; d; ) try {
      if (u = 1, s && (p = i[0] & 2 ? s.return : i[0] ? s.throw || ((p = s.return) && p.call(s), 0) : s.next) && !(p = p.call(s, i[1])).done) return p;
      switch (s = 0, p && (i = [i[0] & 2, p.value]), i[0]) {
        case 0:
        case 1:
          p = i;
          break;
        case 4:
          return d.label++, { value: i[1], done: !1 };
        case 5:
          d.label++, s = i[1], i = [0];
          continue;
        case 7:
          i = d.ops.pop(), d.trys.pop();
          continue;
        default:
          if (p = d.trys, !(p = p.length > 0 && p[p.length - 1]) && (i[0] === 6 || i[0] === 2)) {
            d = 0;
            continue;
          }
          if (i[0] === 3 && (!p || i[1] > p[0] && i[1] < p[3])) {
            d.label = i[1];
            break;
          }
          if (i[0] === 6 && d.label < p[1]) {
            d.label = p[1], p = i;
            break;
          }
          if (p && d.label < p[2]) {
            d.label = p[2], d.ops.push(i);
            break;
          }
          p[2] && d.ops.pop(), d.trys.pop();
          continue;
      }
      i = l.call(m, d);
    } catch (t) {
      i = [6, t], s = 0;
    } finally {
      u = p = 0;
    }
    if (i[0] & 5) throw i[1];
    return { value: i[0] ? i[1] : void 0, done: !0 };
  }
}, BoundedQueueExportPromiseHandler = (
  /** @class */
  (function() {
    function m(l) {
      this._sendingPromises = [], this._concurrencyLimit = l;
    }
    return m.prototype.pushPromise = function(l) {
      var d = this;
      if (this.hasReachedLimit())
        throw new Error("Concurrency Limit reached");
      this._sendingPromises.push(l);
      var u = function() {
        var s = d._sendingPromises.indexOf(l);
        d._sendingPromises.splice(s, 1);
      };
      l.then(u, u);
    }, m.prototype.hasReachedLimit = function() {
      return this._sendingPromises.length >= this._concurrencyLimit;
    }, m.prototype.awaitAll = function() {
      return __awaiter$2(this, void 0, void 0, function() {
        return __generator$2(this, function(l) {
          switch (l.label) {
            case 0:
              return [4, Promise.all(this._sendingPromises)];
            case 1:
              return l.sent(), [
                2
                /*return*/
              ];
          }
        });
      });
    }, m;
  })()
);
function createBoundedQueueExportPromiseHandler(m) {
  return new BoundedQueueExportPromiseHandler(m.concurrencyLimit);
}
function isPartialSuccessResponse(m) {
  return Object.prototype.hasOwnProperty.call(m, "partialSuccess");
}
function createLoggingPartialSuccessResponseHandler() {
  return {
    handleResponse: function(m) {
      m == null || !isPartialSuccessResponse(m) || m.partialSuccess == null || Object.keys(m.partialSuccess).length === 0 || r.warn("Received Partial Success response:", JSON.stringify(m.partialSuccess));
    }
  };
}
var __awaiter$1 = function(m, l, d, u) {
  function s(p) {
    return p instanceof d ? p : new d(function(y) {
      y(p);
    });
  }
  return new (d || (d = Promise))(function(p, y) {
    function b(t) {
      try {
        i(u.next(t));
      } catch (e) {
        y(e);
      }
    }
    function g(t) {
      try {
        i(u.throw(t));
      } catch (e) {
        y(e);
      }
    }
    function i(t) {
      t.done ? p(t.value) : s(t.value).then(b, g);
    }
    i((u = u.apply(m, [])).next());
  });
}, __generator$1 = function(m, l) {
  var d = { label: 0, sent: function() {
    if (p[0] & 1) throw p[1];
    return p[1];
  }, trys: [], ops: [] }, u, s, p, y;
  return y = { next: b(0), throw: b(1), return: b(2) }, typeof Symbol == "function" && (y[Symbol.iterator] = function() {
    return this;
  }), y;
  function b(i) {
    return function(t) {
      return g([i, t]);
    };
  }
  function g(i) {
    if (u) throw new TypeError("Generator is already executing.");
    for (; d; ) try {
      if (u = 1, s && (p = i[0] & 2 ? s.return : i[0] ? s.throw || ((p = s.return) && p.call(s), 0) : s.next) && !(p = p.call(s, i[1])).done) return p;
      switch (s = 0, p && (i = [i[0] & 2, p.value]), i[0]) {
        case 0:
        case 1:
          p = i;
          break;
        case 4:
          return d.label++, { value: i[1], done: !1 };
        case 5:
          d.label++, s = i[1], i = [0];
          continue;
        case 7:
          i = d.ops.pop(), d.trys.pop();
          continue;
        default:
          if (p = d.trys, !(p = p.length > 0 && p[p.length - 1]) && (i[0] === 6 || i[0] === 2)) {
            d = 0;
            continue;
          }
          if (i[0] === 3 && (!p || i[1] > p[0] && i[1] < p[3])) {
            d.label = i[1];
            break;
          }
          if (i[0] === 6 && d.label < p[1]) {
            d.label = p[1], p = i;
            break;
          }
          if (p && d.label < p[2]) {
            d.label = p[2], d.ops.push(i);
            break;
          }
          p[2] && d.ops.pop(), d.trys.pop();
          continue;
      }
      i = l.call(m, d);
    } catch (t) {
      i = [6, t], s = 0;
    } finally {
      u = p = 0;
    }
    if (i[0] & 5) throw i[1];
    return { value: i[0] ? i[1] : void 0, done: !0 };
  }
}, OTLPExportDelegate = (
  /** @class */
  (function() {
    function m(l, d, u, s, p) {
      this._transport = l, this._serializer = d, this._responseHandler = u, this._promiseQueue = s, this._timeout = p, this._diagLogger = r.createComponentLogger({
        namespace: "OTLPExportDelegate"
      });
    }
    return m.prototype.export = function(l, d) {
      var u = this;
      if (this._diagLogger.debug("items to be sent", l), this._promiseQueue.hasReachedLimit()) {
        d({
          code: a.FAILED,
          error: new Error("Concurrent export limit reached")
        });
        return;
      }
      var s = this._serializer.serializeRequest(l);
      if (s == null) {
        d({
          code: a.FAILED,
          error: new Error("Nothing to send")
        });
        return;
      }
      this._promiseQueue.pushPromise(this._transport.send(s, this._timeout).then(function(p) {
        if (p.status === "success") {
          if (p.data != null)
            try {
              u._responseHandler.handleResponse(u._serializer.deserializeResponse(p.data));
            } catch (y) {
              u._diagLogger.warn("Export succeeded but could not deserialize response - is the response specification compliant?", y, p.data);
            }
          d({
            code: a.SUCCESS
          });
          return;
        } else if (p.status === "failure" && p.error) {
          d({
            code: a.FAILED,
            error: p.error
          });
          return;
        } else p.status === "retryable" ? d({
          code: a.FAILED,
          error: new OTLPExporterError("Export failed with retryable status")
        }) : d({
          code: a.FAILED,
          error: new OTLPExporterError("Export failed with unknown error")
        });
      }, function(p) {
        return d({
          code: a.FAILED,
          error: p
        });
      }));
    }, m.prototype.forceFlush = function() {
      return this._promiseQueue.awaitAll();
    }, m.prototype.shutdown = function() {
      return __awaiter$1(this, void 0, void 0, function() {
        return __generator$1(this, function(l) {
          switch (l.label) {
            case 0:
              return this._diagLogger.debug("shutdown started"), [4, this.forceFlush()];
            case 1:
              return l.sent(), this._transport.shutdown(), [
                2
                /*return*/
              ];
          }
        });
      });
    }, m;
  })()
);
function createOtlpExportDelegate(m, l) {
  return new OTLPExportDelegate(m.transport, m.serializer, createLoggingPartialSuccessResponseHandler(), m.promiseHandler, l.timeout);
}
function createOtlpNetworkExportDelegate(m, l, d) {
  return createOtlpExportDelegate({
    transport: d,
    serializer: l,
    promiseHandler: createBoundedQueueExportPromiseHandler(m)
  }, { timeout: m.timeoutMillis });
}
var indexMinimal = {}, minimal$1 = {}, aspromise, hasRequiredAspromise;
function requireAspromise() {
  if (hasRequiredAspromise) return aspromise;
  hasRequiredAspromise = 1, aspromise = m;
  function m(l, d) {
    for (var u = new Array(arguments.length - 1), s = 0, p = 2, y = !0; p < arguments.length; )
      u[s++] = arguments[p++];
    return new Promise(function(b, g) {
      u[s] = function(i) {
        if (y)
          if (y = !1, i)
            g(i);
          else {
            for (var t = new Array(arguments.length - 1), e = 0; e < t.length; )
              t[e++] = arguments[e];
            b.apply(null, t);
          }
      };
      try {
        l.apply(d || null, u);
      } catch (i) {
        y && (y = !1, g(i));
      }
    });
  }
  return aspromise;
}
var base64 = {}, hasRequiredBase64;
function requireBase64() {
  return hasRequiredBase64 || (hasRequiredBase64 = 1, (function(m) {
    var l = m;
    l.length = function(y) {
      var b = y.length;
      if (!b)
        return 0;
      for (var g = 0; --b % 4 > 1 && y.charAt(b) === "="; )
        ++g;
      return Math.ceil(y.length * 3) / 4 - g;
    };
    for (var d = new Array(64), u = new Array(123), s = 0; s < 64; )
      u[d[s] = s < 26 ? s + 65 : s < 52 ? s + 71 : s < 62 ? s - 4 : s - 59 | 43] = s++;
    l.encode = function(y, b, g) {
      for (var i = null, t = [], e = 0, o = 0, n; b < g; ) {
        var c = y[b++];
        switch (o) {
          case 0:
            t[e++] = d[c >> 2], n = (c & 3) << 4, o = 1;
            break;
          case 1:
            t[e++] = d[n | c >> 4], n = (c & 15) << 2, o = 2;
            break;
          case 2:
            t[e++] = d[n | c >> 6], t[e++] = d[c & 63], o = 0;
            break;
        }
        e > 8191 && ((i || (i = [])).push(String.fromCharCode.apply(String, t)), e = 0);
      }
      return o && (t[e++] = d[n], t[e++] = 61, o === 1 && (t[e++] = 61)), i ? (e && i.push(String.fromCharCode.apply(String, t.slice(0, e))), i.join("")) : String.fromCharCode.apply(String, t.slice(0, e));
    };
    var p = "invalid encoding";
    l.decode = function(y, b, g) {
      for (var i = g, t = 0, e, o = 0; o < y.length; ) {
        var n = y.charCodeAt(o++);
        if (n === 61 && t > 1)
          break;
        if ((n = u[n]) === void 0)
          throw Error(p);
        switch (t) {
          case 0:
            e = n, t = 1;
            break;
          case 1:
            b[g++] = e << 2 | (n & 48) >> 4, e = n, t = 2;
            break;
          case 2:
            b[g++] = (e & 15) << 4 | (n & 60) >> 2, e = n, t = 3;
            break;
          case 3:
            b[g++] = (e & 3) << 6 | n, t = 0;
            break;
        }
      }
      if (t === 1)
        throw Error(p);
      return g - i;
    }, l.test = function(y) {
      return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(y);
    };
  })(base64)), base64;
}
var eventemitter, hasRequiredEventemitter;
function requireEventemitter() {
  if (hasRequiredEventemitter) return eventemitter;
  hasRequiredEventemitter = 1, eventemitter = m;
  function m() {
    this._listeners = {};
  }
  return m.prototype.on = function(l, d, u) {
    return (this._listeners[l] || (this._listeners[l] = [])).push({
      fn: d,
      ctx: u || this
    }), this;
  }, m.prototype.off = function(l, d) {
    if (l === void 0)
      this._listeners = {};
    else if (d === void 0)
      this._listeners[l] = [];
    else
      for (var u = this._listeners[l], s = 0; s < u.length; )
        u[s].fn === d ? u.splice(s, 1) : ++s;
    return this;
  }, m.prototype.emit = function(l) {
    var d = this._listeners[l];
    if (d) {
      for (var u = [], s = 1; s < arguments.length; )
        u.push(arguments[s++]);
      for (s = 0; s < d.length; )
        d[s].fn.apply(d[s++].ctx, u);
    }
    return this;
  }, eventemitter;
}
var float, hasRequiredFloat;
function requireFloat() {
  if (hasRequiredFloat) return float;
  hasRequiredFloat = 1, float = m(m);
  function m(p) {
    return typeof Float32Array < "u" ? (function() {
      var y = new Float32Array([-0]), b = new Uint8Array(y.buffer), g = b[3] === 128;
      function i(n, c, h) {
        y[0] = n, c[h] = b[0], c[h + 1] = b[1], c[h + 2] = b[2], c[h + 3] = b[3];
      }
      function t(n, c, h) {
        y[0] = n, c[h] = b[3], c[h + 1] = b[2], c[h + 2] = b[1], c[h + 3] = b[0];
      }
      p.writeFloatLE = g ? i : t, p.writeFloatBE = g ? t : i;
      function e(n, c) {
        return b[0] = n[c], b[1] = n[c + 1], b[2] = n[c + 2], b[3] = n[c + 3], y[0];
      }
      function o(n, c) {
        return b[3] = n[c], b[2] = n[c + 1], b[1] = n[c + 2], b[0] = n[c + 3], y[0];
      }
      p.readFloatLE = g ? e : o, p.readFloatBE = g ? o : e;
    })() : (function() {
      function y(g, i, t, e) {
        var o = i < 0 ? 1 : 0;
        if (o && (i = -i), i === 0)
          g(1 / i > 0 ? (
            /* positive */
            0
          ) : (
            /* negative 0 */
            2147483648
          ), t, e);
        else if (isNaN(i))
          g(2143289344, t, e);
        else if (i > 34028234663852886e22)
          g((o << 31 | 2139095040) >>> 0, t, e);
        else if (i < 11754943508222875e-54)
          g((o << 31 | Math.round(i / 1401298464324817e-60)) >>> 0, t, e);
        else {
          var n = Math.floor(Math.log(i) / Math.LN2), c = Math.round(i * Math.pow(2, -n) * 8388608) & 8388607;
          g((o << 31 | n + 127 << 23 | c) >>> 0, t, e);
        }
      }
      p.writeFloatLE = y.bind(null, l), p.writeFloatBE = y.bind(null, d);
      function b(g, i, t) {
        var e = g(i, t), o = (e >> 31) * 2 + 1, n = e >>> 23 & 255, c = e & 8388607;
        return n === 255 ? c ? NaN : o * (1 / 0) : n === 0 ? o * 1401298464324817e-60 * c : o * Math.pow(2, n - 150) * (c + 8388608);
      }
      p.readFloatLE = b.bind(null, u), p.readFloatBE = b.bind(null, s);
    })(), typeof Float64Array < "u" ? (function() {
      var y = new Float64Array([-0]), b = new Uint8Array(y.buffer), g = b[7] === 128;
      function i(n, c, h) {
        y[0] = n, c[h] = b[0], c[h + 1] = b[1], c[h + 2] = b[2], c[h + 3] = b[3], c[h + 4] = b[4], c[h + 5] = b[5], c[h + 6] = b[6], c[h + 7] = b[7];
      }
      function t(n, c, h) {
        y[0] = n, c[h] = b[7], c[h + 1] = b[6], c[h + 2] = b[5], c[h + 3] = b[4], c[h + 4] = b[3], c[h + 5] = b[2], c[h + 6] = b[1], c[h + 7] = b[0];
      }
      p.writeDoubleLE = g ? i : t, p.writeDoubleBE = g ? t : i;
      function e(n, c) {
        return b[0] = n[c], b[1] = n[c + 1], b[2] = n[c + 2], b[3] = n[c + 3], b[4] = n[c + 4], b[5] = n[c + 5], b[6] = n[c + 6], b[7] = n[c + 7], y[0];
      }
      function o(n, c) {
        return b[7] = n[c], b[6] = n[c + 1], b[5] = n[c + 2], b[4] = n[c + 3], b[3] = n[c + 4], b[2] = n[c + 5], b[1] = n[c + 6], b[0] = n[c + 7], y[0];
      }
      p.readDoubleLE = g ? e : o, p.readDoubleBE = g ? o : e;
    })() : (function() {
      function y(g, i, t, e, o, n) {
        var c = e < 0 ? 1 : 0;
        if (c && (e = -e), e === 0)
          g(0, o, n + i), g(1 / e > 0 ? (
            /* positive */
            0
          ) : (
            /* negative 0 */
            2147483648
          ), o, n + t);
        else if (isNaN(e))
          g(0, o, n + i), g(2146959360, o, n + t);
        else if (e > 17976931348623157e292)
          g(0, o, n + i), g((c << 31 | 2146435072) >>> 0, o, n + t);
        else {
          var h;
          if (e < 22250738585072014e-324)
            h = e / 5e-324, g(h >>> 0, o, n + i), g((c << 31 | h / 4294967296) >>> 0, o, n + t);
          else {
            var v = Math.floor(Math.log(e) / Math.LN2);
            v === 1024 && (v = 1023), h = e * Math.pow(2, -v), g(h * 4503599627370496 >>> 0, o, n + i), g((c << 31 | v + 1023 << 20 | h * 1048576 & 1048575) >>> 0, o, n + t);
          }
        }
      }
      p.writeDoubleLE = y.bind(null, l, 0, 4), p.writeDoubleBE = y.bind(null, d, 4, 0);
      function b(g, i, t, e, o) {
        var n = g(e, o + i), c = g(e, o + t), h = (c >> 31) * 2 + 1, v = c >>> 20 & 2047, x = 4294967296 * (c & 1048575) + n;
        return v === 2047 ? x ? NaN : h * (1 / 0) : v === 0 ? h * 5e-324 * x : h * Math.pow(2, v - 1075) * (x + 4503599627370496);
      }
      p.readDoubleLE = b.bind(null, u, 0, 4), p.readDoubleBE = b.bind(null, s, 4, 0);
    })(), p;
  }
  function l(p, y, b) {
    y[b] = p & 255, y[b + 1] = p >>> 8 & 255, y[b + 2] = p >>> 16 & 255, y[b + 3] = p >>> 24;
  }
  function d(p, y, b) {
    y[b] = p >>> 24, y[b + 1] = p >>> 16 & 255, y[b + 2] = p >>> 8 & 255, y[b + 3] = p & 255;
  }
  function u(p, y) {
    return (p[y] | p[y + 1] << 8 | p[y + 2] << 16 | p[y + 3] << 24) >>> 0;
  }
  function s(p, y) {
    return (p[y] << 24 | p[y + 1] << 16 | p[y + 2] << 8 | p[y + 3]) >>> 0;
  }
  return float;
}
var inquire_1, hasRequiredInquire;
function requireInquire() {
  if (hasRequiredInquire) return inquire_1;
  hasRequiredInquire = 1, inquire_1 = inquire;
  function inquire(moduleName) {
    try {
      var mod = eval("quire".replace(/^/, "re"))(moduleName);
      if (mod && (mod.length || Object.keys(mod).length))
        return mod;
    } catch (m) {
    }
    return null;
  }
  return inquire_1;
}
var utf8 = {}, hasRequiredUtf8;
function requireUtf8() {
  return hasRequiredUtf8 || (hasRequiredUtf8 = 1, (function(m) {
    var l = m;
    l.length = function(d) {
      for (var u = 0, s = 0, p = 0; p < d.length; ++p)
        s = d.charCodeAt(p), s < 128 ? u += 1 : s < 2048 ? u += 2 : (s & 64512) === 55296 && (d.charCodeAt(p + 1) & 64512) === 56320 ? (++p, u += 4) : u += 3;
      return u;
    }, l.read = function(d, u, s) {
      var p = s - u;
      if (p < 1)
        return "";
      for (var y = null, b = [], g = 0, i; u < s; )
        i = d[u++], i < 128 ? b[g++] = i : i > 191 && i < 224 ? b[g++] = (i & 31) << 6 | d[u++] & 63 : i > 239 && i < 365 ? (i = ((i & 7) << 18 | (d[u++] & 63) << 12 | (d[u++] & 63) << 6 | d[u++] & 63) - 65536, b[g++] = 55296 + (i >> 10), b[g++] = 56320 + (i & 1023)) : b[g++] = (i & 15) << 12 | (d[u++] & 63) << 6 | d[u++] & 63, g > 8191 && ((y || (y = [])).push(String.fromCharCode.apply(String, b)), g = 0);
      return y ? (g && y.push(String.fromCharCode.apply(String, b.slice(0, g))), y.join("")) : String.fromCharCode.apply(String, b.slice(0, g));
    }, l.write = function(d, u, s) {
      for (var p = s, y, b, g = 0; g < d.length; ++g)
        y = d.charCodeAt(g), y < 128 ? u[s++] = y : y < 2048 ? (u[s++] = y >> 6 | 192, u[s++] = y & 63 | 128) : (y & 64512) === 55296 && ((b = d.charCodeAt(g + 1)) & 64512) === 56320 ? (y = 65536 + ((y & 1023) << 10) + (b & 1023), ++g, u[s++] = y >> 18 | 240, u[s++] = y >> 12 & 63 | 128, u[s++] = y >> 6 & 63 | 128, u[s++] = y & 63 | 128) : (u[s++] = y >> 12 | 224, u[s++] = y >> 6 & 63 | 128, u[s++] = y & 63 | 128);
      return s - p;
    };
  })(utf8)), utf8;
}
var pool_1, hasRequiredPool;
function requirePool() {
  if (hasRequiredPool) return pool_1;
  hasRequiredPool = 1, pool_1 = m;
  function m(l, d, u) {
    var s = u || 8192, p = s >>> 1, y = null, b = s;
    return function(g) {
      if (g < 1 || g > p)
        return l(g);
      b + g > s && (y = l(s), b = 0);
      var i = d.call(y, b, b += g);
      return b & 7 && (b = (b | 7) + 1), i;
    };
  }
  return pool_1;
}
var longbits, hasRequiredLongbits;
function requireLongbits() {
  if (hasRequiredLongbits) return longbits;
  hasRequiredLongbits = 1, longbits = l;
  var m = requireMinimal$1();
  function l(p, y) {
    this.lo = p >>> 0, this.hi = y >>> 0;
  }
  var d = l.zero = new l(0, 0);
  d.toNumber = function() {
    return 0;
  }, d.zzEncode = d.zzDecode = function() {
    return this;
  }, d.length = function() {
    return 1;
  };
  var u = l.zeroHash = "\0\0\0\0\0\0\0\0";
  l.fromNumber = function(p) {
    if (p === 0)
      return d;
    var y = p < 0;
    y && (p = -p);
    var b = p >>> 0, g = (p - b) / 4294967296 >>> 0;
    return y && (g = ~g >>> 0, b = ~b >>> 0, ++b > 4294967295 && (b = 0, ++g > 4294967295 && (g = 0))), new l(b, g);
  }, l.from = function(p) {
    if (typeof p == "number")
      return l.fromNumber(p);
    if (m.isString(p))
      if (m.Long)
        p = m.Long.fromString(p);
      else
        return l.fromNumber(parseInt(p, 10));
    return p.low || p.high ? new l(p.low >>> 0, p.high >>> 0) : d;
  }, l.prototype.toNumber = function(p) {
    if (!p && this.hi >>> 31) {
      var y = ~this.lo + 1 >>> 0, b = ~this.hi >>> 0;
      return y || (b = b + 1 >>> 0), -(y + b * 4294967296);
    }
    return this.lo + this.hi * 4294967296;
  }, l.prototype.toLong = function(p) {
    return m.Long ? new m.Long(this.lo | 0, this.hi | 0, !!p) : { low: this.lo | 0, high: this.hi | 0, unsigned: !!p };
  };
  var s = String.prototype.charCodeAt;
  return l.fromHash = function(p) {
    return p === u ? d : new l(
      (s.call(p, 0) | s.call(p, 1) << 8 | s.call(p, 2) << 16 | s.call(p, 3) << 24) >>> 0,
      (s.call(p, 4) | s.call(p, 5) << 8 | s.call(p, 6) << 16 | s.call(p, 7) << 24) >>> 0
    );
  }, l.prototype.toHash = function() {
    return String.fromCharCode(
      this.lo & 255,
      this.lo >>> 8 & 255,
      this.lo >>> 16 & 255,
      this.lo >>> 24,
      this.hi & 255,
      this.hi >>> 8 & 255,
      this.hi >>> 16 & 255,
      this.hi >>> 24
    );
  }, l.prototype.zzEncode = function() {
    var p = this.hi >> 31;
    return this.hi = ((this.hi << 1 | this.lo >>> 31) ^ p) >>> 0, this.lo = (this.lo << 1 ^ p) >>> 0, this;
  }, l.prototype.zzDecode = function() {
    var p = -(this.lo & 1);
    return this.lo = ((this.lo >>> 1 | this.hi << 31) ^ p) >>> 0, this.hi = (this.hi >>> 1 ^ p) >>> 0, this;
  }, l.prototype.length = function() {
    var p = this.lo, y = (this.lo >>> 28 | this.hi << 4) >>> 0, b = this.hi >>> 24;
    return b === 0 ? y === 0 ? p < 16384 ? p < 128 ? 1 : 2 : p < 2097152 ? 3 : 4 : y < 16384 ? y < 128 ? 5 : 6 : y < 2097152 ? 7 : 8 : b < 128 ? 9 : 10;
  }, longbits;
}
var hasRequiredMinimal$1;
function requireMinimal$1() {
  return hasRequiredMinimal$1 || (hasRequiredMinimal$1 = 1, (function(m) {
    var l = m;
    l.asPromise = requireAspromise(), l.base64 = requireBase64(), l.EventEmitter = requireEventemitter(), l.float = requireFloat(), l.inquire = requireInquire(), l.utf8 = requireUtf8(), l.pool = requirePool(), l.LongBits = requireLongbits(), l.isNode = !!(typeof f < "u" && f && f.process && f.process.versions && f.process.versions.node), l.global = l.isNode && f || typeof window < "u" && window || typeof self < "u" && self || minimal$1, l.emptyArray = Object.freeze ? Object.freeze([]) : (
      /* istanbul ignore next */
      []
    ), l.emptyObject = Object.freeze ? Object.freeze({}) : (
      /* istanbul ignore next */
      {}
    ), l.isInteger = Number.isInteger || /* istanbul ignore next */
    function(s) {
      return typeof s == "number" && isFinite(s) && Math.floor(s) === s;
    }, l.isString = function(s) {
      return typeof s == "string" || s instanceof String;
    }, l.isObject = function(s) {
      return s && typeof s == "object";
    }, l.isset = /**
    * Checks if a property on a message is considered to be present.
    * @param {Object} obj Plain object or message instance
    * @param {string} prop Property name
    * @returns {boolean} `true` if considered to be present, otherwise `false`
    */
    l.isSet = function(s, p) {
      var y = s[p];
      return y != null && s.hasOwnProperty(p) ? typeof y != "object" || (Array.isArray(y) ? y.length : Object.keys(y).length) > 0 : !1;
    }, l.Buffer = (function() {
      try {
        var s = l.inquire("buffer").Buffer;
        return s.prototype.utf8Write ? s : (
          /* istanbul ignore next */
          null
        );
      } catch {
        return null;
      }
    })(), l._Buffer_from = null, l._Buffer_allocUnsafe = null, l.newBuffer = function(s) {
      return typeof s == "number" ? l.Buffer ? l._Buffer_allocUnsafe(s) : new l.Array(s) : l.Buffer ? l._Buffer_from(s) : typeof Uint8Array > "u" ? s : new Uint8Array(s);
    }, l.Array = typeof Uint8Array < "u" ? Uint8Array : Array, l.Long = /* istanbul ignore next */
    l.global.dcodeIO && /* istanbul ignore next */
    l.global.dcodeIO.Long || /* istanbul ignore next */
    l.global.Long || l.inquire("long"), l.key2Re = /^true|false|0|1$/, l.key32Re = /^-?(?:0|[1-9][0-9]*)$/, l.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/, l.longToHash = function(s) {
      return s ? l.LongBits.from(s).toHash() : l.LongBits.zeroHash;
    }, l.longFromHash = function(s, p) {
      var y = l.LongBits.fromHash(s);
      return l.Long ? l.Long.fromBits(y.lo, y.hi, p) : y.toNumber(!!p);
    };
    function d(s, p, y) {
      for (var b = Object.keys(p), g = 0; g < b.length; ++g)
        (s[b[g]] === void 0 || !y) && (s[b[g]] = p[b[g]]);
      return s;
    }
    l.merge = d, l.lcFirst = function(s) {
      return s.charAt(0).toLowerCase() + s.substring(1);
    };
    function u(s) {
      function p(y, b) {
        if (!(this instanceof p))
          return new p(y, b);
        Object.defineProperty(this, "message", { get: function() {
          return y;
        } }), Error.captureStackTrace ? Error.captureStackTrace(this, p) : Object.defineProperty(this, "stack", { value: new Error().stack || "" }), b && d(this, b);
      }
      return p.prototype = Object.create(Error.prototype, {
        constructor: {
          value: p,
          writable: !0,
          enumerable: !1,
          configurable: !0
        },
        name: {
          get: function() {
            return s;
          },
          set: void 0,
          enumerable: !1,
          // configurable: false would accurately preserve the behavior of
          // the original, but I'm guessing that was not intentional.
          // For an actual error subclass, this property would
          // be configurable.
          configurable: !0
        },
        toString: {
          value: function() {
            return this.name + ": " + this.message;
          },
          writable: !0,
          enumerable: !1,
          configurable: !0
        }
      }), p;
    }
    l.newError = u, l.ProtocolError = u("ProtocolError"), l.oneOfGetter = function(s) {
      for (var p = {}, y = 0; y < s.length; ++y)
        p[s[y]] = 1;
      return function() {
        for (var b = Object.keys(this), g = b.length - 1; g > -1; --g)
          if (p[b[g]] === 1 && this[b[g]] !== void 0 && this[b[g]] !== null)
            return b[g];
      };
    }, l.oneOfSetter = function(s) {
      return function(p) {
        for (var y = 0; y < s.length; ++y)
          s[y] !== p && delete this[s[y]];
      };
    }, l.toJSONOptions = {
      longs: String,
      enums: String,
      bytes: String,
      json: !0
    }, l._configure = function() {
      var s = l.Buffer;
      if (!s) {
        l._Buffer_from = l._Buffer_allocUnsafe = null;
        return;
      }
      l._Buffer_from = s.from !== Uint8Array.from && s.from || /* istanbul ignore next */
      function(p, y) {
        return new s(p, y);
      }, l._Buffer_allocUnsafe = s.allocUnsafe || /* istanbul ignore next */
      function(p) {
        return new s(p);
      };
    };
  })(minimal$1)), minimal$1;
}
var writer, hasRequiredWriter;
function requireWriter() {
  if (hasRequiredWriter) return writer;
  hasRequiredWriter = 1, writer = g;
  var m = requireMinimal$1(), l, d = m.LongBits, u = m.base64, s = m.utf8;
  function p(v, x, S) {
    this.fn = v, this.len = x, this.next = void 0, this.val = S;
  }
  function y() {
  }
  function b(v) {
    this.head = v.head, this.tail = v.tail, this.len = v.len, this.next = v.states;
  }
  function g() {
    this.len = 0, this.head = new p(y, 0, 0), this.tail = this.head, this.states = null;
  }
  var i = function() {
    return m.Buffer ? function() {
      return (g.create = function() {
        return new l();
      })();
    } : function() {
      return new g();
    };
  };
  g.create = i(), g.alloc = function(v) {
    return new m.Array(v);
  }, m.Array !== Array && (g.alloc = m.pool(g.alloc, m.Array.prototype.subarray)), g.prototype._push = function(v, x, S) {
    return this.tail = this.tail.next = new p(v, x, S), this.len += x, this;
  };
  function t(v, x, S) {
    x[S] = v & 255;
  }
  function e(v, x, S) {
    for (; v > 127; )
      x[S++] = v & 127 | 128, v >>>= 7;
    x[S] = v;
  }
  function o(v, x) {
    this.len = v, this.next = void 0, this.val = x;
  }
  o.prototype = Object.create(p.prototype), o.prototype.fn = e, g.prototype.uint32 = function(v) {
    return this.len += (this.tail = this.tail.next = new o(
      (v = v >>> 0) < 128 ? 1 : v < 16384 ? 2 : v < 2097152 ? 3 : v < 268435456 ? 4 : 5,
      v
    )).len, this;
  }, g.prototype.int32 = function(v) {
    return v < 0 ? this._push(n, 10, d.fromNumber(v)) : this.uint32(v);
  }, g.prototype.sint32 = function(v) {
    return this.uint32((v << 1 ^ v >> 31) >>> 0);
  };
  function n(v, x, S) {
    for (; v.hi; )
      x[S++] = v.lo & 127 | 128, v.lo = (v.lo >>> 7 | v.hi << 25) >>> 0, v.hi >>>= 7;
    for (; v.lo > 127; )
      x[S++] = v.lo & 127 | 128, v.lo = v.lo >>> 7;
    x[S++] = v.lo;
  }
  g.prototype.uint64 = function(v) {
    var x = d.from(v);
    return this._push(n, x.length(), x);
  }, g.prototype.int64 = g.prototype.uint64, g.prototype.sint64 = function(v) {
    var x = d.from(v).zzEncode();
    return this._push(n, x.length(), x);
  }, g.prototype.bool = function(v) {
    return this._push(t, 1, v ? 1 : 0);
  };
  function c(v, x, S) {
    x[S] = v & 255, x[S + 1] = v >>> 8 & 255, x[S + 2] = v >>> 16 & 255, x[S + 3] = v >>> 24;
  }
  g.prototype.fixed32 = function(v) {
    return this._push(c, 4, v >>> 0);
  }, g.prototype.sfixed32 = g.prototype.fixed32, g.prototype.fixed64 = function(v) {
    var x = d.from(v);
    return this._push(c, 4, x.lo)._push(c, 4, x.hi);
  }, g.prototype.sfixed64 = g.prototype.fixed64, g.prototype.float = function(v) {
    return this._push(m.float.writeFloatLE, 4, v);
  }, g.prototype.double = function(v) {
    return this._push(m.float.writeDoubleLE, 8, v);
  };
  var h = m.Array.prototype.set ? function(v, x, S) {
    x.set(v, S);
  } : function(v, x, S) {
    for (var O = 0; O < v.length; ++O)
      x[S + O] = v[O];
  };
  return g.prototype.bytes = function(v) {
    var x = v.length >>> 0;
    if (!x)
      return this._push(t, 1, 0);
    if (m.isString(v)) {
      var S = g.alloc(x = u.length(v));
      u.decode(v, S, 0), v = S;
    }
    return this.uint32(x)._push(h, x, v);
  }, g.prototype.string = function(v) {
    var x = s.length(v);
    return x ? this.uint32(x)._push(s.write, x, v) : this._push(t, 1, 0);
  }, g.prototype.fork = function() {
    return this.states = new b(this), this.head = this.tail = new p(y, 0, 0), this.len = 0, this;
  }, g.prototype.reset = function() {
    return this.states ? (this.head = this.states.head, this.tail = this.states.tail, this.len = this.states.len, this.states = this.states.next) : (this.head = this.tail = new p(y, 0, 0), this.len = 0), this;
  }, g.prototype.ldelim = function() {
    var v = this.head, x = this.tail, S = this.len;
    return this.reset().uint32(S), S && (this.tail.next = v.next, this.tail = x, this.len += S), this;
  }, g.prototype.finish = function() {
    for (var v = this.head.next, x = this.constructor.alloc(this.len), S = 0; v; )
      v.fn(v.val, x, S), S += v.len, v = v.next;
    return x;
  }, g._configure = function(v) {
    l = v, g.create = i(), l._configure();
  }, writer;
}
var writer_buffer, hasRequiredWriter_buffer;
function requireWriter_buffer() {
  if (hasRequiredWriter_buffer) return writer_buffer;
  hasRequiredWriter_buffer = 1, writer_buffer = d;
  var m = requireWriter();
  (d.prototype = Object.create(m.prototype)).constructor = d;
  var l = requireMinimal$1();
  function d() {
    m.call(this);
  }
  d._configure = function() {
    d.alloc = l._Buffer_allocUnsafe, d.writeBytesBuffer = l.Buffer && l.Buffer.prototype instanceof Uint8Array && l.Buffer.prototype.set.name === "set" ? function(s, p, y) {
      p.set(s, y);
    } : function(s, p, y) {
      if (s.copy)
        s.copy(p, y, 0, s.length);
      else for (var b = 0; b < s.length; )
        p[y++] = s[b++];
    };
  }, d.prototype.bytes = function(s) {
    l.isString(s) && (s = l._Buffer_from(s, "base64"));
    var p = s.length >>> 0;
    return this.uint32(p), p && this._push(d.writeBytesBuffer, p, s), this;
  };
  function u(s, p, y) {
    s.length < 40 ? l.utf8.write(s, p, y) : p.utf8Write ? p.utf8Write(s, y) : p.write(s, y);
  }
  return d.prototype.string = function(s) {
    var p = l.Buffer.byteLength(s);
    return this.uint32(p), p && this._push(u, p, s), this;
  }, d._configure(), writer_buffer;
}
var reader, hasRequiredReader;
function requireReader() {
  if (hasRequiredReader) return reader;
  hasRequiredReader = 1, reader = p;
  var m = requireMinimal$1(), l, d = m.LongBits, u = m.utf8;
  function s(e, o) {
    return RangeError("index out of range: " + e.pos + " + " + (o || 1) + " > " + e.len);
  }
  function p(e) {
    this.buf = e, this.pos = 0, this.len = e.length;
  }
  var y = typeof Uint8Array < "u" ? function(e) {
    if (e instanceof Uint8Array || Array.isArray(e))
      return new p(e);
    throw Error("illegal buffer");
  } : function(e) {
    if (Array.isArray(e))
      return new p(e);
    throw Error("illegal buffer");
  }, b = function() {
    return m.Buffer ? function(e) {
      return (p.create = function(o) {
        return m.Buffer.isBuffer(o) ? new l(o) : y(o);
      })(e);
    } : y;
  };
  p.create = b(), p.prototype._slice = m.Array.prototype.subarray || /* istanbul ignore next */
  m.Array.prototype.slice, p.prototype.uint32 = /* @__PURE__ */ (function() {
    var e = 4294967295;
    return function() {
      if (e = (this.buf[this.pos] & 127) >>> 0, this.buf[this.pos++] < 128 || (e = (e | (this.buf[this.pos] & 127) << 7) >>> 0, this.buf[this.pos++] < 128) || (e = (e | (this.buf[this.pos] & 127) << 14) >>> 0, this.buf[this.pos++] < 128) || (e = (e | (this.buf[this.pos] & 127) << 21) >>> 0, this.buf[this.pos++] < 128) || (e = (e | (this.buf[this.pos] & 15) << 28) >>> 0, this.buf[this.pos++] < 128)) return e;
      if ((this.pos += 5) > this.len)
        throw this.pos = this.len, s(this, 10);
      return e;
    };
  })(), p.prototype.int32 = function() {
    return this.uint32() | 0;
  }, p.prototype.sint32 = function() {
    var e = this.uint32();
    return e >>> 1 ^ -(e & 1) | 0;
  };
  function g() {
    var e = new d(0, 0), o = 0;
    if (this.len - this.pos > 4) {
      for (; o < 4; ++o)
        if (e.lo = (e.lo | (this.buf[this.pos] & 127) << o * 7) >>> 0, this.buf[this.pos++] < 128)
          return e;
      if (e.lo = (e.lo | (this.buf[this.pos] & 127) << 28) >>> 0, e.hi = (e.hi | (this.buf[this.pos] & 127) >> 4) >>> 0, this.buf[this.pos++] < 128)
        return e;
      o = 0;
    } else {
      for (; o < 3; ++o) {
        if (this.pos >= this.len)
          throw s(this);
        if (e.lo = (e.lo | (this.buf[this.pos] & 127) << o * 7) >>> 0, this.buf[this.pos++] < 128)
          return e;
      }
      return e.lo = (e.lo | (this.buf[this.pos++] & 127) << o * 7) >>> 0, e;
    }
    if (this.len - this.pos > 4) {
      for (; o < 5; ++o)
        if (e.hi = (e.hi | (this.buf[this.pos] & 127) << o * 7 + 3) >>> 0, this.buf[this.pos++] < 128)
          return e;
    } else
      for (; o < 5; ++o) {
        if (this.pos >= this.len)
          throw s(this);
        if (e.hi = (e.hi | (this.buf[this.pos] & 127) << o * 7 + 3) >>> 0, this.buf[this.pos++] < 128)
          return e;
      }
    throw Error("invalid varint encoding");
  }
  p.prototype.bool = function() {
    return this.uint32() !== 0;
  };
  function i(e, o) {
    return (e[o - 4] | e[o - 3] << 8 | e[o - 2] << 16 | e[o - 1] << 24) >>> 0;
  }
  p.prototype.fixed32 = function() {
    if (this.pos + 4 > this.len)
      throw s(this, 4);
    return i(this.buf, this.pos += 4);
  }, p.prototype.sfixed32 = function() {
    if (this.pos + 4 > this.len)
      throw s(this, 4);
    return i(this.buf, this.pos += 4) | 0;
  };
  function t() {
    if (this.pos + 8 > this.len)
      throw s(this, 8);
    return new d(i(this.buf, this.pos += 4), i(this.buf, this.pos += 4));
  }
  return p.prototype.float = function() {
    if (this.pos + 4 > this.len)
      throw s(this, 4);
    var e = m.float.readFloatLE(this.buf, this.pos);
    return this.pos += 4, e;
  }, p.prototype.double = function() {
    if (this.pos + 8 > this.len)
      throw s(this, 4);
    var e = m.float.readDoubleLE(this.buf, this.pos);
    return this.pos += 8, e;
  }, p.prototype.bytes = function() {
    var e = this.uint32(), o = this.pos, n = this.pos + e;
    if (n > this.len)
      throw s(this, e);
    if (this.pos += e, Array.isArray(this.buf))
      return this.buf.slice(o, n);
    if (o === n) {
      var c = m.Buffer;
      return c ? c.alloc(0) : new this.buf.constructor(0);
    }
    return this._slice.call(this.buf, o, n);
  }, p.prototype.string = function() {
    var e = this.bytes();
    return u.read(e, 0, e.length);
  }, p.prototype.skip = function(e) {
    if (typeof e == "number") {
      if (this.pos + e > this.len)
        throw s(this, e);
      this.pos += e;
    } else
      do
        if (this.pos >= this.len)
          throw s(this);
      while (this.buf[this.pos++] & 128);
    return this;
  }, p.prototype.skipType = function(e) {
    switch (e) {
      case 0:
        this.skip();
        break;
      case 1:
        this.skip(8);
        break;
      case 2:
        this.skip(this.uint32());
        break;
      case 3:
        for (; (e = this.uint32() & 7) !== 4; )
          this.skipType(e);
        break;
      case 5:
        this.skip(4);
        break;
      /* istanbul ignore next */
      default:
        throw Error("invalid wire type " + e + " at offset " + this.pos);
    }
    return this;
  }, p._configure = function(e) {
    l = e, p.create = b(), l._configure();
    var o = m.Long ? "toLong" : (
      /* istanbul ignore next */
      "toNumber"
    );
    m.merge(p.prototype, {
      int64: function() {
        return g.call(this)[o](!1);
      },
      uint64: function() {
        return g.call(this)[o](!0);
      },
      sint64: function() {
        return g.call(this).zzDecode()[o](!1);
      },
      fixed64: function() {
        return t.call(this)[o](!0);
      },
      sfixed64: function() {
        return t.call(this)[o](!1);
      }
    });
  }, reader;
}
var reader_buffer, hasRequiredReader_buffer;
function requireReader_buffer() {
  if (hasRequiredReader_buffer) return reader_buffer;
  hasRequiredReader_buffer = 1, reader_buffer = d;
  var m = requireReader();
  (d.prototype = Object.create(m.prototype)).constructor = d;
  var l = requireMinimal$1();
  function d(u) {
    m.call(this, u);
  }
  return d._configure = function() {
    l.Buffer && (d.prototype._slice = l.Buffer.prototype.slice);
  }, d.prototype.string = function() {
    var u = this.uint32();
    return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + u, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + u, this.len));
  }, d._configure(), reader_buffer;
}
var rpc = {}, service, hasRequiredService;
function requireService() {
  if (hasRequiredService) return service;
  hasRequiredService = 1, service = l;
  var m = requireMinimal$1();
  (l.prototype = Object.create(m.EventEmitter.prototype)).constructor = l;
  function l(d, u, s) {
    if (typeof d != "function")
      throw TypeError("rpcImpl must be a function");
    m.EventEmitter.call(this), this.rpcImpl = d, this.requestDelimited = !!u, this.responseDelimited = !!s;
  }
  return l.prototype.rpcCall = function d(u, s, p, y, b) {
    if (!y)
      throw TypeError("request must be specified");
    var g = this;
    if (!b)
      return m.asPromise(d, g, u, s, p, y);
    if (!g.rpcImpl) {
      setTimeout(function() {
        b(Error("already ended"));
      }, 0);
      return;
    }
    try {
      return g.rpcImpl(
        u,
        s[g.requestDelimited ? "encodeDelimited" : "encode"](y).finish(),
        function(i, t) {
          if (i)
            return g.emit("error", i, u), b(i);
          if (t === null) {
            g.end(
              /* endedByRPC */
              !0
            );
            return;
          }
          if (!(t instanceof p))
            try {
              t = p[g.responseDelimited ? "decodeDelimited" : "decode"](t);
            } catch (e) {
              return g.emit("error", e, u), b(e);
            }
          return g.emit("data", t, u), b(null, t);
        }
      );
    } catch (i) {
      g.emit("error", i, u), setTimeout(function() {
        b(i);
      }, 0);
      return;
    }
  }, l.prototype.end = function(d) {
    return this.rpcImpl && (d || this.rpcImpl(null, null, null), this.rpcImpl = null, this.emit("end").off()), this;
  }, service;
}
var hasRequiredRpc;
function requireRpc() {
  return hasRequiredRpc || (hasRequiredRpc = 1, (function(m) {
    var l = m;
    l.Service = requireService();
  })(rpc)), rpc;
}
var roots, hasRequiredRoots;
function requireRoots() {
  return hasRequiredRoots || (hasRequiredRoots = 1, roots = {}), roots;
}
var hasRequiredIndexMinimal;
function requireIndexMinimal() {
  return hasRequiredIndexMinimal || (hasRequiredIndexMinimal = 1, (function(m) {
    var l = m;
    l.build = "minimal", l.Writer = requireWriter(), l.BufferWriter = requireWriter_buffer(), l.Reader = requireReader(), l.BufferReader = requireReader_buffer(), l.util = requireMinimal$1(), l.rpc = requireRpc(), l.roots = requireRoots(), l.configure = d;
    function d() {
      l.util._configure(), l.Writer._configure(l.BufferWriter), l.Reader._configure(l.BufferReader);
    }
    d();
  })(indexMinimal)), indexMinimal;
}
var minimal, hasRequiredMinimal;
function requireMinimal() {
  return hasRequiredMinimal || (hasRequiredMinimal = 1, minimal = requireIndexMinimal()), minimal;
}
var root, hasRequiredRoot;
function requireRoot() {
  if (hasRequiredRoot) return root;
  hasRequiredRoot = 1;
  var m = requireMinimal(), l = m.Reader, d = m.Writer, u = m.util, s = m.roots.default || (m.roots.default = {});
  return s.opentelemetry = (function() {
    var p = {};
    return p.proto = (function() {
      var y = {};
      return y.common = (function() {
        var b = {};
        return b.v1 = (function() {
          var g = {};
          return g.AnyValue = (function() {
            function i(e) {
              if (e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.stringValue = null, i.prototype.boolValue = null, i.prototype.intValue = null, i.prototype.doubleValue = null, i.prototype.arrayValue = null, i.prototype.kvlistValue = null, i.prototype.bytesValue = null;
            var t;
            return Object.defineProperty(i.prototype, "value", {
              get: u.oneOfGetter(t = ["stringValue", "boolValue", "intValue", "doubleValue", "arrayValue", "kvlistValue", "bytesValue"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              return o || (o = d.create()), e.stringValue != null && Object.hasOwnProperty.call(e, "stringValue") && o.uint32(
                /* id 1, wireType 2 =*/
                10
              ).string(e.stringValue), e.boolValue != null && Object.hasOwnProperty.call(e, "boolValue") && o.uint32(
                /* id 2, wireType 0 =*/
                16
              ).bool(e.boolValue), e.intValue != null && Object.hasOwnProperty.call(e, "intValue") && o.uint32(
                /* id 3, wireType 0 =*/
                24
              ).int64(e.intValue), e.doubleValue != null && Object.hasOwnProperty.call(e, "doubleValue") && o.uint32(
                /* id 4, wireType 1 =*/
                33
              ).double(e.doubleValue), e.arrayValue != null && Object.hasOwnProperty.call(e, "arrayValue") && s.opentelemetry.proto.common.v1.ArrayValue.encode(e.arrayValue, o.uint32(
                /* id 5, wireType 2 =*/
                42
              ).fork()).ldelim(), e.kvlistValue != null && Object.hasOwnProperty.call(e, "kvlistValue") && s.opentelemetry.proto.common.v1.KeyValueList.encode(e.kvlistValue, o.uint32(
                /* id 6, wireType 2 =*/
                50
              ).fork()).ldelim(), e.bytesValue != null && Object.hasOwnProperty.call(e, "bytesValue") && o.uint32(
                /* id 7, wireType 2 =*/
                58
              ).bytes(e.bytesValue), o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.common.v1.AnyValue(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 1: {
                    c.stringValue = e.string();
                    break;
                  }
                  case 2: {
                    c.boolValue = e.bool();
                    break;
                  }
                  case 3: {
                    c.intValue = e.int64();
                    break;
                  }
                  case 4: {
                    c.doubleValue = e.double();
                    break;
                  }
                  case 5: {
                    c.arrayValue = s.opentelemetry.proto.common.v1.ArrayValue.decode(e, e.uint32());
                    break;
                  }
                  case 6: {
                    c.kvlistValue = s.opentelemetry.proto.common.v1.KeyValueList.decode(e, e.uint32());
                    break;
                  }
                  case 7: {
                    c.bytesValue = e.bytes();
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              var o = {};
              if (e.stringValue != null && e.hasOwnProperty("stringValue") && (o.value = 1, !u.isString(e.stringValue)))
                return "stringValue: string expected";
              if (e.boolValue != null && e.hasOwnProperty("boolValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, typeof e.boolValue != "boolean")
                  return "boolValue: boolean expected";
              }
              if (e.intValue != null && e.hasOwnProperty("intValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, !u.isInteger(e.intValue) && !(e.intValue && u.isInteger(e.intValue.low) && u.isInteger(e.intValue.high)))
                  return "intValue: integer|Long expected";
              }
              if (e.doubleValue != null && e.hasOwnProperty("doubleValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, typeof e.doubleValue != "number")
                  return "doubleValue: number expected";
              }
              if (e.arrayValue != null && e.hasOwnProperty("arrayValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                o.value = 1;
                {
                  var n = s.opentelemetry.proto.common.v1.ArrayValue.verify(e.arrayValue);
                  if (n)
                    return "arrayValue." + n;
                }
              }
              if (e.kvlistValue != null && e.hasOwnProperty("kvlistValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                o.value = 1;
                {
                  var n = s.opentelemetry.proto.common.v1.KeyValueList.verify(e.kvlistValue);
                  if (n)
                    return "kvlistValue." + n;
                }
              }
              if (e.bytesValue != null && e.hasOwnProperty("bytesValue")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, !(e.bytesValue && typeof e.bytesValue.length == "number" || u.isString(e.bytesValue)))
                  return "bytesValue: buffer expected";
              }
              return null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.common.v1.AnyValue)
                return e;
              var o = new s.opentelemetry.proto.common.v1.AnyValue();
              if (e.stringValue != null && (o.stringValue = String(e.stringValue)), e.boolValue != null && (o.boolValue = !!e.boolValue), e.intValue != null && (u.Long ? (o.intValue = u.Long.fromValue(e.intValue)).unsigned = !1 : typeof e.intValue == "string" ? o.intValue = parseInt(e.intValue, 10) : typeof e.intValue == "number" ? o.intValue = e.intValue : typeof e.intValue == "object" && (o.intValue = new u.LongBits(e.intValue.low >>> 0, e.intValue.high >>> 0).toNumber())), e.doubleValue != null && (o.doubleValue = Number(e.doubleValue)), e.arrayValue != null) {
                if (typeof e.arrayValue != "object")
                  throw TypeError(".opentelemetry.proto.common.v1.AnyValue.arrayValue: object expected");
                o.arrayValue = s.opentelemetry.proto.common.v1.ArrayValue.fromObject(e.arrayValue);
              }
              if (e.kvlistValue != null) {
                if (typeof e.kvlistValue != "object")
                  throw TypeError(".opentelemetry.proto.common.v1.AnyValue.kvlistValue: object expected");
                o.kvlistValue = s.opentelemetry.proto.common.v1.KeyValueList.fromObject(e.kvlistValue);
              }
              return e.bytesValue != null && (typeof e.bytesValue == "string" ? u.base64.decode(e.bytesValue, o.bytesValue = u.newBuffer(u.base64.length(e.bytesValue)), 0) : e.bytesValue.length >= 0 && (o.bytesValue = e.bytesValue)), o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              return e.stringValue != null && e.hasOwnProperty("stringValue") && (n.stringValue = e.stringValue, o.oneofs && (n.value = "stringValue")), e.boolValue != null && e.hasOwnProperty("boolValue") && (n.boolValue = e.boolValue, o.oneofs && (n.value = "boolValue")), e.intValue != null && e.hasOwnProperty("intValue") && (typeof e.intValue == "number" ? n.intValue = o.longs === String ? String(e.intValue) : e.intValue : n.intValue = o.longs === String ? u.Long.prototype.toString.call(e.intValue) : o.longs === Number ? new u.LongBits(e.intValue.low >>> 0, e.intValue.high >>> 0).toNumber() : e.intValue, o.oneofs && (n.value = "intValue")), e.doubleValue != null && e.hasOwnProperty("doubleValue") && (n.doubleValue = o.json && !isFinite(e.doubleValue) ? String(e.doubleValue) : e.doubleValue, o.oneofs && (n.value = "doubleValue")), e.arrayValue != null && e.hasOwnProperty("arrayValue") && (n.arrayValue = s.opentelemetry.proto.common.v1.ArrayValue.toObject(e.arrayValue, o), o.oneofs && (n.value = "arrayValue")), e.kvlistValue != null && e.hasOwnProperty("kvlistValue") && (n.kvlistValue = s.opentelemetry.proto.common.v1.KeyValueList.toObject(e.kvlistValue, o), o.oneofs && (n.value = "kvlistValue")), e.bytesValue != null && e.hasOwnProperty("bytesValue") && (n.bytesValue = o.bytes === String ? u.base64.encode(e.bytesValue, 0, e.bytesValue.length) : o.bytes === Array ? Array.prototype.slice.call(e.bytesValue) : e.bytesValue, o.oneofs && (n.value = "bytesValue")), n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.common.v1.AnyValue";
            }, i;
          })(), g.ArrayValue = (function() {
            function i(t) {
              if (this.values = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.values = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.values != null && t.values.length)
                for (var o = 0; o < t.values.length; ++o)
                  s.opentelemetry.proto.common.v1.AnyValue.encode(t.values[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.common.v1.ArrayValue(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.values && n.values.length || (n.values = []), n.values.push(s.opentelemetry.proto.common.v1.AnyValue.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.values != null && t.hasOwnProperty("values")) {
                if (!Array.isArray(t.values))
                  return "values: array expected";
                for (var e = 0; e < t.values.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.AnyValue.verify(t.values[e]);
                  if (o)
                    return "values." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.common.v1.ArrayValue)
                return t;
              var e = new s.opentelemetry.proto.common.v1.ArrayValue();
              if (t.values) {
                if (!Array.isArray(t.values))
                  throw TypeError(".opentelemetry.proto.common.v1.ArrayValue.values: array expected");
                e.values = [];
                for (var o = 0; o < t.values.length; ++o) {
                  if (typeof t.values[o] != "object")
                    throw TypeError(".opentelemetry.proto.common.v1.ArrayValue.values: object expected");
                  e.values[o] = s.opentelemetry.proto.common.v1.AnyValue.fromObject(t.values[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.values = []), t.values && t.values.length) {
                o.values = [];
                for (var n = 0; n < t.values.length; ++n)
                  o.values[n] = s.opentelemetry.proto.common.v1.AnyValue.toObject(t.values[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.common.v1.ArrayValue";
            }, i;
          })(), g.KeyValueList = (function() {
            function i(t) {
              if (this.values = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.values = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.values != null && t.values.length)
                for (var o = 0; o < t.values.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.values[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.common.v1.KeyValueList(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.values && n.values.length || (n.values = []), n.values.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.values != null && t.hasOwnProperty("values")) {
                if (!Array.isArray(t.values))
                  return "values: array expected";
                for (var e = 0; e < t.values.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.KeyValue.verify(t.values[e]);
                  if (o)
                    return "values." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.common.v1.KeyValueList)
                return t;
              var e = new s.opentelemetry.proto.common.v1.KeyValueList();
              if (t.values) {
                if (!Array.isArray(t.values))
                  throw TypeError(".opentelemetry.proto.common.v1.KeyValueList.values: array expected");
                e.values = [];
                for (var o = 0; o < t.values.length; ++o) {
                  if (typeof t.values[o] != "object")
                    throw TypeError(".opentelemetry.proto.common.v1.KeyValueList.values: object expected");
                  e.values[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.values[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.values = []), t.values && t.values.length) {
                o.values = [];
                for (var n = 0; n < t.values.length; ++n)
                  o.values[n] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.values[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.common.v1.KeyValueList";
            }, i;
          })(), g.KeyValue = (function() {
            function i(t) {
              if (t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.key = null, i.prototype.value = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              return e || (e = d.create()), t.key != null && Object.hasOwnProperty.call(t, "key") && e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).string(t.key), t.value != null && Object.hasOwnProperty.call(t, "value") && s.opentelemetry.proto.common.v1.AnyValue.encode(t.value, e.uint32(
                /* id 2, wireType 2 =*/
                18
              ).fork()).ldelim(), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.common.v1.KeyValue(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.key = t.string();
                    break;
                  }
                  case 2: {
                    n.value = s.opentelemetry.proto.common.v1.AnyValue.decode(t, t.uint32());
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.key != null && t.hasOwnProperty("key") && !u.isString(t.key))
                return "key: string expected";
              if (t.value != null && t.hasOwnProperty("value")) {
                var e = s.opentelemetry.proto.common.v1.AnyValue.verify(t.value);
                if (e)
                  return "value." + e;
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.common.v1.KeyValue)
                return t;
              var e = new s.opentelemetry.proto.common.v1.KeyValue();
              if (t.key != null && (e.key = String(t.key)), t.value != null) {
                if (typeof t.value != "object")
                  throw TypeError(".opentelemetry.proto.common.v1.KeyValue.value: object expected");
                e.value = s.opentelemetry.proto.common.v1.AnyValue.fromObject(t.value);
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              return e.defaults && (o.key = "", o.value = null), t.key != null && t.hasOwnProperty("key") && (o.key = t.key), t.value != null && t.hasOwnProperty("value") && (o.value = s.opentelemetry.proto.common.v1.AnyValue.toObject(t.value, e)), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.common.v1.KeyValue";
            }, i;
          })(), g.InstrumentationScope = (function() {
            function i(t) {
              if (this.attributes = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.name = null, i.prototype.version = null, i.prototype.attributes = u.emptyArray, i.prototype.droppedAttributesCount = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.name != null && Object.hasOwnProperty.call(t, "name") && e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).string(t.name), t.version != null && Object.hasOwnProperty.call(t, "version") && e.uint32(
                /* id 2, wireType 2 =*/
                18
              ).string(t.version), t.attributes != null && t.attributes.length)
                for (var o = 0; o < t.attributes.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.attributes[o], e.uint32(
                    /* id 3, wireType 2 =*/
                    26
                  ).fork()).ldelim();
              return t.droppedAttributesCount != null && Object.hasOwnProperty.call(t, "droppedAttributesCount") && e.uint32(
                /* id 4, wireType 0 =*/
                32
              ).uint32(t.droppedAttributesCount), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.common.v1.InstrumentationScope(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.name = t.string();
                    break;
                  }
                  case 2: {
                    n.version = t.string();
                    break;
                  }
                  case 3: {
                    n.attributes && n.attributes.length || (n.attributes = []), n.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  case 4: {
                    n.droppedAttributesCount = t.uint32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.name != null && t.hasOwnProperty("name") && !u.isString(t.name))
                return "name: string expected";
              if (t.version != null && t.hasOwnProperty("version") && !u.isString(t.version))
                return "version: string expected";
              if (t.attributes != null && t.hasOwnProperty("attributes")) {
                if (!Array.isArray(t.attributes))
                  return "attributes: array expected";
                for (var e = 0; e < t.attributes.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.KeyValue.verify(t.attributes[e]);
                  if (o)
                    return "attributes." + o;
                }
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && !u.isInteger(t.droppedAttributesCount) ? "droppedAttributesCount: integer expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.common.v1.InstrumentationScope)
                return t;
              var e = new s.opentelemetry.proto.common.v1.InstrumentationScope();
              if (t.name != null && (e.name = String(t.name)), t.version != null && (e.version = String(t.version)), t.attributes) {
                if (!Array.isArray(t.attributes))
                  throw TypeError(".opentelemetry.proto.common.v1.InstrumentationScope.attributes: array expected");
                e.attributes = [];
                for (var o = 0; o < t.attributes.length; ++o) {
                  if (typeof t.attributes[o] != "object")
                    throw TypeError(".opentelemetry.proto.common.v1.InstrumentationScope.attributes: object expected");
                  e.attributes[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.attributes[o]);
                }
              }
              return t.droppedAttributesCount != null && (e.droppedAttributesCount = t.droppedAttributesCount >>> 0), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.attributes = []), e.defaults && (o.name = "", o.version = "", o.droppedAttributesCount = 0), t.name != null && t.hasOwnProperty("name") && (o.name = t.name), t.version != null && t.hasOwnProperty("version") && (o.version = t.version), t.attributes && t.attributes.length) {
                o.attributes = [];
                for (var n = 0; n < t.attributes.length; ++n)
                  o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.attributes[n], e);
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && (o.droppedAttributesCount = t.droppedAttributesCount), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.common.v1.InstrumentationScope";
            }, i;
          })(), g;
        })(), b;
      })(), y.resource = (function() {
        var b = {};
        return b.v1 = (function() {
          var g = {};
          return g.Resource = (function() {
            function i(t) {
              if (this.attributes = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.attributes = u.emptyArray, i.prototype.droppedAttributesCount = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.attributes != null && t.attributes.length)
                for (var o = 0; o < t.attributes.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.attributes[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return t.droppedAttributesCount != null && Object.hasOwnProperty.call(t, "droppedAttributesCount") && e.uint32(
                /* id 2, wireType 0 =*/
                16
              ).uint32(t.droppedAttributesCount), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.resource.v1.Resource(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.attributes && n.attributes.length || (n.attributes = []), n.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  case 2: {
                    n.droppedAttributesCount = t.uint32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.attributes != null && t.hasOwnProperty("attributes")) {
                if (!Array.isArray(t.attributes))
                  return "attributes: array expected";
                for (var e = 0; e < t.attributes.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.KeyValue.verify(t.attributes[e]);
                  if (o)
                    return "attributes." + o;
                }
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && !u.isInteger(t.droppedAttributesCount) ? "droppedAttributesCount: integer expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.resource.v1.Resource)
                return t;
              var e = new s.opentelemetry.proto.resource.v1.Resource();
              if (t.attributes) {
                if (!Array.isArray(t.attributes))
                  throw TypeError(".opentelemetry.proto.resource.v1.Resource.attributes: array expected");
                e.attributes = [];
                for (var o = 0; o < t.attributes.length; ++o) {
                  if (typeof t.attributes[o] != "object")
                    throw TypeError(".opentelemetry.proto.resource.v1.Resource.attributes: object expected");
                  e.attributes[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.attributes[o]);
                }
              }
              return t.droppedAttributesCount != null && (e.droppedAttributesCount = t.droppedAttributesCount >>> 0), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.attributes = []), e.defaults && (o.droppedAttributesCount = 0), t.attributes && t.attributes.length) {
                o.attributes = [];
                for (var n = 0; n < t.attributes.length; ++n)
                  o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.attributes[n], e);
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && (o.droppedAttributesCount = t.droppedAttributesCount), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.resource.v1.Resource";
            }, i;
          })(), g;
        })(), b;
      })(), y.trace = (function() {
        var b = {};
        return b.v1 = (function() {
          var g = {};
          return g.TracesData = (function() {
            function i(t) {
              if (this.resourceSpans = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resourceSpans = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resourceSpans != null && t.resourceSpans.length)
                for (var o = 0; o < t.resourceSpans.length; ++o)
                  s.opentelemetry.proto.trace.v1.ResourceSpans.encode(t.resourceSpans[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.trace.v1.TracesData(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resourceSpans && n.resourceSpans.length || (n.resourceSpans = []), n.resourceSpans.push(s.opentelemetry.proto.trace.v1.ResourceSpans.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resourceSpans != null && t.hasOwnProperty("resourceSpans")) {
                if (!Array.isArray(t.resourceSpans))
                  return "resourceSpans: array expected";
                for (var e = 0; e < t.resourceSpans.length; ++e) {
                  var o = s.opentelemetry.proto.trace.v1.ResourceSpans.verify(t.resourceSpans[e]);
                  if (o)
                    return "resourceSpans." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.trace.v1.TracesData)
                return t;
              var e = new s.opentelemetry.proto.trace.v1.TracesData();
              if (t.resourceSpans) {
                if (!Array.isArray(t.resourceSpans))
                  throw TypeError(".opentelemetry.proto.trace.v1.TracesData.resourceSpans: array expected");
                e.resourceSpans = [];
                for (var o = 0; o < t.resourceSpans.length; ++o) {
                  if (typeof t.resourceSpans[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.TracesData.resourceSpans: object expected");
                  e.resourceSpans[o] = s.opentelemetry.proto.trace.v1.ResourceSpans.fromObject(t.resourceSpans[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.resourceSpans = []), t.resourceSpans && t.resourceSpans.length) {
                o.resourceSpans = [];
                for (var n = 0; n < t.resourceSpans.length; ++n)
                  o.resourceSpans[n] = s.opentelemetry.proto.trace.v1.ResourceSpans.toObject(t.resourceSpans[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.trace.v1.TracesData";
            }, i;
          })(), g.ResourceSpans = (function() {
            function i(t) {
              if (this.scopeSpans = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resource = null, i.prototype.scopeSpans = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resource != null && Object.hasOwnProperty.call(t, "resource") && s.opentelemetry.proto.resource.v1.Resource.encode(t.resource, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.scopeSpans != null && t.scopeSpans.length)
                for (var o = 0; o < t.scopeSpans.length; ++o)
                  s.opentelemetry.proto.trace.v1.ScopeSpans.encode(t.scopeSpans[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.trace.v1.ResourceSpans(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resource = s.opentelemetry.proto.resource.v1.Resource.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.scopeSpans && n.scopeSpans.length || (n.scopeSpans = []), n.scopeSpans.push(s.opentelemetry.proto.trace.v1.ScopeSpans.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resource != null && t.hasOwnProperty("resource")) {
                var e = s.opentelemetry.proto.resource.v1.Resource.verify(t.resource);
                if (e)
                  return "resource." + e;
              }
              if (t.scopeSpans != null && t.hasOwnProperty("scopeSpans")) {
                if (!Array.isArray(t.scopeSpans))
                  return "scopeSpans: array expected";
                for (var o = 0; o < t.scopeSpans.length; ++o) {
                  var e = s.opentelemetry.proto.trace.v1.ScopeSpans.verify(t.scopeSpans[o]);
                  if (e)
                    return "scopeSpans." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.trace.v1.ResourceSpans)
                return t;
              var e = new s.opentelemetry.proto.trace.v1.ResourceSpans();
              if (t.resource != null) {
                if (typeof t.resource != "object")
                  throw TypeError(".opentelemetry.proto.trace.v1.ResourceSpans.resource: object expected");
                e.resource = s.opentelemetry.proto.resource.v1.Resource.fromObject(t.resource);
              }
              if (t.scopeSpans) {
                if (!Array.isArray(t.scopeSpans))
                  throw TypeError(".opentelemetry.proto.trace.v1.ResourceSpans.scopeSpans: array expected");
                e.scopeSpans = [];
                for (var o = 0; o < t.scopeSpans.length; ++o) {
                  if (typeof t.scopeSpans[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.ResourceSpans.scopeSpans: object expected");
                  e.scopeSpans[o] = s.opentelemetry.proto.trace.v1.ScopeSpans.fromObject(t.scopeSpans[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.scopeSpans = []), e.defaults && (o.resource = null, o.schemaUrl = ""), t.resource != null && t.hasOwnProperty("resource") && (o.resource = s.opentelemetry.proto.resource.v1.Resource.toObject(t.resource, e)), t.scopeSpans && t.scopeSpans.length) {
                o.scopeSpans = [];
                for (var n = 0; n < t.scopeSpans.length; ++n)
                  o.scopeSpans[n] = s.opentelemetry.proto.trace.v1.ScopeSpans.toObject(t.scopeSpans[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.trace.v1.ResourceSpans";
            }, i;
          })(), g.ScopeSpans = (function() {
            function i(t) {
              if (this.spans = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.scope = null, i.prototype.spans = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.scope != null && Object.hasOwnProperty.call(t, "scope") && s.opentelemetry.proto.common.v1.InstrumentationScope.encode(t.scope, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.spans != null && t.spans.length)
                for (var o = 0; o < t.spans.length; ++o)
                  s.opentelemetry.proto.trace.v1.Span.encode(t.spans[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.trace.v1.ScopeSpans(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.spans && n.spans.length || (n.spans = []), n.spans.push(s.opentelemetry.proto.trace.v1.Span.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.scope != null && t.hasOwnProperty("scope")) {
                var e = s.opentelemetry.proto.common.v1.InstrumentationScope.verify(t.scope);
                if (e)
                  return "scope." + e;
              }
              if (t.spans != null && t.hasOwnProperty("spans")) {
                if (!Array.isArray(t.spans))
                  return "spans: array expected";
                for (var o = 0; o < t.spans.length; ++o) {
                  var e = s.opentelemetry.proto.trace.v1.Span.verify(t.spans[o]);
                  if (e)
                    return "spans." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.trace.v1.ScopeSpans)
                return t;
              var e = new s.opentelemetry.proto.trace.v1.ScopeSpans();
              if (t.scope != null) {
                if (typeof t.scope != "object")
                  throw TypeError(".opentelemetry.proto.trace.v1.ScopeSpans.scope: object expected");
                e.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.fromObject(t.scope);
              }
              if (t.spans) {
                if (!Array.isArray(t.spans))
                  throw TypeError(".opentelemetry.proto.trace.v1.ScopeSpans.spans: array expected");
                e.spans = [];
                for (var o = 0; o < t.spans.length; ++o) {
                  if (typeof t.spans[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.ScopeSpans.spans: object expected");
                  e.spans[o] = s.opentelemetry.proto.trace.v1.Span.fromObject(t.spans[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.spans = []), e.defaults && (o.scope = null, o.schemaUrl = ""), t.scope != null && t.hasOwnProperty("scope") && (o.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.toObject(t.scope, e)), t.spans && t.spans.length) {
                o.spans = [];
                for (var n = 0; n < t.spans.length; ++n)
                  o.spans[n] = s.opentelemetry.proto.trace.v1.Span.toObject(t.spans[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.trace.v1.ScopeSpans";
            }, i;
          })(), g.Span = (function() {
            function i(t) {
              if (this.attributes = [], this.events = [], this.links = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.traceId = null, i.prototype.spanId = null, i.prototype.traceState = null, i.prototype.parentSpanId = null, i.prototype.name = null, i.prototype.kind = null, i.prototype.startTimeUnixNano = null, i.prototype.endTimeUnixNano = null, i.prototype.attributes = u.emptyArray, i.prototype.droppedAttributesCount = null, i.prototype.events = u.emptyArray, i.prototype.droppedEventsCount = null, i.prototype.links = u.emptyArray, i.prototype.droppedLinksCount = null, i.prototype.status = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.traceId != null && Object.hasOwnProperty.call(t, "traceId") && e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).bytes(t.traceId), t.spanId != null && Object.hasOwnProperty.call(t, "spanId") && e.uint32(
                /* id 2, wireType 2 =*/
                18
              ).bytes(t.spanId), t.traceState != null && Object.hasOwnProperty.call(t, "traceState") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.traceState), t.parentSpanId != null && Object.hasOwnProperty.call(t, "parentSpanId") && e.uint32(
                /* id 4, wireType 2 =*/
                34
              ).bytes(t.parentSpanId), t.name != null && Object.hasOwnProperty.call(t, "name") && e.uint32(
                /* id 5, wireType 2 =*/
                42
              ).string(t.name), t.kind != null && Object.hasOwnProperty.call(t, "kind") && e.uint32(
                /* id 6, wireType 0 =*/
                48
              ).int32(t.kind), t.startTimeUnixNano != null && Object.hasOwnProperty.call(t, "startTimeUnixNano") && e.uint32(
                /* id 7, wireType 1 =*/
                57
              ).fixed64(t.startTimeUnixNano), t.endTimeUnixNano != null && Object.hasOwnProperty.call(t, "endTimeUnixNano") && e.uint32(
                /* id 8, wireType 1 =*/
                65
              ).fixed64(t.endTimeUnixNano), t.attributes != null && t.attributes.length)
                for (var o = 0; o < t.attributes.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.attributes[o], e.uint32(
                    /* id 9, wireType 2 =*/
                    74
                  ).fork()).ldelim();
              if (t.droppedAttributesCount != null && Object.hasOwnProperty.call(t, "droppedAttributesCount") && e.uint32(
                /* id 10, wireType 0 =*/
                80
              ).uint32(t.droppedAttributesCount), t.events != null && t.events.length)
                for (var o = 0; o < t.events.length; ++o)
                  s.opentelemetry.proto.trace.v1.Span.Event.encode(t.events[o], e.uint32(
                    /* id 11, wireType 2 =*/
                    90
                  ).fork()).ldelim();
              if (t.droppedEventsCount != null && Object.hasOwnProperty.call(t, "droppedEventsCount") && e.uint32(
                /* id 12, wireType 0 =*/
                96
              ).uint32(t.droppedEventsCount), t.links != null && t.links.length)
                for (var o = 0; o < t.links.length; ++o)
                  s.opentelemetry.proto.trace.v1.Span.Link.encode(t.links[o], e.uint32(
                    /* id 13, wireType 2 =*/
                    106
                  ).fork()).ldelim();
              return t.droppedLinksCount != null && Object.hasOwnProperty.call(t, "droppedLinksCount") && e.uint32(
                /* id 14, wireType 0 =*/
                112
              ).uint32(t.droppedLinksCount), t.status != null && Object.hasOwnProperty.call(t, "status") && s.opentelemetry.proto.trace.v1.Status.encode(t.status, e.uint32(
                /* id 15, wireType 2 =*/
                122
              ).fork()).ldelim(), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.trace.v1.Span(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.traceId = t.bytes();
                    break;
                  }
                  case 2: {
                    n.spanId = t.bytes();
                    break;
                  }
                  case 3: {
                    n.traceState = t.string();
                    break;
                  }
                  case 4: {
                    n.parentSpanId = t.bytes();
                    break;
                  }
                  case 5: {
                    n.name = t.string();
                    break;
                  }
                  case 6: {
                    n.kind = t.int32();
                    break;
                  }
                  case 7: {
                    n.startTimeUnixNano = t.fixed64();
                    break;
                  }
                  case 8: {
                    n.endTimeUnixNano = t.fixed64();
                    break;
                  }
                  case 9: {
                    n.attributes && n.attributes.length || (n.attributes = []), n.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  case 10: {
                    n.droppedAttributesCount = t.uint32();
                    break;
                  }
                  case 11: {
                    n.events && n.events.length || (n.events = []), n.events.push(s.opentelemetry.proto.trace.v1.Span.Event.decode(t, t.uint32()));
                    break;
                  }
                  case 12: {
                    n.droppedEventsCount = t.uint32();
                    break;
                  }
                  case 13: {
                    n.links && n.links.length || (n.links = []), n.links.push(s.opentelemetry.proto.trace.v1.Span.Link.decode(t, t.uint32()));
                    break;
                  }
                  case 14: {
                    n.droppedLinksCount = t.uint32();
                    break;
                  }
                  case 15: {
                    n.status = s.opentelemetry.proto.trace.v1.Status.decode(t, t.uint32());
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.traceId != null && t.hasOwnProperty("traceId") && !(t.traceId && typeof t.traceId.length == "number" || u.isString(t.traceId)))
                return "traceId: buffer expected";
              if (t.spanId != null && t.hasOwnProperty("spanId") && !(t.spanId && typeof t.spanId.length == "number" || u.isString(t.spanId)))
                return "spanId: buffer expected";
              if (t.traceState != null && t.hasOwnProperty("traceState") && !u.isString(t.traceState))
                return "traceState: string expected";
              if (t.parentSpanId != null && t.hasOwnProperty("parentSpanId") && !(t.parentSpanId && typeof t.parentSpanId.length == "number" || u.isString(t.parentSpanId)))
                return "parentSpanId: buffer expected";
              if (t.name != null && t.hasOwnProperty("name") && !u.isString(t.name))
                return "name: string expected";
              if (t.kind != null && t.hasOwnProperty("kind"))
                switch (t.kind) {
                  default:
                    return "kind: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                  case 3:
                  case 4:
                  case 5:
                    break;
                }
              if (t.startTimeUnixNano != null && t.hasOwnProperty("startTimeUnixNano") && !u.isInteger(t.startTimeUnixNano) && !(t.startTimeUnixNano && u.isInteger(t.startTimeUnixNano.low) && u.isInteger(t.startTimeUnixNano.high)))
                return "startTimeUnixNano: integer|Long expected";
              if (t.endTimeUnixNano != null && t.hasOwnProperty("endTimeUnixNano") && !u.isInteger(t.endTimeUnixNano) && !(t.endTimeUnixNano && u.isInteger(t.endTimeUnixNano.low) && u.isInteger(t.endTimeUnixNano.high)))
                return "endTimeUnixNano: integer|Long expected";
              if (t.attributes != null && t.hasOwnProperty("attributes")) {
                if (!Array.isArray(t.attributes))
                  return "attributes: array expected";
                for (var e = 0; e < t.attributes.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.KeyValue.verify(t.attributes[e]);
                  if (o)
                    return "attributes." + o;
                }
              }
              if (t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && !u.isInteger(t.droppedAttributesCount))
                return "droppedAttributesCount: integer expected";
              if (t.events != null && t.hasOwnProperty("events")) {
                if (!Array.isArray(t.events))
                  return "events: array expected";
                for (var e = 0; e < t.events.length; ++e) {
                  var o = s.opentelemetry.proto.trace.v1.Span.Event.verify(t.events[e]);
                  if (o)
                    return "events." + o;
                }
              }
              if (t.droppedEventsCount != null && t.hasOwnProperty("droppedEventsCount") && !u.isInteger(t.droppedEventsCount))
                return "droppedEventsCount: integer expected";
              if (t.links != null && t.hasOwnProperty("links")) {
                if (!Array.isArray(t.links))
                  return "links: array expected";
                for (var e = 0; e < t.links.length; ++e) {
                  var o = s.opentelemetry.proto.trace.v1.Span.Link.verify(t.links[e]);
                  if (o)
                    return "links." + o;
                }
              }
              if (t.droppedLinksCount != null && t.hasOwnProperty("droppedLinksCount") && !u.isInteger(t.droppedLinksCount))
                return "droppedLinksCount: integer expected";
              if (t.status != null && t.hasOwnProperty("status")) {
                var o = s.opentelemetry.proto.trace.v1.Status.verify(t.status);
                if (o)
                  return "status." + o;
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.trace.v1.Span)
                return t;
              var e = new s.opentelemetry.proto.trace.v1.Span();
              switch (t.traceId != null && (typeof t.traceId == "string" ? u.base64.decode(t.traceId, e.traceId = u.newBuffer(u.base64.length(t.traceId)), 0) : t.traceId.length >= 0 && (e.traceId = t.traceId)), t.spanId != null && (typeof t.spanId == "string" ? u.base64.decode(t.spanId, e.spanId = u.newBuffer(u.base64.length(t.spanId)), 0) : t.spanId.length >= 0 && (e.spanId = t.spanId)), t.traceState != null && (e.traceState = String(t.traceState)), t.parentSpanId != null && (typeof t.parentSpanId == "string" ? u.base64.decode(t.parentSpanId, e.parentSpanId = u.newBuffer(u.base64.length(t.parentSpanId)), 0) : t.parentSpanId.length >= 0 && (e.parentSpanId = t.parentSpanId)), t.name != null && (e.name = String(t.name)), t.kind) {
                default:
                  if (typeof t.kind == "number") {
                    e.kind = t.kind;
                    break;
                  }
                  break;
                case "SPAN_KIND_UNSPECIFIED":
                case 0:
                  e.kind = 0;
                  break;
                case "SPAN_KIND_INTERNAL":
                case 1:
                  e.kind = 1;
                  break;
                case "SPAN_KIND_SERVER":
                case 2:
                  e.kind = 2;
                  break;
                case "SPAN_KIND_CLIENT":
                case 3:
                  e.kind = 3;
                  break;
                case "SPAN_KIND_PRODUCER":
                case 4:
                  e.kind = 4;
                  break;
                case "SPAN_KIND_CONSUMER":
                case 5:
                  e.kind = 5;
                  break;
              }
              if (t.startTimeUnixNano != null && (u.Long ? (e.startTimeUnixNano = u.Long.fromValue(t.startTimeUnixNano)).unsigned = !1 : typeof t.startTimeUnixNano == "string" ? e.startTimeUnixNano = parseInt(t.startTimeUnixNano, 10) : typeof t.startTimeUnixNano == "number" ? e.startTimeUnixNano = t.startTimeUnixNano : typeof t.startTimeUnixNano == "object" && (e.startTimeUnixNano = new u.LongBits(t.startTimeUnixNano.low >>> 0, t.startTimeUnixNano.high >>> 0).toNumber())), t.endTimeUnixNano != null && (u.Long ? (e.endTimeUnixNano = u.Long.fromValue(t.endTimeUnixNano)).unsigned = !1 : typeof t.endTimeUnixNano == "string" ? e.endTimeUnixNano = parseInt(t.endTimeUnixNano, 10) : typeof t.endTimeUnixNano == "number" ? e.endTimeUnixNano = t.endTimeUnixNano : typeof t.endTimeUnixNano == "object" && (e.endTimeUnixNano = new u.LongBits(t.endTimeUnixNano.low >>> 0, t.endTimeUnixNano.high >>> 0).toNumber())), t.attributes) {
                if (!Array.isArray(t.attributes))
                  throw TypeError(".opentelemetry.proto.trace.v1.Span.attributes: array expected");
                e.attributes = [];
                for (var o = 0; o < t.attributes.length; ++o) {
                  if (typeof t.attributes[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.Span.attributes: object expected");
                  e.attributes[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.attributes[o]);
                }
              }
              if (t.droppedAttributesCount != null && (e.droppedAttributesCount = t.droppedAttributesCount >>> 0), t.events) {
                if (!Array.isArray(t.events))
                  throw TypeError(".opentelemetry.proto.trace.v1.Span.events: array expected");
                e.events = [];
                for (var o = 0; o < t.events.length; ++o) {
                  if (typeof t.events[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.Span.events: object expected");
                  e.events[o] = s.opentelemetry.proto.trace.v1.Span.Event.fromObject(t.events[o]);
                }
              }
              if (t.droppedEventsCount != null && (e.droppedEventsCount = t.droppedEventsCount >>> 0), t.links) {
                if (!Array.isArray(t.links))
                  throw TypeError(".opentelemetry.proto.trace.v1.Span.links: array expected");
                e.links = [];
                for (var o = 0; o < t.links.length; ++o) {
                  if (typeof t.links[o] != "object")
                    throw TypeError(".opentelemetry.proto.trace.v1.Span.links: object expected");
                  e.links[o] = s.opentelemetry.proto.trace.v1.Span.Link.fromObject(t.links[o]);
                }
              }
              if (t.droppedLinksCount != null && (e.droppedLinksCount = t.droppedLinksCount >>> 0), t.status != null) {
                if (typeof t.status != "object")
                  throw TypeError(".opentelemetry.proto.trace.v1.Span.status: object expected");
                e.status = s.opentelemetry.proto.trace.v1.Status.fromObject(t.status);
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.attributes = [], o.events = [], o.links = []), e.defaults) {
                if (e.bytes === String ? o.traceId = "" : (o.traceId = [], e.bytes !== Array && (o.traceId = u.newBuffer(o.traceId))), e.bytes === String ? o.spanId = "" : (o.spanId = [], e.bytes !== Array && (o.spanId = u.newBuffer(o.spanId))), o.traceState = "", e.bytes === String ? o.parentSpanId = "" : (o.parentSpanId = [], e.bytes !== Array && (o.parentSpanId = u.newBuffer(o.parentSpanId))), o.name = "", o.kind = e.enums === String ? "SPAN_KIND_UNSPECIFIED" : 0, u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.startTimeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.startTimeUnixNano = e.longs === String ? "0" : 0;
                if (u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.endTimeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.endTimeUnixNano = e.longs === String ? "0" : 0;
                o.droppedAttributesCount = 0, o.droppedEventsCount = 0, o.droppedLinksCount = 0, o.status = null;
              }
              if (t.traceId != null && t.hasOwnProperty("traceId") && (o.traceId = e.bytes === String ? u.base64.encode(t.traceId, 0, t.traceId.length) : e.bytes === Array ? Array.prototype.slice.call(t.traceId) : t.traceId), t.spanId != null && t.hasOwnProperty("spanId") && (o.spanId = e.bytes === String ? u.base64.encode(t.spanId, 0, t.spanId.length) : e.bytes === Array ? Array.prototype.slice.call(t.spanId) : t.spanId), t.traceState != null && t.hasOwnProperty("traceState") && (o.traceState = t.traceState), t.parentSpanId != null && t.hasOwnProperty("parentSpanId") && (o.parentSpanId = e.bytes === String ? u.base64.encode(t.parentSpanId, 0, t.parentSpanId.length) : e.bytes === Array ? Array.prototype.slice.call(t.parentSpanId) : t.parentSpanId), t.name != null && t.hasOwnProperty("name") && (o.name = t.name), t.kind != null && t.hasOwnProperty("kind") && (o.kind = e.enums === String ? s.opentelemetry.proto.trace.v1.Span.SpanKind[t.kind] === void 0 ? t.kind : s.opentelemetry.proto.trace.v1.Span.SpanKind[t.kind] : t.kind), t.startTimeUnixNano != null && t.hasOwnProperty("startTimeUnixNano") && (typeof t.startTimeUnixNano == "number" ? o.startTimeUnixNano = e.longs === String ? String(t.startTimeUnixNano) : t.startTimeUnixNano : o.startTimeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.startTimeUnixNano) : e.longs === Number ? new u.LongBits(t.startTimeUnixNano.low >>> 0, t.startTimeUnixNano.high >>> 0).toNumber() : t.startTimeUnixNano), t.endTimeUnixNano != null && t.hasOwnProperty("endTimeUnixNano") && (typeof t.endTimeUnixNano == "number" ? o.endTimeUnixNano = e.longs === String ? String(t.endTimeUnixNano) : t.endTimeUnixNano : o.endTimeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.endTimeUnixNano) : e.longs === Number ? new u.LongBits(t.endTimeUnixNano.low >>> 0, t.endTimeUnixNano.high >>> 0).toNumber() : t.endTimeUnixNano), t.attributes && t.attributes.length) {
                o.attributes = [];
                for (var c = 0; c < t.attributes.length; ++c)
                  o.attributes[c] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.attributes[c], e);
              }
              if (t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && (o.droppedAttributesCount = t.droppedAttributesCount), t.events && t.events.length) {
                o.events = [];
                for (var c = 0; c < t.events.length; ++c)
                  o.events[c] = s.opentelemetry.proto.trace.v1.Span.Event.toObject(t.events[c], e);
              }
              if (t.droppedEventsCount != null && t.hasOwnProperty("droppedEventsCount") && (o.droppedEventsCount = t.droppedEventsCount), t.links && t.links.length) {
                o.links = [];
                for (var c = 0; c < t.links.length; ++c)
                  o.links[c] = s.opentelemetry.proto.trace.v1.Span.Link.toObject(t.links[c], e);
              }
              return t.droppedLinksCount != null && t.hasOwnProperty("droppedLinksCount") && (o.droppedLinksCount = t.droppedLinksCount), t.status != null && t.hasOwnProperty("status") && (o.status = s.opentelemetry.proto.trace.v1.Status.toObject(t.status, e)), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.trace.v1.Span";
            }, i.SpanKind = (function() {
              var t = {}, e = Object.create(t);
              return e[t[0] = "SPAN_KIND_UNSPECIFIED"] = 0, e[t[1] = "SPAN_KIND_INTERNAL"] = 1, e[t[2] = "SPAN_KIND_SERVER"] = 2, e[t[3] = "SPAN_KIND_CLIENT"] = 3, e[t[4] = "SPAN_KIND_PRODUCER"] = 4, e[t[5] = "SPAN_KIND_CONSUMER"] = 5, e;
            })(), i.Event = (function() {
              function t(e) {
                if (this.attributes = [], e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.timeUnixNano = null, t.prototype.name = null, t.prototype.attributes = u.emptyArray, t.prototype.droppedAttributesCount = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                if (o || (o = d.create()), e.timeUnixNano != null && Object.hasOwnProperty.call(e, "timeUnixNano") && o.uint32(
                  /* id 1, wireType 1 =*/
                  9
                ).fixed64(e.timeUnixNano), e.name != null && Object.hasOwnProperty.call(e, "name") && o.uint32(
                  /* id 2, wireType 2 =*/
                  18
                ).string(e.name), e.attributes != null && e.attributes.length)
                  for (var n = 0; n < e.attributes.length; ++n)
                    s.opentelemetry.proto.common.v1.KeyValue.encode(e.attributes[n], o.uint32(
                      /* id 3, wireType 2 =*/
                      26
                    ).fork()).ldelim();
                return e.droppedAttributesCount != null && Object.hasOwnProperty.call(e, "droppedAttributesCount") && o.uint32(
                  /* id 4, wireType 0 =*/
                  32
                ).uint32(e.droppedAttributesCount), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.trace.v1.Span.Event(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.timeUnixNano = e.fixed64();
                      break;
                    }
                    case 2: {
                      c.name = e.string();
                      break;
                    }
                    case 3: {
                      c.attributes && c.attributes.length || (c.attributes = []), c.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                      break;
                    }
                    case 4: {
                      c.droppedAttributesCount = e.uint32();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && !u.isInteger(e.timeUnixNano) && !(e.timeUnixNano && u.isInteger(e.timeUnixNano.low) && u.isInteger(e.timeUnixNano.high)))
                  return "timeUnixNano: integer|Long expected";
                if (e.name != null && e.hasOwnProperty("name") && !u.isString(e.name))
                  return "name: string expected";
                if (e.attributes != null && e.hasOwnProperty("attributes")) {
                  if (!Array.isArray(e.attributes))
                    return "attributes: array expected";
                  for (var o = 0; o < e.attributes.length; ++o) {
                    var n = s.opentelemetry.proto.common.v1.KeyValue.verify(e.attributes[o]);
                    if (n)
                      return "attributes." + n;
                  }
                }
                return e.droppedAttributesCount != null && e.hasOwnProperty("droppedAttributesCount") && !u.isInteger(e.droppedAttributesCount) ? "droppedAttributesCount: integer expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.trace.v1.Span.Event)
                  return e;
                var o = new s.opentelemetry.proto.trace.v1.Span.Event();
                if (e.timeUnixNano != null && (u.Long ? (o.timeUnixNano = u.Long.fromValue(e.timeUnixNano)).unsigned = !1 : typeof e.timeUnixNano == "string" ? o.timeUnixNano = parseInt(e.timeUnixNano, 10) : typeof e.timeUnixNano == "number" ? o.timeUnixNano = e.timeUnixNano : typeof e.timeUnixNano == "object" && (o.timeUnixNano = new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber())), e.name != null && (o.name = String(e.name)), e.attributes) {
                  if (!Array.isArray(e.attributes))
                    throw TypeError(".opentelemetry.proto.trace.v1.Span.Event.attributes: array expected");
                  o.attributes = [];
                  for (var n = 0; n < e.attributes.length; ++n) {
                    if (typeof e.attributes[n] != "object")
                      throw TypeError(".opentelemetry.proto.trace.v1.Span.Event.attributes: object expected");
                    o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.attributes[n]);
                  }
                }
                return e.droppedAttributesCount != null && (o.droppedAttributesCount = e.droppedAttributesCount >>> 0), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if ((o.arrays || o.defaults) && (n.attributes = []), o.defaults) {
                  if (u.Long) {
                    var c = new u.Long(0, 0, !1);
                    n.timeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                  } else
                    n.timeUnixNano = o.longs === String ? "0" : 0;
                  n.name = "", n.droppedAttributesCount = 0;
                }
                if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && (typeof e.timeUnixNano == "number" ? n.timeUnixNano = o.longs === String ? String(e.timeUnixNano) : e.timeUnixNano : n.timeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.timeUnixNano) : o.longs === Number ? new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber() : e.timeUnixNano), e.name != null && e.hasOwnProperty("name") && (n.name = e.name), e.attributes && e.attributes.length) {
                  n.attributes = [];
                  for (var h = 0; h < e.attributes.length; ++h)
                    n.attributes[h] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.attributes[h], o);
                }
                return e.droppedAttributesCount != null && e.hasOwnProperty("droppedAttributesCount") && (n.droppedAttributesCount = e.droppedAttributesCount), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.trace.v1.Span.Event";
              }, t;
            })(), i.Link = (function() {
              function t(e) {
                if (this.attributes = [], e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.traceId = null, t.prototype.spanId = null, t.prototype.traceState = null, t.prototype.attributes = u.emptyArray, t.prototype.droppedAttributesCount = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                if (o || (o = d.create()), e.traceId != null && Object.hasOwnProperty.call(e, "traceId") && o.uint32(
                  /* id 1, wireType 2 =*/
                  10
                ).bytes(e.traceId), e.spanId != null && Object.hasOwnProperty.call(e, "spanId") && o.uint32(
                  /* id 2, wireType 2 =*/
                  18
                ).bytes(e.spanId), e.traceState != null && Object.hasOwnProperty.call(e, "traceState") && o.uint32(
                  /* id 3, wireType 2 =*/
                  26
                ).string(e.traceState), e.attributes != null && e.attributes.length)
                  for (var n = 0; n < e.attributes.length; ++n)
                    s.opentelemetry.proto.common.v1.KeyValue.encode(e.attributes[n], o.uint32(
                      /* id 4, wireType 2 =*/
                      34
                    ).fork()).ldelim();
                return e.droppedAttributesCount != null && Object.hasOwnProperty.call(e, "droppedAttributesCount") && o.uint32(
                  /* id 5, wireType 0 =*/
                  40
                ).uint32(e.droppedAttributesCount), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.trace.v1.Span.Link(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.traceId = e.bytes();
                      break;
                    }
                    case 2: {
                      c.spanId = e.bytes();
                      break;
                    }
                    case 3: {
                      c.traceState = e.string();
                      break;
                    }
                    case 4: {
                      c.attributes && c.attributes.length || (c.attributes = []), c.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                      break;
                    }
                    case 5: {
                      c.droppedAttributesCount = e.uint32();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.traceId != null && e.hasOwnProperty("traceId") && !(e.traceId && typeof e.traceId.length == "number" || u.isString(e.traceId)))
                  return "traceId: buffer expected";
                if (e.spanId != null && e.hasOwnProperty("spanId") && !(e.spanId && typeof e.spanId.length == "number" || u.isString(e.spanId)))
                  return "spanId: buffer expected";
                if (e.traceState != null && e.hasOwnProperty("traceState") && !u.isString(e.traceState))
                  return "traceState: string expected";
                if (e.attributes != null && e.hasOwnProperty("attributes")) {
                  if (!Array.isArray(e.attributes))
                    return "attributes: array expected";
                  for (var o = 0; o < e.attributes.length; ++o) {
                    var n = s.opentelemetry.proto.common.v1.KeyValue.verify(e.attributes[o]);
                    if (n)
                      return "attributes." + n;
                  }
                }
                return e.droppedAttributesCount != null && e.hasOwnProperty("droppedAttributesCount") && !u.isInteger(e.droppedAttributesCount) ? "droppedAttributesCount: integer expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.trace.v1.Span.Link)
                  return e;
                var o = new s.opentelemetry.proto.trace.v1.Span.Link();
                if (e.traceId != null && (typeof e.traceId == "string" ? u.base64.decode(e.traceId, o.traceId = u.newBuffer(u.base64.length(e.traceId)), 0) : e.traceId.length >= 0 && (o.traceId = e.traceId)), e.spanId != null && (typeof e.spanId == "string" ? u.base64.decode(e.spanId, o.spanId = u.newBuffer(u.base64.length(e.spanId)), 0) : e.spanId.length >= 0 && (o.spanId = e.spanId)), e.traceState != null && (o.traceState = String(e.traceState)), e.attributes) {
                  if (!Array.isArray(e.attributes))
                    throw TypeError(".opentelemetry.proto.trace.v1.Span.Link.attributes: array expected");
                  o.attributes = [];
                  for (var n = 0; n < e.attributes.length; ++n) {
                    if (typeof e.attributes[n] != "object")
                      throw TypeError(".opentelemetry.proto.trace.v1.Span.Link.attributes: object expected");
                    o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.attributes[n]);
                  }
                }
                return e.droppedAttributesCount != null && (o.droppedAttributesCount = e.droppedAttributesCount >>> 0), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if ((o.arrays || o.defaults) && (n.attributes = []), o.defaults && (o.bytes === String ? n.traceId = "" : (n.traceId = [], o.bytes !== Array && (n.traceId = u.newBuffer(n.traceId))), o.bytes === String ? n.spanId = "" : (n.spanId = [], o.bytes !== Array && (n.spanId = u.newBuffer(n.spanId))), n.traceState = "", n.droppedAttributesCount = 0), e.traceId != null && e.hasOwnProperty("traceId") && (n.traceId = o.bytes === String ? u.base64.encode(e.traceId, 0, e.traceId.length) : o.bytes === Array ? Array.prototype.slice.call(e.traceId) : e.traceId), e.spanId != null && e.hasOwnProperty("spanId") && (n.spanId = o.bytes === String ? u.base64.encode(e.spanId, 0, e.spanId.length) : o.bytes === Array ? Array.prototype.slice.call(e.spanId) : e.spanId), e.traceState != null && e.hasOwnProperty("traceState") && (n.traceState = e.traceState), e.attributes && e.attributes.length) {
                  n.attributes = [];
                  for (var c = 0; c < e.attributes.length; ++c)
                    n.attributes[c] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.attributes[c], o);
                }
                return e.droppedAttributesCount != null && e.hasOwnProperty("droppedAttributesCount") && (n.droppedAttributesCount = e.droppedAttributesCount), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.trace.v1.Span.Link";
              }, t;
            })(), i;
          })(), g.Status = (function() {
            function i(t) {
              if (t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.message = null, i.prototype.code = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              return e || (e = d.create()), t.message != null && Object.hasOwnProperty.call(t, "message") && e.uint32(
                /* id 2, wireType 2 =*/
                18
              ).string(t.message), t.code != null && Object.hasOwnProperty.call(t, "code") && e.uint32(
                /* id 3, wireType 0 =*/
                24
              ).int32(t.code), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.trace.v1.Status(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 2: {
                    n.message = t.string();
                    break;
                  }
                  case 3: {
                    n.code = t.int32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.message != null && t.hasOwnProperty("message") && !u.isString(t.message))
                return "message: string expected";
              if (t.code != null && t.hasOwnProperty("code"))
                switch (t.code) {
                  default:
                    return "code: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                    break;
                }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.trace.v1.Status)
                return t;
              var e = new s.opentelemetry.proto.trace.v1.Status();
              switch (t.message != null && (e.message = String(t.message)), t.code) {
                default:
                  if (typeof t.code == "number") {
                    e.code = t.code;
                    break;
                  }
                  break;
                case "STATUS_CODE_UNSET":
                case 0:
                  e.code = 0;
                  break;
                case "STATUS_CODE_OK":
                case 1:
                  e.code = 1;
                  break;
                case "STATUS_CODE_ERROR":
                case 2:
                  e.code = 2;
                  break;
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              return e.defaults && (o.message = "", o.code = e.enums === String ? "STATUS_CODE_UNSET" : 0), t.message != null && t.hasOwnProperty("message") && (o.message = t.message), t.code != null && t.hasOwnProperty("code") && (o.code = e.enums === String ? s.opentelemetry.proto.trace.v1.Status.StatusCode[t.code] === void 0 ? t.code : s.opentelemetry.proto.trace.v1.Status.StatusCode[t.code] : t.code), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.trace.v1.Status";
            }, i.StatusCode = (function() {
              var t = {}, e = Object.create(t);
              return e[t[0] = "STATUS_CODE_UNSET"] = 0, e[t[1] = "STATUS_CODE_OK"] = 1, e[t[2] = "STATUS_CODE_ERROR"] = 2, e;
            })(), i;
          })(), g;
        })(), b;
      })(), y.collector = (function() {
        var b = {};
        return b.trace = (function() {
          var g = {};
          return g.v1 = (function() {
            var i = {};
            return i.TraceService = (function() {
              function t(e, o, n) {
                m.rpc.Service.call(this, e, o, n);
              }
              return (t.prototype = Object.create(m.rpc.Service.prototype)).constructor = t, t.create = function(e, o, n) {
                return new this(e, o, n);
              }, Object.defineProperty(t.prototype.export = function e(o, n) {
                return this.rpcCall(e, s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest, s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse, o, n);
              }, "name", { value: "Export" }), t;
            })(), i.ExportTraceServiceRequest = (function() {
              function t(e) {
                if (this.resourceSpans = [], e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.resourceSpans = u.emptyArray, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                if (o || (o = d.create()), e.resourceSpans != null && e.resourceSpans.length)
                  for (var n = 0; n < e.resourceSpans.length; ++n)
                    s.opentelemetry.proto.trace.v1.ResourceSpans.encode(e.resourceSpans[n], o.uint32(
                      /* id 1, wireType 2 =*/
                      10
                    ).fork()).ldelim();
                return o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.resourceSpans && c.resourceSpans.length || (c.resourceSpans = []), c.resourceSpans.push(s.opentelemetry.proto.trace.v1.ResourceSpans.decode(e, e.uint32()));
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.resourceSpans != null && e.hasOwnProperty("resourceSpans")) {
                  if (!Array.isArray(e.resourceSpans))
                    return "resourceSpans: array expected";
                  for (var o = 0; o < e.resourceSpans.length; ++o) {
                    var n = s.opentelemetry.proto.trace.v1.ResourceSpans.verify(e.resourceSpans[o]);
                    if (n)
                      return "resourceSpans." + n;
                  }
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest)
                  return e;
                var o = new s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest();
                if (e.resourceSpans) {
                  if (!Array.isArray(e.resourceSpans))
                    throw TypeError(".opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest.resourceSpans: array expected");
                  o.resourceSpans = [];
                  for (var n = 0; n < e.resourceSpans.length; ++n) {
                    if (typeof e.resourceSpans[n] != "object")
                      throw TypeError(".opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest.resourceSpans: object expected");
                    o.resourceSpans[n] = s.opentelemetry.proto.trace.v1.ResourceSpans.fromObject(e.resourceSpans[n]);
                  }
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if ((o.arrays || o.defaults) && (n.resourceSpans = []), e.resourceSpans && e.resourceSpans.length) {
                  n.resourceSpans = [];
                  for (var c = 0; c < e.resourceSpans.length; ++c)
                    n.resourceSpans[c] = s.opentelemetry.proto.trace.v1.ResourceSpans.toObject(e.resourceSpans[c], o);
                }
                return n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest";
              }, t;
            })(), i.ExportTraceServiceResponse = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.partialSuccess = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.partialSuccess != null && Object.hasOwnProperty.call(e, "partialSuccess") && s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess.encode(e.partialSuccess, o.uint32(
                  /* id 1, wireType 2 =*/
                  10
                ).fork()).ldelim(), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.partialSuccess = s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess.decode(e, e.uint32());
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.partialSuccess != null && e.hasOwnProperty("partialSuccess")) {
                  var o = s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess.verify(e.partialSuccess);
                  if (o)
                    return "partialSuccess." + o;
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse)
                  return e;
                var o = new s.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse();
                if (e.partialSuccess != null) {
                  if (typeof e.partialSuccess != "object")
                    throw TypeError(".opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse.partialSuccess: object expected");
                  o.partialSuccess = s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess.fromObject(e.partialSuccess);
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                return o.defaults && (n.partialSuccess = null), e.partialSuccess != null && e.hasOwnProperty("partialSuccess") && (n.partialSuccess = s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess.toObject(e.partialSuccess, o)), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse";
              }, t;
            })(), i.ExportTracePartialSuccess = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.rejectedSpans = null, t.prototype.errorMessage = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.rejectedSpans != null && Object.hasOwnProperty.call(e, "rejectedSpans") && o.uint32(
                  /* id 1, wireType 0 =*/
                  8
                ).int64(e.rejectedSpans), e.errorMessage != null && Object.hasOwnProperty.call(e, "errorMessage") && o.uint32(
                  /* id 2, wireType 2 =*/
                  18
                ).string(e.errorMessage), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.rejectedSpans = e.int64();
                      break;
                    }
                    case 2: {
                      c.errorMessage = e.string();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                return typeof e != "object" || e === null ? "object expected" : e.rejectedSpans != null && e.hasOwnProperty("rejectedSpans") && !u.isInteger(e.rejectedSpans) && !(e.rejectedSpans && u.isInteger(e.rejectedSpans.low) && u.isInteger(e.rejectedSpans.high)) ? "rejectedSpans: integer|Long expected" : e.errorMessage != null && e.hasOwnProperty("errorMessage") && !u.isString(e.errorMessage) ? "errorMessage: string expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess)
                  return e;
                var o = new s.opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess();
                return e.rejectedSpans != null && (u.Long ? (o.rejectedSpans = u.Long.fromValue(e.rejectedSpans)).unsigned = !1 : typeof e.rejectedSpans == "string" ? o.rejectedSpans = parseInt(e.rejectedSpans, 10) : typeof e.rejectedSpans == "number" ? o.rejectedSpans = e.rejectedSpans : typeof e.rejectedSpans == "object" && (o.rejectedSpans = new u.LongBits(e.rejectedSpans.low >>> 0, e.rejectedSpans.high >>> 0).toNumber())), e.errorMessage != null && (o.errorMessage = String(e.errorMessage)), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if (o.defaults) {
                  if (u.Long) {
                    var c = new u.Long(0, 0, !1);
                    n.rejectedSpans = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                  } else
                    n.rejectedSpans = o.longs === String ? "0" : 0;
                  n.errorMessage = "";
                }
                return e.rejectedSpans != null && e.hasOwnProperty("rejectedSpans") && (typeof e.rejectedSpans == "number" ? n.rejectedSpans = o.longs === String ? String(e.rejectedSpans) : e.rejectedSpans : n.rejectedSpans = o.longs === String ? u.Long.prototype.toString.call(e.rejectedSpans) : o.longs === Number ? new u.LongBits(e.rejectedSpans.low >>> 0, e.rejectedSpans.high >>> 0).toNumber() : e.rejectedSpans), e.errorMessage != null && e.hasOwnProperty("errorMessage") && (n.errorMessage = e.errorMessage), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.trace.v1.ExportTracePartialSuccess";
              }, t;
            })(), i;
          })(), g;
        })(), b.metrics = (function() {
          var g = {};
          return g.v1 = (function() {
            var i = {};
            return i.MetricsService = (function() {
              function t(e, o, n) {
                m.rpc.Service.call(this, e, o, n);
              }
              return (t.prototype = Object.create(m.rpc.Service.prototype)).constructor = t, t.create = function(e, o, n) {
                return new this(e, o, n);
              }, Object.defineProperty(t.prototype.export = function e(o, n) {
                return this.rpcCall(e, s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest, s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse, o, n);
              }, "name", { value: "Export" }), t;
            })(), i.ExportMetricsServiceRequest = (function() {
              function t(e) {
                if (this.resourceMetrics = [], e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.resourceMetrics = u.emptyArray, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                if (o || (o = d.create()), e.resourceMetrics != null && e.resourceMetrics.length)
                  for (var n = 0; n < e.resourceMetrics.length; ++n)
                    s.opentelemetry.proto.metrics.v1.ResourceMetrics.encode(e.resourceMetrics[n], o.uint32(
                      /* id 1, wireType 2 =*/
                      10
                    ).fork()).ldelim();
                return o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.resourceMetrics && c.resourceMetrics.length || (c.resourceMetrics = []), c.resourceMetrics.push(s.opentelemetry.proto.metrics.v1.ResourceMetrics.decode(e, e.uint32()));
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.resourceMetrics != null && e.hasOwnProperty("resourceMetrics")) {
                  if (!Array.isArray(e.resourceMetrics))
                    return "resourceMetrics: array expected";
                  for (var o = 0; o < e.resourceMetrics.length; ++o) {
                    var n = s.opentelemetry.proto.metrics.v1.ResourceMetrics.verify(e.resourceMetrics[o]);
                    if (n)
                      return "resourceMetrics." + n;
                  }
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest)
                  return e;
                var o = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest();
                if (e.resourceMetrics) {
                  if (!Array.isArray(e.resourceMetrics))
                    throw TypeError(".opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest.resourceMetrics: array expected");
                  o.resourceMetrics = [];
                  for (var n = 0; n < e.resourceMetrics.length; ++n) {
                    if (typeof e.resourceMetrics[n] != "object")
                      throw TypeError(".opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest.resourceMetrics: object expected");
                    o.resourceMetrics[n] = s.opentelemetry.proto.metrics.v1.ResourceMetrics.fromObject(e.resourceMetrics[n]);
                  }
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if ((o.arrays || o.defaults) && (n.resourceMetrics = []), e.resourceMetrics && e.resourceMetrics.length) {
                  n.resourceMetrics = [];
                  for (var c = 0; c < e.resourceMetrics.length; ++c)
                    n.resourceMetrics[c] = s.opentelemetry.proto.metrics.v1.ResourceMetrics.toObject(e.resourceMetrics[c], o);
                }
                return n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceRequest";
              }, t;
            })(), i.ExportMetricsServiceResponse = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.partialSuccess = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.partialSuccess != null && Object.hasOwnProperty.call(e, "partialSuccess") && s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess.encode(e.partialSuccess, o.uint32(
                  /* id 1, wireType 2 =*/
                  10
                ).fork()).ldelim(), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.partialSuccess = s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess.decode(e, e.uint32());
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.partialSuccess != null && e.hasOwnProperty("partialSuccess")) {
                  var o = s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess.verify(e.partialSuccess);
                  if (o)
                    return "partialSuccess." + o;
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse)
                  return e;
                var o = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse();
                if (e.partialSuccess != null) {
                  if (typeof e.partialSuccess != "object")
                    throw TypeError(".opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse.partialSuccess: object expected");
                  o.partialSuccess = s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess.fromObject(e.partialSuccess);
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                return o.defaults && (n.partialSuccess = null), e.partialSuccess != null && e.hasOwnProperty("partialSuccess") && (n.partialSuccess = s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess.toObject(e.partialSuccess, o)), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.metrics.v1.ExportMetricsServiceResponse";
              }, t;
            })(), i.ExportMetricsPartialSuccess = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.rejectedDataPoints = null, t.prototype.errorMessage = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.rejectedDataPoints != null && Object.hasOwnProperty.call(e, "rejectedDataPoints") && o.uint32(
                  /* id 1, wireType 0 =*/
                  8
                ).int64(e.rejectedDataPoints), e.errorMessage != null && Object.hasOwnProperty.call(e, "errorMessage") && o.uint32(
                  /* id 2, wireType 2 =*/
                  18
                ).string(e.errorMessage), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.rejectedDataPoints = e.int64();
                      break;
                    }
                    case 2: {
                      c.errorMessage = e.string();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                return typeof e != "object" || e === null ? "object expected" : e.rejectedDataPoints != null && e.hasOwnProperty("rejectedDataPoints") && !u.isInteger(e.rejectedDataPoints) && !(e.rejectedDataPoints && u.isInteger(e.rejectedDataPoints.low) && u.isInteger(e.rejectedDataPoints.high)) ? "rejectedDataPoints: integer|Long expected" : e.errorMessage != null && e.hasOwnProperty("errorMessage") && !u.isString(e.errorMessage) ? "errorMessage: string expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess)
                  return e;
                var o = new s.opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess();
                return e.rejectedDataPoints != null && (u.Long ? (o.rejectedDataPoints = u.Long.fromValue(e.rejectedDataPoints)).unsigned = !1 : typeof e.rejectedDataPoints == "string" ? o.rejectedDataPoints = parseInt(e.rejectedDataPoints, 10) : typeof e.rejectedDataPoints == "number" ? o.rejectedDataPoints = e.rejectedDataPoints : typeof e.rejectedDataPoints == "object" && (o.rejectedDataPoints = new u.LongBits(e.rejectedDataPoints.low >>> 0, e.rejectedDataPoints.high >>> 0).toNumber())), e.errorMessage != null && (o.errorMessage = String(e.errorMessage)), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if (o.defaults) {
                  if (u.Long) {
                    var c = new u.Long(0, 0, !1);
                    n.rejectedDataPoints = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                  } else
                    n.rejectedDataPoints = o.longs === String ? "0" : 0;
                  n.errorMessage = "";
                }
                return e.rejectedDataPoints != null && e.hasOwnProperty("rejectedDataPoints") && (typeof e.rejectedDataPoints == "number" ? n.rejectedDataPoints = o.longs === String ? String(e.rejectedDataPoints) : e.rejectedDataPoints : n.rejectedDataPoints = o.longs === String ? u.Long.prototype.toString.call(e.rejectedDataPoints) : o.longs === Number ? new u.LongBits(e.rejectedDataPoints.low >>> 0, e.rejectedDataPoints.high >>> 0).toNumber() : e.rejectedDataPoints), e.errorMessage != null && e.hasOwnProperty("errorMessage") && (n.errorMessage = e.errorMessage), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.metrics.v1.ExportMetricsPartialSuccess";
              }, t;
            })(), i;
          })(), g;
        })(), b.logs = (function() {
          var g = {};
          return g.v1 = (function() {
            var i = {};
            return i.LogsService = (function() {
              function t(e, o, n) {
                m.rpc.Service.call(this, e, o, n);
              }
              return (t.prototype = Object.create(m.rpc.Service.prototype)).constructor = t, t.create = function(e, o, n) {
                return new this(e, o, n);
              }, Object.defineProperty(t.prototype.export = function e(o, n) {
                return this.rpcCall(e, s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest, s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse, o, n);
              }, "name", { value: "Export" }), t;
            })(), i.ExportLogsServiceRequest = (function() {
              function t(e) {
                if (this.resourceLogs = [], e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.resourceLogs = u.emptyArray, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                if (o || (o = d.create()), e.resourceLogs != null && e.resourceLogs.length)
                  for (var n = 0; n < e.resourceLogs.length; ++n)
                    s.opentelemetry.proto.logs.v1.ResourceLogs.encode(e.resourceLogs[n], o.uint32(
                      /* id 1, wireType 2 =*/
                      10
                    ).fork()).ldelim();
                return o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.resourceLogs && c.resourceLogs.length || (c.resourceLogs = []), c.resourceLogs.push(s.opentelemetry.proto.logs.v1.ResourceLogs.decode(e, e.uint32()));
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.resourceLogs != null && e.hasOwnProperty("resourceLogs")) {
                  if (!Array.isArray(e.resourceLogs))
                    return "resourceLogs: array expected";
                  for (var o = 0; o < e.resourceLogs.length; ++o) {
                    var n = s.opentelemetry.proto.logs.v1.ResourceLogs.verify(e.resourceLogs[o]);
                    if (n)
                      return "resourceLogs." + n;
                  }
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest)
                  return e;
                var o = new s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest();
                if (e.resourceLogs) {
                  if (!Array.isArray(e.resourceLogs))
                    throw TypeError(".opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest.resourceLogs: array expected");
                  o.resourceLogs = [];
                  for (var n = 0; n < e.resourceLogs.length; ++n) {
                    if (typeof e.resourceLogs[n] != "object")
                      throw TypeError(".opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest.resourceLogs: object expected");
                    o.resourceLogs[n] = s.opentelemetry.proto.logs.v1.ResourceLogs.fromObject(e.resourceLogs[n]);
                  }
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if ((o.arrays || o.defaults) && (n.resourceLogs = []), e.resourceLogs && e.resourceLogs.length) {
                  n.resourceLogs = [];
                  for (var c = 0; c < e.resourceLogs.length; ++c)
                    n.resourceLogs[c] = s.opentelemetry.proto.logs.v1.ResourceLogs.toObject(e.resourceLogs[c], o);
                }
                return n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.logs.v1.ExportLogsServiceRequest";
              }, t;
            })(), i.ExportLogsServiceResponse = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.partialSuccess = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.partialSuccess != null && Object.hasOwnProperty.call(e, "partialSuccess") && s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess.encode(e.partialSuccess, o.uint32(
                  /* id 1, wireType 2 =*/
                  10
                ).fork()).ldelim(), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.partialSuccess = s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess.decode(e, e.uint32());
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                if (typeof e != "object" || e === null)
                  return "object expected";
                if (e.partialSuccess != null && e.hasOwnProperty("partialSuccess")) {
                  var o = s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess.verify(e.partialSuccess);
                  if (o)
                    return "partialSuccess." + o;
                }
                return null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse)
                  return e;
                var o = new s.opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse();
                if (e.partialSuccess != null) {
                  if (typeof e.partialSuccess != "object")
                    throw TypeError(".opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse.partialSuccess: object expected");
                  o.partialSuccess = s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess.fromObject(e.partialSuccess);
                }
                return o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                return o.defaults && (n.partialSuccess = null), e.partialSuccess != null && e.hasOwnProperty("partialSuccess") && (n.partialSuccess = s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess.toObject(e.partialSuccess, o)), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.logs.v1.ExportLogsServiceResponse";
              }, t;
            })(), i.ExportLogsPartialSuccess = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.rejectedLogRecords = null, t.prototype.errorMessage = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.rejectedLogRecords != null && Object.hasOwnProperty.call(e, "rejectedLogRecords") && o.uint32(
                  /* id 1, wireType 0 =*/
                  8
                ).int64(e.rejectedLogRecords), e.errorMessage != null && Object.hasOwnProperty.call(e, "errorMessage") && o.uint32(
                  /* id 2, wireType 2 =*/
                  18
                ).string(e.errorMessage), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.rejectedLogRecords = e.int64();
                      break;
                    }
                    case 2: {
                      c.errorMessage = e.string();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                return typeof e != "object" || e === null ? "object expected" : e.rejectedLogRecords != null && e.hasOwnProperty("rejectedLogRecords") && !u.isInteger(e.rejectedLogRecords) && !(e.rejectedLogRecords && u.isInteger(e.rejectedLogRecords.low) && u.isInteger(e.rejectedLogRecords.high)) ? "rejectedLogRecords: integer|Long expected" : e.errorMessage != null && e.hasOwnProperty("errorMessage") && !u.isString(e.errorMessage) ? "errorMessage: string expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess)
                  return e;
                var o = new s.opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess();
                return e.rejectedLogRecords != null && (u.Long ? (o.rejectedLogRecords = u.Long.fromValue(e.rejectedLogRecords)).unsigned = !1 : typeof e.rejectedLogRecords == "string" ? o.rejectedLogRecords = parseInt(e.rejectedLogRecords, 10) : typeof e.rejectedLogRecords == "number" ? o.rejectedLogRecords = e.rejectedLogRecords : typeof e.rejectedLogRecords == "object" && (o.rejectedLogRecords = new u.LongBits(e.rejectedLogRecords.low >>> 0, e.rejectedLogRecords.high >>> 0).toNumber())), e.errorMessage != null && (o.errorMessage = String(e.errorMessage)), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                if (o.defaults) {
                  if (u.Long) {
                    var c = new u.Long(0, 0, !1);
                    n.rejectedLogRecords = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                  } else
                    n.rejectedLogRecords = o.longs === String ? "0" : 0;
                  n.errorMessage = "";
                }
                return e.rejectedLogRecords != null && e.hasOwnProperty("rejectedLogRecords") && (typeof e.rejectedLogRecords == "number" ? n.rejectedLogRecords = o.longs === String ? String(e.rejectedLogRecords) : e.rejectedLogRecords : n.rejectedLogRecords = o.longs === String ? u.Long.prototype.toString.call(e.rejectedLogRecords) : o.longs === Number ? new u.LongBits(e.rejectedLogRecords.low >>> 0, e.rejectedLogRecords.high >>> 0).toNumber() : e.rejectedLogRecords), e.errorMessage != null && e.hasOwnProperty("errorMessage") && (n.errorMessage = e.errorMessage), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.collector.logs.v1.ExportLogsPartialSuccess";
              }, t;
            })(), i;
          })(), g;
        })(), b;
      })(), y.metrics = (function() {
        var b = {};
        return b.v1 = (function() {
          var g = {};
          return g.MetricsData = (function() {
            function i(t) {
              if (this.resourceMetrics = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resourceMetrics = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resourceMetrics != null && t.resourceMetrics.length)
                for (var o = 0; o < t.resourceMetrics.length; ++o)
                  s.opentelemetry.proto.metrics.v1.ResourceMetrics.encode(t.resourceMetrics[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.MetricsData(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resourceMetrics && n.resourceMetrics.length || (n.resourceMetrics = []), n.resourceMetrics.push(s.opentelemetry.proto.metrics.v1.ResourceMetrics.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resourceMetrics != null && t.hasOwnProperty("resourceMetrics")) {
                if (!Array.isArray(t.resourceMetrics))
                  return "resourceMetrics: array expected";
                for (var e = 0; e < t.resourceMetrics.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.ResourceMetrics.verify(t.resourceMetrics[e]);
                  if (o)
                    return "resourceMetrics." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.MetricsData)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.MetricsData();
              if (t.resourceMetrics) {
                if (!Array.isArray(t.resourceMetrics))
                  throw TypeError(".opentelemetry.proto.metrics.v1.MetricsData.resourceMetrics: array expected");
                e.resourceMetrics = [];
                for (var o = 0; o < t.resourceMetrics.length; ++o) {
                  if (typeof t.resourceMetrics[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.MetricsData.resourceMetrics: object expected");
                  e.resourceMetrics[o] = s.opentelemetry.proto.metrics.v1.ResourceMetrics.fromObject(t.resourceMetrics[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.resourceMetrics = []), t.resourceMetrics && t.resourceMetrics.length) {
                o.resourceMetrics = [];
                for (var n = 0; n < t.resourceMetrics.length; ++n)
                  o.resourceMetrics[n] = s.opentelemetry.proto.metrics.v1.ResourceMetrics.toObject(t.resourceMetrics[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.MetricsData";
            }, i;
          })(), g.ResourceMetrics = (function() {
            function i(t) {
              if (this.scopeMetrics = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resource = null, i.prototype.scopeMetrics = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resource != null && Object.hasOwnProperty.call(t, "resource") && s.opentelemetry.proto.resource.v1.Resource.encode(t.resource, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.scopeMetrics != null && t.scopeMetrics.length)
                for (var o = 0; o < t.scopeMetrics.length; ++o)
                  s.opentelemetry.proto.metrics.v1.ScopeMetrics.encode(t.scopeMetrics[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.ResourceMetrics(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resource = s.opentelemetry.proto.resource.v1.Resource.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.scopeMetrics && n.scopeMetrics.length || (n.scopeMetrics = []), n.scopeMetrics.push(s.opentelemetry.proto.metrics.v1.ScopeMetrics.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resource != null && t.hasOwnProperty("resource")) {
                var e = s.opentelemetry.proto.resource.v1.Resource.verify(t.resource);
                if (e)
                  return "resource." + e;
              }
              if (t.scopeMetrics != null && t.hasOwnProperty("scopeMetrics")) {
                if (!Array.isArray(t.scopeMetrics))
                  return "scopeMetrics: array expected";
                for (var o = 0; o < t.scopeMetrics.length; ++o) {
                  var e = s.opentelemetry.proto.metrics.v1.ScopeMetrics.verify(t.scopeMetrics[o]);
                  if (e)
                    return "scopeMetrics." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.ResourceMetrics)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.ResourceMetrics();
              if (t.resource != null) {
                if (typeof t.resource != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.ResourceMetrics.resource: object expected");
                e.resource = s.opentelemetry.proto.resource.v1.Resource.fromObject(t.resource);
              }
              if (t.scopeMetrics) {
                if (!Array.isArray(t.scopeMetrics))
                  throw TypeError(".opentelemetry.proto.metrics.v1.ResourceMetrics.scopeMetrics: array expected");
                e.scopeMetrics = [];
                for (var o = 0; o < t.scopeMetrics.length; ++o) {
                  if (typeof t.scopeMetrics[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.ResourceMetrics.scopeMetrics: object expected");
                  e.scopeMetrics[o] = s.opentelemetry.proto.metrics.v1.ScopeMetrics.fromObject(t.scopeMetrics[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.scopeMetrics = []), e.defaults && (o.resource = null, o.schemaUrl = ""), t.resource != null && t.hasOwnProperty("resource") && (o.resource = s.opentelemetry.proto.resource.v1.Resource.toObject(t.resource, e)), t.scopeMetrics && t.scopeMetrics.length) {
                o.scopeMetrics = [];
                for (var n = 0; n < t.scopeMetrics.length; ++n)
                  o.scopeMetrics[n] = s.opentelemetry.proto.metrics.v1.ScopeMetrics.toObject(t.scopeMetrics[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.ResourceMetrics";
            }, i;
          })(), g.ScopeMetrics = (function() {
            function i(t) {
              if (this.metrics = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.scope = null, i.prototype.metrics = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.scope != null && Object.hasOwnProperty.call(t, "scope") && s.opentelemetry.proto.common.v1.InstrumentationScope.encode(t.scope, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.metrics != null && t.metrics.length)
                for (var o = 0; o < t.metrics.length; ++o)
                  s.opentelemetry.proto.metrics.v1.Metric.encode(t.metrics[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.ScopeMetrics(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.metrics && n.metrics.length || (n.metrics = []), n.metrics.push(s.opentelemetry.proto.metrics.v1.Metric.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.scope != null && t.hasOwnProperty("scope")) {
                var e = s.opentelemetry.proto.common.v1.InstrumentationScope.verify(t.scope);
                if (e)
                  return "scope." + e;
              }
              if (t.metrics != null && t.hasOwnProperty("metrics")) {
                if (!Array.isArray(t.metrics))
                  return "metrics: array expected";
                for (var o = 0; o < t.metrics.length; ++o) {
                  var e = s.opentelemetry.proto.metrics.v1.Metric.verify(t.metrics[o]);
                  if (e)
                    return "metrics." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.ScopeMetrics)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.ScopeMetrics();
              if (t.scope != null) {
                if (typeof t.scope != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.ScopeMetrics.scope: object expected");
                e.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.fromObject(t.scope);
              }
              if (t.metrics) {
                if (!Array.isArray(t.metrics))
                  throw TypeError(".opentelemetry.proto.metrics.v1.ScopeMetrics.metrics: array expected");
                e.metrics = [];
                for (var o = 0; o < t.metrics.length; ++o) {
                  if (typeof t.metrics[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.ScopeMetrics.metrics: object expected");
                  e.metrics[o] = s.opentelemetry.proto.metrics.v1.Metric.fromObject(t.metrics[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.metrics = []), e.defaults && (o.scope = null, o.schemaUrl = ""), t.scope != null && t.hasOwnProperty("scope") && (o.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.toObject(t.scope, e)), t.metrics && t.metrics.length) {
                o.metrics = [];
                for (var n = 0; n < t.metrics.length; ++n)
                  o.metrics[n] = s.opentelemetry.proto.metrics.v1.Metric.toObject(t.metrics[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.ScopeMetrics";
            }, i;
          })(), g.Metric = (function() {
            function i(e) {
              if (e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.name = null, i.prototype.description = null, i.prototype.unit = null, i.prototype.gauge = null, i.prototype.sum = null, i.prototype.histogram = null, i.prototype.exponentialHistogram = null, i.prototype.summary = null;
            var t;
            return Object.defineProperty(i.prototype, "data", {
              get: u.oneOfGetter(t = ["gauge", "sum", "histogram", "exponentialHistogram", "summary"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              return o || (o = d.create()), e.name != null && Object.hasOwnProperty.call(e, "name") && o.uint32(
                /* id 1, wireType 2 =*/
                10
              ).string(e.name), e.description != null && Object.hasOwnProperty.call(e, "description") && o.uint32(
                /* id 2, wireType 2 =*/
                18
              ).string(e.description), e.unit != null && Object.hasOwnProperty.call(e, "unit") && o.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(e.unit), e.gauge != null && Object.hasOwnProperty.call(e, "gauge") && s.opentelemetry.proto.metrics.v1.Gauge.encode(e.gauge, o.uint32(
                /* id 5, wireType 2 =*/
                42
              ).fork()).ldelim(), e.sum != null && Object.hasOwnProperty.call(e, "sum") && s.opentelemetry.proto.metrics.v1.Sum.encode(e.sum, o.uint32(
                /* id 7, wireType 2 =*/
                58
              ).fork()).ldelim(), e.histogram != null && Object.hasOwnProperty.call(e, "histogram") && s.opentelemetry.proto.metrics.v1.Histogram.encode(e.histogram, o.uint32(
                /* id 9, wireType 2 =*/
                74
              ).fork()).ldelim(), e.exponentialHistogram != null && Object.hasOwnProperty.call(e, "exponentialHistogram") && s.opentelemetry.proto.metrics.v1.ExponentialHistogram.encode(e.exponentialHistogram, o.uint32(
                /* id 10, wireType 2 =*/
                82
              ).fork()).ldelim(), e.summary != null && Object.hasOwnProperty.call(e, "summary") && s.opentelemetry.proto.metrics.v1.Summary.encode(e.summary, o.uint32(
                /* id 11, wireType 2 =*/
                90
              ).fork()).ldelim(), o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.Metric(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 1: {
                    c.name = e.string();
                    break;
                  }
                  case 2: {
                    c.description = e.string();
                    break;
                  }
                  case 3: {
                    c.unit = e.string();
                    break;
                  }
                  case 5: {
                    c.gauge = s.opentelemetry.proto.metrics.v1.Gauge.decode(e, e.uint32());
                    break;
                  }
                  case 7: {
                    c.sum = s.opentelemetry.proto.metrics.v1.Sum.decode(e, e.uint32());
                    break;
                  }
                  case 9: {
                    c.histogram = s.opentelemetry.proto.metrics.v1.Histogram.decode(e, e.uint32());
                    break;
                  }
                  case 10: {
                    c.exponentialHistogram = s.opentelemetry.proto.metrics.v1.ExponentialHistogram.decode(e, e.uint32());
                    break;
                  }
                  case 11: {
                    c.summary = s.opentelemetry.proto.metrics.v1.Summary.decode(e, e.uint32());
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              var o = {};
              if (e.name != null && e.hasOwnProperty("name") && !u.isString(e.name))
                return "name: string expected";
              if (e.description != null && e.hasOwnProperty("description") && !u.isString(e.description))
                return "description: string expected";
              if (e.unit != null && e.hasOwnProperty("unit") && !u.isString(e.unit))
                return "unit: string expected";
              if (e.gauge != null && e.hasOwnProperty("gauge")) {
                o.data = 1;
                {
                  var n = s.opentelemetry.proto.metrics.v1.Gauge.verify(e.gauge);
                  if (n)
                    return "gauge." + n;
                }
              }
              if (e.sum != null && e.hasOwnProperty("sum")) {
                if (o.data === 1)
                  return "data: multiple values";
                o.data = 1;
                {
                  var n = s.opentelemetry.proto.metrics.v1.Sum.verify(e.sum);
                  if (n)
                    return "sum." + n;
                }
              }
              if (e.histogram != null && e.hasOwnProperty("histogram")) {
                if (o.data === 1)
                  return "data: multiple values";
                o.data = 1;
                {
                  var n = s.opentelemetry.proto.metrics.v1.Histogram.verify(e.histogram);
                  if (n)
                    return "histogram." + n;
                }
              }
              if (e.exponentialHistogram != null && e.hasOwnProperty("exponentialHistogram")) {
                if (o.data === 1)
                  return "data: multiple values";
                o.data = 1;
                {
                  var n = s.opentelemetry.proto.metrics.v1.ExponentialHistogram.verify(e.exponentialHistogram);
                  if (n)
                    return "exponentialHistogram." + n;
                }
              }
              if (e.summary != null && e.hasOwnProperty("summary")) {
                if (o.data === 1)
                  return "data: multiple values";
                o.data = 1;
                {
                  var n = s.opentelemetry.proto.metrics.v1.Summary.verify(e.summary);
                  if (n)
                    return "summary." + n;
                }
              }
              return null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.metrics.v1.Metric)
                return e;
              var o = new s.opentelemetry.proto.metrics.v1.Metric();
              if (e.name != null && (o.name = String(e.name)), e.description != null && (o.description = String(e.description)), e.unit != null && (o.unit = String(e.unit)), e.gauge != null) {
                if (typeof e.gauge != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.Metric.gauge: object expected");
                o.gauge = s.opentelemetry.proto.metrics.v1.Gauge.fromObject(e.gauge);
              }
              if (e.sum != null) {
                if (typeof e.sum != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.Metric.sum: object expected");
                o.sum = s.opentelemetry.proto.metrics.v1.Sum.fromObject(e.sum);
              }
              if (e.histogram != null) {
                if (typeof e.histogram != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.Metric.histogram: object expected");
                o.histogram = s.opentelemetry.proto.metrics.v1.Histogram.fromObject(e.histogram);
              }
              if (e.exponentialHistogram != null) {
                if (typeof e.exponentialHistogram != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.Metric.exponentialHistogram: object expected");
                o.exponentialHistogram = s.opentelemetry.proto.metrics.v1.ExponentialHistogram.fromObject(e.exponentialHistogram);
              }
              if (e.summary != null) {
                if (typeof e.summary != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.Metric.summary: object expected");
                o.summary = s.opentelemetry.proto.metrics.v1.Summary.fromObject(e.summary);
              }
              return o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              return o.defaults && (n.name = "", n.description = "", n.unit = ""), e.name != null && e.hasOwnProperty("name") && (n.name = e.name), e.description != null && e.hasOwnProperty("description") && (n.description = e.description), e.unit != null && e.hasOwnProperty("unit") && (n.unit = e.unit), e.gauge != null && e.hasOwnProperty("gauge") && (n.gauge = s.opentelemetry.proto.metrics.v1.Gauge.toObject(e.gauge, o), o.oneofs && (n.data = "gauge")), e.sum != null && e.hasOwnProperty("sum") && (n.sum = s.opentelemetry.proto.metrics.v1.Sum.toObject(e.sum, o), o.oneofs && (n.data = "sum")), e.histogram != null && e.hasOwnProperty("histogram") && (n.histogram = s.opentelemetry.proto.metrics.v1.Histogram.toObject(e.histogram, o), o.oneofs && (n.data = "histogram")), e.exponentialHistogram != null && e.hasOwnProperty("exponentialHistogram") && (n.exponentialHistogram = s.opentelemetry.proto.metrics.v1.ExponentialHistogram.toObject(e.exponentialHistogram, o), o.oneofs && (n.data = "exponentialHistogram")), e.summary != null && e.hasOwnProperty("summary") && (n.summary = s.opentelemetry.proto.metrics.v1.Summary.toObject(e.summary, o), o.oneofs && (n.data = "summary")), n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.Metric";
            }, i;
          })(), g.Gauge = (function() {
            function i(t) {
              if (this.dataPoints = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.dataPoints = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.dataPoints != null && t.dataPoints.length)
                for (var o = 0; o < t.dataPoints.length; ++o)
                  s.opentelemetry.proto.metrics.v1.NumberDataPoint.encode(t.dataPoints[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.Gauge(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.dataPoints && n.dataPoints.length || (n.dataPoints = []), n.dataPoints.push(s.opentelemetry.proto.metrics.v1.NumberDataPoint.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.dataPoints != null && t.hasOwnProperty("dataPoints")) {
                if (!Array.isArray(t.dataPoints))
                  return "dataPoints: array expected";
                for (var e = 0; e < t.dataPoints.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.NumberDataPoint.verify(t.dataPoints[e]);
                  if (o)
                    return "dataPoints." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.Gauge)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.Gauge();
              if (t.dataPoints) {
                if (!Array.isArray(t.dataPoints))
                  throw TypeError(".opentelemetry.proto.metrics.v1.Gauge.dataPoints: array expected");
                e.dataPoints = [];
                for (var o = 0; o < t.dataPoints.length; ++o) {
                  if (typeof t.dataPoints[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.Gauge.dataPoints: object expected");
                  e.dataPoints[o] = s.opentelemetry.proto.metrics.v1.NumberDataPoint.fromObject(t.dataPoints[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.dataPoints = []), t.dataPoints && t.dataPoints.length) {
                o.dataPoints = [];
                for (var n = 0; n < t.dataPoints.length; ++n)
                  o.dataPoints[n] = s.opentelemetry.proto.metrics.v1.NumberDataPoint.toObject(t.dataPoints[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.Gauge";
            }, i;
          })(), g.Sum = (function() {
            function i(t) {
              if (this.dataPoints = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.dataPoints = u.emptyArray, i.prototype.aggregationTemporality = null, i.prototype.isMonotonic = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.dataPoints != null && t.dataPoints.length)
                for (var o = 0; o < t.dataPoints.length; ++o)
                  s.opentelemetry.proto.metrics.v1.NumberDataPoint.encode(t.dataPoints[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return t.aggregationTemporality != null && Object.hasOwnProperty.call(t, "aggregationTemporality") && e.uint32(
                /* id 2, wireType 0 =*/
                16
              ).int32(t.aggregationTemporality), t.isMonotonic != null && Object.hasOwnProperty.call(t, "isMonotonic") && e.uint32(
                /* id 3, wireType 0 =*/
                24
              ).bool(t.isMonotonic), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.Sum(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.dataPoints && n.dataPoints.length || (n.dataPoints = []), n.dataPoints.push(s.opentelemetry.proto.metrics.v1.NumberDataPoint.decode(t, t.uint32()));
                    break;
                  }
                  case 2: {
                    n.aggregationTemporality = t.int32();
                    break;
                  }
                  case 3: {
                    n.isMonotonic = t.bool();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.dataPoints != null && t.hasOwnProperty("dataPoints")) {
                if (!Array.isArray(t.dataPoints))
                  return "dataPoints: array expected";
                for (var e = 0; e < t.dataPoints.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.NumberDataPoint.verify(t.dataPoints[e]);
                  if (o)
                    return "dataPoints." + o;
                }
              }
              if (t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality"))
                switch (t.aggregationTemporality) {
                  default:
                    return "aggregationTemporality: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                    break;
                }
              return t.isMonotonic != null && t.hasOwnProperty("isMonotonic") && typeof t.isMonotonic != "boolean" ? "isMonotonic: boolean expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.Sum)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.Sum();
              if (t.dataPoints) {
                if (!Array.isArray(t.dataPoints))
                  throw TypeError(".opentelemetry.proto.metrics.v1.Sum.dataPoints: array expected");
                e.dataPoints = [];
                for (var o = 0; o < t.dataPoints.length; ++o) {
                  if (typeof t.dataPoints[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.Sum.dataPoints: object expected");
                  e.dataPoints[o] = s.opentelemetry.proto.metrics.v1.NumberDataPoint.fromObject(t.dataPoints[o]);
                }
              }
              switch (t.aggregationTemporality) {
                default:
                  if (typeof t.aggregationTemporality == "number") {
                    e.aggregationTemporality = t.aggregationTemporality;
                    break;
                  }
                  break;
                case "AGGREGATION_TEMPORALITY_UNSPECIFIED":
                case 0:
                  e.aggregationTemporality = 0;
                  break;
                case "AGGREGATION_TEMPORALITY_DELTA":
                case 1:
                  e.aggregationTemporality = 1;
                  break;
                case "AGGREGATION_TEMPORALITY_CUMULATIVE":
                case 2:
                  e.aggregationTemporality = 2;
                  break;
              }
              return t.isMonotonic != null && (e.isMonotonic = !!t.isMonotonic), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.dataPoints = []), e.defaults && (o.aggregationTemporality = e.enums === String ? "AGGREGATION_TEMPORALITY_UNSPECIFIED" : 0, o.isMonotonic = !1), t.dataPoints && t.dataPoints.length) {
                o.dataPoints = [];
                for (var n = 0; n < t.dataPoints.length; ++n)
                  o.dataPoints[n] = s.opentelemetry.proto.metrics.v1.NumberDataPoint.toObject(t.dataPoints[n], e);
              }
              return t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality") && (o.aggregationTemporality = e.enums === String ? s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] === void 0 ? t.aggregationTemporality : s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] : t.aggregationTemporality), t.isMonotonic != null && t.hasOwnProperty("isMonotonic") && (o.isMonotonic = t.isMonotonic), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.Sum";
            }, i;
          })(), g.Histogram = (function() {
            function i(t) {
              if (this.dataPoints = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.dataPoints = u.emptyArray, i.prototype.aggregationTemporality = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.dataPoints != null && t.dataPoints.length)
                for (var o = 0; o < t.dataPoints.length; ++o)
                  s.opentelemetry.proto.metrics.v1.HistogramDataPoint.encode(t.dataPoints[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return t.aggregationTemporality != null && Object.hasOwnProperty.call(t, "aggregationTemporality") && e.uint32(
                /* id 2, wireType 0 =*/
                16
              ).int32(t.aggregationTemporality), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.Histogram(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.dataPoints && n.dataPoints.length || (n.dataPoints = []), n.dataPoints.push(s.opentelemetry.proto.metrics.v1.HistogramDataPoint.decode(t, t.uint32()));
                    break;
                  }
                  case 2: {
                    n.aggregationTemporality = t.int32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.dataPoints != null && t.hasOwnProperty("dataPoints")) {
                if (!Array.isArray(t.dataPoints))
                  return "dataPoints: array expected";
                for (var e = 0; e < t.dataPoints.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.HistogramDataPoint.verify(t.dataPoints[e]);
                  if (o)
                    return "dataPoints." + o;
                }
              }
              if (t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality"))
                switch (t.aggregationTemporality) {
                  default:
                    return "aggregationTemporality: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                    break;
                }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.Histogram)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.Histogram();
              if (t.dataPoints) {
                if (!Array.isArray(t.dataPoints))
                  throw TypeError(".opentelemetry.proto.metrics.v1.Histogram.dataPoints: array expected");
                e.dataPoints = [];
                for (var o = 0; o < t.dataPoints.length; ++o) {
                  if (typeof t.dataPoints[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.Histogram.dataPoints: object expected");
                  e.dataPoints[o] = s.opentelemetry.proto.metrics.v1.HistogramDataPoint.fromObject(t.dataPoints[o]);
                }
              }
              switch (t.aggregationTemporality) {
                default:
                  if (typeof t.aggregationTemporality == "number") {
                    e.aggregationTemporality = t.aggregationTemporality;
                    break;
                  }
                  break;
                case "AGGREGATION_TEMPORALITY_UNSPECIFIED":
                case 0:
                  e.aggregationTemporality = 0;
                  break;
                case "AGGREGATION_TEMPORALITY_DELTA":
                case 1:
                  e.aggregationTemporality = 1;
                  break;
                case "AGGREGATION_TEMPORALITY_CUMULATIVE":
                case 2:
                  e.aggregationTemporality = 2;
                  break;
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.dataPoints = []), e.defaults && (o.aggregationTemporality = e.enums === String ? "AGGREGATION_TEMPORALITY_UNSPECIFIED" : 0), t.dataPoints && t.dataPoints.length) {
                o.dataPoints = [];
                for (var n = 0; n < t.dataPoints.length; ++n)
                  o.dataPoints[n] = s.opentelemetry.proto.metrics.v1.HistogramDataPoint.toObject(t.dataPoints[n], e);
              }
              return t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality") && (o.aggregationTemporality = e.enums === String ? s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] === void 0 ? t.aggregationTemporality : s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] : t.aggregationTemporality), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.Histogram";
            }, i;
          })(), g.ExponentialHistogram = (function() {
            function i(t) {
              if (this.dataPoints = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.dataPoints = u.emptyArray, i.prototype.aggregationTemporality = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.dataPoints != null && t.dataPoints.length)
                for (var o = 0; o < t.dataPoints.length; ++o)
                  s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.encode(t.dataPoints[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return t.aggregationTemporality != null && Object.hasOwnProperty.call(t, "aggregationTemporality") && e.uint32(
                /* id 2, wireType 0 =*/
                16
              ).int32(t.aggregationTemporality), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.ExponentialHistogram(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.dataPoints && n.dataPoints.length || (n.dataPoints = []), n.dataPoints.push(s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.decode(t, t.uint32()));
                    break;
                  }
                  case 2: {
                    n.aggregationTemporality = t.int32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.dataPoints != null && t.hasOwnProperty("dataPoints")) {
                if (!Array.isArray(t.dataPoints))
                  return "dataPoints: array expected";
                for (var e = 0; e < t.dataPoints.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.verify(t.dataPoints[e]);
                  if (o)
                    return "dataPoints." + o;
                }
              }
              if (t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality"))
                switch (t.aggregationTemporality) {
                  default:
                    return "aggregationTemporality: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                    break;
                }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.ExponentialHistogram)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.ExponentialHistogram();
              if (t.dataPoints) {
                if (!Array.isArray(t.dataPoints))
                  throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogram.dataPoints: array expected");
                e.dataPoints = [];
                for (var o = 0; o < t.dataPoints.length; ++o) {
                  if (typeof t.dataPoints[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogram.dataPoints: object expected");
                  e.dataPoints[o] = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.fromObject(t.dataPoints[o]);
                }
              }
              switch (t.aggregationTemporality) {
                default:
                  if (typeof t.aggregationTemporality == "number") {
                    e.aggregationTemporality = t.aggregationTemporality;
                    break;
                  }
                  break;
                case "AGGREGATION_TEMPORALITY_UNSPECIFIED":
                case 0:
                  e.aggregationTemporality = 0;
                  break;
                case "AGGREGATION_TEMPORALITY_DELTA":
                case 1:
                  e.aggregationTemporality = 1;
                  break;
                case "AGGREGATION_TEMPORALITY_CUMULATIVE":
                case 2:
                  e.aggregationTemporality = 2;
                  break;
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.dataPoints = []), e.defaults && (o.aggregationTemporality = e.enums === String ? "AGGREGATION_TEMPORALITY_UNSPECIFIED" : 0), t.dataPoints && t.dataPoints.length) {
                o.dataPoints = [];
                for (var n = 0; n < t.dataPoints.length; ++n)
                  o.dataPoints[n] = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.toObject(t.dataPoints[n], e);
              }
              return t.aggregationTemporality != null && t.hasOwnProperty("aggregationTemporality") && (o.aggregationTemporality = e.enums === String ? s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] === void 0 ? t.aggregationTemporality : s.opentelemetry.proto.metrics.v1.AggregationTemporality[t.aggregationTemporality] : t.aggregationTemporality), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.ExponentialHistogram";
            }, i;
          })(), g.Summary = (function() {
            function i(t) {
              if (this.dataPoints = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.dataPoints = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.dataPoints != null && t.dataPoints.length)
                for (var o = 0; o < t.dataPoints.length; ++o)
                  s.opentelemetry.proto.metrics.v1.SummaryDataPoint.encode(t.dataPoints[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.Summary(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.dataPoints && n.dataPoints.length || (n.dataPoints = []), n.dataPoints.push(s.opentelemetry.proto.metrics.v1.SummaryDataPoint.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.dataPoints != null && t.hasOwnProperty("dataPoints")) {
                if (!Array.isArray(t.dataPoints))
                  return "dataPoints: array expected";
                for (var e = 0; e < t.dataPoints.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.verify(t.dataPoints[e]);
                  if (o)
                    return "dataPoints." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.Summary)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.Summary();
              if (t.dataPoints) {
                if (!Array.isArray(t.dataPoints))
                  throw TypeError(".opentelemetry.proto.metrics.v1.Summary.dataPoints: array expected");
                e.dataPoints = [];
                for (var o = 0; o < t.dataPoints.length; ++o) {
                  if (typeof t.dataPoints[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.Summary.dataPoints: object expected");
                  e.dataPoints[o] = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.fromObject(t.dataPoints[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.dataPoints = []), t.dataPoints && t.dataPoints.length) {
                o.dataPoints = [];
                for (var n = 0; n < t.dataPoints.length; ++n)
                  o.dataPoints[n] = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.toObject(t.dataPoints[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.Summary";
            }, i;
          })(), g.AggregationTemporality = (function() {
            var i = {}, t = Object.create(i);
            return t[i[0] = "AGGREGATION_TEMPORALITY_UNSPECIFIED"] = 0, t[i[1] = "AGGREGATION_TEMPORALITY_DELTA"] = 1, t[i[2] = "AGGREGATION_TEMPORALITY_CUMULATIVE"] = 2, t;
          })(), g.DataPointFlags = (function() {
            var i = {}, t = Object.create(i);
            return t[i[0] = "DATA_POINT_FLAGS_DO_NOT_USE"] = 0, t[i[1] = "DATA_POINT_FLAGS_NO_RECORDED_VALUE_MASK"] = 1, t;
          })(), g.NumberDataPoint = (function() {
            function i(e) {
              if (this.attributes = [], this.exemplars = [], e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.attributes = u.emptyArray, i.prototype.startTimeUnixNano = null, i.prototype.timeUnixNano = null, i.prototype.asDouble = null, i.prototype.asInt = null, i.prototype.exemplars = u.emptyArray, i.prototype.flags = null;
            var t;
            return Object.defineProperty(i.prototype, "value", {
              get: u.oneOfGetter(t = ["asDouble", "asInt"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              if (o || (o = d.create()), e.startTimeUnixNano != null && Object.hasOwnProperty.call(e, "startTimeUnixNano") && o.uint32(
                /* id 2, wireType 1 =*/
                17
              ).fixed64(e.startTimeUnixNano), e.timeUnixNano != null && Object.hasOwnProperty.call(e, "timeUnixNano") && o.uint32(
                /* id 3, wireType 1 =*/
                25
              ).fixed64(e.timeUnixNano), e.asDouble != null && Object.hasOwnProperty.call(e, "asDouble") && o.uint32(
                /* id 4, wireType 1 =*/
                33
              ).double(e.asDouble), e.exemplars != null && e.exemplars.length)
                for (var n = 0; n < e.exemplars.length; ++n)
                  s.opentelemetry.proto.metrics.v1.Exemplar.encode(e.exemplars[n], o.uint32(
                    /* id 5, wireType 2 =*/
                    42
                  ).fork()).ldelim();
              if (e.asInt != null && Object.hasOwnProperty.call(e, "asInt") && o.uint32(
                /* id 6, wireType 1 =*/
                49
              ).sfixed64(e.asInt), e.attributes != null && e.attributes.length)
                for (var n = 0; n < e.attributes.length; ++n)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(e.attributes[n], o.uint32(
                    /* id 7, wireType 2 =*/
                    58
                  ).fork()).ldelim();
              return e.flags != null && Object.hasOwnProperty.call(e, "flags") && o.uint32(
                /* id 8, wireType 0 =*/
                64
              ).uint32(e.flags), o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.NumberDataPoint(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 7: {
                    c.attributes && c.attributes.length || (c.attributes = []), c.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                    break;
                  }
                  case 2: {
                    c.startTimeUnixNano = e.fixed64();
                    break;
                  }
                  case 3: {
                    c.timeUnixNano = e.fixed64();
                    break;
                  }
                  case 4: {
                    c.asDouble = e.double();
                    break;
                  }
                  case 6: {
                    c.asInt = e.sfixed64();
                    break;
                  }
                  case 5: {
                    c.exemplars && c.exemplars.length || (c.exemplars = []), c.exemplars.push(s.opentelemetry.proto.metrics.v1.Exemplar.decode(e, e.uint32()));
                    break;
                  }
                  case 8: {
                    c.flags = e.uint32();
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              var o = {};
              if (e.attributes != null && e.hasOwnProperty("attributes")) {
                if (!Array.isArray(e.attributes))
                  return "attributes: array expected";
                for (var n = 0; n < e.attributes.length; ++n) {
                  var c = s.opentelemetry.proto.common.v1.KeyValue.verify(e.attributes[n]);
                  if (c)
                    return "attributes." + c;
                }
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && !u.isInteger(e.startTimeUnixNano) && !(e.startTimeUnixNano && u.isInteger(e.startTimeUnixNano.low) && u.isInteger(e.startTimeUnixNano.high)))
                return "startTimeUnixNano: integer|Long expected";
              if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && !u.isInteger(e.timeUnixNano) && !(e.timeUnixNano && u.isInteger(e.timeUnixNano.low) && u.isInteger(e.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (e.asDouble != null && e.hasOwnProperty("asDouble") && (o.value = 1, typeof e.asDouble != "number"))
                return "asDouble: number expected";
              if (e.asInt != null && e.hasOwnProperty("asInt")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, !u.isInteger(e.asInt) && !(e.asInt && u.isInteger(e.asInt.low) && u.isInteger(e.asInt.high)))
                  return "asInt: integer|Long expected";
              }
              if (e.exemplars != null && e.hasOwnProperty("exemplars")) {
                if (!Array.isArray(e.exemplars))
                  return "exemplars: array expected";
                for (var n = 0; n < e.exemplars.length; ++n) {
                  var c = s.opentelemetry.proto.metrics.v1.Exemplar.verify(e.exemplars[n]);
                  if (c)
                    return "exemplars." + c;
                }
              }
              return e.flags != null && e.hasOwnProperty("flags") && !u.isInteger(e.flags) ? "flags: integer expected" : null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.metrics.v1.NumberDataPoint)
                return e;
              var o = new s.opentelemetry.proto.metrics.v1.NumberDataPoint();
              if (e.attributes) {
                if (!Array.isArray(e.attributes))
                  throw TypeError(".opentelemetry.proto.metrics.v1.NumberDataPoint.attributes: array expected");
                o.attributes = [];
                for (var n = 0; n < e.attributes.length; ++n) {
                  if (typeof e.attributes[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.NumberDataPoint.attributes: object expected");
                  o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.attributes[n]);
                }
              }
              if (e.startTimeUnixNano != null && (u.Long ? (o.startTimeUnixNano = u.Long.fromValue(e.startTimeUnixNano)).unsigned = !1 : typeof e.startTimeUnixNano == "string" ? o.startTimeUnixNano = parseInt(e.startTimeUnixNano, 10) : typeof e.startTimeUnixNano == "number" ? o.startTimeUnixNano = e.startTimeUnixNano : typeof e.startTimeUnixNano == "object" && (o.startTimeUnixNano = new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber())), e.timeUnixNano != null && (u.Long ? (o.timeUnixNano = u.Long.fromValue(e.timeUnixNano)).unsigned = !1 : typeof e.timeUnixNano == "string" ? o.timeUnixNano = parseInt(e.timeUnixNano, 10) : typeof e.timeUnixNano == "number" ? o.timeUnixNano = e.timeUnixNano : typeof e.timeUnixNano == "object" && (o.timeUnixNano = new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber())), e.asDouble != null && (o.asDouble = Number(e.asDouble)), e.asInt != null && (u.Long ? (o.asInt = u.Long.fromValue(e.asInt)).unsigned = !1 : typeof e.asInt == "string" ? o.asInt = parseInt(e.asInt, 10) : typeof e.asInt == "number" ? o.asInt = e.asInt : typeof e.asInt == "object" && (o.asInt = new u.LongBits(e.asInt.low >>> 0, e.asInt.high >>> 0).toNumber())), e.exemplars) {
                if (!Array.isArray(e.exemplars))
                  throw TypeError(".opentelemetry.proto.metrics.v1.NumberDataPoint.exemplars: array expected");
                o.exemplars = [];
                for (var n = 0; n < e.exemplars.length; ++n) {
                  if (typeof e.exemplars[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.NumberDataPoint.exemplars: object expected");
                  o.exemplars[n] = s.opentelemetry.proto.metrics.v1.Exemplar.fromObject(e.exemplars[n]);
                }
              }
              return e.flags != null && (o.flags = e.flags >>> 0), o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              if ((o.arrays || o.defaults) && (n.exemplars = [], n.attributes = []), o.defaults) {
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.startTimeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.startTimeUnixNano = o.longs === String ? "0" : 0;
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.timeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.timeUnixNano = o.longs === String ? "0" : 0;
                n.flags = 0;
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && (typeof e.startTimeUnixNano == "number" ? n.startTimeUnixNano = o.longs === String ? String(e.startTimeUnixNano) : e.startTimeUnixNano : n.startTimeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.startTimeUnixNano) : o.longs === Number ? new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber() : e.startTimeUnixNano), e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && (typeof e.timeUnixNano == "number" ? n.timeUnixNano = o.longs === String ? String(e.timeUnixNano) : e.timeUnixNano : n.timeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.timeUnixNano) : o.longs === Number ? new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber() : e.timeUnixNano), e.asDouble != null && e.hasOwnProperty("asDouble") && (n.asDouble = o.json && !isFinite(e.asDouble) ? String(e.asDouble) : e.asDouble, o.oneofs && (n.value = "asDouble")), e.exemplars && e.exemplars.length) {
                n.exemplars = [];
                for (var h = 0; h < e.exemplars.length; ++h)
                  n.exemplars[h] = s.opentelemetry.proto.metrics.v1.Exemplar.toObject(e.exemplars[h], o);
              }
              if (e.asInt != null && e.hasOwnProperty("asInt") && (typeof e.asInt == "number" ? n.asInt = o.longs === String ? String(e.asInt) : e.asInt : n.asInt = o.longs === String ? u.Long.prototype.toString.call(e.asInt) : o.longs === Number ? new u.LongBits(e.asInt.low >>> 0, e.asInt.high >>> 0).toNumber() : e.asInt, o.oneofs && (n.value = "asInt")), e.attributes && e.attributes.length) {
                n.attributes = [];
                for (var h = 0; h < e.attributes.length; ++h)
                  n.attributes[h] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.attributes[h], o);
              }
              return e.flags != null && e.hasOwnProperty("flags") && (n.flags = e.flags), n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.NumberDataPoint";
            }, i;
          })(), g.HistogramDataPoint = (function() {
            function i(e) {
              if (this.attributes = [], this.bucketCounts = [], this.explicitBounds = [], this.exemplars = [], e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.attributes = u.emptyArray, i.prototype.startTimeUnixNano = null, i.prototype.timeUnixNano = null, i.prototype.count = null, i.prototype.sum = null, i.prototype.bucketCounts = u.emptyArray, i.prototype.explicitBounds = u.emptyArray, i.prototype.exemplars = u.emptyArray, i.prototype.flags = null, i.prototype.min = null, i.prototype.max = null;
            var t;
            return Object.defineProperty(i.prototype, "_sum", {
              get: u.oneOfGetter(t = ["sum"]),
              set: u.oneOfSetter(t)
            }), Object.defineProperty(i.prototype, "_min", {
              get: u.oneOfGetter(t = ["min"]),
              set: u.oneOfSetter(t)
            }), Object.defineProperty(i.prototype, "_max", {
              get: u.oneOfGetter(t = ["max"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              if (o || (o = d.create()), e.startTimeUnixNano != null && Object.hasOwnProperty.call(e, "startTimeUnixNano") && o.uint32(
                /* id 2, wireType 1 =*/
                17
              ).fixed64(e.startTimeUnixNano), e.timeUnixNano != null && Object.hasOwnProperty.call(e, "timeUnixNano") && o.uint32(
                /* id 3, wireType 1 =*/
                25
              ).fixed64(e.timeUnixNano), e.count != null && Object.hasOwnProperty.call(e, "count") && o.uint32(
                /* id 4, wireType 1 =*/
                33
              ).fixed64(e.count), e.sum != null && Object.hasOwnProperty.call(e, "sum") && o.uint32(
                /* id 5, wireType 1 =*/
                41
              ).double(e.sum), e.bucketCounts != null && e.bucketCounts.length) {
                o.uint32(
                  /* id 6, wireType 2 =*/
                  50
                ).fork();
                for (var n = 0; n < e.bucketCounts.length; ++n)
                  o.fixed64(e.bucketCounts[n]);
                o.ldelim();
              }
              if (e.explicitBounds != null && e.explicitBounds.length) {
                o.uint32(
                  /* id 7, wireType 2 =*/
                  58
                ).fork();
                for (var n = 0; n < e.explicitBounds.length; ++n)
                  o.double(e.explicitBounds[n]);
                o.ldelim();
              }
              if (e.exemplars != null && e.exemplars.length)
                for (var n = 0; n < e.exemplars.length; ++n)
                  s.opentelemetry.proto.metrics.v1.Exemplar.encode(e.exemplars[n], o.uint32(
                    /* id 8, wireType 2 =*/
                    66
                  ).fork()).ldelim();
              if (e.attributes != null && e.attributes.length)
                for (var n = 0; n < e.attributes.length; ++n)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(e.attributes[n], o.uint32(
                    /* id 9, wireType 2 =*/
                    74
                  ).fork()).ldelim();
              return e.flags != null && Object.hasOwnProperty.call(e, "flags") && o.uint32(
                /* id 10, wireType 0 =*/
                80
              ).uint32(e.flags), e.min != null && Object.hasOwnProperty.call(e, "min") && o.uint32(
                /* id 11, wireType 1 =*/
                89
              ).double(e.min), e.max != null && Object.hasOwnProperty.call(e, "max") && o.uint32(
                /* id 12, wireType 1 =*/
                97
              ).double(e.max), o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.HistogramDataPoint(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 9: {
                    c.attributes && c.attributes.length || (c.attributes = []), c.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                    break;
                  }
                  case 2: {
                    c.startTimeUnixNano = e.fixed64();
                    break;
                  }
                  case 3: {
                    c.timeUnixNano = e.fixed64();
                    break;
                  }
                  case 4: {
                    c.count = e.fixed64();
                    break;
                  }
                  case 5: {
                    c.sum = e.double();
                    break;
                  }
                  case 6: {
                    if (c.bucketCounts && c.bucketCounts.length || (c.bucketCounts = []), (h & 7) === 2)
                      for (var v = e.uint32() + e.pos; e.pos < v; )
                        c.bucketCounts.push(e.fixed64());
                    else
                      c.bucketCounts.push(e.fixed64());
                    break;
                  }
                  case 7: {
                    if (c.explicitBounds && c.explicitBounds.length || (c.explicitBounds = []), (h & 7) === 2)
                      for (var v = e.uint32() + e.pos; e.pos < v; )
                        c.explicitBounds.push(e.double());
                    else
                      c.explicitBounds.push(e.double());
                    break;
                  }
                  case 8: {
                    c.exemplars && c.exemplars.length || (c.exemplars = []), c.exemplars.push(s.opentelemetry.proto.metrics.v1.Exemplar.decode(e, e.uint32()));
                    break;
                  }
                  case 10: {
                    c.flags = e.uint32();
                    break;
                  }
                  case 11: {
                    c.min = e.double();
                    break;
                  }
                  case 12: {
                    c.max = e.double();
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              if (e.attributes != null && e.hasOwnProperty("attributes")) {
                if (!Array.isArray(e.attributes))
                  return "attributes: array expected";
                for (var o = 0; o < e.attributes.length; ++o) {
                  var n = s.opentelemetry.proto.common.v1.KeyValue.verify(e.attributes[o]);
                  if (n)
                    return "attributes." + n;
                }
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && !u.isInteger(e.startTimeUnixNano) && !(e.startTimeUnixNano && u.isInteger(e.startTimeUnixNano.low) && u.isInteger(e.startTimeUnixNano.high)))
                return "startTimeUnixNano: integer|Long expected";
              if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && !u.isInteger(e.timeUnixNano) && !(e.timeUnixNano && u.isInteger(e.timeUnixNano.low) && u.isInteger(e.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (e.count != null && e.hasOwnProperty("count") && !u.isInteger(e.count) && !(e.count && u.isInteger(e.count.low) && u.isInteger(e.count.high)))
                return "count: integer|Long expected";
              if (e.sum != null && e.hasOwnProperty("sum") && typeof e.sum != "number")
                return "sum: number expected";
              if (e.bucketCounts != null && e.hasOwnProperty("bucketCounts")) {
                if (!Array.isArray(e.bucketCounts))
                  return "bucketCounts: array expected";
                for (var o = 0; o < e.bucketCounts.length; ++o)
                  if (!u.isInteger(e.bucketCounts[o]) && !(e.bucketCounts[o] && u.isInteger(e.bucketCounts[o].low) && u.isInteger(e.bucketCounts[o].high)))
                    return "bucketCounts: integer|Long[] expected";
              }
              if (e.explicitBounds != null && e.hasOwnProperty("explicitBounds")) {
                if (!Array.isArray(e.explicitBounds))
                  return "explicitBounds: array expected";
                for (var o = 0; o < e.explicitBounds.length; ++o)
                  if (typeof e.explicitBounds[o] != "number")
                    return "explicitBounds: number[] expected";
              }
              if (e.exemplars != null && e.hasOwnProperty("exemplars")) {
                if (!Array.isArray(e.exemplars))
                  return "exemplars: array expected";
                for (var o = 0; o < e.exemplars.length; ++o) {
                  var n = s.opentelemetry.proto.metrics.v1.Exemplar.verify(e.exemplars[o]);
                  if (n)
                    return "exemplars." + n;
                }
              }
              return e.flags != null && e.hasOwnProperty("flags") && !u.isInteger(e.flags) ? "flags: integer expected" : e.min != null && e.hasOwnProperty("min") && typeof e.min != "number" ? "min: number expected" : e.max != null && e.hasOwnProperty("max") && typeof e.max != "number" ? "max: number expected" : null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.metrics.v1.HistogramDataPoint)
                return e;
              var o = new s.opentelemetry.proto.metrics.v1.HistogramDataPoint();
              if (e.attributes) {
                if (!Array.isArray(e.attributes))
                  throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.attributes: array expected");
                o.attributes = [];
                for (var n = 0; n < e.attributes.length; ++n) {
                  if (typeof e.attributes[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.attributes: object expected");
                  o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.attributes[n]);
                }
              }
              if (e.startTimeUnixNano != null && (u.Long ? (o.startTimeUnixNano = u.Long.fromValue(e.startTimeUnixNano)).unsigned = !1 : typeof e.startTimeUnixNano == "string" ? o.startTimeUnixNano = parseInt(e.startTimeUnixNano, 10) : typeof e.startTimeUnixNano == "number" ? o.startTimeUnixNano = e.startTimeUnixNano : typeof e.startTimeUnixNano == "object" && (o.startTimeUnixNano = new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber())), e.timeUnixNano != null && (u.Long ? (o.timeUnixNano = u.Long.fromValue(e.timeUnixNano)).unsigned = !1 : typeof e.timeUnixNano == "string" ? o.timeUnixNano = parseInt(e.timeUnixNano, 10) : typeof e.timeUnixNano == "number" ? o.timeUnixNano = e.timeUnixNano : typeof e.timeUnixNano == "object" && (o.timeUnixNano = new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber())), e.count != null && (u.Long ? (o.count = u.Long.fromValue(e.count)).unsigned = !1 : typeof e.count == "string" ? o.count = parseInt(e.count, 10) : typeof e.count == "number" ? o.count = e.count : typeof e.count == "object" && (o.count = new u.LongBits(e.count.low >>> 0, e.count.high >>> 0).toNumber())), e.sum != null && (o.sum = Number(e.sum)), e.bucketCounts) {
                if (!Array.isArray(e.bucketCounts))
                  throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.bucketCounts: array expected");
                o.bucketCounts = [];
                for (var n = 0; n < e.bucketCounts.length; ++n)
                  u.Long ? (o.bucketCounts[n] = u.Long.fromValue(e.bucketCounts[n])).unsigned = !1 : typeof e.bucketCounts[n] == "string" ? o.bucketCounts[n] = parseInt(e.bucketCounts[n], 10) : typeof e.bucketCounts[n] == "number" ? o.bucketCounts[n] = e.bucketCounts[n] : typeof e.bucketCounts[n] == "object" && (o.bucketCounts[n] = new u.LongBits(e.bucketCounts[n].low >>> 0, e.bucketCounts[n].high >>> 0).toNumber());
              }
              if (e.explicitBounds) {
                if (!Array.isArray(e.explicitBounds))
                  throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.explicitBounds: array expected");
                o.explicitBounds = [];
                for (var n = 0; n < e.explicitBounds.length; ++n)
                  o.explicitBounds[n] = Number(e.explicitBounds[n]);
              }
              if (e.exemplars) {
                if (!Array.isArray(e.exemplars))
                  throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.exemplars: array expected");
                o.exemplars = [];
                for (var n = 0; n < e.exemplars.length; ++n) {
                  if (typeof e.exemplars[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.HistogramDataPoint.exemplars: object expected");
                  o.exemplars[n] = s.opentelemetry.proto.metrics.v1.Exemplar.fromObject(e.exemplars[n]);
                }
              }
              return e.flags != null && (o.flags = e.flags >>> 0), e.min != null && (o.min = Number(e.min)), e.max != null && (o.max = Number(e.max)), o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              if ((o.arrays || o.defaults) && (n.bucketCounts = [], n.explicitBounds = [], n.exemplars = [], n.attributes = []), o.defaults) {
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.startTimeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.startTimeUnixNano = o.longs === String ? "0" : 0;
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.timeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.timeUnixNano = o.longs === String ? "0" : 0;
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.count = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.count = o.longs === String ? "0" : 0;
                n.flags = 0;
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && (typeof e.startTimeUnixNano == "number" ? n.startTimeUnixNano = o.longs === String ? String(e.startTimeUnixNano) : e.startTimeUnixNano : n.startTimeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.startTimeUnixNano) : o.longs === Number ? new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber() : e.startTimeUnixNano), e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && (typeof e.timeUnixNano == "number" ? n.timeUnixNano = o.longs === String ? String(e.timeUnixNano) : e.timeUnixNano : n.timeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.timeUnixNano) : o.longs === Number ? new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber() : e.timeUnixNano), e.count != null && e.hasOwnProperty("count") && (typeof e.count == "number" ? n.count = o.longs === String ? String(e.count) : e.count : n.count = o.longs === String ? u.Long.prototype.toString.call(e.count) : o.longs === Number ? new u.LongBits(e.count.low >>> 0, e.count.high >>> 0).toNumber() : e.count), e.sum != null && e.hasOwnProperty("sum") && (n.sum = o.json && !isFinite(e.sum) ? String(e.sum) : e.sum, o.oneofs && (n._sum = "sum")), e.bucketCounts && e.bucketCounts.length) {
                n.bucketCounts = [];
                for (var h = 0; h < e.bucketCounts.length; ++h)
                  typeof e.bucketCounts[h] == "number" ? n.bucketCounts[h] = o.longs === String ? String(e.bucketCounts[h]) : e.bucketCounts[h] : n.bucketCounts[h] = o.longs === String ? u.Long.prototype.toString.call(e.bucketCounts[h]) : o.longs === Number ? new u.LongBits(e.bucketCounts[h].low >>> 0, e.bucketCounts[h].high >>> 0).toNumber() : e.bucketCounts[h];
              }
              if (e.explicitBounds && e.explicitBounds.length) {
                n.explicitBounds = [];
                for (var h = 0; h < e.explicitBounds.length; ++h)
                  n.explicitBounds[h] = o.json && !isFinite(e.explicitBounds[h]) ? String(e.explicitBounds[h]) : e.explicitBounds[h];
              }
              if (e.exemplars && e.exemplars.length) {
                n.exemplars = [];
                for (var h = 0; h < e.exemplars.length; ++h)
                  n.exemplars[h] = s.opentelemetry.proto.metrics.v1.Exemplar.toObject(e.exemplars[h], o);
              }
              if (e.attributes && e.attributes.length) {
                n.attributes = [];
                for (var h = 0; h < e.attributes.length; ++h)
                  n.attributes[h] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.attributes[h], o);
              }
              return e.flags != null && e.hasOwnProperty("flags") && (n.flags = e.flags), e.min != null && e.hasOwnProperty("min") && (n.min = o.json && !isFinite(e.min) ? String(e.min) : e.min, o.oneofs && (n._min = "min")), e.max != null && e.hasOwnProperty("max") && (n.max = o.json && !isFinite(e.max) ? String(e.max) : e.max, o.oneofs && (n._max = "max")), n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.HistogramDataPoint";
            }, i;
          })(), g.ExponentialHistogramDataPoint = (function() {
            function i(e) {
              if (this.attributes = [], this.exemplars = [], e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.attributes = u.emptyArray, i.prototype.startTimeUnixNano = null, i.prototype.timeUnixNano = null, i.prototype.count = null, i.prototype.sum = null, i.prototype.scale = null, i.prototype.zeroCount = null, i.prototype.positive = null, i.prototype.negative = null, i.prototype.flags = null, i.prototype.exemplars = u.emptyArray, i.prototype.min = null, i.prototype.max = null, i.prototype.zeroThreshold = null;
            var t;
            return Object.defineProperty(i.prototype, "_sum", {
              get: u.oneOfGetter(t = ["sum"]),
              set: u.oneOfSetter(t)
            }), Object.defineProperty(i.prototype, "_min", {
              get: u.oneOfGetter(t = ["min"]),
              set: u.oneOfSetter(t)
            }), Object.defineProperty(i.prototype, "_max", {
              get: u.oneOfGetter(t = ["max"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              if (o || (o = d.create()), e.attributes != null && e.attributes.length)
                for (var n = 0; n < e.attributes.length; ++n)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(e.attributes[n], o.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              if (e.startTimeUnixNano != null && Object.hasOwnProperty.call(e, "startTimeUnixNano") && o.uint32(
                /* id 2, wireType 1 =*/
                17
              ).fixed64(e.startTimeUnixNano), e.timeUnixNano != null && Object.hasOwnProperty.call(e, "timeUnixNano") && o.uint32(
                /* id 3, wireType 1 =*/
                25
              ).fixed64(e.timeUnixNano), e.count != null && Object.hasOwnProperty.call(e, "count") && o.uint32(
                /* id 4, wireType 1 =*/
                33
              ).fixed64(e.count), e.sum != null && Object.hasOwnProperty.call(e, "sum") && o.uint32(
                /* id 5, wireType 1 =*/
                41
              ).double(e.sum), e.scale != null && Object.hasOwnProperty.call(e, "scale") && o.uint32(
                /* id 6, wireType 0 =*/
                48
              ).sint32(e.scale), e.zeroCount != null && Object.hasOwnProperty.call(e, "zeroCount") && o.uint32(
                /* id 7, wireType 1 =*/
                57
              ).fixed64(e.zeroCount), e.positive != null && Object.hasOwnProperty.call(e, "positive") && s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.encode(e.positive, o.uint32(
                /* id 8, wireType 2 =*/
                66
              ).fork()).ldelim(), e.negative != null && Object.hasOwnProperty.call(e, "negative") && s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.encode(e.negative, o.uint32(
                /* id 9, wireType 2 =*/
                74
              ).fork()).ldelim(), e.flags != null && Object.hasOwnProperty.call(e, "flags") && o.uint32(
                /* id 10, wireType 0 =*/
                80
              ).uint32(e.flags), e.exemplars != null && e.exemplars.length)
                for (var n = 0; n < e.exemplars.length; ++n)
                  s.opentelemetry.proto.metrics.v1.Exemplar.encode(e.exemplars[n], o.uint32(
                    /* id 11, wireType 2 =*/
                    90
                  ).fork()).ldelim();
              return e.min != null && Object.hasOwnProperty.call(e, "min") && o.uint32(
                /* id 12, wireType 1 =*/
                97
              ).double(e.min), e.max != null && Object.hasOwnProperty.call(e, "max") && o.uint32(
                /* id 13, wireType 1 =*/
                105
              ).double(e.max), e.zeroThreshold != null && Object.hasOwnProperty.call(e, "zeroThreshold") && o.uint32(
                /* id 14, wireType 1 =*/
                113
              ).double(e.zeroThreshold), o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 1: {
                    c.attributes && c.attributes.length || (c.attributes = []), c.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                    break;
                  }
                  case 2: {
                    c.startTimeUnixNano = e.fixed64();
                    break;
                  }
                  case 3: {
                    c.timeUnixNano = e.fixed64();
                    break;
                  }
                  case 4: {
                    c.count = e.fixed64();
                    break;
                  }
                  case 5: {
                    c.sum = e.double();
                    break;
                  }
                  case 6: {
                    c.scale = e.sint32();
                    break;
                  }
                  case 7: {
                    c.zeroCount = e.fixed64();
                    break;
                  }
                  case 8: {
                    c.positive = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.decode(e, e.uint32());
                    break;
                  }
                  case 9: {
                    c.negative = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.decode(e, e.uint32());
                    break;
                  }
                  case 10: {
                    c.flags = e.uint32();
                    break;
                  }
                  case 11: {
                    c.exemplars && c.exemplars.length || (c.exemplars = []), c.exemplars.push(s.opentelemetry.proto.metrics.v1.Exemplar.decode(e, e.uint32()));
                    break;
                  }
                  case 12: {
                    c.min = e.double();
                    break;
                  }
                  case 13: {
                    c.max = e.double();
                    break;
                  }
                  case 14: {
                    c.zeroThreshold = e.double();
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              if (e.attributes != null && e.hasOwnProperty("attributes")) {
                if (!Array.isArray(e.attributes))
                  return "attributes: array expected";
                for (var o = 0; o < e.attributes.length; ++o) {
                  var n = s.opentelemetry.proto.common.v1.KeyValue.verify(e.attributes[o]);
                  if (n)
                    return "attributes." + n;
                }
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && !u.isInteger(e.startTimeUnixNano) && !(e.startTimeUnixNano && u.isInteger(e.startTimeUnixNano.low) && u.isInteger(e.startTimeUnixNano.high)))
                return "startTimeUnixNano: integer|Long expected";
              if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && !u.isInteger(e.timeUnixNano) && !(e.timeUnixNano && u.isInteger(e.timeUnixNano.low) && u.isInteger(e.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (e.count != null && e.hasOwnProperty("count") && !u.isInteger(e.count) && !(e.count && u.isInteger(e.count.low) && u.isInteger(e.count.high)))
                return "count: integer|Long expected";
              if (e.sum != null && e.hasOwnProperty("sum") && typeof e.sum != "number")
                return "sum: number expected";
              if (e.scale != null && e.hasOwnProperty("scale") && !u.isInteger(e.scale))
                return "scale: integer expected";
              if (e.zeroCount != null && e.hasOwnProperty("zeroCount") && !u.isInteger(e.zeroCount) && !(e.zeroCount && u.isInteger(e.zeroCount.low) && u.isInteger(e.zeroCount.high)))
                return "zeroCount: integer|Long expected";
              if (e.positive != null && e.hasOwnProperty("positive")) {
                var n = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.verify(e.positive);
                if (n)
                  return "positive." + n;
              }
              if (e.negative != null && e.hasOwnProperty("negative")) {
                var n = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.verify(e.negative);
                if (n)
                  return "negative." + n;
              }
              if (e.flags != null && e.hasOwnProperty("flags") && !u.isInteger(e.flags))
                return "flags: integer expected";
              if (e.exemplars != null && e.hasOwnProperty("exemplars")) {
                if (!Array.isArray(e.exemplars))
                  return "exemplars: array expected";
                for (var o = 0; o < e.exemplars.length; ++o) {
                  var n = s.opentelemetry.proto.metrics.v1.Exemplar.verify(e.exemplars[o]);
                  if (n)
                    return "exemplars." + n;
                }
              }
              return e.min != null && e.hasOwnProperty("min") && typeof e.min != "number" ? "min: number expected" : e.max != null && e.hasOwnProperty("max") && typeof e.max != "number" ? "max: number expected" : e.zeroThreshold != null && e.hasOwnProperty("zeroThreshold") && typeof e.zeroThreshold != "number" ? "zeroThreshold: number expected" : null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint)
                return e;
              var o = new s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint();
              if (e.attributes) {
                if (!Array.isArray(e.attributes))
                  throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.attributes: array expected");
                o.attributes = [];
                for (var n = 0; n < e.attributes.length; ++n) {
                  if (typeof e.attributes[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.attributes: object expected");
                  o.attributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.attributes[n]);
                }
              }
              if (e.startTimeUnixNano != null && (u.Long ? (o.startTimeUnixNano = u.Long.fromValue(e.startTimeUnixNano)).unsigned = !1 : typeof e.startTimeUnixNano == "string" ? o.startTimeUnixNano = parseInt(e.startTimeUnixNano, 10) : typeof e.startTimeUnixNano == "number" ? o.startTimeUnixNano = e.startTimeUnixNano : typeof e.startTimeUnixNano == "object" && (o.startTimeUnixNano = new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber())), e.timeUnixNano != null && (u.Long ? (o.timeUnixNano = u.Long.fromValue(e.timeUnixNano)).unsigned = !1 : typeof e.timeUnixNano == "string" ? o.timeUnixNano = parseInt(e.timeUnixNano, 10) : typeof e.timeUnixNano == "number" ? o.timeUnixNano = e.timeUnixNano : typeof e.timeUnixNano == "object" && (o.timeUnixNano = new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber())), e.count != null && (u.Long ? (o.count = u.Long.fromValue(e.count)).unsigned = !1 : typeof e.count == "string" ? o.count = parseInt(e.count, 10) : typeof e.count == "number" ? o.count = e.count : typeof e.count == "object" && (o.count = new u.LongBits(e.count.low >>> 0, e.count.high >>> 0).toNumber())), e.sum != null && (o.sum = Number(e.sum)), e.scale != null && (o.scale = e.scale | 0), e.zeroCount != null && (u.Long ? (o.zeroCount = u.Long.fromValue(e.zeroCount)).unsigned = !1 : typeof e.zeroCount == "string" ? o.zeroCount = parseInt(e.zeroCount, 10) : typeof e.zeroCount == "number" ? o.zeroCount = e.zeroCount : typeof e.zeroCount == "object" && (o.zeroCount = new u.LongBits(e.zeroCount.low >>> 0, e.zeroCount.high >>> 0).toNumber())), e.positive != null) {
                if (typeof e.positive != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.positive: object expected");
                o.positive = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.fromObject(e.positive);
              }
              if (e.negative != null) {
                if (typeof e.negative != "object")
                  throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.negative: object expected");
                o.negative = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.fromObject(e.negative);
              }
              if (e.flags != null && (o.flags = e.flags >>> 0), e.exemplars) {
                if (!Array.isArray(e.exemplars))
                  throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.exemplars: array expected");
                o.exemplars = [];
                for (var n = 0; n < e.exemplars.length; ++n) {
                  if (typeof e.exemplars[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.exemplars: object expected");
                  o.exemplars[n] = s.opentelemetry.proto.metrics.v1.Exemplar.fromObject(e.exemplars[n]);
                }
              }
              return e.min != null && (o.min = Number(e.min)), e.max != null && (o.max = Number(e.max)), e.zeroThreshold != null && (o.zeroThreshold = Number(e.zeroThreshold)), o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              if ((o.arrays || o.defaults) && (n.attributes = [], n.exemplars = []), o.defaults) {
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.startTimeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.startTimeUnixNano = o.longs === String ? "0" : 0;
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.timeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.timeUnixNano = o.longs === String ? "0" : 0;
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.count = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.count = o.longs === String ? "0" : 0;
                if (n.scale = 0, u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.zeroCount = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.zeroCount = o.longs === String ? "0" : 0;
                n.positive = null, n.negative = null, n.flags = 0, n.zeroThreshold = 0;
              }
              if (e.attributes && e.attributes.length) {
                n.attributes = [];
                for (var h = 0; h < e.attributes.length; ++h)
                  n.attributes[h] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.attributes[h], o);
              }
              if (e.startTimeUnixNano != null && e.hasOwnProperty("startTimeUnixNano") && (typeof e.startTimeUnixNano == "number" ? n.startTimeUnixNano = o.longs === String ? String(e.startTimeUnixNano) : e.startTimeUnixNano : n.startTimeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.startTimeUnixNano) : o.longs === Number ? new u.LongBits(e.startTimeUnixNano.low >>> 0, e.startTimeUnixNano.high >>> 0).toNumber() : e.startTimeUnixNano), e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && (typeof e.timeUnixNano == "number" ? n.timeUnixNano = o.longs === String ? String(e.timeUnixNano) : e.timeUnixNano : n.timeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.timeUnixNano) : o.longs === Number ? new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber() : e.timeUnixNano), e.count != null && e.hasOwnProperty("count") && (typeof e.count == "number" ? n.count = o.longs === String ? String(e.count) : e.count : n.count = o.longs === String ? u.Long.prototype.toString.call(e.count) : o.longs === Number ? new u.LongBits(e.count.low >>> 0, e.count.high >>> 0).toNumber() : e.count), e.sum != null && e.hasOwnProperty("sum") && (n.sum = o.json && !isFinite(e.sum) ? String(e.sum) : e.sum, o.oneofs && (n._sum = "sum")), e.scale != null && e.hasOwnProperty("scale") && (n.scale = e.scale), e.zeroCount != null && e.hasOwnProperty("zeroCount") && (typeof e.zeroCount == "number" ? n.zeroCount = o.longs === String ? String(e.zeroCount) : e.zeroCount : n.zeroCount = o.longs === String ? u.Long.prototype.toString.call(e.zeroCount) : o.longs === Number ? new u.LongBits(e.zeroCount.low >>> 0, e.zeroCount.high >>> 0).toNumber() : e.zeroCount), e.positive != null && e.hasOwnProperty("positive") && (n.positive = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.toObject(e.positive, o)), e.negative != null && e.hasOwnProperty("negative") && (n.negative = s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.toObject(e.negative, o)), e.flags != null && e.hasOwnProperty("flags") && (n.flags = e.flags), e.exemplars && e.exemplars.length) {
                n.exemplars = [];
                for (var h = 0; h < e.exemplars.length; ++h)
                  n.exemplars[h] = s.opentelemetry.proto.metrics.v1.Exemplar.toObject(e.exemplars[h], o);
              }
              return e.min != null && e.hasOwnProperty("min") && (n.min = o.json && !isFinite(e.min) ? String(e.min) : e.min, o.oneofs && (n._min = "min")), e.max != null && e.hasOwnProperty("max") && (n.max = o.json && !isFinite(e.max) ? String(e.max) : e.max, o.oneofs && (n._max = "max")), e.zeroThreshold != null && e.hasOwnProperty("zeroThreshold") && (n.zeroThreshold = o.json && !isFinite(e.zeroThreshold) ? String(e.zeroThreshold) : e.zeroThreshold), n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint";
            }, i.Buckets = (function() {
              function e(o) {
                if (this.bucketCounts = [], o)
                  for (var n = Object.keys(o), c = 0; c < n.length; ++c)
                    o[n[c]] != null && (this[n[c]] = o[n[c]]);
              }
              return e.prototype.offset = null, e.prototype.bucketCounts = u.emptyArray, e.create = function(o) {
                return new e(o);
              }, e.encode = function(o, n) {
                if (n || (n = d.create()), o.offset != null && Object.hasOwnProperty.call(o, "offset") && n.uint32(
                  /* id 1, wireType 0 =*/
                  8
                ).sint32(o.offset), o.bucketCounts != null && o.bucketCounts.length) {
                  n.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork();
                  for (var c = 0; c < o.bucketCounts.length; ++c)
                    n.uint64(o.bucketCounts[c]);
                  n.ldelim();
                }
                return n;
              }, e.encodeDelimited = function(o, n) {
                return this.encode(o, n).ldelim();
              }, e.decode = function(o, n) {
                o instanceof l || (o = l.create(o));
                for (var c = n === void 0 ? o.len : o.pos + n, h = new s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets(); o.pos < c; ) {
                  var v = o.uint32();
                  switch (v >>> 3) {
                    case 1: {
                      h.offset = o.sint32();
                      break;
                    }
                    case 2: {
                      if (h.bucketCounts && h.bucketCounts.length || (h.bucketCounts = []), (v & 7) === 2)
                        for (var x = o.uint32() + o.pos; o.pos < x; )
                          h.bucketCounts.push(o.uint64());
                      else
                        h.bucketCounts.push(o.uint64());
                      break;
                    }
                    default:
                      o.skipType(v & 7);
                      break;
                  }
                }
                return h;
              }, e.decodeDelimited = function(o) {
                return o instanceof l || (o = new l(o)), this.decode(o, o.uint32());
              }, e.verify = function(o) {
                if (typeof o != "object" || o === null)
                  return "object expected";
                if (o.offset != null && o.hasOwnProperty("offset") && !u.isInteger(o.offset))
                  return "offset: integer expected";
                if (o.bucketCounts != null && o.hasOwnProperty("bucketCounts")) {
                  if (!Array.isArray(o.bucketCounts))
                    return "bucketCounts: array expected";
                  for (var n = 0; n < o.bucketCounts.length; ++n)
                    if (!u.isInteger(o.bucketCounts[n]) && !(o.bucketCounts[n] && u.isInteger(o.bucketCounts[n].low) && u.isInteger(o.bucketCounts[n].high)))
                      return "bucketCounts: integer|Long[] expected";
                }
                return null;
              }, e.fromObject = function(o) {
                if (o instanceof s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets)
                  return o;
                var n = new s.opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets();
                if (o.offset != null && (n.offset = o.offset | 0), o.bucketCounts) {
                  if (!Array.isArray(o.bucketCounts))
                    throw TypeError(".opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets.bucketCounts: array expected");
                  n.bucketCounts = [];
                  for (var c = 0; c < o.bucketCounts.length; ++c)
                    u.Long ? (n.bucketCounts[c] = u.Long.fromValue(o.bucketCounts[c])).unsigned = !0 : typeof o.bucketCounts[c] == "string" ? n.bucketCounts[c] = parseInt(o.bucketCounts[c], 10) : typeof o.bucketCounts[c] == "number" ? n.bucketCounts[c] = o.bucketCounts[c] : typeof o.bucketCounts[c] == "object" && (n.bucketCounts[c] = new u.LongBits(o.bucketCounts[c].low >>> 0, o.bucketCounts[c].high >>> 0).toNumber(!0));
                }
                return n;
              }, e.toObject = function(o, n) {
                n || (n = {});
                var c = {};
                if ((n.arrays || n.defaults) && (c.bucketCounts = []), n.defaults && (c.offset = 0), o.offset != null && o.hasOwnProperty("offset") && (c.offset = o.offset), o.bucketCounts && o.bucketCounts.length) {
                  c.bucketCounts = [];
                  for (var h = 0; h < o.bucketCounts.length; ++h)
                    typeof o.bucketCounts[h] == "number" ? c.bucketCounts[h] = n.longs === String ? String(o.bucketCounts[h]) : o.bucketCounts[h] : c.bucketCounts[h] = n.longs === String ? u.Long.prototype.toString.call(o.bucketCounts[h]) : n.longs === Number ? new u.LongBits(o.bucketCounts[h].low >>> 0, o.bucketCounts[h].high >>> 0).toNumber(!0) : o.bucketCounts[h];
                }
                return c;
              }, e.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, e.getTypeUrl = function(o) {
                return o === void 0 && (o = "type.googleapis.com"), o + "/opentelemetry.proto.metrics.v1.ExponentialHistogramDataPoint.Buckets";
              }, e;
            })(), i;
          })(), g.SummaryDataPoint = (function() {
            function i(t) {
              if (this.attributes = [], this.quantileValues = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.attributes = u.emptyArray, i.prototype.startTimeUnixNano = null, i.prototype.timeUnixNano = null, i.prototype.count = null, i.prototype.sum = null, i.prototype.quantileValues = u.emptyArray, i.prototype.flags = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.startTimeUnixNano != null && Object.hasOwnProperty.call(t, "startTimeUnixNano") && e.uint32(
                /* id 2, wireType 1 =*/
                17
              ).fixed64(t.startTimeUnixNano), t.timeUnixNano != null && Object.hasOwnProperty.call(t, "timeUnixNano") && e.uint32(
                /* id 3, wireType 1 =*/
                25
              ).fixed64(t.timeUnixNano), t.count != null && Object.hasOwnProperty.call(t, "count") && e.uint32(
                /* id 4, wireType 1 =*/
                33
              ).fixed64(t.count), t.sum != null && Object.hasOwnProperty.call(t, "sum") && e.uint32(
                /* id 5, wireType 1 =*/
                41
              ).double(t.sum), t.quantileValues != null && t.quantileValues.length)
                for (var o = 0; o < t.quantileValues.length; ++o)
                  s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile.encode(t.quantileValues[o], e.uint32(
                    /* id 6, wireType 2 =*/
                    50
                  ).fork()).ldelim();
              if (t.attributes != null && t.attributes.length)
                for (var o = 0; o < t.attributes.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.attributes[o], e.uint32(
                    /* id 7, wireType 2 =*/
                    58
                  ).fork()).ldelim();
              return t.flags != null && Object.hasOwnProperty.call(t, "flags") && e.uint32(
                /* id 8, wireType 0 =*/
                64
              ).uint32(t.flags), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.metrics.v1.SummaryDataPoint(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 7: {
                    n.attributes && n.attributes.length || (n.attributes = []), n.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  case 2: {
                    n.startTimeUnixNano = t.fixed64();
                    break;
                  }
                  case 3: {
                    n.timeUnixNano = t.fixed64();
                    break;
                  }
                  case 4: {
                    n.count = t.fixed64();
                    break;
                  }
                  case 5: {
                    n.sum = t.double();
                    break;
                  }
                  case 6: {
                    n.quantileValues && n.quantileValues.length || (n.quantileValues = []), n.quantileValues.push(s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile.decode(t, t.uint32()));
                    break;
                  }
                  case 8: {
                    n.flags = t.uint32();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.attributes != null && t.hasOwnProperty("attributes")) {
                if (!Array.isArray(t.attributes))
                  return "attributes: array expected";
                for (var e = 0; e < t.attributes.length; ++e) {
                  var o = s.opentelemetry.proto.common.v1.KeyValue.verify(t.attributes[e]);
                  if (o)
                    return "attributes." + o;
                }
              }
              if (t.startTimeUnixNano != null && t.hasOwnProperty("startTimeUnixNano") && !u.isInteger(t.startTimeUnixNano) && !(t.startTimeUnixNano && u.isInteger(t.startTimeUnixNano.low) && u.isInteger(t.startTimeUnixNano.high)))
                return "startTimeUnixNano: integer|Long expected";
              if (t.timeUnixNano != null && t.hasOwnProperty("timeUnixNano") && !u.isInteger(t.timeUnixNano) && !(t.timeUnixNano && u.isInteger(t.timeUnixNano.low) && u.isInteger(t.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (t.count != null && t.hasOwnProperty("count") && !u.isInteger(t.count) && !(t.count && u.isInteger(t.count.low) && u.isInteger(t.count.high)))
                return "count: integer|Long expected";
              if (t.sum != null && t.hasOwnProperty("sum") && typeof t.sum != "number")
                return "sum: number expected";
              if (t.quantileValues != null && t.hasOwnProperty("quantileValues")) {
                if (!Array.isArray(t.quantileValues))
                  return "quantileValues: array expected";
                for (var e = 0; e < t.quantileValues.length; ++e) {
                  var o = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile.verify(t.quantileValues[e]);
                  if (o)
                    return "quantileValues." + o;
                }
              }
              return t.flags != null && t.hasOwnProperty("flags") && !u.isInteger(t.flags) ? "flags: integer expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.metrics.v1.SummaryDataPoint)
                return t;
              var e = new s.opentelemetry.proto.metrics.v1.SummaryDataPoint();
              if (t.attributes) {
                if (!Array.isArray(t.attributes))
                  throw TypeError(".opentelemetry.proto.metrics.v1.SummaryDataPoint.attributes: array expected");
                e.attributes = [];
                for (var o = 0; o < t.attributes.length; ++o) {
                  if (typeof t.attributes[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.SummaryDataPoint.attributes: object expected");
                  e.attributes[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.attributes[o]);
                }
              }
              if (t.startTimeUnixNano != null && (u.Long ? (e.startTimeUnixNano = u.Long.fromValue(t.startTimeUnixNano)).unsigned = !1 : typeof t.startTimeUnixNano == "string" ? e.startTimeUnixNano = parseInt(t.startTimeUnixNano, 10) : typeof t.startTimeUnixNano == "number" ? e.startTimeUnixNano = t.startTimeUnixNano : typeof t.startTimeUnixNano == "object" && (e.startTimeUnixNano = new u.LongBits(t.startTimeUnixNano.low >>> 0, t.startTimeUnixNano.high >>> 0).toNumber())), t.timeUnixNano != null && (u.Long ? (e.timeUnixNano = u.Long.fromValue(t.timeUnixNano)).unsigned = !1 : typeof t.timeUnixNano == "string" ? e.timeUnixNano = parseInt(t.timeUnixNano, 10) : typeof t.timeUnixNano == "number" ? e.timeUnixNano = t.timeUnixNano : typeof t.timeUnixNano == "object" && (e.timeUnixNano = new u.LongBits(t.timeUnixNano.low >>> 0, t.timeUnixNano.high >>> 0).toNumber())), t.count != null && (u.Long ? (e.count = u.Long.fromValue(t.count)).unsigned = !1 : typeof t.count == "string" ? e.count = parseInt(t.count, 10) : typeof t.count == "number" ? e.count = t.count : typeof t.count == "object" && (e.count = new u.LongBits(t.count.low >>> 0, t.count.high >>> 0).toNumber())), t.sum != null && (e.sum = Number(t.sum)), t.quantileValues) {
                if (!Array.isArray(t.quantileValues))
                  throw TypeError(".opentelemetry.proto.metrics.v1.SummaryDataPoint.quantileValues: array expected");
                e.quantileValues = [];
                for (var o = 0; o < t.quantileValues.length; ++o) {
                  if (typeof t.quantileValues[o] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.SummaryDataPoint.quantileValues: object expected");
                  e.quantileValues[o] = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile.fromObject(t.quantileValues[o]);
                }
              }
              return t.flags != null && (e.flags = t.flags >>> 0), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.quantileValues = [], o.attributes = []), e.defaults) {
                if (u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.startTimeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.startTimeUnixNano = e.longs === String ? "0" : 0;
                if (u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.timeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.timeUnixNano = e.longs === String ? "0" : 0;
                if (u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.count = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.count = e.longs === String ? "0" : 0;
                o.sum = 0, o.flags = 0;
              }
              if (t.startTimeUnixNano != null && t.hasOwnProperty("startTimeUnixNano") && (typeof t.startTimeUnixNano == "number" ? o.startTimeUnixNano = e.longs === String ? String(t.startTimeUnixNano) : t.startTimeUnixNano : o.startTimeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.startTimeUnixNano) : e.longs === Number ? new u.LongBits(t.startTimeUnixNano.low >>> 0, t.startTimeUnixNano.high >>> 0).toNumber() : t.startTimeUnixNano), t.timeUnixNano != null && t.hasOwnProperty("timeUnixNano") && (typeof t.timeUnixNano == "number" ? o.timeUnixNano = e.longs === String ? String(t.timeUnixNano) : t.timeUnixNano : o.timeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.timeUnixNano) : e.longs === Number ? new u.LongBits(t.timeUnixNano.low >>> 0, t.timeUnixNano.high >>> 0).toNumber() : t.timeUnixNano), t.count != null && t.hasOwnProperty("count") && (typeof t.count == "number" ? o.count = e.longs === String ? String(t.count) : t.count : o.count = e.longs === String ? u.Long.prototype.toString.call(t.count) : e.longs === Number ? new u.LongBits(t.count.low >>> 0, t.count.high >>> 0).toNumber() : t.count), t.sum != null && t.hasOwnProperty("sum") && (o.sum = e.json && !isFinite(t.sum) ? String(t.sum) : t.sum), t.quantileValues && t.quantileValues.length) {
                o.quantileValues = [];
                for (var c = 0; c < t.quantileValues.length; ++c)
                  o.quantileValues[c] = s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile.toObject(t.quantileValues[c], e);
              }
              if (t.attributes && t.attributes.length) {
                o.attributes = [];
                for (var c = 0; c < t.attributes.length; ++c)
                  o.attributes[c] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.attributes[c], e);
              }
              return t.flags != null && t.hasOwnProperty("flags") && (o.flags = t.flags), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.metrics.v1.SummaryDataPoint";
            }, i.ValueAtQuantile = (function() {
              function t(e) {
                if (e)
                  for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                    e[o[n]] != null && (this[o[n]] = e[o[n]]);
              }
              return t.prototype.quantile = null, t.prototype.value = null, t.create = function(e) {
                return new t(e);
              }, t.encode = function(e, o) {
                return o || (o = d.create()), e.quantile != null && Object.hasOwnProperty.call(e, "quantile") && o.uint32(
                  /* id 1, wireType 1 =*/
                  9
                ).double(e.quantile), e.value != null && Object.hasOwnProperty.call(e, "value") && o.uint32(
                  /* id 2, wireType 1 =*/
                  17
                ).double(e.value), o;
              }, t.encodeDelimited = function(e, o) {
                return this.encode(e, o).ldelim();
              }, t.decode = function(e, o) {
                e instanceof l || (e = l.create(e));
                for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile(); e.pos < n; ) {
                  var h = e.uint32();
                  switch (h >>> 3) {
                    case 1: {
                      c.quantile = e.double();
                      break;
                    }
                    case 2: {
                      c.value = e.double();
                      break;
                    }
                    default:
                      e.skipType(h & 7);
                      break;
                  }
                }
                return c;
              }, t.decodeDelimited = function(e) {
                return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
              }, t.verify = function(e) {
                return typeof e != "object" || e === null ? "object expected" : e.quantile != null && e.hasOwnProperty("quantile") && typeof e.quantile != "number" ? "quantile: number expected" : e.value != null && e.hasOwnProperty("value") && typeof e.value != "number" ? "value: number expected" : null;
              }, t.fromObject = function(e) {
                if (e instanceof s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile)
                  return e;
                var o = new s.opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile();
                return e.quantile != null && (o.quantile = Number(e.quantile)), e.value != null && (o.value = Number(e.value)), o;
              }, t.toObject = function(e, o) {
                o || (o = {});
                var n = {};
                return o.defaults && (n.quantile = 0, n.value = 0), e.quantile != null && e.hasOwnProperty("quantile") && (n.quantile = o.json && !isFinite(e.quantile) ? String(e.quantile) : e.quantile), e.value != null && e.hasOwnProperty("value") && (n.value = o.json && !isFinite(e.value) ? String(e.value) : e.value), n;
              }, t.prototype.toJSON = function() {
                return this.constructor.toObject(this, m.util.toJSONOptions);
              }, t.getTypeUrl = function(e) {
                return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.SummaryDataPoint.ValueAtQuantile";
              }, t;
            })(), i;
          })(), g.Exemplar = (function() {
            function i(e) {
              if (this.filteredAttributes = [], e)
                for (var o = Object.keys(e), n = 0; n < o.length; ++n)
                  e[o[n]] != null && (this[o[n]] = e[o[n]]);
            }
            i.prototype.filteredAttributes = u.emptyArray, i.prototype.timeUnixNano = null, i.prototype.asDouble = null, i.prototype.asInt = null, i.prototype.spanId = null, i.prototype.traceId = null;
            var t;
            return Object.defineProperty(i.prototype, "value", {
              get: u.oneOfGetter(t = ["asDouble", "asInt"]),
              set: u.oneOfSetter(t)
            }), i.create = function(e) {
              return new i(e);
            }, i.encode = function(e, o) {
              if (o || (o = d.create()), e.timeUnixNano != null && Object.hasOwnProperty.call(e, "timeUnixNano") && o.uint32(
                /* id 2, wireType 1 =*/
                17
              ).fixed64(e.timeUnixNano), e.asDouble != null && Object.hasOwnProperty.call(e, "asDouble") && o.uint32(
                /* id 3, wireType 1 =*/
                25
              ).double(e.asDouble), e.spanId != null && Object.hasOwnProperty.call(e, "spanId") && o.uint32(
                /* id 4, wireType 2 =*/
                34
              ).bytes(e.spanId), e.traceId != null && Object.hasOwnProperty.call(e, "traceId") && o.uint32(
                /* id 5, wireType 2 =*/
                42
              ).bytes(e.traceId), e.asInt != null && Object.hasOwnProperty.call(e, "asInt") && o.uint32(
                /* id 6, wireType 1 =*/
                49
              ).sfixed64(e.asInt), e.filteredAttributes != null && e.filteredAttributes.length)
                for (var n = 0; n < e.filteredAttributes.length; ++n)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(e.filteredAttributes[n], o.uint32(
                    /* id 7, wireType 2 =*/
                    58
                  ).fork()).ldelim();
              return o;
            }, i.encodeDelimited = function(e, o) {
              return this.encode(e, o).ldelim();
            }, i.decode = function(e, o) {
              e instanceof l || (e = l.create(e));
              for (var n = o === void 0 ? e.len : e.pos + o, c = new s.opentelemetry.proto.metrics.v1.Exemplar(); e.pos < n; ) {
                var h = e.uint32();
                switch (h >>> 3) {
                  case 7: {
                    c.filteredAttributes && c.filteredAttributes.length || (c.filteredAttributes = []), c.filteredAttributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(e, e.uint32()));
                    break;
                  }
                  case 2: {
                    c.timeUnixNano = e.fixed64();
                    break;
                  }
                  case 3: {
                    c.asDouble = e.double();
                    break;
                  }
                  case 6: {
                    c.asInt = e.sfixed64();
                    break;
                  }
                  case 4: {
                    c.spanId = e.bytes();
                    break;
                  }
                  case 5: {
                    c.traceId = e.bytes();
                    break;
                  }
                  default:
                    e.skipType(h & 7);
                    break;
                }
              }
              return c;
            }, i.decodeDelimited = function(e) {
              return e instanceof l || (e = new l(e)), this.decode(e, e.uint32());
            }, i.verify = function(e) {
              if (typeof e != "object" || e === null)
                return "object expected";
              var o = {};
              if (e.filteredAttributes != null && e.hasOwnProperty("filteredAttributes")) {
                if (!Array.isArray(e.filteredAttributes))
                  return "filteredAttributes: array expected";
                for (var n = 0; n < e.filteredAttributes.length; ++n) {
                  var c = s.opentelemetry.proto.common.v1.KeyValue.verify(e.filteredAttributes[n]);
                  if (c)
                    return "filteredAttributes." + c;
                }
              }
              if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && !u.isInteger(e.timeUnixNano) && !(e.timeUnixNano && u.isInteger(e.timeUnixNano.low) && u.isInteger(e.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (e.asDouble != null && e.hasOwnProperty("asDouble") && (o.value = 1, typeof e.asDouble != "number"))
                return "asDouble: number expected";
              if (e.asInt != null && e.hasOwnProperty("asInt")) {
                if (o.value === 1)
                  return "value: multiple values";
                if (o.value = 1, !u.isInteger(e.asInt) && !(e.asInt && u.isInteger(e.asInt.low) && u.isInteger(e.asInt.high)))
                  return "asInt: integer|Long expected";
              }
              return e.spanId != null && e.hasOwnProperty("spanId") && !(e.spanId && typeof e.spanId.length == "number" || u.isString(e.spanId)) ? "spanId: buffer expected" : e.traceId != null && e.hasOwnProperty("traceId") && !(e.traceId && typeof e.traceId.length == "number" || u.isString(e.traceId)) ? "traceId: buffer expected" : null;
            }, i.fromObject = function(e) {
              if (e instanceof s.opentelemetry.proto.metrics.v1.Exemplar)
                return e;
              var o = new s.opentelemetry.proto.metrics.v1.Exemplar();
              if (e.filteredAttributes) {
                if (!Array.isArray(e.filteredAttributes))
                  throw TypeError(".opentelemetry.proto.metrics.v1.Exemplar.filteredAttributes: array expected");
                o.filteredAttributes = [];
                for (var n = 0; n < e.filteredAttributes.length; ++n) {
                  if (typeof e.filteredAttributes[n] != "object")
                    throw TypeError(".opentelemetry.proto.metrics.v1.Exemplar.filteredAttributes: object expected");
                  o.filteredAttributes[n] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(e.filteredAttributes[n]);
                }
              }
              return e.timeUnixNano != null && (u.Long ? (o.timeUnixNano = u.Long.fromValue(e.timeUnixNano)).unsigned = !1 : typeof e.timeUnixNano == "string" ? o.timeUnixNano = parseInt(e.timeUnixNano, 10) : typeof e.timeUnixNano == "number" ? o.timeUnixNano = e.timeUnixNano : typeof e.timeUnixNano == "object" && (o.timeUnixNano = new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber())), e.asDouble != null && (o.asDouble = Number(e.asDouble)), e.asInt != null && (u.Long ? (o.asInt = u.Long.fromValue(e.asInt)).unsigned = !1 : typeof e.asInt == "string" ? o.asInt = parseInt(e.asInt, 10) : typeof e.asInt == "number" ? o.asInt = e.asInt : typeof e.asInt == "object" && (o.asInt = new u.LongBits(e.asInt.low >>> 0, e.asInt.high >>> 0).toNumber())), e.spanId != null && (typeof e.spanId == "string" ? u.base64.decode(e.spanId, o.spanId = u.newBuffer(u.base64.length(e.spanId)), 0) : e.spanId.length >= 0 && (o.spanId = e.spanId)), e.traceId != null && (typeof e.traceId == "string" ? u.base64.decode(e.traceId, o.traceId = u.newBuffer(u.base64.length(e.traceId)), 0) : e.traceId.length >= 0 && (o.traceId = e.traceId)), o;
            }, i.toObject = function(e, o) {
              o || (o = {});
              var n = {};
              if ((o.arrays || o.defaults) && (n.filteredAttributes = []), o.defaults) {
                if (u.Long) {
                  var c = new u.Long(0, 0, !1);
                  n.timeUnixNano = o.longs === String ? c.toString() : o.longs === Number ? c.toNumber() : c;
                } else
                  n.timeUnixNano = o.longs === String ? "0" : 0;
                o.bytes === String ? n.spanId = "" : (n.spanId = [], o.bytes !== Array && (n.spanId = u.newBuffer(n.spanId))), o.bytes === String ? n.traceId = "" : (n.traceId = [], o.bytes !== Array && (n.traceId = u.newBuffer(n.traceId)));
              }
              if (e.timeUnixNano != null && e.hasOwnProperty("timeUnixNano") && (typeof e.timeUnixNano == "number" ? n.timeUnixNano = o.longs === String ? String(e.timeUnixNano) : e.timeUnixNano : n.timeUnixNano = o.longs === String ? u.Long.prototype.toString.call(e.timeUnixNano) : o.longs === Number ? new u.LongBits(e.timeUnixNano.low >>> 0, e.timeUnixNano.high >>> 0).toNumber() : e.timeUnixNano), e.asDouble != null && e.hasOwnProperty("asDouble") && (n.asDouble = o.json && !isFinite(e.asDouble) ? String(e.asDouble) : e.asDouble, o.oneofs && (n.value = "asDouble")), e.spanId != null && e.hasOwnProperty("spanId") && (n.spanId = o.bytes === String ? u.base64.encode(e.spanId, 0, e.spanId.length) : o.bytes === Array ? Array.prototype.slice.call(e.spanId) : e.spanId), e.traceId != null && e.hasOwnProperty("traceId") && (n.traceId = o.bytes === String ? u.base64.encode(e.traceId, 0, e.traceId.length) : o.bytes === Array ? Array.prototype.slice.call(e.traceId) : e.traceId), e.asInt != null && e.hasOwnProperty("asInt") && (typeof e.asInt == "number" ? n.asInt = o.longs === String ? String(e.asInt) : e.asInt : n.asInt = o.longs === String ? u.Long.prototype.toString.call(e.asInt) : o.longs === Number ? new u.LongBits(e.asInt.low >>> 0, e.asInt.high >>> 0).toNumber() : e.asInt, o.oneofs && (n.value = "asInt")), e.filteredAttributes && e.filteredAttributes.length) {
                n.filteredAttributes = [];
                for (var h = 0; h < e.filteredAttributes.length; ++h)
                  n.filteredAttributes[h] = s.opentelemetry.proto.common.v1.KeyValue.toObject(e.filteredAttributes[h], o);
              }
              return n;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(e) {
              return e === void 0 && (e = "type.googleapis.com"), e + "/opentelemetry.proto.metrics.v1.Exemplar";
            }, i;
          })(), g;
        })(), b;
      })(), y.logs = (function() {
        var b = {};
        return b.v1 = (function() {
          var g = {};
          return g.LogsData = (function() {
            function i(t) {
              if (this.resourceLogs = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resourceLogs = u.emptyArray, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resourceLogs != null && t.resourceLogs.length)
                for (var o = 0; o < t.resourceLogs.length; ++o)
                  s.opentelemetry.proto.logs.v1.ResourceLogs.encode(t.resourceLogs[o], e.uint32(
                    /* id 1, wireType 2 =*/
                    10
                  ).fork()).ldelim();
              return e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.logs.v1.LogsData(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resourceLogs && n.resourceLogs.length || (n.resourceLogs = []), n.resourceLogs.push(s.opentelemetry.proto.logs.v1.ResourceLogs.decode(t, t.uint32()));
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resourceLogs != null && t.hasOwnProperty("resourceLogs")) {
                if (!Array.isArray(t.resourceLogs))
                  return "resourceLogs: array expected";
                for (var e = 0; e < t.resourceLogs.length; ++e) {
                  var o = s.opentelemetry.proto.logs.v1.ResourceLogs.verify(t.resourceLogs[e]);
                  if (o)
                    return "resourceLogs." + o;
                }
              }
              return null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.logs.v1.LogsData)
                return t;
              var e = new s.opentelemetry.proto.logs.v1.LogsData();
              if (t.resourceLogs) {
                if (!Array.isArray(t.resourceLogs))
                  throw TypeError(".opentelemetry.proto.logs.v1.LogsData.resourceLogs: array expected");
                e.resourceLogs = [];
                for (var o = 0; o < t.resourceLogs.length; ++o) {
                  if (typeof t.resourceLogs[o] != "object")
                    throw TypeError(".opentelemetry.proto.logs.v1.LogsData.resourceLogs: object expected");
                  e.resourceLogs[o] = s.opentelemetry.proto.logs.v1.ResourceLogs.fromObject(t.resourceLogs[o]);
                }
              }
              return e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.resourceLogs = []), t.resourceLogs && t.resourceLogs.length) {
                o.resourceLogs = [];
                for (var n = 0; n < t.resourceLogs.length; ++n)
                  o.resourceLogs[n] = s.opentelemetry.proto.logs.v1.ResourceLogs.toObject(t.resourceLogs[n], e);
              }
              return o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.logs.v1.LogsData";
            }, i;
          })(), g.ResourceLogs = (function() {
            function i(t) {
              if (this.scopeLogs = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.resource = null, i.prototype.scopeLogs = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.resource != null && Object.hasOwnProperty.call(t, "resource") && s.opentelemetry.proto.resource.v1.Resource.encode(t.resource, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.scopeLogs != null && t.scopeLogs.length)
                for (var o = 0; o < t.scopeLogs.length; ++o)
                  s.opentelemetry.proto.logs.v1.ScopeLogs.encode(t.scopeLogs[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.logs.v1.ResourceLogs(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.resource = s.opentelemetry.proto.resource.v1.Resource.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.scopeLogs && n.scopeLogs.length || (n.scopeLogs = []), n.scopeLogs.push(s.opentelemetry.proto.logs.v1.ScopeLogs.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.resource != null && t.hasOwnProperty("resource")) {
                var e = s.opentelemetry.proto.resource.v1.Resource.verify(t.resource);
                if (e)
                  return "resource." + e;
              }
              if (t.scopeLogs != null && t.hasOwnProperty("scopeLogs")) {
                if (!Array.isArray(t.scopeLogs))
                  return "scopeLogs: array expected";
                for (var o = 0; o < t.scopeLogs.length; ++o) {
                  var e = s.opentelemetry.proto.logs.v1.ScopeLogs.verify(t.scopeLogs[o]);
                  if (e)
                    return "scopeLogs." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.logs.v1.ResourceLogs)
                return t;
              var e = new s.opentelemetry.proto.logs.v1.ResourceLogs();
              if (t.resource != null) {
                if (typeof t.resource != "object")
                  throw TypeError(".opentelemetry.proto.logs.v1.ResourceLogs.resource: object expected");
                e.resource = s.opentelemetry.proto.resource.v1.Resource.fromObject(t.resource);
              }
              if (t.scopeLogs) {
                if (!Array.isArray(t.scopeLogs))
                  throw TypeError(".opentelemetry.proto.logs.v1.ResourceLogs.scopeLogs: array expected");
                e.scopeLogs = [];
                for (var o = 0; o < t.scopeLogs.length; ++o) {
                  if (typeof t.scopeLogs[o] != "object")
                    throw TypeError(".opentelemetry.proto.logs.v1.ResourceLogs.scopeLogs: object expected");
                  e.scopeLogs[o] = s.opentelemetry.proto.logs.v1.ScopeLogs.fromObject(t.scopeLogs[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.scopeLogs = []), e.defaults && (o.resource = null, o.schemaUrl = ""), t.resource != null && t.hasOwnProperty("resource") && (o.resource = s.opentelemetry.proto.resource.v1.Resource.toObject(t.resource, e)), t.scopeLogs && t.scopeLogs.length) {
                o.scopeLogs = [];
                for (var n = 0; n < t.scopeLogs.length; ++n)
                  o.scopeLogs[n] = s.opentelemetry.proto.logs.v1.ScopeLogs.toObject(t.scopeLogs[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.logs.v1.ResourceLogs";
            }, i;
          })(), g.ScopeLogs = (function() {
            function i(t) {
              if (this.logRecords = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.scope = null, i.prototype.logRecords = u.emptyArray, i.prototype.schemaUrl = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.scope != null && Object.hasOwnProperty.call(t, "scope") && s.opentelemetry.proto.common.v1.InstrumentationScope.encode(t.scope, e.uint32(
                /* id 1, wireType 2 =*/
                10
              ).fork()).ldelim(), t.logRecords != null && t.logRecords.length)
                for (var o = 0; o < t.logRecords.length; ++o)
                  s.opentelemetry.proto.logs.v1.LogRecord.encode(t.logRecords[o], e.uint32(
                    /* id 2, wireType 2 =*/
                    18
                  ).fork()).ldelim();
              return t.schemaUrl != null && Object.hasOwnProperty.call(t, "schemaUrl") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.schemaUrl), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.logs.v1.ScopeLogs(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.decode(t, t.uint32());
                    break;
                  }
                  case 2: {
                    n.logRecords && n.logRecords.length || (n.logRecords = []), n.logRecords.push(s.opentelemetry.proto.logs.v1.LogRecord.decode(t, t.uint32()));
                    break;
                  }
                  case 3: {
                    n.schemaUrl = t.string();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.scope != null && t.hasOwnProperty("scope")) {
                var e = s.opentelemetry.proto.common.v1.InstrumentationScope.verify(t.scope);
                if (e)
                  return "scope." + e;
              }
              if (t.logRecords != null && t.hasOwnProperty("logRecords")) {
                if (!Array.isArray(t.logRecords))
                  return "logRecords: array expected";
                for (var o = 0; o < t.logRecords.length; ++o) {
                  var e = s.opentelemetry.proto.logs.v1.LogRecord.verify(t.logRecords[o]);
                  if (e)
                    return "logRecords." + e;
                }
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && !u.isString(t.schemaUrl) ? "schemaUrl: string expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.logs.v1.ScopeLogs)
                return t;
              var e = new s.opentelemetry.proto.logs.v1.ScopeLogs();
              if (t.scope != null) {
                if (typeof t.scope != "object")
                  throw TypeError(".opentelemetry.proto.logs.v1.ScopeLogs.scope: object expected");
                e.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.fromObject(t.scope);
              }
              if (t.logRecords) {
                if (!Array.isArray(t.logRecords))
                  throw TypeError(".opentelemetry.proto.logs.v1.ScopeLogs.logRecords: array expected");
                e.logRecords = [];
                for (var o = 0; o < t.logRecords.length; ++o) {
                  if (typeof t.logRecords[o] != "object")
                    throw TypeError(".opentelemetry.proto.logs.v1.ScopeLogs.logRecords: object expected");
                  e.logRecords[o] = s.opentelemetry.proto.logs.v1.LogRecord.fromObject(t.logRecords[o]);
                }
              }
              return t.schemaUrl != null && (e.schemaUrl = String(t.schemaUrl)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.logRecords = []), e.defaults && (o.scope = null, o.schemaUrl = ""), t.scope != null && t.hasOwnProperty("scope") && (o.scope = s.opentelemetry.proto.common.v1.InstrumentationScope.toObject(t.scope, e)), t.logRecords && t.logRecords.length) {
                o.logRecords = [];
                for (var n = 0; n < t.logRecords.length; ++n)
                  o.logRecords[n] = s.opentelemetry.proto.logs.v1.LogRecord.toObject(t.logRecords[n], e);
              }
              return t.schemaUrl != null && t.hasOwnProperty("schemaUrl") && (o.schemaUrl = t.schemaUrl), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.logs.v1.ScopeLogs";
            }, i;
          })(), g.SeverityNumber = (function() {
            var i = {}, t = Object.create(i);
            return t[i[0] = "SEVERITY_NUMBER_UNSPECIFIED"] = 0, t[i[1] = "SEVERITY_NUMBER_TRACE"] = 1, t[i[2] = "SEVERITY_NUMBER_TRACE2"] = 2, t[i[3] = "SEVERITY_NUMBER_TRACE3"] = 3, t[i[4] = "SEVERITY_NUMBER_TRACE4"] = 4, t[i[5] = "SEVERITY_NUMBER_DEBUG"] = 5, t[i[6] = "SEVERITY_NUMBER_DEBUG2"] = 6, t[i[7] = "SEVERITY_NUMBER_DEBUG3"] = 7, t[i[8] = "SEVERITY_NUMBER_DEBUG4"] = 8, t[i[9] = "SEVERITY_NUMBER_INFO"] = 9, t[i[10] = "SEVERITY_NUMBER_INFO2"] = 10, t[i[11] = "SEVERITY_NUMBER_INFO3"] = 11, t[i[12] = "SEVERITY_NUMBER_INFO4"] = 12, t[i[13] = "SEVERITY_NUMBER_WARN"] = 13, t[i[14] = "SEVERITY_NUMBER_WARN2"] = 14, t[i[15] = "SEVERITY_NUMBER_WARN3"] = 15, t[i[16] = "SEVERITY_NUMBER_WARN4"] = 16, t[i[17] = "SEVERITY_NUMBER_ERROR"] = 17, t[i[18] = "SEVERITY_NUMBER_ERROR2"] = 18, t[i[19] = "SEVERITY_NUMBER_ERROR3"] = 19, t[i[20] = "SEVERITY_NUMBER_ERROR4"] = 20, t[i[21] = "SEVERITY_NUMBER_FATAL"] = 21, t[i[22] = "SEVERITY_NUMBER_FATAL2"] = 22, t[i[23] = "SEVERITY_NUMBER_FATAL3"] = 23, t[i[24] = "SEVERITY_NUMBER_FATAL4"] = 24, t;
          })(), g.LogRecordFlags = (function() {
            var i = {}, t = Object.create(i);
            return t[i[0] = "LOG_RECORD_FLAGS_DO_NOT_USE"] = 0, t[i[255] = "LOG_RECORD_FLAGS_TRACE_FLAGS_MASK"] = 255, t;
          })(), g.LogRecord = (function() {
            function i(t) {
              if (this.attributes = [], t)
                for (var e = Object.keys(t), o = 0; o < e.length; ++o)
                  t[e[o]] != null && (this[e[o]] = t[e[o]]);
            }
            return i.prototype.timeUnixNano = null, i.prototype.observedTimeUnixNano = null, i.prototype.severityNumber = null, i.prototype.severityText = null, i.prototype.body = null, i.prototype.attributes = u.emptyArray, i.prototype.droppedAttributesCount = null, i.prototype.flags = null, i.prototype.traceId = null, i.prototype.spanId = null, i.create = function(t) {
              return new i(t);
            }, i.encode = function(t, e) {
              if (e || (e = d.create()), t.timeUnixNano != null && Object.hasOwnProperty.call(t, "timeUnixNano") && e.uint32(
                /* id 1, wireType 1 =*/
                9
              ).fixed64(t.timeUnixNano), t.severityNumber != null && Object.hasOwnProperty.call(t, "severityNumber") && e.uint32(
                /* id 2, wireType 0 =*/
                16
              ).int32(t.severityNumber), t.severityText != null && Object.hasOwnProperty.call(t, "severityText") && e.uint32(
                /* id 3, wireType 2 =*/
                26
              ).string(t.severityText), t.body != null && Object.hasOwnProperty.call(t, "body") && s.opentelemetry.proto.common.v1.AnyValue.encode(t.body, e.uint32(
                /* id 5, wireType 2 =*/
                42
              ).fork()).ldelim(), t.attributes != null && t.attributes.length)
                for (var o = 0; o < t.attributes.length; ++o)
                  s.opentelemetry.proto.common.v1.KeyValue.encode(t.attributes[o], e.uint32(
                    /* id 6, wireType 2 =*/
                    50
                  ).fork()).ldelim();
              return t.droppedAttributesCount != null && Object.hasOwnProperty.call(t, "droppedAttributesCount") && e.uint32(
                /* id 7, wireType 0 =*/
                56
              ).uint32(t.droppedAttributesCount), t.flags != null && Object.hasOwnProperty.call(t, "flags") && e.uint32(
                /* id 8, wireType 5 =*/
                69
              ).fixed32(t.flags), t.traceId != null && Object.hasOwnProperty.call(t, "traceId") && e.uint32(
                /* id 9, wireType 2 =*/
                74
              ).bytes(t.traceId), t.spanId != null && Object.hasOwnProperty.call(t, "spanId") && e.uint32(
                /* id 10, wireType 2 =*/
                82
              ).bytes(t.spanId), t.observedTimeUnixNano != null && Object.hasOwnProperty.call(t, "observedTimeUnixNano") && e.uint32(
                /* id 11, wireType 1 =*/
                89
              ).fixed64(t.observedTimeUnixNano), e;
            }, i.encodeDelimited = function(t, e) {
              return this.encode(t, e).ldelim();
            }, i.decode = function(t, e) {
              t instanceof l || (t = l.create(t));
              for (var o = e === void 0 ? t.len : t.pos + e, n = new s.opentelemetry.proto.logs.v1.LogRecord(); t.pos < o; ) {
                var c = t.uint32();
                switch (c >>> 3) {
                  case 1: {
                    n.timeUnixNano = t.fixed64();
                    break;
                  }
                  case 11: {
                    n.observedTimeUnixNano = t.fixed64();
                    break;
                  }
                  case 2: {
                    n.severityNumber = t.int32();
                    break;
                  }
                  case 3: {
                    n.severityText = t.string();
                    break;
                  }
                  case 5: {
                    n.body = s.opentelemetry.proto.common.v1.AnyValue.decode(t, t.uint32());
                    break;
                  }
                  case 6: {
                    n.attributes && n.attributes.length || (n.attributes = []), n.attributes.push(s.opentelemetry.proto.common.v1.KeyValue.decode(t, t.uint32()));
                    break;
                  }
                  case 7: {
                    n.droppedAttributesCount = t.uint32();
                    break;
                  }
                  case 8: {
                    n.flags = t.fixed32();
                    break;
                  }
                  case 9: {
                    n.traceId = t.bytes();
                    break;
                  }
                  case 10: {
                    n.spanId = t.bytes();
                    break;
                  }
                  default:
                    t.skipType(c & 7);
                    break;
                }
              }
              return n;
            }, i.decodeDelimited = function(t) {
              return t instanceof l || (t = new l(t)), this.decode(t, t.uint32());
            }, i.verify = function(t) {
              if (typeof t != "object" || t === null)
                return "object expected";
              if (t.timeUnixNano != null && t.hasOwnProperty("timeUnixNano") && !u.isInteger(t.timeUnixNano) && !(t.timeUnixNano && u.isInteger(t.timeUnixNano.low) && u.isInteger(t.timeUnixNano.high)))
                return "timeUnixNano: integer|Long expected";
              if (t.observedTimeUnixNano != null && t.hasOwnProperty("observedTimeUnixNano") && !u.isInteger(t.observedTimeUnixNano) && !(t.observedTimeUnixNano && u.isInteger(t.observedTimeUnixNano.low) && u.isInteger(t.observedTimeUnixNano.high)))
                return "observedTimeUnixNano: integer|Long expected";
              if (t.severityNumber != null && t.hasOwnProperty("severityNumber"))
                switch (t.severityNumber) {
                  default:
                    return "severityNumber: enum value expected";
                  case 0:
                  case 1:
                  case 2:
                  case 3:
                  case 4:
                  case 5:
                  case 6:
                  case 7:
                  case 8:
                  case 9:
                  case 10:
                  case 11:
                  case 12:
                  case 13:
                  case 14:
                  case 15:
                  case 16:
                  case 17:
                  case 18:
                  case 19:
                  case 20:
                  case 21:
                  case 22:
                  case 23:
                  case 24:
                    break;
                }
              if (t.severityText != null && t.hasOwnProperty("severityText") && !u.isString(t.severityText))
                return "severityText: string expected";
              if (t.body != null && t.hasOwnProperty("body")) {
                var e = s.opentelemetry.proto.common.v1.AnyValue.verify(t.body);
                if (e)
                  return "body." + e;
              }
              if (t.attributes != null && t.hasOwnProperty("attributes")) {
                if (!Array.isArray(t.attributes))
                  return "attributes: array expected";
                for (var o = 0; o < t.attributes.length; ++o) {
                  var e = s.opentelemetry.proto.common.v1.KeyValue.verify(t.attributes[o]);
                  if (e)
                    return "attributes." + e;
                }
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && !u.isInteger(t.droppedAttributesCount) ? "droppedAttributesCount: integer expected" : t.flags != null && t.hasOwnProperty("flags") && !u.isInteger(t.flags) ? "flags: integer expected" : t.traceId != null && t.hasOwnProperty("traceId") && !(t.traceId && typeof t.traceId.length == "number" || u.isString(t.traceId)) ? "traceId: buffer expected" : t.spanId != null && t.hasOwnProperty("spanId") && !(t.spanId && typeof t.spanId.length == "number" || u.isString(t.spanId)) ? "spanId: buffer expected" : null;
            }, i.fromObject = function(t) {
              if (t instanceof s.opentelemetry.proto.logs.v1.LogRecord)
                return t;
              var e = new s.opentelemetry.proto.logs.v1.LogRecord();
              switch (t.timeUnixNano != null && (u.Long ? (e.timeUnixNano = u.Long.fromValue(t.timeUnixNano)).unsigned = !1 : typeof t.timeUnixNano == "string" ? e.timeUnixNano = parseInt(t.timeUnixNano, 10) : typeof t.timeUnixNano == "number" ? e.timeUnixNano = t.timeUnixNano : typeof t.timeUnixNano == "object" && (e.timeUnixNano = new u.LongBits(t.timeUnixNano.low >>> 0, t.timeUnixNano.high >>> 0).toNumber())), t.observedTimeUnixNano != null && (u.Long ? (e.observedTimeUnixNano = u.Long.fromValue(t.observedTimeUnixNano)).unsigned = !1 : typeof t.observedTimeUnixNano == "string" ? e.observedTimeUnixNano = parseInt(t.observedTimeUnixNano, 10) : typeof t.observedTimeUnixNano == "number" ? e.observedTimeUnixNano = t.observedTimeUnixNano : typeof t.observedTimeUnixNano == "object" && (e.observedTimeUnixNano = new u.LongBits(t.observedTimeUnixNano.low >>> 0, t.observedTimeUnixNano.high >>> 0).toNumber())), t.severityNumber) {
                default:
                  if (typeof t.severityNumber == "number") {
                    e.severityNumber = t.severityNumber;
                    break;
                  }
                  break;
                case "SEVERITY_NUMBER_UNSPECIFIED":
                case 0:
                  e.severityNumber = 0;
                  break;
                case "SEVERITY_NUMBER_TRACE":
                case 1:
                  e.severityNumber = 1;
                  break;
                case "SEVERITY_NUMBER_TRACE2":
                case 2:
                  e.severityNumber = 2;
                  break;
                case "SEVERITY_NUMBER_TRACE3":
                case 3:
                  e.severityNumber = 3;
                  break;
                case "SEVERITY_NUMBER_TRACE4":
                case 4:
                  e.severityNumber = 4;
                  break;
                case "SEVERITY_NUMBER_DEBUG":
                case 5:
                  e.severityNumber = 5;
                  break;
                case "SEVERITY_NUMBER_DEBUG2":
                case 6:
                  e.severityNumber = 6;
                  break;
                case "SEVERITY_NUMBER_DEBUG3":
                case 7:
                  e.severityNumber = 7;
                  break;
                case "SEVERITY_NUMBER_DEBUG4":
                case 8:
                  e.severityNumber = 8;
                  break;
                case "SEVERITY_NUMBER_INFO":
                case 9:
                  e.severityNumber = 9;
                  break;
                case "SEVERITY_NUMBER_INFO2":
                case 10:
                  e.severityNumber = 10;
                  break;
                case "SEVERITY_NUMBER_INFO3":
                case 11:
                  e.severityNumber = 11;
                  break;
                case "SEVERITY_NUMBER_INFO4":
                case 12:
                  e.severityNumber = 12;
                  break;
                case "SEVERITY_NUMBER_WARN":
                case 13:
                  e.severityNumber = 13;
                  break;
                case "SEVERITY_NUMBER_WARN2":
                case 14:
                  e.severityNumber = 14;
                  break;
                case "SEVERITY_NUMBER_WARN3":
                case 15:
                  e.severityNumber = 15;
                  break;
                case "SEVERITY_NUMBER_WARN4":
                case 16:
                  e.severityNumber = 16;
                  break;
                case "SEVERITY_NUMBER_ERROR":
                case 17:
                  e.severityNumber = 17;
                  break;
                case "SEVERITY_NUMBER_ERROR2":
                case 18:
                  e.severityNumber = 18;
                  break;
                case "SEVERITY_NUMBER_ERROR3":
                case 19:
                  e.severityNumber = 19;
                  break;
                case "SEVERITY_NUMBER_ERROR4":
                case 20:
                  e.severityNumber = 20;
                  break;
                case "SEVERITY_NUMBER_FATAL":
                case 21:
                  e.severityNumber = 21;
                  break;
                case "SEVERITY_NUMBER_FATAL2":
                case 22:
                  e.severityNumber = 22;
                  break;
                case "SEVERITY_NUMBER_FATAL3":
                case 23:
                  e.severityNumber = 23;
                  break;
                case "SEVERITY_NUMBER_FATAL4":
                case 24:
                  e.severityNumber = 24;
                  break;
              }
              if (t.severityText != null && (e.severityText = String(t.severityText)), t.body != null) {
                if (typeof t.body != "object")
                  throw TypeError(".opentelemetry.proto.logs.v1.LogRecord.body: object expected");
                e.body = s.opentelemetry.proto.common.v1.AnyValue.fromObject(t.body);
              }
              if (t.attributes) {
                if (!Array.isArray(t.attributes))
                  throw TypeError(".opentelemetry.proto.logs.v1.LogRecord.attributes: array expected");
                e.attributes = [];
                for (var o = 0; o < t.attributes.length; ++o) {
                  if (typeof t.attributes[o] != "object")
                    throw TypeError(".opentelemetry.proto.logs.v1.LogRecord.attributes: object expected");
                  e.attributes[o] = s.opentelemetry.proto.common.v1.KeyValue.fromObject(t.attributes[o]);
                }
              }
              return t.droppedAttributesCount != null && (e.droppedAttributesCount = t.droppedAttributesCount >>> 0), t.flags != null && (e.flags = t.flags >>> 0), t.traceId != null && (typeof t.traceId == "string" ? u.base64.decode(t.traceId, e.traceId = u.newBuffer(u.base64.length(t.traceId)), 0) : t.traceId.length >= 0 && (e.traceId = t.traceId)), t.spanId != null && (typeof t.spanId == "string" ? u.base64.decode(t.spanId, e.spanId = u.newBuffer(u.base64.length(t.spanId)), 0) : t.spanId.length >= 0 && (e.spanId = t.spanId)), e;
            }, i.toObject = function(t, e) {
              e || (e = {});
              var o = {};
              if ((e.arrays || e.defaults) && (o.attributes = []), e.defaults) {
                if (u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.timeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.timeUnixNano = e.longs === String ? "0" : 0;
                if (o.severityNumber = e.enums === String ? "SEVERITY_NUMBER_UNSPECIFIED" : 0, o.severityText = "", o.body = null, o.droppedAttributesCount = 0, o.flags = 0, e.bytes === String ? o.traceId = "" : (o.traceId = [], e.bytes !== Array && (o.traceId = u.newBuffer(o.traceId))), e.bytes === String ? o.spanId = "" : (o.spanId = [], e.bytes !== Array && (o.spanId = u.newBuffer(o.spanId))), u.Long) {
                  var n = new u.Long(0, 0, !1);
                  o.observedTimeUnixNano = e.longs === String ? n.toString() : e.longs === Number ? n.toNumber() : n;
                } else
                  o.observedTimeUnixNano = e.longs === String ? "0" : 0;
              }
              if (t.timeUnixNano != null && t.hasOwnProperty("timeUnixNano") && (typeof t.timeUnixNano == "number" ? o.timeUnixNano = e.longs === String ? String(t.timeUnixNano) : t.timeUnixNano : o.timeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.timeUnixNano) : e.longs === Number ? new u.LongBits(t.timeUnixNano.low >>> 0, t.timeUnixNano.high >>> 0).toNumber() : t.timeUnixNano), t.severityNumber != null && t.hasOwnProperty("severityNumber") && (o.severityNumber = e.enums === String ? s.opentelemetry.proto.logs.v1.SeverityNumber[t.severityNumber] === void 0 ? t.severityNumber : s.opentelemetry.proto.logs.v1.SeverityNumber[t.severityNumber] : t.severityNumber), t.severityText != null && t.hasOwnProperty("severityText") && (o.severityText = t.severityText), t.body != null && t.hasOwnProperty("body") && (o.body = s.opentelemetry.proto.common.v1.AnyValue.toObject(t.body, e)), t.attributes && t.attributes.length) {
                o.attributes = [];
                for (var c = 0; c < t.attributes.length; ++c)
                  o.attributes[c] = s.opentelemetry.proto.common.v1.KeyValue.toObject(t.attributes[c], e);
              }
              return t.droppedAttributesCount != null && t.hasOwnProperty("droppedAttributesCount") && (o.droppedAttributesCount = t.droppedAttributesCount), t.flags != null && t.hasOwnProperty("flags") && (o.flags = t.flags), t.traceId != null && t.hasOwnProperty("traceId") && (o.traceId = e.bytes === String ? u.base64.encode(t.traceId, 0, t.traceId.length) : e.bytes === Array ? Array.prototype.slice.call(t.traceId) : t.traceId), t.spanId != null && t.hasOwnProperty("spanId") && (o.spanId = e.bytes === String ? u.base64.encode(t.spanId, 0, t.spanId.length) : e.bytes === Array ? Array.prototype.slice.call(t.spanId) : t.spanId), t.observedTimeUnixNano != null && t.hasOwnProperty("observedTimeUnixNano") && (typeof t.observedTimeUnixNano == "number" ? o.observedTimeUnixNano = e.longs === String ? String(t.observedTimeUnixNano) : t.observedTimeUnixNano : o.observedTimeUnixNano = e.longs === String ? u.Long.prototype.toString.call(t.observedTimeUnixNano) : e.longs === Number ? new u.LongBits(t.observedTimeUnixNano.low >>> 0, t.observedTimeUnixNano.high >>> 0).toNumber() : t.observedTimeUnixNano), o;
            }, i.prototype.toJSON = function() {
              return this.constructor.toObject(this, m.util.toJSONOptions);
            }, i.getTypeUrl = function(t) {
              return t === void 0 && (t = "type.googleapis.com"), t + "/opentelemetry.proto.logs.v1.LogRecord";
            }, i;
          })(), g;
        })(), b;
      })(), y;
    })(), p;
  })(), root = s, root;
}
var rootExports = /* @__PURE__ */ requireRoot();
function hrTimeToNanos(m) {
  var l = BigInt(1e9);
  return BigInt(m[0]) * l + BigInt(m[1]);
}
function toLongBits(m) {
  var l = Number(BigInt.asUintN(32, m)), d = Number(BigInt.asUintN(32, m >> BigInt(32)));
  return { low: l, high: d };
}
function encodeAsLongBits(m) {
  var l = hrTimeToNanos(m);
  return toLongBits(l);
}
function optionalHexToBinary(m) {
  if (m !== void 0)
    return A(m);
}
var DEFAULT_ENCODER = {
  encodeHrTime: encodeAsLongBits,
  encodeSpanContext: A,
  encodeOptionalSpanContext: optionalHexToBinary
};
function getOtlpEncoder(m) {
  return DEFAULT_ENCODER;
}
var __read$3 = function(m, l) {
  var d = typeof Symbol == "function" && m[Symbol.iterator];
  if (!d) return m;
  var u = d.call(m), s, p = [], y;
  try {
    for (; (l === void 0 || l-- > 0) && !(s = u.next()).done; ) p.push(s.value);
  } catch (b) {
    y = { error: b };
  } finally {
    try {
      s && !s.done && (d = u.return) && d.call(u);
    } finally {
      if (y) throw y.error;
    }
  }
  return p;
};
function createResource(m) {
  return {
    attributes: toAttributes(m.attributes),
    droppedAttributesCount: 0
  };
}
function createInstrumentationScope(m) {
  return {
    name: m.name,
    version: m.version
  };
}
function toAttributes(m) {
  return Object.keys(m).map(function(l) {
    return toKeyValue(l, m[l]);
  });
}
function toKeyValue(m, l) {
  return {
    key: m,
    value: toAnyValue(l)
  };
}
function toAnyValue(m) {
  var l = typeof m;
  return l === "string" ? { stringValue: m } : l === "number" ? Number.isInteger(m) ? { intValue: m } : { doubleValue: m } : l === "boolean" ? { boolValue: m } : m instanceof Uint8Array ? { bytesValue: m } : Array.isArray(m) ? { arrayValue: { values: m.map(toAnyValue) } } : l === "object" && m != null ? {
    kvlistValue: {
      values: Object.entries(m).map(function(d) {
        var u = __read$3(d, 2), s = u[0], p = u[1];
        return toKeyValue(s, p);
      })
    }
  } : {};
}
var __values = function(m) {
  var l = typeof Symbol == "function" && Symbol.iterator, d = l && m[l], u = 0;
  if (d) return d.call(m);
  if (m && typeof m.length == "number") return {
    next: function() {
      return m && u >= m.length && (m = void 0), { value: m && m[u++], done: !m };
    }
  };
  throw new TypeError(l ? "Object is not iterable." : "Symbol.iterator is not defined.");
}, __read$2 = function(m, l) {
  var d = typeof Symbol == "function" && m[Symbol.iterator];
  if (!d) return m;
  var u = d.call(m), s, p = [], y;
  try {
    for (; (l === void 0 || l-- > 0) && !(s = u.next()).done; ) p.push(s.value);
  } catch (b) {
    y = { error: b };
  } finally {
    try {
      s && !s.done && (d = u.return) && d.call(u);
    } finally {
      if (y) throw y.error;
    }
  }
  return p;
};
function sdkSpanToOtlpSpan(m, l) {
  var d, u = m.spanContext(), s = m.status;
  return {
    traceId: l.encodeSpanContext(u.traceId),
    spanId: l.encodeSpanContext(u.spanId),
    parentSpanId: l.encodeOptionalSpanContext(m.parentSpanId),
    traceState: (d = u.traceState) === null || d === void 0 ? void 0 : d.serialize(),
    name: m.name,
    // Span kind is offset by 1 because the API does not define a value for unset
    kind: m.kind == null ? 0 : m.kind + 1,
    startTimeUnixNano: l.encodeHrTime(m.startTime),
    endTimeUnixNano: l.encodeHrTime(m.endTime),
    attributes: toAttributes(m.attributes),
    droppedAttributesCount: m.droppedAttributesCount,
    events: m.events.map(function(p) {
      return toOtlpSpanEvent(p, l);
    }),
    droppedEventsCount: m.droppedEventsCount,
    status: {
      // API and proto enums share the same values
      code: s.code,
      message: s.message
    },
    links: m.links.map(function(p) {
      return toOtlpLink(p, l);
    }),
    droppedLinksCount: m.droppedLinksCount
  };
}
function toOtlpLink(m, l) {
  var d;
  return {
    attributes: m.attributes ? toAttributes(m.attributes) : [],
    spanId: l.encodeSpanContext(m.context.spanId),
    traceId: l.encodeSpanContext(m.context.traceId),
    traceState: (d = m.context.traceState) === null || d === void 0 ? void 0 : d.serialize(),
    droppedAttributesCount: m.droppedAttributesCount || 0
  };
}
function toOtlpSpanEvent(m, l) {
  return {
    attributes: m.attributes ? toAttributes(m.attributes) : [],
    name: m.name,
    timeUnixNano: l.encodeHrTime(m.time),
    droppedAttributesCount: m.droppedAttributesCount || 0
  };
}
function createExportTraceServiceRequest(m, l) {
  var d = getOtlpEncoder();
  return {
    resourceSpans: spanRecordsToResourceSpans(m, d)
  };
}
function createResourceMap(m) {
  var l, d, u = /* @__PURE__ */ new Map();
  try {
    for (var s = __values(m), p = s.next(); !p.done; p = s.next()) {
      var y = p.value, b = u.get(y.resource);
      b || (b = /* @__PURE__ */ new Map(), u.set(y.resource, b));
      var g = y.instrumentationLibrary.name + "@" + (y.instrumentationLibrary.version || "") + ":" + (y.instrumentationLibrary.schemaUrl || ""), i = b.get(g);
      i || (i = [], b.set(g, i)), i.push(y);
    }
  } catch (t) {
    l = { error: t };
  } finally {
    try {
      p && !p.done && (d = s.return) && d.call(s);
    } finally {
      if (l) throw l.error;
    }
  }
  return u;
}
function spanRecordsToResourceSpans(m, l) {
  for (var d = createResourceMap(m), u = [], s = d.entries(), p = s.next(); !p.done; ) {
    for (var y = __read$2(p.value, 2), b = y[0], g = y[1], i = [], t = g.values(), e = t.next(); !e.done; ) {
      var o = e.value;
      if (o.length > 0) {
        var n = o.map(function(h) {
          return sdkSpanToOtlpSpan(h, l);
        });
        i.push({
          scope: createInstrumentationScope(o[0].instrumentationLibrary),
          spans: n,
          schemaUrl: o[0].instrumentationLibrary.schemaUrl
        });
      }
      e = t.next();
    }
    var c = {
      resource: createResource(b),
      scopeSpans: i,
      schemaUrl: void 0
    };
    u.push(c), p = s.next();
  }
  return u;
}
var traceResponseType = rootExports.opentelemetry.proto.collector.trace.v1.ExportTraceServiceResponse, traceRequestType = rootExports.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest, ProtobufTraceSerializer = {
  serializeRequest: function(m) {
    var l = createExportTraceServiceRequest(m);
    return traceRequestType.encode(l).finish();
  },
  deserializeResponse: function(m) {
    return traceResponseType.decode(m);
  }
}, __awaiter = function(m, l, d, u) {
  function s(p) {
    return p instanceof d ? p : new d(function(y) {
      y(p);
    });
  }
  return new (d || (d = Promise))(function(p, y) {
    function b(t) {
      try {
        i(u.next(t));
      } catch (e) {
        y(e);
      }
    }
    function g(t) {
      try {
        i(u.throw(t));
      } catch (e) {
        y(e);
      }
    }
    function i(t) {
      t.done ? p(t.value) : s(t.value).then(b, g);
    }
    i((u = u.apply(m, [])).next());
  });
}, __generator = function(m, l) {
  var d = { label: 0, sent: function() {
    if (p[0] & 1) throw p[1];
    return p[1];
  }, trys: [], ops: [] }, u, s, p, y;
  return y = { next: b(0), throw: b(1), return: b(2) }, typeof Symbol == "function" && (y[Symbol.iterator] = function() {
    return this;
  }), y;
  function b(i) {
    return function(t) {
      return g([i, t]);
    };
  }
  function g(i) {
    if (u) throw new TypeError("Generator is already executing.");
    for (; d; ) try {
      if (u = 1, s && (p = i[0] & 2 ? s.return : i[0] ? s.throw || ((p = s.return) && p.call(s), 0) : s.next) && !(p = p.call(s, i[1])).done) return p;
      switch (s = 0, p && (i = [i[0] & 2, p.value]), i[0]) {
        case 0:
        case 1:
          p = i;
          break;
        case 4:
          return d.label++, { value: i[1], done: !1 };
        case 5:
          d.label++, s = i[1], i = [0];
          continue;
        case 7:
          i = d.ops.pop(), d.trys.pop();
          continue;
        default:
          if (p = d.trys, !(p = p.length > 0 && p[p.length - 1]) && (i[0] === 6 || i[0] === 2)) {
            d = 0;
            continue;
          }
          if (i[0] === 3 && (!p || i[1] > p[0] && i[1] < p[3])) {
            d.label = i[1];
            break;
          }
          if (i[0] === 6 && d.label < p[1]) {
            d.label = p[1], p = i;
            break;
          }
          if (p && d.label < p[2]) {
            d.label = p[2], d.ops.push(i);
            break;
          }
          p[2] && d.ops.pop(), d.trys.pop();
          continue;
      }
      i = l.call(m, d);
    } catch (t) {
      i = [6, t], s = 0;
    } finally {
      u = p = 0;
    }
    if (i[0] & 5) throw i[1];
    return { value: i[0] ? i[1] : void 0, done: !0 };
  }
}, MAX_ATTEMPTS = 5, INITIAL_BACKOFF = 1e3, MAX_BACKOFF = 5e3, BACKOFF_MULTIPLIER = 1.5, JITTER = 0.2;
function getJitter() {
  return Math.random() * (2 * JITTER) - JITTER;
}
var RetryingTransport = (
  /** @class */
  (function() {
    function m(l) {
      this._transport = l;
    }
    return m.prototype.retry = function(l, d, u) {
      var s = this;
      return new Promise(function(p, y) {
        setTimeout(function() {
          s._transport.send(l, d).then(p, y);
        }, u);
      });
    }, m.prototype.send = function(l, d) {
      var u;
      return __awaiter(this, void 0, void 0, function() {
        var s, p, y, b, g, i, t;
        return __generator(this, function(e) {
          switch (e.label) {
            case 0:
              return s = Date.now() + d, [4, this._transport.send(l, d)];
            case 1:
              p = e.sent(), y = MAX_ATTEMPTS, b = INITIAL_BACKOFF, e.label = 2;
            case 2:
              return p.status === "retryable" && y > 0 ? (y--, g = Math.max(Math.min(b, MAX_BACKOFF) + getJitter(), 0), b = b * BACKOFF_MULTIPLIER, i = (u = p.retryInMillis) !== null && u !== void 0 ? u : g, t = s - Date.now(), i > t ? [2, p] : [4, this.retry(l, t, i)]) : [3, 4];
            case 3:
              return p = e.sent(), [3, 2];
            case 4:
              return [2, p];
          }
        });
      });
    }, m.prototype.shutdown = function() {
      return this._transport.shutdown();
    }, m;
  })()
);
function createRetryingTransport(m) {
  return new RetryingTransport(m.transport);
}
function isExportRetryable(m) {
  var l = [429, 502, 503, 504];
  return l.includes(m);
}
function parseRetryAfterToMills(m) {
  if (m != null) {
    var l = Number.parseInt(m, 10);
    if (Number.isInteger(l))
      return l > 0 ? l * 1e3 : -1;
    var d = new Date(m).getTime() - Date.now();
    return d >= 0 ? d : 0;
  }
}
var __read$1 = function(m, l) {
  var d = typeof Symbol == "function" && m[Symbol.iterator];
  if (!d) return m;
  var u = d.call(m), s, p = [], y;
  try {
    for (; (l === void 0 || l-- > 0) && !(s = u.next()).done; ) p.push(s.value);
  } catch (b) {
    y = { error: b };
  } finally {
    try {
      s && !s.done && (d = u.return) && d.call(u);
    } finally {
      if (y) throw y.error;
    }
  }
  return p;
}, XhrTransport = (
  /** @class */
  (function() {
    function m(l) {
      this._parameters = l;
    }
    return m.prototype.send = function(l, d) {
      var u = this;
      return new Promise(function(s) {
        var p = new XMLHttpRequest();
        p.timeout = d, p.open("POST", u._parameters.url);
        var y = u._parameters.headers();
        Object.entries(y).forEach(function(b) {
          var g = __read$1(b, 2), i = g[0], t = g[1];
          p.setRequestHeader(i, t);
        }), p.ontimeout = function(b) {
          s({
            status: "failure",
            error: new Error("XHR request timed out")
          });
        }, p.onreadystatechange = function() {
          p.status >= 200 && p.status <= 299 ? (r.debug("XHR success"), s({
            status: "success"
          })) : p.status && isExportRetryable(p.status) ? s({
            status: "retryable",
            retryInMillis: parseRetryAfterToMills(p.getResponseHeader("Retry-After"))
          }) : p.status !== 0 && s({
            status: "failure",
            error: new Error("XHR request failed with non-retryable status")
          });
        }, p.onabort = function() {
          s({
            status: "failure",
            error: new Error("XHR request aborted")
          });
        }, p.onerror = function() {
          s({
            status: "failure",
            error: new Error("XHR request errored")
          });
        }, p.send(l);
      });
    }, m.prototype.shutdown = function() {
    }, m;
  })()
);
function createXhrTransport(m) {
  return new XhrTransport(m);
}
var SendBeaconTransport = (
  /** @class */
  (function() {
    function m(l) {
      this._params = l;
    }
    return m.prototype.send = function(l) {
      var d = this;
      return new Promise(function(u) {
        navigator.sendBeacon(d._params.url, new Blob([l], { type: d._params.blobType })) ? (r.debug("SendBeacon success"), u({
          status: "success"
        })) : u({
          status: "failure",
          error: new Error("SendBeacon failed")
        });
      });
    }, m.prototype.shutdown = function() {
    }, m;
  })()
);
function createSendBeaconTransport(m) {
  return new SendBeaconTransport(m);
}
function createOtlpXhrExportDelegate(m, l) {
  return createOtlpNetworkExportDelegate(m, l, createRetryingTransport({
    transport: createXhrTransport(m)
  }));
}
function createOtlpSendBeaconExportDelegate(m, l) {
  return createOtlpNetworkExportDelegate(m, l, createRetryingTransport({
    transport: createSendBeaconTransport({
      url: m.url,
      blobType: m.headers()["Content-Type"]
    })
  }));
}
var __read = function(m, l) {
  var d = typeof Symbol == "function" && m[Symbol.iterator];
  if (!d) return m;
  var u = d.call(m), s, p = [], y;
  try {
    for (; (l === void 0 || l-- > 0) && !(s = u.next()).done; ) p.push(s.value);
  } catch (b) {
    y = { error: b };
  } finally {
    try {
      s && !s.done && (d = u.return) && d.call(u);
    } finally {
      if (y) throw y.error;
    }
  }
  return p;
};
function validateAndNormalizeHeaders(m) {
  return function() {
    var l, d = {};
    return Object.entries((l = m?.()) !== null && l !== void 0 ? l : {}).forEach(function(u) {
      var s = __read(u, 2), p = s[0], y = s[1];
      typeof y < "u" ? d[p] = String(y) : r.warn('Header "' + p + '" has invalid value (' + y + ") and will be ignored");
    }), d;
  };
}
var __assign = function() {
  return __assign = Object.assign || function(m) {
    for (var l, d = 1, u = arguments.length; d < u; d++) {
      l = arguments[d];
      for (var s in l) Object.prototype.hasOwnProperty.call(l, s) && (m[s] = l[s]);
    }
    return m;
  }, __assign.apply(this, arguments);
};
function mergeHeaders(m, l, d) {
  var u = __assign({}, d()), s = {};
  return function() {
    return l != null && Object.assign(s, l()), m != null && Object.assign(s, m()), Object.assign(s, u);
  };
}
function validateUserProvidedUrl(m) {
  if (m != null)
    try {
      return new URL(m), m;
    } catch {
      throw new Error("Configuration: Could not parse user-provided export URL: '" + m + "'");
    }
}
function mergeOtlpHttpConfigurationWithDefaults(m, l, d) {
  var u, s, p, y;
  return __assign(__assign({}, mergeOtlpSharedConfigurationWithDefaults(m, l, d)), { headers: mergeHeaders(validateAndNormalizeHeaders(m.headers), l.headers, d.headers), url: (s = (u = validateUserProvidedUrl(m.url)) !== null && u !== void 0 ? u : l.url) !== null && s !== void 0 ? s : d.url, agentOptions: (y = (p = m.agentOptions) !== null && p !== void 0 ? p : l.agentOptions) !== null && y !== void 0 ? y : d.agentOptions });
}
function getHttpConfigurationDefaults(m, l) {
  return __assign(__assign({}, getSharedConfigurationDefaults()), { headers: function() {
    return m;
  }, url: "http://localhost:4318/" + l, agentOptions: { keepAlive: !0 } });
}
function convertLegacyBrowserHttpOptions(m, l, d) {
  return mergeOtlpHttpConfigurationWithDefaults(
    {
      url: m.url,
      timeoutMillis: m.timeoutMillis,
      headers: wrapStaticHeadersInFunction(m.headers),
      concurrencyLimit: m.concurrencyLimit
    },
    {},
    // no fallback for browser case
    getHttpConfigurationDefaults(d, l)
  );
}
function createLegacyOtlpBrowserExportDelegate(m, l, d, u) {
  var s = !!m.headers || typeof navigator.sendBeacon != "function", p = convertLegacyBrowserHttpOptions(m, d, u);
  return s ? createOtlpXhrExportDelegate(p, l) : createOtlpSendBeaconExportDelegate(p, l);
}
var __extends = /* @__PURE__ */ (function() {
  var m = function(l, d) {
    return m = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(u, s) {
      u.__proto__ = s;
    } || function(u, s) {
      for (var p in s) Object.prototype.hasOwnProperty.call(s, p) && (u[p] = s[p]);
    }, m(l, d);
  };
  return function(l, d) {
    if (typeof d != "function" && d !== null)
      throw new TypeError("Class extends value " + String(d) + " is not a constructor or null");
    m(l, d);
    function u() {
      this.constructor = l;
    }
    l.prototype = d === null ? Object.create(d) : (u.prototype = d.prototype, new u());
  };
})(), DEFAULT_COLLECTOR_RESOURCE_PATH = "v1/traces", OTLPTraceExporter = (
  /** @class */
  (function(m) {
    __extends(l, m);
    function l(d) {
      return d === void 0 && (d = {}), m.call(this, createLegacyOtlpBrowserExportDelegate(d, ProtobufTraceSerializer, DEFAULT_COLLECTOR_RESOURCE_PATH, { "Content-Type": "application/x-protobuf" })) || this;
    }
    return l;
  })(OTLPExporterBase)
);
export {
  OTLPTraceExporter
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtQ2ZtSTNtU3MtIX57MDBrfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHIgfSBmcm9tICcuL2RpYWctYXBpLURDNGR4bHFaLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IGEsIEEgfSBmcm9tICcuL0V4cG9ydFJlc3VsdC1CYWNzcXdLQS0hfnswMGx9fi5qcyc7XG5pbXBvcnQgeyBmIH0gZnJvbSAnLi9fY29tbW9uanNIZWxwZXJzLUNkTEUxbzlmLSF+ezAwaH1+LmpzJztcblxudmFyIE9UTFBFeHBvcnRlckJhc2UgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIHAoYSkge1xuICAgICAgdGhpcy5fZGVsZWdhdGUgPSBhO1xuICAgIH1cbiAgICByZXR1cm4gcC5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24oYSwgcykge1xuICAgICAgdGhpcy5fZGVsZWdhdGUuZXhwb3J0KGEsIHMpO1xuICAgIH0sIHAucHJvdG90eXBlLmZvcmNlRmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5mb3JjZUZsdXNoKCk7XG4gICAgfSwgcC5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5zaHV0ZG93bigpO1xuICAgIH0sIHA7XG4gIH0pKClcbiksIF9fZXh0ZW5kcyQxID0gLyogQF9fUFVSRV9fICovIChmdW5jdGlvbigpIHtcbiAgdmFyIHAgPSBmdW5jdGlvbihhLCBzKSB7XG4gICAgcmV0dXJuIHAgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwgeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbihsLCB1KSB7XG4gICAgICBsLl9fcHJvdG9fXyA9IHU7XG4gICAgfSB8fCBmdW5jdGlvbihsLCB1KSB7XG4gICAgICBmb3IgKHZhciBmIGluIHUpIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh1LCBmKSAmJiAobFtmXSA9IHVbZl0pO1xuICAgIH0sIHAoYSwgcyk7XG4gIH07XG4gIHJldHVybiBmdW5jdGlvbihhLCBzKSB7XG4gICAgaWYgKHR5cGVvZiBzICE9IFwiZnVuY3Rpb25cIiAmJiBzICE9PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcocykgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xuICAgIHAoYSwgcyk7XG4gICAgZnVuY3Rpb24gbCgpIHtcbiAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBhO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZSA9IHMgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKHMpIDogKGwucHJvdG90eXBlID0gcy5wcm90b3R5cGUsIG5ldyBsKCkpO1xuICB9O1xufSkoKSwgT1RMUEV4cG9ydGVyRXJyb3IgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKHApIHtcbiAgICBfX2V4dGVuZHMkMShhLCBwKTtcbiAgICBmdW5jdGlvbiBhKHMsIGwsIHUpIHtcbiAgICAgIHZhciBmID0gcC5jYWxsKHRoaXMsIHMpIHx8IHRoaXM7XG4gICAgICByZXR1cm4gZi5uYW1lID0gXCJPVExQRXhwb3J0ZXJFcnJvclwiLCBmLmRhdGEgPSB1LCBmLmNvZGUgPSBsLCBmO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfSkoRXJyb3IpXG4pO1xuZnVuY3Rpb24gdmFsaWRhdGVUaW1lb3V0TWlsbGlzKHApIHtcbiAgaWYgKCFOdW1iZXIuaXNOYU4ocCkgJiYgTnVtYmVyLmlzRmluaXRlKHApICYmIHAgPiAwKVxuICAgIHJldHVybiBwO1xuICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWd1cmF0aW9uOiB0aW1lb3V0TWlsbGlzIGlzIGludmFsaWQsIGV4cGVjdGVkIG51bWJlciBncmVhdGVyIHRoYW4gMCAoYWN0dWFsOiAnXCIgKyBwICsgXCInKVwiKTtcbn1cbmZ1bmN0aW9uIHdyYXBTdGF0aWNIZWFkZXJzSW5GdW5jdGlvbihwKSB7XG4gIGlmIChwICE9IG51bGwpXG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHA7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIG1lcmdlT3RscFNoYXJlZENvbmZpZ3VyYXRpb25XaXRoRGVmYXVsdHMocCwgYSwgcykge1xuICB2YXIgbCwgdSwgZiwgZCwgeSwgaDtcbiAgcmV0dXJuIHtcbiAgICB0aW1lb3V0TWlsbGlzOiB2YWxpZGF0ZVRpbWVvdXRNaWxsaXMoKHUgPSAobCA9IHAudGltZW91dE1pbGxpcykgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwID8gbCA6IGEudGltZW91dE1pbGxpcykgIT09IG51bGwgJiYgdSAhPT0gdm9pZCAwID8gdSA6IHMudGltZW91dE1pbGxpcyksXG4gICAgY29uY3VycmVuY3lMaW1pdDogKGQgPSAoZiA9IHAuY29uY3VycmVuY3lMaW1pdCkgIT09IG51bGwgJiYgZiAhPT0gdm9pZCAwID8gZiA6IGEuY29uY3VycmVuY3lMaW1pdCkgIT09IG51bGwgJiYgZCAhPT0gdm9pZCAwID8gZCA6IHMuY29uY3VycmVuY3lMaW1pdCxcbiAgICBjb21wcmVzc2lvbjogKGggPSAoeSA9IHAuY29tcHJlc3Npb24pICE9PSBudWxsICYmIHkgIT09IHZvaWQgMCA/IHkgOiBhLmNvbXByZXNzaW9uKSAhPT0gbnVsbCAmJiBoICE9PSB2b2lkIDAgPyBoIDogcy5jb21wcmVzc2lvblxuICB9O1xufVxuZnVuY3Rpb24gZ2V0U2hhcmVkQ29uZmlndXJhdGlvbkRlZmF1bHRzKCkge1xuICByZXR1cm4ge1xuICAgIHRpbWVvdXRNaWxsaXM6IDFlNCxcbiAgICBjb25jdXJyZW5jeUxpbWl0OiAzMCxcbiAgICBjb21wcmVzc2lvbjogXCJub25lXCJcbiAgfTtcbn1cbnZhciBfX2F3YWl0ZXIkMiA9IGZ1bmN0aW9uKHAsIGEsIHMsIGwpIHtcbiAgZnVuY3Rpb24gdShmKSB7XG4gICAgcmV0dXJuIGYgaW5zdGFuY2VvZiBzID8gZiA6IG5ldyBzKGZ1bmN0aW9uKGQpIHtcbiAgICAgIGQoZik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyAocyB8fCAocyA9IFByb21pc2UpKShmdW5jdGlvbihmLCBkKSB7XG4gICAgZnVuY3Rpb24geShpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvKGwubmV4dChpKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGQoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGgoaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbyhsLnRocm93KGkpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICBpLmRvbmUgPyBmKGkudmFsdWUpIDogdShpLnZhbHVlKS50aGVuKHksIGgpO1xuICAgIH1cbiAgICBvKChsID0gbC5hcHBseShwLCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufSwgX19nZW5lcmF0b3IkMiA9IGZ1bmN0aW9uKHAsIGEpIHtcbiAgdmFyIHMgPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHtcbiAgICBpZiAoZlswXSAmIDEpIHRocm93IGZbMV07XG4gICAgcmV0dXJuIGZbMV07XG4gIH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGwsIHUsIGYsIGQ7XG4gIHJldHVybiBkID0geyBuZXh0OiB5KDApLCB0aHJvdzogeSgxKSwgcmV0dXJuOiB5KDIpIH0sIHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIChkW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfSksIGQ7XG4gIGZ1bmN0aW9uIHkobykge1xuICAgIHJldHVybiBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gaChbbywgaV0pO1xuICAgIH07XG4gIH1cbiAgZnVuY3Rpb24gaChvKSB7XG4gICAgaWYgKGwpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xuICAgIGZvciAoOyBzOyApIHRyeSB7XG4gICAgICBpZiAobCA9IDEsIHUgJiYgKGYgPSBvWzBdICYgMiA/IHUucmV0dXJuIDogb1swXSA/IHUudGhyb3cgfHwgKChmID0gdS5yZXR1cm4pICYmIGYuY2FsbCh1KSwgMCkgOiB1Lm5leHQpICYmICEoZiA9IGYuY2FsbCh1LCBvWzFdKSkuZG9uZSkgcmV0dXJuIGY7XG4gICAgICBzd2l0Y2ggKHUgPSAwLCBmICYmIChvID0gW29bMF0gJiAyLCBmLnZhbHVlXSksIG9bMF0pIHtcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgZiA9IG87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICByZXR1cm4gcy5sYWJlbCsrLCB7IHZhbHVlOiBvWzFdLCBkb25lOiAhMSB9O1xuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgcy5sYWJlbCsrLCB1ID0gb1sxXSwgbyA9IFswXTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY2FzZSA3OlxuICAgICAgICAgIG8gPSBzLm9wcy5wb3AoKSwgcy50cnlzLnBvcCgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGlmIChmID0gcy50cnlzLCAhKGYgPSBmLmxlbmd0aCA+IDAgJiYgZltmLmxlbmd0aCAtIDFdKSAmJiAob1swXSA9PT0gNiB8fCBvWzBdID09PSAyKSkge1xuICAgICAgICAgICAgcyA9IDA7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9bMF0gPT09IDMgJiYgKCFmIHx8IG9bMV0gPiBmWzBdICYmIG9bMV0gPCBmWzNdKSkge1xuICAgICAgICAgICAgcy5sYWJlbCA9IG9bMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG9bMF0gPT09IDYgJiYgcy5sYWJlbCA8IGZbMV0pIHtcbiAgICAgICAgICAgIHMubGFiZWwgPSBmWzFdLCBmID0gbztcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZiAmJiBzLmxhYmVsIDwgZlsyXSkge1xuICAgICAgICAgICAgcy5sYWJlbCA9IGZbMl0sIHMub3BzLnB1c2gobyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZlsyXSAmJiBzLm9wcy5wb3AoKSwgcy50cnlzLnBvcCgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbyA9IGEuY2FsbChwLCBzKTtcbiAgICB9IGNhdGNoIChpKSB7XG4gICAgICBvID0gWzYsIGldLCB1ID0gMDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgbCA9IGYgPSAwO1xuICAgIH1cbiAgICBpZiAob1swXSAmIDUpIHRocm93IG9bMV07XG4gICAgcmV0dXJuIHsgdmFsdWU6IG9bMF0gPyBvWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XG4gIH1cbn0sIEJvdW5kZWRRdWV1ZUV4cG9ydFByb21pc2VIYW5kbGVyID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBwKGEpIHtcbiAgICAgIHRoaXMuX3NlbmRpbmdQcm9taXNlcyA9IFtdLCB0aGlzLl9jb25jdXJyZW5jeUxpbWl0ID0gYTtcbiAgICB9XG4gICAgcmV0dXJuIHAucHJvdG90eXBlLnB1c2hQcm9taXNlID0gZnVuY3Rpb24oYSkge1xuICAgICAgdmFyIHMgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuaGFzUmVhY2hlZExpbWl0KCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbmN1cnJlbmN5IExpbWl0IHJlYWNoZWRcIik7XG4gICAgICB0aGlzLl9zZW5kaW5nUHJvbWlzZXMucHVzaChhKTtcbiAgICAgIHZhciBsID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1ID0gcy5fc2VuZGluZ1Byb21pc2VzLmluZGV4T2YoYSk7XG4gICAgICAgIHMuX3NlbmRpbmdQcm9taXNlcy5zcGxpY2UodSwgMSk7XG4gICAgICB9O1xuICAgICAgYS50aGVuKGwsIGwpO1xuICAgIH0sIHAucHJvdG90eXBlLmhhc1JlYWNoZWRMaW1pdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlbmRpbmdQcm9taXNlcy5sZW5ndGggPj0gdGhpcy5fY29uY3VycmVuY3lMaW1pdDtcbiAgICB9LCBwLnByb3RvdHlwZS5hd2FpdEFsbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIF9fYXdhaXRlciQyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yJDIodGhpcywgZnVuY3Rpb24oYSkge1xuICAgICAgICAgIHN3aXRjaCAoYS5sYWJlbCkge1xuICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICByZXR1cm4gWzQsIFByb21pc2UuYWxsKHRoaXMuX3NlbmRpbmdQcm9taXNlcyldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gYS5zZW50KCksIFtcbiAgICAgICAgICAgICAgICAyXG4gICAgICAgICAgICAgICAgLypyZXR1cm4qL1xuICAgICAgICAgICAgICBdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCBwO1xuICB9KSgpXG4pO1xuZnVuY3Rpb24gY3JlYXRlQm91bmRlZFF1ZXVlRXhwb3J0UHJvbWlzZUhhbmRsZXIocCkge1xuICByZXR1cm4gbmV3IEJvdW5kZWRRdWV1ZUV4cG9ydFByb21pc2VIYW5kbGVyKHAuY29uY3VycmVuY3lMaW1pdCk7XG59XG5mdW5jdGlvbiBpc1BhcnRpYWxTdWNjZXNzUmVzcG9uc2UocCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHAsIFwicGFydGlhbFN1Y2Nlc3NcIik7XG59XG5mdW5jdGlvbiBjcmVhdGVMb2dnaW5nUGFydGlhbFN1Y2Nlc3NSZXNwb25zZUhhbmRsZXIoKSB7XG4gIHJldHVybiB7XG4gICAgaGFuZGxlUmVzcG9uc2U6IGZ1bmN0aW9uKHApIHtcbiAgICAgIHAgPT0gbnVsbCB8fCAhaXNQYXJ0aWFsU3VjY2Vzc1Jlc3BvbnNlKHApIHx8IHAucGFydGlhbFN1Y2Nlc3MgPT0gbnVsbCB8fCBPYmplY3Qua2V5cyhwLnBhcnRpYWxTdWNjZXNzKS5sZW5ndGggPT09IDAgfHwgci53YXJuKFwiUmVjZWl2ZWQgUGFydGlhbCBTdWNjZXNzIHJlc3BvbnNlOlwiLCBKU09OLnN0cmluZ2lmeShwLnBhcnRpYWxTdWNjZXNzKSk7XG4gICAgfVxuICB9O1xufVxudmFyIF9fYXdhaXRlciQxID0gZnVuY3Rpb24ocCwgYSwgcywgbCkge1xuICBmdW5jdGlvbiB1KGYpIHtcbiAgICByZXR1cm4gZiBpbnN0YW5jZW9mIHMgPyBmIDogbmV3IHMoZnVuY3Rpb24oZCkge1xuICAgICAgZChmKTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gbmV3IChzIHx8IChzID0gUHJvbWlzZSkpKGZ1bmN0aW9uKGYsIGQpIHtcbiAgICBmdW5jdGlvbiB5KGkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG8obC5uZXh0KGkpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgZChlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaChpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvKGwudGhyb3coaSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgIGkuZG9uZSA/IGYoaS52YWx1ZSkgOiB1KGkudmFsdWUpLnRoZW4oeSwgaCk7XG4gICAgfVxuICAgIG8oKGwgPSBsLmFwcGx5KHAsIFtdKSkubmV4dCgpKTtcbiAgfSk7XG59LCBfX2dlbmVyYXRvciQxID0gZnVuY3Rpb24ocCwgYSkge1xuICB2YXIgcyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChmWzBdICYgMSkgdGhyb3cgZlsxXTtcbiAgICByZXR1cm4gZlsxXTtcbiAgfSwgdHJ5czogW10sIG9wczogW10gfSwgbCwgdSwgZiwgZDtcbiAgcmV0dXJuIGQgPSB7IG5leHQ6IHkoMCksIHRocm93OiB5KDEpLCByZXR1cm46IHkoMikgfSwgdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgKGRbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZDtcbiAgZnVuY3Rpb24geShvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBoKFtvLCBpXSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBoKG8pIHtcbiAgICBpZiAobCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgZm9yICg7IHM7ICkgdHJ5IHtcbiAgICAgIGlmIChsID0gMSwgdSAmJiAoZiA9IG9bMF0gJiAyID8gdS5yZXR1cm4gOiBvWzBdID8gdS50aHJvdyB8fCAoKGYgPSB1LnJldHVybikgJiYgZi5jYWxsKHUpLCAwKSA6IHUubmV4dCkgJiYgIShmID0gZi5jYWxsKHUsIG9bMV0pKS5kb25lKSByZXR1cm4gZjtcbiAgICAgIHN3aXRjaCAodSA9IDAsIGYgJiYgKG8gPSBbb1swXSAmIDIsIGYudmFsdWVdKSwgb1swXSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBmID0gbztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBzLmxhYmVsKyssIHsgdmFsdWU6IG9bMV0sIGRvbmU6ICExIH07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBzLmxhYmVsKyssIHUgPSBvWzFdLCBvID0gWzBdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgbyA9IHMub3BzLnBvcCgpLCBzLnRyeXMucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGYgPSBzLnRyeXMsICEoZiA9IGYubGVuZ3RoID4gMCAmJiBmW2YubGVuZ3RoIC0gMV0pICYmIChvWzBdID09PSA2IHx8IG9bMF0gPT09IDIpKSB7XG4gICAgICAgICAgICBzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob1swXSA9PT0gMyAmJiAoIWYgfHwgb1sxXSA+IGZbMF0gJiYgb1sxXSA8IGZbM10pKSB7XG4gICAgICAgICAgICBzLmxhYmVsID0gb1sxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob1swXSA9PT0gNiAmJiBzLmxhYmVsIDwgZlsxXSkge1xuICAgICAgICAgICAgcy5sYWJlbCA9IGZbMV0sIGYgPSBvO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmICYmIHMubGFiZWwgPCBmWzJdKSB7XG4gICAgICAgICAgICBzLmxhYmVsID0gZlsyXSwgcy5vcHMucHVzaChvKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmWzJdICYmIHMub3BzLnBvcCgpLCBzLnRyeXMucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBvID0gYS5jYWxsKHAsIHMpO1xuICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgIG8gPSBbNiwgaV0sIHUgPSAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBsID0gZiA9IDA7XG4gICAgfVxuICAgIGlmIChvWzBdICYgNSkgdGhyb3cgb1sxXTtcbiAgICByZXR1cm4geyB2YWx1ZTogb1swXSA/IG9bMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufSwgT1RMUEV4cG9ydERlbGVnYXRlID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBwKGEsIHMsIGwsIHUsIGYpIHtcbiAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IGEsIHRoaXMuX3NlcmlhbGl6ZXIgPSBzLCB0aGlzLl9yZXNwb25zZUhhbmRsZXIgPSBsLCB0aGlzLl9wcm9taXNlUXVldWUgPSB1LCB0aGlzLl90aW1lb3V0ID0gZiwgdGhpcy5fZGlhZ0xvZ2dlciA9IHIuY3JlYXRlQ29tcG9uZW50TG9nZ2VyKHtcbiAgICAgICAgbmFtZXNwYWNlOiBcIk9UTFBFeHBvcnREZWxlZ2F0ZVwiXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHAucHJvdG90eXBlLmV4cG9ydCA9IGZ1bmN0aW9uKGEkMSwgcykge1xuICAgICAgdmFyIGwgPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuX2RpYWdMb2dnZXIuZGVidWcoXCJpdGVtcyB0byBiZSBzZW50XCIsIGEkMSksIHRoaXMuX3Byb21pc2VRdWV1ZS5oYXNSZWFjaGVkTGltaXQoKSkge1xuICAgICAgICBzKHtcbiAgICAgICAgICBjb2RlOiBhLkZBSUxFRCxcbiAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiQ29uY3VycmVudCBleHBvcnQgbGltaXQgcmVhY2hlZFwiKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIHUgPSB0aGlzLl9zZXJpYWxpemVyLnNlcmlhbGl6ZVJlcXVlc3QoYSQxKTtcbiAgICAgIGlmICh1ID09IG51bGwpIHtcbiAgICAgICAgcyh7XG4gICAgICAgICAgY29kZTogYS5GQUlMRUQsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIk5vdGhpbmcgdG8gc2VuZFwiKVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fcHJvbWlzZVF1ZXVlLnB1c2hQcm9taXNlKHRoaXMuX3RyYW5zcG9ydC5zZW5kKHUsIHRoaXMuX3RpbWVvdXQpLnRoZW4oZnVuY3Rpb24oZikge1xuICAgICAgICBpZiAoZi5zdGF0dXMgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgaWYgKGYuZGF0YSAhPSBudWxsKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgbC5fcmVzcG9uc2VIYW5kbGVyLmhhbmRsZVJlc3BvbnNlKGwuX3NlcmlhbGl6ZXIuZGVzZXJpYWxpemVSZXNwb25zZShmLmRhdGEpKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGQpIHtcbiAgICAgICAgICAgICAgbC5fZGlhZ0xvZ2dlci53YXJuKFwiRXhwb3J0IHN1Y2NlZWRlZCBidXQgY291bGQgbm90IGRlc2VyaWFsaXplIHJlc3BvbnNlIC0gaXMgdGhlIHJlc3BvbnNlIHNwZWNpZmljYXRpb24gY29tcGxpYW50P1wiLCBkLCBmLmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHMoe1xuICAgICAgICAgICAgY29kZTogYS5TVUNDRVNTXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGYuc3RhdHVzID09PSBcImZhaWx1cmVcIiAmJiBmLmVycm9yKSB7XG4gICAgICAgICAgcyh7XG4gICAgICAgICAgICBjb2RlOiBhLkZBSUxFRCxcbiAgICAgICAgICAgIGVycm9yOiBmLmVycm9yXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgZi5zdGF0dXMgPT09IFwicmV0cnlhYmxlXCIgPyBzKHtcbiAgICAgICAgICBjb2RlOiBhLkZBSUxFRCxcbiAgICAgICAgICBlcnJvcjogbmV3IE9UTFBFeHBvcnRlckVycm9yKFwiRXhwb3J0IGZhaWxlZCB3aXRoIHJldHJ5YWJsZSBzdGF0dXNcIilcbiAgICAgICAgfSkgOiBzKHtcbiAgICAgICAgICBjb2RlOiBhLkZBSUxFRCxcbiAgICAgICAgICBlcnJvcjogbmV3IE9UTFBFeHBvcnRlckVycm9yKFwiRXhwb3J0IGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3JcIilcbiAgICAgICAgfSk7XG4gICAgICB9LCBmdW5jdGlvbihmKSB7XG4gICAgICAgIHJldHVybiBzKHtcbiAgICAgICAgICBjb2RlOiBhLkZBSUxFRCxcbiAgICAgICAgICBlcnJvcjogZlxuICAgICAgICB9KTtcbiAgICAgIH0pKTtcbiAgICB9LCBwLnByb3RvdHlwZS5mb3JjZUZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvbWlzZVF1ZXVlLmF3YWl0QWxsKCk7XG4gICAgfSwgcC5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfX2F3YWl0ZXIkMSh0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvciQxKHRoaXMsIGZ1bmN0aW9uKGEpIHtcbiAgICAgICAgICBzd2l0Y2ggKGEubGFiZWwpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RpYWdMb2dnZXIuZGVidWcoXCJzaHV0ZG93biBzdGFydGVkXCIpLCBbNCwgdGhpcy5mb3JjZUZsdXNoKCldO1xuICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICByZXR1cm4gYS5zZW50KCksIHRoaXMuX3RyYW5zcG9ydC5zaHV0ZG93bigpLCBbXG4gICAgICAgICAgICAgICAgMlxuICAgICAgICAgICAgICAgIC8qcmV0dXJuKi9cbiAgICAgICAgICAgICAgXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgcDtcbiAgfSkoKVxuKTtcbmZ1bmN0aW9uIGNyZWF0ZU90bHBFeHBvcnREZWxlZ2F0ZShwLCBhKSB7XG4gIHJldHVybiBuZXcgT1RMUEV4cG9ydERlbGVnYXRlKHAudHJhbnNwb3J0LCBwLnNlcmlhbGl6ZXIsIGNyZWF0ZUxvZ2dpbmdQYXJ0aWFsU3VjY2Vzc1Jlc3BvbnNlSGFuZGxlcigpLCBwLnByb21pc2VIYW5kbGVyLCBhLnRpbWVvdXQpO1xufVxuZnVuY3Rpb24gY3JlYXRlT3RscE5ldHdvcmtFeHBvcnREZWxlZ2F0ZShwLCBhLCBzKSB7XG4gIHJldHVybiBjcmVhdGVPdGxwRXhwb3J0RGVsZWdhdGUoe1xuICAgIHRyYW5zcG9ydDogcyxcbiAgICBzZXJpYWxpemVyOiBhLFxuICAgIHByb21pc2VIYW5kbGVyOiBjcmVhdGVCb3VuZGVkUXVldWVFeHBvcnRQcm9taXNlSGFuZGxlcihwKVxuICB9LCB7IHRpbWVvdXQ6IHAudGltZW91dE1pbGxpcyB9KTtcbn1cbnZhciBpbmRleE1pbmltYWwgPSB7fSwgbWluaW1hbCQxID0ge30sIGFzcHJvbWlzZSwgaGFzUmVxdWlyZWRBc3Byb21pc2U7XG5mdW5jdGlvbiByZXF1aXJlQXNwcm9taXNlKCkge1xuICBpZiAoaGFzUmVxdWlyZWRBc3Byb21pc2UpIHJldHVybiBhc3Byb21pc2U7XG4gIGhhc1JlcXVpcmVkQXNwcm9taXNlID0gMSwgYXNwcm9taXNlID0gcDtcbiAgZnVuY3Rpb24gcChhLCBzKSB7XG4gICAgZm9yICh2YXIgbCA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSksIHUgPSAwLCBmID0gMiwgZCA9IHRydWU7IGYgPCBhcmd1bWVudHMubGVuZ3RoOyApXG4gICAgICBsW3UrK10gPSBhcmd1bWVudHNbZisrXTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oaCwgbykge1xuICAgICAgbFt1XSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYgKGQpXG4gICAgICAgICAgaWYgKGQgPSBmYWxzZSwgZSlcbiAgICAgICAgICAgIG8oZSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKHZhciB0ID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKVxuICAgICAgICAgICAgICB0W24rK10gPSBhcmd1bWVudHNbbl07XG4gICAgICAgICAgICBoLmFwcGx5KG51bGwsIHQpO1xuICAgICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICBhLmFwcGx5KHMgfHwgbnVsbCwgbCk7XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIGQgJiYgKGQgPSBmYWxzZSwgbyhpKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGFzcHJvbWlzZTtcbn1cbnZhciBiYXNlNjQgPSB7fSwgaGFzUmVxdWlyZWRCYXNlNjQ7XG5mdW5jdGlvbiByZXF1aXJlQmFzZTY0KCkge1xuICByZXR1cm4gaGFzUmVxdWlyZWRCYXNlNjQgfHwgKGhhc1JlcXVpcmVkQmFzZTY0ID0gMSwgKGZ1bmN0aW9uKHApIHtcbiAgICB2YXIgYSA9IHA7XG4gICAgYS5sZW5ndGggPSBmdW5jdGlvbih5KSB7XG4gICAgICB2YXIgaCA9IHkubGVuZ3RoO1xuICAgICAgaWYgKCFoKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGZvciAodmFyIG8gPSAwOyAtLWggJSA0ID4gMSAmJiB5LmNoYXJBdChoKSA9PT0gXCI9XCI7IClcbiAgICAgICAgKytvO1xuICAgICAgcmV0dXJuIE1hdGguY2VpbCh5Lmxlbmd0aCAqIDMpIC8gNCAtIG87XG4gICAgfTtcbiAgICBmb3IgKHZhciBzID0gbmV3IEFycmF5KDY0KSwgbCA9IG5ldyBBcnJheSgxMjMpLCB1ID0gMDsgdSA8IDY0OyApXG4gICAgICBsW3NbdV0gPSB1IDwgMjYgPyB1ICsgNjUgOiB1IDwgNTIgPyB1ICsgNzEgOiB1IDwgNjIgPyB1IC0gNCA6IHUgLSA1OSB8IDQzXSA9IHUrKztcbiAgICBhLmVuY29kZSA9IGZ1bmN0aW9uKHksIGgsIG8pIHtcbiAgICAgIGZvciAodmFyIGkgPSBudWxsLCBlID0gW10sIHQgPSAwLCBuID0gMCwgcjsgaCA8IG87ICkge1xuICAgICAgICB2YXIgYyA9IHlbaCsrXTtcbiAgICAgICAgc3dpdGNoIChuKSB7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgZVt0KytdID0gc1tjID4+IDJdLCByID0gKGMgJiAzKSA8PCA0LCBuID0gMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGVbdCsrXSA9IHNbciB8IGMgPj4gNF0sIHIgPSAoYyAmIDE1KSA8PCAyLCBuID0gMjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGVbdCsrXSA9IHNbciB8IGMgPj4gNl0sIGVbdCsrXSA9IHNbYyAmIDYzXSwgbiA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0ID4gODE5MSAmJiAoKGkgfHwgKGkgPSBbXSkpLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIGUpKSwgdCA9IDApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG4gJiYgKGVbdCsrXSA9IHNbcl0sIGVbdCsrXSA9IDYxLCBuID09PSAxICYmIChlW3QrK10gPSA2MSkpLCBpID8gKHQgJiYgaS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBlLnNsaWNlKDAsIHQpKSksIGkuam9pbihcIlwiKSkgOiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgZS5zbGljZSgwLCB0KSk7XG4gICAgfTtcbiAgICB2YXIgZiA9IFwiaW52YWxpZCBlbmNvZGluZ1wiO1xuICAgIGEuZGVjb2RlID0gZnVuY3Rpb24oeSwgaCwgbykge1xuICAgICAgZm9yICh2YXIgaSA9IG8sIGUgPSAwLCB0LCBuID0gMDsgbiA8IHkubGVuZ3RoOyApIHtcbiAgICAgICAgdmFyIHIgPSB5LmNoYXJDb2RlQXQobisrKTtcbiAgICAgICAgaWYgKHIgPT09IDYxICYmIGUgPiAxKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoKHIgPSBsW3JdKSA9PT0gdm9pZCAwKVxuICAgICAgICAgIHRocm93IEVycm9yKGYpO1xuICAgICAgICBzd2l0Y2ggKGUpIHtcbiAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICB0ID0gciwgZSA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICBoW28rK10gPSB0IDw8IDIgfCAociAmIDQ4KSA+PiA0LCB0ID0gciwgZSA9IDI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICBoW28rK10gPSAodCAmIDE1KSA8PCA0IHwgKHIgJiA2MCkgPj4gMiwgdCA9IHIsIGUgPSAzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaFtvKytdID0gKHQgJiAzKSA8PCA2IHwgciwgZSA9IDA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGUgPT09IDEpXG4gICAgICAgIHRocm93IEVycm9yKGYpO1xuICAgICAgcmV0dXJuIG8gLSBpO1xuICAgIH0sIGEudGVzdCA9IGZ1bmN0aW9uKHkpIHtcbiAgICAgIHJldHVybiAvXig/OltBLVphLXowLTkrL117NH0pKig/OltBLVphLXowLTkrL117Mn09PXxbQS1aYS16MC05Ky9dezN9PSk/JC8udGVzdCh5KTtcbiAgICB9O1xuICB9KShiYXNlNjQpKSwgYmFzZTY0O1xufVxudmFyIGV2ZW50ZW1pdHRlciwgaGFzUmVxdWlyZWRFdmVudGVtaXR0ZXI7XG5mdW5jdGlvbiByZXF1aXJlRXZlbnRlbWl0dGVyKCkge1xuICBpZiAoaGFzUmVxdWlyZWRFdmVudGVtaXR0ZXIpIHJldHVybiBldmVudGVtaXR0ZXI7XG4gIGhhc1JlcXVpcmVkRXZlbnRlbWl0dGVyID0gMSwgZXZlbnRlbWl0dGVyID0gcDtcbiAgZnVuY3Rpb24gcCgpIHtcbiAgICB0aGlzLl9saXN0ZW5lcnMgPSB7fTtcbiAgfVxuICByZXR1cm4gcC5wcm90b3R5cGUub24gPSBmdW5jdGlvbihzLCBsLCB1KSB7XG4gICAgcmV0dXJuICh0aGlzLl9saXN0ZW5lcnNbc10gfHwgKHRoaXMuX2xpc3RlbmVyc1tzXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogbCxcbiAgICAgIGN0eDogdSB8fCB0aGlzXG4gICAgfSksIHRoaXM7XG4gIH0sIHAucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKHMsIGwpIHtcbiAgICBpZiAocyA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzID0ge307XG4gICAgZWxzZSBpZiAobCA9PT0gdm9pZCAwKVxuICAgICAgdGhpcy5fbGlzdGVuZXJzW3NdID0gW107XG4gICAgZWxzZVxuICAgICAgZm9yICh2YXIgdSA9IHRoaXMuX2xpc3RlbmVyc1tzXSwgZiA9IDA7IGYgPCB1Lmxlbmd0aDsgKVxuICAgICAgICB1W2ZdLmZuID09PSBsID8gdS5zcGxpY2UoZiwgMSkgOiArK2Y7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIHAucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbihzKSB7XG4gICAgdmFyIGwgPSB0aGlzLl9saXN0ZW5lcnNbc107XG4gICAgaWYgKGwpIHtcbiAgICAgIGZvciAodmFyIHUgPSBbXSwgZiA9IDE7IGYgPCBhcmd1bWVudHMubGVuZ3RoOyApXG4gICAgICAgIHUucHVzaChhcmd1bWVudHNbZisrXSk7XG4gICAgICBmb3IgKGYgPSAwOyBmIDwgbC5sZW5ndGg7IClcbiAgICAgICAgbFtmXS5mbi5hcHBseShsW2YrK10uY3R4LCB1KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sIGV2ZW50ZW1pdHRlcjtcbn1cbnZhciBmbG9hdCwgaGFzUmVxdWlyZWRGbG9hdDtcbmZ1bmN0aW9uIHJlcXVpcmVGbG9hdCgpIHtcbiAgaWYgKGhhc1JlcXVpcmVkRmxvYXQpIHJldHVybiBmbG9hdDtcbiAgaGFzUmVxdWlyZWRGbG9hdCA9IDEsIGZsb2F0ID0gcChwKTtcbiAgZnVuY3Rpb24gcChmKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBGbG9hdDMyQXJyYXkgPCBcInVcIiA/IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBkID0gbmV3IEZsb2F0MzJBcnJheShbLTBdKSwgeSA9IG5ldyBVaW50OEFycmF5KGQuYnVmZmVyKSwgaCA9IHlbM10gPT09IDEyODtcbiAgICAgIGZ1bmN0aW9uIG8obiwgciwgYykge1xuICAgICAgICBkWzBdID0gbiwgcltjXSA9IHlbMF0sIHJbYyArIDFdID0geVsxXSwgcltjICsgMl0gPSB5WzJdLCByW2MgKyAzXSA9IHlbM107XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBpKG4sIHIsIGMpIHtcbiAgICAgICAgZFswXSA9IG4sIHJbY10gPSB5WzNdLCByW2MgKyAxXSA9IHlbMl0sIHJbYyArIDJdID0geVsxXSwgcltjICsgM10gPSB5WzBdO1xuICAgICAgfVxuICAgICAgZi53cml0ZUZsb2F0TEUgPSBoID8gbyA6IGksIGYud3JpdGVGbG9hdEJFID0gaCA/IGkgOiBvO1xuICAgICAgZnVuY3Rpb24gZShuLCByKSB7XG4gICAgICAgIHJldHVybiB5WzBdID0gbltyXSwgeVsxXSA9IG5bciArIDFdLCB5WzJdID0gbltyICsgMl0sIHlbM10gPSBuW3IgKyAzXSwgZFswXTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIHQobiwgcikge1xuICAgICAgICByZXR1cm4geVszXSA9IG5bcl0sIHlbMl0gPSBuW3IgKyAxXSwgeVsxXSA9IG5bciArIDJdLCB5WzBdID0gbltyICsgM10sIGRbMF07XG4gICAgICB9XG4gICAgICBmLnJlYWRGbG9hdExFID0gaCA/IGUgOiB0LCBmLnJlYWRGbG9hdEJFID0gaCA/IHQgOiBlO1xuICAgIH0pKCkgOiAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBkKGgsIG8sIGksIGUpIHtcbiAgICAgICAgdmFyIHQgPSBvIDwgMCA/IDEgOiAwO1xuICAgICAgICBpZiAodCAmJiAobyA9IC1vKSwgbyA9PT0gMClcbiAgICAgICAgICBoKDEgLyBvID4gMCA/IChcbiAgICAgICAgICAgIC8qIHBvc2l0aXZlICovXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIC8qIG5lZ2F0aXZlIDAgKi9cbiAgICAgICAgICAgIDIxNDc0ODM2NDhcbiAgICAgICAgICApLCBpLCBlKTtcbiAgICAgICAgZWxzZSBpZiAoaXNOYU4obykpXG4gICAgICAgICAgaCgyMTQzMjg5MzQ0LCBpLCBlKTtcbiAgICAgICAgZWxzZSBpZiAobyA+IDM0MDI4MjM0NjYzODUyODg2ZTIyKVxuICAgICAgICAgIGgoKHQgPDwgMzEgfCAyMTM5MDk1MDQwKSA+Pj4gMCwgaSwgZSk7XG4gICAgICAgIGVsc2UgaWYgKG8gPCAxMTc1NDk0MzUwODIyMjg3NWUtNTQpXG4gICAgICAgICAgaCgodCA8PCAzMSB8IE1hdGgucm91bmQobyAvIDE0MDEyOTg0NjQzMjQ4MTdlLTYwKSkgPj4+IDAsIGksIGUpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgbiA9IE1hdGguZmxvb3IoTWF0aC5sb2cobykgLyBNYXRoLkxOMiksIHIgPSBNYXRoLnJvdW5kKG8gKiBNYXRoLnBvdygyLCAtbikgKiA4Mzg4NjA4KSAmIDgzODg2MDc7XG4gICAgICAgICAgaCgodCA8PCAzMSB8IG4gKyAxMjcgPDwgMjMgfCByKSA+Pj4gMCwgaSwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGYud3JpdGVGbG9hdExFID0gZC5iaW5kKG51bGwsIGEpLCBmLndyaXRlRmxvYXRCRSA9IGQuYmluZChudWxsLCBzKTtcbiAgICAgIGZ1bmN0aW9uIHkoaCwgbywgaSkge1xuICAgICAgICB2YXIgZSA9IGgobywgaSksIHQgPSAoZSA+PiAzMSkgKiAyICsgMSwgbiA9IGUgPj4+IDIzICYgMjU1LCByID0gZSAmIDgzODg2MDc7XG4gICAgICAgIHJldHVybiBuID09PSAyNTUgPyByID8gTmFOIDogdCAqICgxIC8gMCkgOiBuID09PSAwID8gdCAqIDE0MDEyOTg0NjQzMjQ4MTdlLTYwICogciA6IHQgKiBNYXRoLnBvdygyLCBuIC0gMTUwKSAqIChyICsgODM4ODYwOCk7XG4gICAgICB9XG4gICAgICBmLnJlYWRGbG9hdExFID0geS5iaW5kKG51bGwsIGwpLCBmLnJlYWRGbG9hdEJFID0geS5iaW5kKG51bGwsIHUpO1xuICAgIH0pKCksIHR5cGVvZiBGbG9hdDY0QXJyYXkgPCBcInVcIiA/IChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBkID0gbmV3IEZsb2F0NjRBcnJheShbLTBdKSwgeSA9IG5ldyBVaW50OEFycmF5KGQuYnVmZmVyKSwgaCA9IHlbN10gPT09IDEyODtcbiAgICAgIGZ1bmN0aW9uIG8obiwgciwgYykge1xuICAgICAgICBkWzBdID0gbiwgcltjXSA9IHlbMF0sIHJbYyArIDFdID0geVsxXSwgcltjICsgMl0gPSB5WzJdLCByW2MgKyAzXSA9IHlbM10sIHJbYyArIDRdID0geVs0XSwgcltjICsgNV0gPSB5WzVdLCByW2MgKyA2XSA9IHlbNl0sIHJbYyArIDddID0geVs3XTtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGkobiwgciwgYykge1xuICAgICAgICBkWzBdID0gbiwgcltjXSA9IHlbN10sIHJbYyArIDFdID0geVs2XSwgcltjICsgMl0gPSB5WzVdLCByW2MgKyAzXSA9IHlbNF0sIHJbYyArIDRdID0geVszXSwgcltjICsgNV0gPSB5WzJdLCByW2MgKyA2XSA9IHlbMV0sIHJbYyArIDddID0geVswXTtcbiAgICAgIH1cbiAgICAgIGYud3JpdGVEb3VibGVMRSA9IGggPyBvIDogaSwgZi53cml0ZURvdWJsZUJFID0gaCA/IGkgOiBvO1xuICAgICAgZnVuY3Rpb24gZShuLCByKSB7XG4gICAgICAgIHJldHVybiB5WzBdID0gbltyXSwgeVsxXSA9IG5bciArIDFdLCB5WzJdID0gbltyICsgMl0sIHlbM10gPSBuW3IgKyAzXSwgeVs0XSA9IG5bciArIDRdLCB5WzVdID0gbltyICsgNV0sIHlbNl0gPSBuW3IgKyA2XSwgeVs3XSA9IG5bciArIDddLCBkWzBdO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gdChuLCByKSB7XG4gICAgICAgIHJldHVybiB5WzddID0gbltyXSwgeVs2XSA9IG5bciArIDFdLCB5WzVdID0gbltyICsgMl0sIHlbNF0gPSBuW3IgKyAzXSwgeVszXSA9IG5bciArIDRdLCB5WzJdID0gbltyICsgNV0sIHlbMV0gPSBuW3IgKyA2XSwgeVswXSA9IG5bciArIDddLCBkWzBdO1xuICAgICAgfVxuICAgICAgZi5yZWFkRG91YmxlTEUgPSBoID8gZSA6IHQsIGYucmVhZERvdWJsZUJFID0gaCA/IHQgOiBlO1xuICAgIH0pKCkgOiAoZnVuY3Rpb24oKSB7XG4gICAgICBmdW5jdGlvbiBkKGgsIG8sIGksIGUsIHQsIG4pIHtcbiAgICAgICAgdmFyIHIgPSBlIDwgMCA/IDEgOiAwO1xuICAgICAgICBpZiAociAmJiAoZSA9IC1lKSwgZSA9PT0gMClcbiAgICAgICAgICBoKDAsIHQsIG4gKyBvKSwgaCgxIC8gZSA+IDAgPyAoXG4gICAgICAgICAgICAvKiBwb3NpdGl2ZSAqL1xuICAgICAgICAgICAgMFxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAvKiBuZWdhdGl2ZSAwICovXG4gICAgICAgICAgICAyMTQ3NDgzNjQ4XG4gICAgICAgICAgKSwgdCwgbiArIGkpO1xuICAgICAgICBlbHNlIGlmIChpc05hTihlKSlcbiAgICAgICAgICBoKDAsIHQsIG4gKyBvKSwgaCgyMTQ2OTU5MzYwLCB0LCBuICsgaSk7XG4gICAgICAgIGVsc2UgaWYgKGUgPiAxNzk3NjkzMTM0ODYyMzE1N2UyOTIpXG4gICAgICAgICAgaCgwLCB0LCBuICsgbyksIGgoKHIgPDwgMzEgfCAyMTQ2NDM1MDcyKSA+Pj4gMCwgdCwgbiArIGkpO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB2YXIgYztcbiAgICAgICAgICBpZiAoZSA8IDIyMjUwNzM4NTg1MDcyMDE0ZS0zMjQpXG4gICAgICAgICAgICBjID0gZSAvIDVlLTMyNCwgaChjID4+PiAwLCB0LCBuICsgbyksIGgoKHIgPDwgMzEgfCBjIC8gNDI5NDk2NzI5NikgPj4+IDAsIHQsIG4gKyBpKTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhciB2ID0gTWF0aC5mbG9vcihNYXRoLmxvZyhlKSAvIE1hdGguTE4yKTtcbiAgICAgICAgICAgIHYgPT09IDEwMjQgJiYgKHYgPSAxMDIzKSwgYyA9IGUgKiBNYXRoLnBvdygyLCAtdiksIGgoYyAqIDQ1MDM1OTk2MjczNzA0OTYgPj4+IDAsIHQsIG4gKyBvKSwgaCgociA8PCAzMSB8IHYgKyAxMDIzIDw8IDIwIHwgYyAqIDEwNDg1NzYgJiAxMDQ4NTc1KSA+Pj4gMCwgdCwgbiArIGkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZi53cml0ZURvdWJsZUxFID0gZC5iaW5kKG51bGwsIGEsIDAsIDQpLCBmLndyaXRlRG91YmxlQkUgPSBkLmJpbmQobnVsbCwgcywgNCwgMCk7XG4gICAgICBmdW5jdGlvbiB5KGgsIG8sIGksIGUsIHQpIHtcbiAgICAgICAgdmFyIG4gPSBoKGUsIHQgKyBvKSwgciA9IGgoZSwgdCArIGkpLCBjID0gKHIgPj4gMzEpICogMiArIDEsIHYgPSByID4+PiAyMCAmIDIwNDcsIG0gPSA0Mjk0OTY3Mjk2ICogKHIgJiAxMDQ4NTc1KSArIG47XG4gICAgICAgIHJldHVybiB2ID09PSAyMDQ3ID8gbSA/IE5hTiA6IGMgKiAoMSAvIDApIDogdiA9PT0gMCA/IGMgKiA1ZS0zMjQgKiBtIDogYyAqIE1hdGgucG93KDIsIHYgLSAxMDc1KSAqIChtICsgNDUwMzU5OTYyNzM3MDQ5Nik7XG4gICAgICB9XG4gICAgICBmLnJlYWREb3VibGVMRSA9IHkuYmluZChudWxsLCBsLCAwLCA0KSwgZi5yZWFkRG91YmxlQkUgPSB5LmJpbmQobnVsbCwgdSwgNCwgMCk7XG4gICAgfSkoKSwgZjtcbiAgfVxuICBmdW5jdGlvbiBhKGYsIGQsIHkpIHtcbiAgICBkW3ldID0gZiAmIDI1NSwgZFt5ICsgMV0gPSBmID4+PiA4ICYgMjU1LCBkW3kgKyAyXSA9IGYgPj4+IDE2ICYgMjU1LCBkW3kgKyAzXSA9IGYgPj4+IDI0O1xuICB9XG4gIGZ1bmN0aW9uIHMoZiwgZCwgeSkge1xuICAgIGRbeV0gPSBmID4+PiAyNCwgZFt5ICsgMV0gPSBmID4+PiAxNiAmIDI1NSwgZFt5ICsgMl0gPSBmID4+PiA4ICYgMjU1LCBkW3kgKyAzXSA9IGYgJiAyNTU7XG4gIH1cbiAgZnVuY3Rpb24gbChmLCBkKSB7XG4gICAgcmV0dXJuIChmW2RdIHwgZltkICsgMV0gPDwgOCB8IGZbZCArIDJdIDw8IDE2IHwgZltkICsgM10gPDwgMjQpID4+PiAwO1xuICB9XG4gIGZ1bmN0aW9uIHUoZiwgZCkge1xuICAgIHJldHVybiAoZltkXSA8PCAyNCB8IGZbZCArIDFdIDw8IDE2IHwgZltkICsgMl0gPDwgOCB8IGZbZCArIDNdKSA+Pj4gMDtcbiAgfVxuICByZXR1cm4gZmxvYXQ7XG59XG52YXIgaW5xdWlyZV8xLCBoYXNSZXF1aXJlZElucXVpcmU7XG5mdW5jdGlvbiByZXF1aXJlSW5xdWlyZSgpIHtcbiAgaWYgKGhhc1JlcXVpcmVkSW5xdWlyZSkgcmV0dXJuIGlucXVpcmVfMTtcbiAgaGFzUmVxdWlyZWRJbnF1aXJlID0gMSwgaW5xdWlyZV8xID0gaW5xdWlyZTtcbiAgZnVuY3Rpb24gaW5xdWlyZShtb2R1bGVOYW1lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBtb2QgPSBldmFsKFwicXVpcmVcIi5yZXBsYWNlKC9eLywgXCJyZVwiKSkobW9kdWxlTmFtZSk7XG4gICAgICBpZiAobW9kICYmIChtb2QubGVuZ3RoIHx8IE9iamVjdC5rZXlzKG1vZCkubGVuZ3RoKSlcbiAgICAgICAgcmV0dXJuIG1vZDtcbiAgICB9IGNhdGNoIChwKSB7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBpbnF1aXJlXzE7XG59XG52YXIgdXRmOCA9IHt9LCBoYXNSZXF1aXJlZFV0Zjg7XG5mdW5jdGlvbiByZXF1aXJlVXRmOCgpIHtcbiAgcmV0dXJuIGhhc1JlcXVpcmVkVXRmOCB8fCAoaGFzUmVxdWlyZWRVdGY4ID0gMSwgKGZ1bmN0aW9uKHApIHtcbiAgICB2YXIgYSA9IHA7XG4gICAgYS5sZW5ndGggPSBmdW5jdGlvbihsKSB7XG4gICAgICBmb3IgKHZhciB1ID0gMCwgZiA9IDAsIGQgPSAwOyBkIDwgbC5sZW5ndGg7ICsrZClcbiAgICAgICAgZiA9IGwuY2hhckNvZGVBdChkKSwgZiA8IDEyOCA/IHUgKz0gMSA6IGYgPCAyMDQ4ID8gdSArPSAyIDogKGYgJiA2NDUxMikgPT09IDU1Mjk2ICYmIChsLmNoYXJDb2RlQXQoZCArIDEpICYgNjQ1MTIpID09PSA1NjMyMCA/ICgrK2QsIHUgKz0gNCkgOiB1ICs9IDM7XG4gICAgICByZXR1cm4gdTtcbiAgICB9LCBhLnJlYWQgPSBmdW5jdGlvbihsLCB1LCBmKSB7XG4gICAgICB2YXIgZCA9IGYgLSB1O1xuICAgICAgaWYgKGQgPCAxKVxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIGZvciAodmFyIHkgPSBudWxsLCBoID0gW10sIG8gPSAwLCBpOyB1IDwgZjsgKVxuICAgICAgICBpID0gbFt1KytdLCBpIDwgMTI4ID8gaFtvKytdID0gaSA6IGkgPiAxOTEgJiYgaSA8IDIyNCA/IGhbbysrXSA9IChpICYgMzEpIDw8IDYgfCBsW3UrK10gJiA2MyA6IGkgPiAyMzkgJiYgaSA8IDM2NSA/IChpID0gKChpICYgNykgPDwgMTggfCAobFt1KytdICYgNjMpIDw8IDEyIHwgKGxbdSsrXSAmIDYzKSA8PCA2IHwgbFt1KytdICYgNjMpIC0gNjU1MzYsIGhbbysrXSA9IDU1Mjk2ICsgKGkgPj4gMTApLCBoW28rK10gPSA1NjMyMCArIChpICYgMTAyMykpIDogaFtvKytdID0gKGkgJiAxNSkgPDwgMTIgfCAobFt1KytdICYgNjMpIDw8IDYgfCBsW3UrK10gJiA2MywgbyA+IDgxOTEgJiYgKCh5IHx8ICh5ID0gW10pKS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBoKSksIG8gPSAwKTtcbiAgICAgIHJldHVybiB5ID8gKG8gJiYgeS5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBoLnNsaWNlKDAsIG8pKSksIHkuam9pbihcIlwiKSkgOiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgaC5zbGljZSgwLCBvKSk7XG4gICAgfSwgYS53cml0ZSA9IGZ1bmN0aW9uKGwsIHUsIGYpIHtcbiAgICAgIGZvciAodmFyIGQgPSBmLCB5LCBoLCBvID0gMDsgbyA8IGwubGVuZ3RoOyArK28pXG4gICAgICAgIHkgPSBsLmNoYXJDb2RlQXQobyksIHkgPCAxMjggPyB1W2YrK10gPSB5IDogeSA8IDIwNDggPyAodVtmKytdID0geSA+PiA2IHwgMTkyLCB1W2YrK10gPSB5ICYgNjMgfCAxMjgpIDogKHkgJiA2NDUxMikgPT09IDU1Mjk2ICYmICgoaCA9IGwuY2hhckNvZGVBdChvICsgMSkpICYgNjQ1MTIpID09PSA1NjMyMCA/ICh5ID0gNjU1MzYgKyAoKHkgJiAxMDIzKSA8PCAxMCkgKyAoaCAmIDEwMjMpLCArK28sIHVbZisrXSA9IHkgPj4gMTggfCAyNDAsIHVbZisrXSA9IHkgPj4gMTIgJiA2MyB8IDEyOCwgdVtmKytdID0geSA+PiA2ICYgNjMgfCAxMjgsIHVbZisrXSA9IHkgJiA2MyB8IDEyOCkgOiAodVtmKytdID0geSA+PiAxMiB8IDIyNCwgdVtmKytdID0geSA+PiA2ICYgNjMgfCAxMjgsIHVbZisrXSA9IHkgJiA2MyB8IDEyOCk7XG4gICAgICByZXR1cm4gZiAtIGQ7XG4gICAgfTtcbiAgfSkodXRmOCkpLCB1dGY4O1xufVxudmFyIHBvb2xfMSwgaGFzUmVxdWlyZWRQb29sO1xuZnVuY3Rpb24gcmVxdWlyZVBvb2woKSB7XG4gIGlmIChoYXNSZXF1aXJlZFBvb2wpIHJldHVybiBwb29sXzE7XG4gIGhhc1JlcXVpcmVkUG9vbCA9IDEsIHBvb2xfMSA9IHA7XG4gIGZ1bmN0aW9uIHAoYSwgcywgbCkge1xuICAgIHZhciB1ID0gbCB8fCA4MTkyLCBmID0gdSA+Pj4gMSwgZCA9IG51bGwsIHkgPSB1O1xuICAgIHJldHVybiBmdW5jdGlvbihvKSB7XG4gICAgICBpZiAobyA8IDEgfHwgbyA+IGYpXG4gICAgICAgIHJldHVybiBhKG8pO1xuICAgICAgeSArIG8gPiB1ICYmIChkID0gYSh1KSwgeSA9IDApO1xuICAgICAgdmFyIGkgPSBzLmNhbGwoZCwgeSwgeSArPSBvKTtcbiAgICAgIHJldHVybiB5ICYgNyAmJiAoeSA9ICh5IHwgNykgKyAxKSwgaTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBwb29sXzE7XG59XG52YXIgbG9uZ2JpdHMsIGhhc1JlcXVpcmVkTG9uZ2JpdHM7XG5mdW5jdGlvbiByZXF1aXJlTG9uZ2JpdHMoKSB7XG4gIGlmIChoYXNSZXF1aXJlZExvbmdiaXRzKSByZXR1cm4gbG9uZ2JpdHM7XG4gIGhhc1JlcXVpcmVkTG9uZ2JpdHMgPSAxLCBsb25nYml0cyA9IGE7XG4gIHZhciBwID0gcmVxdWlyZU1pbmltYWwkMSgpO1xuICBmdW5jdGlvbiBhKGYsIGQpIHtcbiAgICB0aGlzLmxvID0gZiA+Pj4gMCwgdGhpcy5oaSA9IGQgPj4+IDA7XG4gIH1cbiAgdmFyIHMgPSBhLnplcm8gPSBuZXcgYSgwLCAwKTtcbiAgcy50b051bWJlciA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAwO1xuICB9LCBzLnp6RW5jb2RlID0gcy56ekRlY29kZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9LCBzLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAxO1xuICB9O1xuICB2YXIgbCA9IGEuemVyb0hhc2ggPSBcIlxcMFxcMFxcMFxcMFxcMFxcMFxcMFxcMFwiO1xuICBhLmZyb21OdW1iZXIgPSBmdW5jdGlvbihkKSB7XG4gICAgaWYgKGQgPT09IDApXG4gICAgICByZXR1cm4gcztcbiAgICB2YXIgeSA9IGQgPCAwO1xuICAgIHkgJiYgKGQgPSAtZCk7XG4gICAgdmFyIGggPSBkID4+PiAwLCBvID0gKGQgLSBoKSAvIDQyOTQ5NjcyOTYgPj4+IDA7XG4gICAgcmV0dXJuIHkgJiYgKG8gPSB+byA+Pj4gMCwgaCA9IH5oID4+PiAwLCArK2ggPiA0Mjk0OTY3Mjk1ICYmIChoID0gMCwgKytvID4gNDI5NDk2NzI5NSAmJiAobyA9IDApKSksIG5ldyBhKGgsIG8pO1xuICB9LCBhLmZyb20gPSBmdW5jdGlvbihkKSB7XG4gICAgaWYgKHR5cGVvZiBkID09IFwibnVtYmVyXCIpXG4gICAgICByZXR1cm4gYS5mcm9tTnVtYmVyKGQpO1xuICAgIGlmIChwLmlzU3RyaW5nKGQpKVxuICAgICAgaWYgKHAuTG9uZylcbiAgICAgICAgZCA9IHAuTG9uZy5mcm9tU3RyaW5nKGQpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gYS5mcm9tTnVtYmVyKHBhcnNlSW50KGQsIDEwKSk7XG4gICAgcmV0dXJuIGQubG93IHx8IGQuaGlnaCA/IG5ldyBhKGQubG93ID4+PiAwLCBkLmhpZ2ggPj4+IDApIDogcztcbiAgfSwgYS5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbihkKSB7XG4gICAgaWYgKCFkICYmIHRoaXMuaGkgPj4+IDMxKSB7XG4gICAgICB2YXIgeSA9IH50aGlzLmxvICsgMSA+Pj4gMCwgaCA9IH50aGlzLmhpID4+PiAwO1xuICAgICAgcmV0dXJuIHkgfHwgKGggPSBoICsgMSA+Pj4gMCksIC0oeSArIGggKiA0Mjk0OTY3Mjk2KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG8gKyB0aGlzLmhpICogNDI5NDk2NzI5NjtcbiAgfSwgYS5wcm90b3R5cGUudG9Mb25nID0gZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBwLkxvbmcgPyBuZXcgcC5Mb25nKHRoaXMubG8gfCAwLCB0aGlzLmhpIHwgMCwgISFkKSA6IHsgbG93OiB0aGlzLmxvIHwgMCwgaGlnaDogdGhpcy5oaSB8IDAsIHVuc2lnbmVkOiAhIWQgfTtcbiAgfTtcbiAgdmFyIHUgPSBTdHJpbmcucHJvdG90eXBlLmNoYXJDb2RlQXQ7XG4gIHJldHVybiBhLmZyb21IYXNoID0gZnVuY3Rpb24oZCkge1xuICAgIHJldHVybiBkID09PSBsID8gcyA6IG5ldyBhKFxuICAgICAgKHUuY2FsbChkLCAwKSB8IHUuY2FsbChkLCAxKSA8PCA4IHwgdS5jYWxsKGQsIDIpIDw8IDE2IHwgdS5jYWxsKGQsIDMpIDw8IDI0KSA+Pj4gMCxcbiAgICAgICh1LmNhbGwoZCwgNCkgfCB1LmNhbGwoZCwgNSkgPDwgOCB8IHUuY2FsbChkLCA2KSA8PCAxNiB8IHUuY2FsbChkLCA3KSA8PCAyNCkgPj4+IDBcbiAgICApO1xuICB9LCBhLnByb3RvdHlwZS50b0hhc2ggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgIHRoaXMubG8gJiAyNTUsXG4gICAgICB0aGlzLmxvID4+PiA4ICYgMjU1LFxuICAgICAgdGhpcy5sbyA+Pj4gMTYgJiAyNTUsXG4gICAgICB0aGlzLmxvID4+PiAyNCxcbiAgICAgIHRoaXMuaGkgJiAyNTUsXG4gICAgICB0aGlzLmhpID4+PiA4ICYgMjU1LFxuICAgICAgdGhpcy5oaSA+Pj4gMTYgJiAyNTUsXG4gICAgICB0aGlzLmhpID4+PiAyNFxuICAgICk7XG4gIH0sIGEucHJvdG90eXBlLnp6RW5jb2RlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIGQgPSB0aGlzLmhpID4+IDMxO1xuICAgIHJldHVybiB0aGlzLmhpID0gKCh0aGlzLmhpIDw8IDEgfCB0aGlzLmxvID4+PiAzMSkgXiBkKSA+Pj4gMCwgdGhpcy5sbyA9ICh0aGlzLmxvIDw8IDEgXiBkKSA+Pj4gMCwgdGhpcztcbiAgfSwgYS5wcm90b3R5cGUuenpEZWNvZGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgZCA9IC0odGhpcy5sbyAmIDEpO1xuICAgIHJldHVybiB0aGlzLmxvID0gKCh0aGlzLmxvID4+PiAxIHwgdGhpcy5oaSA8PCAzMSkgXiBkKSA+Pj4gMCwgdGhpcy5oaSA9ICh0aGlzLmhpID4+PiAxIF4gZCkgPj4+IDAsIHRoaXM7XG4gIH0sIGEucHJvdG90eXBlLmxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBkID0gdGhpcy5sbywgeSA9ICh0aGlzLmxvID4+PiAyOCB8IHRoaXMuaGkgPDwgNCkgPj4+IDAsIGggPSB0aGlzLmhpID4+PiAyNDtcbiAgICByZXR1cm4gaCA9PT0gMCA/IHkgPT09IDAgPyBkIDwgMTYzODQgPyBkIDwgMTI4ID8gMSA6IDIgOiBkIDwgMjA5NzE1MiA/IDMgOiA0IDogeSA8IDE2Mzg0ID8geSA8IDEyOCA/IDUgOiA2IDogeSA8IDIwOTcxNTIgPyA3IDogOCA6IGggPCAxMjggPyA5IDogMTA7XG4gIH0sIGxvbmdiaXRzO1xufVxudmFyIGhhc1JlcXVpcmVkTWluaW1hbCQxO1xuZnVuY3Rpb24gcmVxdWlyZU1pbmltYWwkMSgpIHtcbiAgcmV0dXJuIGhhc1JlcXVpcmVkTWluaW1hbCQxIHx8IChoYXNSZXF1aXJlZE1pbmltYWwkMSA9IDEsIChmdW5jdGlvbihwKSB7XG4gICAgdmFyIGEgPSBwO1xuICAgIGEuYXNQcm9taXNlID0gcmVxdWlyZUFzcHJvbWlzZSgpLCBhLmJhc2U2NCA9IHJlcXVpcmVCYXNlNjQoKSwgYS5FdmVudEVtaXR0ZXIgPSByZXF1aXJlRXZlbnRlbWl0dGVyKCksIGEuZmxvYXQgPSByZXF1aXJlRmxvYXQoKSwgYS5pbnF1aXJlID0gcmVxdWlyZUlucXVpcmUoKSwgYS51dGY4ID0gcmVxdWlyZVV0ZjgoKSwgYS5wb29sID0gcmVxdWlyZVBvb2woKSwgYS5Mb25nQml0cyA9IHJlcXVpcmVMb25nYml0cygpLCBhLmlzTm9kZSA9ICEhKHR5cGVvZiBmIDwgXCJ1XCIgJiYgZiAmJiBmLnByb2Nlc3MgJiYgZi5wcm9jZXNzLnZlcnNpb25zICYmIGYucHJvY2Vzcy52ZXJzaW9ucy5ub2RlKSwgYS5nbG9iYWwgPSBhLmlzTm9kZSAmJiBmIHx8IHR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB3aW5kb3cgfHwgdHlwZW9mIHNlbGYgPCBcInVcIiAmJiBzZWxmIHx8IG1pbmltYWwkMSwgYS5lbXB0eUFycmF5ID0gT2JqZWN0LmZyZWV6ZSA/IE9iamVjdC5mcmVlemUoW10pIDogKFxuICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIFtdXG4gICAgKSwgYS5lbXB0eU9iamVjdCA9IE9iamVjdC5mcmVlemUgPyBPYmplY3QuZnJlZXplKHt9KSA6IChcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICB7fVxuICAgICksIGEuaXNJbnRlZ2VyID0gTnVtYmVyLmlzSW50ZWdlciB8fCAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZiA9PSBcIm51bWJlclwiICYmIGlzRmluaXRlKGYpICYmIE1hdGguZmxvb3IoZikgPT09IGY7XG4gICAgfSwgYS5pc1N0cmluZyA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZiA9PSBcInN0cmluZ1wiIHx8IGYgaW5zdGFuY2VvZiBTdHJpbmc7XG4gICAgfSwgYS5pc09iamVjdCA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiBmICYmIHR5cGVvZiBmID09IFwib2JqZWN0XCI7XG4gICAgfSwgYS5pc3NldCA9IC8qKlxuICAgICAqIENoZWNrcyBpZiBhIHByb3BlcnR5IG9uIGEgbWVzc2FnZSBpcyBjb25zaWRlcmVkIHRvIGJlIHByZXNlbnQuXG4gICAgICogQHBhcmFtIHtPYmplY3R9IG9iaiBQbGFpbiBvYmplY3Qgb3IgbWVzc2FnZSBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIGNvbnNpZGVyZWQgdG8gYmUgcHJlc2VudCwgb3RoZXJ3aXNlIGBmYWxzZWBcbiAgICAgKi9cbiAgICBhLmlzU2V0ID0gZnVuY3Rpb24oZiwgZCkge1xuICAgICAgdmFyIHkgPSBmW2RdO1xuICAgICAgcmV0dXJuIHkgIT0gbnVsbCAmJiBmLmhhc093blByb3BlcnR5KGQpID8gdHlwZW9mIHkgIT0gXCJvYmplY3RcIiB8fCAoQXJyYXkuaXNBcnJheSh5KSA/IHkubGVuZ3RoIDogT2JqZWN0LmtleXMoeSkubGVuZ3RoKSA+IDAgOiBmYWxzZTtcbiAgICB9LCBhLkJ1ZmZlciA9IChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHZhciB1ID0gYS5pbnF1aXJlKFwiYnVmZmVyXCIpLkJ1ZmZlcjtcbiAgICAgICAgcmV0dXJuIHUucHJvdG90eXBlLnV0ZjhXcml0ZSA/IHUgOiAoXG4gICAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSkoKSwgYS5fQnVmZmVyX2Zyb20gPSBudWxsLCBhLl9CdWZmZXJfYWxsb2NVbnNhZmUgPSBudWxsLCBhLm5ld0J1ZmZlciA9IGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgZiA9PSBcIm51bWJlclwiID8gYS5CdWZmZXIgPyBhLl9CdWZmZXJfYWxsb2NVbnNhZmUoZikgOiBuZXcgYS5BcnJheShmKSA6IGEuQnVmZmVyID8gYS5fQnVmZmVyX2Zyb20oZikgOiB0eXBlb2YgVWludDhBcnJheSA+IFwidVwiID8gZiA6IG5ldyBVaW50OEFycmF5KGYpO1xuICAgIH0sIGEuQXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSA8IFwidVwiID8gVWludDhBcnJheSA6IEFycmF5LCBhLkxvbmcgPSAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIGEuZ2xvYmFsLmRjb2RlSU8gJiYgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBhLmdsb2JhbC5kY29kZUlPLkxvbmcgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICBhLmdsb2JhbC5Mb25nIHx8IGEuaW5xdWlyZShcImxvbmdcIiksIGEua2V5MlJlID0gL150cnVlfGZhbHNlfDB8MSQvLCBhLmtleTMyUmUgPSAvXi0/KD86MHxbMS05XVswLTldKikkLywgYS5rZXk2NFJlID0gL14oPzpbXFxcXHgwMC1cXFxceGZmXXs4fXwtPyg/OjB8WzEtOV1bMC05XSopKSQvLCBhLmxvbmdUb0hhc2ggPSBmdW5jdGlvbihmKSB7XG4gICAgICByZXR1cm4gZiA/IGEuTG9uZ0JpdHMuZnJvbShmKS50b0hhc2goKSA6IGEuTG9uZ0JpdHMuemVyb0hhc2g7XG4gICAgfSwgYS5sb25nRnJvbUhhc2ggPSBmdW5jdGlvbihmLCBkKSB7XG4gICAgICB2YXIgeSA9IGEuTG9uZ0JpdHMuZnJvbUhhc2goZik7XG4gICAgICByZXR1cm4gYS5Mb25nID8gYS5Mb25nLmZyb21CaXRzKHkubG8sIHkuaGksIGQpIDogeS50b051bWJlcighIWQpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gcyh1LCBmLCBkKSB7XG4gICAgICBmb3IgKHZhciB5ID0gT2JqZWN0LmtleXMoZiksIGggPSAwOyBoIDwgeS5sZW5ndGg7ICsraClcbiAgICAgICAgKHVbeVtoXV0gPT09IHZvaWQgMCB8fCAhZCkgJiYgKHVbeVtoXV0gPSBmW3lbaF1dKTtcbiAgICAgIHJldHVybiB1O1xuICAgIH1cbiAgICBhLm1lcmdlID0gcywgYS5sY0ZpcnN0ID0gZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIGYuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBmLnN1YnN0cmluZygxKTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIGwodSkge1xuICAgICAgZnVuY3Rpb24gZihkLCB5KSB7XG4gICAgICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBmKSlcbiAgICAgICAgICByZXR1cm4gbmV3IGYoZCwgeSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm1lc3NhZ2VcIiwgeyBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICB9IH0pLCBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSA/IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIGYpIDogT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwic3RhY2tcIiwgeyB2YWx1ZTogbmV3IEVycm9yKCkuc3RhY2sgfHwgXCJcIiB9KSwgeSAmJiBzKHRoaXMsIHkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGYucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgICB2YWx1ZTogZixcbiAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgbmFtZToge1xuICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldDogdm9pZCAwLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIC8vIGNvbmZpZ3VyYWJsZTogZmFsc2Ugd291bGQgYWNjdXJhdGVseSBwcmVzZXJ2ZSB0aGUgYmVoYXZpb3Igb2ZcbiAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwsIGJ1dCBJJ20gZ3Vlc3NpbmcgdGhhdCB3YXMgbm90IGludGVudGlvbmFsLlxuICAgICAgICAgIC8vIEZvciBhbiBhY3R1YWwgZXJyb3Igc3ViY2xhc3MsIHRoaXMgcHJvcGVydHkgd291bGRcbiAgICAgICAgICAvLyBiZSBjb25maWd1cmFibGUuXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIHRvU3RyaW5nOiB7XG4gICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArIFwiOiBcIiArIHRoaXMubWVzc2FnZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KSwgZjtcbiAgICB9XG4gICAgYS5uZXdFcnJvciA9IGwsIGEuUHJvdG9jb2xFcnJvciA9IGwoXCJQcm90b2NvbEVycm9yXCIpLCBhLm9uZU9mR2V0dGVyID0gZnVuY3Rpb24oZikge1xuICAgICAgZm9yICh2YXIgZCA9IHt9LCB5ID0gMDsgeSA8IGYubGVuZ3RoOyArK3kpXG4gICAgICAgIGRbZlt5XV0gPSAxO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICBmb3IgKHZhciBoID0gT2JqZWN0LmtleXModGhpcyksIG8gPSBoLmxlbmd0aCAtIDE7IG8gPiAtMTsgLS1vKVxuICAgICAgICAgIGlmIChkW2hbb11dID09PSAxICYmIHRoaXNbaFtvXV0gIT09IHZvaWQgMCAmJiB0aGlzW2hbb11dICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIGhbb107XG4gICAgICB9O1xuICAgIH0sIGEub25lT2ZTZXR0ZXIgPSBmdW5jdGlvbihmKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24oZCkge1xuICAgICAgICBmb3IgKHZhciB5ID0gMDsgeSA8IGYubGVuZ3RoOyArK3kpXG4gICAgICAgICAgZlt5XSAhPT0gZCAmJiBkZWxldGUgdGhpc1tmW3ldXTtcbiAgICAgIH07XG4gICAgfSwgYS50b0pTT05PcHRpb25zID0ge1xuICAgICAgbG9uZ3M6IFN0cmluZyxcbiAgICAgIGVudW1zOiBTdHJpbmcsXG4gICAgICBieXRlczogU3RyaW5nLFxuICAgICAganNvbjogdHJ1ZVxuICAgIH0sIGEuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHUgPSBhLkJ1ZmZlcjtcbiAgICAgIGlmICghdSkge1xuICAgICAgICBhLl9CdWZmZXJfZnJvbSA9IGEuX0J1ZmZlcl9hbGxvY1Vuc2FmZSA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGEuX0J1ZmZlcl9mcm9tID0gdS5mcm9tICE9PSBVaW50OEFycmF5LmZyb20gJiYgdS5mcm9tIHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICBmdW5jdGlvbihkLCB5KSB7XG4gICAgICAgIHJldHVybiBuZXcgdShkLCB5KTtcbiAgICAgIH0sIGEuX0J1ZmZlcl9hbGxvY1Vuc2FmZSA9IHUuYWxsb2NVbnNhZmUgfHwgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAgIGZ1bmN0aW9uKGQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyB1KGQpO1xuICAgICAgfTtcbiAgICB9O1xuICB9KShtaW5pbWFsJDEpKSwgbWluaW1hbCQxO1xufVxudmFyIHdyaXRlciwgaGFzUmVxdWlyZWRXcml0ZXI7XG5mdW5jdGlvbiByZXF1aXJlV3JpdGVyKCkge1xuICBpZiAoaGFzUmVxdWlyZWRXcml0ZXIpIHJldHVybiB3cml0ZXI7XG4gIGhhc1JlcXVpcmVkV3JpdGVyID0gMSwgd3JpdGVyID0gaDtcbiAgdmFyIHAgPSByZXF1aXJlTWluaW1hbCQxKCksIGEsIHMgPSBwLkxvbmdCaXRzLCBsID0gcC5iYXNlNjQsIHUgPSBwLnV0Zjg7XG4gIGZ1bmN0aW9uIGYodiwgbSwgYikge1xuICAgIHRoaXMuZm4gPSB2LCB0aGlzLmxlbiA9IG0sIHRoaXMubmV4dCA9IHZvaWQgMCwgdGhpcy52YWwgPSBiO1xuICB9XG4gIGZ1bmN0aW9uIGQoKSB7XG4gIH1cbiAgZnVuY3Rpb24geSh2KSB7XG4gICAgdGhpcy5oZWFkID0gdi5oZWFkLCB0aGlzLnRhaWwgPSB2LnRhaWwsIHRoaXMubGVuID0gdi5sZW4sIHRoaXMubmV4dCA9IHYuc3RhdGVzO1xuICB9XG4gIGZ1bmN0aW9uIGgoKSB7XG4gICAgdGhpcy5sZW4gPSAwLCB0aGlzLmhlYWQgPSBuZXcgZihkLCAwLCAwKSwgdGhpcy50YWlsID0gdGhpcy5oZWFkLCB0aGlzLnN0YXRlcyA9IG51bGw7XG4gIH1cbiAgdmFyIG8gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcC5CdWZmZXIgPyBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAoaC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBhKCk7XG4gICAgICB9KSgpO1xuICAgIH0gOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBuZXcgaCgpO1xuICAgIH07XG4gIH07XG4gIGguY3JlYXRlID0gbygpLCBoLmFsbG9jID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiBuZXcgcC5BcnJheShtKTtcbiAgfSwgcC5BcnJheSAhPT0gQXJyYXkgJiYgKGguYWxsb2MgPSBwLnBvb2woaC5hbGxvYywgcC5BcnJheS5wcm90b3R5cGUuc3ViYXJyYXkpKSwgaC5wcm90b3R5cGUuX3B1c2ggPSBmdW5jdGlvbihtLCBiLCB4KSB7XG4gICAgcmV0dXJuIHRoaXMudGFpbCA9IHRoaXMudGFpbC5uZXh0ID0gbmV3IGYobSwgYiwgeCksIHRoaXMubGVuICs9IGIsIHRoaXM7XG4gIH07XG4gIGZ1bmN0aW9uIGkodiwgbSwgYikge1xuICAgIG1bYl0gPSB2ICYgMjU1O1xuICB9XG4gIGZ1bmN0aW9uIGUodiwgbSwgYikge1xuICAgIGZvciAoOyB2ID4gMTI3OyApXG4gICAgICBtW2IrK10gPSB2ICYgMTI3IHwgMTI4LCB2ID4+Pj0gNztcbiAgICBtW2JdID0gdjtcbiAgfVxuICBmdW5jdGlvbiB0KHYsIG0pIHtcbiAgICB0aGlzLmxlbiA9IHYsIHRoaXMubmV4dCA9IHZvaWQgMCwgdGhpcy52YWwgPSBtO1xuICB9XG4gIHQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShmLnByb3RvdHlwZSksIHQucHJvdG90eXBlLmZuID0gZSwgaC5wcm90b3R5cGUudWludDMyID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiB0aGlzLmxlbiArPSAodGhpcy50YWlsID0gdGhpcy50YWlsLm5leHQgPSBuZXcgdChcbiAgICAgIChtID0gbSA+Pj4gMCkgPCAxMjggPyAxIDogbSA8IDE2Mzg0ID8gMiA6IG0gPCAyMDk3MTUyID8gMyA6IG0gPCAyNjg0MzU0NTYgPyA0IDogNSxcbiAgICAgIG1cbiAgICApKS5sZW4sIHRoaXM7XG4gIH0sIGgucHJvdG90eXBlLmludDMyID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiBtIDwgMCA/IHRoaXMuX3B1c2gobiwgMTAsIHMuZnJvbU51bWJlcihtKSkgOiB0aGlzLnVpbnQzMihtKTtcbiAgfSwgaC5wcm90b3R5cGUuc2ludDMyID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiB0aGlzLnVpbnQzMigobSA8PCAxIF4gbSA+PiAzMSkgPj4+IDApO1xuICB9O1xuICBmdW5jdGlvbiBuKHYsIG0sIGIpIHtcbiAgICBmb3IgKDsgdi5oaTsgKVxuICAgICAgbVtiKytdID0gdi5sbyAmIDEyNyB8IDEyOCwgdi5sbyA9ICh2LmxvID4+PiA3IHwgdi5oaSA8PCAyNSkgPj4+IDAsIHYuaGkgPj4+PSA3O1xuICAgIGZvciAoOyB2LmxvID4gMTI3OyApXG4gICAgICBtW2IrK10gPSB2LmxvICYgMTI3IHwgMTI4LCB2LmxvID0gdi5sbyA+Pj4gNztcbiAgICBtW2IrK10gPSB2LmxvO1xuICB9XG4gIGgucHJvdG90eXBlLnVpbnQ2NCA9IGZ1bmN0aW9uKG0pIHtcbiAgICB2YXIgYiA9IHMuZnJvbShtKTtcbiAgICByZXR1cm4gdGhpcy5fcHVzaChuLCBiLmxlbmd0aCgpLCBiKTtcbiAgfSwgaC5wcm90b3R5cGUuaW50NjQgPSBoLnByb3RvdHlwZS51aW50NjQsIGgucHJvdG90eXBlLnNpbnQ2NCA9IGZ1bmN0aW9uKG0pIHtcbiAgICB2YXIgYiA9IHMuZnJvbShtKS56ekVuY29kZSgpO1xuICAgIHJldHVybiB0aGlzLl9wdXNoKG4sIGIubGVuZ3RoKCksIGIpO1xuICB9LCBoLnByb3RvdHlwZS5ib29sID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKGksIDEsIG0gPyAxIDogMCk7XG4gIH07XG4gIGZ1bmN0aW9uIHIodiwgbSwgYikge1xuICAgIG1bYl0gPSB2ICYgMjU1LCBtW2IgKyAxXSA9IHYgPj4+IDggJiAyNTUsIG1bYiArIDJdID0gdiA+Pj4gMTYgJiAyNTUsIG1bYiArIDNdID0gdiA+Pj4gMjQ7XG4gIH1cbiAgaC5wcm90b3R5cGUuZml4ZWQzMiA9IGZ1bmN0aW9uKG0pIHtcbiAgICByZXR1cm4gdGhpcy5fcHVzaChyLCA0LCBtID4+PiAwKTtcbiAgfSwgaC5wcm90b3R5cGUuc2ZpeGVkMzIgPSBoLnByb3RvdHlwZS5maXhlZDMyLCBoLnByb3RvdHlwZS5maXhlZDY0ID0gZnVuY3Rpb24obSkge1xuICAgIHZhciBiID0gcy5mcm9tKG0pO1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHIsIDQsIGIubG8pLl9wdXNoKHIsIDQsIGIuaGkpO1xuICB9LCBoLnByb3RvdHlwZS5zZml4ZWQ2NCA9IGgucHJvdG90eXBlLmZpeGVkNjQsIGgucHJvdG90eXBlLmZsb2F0ID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHAuZmxvYXQud3JpdGVGbG9hdExFLCA0LCBtKTtcbiAgfSwgaC5wcm90b3R5cGUuZG91YmxlID0gZnVuY3Rpb24obSkge1xuICAgIHJldHVybiB0aGlzLl9wdXNoKHAuZmxvYXQud3JpdGVEb3VibGVMRSwgOCwgbSk7XG4gIH07XG4gIHZhciBjID0gcC5BcnJheS5wcm90b3R5cGUuc2V0ID8gZnVuY3Rpb24obSwgYiwgeCkge1xuICAgIGIuc2V0KG0sIHgpO1xuICB9IDogZnVuY3Rpb24obSwgYiwgeCkge1xuICAgIGZvciAodmFyIE8gPSAwOyBPIDwgbS5sZW5ndGg7ICsrTylcbiAgICAgIGJbeCArIE9dID0gbVtPXTtcbiAgfTtcbiAgcmV0dXJuIGgucHJvdG90eXBlLmJ5dGVzID0gZnVuY3Rpb24obSkge1xuICAgIHZhciBiID0gbS5sZW5ndGggPj4+IDA7XG4gICAgaWYgKCFiKVxuICAgICAgcmV0dXJuIHRoaXMuX3B1c2goaSwgMSwgMCk7XG4gICAgaWYgKHAuaXNTdHJpbmcobSkpIHtcbiAgICAgIHZhciB4ID0gaC5hbGxvYyhiID0gbC5sZW5ndGgobSkpO1xuICAgICAgbC5kZWNvZGUobSwgeCwgMCksIG0gPSB4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51aW50MzIoYikuX3B1c2goYywgYiwgbSk7XG4gIH0sIGgucHJvdG90eXBlLnN0cmluZyA9IGZ1bmN0aW9uKG0pIHtcbiAgICB2YXIgYiA9IHUubGVuZ3RoKG0pO1xuICAgIHJldHVybiBiID8gdGhpcy51aW50MzIoYikuX3B1c2godS53cml0ZSwgYiwgbSkgOiB0aGlzLl9wdXNoKGksIDEsIDApO1xuICB9LCBoLnByb3RvdHlwZS5mb3JrID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVzID0gbmV3IHkodGhpcyksIHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBmKGQsIDAsIDApLCB0aGlzLmxlbiA9IDAsIHRoaXM7XG4gIH0sIGgucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVzID8gKHRoaXMuaGVhZCA9IHRoaXMuc3RhdGVzLmhlYWQsIHRoaXMudGFpbCA9IHRoaXMuc3RhdGVzLnRhaWwsIHRoaXMubGVuID0gdGhpcy5zdGF0ZXMubGVuLCB0aGlzLnN0YXRlcyA9IHRoaXMuc3RhdGVzLm5leHQpIDogKHRoaXMuaGVhZCA9IHRoaXMudGFpbCA9IG5ldyBmKGQsIDAsIDApLCB0aGlzLmxlbiA9IDApLCB0aGlzO1xuICB9LCBoLnByb3RvdHlwZS5sZGVsaW0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgbSA9IHRoaXMuaGVhZCwgYiA9IHRoaXMudGFpbCwgeCA9IHRoaXMubGVuO1xuICAgIHJldHVybiB0aGlzLnJlc2V0KCkudWludDMyKHgpLCB4ICYmICh0aGlzLnRhaWwubmV4dCA9IG0ubmV4dCwgdGhpcy50YWlsID0gYiwgdGhpcy5sZW4gKz0geCksIHRoaXM7XG4gIH0sIGgucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkge1xuICAgIGZvciAodmFyIG0gPSB0aGlzLmhlYWQubmV4dCwgYiA9IHRoaXMuY29uc3RydWN0b3IuYWxsb2ModGhpcy5sZW4pLCB4ID0gMDsgbTsgKVxuICAgICAgbS5mbihtLnZhbCwgYiwgeCksIHggKz0gbS5sZW4sIG0gPSBtLm5leHQ7XG4gICAgcmV0dXJuIGI7XG4gIH0sIGguX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKHYpIHtcbiAgICBhID0gdiwgaC5jcmVhdGUgPSBvKCksIGEuX2NvbmZpZ3VyZSgpO1xuICB9LCB3cml0ZXI7XG59XG52YXIgd3JpdGVyX2J1ZmZlciwgaGFzUmVxdWlyZWRXcml0ZXJfYnVmZmVyO1xuZnVuY3Rpb24gcmVxdWlyZVdyaXRlcl9idWZmZXIoKSB7XG4gIGlmIChoYXNSZXF1aXJlZFdyaXRlcl9idWZmZXIpIHJldHVybiB3cml0ZXJfYnVmZmVyO1xuICBoYXNSZXF1aXJlZFdyaXRlcl9idWZmZXIgPSAxLCB3cml0ZXJfYnVmZmVyID0gcztcbiAgdmFyIHAgPSByZXF1aXJlV3JpdGVyKCk7XG4gIChzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IHM7XG4gIHZhciBhID0gcmVxdWlyZU1pbmltYWwkMSgpO1xuICBmdW5jdGlvbiBzKCkge1xuICAgIHAuY2FsbCh0aGlzKTtcbiAgfVxuICBzLl9jb25maWd1cmUgPSBmdW5jdGlvbigpIHtcbiAgICBzLmFsbG9jID0gYS5fQnVmZmVyX2FsbG9jVW5zYWZlLCBzLndyaXRlQnl0ZXNCdWZmZXIgPSBhLkJ1ZmZlciAmJiBhLkJ1ZmZlci5wcm90b3R5cGUgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGEuQnVmZmVyLnByb3RvdHlwZS5zZXQubmFtZSA9PT0gXCJzZXRcIiA/IGZ1bmN0aW9uKGYsIGQsIHkpIHtcbiAgICAgIGQuc2V0KGYsIHkpO1xuICAgIH0gOiBmdW5jdGlvbihmLCBkLCB5KSB7XG4gICAgICBpZiAoZi5jb3B5KVxuICAgICAgICBmLmNvcHkoZCwgeSwgMCwgZi5sZW5ndGgpO1xuICAgICAgZWxzZSBmb3IgKHZhciBoID0gMDsgaCA8IGYubGVuZ3RoOyApXG4gICAgICAgIGRbeSsrXSA9IGZbaCsrXTtcbiAgICB9O1xuICB9LCBzLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uKGYpIHtcbiAgICBhLmlzU3RyaW5nKGYpICYmIChmID0gYS5fQnVmZmVyX2Zyb20oZiwgXCJiYXNlNjRcIikpO1xuICAgIHZhciBkID0gZi5sZW5ndGggPj4+IDA7XG4gICAgcmV0dXJuIHRoaXMudWludDMyKGQpLCBkICYmIHRoaXMuX3B1c2gocy53cml0ZUJ5dGVzQnVmZmVyLCBkLCBmKSwgdGhpcztcbiAgfTtcbiAgZnVuY3Rpb24gbCh1LCBmLCBkKSB7XG4gICAgdS5sZW5ndGggPCA0MCA/IGEudXRmOC53cml0ZSh1LCBmLCBkKSA6IGYudXRmOFdyaXRlID8gZi51dGY4V3JpdGUodSwgZCkgOiBmLndyaXRlKHUsIGQpO1xuICB9XG4gIHJldHVybiBzLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbihmKSB7XG4gICAgdmFyIGQgPSBhLkJ1ZmZlci5ieXRlTGVuZ3RoKGYpO1xuICAgIHJldHVybiB0aGlzLnVpbnQzMihkKSwgZCAmJiB0aGlzLl9wdXNoKGwsIGQsIGYpLCB0aGlzO1xuICB9LCBzLl9jb25maWd1cmUoKSwgd3JpdGVyX2J1ZmZlcjtcbn1cbnZhciByZWFkZXIsIGhhc1JlcXVpcmVkUmVhZGVyO1xuZnVuY3Rpb24gcmVxdWlyZVJlYWRlcigpIHtcbiAgaWYgKGhhc1JlcXVpcmVkUmVhZGVyKSByZXR1cm4gcmVhZGVyO1xuICBoYXNSZXF1aXJlZFJlYWRlciA9IDEsIHJlYWRlciA9IGY7XG4gIHZhciBwID0gcmVxdWlyZU1pbmltYWwkMSgpLCBhLCBzID0gcC5Mb25nQml0cywgbCA9IHAudXRmODtcbiAgZnVuY3Rpb24gdShlLCB0KSB7XG4gICAgcmV0dXJuIFJhbmdlRXJyb3IoXCJpbmRleCBvdXQgb2YgcmFuZ2U6IFwiICsgZS5wb3MgKyBcIiArIFwiICsgKHQgfHwgMSkgKyBcIiA+IFwiICsgZS5sZW4pO1xuICB9XG4gIGZ1bmN0aW9uIGYoZSkge1xuICAgIHRoaXMuYnVmID0gZSwgdGhpcy5wb3MgPSAwLCB0aGlzLmxlbiA9IGUubGVuZ3RoO1xuICB9XG4gIHZhciBkID0gdHlwZW9mIFVpbnQ4QXJyYXkgPCBcInVcIiA/IGZ1bmN0aW9uKHQpIHtcbiAgICBpZiAodCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgQXJyYXkuaXNBcnJheSh0KSlcbiAgICAgIHJldHVybiBuZXcgZih0KTtcbiAgICB0aHJvdyBFcnJvcihcImlsbGVnYWwgYnVmZmVyXCIpO1xuICB9IDogZnVuY3Rpb24odCkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHQpKVxuICAgICAgcmV0dXJuIG5ldyBmKHQpO1xuICAgIHRocm93IEVycm9yKFwiaWxsZWdhbCBidWZmZXJcIik7XG4gIH0sIHkgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcC5CdWZmZXIgPyBmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gKGYuY3JlYXRlID0gZnVuY3Rpb24oYykge1xuICAgICAgICByZXR1cm4gcC5CdWZmZXIuaXNCdWZmZXIoYykgPyBuZXcgYShjKSA6IGQoYyk7XG4gICAgICB9KShuKTtcbiAgICB9IDogZDtcbiAgfTtcbiAgZi5jcmVhdGUgPSB5KCksIGYucHJvdG90eXBlLl9zbGljZSA9IHAuQXJyYXkucHJvdG90eXBlLnN1YmFycmF5IHx8IC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIHAuQXJyYXkucHJvdG90eXBlLnNsaWNlLCBmLnByb3RvdHlwZS51aW50MzIgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gNDI5NDk2NzI5NTtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodCA9ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCB8fCAodCA9ICh0IHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgNykgPj4+IDAsIHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KSB8fCAodCA9ICh0IHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgMTQpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOCkgfHwgKHQgPSAodCB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IDIxKSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpIHx8ICh0ID0gKHQgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTUpIDw8IDI4KSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpKSByZXR1cm4gdDtcbiAgICAgIGlmICgodGhpcy5wb3MgKz0gNSkgPiB0aGlzLmxlbilcbiAgICAgICAgdGhyb3cgdGhpcy5wb3MgPSB0aGlzLmxlbiwgdSh0aGlzLCAxMCk7XG4gICAgICByZXR1cm4gdDtcbiAgICB9O1xuICB9KSgpLCBmLnByb3RvdHlwZS5pbnQzMiA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnVpbnQzMigpIHwgMDtcbiAgfSwgZi5wcm90b3R5cGUuc2ludDMyID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHQgPSB0aGlzLnVpbnQzMigpO1xuICAgIHJldHVybiB0ID4+PiAxIF4gLSh0ICYgMSkgfCAwO1xuICB9O1xuICBmdW5jdGlvbiBoKCkge1xuICAgIHZhciBlID0gbmV3IHMoMCwgMCksIHQgPSAwO1xuICAgIGlmICh0aGlzLmxlbiAtIHRoaXMucG9zID4gNCkge1xuICAgICAgZm9yICg7IHQgPCA0OyArK3QpXG4gICAgICAgIGlmIChlLmxvID0gKGUubG8gfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCB0ICogNykgPj4+IDAsIHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICAgIHJldHVybiBlO1xuICAgICAgaWYgKGUubG8gPSAoZS5sbyB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IDI4KSA+Pj4gMCwgZS5oaSA9IChlLmhpIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPj4gNCkgPj4+IDAsIHRoaXMuYnVmW3RoaXMucG9zKytdIDwgMTI4KVxuICAgICAgICByZXR1cm4gZTtcbiAgICAgIHQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKDsgdCA8IDM7ICsrdCkge1xuICAgICAgICBpZiAodGhpcy5wb3MgPj0gdGhpcy5sZW4pXG4gICAgICAgICAgdGhyb3cgdSh0aGlzKTtcbiAgICAgICAgaWYgKGUubG8gPSAoZS5sbyB8ICh0aGlzLmJ1Zlt0aGlzLnBvc10gJiAxMjcpIDw8IHQgKiA3KSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpXG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZS5sbyA9IChlLmxvIHwgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMTI3KSA8PCB0ICogNykgPj4+IDAsIGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmxlbiAtIHRoaXMucG9zID4gNCkge1xuICAgICAgZm9yICg7IHQgPCA1OyArK3QpXG4gICAgICAgIGlmIChlLmhpID0gKGUuaGkgfCAodGhpcy5idWZbdGhpcy5wb3NdICYgMTI3KSA8PCB0ICogNyArIDMpID4+PiAwLCB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA8IDEyOClcbiAgICAgICAgICByZXR1cm4gZTtcbiAgICB9IGVsc2VcbiAgICAgIGZvciAoOyB0IDwgNTsgKyt0KSB7XG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmxlbilcbiAgICAgICAgICB0aHJvdyB1KHRoaXMpO1xuICAgICAgICBpZiAoZS5oaSA9IChlLmhpIHwgKHRoaXMuYnVmW3RoaXMucG9zXSAmIDEyNykgPDwgdCAqIDcgKyAzKSA+Pj4gMCwgdGhpcy5idWZbdGhpcy5wb3MrK10gPCAxMjgpXG4gICAgICAgICAgcmV0dXJuIGU7XG4gICAgICB9XG4gICAgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIHZhcmludCBlbmNvZGluZ1wiKTtcbiAgfVxuICBmLnByb3RvdHlwZS5ib29sID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudWludDMyKCkgIT09IDA7XG4gIH07XG4gIGZ1bmN0aW9uIG8oZSwgdCkge1xuICAgIHJldHVybiAoZVt0IC0gNF0gfCBlW3QgLSAzXSA8PCA4IHwgZVt0IC0gMl0gPDwgMTYgfCBlW3QgLSAxXSA8PCAyNCkgPj4+IDA7XG4gIH1cbiAgZi5wcm90b3R5cGUuZml4ZWQzMiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBvcyArIDQgPiB0aGlzLmxlbilcbiAgICAgIHRocm93IHUodGhpcywgNCk7XG4gICAgcmV0dXJuIG8odGhpcy5idWYsIHRoaXMucG9zICs9IDQpO1xuICB9LCBmLnByb3RvdHlwZS5zZml4ZWQzMiA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBvcyArIDQgPiB0aGlzLmxlbilcbiAgICAgIHRocm93IHUodGhpcywgNCk7XG4gICAgcmV0dXJuIG8odGhpcy5idWYsIHRoaXMucG9zICs9IDQpIHwgMDtcbiAgfTtcbiAgZnVuY3Rpb24gaSgpIHtcbiAgICBpZiAodGhpcy5wb3MgKyA4ID4gdGhpcy5sZW4pXG4gICAgICB0aHJvdyB1KHRoaXMsIDgpO1xuICAgIHJldHVybiBuZXcgcyhvKHRoaXMuYnVmLCB0aGlzLnBvcyArPSA0KSwgbyh0aGlzLmJ1ZiwgdGhpcy5wb3MgKz0gNCkpO1xuICB9XG4gIHJldHVybiBmLnByb3RvdHlwZS5mbG9hdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBvcyArIDQgPiB0aGlzLmxlbilcbiAgICAgIHRocm93IHUodGhpcywgNCk7XG4gICAgdmFyIHQgPSBwLmZsb2F0LnJlYWRGbG9hdExFKHRoaXMuYnVmLCB0aGlzLnBvcyk7XG4gICAgcmV0dXJuIHRoaXMucG9zICs9IDQsIHQ7XG4gIH0sIGYucHJvdG90eXBlLmRvdWJsZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh0aGlzLnBvcyArIDggPiB0aGlzLmxlbilcbiAgICAgIHRocm93IHUodGhpcywgNCk7XG4gICAgdmFyIHQgPSBwLmZsb2F0LnJlYWREb3VibGVMRSh0aGlzLmJ1ZiwgdGhpcy5wb3MpO1xuICAgIHJldHVybiB0aGlzLnBvcyArPSA4LCB0O1xuICB9LCBmLnByb3RvdHlwZS5ieXRlcyA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciB0ID0gdGhpcy51aW50MzIoKSwgbiA9IHRoaXMucG9zLCByID0gdGhpcy5wb3MgKyB0O1xuICAgIGlmIChyID4gdGhpcy5sZW4pXG4gICAgICB0aHJvdyB1KHRoaXMsIHQpO1xuICAgIGlmICh0aGlzLnBvcyArPSB0LCBBcnJheS5pc0FycmF5KHRoaXMuYnVmKSlcbiAgICAgIHJldHVybiB0aGlzLmJ1Zi5zbGljZShuLCByKTtcbiAgICBpZiAobiA9PT0gcikge1xuICAgICAgdmFyIGMgPSBwLkJ1ZmZlcjtcbiAgICAgIHJldHVybiBjID8gYy5hbGxvYygwKSA6IG5ldyB0aGlzLmJ1Zi5jb25zdHJ1Y3RvcigwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3NsaWNlLmNhbGwodGhpcy5idWYsIG4sIHIpO1xuICB9LCBmLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdCA9IHRoaXMuYnl0ZXMoKTtcbiAgICByZXR1cm4gbC5yZWFkKHQsIDAsIHQubGVuZ3RoKTtcbiAgfSwgZi5wcm90b3R5cGUuc2tpcCA9IGZ1bmN0aW9uKHQpIHtcbiAgICBpZiAodHlwZW9mIHQgPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHRoaXMucG9zICsgdCA+IHRoaXMubGVuKVxuICAgICAgICB0aHJvdyB1KHRoaXMsIHQpO1xuICAgICAgdGhpcy5wb3MgKz0gdDtcbiAgICB9IGVsc2VcbiAgICAgIGRvXG4gICAgICAgIGlmICh0aGlzLnBvcyA+PSB0aGlzLmxlbilcbiAgICAgICAgICB0aHJvdyB1KHRoaXMpO1xuICAgICAgd2hpbGUgKHRoaXMuYnVmW3RoaXMucG9zKytdICYgMTI4KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfSwgZi5wcm90b3R5cGUuc2tpcFR5cGUgPSBmdW5jdGlvbihlKSB7XG4gICAgc3dpdGNoIChlKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHRoaXMuc2tpcCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgdGhpcy5za2lwKDgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgdGhpcy5za2lwKHRoaXMudWludDMyKCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZm9yICg7IChlID0gdGhpcy51aW50MzIoKSAmIDcpICE9PSA0OyApXG4gICAgICAgICAgdGhpcy5za2lwVHlwZShlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHRoaXMuc2tpcCg0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgRXJyb3IoXCJpbnZhbGlkIHdpcmUgdHlwZSBcIiArIGUgKyBcIiBhdCBvZmZzZXQgXCIgKyB0aGlzLnBvcyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9LCBmLl9jb25maWd1cmUgPSBmdW5jdGlvbihlKSB7XG4gICAgYSA9IGUsIGYuY3JlYXRlID0geSgpLCBhLl9jb25maWd1cmUoKTtcbiAgICB2YXIgdCA9IHAuTG9uZyA/IFwidG9Mb25nXCIgOiAoXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgXCJ0b051bWJlclwiXG4gICAgKTtcbiAgICBwLm1lcmdlKGYucHJvdG90eXBlLCB7XG4gICAgICBpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBoLmNhbGwodGhpcylbdF0oZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIHVpbnQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBoLmNhbGwodGhpcylbdF0odHJ1ZSk7XG4gICAgICB9LFxuICAgICAgc2ludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGguY2FsbCh0aGlzKS56ekRlY29kZSgpW3RdKGZhbHNlKTtcbiAgICAgIH0sXG4gICAgICBmaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGkuY2FsbCh0aGlzKVt0XSh0cnVlKTtcbiAgICAgIH0sXG4gICAgICBzZml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBpLmNhbGwodGhpcylbdF0oZmFsc2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LCByZWFkZXI7XG59XG52YXIgcmVhZGVyX2J1ZmZlciwgaGFzUmVxdWlyZWRSZWFkZXJfYnVmZmVyO1xuZnVuY3Rpb24gcmVxdWlyZVJlYWRlcl9idWZmZXIoKSB7XG4gIGlmIChoYXNSZXF1aXJlZFJlYWRlcl9idWZmZXIpIHJldHVybiByZWFkZXJfYnVmZmVyO1xuICBoYXNSZXF1aXJlZFJlYWRlcl9idWZmZXIgPSAxLCByZWFkZXJfYnVmZmVyID0gcztcbiAgdmFyIHAgPSByZXF1aXJlUmVhZGVyKCk7XG4gIChzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocC5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IHM7XG4gIHZhciBhID0gcmVxdWlyZU1pbmltYWwkMSgpO1xuICBmdW5jdGlvbiBzKGwpIHtcbiAgICBwLmNhbGwodGhpcywgbCk7XG4gIH1cbiAgcmV0dXJuIHMuX2NvbmZpZ3VyZSA9IGZ1bmN0aW9uKCkge1xuICAgIGEuQnVmZmVyICYmIChzLnByb3RvdHlwZS5fc2xpY2UgPSBhLkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UpO1xuICB9LCBzLnByb3RvdHlwZS5zdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdSA9IHRoaXMudWludDMyKCk7XG4gICAgcmV0dXJuIHRoaXMuYnVmLnV0ZjhTbGljZSA/IHRoaXMuYnVmLnV0ZjhTbGljZSh0aGlzLnBvcywgdGhpcy5wb3MgPSBNYXRoLm1pbih0aGlzLnBvcyArIHUsIHRoaXMubGVuKSkgOiB0aGlzLmJ1Zi50b1N0cmluZyhcInV0Zi04XCIsIHRoaXMucG9zLCB0aGlzLnBvcyA9IE1hdGgubWluKHRoaXMucG9zICsgdSwgdGhpcy5sZW4pKTtcbiAgfSwgcy5fY29uZmlndXJlKCksIHJlYWRlcl9idWZmZXI7XG59XG52YXIgcnBjID0ge30sIHNlcnZpY2UsIGhhc1JlcXVpcmVkU2VydmljZTtcbmZ1bmN0aW9uIHJlcXVpcmVTZXJ2aWNlKCkge1xuICBpZiAoaGFzUmVxdWlyZWRTZXJ2aWNlKSByZXR1cm4gc2VydmljZTtcbiAgaGFzUmVxdWlyZWRTZXJ2aWNlID0gMSwgc2VydmljZSA9IGE7XG4gIHZhciBwID0gcmVxdWlyZU1pbmltYWwkMSgpO1xuICAoYS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHAuRXZlbnRFbWl0dGVyLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gYTtcbiAgZnVuY3Rpb24gYShzLCBsLCB1KSB7XG4gICAgaWYgKHR5cGVvZiBzICE9IFwiZnVuY3Rpb25cIilcbiAgICAgIHRocm93IFR5cGVFcnJvcihcInJwY0ltcGwgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO1xuICAgIHAuRXZlbnRFbWl0dGVyLmNhbGwodGhpcyksIHRoaXMucnBjSW1wbCA9IHMsIHRoaXMucmVxdWVzdERlbGltaXRlZCA9ICEhbCwgdGhpcy5yZXNwb25zZURlbGltaXRlZCA9ICEhdTtcbiAgfVxuICByZXR1cm4gYS5wcm90b3R5cGUucnBjQ2FsbCA9IGZ1bmN0aW9uIHMobCwgdSwgZiwgZCwgeSkge1xuICAgIGlmICghZClcbiAgICAgIHRocm93IFR5cGVFcnJvcihcInJlcXVlc3QgbXVzdCBiZSBzcGVjaWZpZWRcIik7XG4gICAgdmFyIGggPSB0aGlzO1xuICAgIGlmICgheSlcbiAgICAgIHJldHVybiBwLmFzUHJvbWlzZShzLCBoLCBsLCB1LCBmLCBkKTtcbiAgICBpZiAoIWgucnBjSW1wbCkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgeShFcnJvcihcImFscmVhZHkgZW5kZWRcIikpO1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gaC5ycGNJbXBsKFxuICAgICAgICBsLFxuICAgICAgICB1W2gucmVxdWVzdERlbGltaXRlZCA/IFwiZW5jb2RlRGVsaW1pdGVkXCIgOiBcImVuY29kZVwiXShkKS5maW5pc2goKSxcbiAgICAgICAgZnVuY3Rpb24oaSwgZSkge1xuICAgICAgICAgIGlmIChpKVxuICAgICAgICAgICAgcmV0dXJuIGguZW1pdChcImVycm9yXCIsIGksIGwpLCB5KGkpO1xuICAgICAgICAgIGlmIChlID09PSBudWxsKSB7XG4gICAgICAgICAgICBoLmVuZChcbiAgICAgICAgICAgICAgLyogZW5kZWRCeVJQQyAqL1xuICAgICAgICAgICAgICAhMFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIGYpKVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZSA9IGZbaC5yZXNwb25zZURlbGltaXRlZCA/IFwiZGVjb2RlRGVsaW1pdGVkXCIgOiBcImRlY29kZVwiXShlKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGguZW1pdChcImVycm9yXCIsIHQsIGwpLCB5KHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoLmVtaXQoXCJkYXRhXCIsIGUsIGwpLCB5KG51bGwsIGUpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0gY2F0Y2ggKG8pIHtcbiAgICAgIGguZW1pdChcImVycm9yXCIsIG8sIGwpLCBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB5KG8pO1xuICAgICAgfSwgMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LCBhLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbihsKSB7XG4gICAgcmV0dXJuIHRoaXMucnBjSW1wbCAmJiAobCB8fCB0aGlzLnJwY0ltcGwobnVsbCwgbnVsbCwgbnVsbCksIHRoaXMucnBjSW1wbCA9IG51bGwsIHRoaXMuZW1pdChcImVuZFwiKS5vZmYoKSksIHRoaXM7XG4gIH0sIHNlcnZpY2U7XG59XG52YXIgaGFzUmVxdWlyZWRScGM7XG5mdW5jdGlvbiByZXF1aXJlUnBjKCkge1xuICByZXR1cm4gaGFzUmVxdWlyZWRScGMgfHwgKGhhc1JlcXVpcmVkUnBjID0gMSwgKGZ1bmN0aW9uKHApIHtcbiAgICB2YXIgYSA9IHA7XG4gICAgYS5TZXJ2aWNlID0gcmVxdWlyZVNlcnZpY2UoKTtcbiAgfSkocnBjKSksIHJwYztcbn1cbnZhciByb290cywgaGFzUmVxdWlyZWRSb290cztcbmZ1bmN0aW9uIHJlcXVpcmVSb290cygpIHtcbiAgcmV0dXJuIGhhc1JlcXVpcmVkUm9vdHMgfHwgKGhhc1JlcXVpcmVkUm9vdHMgPSAxLCByb290cyA9IHt9KSwgcm9vdHM7XG59XG52YXIgaGFzUmVxdWlyZWRJbmRleE1pbmltYWw7XG5mdW5jdGlvbiByZXF1aXJlSW5kZXhNaW5pbWFsKCkge1xuICByZXR1cm4gaGFzUmVxdWlyZWRJbmRleE1pbmltYWwgfHwgKGhhc1JlcXVpcmVkSW5kZXhNaW5pbWFsID0gMSwgKGZ1bmN0aW9uKHApIHtcbiAgICB2YXIgYSA9IHA7XG4gICAgYS5idWlsZCA9IFwibWluaW1hbFwiLCBhLldyaXRlciA9IHJlcXVpcmVXcml0ZXIoKSwgYS5CdWZmZXJXcml0ZXIgPSByZXF1aXJlV3JpdGVyX2J1ZmZlcigpLCBhLlJlYWRlciA9IHJlcXVpcmVSZWFkZXIoKSwgYS5CdWZmZXJSZWFkZXIgPSByZXF1aXJlUmVhZGVyX2J1ZmZlcigpLCBhLnV0aWwgPSByZXF1aXJlTWluaW1hbCQxKCksIGEucnBjID0gcmVxdWlyZVJwYygpLCBhLnJvb3RzID0gcmVxdWlyZVJvb3RzKCksIGEuY29uZmlndXJlID0gcztcbiAgICBmdW5jdGlvbiBzKCkge1xuICAgICAgYS51dGlsLl9jb25maWd1cmUoKSwgYS5Xcml0ZXIuX2NvbmZpZ3VyZShhLkJ1ZmZlcldyaXRlciksIGEuUmVhZGVyLl9jb25maWd1cmUoYS5CdWZmZXJSZWFkZXIpO1xuICAgIH1cbiAgICBzKCk7XG4gIH0pKGluZGV4TWluaW1hbCkpLCBpbmRleE1pbmltYWw7XG59XG52YXIgbWluaW1hbCwgaGFzUmVxdWlyZWRNaW5pbWFsO1xuZnVuY3Rpb24gcmVxdWlyZU1pbmltYWwoKSB7XG4gIHJldHVybiBoYXNSZXF1aXJlZE1pbmltYWwgfHwgKGhhc1JlcXVpcmVkTWluaW1hbCA9IDEsIG1pbmltYWwgPSByZXF1aXJlSW5kZXhNaW5pbWFsKCkpLCBtaW5pbWFsO1xufVxudmFyIHJvb3QsIGhhc1JlcXVpcmVkUm9vdDtcbmZ1bmN0aW9uIHJlcXVpcmVSb290KCkge1xuICBpZiAoaGFzUmVxdWlyZWRSb290KSByZXR1cm4gcm9vdDtcbiAgaGFzUmVxdWlyZWRSb290ID0gMTtcbiAgdmFyIHAgPSByZXF1aXJlTWluaW1hbCgpLCBhID0gcC5SZWFkZXIsIHMgPSBwLldyaXRlciwgbCA9IHAudXRpbCwgdSA9IHAucm9vdHMuZGVmYXVsdCB8fCAocC5yb290cy5kZWZhdWx0ID0ge30pO1xuICByZXR1cm4gdS5vcGVudGVsZW1ldHJ5ID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBmID0ge307XG4gICAgcmV0dXJuIGYucHJvdG8gPSAoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZCA9IHt9O1xuICAgICAgcmV0dXJuIGQuY29tbW9uID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHt9O1xuICAgICAgICByZXR1cm4geS52MSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgaCA9IHt9O1xuICAgICAgICAgIHJldHVybiBoLkFueVZhbHVlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICAgICAgICAgIGlmIChlKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgZVt0W25dXSAhPSBudWxsICYmICh0aGlzW3Rbbl1dID0gZVt0W25dXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvLnByb3RvdHlwZS5zdHJpbmdWYWx1ZSA9IG51bGwsIG8ucHJvdG90eXBlLmJvb2xWYWx1ZSA9IG51bGwsIG8ucHJvdG90eXBlLmludFZhbHVlID0gbnVsbCwgby5wcm90b3R5cGUuZG91YmxlVmFsdWUgPSBudWxsLCBvLnByb3RvdHlwZS5hcnJheVZhbHVlID0gbnVsbCwgby5wcm90b3R5cGUua3ZsaXN0VmFsdWUgPSBudWxsLCBvLnByb3RvdHlwZS5ieXRlc1ZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwgXCJ2YWx1ZVwiLCB7XG4gICAgICAgICAgICAgIGdldDogbC5vbmVPZkdldHRlcihpID0gW1wic3RyaW5nVmFsdWVcIiwgXCJib29sVmFsdWVcIiwgXCJpbnRWYWx1ZVwiLCBcImRvdWJsZVZhbHVlXCIsIFwiYXJyYXlWYWx1ZVwiLCBcImt2bGlzdFZhbHVlXCIsIFwiYnl0ZXNWYWx1ZVwiXSksXG4gICAgICAgICAgICAgIHNldDogbC5vbmVPZlNldHRlcihpKVxuICAgICAgICAgICAgfSksIG8uY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8odCk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5zdHJpbmdWYWx1ZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwic3RyaW5nVmFsdWVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICApLnN0cmluZyh0LnN0cmluZ1ZhbHVlKSwgdC5ib29sVmFsdWUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImJvb2xWYWx1ZVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgIDE2XG4gICAgICAgICAgICAgICkuYm9vbCh0LmJvb2xWYWx1ZSksIHQuaW50VmFsdWUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImludFZhbHVlXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDMsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgMjRcbiAgICAgICAgICAgICAgKS5pbnQ2NCh0LmludFZhbHVlKSwgdC5kb3VibGVWYWx1ZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZG91YmxlVmFsdWVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNCwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAzM1xuICAgICAgICAgICAgICApLmRvdWJsZSh0LmRvdWJsZVZhbHVlKSwgdC5hcnJheVZhbHVlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJhcnJheVZhbHVlXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZS5lbmNvZGUodC5hcnJheVZhbHVlLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA1LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDQyXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgdC5rdmxpc3RWYWx1ZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwia3ZsaXN0VmFsdWVcIikgJiYgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZUxpc3QuZW5jb2RlKHQua3ZsaXN0VmFsdWUsIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDYsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNTBcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0LmJ5dGVzVmFsdWUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImJ5dGVzVmFsdWVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICA1OFxuICAgICAgICAgICAgICApLmJ5dGVzKHQuYnl0ZXNWYWx1ZSksIG47XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZSgpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHYgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICBjLnN0cmluZ1ZhbHVlID0gdC5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5ib29sVmFsdWUgPSB0LmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5pbnRWYWx1ZSA9IHQuaW50NjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5kb3VibGVWYWx1ZSA9IHQuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuYXJyYXlWYWx1ZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZS5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICAgICAgICAgIGMua3ZsaXN0VmFsdWUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlTGlzdC5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA3OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuYnl0ZXNWYWx1ZSA9IHQuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKHQuc3RyaW5nVmFsdWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwic3RyaW5nVmFsdWVcIikgJiYgKG4udmFsdWUgPSAxLCAhbC5pc1N0cmluZyh0LnN0cmluZ1ZhbHVlKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RyaW5nVmFsdWU6IHN0cmluZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5ib29sVmFsdWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYm9vbFZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4udmFsdWUgPT09IDEpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgaWYgKG4udmFsdWUgPSAxLCB0eXBlb2YgdC5ib29sVmFsdWUgIT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJib29sVmFsdWU6IGJvb2xlYW4gZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5pbnRWYWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJpbnRWYWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgIGlmIChuLnZhbHVlID09PSAxKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidmFsdWU6IG11bHRpcGxlIHZhbHVlc1wiO1xuICAgICAgICAgICAgICAgIGlmIChuLnZhbHVlID0gMSwgIWwuaXNJbnRlZ2VyKHQuaW50VmFsdWUpICYmICEodC5pbnRWYWx1ZSAmJiBsLmlzSW50ZWdlcih0LmludFZhbHVlLmxvdykgJiYgbC5pc0ludGVnZXIodC5pbnRWYWx1ZS5oaWdoKSkpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJpbnRWYWx1ZTogaW50ZWdlcnxMb25nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuZG91YmxlVmFsdWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZG91YmxlVmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXNcIjtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9IDEsIHR5cGVvZiB0LmRvdWJsZVZhbHVlICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJkb3VibGVWYWx1ZTogbnVtYmVyIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuYXJyYXlWYWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhcnJheVZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4udmFsdWUgPT09IDEpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgbi52YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFycmF5VmFsdWUudmVyaWZ5KHQuYXJyYXlWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXJyYXlWYWx1ZS5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0Lmt2bGlzdFZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImt2bGlzdFZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4udmFsdWUgPT09IDEpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJ2YWx1ZTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgbi52YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlTGlzdC52ZXJpZnkodC5rdmxpc3RWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwia3ZsaXN0VmFsdWUuXCIgKyByO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5ieXRlc1ZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImJ5dGVzVmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXNcIjtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9IDEsICEodC5ieXRlc1ZhbHVlICYmIHR5cGVvZiB0LmJ5dGVzVmFsdWUubGVuZ3RoID09IFwibnVtYmVyXCIgfHwgbC5pc1N0cmluZyh0LmJ5dGVzVmFsdWUpKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImJ5dGVzVmFsdWU6IGJ1ZmZlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQW55VmFsdWUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQW55VmFsdWUoKTtcbiAgICAgICAgICAgICAgaWYgKHQuc3RyaW5nVmFsdWUgIT0gbnVsbCAmJiAobi5zdHJpbmdWYWx1ZSA9IFN0cmluZyh0LnN0cmluZ1ZhbHVlKSksIHQuYm9vbFZhbHVlICE9IG51bGwgJiYgKG4uYm9vbFZhbHVlID0gISF0LmJvb2xWYWx1ZSksIHQuaW50VmFsdWUgIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uaW50VmFsdWUgPSBsLkxvbmcuZnJvbVZhbHVlKHQuaW50VmFsdWUpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuaW50VmFsdWUgPT0gXCJzdHJpbmdcIiA/IG4uaW50VmFsdWUgPSBwYXJzZUludCh0LmludFZhbHVlLCAxMCkgOiB0eXBlb2YgdC5pbnRWYWx1ZSA9PSBcIm51bWJlclwiID8gbi5pbnRWYWx1ZSA9IHQuaW50VmFsdWUgOiB0eXBlb2YgdC5pbnRWYWx1ZSA9PSBcIm9iamVjdFwiICYmIChuLmludFZhbHVlID0gbmV3IGwuTG9uZ0JpdHModC5pbnRWYWx1ZS5sb3cgPj4+IDAsIHQuaW50VmFsdWUuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LmRvdWJsZVZhbHVlICE9IG51bGwgJiYgKG4uZG91YmxlVmFsdWUgPSBOdW1iZXIodC5kb3VibGVWYWx1ZSkpLCB0LmFycmF5VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5hcnJheVZhbHVlICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQW55VmFsdWUuYXJyYXlWYWx1ZTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uYXJyYXlWYWx1ZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZS5mcm9tT2JqZWN0KHQuYXJyYXlWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQua3ZsaXN0VmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5rdmxpc3RWYWx1ZSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLmt2bGlzdFZhbHVlOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgbi5rdmxpc3RWYWx1ZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWVMaXN0LmZyb21PYmplY3QodC5rdmxpc3RWYWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQuYnl0ZXNWYWx1ZSAhPSBudWxsICYmICh0eXBlb2YgdC5ieXRlc1ZhbHVlID09IFwic3RyaW5nXCIgPyBsLmJhc2U2NC5kZWNvZGUodC5ieXRlc1ZhbHVlLCBuLmJ5dGVzVmFsdWUgPSBsLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgodC5ieXRlc1ZhbHVlKSksIDApIDogdC5ieXRlc1ZhbHVlLmxlbmd0aCA+PSAwICYmIChuLmJ5dGVzVmFsdWUgPSB0LmJ5dGVzVmFsdWUpKSwgbjtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgIHJldHVybiB0LnN0cmluZ1ZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN0cmluZ1ZhbHVlXCIpICYmIChyLnN0cmluZ1ZhbHVlID0gdC5zdHJpbmdWYWx1ZSwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcInN0cmluZ1ZhbHVlXCIpKSwgdC5ib29sVmFsdWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYm9vbFZhbHVlXCIpICYmIChyLmJvb2xWYWx1ZSA9IHQuYm9vbFZhbHVlLCBuLm9uZW9mcyAmJiAoci52YWx1ZSA9IFwiYm9vbFZhbHVlXCIpKSwgdC5pbnRWYWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJpbnRWYWx1ZVwiKSAmJiAodHlwZW9mIHQuaW50VmFsdWUgPT0gXCJudW1iZXJcIiA/IHIuaW50VmFsdWUgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcodC5pbnRWYWx1ZSkgOiB0LmludFZhbHVlIDogci5pbnRWYWx1ZSA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0LmludFZhbHVlKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKHQuaW50VmFsdWUubG93ID4+PiAwLCB0LmludFZhbHVlLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiB0LmludFZhbHVlLCBuLm9uZW9mcyAmJiAoci52YWx1ZSA9IFwiaW50VmFsdWVcIikpLCB0LmRvdWJsZVZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImRvdWJsZVZhbHVlXCIpICYmIChyLmRvdWJsZVZhbHVlID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LmRvdWJsZVZhbHVlKSA/IFN0cmluZyh0LmRvdWJsZVZhbHVlKSA6IHQuZG91YmxlVmFsdWUsIG4ub25lb2ZzICYmIChyLnZhbHVlID0gXCJkb3VibGVWYWx1ZVwiKSksIHQuYXJyYXlWYWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhcnJheVZhbHVlXCIpICYmIChyLmFycmF5VmFsdWUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFycmF5VmFsdWUudG9PYmplY3QodC5hcnJheVZhbHVlLCBuKSwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcImFycmF5VmFsdWVcIikpLCB0Lmt2bGlzdFZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImt2bGlzdFZhbHVlXCIpICYmIChyLmt2bGlzdFZhbHVlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZUxpc3QudG9PYmplY3QodC5rdmxpc3RWYWx1ZSwgbiksIG4ub25lb2ZzICYmIChyLnZhbHVlID0gXCJrdmxpc3RWYWx1ZVwiKSksIHQuYnl0ZXNWYWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJieXRlc1ZhbHVlXCIpICYmIChyLmJ5dGVzVmFsdWUgPSBuLmJ5dGVzID09PSBTdHJpbmcgPyBsLmJhc2U2NC5lbmNvZGUodC5ieXRlc1ZhbHVlLCAwLCB0LmJ5dGVzVmFsdWUubGVuZ3RoKSA6IG4uYnl0ZXMgPT09IEFycmF5ID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC5ieXRlc1ZhbHVlKSA6IHQuYnl0ZXNWYWx1ZSwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcImJ5dGVzVmFsdWVcIikpLCByO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgdCArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguQXJyYXlWYWx1ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy52YWx1ZXMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnZhbHVlcyA9IGwuZW1wdHlBcnJheSwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnZhbHVlcyAhPSBudWxsICYmIGUudmFsdWVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUudmFsdWVzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS5lbmNvZGUoZS52YWx1ZXNbbl0sIHQudWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUoZSwgdCkubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBhLmNyZWF0ZShlKSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0ID09PSB2b2lkIDAgPyBlLmxlbiA6IGUucG9zICsgdCwgciA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFycmF5VmFsdWUoKTsgZS5wb3MgPCBuOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgci52YWx1ZXMgJiYgci52YWx1ZXMubGVuZ3RoIHx8IChyLnZhbHVlcyA9IFtdKSwgci52YWx1ZXMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnZhbHVlcyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZXNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS52YWx1ZXMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidmFsdWVzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS52YWx1ZXMubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS52ZXJpZnkoZS52YWx1ZXNbdF0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlcy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BcnJheVZhbHVlKCk7XG4gICAgICAgICAgICAgIGlmIChlLnZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnZhbHVlcykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZS52YWx1ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQudmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnZhbHVlcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnZhbHVlc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQXJyYXlWYWx1ZS52YWx1ZXM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQudmFsdWVzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS5mcm9tT2JqZWN0KGUudmFsdWVzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnZhbHVlcyA9IFtdKSwgZS52YWx1ZXMgJiYgZS52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi52YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUudmFsdWVzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi52YWx1ZXNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLnRvT2JqZWN0KGUudmFsdWVzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BcnJheVZhbHVlXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguS2V5VmFsdWVMaXN0ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnZhbHVlcyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUudmFsdWVzID0gbC5lbXB0eUFycmF5LCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGUpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gcy5jcmVhdGUoKSksIGUudmFsdWVzICE9IG51bGwgJiYgZS52YWx1ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS52YWx1ZXMubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmVuY29kZShlLnZhbHVlc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWVMaXN0KCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudmFsdWVzICYmIHIudmFsdWVzLmxlbmd0aCB8fCAoci52YWx1ZXMgPSBbXSksIHIudmFsdWVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGUuc2tpcFR5cGUoYyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gbmV3IGEoZSkpLCB0aGlzLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gXCJvYmplY3RcIiB8fCBlID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS52YWx1ZXMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidmFsdWVzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUudmFsdWVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUudmFsdWVzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudmVyaWZ5KGUudmFsdWVzW3RdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ2YWx1ZXMuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlTGlzdClcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZUxpc3QoKTtcbiAgICAgICAgICAgICAgaWYgKGUudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUudmFsdWVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZUxpc3QudmFsdWVzOiBhcnJheSBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB0LnZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS52YWx1ZXMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS52YWx1ZXNbbl0gIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlTGlzdC52YWx1ZXM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQudmFsdWVzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5mcm9tT2JqZWN0KGUudmFsdWVzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnZhbHVlcyA9IFtdKSwgZS52YWx1ZXMgJiYgZS52YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi52YWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUudmFsdWVzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi52YWx1ZXNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnRvT2JqZWN0KGUudmFsdWVzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZUxpc3RcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5LZXlWYWx1ZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLmtleSA9IG51bGwsIG8ucHJvdG90eXBlLnZhbHVlID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLmtleSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwia2V5XCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgKS5zdHJpbmcoZS5rZXkpLCBlLnZhbHVlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJ2YWx1ZVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLmVuY29kZShlLnZhbHVlLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDE4XG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgdDtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUoZSwgdCkubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBhLmNyZWF0ZShlKSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0ID09PSB2b2lkIDAgPyBlLmxlbiA6IGUucG9zICsgdCwgciA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIua2V5ID0gZS5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci52YWx1ZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQW55VmFsdWUuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGUuc2tpcFR5cGUoYyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gbmV3IGEoZSkpLCB0aGlzLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gXCJvYmplY3RcIiB8fCBlID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5rZXkgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwia2V5XCIpICYmICFsLmlzU3RyaW5nKGUua2V5KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJrZXk6IHN0cmluZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS52YWx1ZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS52ZXJpZnkoZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJ2YWx1ZS5cIiArIHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZSgpO1xuICAgICAgICAgICAgICBpZiAoZS5rZXkgIT0gbnVsbCAmJiAodC5rZXkgPSBTdHJpbmcoZS5rZXkpKSwgZS52YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnZhbHVlICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudmFsdWU6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB0LnZhbHVlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS5mcm9tT2JqZWN0KGUudmFsdWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdHMgJiYgKG4ua2V5ID0gXCJcIiwgbi52YWx1ZSA9IG51bGwpLCBlLmtleSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJrZXlcIikgJiYgKG4ua2V5ID0gZS5rZXkpLCBlLnZhbHVlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpICYmIChuLnZhbHVlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS50b09iamVjdChlLnZhbHVlLCB0KSksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWVcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5JbnN0cnVtZW50YXRpb25TY29wZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzID0gW10sIGkpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IE9iamVjdC5rZXlzKGkpLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICAgICAgICBpW2VbdF1dICE9IG51bGwgJiYgKHRoaXNbZVt0XV0gPSBpW2VbdF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvLnByb3RvdHlwZS5uYW1lID0gbnVsbCwgby5wcm90b3R5cGUudmVyc2lvbiA9IG51bGwsIG8ucHJvdG90eXBlLmF0dHJpYnV0ZXMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSBudWxsLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGUpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gcy5jcmVhdGUoKSksIGUubmFtZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwibmFtZVwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICkuc3RyaW5nKGUubmFtZSksIGUudmVyc2lvbiAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwidmVyc2lvblwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDE4XG4gICAgICAgICAgICAgICkuc3RyaW5nKGUudmVyc2lvbiksIGUuYXR0cmlidXRlcyAhPSBudWxsICYmIGUuYXR0cmlidXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmVuY29kZShlLmF0dHJpYnV0ZXNbbl0sIHQudWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCAzLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDQsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgMzJcbiAgICAgICAgICAgICAgKS51aW50MzIoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSwgdDtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUoZSwgdCkubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBhLmNyZWF0ZShlKSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0ID09PSB2b2lkIDAgPyBlLmxlbiA6IGUucG9zICsgdCwgciA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIubmFtZSA9IGUuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudmVyc2lvbiA9IGUuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlcyAmJiByLmF0dHJpYnV0ZXMubGVuZ3RoIHx8IChyLmF0dHJpYnV0ZXMgPSBbXSksIHIuYXR0cmlidXRlcy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6IHtcbiAgICAgICAgICAgICAgICAgICAgci5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBlLnNraXBUeXBlKGMgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IG5ldyBhKGUpKSwgdGhpcy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUubmFtZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmICFsLmlzU3RyaW5nKGUubmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibmFtZTogc3RyaW5nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnZlcnNpb24gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidmVyc2lvblwiKSAmJiAhbC5pc1N0cmluZyhlLnZlcnNpb24pKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInZlcnNpb246IHN0cmluZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS52ZXJpZnkoZS5hdHRyaWJ1dGVzW3RdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhdHRyaWJ1dGVzLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIpICYmICFsLmlzSW50ZWdlcihlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpID8gXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50OiBpbnRlZ2VyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUoKTtcbiAgICAgICAgICAgICAgaWYgKGUubmFtZSAhPSBudWxsICYmICh0Lm5hbWUgPSBTdHJpbmcoZS5uYW1lKSksIGUudmVyc2lvbiAhPSBudWxsICYmICh0LnZlcnNpb24gPSBTdHJpbmcoZS52ZXJzaW9uKSksIGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYXR0cmlidXRlc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUuYXR0cmlidXRlczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5hdHRyaWJ1dGVzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5mcm9tT2JqZWN0KGUuYXR0cmlidXRlc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiAodC5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID4+PiAwKSwgdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4uYXR0cmlidXRlcyA9IFtdKSwgdC5kZWZhdWx0cyAmJiAobi5uYW1lID0gXCJcIiwgbi52ZXJzaW9uID0gXCJcIiwgbi5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gMCksIGUubmFtZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIChuLm5hbWUgPSBlLm5hbWUpLCBlLnZlcnNpb24gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidmVyc2lvblwiKSAmJiAobi52ZXJzaW9uID0gZS52ZXJzaW9uKSwgZS5hdHRyaWJ1dGVzICYmIGUuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudG9PYmplY3QoZS5hdHRyaWJ1dGVzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgKG4uZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGVcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaDtcbiAgICAgICAgfSkoKSwgeTtcbiAgICAgIH0pKCksIGQucmVzb3VyY2UgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0ge307XG4gICAgICAgIHJldHVybiB5LnYxID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBoID0ge307XG4gICAgICAgICAgcmV0dXJuIGguUmVzb3VyY2UgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlcyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUuYXR0cmlidXRlcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IG51bGwsIG8uY3JlYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZSk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQgfHwgKHQgPSBzLmNyZWF0ZSgpKSwgZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKGUuYXR0cmlidXRlc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAxNlxuICAgICAgICAgICAgICApLnVpbnQzMihlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLCB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZSgpOyBlLnBvcyA8IG47ICkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICByLmF0dHJpYnV0ZXMgJiYgci5hdHRyaWJ1dGVzLmxlbmd0aCB8fCAoci5hdHRyaWJ1dGVzID0gW10pLCByLmF0dHJpYnV0ZXMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYXR0cmlidXRlc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnZlcmlmeShlLmF0dHJpYnV0ZXNbdF0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXMuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgIWwuaXNJbnRlZ2VyKGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCkgPyBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IGludGVnZXIgZXhwZWN0ZWRcIiA6IG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UoKTtcbiAgICAgICAgICAgICAgaWYgKGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UuYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5hdHRyaWJ1dGVzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlLmF0dHJpYnV0ZXM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuYXR0cmlidXRlc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZnJvbU9iamVjdChlLmF0dHJpYnV0ZXNbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgKHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA+Pj4gMCksIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLmF0dHJpYnV0ZXMgPSBbXSksIHQuZGVmYXVsdHMgJiYgKG4uZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IDApLCBlLmF0dHJpYnV0ZXMgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5hdHRyaWJ1dGVzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS50b09iamVjdChlLmF0dHJpYnV0ZXNbcl0sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiAobi5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSwgbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGg7XG4gICAgICAgIH0pKCksIHk7XG4gICAgICB9KSgpLCBkLnRyYWNlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgeSA9IHt9O1xuICAgICAgICByZXR1cm4geS52MSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICB2YXIgaCA9IHt9O1xuICAgICAgICAgIHJldHVybiBoLlRyYWNlc0RhdGEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VTcGFucyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUucmVzb3VyY2VTcGFucyA9IGwuZW1wdHlBcnJheSwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnJlc291cmNlU3BhbnMgIT0gbnVsbCAmJiBlLnJlc291cmNlU3BhbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5yZXNvdXJjZVNwYW5zLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMuZW5jb2RlKGUucmVzb3VyY2VTcGFuc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5UcmFjZXNEYXRhKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2VTcGFucyAmJiByLnJlc291cmNlU3BhbnMubGVuZ3RoIHx8IChyLnJlc291cmNlU3BhbnMgPSBbXSksIHIucmVzb3VyY2VTcGFucy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlU3BhbnMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwicmVzb3VyY2VTcGFuc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnJlc291cmNlU3BhbnMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VTcGFuczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUucmVzb3VyY2VTcGFucy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuUmVzb3VyY2VTcGFucy52ZXJpZnkoZS5yZXNvdXJjZVNwYW5zW3RdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZXNvdXJjZVNwYW5zLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlRyYWNlc0RhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5UcmFjZXNEYXRhKCk7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlU3BhbnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5yZXNvdXJjZVNwYW5zKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlRyYWNlc0RhdGEucmVzb3VyY2VTcGFuczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5yZXNvdXJjZVNwYW5zID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnJlc291cmNlU3BhbnMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5yZXNvdXJjZVNwYW5zW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlRyYWNlc0RhdGEucmVzb3VyY2VTcGFuczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5yZXNvdXJjZVNwYW5zW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMuZnJvbU9iamVjdChlLnJlc291cmNlU3BhbnNbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4ucmVzb3VyY2VTcGFucyA9IFtdKSwgZS5yZXNvdXJjZVNwYW5zICYmIGUucmVzb3VyY2VTcGFucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLnJlc291cmNlU3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUucmVzb3VyY2VTcGFucy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4ucmVzb3VyY2VTcGFuc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zLnRvT2JqZWN0KGUucmVzb3VyY2VTcGFuc1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5UcmFjZXNEYXRhXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguUmVzb3VyY2VTcGFucyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZVNwYW5zID0gW10sIGkpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IE9iamVjdC5rZXlzKGkpLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICAgICAgICBpW2VbdF1dICE9IG51bGwgJiYgKHRoaXNbZVt0XV0gPSBpW2VbdF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvLnByb3RvdHlwZS5yZXNvdXJjZSA9IG51bGwsIG8ucHJvdG90eXBlLnNjb3BlU3BhbnMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLnNjaGVtYVVybCA9IG51bGwsIG8uY3JlYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZSk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQgfHwgKHQgPSBzLmNyZWF0ZSgpKSwgZS5yZXNvdXJjZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwicmVzb3VyY2VcIikgJiYgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlLmVuY29kZShlLnJlc291cmNlLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgZS5zY29wZVNwYW5zICE9IG51bGwgJiYgZS5zY29wZVNwYW5zLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuc2NvcGVTcGFucy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zLmVuY29kZShlLnNjb3BlU3BhbnNbbl0sIHQudWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInNjaGVtYVVybFwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAzLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDI2XG4gICAgICAgICAgICAgICkuc3RyaW5nKGUuc2NoZW1hVXJsKSwgdDtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUoZSwgdCkubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBhLmNyZWF0ZShlKSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIG4gPSB0ID09PSB2b2lkIDAgPyBlLmxlbiA6IGUucG9zICsgdCwgciA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuUmVzb3VyY2VTcGFucygpOyBlLnBvcyA8IG47ICkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICByLnJlc291cmNlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zY29wZVNwYW5zICYmIHIuc2NvcGVTcGFucy5sZW5ndGggfHwgKHIuc2NvcGVTcGFucyA9IFtdKSwgci5zY29wZVNwYW5zLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNjb3BlU3BhbnMuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zY2hlbWFVcmwgPSBlLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGUuc2tpcFR5cGUoYyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gbmV3IGEoZSkpLCB0aGlzLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gXCJvYmplY3RcIiB8fCBlID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5yZXNvdXJjZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZVwiKSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlLnZlcmlmeShlLnJlc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInJlc291cmNlLlwiICsgdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5zY29wZVNwYW5zICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjb3BlU3BhbnNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5zY29wZVNwYW5zKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInNjb3BlU3BhbnM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnNjb3BlU3BhbnMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNjb3BlU3BhbnMudmVyaWZ5KGUuc2NvcGVTcGFuc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGVTcGFucy5cIiArIHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnNjaGVtYVVybCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY2hlbWFVcmxcIikgJiYgIWwuaXNTdHJpbmcoZS5zY2hlbWFVcmwpID8gXCJzY2hlbWFVcmw6IHN0cmluZyBleHBlY3RlZFwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuUmVzb3VyY2VTcGFucylcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMoKTtcbiAgICAgICAgICAgICAgaWYgKGUucmVzb3VyY2UgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5yZXNvdXJjZSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuUmVzb3VyY2VTcGFucy5yZXNvdXJjZTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQucmVzb3VyY2UgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UuZnJvbU9iamVjdChlLnJlc291cmNlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5zY29wZVNwYW5zKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuc2NvcGVTcGFucykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zLnNjb3BlU3BhbnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc2NvcGVTcGFucyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zY29wZVNwYW5zLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuc2NvcGVTcGFuc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zLnNjb3BlU3BhbnM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuc2NvcGVTcGFuc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zLmZyb21PYmplY3QoZS5zY29wZVNwYW5zW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgKHQuc2NoZW1hVXJsID0gU3RyaW5nKGUuc2NoZW1hVXJsKSksIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnNjb3BlU3BhbnMgPSBbXSksIHQuZGVmYXVsdHMgJiYgKG4ucmVzb3VyY2UgPSBudWxsLCBuLnNjaGVtYVVybCA9IFwiXCIpLCBlLnJlc291cmNlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInJlc291cmNlXCIpICYmIChuLnJlc291cmNlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnJlc291cmNlLnYxLlJlc291cmNlLnRvT2JqZWN0KGUucmVzb3VyY2UsIHQpKSwgZS5zY29wZVNwYW5zICYmIGUuc2NvcGVTcGFucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLnNjb3BlU3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUuc2NvcGVTcGFucy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uc2NvcGVTcGFuc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zLnRvT2JqZWN0KGUuc2NvcGVTcGFuc1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAobi5zY2hlbWFVcmwgPSBlLnNjaGVtYVVybCksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguU2NvcGVTcGFucyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zcGFucyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUuc2NvcGUgPSBudWxsLCBvLnByb3RvdHlwZS5zcGFucyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuc2NoZW1hVXJsID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnNjb3BlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY29wZVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmVuY29kZShlLnNjb3BlLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgZS5zcGFucyAhPSBudWxsICYmIGUuc3BhbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zcGFucy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLmVuY29kZShlLnNwYW5zW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY2hlbWFVcmxcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICApLnN0cmluZyhlLnNjaGVtYVVybCksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNjb3BlU3BhbnMoKTsgZS5wb3MgPCBuOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zY29wZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLnNwYW5zICYmIHIuc3BhbnMubGVuZ3RoIHx8IChyLnNwYW5zID0gW10pLCByLnNwYW5zLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zY2hlbWFVcmwgPSBlLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGUuc2tpcFR5cGUoYyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gbmV3IGEoZSkpLCB0aGlzLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gXCJvYmplY3RcIiB8fCBlID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5zY29wZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZVwiKSkge1xuICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5JbnN0cnVtZW50YXRpb25TY29wZS52ZXJpZnkoZS5zY29wZSk7XG4gICAgICAgICAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJzY29wZS5cIiArIHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuc3BhbnMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic3BhbnNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5zcGFucykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuc3BhbnMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4udmVyaWZ5KGUuc3BhbnNbbl0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInNwYW5zLlwiICsgdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAhbC5pc1N0cmluZyhlLnNjaGVtYVVybCkgPyBcInNjaGVtYVVybDogc3RyaW5nIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU2NvcGVTcGFucygpO1xuICAgICAgICAgICAgICBpZiAoZS5zY29wZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnNjb3BlICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zLnNjb3BlOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5zY29wZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUuZnJvbU9iamVjdChlLnNjb3BlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5zcGFucykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnNwYW5zKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNjb3BlU3BhbnMuc3BhbnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc3BhbnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuc3BhbnMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5zcGFuc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TY29wZVNwYW5zLnNwYW5zOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LnNwYW5zW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uZnJvbU9iamVjdChlLnNwYW5zW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgKHQuc2NoZW1hVXJsID0gU3RyaW5nKGUuc2NoZW1hVXJsKSksIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnNwYW5zID0gW10pLCB0LmRlZmF1bHRzICYmIChuLnNjb3BlID0gbnVsbCwgbi5zY2hlbWFVcmwgPSBcIlwiKSwgZS5zY29wZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZVwiKSAmJiAobi5zY29wZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUudG9PYmplY3QoZS5zY29wZSwgdCkpLCBlLnNwYW5zICYmIGUuc3BhbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi5zcGFucyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5zcGFucy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uc3BhbnNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi50b09iamVjdChlLnNwYW5zW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2NoZW1hVXJsXCIpICYmIChuLnNjaGVtYVVybCA9IGUuc2NoZW1hVXJsKSwgbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNjb3BlU3BhbnNcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5TcGFuID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgPSBbXSwgdGhpcy5ldmVudHMgPSBbXSwgdGhpcy5saW5rcyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUudHJhY2VJZCA9IG51bGwsIG8ucHJvdG90eXBlLnNwYW5JZCA9IG51bGwsIG8ucHJvdG90eXBlLnRyYWNlU3RhdGUgPSBudWxsLCBvLnByb3RvdHlwZS5wYXJlbnRTcGFuSWQgPSBudWxsLCBvLnByb3RvdHlwZS5uYW1lID0gbnVsbCwgby5wcm90b3R5cGUua2luZCA9IG51bGwsIG8ucHJvdG90eXBlLnN0YXJ0VGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuZW5kVGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuYXR0cmlidXRlcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IG51bGwsIG8ucHJvdG90eXBlLmV2ZW50cyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuZHJvcHBlZEV2ZW50c0NvdW50ID0gbnVsbCwgby5wcm90b3R5cGUubGlua3MgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmRyb3BwZWRMaW5rc0NvdW50ID0gbnVsbCwgby5wcm90b3R5cGUuc3RhdHVzID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnRyYWNlSWQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInRyYWNlSWRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICApLmJ5dGVzKGUudHJhY2VJZCksIGUuc3BhbklkICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzcGFuSWRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICApLmJ5dGVzKGUuc3BhbklkKSwgZS50cmFjZVN0YXRlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJ0cmFjZVN0YXRlXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDMsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgMjZcbiAgICAgICAgICAgICAgKS5zdHJpbmcoZS50cmFjZVN0YXRlKSwgZS5wYXJlbnRTcGFuSWQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInBhcmVudFNwYW5JZFwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA0LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDM0XG4gICAgICAgICAgICAgICkuYnl0ZXMoZS5wYXJlbnRTcGFuSWQpLCBlLm5hbWUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcIm5hbWVcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICA0MlxuICAgICAgICAgICAgICApLnN0cmluZyhlLm5hbWUpLCBlLmtpbmQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImtpbmRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICA0OFxuICAgICAgICAgICAgICApLmludDMyKGUua2luZCksIGUuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDcsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgNTdcbiAgICAgICAgICAgICAgKS5maXhlZDY0KGUuc3RhcnRUaW1lVW5peE5hbm8pLCBlLmVuZFRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwiZW5kVGltZVVuaXhOYW5vXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDgsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgNjVcbiAgICAgICAgICAgICAgKS5maXhlZDY0KGUuZW5kVGltZVVuaXhOYW5vKSwgZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKGUuYXR0cmlidXRlc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDksIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDc0XG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIGlmIChlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMTAsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgODBcbiAgICAgICAgICAgICAgKS51aW50MzIoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSwgZS5ldmVudHMgIT0gbnVsbCAmJiBlLmV2ZW50cy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmV2ZW50cy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkV2ZW50LmVuY29kZShlLmV2ZW50c1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDExLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICA5MFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICBpZiAoZS5kcm9wcGVkRXZlbnRzQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImRyb3BwZWRFdmVudHNDb3VudFwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxMiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICA5NlxuICAgICAgICAgICAgICApLnVpbnQzMihlLmRyb3BwZWRFdmVudHNDb3VudCksIGUubGlua3MgIT0gbnVsbCAmJiBlLmxpbmtzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubGlua3MubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5MaW5rLmVuY29kZShlLmxpbmtzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMTMsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwNlxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkTGlua3NDb3VudCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwiZHJvcHBlZExpbmtzQ291bnRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMTQsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgMTEyXG4gICAgICAgICAgICAgICkudWludDMyKGUuZHJvcHBlZExpbmtzQ291bnQpLCBlLnN0YXR1cyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwic3RhdHVzXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TdGF0dXMuZW5jb2RlKGUuc3RhdHVzLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxNSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxMjJcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2VJZCA9IGUuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zcGFuSWQgPSBlLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudHJhY2VTdGF0ZSA9IGUuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICAgICAgICAgIHIucGFyZW50U3BhbklkID0gZS5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNToge1xuICAgICAgICAgICAgICAgICAgICByLm5hbWUgPSBlLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgICAgICAgICAgICByLmtpbmQgPSBlLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA3OiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc3RhcnRUaW1lVW5peE5hbm8gPSBlLmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDg6IHtcbiAgICAgICAgICAgICAgICAgICAgci5lbmRUaW1lVW5peE5hbm8gPSBlLmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDk6IHtcbiAgICAgICAgICAgICAgICAgICAgci5hdHRyaWJ1dGVzICYmIHIuYXR0cmlidXRlcy5sZW5ndGggfHwgKHIuYXR0cmlidXRlcyA9IFtdKSwgci5hdHRyaWJ1dGVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHtcbiAgICAgICAgICAgICAgICAgICAgci5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDExOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuZXZlbnRzICYmIHIuZXZlbnRzLmxlbmd0aCB8fCAoci5ldmVudHMgPSBbXSksIHIuZXZlbnRzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uRXZlbnQuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDEyOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuZHJvcHBlZEV2ZW50c0NvdW50ID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDEzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIubGlua3MgJiYgci5saW5rcy5sZW5ndGggfHwgKHIubGlua3MgPSBbXSksIHIubGlua3MucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5MaW5rLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxNDoge1xuICAgICAgICAgICAgICAgICAgICByLmRyb3BwZWRMaW5rc0NvdW50ID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDE1OiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc3RhdHVzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlN0YXR1cy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnRyYWNlSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidHJhY2VJZFwiKSAmJiAhKGUudHJhY2VJZCAmJiB0eXBlb2YgZS50cmFjZUlkLmxlbmd0aCA9PSBcIm51bWJlclwiIHx8IGwuaXNTdHJpbmcoZS50cmFjZUlkKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidHJhY2VJZDogYnVmZmVyIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnNwYW5JZCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzcGFuSWRcIikgJiYgIShlLnNwYW5JZCAmJiB0eXBlb2YgZS5zcGFuSWQubGVuZ3RoID09IFwibnVtYmVyXCIgfHwgbC5pc1N0cmluZyhlLnNwYW5JZCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInNwYW5JZDogYnVmZmVyIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnRyYWNlU3RhdGUgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidHJhY2VTdGF0ZVwiKSAmJiAhbC5pc1N0cmluZyhlLnRyYWNlU3RhdGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInRyYWNlU3RhdGU6IHN0cmluZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5wYXJlbnRTcGFuSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwicGFyZW50U3BhbklkXCIpICYmICEoZS5wYXJlbnRTcGFuSWQgJiYgdHlwZW9mIGUucGFyZW50U3BhbklkLmxlbmd0aCA9PSBcIm51bWJlclwiIHx8IGwuaXNTdHJpbmcoZS5wYXJlbnRTcGFuSWQpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJwYXJlbnRTcGFuSWQ6IGJ1ZmZlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5uYW1lICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcIm5hbWVcIikgJiYgIWwuaXNTdHJpbmcoZS5uYW1lKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJuYW1lOiBzdHJpbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUua2luZCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJraW5kXCIpKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJraW5kOiBlbnVtIHZhbHVlIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic3RhcnRUaW1lVW5peE5hbm9cIikgJiYgIWwuaXNJbnRlZ2VyKGUuc3RhcnRUaW1lVW5peE5hbm8pICYmICEoZS5zdGFydFRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcihlLnN0YXJ0VGltZVVuaXhOYW5vLmxvdykgJiYgbC5pc0ludGVnZXIoZS5zdGFydFRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RhcnRUaW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5lbmRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZW5kVGltZVVuaXhOYW5vXCIpICYmICFsLmlzSW50ZWdlcihlLmVuZFRpbWVVbml4TmFubykgJiYgIShlLmVuZFRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcihlLmVuZFRpbWVVbml4TmFuby5sb3cpICYmIGwuaXNJbnRlZ2VyKGUuZW5kVGltZVVuaXhOYW5vLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJlbmRUaW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS52ZXJpZnkoZS5hdHRyaWJ1dGVzW3RdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhdHRyaWJ1dGVzLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIpICYmICFsLmlzSW50ZWdlcihlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IGludGVnZXIgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuZXZlbnRzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImV2ZW50c1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmV2ZW50cykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJldmVudHM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmV2ZW50cy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5FdmVudC52ZXJpZnkoZS5ldmVudHNbdF0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImV2ZW50cy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmRyb3BwZWRFdmVudHNDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkRXZlbnRzQ291bnRcIikgJiYgIWwuaXNJbnRlZ2VyKGUuZHJvcHBlZEV2ZW50c0NvdW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJkcm9wcGVkRXZlbnRzQ291bnQ6IGludGVnZXIgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUubGlua3MgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibGlua3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5saW5rcykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJsaW5rczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUubGlua3MubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uTGluay52ZXJpZnkoZS5saW5rc1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibGlua3MuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5kcm9wcGVkTGlua3NDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkTGlua3NDb3VudFwiKSAmJiAhbC5pc0ludGVnZXIoZS5kcm9wcGVkTGlua3NDb3VudCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiZHJvcHBlZExpbmtzQ291bnQ6IGludGVnZXIgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuc3RhdHVzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInN0YXR1c1wiKSkge1xuICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlN0YXR1cy52ZXJpZnkoZS5zdGF0dXMpO1xuICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic3RhdHVzLlwiICsgbjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3BhbilcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4oKTtcbiAgICAgICAgICAgICAgc3dpdGNoIChlLnRyYWNlSWQgIT0gbnVsbCAmJiAodHlwZW9mIGUudHJhY2VJZCA9PSBcInN0cmluZ1wiID8gbC5iYXNlNjQuZGVjb2RlKGUudHJhY2VJZCwgdC50cmFjZUlkID0gbC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKGUudHJhY2VJZCkpLCAwKSA6IGUudHJhY2VJZC5sZW5ndGggPj0gMCAmJiAodC50cmFjZUlkID0gZS50cmFjZUlkKSksIGUuc3BhbklkICE9IG51bGwgJiYgKHR5cGVvZiBlLnNwYW5JZCA9PSBcInN0cmluZ1wiID8gbC5iYXNlNjQuZGVjb2RlKGUuc3BhbklkLCB0LnNwYW5JZCA9IGwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnNwYW5JZCkpLCAwKSA6IGUuc3BhbklkLmxlbmd0aCA+PSAwICYmICh0LnNwYW5JZCA9IGUuc3BhbklkKSksIGUudHJhY2VTdGF0ZSAhPSBudWxsICYmICh0LnRyYWNlU3RhdGUgPSBTdHJpbmcoZS50cmFjZVN0YXRlKSksIGUucGFyZW50U3BhbklkICE9IG51bGwgJiYgKHR5cGVvZiBlLnBhcmVudFNwYW5JZCA9PSBcInN0cmluZ1wiID8gbC5iYXNlNjQuZGVjb2RlKGUucGFyZW50U3BhbklkLCB0LnBhcmVudFNwYW5JZCA9IGwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnBhcmVudFNwYW5JZCkpLCAwKSA6IGUucGFyZW50U3BhbklkLmxlbmd0aCA+PSAwICYmICh0LnBhcmVudFNwYW5JZCA9IGUucGFyZW50U3BhbklkKSksIGUubmFtZSAhPSBudWxsICYmICh0Lm5hbWUgPSBTdHJpbmcoZS5uYW1lKSksIGUua2luZCkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUua2luZCA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHQua2luZCA9IGUua2luZDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU1BBTl9LSU5EX1VOU1BFQ0lGSUVEXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgdC5raW5kID0gMDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTUEFOX0tJTkRfSU5URVJOQUxcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICB0LmtpbmQgPSAxO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNQQU5fS0lORF9TRVJWRVJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICB0LmtpbmQgPSAyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNQQU5fS0lORF9DTElFTlRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICB0LmtpbmQgPSAzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNQQU5fS0lORF9QUk9EVUNFUlwiOlxuICAgICAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgICAgICAgIHQua2luZCA9IDQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU1BBTl9LSU5EX0NPTlNVTUVSXCI6XG4gICAgICAgICAgICAgICAgY2FzZSA1OlxuICAgICAgICAgICAgICAgICAgdC5raW5kID0gNTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgKGwuTG9uZyA/ICh0LnN0YXJ0VGltZVVuaXhOYW5vID0gbC5Mb25nLmZyb21WYWx1ZShlLnN0YXJ0VGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiBlLnN0YXJ0VGltZVVuaXhOYW5vID09IFwic3RyaW5nXCIgPyB0LnN0YXJ0VGltZVVuaXhOYW5vID0gcGFyc2VJbnQoZS5zdGFydFRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIGUuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHQuc3RhcnRUaW1lVW5peE5hbm8gPSBlLnN0YXJ0VGltZVVuaXhOYW5vIDogdHlwZW9mIGUuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJvYmplY3RcIiAmJiAodC5zdGFydFRpbWVVbml4TmFubyA9IG5ldyBsLkxvbmdCaXRzKGUuc3RhcnRUaW1lVW5peE5hbm8ubG93ID4+PiAwLCBlLnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgZS5lbmRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiAobC5Mb25nID8gKHQuZW5kVGltZVVuaXhOYW5vID0gbC5Mb25nLmZyb21WYWx1ZShlLmVuZFRpbWVVbml4TmFubykpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgZS5lbmRUaW1lVW5peE5hbm8gPT0gXCJzdHJpbmdcIiA/IHQuZW5kVGltZVVuaXhOYW5vID0gcGFyc2VJbnQoZS5lbmRUaW1lVW5peE5hbm8sIDEwKSA6IHR5cGVvZiBlLmVuZFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gdC5lbmRUaW1lVW5peE5hbm8gPSBlLmVuZFRpbWVVbml4TmFubyA6IHR5cGVvZiBlLmVuZFRpbWVVbml4TmFubyA9PSBcIm9iamVjdFwiICYmICh0LmVuZFRpbWVVbml4TmFubyA9IG5ldyBsLkxvbmdCaXRzKGUuZW5kVGltZVVuaXhOYW5vLmxvdyA+Pj4gMCwgZS5lbmRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCBlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5hdHRyaWJ1dGVzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uYXR0cmlidXRlczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5hdHRyaWJ1dGVzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5mcm9tT2JqZWN0KGUuYXR0cmlidXRlc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiAodC5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID4+PiAwKSwgZS5ldmVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5ldmVudHMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5ldmVudHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuZXZlbnRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmV2ZW50cy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLmV2ZW50c1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLmV2ZW50czogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5ldmVudHNbbl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5FdmVudC5mcm9tT2JqZWN0KGUuZXZlbnRzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuZHJvcHBlZEV2ZW50c0NvdW50ICE9IG51bGwgJiYgKHQuZHJvcHBlZEV2ZW50c0NvdW50ID0gZS5kcm9wcGVkRXZlbnRzQ291bnQgPj4+IDApLCBlLmxpbmtzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUubGlua3MpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5saW5rczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5saW5rcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5saW5rcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLmxpbmtzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4ubGlua3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQubGlua3Nbbl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5MaW5rLmZyb21PYmplY3QoZS5saW5rc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmRyb3BwZWRMaW5rc0NvdW50ICE9IG51bGwgJiYgKHQuZHJvcHBlZExpbmtzQ291bnQgPSBlLmRyb3BwZWRMaW5rc0NvdW50ID4+PiAwKSwgZS5zdGF0dXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5zdGF0dXMgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uc3RhdHVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5zdGF0dXMgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3RhdHVzLmZyb21PYmplY3QoZS5zdGF0dXMpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5hdHRyaWJ1dGVzID0gW10sIG4uZXZlbnRzID0gW10sIG4ubGlua3MgPSBbXSksIHQuZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodC5ieXRlcyA9PT0gU3RyaW5nID8gbi50cmFjZUlkID0gXCJcIiA6IChuLnRyYWNlSWQgPSBbXSwgdC5ieXRlcyAhPT0gQXJyYXkgJiYgKG4udHJhY2VJZCA9IGwubmV3QnVmZmVyKG4udHJhY2VJZCkpKSwgdC5ieXRlcyA9PT0gU3RyaW5nID8gbi5zcGFuSWQgPSBcIlwiIDogKG4uc3BhbklkID0gW10sIHQuYnl0ZXMgIT09IEFycmF5ICYmIChuLnNwYW5JZCA9IGwubmV3QnVmZmVyKG4uc3BhbklkKSkpLCBuLnRyYWNlU3RhdGUgPSBcIlwiLCB0LmJ5dGVzID09PSBTdHJpbmcgPyBuLnBhcmVudFNwYW5JZCA9IFwiXCIgOiAobi5wYXJlbnRTcGFuSWQgPSBbXSwgdC5ieXRlcyAhPT0gQXJyYXkgJiYgKG4ucGFyZW50U3BhbklkID0gbC5uZXdCdWZmZXIobi5wYXJlbnRTcGFuSWQpKSksIG4ubmFtZSA9IFwiXCIsIG4ua2luZCA9IHQuZW51bXMgPT09IFN0cmluZyA/IFwiU1BBTl9LSU5EX1VOU1BFQ0lGSUVEXCIgOiAwLCBsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByID0gbmV3IGwuTG9uZygwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICBuLnN0YXJ0VGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gci50b1N0cmluZygpIDogdC5sb25ncyA9PT0gTnVtYmVyID8gci50b051bWJlcigpIDogcjtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgIG4uc3RhcnRUaW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIG4uZW5kVGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gci50b1N0cmluZygpIDogdC5sb25ncyA9PT0gTnVtYmVyID8gci50b051bWJlcigpIDogcjtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgIG4uZW5kVGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgIG4uZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IDAsIG4uZHJvcHBlZEV2ZW50c0NvdW50ID0gMCwgbi5kcm9wcGVkTGlua3NDb3VudCA9IDAsIG4uc3RhdHVzID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS50cmFjZUlkICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInRyYWNlSWRcIikgJiYgKG4udHJhY2VJZCA9IHQuYnl0ZXMgPT09IFN0cmluZyA/IGwuYmFzZTY0LmVuY29kZShlLnRyYWNlSWQsIDAsIGUudHJhY2VJZC5sZW5ndGgpIDogdC5ieXRlcyA9PT0gQXJyYXkgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnRyYWNlSWQpIDogZS50cmFjZUlkKSwgZS5zcGFuSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic3BhbklkXCIpICYmIChuLnNwYW5JZCA9IHQuYnl0ZXMgPT09IFN0cmluZyA/IGwuYmFzZTY0LmVuY29kZShlLnNwYW5JZCwgMCwgZS5zcGFuSWQubGVuZ3RoKSA6IHQuYnl0ZXMgPT09IEFycmF5ID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5zcGFuSWQpIDogZS5zcGFuSWQpLCBlLnRyYWNlU3RhdGUgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidHJhY2VTdGF0ZVwiKSAmJiAobi50cmFjZVN0YXRlID0gZS50cmFjZVN0YXRlKSwgZS5wYXJlbnRTcGFuSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwicGFyZW50U3BhbklkXCIpICYmIChuLnBhcmVudFNwYW5JZCA9IHQuYnl0ZXMgPT09IFN0cmluZyA/IGwuYmFzZTY0LmVuY29kZShlLnBhcmVudFNwYW5JZCwgMCwgZS5wYXJlbnRTcGFuSWQubGVuZ3RoKSA6IHQuYnl0ZXMgPT09IEFycmF5ID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5wYXJlbnRTcGFuSWQpIDogZS5wYXJlbnRTcGFuSWQpLCBlLm5hbWUgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibmFtZVwiKSAmJiAobi5uYW1lID0gZS5uYW1lKSwgZS5raW5kICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImtpbmRcIikgJiYgKG4ua2luZCA9IHQuZW51bXMgPT09IFN0cmluZyA/IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLlNwYW5LaW5kW2Uua2luZF0gPT09IHZvaWQgMCA/IGUua2luZCA6IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLlNwYW5LaW5kW2Uua2luZF0gOiBlLmtpbmQpLCBlLnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgZS5zdGFydFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi5zdGFydFRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyhlLnN0YXJ0VGltZVVuaXhOYW5vKSA6IGUuc3RhcnRUaW1lVW5peE5hbm8gOiBuLnN0YXJ0VGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuc3RhcnRUaW1lVW5peE5hbm8pIDogdC5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHMoZS5zdGFydFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IGUuc3RhcnRUaW1lVW5peE5hbm8pLCBlLmVuZFRpbWVVbml4TmFubyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJlbmRUaW1lVW5peE5hbm9cIikgJiYgKHR5cGVvZiBlLmVuZFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi5lbmRUaW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcoZS5lbmRUaW1lVW5peE5hbm8pIDogZS5lbmRUaW1lVW5peE5hbm8gOiBuLmVuZFRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLmVuZFRpbWVVbml4TmFubykgOiB0LmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyhlLmVuZFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUuZW5kVGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiBlLmVuZFRpbWVVbml4TmFubyksIGUuYXR0cmlidXRlcyAmJiBlLmF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBlLmF0dHJpYnV0ZXMubGVuZ3RoOyArK2MpXG4gICAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXNbY10gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnRvT2JqZWN0KGUuYXR0cmlidXRlc1tjXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIpICYmIChuLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLCBlLmV2ZW50cyAmJiBlLmV2ZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLmV2ZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgZS5ldmVudHMubGVuZ3RoOyArK2MpXG4gICAgICAgICAgICAgICAgICBuLmV2ZW50c1tjXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkV2ZW50LnRvT2JqZWN0KGUuZXZlbnRzW2NdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5kcm9wcGVkRXZlbnRzQ291bnQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZHJvcHBlZEV2ZW50c0NvdW50XCIpICYmIChuLmRyb3BwZWRFdmVudHNDb3VudCA9IGUuZHJvcHBlZEV2ZW50c0NvdW50KSwgZS5saW5rcyAmJiBlLmxpbmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4ubGlua3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGUubGlua3MubGVuZ3RoOyArK2MpXG4gICAgICAgICAgICAgICAgICBuLmxpbmtzW2NdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uTGluay50b09iamVjdChlLmxpbmtzW2NdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5kcm9wcGVkTGlua3NDb3VudCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkTGlua3NDb3VudFwiKSAmJiAobi5kcm9wcGVkTGlua3NDb3VudCA9IGUuZHJvcHBlZExpbmtzQ291bnQpLCBlLnN0YXR1cyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzdGF0dXNcIikgJiYgKG4uc3RhdHVzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlN0YXR1cy50b09iamVjdChlLnN0YXR1cywgdCkpLCBuO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHZvaWQgMCAmJiAoZSA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgZSArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3BhblwiO1xuICAgICAgICAgICAgfSwgby5TcGFuS2luZCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSB7fSwgZSA9IE9iamVjdC5jcmVhdGUoaSk7XG4gICAgICAgICAgICAgIHJldHVybiBlW2lbMF0gPSBcIlNQQU5fS0lORF9VTlNQRUNJRklFRFwiXSA9IDAsIGVbaVsxXSA9IFwiU1BBTl9LSU5EX0lOVEVSTkFMXCJdID0gMSwgZVtpWzJdID0gXCJTUEFOX0tJTkRfU0VSVkVSXCJdID0gMiwgZVtpWzNdID0gXCJTUEFOX0tJTkRfQ0xJRU5UXCJdID0gMywgZVtpWzRdID0gXCJTUEFOX0tJTkRfUFJPRFVDRVJcIl0gPSA0LCBlW2lbNV0gPSBcIlNQQU5fS0lORF9DT05TVU1FUlwiXSA9IDUsIGU7XG4gICAgICAgICAgICB9KSgpLCBvLkV2ZW50ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzID0gW10sIGUpXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gT2JqZWN0LmtleXMoZSksIG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgICAgZVt0W25dXSAhPSBudWxsICYmICh0aGlzW3Rbbl1dID0gZVt0W25dXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGkucHJvdG90eXBlLnRpbWVVbml4TmFubyA9IG51bGwsIGkucHJvdG90eXBlLm5hbWUgPSBudWxsLCBpLnByb3RvdHlwZS5hdHRyaWJ1dGVzID0gbC5lbXB0eUFycmF5LCBpLnByb3RvdHlwZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwidGltZVVuaXhOYW5vXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAgIDlcbiAgICAgICAgICAgICAgICApLmZpeGVkNjQodC50aW1lVW5peE5hbm8pLCB0Lm5hbWUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcIm5hbWVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICApLnN0cmluZyh0Lm5hbWUpLCB0LmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0LmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmF0dHJpYnV0ZXMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKHQuYXR0cmlidXRlc1tyXSwgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDQsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgICAzMlxuICAgICAgICAgICAgICAgICkudWludDMyKHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksIG47XG4gICAgICAgICAgICAgIH0sIGkuZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZSh0LCBuKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBhLmNyZWF0ZSh0KSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IG4gPT09IHZvaWQgMCA/IHQubGVuIDogdC5wb3MgKyBuLCBjID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkV2ZW50KCk7IHQucG9zIDwgcjsgKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdiA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYy50aW1lVW5peE5hbm8gPSB0LmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLm5hbWUgPSB0LnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICAgIGMuYXR0cmlidXRlcyAmJiBjLmF0dHJpYnV0ZXMubGVuZ3RoIHx8IChjLmF0dHJpYnV0ZXMgPSBbXSksIGMuYXR0cmlidXRlcy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZGVjb2RlKHQsIHQudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSh2ICYgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBuZXcgYSh0KSksIHRoaXMuZGVjb2RlKHQsIHQudWludDMyKCkpO1xuICAgICAgICAgICAgICB9LCBpLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQgIT0gXCJvYmplY3RcIiB8fCB0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInRpbWVVbml4TmFub1wiKSAmJiAhbC5pc0ludGVnZXIodC50aW1lVW5peE5hbm8pICYmICEodC50aW1lVW5peE5hbm8gJiYgbC5pc0ludGVnZXIodC50aW1lVW5peE5hbm8ubG93KSAmJiBsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJ0aW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0Lm5hbWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibmFtZVwiKSAmJiAhbC5pc1N0cmluZyh0Lm5hbWUpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibmFtZTogc3RyaW5nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKHQuYXR0cmlidXRlcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS52ZXJpZnkodC5hdHRyaWJ1dGVzW25dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlcy5cIiArIHI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiAhbC5pc0ludGVnZXIodC5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSA/IFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDogaW50ZWdlciBleHBlY3RlZFwiIDogbnVsbDtcbiAgICAgICAgICAgICAgfSwgaS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uRXZlbnQpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5FdmVudCgpO1xuICAgICAgICAgICAgICAgIGlmICh0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAobi50aW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQudGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiB0LnRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gbi50aW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLnRpbWVVbml4TmFubyA9IHQudGltZVVuaXhOYW5vIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKG4udGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQubmFtZSAhPSBudWxsICYmIChuLm5hbWUgPSBTdHJpbmcodC5uYW1lKSksIHQuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uRXZlbnQuYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5hdHRyaWJ1dGVzW3JdICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5FdmVudC5hdHRyaWJ1dGVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZnJvbU9iamVjdCh0LmF0dHJpYnV0ZXNbcl0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdC5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgKG4uZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA+Pj4gMCksIG47XG4gICAgICAgICAgICAgIH0sIGkudG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgbiB8fCAobiA9IHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICgobi5hcnJheXMgfHwgbi5kZWZhdWx0cykgJiYgKHIuYXR0cmlidXRlcyA9IFtdKSwgbi5kZWZhdWx0cykge1xuICAgICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGMudG9TdHJpbmcoKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IGMudG9OdW1iZXIoKSA6IGM7XG4gICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgICByLm5hbWUgPSBcIlwiLCByLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodC50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgdC50aW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQudGltZVVuaXhOYW5vKSA6IHQudGltZVVuaXhOYW5vIDogci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC50aW1lVW5peE5hbm8pIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC50aW1lVW5peE5hbm8pLCB0Lm5hbWUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibmFtZVwiKSAmJiAoci5uYW1lID0gdC5uYW1lKSwgdC5hdHRyaWJ1dGVzICYmIHQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCB0LmF0dHJpYnV0ZXMubGVuZ3RoOyArK3YpXG4gICAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlc1t2XSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudG9PYmplY3QodC5hdHRyaWJ1dGVzW3ZdLCBuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJkcm9wcGVkQXR0cmlidXRlc0NvdW50XCIpICYmIChyLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSB0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLCByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkV2ZW50XCI7XG4gICAgICAgICAgICAgIH0sIGk7XG4gICAgICAgICAgICB9KSgpLCBvLkxpbmsgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgPSBbXSwgZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUudHJhY2VJZCA9IG51bGwsIGkucHJvdG90eXBlLnNwYW5JZCA9IG51bGwsIGkucHJvdG90eXBlLnRyYWNlU3RhdGUgPSBudWxsLCBpLnByb3RvdHlwZS5hdHRyaWJ1dGVzID0gbC5lbXB0eUFycmF5LCBpLnByb3RvdHlwZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnRyYWNlSWQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInRyYWNlSWRcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICApLmJ5dGVzKHQudHJhY2VJZCksIHQuc3BhbklkICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJzcGFuSWRcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICApLmJ5dGVzKHQuc3BhbklkKSwgdC50cmFjZVN0YXRlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJ0cmFjZVN0YXRlXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgIDI2XG4gICAgICAgICAgICAgICAgKS5zdHJpbmcodC50cmFjZVN0YXRlKSwgdC5hdHRyaWJ1dGVzICE9IG51bGwgJiYgdC5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmVuY29kZSh0LmF0dHJpYnV0ZXNbcl0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgICAgIC8qIGlkIDQsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgICAgMzRcbiAgICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCA1LCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgICAgNDBcbiAgICAgICAgICAgICAgICApLnVpbnQzMih0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLCBuO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUodCwgbikubGRlbGltKCk7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBuID09PSB2b2lkIDAgPyB0LmxlbiA6IHQucG9zICsgbiwgYyA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5MaW5rKCk7IHQucG9zIDwgcjsgKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdiA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYy50cmFjZUlkID0gdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGMuc3BhbklkID0gdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICAgIGMudHJhY2VTdGF0ZSA9IHQuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgYy5hdHRyaWJ1dGVzICYmIGMuYXR0cmlidXRlcy5sZW5ndGggfHwgKGMuYXR0cmlidXRlcyA9IFtdKSwgYy5hdHRyaWJ1dGVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5kZWNvZGUodCwgdC51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNToge1xuICAgICAgICAgICAgICAgICAgICAgIGMuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgIH0sIGkudmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAodC50cmFjZUlkICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInRyYWNlSWRcIikgJiYgISh0LnRyYWNlSWQgJiYgdHlwZW9mIHQudHJhY2VJZC5sZW5ndGggPT0gXCJudW1iZXJcIiB8fCBsLmlzU3RyaW5nKHQudHJhY2VJZCkpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidHJhY2VJZDogYnVmZmVyIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKHQuc3BhbklkICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInNwYW5JZFwiKSAmJiAhKHQuc3BhbklkICYmIHR5cGVvZiB0LnNwYW5JZC5sZW5ndGggPT0gXCJudW1iZXJcIiB8fCBsLmlzU3RyaW5nKHQuc3BhbklkKSkpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJzcGFuSWQ6IGJ1ZmZlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0LnRyYWNlU3RhdGUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidHJhY2VTdGF0ZVwiKSAmJiAhbC5pc1N0cmluZyh0LnRyYWNlU3RhdGUpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidHJhY2VTdGF0ZTogc3RyaW5nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKHQuYXR0cmlidXRlcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS52ZXJpZnkodC5hdHRyaWJ1dGVzW25dKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlcy5cIiArIHI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiAhbC5pc0ludGVnZXIodC5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSA/IFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDogaW50ZWdlciBleHBlY3RlZFwiIDogbnVsbDtcbiAgICAgICAgICAgICAgfSwgaS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uTGluaylcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkxpbmsoKTtcbiAgICAgICAgICAgICAgICBpZiAodC50cmFjZUlkICE9IG51bGwgJiYgKHR5cGVvZiB0LnRyYWNlSWQgPT0gXCJzdHJpbmdcIiA/IGwuYmFzZTY0LmRlY29kZSh0LnRyYWNlSWQsIG4udHJhY2VJZCA9IGwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aCh0LnRyYWNlSWQpKSwgMCkgOiB0LnRyYWNlSWQubGVuZ3RoID49IDAgJiYgKG4udHJhY2VJZCA9IHQudHJhY2VJZCkpLCB0LnNwYW5JZCAhPSBudWxsICYmICh0eXBlb2YgdC5zcGFuSWQgPT0gXCJzdHJpbmdcIiA/IGwuYmFzZTY0LmRlY29kZSh0LnNwYW5JZCwgbi5zcGFuSWQgPSBsLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgodC5zcGFuSWQpKSwgMCkgOiB0LnNwYW5JZC5sZW5ndGggPj0gMCAmJiAobi5zcGFuSWQgPSB0LnNwYW5JZCkpLCB0LnRyYWNlU3RhdGUgIT0gbnVsbCAmJiAobi50cmFjZVN0YXRlID0gU3RyaW5nKHQudHJhY2VTdGF0ZSkpLCB0LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TcGFuLkxpbmsuYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5hdHRyaWJ1dGVzW3JdICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3Bhbi5MaW5rLmF0dHJpYnV0ZXM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbi5hdHRyaWJ1dGVzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5mcm9tT2JqZWN0KHQuYXR0cmlidXRlc1tyXSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiAobi5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gdC5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID4+PiAwKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS50b09iamVjdCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgICAgaWYgKChuLmFycmF5cyB8fCBuLmRlZmF1bHRzKSAmJiAoci5hdHRyaWJ1dGVzID0gW10pLCBuLmRlZmF1bHRzICYmIChuLmJ5dGVzID09PSBTdHJpbmcgPyByLnRyYWNlSWQgPSBcIlwiIDogKHIudHJhY2VJZCA9IFtdLCBuLmJ5dGVzICE9PSBBcnJheSAmJiAoci50cmFjZUlkID0gbC5uZXdCdWZmZXIoci50cmFjZUlkKSkpLCBuLmJ5dGVzID09PSBTdHJpbmcgPyByLnNwYW5JZCA9IFwiXCIgOiAoci5zcGFuSWQgPSBbXSwgbi5ieXRlcyAhPT0gQXJyYXkgJiYgKHIuc3BhbklkID0gbC5uZXdCdWZmZXIoci5zcGFuSWQpKSksIHIudHJhY2VTdGF0ZSA9IFwiXCIsIHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IDApLCB0LnRyYWNlSWQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidHJhY2VJZFwiKSAmJiAoci50cmFjZUlkID0gbi5ieXRlcyA9PT0gU3RyaW5nID8gbC5iYXNlNjQuZW5jb2RlKHQudHJhY2VJZCwgMCwgdC50cmFjZUlkLmxlbmd0aCkgOiBuLmJ5dGVzID09PSBBcnJheSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQudHJhY2VJZCkgOiB0LnRyYWNlSWQpLCB0LnNwYW5JZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzcGFuSWRcIikgJiYgKHIuc3BhbklkID0gbi5ieXRlcyA9PT0gU3RyaW5nID8gbC5iYXNlNjQuZW5jb2RlKHQuc3BhbklkLCAwLCB0LnNwYW5JZC5sZW5ndGgpIDogbi5ieXRlcyA9PT0gQXJyYXkgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LnNwYW5JZCkgOiB0LnNwYW5JZCksIHQudHJhY2VTdGF0ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ0cmFjZVN0YXRlXCIpICYmIChyLnRyYWNlU3RhdGUgPSB0LnRyYWNlU3RhdGUpLCB0LmF0dHJpYnV0ZXMgJiYgdC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgci5hdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHQuYXR0cmlidXRlcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgci5hdHRyaWJ1dGVzW2NdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS50b09iamVjdCh0LmF0dHJpYnV0ZXNbY10sIG4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdC5kcm9wcGVkQXR0cmlidXRlc0NvdW50ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgKHIuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IHQuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCksIHI7XG4gICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgICAgfSwgaS5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIHQgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlNwYW4uTGlua1wiO1xuICAgICAgICAgICAgICB9LCBpO1xuICAgICAgICAgICAgfSkoKSwgbztcbiAgICAgICAgICB9KSgpLCBoLlN0YXR1cyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAoaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLm1lc3NhZ2UgPSBudWxsLCBvLnByb3RvdHlwZS5jb2RlID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICByZXR1cm4gdCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLm1lc3NhZ2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcIm1lc3NhZ2VcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICApLnN0cmluZyhlLm1lc3NhZ2UpLCBlLmNvZGUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImNvZGVcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAyNFxuICAgICAgICAgICAgICApLmludDMyKGUuY29kZSksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlN0YXR1cygpOyBlLnBvcyA8IG47ICkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLm1lc3NhZ2UgPSBlLnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICByLmNvZGUgPSBlLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibWVzc2FnZVwiKSAmJiAhbC5pc1N0cmluZyhlLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm1lc3NhZ2U6IHN0cmluZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5jb2RlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImNvZGVcIikpXG4gICAgICAgICAgICAgICAgc3dpdGNoIChlLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImNvZGU6IGVudW0gdmFsdWUgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3RhdHVzKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3RhdHVzKCk7XG4gICAgICAgICAgICAgIHN3aXRjaCAoZS5tZXNzYWdlICE9IG51bGwgJiYgKHQubWVzc2FnZSA9IFN0cmluZyhlLm1lc3NhZ2UpKSwgZS5jb2RlKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5jb2RlID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdC5jb2RlID0gZS5jb2RlO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTVEFUVVNfQ09ERV9VTlNFVFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgIHQuY29kZSA9IDA7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU1RBVFVTX0NPREVfT0tcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICB0LmNvZGUgPSAxO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNUQVRVU19DT0RFX0VSUk9SXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgdC5jb2RlID0gMjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQuZGVmYXVsdHMgJiYgKG4ubWVzc2FnZSA9IFwiXCIsIG4uY29kZSA9IHQuZW51bXMgPT09IFN0cmluZyA/IFwiU1RBVFVTX0NPREVfVU5TRVRcIiA6IDApLCBlLm1lc3NhZ2UgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibWVzc2FnZVwiKSAmJiAobi5tZXNzYWdlID0gZS5tZXNzYWdlKSwgZS5jb2RlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImNvZGVcIikgJiYgKG4uY29kZSA9IHQuZW51bXMgPT09IFN0cmluZyA/IHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TdGF0dXMuU3RhdHVzQ29kZVtlLmNvZGVdID09PSB2b2lkIDAgPyBlLmNvZGUgOiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuU3RhdHVzLlN0YXR1c0NvZGVbZS5jb2RlXSA6IGUuY29kZSksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5TdGF0dXNcIjtcbiAgICAgICAgICAgIH0sIG8uU3RhdHVzQ29kZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdmFyIGkgPSB7fSwgZSA9IE9iamVjdC5jcmVhdGUoaSk7XG4gICAgICAgICAgICAgIHJldHVybiBlW2lbMF0gPSBcIlNUQVRVU19DT0RFX1VOU0VUXCJdID0gMCwgZVtpWzFdID0gXCJTVEFUVVNfQ09ERV9PS1wiXSA9IDEsIGVbaVsyXSA9IFwiU1RBVFVTX0NPREVfRVJST1JcIl0gPSAyLCBlO1xuICAgICAgICAgICAgfSkoKSwgbztcbiAgICAgICAgICB9KSgpLCBoO1xuICAgICAgICB9KSgpLCB5O1xuICAgICAgfSkoKSwgZC5jb2xsZWN0b3IgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB5ID0ge307XG4gICAgICAgIHJldHVybiB5LnRyYWNlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBoID0ge307XG4gICAgICAgICAgcmV0dXJuIGgudjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIG8uVHJhY2VTZXJ2aWNlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUsIHQsIG4pIHtcbiAgICAgICAgICAgICAgICBwLnJwYy5TZXJ2aWNlLmNhbGwodGhpcywgZSwgdCwgbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIChpLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocC5ycGMuU2VydmljZS5wcm90b3R5cGUpKS5jb25zdHJ1Y3RvciA9IGksIGkuY3JlYXRlID0gZnVuY3Rpb24odCwgbiwgcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcyh0LCBuLCByKTtcbiAgICAgICAgICAgICAgfSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KGkucHJvdG90eXBlLmV4cG9ydCA9IGZ1bmN0aW9uIGUodCwgbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJwY0NhbGwoZSwgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0LCB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlU2VydmljZVJlc3BvbnNlLCB0LCBuKTtcbiAgICAgICAgICAgICAgfSwgXCJuYW1lXCIsIHsgdmFsdWU6IFwiRXhwb3J0XCIgfSksIGk7XG4gICAgICAgICAgICB9KSgpLCBvLkV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlU3BhbnMgPSBbXSwgZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUucmVzb3VyY2VTcGFucyA9IGwuZW1wdHlBcnJheSwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnJlc291cmNlU3BhbnMgIT0gbnVsbCAmJiB0LnJlc291cmNlU3BhbnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LnJlc291cmNlU3BhbnMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by50cmFjZS52MS5SZXNvdXJjZVNwYW5zLmVuY29kZSh0LnJlc291cmNlU3BhbnNbcl0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUodCwgbikubGRlbGltKCk7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBuID09PSB2b2lkIDAgPyB0LmxlbiA6IHQucG9zICsgbiwgYyA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3QoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLnJlc291cmNlU3BhbnMgJiYgYy5yZXNvdXJjZVNwYW5zLmxlbmd0aCB8fCAoYy5yZXNvdXJjZVNwYW5zID0gW10pLCBjLnJlc291cmNlU3BhbnMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8udHJhY2UudjEuUmVzb3VyY2VTcGFucy5kZWNvZGUodCwgdC51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSh2ICYgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBuZXcgYSh0KSksIHRoaXMuZGVjb2RlKHQsIHQudWludDMyKCkpO1xuICAgICAgICAgICAgICB9LCBpLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQgIT0gXCJvYmplY3RcIiB8fCB0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgaWYgKHQucmVzb3VyY2VTcGFucyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZVNwYW5zXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5yZXNvdXJjZVNwYW5zKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VTcGFuczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5yZXNvdXJjZVNwYW5zLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMudmVyaWZ5KHQucmVzb3VyY2VTcGFuc1tuXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInJlc291cmNlU3BhbnMuXCIgKyByO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSwgaS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHQucmVzb3VyY2VTcGFucykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQucmVzb3VyY2VTcGFucykpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0LnJlc291cmNlU3BhbnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgbi5yZXNvdXJjZVNwYW5zID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQucmVzb3VyY2VTcGFucy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucmVzb3VyY2VTcGFuc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0LnJlc291cmNlU3BhbnM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbi5yZXNvdXJjZVNwYW5zW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMuZnJvbU9iamVjdCh0LnJlc291cmNlU3BhbnNbcl0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgfSwgaS50b09iamVjdCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgICAgaWYgKChuLmFycmF5cyB8fCBuLmRlZmF1bHRzKSAmJiAoci5yZXNvdXJjZVNwYW5zID0gW10pLCB0LnJlc291cmNlU3BhbnMgJiYgdC5yZXNvdXJjZVNwYW5zLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgci5yZXNvdXJjZVNwYW5zID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHQucmVzb3VyY2VTcGFucy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgci5yZXNvdXJjZVNwYW5zW2NdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLnRyYWNlLnYxLlJlc291cmNlU3BhbnMudG9PYmplY3QodC5yZXNvdXJjZVNwYW5zW2NdLCBuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgICAgfSwgaS5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIHQgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0XCI7XG4gICAgICAgICAgICAgIH0sIGk7XG4gICAgICAgICAgICB9KSgpLCBvLkV4cG9ydFRyYWNlU2VydmljZVJlc3BvbnNlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUucGFydGlhbFN1Y2Nlc3MgPSBudWxsLCBpLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGkodCk7XG4gICAgICAgICAgICAgIH0sIGkuZW5jb2RlID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuIHx8IChuID0gcy5jcmVhdGUoKSksIHQucGFydGlhbFN1Y2Nlc3MgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInBhcnRpYWxTdWNjZXNzXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IudHJhY2UudjEuRXhwb3J0VHJhY2VQYXJ0aWFsU3VjY2Vzcy5lbmNvZGUodC5wYXJ0aWFsU3VjY2Vzcywgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCksIG47XG4gICAgICAgICAgICAgIH0sIGkuZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZSh0LCBuKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBhLmNyZWF0ZSh0KSk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IG4gPT09IHZvaWQgMCA/IHQubGVuIDogdC5wb3MgKyBuLCBjID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IudHJhY2UudjEuRXhwb3J0VHJhY2VTZXJ2aWNlUmVzcG9uc2UoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVBhcnRpYWxTdWNjZXNzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgfSwgaS52ZXJpZnkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmICh0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInBhcnRpYWxTdWNjZXNzXCIpKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IudHJhY2UudjEuRXhwb3J0VHJhY2VQYXJ0aWFsU3VjY2Vzcy52ZXJpZnkodC5wYXJ0aWFsU3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicGFydGlhbFN1Y2Nlc3MuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSwgaS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IudHJhY2UudjEuRXhwb3J0VHJhY2VTZXJ2aWNlUmVzcG9uc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAodC5wYXJ0aWFsU3VjY2VzcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucGFydGlhbFN1Y2Nlc3MgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlU2VydmljZVJlc3BvbnNlLnBhcnRpYWxTdWNjZXNzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVBhcnRpYWxTdWNjZXNzLmZyb21PYmplY3QodC5wYXJ0aWFsU3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9LCBpLnRvT2JqZWN0ID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB7fTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5kZWZhdWx0cyAmJiAoci5wYXJ0aWFsU3VjY2VzcyA9IG51bGwpLCB0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInBhcnRpYWxTdWNjZXNzXCIpICYmIChyLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVBhcnRpYWxTdWNjZXNzLnRvT2JqZWN0KHQucGFydGlhbFN1Y2Nlc3MsIG4pKSwgcjtcbiAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgICB9LCBpLmdldFR5cGVVcmwgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgdCArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlU2VydmljZVJlc3BvbnNlXCI7XG4gICAgICAgICAgICAgIH0sIGk7XG4gICAgICAgICAgICB9KSgpLCBvLkV4cG9ydFRyYWNlUGFydGlhbFN1Y2Nlc3MgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgICAgIGlmIChlKVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICAgIGVbdFtuXV0gIT0gbnVsbCAmJiAodGhpc1t0W25dXSA9IGVbdFtuXV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpLnByb3RvdHlwZS5yZWplY3RlZFNwYW5zID0gbnVsbCwgaS5wcm90b3R5cGUuZXJyb3JNZXNzYWdlID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnJlamVjdGVkU3BhbnMgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInJlamVjdGVkU3BhbnNcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgICAgOFxuICAgICAgICAgICAgICAgICkuaW50NjQodC5yZWplY3RlZFNwYW5zKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImVycm9yTWVzc2FnZVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICAgICkuc3RyaW5nKHQuZXJyb3JNZXNzYWdlKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVBhcnRpYWxTdWNjZXNzKCk7IHQucG9zIDwgcjsgKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdiA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKHYgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgYy5yZWplY3RlZFNwYW5zID0gdC5pbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGMuZXJyb3JNZXNzYWdlID0gdC5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgfSwgaS52ZXJpZnkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbCA/IFwib2JqZWN0IGV4cGVjdGVkXCIgOiB0LnJlamVjdGVkU3BhbnMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVqZWN0ZWRTcGFuc1wiKSAmJiAhbC5pc0ludGVnZXIodC5yZWplY3RlZFNwYW5zKSAmJiAhKHQucmVqZWN0ZWRTcGFucyAmJiBsLmlzSW50ZWdlcih0LnJlamVjdGVkU3BhbnMubG93KSAmJiBsLmlzSW50ZWdlcih0LnJlamVjdGVkU3BhbnMuaGlnaCkpID8gXCJyZWplY3RlZFNwYW5zOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIiA6IHQuZXJyb3JNZXNzYWdlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImVycm9yTWVzc2FnZVwiKSAmJiAhbC5pc1N0cmluZyh0LmVycm9yTWVzc2FnZSkgPyBcImVycm9yTWVzc2FnZTogc3RyaW5nIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlUGFydGlhbFN1Y2Nlc3MpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlUGFydGlhbFN1Y2Nlc3MoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdC5yZWplY3RlZFNwYW5zICE9IG51bGwgJiYgKGwuTG9uZyA/IChuLnJlamVjdGVkU3BhbnMgPSBsLkxvbmcuZnJvbVZhbHVlKHQucmVqZWN0ZWRTcGFucykpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgdC5yZWplY3RlZFNwYW5zID09IFwic3RyaW5nXCIgPyBuLnJlamVjdGVkU3BhbnMgPSBwYXJzZUludCh0LnJlamVjdGVkU3BhbnMsIDEwKSA6IHR5cGVvZiB0LnJlamVjdGVkU3BhbnMgPT0gXCJudW1iZXJcIiA/IG4ucmVqZWN0ZWRTcGFucyA9IHQucmVqZWN0ZWRTcGFucyA6IHR5cGVvZiB0LnJlamVjdGVkU3BhbnMgPT0gXCJvYmplY3RcIiAmJiAobi5yZWplY3RlZFNwYW5zID0gbmV3IGwuTG9uZ0JpdHModC5yZWplY3RlZFNwYW5zLmxvdyA+Pj4gMCwgdC5yZWplY3RlZFNwYW5zLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiAobi5lcnJvck1lc3NhZ2UgPSBTdHJpbmcodC5lcnJvck1lc3NhZ2UpKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS50b09iamVjdCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgICAgaWYgKG4uZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgci5yZWplY3RlZFNwYW5zID0gbi5sb25ncyA9PT0gU3RyaW5nID8gYy50b1N0cmluZygpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gYy50b051bWJlcigpIDogYztcbiAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICByLnJlamVjdGVkU3BhbnMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgICByLmVycm9yTWVzc2FnZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0LnJlamVjdGVkU3BhbnMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVqZWN0ZWRTcGFuc1wiKSAmJiAodHlwZW9mIHQucmVqZWN0ZWRTcGFucyA9PSBcIm51bWJlclwiID8gci5yZWplY3RlZFNwYW5zID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQucmVqZWN0ZWRTcGFucykgOiB0LnJlamVjdGVkU3BhbnMgOiByLnJlamVjdGVkU3BhbnMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5yZWplY3RlZFNwYW5zKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKHQucmVqZWN0ZWRTcGFucy5sb3cgPj4+IDAsIHQucmVqZWN0ZWRTcGFucy5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC5yZWplY3RlZFNwYW5zKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZXJyb3JNZXNzYWdlXCIpICYmIChyLmVycm9yTWVzc2FnZSA9IHQuZXJyb3JNZXNzYWdlKSwgcjtcbiAgICAgICAgICAgICAgfSwgaS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgICB9LCBpLmdldFR5cGVVcmwgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgdCArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLnRyYWNlLnYxLkV4cG9ydFRyYWNlUGFydGlhbFN1Y2Nlc3NcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG87XG4gICAgICAgICAgfSkoKSwgaDtcbiAgICAgICAgfSkoKSwgeS5tZXRyaWNzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBoID0ge307XG4gICAgICAgICAgcmV0dXJuIGgudjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIG8uTWV0cmljc1NlcnZpY2UgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCwgbikge1xuICAgICAgICAgICAgICAgIHAucnBjLlNlcnZpY2UuY2FsbCh0aGlzLCBlLCB0LCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwLnJwYy5TZXJ2aWNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5jcmVhdGUgPSBmdW5jdGlvbih0LCBuLCByKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHQsIG4sIHIpO1xuICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gZSh0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnBjQ2FsbChlLCB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXF1ZXN0LCB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXNwb25zZSwgdCwgbik7XG4gICAgICAgICAgICAgIH0sIFwibmFtZVwiLCB7IHZhbHVlOiBcIkV4cG9ydFwiIH0pLCBpO1xuICAgICAgICAgICAgfSkoKSwgby5FeHBvcnRNZXRyaWNzU2VydmljZVJlcXVlc3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlTWV0cmljcyA9IFtdLCBlKVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICAgIGVbdFtuXV0gIT0gbnVsbCAmJiAodGhpc1t0W25dXSA9IGVbdFtuXV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpLnByb3RvdHlwZS5yZXNvdXJjZU1ldHJpY3MgPSBsLmVtcHR5QXJyYXksIGkuY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5yZXNvdXJjZU1ldHJpY3MgIT0gbnVsbCAmJiB0LnJlc291cmNlTWV0cmljcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5SZXNvdXJjZU1ldHJpY3MuZW5jb2RlKHQucmVzb3VyY2VNZXRyaWNzW3JdLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVxdWVzdCgpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICAgIGMucmVzb3VyY2VNZXRyaWNzICYmIGMucmVzb3VyY2VNZXRyaWNzLmxlbmd0aCB8fCAoYy5yZXNvdXJjZU1ldHJpY3MgPSBbXSksIGMucmVzb3VyY2VNZXRyaWNzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgIH0sIGkudmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAodC5yZXNvdXJjZU1ldHJpY3MgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVzb3VyY2VNZXRyaWNzXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5yZXNvdXJjZU1ldHJpY3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZXNvdXJjZU1ldHJpY3M6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLnZlcmlmeSh0LnJlc291cmNlTWV0cmljc1tuXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInJlc291cmNlTWV0cmljcy5cIiArIHI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXF1ZXN0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0LnJlc291cmNlTWV0cmljcykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQucmVzb3VyY2VNZXRyaWNzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXF1ZXN0LnJlc291cmNlTWV0cmljczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLnJlc291cmNlTWV0cmljcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LnJlc291cmNlTWV0cmljcy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucmVzb3VyY2VNZXRyaWNzW3JdICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXF1ZXN0LnJlc291cmNlTWV0cmljczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBuLnJlc291cmNlTWV0cmljc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcy5mcm9tT2JqZWN0KHQucmVzb3VyY2VNZXRyaWNzW3JdKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICAgIH0sIGkudG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgbiB8fCAobiA9IHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICgobi5hcnJheXMgfHwgbi5kZWZhdWx0cykgJiYgKHIucmVzb3VyY2VNZXRyaWNzID0gW10pLCB0LnJlc291cmNlTWV0cmljcyAmJiB0LnJlc291cmNlTWV0cmljcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2VNZXRyaWNzID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHQucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytjKVxuICAgICAgICAgICAgICAgICAgICByLnJlc291cmNlTWV0cmljc1tjXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcy50b09iamVjdCh0LnJlc291cmNlTWV0cmljc1tjXSwgbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubWV0cmljcy52MS5FeHBvcnRNZXRyaWNzU2VydmljZVJlcXVlc3RcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG8uRXhwb3J0TWV0cmljc1NlcnZpY2VSZXNwb25zZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUpXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gT2JqZWN0LmtleXMoZSksIG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgICAgZVt0W25dXSAhPSBudWxsICYmICh0aGlzW3Rbbl1dID0gZVt0W25dXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGkucHJvdG90eXBlLnBhcnRpYWxTdWNjZXNzID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJwYXJ0aWFsU3VjY2Vzc1wiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1BhcnRpYWxTdWNjZXNzLmVuY29kZSh0LnBhcnRpYWxTdWNjZXNzLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVzcG9uc2UoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NQYXJ0aWFsU3VjY2Vzcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgIH0sIGkudmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAodC5wYXJ0aWFsU3VjY2VzcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJwYXJ0aWFsU3VjY2Vzc1wiKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1BhcnRpYWxTdWNjZXNzLnZlcmlmeSh0LnBhcnRpYWxTdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJwYXJ0aWFsU3VjY2Vzcy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1NlcnZpY2VSZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubWV0cmljcy52MS5FeHBvcnRNZXRyaWNzU2VydmljZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHQucGFydGlhbFN1Y2Nlc3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LnBhcnRpYWxTdWNjZXNzICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVzcG9uc2UucGFydGlhbFN1Y2Nlc3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIG4ucGFydGlhbFN1Y2Nlc3MgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1BhcnRpYWxTdWNjZXNzLmZyb21PYmplY3QodC5wYXJ0aWFsU3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9LCBpLnRvT2JqZWN0ID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB7fTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5kZWZhdWx0cyAmJiAoci5wYXJ0aWFsU3VjY2VzcyA9IG51bGwpLCB0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInBhcnRpYWxTdWNjZXNzXCIpICYmIChyLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NQYXJ0aWFsU3VjY2Vzcy50b09iamVjdCh0LnBhcnRpYWxTdWNjZXNzLCBuKSksIHI7XG4gICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgICAgfSwgaS5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIHQgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NTZXJ2aWNlUmVzcG9uc2VcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG8uRXhwb3J0TWV0cmljc1BhcnRpYWxTdWNjZXNzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUucmVqZWN0ZWREYXRhUG9pbnRzID0gbnVsbCwgaS5wcm90b3R5cGUuZXJyb3JNZXNzYWdlID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnJlamVjdGVkRGF0YVBvaW50cyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwicmVqZWN0ZWREYXRhUG9pbnRzXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAgIDhcbiAgICAgICAgICAgICAgICApLmludDY0KHQucmVqZWN0ZWREYXRhUG9pbnRzKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImVycm9yTWVzc2FnZVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICAgICkuc3RyaW5nKHQuZXJyb3JNZXNzYWdlKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5tZXRyaWNzLnYxLkV4cG9ydE1ldHJpY3NQYXJ0aWFsU3VjY2VzcygpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICAgIGMucmVqZWN0ZWREYXRhUG9pbnRzID0gdC5pbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGMuZXJyb3JNZXNzYWdlID0gdC5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgfSwgaS52ZXJpZnkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbCA/IFwib2JqZWN0IGV4cGVjdGVkXCIgOiB0LnJlamVjdGVkRGF0YVBvaW50cyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJyZWplY3RlZERhdGFQb2ludHNcIikgJiYgIWwuaXNJbnRlZ2VyKHQucmVqZWN0ZWREYXRhUG9pbnRzKSAmJiAhKHQucmVqZWN0ZWREYXRhUG9pbnRzICYmIGwuaXNJbnRlZ2VyKHQucmVqZWN0ZWREYXRhUG9pbnRzLmxvdykgJiYgbC5pc0ludGVnZXIodC5yZWplY3RlZERhdGFQb2ludHMuaGlnaCkpID8gXCJyZWplY3RlZERhdGFQb2ludHM6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiIDogdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZXJyb3JNZXNzYWdlXCIpICYmICFsLmlzU3RyaW5nKHQuZXJyb3JNZXNzYWdlKSA/IFwiZXJyb3JNZXNzYWdlOiBzdHJpbmcgZXhwZWN0ZWRcIiA6IG51bGw7XG4gICAgICAgICAgICAgIH0sIGkuZnJvbU9iamVjdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubWV0cmljcy52MS5FeHBvcnRNZXRyaWNzUGFydGlhbFN1Y2Nlc3MpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLm1ldHJpY3MudjEuRXhwb3J0TWV0cmljc1BhcnRpYWxTdWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQucmVqZWN0ZWREYXRhUG9pbnRzICE9IG51bGwgJiYgKGwuTG9uZyA/IChuLnJlamVjdGVkRGF0YVBvaW50cyA9IGwuTG9uZy5mcm9tVmFsdWUodC5yZWplY3RlZERhdGFQb2ludHMpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQucmVqZWN0ZWREYXRhUG9pbnRzID09IFwic3RyaW5nXCIgPyBuLnJlamVjdGVkRGF0YVBvaW50cyA9IHBhcnNlSW50KHQucmVqZWN0ZWREYXRhUG9pbnRzLCAxMCkgOiB0eXBlb2YgdC5yZWplY3RlZERhdGFQb2ludHMgPT0gXCJudW1iZXJcIiA/IG4ucmVqZWN0ZWREYXRhUG9pbnRzID0gdC5yZWplY3RlZERhdGFQb2ludHMgOiB0eXBlb2YgdC5yZWplY3RlZERhdGFQb2ludHMgPT0gXCJvYmplY3RcIiAmJiAobi5yZWplY3RlZERhdGFQb2ludHMgPSBuZXcgbC5Mb25nQml0cyh0LnJlamVjdGVkRGF0YVBvaW50cy5sb3cgPj4+IDAsIHQucmVqZWN0ZWREYXRhUG9pbnRzLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiAobi5lcnJvck1lc3NhZ2UgPSBTdHJpbmcodC5lcnJvck1lc3NhZ2UpKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS50b09iamVjdCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgICAgaWYgKG4uZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgci5yZWplY3RlZERhdGFQb2ludHMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHIucmVqZWN0ZWREYXRhUG9pbnRzID0gbi5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgICAgci5lcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdC5yZWplY3RlZERhdGFQb2ludHMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVqZWN0ZWREYXRhUG9pbnRzXCIpICYmICh0eXBlb2YgdC5yZWplY3RlZERhdGFQb2ludHMgPT0gXCJudW1iZXJcIiA/IHIucmVqZWN0ZWREYXRhUG9pbnRzID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQucmVqZWN0ZWREYXRhUG9pbnRzKSA6IHQucmVqZWN0ZWREYXRhUG9pbnRzIDogci5yZWplY3RlZERhdGFQb2ludHMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5yZWplY3RlZERhdGFQb2ludHMpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC5yZWplY3RlZERhdGFQb2ludHMubG93ID4+PiAwLCB0LnJlamVjdGVkRGF0YVBvaW50cy5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC5yZWplY3RlZERhdGFQb2ludHMpLCB0LmVycm9yTWVzc2FnZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJlcnJvck1lc3NhZ2VcIikgJiYgKHIuZXJyb3JNZXNzYWdlID0gdC5lcnJvck1lc3NhZ2UpLCByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubWV0cmljcy52MS5FeHBvcnRNZXRyaWNzUGFydGlhbFN1Y2Nlc3NcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG87XG4gICAgICAgICAgfSkoKSwgaDtcbiAgICAgICAgfSkoKSwgeS5sb2dzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHZhciBoID0ge307XG4gICAgICAgICAgcmV0dXJuIGgudjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIG8uTG9nc1NlcnZpY2UgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSwgdCwgbikge1xuICAgICAgICAgICAgICAgIHAucnBjLlNlcnZpY2UuY2FsbCh0aGlzLCBlLCB0LCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gKGkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwLnJwYy5TZXJ2aWNlLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yID0gaSwgaS5jcmVhdGUgPSBmdW5jdGlvbih0LCBuLCByKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyB0aGlzKHQsIG4sIHIpO1xuICAgICAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5wcm90b3R5cGUuZXhwb3J0ID0gZnVuY3Rpb24gZSh0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucnBjQ2FsbChlLCB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0LCB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXNwb25zZSwgdCwgbik7XG4gICAgICAgICAgICAgIH0sIFwibmFtZVwiLCB7IHZhbHVlOiBcIkV4cG9ydFwiIH0pLCBpO1xuICAgICAgICAgICAgfSkoKSwgby5FeHBvcnRMb2dzU2VydmljZVJlcXVlc3QgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGkoZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc291cmNlTG9ncyA9IFtdLCBlKVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICAgIGVbdFtuXV0gIT0gbnVsbCAmJiAodGhpc1t0W25dXSA9IGVbdFtuXV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBpLnByb3RvdHlwZS5yZXNvdXJjZUxvZ3MgPSBsLmVtcHR5QXJyYXksIGkuY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5yZXNvdXJjZUxvZ3MgIT0gbnVsbCAmJiB0LnJlc291cmNlTG9ncy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5SZXNvdXJjZUxvZ3MuZW5jb2RlKHQucmVzb3VyY2VMb2dzW3JdLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NTZXJ2aWNlUmVxdWVzdCgpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICAgIGMucmVzb3VyY2VMb2dzICYmIGMucmVzb3VyY2VMb2dzLmxlbmd0aCB8fCAoYy5yZXNvdXJjZUxvZ3MgPSBbXSksIGMucmVzb3VyY2VMb2dzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgIH0sIGkudmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAodC5yZXNvdXJjZUxvZ3MgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVzb3VyY2VMb2dzXCIpKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5yZXNvdXJjZUxvZ3MpKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJyZXNvdXJjZUxvZ3M6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLnZlcmlmeSh0LnJlc291cmNlTG9nc1tuXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInJlc291cmNlTG9ncy5cIiArIHI7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NTZXJ2aWNlUmVxdWVzdCgpO1xuICAgICAgICAgICAgICAgIGlmICh0LnJlc291cmNlTG9ncykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQucmVzb3VyY2VMb2dzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0LnJlc291cmNlTG9nczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLnJlc291cmNlTG9ncyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LnJlc291cmNlTG9ncy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucmVzb3VyY2VMb2dzW3JdICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXF1ZXN0LnJlc291cmNlTG9nczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICBuLnJlc291cmNlTG9nc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncy5mcm9tT2JqZWN0KHQucmVzb3VyY2VMb2dzW3JdKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICAgIH0sIGkudG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgbiB8fCAobiA9IHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICAgIGlmICgobi5hcnJheXMgfHwgbi5kZWZhdWx0cykgJiYgKHIucmVzb3VyY2VMb2dzID0gW10pLCB0LnJlc291cmNlTG9ncyAmJiB0LnJlc291cmNlTG9ncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2VMb2dzID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHQucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytjKVxuICAgICAgICAgICAgICAgICAgICByLnJlc291cmNlTG9nc1tjXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncy50b09iamVjdCh0LnJlc291cmNlTG9nc1tjXSwgbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubG9ncy52MS5FeHBvcnRMb2dzU2VydmljZVJlcXVlc3RcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG8uRXhwb3J0TG9nc1NlcnZpY2VSZXNwb25zZSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgZnVuY3Rpb24gaShlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUpXG4gICAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gT2JqZWN0LmtleXMoZSksIG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgICAgZVt0W25dXSAhPSBudWxsICYmICh0aGlzW3Rbbl1dID0gZVt0W25dXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGkucHJvdG90eXBlLnBhcnRpYWxTdWNjZXNzID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJwYXJ0aWFsU3VjY2Vzc1wiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1BhcnRpYWxTdWNjZXNzLmVuY29kZSh0LnBhcnRpYWxTdWNjZXNzLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NTZXJ2aWNlUmVzcG9uc2UoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBjLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NQYXJ0aWFsU3VjY2Vzcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgIH0sIGkudmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBpZiAodC5wYXJ0aWFsU3VjY2VzcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJwYXJ0aWFsU3VjY2Vzc1wiKSkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1BhcnRpYWxTdWNjZXNzLnZlcmlmeSh0LnBhcnRpYWxTdWNjZXNzKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJwYXJ0aWFsU3VjY2Vzcy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1NlcnZpY2VSZXNwb25zZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubG9ncy52MS5FeHBvcnRMb2dzU2VydmljZVJlc3BvbnNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHQucGFydGlhbFN1Y2Nlc3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LnBhcnRpYWxTdWNjZXNzICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NTZXJ2aWNlUmVzcG9uc2UucGFydGlhbFN1Y2Nlc3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIG4ucGFydGlhbFN1Y2Nlc3MgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1BhcnRpYWxTdWNjZXNzLmZyb21PYmplY3QodC5wYXJ0aWFsU3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICB9LCBpLnRvT2JqZWN0ID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgICAgdmFyIHIgPSB7fTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbi5kZWZhdWx0cyAmJiAoci5wYXJ0aWFsU3VjY2VzcyA9IG51bGwpLCB0LnBhcnRpYWxTdWNjZXNzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInBhcnRpYWxTdWNjZXNzXCIpICYmIChyLnBhcnRpYWxTdWNjZXNzID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NQYXJ0aWFsU3VjY2Vzcy50b09iamVjdCh0LnBhcnRpYWxTdWNjZXNzLCBuKSksIHI7XG4gICAgICAgICAgICAgIH0sIGkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgICAgfSwgaS5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIHQgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NTZXJ2aWNlUmVzcG9uc2VcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG8uRXhwb3J0TG9nc1BhcnRpYWxTdWNjZXNzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUucmVqZWN0ZWRMb2dSZWNvcmRzID0gbnVsbCwgaS5wcm90b3R5cGUuZXJyb3JNZXNzYWdlID0gbnVsbCwgaS5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpKHQpO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnJlamVjdGVkTG9nUmVjb3JkcyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwicmVqZWN0ZWRMb2dSZWNvcmRzXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAgIDhcbiAgICAgICAgICAgICAgICApLmludDY0KHQucmVqZWN0ZWRMb2dSZWNvcmRzKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImVycm9yTWVzc2FnZVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICAgICkuc3RyaW5nKHQuZXJyb3JNZXNzYWdlKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICB0IGluc3RhbmNlb2YgYSB8fCAodCA9IGEuY3JlYXRlKHQpKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci5sb2dzLnYxLkV4cG9ydExvZ3NQYXJ0aWFsU3VjY2VzcygpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICAgIGMucmVqZWN0ZWRMb2dSZWNvcmRzID0gdC5pbnQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGMuZXJyb3JNZXNzYWdlID0gdC5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgICAgfSwgaS5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgfSwgaS52ZXJpZnkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbCA/IFwib2JqZWN0IGV4cGVjdGVkXCIgOiB0LnJlamVjdGVkTG9nUmVjb3JkcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJyZWplY3RlZExvZ1JlY29yZHNcIikgJiYgIWwuaXNJbnRlZ2VyKHQucmVqZWN0ZWRMb2dSZWNvcmRzKSAmJiAhKHQucmVqZWN0ZWRMb2dSZWNvcmRzICYmIGwuaXNJbnRlZ2VyKHQucmVqZWN0ZWRMb2dSZWNvcmRzLmxvdykgJiYgbC5pc0ludGVnZXIodC5yZWplY3RlZExvZ1JlY29yZHMuaGlnaCkpID8gXCJyZWplY3RlZExvZ1JlY29yZHM6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiIDogdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZXJyb3JNZXNzYWdlXCIpICYmICFsLmlzU3RyaW5nKHQuZXJyb3JNZXNzYWdlKSA/IFwiZXJyb3JNZXNzYWdlOiBzdHJpbmcgZXhwZWN0ZWRcIiA6IG51bGw7XG4gICAgICAgICAgICAgIH0sIGkuZnJvbU9iamVjdCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubG9ncy52MS5FeHBvcnRMb2dzUGFydGlhbFN1Y2Nlc3MpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29sbGVjdG9yLmxvZ3MudjEuRXhwb3J0TG9nc1BhcnRpYWxTdWNjZXNzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQucmVqZWN0ZWRMb2dSZWNvcmRzICE9IG51bGwgJiYgKGwuTG9uZyA/IChuLnJlamVjdGVkTG9nUmVjb3JkcyA9IGwuTG9uZy5mcm9tVmFsdWUodC5yZWplY3RlZExvZ1JlY29yZHMpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQucmVqZWN0ZWRMb2dSZWNvcmRzID09IFwic3RyaW5nXCIgPyBuLnJlamVjdGVkTG9nUmVjb3JkcyA9IHBhcnNlSW50KHQucmVqZWN0ZWRMb2dSZWNvcmRzLCAxMCkgOiB0eXBlb2YgdC5yZWplY3RlZExvZ1JlY29yZHMgPT0gXCJudW1iZXJcIiA/IG4ucmVqZWN0ZWRMb2dSZWNvcmRzID0gdC5yZWplY3RlZExvZ1JlY29yZHMgOiB0eXBlb2YgdC5yZWplY3RlZExvZ1JlY29yZHMgPT0gXCJvYmplY3RcIiAmJiAobi5yZWplY3RlZExvZ1JlY29yZHMgPSBuZXcgbC5Mb25nQml0cyh0LnJlamVjdGVkTG9nUmVjb3Jkcy5sb3cgPj4+IDAsIHQucmVqZWN0ZWRMb2dSZWNvcmRzLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgdC5lcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiAobi5lcnJvck1lc3NhZ2UgPSBTdHJpbmcodC5lcnJvck1lc3NhZ2UpKSwgbjtcbiAgICAgICAgICAgICAgfSwgaS50b09iamVjdCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgICAgaWYgKG4uZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgci5yZWplY3RlZExvZ1JlY29yZHMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHIucmVqZWN0ZWRMb2dSZWNvcmRzID0gbi5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgICAgci5lcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdC5yZWplY3RlZExvZ1JlY29yZHMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicmVqZWN0ZWRMb2dSZWNvcmRzXCIpICYmICh0eXBlb2YgdC5yZWplY3RlZExvZ1JlY29yZHMgPT0gXCJudW1iZXJcIiA/IHIucmVqZWN0ZWRMb2dSZWNvcmRzID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQucmVqZWN0ZWRMb2dSZWNvcmRzKSA6IHQucmVqZWN0ZWRMb2dSZWNvcmRzIDogci5yZWplY3RlZExvZ1JlY29yZHMgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5yZWplY3RlZExvZ1JlY29yZHMpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC5yZWplY3RlZExvZ1JlY29yZHMubG93ID4+PiAwLCB0LnJlamVjdGVkTG9nUmVjb3Jkcy5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC5yZWplY3RlZExvZ1JlY29yZHMpLCB0LmVycm9yTWVzc2FnZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJlcnJvck1lc3NhZ2VcIikgJiYgKHIuZXJyb3JNZXNzYWdlID0gdC5lcnJvck1lc3NhZ2UpLCByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IubG9ncy52MS5FeHBvcnRMb2dzUGFydGlhbFN1Y2Nlc3NcIjtcbiAgICAgICAgICAgICAgfSwgaTtcbiAgICAgICAgICAgIH0pKCksIG87XG4gICAgICAgICAgfSkoKSwgaDtcbiAgICAgICAgfSkoKSwgeTtcbiAgICAgIH0pKCksIGQubWV0cmljcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB7fTtcbiAgICAgICAgcmV0dXJuIHkudjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGggPSB7fTtcbiAgICAgICAgICByZXR1cm4gaC5NZXRyaWNzRGF0YSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZU1ldHJpY3MgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnJlc291cmNlTWV0cmljcyA9IGwuZW1wdHlBcnJheSwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnJlc291cmNlTWV0cmljcyAhPSBudWxsICYmIGUucmVzb3VyY2VNZXRyaWNzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLmVuY29kZShlLnJlc291cmNlTWV0cmljc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpY3NEYXRhKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2VNZXRyaWNzICYmIHIucmVzb3VyY2VNZXRyaWNzLmxlbmd0aCB8fCAoci5yZXNvdXJjZU1ldHJpY3MgPSBbXSksIHIucmVzb3VyY2VNZXRyaWNzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlTWV0cmljcyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZU1ldHJpY3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5yZXNvdXJjZU1ldHJpY3MpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VNZXRyaWNzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5yZXNvdXJjZU1ldHJpY3MubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLnZlcmlmeShlLnJlc291cmNlTWV0cmljc1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VNZXRyaWNzLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljc0RhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpY3NEYXRhKCk7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlTWV0cmljcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnJlc291cmNlTWV0cmljcykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpY3NEYXRhLnJlc291cmNlTWV0cmljczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5yZXNvdXJjZU1ldHJpY3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUucmVzb3VyY2VNZXRyaWNzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljc0RhdGEucmVzb3VyY2VNZXRyaWNzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LnJlc291cmNlTWV0cmljc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcy5mcm9tT2JqZWN0KGUucmVzb3VyY2VNZXRyaWNzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnJlc291cmNlTWV0cmljcyA9IFtdKSwgZS5yZXNvdXJjZU1ldHJpY3MgJiYgZS5yZXNvdXJjZU1ldHJpY3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi5yZXNvdXJjZU1ldHJpY3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUucmVzb3VyY2VNZXRyaWNzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5yZXNvdXJjZU1ldHJpY3Nbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5SZXNvdXJjZU1ldHJpY3MudG9PYmplY3QoZS5yZXNvdXJjZU1ldHJpY3Nbcl0sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHZvaWQgMCAmJiAoZSA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgZSArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5NZXRyaWNzRGF0YVwiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLlJlc291cmNlTWV0cmljcyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZU1ldHJpY3MgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnJlc291cmNlID0gbnVsbCwgby5wcm90b3R5cGUuc2NvcGVNZXRyaWNzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5zY2hlbWFVcmwgPSBudWxsLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGUpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gcy5jcmVhdGUoKSksIGUucmVzb3VyY2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInJlc291cmNlXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS5lbmNvZGUoZS5yZXNvdXJjZSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCksIGUuc2NvcGVNZXRyaWNzICE9IG51bGwgJiYgZS5zY29wZU1ldHJpY3MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zY29wZU1ldHJpY3MubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TY29wZU1ldHJpY3MuZW5jb2RlKGUuc2NvcGVNZXRyaWNzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY2hlbWFVcmxcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICApLnN0cmluZyhlLnNjaGVtYVVybCksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2UgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLnNjb3BlTWV0cmljcyAmJiByLnNjb3BlTWV0cmljcy5sZW5ndGggfHwgKHIuc2NvcGVNZXRyaWNzID0gW10pLCByLnNjb3BlTWV0cmljcy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlNjb3BlTWV0cmljcy5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICByLnNjaGVtYVVybCA9IGUuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInJlc291cmNlXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UudmVyaWZ5KGUucmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2UuXCIgKyB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnNjb3BlTWV0cmljcyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZU1ldHJpY3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5zY29wZU1ldHJpY3MpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGVNZXRyaWNzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zY29wZU1ldHJpY3MubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU2NvcGVNZXRyaWNzLnZlcmlmeShlLnNjb3BlTWV0cmljc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGVNZXRyaWNzLlwiICsgdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAhbC5pc1N0cmluZyhlLnNjaGVtYVVybCkgPyBcInNjaGVtYVVybDogc3RyaW5nIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcylcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzKCk7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUucmVzb3VyY2UgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzLnJlc291cmNlOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5yZXNvdXJjZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS5mcm9tT2JqZWN0KGUucmVzb3VyY2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnNjb3BlTWV0cmljcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnNjb3BlTWV0cmljcykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcy5zY29wZU1ldHJpY3M6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc2NvcGVNZXRyaWNzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnNjb3BlTWV0cmljcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnNjb3BlTWV0cmljc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlJlc291cmNlTWV0cmljcy5zY29wZU1ldHJpY3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuc2NvcGVNZXRyaWNzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU2NvcGVNZXRyaWNzLmZyb21PYmplY3QoZS5zY29wZU1ldHJpY3Nbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiAodC5zY2hlbWFVcmwgPSBTdHJpbmcoZS5zY2hlbWFVcmwpKSwgdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4uc2NvcGVNZXRyaWNzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLnJlc291cmNlID0gbnVsbCwgbi5zY2hlbWFVcmwgPSBcIlwiKSwgZS5yZXNvdXJjZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZVwiKSAmJiAobi5yZXNvdXJjZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS50b09iamVjdChlLnJlc291cmNlLCB0KSksIGUuc2NvcGVNZXRyaWNzICYmIGUuc2NvcGVNZXRyaWNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uc2NvcGVNZXRyaWNzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLnNjb3BlTWV0cmljcy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uc2NvcGVNZXRyaWNzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU2NvcGVNZXRyaWNzLnRvT2JqZWN0KGUuc2NvcGVNZXRyaWNzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2NoZW1hVXJsXCIpICYmIChuLnNjaGVtYVVybCA9IGUuc2NoZW1hVXJsKSwgbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuUmVzb3VyY2VNZXRyaWNzXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguU2NvcGVNZXRyaWNzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLm1ldHJpY3MgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnNjb3BlID0gbnVsbCwgby5wcm90b3R5cGUubWV0cmljcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuc2NoZW1hVXJsID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnNjb3BlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY29wZVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmVuY29kZShlLnNjb3BlLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgZS5tZXRyaWNzICE9IG51bGwgJiYgZS5tZXRyaWNzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubWV0cmljcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpYy5lbmNvZGUoZS5tZXRyaWNzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY2hlbWFVcmxcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICApLnN0cmluZyhlLnNjaGVtYVVybCksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU2NvcGVNZXRyaWNzKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2NvcGUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci5tZXRyaWNzICYmIHIubWV0cmljcy5sZW5ndGggfHwgKHIubWV0cmljcyA9IFtdKSwgci5tZXRyaWNzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2NoZW1hVXJsID0gZS5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBlLnNraXBUeXBlKGMgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IG5ldyBhKGUpKSwgdGhpcy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuc2NvcGUgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2NvcGVcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUudmVyaWZ5KGUuc2NvcGUpO1xuICAgICAgICAgICAgICAgIGlmICh0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGUuXCIgKyB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLm1ldHJpY3MgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibWV0cmljc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLm1ldHJpY3MpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibWV0cmljczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubWV0cmljcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHQgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5NZXRyaWMudmVyaWZ5KGUubWV0cmljc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibWV0cmljcy5cIiArIHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnNjaGVtYVVybCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY2hlbWFVcmxcIikgJiYgIWwuaXNTdHJpbmcoZS5zY2hlbWFVcmwpID8gXCJzY2hlbWFVcmw6IHN0cmluZyBleHBlY3RlZFwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TY29wZU1ldHJpY3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlNjb3BlTWV0cmljcygpO1xuICAgICAgICAgICAgICBpZiAoZS5zY29wZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnNjb3BlICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlNjb3BlTWV0cmljcy5zY29wZTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc2NvcGUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmZyb21PYmplY3QoZS5zY29wZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUubWV0cmljcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLm1ldHJpY3MpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TY29wZU1ldHJpY3MubWV0cmljczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5tZXRyaWNzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLm1ldHJpY3MubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5tZXRyaWNzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU2NvcGVNZXRyaWNzLm1ldHJpY3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQubWV0cmljc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpYy5mcm9tT2JqZWN0KGUubWV0cmljc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnNjaGVtYVVybCAhPSBudWxsICYmICh0LnNjaGVtYVVybCA9IFN0cmluZyhlLnNjaGVtYVVybCkpLCB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5tZXRyaWNzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLnNjb3BlID0gbnVsbCwgbi5zY2hlbWFVcmwgPSBcIlwiKSwgZS5zY29wZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZVwiKSAmJiAobi5zY29wZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUudG9PYmplY3QoZS5zY29wZSwgdCkpLCBlLm1ldHJpY3MgJiYgZS5tZXRyaWNzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4ubWV0cmljcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5tZXRyaWNzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5tZXRyaWNzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLnRvT2JqZWN0KGUubWV0cmljc1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAobi5zY2hlbWFVcmwgPSBlLnNjaGVtYVVybCksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlNjb3BlTWV0cmljc1wiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLk1ldHJpYyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgICAgICAgICBpZiAoZSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gT2JqZWN0LmtleXMoZSksIG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIGVbdFtuXV0gIT0gbnVsbCAmJiAodGhpc1t0W25dXSA9IGVbdFtuXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgby5wcm90b3R5cGUubmFtZSA9IG51bGwsIG8ucHJvdG90eXBlLmRlc2NyaXB0aW9uID0gbnVsbCwgby5wcm90b3R5cGUudW5pdCA9IG51bGwsIG8ucHJvdG90eXBlLmdhdWdlID0gbnVsbCwgby5wcm90b3R5cGUuc3VtID0gbnVsbCwgby5wcm90b3R5cGUuaGlzdG9ncmFtID0gbnVsbCwgby5wcm90b3R5cGUuZXhwb25lbnRpYWxIaXN0b2dyYW0gPSBudWxsLCBvLnByb3RvdHlwZS5zdW1tYXJ5ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwgXCJkYXRhXCIsIHtcbiAgICAgICAgICAgICAgZ2V0OiBsLm9uZU9mR2V0dGVyKGkgPSBbXCJnYXVnZVwiLCBcInN1bVwiLCBcImhpc3RvZ3JhbVwiLCBcImV4cG9uZW50aWFsSGlzdG9ncmFtXCIsIFwic3VtbWFyeVwiXSksXG4gICAgICAgICAgICAgIHNldDogbC5vbmVPZlNldHRlcihpKVxuICAgICAgICAgICAgfSksIG8uY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8odCk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5uYW1lICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJuYW1lXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgKS5zdHJpbmcodC5uYW1lKSwgdC5kZXNjcmlwdGlvbiAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZGVzY3JpcHRpb25cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxOFxuICAgICAgICAgICAgICApLnN0cmluZyh0LmRlc2NyaXB0aW9uKSwgdC51bml0ICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJ1bml0XCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDMsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgMjZcbiAgICAgICAgICAgICAgKS5zdHJpbmcodC51bml0KSwgdC5nYXVnZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZ2F1Z2VcIikgJiYgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuR2F1Z2UuZW5jb2RlKHQuZ2F1Z2UsIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDUsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNDJcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0LnN1bSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwic3VtXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS5lbmNvZGUodC5zdW0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDcsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNThcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0Lmhpc3RvZ3JhbSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiaGlzdG9ncmFtXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbS5lbmNvZGUodC5oaXN0b2dyYW0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDksIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNzRcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0LmV4cG9uZW50aWFsSGlzdG9ncmFtICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJleHBvbmVudGlhbEhpc3RvZ3JhbVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbS5lbmNvZGUodC5leHBvbmVudGlhbEhpc3RvZ3JhbSwgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMTAsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgODJcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0LnN1bW1hcnkgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInN1bW1hcnlcIikgJiYgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeS5lbmNvZGUodC5zdW1tYXJ5LCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICA5MFxuICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCksIG47XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljKCk7IHQucG9zIDwgcjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIGMubmFtZSA9IHQuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIGMuZGVzY3JpcHRpb24gPSB0LnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICBjLnVuaXQgPSB0LnN0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNToge1xuICAgICAgICAgICAgICAgICAgICBjLmdhdWdlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuR2F1Z2UuZGVjb2RlKHQsIHQudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNzoge1xuICAgICAgICAgICAgICAgICAgICBjLnN1bSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA5OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuaGlzdG9ncmFtID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOiB7XG4gICAgICAgICAgICAgICAgICAgIGMuZXhwb25lbnRpYWxIaXN0b2dyYW0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbS5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxMToge1xuICAgICAgICAgICAgICAgICAgICBjLnN1bW1hcnkgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5LmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKHQubmFtZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmICFsLmlzU3RyaW5nKHQubmFtZSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwibmFtZTogc3RyaW5nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LmRlc2NyaXB0aW9uICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImRlc2NyaXB0aW9uXCIpICYmICFsLmlzU3RyaW5nKHQuZGVzY3JpcHRpb24pKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImRlc2NyaXB0aW9uOiBzdHJpbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQudW5pdCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ1bml0XCIpICYmICFsLmlzU3RyaW5nKHQudW5pdCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidW5pdDogc3RyaW5nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LmdhdWdlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImdhdWdlXCIpKSB7XG4gICAgICAgICAgICAgICAgbi5kYXRhID0gMTtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlLnZlcmlmeSh0LmdhdWdlKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJnYXVnZS5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LnN1bSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdW1cIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi5kYXRhID09PSAxKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgbi5kYXRhID0gMTtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS52ZXJpZnkodC5zdW0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInN1bS5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0Lmhpc3RvZ3JhbSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJoaXN0b2dyYW1cIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi5kYXRhID09PSAxKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgbi5kYXRhID0gMTtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbS52ZXJpZnkodC5oaXN0b2dyYW0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImhpc3RvZ3JhbS5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4cG9uZW50aWFsSGlzdG9ncmFtICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImV4cG9uZW50aWFsSGlzdG9ncmFtXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG4uZGF0YSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGE6IG11bHRpcGxlIHZhbHVlc1wiO1xuICAgICAgICAgICAgICAgIG4uZGF0YSA9IDE7XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbS52ZXJpZnkodC5leHBvbmVudGlhbEhpc3RvZ3JhbSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhwb25lbnRpYWxIaXN0b2dyYW0uXCIgKyByO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5zdW1tYXJ5ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN1bW1hcnlcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi5kYXRhID09PSAxKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YTogbXVsdGlwbGUgdmFsdWVzXCI7XG4gICAgICAgICAgICAgICAgbi5kYXRhID0gMTtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnkudmVyaWZ5KHQuc3VtbWFyeSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic3VtbWFyeS5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpYylcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljKCk7XG4gICAgICAgICAgICAgIGlmICh0Lm5hbWUgIT0gbnVsbCAmJiAobi5uYW1lID0gU3RyaW5nKHQubmFtZSkpLCB0LmRlc2NyaXB0aW9uICE9IG51bGwgJiYgKG4uZGVzY3JpcHRpb24gPSBTdHJpbmcodC5kZXNjcmlwdGlvbikpLCB0LnVuaXQgIT0gbnVsbCAmJiAobi51bml0ID0gU3RyaW5nKHQudW5pdCkpLCB0LmdhdWdlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuZ2F1Z2UgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLmdhdWdlOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgbi5nYXVnZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlLmZyb21PYmplY3QodC5nYXVnZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuc3VtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuc3VtICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpYy5zdW06IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICBuLnN1bSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS5mcm9tT2JqZWN0KHQuc3VtKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5oaXN0b2dyYW0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5oaXN0b2dyYW0gIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLmhpc3RvZ3JhbTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uaGlzdG9ncmFtID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtLmZyb21PYmplY3QodC5oaXN0b2dyYW0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4cG9uZW50aWFsSGlzdG9ncmFtICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuZXhwb25lbnRpYWxIaXN0b2dyYW0gIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLmV4cG9uZW50aWFsSGlzdG9ncmFtOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgbi5leHBvbmVudGlhbEhpc3RvZ3JhbSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtLmZyb21PYmplY3QodC5leHBvbmVudGlhbEhpc3RvZ3JhbSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuc3VtbWFyeSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LnN1bW1hcnkgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTWV0cmljLnN1bW1hcnk6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICBuLnN1bW1hcnkgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5LmZyb21PYmplY3QodC5zdW1tYXJ5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgIHJldHVybiBuLmRlZmF1bHRzICYmIChyLm5hbWUgPSBcIlwiLCByLmRlc2NyaXB0aW9uID0gXCJcIiwgci51bml0ID0gXCJcIiksIHQubmFtZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJuYW1lXCIpICYmIChyLm5hbWUgPSB0Lm5hbWUpLCB0LmRlc2NyaXB0aW9uICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImRlc2NyaXB0aW9uXCIpICYmIChyLmRlc2NyaXB0aW9uID0gdC5kZXNjcmlwdGlvbiksIHQudW5pdCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ1bml0XCIpICYmIChyLnVuaXQgPSB0LnVuaXQpLCB0LmdhdWdlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImdhdWdlXCIpICYmIChyLmdhdWdlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuR2F1Z2UudG9PYmplY3QodC5nYXVnZSwgbiksIG4ub25lb2ZzICYmIChyLmRhdGEgPSBcImdhdWdlXCIpKSwgdC5zdW0gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwic3VtXCIpICYmIChyLnN1bSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS50b09iamVjdCh0LnN1bSwgbiksIG4ub25lb2ZzICYmIChyLmRhdGEgPSBcInN1bVwiKSksIHQuaGlzdG9ncmFtICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImhpc3RvZ3JhbVwiKSAmJiAoci5oaXN0b2dyYW0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW0udG9PYmplY3QodC5oaXN0b2dyYW0sIG4pLCBuLm9uZW9mcyAmJiAoci5kYXRhID0gXCJoaXN0b2dyYW1cIikpLCB0LmV4cG9uZW50aWFsSGlzdG9ncmFtICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImV4cG9uZW50aWFsSGlzdG9ncmFtXCIpICYmIChyLmV4cG9uZW50aWFsSGlzdG9ncmFtID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW0udG9PYmplY3QodC5leHBvbmVudGlhbEhpc3RvZ3JhbSwgbiksIG4ub25lb2ZzICYmIChyLmRhdGEgPSBcImV4cG9uZW50aWFsSGlzdG9ncmFtXCIpKSwgdC5zdW1tYXJ5ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN1bW1hcnlcIikgJiYgKHIuc3VtbWFyeSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnkudG9PYmplY3QodC5zdW1tYXJ5LCBuKSwgbi5vbmVvZnMgJiYgKHIuZGF0YSA9IFwic3VtbWFyeVwiKSksIHI7XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk1ldHJpY1wiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLkdhdWdlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQb2ludHMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLmRhdGFQb2ludHMgPSBsLmVtcHR5QXJyYXksIG8uY3JlYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZSk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQgfHwgKHQgPSBzLmNyZWF0ZSgpKSwgZS5kYXRhUG9pbnRzICE9IG51bGwgJiYgZS5kYXRhUG9pbnRzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5lbmNvZGUoZS5kYXRhUG9pbnRzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuR2F1Z2UoKTsgZS5wb3MgPCBuOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgci5kYXRhUG9pbnRzICYmIHIuZGF0YVBvaW50cy5sZW5ndGggfHwgKHIuZGF0YVBvaW50cyA9IFtdKSwgci5kYXRhUG9pbnRzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTnVtYmVyRGF0YVBvaW50LmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZGF0YVBvaW50c1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmRhdGFQb2ludHMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50czogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5OdW1iZXJEYXRhUG9pbnQudmVyaWZ5KGUuZGF0YVBvaW50c1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50cy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5HYXVnZSgpO1xuICAgICAgICAgICAgICBpZiAoZS5kYXRhUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuZGF0YVBvaW50cykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlLmRhdGFQb2ludHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuZGF0YVBvaW50c1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlLmRhdGFQb2ludHM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50c1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5mcm9tT2JqZWN0KGUuZGF0YVBvaW50c1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5kYXRhUG9pbnRzID0gW10pLCBlLmRhdGFQb2ludHMgJiYgZS5kYXRhUG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5kYXRhUG9pbnRzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTnVtYmVyRGF0YVBvaW50LnRvT2JqZWN0KGUuZGF0YVBvaW50c1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkdhdWdlXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguU3VtID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQb2ludHMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLmRhdGFQb2ludHMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSBudWxsLCBvLnByb3RvdHlwZS5pc01vbm90b25pYyA9IG51bGwsIG8uY3JlYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZSk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQgfHwgKHQgPSBzLmNyZWF0ZSgpKSwgZS5kYXRhUG9pbnRzICE9IG51bGwgJiYgZS5kYXRhUG9pbnRzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5lbmNvZGUoZS5kYXRhUG9pbnRzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eVwiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgIDE2XG4gICAgICAgICAgICAgICkuaW50MzIoZS5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5KSwgZS5pc01vbm90b25pYyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwiaXNNb25vdG9uaWNcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAyNFxuICAgICAgICAgICAgICApLmJvb2woZS5pc01vbm90b25pYyksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuZGF0YVBvaW50cyAmJiByLmRhdGFQb2ludHMubGVuZ3RoIHx8IChyLmRhdGFQb2ludHMgPSBbXSksIHIuZGF0YVBvaW50cy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSBlLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuaXNNb25vdG9uaWMgPSBlLmJvb2woKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBlLnNraXBUeXBlKGMgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IG5ldyBhKGUpKSwgdGhpcy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuZGF0YVBvaW50cyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJkYXRhUG9pbnRzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuZGF0YVBvaW50cykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRhUG9pbnRzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKyt0KSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbiA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC52ZXJpZnkoZS5kYXRhUG9pbnRzW3RdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChuKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJkYXRhUG9pbnRzLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJhZ2dyZWdhdGlvblRlbXBvcmFsaXR5XCIpKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoZS5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5KSB7XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhZ2dyZWdhdGlvblRlbXBvcmFsaXR5OiBlbnVtIHZhbHVlIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuaXNNb25vdG9uaWMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiaXNNb25vdG9uaWNcIikgJiYgdHlwZW9mIGUuaXNNb25vdG9uaWMgIT0gXCJib29sZWFuXCIgPyBcImlzTW9ub3RvbmljOiBib29sZWFuIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtKCk7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5kYXRhUG9pbnRzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtLmRhdGFQb2ludHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuZGF0YVBvaW50c1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bS5kYXRhUG9pbnRzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LmRhdGFQb2ludHNbbl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5OdW1iZXJEYXRhUG9pbnQuZnJvbU9iamVjdChlLmRhdGFQb2ludHNbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzd2l0Y2ggKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9IGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfVU5TUEVDSUZJRURcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICB0LmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSAwO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX0RFTFRBXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgdC5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBR0dSRUdBVElPTl9URU1QT1JBTElUWV9DVU1VTEFUSVZFXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgdC5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gMjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmlzTW9ub3RvbmljICE9IG51bGwgJiYgKHQuaXNNb25vdG9uaWMgPSAhIWUuaXNNb25vdG9uaWMpLCB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5kYXRhUG9pbnRzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSB0LmVudW1zID09PSBTdHJpbmcgPyBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX1VOU1BFQ0lGSUVEXCIgOiAwLCBuLmlzTW9ub3RvbmljID0gZmFsc2UpLCBlLmRhdGFQb2ludHMgJiYgZS5kYXRhUG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5kYXRhUG9pbnRzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTnVtYmVyRGF0YVBvaW50LnRvT2JqZWN0KGUuZGF0YVBvaW50c1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJhZ2dyZWdhdGlvblRlbXBvcmFsaXR5XCIpICYmIChuLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSB0LmVudW1zID09PSBTdHJpbmcgPyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5BZ2dyZWdhdGlvblRlbXBvcmFsaXR5W2UuYWdncmVnYXRpb25UZW1wb3JhbGl0eV0gPT09IHZvaWQgMCA/IGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA6IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlbZS5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5XSA6IGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSksIGUuaXNNb25vdG9uaWMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiaXNNb25vdG9uaWNcIikgJiYgKG4uaXNNb25vdG9uaWMgPSBlLmlzTW9ub3RvbmljKSwgbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguSGlzdG9ncmFtID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQb2ludHMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLmRhdGFQb2ludHMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSBudWxsLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGUpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gcy5jcmVhdGUoKSksIGUuZGF0YVBvaW50cyAhPSBudWxsICYmIGUuZGF0YVBvaW50cy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmRhdGFQb2ludHMubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1EYXRhUG9pbnQuZW5jb2RlKGUuZGF0YVBvaW50c1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAxNlxuICAgICAgICAgICAgICApLmludDMyKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuZGF0YVBvaW50cyAmJiByLmRhdGFQb2ludHMubGVuZ3RoIHx8IChyLmRhdGFQb2ludHMgPSBbXSksIHIuZGF0YVBvaW50cy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSBlLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZGF0YVBvaW50c1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmRhdGFQb2ludHMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50czogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1EYXRhUG9pbnQudmVyaWZ5KGUuZGF0YVBvaW50c1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50cy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eVwiKSlcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eTogZW51bSB2YWx1ZSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtKCk7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5kYXRhUG9pbnRzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtLmRhdGFQb2ludHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuZGF0YVBvaW50c1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbS5kYXRhUG9pbnRzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LmRhdGFQb2ludHNbbl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1EYXRhUG9pbnQuZnJvbU9iamVjdChlLmRhdGFQb2ludHNbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzd2l0Y2ggKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSkge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9IGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfVU5TUEVDSUZJRURcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICB0LmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSAwO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX0RFTFRBXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgdC5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBR0dSRUdBVElPTl9URU1QT1JBTElUWV9DVU1VTEFUSVZFXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgdC5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gMjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5kYXRhUG9pbnRzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSB0LmVudW1zID09PSBTdHJpbmcgPyBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX1VOU1BFQ0lGSUVEXCIgOiAwKSwgZS5kYXRhUG9pbnRzICYmIGUuZGF0YVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLmRhdGFQb2ludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uZGF0YVBvaW50c1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC50b09iamVjdChlLmRhdGFQb2ludHNbcl0sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eVwiKSAmJiAobi5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gdC5lbnVtcyA9PT0gU3RyaW5nID8gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuQWdncmVnYXRpb25UZW1wb3JhbGl0eVtlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHldID09PSB2b2lkIDAgPyBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgOiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5BZ2dyZWdhdGlvblRlbXBvcmFsaXR5W2UuYWdncmVnYXRpb25UZW1wb3JhbGl0eV0gOiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkpLCBuO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHZvaWQgMCAmJiAoZSA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgZSArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1cIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5FeHBvbmVudGlhbEhpc3RvZ3JhbSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhUG9pbnRzID0gW10sIGkpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IE9iamVjdC5rZXlzKGkpLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICAgICAgICBpW2VbdF1dICE9IG51bGwgJiYgKHRoaXNbZVt0XV0gPSBpW2VbdF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvLnByb3RvdHlwZS5kYXRhUG9pbnRzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLmRhdGFQb2ludHMgIT0gbnVsbCAmJiBlLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuZW5jb2RlKGUuZGF0YVBvaW50c1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHlcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAxNlxuICAgICAgICAgICAgICApLmludDMyKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW0oKTsgZS5wb3MgPCBuOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICAgICAgICAgICAgci5kYXRhUG9pbnRzICYmIHIuZGF0YVBvaW50cy5sZW5ndGggfHwgKHIuZGF0YVBvaW50cyA9IFtdKSwgci5kYXRhUG9pbnRzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gZS5pbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGUuc2tpcFR5cGUoYyAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gbmV3IGEoZSkpLCB0aGlzLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIGUgIT0gXCJvYmplY3RcIiB8fCBlID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5kYXRhUG9pbnRzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImRhdGFQb2ludHNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5kYXRhUG9pbnRzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGFQb2ludHM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IDA7IHQgPCBlLmRhdGFQb2ludHMubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQudmVyaWZ5KGUuZGF0YVBvaW50c1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50cy5cIiArIG47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eVwiKSlcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuYWdncmVnYXRpb25UZW1wb3JhbGl0eSkge1xuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eTogZW51bSB2YWx1ZSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbSgpO1xuICAgICAgICAgICAgICBpZiAoZS5kYXRhUG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuZGF0YVBvaW50cykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtLmRhdGFQb2ludHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50cyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuZGF0YVBvaW50c1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtLmRhdGFQb2ludHM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50c1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LmZyb21PYmplY3QoZS5kYXRhUG9pbnRzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgc3dpdGNoIChlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgICAgICB0LmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX1VOU1BFQ0lGSUVEXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgdC5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gMDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJBR0dSRUdBVElPTl9URU1QT1JBTElUWV9ERUxUQVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgIHQuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9IDE7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfQ1VNVUxBVElWRVwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgIHQuYWdncmVnYXRpb25UZW1wb3JhbGl0eSA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4uZGF0YVBvaW50cyA9IFtdKSwgdC5kZWZhdWx0cyAmJiAobi5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gdC5lbnVtcyA9PT0gU3RyaW5nID8gXCJBR0dSRUdBVElPTl9URU1QT1JBTElUWV9VTlNQRUNJRklFRFwiIDogMCksIGUuZGF0YVBvaW50cyAmJiBlLmRhdGFQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi5kYXRhUG9pbnRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLmRhdGFQb2ludHMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICBuLmRhdGFQb2ludHNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC50b09iamVjdChlLmRhdGFQb2ludHNbcl0sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYWdncmVnYXRpb25UZW1wb3JhbGl0eVwiKSAmJiAobi5hZ2dyZWdhdGlvblRlbXBvcmFsaXR5ID0gdC5lbnVtcyA9PT0gU3RyaW5nID8gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuQWdncmVnYXRpb25UZW1wb3JhbGl0eVtlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHldID09PSB2b2lkIDAgPyBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgOiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5BZ2dyZWdhdGlvblRlbXBvcmFsaXR5W2UuYWdncmVnYXRpb25UZW1wb3JhbGl0eV0gOiBlLmFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkpLCBuO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHZvaWQgMCAmJiAoZSA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgZSArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbVwiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLlN1bW1hcnkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVBvaW50cyA9IFtdLCBpKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIGUgPSBPYmplY3Qua2V5cyhpKSwgdCA9IDA7IHQgPCBlLmxlbmd0aDsgKyt0KVxuICAgICAgICAgICAgICAgICAgaVtlW3RdXSAhPSBudWxsICYmICh0aGlzW2VbdF1dID0gaVtlW3RdXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gby5wcm90b3R5cGUuZGF0YVBvaW50cyA9IGwuZW1wdHlBcnJheSwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLmRhdGFQb2ludHMgIT0gbnVsbCAmJiBlLmRhdGFQb2ludHMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5kYXRhUG9pbnRzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeURhdGFQb2ludC5lbmNvZGUoZS5kYXRhUG9pbnRzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMTBcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeSgpOyBlLnBvcyA8IG47ICkge1xuICAgICAgICAgICAgICAgIHZhciBjID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGMgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICByLmRhdGFQb2ludHMgJiYgci5kYXRhUG9pbnRzLmxlbmd0aCB8fCAoci5kYXRhUG9pbnRzID0gW10pLCByLmRhdGFQb2ludHMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZGF0YVBvaW50c1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmRhdGFQb2ludHMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZGF0YVBvaW50czogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LnZlcmlmeShlLmRhdGFQb2ludHNbdF0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImRhdGFQb2ludHMuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5KVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5KCk7XG4gICAgICAgICAgICAgIGlmIChlLmRhdGFQb2ludHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5kYXRhUG9pbnRzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeS5kYXRhUG9pbnRzOiBhcnJheSBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICB0LmRhdGFQb2ludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLmRhdGFQb2ludHNbbl0gIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5LmRhdGFQb2ludHM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuZGF0YVBvaW50c1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuZnJvbU9iamVjdChlLmRhdGFQb2ludHNbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4uZGF0YVBvaW50cyA9IFtdKSwgZS5kYXRhUG9pbnRzICYmIGUuZGF0YVBvaW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLmRhdGFQb2ludHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUuZGF0YVBvaW50cy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uZGF0YVBvaW50c1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQudG9PYmplY3QoZS5kYXRhUG9pbnRzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeVwiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLkFnZ3JlZ2F0aW9uVGVtcG9yYWxpdHkgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB2YXIgbyA9IHt9LCBpID0gT2JqZWN0LmNyZWF0ZShvKTtcbiAgICAgICAgICAgIHJldHVybiBpW29bMF0gPSBcIkFHR1JFR0FUSU9OX1RFTVBPUkFMSVRZX1VOU1BFQ0lGSUVEXCJdID0gMCwgaVtvWzFdID0gXCJBR0dSRUdBVElPTl9URU1QT1JBTElUWV9ERUxUQVwiXSA9IDEsIGlbb1syXSA9IFwiQUdHUkVHQVRJT05fVEVNUE9SQUxJVFlfQ1VNVUxBVElWRVwiXSA9IDIsIGk7XG4gICAgICAgICAgfSkoKSwgaC5EYXRhUG9pbnRGbGFncyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBvID0ge30sIGkgPSBPYmplY3QuY3JlYXRlKG8pO1xuICAgICAgICAgICAgcmV0dXJuIGlbb1swXSA9IFwiREFUQV9QT0lOVF9GTEFHU19ET19OT1RfVVNFXCJdID0gMCwgaVtvWzFdID0gXCJEQVRBX1BPSU5UX0ZMQUdTX05PX1JFQ09SREVEX1ZBTFVFX01BU0tcIl0gPSAxLCBpO1xuICAgICAgICAgIH0pKCksIGguTnVtYmVyRGF0YVBvaW50ID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhlKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgPSBbXSwgdGhpcy5leGVtcGxhcnMgPSBbXSwgZSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gT2JqZWN0LmtleXMoZSksIG4gPSAwOyBuIDwgdC5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIGVbdFtuXV0gIT0gbnVsbCAmJiAodGhpc1t0W25dXSA9IGVbdFtuXV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgby5wcm90b3R5cGUuYXR0cmlidXRlcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuc3RhcnRUaW1lVW5peE5hbm8gPSBudWxsLCBvLnByb3RvdHlwZS50aW1lVW5peE5hbm8gPSBudWxsLCBvLnByb3RvdHlwZS5hc0RvdWJsZSA9IG51bGwsIG8ucHJvdG90eXBlLmFzSW50ID0gbnVsbCwgby5wcm90b3R5cGUuZXhlbXBsYXJzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5mbGFncyA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIFwidmFsdWVcIiwge1xuICAgICAgICAgICAgICBnZXQ6IGwub25lT2ZHZXR0ZXIoaSA9IFtcImFzRG91YmxlXCIsIFwiYXNJbnRcIl0pLFxuICAgICAgICAgICAgICBzZXQ6IGwub25lT2ZTZXR0ZXIoaSlcbiAgICAgICAgICAgIH0pLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKHQpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIGlmIChuIHx8IChuID0gcy5jcmVhdGUoKSksIHQuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgMTdcbiAgICAgICAgICAgICAgKS5maXhlZDY0KHQuc3RhcnRUaW1lVW5peE5hbm8pLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwidGltZVVuaXhOYW5vXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDMsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgMjVcbiAgICAgICAgICAgICAgKS5maXhlZDY0KHQudGltZVVuaXhOYW5vKSwgdC5hc0RvdWJsZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiYXNEb3VibGVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNCwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAzM1xuICAgICAgICAgICAgICApLmRvdWJsZSh0LmFzRG91YmxlKSwgdC5leGVtcGxhcnMgIT0gbnVsbCAmJiB0LmV4ZW1wbGFycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLmVuY29kZSh0LmV4ZW1wbGFyc1tyXSwgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDUsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDQyXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIGlmICh0LmFzSW50ICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJhc0ludFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA2LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDQ5XG4gICAgICAgICAgICAgICkuc2ZpeGVkNjQodC5hc0ludCksIHQuYXR0cmlidXRlcyAhPSBudWxsICYmIHQuYXR0cmlidXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmF0dHJpYnV0ZXMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmVuY29kZSh0LmF0dHJpYnV0ZXNbcl0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCA3LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICA1OFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICByZXR1cm4gdC5mbGFncyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZmxhZ3NcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgOCwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICA2NFxuICAgICAgICAgICAgICApLnVpbnQzMih0LmZsYWdzKSwgbjtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUodCwgbikubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBhLmNyZWF0ZSh0KSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIHIgPSBuID09PSB2b2lkIDAgPyB0LmxlbiA6IHQucG9zICsgbiwgYyA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5OdW1iZXJEYXRhUG9pbnQoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5hdHRyaWJ1dGVzICYmIGMuYXR0cmlidXRlcy5sZW5ndGggfHwgKGMuYXR0cmlidXRlcyA9IFtdKSwgYy5hdHRyaWJ1dGVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5kZWNvZGUodCwgdC51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICBjLnN0YXJ0VGltZVVuaXhOYW5vID0gdC5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIGMudGltZVVuaXhOYW5vID0gdC5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuYXNEb3VibGUgPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgICAgICAgICAgICBjLmFzSW50ID0gdC5zZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNToge1xuICAgICAgICAgICAgICAgICAgICBjLmV4ZW1wbGFycyAmJiBjLmV4ZW1wbGFycy5sZW5ndGggfHwgKGMuZXhlbXBsYXJzID0gW10pLCBjLmV4ZW1wbGFycy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA4OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuZmxhZ3MgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHQgIT0gXCJvYmplY3RcIiB8fCB0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAodC5hdHRyaWJ1dGVzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImF0dHJpYnV0ZXNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmF0dHJpYnV0ZXMubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS52ZXJpZnkodC5hdHRyaWJ1dGVzW3JdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJhdHRyaWJ1dGVzLlwiICsgYztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwic3RhcnRUaW1lVW5peE5hbm9cIikgJiYgIWwuaXNJbnRlZ2VyKHQuc3RhcnRUaW1lVW5peE5hbm8pICYmICEodC5zdGFydFRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcih0LnN0YXJ0VGltZVVuaXhOYW5vLmxvdykgJiYgbC5pc0ludGVnZXIodC5zdGFydFRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic3RhcnRUaW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidGltZVVuaXhOYW5vXCIpICYmICFsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFubykgJiYgISh0LnRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFuby5sb3cpICYmIGwuaXNJbnRlZ2VyKHQudGltZVVuaXhOYW5vLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ0aW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5hc0RvdWJsZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhc0RvdWJsZVwiKSAmJiAobi52YWx1ZSA9IDEsIHR5cGVvZiB0LmFzRG91YmxlICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImFzRG91YmxlOiBudW1iZXIgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQuYXNJbnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXNJbnRcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXNcIjtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9IDEsICFsLmlzSW50ZWdlcih0LmFzSW50KSAmJiAhKHQuYXNJbnQgJiYgbC5pc0ludGVnZXIodC5hc0ludC5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuYXNJbnQuaGlnaCkpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXNJbnQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4ZW1wbGFycyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJleGVtcGxhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5leGVtcGxhcnMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhlbXBsYXJzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5leGVtcGxhcnMubGVuZ3RoOyArK3IpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIudmVyaWZ5KHQuZXhlbXBsYXJzW3JdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJleGVtcGxhcnMuXCIgKyBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdC5mbGFncyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAhbC5pc0ludGVnZXIodC5mbGFncykgPyBcImZsYWdzOiBpbnRlZ2VyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludClcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTnVtYmVyRGF0YVBvaW50KCk7XG4gICAgICAgICAgICAgIGlmICh0LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuTnVtYmVyRGF0YVBvaW50LmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuYXR0cmlidXRlc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5hdHRyaWJ1dGVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmZyb21PYmplY3QodC5hdHRyaWJ1dGVzW3JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uc3RhcnRUaW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQuc3RhcnRUaW1lVW5peE5hbm8pKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJzdHJpbmdcIiA/IG4uc3RhcnRUaW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnN0YXJ0VGltZVVuaXhOYW5vLCAxMCkgOiB0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi5zdGFydFRpbWVVbml4TmFubyA9IHQuc3RhcnRUaW1lVW5peE5hbm8gOiB0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcIm9iamVjdFwiICYmIChuLnN0YXJ0VGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC5zdGFydFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIHQuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAobi50aW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQudGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiB0LnRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gbi50aW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLnRpbWVVbml4TmFubyA9IHQudGltZVVuaXhOYW5vIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKG4udGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQuYXNEb3VibGUgIT0gbnVsbCAmJiAobi5hc0RvdWJsZSA9IE51bWJlcih0LmFzRG91YmxlKSksIHQuYXNJbnQgIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uYXNJbnQgPSBsLkxvbmcuZnJvbVZhbHVlKHQuYXNJbnQpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuYXNJbnQgPT0gXCJzdHJpbmdcIiA/IG4uYXNJbnQgPSBwYXJzZUludCh0LmFzSW50LCAxMCkgOiB0eXBlb2YgdC5hc0ludCA9PSBcIm51bWJlclwiID8gbi5hc0ludCA9IHQuYXNJbnQgOiB0eXBlb2YgdC5hc0ludCA9PSBcIm9iamVjdFwiICYmIChuLmFzSW50ID0gbmV3IGwuTG9uZ0JpdHModC5hc0ludC5sb3cgPj4+IDAsIHQuYXNJbnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LmV4ZW1wbGFycykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmV4ZW1wbGFycykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5leGVtcGxhcnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uZXhlbXBsYXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LmV4ZW1wbGFyc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLk51bWJlckRhdGFQb2ludC5leGVtcGxhcnM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIG4uZXhlbXBsYXJzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIuZnJvbU9iamVjdCh0LmV4ZW1wbGFyc1tyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0LmZsYWdzICE9IG51bGwgJiYgKG4uZmxhZ3MgPSB0LmZsYWdzID4+PiAwKSwgbjtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgIGlmICgobi5hcnJheXMgfHwgbi5kZWZhdWx0cykgJiYgKHIuZXhlbXBsYXJzID0gW10sIHIuYXR0cmlidXRlcyA9IFtdKSwgbi5kZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IGwuTG9uZygwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByLnN0YXJ0VGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gYy50b1N0cmluZygpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gYy50b051bWJlcigpIDogYztcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgIHIuc3RhcnRUaW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gYy50b1N0cmluZygpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gYy50b051bWJlcigpIDogYztcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgIHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgIHIuZmxhZ3MgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gci5zdGFydFRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyh0LnN0YXJ0VGltZVVuaXhOYW5vKSA6IHQuc3RhcnRUaW1lVW5peE5hbm8gOiByLnN0YXJ0VGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQuc3RhcnRUaW1lVW5peE5hbm8pIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC5zdGFydFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIHQuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IHQuc3RhcnRUaW1lVW5peE5hbm8pLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ0aW1lVW5peE5hbm9cIikgJiYgKHR5cGVvZiB0LnRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcodC50aW1lVW5peE5hbm8pIDogdC50aW1lVW5peE5hbm8gOiByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0LnRpbWVVbml4TmFubykgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyh0LnRpbWVVbml4TmFuby5sb3cgPj4+IDAsIHQudGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiB0LnRpbWVVbml4TmFubyksIHQuYXNEb3VibGUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXNEb3VibGVcIikgJiYgKHIuYXNEb3VibGUgPSBuLmpzb24gJiYgIWlzRmluaXRlKHQuYXNEb3VibGUpID8gU3RyaW5nKHQuYXNEb3VibGUpIDogdC5hc0RvdWJsZSwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcImFzRG91YmxlXCIpKSwgdC5leGVtcGxhcnMgJiYgdC5leGVtcGxhcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgci5leGVtcGxhcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IHQuZXhlbXBsYXJzLmxlbmd0aDsgKyt2KVxuICAgICAgICAgICAgICAgICAgci5leGVtcGxhcnNbdl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeGVtcGxhci50b09iamVjdCh0LmV4ZW1wbGFyc1t2XSwgbik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuYXNJbnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXNJbnRcIikgJiYgKHR5cGVvZiB0LmFzSW50ID09IFwibnVtYmVyXCIgPyByLmFzSW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQuYXNJbnQpIDogdC5hc0ludCA6IHIuYXNJbnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5hc0ludCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyh0LmFzSW50LmxvdyA+Pj4gMCwgdC5hc0ludC5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC5hc0ludCwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcImFzSW50XCIpKSwgdC5hdHRyaWJ1dGVzICYmIHQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IHQuYXR0cmlidXRlcy5sZW5ndGg7ICsrdilcbiAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlc1t2XSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudG9PYmplY3QodC5hdHRyaWJ1dGVzW3ZdLCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdC5mbGFncyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAoci5mbGFncyA9IHQuZmxhZ3MpLCByO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgdCArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5OdW1iZXJEYXRhUG9pbnRcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5IaXN0b2dyYW1EYXRhUG9pbnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlcyA9IFtdLCB0aGlzLmJ1Y2tldENvdW50cyA9IFtdLCB0aGlzLmV4cGxpY2l0Qm91bmRzID0gW10sIHRoaXMuZXhlbXBsYXJzID0gW10sIGUpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG8ucHJvdG90eXBlLmF0dHJpYnV0ZXMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLnN0YXJ0VGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUudGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuY291bnQgPSBudWxsLCBvLnByb3RvdHlwZS5zdW0gPSBudWxsLCBvLnByb3RvdHlwZS5idWNrZXRDb3VudHMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmV4cGxpY2l0Qm91bmRzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5leGVtcGxhcnMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmZsYWdzID0gbnVsbCwgby5wcm90b3R5cGUubWluID0gbnVsbCwgby5wcm90b3R5cGUubWF4ID0gbnVsbDtcbiAgICAgICAgICAgIHZhciBpO1xuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwgXCJfc3VtXCIsIHtcbiAgICAgICAgICAgICAgZ2V0OiBsLm9uZU9mR2V0dGVyKGkgPSBbXCJzdW1cIl0pLFxuICAgICAgICAgICAgICBzZXQ6IGwub25lT2ZTZXR0ZXIoaSlcbiAgICAgICAgICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIFwiX21pblwiLCB7XG4gICAgICAgICAgICAgIGdldDogbC5vbmVPZkdldHRlcihpID0gW1wibWluXCJdKSxcbiAgICAgICAgICAgICAgc2V0OiBsLm9uZU9mU2V0dGVyKGkpXG4gICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCBcIl9tYXhcIiwge1xuICAgICAgICAgICAgICBnZXQ6IGwub25lT2ZHZXR0ZXIoaSA9IFtcIm1heFwiXSksXG4gICAgICAgICAgICAgIHNldDogbC5vbmVPZlNldHRlcihpKVxuICAgICAgICAgICAgfSksIG8uY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8odCk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgaWYgKG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwic3RhcnRUaW1lVW5peE5hbm9cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAxN1xuICAgICAgICAgICAgICApLmZpeGVkNjQodC5zdGFydFRpbWVVbml4TmFubyksIHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJ0aW1lVW5peE5hbm9cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAyNVxuICAgICAgICAgICAgICApLmZpeGVkNjQodC50aW1lVW5peE5hbm8pLCB0LmNvdW50ICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJjb3VudFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA0LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDMzXG4gICAgICAgICAgICAgICkuZml4ZWQ2NCh0LmNvdW50KSwgdC5zdW0gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInN1bVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA1LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDQxXG4gICAgICAgICAgICAgICkuZG91YmxlKHQuc3VtKSwgdC5idWNrZXRDb3VudHMgIT0gbnVsbCAmJiB0LmJ1Y2tldENvdW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDYsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICA1MFxuICAgICAgICAgICAgICAgICkuZm9yaygpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5idWNrZXRDb3VudHMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICBuLmZpeGVkNjQodC5idWNrZXRDb3VudHNbcl0pO1xuICAgICAgICAgICAgICAgIG4ubGRlbGltKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuZXhwbGljaXRCb3VuZHMgIT0gbnVsbCAmJiB0LmV4cGxpY2l0Qm91bmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgLyogaWQgNywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgIDU4XG4gICAgICAgICAgICAgICAgKS5mb3JrKCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4cGxpY2l0Qm91bmRzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5kb3VibGUodC5leHBsaWNpdEJvdW5kc1tyXSk7XG4gICAgICAgICAgICAgICAgbi5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5leGVtcGxhcnMgIT0gbnVsbCAmJiB0LmV4ZW1wbGFycy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLmVuY29kZSh0LmV4ZW1wbGFyc1tyXSwgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDgsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDY2XG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIGlmICh0LmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0LmF0dHJpYnV0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5lbmNvZGUodC5hdHRyaWJ1dGVzW3JdLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgOSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgNzRcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQuZmxhZ3MgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImZsYWdzXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDEwLCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgIDgwXG4gICAgICAgICAgICAgICkudWludDMyKHQuZmxhZ3MpLCB0Lm1pbiAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwibWluXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDExLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDg5XG4gICAgICAgICAgICAgICkuZG91YmxlKHQubWluKSwgdC5tYXggIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcIm1heFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxMiwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICA5N1xuICAgICAgICAgICAgICApLmRvdWJsZSh0Lm1heCksIG47XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtRGF0YVBvaW50KCk7IHQucG9zIDwgcjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodiA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSA5OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuYXR0cmlidXRlcyAmJiBjLmF0dHJpYnV0ZXMubGVuZ3RoIHx8IChjLmF0dHJpYnV0ZXMgPSBbXSksIGMuYXR0cmlidXRlcy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZGVjb2RlKHQsIHQudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5zdGFydFRpbWVVbml4TmFubyA9IHQuZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICBjLnRpbWVVbml4TmFubyA9IHQuZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNDoge1xuICAgICAgICAgICAgICAgICAgICBjLmNvdW50ID0gdC5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA1OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuc3VtID0gdC5kb3VibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDY6IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuYnVja2V0Q291bnRzICYmIGMuYnVja2V0Q291bnRzLmxlbmd0aCB8fCAoYy5idWNrZXRDb3VudHMgPSBbXSksICh2ICYgNykgPT09IDIpXG4gICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IHQudWludDMyKCkgKyB0LnBvczsgdC5wb3MgPCBtOyApXG4gICAgICAgICAgICAgICAgICAgICAgICBjLmJ1Y2tldENvdW50cy5wdXNoKHQuZml4ZWQ2NCgpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGMuYnVja2V0Q291bnRzLnB1c2godC5maXhlZDY0KCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNzoge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYy5leHBsaWNpdEJvdW5kcyAmJiBjLmV4cGxpY2l0Qm91bmRzLmxlbmd0aCB8fCAoYy5leHBsaWNpdEJvdW5kcyA9IFtdKSwgKHYgJiA3KSA9PT0gMilcbiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBtID0gdC51aW50MzIoKSArIHQucG9zOyB0LnBvcyA8IG07IClcbiAgICAgICAgICAgICAgICAgICAgICAgIGMuZXhwbGljaXRCb3VuZHMucHVzaCh0LmRvdWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgIGMuZXhwbGljaXRCb3VuZHMucHVzaCh0LmRvdWJsZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDg6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5leGVtcGxhcnMgJiYgYy5leGVtcGxhcnMubGVuZ3RoIHx8IChjLmV4ZW1wbGFycyA9IFtdKSwgYy5leGVtcGxhcnMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeGVtcGxhci5kZWNvZGUodCwgdC51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTA6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5mbGFncyA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxMToge1xuICAgICAgICAgICAgICAgICAgICBjLm1pbiA9IHQuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxMjoge1xuICAgICAgICAgICAgICAgICAgICBjLm1heCA9IHQuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSh2ICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gYztcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBuZXcgYSh0KSksIHRoaXMuZGVjb2RlKHQsIHQudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgdCAhPSBcIm9iamVjdFwiIHx8IHQgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXR0cmlidXRlc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQuYXR0cmlidXRlcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnZlcmlmeSh0LmF0dHJpYnV0ZXNbbl0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXMuXCIgKyByO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdGFydFRpbWVVbml4TmFub1wiKSAmJiAhbC5pc0ludGVnZXIodC5zdGFydFRpbWVVbml4TmFubykgJiYgISh0LnN0YXJ0VGltZVVuaXhOYW5vICYmIGwuaXNJbnRlZ2VyKHQuc3RhcnRUaW1lVW5peE5hbm8ubG93KSAmJiBsLmlzSW50ZWdlcih0LnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzdGFydFRpbWVVbml4TmFubzogaW50ZWdlcnxMb25nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ0aW1lVW5peE5hbm9cIikgJiYgIWwuaXNJbnRlZ2VyKHQudGltZVVuaXhOYW5vKSAmJiAhKHQudGltZVVuaXhOYW5vICYmIGwuaXNJbnRlZ2VyKHQudGltZVVuaXhOYW5vLmxvdykgJiYgbC5pc0ludGVnZXIodC50aW1lVW5peE5hbm8uaGlnaCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInRpbWVVbml4TmFubzogaW50ZWdlcnxMb25nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LmNvdW50ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImNvdW50XCIpICYmICFsLmlzSW50ZWdlcih0LmNvdW50KSAmJiAhKHQuY291bnQgJiYgbC5pc0ludGVnZXIodC5jb3VudC5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuY291bnQuaGlnaCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvdW50OiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQuc3VtICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN1bVwiKSAmJiB0eXBlb2YgdC5zdW0gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzdW06IG51bWJlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5idWNrZXRDb3VudHMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYnVja2V0Q291bnRzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuYnVja2V0Q291bnRzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImJ1Y2tldENvdW50czogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQuYnVja2V0Q291bnRzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgaWYgKCFsLmlzSW50ZWdlcih0LmJ1Y2tldENvdW50c1tuXSkgJiYgISh0LmJ1Y2tldENvdW50c1tuXSAmJiBsLmlzSW50ZWdlcih0LmJ1Y2tldENvdW50c1tuXS5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuYnVja2V0Q291bnRzW25dLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYnVja2V0Q291bnRzOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4cGxpY2l0Qm91bmRzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImV4cGxpY2l0Qm91bmRzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuZXhwbGljaXRCb3VuZHMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhwbGljaXRCb3VuZHM6IGFycmF5IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCB0LmV4cGxpY2l0Qm91bmRzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LmV4cGxpY2l0Qm91bmRzW25dICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImV4cGxpY2l0Qm91bmRzOiBudW1iZXJbXSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4ZW1wbGFycyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJleGVtcGxhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5leGVtcGxhcnMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhlbXBsYXJzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5leGVtcGxhcnMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIudmVyaWZ5KHQuZXhlbXBsYXJzW25dKTtcbiAgICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJleGVtcGxhcnMuXCIgKyByO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdC5mbGFncyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAhbC5pc0ludGVnZXIodC5mbGFncykgPyBcImZsYWdzOiBpbnRlZ2VyIGV4cGVjdGVkXCIgOiB0Lm1pbiAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJtaW5cIikgJiYgdHlwZW9mIHQubWluICE9IFwibnVtYmVyXCIgPyBcIm1pbjogbnVtYmVyIGV4cGVjdGVkXCIgOiB0Lm1heCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJtYXhcIikgJiYgdHlwZW9mIHQubWF4ICE9IFwibnVtYmVyXCIgPyBcIm1heDogbnVtYmVyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludClcbiAgICAgICAgICAgICAgICByZXR1cm4gdDtcbiAgICAgICAgICAgICAgdmFyIG4gPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtRGF0YVBvaW50KCk7XG4gICAgICAgICAgICAgIGlmICh0LmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuSGlzdG9ncmFtRGF0YVBvaW50LmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuYXR0cmlidXRlc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC5hdHRyaWJ1dGVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLmF0dHJpYnV0ZXNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmZyb21PYmplY3QodC5hdHRyaWJ1dGVzW3JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuc3RhcnRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uc3RhcnRUaW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQuc3RhcnRUaW1lVW5peE5hbm8pKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJzdHJpbmdcIiA/IG4uc3RhcnRUaW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnN0YXJ0VGltZVVuaXhOYW5vLCAxMCkgOiB0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi5zdGFydFRpbWVVbml4TmFubyA9IHQuc3RhcnRUaW1lVW5peE5hbm8gOiB0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcIm9iamVjdFwiICYmIChuLnN0YXJ0VGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC5zdGFydFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIHQuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAobi50aW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQudGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiB0LnRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gbi50aW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLnRpbWVVbml4TmFubyA9IHQudGltZVVuaXhOYW5vIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKG4udGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQuY291bnQgIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uY291bnQgPSBsLkxvbmcuZnJvbVZhbHVlKHQuY291bnQpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuY291bnQgPT0gXCJzdHJpbmdcIiA/IG4uY291bnQgPSBwYXJzZUludCh0LmNvdW50LCAxMCkgOiB0eXBlb2YgdC5jb3VudCA9PSBcIm51bWJlclwiID8gbi5jb3VudCA9IHQuY291bnQgOiB0eXBlb2YgdC5jb3VudCA9PSBcIm9iamVjdFwiICYmIChuLmNvdW50ID0gbmV3IGwuTG9uZ0JpdHModC5jb3VudC5sb3cgPj4+IDAsIHQuY291bnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LnN1bSAhPSBudWxsICYmIChuLnN1bSA9IE51bWJlcih0LnN1bSkpLCB0LmJ1Y2tldENvdW50cykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmJ1Y2tldENvdW50cykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC5idWNrZXRDb3VudHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uYnVja2V0Q291bnRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmJ1Y2tldENvdW50cy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIGwuTG9uZyA/IChuLmJ1Y2tldENvdW50c1tyXSA9IGwuTG9uZy5mcm9tVmFsdWUodC5idWNrZXRDb3VudHNbcl0pKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuYnVja2V0Q291bnRzW3JdID09IFwic3RyaW5nXCIgPyBuLmJ1Y2tldENvdW50c1tyXSA9IHBhcnNlSW50KHQuYnVja2V0Q291bnRzW3JdLCAxMCkgOiB0eXBlb2YgdC5idWNrZXRDb3VudHNbcl0gPT0gXCJudW1iZXJcIiA/IG4uYnVja2V0Q291bnRzW3JdID0gdC5idWNrZXRDb3VudHNbcl0gOiB0eXBlb2YgdC5idWNrZXRDb3VudHNbcl0gPT0gXCJvYmplY3RcIiAmJiAobi5idWNrZXRDb3VudHNbcl0gPSBuZXcgbC5Mb25nQml0cyh0LmJ1Y2tldENvdW50c1tyXS5sb3cgPj4+IDAsIHQuYnVja2V0Q291bnRzW3JdLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4cGxpY2l0Qm91bmRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuZXhwbGljaXRCb3VuZHMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1EYXRhUG9pbnQuZXhwbGljaXRCb3VuZHM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uZXhwbGljaXRCb3VuZHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQuZXhwbGljaXRCb3VuZHMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICBuLmV4cGxpY2l0Qm91bmRzW3JdID0gTnVtYmVyKHQuZXhwbGljaXRCb3VuZHNbcl0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmV4ZW1wbGFycykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmV4ZW1wbGFycykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC5leGVtcGxhcnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uZXhlbXBsYXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LmV4ZW1wbGFyc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkhpc3RvZ3JhbURhdGFQb2ludC5leGVtcGxhcnM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIG4uZXhlbXBsYXJzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIuZnJvbU9iamVjdCh0LmV4ZW1wbGFyc1tyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0LmZsYWdzICE9IG51bGwgJiYgKG4uZmxhZ3MgPSB0LmZsYWdzID4+PiAwKSwgdC5taW4gIT0gbnVsbCAmJiAobi5taW4gPSBOdW1iZXIodC5taW4pKSwgdC5tYXggIT0gbnVsbCAmJiAobi5tYXggPSBOdW1iZXIodC5tYXgpKSwgbjtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIG4gfHwgKG4gPSB7fSk7XG4gICAgICAgICAgICAgIHZhciByID0ge307XG4gICAgICAgICAgICAgIGlmICgobi5hcnJheXMgfHwgbi5kZWZhdWx0cykgJiYgKHIuYnVja2V0Q291bnRzID0gW10sIHIuZXhwbGljaXRCb3VuZHMgPSBbXSwgci5leGVtcGxhcnMgPSBbXSwgci5hdHRyaWJ1dGVzID0gW10pLCBuLmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHIuc3RhcnRUaW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgci5zdGFydFRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICBpZiAobC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIGMgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIHIuY291bnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgci5jb3VudCA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICByLmZsYWdzID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdGFydFRpbWVVbml4TmFub1wiKSAmJiAodHlwZW9mIHQuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHIuc3RhcnRUaW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcodC5zdGFydFRpbWVVbml4TmFubykgOiB0LnN0YXJ0VGltZVVuaXhOYW5vIDogci5zdGFydFRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0LnN0YXJ0VGltZVVuaXhOYW5vKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKHQuc3RhcnRUaW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiB0LnN0YXJ0VGltZVVuaXhOYW5vKSwgdC50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgdC50aW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQudGltZVVuaXhOYW5vKSA6IHQudGltZVVuaXhOYW5vIDogci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC50aW1lVW5peE5hbm8pIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC50aW1lVW5peE5hbm8pLCB0LmNvdW50ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImNvdW50XCIpICYmICh0eXBlb2YgdC5jb3VudCA9PSBcIm51bWJlclwiID8gci5jb3VudCA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyh0LmNvdW50KSA6IHQuY291bnQgOiByLmNvdW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQuY291bnQpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC5jb3VudC5sb3cgPj4+IDAsIHQuY291bnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IHQuY291bnQpLCB0LnN1bSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdW1cIikgJiYgKHIuc3VtID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LnN1bSkgPyBTdHJpbmcodC5zdW0pIDogdC5zdW0sIG4ub25lb2ZzICYmIChyLl9zdW0gPSBcInN1bVwiKSksIHQuYnVja2V0Q291bnRzICYmIHQuYnVja2V0Q291bnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHIuYnVja2V0Q291bnRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCB0LmJ1Y2tldENvdW50cy5sZW5ndGg7ICsrdilcbiAgICAgICAgICAgICAgICAgIHR5cGVvZiB0LmJ1Y2tldENvdW50c1t2XSA9PSBcIm51bWJlclwiID8gci5idWNrZXRDb3VudHNbdl0gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcodC5idWNrZXRDb3VudHNbdl0pIDogdC5idWNrZXRDb3VudHNbdl0gOiByLmJ1Y2tldENvdW50c1t2XSA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0LmJ1Y2tldENvdW50c1t2XSkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyh0LmJ1Y2tldENvdW50c1t2XS5sb3cgPj4+IDAsIHQuYnVja2V0Q291bnRzW3ZdLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiB0LmJ1Y2tldENvdW50c1t2XTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5leHBsaWNpdEJvdW5kcyAmJiB0LmV4cGxpY2l0Qm91bmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHIuZXhwbGljaXRCb3VuZHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IHQuZXhwbGljaXRCb3VuZHMubGVuZ3RoOyArK3YpXG4gICAgICAgICAgICAgICAgICByLmV4cGxpY2l0Qm91bmRzW3ZdID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LmV4cGxpY2l0Qm91bmRzW3ZdKSA/IFN0cmluZyh0LmV4cGxpY2l0Qm91bmRzW3ZdKSA6IHQuZXhwbGljaXRCb3VuZHNbdl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQuZXhlbXBsYXJzICYmIHQuZXhlbXBsYXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHIuZXhlbXBsYXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrdilcbiAgICAgICAgICAgICAgICAgIHIuZXhlbXBsYXJzW3ZdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIudG9PYmplY3QodC5leGVtcGxhcnNbdl0sIG4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmF0dHJpYnV0ZXMgJiYgdC5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKyt2KVxuICAgICAgICAgICAgICAgICAgci5hdHRyaWJ1dGVzW3ZdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS50b09iamVjdCh0LmF0dHJpYnV0ZXNbdl0sIG4pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0LmZsYWdzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImZsYWdzXCIpICYmIChyLmZsYWdzID0gdC5mbGFncyksIHQubWluICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcIm1pblwiKSAmJiAoci5taW4gPSBuLmpzb24gJiYgIWlzRmluaXRlKHQubWluKSA/IFN0cmluZyh0Lm1pbikgOiB0Lm1pbiwgbi5vbmVvZnMgJiYgKHIuX21pbiA9IFwibWluXCIpKSwgdC5tYXggIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibWF4XCIpICYmIChyLm1heCA9IG4uanNvbiAmJiAhaXNGaW5pdGUodC5tYXgpID8gU3RyaW5nKHQubWF4KSA6IHQubWF4LCBuLm9uZW9mcyAmJiAoci5fbWF4ID0gXCJtYXhcIikpLCByO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgPT09IHZvaWQgMCAmJiAodCA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgdCArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5IaXN0b2dyYW1EYXRhUG9pbnRcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaC5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludCA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oZSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5hdHRyaWJ1dGVzID0gW10sIHRoaXMuZXhlbXBsYXJzID0gW10sIGUpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG8ucHJvdG90eXBlLmF0dHJpYnV0ZXMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLnN0YXJ0VGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUudGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuY291bnQgPSBudWxsLCBvLnByb3RvdHlwZS5zdW0gPSBudWxsLCBvLnByb3RvdHlwZS5zY2FsZSA9IG51bGwsIG8ucHJvdG90eXBlLnplcm9Db3VudCA9IG51bGwsIG8ucHJvdG90eXBlLnBvc2l0aXZlID0gbnVsbCwgby5wcm90b3R5cGUubmVnYXRpdmUgPSBudWxsLCBvLnByb3RvdHlwZS5mbGFncyA9IG51bGwsIG8ucHJvdG90eXBlLmV4ZW1wbGFycyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUubWluID0gbnVsbCwgby5wcm90b3R5cGUubWF4ID0gbnVsbCwgby5wcm90b3R5cGUuemVyb1RocmVzaG9sZCA9IG51bGw7XG4gICAgICAgICAgICB2YXIgaTtcbiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoby5wcm90b3R5cGUsIFwiX3N1bVwiLCB7XG4gICAgICAgICAgICAgIGdldDogbC5vbmVPZkdldHRlcihpID0gW1wic3VtXCJdKSxcbiAgICAgICAgICAgICAgc2V0OiBsLm9uZU9mU2V0dGVyKGkpXG4gICAgICAgICAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCBcIl9taW5cIiwge1xuICAgICAgICAgICAgICBnZXQ6IGwub25lT2ZHZXR0ZXIoaSA9IFtcIm1pblwiXSksXG4gICAgICAgICAgICAgIHNldDogbC5vbmVPZlNldHRlcihpKVxuICAgICAgICAgICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLnByb3RvdHlwZSwgXCJfbWF4XCIsIHtcbiAgICAgICAgICAgICAgZ2V0OiBsLm9uZU9mR2V0dGVyKGkgPSBbXCJtYXhcIl0pLFxuICAgICAgICAgICAgICBzZXQ6IGwub25lT2ZTZXR0ZXIoaSlcbiAgICAgICAgICAgIH0pLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKHQpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIGlmIChuIHx8IChuID0gcy5jcmVhdGUoKSksIHQuYXR0cmlidXRlcyAhPSBudWxsICYmIHQuYXR0cmlidXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmF0dHJpYnV0ZXMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmVuY29kZSh0LmF0dHJpYnV0ZXNbcl0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICBpZiAodC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwic3RhcnRUaW1lVW5peE5hbm9cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAxN1xuICAgICAgICAgICAgICApLmZpeGVkNjQodC5zdGFydFRpbWVVbml4TmFubyksIHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJ0aW1lVW5peE5hbm9cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAyNVxuICAgICAgICAgICAgICApLmZpeGVkNjQodC50aW1lVW5peE5hbm8pLCB0LmNvdW50ICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJjb3VudFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA0LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDMzXG4gICAgICAgICAgICAgICkuZml4ZWQ2NCh0LmNvdW50KSwgdC5zdW0gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInN1bVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA1LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDQxXG4gICAgICAgICAgICAgICkuZG91YmxlKHQuc3VtKSwgdC5zY2FsZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwic2NhbGVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICA0OFxuICAgICAgICAgICAgICApLnNpbnQzMih0LnNjYWxlKSwgdC56ZXJvQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInplcm9Db3VudFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA3LCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDU3XG4gICAgICAgICAgICAgICkuZml4ZWQ2NCh0Lnplcm9Db3VudCksIHQucG9zaXRpdmUgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInBvc2l0aXZlXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LkJ1Y2tldHMuZW5jb2RlKHQucG9zaXRpdmUsIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDgsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNjZcbiAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpLCB0Lm5lZ2F0aXZlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJuZWdhdGl2ZVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5CdWNrZXRzLmVuY29kZSh0Lm5lZ2F0aXZlLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA5LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDc0XG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgdC5mbGFncyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiZmxhZ3NcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMTAsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgODBcbiAgICAgICAgICAgICAgKS51aW50MzIodC5mbGFncyksIHQuZXhlbXBsYXJzICE9IG51bGwgJiYgdC5leGVtcGxhcnMubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5leGVtcGxhcnMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeGVtcGxhci5lbmNvZGUodC5leGVtcGxhcnNbcl0sIG4udWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCAxMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgOTBcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHQubWluICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJtaW5cIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMTIsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgOTdcbiAgICAgICAgICAgICAgKS5kb3VibGUodC5taW4pLCB0Lm1heCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwibWF4XCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDEzLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDEwNVxuICAgICAgICAgICAgICApLmRvdWJsZSh0Lm1heCksIHQuemVyb1RocmVzaG9sZCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiemVyb1RocmVzaG9sZFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxNCwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAxMTNcbiAgICAgICAgICAgICAgKS5kb3VibGUodC56ZXJvVGhyZXNob2xkKSwgbjtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUodCwgbikubGRlbGltKCk7XG4gICAgICAgICAgICB9LCBvLmRlY29kZSA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBhLmNyZWF0ZSh0KSk7XG4gICAgICAgICAgICAgIGZvciAodmFyIHIgPSBuID09PSB2b2lkIDAgPyB0LmxlbiA6IHQucG9zICsgbiwgYyA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludCgpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgIHZhciB2ID0gdC51aW50MzIoKTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHYgPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICBjLmF0dHJpYnV0ZXMgJiYgYy5hdHRyaWJ1dGVzLmxlbmd0aCB8fCAoYy5hdHRyaWJ1dGVzID0gW10pLCBjLmF0dHJpYnV0ZXMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIGMuc3RhcnRUaW1lVW5peE5hbm8gPSB0LmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6IHtcbiAgICAgICAgICAgICAgICAgICAgYy50aW1lVW5peE5hbm8gPSB0LmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5jb3VudCA9IHQuZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNToge1xuICAgICAgICAgICAgICAgICAgICBjLnN1bSA9IHQuZG91YmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICAgICAgICAgIGMuc2NhbGUgPSB0LnNpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNzoge1xuICAgICAgICAgICAgICAgICAgICBjLnplcm9Db3VudCA9IHQuZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgODoge1xuICAgICAgICAgICAgICAgICAgICBjLnBvc2l0aXZlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA5OiB7XG4gICAgICAgICAgICAgICAgICAgIGMubmVnYXRpdmUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5CdWNrZXRzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOiB7XG4gICAgICAgICAgICAgICAgICAgIGMuZmxhZ3MgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTE6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5leGVtcGxhcnMgJiYgYy5leGVtcGxhcnMubGVuZ3RoIHx8IChjLmV4ZW1wbGFycyA9IFtdKSwgYy5leGVtcGxhcnMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeGVtcGxhci5kZWNvZGUodCwgdC51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5taW4gPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTM6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5tYXggPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHtcbiAgICAgICAgICAgICAgICAgICAgYy56ZXJvVGhyZXNob2xkID0gdC5kb3VibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0LnNraXBUeXBlKHYgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgYSB8fCAodCA9IG5ldyBhKHQpKSwgdGhpcy5kZWNvZGUodCwgdC51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ICE9IFwib2JqZWN0XCIgfHwgdCA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQuYXR0cmlidXRlcyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJhdHRyaWJ1dGVzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudmVyaWZ5KHQuYXR0cmlidXRlc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlcy5cIiArIHI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmICFsLmlzSW50ZWdlcih0LnN0YXJ0VGltZVVuaXhOYW5vKSAmJiAhKHQuc3RhcnRUaW1lVW5peE5hbm8gJiYgbC5pc0ludGVnZXIodC5zdGFydFRpbWVVbml4TmFuby5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInN0YXJ0VGltZVVuaXhOYW5vOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInRpbWVVbml4TmFub1wiKSAmJiAhbC5pc0ludGVnZXIodC50aW1lVW5peE5hbm8pICYmICEodC50aW1lVW5peE5hbm8gJiYgbC5pc0ludGVnZXIodC50aW1lVW5peE5hbm8ubG93KSAmJiBsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidGltZVVuaXhOYW5vOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQuY291bnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiY291bnRcIikgJiYgIWwuaXNJbnRlZ2VyKHQuY291bnQpICYmICEodC5jb3VudCAmJiBsLmlzSW50ZWdlcih0LmNvdW50LmxvdykgJiYgbC5pc0ludGVnZXIodC5jb3VudC5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiY291bnQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5zdW0gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwic3VtXCIpICYmIHR5cGVvZiB0LnN1bSAhPSBcIm51bWJlclwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInN1bTogbnVtYmVyIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmICh0LnNjYWxlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInNjYWxlXCIpICYmICFsLmlzSW50ZWdlcih0LnNjYWxlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzY2FsZTogaW50ZWdlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC56ZXJvQ291bnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiemVyb0NvdW50XCIpICYmICFsLmlzSW50ZWdlcih0Lnplcm9Db3VudCkgJiYgISh0Lnplcm9Db3VudCAmJiBsLmlzSW50ZWdlcih0Lnplcm9Db3VudC5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuemVyb0NvdW50LmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ6ZXJvQ291bnQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5wb3NpdGl2ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJwb3NpdGl2ZVwiKSkge1xuICAgICAgICAgICAgICAgIHZhciByID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cy52ZXJpZnkodC5wb3NpdGl2ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJwb3NpdGl2ZS5cIiArIHI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQubmVnYXRpdmUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibmVnYXRpdmVcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LkJ1Y2tldHMudmVyaWZ5KHQubmVnYXRpdmUpO1xuICAgICAgICAgICAgICAgIGlmIChyKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibmVnYXRpdmUuXCIgKyByO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmZsYWdzICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImZsYWdzXCIpICYmICFsLmlzSW50ZWdlcih0LmZsYWdzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJmbGFnczogaW50ZWdlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5leGVtcGxhcnMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZXhlbXBsYXJzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuZXhlbXBsYXJzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImV4ZW1wbGFyczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IHQuZXhlbXBsYXJzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLnZlcmlmeSh0LmV4ZW1wbGFyc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAocilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiZXhlbXBsYXJzLlwiICsgcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQubWluICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcIm1pblwiKSAmJiB0eXBlb2YgdC5taW4gIT0gXCJudW1iZXJcIiA/IFwibWluOiBudW1iZXIgZXhwZWN0ZWRcIiA6IHQubWF4ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcIm1heFwiKSAmJiB0eXBlb2YgdC5tYXggIT0gXCJudW1iZXJcIiA/IFwibWF4OiBudW1iZXIgZXhwZWN0ZWRcIiA6IHQuemVyb1RocmVzaG9sZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ6ZXJvVGhyZXNob2xkXCIpICYmIHR5cGVvZiB0Lnplcm9UaHJlc2hvbGQgIT0gXCJudW1iZXJcIiA/IFwiemVyb1RocmVzaG9sZDogbnVtYmVyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50KVxuICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICB2YXIgbiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludCgpO1xuICAgICAgICAgICAgICBpZiAodC5hdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdC5hdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuYXR0cmlidXRlc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LmF0dHJpYnV0ZXM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZnJvbU9iamVjdCh0LmF0dHJpYnV0ZXNbcl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAobi5zdGFydFRpbWVVbml4TmFubyA9IGwuTG9uZy5mcm9tVmFsdWUodC5zdGFydFRpbWVVbml4TmFubykpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgdC5zdGFydFRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gbi5zdGFydFRpbWVVbml4TmFubyA9IHBhcnNlSW50KHQuc3RhcnRUaW1lVW5peE5hbm8sIDEwKSA6IHR5cGVvZiB0LnN0YXJ0VGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLnN0YXJ0VGltZVVuaXhOYW5vID0gdC5zdGFydFRpbWVVbml4TmFubyA6IHR5cGVvZiB0LnN0YXJ0VGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKG4uc3RhcnRUaW1lVW5peE5hbm8gPSBuZXcgbC5Mb25nQml0cyh0LnN0YXJ0VGltZVVuaXhOYW5vLmxvdyA+Pj4gMCwgdC5zdGFydFRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgKGwuTG9uZyA/IChuLnRpbWVVbml4TmFubyA9IGwuTG9uZy5mcm9tVmFsdWUodC50aW1lVW5peE5hbm8pKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwic3RyaW5nXCIgPyBuLnRpbWVVbml4TmFubyA9IHBhcnNlSW50KHQudGltZVVuaXhOYW5vLCAxMCkgOiB0eXBlb2YgdC50aW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IG4udGltZVVuaXhOYW5vID0gdC50aW1lVW5peE5hbm8gOiB0eXBlb2YgdC50aW1lVW5peE5hbm8gPT0gXCJvYmplY3RcIiAmJiAobi50aW1lVW5peE5hbm8gPSBuZXcgbC5Mb25nQml0cyh0LnRpbWVVbml4TmFuby5sb3cgPj4+IDAsIHQudGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgdC5jb3VudCAhPSBudWxsICYmIChsLkxvbmcgPyAobi5jb3VudCA9IGwuTG9uZy5mcm9tVmFsdWUodC5jb3VudCkpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgdC5jb3VudCA9PSBcInN0cmluZ1wiID8gbi5jb3VudCA9IHBhcnNlSW50KHQuY291bnQsIDEwKSA6IHR5cGVvZiB0LmNvdW50ID09IFwibnVtYmVyXCIgPyBuLmNvdW50ID0gdC5jb3VudCA6IHR5cGVvZiB0LmNvdW50ID09IFwib2JqZWN0XCIgJiYgKG4uY291bnQgPSBuZXcgbC5Mb25nQml0cyh0LmNvdW50LmxvdyA+Pj4gMCwgdC5jb3VudC5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQuc3VtICE9IG51bGwgJiYgKG4uc3VtID0gTnVtYmVyKHQuc3VtKSksIHQuc2NhbGUgIT0gbnVsbCAmJiAobi5zY2FsZSA9IHQuc2NhbGUgfCAwKSwgdC56ZXJvQ291bnQgIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uemVyb0NvdW50ID0gbC5Mb25nLmZyb21WYWx1ZSh0Lnplcm9Db3VudCkpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgdC56ZXJvQ291bnQgPT0gXCJzdHJpbmdcIiA/IG4uemVyb0NvdW50ID0gcGFyc2VJbnQodC56ZXJvQ291bnQsIDEwKSA6IHR5cGVvZiB0Lnplcm9Db3VudCA9PSBcIm51bWJlclwiID8gbi56ZXJvQ291bnQgPSB0Lnplcm9Db3VudCA6IHR5cGVvZiB0Lnplcm9Db3VudCA9PSBcIm9iamVjdFwiICYmIChuLnplcm9Db3VudCA9IG5ldyBsLkxvbmdCaXRzKHQuemVyb0NvdW50LmxvdyA+Pj4gMCwgdC56ZXJvQ291bnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LnBvc2l0aXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQucG9zaXRpdmUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQucG9zaXRpdmU6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICBuLnBvc2l0aXZlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cy5mcm9tT2JqZWN0KHQucG9zaXRpdmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0Lm5lZ2F0aXZlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQubmVnYXRpdmUgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQubmVnYXRpdmU6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICBuLm5lZ2F0aXZlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cy5mcm9tT2JqZWN0KHQubmVnYXRpdmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmZsYWdzICE9IG51bGwgJiYgKG4uZmxhZ3MgPSB0LmZsYWdzID4+PiAwKSwgdC5leGVtcGxhcnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodC5leGVtcGxhcnMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5leGVtcGxhcnM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIG4uZXhlbXBsYXJzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmV4ZW1wbGFycy5sZW5ndGg7ICsrcikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0LmV4ZW1wbGFyc1tyXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LmV4ZW1wbGFyczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgbi5leGVtcGxhcnNbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeGVtcGxhci5mcm9tT2JqZWN0KHQuZXhlbXBsYXJzW3JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQubWluICE9IG51bGwgJiYgKG4ubWluID0gTnVtYmVyKHQubWluKSksIHQubWF4ICE9IG51bGwgJiYgKG4ubWF4ID0gTnVtYmVyKHQubWF4KSksIHQuemVyb1RocmVzaG9sZCAhPSBudWxsICYmIChuLnplcm9UaHJlc2hvbGQgPSBOdW1iZXIodC56ZXJvVGhyZXNob2xkKSksIG47XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKG4uYXJyYXlzIHx8IG4uZGVmYXVsdHMpICYmIChyLmF0dHJpYnV0ZXMgPSBbXSwgci5leGVtcGxhcnMgPSBbXSksIG4uZGVmYXVsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAobC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgci5zdGFydFRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGMudG9TdHJpbmcoKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IGMudG9OdW1iZXIoKSA6IGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICByLnN0YXJ0VGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IGwuTG9uZygwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGMudG9TdHJpbmcoKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IGMudG9OdW1iZXIoKSA6IGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICBpZiAobC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgci5jb3VudCA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGMudG9TdHJpbmcoKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IGMudG9OdW1iZXIoKSA6IGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICByLmNvdW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChyLnNjYWxlID0gMCwgbC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgci56ZXJvQ291bnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBjLnRvU3RyaW5nKCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBjLnRvTnVtYmVyKCkgOiBjO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgci56ZXJvQ291bnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgci5wb3NpdGl2ZSA9IG51bGwsIHIubmVnYXRpdmUgPSBudWxsLCByLmZsYWdzID0gMCwgci56ZXJvVGhyZXNob2xkID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5hdHRyaWJ1dGVzICYmIHQuYXR0cmlidXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IHQuYXR0cmlidXRlcy5sZW5ndGg7ICsrdilcbiAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlc1t2XSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudG9PYmplY3QodC5hdHRyaWJ1dGVzW3ZdLCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdGFydFRpbWVVbml4TmFub1wiKSAmJiAodHlwZW9mIHQuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHIuc3RhcnRUaW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcodC5zdGFydFRpbWVVbml4TmFubykgOiB0LnN0YXJ0VGltZVVuaXhOYW5vIDogci5zdGFydFRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0LnN0YXJ0VGltZVVuaXhOYW5vKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKHQuc3RhcnRUaW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiB0LnN0YXJ0VGltZVVuaXhOYW5vKSwgdC50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgdC50aW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQudGltZVVuaXhOYW5vKSA6IHQudGltZVVuaXhOYW5vIDogci50aW1lVW5peE5hbm8gPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC50aW1lVW5peE5hbm8pIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC50aW1lVW5peE5hbm8pLCB0LmNvdW50ICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcImNvdW50XCIpICYmICh0eXBlb2YgdC5jb3VudCA9PSBcIm51bWJlclwiID8gci5jb3VudCA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyh0LmNvdW50KSA6IHQuY291bnQgOiByLmNvdW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQuY291bnQpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC5jb3VudC5sb3cgPj4+IDAsIHQuY291bnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IHQuY291bnQpLCB0LnN1bSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzdW1cIikgJiYgKHIuc3VtID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LnN1bSkgPyBTdHJpbmcodC5zdW0pIDogdC5zdW0sIG4ub25lb2ZzICYmIChyLl9zdW0gPSBcInN1bVwiKSksIHQuc2NhbGUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwic2NhbGVcIikgJiYgKHIuc2NhbGUgPSB0LnNjYWxlKSwgdC56ZXJvQ291bnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiemVyb0NvdW50XCIpICYmICh0eXBlb2YgdC56ZXJvQ291bnQgPT0gXCJudW1iZXJcIiA/IHIuemVyb0NvdW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQuemVyb0NvdW50KSA6IHQuemVyb0NvdW50IDogci56ZXJvQ291bnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC56ZXJvQ291bnQpIDogbi5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHModC56ZXJvQ291bnQubG93ID4+PiAwLCB0Lnplcm9Db3VudC5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC56ZXJvQ291bnQpLCB0LnBvc2l0aXZlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInBvc2l0aXZlXCIpICYmIChyLnBvc2l0aXZlID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cy50b09iamVjdCh0LnBvc2l0aXZlLCBuKSksIHQubmVnYXRpdmUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibmVnYXRpdmVcIikgJiYgKHIubmVnYXRpdmUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5CdWNrZXRzLnRvT2JqZWN0KHQubmVnYXRpdmUsIG4pKSwgdC5mbGFncyAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAoci5mbGFncyA9IHQuZmxhZ3MpLCB0LmV4ZW1wbGFycyAmJiB0LmV4ZW1wbGFycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByLmV4ZW1wbGFycyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwgdC5leGVtcGxhcnMubGVuZ3RoOyArK3YpXG4gICAgICAgICAgICAgICAgICByLmV4ZW1wbGFyc1t2XSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLnRvT2JqZWN0KHQuZXhlbXBsYXJzW3ZdLCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gdC5taW4gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwibWluXCIpICYmIChyLm1pbiA9IG4uanNvbiAmJiAhaXNGaW5pdGUodC5taW4pID8gU3RyaW5nKHQubWluKSA6IHQubWluLCBuLm9uZW9mcyAmJiAoci5fbWluID0gXCJtaW5cIikpLCB0Lm1heCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJtYXhcIikgJiYgKHIubWF4ID0gbi5qc29uICYmICFpc0Zpbml0ZSh0Lm1heCkgPyBTdHJpbmcodC5tYXgpIDogdC5tYXgsIG4ub25lb2ZzICYmIChyLl9tYXggPSBcIm1heFwiKSksIHQuemVyb1RocmVzaG9sZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ6ZXJvVGhyZXNob2xkXCIpICYmIChyLnplcm9UaHJlc2hvbGQgPSBuLmpzb24gJiYgIWlzRmluaXRlKHQuemVyb1RocmVzaG9sZCkgPyBTdHJpbmcodC56ZXJvVGhyZXNob2xkKSA6IHQuemVyb1RocmVzaG9sZCksIHI7XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50XCI7XG4gICAgICAgICAgICB9LCBvLkJ1Y2tldHMgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIGZ1bmN0aW9uIGUodCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1Y2tldENvdW50cyA9IFtdLCB0KVxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IE9iamVjdC5rZXlzKHQpLCByID0gMDsgciA8IG4ubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICAgIHRbbltyXV0gIT0gbnVsbCAmJiAodGhpc1tuW3JdXSA9IHRbbltyXV0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnByb3RvdHlwZS5vZmZzZXQgPSBudWxsLCBlLnByb3RvdHlwZS5idWNrZXRDb3VudHMgPSBsLmVtcHR5QXJyYXksIGUuY3JlYXRlID0gZnVuY3Rpb24obikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZShuKTtcbiAgICAgICAgICAgICAgfSwgZS5lbmNvZGUgPSBmdW5jdGlvbihuLCByKSB7XG4gICAgICAgICAgICAgICAgaWYgKHIgfHwgKHIgPSBzLmNyZWF0ZSgpKSwgbi5vZmZzZXQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChuLCBcIm9mZnNldFwiKSAmJiByLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDAgPSovXG4gICAgICAgICAgICAgICAgICA4XG4gICAgICAgICAgICAgICAgKS5zaW50MzIobi5vZmZzZXQpLCBuLmJ1Y2tldENvdW50cyAhPSBudWxsICYmIG4uYnVja2V0Q291bnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgci51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDE4XG4gICAgICAgICAgICAgICAgICApLmZvcmsoKTtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgbi5idWNrZXRDb3VudHMubGVuZ3RoOyArK2MpXG4gICAgICAgICAgICAgICAgICAgIHIudWludDY0KG4uYnVja2V0Q291bnRzW2NdKTtcbiAgICAgICAgICAgICAgICAgIHIubGRlbGltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgICB9LCBlLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKG4sIHIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUobiwgcikubGRlbGltKCk7XG4gICAgICAgICAgICAgIH0sIGUuZGVjb2RlID0gZnVuY3Rpb24obiwgcikge1xuICAgICAgICAgICAgICAgIG4gaW5zdGFuY2VvZiBhIHx8IChuID0gYS5jcmVhdGUobikpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSByID09PSB2b2lkIDAgPyBuLmxlbiA6IG4ucG9zICsgciwgdiA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5CdWNrZXRzKCk7IG4ucG9zIDwgYzsgKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgbSA9IG4udWludDMyKCk7XG4gICAgICAgICAgICAgICAgICBzd2l0Y2ggKG0gPj4+IDMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdi5vZmZzZXQgPSBuLnNpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh2LmJ1Y2tldENvdW50cyAmJiB2LmJ1Y2tldENvdW50cy5sZW5ndGggfHwgKHYuYnVja2V0Q291bnRzID0gW10pLCAobSAmIDcpID09PSAyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYiA9IG4udWludDMyKCkgKyBuLnBvczsgbi5wb3MgPCBiOyApXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHYuYnVja2V0Q291bnRzLnB1c2gobi51aW50NjQoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgdi5idWNrZXRDb3VudHMucHVzaChuLnVpbnQ2NCgpKTtcbiAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgIG4uc2tpcFR5cGUobSAmIDcpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgICAgICAgfSwgZS5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gaW5zdGFuY2VvZiBhIHx8IChuID0gbmV3IGEobikpLCB0aGlzLmRlY29kZShuLCBuLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgfSwgZS52ZXJpZnkgPSBmdW5jdGlvbihuKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuICE9IFwib2JqZWN0XCIgfHwgbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmIChuLm9mZnNldCAhPSBudWxsICYmIG4uaGFzT3duUHJvcGVydHkoXCJvZmZzZXRcIikgJiYgIWwuaXNJbnRlZ2VyKG4ub2Zmc2V0KSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZnNldDogaW50ZWdlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGlmIChuLmJ1Y2tldENvdW50cyAhPSBudWxsICYmIG4uaGFzT3duUHJvcGVydHkoXCJidWNrZXRDb3VudHNcIikpIHtcbiAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShuLmJ1Y2tldENvdW50cykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJ1Y2tldENvdW50czogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgbi5idWNrZXRDb3VudHMubGVuZ3RoOyArK3IpXG4gICAgICAgICAgICAgICAgICAgIGlmICghbC5pc0ludGVnZXIobi5idWNrZXRDb3VudHNbcl0pICYmICEobi5idWNrZXRDb3VudHNbcl0gJiYgbC5pc0ludGVnZXIobi5idWNrZXRDb3VudHNbcl0ubG93KSAmJiBsLmlzSW50ZWdlcihuLmJ1Y2tldENvdW50c1tyXS5oaWdoKSkpXG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYnVja2V0Q291bnRzOiBpbnRlZ2VyfExvbmdbXSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgfSwgZS5mcm9tT2JqZWN0ID0gZnVuY3Rpb24obikge1xuICAgICAgICAgICAgICAgIGlmIChuIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0cylcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgICAgIHZhciByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4cG9uZW50aWFsSGlzdG9ncmFtRGF0YVBvaW50LkJ1Y2tldHMoKTtcbiAgICAgICAgICAgICAgICBpZiAobi5vZmZzZXQgIT0gbnVsbCAmJiAoci5vZmZzZXQgPSBuLm9mZnNldCB8IDApLCBuLmJ1Y2tldENvdW50cykge1xuICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG4uYnVja2V0Q291bnRzKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5FeHBvbmVudGlhbEhpc3RvZ3JhbURhdGFQb2ludC5CdWNrZXRzLmJ1Y2tldENvdW50czogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICByLmJ1Y2tldENvdW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBuLmJ1Y2tldENvdW50cy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgbC5Mb25nID8gKHIuYnVja2V0Q291bnRzW2NdID0gbC5Mb25nLmZyb21WYWx1ZShuLmJ1Y2tldENvdW50c1tjXSkpLnVuc2lnbmVkID0gdHJ1ZSA6IHR5cGVvZiBuLmJ1Y2tldENvdW50c1tjXSA9PSBcInN0cmluZ1wiID8gci5idWNrZXRDb3VudHNbY10gPSBwYXJzZUludChuLmJ1Y2tldENvdW50c1tjXSwgMTApIDogdHlwZW9mIG4uYnVja2V0Q291bnRzW2NdID09IFwibnVtYmVyXCIgPyByLmJ1Y2tldENvdW50c1tjXSA9IG4uYnVja2V0Q291bnRzW2NdIDogdHlwZW9mIG4uYnVja2V0Q291bnRzW2NdID09IFwib2JqZWN0XCIgJiYgKHIuYnVja2V0Q291bnRzW2NdID0gbmV3IGwuTG9uZ0JpdHMobi5idWNrZXRDb3VudHNbY10ubG93ID4+PiAwLCBuLmJ1Y2tldENvdW50c1tjXS5oaWdoID4+PiAwKS50b051bWJlcih0cnVlKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgICB9LCBlLnRvT2JqZWN0ID0gZnVuY3Rpb24obiwgcikge1xuICAgICAgICAgICAgICAgIHIgfHwgKHIgPSB7fSk7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSB7fTtcbiAgICAgICAgICAgICAgICBpZiAoKHIuYXJyYXlzIHx8IHIuZGVmYXVsdHMpICYmIChjLmJ1Y2tldENvdW50cyA9IFtdKSwgci5kZWZhdWx0cyAmJiAoYy5vZmZzZXQgPSAwKSwgbi5vZmZzZXQgIT0gbnVsbCAmJiBuLmhhc093blByb3BlcnR5KFwib2Zmc2V0XCIpICYmIChjLm9mZnNldCA9IG4ub2Zmc2V0KSwgbi5idWNrZXRDb3VudHMgJiYgbi5idWNrZXRDb3VudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICBjLmJ1Y2tldENvdW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgdiA9IDA7IHYgPCBuLmJ1Y2tldENvdW50cy5sZW5ndGg7ICsrdilcbiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG4uYnVja2V0Q291bnRzW3ZdID09IFwibnVtYmVyXCIgPyBjLmJ1Y2tldENvdW50c1t2XSA9IHIubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyhuLmJ1Y2tldENvdW50c1t2XSkgOiBuLmJ1Y2tldENvdW50c1t2XSA6IGMuYnVja2V0Q291bnRzW3ZdID0gci5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG4uYnVja2V0Q291bnRzW3ZdKSA6IHIubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKG4uYnVja2V0Q291bnRzW3ZdLmxvdyA+Pj4gMCwgbi5idWNrZXRDb3VudHNbdl0uaGlnaCA+Pj4gMCkudG9OdW1iZXIodHJ1ZSkgOiBuLmJ1Y2tldENvdW50c1t2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICAgIH0sIGUucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgICAgfSwgZS5nZXRUeXBlVXJsID0gZnVuY3Rpb24obikge1xuICAgICAgICAgICAgICAgIHJldHVybiBuID09PSB2b2lkIDAgJiYgKG4gPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIG4gKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhwb25lbnRpYWxIaXN0b2dyYW1EYXRhUG9pbnQuQnVja2V0c1wiO1xuICAgICAgICAgICAgICB9LCBlO1xuICAgICAgICAgICAgfSkoKSwgbztcbiAgICAgICAgICB9KSgpLCBoLlN1bW1hcnlEYXRhUG9pbnQgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXR0cmlidXRlcyA9IFtdLCB0aGlzLnF1YW50aWxlVmFsdWVzID0gW10sIGkpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgZSA9IE9iamVjdC5rZXlzKGkpLCB0ID0gMDsgdCA8IGUubGVuZ3RoOyArK3QpXG4gICAgICAgICAgICAgICAgICBpW2VbdF1dICE9IG51bGwgJiYgKHRoaXNbZVt0XV0gPSBpW2VbdF1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvLnByb3RvdHlwZS5hdHRyaWJ1dGVzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5zdGFydFRpbWVVbml4TmFubyA9IG51bGwsIG8ucHJvdG90eXBlLnRpbWVVbml4TmFubyA9IG51bGwsIG8ucHJvdG90eXBlLmNvdW50ID0gbnVsbCwgby5wcm90b3R5cGUuc3VtID0gbnVsbCwgby5wcm90b3R5cGUucXVhbnRpbGVWYWx1ZXMgPSBsLmVtcHR5QXJyYXksIG8ucHJvdG90eXBlLmZsYWdzID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzdGFydFRpbWVVbml4TmFub1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAyLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDE3XG4gICAgICAgICAgICAgICkuZml4ZWQ2NChlLnN0YXJ0VGltZVVuaXhOYW5vKSwgZS50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInRpbWVVbml4TmFub1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAzLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDI1XG4gICAgICAgICAgICAgICkuZml4ZWQ2NChlLnRpbWVVbml4TmFubyksIGUuY291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImNvdW50XCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDQsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgMzNcbiAgICAgICAgICAgICAgKS5maXhlZDY0KGUuY291bnQpLCBlLnN1bSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwic3VtXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDUsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgNDFcbiAgICAgICAgICAgICAgKS5kb3VibGUoZS5zdW0pLCBlLnF1YW50aWxlVmFsdWVzICE9IG51bGwgJiYgZS5xdWFudGlsZVZhbHVlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnF1YW50aWxlVmFsdWVzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeURhdGFQb2ludC5WYWx1ZUF0UXVhbnRpbGUuZW5jb2RlKGUucXVhbnRpbGVWYWx1ZXNbbl0sIHQudWludDMyKFxuICAgICAgICAgICAgICAgICAgICAvKiBpZCA2LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgICAgICA1MFxuICAgICAgICAgICAgICAgICAgKS5mb3JrKCkpLmxkZWxpbSgpO1xuICAgICAgICAgICAgICBpZiAoZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKGUuYXR0cmlidXRlc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDcsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDU4XG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiBlLmZsYWdzICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJmbGFnc1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA4LCB3aXJlVHlwZSAwID0qL1xuICAgICAgICAgICAgICAgIDY0XG4gICAgICAgICAgICAgICkudWludDMyKGUuZmxhZ3MpLCB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQoKTsgZS5wb3MgPCBuOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgYyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICAgICAgICAgICAgci5hdHRyaWJ1dGVzICYmIHIuYXR0cmlidXRlcy5sZW5ndGggfHwgKHIuYXR0cmlidXRlcyA9IFtdKSwgci5hdHRyaWJ1dGVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLnN0YXJ0VGltZVVuaXhOYW5vID0gZS5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudGltZVVuaXhOYW5vID0gZS5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA0OiB7XG4gICAgICAgICAgICAgICAgICAgIHIuY291bnQgPSBlLmZpeGVkNjQoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6IHtcbiAgICAgICAgICAgICAgICAgICAgci5zdW0gPSBlLmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgICAgICAgICAgICByLnF1YW50aWxlVmFsdWVzICYmIHIucXVhbnRpbGVWYWx1ZXMubGVuZ3RoIHx8IChyLnF1YW50aWxlVmFsdWVzID0gW10pLCByLnF1YW50aWxlVmFsdWVzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeURhdGFQb2ludC5WYWx1ZUF0UXVhbnRpbGUuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDg6IHtcbiAgICAgICAgICAgICAgICAgICAgci5mbGFncyA9IGUudWludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmF0dHJpYnV0ZXMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiYXR0cmlidXRlc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB0ID0gMDsgdCA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnZlcmlmeShlLmF0dHJpYnV0ZXNbdF0pO1xuICAgICAgICAgICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImF0dHJpYnV0ZXMuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5zdGFydFRpbWVVbml4TmFubyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzdGFydFRpbWVVbml4TmFub1wiKSAmJiAhbC5pc0ludGVnZXIoZS5zdGFydFRpbWVVbml4TmFubykgJiYgIShlLnN0YXJ0VGltZVVuaXhOYW5vICYmIGwuaXNJbnRlZ2VyKGUuc3RhcnRUaW1lVW5peE5hbm8ubG93KSAmJiBsLmlzSW50ZWdlcihlLnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzdGFydFRpbWVVbml4TmFubzogaW50ZWdlcnxMb25nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnRpbWVVbml4TmFubyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lVW5peE5hbm9cIikgJiYgIWwuaXNJbnRlZ2VyKGUudGltZVVuaXhOYW5vKSAmJiAhKGUudGltZVVuaXhOYW5vICYmIGwuaXNJbnRlZ2VyKGUudGltZVVuaXhOYW5vLmxvdykgJiYgbC5pc0ludGVnZXIoZS50aW1lVW5peE5hbm8uaGlnaCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcInRpbWVVbml4TmFubzogaW50ZWdlcnxMb25nIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLmNvdW50ICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImNvdW50XCIpICYmICFsLmlzSW50ZWdlcihlLmNvdW50KSAmJiAhKGUuY291bnQgJiYgbC5pc0ludGVnZXIoZS5jb3VudC5sb3cpICYmIGwuaXNJbnRlZ2VyKGUuY291bnQuaGlnaCkpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImNvdW50OiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuc3VtICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInN1bVwiKSAmJiB0eXBlb2YgZS5zdW0gIT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJzdW06IG51bWJlciBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5xdWFudGlsZVZhbHVlcyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJxdWFudGlsZVZhbHVlc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnF1YW50aWxlVmFsdWVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInF1YW50aWxlVmFsdWVzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5xdWFudGlsZVZhbHVlcy5sZW5ndGg7ICsrdCkge1xuICAgICAgICAgICAgICAgICAgdmFyIG4gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LlZhbHVlQXRRdWFudGlsZS52ZXJpZnkoZS5xdWFudGlsZVZhbHVlc1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicXVhbnRpbGVWYWx1ZXMuXCIgKyBuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5mbGFncyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAhbC5pc0ludGVnZXIoZS5mbGFncykgPyBcImZsYWdzOiBpbnRlZ2VyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQoKTtcbiAgICAgICAgICAgICAgaWYgKGUuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmF0dHJpYnV0ZXMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYXR0cmlidXRlc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuYXR0cmlidXRlczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5hdHRyaWJ1dGVzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS5mcm9tT2JqZWN0KGUuYXR0cmlidXRlc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgKGwuTG9uZyA/ICh0LnN0YXJ0VGltZVVuaXhOYW5vID0gbC5Mb25nLmZyb21WYWx1ZShlLnN0YXJ0VGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiBlLnN0YXJ0VGltZVVuaXhOYW5vID09IFwic3RyaW5nXCIgPyB0LnN0YXJ0VGltZVVuaXhOYW5vID0gcGFyc2VJbnQoZS5zdGFydFRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIGUuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJudW1iZXJcIiA/IHQuc3RhcnRUaW1lVW5peE5hbm8gPSBlLnN0YXJ0VGltZVVuaXhOYW5vIDogdHlwZW9mIGUuc3RhcnRUaW1lVW5peE5hbm8gPT0gXCJvYmplY3RcIiAmJiAodC5zdGFydFRpbWVVbml4TmFubyA9IG5ldyBsLkxvbmdCaXRzKGUuc3RhcnRUaW1lVW5peE5hbm8ubG93ID4+PiAwLCBlLnN0YXJ0VGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgZS50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiAobC5Mb25nID8gKHQudGltZVVuaXhOYW5vID0gbC5Mb25nLmZyb21WYWx1ZShlLnRpbWVVbml4TmFubykpLnVuc2lnbmVkID0gZmFsc2UgOiB0eXBlb2YgZS50aW1lVW5peE5hbm8gPT0gXCJzdHJpbmdcIiA/IHQudGltZVVuaXhOYW5vID0gcGFyc2VJbnQoZS50aW1lVW5peE5hbm8sIDEwKSA6IHR5cGVvZiBlLnRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gdC50aW1lVW5peE5hbm8gPSBlLnRpbWVVbml4TmFubyA6IHR5cGVvZiBlLnRpbWVVbml4TmFubyA9PSBcIm9iamVjdFwiICYmICh0LnRpbWVVbml4TmFubyA9IG5ldyBsLkxvbmdCaXRzKGUudGltZVVuaXhOYW5vLmxvdyA+Pj4gMCwgZS50aW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCBlLmNvdW50ICE9IG51bGwgJiYgKGwuTG9uZyA/ICh0LmNvdW50ID0gbC5Mb25nLmZyb21WYWx1ZShlLmNvdW50KSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiBlLmNvdW50ID09IFwic3RyaW5nXCIgPyB0LmNvdW50ID0gcGFyc2VJbnQoZS5jb3VudCwgMTApIDogdHlwZW9mIGUuY291bnQgPT0gXCJudW1iZXJcIiA/IHQuY291bnQgPSBlLmNvdW50IDogdHlwZW9mIGUuY291bnQgPT0gXCJvYmplY3RcIiAmJiAodC5jb3VudCA9IG5ldyBsLkxvbmdCaXRzKGUuY291bnQubG93ID4+PiAwLCBlLmNvdW50LmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkpKSwgZS5zdW0gIT0gbnVsbCAmJiAodC5zdW0gPSBOdW1iZXIoZS5zdW0pKSwgZS5xdWFudGlsZVZhbHVlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnF1YW50aWxlVmFsdWVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeURhdGFQb2ludC5xdWFudGlsZVZhbHVlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5xdWFudGlsZVZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5xdWFudGlsZVZhbHVlcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnF1YW50aWxlVmFsdWVzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuU3VtbWFyeURhdGFQb2ludC5xdWFudGlsZVZhbHVlczogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgICAgdC5xdWFudGlsZVZhbHVlc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuVmFsdWVBdFF1YW50aWxlLmZyb21PYmplY3QoZS5xdWFudGlsZVZhbHVlc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmZsYWdzICE9IG51bGwgJiYgKHQuZmxhZ3MgPSBlLmZsYWdzID4+PiAwKSwgdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4ucXVhbnRpbGVWYWx1ZXMgPSBbXSwgbi5hdHRyaWJ1dGVzID0gW10pLCB0LmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIG4uc3RhcnRUaW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyByLnRvU3RyaW5nKCkgOiB0LmxvbmdzID09PSBOdW1iZXIgPyByLnRvTnVtYmVyKCkgOiByO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgbi5zdGFydFRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICBpZiAobC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgbi50aW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyByLnRvU3RyaW5nKCkgOiB0LmxvbmdzID09PSBOdW1iZXIgPyByLnRvTnVtYmVyKCkgOiByO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgbi50aW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBcIjBcIiA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIG4uY291bnQgPSB0LmxvbmdzID09PSBTdHJpbmcgPyByLnRvU3RyaW5nKCkgOiB0LmxvbmdzID09PSBOdW1iZXIgPyByLnRvTnVtYmVyKCkgOiByO1xuICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgbi5jb3VudCA9IHQubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICBuLnN1bSA9IDAsIG4uZmxhZ3MgPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnN0YXJ0VGltZVVuaXhOYW5vICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInN0YXJ0VGltZVVuaXhOYW5vXCIpICYmICh0eXBlb2YgZS5zdGFydFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi5zdGFydFRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyhlLnN0YXJ0VGltZVVuaXhOYW5vKSA6IGUuc3RhcnRUaW1lVW5peE5hbm8gOiBuLnN0YXJ0VGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUuc3RhcnRUaW1lVW5peE5hbm8pIDogdC5sb25ncyA9PT0gTnVtYmVyID8gbmV3IGwuTG9uZ0JpdHMoZS5zdGFydFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUuc3RhcnRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IGUuc3RhcnRUaW1lVW5peE5hbm8pLCBlLnRpbWVVbml4TmFubyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lVW5peE5hbm9cIikgJiYgKHR5cGVvZiBlLnRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi50aW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcoZS50aW1lVW5peE5hbm8pIDogZS50aW1lVW5peE5hbm8gOiBuLnRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnRpbWVVbml4TmFubykgOiB0LmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyhlLnRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUudGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiBlLnRpbWVVbml4TmFubyksIGUuY291bnQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiY291bnRcIikgJiYgKHR5cGVvZiBlLmNvdW50ID09IFwibnVtYmVyXCIgPyBuLmNvdW50ID0gdC5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKGUuY291bnQpIDogZS5jb3VudCA6IG4uY291bnQgPSB0LmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5jb3VudCkgOiB0LmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyhlLmNvdW50LmxvdyA+Pj4gMCwgZS5jb3VudC5oaWdoID4+PiAwKS50b051bWJlcigpIDogZS5jb3VudCksIGUuc3VtICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInN1bVwiKSAmJiAobi5zdW0gPSB0Lmpzb24gJiYgIWlzRmluaXRlKGUuc3VtKSA/IFN0cmluZyhlLnN1bSkgOiBlLnN1bSksIGUucXVhbnRpbGVWYWx1ZXMgJiYgZS5xdWFudGlsZVZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBuLnF1YW50aWxlVmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCBlLnF1YW50aWxlVmFsdWVzLmxlbmd0aDsgKytjKVxuICAgICAgICAgICAgICAgICAgbi5xdWFudGlsZVZhbHVlc1tjXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuVmFsdWVBdFF1YW50aWxlLnRvT2JqZWN0KGUucXVhbnRpbGVWYWx1ZXNbY10sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmF0dHJpYnV0ZXMgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytjKVxuICAgICAgICAgICAgICAgICAgbi5hdHRyaWJ1dGVzW2NdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS50b09iamVjdChlLmF0dHJpYnV0ZXNbY10sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmZsYWdzICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcImZsYWdzXCIpICYmIChuLmZsYWdzID0gZS5mbGFncyksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnRcIjtcbiAgICAgICAgICAgIH0sIG8uVmFsdWVBdFF1YW50aWxlID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBmdW5jdGlvbiBpKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZSlcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSBPYmplY3Qua2V5cyhlKSwgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gaS5wcm90b3R5cGUucXVhbnRpbGUgPSBudWxsLCBpLnByb3RvdHlwZS52YWx1ZSA9IG51bGwsIGkuY3JlYXRlID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgaSh0KTtcbiAgICAgICAgICAgICAgfSwgaS5lbmNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gfHwgKG4gPSBzLmNyZWF0ZSgpKSwgdC5xdWFudGlsZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwicXVhbnRpbGVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgICAgOVxuICAgICAgICAgICAgICAgICkuZG91YmxlKHQucXVhbnRpbGUpLCB0LnZhbHVlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodCwgXCJ2YWx1ZVwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgICAxN1xuICAgICAgICAgICAgICAgICkuZG91YmxlKHQudmFsdWUpLCBuO1xuICAgICAgICAgICAgICB9LCBpLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmNvZGUodCwgbikubGRlbGltKCk7XG4gICAgICAgICAgICAgIH0sIGkuZGVjb2RlID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSBuID09PSB2b2lkIDAgPyB0LmxlbiA6IHQucG9zICsgbiwgYyA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LlZhbHVlQXRRdWFudGlsZSgpOyB0LnBvcyA8IHI7ICkge1xuICAgICAgICAgICAgICAgICAgdmFyIHYgPSB0LnVpbnQzMigpO1xuICAgICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMToge1xuICAgICAgICAgICAgICAgICAgICAgIGMucXVhbnRpbGUgPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICAgIGMudmFsdWUgPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgdC5za2lwVHlwZSh2ICYgNyk7XG4gICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjO1xuICAgICAgICAgICAgICB9LCBpLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIGEgfHwgKHQgPSBuZXcgYSh0KSksIHRoaXMuZGVjb2RlKHQsIHQudWludDMyKCkpO1xuICAgICAgICAgICAgICB9LCBpLnZlcmlmeSA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHQgIT0gXCJvYmplY3RcIiB8fCB0ID09PSBudWxsID8gXCJvYmplY3QgZXhwZWN0ZWRcIiA6IHQucXVhbnRpbGUgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwicXVhbnRpbGVcIikgJiYgdHlwZW9mIHQucXVhbnRpbGUgIT0gXCJudW1iZXJcIiA/IFwicXVhbnRpbGU6IG51bWJlciBleHBlY3RlZFwiIDogdC52YWx1ZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKSAmJiB0eXBlb2YgdC52YWx1ZSAhPSBcIm51bWJlclwiID8gXCJ2YWx1ZTogbnVtYmVyIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgICB9LCBpLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubWV0cmljcy52MS5TdW1tYXJ5RGF0YVBvaW50LlZhbHVlQXRRdWFudGlsZSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuVmFsdWVBdFF1YW50aWxlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHQucXVhbnRpbGUgIT0gbnVsbCAmJiAobi5xdWFudGlsZSA9IE51bWJlcih0LnF1YW50aWxlKSksIHQudmFsdWUgIT0gbnVsbCAmJiAobi52YWx1ZSA9IE51bWJlcih0LnZhbHVlKSksIG47XG4gICAgICAgICAgICAgIH0sIGkudG9PYmplY3QgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgICAgbiB8fCAobiA9IHt9KTtcbiAgICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICAgIHJldHVybiBuLmRlZmF1bHRzICYmIChyLnF1YW50aWxlID0gMCwgci52YWx1ZSA9IDApLCB0LnF1YW50aWxlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInF1YW50aWxlXCIpICYmIChyLnF1YW50aWxlID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LnF1YW50aWxlKSA/IFN0cmluZyh0LnF1YW50aWxlKSA6IHQucXVhbnRpbGUpLCB0LnZhbHVlICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInZhbHVlXCIpICYmIChyLnZhbHVlID0gbi5qc29uICYmICFpc0Zpbml0ZSh0LnZhbHVlKSA/IFN0cmluZyh0LnZhbHVlKSA6IHQudmFsdWUpLCByO1xuICAgICAgICAgICAgICB9LCBpLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICAgIH0sIGkuZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdCA9PT0gdm9pZCAwICYmICh0ID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCB0ICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLlN1bW1hcnlEYXRhUG9pbnQuVmFsdWVBdFF1YW50aWxlXCI7XG4gICAgICAgICAgICAgIH0sIGk7XG4gICAgICAgICAgICB9KSgpLCBvO1xuICAgICAgICAgIH0pKCksIGguRXhlbXBsYXIgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmdW5jdGlvbiBvKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyZWRBdHRyaWJ1dGVzID0gW10sIGUpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgdCA9IE9iamVjdC5rZXlzKGUpLCBuID0gMDsgbiA8IHQubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICBlW3Rbbl1dICE9IG51bGwgJiYgKHRoaXNbdFtuXV0gPSBlW3Rbbl1dKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG8ucHJvdG90eXBlLmZpbHRlcmVkQXR0cmlidXRlcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUudGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuYXNEb3VibGUgPSBudWxsLCBvLnByb3RvdHlwZS5hc0ludCA9IG51bGwsIG8ucHJvdG90eXBlLnNwYW5JZCA9IG51bGwsIG8ucHJvdG90eXBlLnRyYWNlSWQgPSBudWxsO1xuICAgICAgICAgICAgdmFyIGk7XG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KG8ucHJvdG90eXBlLCBcInZhbHVlXCIsIHtcbiAgICAgICAgICAgICAgZ2V0OiBsLm9uZU9mR2V0dGVyKGkgPSBbXCJhc0RvdWJsZVwiLCBcImFzSW50XCJdKSxcbiAgICAgICAgICAgICAgc2V0OiBsLm9uZU9mU2V0dGVyKGkpXG4gICAgICAgICAgICB9KSwgby5jcmVhdGUgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyh0KTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICBpZiAobiB8fCAobiA9IHMuY3JlYXRlKCkpLCB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwidGltZVVuaXhOYW5vXCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDIsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgMTdcbiAgICAgICAgICAgICAgKS5maXhlZDY0KHQudGltZVVuaXhOYW5vKSwgdC5hc0RvdWJsZSAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsIFwiYXNEb3VibGVcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICAyNVxuICAgICAgICAgICAgICApLmRvdWJsZSh0LmFzRG91YmxlKSwgdC5zcGFuSWQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInNwYW5JZFwiKSAmJiBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA0LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDM0XG4gICAgICAgICAgICAgICkuYnl0ZXModC5zcGFuSWQpLCB0LnRyYWNlSWQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcInRyYWNlSWRcIikgJiYgbi51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICA0MlxuICAgICAgICAgICAgICApLmJ5dGVzKHQudHJhY2VJZCksIHQuYXNJbnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0LCBcImFzSW50XCIpICYmIG4udWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDYsIHdpcmVUeXBlIDEgPSovXG4gICAgICAgICAgICAgICAgNDlcbiAgICAgICAgICAgICAgKS5zZml4ZWQ2NCh0LmFzSW50KSwgdC5maWx0ZXJlZEF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0LmZpbHRlcmVkQXR0cmlidXRlcy5sZW5ndGgpXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0LmZpbHRlcmVkQXR0cmlidXRlcy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKHQuZmlsdGVyZWRBdHRyaWJ1dGVzW3JdLCBuLnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgNywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgNThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQsIG4pIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKHQsIG4pLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbih0LCBuKSB7XG4gICAgICAgICAgICAgIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gYS5jcmVhdGUodCkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciByID0gbiA9PT0gdm9pZCAwID8gdC5sZW4gOiB0LnBvcyArIG4sIGMgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIoKTsgdC5wb3MgPCByOyApIHtcbiAgICAgICAgICAgICAgICB2YXIgdiA9IHQudWludDMyKCk7XG4gICAgICAgICAgICAgICAgc3dpdGNoICh2ID4+PiAzKSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICAgICAgICAgICAgYy5maWx0ZXJlZEF0dHJpYnV0ZXMgJiYgYy5maWx0ZXJlZEF0dHJpYnV0ZXMubGVuZ3RoIHx8IChjLmZpbHRlcmVkQXR0cmlidXRlcyA9IFtdKSwgYy5maWx0ZXJlZEF0dHJpYnV0ZXMucHVzaCh1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmRlY29kZSh0LCB0LnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIGMudGltZVVuaXhOYW5vID0gdC5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIGMuYXNEb3VibGUgPSB0LmRvdWJsZSgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgICAgICAgICAgICBjLmFzSW50ID0gdC5zZml4ZWQ2NCgpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgNDoge1xuICAgICAgICAgICAgICAgICAgICBjLnNwYW5JZCA9IHQuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6IHtcbiAgICAgICAgICAgICAgICAgICAgYy50cmFjZUlkID0gdC5ieXRlcygpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHQuc2tpcFR5cGUodiAmIDcpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGM7XG4gICAgICAgICAgICB9LCBvLmRlY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHQgaW5zdGFuY2VvZiBhIHx8ICh0ID0gbmV3IGEodCkpLCB0aGlzLmRlY29kZSh0LCB0LnVpbnQzMigpKTtcbiAgICAgICAgICAgIH0sIG8udmVyaWZ5ID0gZnVuY3Rpb24odCkge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIHQgIT0gXCJvYmplY3RcIiB8fCB0ID09PSBudWxsKVxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9iamVjdCBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAodC5maWx0ZXJlZEF0dHJpYnV0ZXMgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiZmlsdGVyZWRBdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHQuZmlsdGVyZWRBdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcImZpbHRlcmVkQXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQuZmlsdGVyZWRBdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgYyA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudmVyaWZ5KHQuZmlsdGVyZWRBdHRyaWJ1dGVzW3JdKTtcbiAgICAgICAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJmaWx0ZXJlZEF0dHJpYnV0ZXMuXCIgKyBjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodC50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwidGltZVVuaXhOYW5vXCIpICYmICFsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFubykgJiYgISh0LnRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcih0LnRpbWVVbml4TmFuby5sb3cpICYmIGwuaXNJbnRlZ2VyKHQudGltZVVuaXhOYW5vLmhpZ2gpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJ0aW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAodC5hc0RvdWJsZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhc0RvdWJsZVwiKSAmJiAobi52YWx1ZSA9IDEsIHR5cGVvZiB0LmFzRG91YmxlICE9IFwibnVtYmVyXCIpKVxuICAgICAgICAgICAgICAgIHJldHVybiBcImFzRG91YmxlOiBudW1iZXIgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKHQuYXNJbnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXNJbnRcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9PT0gMSlcbiAgICAgICAgICAgICAgICAgIHJldHVybiBcInZhbHVlOiBtdWx0aXBsZSB2YWx1ZXNcIjtcbiAgICAgICAgICAgICAgICBpZiAobi52YWx1ZSA9IDEsICFsLmlzSW50ZWdlcih0LmFzSW50KSAmJiAhKHQuYXNJbnQgJiYgbC5pc0ludGVnZXIodC5hc0ludC5sb3cpICYmIGwuaXNJbnRlZ2VyKHQuYXNJbnQuaGlnaCkpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXNJbnQ6IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0LnNwYW5JZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzcGFuSWRcIikgJiYgISh0LnNwYW5JZCAmJiB0eXBlb2YgdC5zcGFuSWQubGVuZ3RoID09IFwibnVtYmVyXCIgfHwgbC5pc1N0cmluZyh0LnNwYW5JZCkpID8gXCJzcGFuSWQ6IGJ1ZmZlciBleHBlY3RlZFwiIDogdC50cmFjZUlkICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInRyYWNlSWRcIikgJiYgISh0LnRyYWNlSWQgJiYgdHlwZW9mIHQudHJhY2VJZC5sZW5ndGggPT0gXCJudW1iZXJcIiB8fCBsLmlzU3RyaW5nKHQudHJhY2VJZCkpID8gXCJ0cmFjZUlkOiBidWZmZXIgZXhwZWN0ZWRcIiA6IG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIGlmICh0IGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICAgIHZhciBuID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyKCk7XG4gICAgICAgICAgICAgIGlmICh0LmZpbHRlcmVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0LmZpbHRlcmVkQXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5tZXRyaWNzLnYxLkV4ZW1wbGFyLmZpbHRlcmVkQXR0cmlidXRlczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgbi5maWx0ZXJlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHQuZmlsdGVyZWRBdHRyaWJ1dGVzLmxlbmd0aDsgKytyKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQuZmlsdGVyZWRBdHRyaWJ1dGVzW3JdICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXIuZmlsdGVyZWRBdHRyaWJ1dGVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICBuLmZpbHRlcmVkQXR0cmlidXRlc1tyXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZnJvbU9iamVjdCh0LmZpbHRlcmVkQXR0cmlidXRlc1tyXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0LnRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAobi50aW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKHQudGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiB0LnRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gbi50aW1lVW5peE5hbm8gPSBwYXJzZUludCh0LnRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLnRpbWVVbml4TmFubyA9IHQudGltZVVuaXhOYW5vIDogdHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKG4udGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHModC50aW1lVW5peE5hbm8ubG93ID4+PiAwLCB0LnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIHQuYXNEb3VibGUgIT0gbnVsbCAmJiAobi5hc0RvdWJsZSA9IE51bWJlcih0LmFzRG91YmxlKSksIHQuYXNJbnQgIT0gbnVsbCAmJiAobC5Mb25nID8gKG4uYXNJbnQgPSBsLkxvbmcuZnJvbVZhbHVlKHQuYXNJbnQpKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIHQuYXNJbnQgPT0gXCJzdHJpbmdcIiA/IG4uYXNJbnQgPSBwYXJzZUludCh0LmFzSW50LCAxMCkgOiB0eXBlb2YgdC5hc0ludCA9PSBcIm51bWJlclwiID8gbi5hc0ludCA9IHQuYXNJbnQgOiB0eXBlb2YgdC5hc0ludCA9PSBcIm9iamVjdFwiICYmIChuLmFzSW50ID0gbmV3IGwuTG9uZ0JpdHModC5hc0ludC5sb3cgPj4+IDAsIHQuYXNJbnQuaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCB0LnNwYW5JZCAhPSBudWxsICYmICh0eXBlb2YgdC5zcGFuSWQgPT0gXCJzdHJpbmdcIiA/IGwuYmFzZTY0LmRlY29kZSh0LnNwYW5JZCwgbi5zcGFuSWQgPSBsLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgodC5zcGFuSWQpKSwgMCkgOiB0LnNwYW5JZC5sZW5ndGggPj0gMCAmJiAobi5zcGFuSWQgPSB0LnNwYW5JZCkpLCB0LnRyYWNlSWQgIT0gbnVsbCAmJiAodHlwZW9mIHQudHJhY2VJZCA9PSBcInN0cmluZ1wiID8gbC5iYXNlNjQuZGVjb2RlKHQudHJhY2VJZCwgbi50cmFjZUlkID0gbC5uZXdCdWZmZXIobC5iYXNlNjQubGVuZ3RoKHQudHJhY2VJZCkpLCAwKSA6IHQudHJhY2VJZC5sZW5ndGggPj0gMCAmJiAobi50cmFjZUlkID0gdC50cmFjZUlkKSksIG47XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24odCwgbikge1xuICAgICAgICAgICAgICBuIHx8IChuID0ge30pO1xuICAgICAgICAgICAgICB2YXIgciA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKG4uYXJyYXlzIHx8IG4uZGVmYXVsdHMpICYmIChyLmZpbHRlcmVkQXR0cmlidXRlcyA9IFtdKSwgbi5kZWZhdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChsLkxvbmcpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBjID0gbmV3IGwuTG9uZygwLCAwLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IGMudG9TdHJpbmcoKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IGMudG9OdW1iZXIoKSA6IGM7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFwiMFwiIDogMDtcbiAgICAgICAgICAgICAgICBuLmJ5dGVzID09PSBTdHJpbmcgPyByLnNwYW5JZCA9IFwiXCIgOiAoci5zcGFuSWQgPSBbXSwgbi5ieXRlcyAhPT0gQXJyYXkgJiYgKHIuc3BhbklkID0gbC5uZXdCdWZmZXIoci5zcGFuSWQpKSksIG4uYnl0ZXMgPT09IFN0cmluZyA/IHIudHJhY2VJZCA9IFwiXCIgOiAoci50cmFjZUlkID0gW10sIG4uYnl0ZXMgIT09IEFycmF5ICYmIChyLnRyYWNlSWQgPSBsLm5ld0J1ZmZlcihyLnRyYWNlSWQpKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHQudGltZVVuaXhOYW5vICE9IG51bGwgJiYgdC5oYXNPd25Qcm9wZXJ0eShcInRpbWVVbml4TmFub1wiKSAmJiAodHlwZW9mIHQudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyByLnRpbWVVbml4TmFubyA9IG4ubG9uZ3MgPT09IFN0cmluZyA/IFN0cmluZyh0LnRpbWVVbml4TmFubykgOiB0LnRpbWVVbml4TmFubyA6IHIudGltZVVuaXhOYW5vID0gbi5sb25ncyA9PT0gU3RyaW5nID8gbC5Mb25nLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQudGltZVVuaXhOYW5vKSA6IG4ubG9uZ3MgPT09IE51bWJlciA/IG5ldyBsLkxvbmdCaXRzKHQudGltZVVuaXhOYW5vLmxvdyA+Pj4gMCwgdC50aW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSA6IHQudGltZVVuaXhOYW5vKSwgdC5hc0RvdWJsZSAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJhc0RvdWJsZVwiKSAmJiAoci5hc0RvdWJsZSA9IG4uanNvbiAmJiAhaXNGaW5pdGUodC5hc0RvdWJsZSkgPyBTdHJpbmcodC5hc0RvdWJsZSkgOiB0LmFzRG91YmxlLCBuLm9uZW9mcyAmJiAoci52YWx1ZSA9IFwiYXNEb3VibGVcIikpLCB0LnNwYW5JZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJzcGFuSWRcIikgJiYgKHIuc3BhbklkID0gbi5ieXRlcyA9PT0gU3RyaW5nID8gbC5iYXNlNjQuZW5jb2RlKHQuc3BhbklkLCAwLCB0LnNwYW5JZC5sZW5ndGgpIDogbi5ieXRlcyA9PT0gQXJyYXkgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LnNwYW5JZCkgOiB0LnNwYW5JZCksIHQudHJhY2VJZCAhPSBudWxsICYmIHQuaGFzT3duUHJvcGVydHkoXCJ0cmFjZUlkXCIpICYmIChyLnRyYWNlSWQgPSBuLmJ5dGVzID09PSBTdHJpbmcgPyBsLmJhc2U2NC5lbmNvZGUodC50cmFjZUlkLCAwLCB0LnRyYWNlSWQubGVuZ3RoKSA6IG4uYnl0ZXMgPT09IEFycmF5ID8gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodC50cmFjZUlkKSA6IHQudHJhY2VJZCksIHQuYXNJbnQgIT0gbnVsbCAmJiB0Lmhhc093blByb3BlcnR5KFwiYXNJbnRcIikgJiYgKHR5cGVvZiB0LmFzSW50ID09IFwibnVtYmVyXCIgPyByLmFzSW50ID0gbi5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKHQuYXNJbnQpIDogdC5hc0ludCA6IHIuYXNJbnQgPSBuLmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodC5hc0ludCkgOiBuLmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyh0LmFzSW50LmxvdyA+Pj4gMCwgdC5hc0ludC5oaWdoID4+PiAwKS50b051bWJlcigpIDogdC5hc0ludCwgbi5vbmVvZnMgJiYgKHIudmFsdWUgPSBcImFzSW50XCIpKSwgdC5maWx0ZXJlZEF0dHJpYnV0ZXMgJiYgdC5maWx0ZXJlZEF0dHJpYnV0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgci5maWx0ZXJlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB2ID0gMDsgdiA8IHQuZmlsdGVyZWRBdHRyaWJ1dGVzLmxlbmd0aDsgKyt2KVxuICAgICAgICAgICAgICAgICAgci5maWx0ZXJlZEF0dHJpYnV0ZXNbdl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLnRvT2JqZWN0KHQuZmlsdGVyZWRBdHRyaWJ1dGVzW3ZdLCBuKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbih0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0ID09PSB2b2lkIDAgJiYgKHQgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIHQgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLm1ldHJpY3MudjEuRXhlbXBsYXJcIjtcbiAgICAgICAgICAgIH0sIG87XG4gICAgICAgICAgfSkoKSwgaDtcbiAgICAgICAgfSkoKSwgeTtcbiAgICAgIH0pKCksIGQubG9ncyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB7fTtcbiAgICAgICAgcmV0dXJuIHkudjEgPSAoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdmFyIGggPSB7fTtcbiAgICAgICAgICByZXR1cm4gaC5Mb2dzRGF0YSA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5yZXNvdXJjZUxvZ3MgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnJlc291cmNlTG9ncyA9IGwuZW1wdHlBcnJheSwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnJlc291cmNlTG9ncyAhPSBudWxsICYmIGUucmVzb3VyY2VMb2dzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytuKVxuICAgICAgICAgICAgICAgICAgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLmVuY29kZShlLnJlc291cmNlTG9nc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDEsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgICAgfSwgby5lbmNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmVuY29kZShlLCB0KS5sZGVsaW0oKTtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IGEuY3JlYXRlKGUpKTtcbiAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IHQgPT09IHZvaWQgMCA/IGUubGVuIDogZS5wb3MgKyB0LCByID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ3NEYXRhKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2VMb2dzICYmIHIucmVzb3VyY2VMb2dzLmxlbmd0aCB8fCAoci5yZXNvdXJjZUxvZ3MgPSBbXSksIHIucmVzb3VyY2VMb2dzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlTG9ncyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZUxvZ3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5yZXNvdXJjZUxvZ3MpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VMb2dzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5yZXNvdXJjZUxvZ3MubGVuZ3RoOyArK3QpIHtcbiAgICAgICAgICAgICAgICAgIHZhciBuID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLnZlcmlmeShlLnJlc291cmNlTG9nc1t0XSk7XG4gICAgICAgICAgICAgICAgICBpZiAobilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2VMb2dzLlwiICsgbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nc0RhdGEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ3NEYXRhKCk7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlTG9ncykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnJlc291cmNlTG9ncykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ3NEYXRhLnJlc291cmNlTG9nczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5yZXNvdXJjZUxvZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUucmVzb3VyY2VMb2dzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nc0RhdGEucmVzb3VyY2VMb2dzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LnJlc291cmNlTG9nc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncy5mcm9tT2JqZWN0KGUucmVzb3VyY2VMb2dzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgICAgICB9LCBvLnRvT2JqZWN0ID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICB0IHx8ICh0ID0ge30pO1xuICAgICAgICAgICAgICB2YXIgbiA9IHt9O1xuICAgICAgICAgICAgICBpZiAoKHQuYXJyYXlzIHx8IHQuZGVmYXVsdHMpICYmIChuLnJlc291cmNlTG9ncyA9IFtdKSwgZS5yZXNvdXJjZUxvZ3MgJiYgZS5yZXNvdXJjZUxvZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbi5yZXNvdXJjZUxvZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IGUucmVzb3VyY2VMb2dzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5yZXNvdXJjZUxvZ3Nbcl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5SZXNvdXJjZUxvZ3MudG9PYmplY3QoZS5yZXNvdXJjZUxvZ3Nbcl0sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICAgICAgfSwgby5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnN0cnVjdG9yLnRvT2JqZWN0KHRoaXMsIHAudXRpbC50b0pTT05PcHRpb25zKTtcbiAgICAgICAgICAgIH0sIG8uZ2V0VHlwZVVybCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUgPT09IHZvaWQgMCAmJiAoZSA9IFwidHlwZS5nb29nbGVhcGlzLmNvbVwiKSwgZSArIFwiL29wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5Mb2dzRGF0YVwiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLlJlc291cmNlTG9ncyA9IChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5zY29wZUxvZ3MgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnJlc291cmNlID0gbnVsbCwgby5wcm90b3R5cGUuc2NvcGVMb2dzID0gbC5lbXB0eUFycmF5LCBvLnByb3RvdHlwZS5zY2hlbWFVcmwgPSBudWxsLCBvLmNyZWF0ZSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvKGUpO1xuICAgICAgICAgICAgfSwgby5lbmNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGlmICh0IHx8ICh0ID0gcy5jcmVhdGUoKSksIGUucmVzb3VyY2UgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInJlc291cmNlXCIpICYmIHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS5lbmNvZGUoZS5yZXNvdXJjZSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMSwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAxMFxuICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCksIGUuc2NvcGVMb2dzICE9IG51bGwgJiYgZS5zY29wZUxvZ3MubGVuZ3RoKVxuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zY29wZUxvZ3MubGVuZ3RoOyArK24pXG4gICAgICAgICAgICAgICAgICB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5TY29wZUxvZ3MuZW5jb2RlKGUuc2NvcGVMb2dzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY2hlbWFVcmxcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICApLnN0cmluZyhlLnNjaGVtYVVybCksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIucmVzb3VyY2UgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMjoge1xuICAgICAgICAgICAgICAgICAgICByLnNjb3BlTG9ncyAmJiByLnNjb3BlTG9ncy5sZW5ndGggfHwgKHIuc2NvcGVMb2dzID0gW10pLCByLnNjb3BlTG9ncy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlNjb3BlTG9ncy5kZWNvZGUoZSwgZS51aW50MzIoKSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgMzoge1xuICAgICAgICAgICAgICAgICAgICByLnNjaGVtYVVybCA9IGUuc3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgZS5za2lwVHlwZShjICYgNyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICAgIH0sIG8uZGVjb2RlRGVsaW1pdGVkID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIGEgfHwgKGUgPSBuZXcgYShlKSksIHRoaXMuZGVjb2RlKGUsIGUudWludDMyKCkpO1xuICAgICAgICAgICAgfSwgby52ZXJpZnkgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgZSAhPSBcIm9iamVjdFwiIHx8IGUgPT09IG51bGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JqZWN0IGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInJlc291cmNlXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ucmVzb3VyY2UudjEuUmVzb3VyY2UudmVyaWZ5KGUucmVzb3VyY2UpO1xuICAgICAgICAgICAgICAgIGlmICh0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwicmVzb3VyY2UuXCIgKyB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnNjb3BlTG9ncyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZUxvZ3NcIikpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5zY29wZUxvZ3MpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGVMb2dzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5zY29wZUxvZ3MubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIHZhciB0ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuU2NvcGVMb2dzLnZlcmlmeShlLnNjb3BlTG9nc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGVMb2dzLlwiICsgdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAhbC5pc1N0cmluZyhlLnNjaGVtYVVybCkgPyBcInNjaGVtYVVybDogc3RyaW5nIGV4cGVjdGVkXCIgOiBudWxsO1xuICAgICAgICAgICAgfSwgby5mcm9tT2JqZWN0ID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncylcbiAgICAgICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICAgICAgdmFyIHQgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzKCk7XG4gICAgICAgICAgICAgIGlmIChlLnJlc291cmNlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUucmVzb3VyY2UgIT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzLnJlc291cmNlOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5yZXNvdXJjZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS5mcm9tT2JqZWN0KGUucmVzb3VyY2UpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnNjb3BlTG9ncykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLnNjb3BlTG9ncykpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncy5zY29wZUxvZ3M6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc2NvcGVMb2dzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLnNjb3BlTG9ncy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnNjb3BlTG9nc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlJlc291cmNlTG9ncy5zY29wZUxvZ3M6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQuc2NvcGVMb2dzW25dID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuU2NvcGVMb2dzLmZyb21PYmplY3QoZS5zY29wZUxvZ3Nbbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiAodC5zY2hlbWFVcmwgPSBTdHJpbmcoZS5zY2hlbWFVcmwpKSwgdDtcbiAgICAgICAgICAgIH0sIG8udG9PYmplY3QgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIHQgfHwgKHQgPSB7fSk7XG4gICAgICAgICAgICAgIHZhciBuID0ge307XG4gICAgICAgICAgICAgIGlmICgodC5hcnJheXMgfHwgdC5kZWZhdWx0cykgJiYgKG4uc2NvcGVMb2dzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLnJlc291cmNlID0gbnVsbCwgbi5zY2hlbWFVcmwgPSBcIlwiKSwgZS5yZXNvdXJjZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJyZXNvdXJjZVwiKSAmJiAobi5yZXNvdXJjZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5yZXNvdXJjZS52MS5SZXNvdXJjZS50b09iamVjdChlLnJlc291cmNlLCB0KSksIGUuc2NvcGVMb2dzICYmIGUuc2NvcGVMb2dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uc2NvcGVMb2dzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCBlLnNjb3BlTG9ncy5sZW5ndGg7ICsrcilcbiAgICAgICAgICAgICAgICAgIG4uc2NvcGVMb2dzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuU2NvcGVMb2dzLnRvT2JqZWN0KGUuc2NvcGVMb2dzW3JdLCB0KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gZS5zY2hlbWFVcmwgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2NoZW1hVXJsXCIpICYmIChuLnNjaGVtYVVybCA9IGUuc2NoZW1hVXJsKSwgbjtcbiAgICAgICAgICAgIH0sIG8ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJ1Y3Rvci50b09iamVjdCh0aGlzLCBwLnV0aWwudG9KU09OT3B0aW9ucyk7XG4gICAgICAgICAgICB9LCBvLmdldFR5cGVVcmwgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlID09PSB2b2lkIDAgJiYgKGUgPSBcInR5cGUuZ29vZ2xlYXBpcy5jb21cIiksIGUgKyBcIi9vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuUmVzb3VyY2VMb2dzXCI7XG4gICAgICAgICAgICB9LCBvO1xuICAgICAgICAgIH0pKCksIGguU2NvcGVMb2dzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmxvZ1JlY29yZHMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnNjb3BlID0gbnVsbCwgby5wcm90b3R5cGUubG9nUmVjb3JkcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuc2NoZW1hVXJsID0gbnVsbCwgby5jcmVhdGUgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgbyhlKTtcbiAgICAgICAgICAgIH0sIG8uZW5jb2RlID0gZnVuY3Rpb24oZSwgdCkge1xuICAgICAgICAgICAgICBpZiAodCB8fCAodCA9IHMuY3JlYXRlKCkpLCBlLnNjb3BlICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY29wZVwiKSAmJiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmVuY29kZShlLnNjb3BlLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDEwXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgZS5sb2dSZWNvcmRzICE9IG51bGwgJiYgZS5sb2dSZWNvcmRzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubG9nUmVjb3Jkcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ1JlY29yZC5lbmNvZGUoZS5sb2dSZWNvcmRzW25dLCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAgICAgMThcbiAgICAgICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJzY2hlbWFVcmxcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMywgd2lyZVR5cGUgMiA9Ki9cbiAgICAgICAgICAgICAgICAyNlxuICAgICAgICAgICAgICApLnN0cmluZyhlLnNjaGVtYVVybCksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuU2NvcGVMb2dzKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2NvcGUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmRlY29kZShlLCBlLnVpbnQzMigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6IHtcbiAgICAgICAgICAgICAgICAgICAgci5sb2dSZWNvcmRzICYmIHIubG9nUmVjb3Jkcy5sZW5ndGggfHwgKHIubG9nUmVjb3JkcyA9IFtdKSwgci5sb2dSZWNvcmRzLnB1c2godS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nUmVjb3JkLmRlY29kZShlLCBlLnVpbnQzMigpKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2NoZW1hVXJsID0gZS5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBlLnNraXBUeXBlKGMgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IG5ldyBhKGUpKSwgdGhpcy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuc2NvcGUgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2NvcGVcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUudmVyaWZ5KGUuc2NvcGUpO1xuICAgICAgICAgICAgICAgIGlmICh0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwic2NvcGUuXCIgKyB0O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmxvZ1JlY29yZHMgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwibG9nUmVjb3Jkc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmxvZ1JlY29yZHMpKVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibG9nUmVjb3JkczogYXJyYXkgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUubG9nUmVjb3Jkcy5sZW5ndGg7ICsrbikge1xuICAgICAgICAgICAgICAgICAgdmFyIHQgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5Mb2dSZWNvcmQudmVyaWZ5KGUubG9nUmVjb3Jkc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwibG9nUmVjb3Jkcy5cIiArIHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnNjaGVtYVVybCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY2hlbWFVcmxcIikgJiYgIWwuaXNTdHJpbmcoZS5zY2hlbWFVcmwpID8gXCJzY2hlbWFVcmw6IHN0cmluZyBleHBlY3RlZFwiIDogbnVsbDtcbiAgICAgICAgICAgIH0sIG8uZnJvbU9iamVjdCA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5TY29wZUxvZ3MpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGU7XG4gICAgICAgICAgICAgIHZhciB0ID0gbmV3IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlNjb3BlTG9ncygpO1xuICAgICAgICAgICAgICBpZiAoZS5zY29wZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnNjb3BlICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlNjb3BlTG9ncy5zY29wZTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuc2NvcGUgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkluc3RydW1lbnRhdGlvblNjb3BlLmZyb21PYmplY3QoZS5zY29wZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUubG9nUmVjb3Jkcykge1xuICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShlLmxvZ1JlY29yZHMpKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5TY29wZUxvZ3MubG9nUmVjb3JkczogYXJyYXkgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgdC5sb2dSZWNvcmRzID0gW107XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPCBlLmxvZ1JlY29yZHMubGVuZ3RoOyArK24pIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5sb2dSZWNvcmRzW25dICE9IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuU2NvcGVMb2dzLmxvZ1JlY29yZHM6IG9iamVjdCBleHBlY3RlZFwiKTtcbiAgICAgICAgICAgICAgICAgIHQubG9nUmVjb3Jkc1tuXSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ1JlY29yZC5mcm9tT2JqZWN0KGUubG9nUmVjb3Jkc1tuXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLnNjaGVtYVVybCAhPSBudWxsICYmICh0LnNjaGVtYVVybCA9IFN0cmluZyhlLnNjaGVtYVVybCkpLCB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5sb2dSZWNvcmRzID0gW10pLCB0LmRlZmF1bHRzICYmIChuLnNjb3BlID0gbnVsbCwgbi5zY2hlbWFVcmwgPSBcIlwiKSwgZS5zY29wZSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzY29wZVwiKSAmJiAobi5zY29wZSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuSW5zdHJ1bWVudGF0aW9uU2NvcGUudG9PYmplY3QoZS5zY29wZSwgdCkpLCBlLmxvZ1JlY29yZHMgJiYgZS5sb2dSZWNvcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4ubG9nUmVjb3JkcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgZS5sb2dSZWNvcmRzLmxlbmd0aDsgKytyKVxuICAgICAgICAgICAgICAgICAgbi5sb2dSZWNvcmRzW3JdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nUmVjb3JkLnRvT2JqZWN0KGUubG9nUmVjb3Jkc1tyXSwgdCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuc2NoZW1hVXJsICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNjaGVtYVVybFwiKSAmJiAobi5zY2hlbWFVcmwgPSBlLnNjaGVtYVVybCksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlNjb3BlTG9nc1wiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoLlNldmVyaXR5TnVtYmVyID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG8gPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUobyk7XG4gICAgICAgICAgICByZXR1cm4gaVtvWzBdID0gXCJTRVZFUklUWV9OVU1CRVJfVU5TUEVDSUZJRURcIl0gPSAwLCBpW29bMV0gPSBcIlNFVkVSSVRZX05VTUJFUl9UUkFDRVwiXSA9IDEsIGlbb1syXSA9IFwiU0VWRVJJVFlfTlVNQkVSX1RSQUNFMlwiXSA9IDIsIGlbb1szXSA9IFwiU0VWRVJJVFlfTlVNQkVSX1RSQUNFM1wiXSA9IDMsIGlbb1s0XSA9IFwiU0VWRVJJVFlfTlVNQkVSX1RSQUNFNFwiXSA9IDQsIGlbb1s1XSA9IFwiU0VWRVJJVFlfTlVNQkVSX0RFQlVHXCJdID0gNSwgaVtvWzZdID0gXCJTRVZFUklUWV9OVU1CRVJfREVCVUcyXCJdID0gNiwgaVtvWzddID0gXCJTRVZFUklUWV9OVU1CRVJfREVCVUczXCJdID0gNywgaVtvWzhdID0gXCJTRVZFUklUWV9OVU1CRVJfREVCVUc0XCJdID0gOCwgaVtvWzldID0gXCJTRVZFUklUWV9OVU1CRVJfSU5GT1wiXSA9IDksIGlbb1sxMF0gPSBcIlNFVkVSSVRZX05VTUJFUl9JTkZPMlwiXSA9IDEwLCBpW29bMTFdID0gXCJTRVZFUklUWV9OVU1CRVJfSU5GTzNcIl0gPSAxMSwgaVtvWzEyXSA9IFwiU0VWRVJJVFlfTlVNQkVSX0lORk80XCJdID0gMTIsIGlbb1sxM10gPSBcIlNFVkVSSVRZX05VTUJFUl9XQVJOXCJdID0gMTMsIGlbb1sxNF0gPSBcIlNFVkVSSVRZX05VTUJFUl9XQVJOMlwiXSA9IDE0LCBpW29bMTVdID0gXCJTRVZFUklUWV9OVU1CRVJfV0FSTjNcIl0gPSAxNSwgaVtvWzE2XSA9IFwiU0VWRVJJVFlfTlVNQkVSX1dBUk40XCJdID0gMTYsIGlbb1sxN10gPSBcIlNFVkVSSVRZX05VTUJFUl9FUlJPUlwiXSA9IDE3LCBpW29bMThdID0gXCJTRVZFUklUWV9OVU1CRVJfRVJST1IyXCJdID0gMTgsIGlbb1sxOV0gPSBcIlNFVkVSSVRZX05VTUJFUl9FUlJPUjNcIl0gPSAxOSwgaVtvWzIwXSA9IFwiU0VWRVJJVFlfTlVNQkVSX0VSUk9SNFwiXSA9IDIwLCBpW29bMjFdID0gXCJTRVZFUklUWV9OVU1CRVJfRkFUQUxcIl0gPSAyMSwgaVtvWzIyXSA9IFwiU0VWRVJJVFlfTlVNQkVSX0ZBVEFMMlwiXSA9IDIyLCBpW29bMjNdID0gXCJTRVZFUklUWV9OVU1CRVJfRkFUQUwzXCJdID0gMjMsIGlbb1syNF0gPSBcIlNFVkVSSVRZX05VTUJFUl9GQVRBTDRcIl0gPSAyNCwgaTtcbiAgICAgICAgICB9KSgpLCBoLkxvZ1JlY29yZEZsYWdzID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdmFyIG8gPSB7fSwgaSA9IE9iamVjdC5jcmVhdGUobyk7XG4gICAgICAgICAgICByZXR1cm4gaVtvWzBdID0gXCJMT0dfUkVDT1JEX0ZMQUdTX0RPX05PVF9VU0VcIl0gPSAwLCBpW29bMjU1XSA9IFwiTE9HX1JFQ09SRF9GTEFHU19UUkFDRV9GTEFHU19NQVNLXCJdID0gMjU1LCBpO1xuICAgICAgICAgIH0pKCksIGguTG9nUmVjb3JkID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgZnVuY3Rpb24gbyhpKSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmF0dHJpYnV0ZXMgPSBbXSwgaSlcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBlID0gT2JqZWN0LmtleXMoaSksIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgICAgICAgICAgICAgIGlbZVt0XV0gIT0gbnVsbCAmJiAodGhpc1tlW3RdXSA9IGlbZVt0XV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG8ucHJvdG90eXBlLnRpbWVVbml4TmFubyA9IG51bGwsIG8ucHJvdG90eXBlLm9ic2VydmVkVGltZVVuaXhOYW5vID0gbnVsbCwgby5wcm90b3R5cGUuc2V2ZXJpdHlOdW1iZXIgPSBudWxsLCBvLnByb3RvdHlwZS5zZXZlcml0eVRleHQgPSBudWxsLCBvLnByb3RvdHlwZS5ib2R5ID0gbnVsbCwgby5wcm90b3R5cGUuYXR0cmlidXRlcyA9IGwuZW1wdHlBcnJheSwgby5wcm90b3R5cGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCA9IG51bGwsIG8ucHJvdG90eXBlLmZsYWdzID0gbnVsbCwgby5wcm90b3R5cGUudHJhY2VJZCA9IG51bGwsIG8ucHJvdG90eXBlLnNwYW5JZCA9IG51bGwsIG8uY3JlYXRlID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV3IG8oZSk7XG4gICAgICAgICAgICB9LCBvLmVuY29kZSA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgaWYgKHQgfHwgKHQgPSBzLmNyZWF0ZSgpKSwgZS50aW1lVW5peE5hbm8gIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcInRpbWVVbml4TmFub1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxLCB3aXJlVHlwZSAxID0qL1xuICAgICAgICAgICAgICAgIDlcbiAgICAgICAgICAgICAgKS5maXhlZDY0KGUudGltZVVuaXhOYW5vKSwgZS5zZXZlcml0eU51bWJlciAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwic2V2ZXJpdHlOdW1iZXJcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgMiwgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICAxNlxuICAgICAgICAgICAgICApLmludDMyKGUuc2V2ZXJpdHlOdW1iZXIpLCBlLnNldmVyaXR5VGV4dCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwic2V2ZXJpdHlUZXh0XCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDMsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgMjZcbiAgICAgICAgICAgICAgKS5zdHJpbmcoZS5zZXZlcml0eVRleHQpLCBlLmJvZHkgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImJvZHlcIikgJiYgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS5lbmNvZGUoZS5ib2R5LCB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA1LCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDQyXG4gICAgICAgICAgICAgICkuZm9yaygpKS5sZGVsaW0oKSwgZS5hdHRyaWJ1dGVzICE9IG51bGwgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8IGUuYXR0cmlidXRlcy5sZW5ndGg7ICsrbilcbiAgICAgICAgICAgICAgICAgIHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZW5jb2RlKGUuYXR0cmlidXRlc1tuXSwgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgICAgIC8qIGlkIDYsIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgICAgIDUwXG4gICAgICAgICAgICAgICAgICApLmZvcmsoKSkubGRlbGltKCk7XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLCBcImRyb3BwZWRBdHRyaWJ1dGVzQ291bnRcIikgJiYgdC51aW50MzIoXG4gICAgICAgICAgICAgICAgLyogaWQgNywgd2lyZVR5cGUgMCA9Ki9cbiAgICAgICAgICAgICAgICA1NlxuICAgICAgICAgICAgICApLnVpbnQzMihlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQpLCBlLmZsYWdzICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJmbGFnc1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCA4LCB3aXJlVHlwZSA1ID0qL1xuICAgICAgICAgICAgICAgIDY5XG4gICAgICAgICAgICAgICkuZml4ZWQzMihlLmZsYWdzKSwgZS50cmFjZUlkICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJ0cmFjZUlkXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDksIHdpcmVUeXBlIDIgPSovXG4gICAgICAgICAgICAgICAgNzRcbiAgICAgICAgICAgICAgKS5ieXRlcyhlLnRyYWNlSWQpLCBlLnNwYW5JZCAhPSBudWxsICYmIE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwic3BhbklkXCIpICYmIHQudWludDMyKFxuICAgICAgICAgICAgICAgIC8qIGlkIDEwLCB3aXJlVHlwZSAyID0qL1xuICAgICAgICAgICAgICAgIDgyXG4gICAgICAgICAgICAgICkuYnl0ZXMoZS5zcGFuSWQpLCBlLm9ic2VydmVkVGltZVVuaXhOYW5vICE9IG51bGwgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoZSwgXCJvYnNlcnZlZFRpbWVVbml4TmFub1wiKSAmJiB0LnVpbnQzMihcbiAgICAgICAgICAgICAgICAvKiBpZCAxMSwgd2lyZVR5cGUgMSA9Ki9cbiAgICAgICAgICAgICAgICA4OVxuICAgICAgICAgICAgICApLmZpeGVkNjQoZS5vYnNlcnZlZFRpbWVVbml4TmFubyksIHQ7XG4gICAgICAgICAgICB9LCBvLmVuY29kZURlbGltaXRlZCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5jb2RlKGUsIHQpLmxkZWxpbSgpO1xuICAgICAgICAgICAgfSwgby5kZWNvZGUgPSBmdW5jdGlvbihlLCB0KSB7XG4gICAgICAgICAgICAgIGUgaW5zdGFuY2VvZiBhIHx8IChlID0gYS5jcmVhdGUoZSkpO1xuICAgICAgICAgICAgICBmb3IgKHZhciBuID0gdCA9PT0gdm9pZCAwID8gZS5sZW4gOiBlLnBvcyArIHQsIHIgPSBuZXcgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nUmVjb3JkKCk7IGUucG9zIDwgbjsgKSB7XG4gICAgICAgICAgICAgICAgdmFyIGMgPSBlLnVpbnQzMigpO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoYyA+Pj4gMykge1xuICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7XG4gICAgICAgICAgICAgICAgICAgIHIudGltZVVuaXhOYW5vID0gZS5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxMToge1xuICAgICAgICAgICAgICAgICAgICByLm9ic2VydmVkVGltZVVuaXhOYW5vID0gZS5maXhlZDY0KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2V2ZXJpdHlOdW1iZXIgPSBlLmludDMyKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAzOiB7XG4gICAgICAgICAgICAgICAgICAgIHIuc2V2ZXJpdHlUZXh0ID0gZS5zdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6IHtcbiAgICAgICAgICAgICAgICAgICAgci5ib2R5ID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5BbnlWYWx1ZS5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSA2OiB7XG4gICAgICAgICAgICAgICAgICAgIHIuYXR0cmlidXRlcyAmJiByLmF0dHJpYnV0ZXMubGVuZ3RoIHx8IChyLmF0dHJpYnV0ZXMgPSBbXSksIHIuYXR0cmlidXRlcy5wdXNoKHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUuZGVjb2RlKGUsIGUudWludDMyKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICAgICAgICAgICAgci5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS51aW50MzIoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlIDg6IHtcbiAgICAgICAgICAgICAgICAgICAgci5mbGFncyA9IGUuZml4ZWQzMigpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGNhc2UgOToge1xuICAgICAgICAgICAgICAgICAgICByLnRyYWNlSWQgPSBlLmJ5dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgY2FzZSAxMDoge1xuICAgICAgICAgICAgICAgICAgICByLnNwYW5JZCA9IGUuYnl0ZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICBlLnNraXBUeXBlKGMgJiA3KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgICAgfSwgby5kZWNvZGVEZWxpbWl0ZWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBlIGluc3RhbmNlb2YgYSB8fCAoZSA9IG5ldyBhKGUpKSwgdGhpcy5kZWNvZGUoZSwgZS51aW50MzIoKSk7XG4gICAgICAgICAgICB9LCBvLnZlcmlmeSA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlICE9IFwib2JqZWN0XCIgfHwgZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvYmplY3QgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUudGltZVVuaXhOYW5vICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInRpbWVVbml4TmFub1wiKSAmJiAhbC5pc0ludGVnZXIoZS50aW1lVW5peE5hbm8pICYmICEoZS50aW1lVW5peE5hbm8gJiYgbC5pc0ludGVnZXIoZS50aW1lVW5peE5hbm8ubG93KSAmJiBsLmlzSW50ZWdlcihlLnRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwidGltZVVuaXhOYW5vOiBpbnRlZ2VyfExvbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwib2JzZXJ2ZWRUaW1lVW5peE5hbm9cIikgJiYgIWwuaXNJbnRlZ2VyKGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8pICYmICEoZS5vYnNlcnZlZFRpbWVVbml4TmFubyAmJiBsLmlzSW50ZWdlcihlLm9ic2VydmVkVGltZVVuaXhOYW5vLmxvdykgJiYgbC5pc0ludGVnZXIoZS5vYnNlcnZlZFRpbWVVbml4TmFuby5oaWdoKSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib2JzZXJ2ZWRUaW1lVW5peE5hbm86IGludGVnZXJ8TG9uZyBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICBpZiAoZS5zZXZlcml0eU51bWJlciAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzZXZlcml0eU51bWJlclwiKSlcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGUuc2V2ZXJpdHlOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcInNldmVyaXR5TnVtYmVyOiBlbnVtIHZhbHVlIGV4cGVjdGVkXCI7XG4gICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICBjYXNlIDY6XG4gICAgICAgICAgICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgICAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgICAgICAgICAgY2FzZSAxNzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgY2FzZSAyMDpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICBjYXNlIDIyOlxuICAgICAgICAgICAgICAgICAgY2FzZSAyMzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuc2V2ZXJpdHlUZXh0ICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNldmVyaXR5VGV4dFwiKSAmJiAhbC5pc1N0cmluZyhlLnNldmVyaXR5VGV4dCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwic2V2ZXJpdHlUZXh0OiBzdHJpbmcgZXhwZWN0ZWRcIjtcbiAgICAgICAgICAgICAgaWYgKGUuYm9keSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJib2R5XCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLnZlcmlmeShlLmJvZHkpO1xuICAgICAgICAgICAgICAgIGlmICh0KVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYm9keS5cIiArIHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGUuYXR0cmlidXRlcyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJhdHRyaWJ1dGVzXCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGUuYXR0cmlidXRlcykpXG4gICAgICAgICAgICAgICAgICByZXR1cm4gXCJhdHRyaWJ1dGVzOiBhcnJheSBleHBlY3RlZFwiO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgdCA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuS2V5VmFsdWUudmVyaWZ5KGUuYXR0cmlidXRlc1tuXSk7XG4gICAgICAgICAgICAgICAgICBpZiAodClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiYXR0cmlidXRlcy5cIiArIHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiAhbC5pc0ludGVnZXIoZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSA/IFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDogaW50ZWdlciBleHBlY3RlZFwiIDogZS5mbGFncyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAhbC5pc0ludGVnZXIoZS5mbGFncykgPyBcImZsYWdzOiBpbnRlZ2VyIGV4cGVjdGVkXCIgOiBlLnRyYWNlSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidHJhY2VJZFwiKSAmJiAhKGUudHJhY2VJZCAmJiB0eXBlb2YgZS50cmFjZUlkLmxlbmd0aCA9PSBcIm51bWJlclwiIHx8IGwuaXNTdHJpbmcoZS50cmFjZUlkKSkgPyBcInRyYWNlSWQ6IGJ1ZmZlciBleHBlY3RlZFwiIDogZS5zcGFuSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic3BhbklkXCIpICYmICEoZS5zcGFuSWQgJiYgdHlwZW9mIGUuc3BhbklkLmxlbmd0aCA9PSBcIm51bWJlclwiIHx8IGwuaXNTdHJpbmcoZS5zcGFuSWQpKSA/IFwic3BhbklkOiBidWZmZXIgZXhwZWN0ZWRcIiA6IG51bGw7XG4gICAgICAgICAgICB9LCBvLmZyb21PYmplY3QgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgdS5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nUmVjb3JkKVxuICAgICAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgICAgICB2YXIgdCA9IG5ldyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5Mb2dSZWNvcmQoKTtcbiAgICAgICAgICAgICAgc3dpdGNoIChlLnRpbWVVbml4TmFubyAhPSBudWxsICYmIChsLkxvbmcgPyAodC50aW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKGUudGltZVVuaXhOYW5vKSkudW5zaWduZWQgPSBmYWxzZSA6IHR5cGVvZiBlLnRpbWVVbml4TmFubyA9PSBcInN0cmluZ1wiID8gdC50aW1lVW5peE5hbm8gPSBwYXJzZUludChlLnRpbWVVbml4TmFubywgMTApIDogdHlwZW9mIGUudGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyB0LnRpbWVVbml4TmFubyA9IGUudGltZVVuaXhOYW5vIDogdHlwZW9mIGUudGltZVVuaXhOYW5vID09IFwib2JqZWN0XCIgJiYgKHQudGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHMoZS50aW1lVW5peE5hbm8ubG93ID4+PiAwLCBlLnRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpKSksIGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiAobC5Mb25nID8gKHQub2JzZXJ2ZWRUaW1lVW5peE5hbm8gPSBsLkxvbmcuZnJvbVZhbHVlKGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8pKS51bnNpZ25lZCA9IGZhbHNlIDogdHlwZW9mIGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8gPT0gXCJzdHJpbmdcIiA/IHQub2JzZXJ2ZWRUaW1lVW5peE5hbm8gPSBwYXJzZUludChlLm9ic2VydmVkVGltZVVuaXhOYW5vLCAxMCkgOiB0eXBlb2YgZS5vYnNlcnZlZFRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gdC5vYnNlcnZlZFRpbWVVbml4TmFubyA9IGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8gOiB0eXBlb2YgZS5vYnNlcnZlZFRpbWVVbml4TmFubyA9PSBcIm9iamVjdFwiICYmICh0Lm9ic2VydmVkVGltZVVuaXhOYW5vID0gbmV3IGwuTG9uZ0JpdHMoZS5vYnNlcnZlZFRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8uaGlnaCA+Pj4gMCkudG9OdW1iZXIoKSkpLCBlLnNldmVyaXR5TnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZS5zZXZlcml0eU51bWJlciA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSBlLnNldmVyaXR5TnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfVU5TUEVDSUZJRURcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfVFJBQ0VcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfVFJBQ0UyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX1RSQUNFM1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSAzO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9UUkFDRTRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gNDtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfREVCVUdcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gNTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfREVCVUcyXCI6XG4gICAgICAgICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDY7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX0RFQlVHM1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgNzpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSA3O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9ERUJVRzRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDg6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gODtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfSU5GT1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgOTpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSA5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9JTkZPMlwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMTA7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX0lORk8zXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAxMTpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSAxMTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfSU5GTzRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDEyOlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDEyO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9XQVJOXCI6XG4gICAgICAgICAgICAgICAgY2FzZSAxMzpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSAxMztcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfV0FSTjJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDE0O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9XQVJOM1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMTU7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX1dBUk40XCI6XG4gICAgICAgICAgICAgICAgY2FzZSAxNjpcbiAgICAgICAgICAgICAgICAgIHQuc2V2ZXJpdHlOdW1iZXIgPSAxNjtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJTRVZFUklUWV9OVU1CRVJfRVJST1JcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDE3O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9FUlJPUjJcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE4OlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDE4O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9FUlJPUjNcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDE5OlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDE5O1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9FUlJPUjRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgICAgICAgICAgdC5zZXZlcml0eU51bWJlciA9IDIwO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVkVSSVRZX05VTUJFUl9GQVRBTFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMjE6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMjE7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX0ZBVEFMMlwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMjI6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMjI7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX0ZBVEFMM1wiOlxuICAgICAgICAgICAgICAgIGNhc2UgMjM6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMjM7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiU0VWRVJJVFlfTlVNQkVSX0ZBVEFMNFwiOlxuICAgICAgICAgICAgICAgIGNhc2UgMjQ6XG4gICAgICAgICAgICAgICAgICB0LnNldmVyaXR5TnVtYmVyID0gMjQ7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoZS5zZXZlcml0eVRleHQgIT0gbnVsbCAmJiAodC5zZXZlcml0eVRleHQgPSBTdHJpbmcoZS5zZXZlcml0eVRleHQpKSwgZS5ib2R5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYm9keSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKFwiLm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5Mb2dSZWNvcmQuYm9keTogb2JqZWN0IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuYm9keSA9IHUub3BlbnRlbGVtZXRyeS5wcm90by5jb21tb24udjEuQW55VmFsdWUuZnJvbU9iamVjdChlLmJvZHkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZS5hdHRyaWJ1dGVzKSlcbiAgICAgICAgICAgICAgICAgIHRocm93IFR5cGVFcnJvcihcIi5vcGVudGVsZW1ldHJ5LnByb3RvLmxvZ3MudjEuTG9nUmVjb3JkLmF0dHJpYnV0ZXM6IGFycmF5IGV4cGVjdGVkXCIpO1xuICAgICAgICAgICAgICAgIHQuYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytuKSB7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGUuYXR0cmlidXRlc1tuXSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXCIub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ1JlY29yZC5hdHRyaWJ1dGVzOiBvYmplY3QgZXhwZWN0ZWRcIik7XG4gICAgICAgICAgICAgICAgICB0LmF0dHJpYnV0ZXNbbl0gPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLktleVZhbHVlLmZyb21PYmplY3QoZS5hdHRyaWJ1dGVzW25dKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIGUuZHJvcHBlZEF0dHJpYnV0ZXNDb3VudCAhPSBudWxsICYmICh0LmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPSBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgPj4+IDApLCBlLmZsYWdzICE9IG51bGwgJiYgKHQuZmxhZ3MgPSBlLmZsYWdzID4+PiAwKSwgZS50cmFjZUlkICE9IG51bGwgJiYgKHR5cGVvZiBlLnRyYWNlSWQgPT0gXCJzdHJpbmdcIiA/IGwuYmFzZTY0LmRlY29kZShlLnRyYWNlSWQsIHQudHJhY2VJZCA9IGwubmV3QnVmZmVyKGwuYmFzZTY0Lmxlbmd0aChlLnRyYWNlSWQpKSwgMCkgOiBlLnRyYWNlSWQubGVuZ3RoID49IDAgJiYgKHQudHJhY2VJZCA9IGUudHJhY2VJZCkpLCBlLnNwYW5JZCAhPSBudWxsICYmICh0eXBlb2YgZS5zcGFuSWQgPT0gXCJzdHJpbmdcIiA/IGwuYmFzZTY0LmRlY29kZShlLnNwYW5JZCwgdC5zcGFuSWQgPSBsLm5ld0J1ZmZlcihsLmJhc2U2NC5sZW5ndGgoZS5zcGFuSWQpKSwgMCkgOiBlLnNwYW5JZC5sZW5ndGggPj0gMCAmJiAodC5zcGFuSWQgPSBlLnNwYW5JZCkpLCB0O1xuICAgICAgICAgICAgfSwgby50b09iamVjdCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgICAgICAgICAgICAgdCB8fCAodCA9IHt9KTtcbiAgICAgICAgICAgICAgdmFyIG4gPSB7fTtcbiAgICAgICAgICAgICAgaWYgKCh0LmFycmF5cyB8fCB0LmRlZmF1bHRzKSAmJiAobi5hdHRyaWJ1dGVzID0gW10pLCB0LmRlZmF1bHRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGwuTG9uZykge1xuICAgICAgICAgICAgICAgICAgdmFyIHIgPSBuZXcgbC5Mb25nKDAsIDAsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgIG4udGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gci50b1N0cmluZygpIDogdC5sb25ncyA9PT0gTnVtYmVyID8gci50b051bWJlcigpIDogcjtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgIG4udGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICAgIGlmIChuLnNldmVyaXR5TnVtYmVyID0gdC5lbnVtcyA9PT0gU3RyaW5nID8gXCJTRVZFUklUWV9OVU1CRVJfVU5TUEVDSUZJRURcIiA6IDAsIG4uc2V2ZXJpdHlUZXh0ID0gXCJcIiwgbi5ib2R5ID0gbnVsbCwgbi5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gMCwgbi5mbGFncyA9IDAsIHQuYnl0ZXMgPT09IFN0cmluZyA/IG4udHJhY2VJZCA9IFwiXCIgOiAobi50cmFjZUlkID0gW10sIHQuYnl0ZXMgIT09IEFycmF5ICYmIChuLnRyYWNlSWQgPSBsLm5ld0J1ZmZlcihuLnRyYWNlSWQpKSksIHQuYnl0ZXMgPT09IFN0cmluZyA/IG4uc3BhbklkID0gXCJcIiA6IChuLnNwYW5JZCA9IFtdLCB0LmJ5dGVzICE9PSBBcnJheSAmJiAobi5zcGFuSWQgPSBsLm5ld0J1ZmZlcihuLnNwYW5JZCkpKSwgbC5Mb25nKSB7XG4gICAgICAgICAgICAgICAgICB2YXIgciA9IG5ldyBsLkxvbmcoMCwgMCwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgbi5vYnNlcnZlZFRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IHIudG9TdHJpbmcoKSA6IHQubG9uZ3MgPT09IE51bWJlciA/IHIudG9OdW1iZXIoKSA6IHI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICBuLm9ic2VydmVkVGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gXCIwXCIgOiAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChlLnRpbWVVbml4TmFubyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lVW5peE5hbm9cIikgJiYgKHR5cGVvZiBlLnRpbWVVbml4TmFubyA9PSBcIm51bWJlclwiID8gbi50aW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBTdHJpbmcoZS50aW1lVW5peE5hbm8pIDogZS50aW1lVW5peE5hbm8gOiBuLnRpbWVVbml4TmFubyA9IHQubG9uZ3MgPT09IFN0cmluZyA/IGwuTG9uZy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnRpbWVVbml4TmFubykgOiB0LmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyhlLnRpbWVVbml4TmFuby5sb3cgPj4+IDAsIGUudGltZVVuaXhOYW5vLmhpZ2ggPj4+IDApLnRvTnVtYmVyKCkgOiBlLnRpbWVVbml4TmFubyksIGUuc2V2ZXJpdHlOdW1iZXIgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwic2V2ZXJpdHlOdW1iZXJcIikgJiYgKG4uc2V2ZXJpdHlOdW1iZXIgPSB0LmVudW1zID09PSBTdHJpbmcgPyB1Lm9wZW50ZWxlbWV0cnkucHJvdG8ubG9ncy52MS5TZXZlcml0eU51bWJlcltlLnNldmVyaXR5TnVtYmVyXSA9PT0gdm9pZCAwID8gZS5zZXZlcml0eU51bWJlciA6IHUub3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLlNldmVyaXR5TnVtYmVyW2Uuc2V2ZXJpdHlOdW1iZXJdIDogZS5zZXZlcml0eU51bWJlciksIGUuc2V2ZXJpdHlUZXh0ICE9IG51bGwgJiYgZS5oYXNPd25Qcm9wZXJ0eShcInNldmVyaXR5VGV4dFwiKSAmJiAobi5zZXZlcml0eVRleHQgPSBlLnNldmVyaXR5VGV4dCksIGUuYm9keSAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJib2R5XCIpICYmIChuLmJvZHkgPSB1Lm9wZW50ZWxlbWV0cnkucHJvdG8uY29tbW9uLnYxLkFueVZhbHVlLnRvT2JqZWN0KGUuYm9keSwgdCkpLCBlLmF0dHJpYnV0ZXMgJiYgZS5hdHRyaWJ1dGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG4uYXR0cmlidXRlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgZS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytjKVxuICAgICAgICAgICAgICAgICAgbi5hdHRyaWJ1dGVzW2NdID0gdS5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbW1vbi52MS5LZXlWYWx1ZS50b09iamVjdChlLmF0dHJpYnV0ZXNbY10sIHQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBlLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwiZHJvcHBlZEF0dHJpYnV0ZXNDb3VudFwiKSAmJiAobi5kcm9wcGVkQXR0cmlidXRlc0NvdW50ID0gZS5kcm9wcGVkQXR0cmlidXRlc0NvdW50KSwgZS5mbGFncyAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJmbGFnc1wiKSAmJiAobi5mbGFncyA9IGUuZmxhZ3MpLCBlLnRyYWNlSWQgIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwidHJhY2VJZFwiKSAmJiAobi50cmFjZUlkID0gdC5ieXRlcyA9PT0gU3RyaW5nID8gbC5iYXNlNjQuZW5jb2RlKGUudHJhY2VJZCwgMCwgZS50cmFjZUlkLmxlbmd0aCkgOiB0LmJ5dGVzID09PSBBcnJheSA/IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUudHJhY2VJZCkgOiBlLnRyYWNlSWQpLCBlLnNwYW5JZCAhPSBudWxsICYmIGUuaGFzT3duUHJvcGVydHkoXCJzcGFuSWRcIikgJiYgKG4uc3BhbklkID0gdC5ieXRlcyA9PT0gU3RyaW5nID8gbC5iYXNlNjQuZW5jb2RlKGUuc3BhbklkLCAwLCBlLnNwYW5JZC5sZW5ndGgpIDogdC5ieXRlcyA9PT0gQXJyYXkgPyBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlLnNwYW5JZCkgOiBlLnNwYW5JZCksIGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8gIT0gbnVsbCAmJiBlLmhhc093blByb3BlcnR5KFwib2JzZXJ2ZWRUaW1lVW5peE5hbm9cIikgJiYgKHR5cGVvZiBlLm9ic2VydmVkVGltZVVuaXhOYW5vID09IFwibnVtYmVyXCIgPyBuLm9ic2VydmVkVGltZVVuaXhOYW5vID0gdC5sb25ncyA9PT0gU3RyaW5nID8gU3RyaW5nKGUub2JzZXJ2ZWRUaW1lVW5peE5hbm8pIDogZS5vYnNlcnZlZFRpbWVVbml4TmFubyA6IG4ub2JzZXJ2ZWRUaW1lVW5peE5hbm8gPSB0LmxvbmdzID09PSBTdHJpbmcgPyBsLkxvbmcucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5vYnNlcnZlZFRpbWVVbml4TmFubykgOiB0LmxvbmdzID09PSBOdW1iZXIgPyBuZXcgbC5Mb25nQml0cyhlLm9ic2VydmVkVGltZVVuaXhOYW5vLmxvdyA+Pj4gMCwgZS5vYnNlcnZlZFRpbWVVbml4TmFuby5oaWdoID4+PiAwKS50b051bWJlcigpIDogZS5vYnNlcnZlZFRpbWVVbml4TmFubyksIG47XG4gICAgICAgICAgICB9LCBvLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29uc3RydWN0b3IudG9PYmplY3QodGhpcywgcC51dGlsLnRvSlNPTk9wdGlvbnMpO1xuICAgICAgICAgICAgfSwgby5nZXRUeXBlVXJsID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICByZXR1cm4gZSA9PT0gdm9pZCAwICYmIChlID0gXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIpLCBlICsgXCIvb3BlbnRlbGVtZXRyeS5wcm90by5sb2dzLnYxLkxvZ1JlY29yZFwiO1xuICAgICAgICAgICAgfSwgbztcbiAgICAgICAgICB9KSgpLCBoO1xuICAgICAgICB9KSgpLCB5O1xuICAgICAgfSkoKSwgZDtcbiAgICB9KSgpLCBmO1xuICB9KSgpLCByb290ID0gdSwgcm9vdDtcbn1cbnZhciByb290RXhwb3J0cyA9IC8qIEBfX1BVUkVfXyAqLyByZXF1aXJlUm9vdCgpO1xuZnVuY3Rpb24gaHJUaW1lVG9OYW5vcyhwKSB7XG4gIHZhciBhID0gQmlnSW50KDFlOSk7XG4gIHJldHVybiBCaWdJbnQocFswXSkgKiBhICsgQmlnSW50KHBbMV0pO1xufVxuZnVuY3Rpb24gdG9Mb25nQml0cyhwKSB7XG4gIHZhciBhID0gTnVtYmVyKEJpZ0ludC5hc1VpbnROKDMyLCBwKSksIHMgPSBOdW1iZXIoQmlnSW50LmFzVWludE4oMzIsIHAgPj4gQmlnSW50KDMyKSkpO1xuICByZXR1cm4geyBsb3c6IGEsIGhpZ2g6IHMgfTtcbn1cbmZ1bmN0aW9uIGVuY29kZUFzTG9uZ0JpdHMocCkge1xuICB2YXIgYSA9IGhyVGltZVRvTmFub3MocCk7XG4gIHJldHVybiB0b0xvbmdCaXRzKGEpO1xufVxuZnVuY3Rpb24gb3B0aW9uYWxIZXhUb0JpbmFyeShwKSB7XG4gIGlmIChwICE9PSB2b2lkIDApXG4gICAgcmV0dXJuIEEocCk7XG59XG52YXIgREVGQVVMVF9FTkNPREVSID0ge1xuICBlbmNvZGVIclRpbWU6IGVuY29kZUFzTG9uZ0JpdHMsXG4gIGVuY29kZVNwYW5Db250ZXh0OiBBLFxuICBlbmNvZGVPcHRpb25hbFNwYW5Db250ZXh0OiBvcHRpb25hbEhleFRvQmluYXJ5XG59O1xuZnVuY3Rpb24gZ2V0T3RscEVuY29kZXIocCkge1xuICByZXR1cm4gREVGQVVMVF9FTkNPREVSO1xufVxudmFyIF9fcmVhZCQzID0gZnVuY3Rpb24ocCwgYSkge1xuICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIHBbU3ltYm9sLml0ZXJhdG9yXTtcbiAgaWYgKCFzKSByZXR1cm4gcDtcbiAgdmFyIGwgPSBzLmNhbGwocCksIHUsIGYgPSBbXSwgZDtcbiAgdHJ5IHtcbiAgICBmb3IgKDsgKGEgPT09IHZvaWQgMCB8fCBhLS0gPiAwKSAmJiAhKHUgPSBsLm5leHQoKSkuZG9uZTsgKSBmLnB1c2godS52YWx1ZSk7XG4gIH0gY2F0Y2ggKHkpIHtcbiAgICBkID0geyBlcnJvcjogeSB9O1xuICB9IGZpbmFsbHkge1xuICAgIHRyeSB7XG4gICAgICB1ICYmICF1LmRvbmUgJiYgKHMgPSBsLnJldHVybikgJiYgcy5jYWxsKGwpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZCkgdGhyb3cgZC5lcnJvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGY7XG59O1xuZnVuY3Rpb24gY3JlYXRlUmVzb3VyY2UocCkge1xuICByZXR1cm4ge1xuICAgIGF0dHJpYnV0ZXM6IHRvQXR0cmlidXRlcyhwLmF0dHJpYnV0ZXMpLFxuICAgIGRyb3BwZWRBdHRyaWJ1dGVzQ291bnQ6IDBcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluc3RydW1lbnRhdGlvblNjb3BlKHApIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBwLm5hbWUsXG4gICAgdmVyc2lvbjogcC52ZXJzaW9uXG4gIH07XG59XG5mdW5jdGlvbiB0b0F0dHJpYnV0ZXMocCkge1xuICByZXR1cm4gT2JqZWN0LmtleXMocCkubWFwKGZ1bmN0aW9uKGEpIHtcbiAgICByZXR1cm4gdG9LZXlWYWx1ZShhLCBwW2FdKTtcbiAgfSk7XG59XG5mdW5jdGlvbiB0b0tleVZhbHVlKHAsIGEpIHtcbiAgcmV0dXJuIHtcbiAgICBrZXk6IHAsXG4gICAgdmFsdWU6IHRvQW55VmFsdWUoYSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHRvQW55VmFsdWUocCkge1xuICB2YXIgYSA9IHR5cGVvZiBwO1xuICByZXR1cm4gYSA9PT0gXCJzdHJpbmdcIiA/IHsgc3RyaW5nVmFsdWU6IHAgfSA6IGEgPT09IFwibnVtYmVyXCIgPyBOdW1iZXIuaXNJbnRlZ2VyKHApID8geyBpbnRWYWx1ZTogcCB9IDogeyBkb3VibGVWYWx1ZTogcCB9IDogYSA9PT0gXCJib29sZWFuXCIgPyB7IGJvb2xWYWx1ZTogcCB9IDogcCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgPyB7IGJ5dGVzVmFsdWU6IHAgfSA6IEFycmF5LmlzQXJyYXkocCkgPyB7IGFycmF5VmFsdWU6IHsgdmFsdWVzOiBwLm1hcCh0b0FueVZhbHVlKSB9IH0gOiBhID09PSBcIm9iamVjdFwiICYmIHAgIT0gbnVsbCA/IHtcbiAgICBrdmxpc3RWYWx1ZToge1xuICAgICAgdmFsdWVzOiBPYmplY3QuZW50cmllcyhwKS5tYXAoZnVuY3Rpb24ocykge1xuICAgICAgICB2YXIgbCA9IF9fcmVhZCQzKHMsIDIpLCB1ID0gbFswXSwgZiA9IGxbMV07XG4gICAgICAgIHJldHVybiB0b0tleVZhbHVlKHUsIGYpO1xuICAgICAgfSlcbiAgICB9XG4gIH0gOiB7fTtcbn1cbnZhciBfX3ZhbHVlcyA9IGZ1bmN0aW9uKHApIHtcbiAgdmFyIGEgPSB0eXBlb2YgU3ltYm9sID09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIHMgPSBhICYmIHBbYV0sIGwgPSAwO1xuICBpZiAocykgcmV0dXJuIHMuY2FsbChwKTtcbiAgaWYgKHAgJiYgdHlwZW9mIHAubGVuZ3RoID09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgbmV4dDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gcCAmJiBsID49IHAubGVuZ3RoICYmIChwID0gdm9pZCAwKSwgeyB2YWx1ZTogcCAmJiBwW2wrK10sIGRvbmU6ICFwIH07XG4gICAgfVxuICB9O1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGEgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59LCBfX3JlYWQkMiA9IGZ1bmN0aW9uKHAsIGEpIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09IFwiZnVuY3Rpb25cIiAmJiBwW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghcykgcmV0dXJuIHA7XG4gIHZhciBsID0gcy5jYWxsKHApLCB1LCBmID0gW10sIGQ7XG4gIHRyeSB7XG4gICAgZm9yICg7IChhID09PSB2b2lkIDAgfHwgYS0tID4gMCkgJiYgISh1ID0gbC5uZXh0KCkpLmRvbmU7ICkgZi5wdXNoKHUudmFsdWUpO1xuICB9IGNhdGNoICh5KSB7XG4gICAgZCA9IHsgZXJyb3I6IHkgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgdSAmJiAhdS5kb25lICYmIChzID0gbC5yZXR1cm4pICYmIHMuY2FsbChsKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGQpIHRocm93IGQuZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBmO1xufTtcbmZ1bmN0aW9uIHNka1NwYW5Ub090bHBTcGFuKHAsIGEpIHtcbiAgdmFyIHMsIGwgPSBwLnNwYW5Db250ZXh0KCksIHUgPSBwLnN0YXR1cztcbiAgcmV0dXJuIHtcbiAgICB0cmFjZUlkOiBhLmVuY29kZVNwYW5Db250ZXh0KGwudHJhY2VJZCksXG4gICAgc3BhbklkOiBhLmVuY29kZVNwYW5Db250ZXh0KGwuc3BhbklkKSxcbiAgICBwYXJlbnRTcGFuSWQ6IGEuZW5jb2RlT3B0aW9uYWxTcGFuQ29udGV4dChwLnBhcmVudFNwYW5JZCksXG4gICAgdHJhY2VTdGF0ZTogKHMgPSBsLnRyYWNlU3RhdGUpID09PSBudWxsIHx8IHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHMuc2VyaWFsaXplKCksXG4gICAgbmFtZTogcC5uYW1lLFxuICAgIC8vIFNwYW4ga2luZCBpcyBvZmZzZXQgYnkgMSBiZWNhdXNlIHRoZSBBUEkgZG9lcyBub3QgZGVmaW5lIGEgdmFsdWUgZm9yIHVuc2V0XG4gICAga2luZDogcC5raW5kID09IG51bGwgPyAwIDogcC5raW5kICsgMSxcbiAgICBzdGFydFRpbWVVbml4TmFubzogYS5lbmNvZGVIclRpbWUocC5zdGFydFRpbWUpLFxuICAgIGVuZFRpbWVVbml4TmFubzogYS5lbmNvZGVIclRpbWUocC5lbmRUaW1lKSxcbiAgICBhdHRyaWJ1dGVzOiB0b0F0dHJpYnV0ZXMocC5hdHRyaWJ1dGVzKSxcbiAgICBkcm9wcGVkQXR0cmlidXRlc0NvdW50OiBwLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQsXG4gICAgZXZlbnRzOiBwLmV2ZW50cy5tYXAoZnVuY3Rpb24oZikge1xuICAgICAgcmV0dXJuIHRvT3RscFNwYW5FdmVudChmLCBhKTtcbiAgICB9KSxcbiAgICBkcm9wcGVkRXZlbnRzQ291bnQ6IHAuZHJvcHBlZEV2ZW50c0NvdW50LFxuICAgIHN0YXR1czoge1xuICAgICAgLy8gQVBJIGFuZCBwcm90byBlbnVtcyBzaGFyZSB0aGUgc2FtZSB2YWx1ZXNcbiAgICAgIGNvZGU6IHUuY29kZSxcbiAgICAgIG1lc3NhZ2U6IHUubWVzc2FnZVxuICAgIH0sXG4gICAgbGlua3M6IHAubGlua3MubWFwKGZ1bmN0aW9uKGYpIHtcbiAgICAgIHJldHVybiB0b090bHBMaW5rKGYsIGEpO1xuICAgIH0pLFxuICAgIGRyb3BwZWRMaW5rc0NvdW50OiBwLmRyb3BwZWRMaW5rc0NvdW50XG4gIH07XG59XG5mdW5jdGlvbiB0b090bHBMaW5rKHAsIGEpIHtcbiAgdmFyIHM7XG4gIHJldHVybiB7XG4gICAgYXR0cmlidXRlczogcC5hdHRyaWJ1dGVzID8gdG9BdHRyaWJ1dGVzKHAuYXR0cmlidXRlcykgOiBbXSxcbiAgICBzcGFuSWQ6IGEuZW5jb2RlU3BhbkNvbnRleHQocC5jb250ZXh0LnNwYW5JZCksXG4gICAgdHJhY2VJZDogYS5lbmNvZGVTcGFuQ29udGV4dChwLmNvbnRleHQudHJhY2VJZCksXG4gICAgdHJhY2VTdGF0ZTogKHMgPSBwLmNvbnRleHQudHJhY2VTdGF0ZSkgPT09IG51bGwgfHwgcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogcy5zZXJpYWxpemUoKSxcbiAgICBkcm9wcGVkQXR0cmlidXRlc0NvdW50OiBwLmRyb3BwZWRBdHRyaWJ1dGVzQ291bnQgfHwgMFxuICB9O1xufVxuZnVuY3Rpb24gdG9PdGxwU3BhbkV2ZW50KHAsIGEpIHtcbiAgcmV0dXJuIHtcbiAgICBhdHRyaWJ1dGVzOiBwLmF0dHJpYnV0ZXMgPyB0b0F0dHJpYnV0ZXMocC5hdHRyaWJ1dGVzKSA6IFtdLFxuICAgIG5hbWU6IHAubmFtZSxcbiAgICB0aW1lVW5peE5hbm86IGEuZW5jb2RlSHJUaW1lKHAudGltZSksXG4gICAgZHJvcHBlZEF0dHJpYnV0ZXNDb3VudDogcC5kcm9wcGVkQXR0cmlidXRlc0NvdW50IHx8IDBcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUV4cG9ydFRyYWNlU2VydmljZVJlcXVlc3QocCwgYSkge1xuICB2YXIgcyA9IGdldE90bHBFbmNvZGVyKCk7XG4gIHJldHVybiB7XG4gICAgcmVzb3VyY2VTcGFuczogc3BhblJlY29yZHNUb1Jlc291cmNlU3BhbnMocCwgcylcbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlc291cmNlTWFwKHApIHtcbiAgdmFyIGEsIHMsIGwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICB0cnkge1xuICAgIGZvciAodmFyIHUgPSBfX3ZhbHVlcyhwKSwgZiA9IHUubmV4dCgpOyAhZi5kb25lOyBmID0gdS5uZXh0KCkpIHtcbiAgICAgIHZhciBkID0gZi52YWx1ZSwgeSA9IGwuZ2V0KGQucmVzb3VyY2UpO1xuICAgICAgeSB8fCAoeSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGwuc2V0KGQucmVzb3VyY2UsIHkpKTtcbiAgICAgIHZhciBoID0gZC5pbnN0cnVtZW50YXRpb25MaWJyYXJ5Lm5hbWUgKyBcIkBcIiArIChkLmluc3RydW1lbnRhdGlvbkxpYnJhcnkudmVyc2lvbiB8fCBcIlwiKSArIFwiOlwiICsgKGQuaW5zdHJ1bWVudGF0aW9uTGlicmFyeS5zY2hlbWFVcmwgfHwgXCJcIiksIG8gPSB5LmdldChoKTtcbiAgICAgIG8gfHwgKG8gPSBbXSwgeS5zZXQoaCwgbykpLCBvLnB1c2goZCk7XG4gICAgfVxuICB9IGNhdGNoIChpKSB7XG4gICAgYSA9IHsgZXJyb3I6IGkgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgZiAmJiAhZi5kb25lICYmIChzID0gdS5yZXR1cm4pICYmIHMuY2FsbCh1KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGEpIHRocm93IGEuZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBsO1xufVxuZnVuY3Rpb24gc3BhblJlY29yZHNUb1Jlc291cmNlU3BhbnMocCwgYSkge1xuICBmb3IgKHZhciBzID0gY3JlYXRlUmVzb3VyY2VNYXAocCksIGwgPSBbXSwgdSA9IHMuZW50cmllcygpLCBmID0gdS5uZXh0KCk7ICFmLmRvbmU7ICkge1xuICAgIGZvciAodmFyIGQgPSBfX3JlYWQkMihmLnZhbHVlLCAyKSwgeSA9IGRbMF0sIGggPSBkWzFdLCBvID0gW10sIGkgPSBoLnZhbHVlcygpLCBlID0gaS5uZXh0KCk7ICFlLmRvbmU7ICkge1xuICAgICAgdmFyIHQgPSBlLnZhbHVlO1xuICAgICAgaWYgKHQubGVuZ3RoID4gMCkge1xuICAgICAgICB2YXIgbiA9IHQubWFwKGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICByZXR1cm4gc2RrU3BhblRvT3RscFNwYW4oYywgYSk7XG4gICAgICAgIH0pO1xuICAgICAgICBvLnB1c2goe1xuICAgICAgICAgIHNjb3BlOiBjcmVhdGVJbnN0cnVtZW50YXRpb25TY29wZSh0WzBdLmluc3RydW1lbnRhdGlvbkxpYnJhcnkpLFxuICAgICAgICAgIHNwYW5zOiBuLFxuICAgICAgICAgIHNjaGVtYVVybDogdFswXS5pbnN0cnVtZW50YXRpb25MaWJyYXJ5LnNjaGVtYVVybFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGUgPSBpLm5leHQoKTtcbiAgICB9XG4gICAgdmFyIHIgPSB7XG4gICAgICByZXNvdXJjZTogY3JlYXRlUmVzb3VyY2UoeSksXG4gICAgICBzY29wZVNwYW5zOiBvLFxuICAgICAgc2NoZW1hVXJsOiB2b2lkIDBcbiAgICB9O1xuICAgIGwucHVzaChyKSwgZiA9IHUubmV4dCgpO1xuICB9XG4gIHJldHVybiBsO1xufVxudmFyIHRyYWNlUmVzcG9uc2VUeXBlID0gcm9vdEV4cG9ydHMub3BlbnRlbGVtZXRyeS5wcm90by5jb2xsZWN0b3IudHJhY2UudjEuRXhwb3J0VHJhY2VTZXJ2aWNlUmVzcG9uc2UsIHRyYWNlUmVxdWVzdFR5cGUgPSByb290RXhwb3J0cy5vcGVudGVsZW1ldHJ5LnByb3RvLmNvbGxlY3Rvci50cmFjZS52MS5FeHBvcnRUcmFjZVNlcnZpY2VSZXF1ZXN0LCBQcm90b2J1ZlRyYWNlU2VyaWFsaXplciA9IHtcbiAgc2VyaWFsaXplUmVxdWVzdDogZnVuY3Rpb24ocCkge1xuICAgIHZhciBhID0gY3JlYXRlRXhwb3J0VHJhY2VTZXJ2aWNlUmVxdWVzdChwKTtcbiAgICByZXR1cm4gdHJhY2VSZXF1ZXN0VHlwZS5lbmNvZGUoYSkuZmluaXNoKCk7XG4gIH0sXG4gIGRlc2VyaWFsaXplUmVzcG9uc2U6IGZ1bmN0aW9uKHApIHtcbiAgICByZXR1cm4gdHJhY2VSZXNwb25zZVR5cGUuZGVjb2RlKHApO1xuICB9XG59LCBfX2F3YWl0ZXIgPSBmdW5jdGlvbihwLCBhLCBzLCBsKSB7XG4gIGZ1bmN0aW9uIHUoZikge1xuICAgIHJldHVybiBmIGluc3RhbmNlb2YgcyA/IGYgOiBuZXcgcyhmdW5jdGlvbihkKSB7XG4gICAgICBkKGYpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXcgKHMgfHwgKHMgPSBQcm9taXNlKSkoZnVuY3Rpb24oZiwgZCkge1xuICAgIGZ1bmN0aW9uIHkoaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbyhsLm5leHQoaSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkKGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoKGkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG8obC50aHJvdyhpKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGQoZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIG8oaSkge1xuICAgICAgaS5kb25lID8gZihpLnZhbHVlKSA6IHUoaS52YWx1ZSkudGhlbih5LCBoKTtcbiAgICB9XG4gICAgbygobCA9IGwuYXBwbHkocCwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn0sIF9fZ2VuZXJhdG9yID0gZnVuY3Rpb24ocCwgYSkge1xuICB2YXIgcyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkge1xuICAgIGlmIChmWzBdICYgMSkgdGhyb3cgZlsxXTtcbiAgICByZXR1cm4gZlsxXTtcbiAgfSwgdHJ5czogW10sIG9wczogW10gfSwgbCwgdSwgZiwgZDtcbiAgcmV0dXJuIGQgPSB7IG5leHQ6IHkoMCksIHRocm93OiB5KDEpLCByZXR1cm46IHkoMikgfSwgdHlwZW9mIFN5bWJvbCA9PSBcImZ1bmN0aW9uXCIgJiYgKGRbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9KSwgZDtcbiAgZnVuY3Rpb24geShvKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKGkpIHtcbiAgICAgIHJldHVybiBoKFtvLCBpXSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBoKG8pIHtcbiAgICBpZiAobCkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkdlbmVyYXRvciBpcyBhbHJlYWR5IGV4ZWN1dGluZy5cIik7XG4gICAgZm9yICg7IHM7ICkgdHJ5IHtcbiAgICAgIGlmIChsID0gMSwgdSAmJiAoZiA9IG9bMF0gJiAyID8gdS5yZXR1cm4gOiBvWzBdID8gdS50aHJvdyB8fCAoKGYgPSB1LnJldHVybikgJiYgZi5jYWxsKHUpLCAwKSA6IHUubmV4dCkgJiYgIShmID0gZi5jYWxsKHUsIG9bMV0pKS5kb25lKSByZXR1cm4gZjtcbiAgICAgIHN3aXRjaCAodSA9IDAsIGYgJiYgKG8gPSBbb1swXSAmIDIsIGYudmFsdWVdKSwgb1swXSkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBmID0gbztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHJldHVybiBzLmxhYmVsKyssIHsgdmFsdWU6IG9bMV0sIGRvbmU6ICExIH07XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBzLmxhYmVsKyssIHUgPSBvWzFdLCBvID0gWzBdO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgbyA9IHMub3BzLnBvcCgpLCBzLnRyeXMucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKGYgPSBzLnRyeXMsICEoZiA9IGYubGVuZ3RoID4gMCAmJiBmW2YubGVuZ3RoIC0gMV0pICYmIChvWzBdID09PSA2IHx8IG9bMF0gPT09IDIpKSB7XG4gICAgICAgICAgICBzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob1swXSA9PT0gMyAmJiAoIWYgfHwgb1sxXSA+IGZbMF0gJiYgb1sxXSA8IGZbM10pKSB7XG4gICAgICAgICAgICBzLmxhYmVsID0gb1sxXTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob1swXSA9PT0gNiAmJiBzLmxhYmVsIDwgZlsxXSkge1xuICAgICAgICAgICAgcy5sYWJlbCA9IGZbMV0sIGYgPSBvO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmICYmIHMubGFiZWwgPCBmWzJdKSB7XG4gICAgICAgICAgICBzLmxhYmVsID0gZlsyXSwgcy5vcHMucHVzaChvKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmWzJdICYmIHMub3BzLnBvcCgpLCBzLnRyeXMucG9wKCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBvID0gYS5jYWxsKHAsIHMpO1xuICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgIG8gPSBbNiwgaV0sIHUgPSAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBsID0gZiA9IDA7XG4gICAgfVxuICAgIGlmIChvWzBdICYgNSkgdGhyb3cgb1sxXTtcbiAgICByZXR1cm4geyB2YWx1ZTogb1swXSA/IG9bMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcbiAgfVxufSwgTUFYX0FUVEVNUFRTID0gNSwgSU5JVElBTF9CQUNLT0ZGID0gMWUzLCBNQVhfQkFDS09GRiA9IDVlMywgQkFDS09GRl9NVUxUSVBMSUVSID0gMS41LCBKSVRURVIgPSAwLjI7XG5mdW5jdGlvbiBnZXRKaXR0ZXIoKSB7XG4gIHJldHVybiBNYXRoLnJhbmRvbSgpICogKDIgKiBKSVRURVIpIC0gSklUVEVSO1xufVxudmFyIFJldHJ5aW5nVHJhbnNwb3J0ID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBwKGEpIHtcbiAgICAgIHRoaXMuX3RyYW5zcG9ydCA9IGE7XG4gICAgfVxuICAgIHJldHVybiBwLnByb3RvdHlwZS5yZXRyeSA9IGZ1bmN0aW9uKGEsIHMsIGwpIHtcbiAgICAgIHZhciB1ID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihmLCBkKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdS5fdHJhbnNwb3J0LnNlbmQoYSwgcykudGhlbihmLCBkKTtcbiAgICAgICAgfSwgbCk7XG4gICAgICB9KTtcbiAgICB9LCBwLnByb3RvdHlwZS5zZW5kID0gZnVuY3Rpb24oYSwgcykge1xuICAgICAgdmFyIGw7XG4gICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHUsIGYsIGQsIHksIGgsIG8sIGk7XG4gICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgc3dpdGNoIChlLmxhYmVsKSB7XG4gICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgIHJldHVybiB1ID0gRGF0ZS5ub3coKSArIHMsIFs0LCB0aGlzLl90cmFuc3BvcnQuc2VuZChhLCBzKV07XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBlLnNlbnQoKSwgZCA9IE1BWF9BVFRFTVBUUywgeSA9IElOSVRJQUxfQkFDS09GRiwgZS5sYWJlbCA9IDI7XG4gICAgICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICAgIHJldHVybiBmLnN0YXR1cyA9PT0gXCJyZXRyeWFibGVcIiAmJiBkID4gMCA/IChkLS0sIGggPSBNYXRoLm1heChNYXRoLm1pbih5LCBNQVhfQkFDS09GRikgKyBnZXRKaXR0ZXIoKSwgMCksIHkgPSB5ICogQkFDS09GRl9NVUxUSVBMSUVSLCBvID0gKGwgPSBmLnJldHJ5SW5NaWxsaXMpICE9PSBudWxsICYmIGwgIT09IHZvaWQgMCA/IGwgOiBoLCBpID0gdSAtIERhdGUubm93KCksIG8gPiBpID8gWzIsIGZdIDogWzQsIHRoaXMucmV0cnkoYSwgaSwgbyldKSA6IFszLCA0XTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPSBlLnNlbnQoKSwgWzMsIDJdO1xuICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICByZXR1cm4gWzIsIGZdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LCBwLnByb3RvdHlwZS5zaHV0ZG93biA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zcG9ydC5zaHV0ZG93bigpO1xuICAgIH0sIHA7XG4gIH0pKClcbik7XG5mdW5jdGlvbiBjcmVhdGVSZXRyeWluZ1RyYW5zcG9ydChwKSB7XG4gIHJldHVybiBuZXcgUmV0cnlpbmdUcmFuc3BvcnQocC50cmFuc3BvcnQpO1xufVxuZnVuY3Rpb24gaXNFeHBvcnRSZXRyeWFibGUocCkge1xuICB2YXIgYSA9IFs0MjksIDUwMiwgNTAzLCA1MDRdO1xuICByZXR1cm4gYS5pbmNsdWRlcyhwKTtcbn1cbmZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlclRvTWlsbHMocCkge1xuICBpZiAocCAhPSBudWxsKSB7XG4gICAgdmFyIGEgPSBOdW1iZXIucGFyc2VJbnQocCwgMTApO1xuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGEpKVxuICAgICAgcmV0dXJuIGEgPiAwID8gYSAqIDFlMyA6IC0xO1xuICAgIHZhciBzID0gbmV3IERhdGUocCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gcyA+PSAwID8gcyA6IDA7XG4gIH1cbn1cbnZhciBfX3JlYWQkMSA9IGZ1bmN0aW9uKHAsIGEpIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09IFwiZnVuY3Rpb25cIiAmJiBwW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghcykgcmV0dXJuIHA7XG4gIHZhciBsID0gcy5jYWxsKHApLCB1LCBmID0gW10sIGQ7XG4gIHRyeSB7XG4gICAgZm9yICg7IChhID09PSB2b2lkIDAgfHwgYS0tID4gMCkgJiYgISh1ID0gbC5uZXh0KCkpLmRvbmU7ICkgZi5wdXNoKHUudmFsdWUpO1xuICB9IGNhdGNoICh5KSB7XG4gICAgZCA9IHsgZXJyb3I6IHkgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgdSAmJiAhdS5kb25lICYmIChzID0gbC5yZXR1cm4pICYmIHMuY2FsbChsKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGQpIHRocm93IGQuZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBmO1xufSwgWGhyVHJhbnNwb3J0ID0gKFxuICAvKiogQGNsYXNzICovXG4gIChmdW5jdGlvbigpIHtcbiAgICBmdW5jdGlvbiBwKGEpIHtcbiAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBhO1xuICAgIH1cbiAgICByZXR1cm4gcC5wcm90b3R5cGUuc2VuZCA9IGZ1bmN0aW9uKGEsIHMpIHtcbiAgICAgIHZhciBsID0gdGhpcztcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbih1KSB7XG4gICAgICAgIHZhciBmID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIGYudGltZW91dCA9IHMsIGYub3BlbihcIlBPU1RcIiwgbC5fcGFyYW1ldGVycy51cmwpO1xuICAgICAgICB2YXIgZCA9IGwuX3BhcmFtZXRlcnMuaGVhZGVycygpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhkKS5mb3JFYWNoKGZ1bmN0aW9uKHkpIHtcbiAgICAgICAgICB2YXIgaCA9IF9fcmVhZCQxKHksIDIpLCBvID0gaFswXSwgaSA9IGhbMV07XG4gICAgICAgICAgZi5zZXRSZXF1ZXN0SGVhZGVyKG8sIGkpO1xuICAgICAgICB9KSwgZi5vbnRpbWVvdXQgPSBmdW5jdGlvbih5KSB7XG4gICAgICAgICAgdSh7XG4gICAgICAgICAgICBzdGF0dXM6IFwiZmFpbHVyZVwiLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlhIUiByZXF1ZXN0IHRpbWVkIG91dFwiKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBmLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGYuc3RhdHVzID49IDIwMCAmJiBmLnN0YXR1cyA8PSAyOTkgPyAoci5kZWJ1ZyhcIlhIUiBzdWNjZXNzXCIpLCB1KHtcbiAgICAgICAgICAgIHN0YXR1czogXCJzdWNjZXNzXCJcbiAgICAgICAgICB9KSkgOiBmLnN0YXR1cyAmJiBpc0V4cG9ydFJldHJ5YWJsZShmLnN0YXR1cykgPyB1KHtcbiAgICAgICAgICAgIHN0YXR1czogXCJyZXRyeWFibGVcIixcbiAgICAgICAgICAgIHJldHJ5SW5NaWxsaXM6IHBhcnNlUmV0cnlBZnRlclRvTWlsbHMoZi5nZXRSZXNwb25zZUhlYWRlcihcIlJldHJ5LUFmdGVyXCIpKVxuICAgICAgICAgIH0pIDogZi5zdGF0dXMgIT09IDAgJiYgdSh7XG4gICAgICAgICAgICBzdGF0dXM6IFwiZmFpbHVyZVwiLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlhIUiByZXF1ZXN0IGZhaWxlZCB3aXRoIG5vbi1yZXRyeWFibGUgc3RhdHVzXCIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGYub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHUoe1xuICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJYSFIgcmVxdWVzdCBhYm9ydGVkXCIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGYub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHUoe1xuICAgICAgICAgICAgc3RhdHVzOiBcImZhaWx1cmVcIixcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJYSFIgcmVxdWVzdCBlcnJvcmVkXCIpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIGYuc2VuZChhKTtcbiAgICAgIH0pO1xuICAgIH0sIHAucHJvdG90eXBlLnNodXRkb3duID0gZnVuY3Rpb24oKSB7XG4gICAgfSwgcDtcbiAgfSkoKVxuKTtcbmZ1bmN0aW9uIGNyZWF0ZVhoclRyYW5zcG9ydChwKSB7XG4gIHJldHVybiBuZXcgWGhyVHJhbnNwb3J0KHApO1xufVxudmFyIFNlbmRCZWFjb25UcmFuc3BvcnQgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGZ1bmN0aW9uIHAoYSkge1xuICAgICAgdGhpcy5fcGFyYW1zID0gYTtcbiAgICB9XG4gICAgcmV0dXJuIHAucHJvdG90eXBlLnNlbmQgPSBmdW5jdGlvbihhKSB7XG4gICAgICB2YXIgcyA9IHRoaXM7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24obCkge1xuICAgICAgICBuYXZpZ2F0b3Iuc2VuZEJlYWNvbihzLl9wYXJhbXMudXJsLCBuZXcgQmxvYihbYV0sIHsgdHlwZTogcy5fcGFyYW1zLmJsb2JUeXBlIH0pKSA/IChyLmRlYnVnKFwiU2VuZEJlYWNvbiBzdWNjZXNzXCIpLCBsKHtcbiAgICAgICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiXG4gICAgICAgIH0pKSA6IGwoe1xuICAgICAgICAgIHN0YXR1czogXCJmYWlsdXJlXCIsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlNlbmRCZWFjb24gZmFpbGVkXCIpXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSwgcC5wcm90b3R5cGUuc2h1dGRvd24gPSBmdW5jdGlvbigpIHtcbiAgICB9LCBwO1xuICB9KSgpXG4pO1xuZnVuY3Rpb24gY3JlYXRlU2VuZEJlYWNvblRyYW5zcG9ydChwKSB7XG4gIHJldHVybiBuZXcgU2VuZEJlYWNvblRyYW5zcG9ydChwKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU90bHBYaHJFeHBvcnREZWxlZ2F0ZShwLCBhKSB7XG4gIHJldHVybiBjcmVhdGVPdGxwTmV0d29ya0V4cG9ydERlbGVnYXRlKHAsIGEsIGNyZWF0ZVJldHJ5aW5nVHJhbnNwb3J0KHtcbiAgICB0cmFuc3BvcnQ6IGNyZWF0ZVhoclRyYW5zcG9ydChwKVxuICB9KSk7XG59XG5mdW5jdGlvbiBjcmVhdGVPdGxwU2VuZEJlYWNvbkV4cG9ydERlbGVnYXRlKHAsIGEpIHtcbiAgcmV0dXJuIGNyZWF0ZU90bHBOZXR3b3JrRXhwb3J0RGVsZWdhdGUocCwgYSwgY3JlYXRlUmV0cnlpbmdUcmFuc3BvcnQoe1xuICAgIHRyYW5zcG9ydDogY3JlYXRlU2VuZEJlYWNvblRyYW5zcG9ydCh7XG4gICAgICB1cmw6IHAudXJsLFxuICAgICAgYmxvYlR5cGU6IHAuaGVhZGVycygpW1wiQ29udGVudC1UeXBlXCJdXG4gICAgfSlcbiAgfSkpO1xufVxudmFyIF9fcmVhZCA9IGZ1bmN0aW9uKHAsIGEpIHtcbiAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09IFwiZnVuY3Rpb25cIiAmJiBwW1N5bWJvbC5pdGVyYXRvcl07XG4gIGlmICghcykgcmV0dXJuIHA7XG4gIHZhciBsID0gcy5jYWxsKHApLCB1LCBmID0gW10sIGQ7XG4gIHRyeSB7XG4gICAgZm9yICg7IChhID09PSB2b2lkIDAgfHwgYS0tID4gMCkgJiYgISh1ID0gbC5uZXh0KCkpLmRvbmU7ICkgZi5wdXNoKHUudmFsdWUpO1xuICB9IGNhdGNoICh5KSB7XG4gICAgZCA9IHsgZXJyb3I6IHkgfTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0cnkge1xuICAgICAgdSAmJiAhdS5kb25lICYmIChzID0gbC5yZXR1cm4pICYmIHMuY2FsbChsKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGQpIHRocm93IGQuZXJyb3I7XG4gICAgfVxuICB9XG4gIHJldHVybiBmO1xufTtcbmZ1bmN0aW9uIHZhbGlkYXRlQW5kTm9ybWFsaXplSGVhZGVycyhwKSB7XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICB2YXIgYSwgcyA9IHt9O1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcygoYSA9IHA/LigpKSAhPT0gbnVsbCAmJiBhICE9PSB2b2lkIDAgPyBhIDoge30pLmZvckVhY2goZnVuY3Rpb24obCkge1xuICAgICAgdmFyIHUgPSBfX3JlYWQobCwgMiksIGYgPSB1WzBdLCBkID0gdVsxXTtcbiAgICAgIHR5cGVvZiBkIDwgXCJ1XCIgPyBzW2ZdID0gU3RyaW5nKGQpIDogci53YXJuKCdIZWFkZXIgXCInICsgZiArICdcIiBoYXMgaW52YWxpZCB2YWx1ZSAoJyArIGQgKyBcIikgYW5kIHdpbGwgYmUgaWdub3JlZFwiKTtcbiAgICB9KSwgcztcbiAgfTtcbn1cbnZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHApIHtcbiAgICBmb3IgKHZhciBhLCBzID0gMSwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IHMgPCBsOyBzKyspIHtcbiAgICAgIGEgPSBhcmd1bWVudHNbc107XG4gICAgICBmb3IgKHZhciB1IGluIGEpIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCB1KSAmJiAocFt1XSA9IGFbdV0pO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbiAgfSwgX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn07XG5mdW5jdGlvbiBtZXJnZUhlYWRlcnMocCwgYSwgcykge1xuICB2YXIgbCA9IF9fYXNzaWduKHt9LCBzKCkpLCB1ID0ge307XG4gIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gYSAhPSBudWxsICYmIE9iamVjdC5hc3NpZ24odSwgYSgpKSwgcCAhPSBudWxsICYmIE9iamVjdC5hc3NpZ24odSwgcCgpKSwgT2JqZWN0LmFzc2lnbih1LCBsKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlVXNlclByb3ZpZGVkVXJsKHApIHtcbiAgaWYgKHAgIT0gbnVsbClcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwocCksIHA7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25maWd1cmF0aW9uOiBDb3VsZCBub3QgcGFyc2UgdXNlci1wcm92aWRlZCBleHBvcnQgVVJMOiAnXCIgKyBwICsgXCInXCIpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlT3RscEh0dHBDb25maWd1cmF0aW9uV2l0aERlZmF1bHRzKHAsIGEsIHMpIHtcbiAgdmFyIGwsIHUsIGYsIGQ7XG4gIHJldHVybiBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgbWVyZ2VPdGxwU2hhcmVkQ29uZmlndXJhdGlvbldpdGhEZWZhdWx0cyhwLCBhLCBzKSksIHsgaGVhZGVyczogbWVyZ2VIZWFkZXJzKHZhbGlkYXRlQW5kTm9ybWFsaXplSGVhZGVycyhwLmhlYWRlcnMpLCBhLmhlYWRlcnMsIHMuaGVhZGVycyksIHVybDogKHUgPSAobCA9IHZhbGlkYXRlVXNlclByb3ZpZGVkVXJsKHAudXJsKSkgIT09IG51bGwgJiYgbCAhPT0gdm9pZCAwID8gbCA6IGEudXJsKSAhPT0gbnVsbCAmJiB1ICE9PSB2b2lkIDAgPyB1IDogcy51cmwsIGFnZW50T3B0aW9uczogKGQgPSAoZiA9IHAuYWdlbnRPcHRpb25zKSAhPT0gbnVsbCAmJiBmICE9PSB2b2lkIDAgPyBmIDogYS5hZ2VudE9wdGlvbnMpICE9PSBudWxsICYmIGQgIT09IHZvaWQgMCA/IGQgOiBzLmFnZW50T3B0aW9ucyB9KTtcbn1cbmZ1bmN0aW9uIGdldEh0dHBDb25maWd1cmF0aW9uRGVmYXVsdHMocCwgYSkge1xuICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIGdldFNoYXJlZENvbmZpZ3VyYXRpb25EZWZhdWx0cygpKSwgeyBoZWFkZXJzOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gcDtcbiAgfSwgdXJsOiBcImh0dHA6Ly9sb2NhbGhvc3Q6NDMxOC9cIiArIGEsIGFnZW50T3B0aW9uczogeyBrZWVwQWxpdmU6IHRydWUgfSB9KTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRMZWdhY3lCcm93c2VySHR0cE9wdGlvbnMocCwgYSwgcykge1xuICByZXR1cm4gbWVyZ2VPdGxwSHR0cENvbmZpZ3VyYXRpb25XaXRoRGVmYXVsdHMoXG4gICAge1xuICAgICAgdXJsOiBwLnVybCxcbiAgICAgIHRpbWVvdXRNaWxsaXM6IHAudGltZW91dE1pbGxpcyxcbiAgICAgIGhlYWRlcnM6IHdyYXBTdGF0aWNIZWFkZXJzSW5GdW5jdGlvbihwLmhlYWRlcnMpLFxuICAgICAgY29uY3VycmVuY3lMaW1pdDogcC5jb25jdXJyZW5jeUxpbWl0XG4gICAgfSxcbiAgICB7fSxcbiAgICAvLyBubyBmYWxsYmFjayBmb3IgYnJvd3NlciBjYXNlXG4gICAgZ2V0SHR0cENvbmZpZ3VyYXRpb25EZWZhdWx0cyhzLCBhKVxuICApO1xufVxuZnVuY3Rpb24gY3JlYXRlTGVnYWN5T3RscEJyb3dzZXJFeHBvcnREZWxlZ2F0ZShwLCBhLCBzLCBsKSB7XG4gIHZhciB1ID0gISFwLmhlYWRlcnMgfHwgdHlwZW9mIG5hdmlnYXRvci5zZW5kQmVhY29uICE9IFwiZnVuY3Rpb25cIiwgZiA9IGNvbnZlcnRMZWdhY3lCcm93c2VySHR0cE9wdGlvbnMocCwgcywgbCk7XG4gIHJldHVybiB1ID8gY3JlYXRlT3RscFhockV4cG9ydERlbGVnYXRlKGYsIGEpIDogY3JlYXRlT3RscFNlbmRCZWFjb25FeHBvcnREZWxlZ2F0ZShmLCBhKTtcbn1cbnZhciBfX2V4dGVuZHMgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKCkge1xuICB2YXIgcCA9IGZ1bmN0aW9uKGEsIHMpIHtcbiAgICByZXR1cm4gcCA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGwsIHUpIHtcbiAgICAgIGwuX19wcm90b19fID0gdTtcbiAgICB9IHx8IGZ1bmN0aW9uKGwsIHUpIHtcbiAgICAgIGZvciAodmFyIGYgaW4gdSkgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHUsIGYpICYmIChsW2ZdID0gdVtmXSk7XG4gICAgfSwgcChhLCBzKTtcbiAgfTtcbiAgcmV0dXJuIGZ1bmN0aW9uKGEsIHMpIHtcbiAgICBpZiAodHlwZW9mIHMgIT0gXCJmdW5jdGlvblwiICYmIHMgIT09IG51bGwpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgZXh0ZW5kcyB2YWx1ZSBcIiArIFN0cmluZyhzKSArIFwiIGlzIG5vdCBhIGNvbnN0cnVjdG9yIG9yIG51bGxcIik7XG4gICAgcChhLCBzKTtcbiAgICBmdW5jdGlvbiBsKCkge1xuICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGE7XG4gICAgfVxuICAgIGEucHJvdG90eXBlID0gcyA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUocykgOiAobC5wcm90b3R5cGUgPSBzLnByb3RvdHlwZSwgbmV3IGwoKSk7XG4gIH07XG59KSgpLCBERUZBVUxUX0NPTExFQ1RPUl9SRVNPVVJDRV9QQVRIID0gXCJ2MS90cmFjZXNcIiwgT1RMUFRyYWNlRXhwb3J0ZXIgPSAoXG4gIC8qKiBAY2xhc3MgKi9cbiAgKGZ1bmN0aW9uKHApIHtcbiAgICBfX2V4dGVuZHMoYSwgcCk7XG4gICAgZnVuY3Rpb24gYShzKSB7XG4gICAgICByZXR1cm4gcyA9PT0gdm9pZCAwICYmIChzID0ge30pLCBwLmNhbGwodGhpcywgY3JlYXRlTGVnYWN5T3RscEJyb3dzZXJFeHBvcnREZWxlZ2F0ZShzLCBQcm90b2J1ZlRyYWNlU2VyaWFsaXplciwgREVGQVVMVF9DT0xMRUNUT1JfUkVTT1VSQ0VfUEFUSCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL3gtcHJvdG9idWZcIiB9KSkgfHwgdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIGE7XG4gIH0pKE9UTFBFeHBvcnRlckJhc2UpXG4pO1xuXG5leHBvcnQgeyBPVExQVHJhY2VFeHBvcnRlciB9OyJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsU0FBUztBQUNsQixTQUFTLEdBQUcsU0FBUztBQUNyQixTQUFTLFNBQVM7QUFFbEIsSUFBSTtBQUFBO0FBQUEsR0FFRCxXQUFXO0FBQ1YsYUFBU0EsRUFBRUMsR0FBRztBQUNaLFdBQUssWUFBWUE7QUFBQSxJQUNuQjtBQUNBLFdBQU9ELEVBQUUsVUFBVSxTQUFTLFNBQVNDLEdBQUdDLEdBQUc7QUFDekMsV0FBSyxVQUFVLE9BQU9ELEdBQUdDLENBQUM7QUFBQSxJQUM1QixHQUFHRixFQUFFLFVBQVUsYUFBYSxXQUFXO0FBQ3JDLGFBQU8sS0FBSyxVQUFV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Q0FBQztBQUNULHFCQUFPRCxFQUFFLGVBQWUsUUFBUUEsRUFBRSxlQUFlLGFBQWEsTUFBTUMsRUFBRSxjQUFjRCxFQUFFLGFBQWFELEVBQUUsV0FBV0UsRUFBRSxRQUFRLGlCQUFpQkQsRUFBRSxhQUFhLFFBQVFBLEVBQUUsZUFBZSxXQUFXLE1BQU1DLEVBQUUsWUFBWUQsRUFBRSxXQUFXRCxFQUFFLFdBQVdFLEVBQUUsUUFBUSxlQUFlRCxFQUFFLFlBQVksUUFBUUEsRUFBRSxlQUFlLFVBQVUsTUFBTSxPQUFPQSxFQUFFLFlBQVksV0FBV0MsRUFBRSxXQUFXRixFQUFFLFVBQVUsU0FBUyxPQUFPQyxFQUFFLFFBQVEsSUFBSUEsRUFBRSxXQUFXQyxFQUFFLFdBQVdGLEVBQUUsVUFBVSxTQUFTVixFQUFFLEtBQUssVUFBVSxTQUFTLEtBQUtXLEVBQUUsUUFBUSxJQUFJRCxFQUFFLFVBQVUsU0FBUyxJQUFJVixFQUFFLFNBQVNXLEVBQUUsU0FBUyxRQUFRLEdBQUdBLEVBQUUsU0FBUyxTQUFTLENBQUMsRUFBRSxTQUFTLElBQUlBLEVBQUUsVUFBVUQsRUFBRSxXQUFXRSxFQUFFLFFBQVEsY0FBY0QsRUFBRSxlQUFlLFFBQVFBLEVBQUUsZUFBZSxhQUFhLE1BQU1DLEVBQUUsY0FBY0YsRUFBRSxRQUFRLENBQUMsU0FBU0MsRUFBRSxXQUFXLElBQUksT0FBT0EsRUFBRSxXQUFXLElBQUlBLEVBQUUsYUFBYUQsRUFBRSxXQUFXRSxFQUFFLFFBQVEsaUJBQWlCRCxFQUFFLGNBQWMsUUFBUUEsRUFBRSxlQUFlLFlBQVksTUFBTUMsRUFBRSxhQUFhWCxFQUFFLGNBQWMsTUFBTSxPQUFPLEdBQUcsV0FBVyxTQUFTVSxFQUFFLFlBQVlELENBQUMsR0FBR0EsRUFBRSxXQUFXRSxFQUFFLFFBQVEsZ0JBQWdCRCxFQUFFLGVBQWUsUUFBUUEsRUFBRSxlQUFlLGFBQWEsTUFBTUMsRUFBRSxjQUFjWCxFQUFFLGNBQWMsTUFBTSxPQUFPLEdBQUcsYUFBYSxTQUFTVSxFQUFFLGFBQWFELENBQUMsR0FBR0EsRUFBRSxXQUFX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O0FBQ25CO0FBQUEsZ0JBQ0YsS0FBSztBQUFBLGdCQUNMLEtBQUs7QUFDSCxrQkFBQUEsRUFBRSxpQkFBaUI7QUFDbkI7QUFBQSxnQkFDRixLQUFLO0FBQUEsZ0JBQ0wsS0FBSztBQUNILGtCQUFBQSxFQUFFLGlCQUFpQjtBQUNuQjtBQUFBLGdCQUNGLEtBQUs7QUFBQSxnQkFDTCxLQUFLO0FBQ0gsa0JBQUFBLEVBQUUsaUJBQWlCO0FBQ25CO0FBQUEsZ0JBQ0YsS0FBSztBQUFBLGdCQUNMLEtBQUs7QUFDSCxrQkFBQUEsRUFBRSxpQkFBaUI7QUFDbkI7QUFBQSxnQkFDRixLQUFLO0FBQUEsZ0JBQ0wsS0FBSztBQUNILGtCQUFBQSxFQUFFLGlCQUFpQjtBQUNuQjtBQUFBLGdCQUNGLEtBQUs7QUFBQSxnQkFDTCxLQUFLO0FBQ0gsa0JBQUFBLEVBQUUsaUJBQWlCO0FBQ25CO0FBQUEsZ0JBQ0YsS0FBSztBQUFBLGdCQUNMLEtBQUs7QUFDSCxrQkFBQUEsRUFBRSxpQkFBaUI7QUFDbkI7QUFBQSxnQkFDRixLQUFLO0FBQUEsZ0JBQ0wsS0FBSztBQUNILGtCQUFBQSxFQUFFLGlCQUFpQjtBQUNuQjtBQUFBLGdCQUNGLEtBQUs7QUFBQSxnQkFDTCxLQUFLO0FBQ0gsa0JBQUFBLEVBQUUsaUJBQWlCO0FBQ25CO0FBQUEsZ0JBQ0YsS0FBSztBQUFBLGdCQUNMLEtBQUs7QUFDSCxrQkFBQUEsRUFBRSxpQkFBaUI7QUFDbkI7QUFBQSxnQkFDRixLQUFLO0FBQUEsZ0JBQ0wsS0FBSztBQUNILGtCQUFBQSxFQUFFLGlCQUFpQjtBQUNuQjtBQUFBLGdCQUNGLEtBQUs7QUFBQSxnQkFDTCxLQUFLO0FBQ0gsa0JBQUFBLEVBQUUsaUJBQWlCO0FBQ25CO0FBQUEsZ0JBQ0YsS0FBSztBQUFBLGdCQUNMLEtBQUs7QUFDSCxrQkFBQUEsRUFBRSxpQkFBaUI7QUFDbkI7QUFBQSxnQkFDRixLQUFLO0FBQUEsZ0JBQ0wsS0FBSztBQUNILGtCQUFBQSxFQUFFLGlCQUFpQjtBQUNuQjtBQUFBLGdCQUNGLEtBQUs7QUFBQSxnQkFD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