UNPKG

@getopenpay/openpay-js

Version:

Accept payments through OpenPay, right on your site

1,013 lines 182 kB
import { z as Ar, p as g, _ as X, s as Pr, l as Sr, j as Ir, q as vr, y as yr, dK as hr, h as gr, dL as mr, n as Cr, r as Nr, i as Mr, m as Ur, o as Br, t as br, u as Dr } from "./url-UQ0zRf8J.js";
import { i as G, s as Q, u as Xr } from "./suppress-tracing-BllHYdAl.js";
import { d as c } from "./diag-api-CWQhqUTV.js";
import { h as q, E as Gr } from "./ExportResult-BacsqwKA.js";
import { f as u, t as N, i as k, T as M, c as wr, b as Vr, a as K } from "./index-B_XmW797.js";
import { a as jr, bm as Hr } from "./sdk-info-ChuKu8zW.js";
var l;
(function(r) {
  r[r.NOT_RECORD = 0] = "NOT_RECORD", r[r.RECORD = 1] = "RECORD", r[r.RECORD_AND_SAMPLED = 2] = "RECORD_AND_SAMPLED";
})(l || (l = {}));
var xr = "=", U = ";", I = ",", m = "baggage", Fr = 180, Kr = 4096, Yr = 8192, zr = function(r, e) {
  var t = typeof Symbol == "function" && r[Symbol.iterator];
  if (!t) return r;
  var n = t.call(r), a, i = [], o;
  try {
    for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
  } catch (_) {
    o = { error: _ };
  } finally {
    try {
      a && !a.done && (t = n.return) && t.call(n);
    } finally {
      if (o) throw o.error;
    }
  }
  return i;
};
function rr(r) {
  return r.reduce(function(e, t) {
    var n = "" + e + (e !== "" ? I : "") + t;
    return n.length > Yr ? e : n;
  }, "");
}
function er(r) {
  return r.getAllEntries().map(function(e) {
    var t = zr(e, 2), n = t[0], a = t[1], i = encodeURIComponent(n) + "=" + encodeURIComponent(a.value);
    return a.metadata !== void 0 && (i += U + a.metadata.toString()), i;
  });
}
function w(r) {
  var e = r.split(U);
  if (!(e.length <= 0)) {
    var t = e.shift();
    if (t) {
      var n = t.indexOf(xr);
      if (!(n <= 0)) {
        var a = decodeURIComponent(t.substring(0, n).trim()), i = decodeURIComponent(t.substring(n + 1).trim()), o;
        return e.length > 0 && (o = Ar(e.join(U))), { key: a, value: i, metadata: o };
      }
    }
  }
}
function Wr(r) {
  return typeof r != "string" || r.length === 0 ? {} : r.split(I).map(function(e) {
    return w(e);
  }).filter(function(e) {
    return e !== void 0 && e.value.length > 0;
  }).reduce(function(e, t) {
    return e[t.key] = t.value, e;
  }, {});
}
var Zr = (
  /** @class */
  (function() {
    function r() {
    }
    return r.prototype.inject = function(e, t, n) {
      var a = g.getBaggage(e);
      if (!(!a || G(e))) {
        var i = er(a).filter(function(_) {
          return _.length <= Kr;
        }).slice(0, Fr), o = rr(i);
        o.length > 0 && n.set(t, m, o);
      }
    }, r.prototype.extract = function(e, t, n) {
      var a = n.get(t, m), i = Array.isArray(a) ? a.join(I) : a;
      if (!i)
        return e;
      var o = {};
      if (i.length === 0)
        return e;
      var _ = i.split(I);
      return _.forEach(function(E) {
        var T = w(E);
        if (T) {
          var s = { value: T.value };
          T.metadata && (s.metadata = T.metadata), o[T.key] = s;
        }
      }), Object.entries(o).length === 0 ? e : g.setBaggage(e, g.createBaggage(o));
    }, r.prototype.fields = function() {
      return [m];
    }, r;
  })()
), $r = (
  /** @class */
  (function() {
    function r(e, t) {
      this._monotonicClock = t, this._epochMillis = e.now(), this._performanceMillis = t.now();
    }
    return r.prototype.now = function() {
      var e = this._monotonicClock.now() - this._performanceMillis;
      return this._epochMillis + e;
    }, r;
  })()
), tr = function(r) {
  var e = typeof Symbol == "function" && Symbol.iterator, t = e && r[e], n = 0;
  if (t) return t.call(r);
  if (r && typeof r.length == "number") return {
    next: function() {
      return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
    }
  };
  throw new TypeError(e ? "Object is not iterable." : "Symbol.iterator is not defined.");
}, Jr = function(r, e) {
  var t = typeof Symbol == "function" && r[Symbol.iterator];
  if (!t) return r;
  var n = t.call(r), a, i = [], o;
  try {
    for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
  } catch (_) {
    o = { error: _ };
  } finally {
    try {
      a && !a.done && (t = n.return) && t.call(n);
    } finally {
      if (o) throw o.error;
    }
  }
  return i;
};
function Qr(r) {
  var e, t, n = {};
  if (typeof r != "object" || r == null)
    return n;
  try {
    for (var a = tr(Object.entries(r)), i = a.next(); !i.done; i = a.next()) {
      var o = Jr(i.value, 2), _ = o[0], E = o[1];
      if (!nr(_)) {
        c.warn("Invalid attribute key: " + _);
        continue;
      }
      if (!ar(E)) {
        c.warn("Invalid attribute value set for key: " + _);
        continue;
      }
      Array.isArray(E) ? n[_] = E.slice() : n[_] = E;
    }
  } catch (T) {
    e = { error: T };
  } finally {
    try {
      i && !i.done && (t = a.return) && t.call(a);
    } finally {
      if (e) throw e.error;
    }
  }
  return n;
}
function nr(r) {
  return typeof r == "string" && r.length > 0;
}
function ar(r) {
  return r == null ? !0 : Array.isArray(r) ? qr(r) : ir(r);
}
function qr(r) {
  var e, t, n;
  try {
    for (var a = tr(r), i = a.next(); !i.done; i = a.next()) {
      var o = i.value;
      if (o != null) {
        if (!n) {
          if (ir(o)) {
            n = typeof o;
            continue;
          }
          return !1;
        }
        if (typeof o !== n)
          return !1;
      }
    }
  } catch (_) {
    e = { error: _ };
  } finally {
    try {
      i && !i.done && (t = a.return) && t.call(a);
    } finally {
      if (e) throw e.error;
    }
  }
  return !0;
}
function ir(r) {
  switch (typeof r) {
    case "number":
    case "boolean":
    case "string":
      return !0;
  }
  return !1;
}
function or() {
  return function(r) {
    c.error(kr(r));
  };
}
function kr(r) {
  return typeof r == "string" ? r : JSON.stringify(re(r));
}
function re(r) {
  for (var e = {}, t = r; t !== null; )
    Object.getOwnPropertyNames(t).forEach(function(n) {
      if (!e[n]) {
        var a = t[n];
        a && (e[n] = String(a));
      }
    }), t = Object.getPrototypeOf(t);
  return e;
}
var _r = or();
function ee(r) {
  _r = r;
}
function Er(r) {
  try {
    _r(r);
  } catch {
  }
}
var v;
(function(r) {
  r.AlwaysOff = "always_off", r.AlwaysOn = "always_on", r.ParentBasedAlwaysOff = "parentbased_always_off", r.ParentBasedAlwaysOn = "parentbased_always_on", r.ParentBasedTraceIdRatio = "parentbased_traceidratio", r.TraceIdRatio = "traceidratio";
})(v || (v = {}));
var te = ",", ne = ["OTEL_SDK_DISABLED"];
function ae(r) {
  return ne.indexOf(r) > -1;
}
var ie = [
  "OTEL_BSP_EXPORT_TIMEOUT",
  "OTEL_BSP_MAX_EXPORT_BATCH_SIZE",
  "OTEL_BSP_MAX_QUEUE_SIZE",
  "OTEL_BSP_SCHEDULE_DELAY",
  "OTEL_BLRP_EXPORT_TIMEOUT",
  "OTEL_BLRP_MAX_EXPORT_BATCH_SIZE",
  "OTEL_BLRP_MAX_QUEUE_SIZE",
  "OTEL_BLRP_SCHEDULE_DELAY",
  "OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT",
  "OTEL_ATTRIBUTE_COUNT_LIMIT",
  "OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT",
  "OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT",
  "OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT",
  "OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT",
  "OTEL_SPAN_EVENT_COUNT_LIMIT",
  "OTEL_SPAN_LINK_COUNT_LIMIT",
  "OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT",
  "OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT",
  "OTEL_EXPORTER_OTLP_TIMEOUT",
  "OTEL_EXPORTER_OTLP_TRACES_TIMEOUT",
  "OTEL_EXPORTER_OTLP_METRICS_TIMEOUT",
  "OTEL_EXPORTER_OTLP_LOGS_TIMEOUT",
  "OTEL_EXPORTER_JAEGER_AGENT_PORT"
];
function oe(r) {
  return ie.indexOf(r) > -1;
}
var _e = [
  "OTEL_NO_PATCH_MODULES",
  "OTEL_PROPAGATORS",
  "OTEL_SEMCONV_STABILITY_OPT_IN"
];
function Ee(r) {
  return _e.indexOf(r) > -1;
}
var p = 1 / 0, d = 128, Tr = 128, ur = 128, V = {
  OTEL_SDK_DISABLED: !1,
  CONTAINER_NAME: "",
  ECS_CONTAINER_METADATA_URI_V4: "",
  ECS_CONTAINER_METADATA_URI: "",
  HOSTNAME: "",
  KUBERNETES_SERVICE_HOST: "",
  NAMESPACE: "",
  OTEL_BSP_EXPORT_TIMEOUT: 3e4,
  OTEL_BSP_MAX_EXPORT_BATCH_SIZE: 512,
  OTEL_BSP_MAX_QUEUE_SIZE: 2048,
  OTEL_BSP_SCHEDULE_DELAY: 5e3,
  OTEL_BLRP_EXPORT_TIMEOUT: 3e4,
  OTEL_BLRP_MAX_EXPORT_BATCH_SIZE: 512,
  OTEL_BLRP_MAX_QUEUE_SIZE: 2048,
  OTEL_BLRP_SCHEDULE_DELAY: 5e3,
  OTEL_EXPORTER_JAEGER_AGENT_HOST: "",
  OTEL_EXPORTER_JAEGER_AGENT_PORT: 6832,
  OTEL_EXPORTER_JAEGER_ENDPOINT: "",
  OTEL_EXPORTER_JAEGER_PASSWORD: "",
  OTEL_EXPORTER_JAEGER_USER: "",
  OTEL_EXPORTER_OTLP_ENDPOINT: "",
  OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: "",
  OTEL_EXPORTER_OTLP_METRICS_ENDPOINT: "",
  OTEL_EXPORTER_OTLP_LOGS_ENDPOINT: "",
  OTEL_EXPORTER_OTLP_HEADERS: "",
  OTEL_EXPORTER_OTLP_TRACES_HEADERS: "",
  OTEL_EXPORTER_OTLP_METRICS_HEADERS: "",
  OTEL_EXPORTER_OTLP_LOGS_HEADERS: "",
  OTEL_EXPORTER_OTLP_TIMEOUT: 1e4,
  OTEL_EXPORTER_OTLP_TRACES_TIMEOUT: 1e4,
  OTEL_EXPORTER_OTLP_METRICS_TIMEOUT: 1e4,
  OTEL_EXPORTER_OTLP_LOGS_TIMEOUT: 1e4,
  OTEL_EXPORTER_ZIPKIN_ENDPOINT: "http://localhost:9411/api/v2/spans",
  OTEL_LOG_LEVEL: u.INFO,
  OTEL_NO_PATCH_MODULES: [],
  OTEL_PROPAGATORS: ["tracecontext", "baggage"],
  OTEL_RESOURCE_ATTRIBUTES: "",
  OTEL_SERVICE_NAME: "",
  OTEL_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
  OTEL_ATTRIBUTE_COUNT_LIMIT: d,
  OTEL_SPAN_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
  OTEL_SPAN_ATTRIBUTE_COUNT_LIMIT: d,
  OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
  OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT: d,
  OTEL_SPAN_EVENT_COUNT_LIMIT: 128,
  OTEL_SPAN_LINK_COUNT_LIMIT: 128,
  OTEL_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: Tr,
  OTEL_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: ur,
  OTEL_TRACES_EXPORTER: "",
  OTEL_TRACES_SAMPLER: v.ParentBasedAlwaysOn,
  OTEL_TRACES_SAMPLER_ARG: "",
  OTEL_LOGS_EXPORTER: "",
  OTEL_EXPORTER_OTLP_INSECURE: "",
  OTEL_EXPORTER_OTLP_TRACES_INSECURE: "",
  OTEL_EXPORTER_OTLP_METRICS_INSECURE: "",
  OTEL_EXPORTER_OTLP_LOGS_INSECURE: "",
  OTEL_EXPORTER_OTLP_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_METRICS_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_LOGS_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_COMPRESSION: "",
  OTEL_EXPORTER_OTLP_TRACES_COMPRESSION: "",
  OTEL_EXPORTER_OTLP_METRICS_COMPRESSION: "",
  OTEL_EXPORTER_OTLP_LOGS_COMPRESSION: "",
  OTEL_EXPORTER_OTLP_CLIENT_KEY: "",
  OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY: "",
  OTEL_EXPORTER_OTLP_METRICS_CLIENT_KEY: "",
  OTEL_EXPORTER_OTLP_LOGS_CLIENT_KEY: "",
  OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_METRICS_CLIENT_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_LOGS_CLIENT_CERTIFICATE: "",
  OTEL_EXPORTER_OTLP_PROTOCOL: "http/protobuf",
  OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: "http/protobuf",
  OTEL_EXPORTER_OTLP_METRICS_PROTOCOL: "http/protobuf",
  OTEL_EXPORTER_OTLP_LOGS_PROTOCOL: "http/protobuf",
  OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: "cumulative",
  OTEL_SEMCONV_STABILITY_OPT_IN: []
};
function Te(r, e, t) {
  if (!(typeof t[r] > "u")) {
    var n = String(t[r]);
    e[r] = n.toLowerCase() === "true";
  }
}
function ue(r, e, t, n, a) {
  if (n === void 0 && (n = -1 / 0), a === void 0 && (a = 1 / 0), typeof t[r] < "u") {
    var i = Number(t[r]);
    isNaN(i) || (i < n ? e[r] = n : i > a ? e[r] = a : e[r] = i);
  }
}
function fe(r, e, t, n) {
  n === void 0 && (n = te);
  var a = t[r];
  typeof a == "string" && (e[r] = a.split(n).map(function(i) {
    return i.trim();
  }));
}
var se = {
  ALL: u.ALL,
  VERBOSE: u.VERBOSE,
  DEBUG: u.DEBUG,
  INFO: u.INFO,
  WARN: u.WARN,
  ERROR: u.ERROR,
  NONE: u.NONE
};
function le(r, e, t) {
  var n = t[r];
  if (typeof n == "string") {
    var a = se[n.toUpperCase()];
    a != null && (e[r] = a);
  }
}
function j(r) {
  var e = {};
  for (var t in V) {
    var n = t;
    switch (n) {
      case "OTEL_LOG_LEVEL":
        le(n, e, r);
        break;
      default:
        if (ae(n))
          Te(n, e, r);
        else if (oe(n))
          ue(n, e, r);
        else if (Ee(n))
          fe(n, e, r);
        else {
          var a = r[n];
          typeof a < "u" && a !== null && (e[n] = String(a));
        }
    }
  }
  return e;
}
function Oe() {
  var r = j(X);
  return Object.assign({}, V, r);
}
function ce() {
  return j(X);
}
var Re = function(r, e) {
  var t = typeof Symbol == "function" && r[Symbol.iterator];
  if (!t) return r;
  var n = t.call(r), a, i = [], o;
  try {
    for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
  } catch (_) {
    o = { error: _ };
  } finally {
    try {
      a && !a.done && (t = n.return) && t.call(n);
    } finally {
      if (o) throw o.error;
    }
  }
  return i;
}, pe = function(r, e, t) {
  if (t || arguments.length === 2) for (var n = 0, a = e.length, i; n < a; n++)
    (i || !(n in e)) && (i || (i = Array.prototype.slice.call(e, 0, n)), i[n] = e[n]);
  return r.concat(i || Array.prototype.slice.call(e));
};
function de(r) {
  return btoa(String.fromCharCode.apply(String, pe([], Re(q(r)), !1)));
}
var Le = 8, Ae = 16, Pe = (
  /** @class */
  /* @__PURE__ */ (function() {
    function r() {
      this.generateTraceId = Y(Ae), this.generateSpanId = Y(Le);
    }
    return r;
  })()
), R = Array(32);
function Y(r) {
  return function() {
    for (var t = 0; t < r * 2; t++)
      R[t] = Math.floor(Math.random() * 16) + 48, R[t] >= 58 && (R[t] += 39);
    return String.fromCharCode.apply(null, R.slice(0, r * 2));
  };
}
function Se(r) {
}
var Ie = function(r) {
  var e = typeof Symbol == "function" && Symbol.iterator, t = e && r[e], n = 0;
  if (t) return t.call(r);
  if (r && typeof r.length == "number") return {
    next: function() {
      return r && n >= r.length && (r = void 0), { value: r && r[n++], done: !r };
    }
  };
  throw new TypeError(e ? "Object is not iterable." : "Symbol.iterator is not defined.");
}, ve = (
  /** @class */
  (function() {
    function r(e) {
      e === void 0 && (e = {});
      var t;
      this._propagators = (t = e.propagators) !== null && t !== void 0 ? t : [], this._fields = Array.from(new Set(this._propagators.map(function(n) {
        return typeof n.fields == "function" ? n.fields() : [];
      }).reduce(function(n, a) {
        return n.concat(a);
      }, [])));
    }
    return r.prototype.inject = function(e, t, n) {
      var a, i;
      try {
        for (var o = Ie(this._propagators), _ = o.next(); !_.done; _ = o.next()) {
          var E = _.value;
          try {
            E.inject(e, t, n);
          } catch (T) {
            c.warn("Failed to inject with " + E.constructor.name + ". Err: " + T.message);
          }
        }
      } catch (T) {
        a = { error: T };
      } finally {
        try {
          _ && !_.done && (i = o.return) && i.call(o);
        } finally {
          if (a) throw a.error;
        }
      }
    }, r.prototype.extract = function(e, t, n) {
      return this._propagators.reduce(function(a, i) {
        try {
          return i.extract(a, t, n);
        } catch (o) {
          c.warn("Failed to extract with " + i.constructor.name + ". Err: " + o.message);
        }
        return a;
      }, e);
    }, r.prototype.fields = function() {
      return this._fields.slice();
    }, r;
  })()
), B = "[_0-9a-z-*/]", ye = "[a-z]" + B + "{0,255}", he = "[a-z0-9]" + B + "{0,240}@[a-z]" + B + "{0,13}", ge = new RegExp("^(?:" + ye + "|" + he + ")$"), me = /^[ -~]{0,255}[!-~]$/, Ce = /,|=/;
function Ne(r) {
  return ge.test(r);
}
function Me(r) {
  return me.test(r) && !Ce.test(r);
}
var z = 32, Ue = 512, W = ",", Z = "=", fr = (
  /** @class */
  (function() {
    function r(e) {
      this._internalState = /* @__PURE__ */ new Map(), e && this._parse(e);
    }
    return r.prototype.set = function(e, t) {
      var n = this._clone();
      return n._internalState.has(e) && n._internalState.delete(e), n._internalState.set(e, t), n;
    }, r.prototype.unset = function(e) {
      var t = this._clone();
      return t._internalState.delete(e), t;
    }, r.prototype.get = function(e) {
      return this._internalState.get(e);
    }, r.prototype.serialize = function() {
      var e = this;
      return this._keys().reduce(function(t, n) {
        return t.push(n + Z + e.get(n)), t;
      }, []).join(W);
    }, r.prototype._parse = function(e) {
      e.length > Ue || (this._internalState = e.split(W).reverse().reduce(function(t, n) {
        var a = n.trim(), i = a.indexOf(Z);
        if (i !== -1) {
          var o = a.slice(0, i), _ = a.slice(i + 1, n.length);
          Ne(o) && Me(_) && t.set(o, _);
        }
        return t;
      }, /* @__PURE__ */ new Map()), this._internalState.size > z && (this._internalState = new Map(Array.from(this._internalState.entries()).reverse().slice(0, z))));
    }, r.prototype._keys = function() {
      return Array.from(this._internalState.keys()).reverse();
    }, r.prototype._clone = function() {
      var e = new r();
      return e._internalState = new Map(this._internalState), e;
    }, r;
  })()
), L = "traceparent", A = "tracestate", Be = "00", be = "(?!ff)[\\da-f]{2}", De = "(?![0]{32})[\\da-f]{32}", Xe = "(?![0]{16})[\\da-f]{16}", Ge = "[\\da-f]{2}", we = new RegExp("^\\s?(" + be + ")-(" + De + ")-(" + Xe + ")-(" + Ge + ")(-.*)?\\s?$");
function sr(r) {
  var e = we.exec(r);
  return !e || e[1] === "00" && e[5] ? null : {
    traceId: e[2],
    spanId: e[3],
    traceFlags: parseInt(e[4], 16)
  };
}
var Ve = (
  /** @class */
  (function() {
    function r() {
    }
    return r.prototype.inject = function(e, t, n) {
      var a = N.getSpanContext(e);
      if (!(!a || G(e) || !k(a))) {
        var i = Be + "-" + a.traceId + "-" + a.spanId + "-0" + Number(a.traceFlags || M.NONE).toString(16);
        n.set(t, L, i), a.traceState && n.set(t, A, a.traceState.serialize());
      }
    }, r.prototype.extract = function(e, t, n) {
      var a = n.get(t, L);
      if (!a)
        return e;
      var i = Array.isArray(a) ? a[0] : a;
      if (typeof i != "string")
        return e;
      var o = sr(i);
      if (!o)
        return e;
      o.isRemote = !0;
      var _ = n.get(t, A);
      if (_) {
        var E = Array.isArray(_) ? _.join(",") : _;
        o.traceState = new fr(typeof E == "string" ? E : void 0);
      }
      return N.setSpanContext(e, o);
    }, r.prototype.fields = function() {
      return [L, A];
    }, r;
  })()
), H = wr("OpenTelemetry SDK Context Key RPC_METADATA"), b;
(function(r) {
  r.HTTP = "http";
})(b || (b = {}));
function je(r, e) {
  return r.setValue(H, e);
}
function He(r) {
  return r.deleteValue(H);
}
function xe(r) {
  return r.getValue(H);
}
var D = (
  /** @class */
  (function() {
    function r() {
    }
    return r.prototype.shouldSample = function() {
      return {
        decision: l.NOT_RECORD
      };
    }, r.prototype.toString = function() {
      return "AlwaysOffSampler";
    }, r;
  })()
), P = (
  /** @class */
  (function() {
    function r() {
    }
    return r.prototype.shouldSample = function() {
      return {
        decision: l.RECORD_AND_SAMPLED
      };
    }, r.prototype.toString = function() {
      return "AlwaysOnSampler";
    }, r;
  })()
), Fe = (
  /** @class */
  (function() {
    function r(e) {
      var t, n, a, i;
      this._root = e.root, this._root || (Er(new Error("ParentBasedSampler must have a root sampler configured")), this._root = new P()), this._remoteParentSampled = (t = e.remoteParentSampled) !== null && t !== void 0 ? t : new P(), this._remoteParentNotSampled = (n = e.remoteParentNotSampled) !== null && n !== void 0 ? n : new D(), this._localParentSampled = (a = e.localParentSampled) !== null && a !== void 0 ? a : new P(), this._localParentNotSampled = (i = e.localParentNotSampled) !== null && i !== void 0 ? i : new D();
    }
    return r.prototype.shouldSample = function(e, t, n, a, i, o) {
      var _ = N.getSpanContext(e);
      return !_ || !k(_) ? this._root.shouldSample(e, t, n, a, i, o) : _.isRemote ? _.traceFlags & M.SAMPLED ? this._remoteParentSampled.shouldSample(e, t, n, a, i, o) : this._remoteParentNotSampled.shouldSample(e, t, n, a, i, o) : _.traceFlags & M.SAMPLED ? this._localParentSampled.shouldSample(e, t, n, a, i, o) : this._localParentNotSampled.shouldSample(e, t, n, a, i, o);
    }, r.prototype.toString = function() {
      return "ParentBased{root=" + this._root.toString() + ", remoteParentSampled=" + this._remoteParentSampled.toString() + ", remoteParentNotSampled=" + this._remoteParentNotSampled.toString() + ", localParentSampled=" + this._localParentSampled.toString() + ", localParentNotSampled=" + this._localParentNotSampled.toString() + "}";
    }, r;
  })()
), Ke = (
  /** @class */
  (function() {
    function r(e) {
      e === void 0 && (e = 0), this._ratio = e, this._ratio = this._normalize(e), this._upperBound = Math.floor(this._ratio * 4294967295);
    }
    return r.prototype.shouldSample = function(e, t) {
      return {
        decision: Vr(t) && this._accumulate(t) < this._upperBound ? l.RECORD_AND_SAMPLED : l.NOT_RECORD
      };
    }, r.prototype.toString = function() {
      return "TraceIdRatioBased{" + this._ratio + "}";
    }, r.prototype._normalize = function(e) {
      return typeof e != "number" || isNaN(e) ? 0 : e >= 1 ? 1 : e <= 0 ? 0 : e;
    }, r.prototype._accumulate = function(e) {
      for (var t = 0, n = 0; n < e.length / 8; n++) {
        var a = n * 8, i = parseInt(e.slice(a, a + 8), 16);
        t = (t ^ i) >>> 0;
      }
      return t;
    }, r;
  })()
), Ye = "[object Object]", ze = "[object Null]", We = "[object Undefined]", Ze = Function.prototype, lr = Ze.toString, $e = lr.call(Object), Je = Qe(Object.getPrototypeOf, Object), Or = Object.prototype, cr = Or.hasOwnProperty, f = Symbol ? Symbol.toStringTag : void 0, Rr = Or.toString;
function Qe(r, e) {
  return function(t) {
    return r(e(t));
  };
}
function $(r) {
  if (!qe(r) || ke(r) !== Ye)
    return !1;
  var e = Je(r);
  if (e === null)
    return !0;
  var t = cr.call(e, "constructor") && e.constructor;
  return typeof t == "function" && t instanceof t && lr.call(t) === $e;
}
function qe(r) {
  return r != null && typeof r == "object";
}
function ke(r) {
  return r == null ? r === void 0 ? We : ze : f && f in Object(r) ? rt(r) : et(r);
}
function rt(r) {
  var e = cr.call(r, f), t = r[f], n = !1;
  try {
    r[f] = void 0, n = !0;
  } catch {
  }
  var a = Rr.call(r);
  return n && (e ? r[f] = t : delete r[f]), a;
}
function et(r) {
  return Rr.call(r);
}
var tt = 20;
function nt() {
  for (var r = [], e = 0; e < arguments.length; e++)
    r[e] = arguments[e];
  for (var t = r.shift(), n = /* @__PURE__ */ new WeakMap(); r.length > 0; )
    t = pr(t, r.shift(), 0, n);
  return t;
}
function C(r) {
  return y(r) ? r.slice() : r;
}
function pr(r, e, t, n) {
  t === void 0 && (t = 0);
  var a;
  if (!(t > tt)) {
    if (t++, S(r) || S(e) || dr(e))
      a = C(e);
    else if (y(r)) {
      if (a = r.slice(), y(e))
        for (var i = 0, o = e.length; i < o; i++)
          a.push(C(e[i]));
      else if (O(e))
        for (var _ = Object.keys(e), i = 0, o = _.length; i < o; i++) {
          var E = _[i];
          a[E] = C(e[E]);
        }
    } else if (O(r))
      if (O(e)) {
        if (!at(r, e))
          return e;
        a = Object.assign({}, r);
        for (var _ = Object.keys(e), i = 0, o = _.length; i < o; i++) {
          var E = _[i], T = e[E];
          if (S(T))
            typeof T > "u" ? delete a[E] : a[E] = T;
          else {
            var s = a[E], h = T;
            if (J(r, E, n) || J(e, E, n))
              delete a[E];
            else {
              if (O(s) && O(h)) {
                var x = n.get(s) || [], F = n.get(h) || [];
                x.push({ obj: r, key: E }), F.push({ obj: e, key: E }), n.set(s, x), n.set(h, F);
              }
              a[E] = pr(a[E], T, t, n);
            }
          }
        }
      } else
        a = e;
    return a;
  }
}
function J(r, e, t) {
  for (var n = t.get(r[e]) || [], a = 0, i = n.length; a < i; a++) {
    var o = n[a];
    if (o.key === e && o.obj === r)
      return !0;
  }
  return !1;
}
function y(r) {
  return Array.isArray(r);
}
function dr(r) {
  return typeof r == "function";
}
function O(r) {
  return !S(r) && !y(r) && !dr(r) && typeof r == "object";
}
function S(r) {
  return typeof r == "string" || typeof r == "number" || typeof r == "boolean" || typeof r > "u" || r instanceof Date || r instanceof RegExp || r === null;
}
function at(r, e) {
  return !(!$(r) || !$(e));
}
var it = /* @__PURE__ */ (function() {
  var r = function(e, t) {
    return r = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(n, a) {
      n.__proto__ = a;
    } || function(n, a) {
      for (var i in a) Object.prototype.hasOwnProperty.call(a, i) && (n[i] = a[i]);
    }, r(e, t);
  };
  return function(e, t) {
    if (typeof t != "function" && t !== null)
      throw new TypeError("Class extends value " + String(t) + " is not a constructor or null");
    r(e, t);
    function n() {
      this.constructor = e;
    }
    e.prototype = t === null ? Object.create(t) : (n.prototype = t.prototype, new n());
  };
})(), Lr = (
  /** @class */
  (function(r) {
    it(e, r);
    function e(t) {
      var n = r.call(this, t) || this;
      return Object.setPrototypeOf(n, e.prototype), n;
    }
    return e;
  })(Error)
);
function ot(r, e) {
  var t, n = new Promise(function(i, o) {
    t = setTimeout(function() {
      o(new Lr("Operation timed out."));
    }, e);
  });
  return Promise.race([r, n]).then(function(a) {
    return clearTimeout(t), a;
  }, function(a) {
    throw clearTimeout(t), a;
  });
}
function _t(r) {
  return typeof r == "function" && typeof r.__original == "function" && typeof r.__unwrap == "function" && r.__wrapped === !0;
}
var Et = (
  /** @class */
  (function() {
    function r() {
      var e = this;
      this._promise = new Promise(function(t, n) {
        e._resolve = t, e._reject = n;
      });
    }
    return Object.defineProperty(r.prototype, "promise", {
      get: function() {
        return this._promise;
      },
      enumerable: !1,
      configurable: !0
    }), r.prototype.resolve = function(e) {
      this._resolve(e);
    }, r.prototype.reject = function(e) {
      this._reject(e);
    }, r;
  })()
), Tt = function(r, e) {
  var t = typeof Symbol == "function" && r[Symbol.iterator];
  if (!t) return r;
  var n = t.call(r), a, i = [], o;
  try {
    for (; (e === void 0 || e-- > 0) && !(a = n.next()).done; ) i.push(a.value);
  } catch (_) {
    o = { error: _ };
  } finally {
    try {
      a && !a.done && (t = n.return) && t.call(n);
    } finally {
      if (o) throw o.error;
    }
  }
  return i;
}, ut = function(r, e, t) {
  if (t || arguments.length === 2) for (var n = 0, a = e.length, i; n < a; n++)
    (i || !(n in e)) && (i || (i = Array.prototype.slice.call(e, 0, n)), i[n] = e[n]);
  return r.concat(i || Array.prototype.slice.call(e));
}, ft = (
  /** @class */
  (function() {
    function r(e, t) {
      this._callback = e, this._that = t, this._isCalled = !1, this._deferred = new Et();
    }
    return Object.defineProperty(r.prototype, "isCalled", {
      get: function() {
        return this._isCalled;
      },
      enumerable: !1,
      configurable: !0
    }), Object.defineProperty(r.prototype, "promise", {
      get: function() {
        return this._deferred.promise;
      },
      enumerable: !1,
      configurable: !0
    }), r.prototype.call = function() {
      for (var e, t = this, n = [], a = 0; a < arguments.length; a++)
        n[a] = arguments[a];
      if (!this._isCalled) {
        this._isCalled = !0;
        try {
          Promise.resolve((e = this._callback).call.apply(e, ut([this._that], Tt(n), !1))).then(function(i) {
            return t._deferred.resolve(i);
          }, function(i) {
            return t._deferred.reject(i);
          });
        } catch (i) {
          this._deferred.reject(i);
        }
      }
      return this._deferred.promise;
    }, r;
  })()
);
function st(r, e) {
  return new Promise(function(t) {
    K.with(Q(K.active()), function() {
      r.export(e, function(n) {
        t(n);
      });
    });
  });
}
var lt = {
  getKeyPairs: er,
  serializeKeyPairs: rr,
  parseKeyPairsIntoRecord: Wr,
  parsePairKeyValue: w
}, Ot = {
  _export: st
};
const Pt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  __proto__: null,
  AlwaysOffSampler: D,
  AlwaysOnSampler: P,
  AnchoredClock: $r,
  BindOnceFuture: ft,
  CompositePropagator: ve,
  DEFAULT_ATTRIBUTE_COUNT_LIMIT: d,
  DEFAULT_ATTRIBUTE_VALUE_LENGTH_LIMIT: p,
  DEFAULT_ENVIRONMENT: V,
  DEFAULT_SPAN_ATTRIBUTE_PER_EVENT_COUNT_LIMIT: Tr,
  DEFAULT_SPAN_ATTRIBUTE_PER_LINK_COUNT_LIMIT: ur,
  get ExportResultCode() {
    return Gr;
  },
  ParentBasedSampler: Fe,
  get RPCType() {
    return b;
  },
  RandomIdGenerator: Pe,
  SDK_INFO: jr,
  TRACE_PARENT_HEADER: L,
  TRACE_STATE_HEADER: A,
  TimeoutError: Lr,
  TraceIdRatioBasedSampler: Ke,
  TraceState: fr,
  get TracesSamplerValues() {
    return v;
  },
  VERSION: Hr,
  W3CBaggagePropagator: Zr,
  W3CTraceContextPropagator: Ve,
  _globalThis: X,
  addHrTimes: Pr,
  baggageUtils: lt,
  callWithTimeout: ot,
  deleteRPCMetadata: He,
  getEnv: Oe,
  getEnvWithoutDefaults: ce,
  getRPCMetadata: xe,
  getTimeOrigin: Sr,
  globalErrorHandler: Er,
  hexToBase64: de,
  hexToBinary: q,
  hrTime: Ir,
  hrTimeDuration: vr,
  hrTimeToMicroseconds: yr,
  hrTimeToMilliseconds: hr,
  hrTimeToNanoseconds: gr,
  hrTimeToTimeStamp: mr,
  internal: Ot,
  isAttributeKey: nr,
  isAttributeValue: ar,
  isTimeInput: Cr,
  isTimeInputHrTime: Nr,
  isTracingSuppressed: G,
  isUrlIgnored: Mr,
  isWrapped: _t,
  loggingErrorHandler: or,
  merge: nt,
  millisToHrTime: Ur,
  otperformance: Br,
  parseEnvironment: j,
  parseTraceParent: sr,
  sanitizeAttributes: Qr,
  setGlobalErrorHandler: ee,
  setRPCMetadata: je,
  suppressTracing: Q,
  timeInputToHrTime: br,
  unrefTimer: Se,
  unsuppressTracing: Xr,
  urlMatches: Dr
}, Symbol.toStringTag, { value: "Module" }));
export {
  ft as B,
  ve as C,
  d as D,
  l as S,
  v as T,
  Ve as W,
  Oe as a,
  ce as b,
  p as c,
  Zr as d,
  Ot as e,
  Pt as f,
  Er as g,
  ar as i,
  nt as m,
  Qr as s,
  Se as u
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiaW5kZXgtIX57MDBtfX4uanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IHogYXMgYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nLCBwIGFzIHByb3BhZ2F0aW9uLCBfIGFzIF9nbG9iYWxUaGlzLCBzIGFzIGFkZEhyVGltZXMsIGwgYXMgZ2V0VGltZU9yaWdpbiwgaiBhcyBoclRpbWUsIHEgYXMgaHJUaW1lRHVyYXRpb24sIHkgYXMgaHJUaW1lVG9NaWNyb3NlY29uZHMsIGRLIGFzIGhyVGltZVRvTWlsbGlzZWNvbmRzLCBoIGFzIGhyVGltZVRvTmFub3NlY29uZHMsIGRMIGFzIGhyVGltZVRvVGltZVN0YW1wLCBuIGFzIGlzVGltZUlucHV0LCByIGFzIGlzVGltZUlucHV0SHJUaW1lLCBpIGFzIGlzVXJsSWdub3JlZCwgbSBhcyBtaWxsaXNUb0hyVGltZSwgbyBhcyBvdHBlcmZvcm1hbmNlLCB0IGFzIHRpbWVJbnB1dFRvSHJUaW1lLCB1IGFzIHVybE1hdGNoZXMgfSBmcm9tICcuL3VybC0hfnswMGR9fi5qcyc7XG5pbXBvcnQgeyBpIGFzIGlzVHJhY2luZ1N1cHByZXNzZWQsIHMgYXMgc3VwcHJlc3NUcmFjaW5nLCB1IGFzIHVuc3VwcHJlc3NUcmFjaW5nIH0gZnJvbSAnLi9zdXBwcmVzcy10cmFjaW5nLSF+ezAwYX1+LmpzJztcbmltcG9ydCB7IGQgYXMgZGlhZyB9IGZyb20gJy4vZGlhZy1hcGktIX57MDA4fX4uanMnO1xuaW1wb3J0IHsgaCBhcyBoZXhUb0JpbmFyeSwgRSBhcyBFeHBvcnRSZXN1bHRDb2RlIH0gZnJvbSAnLi9FeHBvcnRSZXN1bHQtIX57MDBpfX4uanMnO1xuaW1wb3J0IHsgZiBhcyBEaWFnTG9nTGV2ZWwsIHQgYXMgdHJhY2UsIGkgYXMgaXNTcGFuQ29udGV4dFZhbGlkLCBUIGFzIFRyYWNlRmxhZ3MsIGMgYXMgY3JlYXRlQ29udGV4dEtleSwgYiBhcyBpc1ZhbGlkVHJhY2VJZCwgYSBhcyBjb250ZXh0IH0gZnJvbSAnLi9pbmRleC0hfnswMDl9fi5qcyc7XG5pbXBvcnQgeyBhIGFzIFNES19JTkZPLCBibSBhcyBWRVJTSU9OJDEgfSBmcm9tICcuL3Nkay1pbmZvLSF+ezAwaH1+LmpzJztcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBvbmUgZGVjbGFyZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIEEgc2FtcGxpbmcgZGVjaXNpb24gdGhhdCBkZXRlcm1pbmVzIGhvdyBhIHtAbGluayBTcGFufSB3aWxsIGJlIHJlY29yZGVkXG4gKiBhbmQgY29sbGVjdGVkLlxuICovXG52YXIgU2FtcGxpbmdEZWNpc2lvbjtcbihmdW5jdGlvbiAoU2FtcGxpbmdEZWNpc2lvbikge1xuICAgIC8qKlxuICAgICAqIGBTcGFuLmlzUmVjb3JkaW5nKCkgPT09IGZhbHNlYCwgc3BhbiB3aWxsIG5vdCBiZSByZWNvcmRlZCBhbmQgYWxsIGV2ZW50c1xuICAgICAqIGFuZCBhdHRyaWJ1dGVzIHdpbGwgYmUgZHJvcHBlZC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJOT1RfUkVDT1JEXCJdID0gMF0gPSBcIk5PVF9SRUNPUkRcIjtcbiAgICAvKipcbiAgICAgKiBgU3Bhbi5pc1JlY29yZGluZygpID09PSB0cnVlYCwgYnV0IGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgTk9UIGJlIHNldC5cbiAgICAgKi9cbiAgICBTYW1wbGluZ0RlY2lzaW9uW1NhbXBsaW5nRGVjaXNpb25bXCJSRUNPUkRcIl0gPSAxXSA9IFwiUkVDT1JEXCI7XG4gICAgLyoqXG4gICAgICogYFNwYW4uaXNSZWNvcmRpbmcoKSA9PT0gdHJ1ZWAgQU5EIGBTYW1wbGVkYCBmbGFnIGluIHtAbGluayBUcmFjZUZsYWdzfVxuICAgICAqIE1VU1QgYmUgc2V0LlxuICAgICAqL1xuICAgIFNhbXBsaW5nRGVjaXNpb25bU2FtcGxpbmdEZWNpc2lvbltcIlJFQ09SRF9BTkRfU0FNUExFRFwiXSA9IDJdID0gXCJSRUNPUkRfQU5EX1NBTVBMRURcIjtcbn0pKFNhbXBsaW5nRGVjaXNpb24gfHwgKFNhbXBsaW5nRGVjaXNpb24gPSB7fSkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SID0gJz0nO1xudmFyIEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IgPSAnOyc7XG52YXIgQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IgPSAnLCc7XG4vLyBOYW1lIG9mIHRoZSBodHRwIGhlYWRlciB1c2VkIHRvIHByb3BhZ2F0ZSB0aGUgYmFnZ2FnZVxudmFyIEJBR0dBR0VfSEVBREVSID0gJ2JhZ2dhZ2UnO1xuLy8gTWF4aW11bSBudW1iZXIgb2YgbmFtZS12YWx1ZSBwYWlycyBhbGxvd2VkIGJ5IHczYyBzcGVjXG52YXIgQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyA9IDE4MDtcbi8vIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBhIHNpbmdsZSBuYW1lLXZhbHVlIHBhaXIgYWxsb3dlZCBieSB3M2Mgc3BlY1xudmFyIEJBR0dBR0VfTUFYX1BFUl9OQU1FX1ZBTFVFX1BBSVJTID0gNDA5Njtcbi8vIE1heGltdW0gdG90YWwgbGVuZ3RoIG9mIGFsbCBuYW1lLXZhbHVlIHBhaXJzIGFsbG93ZWQgYnkgdzNjIHNwZWNcbnZhciBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPSA4MTkyO1xuXG52YXIgX19yZWFkJDMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzZXJpYWxpemVLZXlQYWlycyhrZXlQYWlycykge1xuICAgIHJldHVybiBrZXlQYWlycy5yZWR1Y2UoZnVuY3Rpb24gKGhWYWx1ZSwgY3VycmVudCkge1xuICAgICAgICB2YXIgdmFsdWUgPSBcIlwiICsgaFZhbHVlICsgKGhWYWx1ZSAhPT0gJycgPyBCQUdHQUdFX0lURU1TX1NFUEFSQVRPUiA6ICcnKSArIGN1cnJlbnQ7XG4gICAgICAgIHJldHVybiB2YWx1ZS5sZW5ndGggPiBCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEggPyBoVmFsdWUgOiB2YWx1ZTtcbiAgICB9LCAnJyk7XG59XG5mdW5jdGlvbiBnZXRLZXlQYWlycyhiYWdnYWdlKSB7XG4gICAgcmV0dXJuIGJhZ2dhZ2UuZ2V0QWxsRW50cmllcygpLm1hcChmdW5jdGlvbiAoX2EpIHtcbiAgICAgICAgdmFyIF9iID0gX19yZWFkJDMoX2EsIDIpLCBrZXkgPSBfYlswXSwgdmFsdWUgPSBfYlsxXTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZW5jb2RlVVJJQ29tcG9uZW50KGtleSkgKyBcIj1cIiArIGVuY29kZVVSSUNvbXBvbmVudCh2YWx1ZS52YWx1ZSk7XG4gICAgICAgIC8vIGluY2x1ZGUgb3BhcXVlIG1ldGFkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIC8vIE5PVEU6IHdlIGludGVudGlvbmFsbHkgZG9uJ3QgVVJJLWVuY29kZSB0aGUgbWV0YWRhdGEgLSB0aGF0IHJlc3BvbnNpYmlsaXR5IGZhbGxzIG9uIHRoZSBtZXRhZGF0YSBpbXBsZW1lbnRhdGlvblxuICAgICAgICBpZiAodmFsdWUubWV0YWRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZW50cnkgKz0gQkFHR0FHRV9QUk9QRVJUSUVTX1NFUEFSQVRPUiArIHZhbHVlLm1ldGFkYXRhLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xufVxuZnVuY3Rpb24gcGFyc2VQYWlyS2V5VmFsdWUoZW50cnkpIHtcbiAgICB2YXIgdmFsdWVQcm9wcyA9IGVudHJ5LnNwbGl0KEJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IpO1xuICAgIGlmICh2YWx1ZVByb3BzLmxlbmd0aCA8PSAwKVxuICAgICAgICByZXR1cm47XG4gICAgdmFyIGtleVBhaXJQYXJ0ID0gdmFsdWVQcm9wcy5zaGlmdCgpO1xuICAgIGlmICgha2V5UGFpclBhcnQpXG4gICAgICAgIHJldHVybjtcbiAgICB2YXIgc2VwYXJhdG9ySW5kZXggPSBrZXlQYWlyUGFydC5pbmRleE9mKEJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySW5kZXggPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgIHZhciBrZXkgPSBkZWNvZGVVUklDb21wb25lbnQoa2V5UGFpclBhcnQuc3Vic3RyaW5nKDAsIHNlcGFyYXRvckluZGV4KS50cmltKCkpO1xuICAgIHZhciB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudChrZXlQYWlyUGFydC5zdWJzdHJpbmcoc2VwYXJhdG9ySW5kZXggKyAxKS50cmltKCkpO1xuICAgIHZhciBtZXRhZGF0YTtcbiAgICBpZiAodmFsdWVQcm9wcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG1ldGFkYXRhID0gYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nKHZhbHVlUHJvcHMuam9pbihCQUdHQUdFX1BST1BFUlRJRVNfU0VQQVJBVE9SKSk7XG4gICAgfVxuICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogdmFsdWUsIG1ldGFkYXRhOiBtZXRhZGF0YSB9O1xufVxuLyoqXG4gKiBQYXJzZSBhIHN0cmluZyBzZXJpYWxpemVkIGluIHRoZSBiYWdnYWdlIEhUVFAgRm9ybWF0ICh3aXRob3V0IG1ldGFkYXRhKTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvYmFnZ2FnZS9ibG9iL21hc3Rlci9iYWdnYWdlL0hUVFBfSEVBREVSX0ZPUk1BVC5tZFxuICovXG5mdW5jdGlvbiBwYXJzZUtleVBhaXJzSW50b1JlY29yZCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpXG4gICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudHJ5KSB7XG4gICAgICAgIHJldHVybiBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoa2V5UGFpcikgeyByZXR1cm4ga2V5UGFpciAhPT0gdW5kZWZpbmVkICYmIGtleVBhaXIudmFsdWUubGVuZ3RoID4gMDsgfSlcbiAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoaGVhZGVycywga2V5UGFpcikge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBoZWFkZXJzW2tleVBhaXIua2V5XSA9IGtleVBhaXIudmFsdWU7XG4gICAgICAgIHJldHVybiBoZWFkZXJzO1xuICAgIH0sIHt9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogUHJvcGFnYXRlcyB7QGxpbmsgQmFnZ2FnZX0gdGhyb3VnaCBDb250ZXh0IGZvcm1hdCBwcm9wYWdhdGlvbi5cbiAqXG4gKiBCYXNlZCBvbiB0aGUgQmFnZ2FnZSBzcGVjaWZpY2F0aW9uOlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL2JhZ2dhZ2UvXG4gKi9cbnZhciBXM0NCYWdnYWdlUHJvcGFnYXRvciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBXM0NCYWdnYWdlUHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDQmFnZ2FnZVByb3BhZ2F0b3IucHJvdG90eXBlLmluamVjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpIHtcbiAgICAgICAgdmFyIGJhZ2dhZ2UgPSBwcm9wYWdhdGlvbi5nZXRCYWdnYWdlKGNvbnRleHQpO1xuICAgICAgICBpZiAoIWJhZ2dhZ2UgfHwgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdmFyIGtleVBhaXJzID0gZ2V0S2V5UGFpcnMoYmFnZ2FnZSlcbiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHBhaXIpIHtcbiAgICAgICAgICAgIHJldHVybiBwYWlyLmxlbmd0aCA8PSBCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUztcbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5zbGljZSgwLCBCQUdHQUdFX01BWF9OQU1FX1ZBTFVFX1BBSVJTKTtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gc2VyaWFsaXplS2V5UGFpcnMoa2V5UGFpcnMpO1xuICAgICAgICBpZiAoaGVhZGVyVmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgc2V0dGVyLnNldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUiwgaGVhZGVyVmFsdWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBXM0NCYWdnYWdlUHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIGhlYWRlclZhbHVlID0gZ2V0dGVyLmdldChjYXJyaWVyLCBCQUdHQUdFX0hFQURFUik7XG4gICAgICAgIHZhciBiYWdnYWdlU3RyaW5nID0gQXJyYXkuaXNBcnJheShoZWFkZXJWYWx1ZSlcbiAgICAgICAgICAgID8gaGVhZGVyVmFsdWUuam9pbihCQUdHQUdFX0lURU1TX1NFUEFSQVRPUilcbiAgICAgICAgICAgIDogaGVhZGVyVmFsdWU7XG4gICAgICAgIGlmICghYmFnZ2FnZVN0cmluZylcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgYmFnZ2FnZSA9IHt9O1xuICAgICAgICBpZiAoYmFnZ2FnZVN0cmluZy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHZhciBwYWlycyA9IGJhZ2dhZ2VTdHJpbmcuc3BsaXQoQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IpO1xuICAgICAgICBwYWlycy5mb3JFYWNoKGZ1bmN0aW9uIChlbnRyeSkge1xuICAgICAgICAgICAgdmFyIGtleVBhaXIgPSBwYXJzZVBhaXJLZXlWYWx1ZShlbnRyeSk7XG4gICAgICAgICAgICBpZiAoa2V5UGFpcikge1xuICAgICAgICAgICAgICAgIHZhciBiYWdnYWdlRW50cnkgPSB7IHZhbHVlOiBrZXlQYWlyLnZhbHVlIH07XG4gICAgICAgICAgICAgICAgaWYgKGtleVBhaXIubWV0YWRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgYmFnZ2FnZUVudHJ5Lm1ldGFkYXRhID0ga2V5UGFpci5tZXRhZGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYmFnZ2FnZVtrZXlQYWlyLmtleV0gPSBiYWdnYWdlRW50cnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoT2JqZWN0LmVudHJpZXMoYmFnZ2FnZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcGFnYXRpb24uc2V0QmFnZ2FnZShjb250ZXh0LCBwcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKGJhZ2dhZ2UpKTtcbiAgICB9O1xuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbQkFHR0FHRV9IRUFERVJdO1xuICAgIH07XG4gICAgcmV0dXJuIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQSB1dGlsaXR5IGZvciByZXR1cm5pbmcgd2FsbCB0aW1lcyBhbmNob3JlZCB0byBhIGdpdmVuIHBvaW50IGluIHRpbWUuIFdhbGwgdGltZSBtZWFzdXJlbWVudHMgd2lsbFxuICogbm90IGJlIHRha2VuIGZyb20gdGhlIHN5c3RlbSwgYnV0IGluc3RlYWQgYXJlIGNvbXB1dGVkIGJ5IGFkZGluZyBhIG1vbm90b25pYyBjbG9jayB0aW1lXG4gKiB0byB0aGUgYW5jaG9yIHBvaW50LlxuICpcbiAqIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN5c3RlbSB0aW1lIGNhbiBjaGFuZ2UgYW5kIHJlc3VsdCBpbiB1bmV4cGVjdGVkIHNpdHVhdGlvbnMgbGlrZVxuICogc3BhbnMgZW5kaW5nIGJlZm9yZSB0aGV5IGFyZSBzdGFydGVkLiBDcmVhdGluZyBhbiBhbmNob3JlZCBjbG9jayBmb3IgZWFjaCBsb2NhbCByb290IHNwYW5cbiAqIGVuc3VyZXMgdGhhdCBzcGFuIHRpbWluZ3MgYW5kIGR1cmF0aW9ucyBhcmUgYWNjdXJhdGUgd2hpbGUgcHJldmVudGluZyBzcGFuIHRpbWVzIGZyb20gZHJpZnRpbmdcbiAqIHRvbyBmYXIgZnJvbSB0aGUgc3lzdGVtIGNsb2NrLlxuICpcbiAqIE9ubHkgY3JlYXRpbmcgYW4gYW5jaG9yZWQgY2xvY2sgb25jZSBwZXIgbG9jYWwgdHJhY2UgZW5zdXJlcyBzcGFuIHRpbWVzIGFyZSBjb3JyZWN0IHJlbGF0aXZlXG4gKiB0byBlYWNoIG90aGVyLiBGb3IgZXhhbXBsZSwgYSBjaGlsZCBzcGFuIHdpbGwgbmV2ZXIgaGF2ZSBhIHN0YXJ0IHRpbWUgYmVmb3JlIGl0cyBwYXJlbnQgZXZlblxuICogaWYgdGhlIHN5c3RlbSBjbG9jayBpcyBjb3JyZWN0ZWQgZHVyaW5nIHRoZSBsb2NhbCB0cmFjZS5cbiAqXG4gKiBIZWF2aWx5IGluc3BpcmVkIGJ5IHRoZSBPVGVsIEphdmEgYW5jaG9yZWQgY2xvY2tcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWphdmEvYmxvYi9tYWluL3Nkay90cmFjZS9zcmMvbWFpbi9qYXZhL2lvL29wZW50ZWxlbWV0cnkvc2RrL3RyYWNlL0FuY2hvcmVkQ2xvY2suamF2YVxuICovXG52YXIgQW5jaG9yZWRDbG9jayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgQW5jaG9yZWRDbG9jayBhbmNob3JlZCB0byB0aGUgY3VycmVudCB0aW1lIHJldHVybmVkIGJ5IHN5c3RlbUNsb2NrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN5c3RlbUNsb2NrIHNob3VsZCBiZSBhIGNsb2NrIHRoYXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSBKYW51YXJ5IDEgMTk3MCBzdWNoIGFzIERhdGVcbiAgICAgKiBAcGFyYW0gbW9ub3RvbmljQ2xvY2sgc2hvdWxkIGJlIGEgY2xvY2sgdGhhdCBjb3VudHMgbWlsbGlzZWNvbmRzIG1vbm90b25pY2FsbHkgc3VjaCBhcyB3aW5kb3cucGVyZm9ybWFuY2Ugb3IgcGVyZl9ob29rcy5wZXJmb3JtYW5jZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIEFuY2hvcmVkQ2xvY2soc3lzdGVtQ2xvY2ssIG1vbm90b25pY0Nsb2NrKSB7XG4gICAgICAgIHRoaXMuX21vbm90b25pY0Nsb2NrID0gbW9ub3RvbmljQ2xvY2s7XG4gICAgICAgIHRoaXMuX2Vwb2NoTWlsbGlzID0gc3lzdGVtQ2xvY2subm93KCk7XG4gICAgICAgIHRoaXMuX3BlcmZvcm1hbmNlTWlsbGlzID0gbW9ub3RvbmljQ2xvY2subm93KCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGltZSBieSBhZGRpbmcgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgdGhlXG4gICAgICogQW5jaG9yZWRDbG9jayB3YXMgY3JlYXRlZCB0byB0aGUgY3JlYXRpb24gZXBvY2ggdGltZVxuICAgICAqL1xuICAgIEFuY2hvcmVkQ2xvY2sucHJvdG90eXBlLm5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRlbHRhID0gdGhpcy5fbW9ub3RvbmljQ2xvY2subm93KCkgLSB0aGlzLl9wZXJmb3JtYW5jZU1pbGxpcztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vwb2NoTWlsbGlzICsgZGVsdGE7XG4gICAgfTtcbiAgICByZXR1cm4gQW5jaG9yZWRDbG9jaztcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fdmFsdWVzKSB8fCBmdW5jdGlvbihvKSB7XG4gICAgdmFyIHMgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLml0ZXJhdG9yLCBtID0gcyAmJiBvW3NdLCBpID0gMDtcbiAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTtcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XG4gICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChvICYmIGkgPj0gby5sZW5ndGgpIG8gPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XG4gICAgICAgIH1cbiAgICB9O1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcbn07XG52YXIgX19yZWFkJDIgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3JlYWQpIHx8IGZ1bmN0aW9uIChvLCBuKSB7XG4gICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdO1xuICAgIGlmICghbSkgcmV0dXJuIG87XG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XG4gICAgdHJ5IHtcbiAgICAgICAgd2hpbGUgKChuID09PSB2b2lkIDAgfHwgbi0tID4gMCkgJiYgIShyID0gaS5uZXh0KCkpLmRvbmUpIGFyLnB1c2goci52YWx1ZSk7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikgeyBlID0geyBlcnJvcjogZXJyb3IgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHIgJiYgIXIuZG9uZSAmJiAobSA9IGlbXCJyZXR1cm5cIl0pKSBtLmNhbGwoaSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XG4gICAgfVxuICAgIHJldHVybiBhcjtcbn07XG5mdW5jdGlvbiBzYW5pdGl6ZUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHZhciBlXzEsIF9hO1xuICAgIHZhciBvdXQgPSB7fTtcbiAgICBpZiAodHlwZW9mIGF0dHJpYnV0ZXMgIT09ICdvYmplY3QnIHx8IGF0dHJpYnV0ZXMgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBfYiA9IF9fdmFsdWVzJDEoT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlcykpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICB2YXIgX2QgPSBfX3JlYWQkMihfYy52YWx1ZSwgMiksIGtleSA9IF9kWzBdLCB2YWwgPSBfZFsxXTtcbiAgICAgICAgICAgIGlmICghaXNBdHRyaWJ1dGVLZXkoa2V5KSkge1xuICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkludmFsaWQgYXR0cmlidXRlIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc0F0dHJpYnV0ZVZhbHVlKHZhbCkpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJJbnZhbGlkIGF0dHJpYnV0ZSB2YWx1ZSBzZXQgZm9yIGtleTogXCIgKyBrZXkpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgICAgIG91dFtrZXldID0gdmFsLnNsaWNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgIGZpbmFsbHkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZV8xKSB0aHJvdyBlXzEuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlS2V5KGtleSkge1xuICAgIHJldHVybiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkubGVuZ3RoID4gMDtcbn1cbmZ1bmN0aW9uIGlzQXR0cmlidXRlVmFsdWUodmFsKSB7XG4gICAgaWYgKHZhbCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgIHJldHVybiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSh2YWwpO1xuICAgIH1cbiAgICByZXR1cm4gaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKHZhbCk7XG59XG5mdW5jdGlvbiBpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheShhcnIpIHtcbiAgICB2YXIgZV8yLCBfYTtcbiAgICB2YXIgdHlwZTtcbiAgICB0cnkge1xuICAgICAgICBmb3IgKHZhciBhcnJfMSA9IF9fdmFsdWVzJDEoYXJyKSwgYXJyXzFfMSA9IGFycl8xLm5leHQoKTsgIWFycl8xXzEuZG9uZTsgYXJyXzFfMSA9IGFycl8xLm5leHQoKSkge1xuICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBhcnJfMV8xLnZhbHVlO1xuICAgICAgICAgICAgLy8gbnVsbC91bmRlZmluZWQgZWxlbWVudHMgYXJlIGFsbG93ZWRcbiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZFByaW1pdGl2ZUF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlb2YgZWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGVuY291bnRlcmVkIGFuIGludmFsaWQgcHJpbWl0aXZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVfMl8xKSB7IGVfMiA9IHsgZXJyb3I6IGVfMl8xIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChhcnJfMV8xICYmICFhcnJfMV8xLmRvbmUgJiYgKF9hID0gYXJyXzEucmV0dXJuKSkgX2EuY2FsbChhcnJfMSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7IGlmIChlXzIpIHRocm93IGVfMi5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIGlzVmFsaWRQcmltaXRpdmVBdHRyaWJ1dGVWYWx1ZSh2YWwpIHtcbiAgICBzd2l0Y2ggKHR5cGVvZiB2YWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBsb2dzIGFuIGVycm9yIHVzaW5nIHRoZSBwcm92aWRlZCBsb2dnZXIsIG9yIGFcbiAqIGNvbnNvbGUgbG9nZ2VyIGlmIG9uZSB3YXMgbm90IHByb3ZpZGVkLlxuICovXG5mdW5jdGlvbiBsb2dnaW5nRXJyb3JIYW5kbGVyKCkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoZXgpIHtcbiAgICAgICAgZGlhZy5lcnJvcihzdHJpbmdpZnlFeGNlcHRpb24oZXgpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBhbiBleGNlcHRpb24gaW50byBhIHN0cmluZyByZXByZXNlbnRhdGlvblxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeUV4Y2VwdGlvbihleCkge1xuICAgIGlmICh0eXBlb2YgZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBleDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShmbGF0dGVuRXhjZXB0aW9uKGV4KSk7XG4gICAgfVxufVxuLyoqXG4gKiBGbGF0dGVucyBhbiBleGNlcHRpb24gaW50byBrZXktdmFsdWUgcGFpcnMgYnkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluXG4gKiBhbmQgY29lcmNpbmcgdmFsdWVzIHRvIHN0cmluZ3MuIER1cGxpY2F0ZSBwcm9wZXJ0aWVzIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuO1xuICogdGhlIGZpcnN0IGluc2VydCB3aW5zLlxuICovXG5mdW5jdGlvbiBmbGF0dGVuRXhjZXB0aW9uKGV4KSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIHZhciBjdXJyZW50ID0gZXg7XG4gICAgd2hpbGUgKGN1cnJlbnQgIT09IG51bGwpIHtcbiAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY3VycmVudCkuZm9yRWFjaChmdW5jdGlvbiAocHJvcGVydHlOYW1lKSB7XG4gICAgICAgICAgICBpZiAocmVzdWx0W3Byb3BlcnR5TmFtZV0pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gY3VycmVudFtwcm9wZXJ0eU5hbWVdO1xuICAgICAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W3Byb3BlcnR5TmFtZV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY3VycmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKiBUaGUgZ2xvYmFsIGVycm9yIGhhbmRsZXIgZGVsZWdhdGUgKi9cbnZhciBkZWxlZ2F0ZUhhbmRsZXIgPSBsb2dnaW5nRXJyb3JIYW5kbGVyKCk7XG4vKipcbiAqIFNldCB0aGUgZ2xvYmFsIGVycm9yIGhhbmRsZXJcbiAqIEBwYXJhbSB7RXJyb3JIYW5kbGVyfSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHNldEdsb2JhbEVycm9ySGFuZGxlcihoYW5kbGVyKSB7XG4gICAgZGVsZWdhdGVIYW5kbGVyID0gaGFuZGxlcjtcbn1cbi8qKlxuICogUmV0dXJuIHRoZSBnbG9iYWwgZXJyb3IgaGFuZGxlclxuICogQHBhcmFtIHtFeGNlcHRpb259IGV4XG4gKi9cbmZ1bmN0aW9uIGdsb2JhbEVycm9ySGFuZGxlcihleCkge1xuICAgIHRyeSB7XG4gICAgICAgIGRlbGVnYXRlSGFuZGxlcihleCk7XG4gICAgfVxuICAgIGNhdGNoIChfYSkgeyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHlcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBUcmFjZXNTYW1wbGVyVmFsdWVzO1xuKGZ1bmN0aW9uIChUcmFjZXNTYW1wbGVyVmFsdWVzKSB7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIkFsd2F5c09mZlwiXSA9IFwiYWx3YXlzX29mZlwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJBbHdheXNPblwiXSA9IFwiYWx3YXlzX29uXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT2ZmXCJdID0gXCJwYXJlbnRiYXNlZF9hbHdheXNfb2ZmXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlBhcmVudEJhc2VkQWx3YXlzT25cIl0gPSBcInBhcmVudGJhc2VkX2Fsd2F5c19vblwiO1xuICAgIFRyYWNlc1NhbXBsZXJWYWx1ZXNbXCJQYXJlbnRCYXNlZFRyYWNlSWRSYXRpb1wiXSA9IFwicGFyZW50YmFzZWRfdHJhY2VpZHJhdGlvXCI7XG4gICAgVHJhY2VzU2FtcGxlclZhbHVlc1tcIlRyYWNlSWRSYXRpb1wiXSA9IFwidHJhY2VpZHJhdGlvXCI7XG59KShUcmFjZXNTYW1wbGVyVmFsdWVzIHx8IChUcmFjZXNTYW1wbGVyVmFsdWVzID0ge30pKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBERUZBVUxUX0xJU1RfU0VQQVJBVE9SID0gJywnO1xuLyoqXG4gKiBFbnZpcm9ubWVudCBpbnRlcmZhY2UgdG8gZGVmaW5lIGFsbCBuYW1lc1xuICovXG52YXIgRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTID0gWydPVEVMX1NES19ESVNBQkxFRCddO1xuZnVuY3Rpb24gaXNFbnZWYXJBQm9vbGVhbihrZXkpIHtcbiAgICByZXR1cm4gKEVOVklST05NRU5UX0JPT0xFQU5fS0VZUy5pbmRleE9mKGtleSkgPiAtMSk7XG59XG52YXIgRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTID0gW1xuICAgICdPVEVMX0JTUF9FWFBPUlRfVElNRU9VVCcsXG4gICAgJ09URUxfQlNQX01BWF9FWFBPUlRfQkFUQ0hfU0laRScsXG4gICAgJ09URUxfQlNQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CU1BfU0NIRURVTEVfREVMQVknLFxuICAgICdPVEVMX0JMUlBfRVhQT1JUX1RJTUVPVVQnLFxuICAgICdPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFJyxcbiAgICAnT1RFTF9CTFJQX1NDSEVEVUxFX0RFTEFZJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUJyxcbiAgICAnT1RFTF9MT0dSRUNPUkRfQVRUUklCVVRFX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0VWRU5UX0NPVU5UX0xJTUlUJyxcbiAgICAnT1RFTF9TUEFOX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCcsXG4gICAgJ09URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfVElNRU9VVCcsXG4gICAgJ09URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQnLFxuICAgICdPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19USU1FT1VUJyxcbiAgICAnT1RFTF9FWFBPUlRFUl9KQUVHRVJfQUdFTlRfUE9SVCcsXG5dO1xuZnVuY3Rpb24gaXNFbnZWYXJBTnVtYmVyKGtleSkge1xuICAgIHJldHVybiAoRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTLmluZGV4T2Yoa2V5KSA+IC0xKTtcbn1cbnZhciBFTlZJUk9OTUVOVF9MSVNUU19LRVlTID0gW1xuICAgICdPVEVMX05PX1BBVENIX01PRFVMRVMnLFxuICAgICdPVEVMX1BST1BBR0FUT1JTJyxcbiAgICAnT1RFTF9TRU1DT05WX1NUQUJJTElUWV9PUFRfSU4nLFxuXTtcbmZ1bmN0aW9uIGlzRW52VmFyQUxpc3Qoa2V5KSB7XG4gICAgcmV0dXJuIEVOVklST05NRU5UX0xJU1RTX0tFWVMuaW5kZXhPZihrZXkpID4gLTE7XG59XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUID0gSW5maW5pdHk7XG52YXIgREVGQVVMVF9BVFRSSUJVVEVfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQgPSAxMjg7XG52YXIgREVGQVVMVF9TUEFOX0FUVFJJQlVURV9QRVJfTElOS19DT1VOVF9MSU1JVCA9IDEyODtcbi8qKlxuICogRGVmYXVsdCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAqL1xudmFyIERFRkFVTFRfRU5WSVJPTk1FTlQgPSB7XG4gICAgT1RFTF9TREtfRElTQUJMRUQ6IGZhbHNlLFxuICAgIENPTlRBSU5FUl9OQU1FOiAnJyxcbiAgICBFQ1NfQ09OVEFJTkVSX01FVEFEQVRBX1VSSV9WNDogJycsXG4gICAgRUNTX0NPTlRBSU5FUl9NRVRBREFUQV9VUkk6ICcnLFxuICAgIEhPU1ROQU1FOiAnJyxcbiAgICBLVUJFUk5FVEVTX1NFUlZJQ0VfSE9TVDogJycsXG4gICAgTkFNRVNQQUNFOiAnJyxcbiAgICBPVEVMX0JTUF9FWFBPUlRfVElNRU9VVDogMzAwMDAsXG4gICAgT1RFTF9CU1BfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CU1BfTUFYX1FVRVVFX1NJWkU6IDIwNDgsXG4gICAgT1RFTF9CU1BfU0NIRURVTEVfREVMQVk6IDUwMDAsXG4gICAgT1RFTF9CTFJQX0VYUE9SVF9USU1FT1VUOiAzMDAwMCxcbiAgICBPVEVMX0JMUlBfTUFYX0VYUE9SVF9CQVRDSF9TSVpFOiA1MTIsXG4gICAgT1RFTF9CTFJQX01BWF9RVUVVRV9TSVpFOiAyMDQ4LFxuICAgIE9URUxfQkxSUF9TQ0hFRFVMRV9ERUxBWTogNTAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9IT1NUOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9BR0VOVF9QT1JUOiA2ODMyLFxuICAgIE9URUxfRVhQT1JURVJfSkFFR0VSX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX0pBRUdFUl9QQVNTV09SRDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9KQUVHRVJfVVNFUjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19FTkRQT0lOVDogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfRU5EUE9JTlQ6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9IRUFERVJTOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0hFQURFUlM6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9USU1FT1VUOiAxMDAwMCxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1RJTUVPVVQ6IDEwMDAwLFxuICAgIE9URUxfRVhQT1JURVJfWklQS0lOX0VORFBPSU5UOiAnaHR0cDovL2xvY2FsaG9zdDo5NDExL2FwaS92Mi9zcGFucycsXG4gICAgT1RFTF9MT0dfTEVWRUw6IERpYWdMb2dMZXZlbC5JTkZPLFxuICAgIE9URUxfTk9fUEFUQ0hfTU9EVUxFUzogW10sXG4gICAgT1RFTF9QUk9QQUdBVE9SUzogWyd0cmFjZWNvbnRleHQnLCAnYmFnZ2FnZSddLFxuICAgIE9URUxfUkVTT1VSQ0VfQVRUUklCVVRFUzogJycsXG4gICAgT1RFTF9TRVJWSUNFX05BTUU6ICcnLFxuICAgIE9URUxfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfQVRUUklCVVRFX0NPVU5UX0xJTUlUOiBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBPVEVMX1NQQU5fQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVDogREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfTE9HUkVDT1JEX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX1ZBTFVFX0xFTkdUSF9MSU1JVCxcbiAgICBPVEVMX0xPR1JFQ09SRF9BVFRSSUJVVEVfQ09VTlRfTElNSVQ6IERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9FVkVOVF9DT1VOVF9MSU1JVDogMTI4LFxuICAgIE9URUxfU1BBTl9MSU5LX0NPVU5UX0xJTUlUOiAxMjgsXG4gICAgT1RFTF9TUEFOX0FUVFJJQlVURV9QRVJfRVZFTlRfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlULFxuICAgIE9URUxfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQ6IERFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQsXG4gICAgT1RFTF9UUkFDRVNfRVhQT1JURVI6ICcnLFxuICAgIE9URUxfVFJBQ0VTX1NBTVBMRVI6IFRyYWNlc1NhbXBsZXJWYWx1ZXMuUGFyZW50QmFzZWRBbHdheXNPbixcbiAgICBPVEVMX1RSQUNFU19TQU1QTEVSX0FSRzogJycsXG4gICAgT1RFTF9MT0dTX0VYUE9SVEVSOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfSU5TRUNVUkU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9NRVRSSUNTX0lOU0VDVVJFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19JTlNFQ1VSRTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX0xPR1NfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DT01QUkVTU0lPTjogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ09NUFJFU1NJT046ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX0NPTVBSRVNTSU9OOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0tFWTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfS0VZOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0NMSUVOVF9DRVJUSUZJQ0FURTogJycsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfQ0xJRU5UX0NFUlRJRklDQVRFOiAnJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTE9HU19DTElFTlRfQ0VSVElGSUNBVEU6ICcnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfUFJPVE9DT0w6ICdodHRwL3Byb3RvYnVmJyxcbiAgICBPVEVMX0VYUE9SVEVSX09UTFBfTUVUUklDU19QUk9UT0NPTDogJ2h0dHAvcHJvdG9idWYnLFxuICAgIE9URUxfRVhQT1JURVJfT1RMUF9MT0dTX1BST1RPQ09MOiAnaHR0cC9wcm90b2J1ZicsXG4gICAgT1RFTF9FWFBPUlRFUl9PVExQX01FVFJJQ1NfVEVNUE9SQUxJVFlfUFJFRkVSRU5DRTogJ2N1bXVsYXRpdmUnLFxuICAgIE9URUxfU0VNQ09OVl9TVEFCSUxJVFlfT1BUX0lOOiBbXSxcbn07XG4vKipcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBwYXJzZUJvb2xlYW4oa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZXNba2V5XSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdmFsdWUgPSBTdHJpbmcodmFsdWVzW2tleV0pO1xuICAgIC8vIHN1cHBvcnQgY2FzZS1pbnNlbnNpdGl2ZSBcInRydWVcIlxuICAgIGVudmlyb25tZW50W2tleV0gPSB2YWx1ZS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4vKipcbiAqIFBhcnNlcyBhIHZhcmlhYmxlIGFzIG51bWJlciB3aXRoIG51bWJlciB2YWxpZGF0aW9uXG4gKiBAcGFyYW0gbmFtZVxuICogQHBhcmFtIGVudmlyb25tZW50XG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gbWluXG4gKiBAcGFyYW0gbWF4XG4gKi9cbmZ1bmN0aW9uIHBhcnNlTnVtYmVyKG5hbWUsIGVudmlyb25tZW50LCB2YWx1ZXMsIG1pbiwgbWF4KSB7XG4gICAgaWYgKG1pbiA9PT0gdm9pZCAwKSB7IG1pbiA9IC1JbmZpbml0eTsgfVxuICAgIGlmIChtYXggPT09IHZvaWQgMCkgeyBtYXggPSBJbmZpbml0eTsgfVxuICAgIGlmICh0eXBlb2YgdmFsdWVzW25hbWVdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICB2YXIgdmFsdWUgPSBOdW1iZXIodmFsdWVzW25hbWVdKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gbWluO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgICAgICAgICBlbnZpcm9ubWVudFtuYW1lXSA9IG1heDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50W25hbWVdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBsaXN0LWxpa2Ugc3RyaW5ncyBmcm9tIGlucHV0IGludG8gb3V0cHV0LlxuICogQHBhcmFtIG5hbWVcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIHNlcGFyYXRvclxuICovXG5mdW5jdGlvbiBwYXJzZVN0cmluZ0xpc3QobmFtZSwgb3V0cHV0LCBpbnB1dCwgc2VwYXJhdG9yKSB7XG4gICAgaWYgKHNlcGFyYXRvciA9PT0gdm9pZCAwKSB7IHNlcGFyYXRvciA9IERFRkFVTFRfTElTVF9TRVBBUkFUT1I7IH1cbiAgICB2YXIgZ2l2ZW5WYWx1ZSA9IGlucHV0W25hbWVdO1xuICAgIGlmICh0eXBlb2YgZ2l2ZW5WYWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb3V0cHV0W25hbWVdID0gZ2l2ZW5WYWx1ZS5zcGxpdChzZXBhcmF0b3IpLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gdi50cmltKCk7IH0pO1xuICAgIH1cbn1cbi8vIFRoZSBzdXBwb3J0IHN0cmluZyAtPiBEaWFnTG9nTGV2ZWwgbWFwcGluZ3NcbnZhciBsb2dMZXZlbE1hcCA9IHtcbiAgICBBTEw6IERpYWdMb2dMZXZlbC5BTEwsXG4gICAgVkVSQk9TRTogRGlhZ0xvZ0xldmVsLlZFUkJPU0UsXG4gICAgREVCVUc6IERpYWdMb2dMZXZlbC5ERUJVRyxcbiAgICBJTkZPOiBEaWFnTG9nTGV2ZWwuSU5GTyxcbiAgICBXQVJOOiBEaWFnTG9nTGV2ZWwuV0FSTixcbiAgICBFUlJPUjogRGlhZ0xvZ0xldmVsLkVSUk9SLFxuICAgIE5PTkU6IERpYWdMb2dMZXZlbC5OT05FLFxufTtcbi8qKlxuICogRW52aXJvbm1lbnRhbGx5IHNldHMgbG9nIGxldmVsIGlmIHZhbGlkIGxvZyBsZXZlbCBzdHJpbmcgaXMgcHJvdmlkZWRcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBlbnZpcm9ubWVudFxuICogQHBhcmFtIHZhbHVlc1xuICovXG5mdW5jdGlvbiBzZXRMb2dMZXZlbEZyb21FbnYoa2V5LCBlbnZpcm9ubWVudCwgdmFsdWVzKSB7XG4gICAgdmFyIHZhbHVlID0gdmFsdWVzW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdmFyIHRoZUxldmVsID0gbG9nTGV2ZWxNYXBbdmFsdWUudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmICh0aGVMZXZlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICBlbnZpcm9ubWVudFtrZXldID0gdGhlTGV2ZWw7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFBhcnNlcyBlbnZpcm9ubWVudCB2YWx1ZXNcbiAqIEBwYXJhbSB2YWx1ZXNcbiAqL1xuZnVuY3Rpb24gcGFyc2VFbnZpcm9ubWVudCh2YWx1ZXMpIHtcbiAgICB2YXIgZW52aXJvbm1lbnQgPSB7fTtcbiAgICBmb3IgKHZhciBlbnYgaW4gREVGQVVMVF9FTlZJUk9OTUVOVCkge1xuICAgICAgICB2YXIga2V5ID0gZW52O1xuICAgICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICAgICAgY2FzZSAnT1RFTF9MT0dfTEVWRUwnOlxuICAgICAgICAgICAgICAgIHNldExvZ0xldmVsRnJvbUVudihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBpZiAoaXNFbnZWYXJBQm9vbGVhbihrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQm9vbGVhbihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFOdW1iZXIoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZU51bWJlcihrZXksIGVudmlyb25tZW50LCB2YWx1ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0VudlZhckFMaXN0KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VTdHJpbmdMaXN0KGtleSwgZW52aXJvbm1lbnQsIHZhbHVlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50W2tleV0gPSBTdHJpbmcodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlbnZpcm9ubWVudDtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogR2V0cyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gKi9cbmZ1bmN0aW9uIGdldEVudigpIHtcbiAgICB2YXIgZ2xvYmFsRW52ID0gcGFyc2VFbnZpcm9ubWVudChfZ2xvYmFsVGhpcyk7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfRU5WSVJPTk1FTlQsIGdsb2JhbEVudik7XG59XG5mdW5jdGlvbiBnZXRFbnZXaXRob3V0RGVmYXVsdHMoKSB7XG4gICAgcmV0dXJuIHBhcnNlRW52aXJvbm1lbnQoX2dsb2JhbFRoaXMpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCQxID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19yZWFkKSB8fCBmdW5jdGlvbiAobywgbikge1xuICAgIHZhciBtID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9bU3ltYm9sLml0ZXJhdG9yXTtcbiAgICBpZiAoIW0pIHJldHVybiBvO1xuICAgIHZhciBpID0gbS5jYWxsKG8pLCByLCBhciA9IFtdLCBlO1xuICAgIHRyeSB7XG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH1cbiAgICBmaW5hbGx5IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpW1wicmV0dXJuXCJdKSkgbS5jYWxsKGkpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfVxuICAgIH1cbiAgICByZXR1cm4gYXI7XG59O1xudmFyIF9fc3ByZWFkQXJyYXkkMSA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fc3ByZWFkQXJyYXkpIHx8IGZ1bmN0aW9uICh0bywgZnJvbSwgcGFjaykge1xuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHtcbiAgICAgICAgICAgIGlmICghYXIpIGFyID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZnJvbSwgMCwgaSk7XG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XG59O1xuZnVuY3Rpb24gaGV4VG9CYXNlNjQoaGV4U3RyKSB7XG4gICAgcmV0dXJuIGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsIF9fc3ByZWFkQXJyYXkkMShbXSwgX19yZWFkJDEoaGV4VG9CaW5hcnkoaGV4U3RyKSksIGZhbHNlKSkpO1xufVxuXG52YXIgU1BBTl9JRF9CWVRFUyA9IDg7XG52YXIgVFJBQ0VfSURfQllURVMgPSAxNjtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICovXG52YXIgUmFuZG9tSWRHZW5lcmF0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUmFuZG9tSWRHZW5lcmF0b3IoKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgcmFuZG9tIDE2LWJ5dGUgdHJhY2UgSUQgZm9ybWF0dGVkL2VuY29kZWQgYXMgYSAzMiBsb3dlcmNhc2UgaGV4XG4gICAgICAgICAqIGNoYXJhY3RlcnMgY29ycmVzcG9uZGluZyB0byAxMjggYml0cy5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMuZ2VuZXJhdGVUcmFjZUlkID0gZ2V0SWRHZW5lcmF0b3IoVFJBQ0VfSURfQllURVMpO1xuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIHJhbmRvbSA4LWJ5dGUgc3BhbiBJRCBmb3JtYXR0ZWQvZW5jb2RlZCBhcyBhIDE2IGxvd2VyY2FzZSBoZXhcbiAgICAgICAgICogY2hhcmFjdGVycyBjb3JyZXNwb25kaW5nIHRvIDY0IGJpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmdlbmVyYXRlU3BhbklkID0gZ2V0SWRHZW5lcmF0b3IoU1BBTl9JRF9CWVRFUyk7XG4gICAgfVxuICAgIHJldHVybiBSYW5kb21JZEdlbmVyYXRvcjtcbn0oKSk7XG52YXIgU0hBUkVEX0NIQVJfQ09ERVNfQVJSQVkgPSBBcnJheSgzMik7XG5mdW5jdGlvbiBnZXRJZEdlbmVyYXRvcihieXRlcykge1xuICAgIHJldHVybiBmdW5jdGlvbiBnZW5lcmF0ZUlkKCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzICogMjsgaSsrKSB7XG4gICAgICAgICAgICBTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDE2KSArIDQ4O1xuICAgICAgICAgICAgLy8gdmFsaWQgaGV4IGNoYXJhY3RlcnMgaW4gdGhlIHJhbmdlIDQ4LTU3IGFuZCA5Ny0xMDJcbiAgICAgICAgICAgIGlmIChTSEFSRURfQ0hBUl9DT0RFU19BUlJBWVtpXSA+PSA1OCkge1xuICAgICAgICAgICAgICAgIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZW2ldICs9IDM5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFNIQVJFRF9DSEFSX0NPREVTX0FSUkFZLnNsaWNlKDAsIGJ5dGVzICogMikpO1xuICAgIH07XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5mdW5jdGlvbiB1bnJlZlRpbWVyKF90aW1lcikgeyB9XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX192YWx1ZXMgPSAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX3ZhbHVlcykgfHwgZnVuY3Rpb24obykge1xuICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5pdGVyYXRvciwgbSA9IHMgJiYgb1tzXSwgaSA9IDA7XG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XG4gICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSBcIm51bWJlclwiKSByZXR1cm4ge1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IG8gJiYgb1tpKytdLCBkb25lOiAhbyB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHMgPyBcIk9iamVjdCBpcyBub3QgaXRlcmFibGUuXCIgOiBcIlN5bWJvbC5pdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XG59O1xuLyoqIENvbWJpbmVzIG11bHRpcGxlIHByb3BhZ2F0b3JzIGludG8gYSBzaW5nbGUgcHJvcGFnYXRvci4gKi9cbnZhciBDb21wb3NpdGVQcm9wYWdhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBhIGNvbXBvc2l0ZSBwcm9wYWdhdG9yIGZyb20gYSBsaXN0IG9mIHByb3BhZ2F0b3JzLlxuICAgICAqXG4gICAgICogQHBhcmFtIFtjb25maWddIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjb21wb3NpdGUgcHJvcGFnYXRvclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIENvbXBvc2l0ZVByb3BhZ2F0b3IoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcgPT09IHZvaWQgMCkgeyBjb25maWcgPSB7fTsgfVxuICAgICAgICB2YXIgX2E7XG4gICAgICAgIHRoaXMuX3Byb3BhZ2F0b3JzID0gKF9hID0gY29uZmlnLnByb3BhZ2F0b3JzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXTtcbiAgICAgICAgdGhpcy5fZmllbGRzID0gQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMuX3Byb3BhZ2F0b3JzXG4gICAgICAgICAgICAvLyBvbGRlciBwcm9wYWdhdG9ycyBtYXkgbm90IGhhdmUgZmllbGRzIGZ1bmN0aW9uLCBudWxsIGNoZWNrIHRvIGJlIHN1cmVcbiAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuICh0eXBlb2YgcC5maWVsZHMgPT09ICdmdW5jdGlvbicgPyBwLmZpZWxkcygpIDogW10pOyB9KVxuICAgICAgICAgICAgLnJlZHVjZShmdW5jdGlvbiAoeCwgeSkgeyByZXR1cm4geC5jb25jYXQoeSk7IH0sIFtdKSkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY2FycmllciBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBpbmplY3RcbiAgICAgKiBAcGFyYW0gY2FycmllciBDYXJyaWVyIGludG8gd2hpY2ggY29udGV4dCB3aWxsIGJlIGluamVjdGVkXG4gICAgICovXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgZV8xLCBfYTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGZvciAodmFyIF9iID0gX192YWx1ZXModGhpcy5fcHJvcGFnYXRvcnMpLCBfYyA9IF9iLm5leHQoKTsgIV9jLmRvbmU7IF9jID0gX2IubmV4dCgpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHByb3BhZ2F0b3IgPSBfYy52YWx1ZTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdG9yLmluamVjdChjb250ZXh0LCBjYXJyaWVyLCBzZXR0ZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpYWcud2FybihcIkZhaWxlZCB0byBpbmplY3Qgd2l0aCBcIiArIHByb3BhZ2F0b3IuY29uc3RydWN0b3IubmFtZSArIFwiLiBFcnI6IFwiICsgZXJyLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZV8xXzEpIHsgZV8xID0geyBlcnJvcjogZV8xXzEgfTsgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKF9jICYmICFfYy5kb25lICYmIChfYSA9IF9iLnJldHVybikpIF9hLmNhbGwoX2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICAvKipcbiAgICAgKiBSdW4gZWFjaCBvZiB0aGUgY29uZmlndXJlZCBwcm9wYWdhdG9ycyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBjYXJyaWVyLlxuICAgICAqIFByb3BhZ2F0b3JzIGFyZSBydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIGNvbmZpZ3VyZWQsIHNvIGlmIG11bHRpcGxlXG4gICAgICogcHJvcGFnYXRvcnMgd3JpdGUgdGhlIHNhbWUgY29udGV4dCBrZXksIHRoZSBwcm9wYWdhdG9yIGxhdGVyIGluIHRoZSBsaXN0XG4gICAgICogd2lsbCBcIndpblwiLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNvbnRleHQgQ29udGV4dCB0byBhZGQgdmFsdWVzIHRvXG4gICAgICogQHBhcmFtIGNhcnJpZXIgQ2FycmllciBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgY29udGV4dFxuICAgICAqL1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmV4dHJhY3QgPSBmdW5jdGlvbiAoY29udGV4dCwgY2FycmllciwgZ2V0dGVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wcm9wYWdhdG9ycy5yZWR1Y2UoZnVuY3Rpb24gKGN0eCwgcHJvcGFnYXRvcikge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGFnYXRvci5leHRyYWN0KGN0eCwgY2FycmllciwgZ2V0dGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBkaWFnLndhcm4oXCJGYWlsZWQgdG8gZXh0cmFjdCB3aXRoIFwiICsgcHJvcGFnYXRvci5jb25zdHJ1Y3Rvci5uYW1lICsgXCIuIEVycjogXCIgKyBlcnIubWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3R4O1xuICAgICAgICB9LCBjb250ZXh0KTtcbiAgICB9O1xuICAgIENvbXBvc2l0ZVByb3BhZ2F0b3IucHJvdG90eXBlLmZpZWxkcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gcmV0dXJuIGEgbmV3IGFycmF5IHNvIG91ciBmaWVsZHMgY2Fubm90IGJlIG1vZGlmaWVkXG4gICAgICAgIHJldHVybiB0aGlzLl9maWVsZHMuc2xpY2UoKTtcbiAgICB9O1xuICAgIHJldHVybiBDb21wb3NpdGVQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBWQUxJRF9LRVlfQ0hBUl9SQU5HRSA9ICdbXzAtOWEtei0qL10nO1xudmFyIFZBTElEX0tFWSA9IFwiW2Etel1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNTV9XCI7XG52YXIgVkFMSURfVkVORE9SX0tFWSA9IFwiW2EtejAtOV1cIiArIFZBTElEX0tFWV9DSEFSX1JBTkdFICsgXCJ7MCwyNDB9QFthLXpdXCIgKyBWQUxJRF9LRVlfQ0hBUl9SQU5HRSArIFwiezAsMTN9XCI7XG52YXIgVkFMSURfS0VZX1JFR0VYID0gbmV3IFJlZ0V4cChcIl4oPzpcIiArIFZBTElEX0tFWSArIFwifFwiICsgVkFMSURfVkVORE9SX0tFWSArIFwiKSRcIik7XG52YXIgVkFMSURfVkFMVUVfQkFTRV9SRUdFWCA9IC9eWyAtfl17MCwyNTV9WyEtfl0kLztcbnZhciBJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYID0gLyx8PS87XG4vKipcbiAqIEtleSBpcyBvcGFxdWUgc3RyaW5nIHVwIHRvIDI1NiBjaGFyYWN0ZXJzIHByaW50YWJsZS4gSXQgTVVTVCBiZWdpbiB3aXRoIGFcbiAqIGxvd2VyY2FzZSBsZXR0ZXIsIGFuZCBjYW4gb25seSBjb250YWluIGxvd2VyY2FzZSBsZXR0ZXJzIGEteiwgZGlnaXRzIDAtOSxcbiAqIHVuZGVyc2NvcmVzIF8sIGRhc2hlcyAtLCBhc3Rlcmlza3MgKiwgYW5kIGZvcndhcmQgc2xhc2hlcyAvLlxuICogRm9yIG11bHRpLXRlbmFudCB2ZW5kb3Igc2NlbmFyaW9zLCBhbiBhdCBzaWduIChAKSBjYW4gYmUgdXNlZCB0byBwcmVmaXggdGhlXG4gKiB2ZW5kb3IgbmFtZS4gVmVuZG9ycyBTSE9VTEQgc2V0IHRoZSB0ZW5hbnQgSUQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUga2V5LlxuICogc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0LyNrZXlcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVLZXkoa2V5KSB7XG4gICAgcmV0dXJuIFZBTElEX0tFWV9SRUdFWC50ZXN0KGtleSk7XG59XG4vKipcbiAqIFZhbHVlIGlzIG9wYXF1ZSBzdHJpbmcgdXAgdG8gMjU2IGNoYXJhY3RlcnMgcHJpbnRhYmxlIEFTQ0lJIFJGQzAwMjBcbiAqIGNoYXJhY3RlcnMgKGkuZS4sIHRoZSByYW5nZSAweDIwIHRvIDB4N0UpIGV4Y2VwdCBjb21tYSAsIGFuZCA9LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIChWQUxJRF9WQUxVRV9CQVNFX1JFR0VYLnRlc3QodmFsdWUpICYmXG4gICAgICAgICFJTlZBTElEX1ZBTFVFX0NPTU1BX0VRVUFMX1JFR0VYLnRlc3QodmFsdWUpKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBNQVhfVFJBQ0VfU1RBVEVfSVRFTVMgPSAzMjtcbnZhciBNQVhfVFJBQ0VfU1RBVEVfTEVOID0gNTEyO1xudmFyIExJU1RfTUVNQkVSU19TRVBBUkFUT1IgPSAnLCc7XG52YXIgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSID0gJz0nO1xuLyoqXG4gKiBUcmFjZVN0YXRlIG11c3QgYmUgYSBjbGFzcyBhbmQgbm90IGEgc2ltcGxlIG9iamVjdCB0eXBlIGJlY2F1c2Ugb2YgdGhlIHNwZWNcbiAqIHJlcXVpcmVtZW50IChodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC8jdHJhY2VzdGF0ZS1maWVsZCkuXG4gKlxuICogSGVyZSBpcyB0aGUgbGlzdCBvZiBhbGxvd2VkIG11dGF0aW9uczpcbiAqIC0gTmV3IGtleS12YWx1ZSBwYWlyIHNob3VsZCBiZSBhZGRlZCBpbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3RcbiAqIC0gVGhlIHZhbHVlIG9mIGFueSBrZXkgY2FuIGJlIHVwZGF0ZWQuIE1vZGlmaWVkIGtleXMgTVVTVCBiZSBtb3ZlZCB0byB0aGVcbiAqIGJlZ2lubmluZyBvZiB0aGUgbGlzdC5cbiAqL1xudmFyIFRyYWNlU3RhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VTdGF0ZShyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlKVxuICAgICAgICAgICAgdGhpcy5fcGFyc2UocmF3VHJhY2VTdGF0ZSk7XG4gICAgfVxuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE86IEJlbmNobWFyayB0aGUgZGlmZmVyZW50IGFwcHJvYWNoZXMobWFwIHZzIGxpc3QpIGFuZFxuICAgICAgICAvLyB1c2UgdGhlIGZhc3RlciBvbmUuXG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuaGFzKGtleSkpIHtcbiAgICAgICAgICAgIHRyYWNlU3RhdGUuX2ludGVybmFsU3RhdGUuZGVsZXRlKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cmFjZVN0YXRlO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUudW5zZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHZhciB0cmFjZVN0YXRlID0gdGhpcy5fY2xvbmUoKTtcbiAgICAgICAgdHJhY2VTdGF0ZS5faW50ZXJuYWxTdGF0ZS5kZWxldGUoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbnRlcm5hbFN0YXRlLmdldChrZXkpO1xuICAgIH07XG4gICAgVHJhY2VTdGF0ZS5wcm90b3R5cGUuc2VyaWFsaXplID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5cygpXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIGtleSkge1xuICAgICAgICAgICAgYWdnLnB1c2goa2V5ICsgTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSICsgX3RoaXMuZ2V0KGtleSkpO1xuICAgICAgICAgICAgcmV0dXJuIGFnZztcbiAgICAgICAgfSwgW10pXG4gICAgICAgICAgICAuam9pbihMSVNUX01FTUJFUlNfU0VQQVJBVE9SKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9wYXJzZSA9IGZ1bmN0aW9uIChyYXdUcmFjZVN0YXRlKSB7XG4gICAgICAgIGlmIChyYXdUcmFjZVN0YXRlLmxlbmd0aCA+IE1BWF9UUkFDRV9TVEFURV9MRU4pXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2ludGVybmFsU3RhdGUgPSByYXdUcmFjZVN0YXRlXG4gICAgICAgICAgICAuc3BsaXQoTElTVF9NRU1CRVJTX1NFUEFSQVRPUilcbiAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gU3RvcmUgaW4gcmV2ZXJzZSBzbyBuZXcga2V5cyAoLnNldCguLi4pKSB3aWxsIGJlIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nXG4gICAgICAgICAgICAucmVkdWNlKGZ1bmN0aW9uIChhZ2csIHBhcnQpIHtcbiAgICAgICAgICAgIHZhciBsaXN0TWVtYmVyID0gcGFydC50cmltKCk7IC8vIE9wdGlvbmFsIFdoaXRlc3BhY2UgKE9XUykgaGFuZGxpbmdcbiAgICAgICAgICAgIHZhciBpID0gbGlzdE1lbWJlci5pbmRleE9mKExJU1RfTUVNQkVSX0tFWV9WQUxVRV9TUExJVFRFUik7XG4gICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICB2YXIga2V5ID0gbGlzdE1lbWJlci5zbGljZSgwLCBpKTtcbiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBsaXN0TWVtYmVyLnNsaWNlKGkgKyAxLCBwYXJ0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlS2V5KGtleSkgJiYgdmFsaWRhdGVWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYWdnLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWdnO1xuICAgICAgICB9LCBuZXcgTWFwKCkpO1xuICAgICAgICAvLyBCZWNhdXNlIG9mIHRoZSByZXZlcnNlKCkgcmVxdWlyZW1lbnQsIHRydW5jIG11c3QgYmUgZG9uZSBhZnRlciBtYXAgaXMgY3JlYXRlZFxuICAgICAgICBpZiAodGhpcy5faW50ZXJuYWxTdGF0ZS5zaXplID4gTUFYX1RSQUNFX1NUQVRFX0lURU1TKSB7XG4gICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcChBcnJheS5mcm9tKHRoaXMuX2ludGVybmFsU3RhdGUuZW50cmllcygpKVxuICAgICAgICAgICAgICAgIC5yZXZlcnNlKCkgLy8gVXNlIHJldmVyc2Ugc2FtZSBhcyBvcmlnaW5hbCB0cmFjZXN0YXRlIHBhcnNlIGNoYWluXG4gICAgICAgICAgICAgICAgLnNsaWNlKDAsIE1BWF9UUkFDRV9TVEFURV9JVEVNUykpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBUcmFjZVN0YXRlLnByb3RvdHlwZS5fa2V5cyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5faW50ZXJuYWxTdGF0ZS5rZXlzKCkpLnJldmVyc2UoKTtcbiAgICB9O1xuICAgIFRyYWNlU3RhdGUucHJvdG90eXBlLl9jbG9uZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSgpO1xuICAgICAgICB0cmFjZVN0YXRlLl9pbnRlcm5hbFN0YXRlID0gbmV3IE1hcCh0aGlzLl9pbnRlcm5hbFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHRyYWNlU3RhdGU7XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VTdGF0ZTtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgVFJBQ0VfUEFSRU5UX0hFQURFUiA9ICd0cmFjZXBhcmVudCc7XG52YXIgVFJBQ0VfU1RBVEVfSEVBREVSID0gJ3RyYWNlc3RhdGUnO1xudmFyIFZFUlNJT04gPSAnMDAnO1xudmFyIFZFUlNJT05fUEFSVCA9ICcoPyFmZilbXFxcXGRhLWZdezJ9JztcbnZhciBUUkFDRV9JRF9QQVJUID0gJyg/IVswXXszMn0pW1xcXFxkYS1mXXszMn0nO1xudmFyIFBBUkVOVF9JRF9QQVJUID0gJyg/IVswXXsxNn0pW1xcXFxkYS1mXXsxNn0nO1xudmFyIEZMQUdTX1BBUlQgPSAnW1xcXFxkYS1mXXsyfSc7XG52YXIgVFJBQ0VfUEFSRU5UX1JFR0VYID0gbmV3IFJlZ0V4cChcIl5cXFxccz8oXCIgKyBWRVJTSU9OX1BBUlQgKyBcIiktKFwiICsgVFJBQ0VfSURfUEFSVCArIFwiKS0oXCIgKyBQQVJFTlRfSURfUEFSVCArIFwiKS0oXCIgKyBGTEFHU19QQVJUICsgXCIpKC0uKik/XFxcXHM/JFwiKTtcbi8qKlxuICogUGFyc2VzIGluZm9ybWF0aW9uIGZyb20gdGhlIFt0cmFjZXBhcmVudF0gc3BhbiB0YWcgYW5kIGNvbnZlcnRzIGl0IGludG8ge0BsaW5rIFNwYW5Db250ZXh0fVxuICogQHBhcmFtIHRyYWNlUGFyZW50IC0gQSBtZXRhIHByb3BlcnR5IHRoYXQgY29tZXMgZnJvbSBzZXJ2ZXIuXG4gKiAgICAgSXQgc2hvdWxkIGJlIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBzZXJ2ZXIgc2lkZSB0byBoYXZlIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHRyYWNlIElkLFxuICogICAgIGEgcGFyZW50IHNwYW4gSWQgdGhhdCB3YXMgc2V0IG9uIHRoZSBzZXJ2ZXIncyByZXF1ZXN0IHNwYW4sXG4gKiAgICAgYW5kIHRoZSB0cmFjZSBmbGFncyB0byBpbmRpY2F0ZSB0aGUgc2VydmVyJ3Mgc2FtcGxpbmcgZGVjaXNpb25cbiAqICAgICAoMDEgPSBzYW1wbGVkLCAwMCA9IG5vdCBzYW1wbGVkKS5cbiAqICAgICBmb3IgZXhhbXBsZTogJ3t2ZXJzaW9ufS17dHJhY2VJZH0te3NwYW5JZH0te3NhbXBsZURlY2lzaW9ufSdcbiAqICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUge0BsaW5rIGh0dHBzOi8vd3d3LnczLm9yZy9UUi90cmFjZS1jb250ZXh0L31cbiAqL1xuZnVuY3Rpb24gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCkge1xuICAgIHZhciBtYXRjaCA9IFRSQUNFX1BBUkVOVF9SRUdFWC5leGVjKHRyYWNlUGFyZW50KTtcbiAgICBpZiAoIW1hdGNoKVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24gdGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBmdXR1cmUgdmVyc2lvbnMuIElmIHRoZXJlIGFyZSBtb3JlIHBhcnRzLCB3ZSBvbmx5IHJlamVjdCBpdCBpZiBpdCdzIHVzaW5nIHZlcnNpb24gMDBcbiAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL3RyYWNlLWNvbnRleHQvI3ZlcnNpb25pbmctb2YtdHJhY2VwYXJlbnRcbiAgICBpZiAobWF0Y2hbMV0gPT09ICcwMCcgJiYgbWF0Y2hbNV0pXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRyYWNlSWQ6IG1hdGNoWzJdLFxuICAgICAgICBzcGFuSWQ6IG1hdGNoWzNdLFxuICAgICAgICB0cmFjZUZsYWdzOiBwYXJzZUludChtYXRjaFs0XSwgMTYpLFxuICAgIH07XG59XG4vKipcbiAqIFByb3BhZ2F0ZXMge0BsaW5rIFNwYW5Db250ZXh0fSB0aHJvdWdoIFRyYWNlIENvbnRleHQgZm9ybWF0IHByb3BhZ2F0aW9uLlxuICpcbiAqIEJhc2VkIG9uIHRoZSBUcmFjZSBDb250ZXh0IHNwZWNpZmljYXRpb246XG4gKiBodHRwczovL3d3dy53My5vcmcvVFIvdHJhY2UtY29udGV4dC9cbiAqL1xudmFyIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvcigpIHtcbiAgICB9XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuaW5qZWN0ID0gZnVuY3Rpb24gKGNvbnRleHQsIGNhcnJpZXIsIHNldHRlcikge1xuICAgICAgICB2YXIgc3BhbkNvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzcGFuQ29udGV4dCB8fFxuICAgICAgICAgICAgaXNUcmFjaW5nU3VwcHJlc3NlZChjb250ZXh0KSB8fFxuICAgICAgICAgICAgIWlzU3BhbkNvbnRleHRWYWxpZChzcGFuQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciB0cmFjZVBhcmVudCA9IFZFUlNJT04gKyBcIi1cIiArIHNwYW5Db250ZXh0LnRyYWNlSWQgKyBcIi1cIiArIHNwYW5Db250ZXh0LnNwYW5JZCArIFwiLTBcIiArIE51bWJlcihzcGFuQ29udGV4dC50cmFjZUZsYWdzIHx8IFRyYWNlRmxhZ3MuTk9ORSkudG9TdHJpbmcoMTYpO1xuICAgICAgICBzZXR0ZXIuc2V0KGNhcnJpZXIsIFRSQUNFX1BBUkVOVF9IRUFERVIsIHRyYWNlUGFyZW50KTtcbiAgICAgICAgaWYgKHNwYW5Db250ZXh0LnRyYWNlU3RhdGUpIHtcbiAgICAgICAgICAgIHNldHRlci5zZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSLCBzcGFuQ29udGV4dC50cmFjZVN0YXRlLnNlcmlhbGl6ZSgpKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVzNDVHJhY2VDb250ZXh0UHJvcGFnYXRvci5wcm90b3R5cGUuZXh0cmFjdCA9IGZ1bmN0aW9uIChjb250ZXh0LCBjYXJyaWVyLCBnZXR0ZXIpIHtcbiAgICAgICAgdmFyIHRyYWNlUGFyZW50SGVhZGVyID0gZ2V0dGVyLmdldChjYXJyaWVyLCBUUkFDRV9QQVJFTlRfSEVBREVSKTtcbiAgICAgICAgaWYgKCF0cmFjZVBhcmVudEhlYWRlcilcbiAgICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB2YXIgdHJhY2VQYXJlbnQgPSBBcnJheS5pc0FycmF5KHRyYWNlUGFyZW50SGVhZGVyKVxuICAgICAgICAgICAgPyB0cmFjZVBhcmVudEhlYWRlclswXVxuICAgICAgICAgICAgOiB0cmFjZVBhcmVudEhlYWRlcjtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFjZVBhcmVudCAhPT0gJ3N0cmluZycpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgdmFyIHNwYW5Db250ZXh0ID0gcGFyc2VUcmFjZVBhcmVudCh0cmFjZVBhcmVudCk7XG4gICAgICAgIGlmICghc3BhbkNvbnRleHQpXG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgc3BhbkNvbnRleHQuaXNSZW1vdGUgPSB0cnVlO1xuICAgICAgICB2YXIgdHJhY2VTdGF0ZUhlYWRlciA9IGdldHRlci5nZXQoY2FycmllciwgVFJBQ0VfU1RBVEVfSEVBREVSKTtcbiAgICAgICAgaWYgKHRyYWNlU3RhdGVIZWFkZXIpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYHRyYWNlc3RhdGVgIGhlYWRlciBpcyBmb3VuZCwgd2UgbWVyZ2UgdGhlbSBpbnRvIGFcbiAgICAgICAgICAgIC8vIHNpbmdsZSBoZWFkZXIuXG4gICAgICAgICAgICB2YXIgc3RhdGUgPSBBcnJheS5pc0FycmF5KHRyYWNlU3RhdGVIZWFkZXIpXG4gICAgICAgICAgICAgICAgPyB0cmFjZVN0YXRlSGVhZGVyLmpvaW4oJywnKVxuICAgICAgICAgICAgICAgIDogdHJhY2VTdGF0ZUhlYWRlcjtcbiAgICAgICAgICAgIHNwYW5Db250ZXh0LnRyYWNlU3RhdGUgPSBuZXcgVHJhY2VTdGF0ZSh0eXBlb2Ygc3RhdGUgPT09ICdzdHJpbmcnID8gc3RhdGUgOiB1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFjZS5zZXRTcGFuQ29udGV4dChjb250ZXh0LCBzcGFuQ29udGV4dCk7XG4gICAgfTtcbiAgICBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yLnByb3RvdHlwZS5maWVsZHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBbVFJBQ0VfUEFSRU5UX0hFQURFUiwgVFJBQ0VfU1RBVEVfSEVBREVSXTtcbiAgICB9O1xuICAgIHJldHVybiBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBSUENfTUVUQURBVEFfS0VZID0gY3JlYXRlQ29udGV4dEtleSgnT3BlblRlbGVtZXRyeSBTREsgQ29udGV4dCBLZXkgUlBDX01FVEFEQVRBJyk7XG52YXIgUlBDVHlwZTtcbihmdW5jdGlvbiAoUlBDVHlwZSkge1xuICAgIFJQQ1R5cGVbXCJIVFRQXCJdID0gXCJodHRwXCI7XG59KShSUENUeXBlIHx8IChSUENUeXBlID0ge30pKTtcbmZ1bmN0aW9uIHNldFJQQ01ldGFkYXRhKGNvbnRleHQsIG1ldGEpIHtcbiAgICByZXR1cm4gY29udGV4dC5zZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZLCBtZXRhKTtcbn1cbmZ1bmN0aW9uIGRlbGV0ZVJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5kZWxldGVWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cbmZ1bmN0aW9uIGdldFJQQ01ldGFkYXRhKGNvbnRleHQpIHtcbiAgICByZXR1cm4gY29udGV4dC5nZXRWYWx1ZShSUENfTUVUQURBVEFfS0VZKTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgbm8gdHJhY2VzLlxuICovXG52YXIgQWx3YXlzT2ZmU2FtcGxlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBBbHdheXNPZmZTYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPZmZTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkZWNpc2lvbjogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgQWx3YXlzT2ZmU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT2ZmU2FtcGxlcic7XG4gICAgfTtcbiAgICByZXR1cm4gQWx3YXlzT2ZmU2FtcGxlcjtcbn0oKSk7XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgb25lIGRlZmluZWQgaW4gQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLWJhc2UgaW5zdGVhZC5cbiAqIFNhbXBsZXIgdGhhdCBzYW1wbGVzIGFsbCB0cmFjZXMuXG4gKi9cbnZhciBBbHdheXNPblNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQWx3YXlzT25TYW1wbGVyKCkge1xuICAgIH1cbiAgICBBbHdheXNPblNhbXBsZXIucHJvdG90eXBlLnNob3VsZFNhbXBsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRlY2lzaW9uOiBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRCxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIEFsd2F5c09uU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnQWx3YXlzT25TYW1wbGVyJztcbiAgICB9O1xuICAgIHJldHVybiBBbHdheXNPblNhbXBsZXI7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIG9uZSBkZWZpbmVkIGluIEBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlIGluc3RlYWQuXG4gKiBBIGNvbXBvc2l0ZSBzYW1wbGVyIHRoYXQgZWl0aGVyIHJlc3BlY3RzIHRoZSBwYXJlbnQgc3BhbidzIHNhbXBsaW5nIGRlY2lzaW9uXG4gKiBvciBkZWxlZ2F0ZXMgdG8gYGRlbGVnYXRlU2FtcGxlcmAgZm9yIHJvb3Qgc3BhbnMuXG4gKi9cbnZhciBQYXJlbnRCYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gUGFyZW50QmFzZWRTYW1wbGVyKGNvbmZpZykge1xuICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2Q7XG4gICAgICAgIHRoaXMuX3Jvb3QgPSBjb25maWcucm9vdDtcbiAgICAgICAgaWYgKCF0aGlzLl9yb290KSB7XG4gICAgICAgICAgICBnbG9iYWxFcnJvckhhbmRsZXIobmV3IEVycm9yKCdQYXJlbnRCYXNlZFNhbXBsZXIgbXVzdCBoYXZlIGEgcm9vdCBzYW1wbGVyIGNvbmZpZ3VyZWQnKSk7XG4gICAgICAgICAgICB0aGlzLl9yb290ID0gbmV3IEFsd2F5c09uU2FtcGxlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQgPVxuICAgICAgICAgICAgKF9hID0gY29uZmlnLnJlbW90ZVBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZCA9XG4gICAgICAgICAgICAoX2IgPSBjb25maWcucmVtb3RlUGFyZW50Tm90U2FtcGxlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbmV3IEFsd2F5c09mZlNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkID1cbiAgICAgICAgICAgIChfYyA9IGNvbmZpZy5sb2NhbFBhcmVudFNhbXBsZWQpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG5ldyBBbHdheXNPblNhbXBsZXIoKTtcbiAgICAgICAgdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkID1cbiAgICAgICAgICAgIChfZCA9IGNvbmZpZy5sb2NhbFBhcmVudE5vdFNhbXBsZWQpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IG5ldyBBbHdheXNPZmZTYW1wbGVyKCk7XG4gICAgfVxuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUuc2hvdWxkU2FtcGxlID0gZnVuY3Rpb24gKGNvbnRleHQsIHRyYWNlSWQsIHNwYW5OYW1lLCBzcGFuS2luZCwgYXR0cmlidXRlcywgbGlua3MpIHtcbiAgICAgICAgdmFyIHBhcmVudENvbnRleHQgPSB0cmFjZS5nZXRTcGFuQ29udGV4dChjb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXJlbnRDb250ZXh0IHx8ICFpc1NwYW5Db250ZXh0VmFsaWQocGFyZW50Q29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb290LnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC5pc1JlbW90ZSkge1xuICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQudHJhY2VGbGFncyAmIFRyYWNlRmxhZ3MuU0FNUExFRCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW1vdGVQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFyZW50Q29udGV4dC50cmFjZUZsYWdzICYgVHJhY2VGbGFncy5TQU1QTEVEKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnRTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbG9jYWxQYXJlbnROb3RTYW1wbGVkLnNob3VsZFNhbXBsZShjb250ZXh0LCB0cmFjZUlkLCBzcGFuTmFtZSwgc3BhbktpbmQsIGF0dHJpYnV0ZXMsIGxpbmtzKTtcbiAgICB9O1xuICAgIFBhcmVudEJhc2VkU2FtcGxlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBcIlBhcmVudEJhc2Vke3Jvb3Q9XCIgKyB0aGlzLl9yb290LnRvU3RyaW5nKCkgKyBcIiwgcmVtb3RlUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX3JlbW90ZVBhcmVudFNhbXBsZWQudG9TdHJpbmcoKSArIFwiLCByZW1vdGVQYXJlbnROb3RTYW1wbGVkPVwiICsgdGhpcy5fcmVtb3RlUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50U2FtcGxlZC50b1N0cmluZygpICsgXCIsIGxvY2FsUGFyZW50Tm90U2FtcGxlZD1cIiArIHRoaXMuX2xvY2FsUGFyZW50Tm90U2FtcGxlZC50b1N0cmluZygpICsgXCJ9XCI7XG4gICAgfTtcbiAgICByZXR1cm4gUGFyZW50QmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBvbmUgZGVmaW5lZCBpbiBAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZSBpbnN0ZWFkLlxuICogU2FtcGxlciB0aGF0IHNhbXBsZXMgYSBnaXZlbiBmcmFjdGlvbiBvZiB0cmFjZXMgYmFzZWQgb2YgdHJhY2UgaWQgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKi9cbnZhciBUcmFjZUlkUmF0aW9CYXNlZFNhbXBsZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyKF9yYXRpbykge1xuICAgICAgICBpZiAoX3JhdGlvID09PSB2b2lkIDApIHsgX3JhdGlvID0gMDsgfVxuICAgICAgICB0aGlzLl9yYXRpbyA9IF9yYXRpbztcbiAgICAgICAgdGhpcy5fcmF0aW8gPSB0aGlzLl9ub3JtYWxpemUoX3JhdGlvKTtcbiAgICAgICAgdGhpcy5fdXBwZXJCb3VuZCA9IE1hdGguZmxvb3IodGhpcy5fcmF0aW8gKiAweGZmZmZmZmZmKTtcbiAgICB9XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5zaG91bGRTYW1wbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgdHJhY2VJZCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGVjaXNpb246IGlzVmFsaWRUcmFjZUlkKHRyYWNlSWQpICYmIHRoaXMuX2FjY3VtdWxhdGUodHJhY2VJZCkgPCB0aGlzLl91cHBlckJvdW5kXG4gICAgICAgICAgICAgICAgPyBTYW1wbGluZ0RlY2lzaW9uLlJFQ09SRF9BTkRfU0FNUExFRFxuICAgICAgICAgICAgICAgIDogU2FtcGxpbmdEZWNpc2lvbi5OT1RfUkVDT1JELFxuICAgICAgICB9O1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIFwiVHJhY2VJZFJhdGlvQmFzZWR7XCIgKyB0aGlzLl9yYXRpbyArIFwifVwiO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fbm9ybWFsaXplID0gZnVuY3Rpb24gKHJhdGlvKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmF0aW8gIT09ICdudW1iZXInIHx8IGlzTmFOKHJhdGlvKSlcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gcmF0aW8gPj0gMSA/IDEgOiByYXRpbyA8PSAwID8gMCA6IHJhdGlvO1xuICAgIH07XG4gICAgVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyLnByb3RvdHlwZS5fYWNjdW11bGF0ZSA9IGZ1bmN0aW9uICh0cmFjZUlkKSB7XG4gICAgICAgIHZhciBhY2N1bXVsYXRpb24gPSAwO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRyYWNlSWQubGVuZ3RoIC8gODsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgcG9zID0gaSAqIDg7XG4gICAgICAgICAgICB2YXIgcGFydCA9IHBhcnNlSW50KHRyYWNlSWQuc2xpY2UocG9zLCBwb3MgKyA4KSwgMTYpO1xuICAgICAgICAgICAgYWNjdW11bGF0aW9uID0gKGFjY3VtdWxhdGlvbiBeIHBhcnQpID4+PiAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gICAgfTtcbiAgICByZXR1cm4gVHJhY2VJZFJhdGlvQmFzZWRTYW1wbGVyO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cbi8qKlxuICogYmFzZWQgb24gbG9kYXNoIGluIG9yZGVyIHRvIHN1cHBvcnQgZXNtIGJ1aWxkcyB3aXRob3V0IGVzTW9kdWxlSW50ZXJvcC5cbiAqIGxvZGFzaCBpcyB1c2luZyBNSVQgTGljZW5zZS5cbiAqKi9cbnZhciBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJztcbnZhciBudWxsVGFnID0gJ1tvYmplY3QgTnVsbF0nO1xudmFyIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nO1xudmFyIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7XG52YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZy5jYWxsKE9iamVjdCk7XG52YXIgZ2V0UHJvdG90eXBlID0gb3ZlckFyZyhPYmplY3QuZ2V0UHJvdG90eXBlT2YsIE9iamVjdCk7XG52YXIgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlO1xudmFyIGhhc093blByb3BlcnR5ID0gb2JqZWN0UHJvdG8uaGFzT3duUHJvcGVydHk7XG52YXIgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7XG52YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZztcbi8qKlxuICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIGFyZ3VtZW50IHRyYW5zZm9ybS5cbiAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsIHRyYW5zZm9ybSkge1xuICAgIHJldHVybiBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgIHJldHVybiBmdW5jKHRyYW5zZm9ybShhcmcpKTtcbiAgICB9O1xufVxuLyoqXG4gKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlXG4gKiBgT2JqZWN0YCBjb25zdHJ1Y3RvciBvciBvbmUgd2l0aCBhIGBbW1Byb3RvdHlwZV1dYCBvZiBgbnVsbGAuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSAwLjguMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwbGFpbiBvYmplY3QsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogZnVuY3Rpb24gRm9vKCkge1xuICogICB0aGlzLmEgPSAxO1xuICogfVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7XG4gKiAvLyA9PiBmYWxzZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAqIC8vID0+IHRydWVcbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICAgIGlmICghaXNPYmplY3RMaWtlKHZhbHVlKSB8fCBiYXNlR2V0VGFnKHZhbHVlKSAhPT0gb2JqZWN0VGFnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIHByb3RvID0gZ2V0UHJvdG90eXBlKHZhbHVlKTtcbiAgICBpZiAocHJvdG8gPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHZhciBDdG9yID0gaGFzT3duUHJvcGVydHkuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmXG4gICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09PSBvYmplY3RDdG9yU3RyaW5nKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgXG4gKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mIFwib2JqZWN0XCIuXG4gKlxuICogQHN0YXRpY1xuICogQG1lbWJlck9mIF9cbiAqIEBzaW5jZSA0LjAuMFxuICogQGNhdGVnb3J5IExhbmdcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC5cbiAqIEBleGFtcGxlXG4gKlxuICogXy5pc09iamVjdExpa2Uoe30pO1xuICogLy8gPT4gdHJ1ZVxuICpcbiAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7XG4gKiAvLyA9PiB0cnVlXG4gKlxuICogXy5pc09iamVjdExpa2UoXy5ub29wKTtcbiAqIC8vID0+IGZhbHNlXG4gKlxuICogXy5pc09iamVjdExpa2UobnVsbCk7XG4gKiAvLyA9PiBmYWxzZVxuICovXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7XG59XG4vKipcbiAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRUYWdgIHdpdGhvdXQgZmFsbGJhY2tzIGZvciBidWdneSBlbnZpcm9ubWVudHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LlxuICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgYHRvU3RyaW5nVGFnYC5cbiAqL1xuZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkVGFnIDogbnVsbFRhZztcbiAgICB9XG4gICAgcmV0dXJuIHN5bVRvU3RyaW5nVGFnICYmIHN5bVRvU3RyaW5nVGFnIGluIE9iamVjdCh2YWx1ZSlcbiAgICAgICAgPyBnZXRSYXdUYWcodmFsdWUpXG4gICAgICAgIDogb2JqZWN0VG9TdHJpbmcodmFsdWUpO1xufVxuLyoqXG4gKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VHZXRUYWdgIHdoaWNoIGlnbm9yZXMgYFN5bWJvbC50b1N0cmluZ1RhZ2AgdmFsdWVzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLlxuICovXG5mdW5jdGlvbiBnZXRSYXdUYWcodmFsdWUpIHtcbiAgICB2YXIgaXNPd24gPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBzeW1Ub1N0cmluZ1RhZyksIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICB2YXIgdW5tYXNrZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQ7XG4gICAgICAgIHVubWFza2VkID0gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gc2lsZW5jZVxuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gICAgaWYgKHVubWFza2VkKSB7XG4gICAgICAgIGlmIChpc093bikge1xuICAgICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGVsZXRlIHZhbHVlW3N5bVRvU3RyaW5nVGFnXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC5cbiAqXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xudmFyIE1BWF9MRVZFTCA9IDIwO1xuLyoqXG4gKiBNZXJnZXMgb2JqZWN0cyB0b2dldGhlclxuICogQHBhcmFtIGFyZ3MgLSBvYmplY3RzIC8gdmFsdWVzIHRvIGJlIG1lcmdlZFxuICovXG5mdW5jdGlvbiBtZXJnZSgpIHtcbiAgICB2YXIgYXJncyA9IFtdO1xuICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7XG4gICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICB9XG4gICAgdmFyIHJlc3VsdCA9IGFyZ3Muc2hpZnQoKTtcbiAgICB2YXIgb2JqZWN0cyA9IG5ldyBXZWFrTWFwKCk7XG4gICAgd2hpbGUgKGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICByZXN1bHQgPSBtZXJnZVR3b09iamVjdHMocmVzdWx0LCBhcmdzLnNoaWZ0KCksIDAsIG9iamVjdHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuZnVuY3Rpb24gdGFrZVZhbHVlKHZhbHVlKSB7XG4gICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS5zbGljZSgpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG4vKipcbiAqIE1lcmdlcyB0d28gb2JqZWN0c1xuICogQHBhcmFtIG9uZSAtIGZpcnN0IG9iamVjdFxuICogQHBhcmFtIHR3byAtIHNlY29uZCBvYmplY3RcbiAqIEBwYXJhbSBsZXZlbCAtIGN1cnJlbnQgZGVlcCBsZXZlbFxuICogQHBhcmFtIG9iamVjdHMgLSBvYmplY3RzIGhvbGRlciB0aGF0IGhhcyBiZWVuIGFscmVhZHkgcmVmZXJlbmNlZCAtIHRvIHByZXZlbnRcbiAqIGN5Y2xpYyBkZXBlbmRlbmN5XG4gKi9cbmZ1bmN0aW9uIG1lcmdlVHdvT2JqZWN0cyhvbmUsIHR3bywgbGV2ZWwsIG9iamVjdHMpIHtcbiAgICBpZiAobGV2ZWwgPT09IHZvaWQgMCkgeyBsZXZlbCA9IDA7IH1cbiAgICB2YXIgcmVzdWx0O1xuICAgIGlmIChsZXZlbCA+IE1BWF9MRVZFTCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBsZXZlbCsrO1xuICAgIGlmIChpc1ByaW1pdGl2ZShvbmUpIHx8IGlzUHJpbWl0aXZlKHR3bykgfHwgaXNGdW5jdGlvbih0d28pKSB7XG4gICAgICAgIHJlc3VsdCA9IHRha2VWYWx1ZSh0d28pO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0FycmF5KG9uZSkpIHtcbiAgICAgICAgcmVzdWx0ID0gb25lLnNsaWNlKCk7XG4gICAgICAgIGlmIChpc0FycmF5KHR3bykpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBqID0gdHdvLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRha2VWYWx1ZSh0d29baV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc09iamVjdCh0d28pKSB7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzT2JqZWN0KG9uZSkpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHR3bykpIHtcbiAgICAgICAgICAgIGlmICghc2hvdWxkTWVyZ2Uob25lLCB0d28pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR3bztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIG9uZSk7XG4gICAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHR3byk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaiA9IGtleXMubGVuZ3RoOyBpIDwgajsgaSsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgdmFyIHR3b1ZhbHVlID0gdHdvW2tleV07XG4gICAgICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKHR3b1ZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHR3b1ZhbHVlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0W2tleV0gPSB0YWtlVmFsdWUodHdvVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajEgPSByZXN1bHRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG9iajIgPSB0d29WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdhc09iamVjdFJlZmVyZW5jZWQob25lLCBrZXksIG9iamVjdHMpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXNPYmplY3RSZWZlcmVuY2VkKHR3bywga2V5LCBvYmplY3RzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KG9iajEpICYmIGlzT2JqZWN0KG9iajIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFycjEgPSBvYmplY3RzLmdldChvYmoxKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJyMiA9IG9iamVjdHMuZ2V0KG9iajIpIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycjEucHVzaCh7IG9iajogb25lLCBrZXk6IGtleSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnIyLnB1c2goeyBvYmo6IHR3bywga2V5OiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMSwgYXJyMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cy5zZXQob2JqMiwgYXJyMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG1lcmdlVHdvT2JqZWN0cyhyZXN1bHRba2V5XSwgdHdvVmFsdWUsIGxldmVsLCBvYmplY3RzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IHR3bztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4gKiBGdW5jdGlvbiB0byBjaGVjayBpZiBvYmplY3QgaGFzIGJlZW4gYWxyZWFkeSByZWZlcmVuY2VcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBrZXlcbiAqIEBwYXJhbSBvYmplY3RzXG4gKi9cbmZ1bmN0aW9uIHdhc09iamVjdFJlZmVyZW5jZWQob2JqLCBrZXksIG9iamVjdHMpIHtcbiAgICB2YXIgYXJyID0gb2JqZWN0cy5nZXQob2JqW2tleV0pIHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBqID0gYXJyLmxlbmd0aDsgaSA8IGo7IGkrKykge1xuICAgICAgICB2YXIgaW5mbyA9IGFycltpXTtcbiAgICAgICAgaWYgKGluZm8ua2V5ID09PSBrZXkgJiYgaW5mby5vYmogPT09IG9iaikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNBcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHtcbiAgICByZXR1cm4gKCFpc1ByaW1pdGl2ZSh2YWx1ZSkgJiZcbiAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmXG4gICAgICAgICFpc0Z1bmN0aW9uKHZhbHVlKSAmJlxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKTtcbn1cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgfHxcbiAgICAgICAgdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHAgfHxcbiAgICAgICAgdmFsdWUgPT09IG51bGwpO1xufVxuZnVuY3Rpb24gc2hvdWxkTWVyZ2Uob25lLCB0d28pIHtcbiAgICBpZiAoIWlzUGxhaW5PYmplY3Qob25lKSB8fCAhaXNQbGFpbk9iamVjdCh0d28pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG52YXIgX19leHRlbmRzID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkge1xuICAgIHZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxuICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcbiAgICAgICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XG4gICAgfTtcbiAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBiICE9PSBcImZ1bmN0aW9uXCIgJiYgYiAhPT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcbiAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcbiAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9XG4gICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcbiAgICB9O1xufSkoKTtcbi8qKlxuICogRXJyb3IgdGhhdCBpcyB0aHJvd24gb24gdGltZW91dHMuXG4gKi9cbnZhciBUaW1lb3V0RXJyb3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7XG4gICAgX19leHRlbmRzKFRpbWVvdXRFcnJvciwgX3N1cGVyKTtcbiAgICBmdW5jdGlvbiBUaW1lb3V0RXJyb3IobWVzc2FnZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBtZXNzYWdlKSB8fCB0aGlzO1xuICAgICAgICAvLyBtYW51YWxseSBhZGp1c3QgcHJvdG90eXBlIHRvIHJldGFpbiBgaW5zdGFuY2VvZmAgZnVuY3Rpb25hbGl0eSB3aGVuIHRhcmdldGluZyBFUzUsIHNlZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYWluL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihfdGhpcywgVGltZW91dEVycm9yLnByb3RvdHlwZSk7XG4gICAgICAgIHJldHVybiBfdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIFRpbWVvdXRFcnJvcjtcbn0oRXJyb3IpKTtcbi8qKlxuICogQWRkcyBhIHRpbWVvdXQgdG8gYSBwcm9taXNlIGFuZCByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgdGltZW91dCBoYXMgZWxhcHNlZC4gQWxzbyByZWplY3RzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZVxuICogcmVqZWN0cywgYW5kIHJlc29sdmVzIGlmIHRoZSBzcGVjaWZpZWQgcHJvbWlzZSByZXNvbHZlcy5cbiAqXG4gKiA8cD4gTk9URTogdGhpcyBvcGVyYXRpb24gd2lsbCBjb250aW51ZSBldmVuIGFmdGVyIGl0IHRocm93cyBhIHtAbGluayBUaW1lb3V0RXJyb3J9LlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIHByb21pc2UgdG8gdXNlIHdpdGggdGltZW91dC5cbiAqIEBwYXJhbSB0aW1lb3V0IHRoZSB0aW1lb3V0IGluIG1pbGxpc2Vjb25kcyB1bnRpbCB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpcyByZWplY3RlZC5cbiAqL1xuZnVuY3Rpb24gY2FsbFdpdGhUaW1lb3V0KHByb21pc2UsIHRpbWVvdXQpIHtcbiAgICB2YXIgdGltZW91dEhhbmRsZTtcbiAgICB2YXIgdGltZW91dFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiB0aW1lb3V0RnVuY3Rpb24oX3Jlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChmdW5jdGlvbiB0aW1lb3V0SGFuZGxlcigpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgVGltZW91dEVycm9yKCdPcGVyYXRpb24gdGltZWQgb3V0LicpKTtcbiAgICAgICAgfSwgdGltZW91dCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2UucmFjZShbcHJvbWlzZSwgdGltZW91dFByb21pc2VdKS50aGVuKGZ1bmN0aW9uIChyZXN1bHQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sIGZ1bmN0aW9uIChyZWFzb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICB0aHJvdyByZWFzb247XG4gICAgfSk7XG59XG5cbi8qXG4gKiBDb3B5cmlnaHQgVGhlIE9wZW5UZWxlbWV0cnkgQXV0aG9yc1xuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG4vKipcbiAqIENoZWNrcyBpZiBjZXJ0YWluIGZ1bmN0aW9uIGhhcyBiZWVuIGFscmVhZHkgd3JhcHBlZFxuICogQHBhcmFtIGZ1bmNcbiAqL1xuZnVuY3Rpb24gaXNXcmFwcGVkKGZ1bmMpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAgIHR5cGVvZiBmdW5jLl9fb3JpZ2luYWwgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgdHlwZW9mIGZ1bmMuX191bndyYXAgPT09ICdmdW5jdGlvbicgJiZcbiAgICAgICAgZnVuYy5fX3dyYXBwZWQgPT09IHRydWUpO1xufVxuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIERlZmVycmVkID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERlZmVycmVkKCkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgX3RoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgX3RoaXMuX3JlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEZWZlcnJlZC5wcm90b3R5cGUsIFwicHJvbWlzZVwiLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBEZWZlcnJlZC5wcm90b3R5cGUucmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5fcmVzb2x2ZSh2YWwpO1xuICAgIH07XG4gICAgRGVmZXJyZWQucHJvdG90eXBlLnJlamVjdCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICAgICAgdGhpcy5fcmVqZWN0KGVycik7XG4gICAgfTtcbiAgICByZXR1cm4gRGVmZXJyZWQ7XG59KCkpO1xuXG4vKlxuICogQ29weXJpZ2h0IFRoZSBPcGVuVGVsZW1ldHJ5IEF1dGhvcnNcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICBodHRwczovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xudmFyIF9fcmVhZCA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fcmVhZCkgfHwgZnVuY3Rpb24gKG8sIG4pIHtcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XG4gICAgaWYgKCFtKSByZXR1cm4gbztcbiAgICB2YXIgaSA9IG0uY2FsbChvKSwgciwgYXIgPSBbXSwgZTtcbiAgICB0cnkge1xuICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHsgaWYgKGUpIHRocm93IGUuZXJyb3I7IH1cbiAgICB9XG4gICAgcmV0dXJuIGFyO1xufTtcbnZhciBfX3NwcmVhZEFycmF5ID0gKHVuZGVmaW5lZCAmJiB1bmRlZmluZWQuX19zcHJlYWRBcnJheSkgfHwgZnVuY3Rpb24gKHRvLCBmcm9tLCBwYWNrKSB7XG4gICAgaWYgKHBhY2sgfHwgYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xuICAgICAgICAgICAgaWYgKCFhcikgYXIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tLCAwLCBpKTtcbiAgICAgICAgICAgIGFyW2ldID0gZnJvbVtpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTtcbn07XG4vKipcbiAqIEJpbmQgdGhlIGNhbGxiYWNrIGFuZCBvbmx5IGludm9rZSB0aGUgY2FsbGJhY2sgb25jZSByZWdhcmRsZXNzIGhvdyBtYW55IHRpbWVzIGBCaW5kT25jZUZ1dHVyZS5jYWxsYCBpcyBpbnZva2VkLlxuICovXG52YXIgQmluZE9uY2VGdXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gQmluZE9uY2VGdXR1cmUoX2NhbGxiYWNrLCBfdGhhdCkge1xuICAgICAgICB0aGlzLl9jYWxsYmFjayA9IF9jYWxsYmFjaztcbiAgICAgICAgdGhpcy5fdGhhdCA9IF90aGF0O1xuICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuICAgIH1cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcImlzQ2FsbGVkXCIsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDYWxsZWQ7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLCBcInByb21pc2VcIiwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICB9LFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgQmluZE9uY2VGdXR1cmUucHJvdG90eXBlLmNhbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2lzQ2FsbGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9pc0NhbGxlZCA9IHRydWU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgoX2EgPSB0aGlzLl9jYWxsYmFjaykuY2FsbC5hcHBseShfYSwgX19zcHJlYWRBcnJheShbdGhpcy5fdGhhdF0sIF9fcmVhZChhcmdzKSwgZmFsc2UpKSkudGhlbihmdW5jdGlvbiAodmFsKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVzb2x2ZSh2YWwpOyB9LCBmdW5jdGlvbiAoZXJyKSB7IHJldHVybiBfdGhpcy5fZGVmZXJyZWQucmVqZWN0KGVycik7IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICAgIH07XG4gICAgcmV0dXJuIEJpbmRPbmNlRnV0dXJlO1xufSgpKTtcblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbi8qKlxuICogQGludGVybmFsXG4gKiBTaGFyZWQgZnVuY3Rpb25hbGl0eSB1c2VkIGJ5IEV4cG9ydGVycyB3aGlsZSBleHBvcnRpbmcgZGF0YSwgaW5jbHVkaW5nIHN1cHByZXNzaW9uIG9mIFRyYWNlcy5cbiAqL1xuZnVuY3Rpb24gX2V4cG9ydChleHBvcnRlciwgYXJnKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICAgIC8vIHByZXZlbnQgZG93bnN0cmVhbSBleHBvcnRlciBjYWxscyBmcm9tIGdlbmVyYXRpbmcgc3BhbnNcbiAgICAgICAgY29udGV4dC53aXRoKHN1cHByZXNzVHJhY2luZyhjb250ZXh0LmFjdGl2ZSgpKSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZXhwb3J0ZXIuZXhwb3J0KGFyZywgZnVuY3Rpb24gKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn1cblxuLypcbiAqIENvcHlyaWdodCBUaGUgT3BlblRlbGVtZXRyeSBBdXRob3JzXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbnZhciBiYWdnYWdlVXRpbHMgPSB7XG4gICAgZ2V0S2V5UGFpcnM6IGdldEtleVBhaXJzLFxuICAgIHNlcmlhbGl6ZUtleVBhaXJzOiBzZXJpYWxpemVLZXlQYWlycyxcbiAgICBwYXJzZUtleVBhaXJzSW50b1JlY29yZDogcGFyc2VLZXlQYWlyc0ludG9SZWNvcmQsXG4gICAgcGFyc2VQYWlyS2V5VmFsdWU6IHBhcnNlUGFpcktleVZhbHVlLFxufTtcbnZhciBpbnRlcm5hbCA9IHtcbiAgICBfZXhwb3J0OiBfZXhwb3J0LFxufTtcblxuY29uc3QgZXNtID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoLyojX19QVVJFX18qL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIEFsd2F5c09mZlNhbXBsZXIsXG4gICAgQWx3YXlzT25TYW1wbGVyLFxuICAgIEFuY2hvcmVkQ2xvY2ssXG4gICAgQmluZE9uY2VGdXR1cmUsXG4gICAgQ29tcG9zaXRlUHJvcGFnYXRvcixcbiAgICBERUZBVUxUX0FUVFJJQlVURV9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX0FUVFJJQlVURV9WQUxVRV9MRU5HVEhfTElNSVQsXG4gICAgREVGQVVMVF9FTlZJUk9OTUVOVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9FVkVOVF9DT1VOVF9MSU1JVCxcbiAgICBERUZBVUxUX1NQQU5fQVRUUklCVVRFX1BFUl9MSU5LX0NPVU5UX0xJTUlULFxuICAgIGdldCBFeHBvcnRSZXN1bHRDb2RlICgpIHsgcmV0dXJuIEV4cG9ydFJlc3VsdENvZGU7IH0sXG4gICAgUGFyZW50QmFzZWRTYW1wbGVyLFxuICAgIGdldCBSUENUeXBlICgpIHsgcmV0dXJuIFJQQ1R5cGU7IH0sXG4gICAgUmFuZG9tSWRHZW5lcmF0b3IsXG4gICAgU0RLX0lORk8sXG4gICAgVFJBQ0VfUEFSRU5UX0hFQURFUixcbiAgICBUUkFDRV9TVEFURV9IRUFERVIsXG4gICAgVGltZW91dEVycm9yLFxuICAgIFRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlcixcbiAgICBUcmFjZVN0YXRlLFxuICAgIGdldCBUcmFjZXNTYW1wbGVyVmFsdWVzICgpIHsgcmV0dXJuIFRyYWNlc1NhbXBsZXJWYWx1ZXM7IH0sXG4gICAgVkVSU0lPTjogVkVSU0lPTiQxLFxuICAgIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yLFxuICAgIFczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IsXG4gICAgX2dsb2JhbFRoaXMsXG4gICAgYWRkSHJUaW1lcyxcbiAgICBiYWdnYWdlVXRpbHMsXG4gICAgY2FsbFdpdGhUaW1lb3V0LFxuICAgIGRlbGV0ZVJQQ01ldGFkYXRhLFxuICAgIGdldEVudixcbiAgICBnZXRFbnZXaXRob3V0RGVmYXVsdHMsXG4gICAgZ2V0UlBDTWV0YWRhdGEsXG4gICAgZ2V0VGltZU9yaWdpbixcbiAgICBnbG9iYWxFcnJvckhhbmRsZXIsXG4gICAgaGV4VG9CYXNlNjQsXG4gICAgaGV4VG9CaW5hcnksXG4gICAgaHJUaW1lLFxuICAgIGhyVGltZUR1cmF0aW9uLFxuICAgIGhyVGltZVRvTWljcm9zZWNvbmRzLFxuICAgIGhyVGltZVRvTWlsbGlzZWNvbmRzLFxuICAgIGhyVGltZVRvTmFub3NlY29uZHMsXG4gICAgaHJUaW1lVG9UaW1lU3RhbXAsXG4gICAgaW50ZXJuYWwsXG4gICAgaXNBdHRyaWJ1dGVLZXksXG4gICAgaXNBdHRyaWJ1dGVWYWx1ZSxcbiAgICBpc1RpbWVJbnB1dCxcbiAgICBpc1RpbWVJbnB1dEhyVGltZSxcbiAgICBpc1RyYWNpbmdTdXBwcmVzc2VkLFxuICAgIGlzVXJsSWdub3JlZCxcbiAgICBpc1dyYXBwZWQsXG4gICAgbG9nZ2luZ0Vycm9ySGFuZGxlcixcbiAgICBtZXJnZSxcbiAgICBtaWxsaXNUb0hyVGltZSxcbiAgICBvdHBlcmZvcm1hbmNlLFxuICAgIHBhcnNlRW52aXJvbm1lbnQsXG4gICAgcGFyc2VUcmFjZVBhcmVudCxcbiAgICBzYW5pdGl6ZUF0dHJpYnV0ZXMsXG4gICAgc2V0R2xvYmFsRXJyb3JIYW5kbGVyLFxuICAgIHNldFJQQ01ldGFkYXRhLFxuICAgIHN1cHByZXNzVHJhY2luZyxcbiAgICB0aW1lSW5wdXRUb0hyVGltZSxcbiAgICB1bnJlZlRpbWVyLFxuICAgIHVuc3VwcHJlc3NUcmFjaW5nLFxuICAgIHVybE1hdGNoZXNcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSkpO1xuXG5leHBvcnQgeyBCaW5kT25jZUZ1dHVyZSBhcyBCLCBDb21wb3NpdGVQcm9wYWdhdG9yIGFzIEMsIERFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIGFzIEQsIFNhbXBsaW5nRGVjaXNpb24gYXMgUywgVHJhY2VzU2FtcGxlclZhbHVlcyBhcyBULCBXM0NUcmFjZUNvbnRleHRQcm9wYWdhdG9yIGFzIFcsIGdldEVudiBhcyBhLCBnZXRFbnZXaXRob3V0RGVmYXVsdHMgYXMgYiwgREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIGFzIGMsIFczQ0JhZ2dhZ2VQcm9wYWdhdG9yIGFzIGQsIGludGVybmFsIGFzIGUsIGVzbSBhcyBmLCBnbG9iYWxFcnJvckhhbmRsZXIgYXMgZywgaXNBdHRyaWJ1dGVWYWx1ZSBhcyBpLCBtZXJnZSBhcyBtLCBzYW5pdGl6ZUF0dHJpYnV0ZXMgYXMgcywgdW5yZWZUaW1lciBhcyB1IH07Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxLQUFLQSxJQUFnQyxLQUFLQyxHQUFhLEtBQUtDLEdBQWEsS0FBS0MsSUFBWSxLQUFLQyxJQUFlLEtBQUtDLElBQVEsS0FBS0MsSUFBZ0IsS0FBS0MsSUFBc0IsTUFBTUMsSUFBc0IsS0FBS0MsSUFBcUIsTUFBTUMsSUFBbUIsS0FBS0MsSUFBYSxLQUFLQyxJQUFtQixLQUFLQyxJQUFjLEtB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O0FBQUEsRUFDQSxxQkFBQUM7QUFBQSxFQUNBLG1CQUFBQztBQUFBLEVBQ0EsVUFBQXNTO0FBQUEsRUFDQSxnQkFBQXBOO0FBQUEsRUFDQSxrQkFBQUM7QUFBQSxFQUNBLGFBQUFsRjtBQUFBLEVBQ0EsbUJBQUFDO0FBQUEsRUFDQSxxQkFBQU07QUFBQSxFQUNBLGNBQUFMO0FBQUEsRUFDQSxXQUFBd1I7QUFBQSxFQUNBLHFCQUFBN0w7QUFBQSxFQUNBLE9BQUFxSjtBQUFBLEVBQ0EsZ0JBQUEvTztBQUFBLEVBQ0EsZUFBQUM7QUFBQSxFQUNBLGtCQUFBZ0k7QUFBQSxFQUNBLGtCQUFBeUQ7QUFBQSxFQUNBLG9CQUFBbkg7QUFBQSxFQUNBLHVCQUFBMEI7QUFBQSxFQUNBLGdCQUFBbUc7QUFBQSxFQUNBLGlCQUFBL0w7QUFBQSxFQUNBLG1CQUFBSDtBQUFBLEVBQ0EsWUFBQWtKO0FBQUEsRUFDQSxtQkFBQTlJO0FBQUEsRUFDQSxZQUFBSDtBQUNKLEdBQUcsT0FBTyxhQUFhLEVBQUUsT0FBTyxTQUFTLENBQUMsQ0FBQzsiLAogICJuYW1lcyI6IFsiYmFnZ2FnZUVudHJ5TWV0YWRhdGFGcm9tU3RyaW5nIiwgInByb3BhZ2F0aW9uIiwgIl9nbG9iYWxUaGlzIiwgImFkZEhyVGltZXMiLCAiZ2V0VGltZU9yaWdpbiIsICJoclRpbWUiLCAiaHJUaW1lRHVyYXRpb24iLCAiaHJUaW1lVG9NaWNyb3NlY29uZHMiLCAiaHJUaW1lVG9NaWxsaXNlY29uZHMiLCAiaHJUaW1lVG9OYW5vc2Vjb25kcyIsICJoclRpbWVUb1RpbWVTdGFtcCIsICJpc1RpbWVJbnB1dCIsICJpc1RpbWVJbnB1dEhyVGltZSIsICJpc1VybElnbm9yZWQiLCAibWlsbGlzVG9IclRpbWUiLCAib3RwZXJmb3JtYW5jZSIsICJ0aW1lSW5wdXRUb0hyVGltZSIsICJ1cmxNYXRjaGVzIiwgImlzVHJhY2luZ1N1cHByZXNzZWQiLCAic3VwcHJlc3NUcmFjaW5nIiwgInVuc3VwcHJlc3NUcmFjaW5nIiwgImRpYWciLCAiaGV4VG9CaW5hcnkiLCAiRXhwb3J0UmVzdWx0Q29kZSIsICJEaWFnTG9nTGV2ZWwiLCAidHJhY2UiLCAiaXNTcGFuQ29udGV4dFZhbGlkIiwgIlRyYWNlRmxhZ3MiLCAiY3JlYXRlQ29udGV4dEtleSIsICJpc1ZhbGlkVHJhY2VJZCIsICJjb250ZXh0IiwgIlNES19JTkZPIiwgIlZFUlNJT04kMSIsICJTYW1wbGluZ0RlY2lzaW9uIiwgIkJBR0dBR0VfS0VZX1BBSVJfU0VQQVJBVE9SIiwgIkJBR0dBR0VfUFJPUEVSVElFU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9JVEVNU19TRVBBUkFUT1IiLCAiQkFHR0FHRV9IRUFERVIiLCAiQkFHR0FHRV9NQVhfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9QRVJfTkFNRV9WQUxVRV9QQUlSUyIsICJCQUdHQUdFX01BWF9UT1RBTF9MRU5HVEgiLCAiX19yZWFkJDMiLCAibyIsICJuIiwgIm0iLCAiaSIsICJyIiwgImFyIiwgImUiLCAiZXJyb3IiLCAic2VyaWFsaXplS2V5UGFpcnMiLCAia2V5UGFpcnMiLCAiaFZhbHVlIiwgImN1cnJlbnQiLCAidmFsdWUiLCAiZ2V0S2V5UGFpcnMiLCAiYmFnZ2FnZSIsICJfYSIsICJfYiIsICJrZXkiLCAiZW50cnkiLCAicGFyc2VQYWlyS2V5VmFsdWUiLCAidmFsdWVQcm9wcyIsICJrZXlQYWlyUGFydCIsICJzZXBhcmF0b3JJbmRleCIsICJtZXRhZGF0YSIsICJwYXJzZUtleVBhaXJzSW50b1JlY29yZCIsICJrZXlQYWlyIiwgImhlYWRlcnMiLCAiVzNDQmFnZ2FnZVByb3BhZ2F0b3IiLCAiY2FycmllciIsICJzZXR0ZXIiLCAicGFpciIsICJoZWFkZXJWYWx1ZSIsICJnZXR0ZXIiLCAiYmFnZ2FnZVN0cmluZyIsICJwYWlycyIsICJiYWdnYWdlRW50cnkiLCAiQW5jaG9yZWRDbG9jayIsICJzeXN0ZW1DbG9jayIsICJtb25vdG9uaWNDbG9jayIsICJkZWx0YSIsICJfX3ZhbHVlcyQxIiwgInMiLCAiX19yZWFkJDIiLCAic2FuaXRpemVBdHRyaWJ1dGVzIiwgImF0dHJpYnV0ZXMiLCAiZV8xIiwgIm91dCIsICJfYyIsICJfZCIsICJ2YWwiLCAiaXNBdHRyaWJ1dGVLZXkiLCAiaXNBdHRyaWJ1dGVWYWx1ZSIsICJlXzFfMSIsICJpc0hvbW9nZW5lb3VzQXR0cmlidXRlVmFsdWVBcnJheSIsICJpc1ZhbGlkUHJpbWl0aXZlQXR0cmlidXRlVmFsdWUiLCAiYXJyIiwgImVfMiIsICJ0eXBlIiwgImFycl8xIiwgImFycl8xXzEiLCAiZWxlbWVudCIsICJlXzJfMSIsICJsb2dnaW5nRXJyb3JIYW5kbGVyIiwgImV4IiwgInN0cmluZ2lmeUV4Y2VwdGlvbiIsICJmbGF0dGVuRXhjZXB0aW9uIiwgInJlc3VsdCIsICJwcm9wZXJ0eU5hbWUiLCAiZGVsZWdhdGVIYW5kbGVyIiwgInNldEdsb2JhbEVycm9ySGFuZGxlciIsICJoYW5kbGVyIiwgImdsb2JhbEVycm9ySGFuZGxlciIsICJUcmFjZXNTYW1wbGVyVmFsdWVzIiwgIkRFRkFVTFRfTElTVF9TRVBBUkFUT1IiLCAiRU5WSVJPTk1FTlRfQk9PTEVBTl9LRVlTIiwgImlzRW52VmFyQUJvb2xlYW4iLCAiRU5WSVJPTk1FTlRfTlVNQkVSU19LRVlTIiwgImlzRW52VmFyQU51bWJlciIsICJFTlZJUk9OTUVOVF9MSVNUU19LRVlTIiwgImlzRW52VmFyQUxpc3QiLCAiREVGQVVMVF9BVFRSSUJVVEVfVkFMVUVfTEVOR1RIX0xJTUlUIiwgIkRFRkFVTFRfQVRUUklCVVRFX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0VWRU5UX0NPVU5UX0xJTUlUIiwgIkRFRkFVTFRfU1BBTl9BVFRSSUJVVEVfUEVSX0xJTktfQ09VTlRfTElNSVQiLCAiREVGQVVMVF9FTlZJUk9OTUVOVCIsICJwYXJzZUJvb2xlYW4iLCAiZW52aXJvbm1lbnQiLCAidmFsdWVzIiwgInBhcnNlTnVtYmVyIiwgIm5hbWUiLCAibWluIiwgIm1heCIsICJwYXJzZVN0cmluZ0xpc3QiLCAib3V0cHV0IiwgImlucHV0IiwgInNlcGFyYXRvciIsICJnaXZlblZhbHVlIiwgInYiLCAibG9nTGV2ZWxNYXAiLCAic2V0TG9nTGV2ZWxGcm9tRW52IiwgInRoZUxldmVsIiwgInBhcnNlRW52aXJvbm1lbnQiLCAiZW52IiwgImdldEVudiIsICJnbG9iYWxFbnYiLCAiZ2V0RW52V2l0aG91dERlZmF1bHRzIiwgIl9fcmVhZCQxIiwgIl9fc3ByZWFkQXJyYXkkMSIsICJ0byIsICJmcm9tIiwgInBhY2siLCAibCIsICJoZXhUb0Jhc2U2NCIsICJoZXhTdHIiLCAiU1BBTl9JRF9CWVRFUyIsICJUUkFDRV9JRF9CWVRFUyIsICJSYW5kb21JZEdlbmVyYXRvciIsICJnZXRJZEdlbmVyYXRvciIsICJTSEFSRURfQ0hBUl9DT0RFU19BUlJBWSIsICJieXRlcyIsICJ1bnJlZlRpbWVyIiwgIl90aW1lciIsICJfX3ZhbHVlcyIsICJDb21wb3NpdGVQcm9wYWdhdG9yIiwgImNvbmZpZyIsICJwIiwgIngiLCAieSIsICJwcm9wYWdhdG9yIiwgImVyciIsICJjdHgiLCAiVkFMSURfS0VZX0NIQVJfUkFOR0UiLCAiVkFMSURfS0VZIiwgIlZBTElEX1ZFTkRPUl9LRVkiLCAiVkFMSURfS0VZX1JFR0VYIiwgIlZBTElEX1ZBTFVFX0JBU0VfUkVHRVgiLCAiSU5WQUxJRF9WQUxVRV9DT01NQV9FUVVBTF9SRUdFWCIsICJ2YWxpZGF0ZUtleSIsICJ2YWxpZGF0ZVZhbHVlIiwgIk1BWF9UUkFDRV9TVEFURV9JVEVNUyIsICJNQVhfVFJBQ0VfU1RBVEVfTEVOIiwgIkxJU1RfTUVNQkVSU19TRVBBUkFUT1IiLCAiTElTVF9NRU1CRVJfS0VZX1ZBTFVFX1NQTElUVEVSIiwgIlRyYWNlU3RhdGUiLCAicmF3VHJhY2VTdGF0ZSIsICJ0cmFjZVN0YXRlIiwgIl90aGlzIiwgImFnZyIsICJwYXJ0IiwgImxpc3RNZW1iZXIiLCAiVFJBQ0VfUEFSRU5UX0hFQURFUiIsICJUUkFDRV9TVEFURV9IRUFERVIiLCAiVkVSU0lPTiIsICJWRVJTSU9OX1BBUlQiLCAiVFJBQ0VfSURfUEFSVCIsICJQQVJFTlRfSURfUEFSVCIsICJGTEFHU19QQVJUIiwgIlRSQUNFX1BBUkVOVF9SRUdFWCIsICJwYXJzZVRyYWNlUGFyZW50IiwgInRyYWNlUGFyZW50IiwgIm1hdGNoIiwgIlczQ1RyYWNlQ29udGV4dFByb3BhZ2F0b3IiLCAic3BhbkNvbnRleHQiLCAidHJhY2VQYXJlbnRIZWFkZXIiLCAidHJhY2VTdGF0ZUhlYWRlciIsICJzdGF0ZSIsICJSUENfTUVUQURBVEFfS0VZIiwgIlJQQ1R5cGUiLCAic2V0UlBDTWV0YWRhdGEiLCAibWV0YSIsICJkZWxldGVSUENNZXRhZGF0YSIsICJnZXRSUENNZXRhZGF0YSIsICJBbHdheXNPZmZTYW1wbGVyIiwgIkFsd2F5c09uU2FtcGxlciIsICJQYXJlbnRCYXNlZFNhbXBsZXIiLCAidHJhY2VJZCIsICJzcGFuTmFtZSIsICJzcGFuS2luZCIsICJsaW5rcyIsICJwYXJlbnRDb250ZXh0IiwgIlRyYWNlSWRSYXRpb0Jhc2VkU2FtcGxlciIsICJfcmF0aW8iLCAicmF0aW8iLCAiYWNjdW11bGF0aW9uIiwgInBvcyIsICJvYmplY3RUYWciLCAibnVsbFRhZyIsICJ1bmRlZmluZWRUYWciLCAiZnVuY1Byb3RvIiwgImZ1bmNUb1N0cmluZyIsICJvYmplY3RDdG9yU3RyaW5nIiwgImdldFByb3RvdHlwZSIsICJvdmVyQXJnIiwgIm9iamVjdFByb3RvIiwgImhhc093blByb3BlcnR5IiwgInN5bVRvU3RyaW5nVGFnIiwgIm5hdGl2ZU9iamVjdFRvU3RyaW5nIiwgImZ1bmMiLCAidHJhbnNmb3JtIiwgImFyZyIsICJpc1BsYWluT2JqZWN0IiwgImlzT2JqZWN0TGlrZSIsICJiYXNlR2V0VGFnIiwgInByb3RvIiwgIkN0b3IiLCAiZ2V0UmF3VGFnIiwgIm9iamVjdFRvU3RyaW5nIiwgImlzT3duIiwgInRhZyIsICJ1bm1hc2tlZCIsICJNQVhfTEVWRUwiLCAibWVyZ2UiLCAiYXJncyIsICJfaSIsICJvYmplY3RzIiwgIm1lcmdlVHdvT2JqZWN0cyIsICJ0YWtlVmFsdWUiLCAiaXNBcnJheSIsICJvbmUiLCAidHdvIiwgImxldmVsIiwgImlzUHJpbWl0aXZlIiwgImlzRnVuY3Rpb24iLCAiaiIsICJpc09iamVjdCIsICJrZXlzIiwgInNob3VsZE1lcmdlIiwgInR3b1ZhbHVlIiwgIm9iajEiLCAib2JqMiIsICJ3YXNPYmplY3RSZWZlcmVuY2VkIiwgImFycjEiLCAiYXJyMiIsICJvYmoiLCAiaW5mbyIsICJfX2V4dGVuZHMiLCAiZXh0ZW5kU3RhdGljcyIsICJkIiwgImIiLCAiX18iLCAiVGltZW91dEVycm9yIiwgIl9zdXBlciIsICJtZXNzYWdlIiwgImNhbGxXaXRoVGltZW91dCIsICJwcm9taXNlIiwgInRpbWVvdXQiLCAidGltZW91dEhhbmRsZSIsICJ0aW1lb3V0UHJvbWlzZSIsICJfcmVzb2x2ZSIsICJyZWplY3QiLCAicmVhc29uIiwgImlzV3JhcHBlZCIsICJEZWZlcnJlZCIsICJyZXNvbHZlIiwgIl9fcmVhZCIsICJfX3NwcmVhZEFycmF5IiwgIkJpbmRPbmNlRnV0dXJlIiwgIl9jYWxsYmFjayIsICJfdGhhdCIsICJfZXhwb3J0IiwgImV4cG9ydGVyIiwgImJhZ2dhZ2VVdGlscyIsICJpbnRlcm5hbCIsICJlc20iXQp9Cg==