mage-engine 3.16.1 → 3.16.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/mage.js +2 -2
  2. package/package.json +1 -1
package/dist/mage.js CHANGED
@@ -56234,7 +56234,7 @@ function applyMiddleware() {
56234
56234
 
56235
56235
  var thunk = createThunkMiddleware();
56236
56236
  thunk.withExtraArgument = createThunkMiddleware;var name = "mage-engine";
56237
- var version = "3.16.1";
56237
+ var version = "3.16.2";
56238
56238
  var description = "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.";
56239
56239
  var main = "dist/mage.js";
56240
56240
  var author = {
@@ -57548,7 +57548,7 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
57548
57548
  url = url || createURL(base64, sourcemapArg, enableUnicodeArg);
57549
57549
  return new Worker(url, options);
57550
57550
  };
57551
- }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIEFQUExZOiB7CiAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnCiAgICAgICAgfQogICAgICB9LAogICAgICBWRUhJQ0xFOiB7CiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cXVhdGVybmlvbicKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczp2ZWhpY2xlOnJlc2V0JywKICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsCiAgICAgICAgRElSRUNUSU9OOiAncGh5c2ljczp2ZWhpY2xlOmRpcmVjdGlvbicKICAgICAgfSwKICAgICAgRUZGRUNUUzogewogICAgICAgIEVYUExPU0lPTjogJ3BoeXNpY3M6ZWZmZWN0czpleHBsb3Npb24nCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsKCiAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7CiAgICAgICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307CiAgICAgICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIERpc3BhdGNoZXIgPSBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRQaHlzaWNzVXBkYXRlIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5VUERBVEUsCiAgICAgICAgICBkdDogZHQKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRSZWFkeUV2ZW50IiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuUkVBRFkKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRUZXJtaW5hdGVFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZEJvZHlVcGRhdGUiLCBmdW5jdGlvbiAodXVpZCwgcG9zaXRpb24sIHJvdGF0aW9uLCBkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9LAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kRGlzcGF0Y2hFdmVudCIsIGZ1bmN0aW9uICh1dWlkLCBldmVudE5hbWUsIGV2ZW50RGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRElTUEFUQ0gsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUsCiAgICAgICAgICBldmVudERhdGE6IGV2ZW50RGF0YQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH07CiAgICB2YXIgZGlzcGF0Y2hlciQxID0gbmV3IERpc3BhdGNoZXIoKTsKCiAgICB2YXIgYXBwbHlNYXRyaXg0VG9WZWN0b3IzID0gZnVuY3Rpb24gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKF9yZWYpIHsKICAgICAgdmFyIF9yZWYkeCA9IF9yZWYueCwKICAgICAgICAgIHggPSBfcmVmJHggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHgsCiAgICAgICAgICBfcmVmJHkgPSBfcmVmLnksCiAgICAgICAgICB5ID0gX3JlZiR5ID09PSB2b2lkIDAgPyAwIDogX3JlZiR5LAogICAgICAgICAgX3JlZiR6ID0gX3JlZi56LAogICAgICAgICAgeiA9IF9yZWYkeiA9PT0gdm9pZCAwID8gMCA6IF9yZWYkejsKICAgICAgdmFyIG1hdHJpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107CiAgICAgIHZhciB3ID0gMSAvIChtYXRyaXhbM10gKiB4ICsgbWF0cml4WzddICogeSArIG1hdHJpeFsxMV0gKiB6ICsgbWF0cml4WzE1XSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgeDogKG1hdHJpeFswXSAqIHggKyBtYXRyaXhbNF0gKiB5ICsgbWF0cml4WzhdICogeiArIG1hdHJpeFsxMl0pICogdywKICAgICAgICB5OiAobWF0cml4WzFdICogeCArIG1hdHJpeFs1XSAqIHkgKyBtYXRyaXhbOV0gKiB6ICsgbWF0cml4WzEzXSkgKiB3LAogICAgICAgIHo6IChtYXRyaXhbMl0gKiB4ICsgbWF0cml4WzZdICogeSArIG1hdHJpeFsxMF0gKiB6ICsgbWF0cml4WzE0XSkgKiB3CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBjcmVhdGVSaWdpZEJvZHkgPSBmdW5jdGlvbiBjcmVhdGVSaWdpZEJvZHkoc2hhcGUsIG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gb3B0aW9ucy5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IG9wdGlvbnMubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gb3B0aW9ucy5mcmljdGlvbiwKICAgICAgICAgIF9vcHRpb25zJHJlc3RpdHV0aW9uID0gb3B0aW9ucy5yZXN0aXR1dGlvbiwKICAgICAgICAgIHJlc3RpdHV0aW9uID0gX29wdGlvbnMkcmVzdGl0dXRpb24gPT09IHZvaWQgMCA/IC45IDogX29wdGlvbnMkcmVzdGl0dXRpb24sCiAgICAgICAgICBfb3B0aW9ucyRkYW1waW5nID0gb3B0aW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9vcHRpb25zJGRhbXBpbmcgPT09IHZvaWQgMCA/IHsKICAgICAgICBsaW5lYXI6IDAuMiwKICAgICAgICBhbmd1bGFyOiAwLjIKICAgICAgfSA6IF9vcHRpb25zJGRhbXBpbmc7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZSh0cmFuc2Zvcm0pOwogICAgICB2YXIgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApOwogICAgICBzaGFwZS5jYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIHJiSW5mbyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgc2hhcGUsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBib2R5ID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkocmJJbmZvKTsKCiAgICAgIGlmIChtYXNzID4gMCkgewogICAgICAgIGJvZHkuc2V0RnJpY3Rpb24oZnJpY3Rpb24pOwogICAgICAgIGJvZHkuc2V0UmVzdGl0dXRpb24ocmVzdGl0dXRpb24pOwogICAgICAgIGJvZHkuc2V0RGFtcGluZyhkYW1waW5nLmxpbmVhciwgZGFtcGluZy5hbmd1bGFyKTsKICAgICAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIH0gLy8gc3RvcmluZyB1dWlkIGZvciBmdXR1cmUgcmVmZXJlbmNlCgoKICAgICAgYm9keS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICByZXR1cm4gYm9keTsKICAgIH07CiAgICB2YXIgYWRkTW9kZWwgPSBmdW5jdGlvbiBhZGRNb2RlbChvcHRpb25zKSB7CiAgICAgIHZhciB1dWlkID0gb3B0aW9ucy51dWlkLAogICAgICAgICAgdmVydGljZXMgPSBvcHRpb25zLnZlcnRpY2VzLAogICAgICAgICAgbWF0cmljZXMgPSBvcHRpb25zLm1hdHJpY2VzLAogICAgICAgICAgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcywKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBfb3B0aW9ucyRtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgbWFzcyA9IF9vcHRpb25zJG1hc3MgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRtYXNzLAogICAgICAgICAgX29wdGlvbnMkZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfb3B0aW9ucyRmcmljdGlvbiA9PT0gdm9pZCAwID8gMiA6IF9vcHRpb25zJGZyaWN0aW9uOwogICAgICB2YXIgc2NhbGUgPSBERUZBVUxUX1NDQUxFOwogICAgICB2YXIgYnRhID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciBidGIgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgdHJpTWVzaCA9IG5ldyBBbW1vLmJ0VHJpYW5nbGVNZXNoKHRydWUsIGZhbHNlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY29tcG9uZW50cyA9IHZlcnRpY2VzW2ldOwogICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbaV0gPyBpbmRleGVzW2ldIDogbnVsbDsKICAgICAgICB2YXIgbWF0cml4ID0gQXJyYXkuZnJvbShtYXRyaWNlc1tpXSk7CgogICAgICAgIGlmIChpbmRleCkgewogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbmRleC5sZW5ndGg7IGogKz0gMykgewogICAgICAgICAgICB2YXIgYWkgPSBpbmRleFtqXSAqIDM7CiAgICAgICAgICAgIHZhciBiaSA9IGluZGV4W2ogKyAxXSAqIDM7CiAgICAgICAgICAgIHZhciBjaSA9IGluZGV4W2ogKyAyXSAqIDM7CiAgICAgICAgICAgIHZhciB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1thaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1thaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYWkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbYmldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbYmkgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2JpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgdmFyIHZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2NpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2NpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tjaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTsKICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopOwogICAgICAgICAgICBidGMuc2V0VmFsdWUodmMueCwgdmMueSwgdmMueik7CiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgY29tcG9uZW50cy5sZW5ndGg7IF9qICs9IDkpIHsKICAgICAgICAgICAgdmFyIF92YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDBdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyAzXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgNF0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDVdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICB2YXIgX3ZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgNl0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDddLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyA4XQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgYnRhLnNldFZhbHVlKF92YS54LCBfdmEueSwgX3ZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUoX3ZiLngsIF92Yi55LCBfdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZShfdmMueCwgX3ZjLnksIF92Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgbG9jYWxTY2FsZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTsKICAgICAgdHJpTWVzaC5zZXRTY2FsaW5nKGxvY2FsU2NhbGUpOwogICAgICBBbW1vLmRlc3Ryb3kobG9jYWxTY2FsZSk7CiAgICAgIHZhciBjb2xsaXNpb25TaGFwZSA9IG5ldyBBbW1vLmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUodHJpTWVzaCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIGNvbGxpc2lvblNoYXBlLnJlc291cmNlcyA9IFt0cmlNZXNoXTsKICAgICAgQW1tby5kZXN0cm95KGJ0YSk7CiAgICAgIEFtbW8uZGVzdHJveShidGIpOwogICAgICBBbW1vLmRlc3Ryb3koYnRjKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY29sbGlzaW9uU2hhcGUsIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5zZXRCb2R5KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuTUVTSCwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGFkZEJveCA9IGZ1bmN0aW9uIGFkZEJveChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBfZGF0YSRtYXNzID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MgPT09IHZvaWQgMCA/IDAgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkZnJpY3Rpb24gPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbiA9PT0gdm9pZCAwID8gMiA6IF9kYXRhJGZyaWN0aW9uOwogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIDAuNSwgaGVpZ2h0ICogMC41LCBsZW5ndGggKiAwLjUpKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5zZXRCb2R5KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuQk9YLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkU3BoZXJlID0gZnVuY3Rpb24gYWRkU3BoZXJlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICByYWRpdXMgPSBkYXRhLnJhZGl1cywKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBfZGF0YSRtYXNzMiA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzMiA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MyLAogICAgICAgICAgX2RhdGEkZnJpY3Rpb24yID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24yID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb24yOwogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cyk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuc2V0Qm9keSh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLlNQSEVSRSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHNldExpbmVhclZlbG9jaXR5ID0gZnVuY3Rpb24gc2V0TGluZWFyVmVsb2NpdHkoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIF9kYXRhJHZlbG9jaXR5ID0gZGF0YS52ZWxvY2l0eSwKICAgICAgICAgIHZlbG9jaXR5ID0gX2RhdGEkdmVsb2NpdHkgPT09IHZvaWQgMCA/IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZIDogX2RhdGEkdmVsb2NpdHk7CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBuZXcgQW1tby5idFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7CiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7CiAgICAgICAgQW1tby5kZXN0cm95KGxpbmVhclZlbG9jaXR5KTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIHNldFBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQyID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudDIuYm9keTsKCiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgfTsKICAgIHZhciBhcHBseUltcHVzZSA9IGZ1bmN0aW9uIGFwcGx5SW1wdXNlKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJGltcHVsc2UgPSBfcmVmLmltcHVsc2UsCiAgICAgICAgICBpbXB1bHNlID0gX3JlZiRpbXB1bHNlID09PSB2b2lkIDAgPyBERUZBVUxUX0lNUFVMU0UgOiBfcmVmJGltcHVsc2U7CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQzID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudDMuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBpbXB1bHNlVmVjdG9yID0gbmV3IEFtbW8uYnRWZWN0b3IzKGltcHVsc2UueCwgaW1wdWxzZS55LCBpbXB1bHNlLnopOwogICAgICAgIGJvZHkuYXBwbHlDZW50cmFsSW1wdWxzZShpbXB1bHNlVmVjdG9yKTsKICAgICAgICBBbW1vLmRlc3Ryb3koaW1wdWxzZVZlY3Rvcik7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlRWxlbWVudFVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZUVsZW1lbnRVcGRhdGUoX3JlZjIsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZjIuYm9keSwKICAgICAgICAgIHV1aWQgPSBfcmVmMi51dWlkLAogICAgICAgICAgX3JlZjIkc3RhdGUgPSBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5zZXRCb2R5KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50LAogICAgICAgICAgZGlyZWN0aW9uID0gc3RhdGUuZGlyZWN0aW9uLAogICAgICAgICAgY2FtZXJhRGlyZWN0aW9uID0gc3RhdGUuY2FtZXJhRGlyZWN0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IHN0YXRlLnF1YXRlcm5pb24sCiAgICAgICAgICBwb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB2YXIgTUFYX1NQRUVEID0gMTsKICAgICAgdmFyIHdhbGtWZWxvY2l0eSA9IC4xOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IGJvZHkuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICB2YXIgc3BlZWQgPSBsaW5lYXJWZWxvY2l0eS5sZW5ndGgoKTsKICAgICAgICB2YXIgZm9yd2FyZERpciA9IHRyYW5zZm9ybS5nZXRCYXNpcygpLmdldFJvdygyKTsKICAgICAgICBmb3J3YXJkRGlyLm5vcm1hbGl6ZSgpOwogICAgICAgIHZhciB3YWxrRGlyZWN0aW9uID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAuMCwgMC4wLCAwLjApOwogICAgICAgIHZhciB3YWxrU3BlZWQgPSB3YWxrVmVsb2NpdHkgKiBkdDsKCiAgICAgICAgaWYgKG1vdmVtZW50LmZvcndhcmQpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSArIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpICsgZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSArIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmIChtb3ZlbWVudC5iYWNrd2FyZHMpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSAtIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpIC0gZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSAtIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmICghbW92ZW1lbnQuZm9yd2FyZCAmJiAhbW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSAqIDAuMik7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSAqIDAuMik7CiAgICAgICAgfSBlbHNlIGlmIChzcGVlZCA8IE1BWF9TUEVFRCkgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKyBjYW1lcmFEaXJlY3Rpb24ueCAqIHdhbGtTcGVlZCk7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSArIGNhbWVyYURpcmVjdGlvbi56ICogd2Fsa1NwZWVkKTsKICAgICAgICB9CgogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIGJvZHkuZ2V0TW90aW9uU3RhdGUoKS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGJvZHkuc2V0Q2VudGVyT2ZNYXNzVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdmFyIG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICB2YXIgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTsKICAgICAgICBkaXNwYXRjaGVyLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgQ2xvY2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBDbG9jaygpIHsKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xvY2spOwoKICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhDbG9jaywgW3sKICAgICAgICBrZXk6ICJnZXREZWx0YSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlbHRhKCkgewogICAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwoKICAgICAgICAgIGlmICh0aGlzLnRpbWVzdGFtcCkgewogICAgICAgICAgICB2YXIgZGVsdGEgPSB0aW1lIC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIGRlbHRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBDbG9jazsKICAgIH0oKTsKCiAgICB2YXIgV29ybGQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBXb3JsZCgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV29ybGQpOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImluaXQiLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgdmFyIF9vcHRpb25zJGdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHksCiAgICAgICAgICAgICAgZ3Jhdml0eSA9IF9vcHRpb25zJGdyYXZpdHkgPT09IHZvaWQgMCA/IEdSQVZJVFkgOiBfb3B0aW9ucyRncmF2aXR5OwogICAgICAgICAgX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IG5ldyBBbW1vLmJ0RGVmYXVsdENvbGxpc2lvbkNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgIF90aGlzLmRpc3BhdGNoZXIgPSBuZXcgQW1tby5idENvbGxpc2lvbkRpc3BhdGNoZXIoX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBfdGhpcy5icm9hZHBoYXNlID0gbmV3IEFtbW8uYnREYnZ0QnJvYWRwaGFzZSgpOwogICAgICAgICAgX3RoaXMuc29sdmVyID0gbmV3IEFtbW8uYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIoKTsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQgPSBuZXcgQW1tby5idERpc2NyZXRlRHluYW1pY3NXb3JsZChfdGhpcy5kaXNwYXRjaGVyLCBfdGhpcy5icm9hZHBoYXNlLCBfdGhpcy5zb2x2ZXIsIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwoKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc2V0R3Jhdml0eShuZXcgQW1tby5idFZlY3RvcjMoZ3Jhdml0eS54LCBncmF2aXR5LnksIGdyYXZpdHkueikpOyAvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZ2hvc3RPYmplY3QgY29sbGlzaW9ucwoKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmdldEJyb2FkcGhhc2UoKS5nZXRPdmVybGFwcGluZ1BhaXJDYWNoZSgpLnNldEludGVybmFsR2hvc3RQYWlyQ2FsbGJhY2sobmV3IEFtbW8uYnRHaG9zdFBhaXJDYWxsYmFjaygpKTsKCiAgICAgICAgICBfdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICBpZiAoX3RoaXMuaGFzRWxlbWVudCh1dWlkKSkgewogICAgICAgICAgICBfdGhpcy5lbGVtZW50c1t1dWlkXS5kZWxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJyZW1vdmVEZWxldGVkRWxlbWVudHMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZpbHRlcihmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZDsKICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgZGVsZXRlIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaGFzRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmluY2x1ZGVzKHV1aWQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldEVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImlzSW5pdGlhbGlzZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuaW5pdGlhbGlzZWQ7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZ2V0RHluYW1pY3NXb3JsZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5keW5hbWljc1dvcmxkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZFJpZ2lkQm9keSIsIGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRBY3Rpb24iLCBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZEFjdGlvbihhY3Rpb24pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZENvbGxpc2lvbk9iamVjdCIsIGZ1bmN0aW9uIChjb2xsaXNpb25PYmplY3QpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGNvbGxpc2lvbk9iamVjdCk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic3RlcFNpbXVsYXRpb24iLCBmdW5jdGlvbiAoZHQpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc3RlcFNpbXVsYXRpb24oZHQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNpbXVsYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGR0ID0gX3RoaXMuY2xvY2suZ2V0RGVsdGEoKTsKCiAgICAgICAgICBfdGhpcy5zdGVwU2ltdWxhdGlvbihkdCk7CgogICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5CT1g6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlNQSEVSRToKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuTUVTSDoKICAgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudFVwZGF0ZShlbGVtZW50LCBkdCk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuUExBWUVSOgogICAgICAgICAgICAgICAgICBoYW5kbGVQbGF5ZXJVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlZFSElDTEU6CiAgICAgICAgICAgICAgICAgIGhhbmRsZVZlaGljbGVVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIF90aGlzLmNhbGN1bGF0ZUNvbGxpc2lvbnMoKTsKCiAgICAgICAgICBfdGhpcy5yZW1vdmVEZWxldGVkRWxlbWVudHMoKTsKCiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFBoeXNpY3NVcGRhdGUoZHQpOwogICAgICAgICAgX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMuc2ltdWxhdGUuYmluZChfdGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImNhbGN1bGF0ZUNvbGxpc2lvbnMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYW1tb0Rpc3BhdGNoZXIgPSBfdGhpcy5keW5hbWljc1dvcmxkLmdldERpc3BhdGNoZXIoKTsKCiAgICAgICAgICB2YXIgbnVtTWFuaWZvbGRzID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TnVtTWFuaWZvbGRzKCk7CgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1NYW5pZm9sZHM7IGkrKykgewogICAgICAgICAgICB2YXIgY29udGFjdE1hbmlmb2xkID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwoaSk7CiAgICAgICAgICAgIHZhciByYjAgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkwKCksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgICAgICB2YXIgcmIxID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MSgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIG51bUNvbnRhY3RzID0gY29udGFjdE1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7IC8vIHRoaXMgaXRlcmF0aW9uIGRvZXNuJ3QgaGF2ZSB1dWlkcwoKICAgICAgICAgICAgaWYgKCFyYjAudXVpZCB8fCAhcmIxLnV1aWQpIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgY29udGFjdHMgPSBbXTsKCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtQ29udGFjdHM7IGorKykgewogICAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQgPSBjb250YWN0TWFuaWZvbGQuZ2V0Q29udGFjdFBvaW50KGopOwogICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbnRhY3RQb2ludC5nZXREaXN0YW5jZSgpOwogICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IDAuMCkgY29udGludWU7CiAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5MCA9IHJiMC5nZXRMaW5lYXJWZWxvY2l0eSgpOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTEgPSByYjEuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MwID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkEoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MxID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkIoKTsKICAgICAgICAgICAgICB2YXIgbG9jYWxQb3MwID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRBKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QigpOwogICAgICAgICAgICAgIGNvbnRhY3RzLnB1c2goewogICAgICAgICAgICAgICAgZGlzdGFuY2U6IGRpc3RhbmNlLAogICAgICAgICAgICAgICAgZWxlbWVudHM6IFt7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMC51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMC55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MwLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMS51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMS55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MxLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIwLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIxLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZEVsZW1lbnQiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgX3RoaXMuZWxlbWVudHNbZGF0YS51dWlkXSA9IGRhdGE7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidXBkYXRlQm9keVN0YXRlIiwgZnVuY3Rpb24gKF9yZWYpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlKSwgc3RhdGUpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInRlcm1pbmF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5keW5hbWljc1dvcmxkKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5zb2x2ZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmRpc3BhdGNoZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRUZXJtaW5hdGVFdmVudCgpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307CiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuc29sdmVyID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDsKICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhXb3JsZCwgW3sKICAgICAgICBrZXk6ICJkaXNwb3NlQm9keSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VCb2R5KF9yZWYyKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTsKICAgICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5yZW1vdmVSaWdpZEJvZHkoZWxlbWVudC5ib2R5KTsKICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh1dWlkKTsKICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRWxlbWVudERpc3Bvc2VkKHsKICAgICAgICAgICAgdXVpZDogdXVpZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gV29ybGQ7CiAgICB9KCk7CiAgICB2YXIgd29ybGQgPSBuZXcgV29ybGQoKTsKCiAgICB2YXIgREVGQVVMVF9ST0xMX0lORkxVRU5DRSA9IDAuMjsKICAgIHZhciBERUZBVUxUX0ZSSUNUSU9OID0gMTAwMDsKICAgIHZhciBERUZBVUxUX01BU1MgPSA4MDA7CiAgICB2YXIgYWRkVmVoaWNsZSA9IGZ1bmN0aW9uIGFkZFZlaGljbGUoZGF0YSkgewogICAgICB2YXIgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aGVlbHMgPSBkYXRhLndoZWVscywKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVNTIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIHdpZHRoID0gX2RhdGEkd2lkdGggPT09IHZvaWQgMCA/IDEuOCA6IF9kYXRhJHdpZHRoLAogICAgICAgICAgX2RhdGEkaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBoZWlnaHQgPSBfZGF0YSRoZWlnaHQgPT09IHZvaWQgMCA/IC42IDogX2RhdGEkaGVpZ2h0LAogICAgICAgICAgX2RhdGEkbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBsZW5ndGggPSBfZGF0YSRsZW5ndGggPT09IHZvaWQgMCA/IDQgOiBfZGF0YSRsZW5ndGgsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyBERUZBVUxUX0ZSSUNUSU9OIDogX2RhdGEkZnJpY3Rpb24sCiAgICAgICAgICBfZGF0YSRyb2xsSW5mbHVlbmNlID0gZGF0YS5yb2xsSW5mbHVlbmNlLAogICAgICAgICAgcm9sbEluZmx1ZW5jZSA9IF9kYXRhJHJvbGxJbmZsdWVuY2UgPT09IHZvaWQgMCA/IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UgOiBfZGF0YSRyb2xsSW5mbHVlbmNlLAogICAgICAgICAgX2RhdGEkd2hlZWxzT3B0aW9ucyA9IGRhdGEud2hlZWxzT3B0aW9ucywKICAgICAgICAgIHdoZWVsc09wdGlvbnMgPSBfZGF0YSR3aGVlbHNPcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHdoZWVsc09wdGlvbnMsCiAgICAgICAgICBfZGF0YSRzdXNwZW5zaW9ucyA9IGRhdGEuc3VzcGVuc2lvbnMsCiAgICAgICAgICBzdXNwZW5zaW9ucyA9IF9kYXRhJHN1c3BlbnNpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHN1c3BlbnNpb25zOwogICAgICB2YXIgX3doZWVsc09wdGlvbnMkYmFjayA9IHdoZWVsc09wdGlvbnMuYmFjaywKICAgICAgICAgIGJhY2sgPSBfd2hlZWxzT3B0aW9ucyRiYWNrID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGJhY2ssCiAgICAgICAgICBfd2hlZWxzT3B0aW9ucyRmcm9udCA9IHdoZWVsc09wdGlvbnMuZnJvbnQsCiAgICAgICAgICBmcm9udCA9IF93aGVlbHNPcHRpb25zJGZyb250ID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGZyb250OwogICAgICB2YXIgX2JhY2skYXhpc1Bvc2l0aW9uID0gYmFjay5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25CYWNrID0gX2JhY2skYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAtMSA6IF9iYWNrJGF4aXNQb3NpdGlvbiwKICAgICAgICAgIF9iYWNrJHJhZGl1cyA9IGJhY2sucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNCYWNrID0gX2JhY2skcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9iYWNrJHJhZGl1cywKICAgICAgICAgIF9iYWNrJGhhbGZUcmFjayA9IGJhY2suaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tCYWNrID0gX2JhY2skaGFsZlRyYWNrID09PSB2b2lkIDAgPyAxIDogX2JhY2skaGFsZlRyYWNrLAogICAgICAgICAgX2JhY2skYXhpc0hlaWdodCA9IGJhY2suYXhpc0hlaWdodCwKICAgICAgICAgIHdoZWVsQXhpc0hlaWdodEJhY2sgPSBfYmFjayRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9iYWNrJGF4aXNIZWlnaHQ7CiAgICAgIHZhciBfZnJvbnQkYXhpc1Bvc2l0aW9uID0gZnJvbnQuYXhpc1Bvc2l0aW9uLAogICAgICAgICAgYXhpc1Bvc2l0aW9uRnJvbnQgPSBfZnJvbnQkYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAxLjcgOiBfZnJvbnQkYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2Zyb250JHJhZGl1cyA9IGZyb250LnJhZGl1cywKICAgICAgICAgIHdoZWVsUmFkaXVzRnJvbnQgPSBfZnJvbnQkcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9mcm9udCRyYWRpdXMsCiAgICAgICAgICBfZnJvbnQkaGFsZlRyYWNrID0gZnJvbnQuaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tGcm9udCA9IF9mcm9udCRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfZnJvbnQkaGFsZlRyYWNrLAogICAgICAgICAgX2Zyb250JGF4aXNIZWlnaHQgPSBmcm9udC5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0RnJvbnQgPSBfZnJvbnQkYXhpc0hlaWdodCA9PT0gdm9pZCAwID8gLjMgOiBfZnJvbnQkYXhpc0hlaWdodDsKICAgICAgdmFyIF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9IHN1c3BlbnNpb25zLnN0aWZmbmVzcywKICAgICAgICAgIHN0aWZmbmVzcyA9IF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9PT0gdm9pZCAwID8gMjAuMCA6IF9zdXNwZW5zaW9ucyRzdGlmZm5lcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRkYW1waW5nID0gc3VzcGVuc2lvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfc3VzcGVuc2lvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gMi4zIDogX3N1c3BlbnNpb25zJGRhbXBpbmcsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPSBzdXNwZW5zaW9ucy5jb21wcmVzc2lvbiwKICAgICAgICAgIGNvbXByZXNzaW9uID0gX3N1c3BlbnNpb25zJGNvbXByZXNzID09PSB2b2lkIDAgPyA0LjQgOiBfc3VzcGVuc2lvbnMkY29tcHJlc3MsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkcmVzdExlbmcgPSBzdXNwZW5zaW9ucy5yZXN0TGVuZ3RoLAogICAgICAgICAgcmVzdExlbmd0aCA9IF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9PT0gdm9pZCAwID8gMC42IDogX3N1c3BlbnNpb25zJHJlc3RMZW5nOyAvLyBDaGFzc2lzCgogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIC41LCBoZWlnaHQgKiAuNSwgbGVuZ3RoICogLjUpKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgY2hhc3NpcyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgZ2VvbWV0cnksIGxvY2FsSW5lcnRpYSkpOwogICAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShjaGFzc2lzKTsgLy8gUmF5Y2FzdCBWZWhpY2xlCgogICAgICB2YXIgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7CiAgICAgIHZhciByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7CiAgICAgIHZhciB2ZWhpY2xlID0gbmV3IEFtbW8uYnRSYXljYXN0VmVoaWNsZSh0dW5pbmcsIGNoYXNzaXMsIHJheUNhc3Rlcik7CiAgICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTsKICAgICAgd29ybGQuYWRkQWN0aW9uKHZlaGljbGUpOwogICAgICB2YXIgd2hlZWxEaXJlY3Rpb25DUzAgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgLTEsIDApOwogICAgICB2YXIgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApOwoKICAgICAgdmFyIGFkZFdoZWVsID0gZnVuY3Rpb24gYWRkV2hlZWwoaXNGcm9udCwgcG9zLCByYWRpdXMpIHsKICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChwb3MsIHdoZWVsRGlyZWN0aW9uQ1MwLCB3aGVlbEF4bGVDUywgcmVzdExlbmd0aCwgcmFkaXVzLCB0dW5pbmcsIGlzRnJvbnQpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzKHN0aWZmbmVzcyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV93aGVlbHNEYW1waW5nQ29tcHJlc3Npb24oY29tcHJlc3Npb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9mcmljdGlvblNsaXAoZnJpY3Rpb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpOwogICAgICB9OwoKICAgICAgYWRkV2hlZWwodHJ1ZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKC13aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIHZlaGljbGUudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLnNldEJvZHkoewogICAgICAgIHR5cGU6IFRZUEVTLlZFSElDTEUsCiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLAogICAgICAgIHdoZWVsczogd2hlZWxzLAogICAgICAgIG9wdGlvbnM6IGRhdGEsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfVkVISUNMRV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0VmVoaWNsZVBvc2l0aW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUXVhdGVybmlvbiA9IGZ1bmN0aW9uIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0VmVoaWNsZSA9IGZ1bmN0aW9uIHJlc2V0VmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVZlaGljbGVVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIHZlaGljbGUgPSBfcmVmLnZlaGljbGUsCiAgICAgICAgICB3aGVlbHMgPSBfcmVmLndoZWVscywKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9WRUhJQ0xFX1NUQVRFIDogX3JlZiRzdGF0ZSwKICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TUEVFRCwgewogICAgICAgIHNwZWVkOiBzcGVlZAogICAgICB9KTsKICAgICAgdmFyIGJyZWFraW5nRm9yY2UgPSAwOwogICAgICB2YXIgZW5naW5lRm9yY2UgPSAwOwogICAgICB2YXIgX29wdGlvbnMkc3RlZXJpbmdDbGFtID0gb3B0aW9ucy5zdGVlcmluZ0NsYW1wLAogICAgICAgICAgc3RlZXJpbmdDbGFtcCA9IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19DTEFNUCA6IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSwKICAgICAgICAgIF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9IG9wdGlvbnMuc3RlZXJpbmdJbmNyZW1lbnQsCiAgICAgICAgICBzdGVlcmluZ0luY3JlbWVudCA9IF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgOiBfb3B0aW9ucyRzdGVlcmluZ0luY3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPSBvcHRpb25zLm1heEVuZ2luZUZvcmNlLAogICAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA6IF9vcHRpb25zJG1heEVuZ2luZUZvciwKICAgICAgICAgIF9vcHRpb25zJG1heEJyZWFraW5nRiA9IG9wdGlvbnMubWF4QnJlYWtpbmdGb3JjZSwKICAgICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIDogX29wdGlvbnMkbWF4QnJlYWtpbmdGOwoKICAgICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikgewogICAgICAgIGlmIChzcGVlZCA8IC0xKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5icmFraW5nKSB7CiAgICAgICAgaWYgKHNwZWVkID4gMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5sZWZ0KSB7CiAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IHN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3RhdGUucmlnaHQpIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiAtc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgLXN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiBzdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfUklHSFQpOwogICAgICB2YXIgdG0sIHAsIHEsIGk7CiAgICAgIHZhciBuID0gdmVoaWNsZS5nZXROdW1XaGVlbHMoKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpOwogICAgICAgIHRtID0gdmVoaWNsZS5nZXRXaGVlbFRyYW5zZm9ybVdTKGkpOwogICAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgICB2YXIgd2hlZWxVVUlEID0gd2hlZWxzW2ldOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh3aGVlbFVVSUQsIHAsIHEsIGR0KTsKICAgICAgfQoKICAgICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpOwogICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICB2YXIgZGlyZWN0aW9uID0gdmVoaWNsZS5nZXRGb3J3YXJkVmVjdG9yKCk7CiAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudCh1dWlkLCBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLkRJUkVDVElPTiwgewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfQogICAgICB9KTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0KTsKICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTsKICAgIH07CgogICAgdmFyIGNyZWF0ZUdob3N0Q29sbGlkZXIgPSBmdW5jdGlvbiBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgcG9zaXRpb24pIHsKICAgICAgdmFyIGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBnaG9zdENvbGxpZGVyLnNldENvbGxpc2lvblNoYXBlKG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICByZXR1cm4gewogICAgICAgIGdob3N0Q29sbGlkZXI6IGdob3N0Q29sbGlkZXIsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0KICAgICAgfTsKICAgIH07CiAgICB2YXIgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gZnVuY3Rpb24gZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIpIHsKICAgICAgdmFyIGZvckVhY2hDYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307CiAgICAgIHZhciBjb2xsaXNpb25zID0gZ2hvc3RDb2xsaWRlci5nZXROdW1PdmVybGFwcGluZ09iamVjdHMoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uczsgaSsrKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IEFtbW8uY2FzdE9iamVjdChnaG9zdENvbGxpZGVyLmdldE92ZXJsYXBwaW5nT2JqZWN0KGkpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBvYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvblBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247CgogICAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7CiAgICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICB9CgogICAgICByZXR1cm4gZXhwbG9zaW9uUG9zaXRpb247CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvbkltcHVsc2UgPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25JbXB1bHNlKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpIHsKICAgICAgdmFyIGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTsKICAgICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7CiAgICAgIHZhciBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTsKICAgICAgaW1wdWxzZS5zZXRZKGltcHVsc2UueSgpICsgc3RyZW5ndGgpOwogICAgICByZXR1cm4gaW1wdWxzZTsKICAgIH07CiAgICB2YXIgY3JlYXRlRXhwbG9zaW9uID0gZnVuY3Rpb24gY3JlYXRlRXhwbG9zaW9uKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sCiAgICAgICAgICBfcmVmJHJhZGl1cyA9IF9yZWYucmFkaXVzLAogICAgICAgICAgcmFkaXVzID0gX3JlZiRyYWRpdXMgPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TSVpFUy5TTUFMTCA6IF9yZWYkcmFkaXVzLAogICAgICAgICAgX3JlZiRzdHJlbmd0aCA9IF9yZWYuc3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aCA9IF9yZWYkc3RyZW5ndGggPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNIDogX3JlZiRzdHJlbmd0aDsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pOwoKICAgICAgICB2YXIgX2NyZWF0ZUdob3N0Q29sbGlkZXIgPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pLAogICAgICAgICAgICBnaG9zdENvbGxpZGVyID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIuZ2hvc3RDb2xsaWRlciwKICAgICAgICAgICAgdHJhbnNmb3JtID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIudHJhbnNmb3JtOwoKICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIGZ1bmN0aW9uIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgewogICAgICAgICAgdmFyIG9yaWdpbiA9IG9iamVjdFRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICAgIG9iamVjdC5hY3RpdmF0ZSh0cnVlKTsKICAgICAgICAgIG9iamVjdC5hcHBseUNlbnRyYWxJbXB1bHNlKGdldEV4cGxvc2lvbkltcHVsc2Uob3JpZ2luLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpKTsKICAgICAgICB9KTsKICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBoYW5kbGVMb2FkRXZlbnQgPSBmdW5jdGlvbiBoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKEFtbW8pIHsKICAgICAgICBzZWxmLkFtbW8gPSBBbW1vOwoKICAgICAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZikgewogICAgICAgICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7CgogICAgICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELkJPWDoKICAgICAgICAgICAgICBhZGRCb3goZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5TUEhFUkU6CiAgICAgICAgICAgICAgYWRkU3BoZXJlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuVkVISUNMRToKICAgICAgICAgICAgICBhZGRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuTU9ERUw6CiAgICAgICAgICAgICAgYWRkTW9kZWwoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5QTEFZRVI6CiAgICAgICAgICAgICAgYWRkUGxheWVyKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5MSU5FQVJfVkVMT0NJVFk6CiAgICAgICAgICAgICAgc2V0TGluZWFyVmVsb2NpdHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlFVQVRFUk5JT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkFQUExZLklNUFVMU0U6CiAgICAgICAgICAgICAgYXBwbHlJbXB1c2UoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFOgogICAgICAgICAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5ESVNQT1NFOgogICAgICAgICAgICAgIHdvcmxkLmRpc3Bvc2VCb2R5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FRkZFQ1RTLkVYUExPU0lPTjoKICAgICAgICAgICAgICBjcmVhdGVFeHBsb3Npb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURToKICAgICAgICAgICAgICB3b3JsZC50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB3b3JsZC5pbml0KG9wdGlvbnMpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kUmVhZHlFdmVudCgpOwogICAgICAgIHdvcmxkLnNpbXVsYXRlKCk7CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBsb2FkQW1tbyA9IGZ1bmN0aW9uIGxvYWRBbW1vKG9wdGlvbnMpIHsKICAgICAgdmFyIHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTsKICAgICAgaW1wb3J0U2NyaXB0cyhzY3JpcHRVcmwpOwogICAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpOwogICAgfTsKCiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZjIpIHsKICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhOwoKICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86CiAgICAgICAgICBsb2FkQW1tbyhkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9OwoKfSgpKTsKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy9jb25zdGFudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3MvbWVzc2FnZXMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL2xpYi9kaXNwYXRjaGVyLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9saWIvbWF0aC5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvZWxlbWVudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3BsYXllci5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvd29ybGQuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3ZlaGljbGVzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9lZmZlY3RzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTElCUkFSWV9OQU1FID0gJ2FtbW8uanMnO1xuXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gICAgQk9YOiAnQk9YJyxcbiAgICBTUEhFUkU6ICdTUEhFUkUnLFxuICAgIFZFSElDTEU6ICdWRUhJQ0xFJyxcbiAgICBNRVNIOiAnTUVTSCcsXG4gICAgUExBWUVSOiAnUExBWUVSJ1xufTtcblxuZXhwb3J0IGNvbnN0IENPTExJREVSX1RZUEVTID0ge1xuICAgIEJPWDogJ0JPWCcsXG4gICAgVkVISUNMRTogJ1ZFSElDTEUnLFxuICAgIFBMQVlFUjogJ1BMQVlFUicsXG4gICAgU1BIRVJFOiAnU1BIRVJFJ1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHtcbiAgICB2ZWhpY2xlU3RlZXJpbmc6IDAsXG4gICAgYWNjZWxlcmF0aW9uOiBmYWxzZSxcbiAgICBicmVha2luZzogZmFsc2UsXG4gICAgcmlnaHQ6IGZhbHNlLFxuICAgIGxlZnQ6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7XG4gICAgdmVsb2NpdHk6IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgIG1vdmVtZW50OiB7XG4gICAgICAgIGZvcndhcmQ6IGZhbHNlLFxuICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLFxuICAgICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgICAgcmlnaHQ6IGZhbHNlXG4gICAgfSxcbiAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgejogMFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDQUxFID0geyB4OiAxLCB5OiAxLCB6OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9RVUFURVJOSU9OID0geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IHsgeDogMCwgeTogMCwgejogMCB9O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTVBVTFNFID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBESVNBQkxFX0RFQUNUSVZBVElPTiA9IDQ7XG5leHBvcnQgY29uc3QgR1JBVklUWSA9IHsgeDogMCwgeTogLTEwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBGUk9OVF9MRUZUID0gMDtcbmV4cG9ydCBjb25zdCBGUk9OVF9SSUdIVCA9IDE7XG5leHBvcnQgY29uc3QgQkFDS19MRUZUID0gMjtcbmV4cG9ydCBjb25zdCBCQUNLX1JJR0hUID0gMztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UID0gLjA0O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgPSAuNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgPSAyMDAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFID0gMTAwO1xuXG5leHBvcnQgY29uc3QgRVhQTE9TSU9OX1NJWkVTID0ge1xuICAgIFNNQUxMOiA0LFxuICAgIE1FRElVTTogNixcbiAgICBMQVJHRTogOCxcbiAgICBNQVNTSVZFOiAxMlxufTtcblxuZXhwb3J0IGNvbnN0IEVYUExPU0lPTl9TVFJFTkdUSFMgPSB7XG4gICAgVkVSWV9XRUFLOiAyLFxuICAgIFdFQUs6IDQsXG4gICAgTUVESVVNOiA4LFxuICAgIExBUkdFOiAxNixcbiAgICBNQVNTSVZFOiAzMixcbiAgICBPS19OTzogNjRcbn07IiwiZXhwb3J0IGNvbnN0IFBIWVNJQ1NfRVZFTlRTID0ge1xuICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsXG4gICAgVEVSTUlOQVRFOiAncGh5c2ljczp0ZXJtaW5hdGUnLFxuICAgIExPQUQ6IHtcbiAgICAgICAgQU1NTzogJ3BoeXNpY3M6bG9hZDphbW1vJyxcbiAgICB9LFxuICAgIFJFQURZOiAncGh5c2ljczpyZWFkeScsXG4gICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsXG4gICAgVVBEQVRFOiAncGh5c2ljczp1cGRhdGUnLFxuICAgIFxuICAgIEFERDoge1xuICAgICAgICBCT1g6ICdwaHlzaWNzOmFkZDpib3gnLFxuICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsXG4gICAgICAgIE1PREVMOiAncGh5c2ljczphZGQ6bW9kZWwnLFxuICAgICAgICBQTEFZRVI6ICdwaHlzaWNzOmFkZDpwbGF5ZXInLFxuICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnLFxuICAgIH0sXG5cbiAgICBFTEVNRU5UOiB7XG4gICAgICAgIERJU1BPU0U6ICdwaHlzaWNzOmVsZW1lbnQ6ZGlzcG9zZScsXG4gICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLFxuICAgICAgICBVUERBVEU6ICdwaHlzaWNzOmVsZW1lbnQ6dXBkYXRlJyxcbiAgICAgICAgQ1JFQVRFRDogJ3BoeXNpY3M6ZWxlbWVudDpjcmVhdGVkJyxcblxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpxdWF0ZXJuaW9uJyxcbiAgICAgICAgICAgIExJTkVBUl9WRUxPQ0lUWTogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6bGluZWFyX3ZlbG9jaXR5J1xuICAgICAgICB9LFxuXG4gICAgICAgIEFQUExZOiB7XG4gICAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVkVISUNMRToge1xuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpxdWF0ZXJuaW9uJ1xuICAgICAgICB9LFxuICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsXG4gICAgICAgIFxuICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsXG4gICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nXG4gICAgfSxcblxuICAgIEVGRkVDVFM6IHtcbiAgICAgICAgRVhQTE9TSU9OOiAncGh5c2ljczplZmZlY3RzOmV4cGxvc2lvbidcbiAgICB9XG59OyIsImltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlciB7XG5cbiAgICBzZW5kUGh5c2ljc1VwZGF0ZSA9IGR0ID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlVQREFURSwgZHQgfSlcbiAgICBzZW5kUmVhZHlFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZIH0pO1xuICAgIHNlbmRUZXJtaW5hdGVFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURSB9KTtcblxuICAgIHNlbmRCb2R5VXBkYXRlID0gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQpID0+IHBvc3RNZXNzYWdlKHtcbiAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFLFxuICAgICAgICB1dWlkLFxuICAgICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54KCksIHk6IHBvc2l0aW9uLnkoKSwgejogcG9zaXRpb24ueigpIH0sXG4gICAgICAgIHF1YXRlcm5pb246IHsgeDogcm90YXRpb24ueCgpLCB5OiByb3RhdGlvbi55KCksIHo6IHJvdGF0aW9uLnooKSwgdzogcm90YXRpb24udygpIH0sXG4gICAgICAgIGR0XG4gICAgfSk7XG5cbiAgICBzZW5kRGlzcGF0Y2hFdmVudCA9ICh1dWlkLCBldmVudE5hbWUsIGV2ZW50RGF0YSkgPT4gcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRElTUEFUQ0gsXG4gICAgICAgIHV1aWQsXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnREYXRhXG4gICAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRGlzcGF0Y2hlcigpOyIsImV4cG9ydCBjb25zdCBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSAoeyB4ID0gMCwgeSA9IDAsIHogPSAwIH0sIG1hdHJpeCA9IFtdKSA9PiB7XG4gICAgY29uc3QgdyA9IDEgLyAoIG1hdHJpeFsgMyBdICogeCArIG1hdHJpeFsgNyBdICogeSArIG1hdHJpeFsgMTEgXSAqIHogKyBtYXRyaXhbIDE1IF0gKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6ICggbWF0cml4WyAwIF0gKiB4ICsgbWF0cml4WyA0IF0gKiB5ICsgbWF0cml4WyA4IF0gKiB6ICsgbWF0cml4WyAxMiBdICkgKiB3LFxuICAgICAgICB5OiAoIG1hdHJpeFsgMSBdICogeCArIG1hdHJpeFsgNSBdICogeSArIG1hdHJpeFsgOSBdICogeiArIG1hdHJpeFsgMTMgXSApICogdyxcbiAgICAgICAgejogKCBtYXRyaXhbIDIgXSAqIHggKyBtYXRyaXhbIDYgXSAqIHkgKyBtYXRyaXhbIDEwIF0gKiB6ICsgbWF0cml4WyAxNCBdICkgKiB3LFxuICAgIH1cbn07IiwiaW1wb3J0IGRpc3BhdGNoZXIgZnJvbSAnLi9saWIvZGlzcGF0Y2hlcic7XG5pbXBvcnQgd29ybGQgZnJvbSAnLi93b3JsZCc7XG5cbmltcG9ydCB7XG4gICAgYXBwbHlNYXRyaXg0VG9WZWN0b3IzXG59IGZyb20gJy4vbGliL21hdGgnO1xuXG5pbXBvcnQge1xuICAgIERFRkFVTFRfUklHSURCT0RZX1NUQVRFLFxuICAgIFRZUEVTLFxuICAgIERFRkFVTFRfU0NBTEUsXG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFksXG4gICAgREVGQVVMVF9JTVBVTFNFXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSaWdpZEJvZHkgPSAoc2hhcGUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIHV1aWQsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBxdWF0ZXJuaW9uLFxuICAgICAgICBtYXNzLFxuICAgICAgICBmcmljdGlvbixcbiAgICAgICAgcmVzdGl0dXRpb24gPSAuOSxcbiAgICAgICAgZGFtcGluZyA9IHsgbGluZWFyOiAwLjIsIGFuZ3VsYXI6IDAuMiB9XG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG4gICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpO1xuICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZSh0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgICBzaGFwZS5jYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgbG9jYWxJbmVydGlhKTtcblxuICAgIGNvbnN0IHJiSW5mbyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgc2hhcGUsIGxvY2FsSW5lcnRpYSk7XG4gICAgY29uc3QgYm9keSA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KHJiSW5mbyk7XG5cbiAgICBcblxuICAgIGlmIChtYXNzID4gMCkge1xuICAgICAgICBib2R5LnNldEZyaWN0aW9uKGZyaWN0aW9uKTtcbiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7XG4gICAgICAgIGJvZHkuc2V0RGFtcGluZyhkYW1waW5nLmxpbmVhciwgZGFtcGluZy5hbmd1bGFyKTtcbiAgICAgICAgYm9keS5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pO1xuICAgIH1cblxuICAgIC8vIHN0b3JpbmcgdXVpZCBmb3IgZnV0dXJlIHJlZmVyZW5jZVxuICAgIGJvZHkudXVpZCA9IHV1aWQ7XG5cbiAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG5cbiAgICByZXR1cm4gYm9keTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZE1vZGVsID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIHV1aWQsXG4gICAgICAgIHZlcnRpY2VzLFxuICAgICAgICBtYXRyaWNlcyxcbiAgICAgICAgaW5kZXhlcyxcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIHF1YXRlcm5pb24sXG4gICAgICAgIG1hc3MgPSAwLFxuICAgICAgICBmcmljdGlvbiA9IDJcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHNjYWxlID0gREVGQVVMVF9TQ0FMRTtcblxuICAgIGNvbnN0IGJ0YSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IGJ0YyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IHRyaU1lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCh0cnVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleGVzW2ldID8gaW5kZXhlc1tpXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IEFycmF5LmZyb20obWF0cmljZXNbaV0pO1xuXG4gICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRleC5sZW5ndGg7IGogKz0gMykge1xuICAgICAgICAgICAgY29uc3QgYWkgPSBpbmRleFtqXSAqIDM7XG4gICAgICAgICAgICBjb25zdCBiaSA9IGluZGV4W2ogKyAxXSAqIDM7XG4gICAgICAgICAgICBjb25zdCBjaSA9IGluZGV4W2ogKyAyXSAqIDM7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsgeDogY29tcG9uZW50c1thaV0sIHk6IGNvbXBvbmVudHNbYWkgKyAxXSwgejogY29tcG9uZW50c1thaSArIDJdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbYmldLCB5OiBjb21wb25lbnRzW2JpICsgMV0sIHo6IGNvbXBvbmVudHNbYmkgKyAyXSB9LCBtYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2NpXSwgeTogY29tcG9uZW50c1tjaSArIDFdLCB6OiBjb21wb25lbnRzW2NpICsgMl0gfSwgbWF0cml4KTtcblxuICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopO1xuICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopO1xuICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopO1xuICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbXBvbmVudHMubGVuZ3RoOyBqICs9IDkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDBdLCB5OiBjb21wb25lbnRzW2ogKyAxXSwgejogY29tcG9uZW50c1tqICsgMl0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDNdLCB5OiBjb21wb25lbnRzW2ogKyA0XSwgejogY29tcG9uZW50c1tqICsgNV0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDZdLCB5OiBjb21wb25lbnRzW2ogKyA3XSwgejogY29tcG9uZW50c1tqICsgOF0gfSwgbWF0cml4KTtcblxuICAgICAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTtcbiAgICAgICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7XG4gICAgICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopO1xuICAgICAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxTY2FsZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTtcbiAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7XG4gICAgQW1tby5kZXN0cm95KGxvY2FsU2NhbGUpO1xuXG4gICAgY29uc3QgY29sbGlzaW9uU2hhcGUgPSBuZXcgQW1tby5idEJ2aFRyaWFuZ2xlTWVzaFNoYXBlKHRyaU1lc2gsIHRydWUsIHRydWUpO1xuICAgIGNvbGxpc2lvblNoYXBlLnJlc291cmNlcyA9IFt0cmlNZXNoXTtcblxuICAgIEFtbW8uZGVzdHJveShidGEpO1xuICAgIEFtbW8uZGVzdHJveShidGIpO1xuICAgIEFtbW8uZGVzdHJveShidGMpO1xuXG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG4gICAgd29ybGQuc2V0Qm9keSh7IHV1aWQsIGJvZHksIHR5cGU6IFRZUEVTLk1FU0gsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZEJveCA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB3aWR0aCwgbGVuZ3RoLCBoZWlnaHQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzID0gMCwgZnJpY3Rpb24gPSAyIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIDAuNSwgaGVpZ2h0ICogMC41LCBsZW5ndGggKiAwLjUpKTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIHdvcmxkLnNldEJvZHkoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5CT1gsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTcGhlcmUgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHJhZGl1cywgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MgPSAwLCBmcmljdGlvbiA9IDIgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIHdvcmxkLnNldEJvZHkoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5TUEhFUkUsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRMaW5lYXJWZWxvY2l0eSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB2ZWxvY2l0eSA9IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZIH0gPSBkYXRhO1xuICAgIGNvbnN0IHsgYm9keSB9ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcbiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7XG4gICAgICAgIEFtbW8uZGVzdHJveShsaW5lYXJWZWxvY2l0eSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldFBvc2l0aW9uID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKSk7XG5cbiAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseUltcHVzZSA9ICh7IHV1aWQsIGltcHVsc2UgPSBERUZBVUxUX0lNUFVMU0UgfSkgPT4ge1xuICAgIGNvbnN0IHsgYm9keSB9ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBpbXB1bHNlVmVjdG9yID0gbmV3IEFtbW8uYnRWZWN0b3IzKGltcHVsc2UueCwgaW1wdWxzZS55LCBpbXB1bHNlLnopO1xuICAgICAgICBib2R5LmFwcGx5Q2VudHJhbEltcHVsc2UoaW1wdWxzZVZlY3Rvcik7XG4gICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFbGVtZW50VXBkYXRlID0gKHsgYm9keSwgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG1vdGlvblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBjcmVhdGVSaWdpZEJvZHkgfSBmcm9tICcuL2VsZW1lbnRzJztcbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcblxuaW1wb3J0IHtcbiAgICBUWVBFUyxcbiAgICBERUZBVUxUX1JJR0lEQk9EWV9TVEFURVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgYWRkUGxheWVyID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNhcHN1bGUsIHsgdXVpZCwgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MsIGZyaWN0aW9uIH0pO1xuXG4gICAgLy8gZGlzYWJsaWluZyByb3RhdGlvbiBmb3IgY29sbGlzaW9uc1xuICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTtcblxuICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTtcbiAgICB3b3JsZC5zZXRCb2R5KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuUExBWUVSLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlUGxheWVyVXBkYXRlID0gKHsgYm9keSwgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IHsgbW92ZW1lbnQsIGRpcmVjdGlvbiwgY2FtZXJhRGlyZWN0aW9uLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gc3RhdGU7XG5cbiAgICBjb25zdCBNQVhfU1BFRUQgPSAxO1xuICAgIGNvbnN0IHdhbGtWZWxvY2l0eSA9IC4xO1xuXG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICBjb25zdCBsaW5lYXJWZWxvY2l0eSA9IGJvZHkuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgY29uc3Qgc3BlZWQgPSBsaW5lYXJWZWxvY2l0eS5sZW5ndGgoKTtcblxuICAgICAgICBjb25zdCBmb3J3YXJkRGlyID0gdHJhbnNmb3JtLmdldEJhc2lzKCkuZ2V0Um93KDIpO1xuICAgICAgICBmb3J3YXJkRGlyLm5vcm1hbGl6ZSgpO1xuICAgICAgICBjb25zdCB3YWxrRGlyZWN0aW9uID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgIGNvbnN0IHdhbGtTcGVlZCA9IHdhbGtWZWxvY2l0eSAqIGR0O1xuXG4gICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7XG4gICAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgoIHdhbGtEaXJlY3Rpb24ueCgpICsgZm9yd2FyZERpci54KCkpO1xuICAgICAgICAgICAgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpICsgZm9yd2FyZERpci55KCkpO1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRaKCB3YWxrRGlyZWN0aW9uLnooKSArIGZvcndhcmREaXIueigpKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7XG4gICAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgoIHdhbGtEaXJlY3Rpb24ueCgpIC0gZm9yd2FyZERpci54KCkpO1xuICAgICAgICAgICAgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpIC0gZm9yd2FyZERpci55KCkpO1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRaKCB3YWxrRGlyZWN0aW9uLnooKSAtIGZvcndhcmREaXIueigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW92ZW1lbnQuZm9yd2FyZCAmJiAhbW92ZW1lbnQuYmFja3dhcmRzKSB7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSAqIDAuMik7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSAqIDAuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHtcbiAgICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpO1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTtcblxuICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgYm9keS5zZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICBsZXQgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICBkaXNwYXRjaGVyLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTtcbiAgICB9XG59OyIsImltcG9ydCB7XG4gICAgR1JBVklUWSxcbiAgICBUWVBFU1xufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBoYW5kbGVFbGVtZW50VXBkYXRlIH0gZnJvbSAnLi9lbGVtZW50cyc7XG5pbXBvcnQgeyBoYW5kbGVWZWhpY2xlVXBkYXRlIH0gZnJvbSAnLi92ZWhpY2xlcyc7XG5pbXBvcnQgeyBoYW5kbGVQbGF5ZXJVcGRhdGUgfSBmcm9tICcuL3BsYXllcic7XG5cbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHsgUEhZU0lDU19FVkVOVFMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmNsYXNzIENsb2NrIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RGVsdGEoKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wO1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVsdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7XG5cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFdvcmxkIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7XG4gICAgfVxuXG4gICAgaW5pdCA9IChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ3Jhdml0eSA9IEdSQVZJVFkgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gbmV3IEFtbW8uYnREZWZhdWx0Q29sbGlzaW9uQ29uZmlndXJhdGlvbigpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgQW1tby5idENvbGxpc2lvbkRpc3BhdGNoZXIodGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gbmV3IEFtbW8uYnREYnZ0QnJvYWRwaGFzZSgpO1xuICAgICAgICB0aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IG5ldyBBbW1vLmJ0RGlzY3JldGVEeW5hbWljc1dvcmxkKHRoaXMuZGlzcGF0Y2hlciwgdGhpcy5icm9hZHBoYXNlLCB0aGlzLnNvbHZlciwgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTtcblxuICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZ2hvc3RPYmplY3QgY29sbGlzaW9uc1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGRcbiAgICAgICAgICAgIC5nZXRCcm9hZHBoYXNlKClcbiAgICAgICAgICAgIC5nZXRPdmVybGFwcGluZ1BhaXJDYWNoZSgpXG4gICAgICAgICAgICAuc2V0SW50ZXJuYWxHaG9zdFBhaXJDYWxsYmFjayhuZXcgQW1tby5idEdob3N0UGFpckNhbGxiYWNrKCkpXG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIHJlbW92ZUVsZW1lbnQgPSB1dWlkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRWxlbWVudCh1dWlkKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50c1t1dWlkXS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZURlbGV0ZWRFbGVtZW50cyA9ICgpID0+IChcbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgLmZpbHRlcih1dWlkID0+IHRoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZClcbiAgICAgICAgICAgIC5mb3JFYWNoKHV1aWQgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRzW3V1aWRdO1xuICAgICAgICAgICAgfSlcbiAgICApO1xuXG4gICAgaGFzRWxlbWVudCA9IHV1aWQgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5lbGVtZW50cykuaW5jbHVkZXModXVpZCk7XG4gICAgfVxuXG4gICAgZ2V0RWxlbWVudCA9IHV1aWQgPT4gdGhpcy5lbGVtZW50c1t1dWlkXTtcblxuICAgIGlzSW5pdGlhbGlzZWQgPSAoKSA9PiB0aGlzLmluaXRpYWxpc2VkO1xuXG4gICAgZ2V0RHluYW1pY3NXb3JsZCA9ICgpID0+IHRoaXMuZHluYW1pY3NXb3JsZDtcblxuICAgIGFkZFJpZ2lkQm9keSA9IGJvZHkgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpO1xuICAgIH1cblxuICAgIGFkZEFjdGlvbiA9IGFjdGlvbiA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGRDb2xsaXNpb25PYmplY3QgPSBjb2xsaXNpb25PYmplY3QgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGNvbGxpc2lvbk9iamVjdCk7XG4gICAgfVxuXG4gICAgc3RlcFNpbXVsYXRpb24gPSBkdCA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5zdGVwU2ltdWxhdGlvbihkdCk7XG4gICAgfVxuXG4gICAgc2ltdWxhdGUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGR0ID0gdGhpcy5jbG9jay5nZXREZWx0YSgpO1xuICAgICAgICB0aGlzLnN0ZXBTaW11bGF0aW9uKGR0KTtcblxuICAgICAgICBPYmplY3RcbiAgICAgICAgICAgIC5rZXlzKHRoaXMuZWxlbWVudHMpXG4gICAgICAgICAgICAuZm9yRWFjaCh1dWlkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5CT1g6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlNQSEVSRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuTUVTSDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbGVtZW50VXBkYXRlKGVsZW1lbnQsIGR0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuUExBWUVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBsYXllclVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlZFSElDTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVoaWNsZVVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kUGh5c2ljc1VwZGF0ZShkdCk7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnNpbXVsYXRlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUNvbGxpc2lvbnMgPSAoKSA9PiB7XG4gICAgICAgIGxldCBhbW1vRGlzcGF0Y2hlciA9IHRoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7XG4gICAgICAgIGxldCBudW1NYW5pZm9sZHMgPSBhbW1vRGlzcGF0Y2hlci5nZXROdW1NYW5pZm9sZHMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU1hbmlmb2xkczsgaSsrKSB7XG5cbiAgICAgICAgICAgIGxldCBjb250YWN0TWFuaWZvbGQgPSBhbW1vRGlzcGF0Y2hlci5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKTtcblxuICAgICAgICAgICAgbGV0IHJiMCA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTAoKSwgQW1tby5idFJpZ2lkQm9keSk7XG4gICAgICAgICAgICBsZXQgcmIxID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MSgpLCBBbW1vLmJ0UmlnaWRCb2R5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IG51bUNvbnRhY3RzID0gY29udGFjdE1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uIGRvZXNuJ3QgaGF2ZSB1dWlkc1xuICAgICAgICAgICAgaWYgKCFyYjAudXVpZCB8fCAhcmIxLnV1aWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgY29udGFjdHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db250YWN0czsgaisrKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGlmKCBkaXN0YW5jZSA+IDAuMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmVsb2NpdHkwID0gcmIwLmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgICAgICAgICAgbGV0IHZlbG9jaXR5MSA9IHJiMS5nZXRMaW5lYXJWZWxvY2l0eSgpO1xuICAgICAgICAgICAgICAgIGxldCB3b3JsZFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSgpO1xuICAgICAgICAgICAgICAgIGxldCB3b3JsZFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQigpO1xuICAgICAgICAgICAgICAgIGxldCBsb2NhbFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEEoKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxQb3MxID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRCKCk7XG5cbiAgICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOltcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogeyB4OiB2ZWxvY2l0eTAueCgpLCB5OiB2ZWxvY2l0eTAueSgpLCB6OiB2ZWxvY2l0eTAueigpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsgeDogd29ybGRQb3MwLngoKSwgeTogd29ybGRQb3MwLnkoKSwgejogd29ybGRQb3MwLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7IHg6IGxvY2FsUG9zMC54KCksIHk6IGxvY2FsUG9zMC55KCksIHo6IGxvY2FsUG9zMC56KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogeyB4OiB2ZWxvY2l0eTEueCgpLCB5OiB2ZWxvY2l0eTEueSgpLCB6OiB2ZWxvY2l0eTEueigpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsgeDogd29ybGRQb3MxLngoKSwgeTogd29ybGRQb3MxLnkoKSwgejogd29ybGRQb3MxLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7IHg6IGxvY2FsUG9zMS54KCksIHk6IGxvY2FsUG9zMS55KCksIHo6IGxvY2FsUG9zMS56KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQocmIwLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7IGNvbnRhY3RzIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2hlci5zZW5kRGlzcGF0Y2hFdmVudChyYjEudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsgY29udGFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFbGVtZW50ID0gZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbZGF0YS51dWlkXSA9IGRhdGE7XG4gICAgfVxuXG4gICAgdXBkYXRlQm9keVN0YXRlID0gKHsgdXVpZCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0ge1xuICAgICAgICAgICAgLi4udGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSxcbiAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGlzcG9zZUJvZHkoeyB1dWlkIH0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpO1xuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodXVpZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kRWxlbWVudERpc3Bvc2VkKHsgdXVpZCB9KTtcbiAgICB9XG5cbiAgICB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0aGlzLmR5bmFtaWNzV29ybGQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5zb2x2ZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgQW1tby5kZXN0cm95KHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kVGVybWluYXRlRXZlbnQoKTtcbiAgICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXb3JsZCgpOyIsImltcG9ydCB7XG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9WRUhJQ0xFX1NUQVRFLFxuICAgIEJBQ0tfTEVGVCxcbiAgICBCQUNLX1JJR0hULFxuICAgIEZST05UX0xFRlQsXG4gICAgRlJPTlRfUklHSFQsXG4gICAgREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFLFxuICAgIERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFLFxuICAgIERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAsXG4gICAgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlRcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgICBQSFlTSUNTX0VWRU5UU1xufSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuXG5jb25zdCBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yO1xuY29uc3QgREVGQVVMVF9GUklDVElPTiA9IDEwMDA7XG5jb25zdCBERUZBVUxUX01BU1MgPSA4MDA7XG5cbmV4cG9ydCBjb25zdCBhZGRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgdXVpZCxcbiAgICAgICAgd2hlZWxzLFxuICAgICAgICBtYXNzID0gREVGQVVMVF9NQVNTLFxuICAgICAgICB3aWR0aCA9IDEuOCxcbiAgICAgICAgaGVpZ2h0ID0gLjYsXG4gICAgICAgIGxlbmd0aCA9IDQsXG4gICAgICAgIGZyaWN0aW9uID0gREVGQVVMVF9GUklDVElPTixcbiAgICAgICAgcm9sbEluZmx1ZW5jZSA9IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UsXG4gICAgICAgIHdoZWVsc09wdGlvbnMgPSB7fSxcbiAgICAgICAgc3VzcGVuc2lvbnMgPSB7fVxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgeyBiYWNrID0ge30sIGZyb250ID0ge30gfSA9IHdoZWVsc09wdGlvbnM7XG4gICAgY29uc3Qge1xuICAgICAgICBheGlzUG9zaXRpb246IGF4aXNQb3NpdGlvbkJhY2sgPSAtMSxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0JhY2sgPSAuNCxcbiAgICAgICAgaGFsZlRyYWNrOiB3aGVlbEhhbGZUcmFja0JhY2sgPSAxLFxuICAgICAgICBheGlzSGVpZ2h0OiB3aGVlbEF4aXNIZWlnaHRCYWNrID0gLjNcbiAgICB9ID0gYmFjaztcblxuICAgIGNvbnN0IHtcbiAgICAgICAgYXhpc1Bvc2l0aW9uOiBheGlzUG9zaXRpb25Gcm9udCA9IDEuNyxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0Zyb250ID0gLjQsXG4gICAgICAgIGhhbGZUcmFjazogd2hlZWxIYWxmVHJhY2tGcm9udCA9IDEsXG4gICAgICAgIGF4aXNIZWlnaHQ6IHdoZWVsQXhpc0hlaWdodEZyb250ID0gLjNcbiAgICB9ID0gZnJvbnQ7XG5cbiAgICBjb25zdCB7IHN0aWZmbmVzcyA9IDIwLjAsIGRhbXBpbmcgPSAyLjMsIGNvbXByZXNzaW9uID0gNC40LCByZXN0TGVuZ3RoID0gMC42IH0gPSBzdXNwZW5zaW9ucztcblxuXG4gICAgLy8gQ2hhc3Npc1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAuNSwgaGVpZ2h0ICogLjUsIGxlbmd0aCAqIC41KSk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7XG4gICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7XG4gICAgY29uc3QgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApO1xuICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGNoYXNzaXMgPSBuZXcgQW1tby5idFJpZ2lkQm9keShuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIGdlb21ldHJ5LCBsb2NhbEluZXJ0aWEpKTtcbiAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7XG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpO1xuXG5cbiAgICAvLyBSYXljYXN0IFZlaGljbGVcbiAgICBjb25zdCB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTtcbiAgICBjb25zdCByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7XG4gICAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUodHVuaW5nLCBjaGFzc2lzLCByYXlDYXN0ZXIpO1xuICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTtcbiAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7XG5cbiAgICBjb25zdCB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7XG4gICAgY29uc3Qgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApO1xuXG4gICAgY29uc3QgYWRkV2hlZWwgPSAoaXNGcm9udCwgcG9zLCByYWRpdXMpID0+IHtcblxuICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChcbiAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgIHdoZWVsRGlyZWN0aW9uQ1MwLFxuICAgICAgICAgICAgd2hlZWxBeGxlQ1MsXG4gICAgICAgICAgICByZXN0TGVuZ3RoLFxuICAgICAgICAgICAgcmFkaXVzLFxuICAgICAgICAgICAgdHVuaW5nLFxuICAgICAgICAgICAgaXNGcm9udCk7XG5cbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpO1xuICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uKGNvbXByZXNzaW9uKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7XG4gICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpO1xuICAgIH1cblxuICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTtcbiAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpO1xuICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7XG4gICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spO1xuXG4gICAgdmVoaWNsZS51dWlkID0gdXVpZDtcblxuICAgIHdvcmxkLnNldEJvZHkoe1xuICAgICAgICB0eXBlOiBUWVBFUy5WRUhJQ0xFLFxuICAgICAgICB1dWlkLFxuICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLFxuICAgICAgICB3aGVlbHMsXG4gICAgICAgIG9wdGlvbnM6IGRhdGEsXG4gICAgICAgIHN0YXRlOiBERUZBVUxUX1ZFSElDTEVfU1RBVEVcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldFZlaGljbGVQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VmVoaWNsZVF1YXRlcm5pb24gPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHF1YXRlcm5pb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgXG4gICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcblxuICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9ICh7IHZlaGljbGUsIHdoZWVscywgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1ZFSElDTEVfU1RBVEUsIG9wdGlvbnMgPSB7fSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTtcblxuICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TUEVFRCwgeyBzcGVlZCB9KTtcblxuICAgIGxldCBicmVha2luZ0ZvcmNlID0gMDtcbiAgICBsZXQgZW5naW5lRm9yY2UgPSAwO1xuXG4gICAgY29uc3Qge1xuICAgICAgICBzdGVlcmluZ0NsYW1wID0gREVGQVVMVF9TVEVFUklOR19DTEFNUCxcbiAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCxcbiAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UsXG4gICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikge1xuICAgICAgICBpZiAoc3BlZWQgPCAtMSlcbiAgICAgICAgICAgIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO1xuICAgICAgICBlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5icmFraW5nKSB7XG4gICAgICAgIGlmIChzcGVlZCA+IDEpXG4gICAgICAgICAgICBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtcbiAgICAgICAgZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5sZWZ0KSB7XG4gICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzdGF0ZS5yaWdodCkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpXG4gICAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7XG4gICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7XG5cbiAgICBsZXQgdG0sIHAsIHEsIGk7XG4gICAgY29uc3QgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpO1xuICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTtcbiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpO1xuICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICBjb25zdCB3aGVlbFVVSUQgPSB3aGVlbHNbaV07XG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7XG4gICAgfVxuXG4gICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpO1xuICAgIHAgPSB0bS5nZXRPcmlnaW4oKTtcbiAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpO1xuICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5ESVJFQ1RJT04sIHtcbiAgICAgICAgZGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB4OiBkaXJlY3Rpb24ueCgpLFxuICAgICAgICAgICAgeTogZGlyZWN0aW9uLnkoKSxcbiAgICAgICAgICAgIHo6IGRpcmVjdGlvbi56KClcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCk7XG4gICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTtcbn0iLCJpbXBvcnQgeyBFWFBMT1NJT05fU0laRVMsIEVYUExPU0lPTl9TVFJFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgd29ybGQgZnJvbSBcIi4vd29ybGRcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdob3N0Q29sbGlkZXIgPSAocmFkaXVzLCBwb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTtcbiAgICBnaG9zdENvbGxpZGVyLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKHBvc2l0aW9uKTtcbiAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgIHJldHVybiB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2hHaG9zdENvbGxpc2lvbiA9IChnaG9zdENvbGxpZGVyLCBmb3JFYWNoQ2FsbGJhY2sgPSAoKSA9PiB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpO1xuICAgIGZvciAobGV0IGk9MDsgaTxjb2xsaXNpb25zOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpO1xuXG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEV4cGxvc2lvblBvc2l0aW9uID0gKHV1aWQsIHBvc2l0aW9uKSA9PiB7XG4gICAgbGV0IGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgaWYgKCFleHBsb3Npb25Qb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBsb3Npb25JbXB1bHNlID0gKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHBvc2l0aW9uLm9wX3N1YihleHBsb3Npb25Qb3NpdGlvbik7XG4gICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7XG4gICAgY29uc3QgaW1wdWxzZSA9IGRpc3RhbmNlLm9wX211bChzdHJlbmd0aCk7XG5cbiAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7XG5cbiAgICByZXR1cm4gaW1wdWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGxvc2lvbiA9ICh7XG4gICAgdXVpZCxcbiAgICBwb3NpdGlvbixcbiAgICByYWRpdXMgPSBFWFBMT1NJT05fU0laRVMuU01BTEwsXG4gICAgc3RyZW5ndGggPSBFWFBMT1NJT05fU1RSRU5HVEhTLk1FRElVTVxufSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9ID0gY3JlYXRlR2hvc3RDb2xsaWRlcihyYWRpdXMsIGV4cGxvc2lvblBvc2l0aW9uKTtcblxuICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7XG5cbiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpO1xuICAgICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3koZ2hvc3RDb2xsaWRlcik7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG59IiwiaW1wb3J0IHtcbiAgICBMSUJSQVJZX05BTUVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgYWRkVmVoaWNsZSwgcmVzZXRWZWhpY2xlLCBzZXRWZWhpY2xlUG9zaXRpb24sIHNldFZlaGljbGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi92ZWhpY2xlcyc7XG5pbXBvcnQgeyBhZGRCb3gsIGFkZE1vZGVsLCBzZXRMaW5lYXJWZWxvY2l0eSwgYXBwbHlJbXB1c2UsIGFkZFNwaGVyZSwgc2V0UG9zaXRpb24gfSBmcm9tICcuL2VsZW1lbnRzJztcbmltcG9ydCB7IGNyZWF0ZUV4cGxvc2lvbiB9IGZyb20gJy4vZWZmZWN0cyc7XG5pbXBvcnQgeyBhZGRQbGF5ZXIgfSBmcm9tICcuL3BsYXllcic7XG5cbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHdvcmxkIGZyb20gJy4vd29ybGQnO1xuaW1wb3J0IHsgUEhZU0lDU19FVkVOVFMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmNvbnN0IGhhbmRsZUxvYWRFdmVudCA9IG9wdGlvbnMgPT4gQW1tbyA9PiB7XG4gICAgc2VsZi5BbW1vID0gQW1tbztcblxuICAgIG9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICBzd2l0Y2goZGF0YS5ldmVudCkge1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOlxuICAgICAgICAgICAgICAgIGFkZEJveChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRTpcbiAgICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOlxuICAgICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDpcbiAgICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjpcbiAgICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWTpcbiAgICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuUE9TSVRJT046XG4gICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlBPU0lUSU9OOlxuICAgICAgICAgICAgICAgIHNldFZlaGljbGVQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUVVBVEVSTklPTjpcbiAgICAgICAgICAgICAgICBzZXRWZWhpY2xlUXVhdGVybmlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5SRVNFVDpcbiAgICAgICAgICAgICAgICByZXNldFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQVBQTFkuSU1QVUxTRTpcbiAgICAgICAgICAgICAgICBhcHBseUltcHVzZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEU6XG4gICAgICAgICAgICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkRJU1BPU0U6XG4gICAgICAgICAgICAgICAgd29ybGQuZGlzcG9zZUJvZHkoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVGRkVDVFMuRVhQTE9TSU9OOlxuICAgICAgICAgICAgICAgIGNyZWF0ZUV4cGxvc2lvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVEVSTUlOQVRFOlxuICAgICAgICAgICAgICAgIHdvcmxkLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd29ybGQuaW5pdChvcHRpb25zKTtcbiAgICBkaXNwYXRjaGVyLnNlbmRSZWFkeUV2ZW50KCk7XG4gICAgd29ybGQuc2ltdWxhdGUoKVxufTtcblxuY29uc3QgbG9hZEFtbW8gPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTtcbiAgICBpbXBvcnRTY3JpcHRzKHNjcmlwdFVybCk7XG5cbiAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpO1xufTtcblxub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgc3dpdGNoKGRhdGEuZXZlbnQpIHtcbiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86XG4gICAgICAgICAgICBsb2FkQW1tbyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufSJdLCJuYW1lcyI6WyJMSUJSQVJZX05BTUUiLCJUWVBFUyIsIkJPWCIsIlNQSEVSRSIsIlZFSElDTEUiLCJNRVNIIiwiUExBWUVSIiwiREVGQVVMVF9WRUhJQ0xFX1NUQVRFIiwidmVoaWNsZVN0ZWVyaW5nIiwiYWNjZWxlcmF0aW9uIiwiYnJlYWtpbmciLCJyaWdodCIsImxlZnQiLCJERUZBVUxUX1JJR0lEQk9EWV9TVEFURSIsInZlbG9jaXR5IiwieCIsInkiLCJ6IiwibW92ZW1lbnQiLCJmb3J3YXJkIiwiYmFja3dhcmRzIiwiZGlyZWN0aW9uIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfTElORUFSX1ZFTE9DSVRZIiwiREVGQVVMVF9JTVBVTFNFIiwiRElTQUJMRV9ERUFDVElWQVRJT04iLCJHUkFWSVRZIiwiRlJPTlRfTEVGVCIsIkZST05UX1JJR0hUIiwiQkFDS19MRUZUIiwiQkFDS19SSUdIVCIsIkRFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIiwiREVGQVVMVF9TVEVFUklOR19DTEFNUCIsIkRFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSIsIkRFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIiwiRVhQTE9TSU9OX1NJWkVTIiwiU01BTEwiLCJNRURJVU0iLCJMQVJHRSIsIk1BU1NJVkUiLCJFWFBMT1NJT05fU1RSRU5HVEhTIiwiVkVSWV9XRUFLIiwiV0VBSyIsIk9LX05PIiwiUEhZU0lDU19FVkVOVFMiLCJESVNQQVRDSCIsIlRFUk1JTkFURSIsIkxPQUQiLCJBTU1PIiwiUkVBRFkiLCJJTklUIiwiVVBEQVRFIiwiQUREIiwiTU9ERUwiLCJFTEVNRU5UIiwiRElTUE9TRSIsIkNPTExJU0lPTiIsIkNSRUFURUQiLCJTRVQiLCJQT1NJVElPTiIsIlFVQVRFUk5JT04iLCJMSU5FQVJfVkVMT0NJVFkiLCJBUFBMWSIsIklNUFVMU0UiLCJSRVNFVCIsIlNQRUVEIiwiRElSRUNUSU9OIiwiRUZGRUNUUyIsIkVYUExPU0lPTiIsIkRpc3BhdGNoZXIiLCJkdCIsInBvc3RNZXNzYWdlIiwiZXZlbnQiLCJ1dWlkIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInF1YXRlcm5pb24iLCJ3IiwiZXZlbnROYW1lIiwiZXZlbnREYXRhIiwiYXBwbHlNYXRyaXg0VG9WZWN0b3IzIiwibWF0cml4IiwiY3JlYXRlUmlnaWRCb2R5Iiwic2hhcGUiLCJvcHRpb25zIiwibWFzcyIsImZyaWN0aW9uIiwicmVzdGl0dXRpb24iLCJkYW1waW5nIiwibGluZWFyIiwiYW5ndWxhciIsInRyYW5zZm9ybSIsIkFtbW8iLCJidFRyYW5zZm9ybSIsInNldElkZW50aXR5Iiwic2V0T3JpZ2luIiwiYnRWZWN0b3IzIiwic2V0Um90YXRpb24iLCJidFF1YXRlcm5pb24iLCJtb3Rpb25TdGF0ZSIsImJ0RGVmYXVsdE1vdGlvblN0YXRlIiwibG9jYWxJbmVydGlhIiwiY2FsY3VsYXRlTG9jYWxJbmVydGlhIiwicmJJbmZvIiwiYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvIiwiYm9keSIsImJ0UmlnaWRCb2R5Iiwic2V0RnJpY3Rpb24iLCJzZXRSZXN0aXR1dGlvbiIsInNldERhbXBpbmciLCJzZXRBY3RpdmF0aW9uU3RhdGUiLCJ3b3JsZCIsImFkZFJpZ2lkQm9keSIsImFkZE1vZGVsIiwidmVydGljZXMiLCJtYXRyaWNlcyIsImluZGV4ZXMiLCJzY2FsZSIsImJ0YSIsImJ0YiIsImJ0YyIsInRyaU1lc2giLCJidFRyaWFuZ2xlTWVzaCIsImkiLCJsZW5ndGgiLCJjb21wb25lbnRzIiwiaW5kZXgiLCJBcnJheSIsImZyb20iLCJqIiwiYWkiLCJiaSIsImNpIiwidmEiLCJ2YiIsInZjIiwic2V0VmFsdWUiLCJhZGRUcmlhbmdsZSIsImxvY2FsU2NhbGUiLCJzZXRTY2FsaW5nIiwiZGVzdHJveSIsImNvbGxpc2lvblNoYXBlIiwiYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSIsInJlc291cmNlcyIsInNldEJvZHkiLCJ0eXBlIiwic3RhdGUiLCJhZGRCb3giLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJnZW9tZXRyeSIsImJ0Qm94U2hhcGUiLCJhZGRTcGhlcmUiLCJyYWRpdXMiLCJidFNwaGVyZVNoYXBlIiwic2V0TGluZWFyVmVsb2NpdHkiLCJnZXRFbGVtZW50IiwiZ2V0TW90aW9uU3RhdGUiLCJsaW5lYXJWZWxvY2l0eSIsInNldFBvc2l0aW9uIiwiZ2V0V29ybGRUcmFuc2Zvcm0iLCJzZXRXb3JsZFRyYW5zZm9ybSIsImFwcGx5SW1wdXNlIiwiaW1wdWxzZSIsImltcHVsc2VWZWN0b3IiLCJhcHBseUNlbnRyYWxJbXB1bHNlIiwiaGFuZGxlRWxlbWVudFVwZGF0ZSIsIm9yaWdpbiIsImdldE9yaWdpbiIsImdldFJvdGF0aW9uIiwiZGlzcGF0Y2hlciIsInNlbmRCb2R5VXBkYXRlIiwiYWRkUGxheWVyIiwiY2Fwc3VsZSIsImJ0Q2Fwc3VsZVNoYXBlIiwic2V0QW5ndWxhckZhY3RvciIsImhhbmRsZVBsYXllclVwZGF0ZSIsImNhbWVyYURpcmVjdGlvbiIsIk1BWF9TUEVFRCIsIndhbGtWZWxvY2l0eSIsImdldExpbmVhclZlbG9jaXR5Iiwic3BlZWQiLCJmb3J3YXJkRGlyIiwiZ2V0QmFzaXMiLCJnZXRSb3ciLCJub3JtYWxpemUiLCJ3YWxrRGlyZWN0aW9uIiwid2Fsa1NwZWVkIiwic2V0WCIsInNldFoiLCJzZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0iLCJDbG9jayIsInRpbWVzdGFtcCIsInRpbWUiLCJEYXRlIiwibm93IiwiZGVsdGEiLCJXb3JsZCIsImdyYXZpdHkiLCJjb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnREZWZhdWx0Q29sbGlzaW9uQ29uZmlndXJhdGlvbiIsImJ0Q29sbGlzaW9uRGlzcGF0Y2hlciIsImJyb2FkcGhhc2UiLCJidERidnRCcm9hZHBoYXNlIiwic29sdmVyIiwiYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIiLCJkeW5hbWljc1dvcmxkIiwiYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQiLCJzZXRHcmF2aXR5IiwiZ2V0QnJvYWRwaGFzZSIsImdldE92ZXJsYXBwaW5nUGFpckNhY2hlIiwic2V0SW50ZXJuYWxHaG9zdFBhaXJDYWxsYmFjayIsImJ0R2hvc3RQYWlyQ2FsbGJhY2siLCJpbml0aWFsaXNlZCIsImhhc0VsZW1lbnQiLCJlbGVtZW50cyIsImRlbGV0ZWQiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiZm9yRWFjaCIsImluY2x1ZGVzIiwiYWN0aW9uIiwiYWRkQWN0aW9uIiwiY29sbGlzaW9uT2JqZWN0IiwiYWRkQ29sbGlzaW9uT2JqZWN0Iiwic3RlcFNpbXVsYXRpb24iLCJjbG9jayIsImdldERlbHRhIiwiZWxlbWVudCIsImhhbmRsZVZlaGljbGVVcGRhdGUiLCJjYWxjdWxhdGVDb2xsaXNpb25zIiwicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwic2VuZFBoeXNpY3NVcGRhdGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNpbXVsYXRlIiwiYmluZCIsImFtbW9EaXNwYXRjaGVyIiwiZ2V0RGlzcGF0Y2hlciIsIm51bU1hbmlmb2xkcyIsImdldE51bU1hbmlmb2xkcyIsImNvbnRhY3RNYW5pZm9sZCIsImdldE1hbmlmb2xkQnlJbmRleEludGVybmFsIiwicmIwIiwiY2FzdE9iamVjdCIsImdldEJvZHkwIiwicmIxIiwiZ2V0Qm9keTEiLCJudW1Db250YWN0cyIsImdldE51bUNvbnRhY3RzIiwiY29udGFjdHMiLCJjb250YWN0UG9pbnQiLCJnZXRDb250YWN0UG9pbnQiLCJkaXN0YW5jZSIsImdldERpc3RhbmNlIiwidmVsb2NpdHkwIiwidmVsb2NpdHkxIiwid29ybGRQb3MwIiwiZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSIsIndvcmxkUG9zMSIsImdldF9tX3Bvc2l0aW9uV29ybGRPbkIiLCJsb2NhbFBvczAiLCJnZXRfbV9sb2NhbFBvaW50QSIsImxvY2FsUG9zMSIsImdldF9tX2xvY2FsUG9pbnRCIiwicHVzaCIsIndvcmxkUG9zIiwibG9jYWxQb3MiLCJzZW5kRGlzcGF0Y2hFdmVudCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwic2VuZFRlcm1pbmF0ZUV2ZW50IiwidW5kZWZpbmVkIiwicmVtb3ZlUmlnaWRCb2R5IiwicmVtb3ZlRWxlbWVudCIsInNlbmRFbGVtZW50RGlzcG9zZWQiLCJERUZBVUxUX1JPTExfSU5GTFVFTkNFIiwiREVGQVVMVF9GUklDVElPTiIsIkRFRkFVTFRfTUFTUyIsImFkZFZlaGljbGUiLCJ3aGVlbHMiLCJyb2xsSW5mbHVlbmNlIiwid2hlZWxzT3B0aW9ucyIsInN1c3BlbnNpb25zIiwiYmFjayIsImZyb250IiwiYXhpc1Bvc2l0aW9uIiwiYXhpc1Bvc2l0aW9uQmFjayIsIndoZWVsUmFkaXVzQmFjayIsImhhbGZUcmFjayIsIndoZWVsSGFsZlRyYWNrQmFjayIsImF4aXNIZWlnaHQiLCJ3aGVlbEF4aXNIZWlnaHRCYWNrIiwiYXhpc1Bvc2l0aW9uRnJvbnQiLCJ3aGVlbFJhZGl1c0Zyb250Iiwid2hlZWxIYWxmVHJhY2tGcm9udCIsIndoZWVsQXhpc0hlaWdodEZyb250Iiwic3RpZmZuZXNzIiwiY29tcHJlc3Npb24iLCJyZXN0TGVuZ3RoIiwiY2hhc3NpcyIsInR1bmluZyIsImJ0VmVoaWNsZVR1bmluZyIsInJheUNhc3RlciIsImJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIiLCJnZXREeW5hbWljc1dvcmxkIiwidmVoaWNsZSIsImJ0UmF5Y2FzdFZlaGljbGUiLCJzZXRDb29yZGluYXRlU3lzdGVtIiwid2hlZWxEaXJlY3Rpb25DUzAiLCJ3aGVlbEF4bGVDUyIsImFkZFdoZWVsIiwiaXNGcm9udCIsInBvcyIsIndoZWVsSW5mbyIsInNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3MiLCJzZXRfbV93aGVlbHNEYW1waW5nUmVsYXhhdGlvbiIsInNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbiIsInNldF9tX2ZyaWN0aW9uU2xpcCIsInNldF9tX3JvbGxJbmZsdWVuY2UiLCJzZXRWZWhpY2xlUG9zaXRpb24iLCJnZXRSaWdpZEJvZHkiLCJzZXRWZWhpY2xlUXVhdGVybmlvbiIsInJlc2V0VmVoaWNsZSIsImdldEN1cnJlbnRTcGVlZEttSG91ciIsImJyZWFraW5nRm9yY2UiLCJlbmdpbmVGb3JjZSIsInN0ZWVyaW5nQ2xhbXAiLCJzdGVlcmluZ0luY3JlbWVudCIsIm1heEVuZ2luZUZvcmNlIiwibWF4QnJlYWtpbmdGb3JjZSIsImJyYWtpbmciLCJhcHBseUVuZ2luZUZvcmNlIiwic2V0QnJha2UiLCJzZXRTdGVlcmluZ1ZhbHVlIiwidG0iLCJwIiwicSIsIm4iLCJnZXROdW1XaGVlbHMiLCJ1cGRhdGVXaGVlbFRyYW5zZm9ybSIsImdldFdoZWVsVHJhbnNmb3JtV1MiLCJ3aGVlbFVVSUQiLCJnZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0iLCJnZXRGb3J3YXJkVmVjdG9yIiwidXBkYXRlQm9keVN0YXRlIiwiY3JlYXRlR2hvc3RDb2xsaWRlciIsImdob3N0Q29sbGlkZXIiLCJidEdob3N0T2JqZWN0Iiwic2V0Q29sbGlzaW9uU2hhcGUiLCJmb3JFYWNoR2hvc3RDb2xsaXNpb24iLCJmb3JFYWNoQ2FsbGJhY2siLCJjb2xsaXNpb25zIiwiZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzIiwib2JqZWN0IiwiZ2V0T3ZlcmxhcHBpbmdPYmplY3QiLCJnZXRFeHBsb3Npb25Qb3NpdGlvbiIsImV4cGxvc2lvblBvc2l0aW9uIiwiZ2V0RXhwbG9zaW9uSW1wdWxzZSIsInN0cmVuZ3RoIiwib3Bfc3ViIiwib3BfbXVsIiwic2V0WSIsImNyZWF0ZUV4cGxvc2lvbiIsIm9iamVjdFRyYW5zZm9ybSIsImFjdGl2YXRlIiwicmVtb3ZlQ29sbGlzaW9uT2JqZWN0IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJoYW5kbGVMb2FkRXZlbnQiLCJzZWxmIiwib25tZXNzYWdlIiwiZGlzcG9zZUJvZHkiLCJ0ZXJtaW5hdGUiLCJpbml0Iiwic2VuZFJlYWR5RXZlbnQiLCJsb2FkQW1tbyIsInNjcmlwdFVybCIsImhvc3QiLCJwYXRoIiwiaW1wb3J0U2NyaXB0cyIsInRoZW4iXSwibWFwcGluZ3MiOiI7OztJQUFPLElBQU1BLFlBQVksR0FBRyxTQUFyQjtJQUVBLElBQU1DLEtBQUssR0FBRztJQUNqQkMsRUFBQUEsR0FBRyxFQUFFLEtBRFk7SUFFakJDLEVBQUFBLE1BQU0sRUFBRSxRQUZTO0lBR2pCQyxFQUFBQSxPQUFPLEVBQUUsU0FIUTtJQUlqQkMsRUFBQUEsSUFBSSxFQUFFLE1BSlc7SUFLakJDLEVBQUFBLE1BQU0sRUFBRTtJQUxTLENBQWQ7SUFlQSxJQUFNQyxxQkFBcUIsR0FBRztJQUNqQ0MsRUFBQUEsZUFBZSxFQUFFLENBRGdCO0lBRWpDQyxFQUFBQSxZQUFZLEVBQUUsS0FGbUI7SUFHakNDLEVBQUFBLFFBQVEsRUFBRSxLQUh1QjtJQUlqQ0MsRUFBQUEsS0FBSyxFQUFFLEtBSjBCO0lBS2pDQyxFQUFBQSxJQUFJLEVBQUU7SUFMMkIsQ0FBOUI7SUFRQSxJQUFNQyx1QkFBdUIsR0FBRztJQUNuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQUVDLElBQUFBLENBQUMsRUFBRSxDQUFMO0lBQVFDLElBQUFBLENBQUMsRUFBRSxDQUFYO0lBQWNDLElBQUFBLENBQUMsRUFBRTtJQUFqQixHQUR5QjtJQUVuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQ05DLElBQUFBLE9BQU8sRUFBRSxLQURIO0lBRU5DLElBQUFBLFNBQVMsRUFBRSxLQUZMO0lBR05SLElBQUFBLElBQUksRUFBRSxLQUhBO0lBSU5ELElBQUFBLEtBQUssRUFB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', false);
57551
+ }var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBMSUJSQVJZX05BTUUgPSAnYW1tby5qcyc7CiAgICB2YXIgVFlQRVMgPSB7CiAgICAgIEJPWDogJ0JPWCcsCiAgICAgIFNQSEVSRTogJ1NQSEVSRScsCiAgICAgIFZFSElDTEU6ICdWRUhJQ0xFJywKICAgICAgTUVTSDogJ01FU0gnLAogICAgICBQTEFZRVI6ICdQTEFZRVInCiAgICB9OwogICAgdmFyIERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHsKICAgICAgdmVoaWNsZVN0ZWVyaW5nOiAwLAogICAgICBhY2NlbGVyYXRpb246IGZhbHNlLAogICAgICBicmVha2luZzogZmFsc2UsCiAgICAgIHJpZ2h0OiBmYWxzZSwKICAgICAgbGVmdDogZmFsc2UKICAgIH07CiAgICB2YXIgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7CiAgICAgIHZlbG9jaXR5OiB7CiAgICAgICAgeDogMCwKICAgICAgICB5OiAwLAogICAgICAgIHo6IDAKICAgICAgfSwKICAgICAgbW92ZW1lbnQ6IHsKICAgICAgICBmb3J3YXJkOiBmYWxzZSwKICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLAogICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgIHJpZ2h0OiBmYWxzZQogICAgICB9LAogICAgICBkaXJlY3Rpb246IHsKICAgICAgICB4OiAwLAogICAgICAgIHk6IDAsCiAgICAgICAgejogMAogICAgICB9CiAgICB9OwogICAgdmFyIERFRkFVTFRfU0NBTEUgPSB7CiAgICAgIHg6IDEsCiAgICAgIHk6IDEsCiAgICAgIHo6IDEKICAgIH07CiAgICB2YXIgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFkgPSB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgREVGQVVMVF9JTVBVTFNFID0gewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICB6OiAwCiAgICB9OwogICAgdmFyIERJU0FCTEVfREVBQ1RJVkFUSU9OID0gNDsKICAgIHZhciBHUkFWSVRZID0gewogICAgICB4OiAwLAogICAgICB5OiAtMTAsCiAgICAgIHo6IDAKICAgIH07CiAgICB2YXIgRlJPTlRfTEVGVCA9IDA7CiAgICB2YXIgRlJPTlRfUklHSFQgPSAxOwogICAgdmFyIEJBQ0tfTEVGVCA9IDI7CiAgICB2YXIgQkFDS19SSUdIVCA9IDM7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgPSAuMDQ7CiAgICB2YXIgREVGQVVMVF9TVEVFUklOR19DTEFNUCA9IC41OwogICAgdmFyIERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA9IDIwMDA7CiAgICB2YXIgREVGQVVMVF9NQVhfQlJFQUtJTkdfRk9SQ0UgPSAxMDA7CiAgICB2YXIgRVhQTE9TSU9OX1NJWkVTID0gewogICAgICBTTUFMTDogNCwKICAgICAgTUVESVVNOiA2LAogICAgICBMQVJHRTogOCwKICAgICAgTUFTU0lWRTogMTIKICAgIH07CiAgICB2YXIgRVhQTE9TSU9OX1NUUkVOR1RIUyA9IHsKICAgICAgVkVSWV9XRUFLOiAyLAogICAgICBXRUFLOiA0LAogICAgICBNRURJVU06IDgsCiAgICAgIExBUkdFOiAxNiwKICAgICAgTUFTU0lWRTogMzIsCiAgICAgIE9LX05POiA2NAogICAgfTsKCiAgICB2YXIgUEhZU0lDU19FVkVOVFMgPSB7CiAgICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsCiAgICAgIFRFUk1JTkFURTogJ3BoeXNpY3M6dGVybWluYXRlJywKICAgICAgTE9BRDogewogICAgICAgIEFNTU86ICdwaHlzaWNzOmxvYWQ6YW1tbycKICAgICAgfSwKICAgICAgUkVBRFk6ICdwaHlzaWNzOnJlYWR5JywKICAgICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsCiAgICAgIFVQREFURTogJ3BoeXNpY3M6dXBkYXRlJywKICAgICAgQUREOiB7CiAgICAgICAgQk9YOiAncGh5c2ljczphZGQ6Ym94JywKICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsCiAgICAgICAgTU9ERUw6ICdwaHlzaWNzOmFkZDptb2RlbCcsCiAgICAgICAgUExBWUVSOiAncGh5c2ljczphZGQ6cGxheWVyJywKICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnCiAgICAgIH0sCiAgICAgIEVMRU1FTlQ6IHsKICAgICAgICBESVNQT1NFOiAncGh5c2ljczplbGVtZW50OmRpc3Bvc2UnLAogICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLAogICAgICAgIFVQREFURTogJ3BoeXNpY3M6ZWxlbWVudDp1cGRhdGUnLAogICAgICAgIENSRUFURUQ6ICdwaHlzaWNzOmVsZW1lbnQ6Y3JlYXRlZCcsCiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6cXVhdGVybmlvbicsCiAgICAgICAgICBMSU5FQVJfVkVMT0NJVFk6ICdwaHlzaWNzOmVsZW1lbnQ6c2V0OmxpbmVhcl92ZWxvY2l0eScKICAgICAgICB9LAogICAgICAgIEFQUExZOiB7CiAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnCiAgICAgICAgfQogICAgICB9LAogICAgICBWRUhJQ0xFOiB7CiAgICAgICAgU0VUOiB7CiAgICAgICAgICBQT1NJVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cG9zaXRpb24nLAogICAgICAgICAgUVVBVEVSTklPTjogJ3BoeXNpY3M6dmVoaWNsZTpzZXQ6cXVhdGVybmlvbicKICAgICAgICB9LAogICAgICAgIFJFU0VUOiAncGh5c2ljczp2ZWhpY2xlOnJlc2V0JywKICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsCiAgICAgICAgRElSRUNUSU9OOiAncGh5c2ljczp2ZWhpY2xlOmRpcmVjdGlvbicKICAgICAgfSwKICAgICAgRUZGRUNUUzogewogICAgICAgIEVYUExPU0lPTjogJ3BoeXNpY3M6ZWZmZWN0czpleHBsb3Npb24nCiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7CiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsKCiAgICAgIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7CiAgICAgICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7CiAgICAgICAgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsKICAgICAgICB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307CiAgICAgICAgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsKICAgICAgICB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gX2NsYXNzQ2FsbENoZWNrKGluc3RhbmNlLCBDb25zdHJ1Y3RvcikgewogICAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsKICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7CiAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgIGlmICgidmFsdWUiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIF9jcmVhdGVDbGFzcyhDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHsKICAgICAgaWYgKHByb3RvUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbnN0cnVjdG9yLCAicHJvdG90eXBlIiwgewogICAgICAgIHdyaXRhYmxlOiBmYWxzZQogICAgICB9KTsKICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwgdmFsdWUpIHsKICAgICAgaWYgKGtleSBpbiBvYmopIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHsKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICB3cml0YWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIG9ialtrZXldID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIERpc3BhdGNoZXIgPSBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGlzcGF0Y2hlcik7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRQaHlzaWNzVXBkYXRlIiwgZnVuY3Rpb24gKGR0KSB7CiAgICAgICAgcmV0dXJuIHBvc3RNZXNzYWdlKHsKICAgICAgICAgIGV2ZW50OiBQSFlTSUNTX0VWRU5UUy5VUERBVEUsCiAgICAgICAgICBkdDogZHQKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRSZWFkeUV2ZW50IiwgZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuUkVBRFkKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNlbmRUZXJtaW5hdGVFdmVudCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gcG9zdE1lc3NhZ2UoewogICAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURQogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic2VuZEJvZHlVcGRhdGUiLCBmdW5jdGlvbiAodXVpZCwgcG9zaXRpb24sIHJvdGF0aW9uLCBkdCkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEUsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgcG9zaXRpb246IHsKICAgICAgICAgICAgeDogcG9zaXRpb24ueCgpLAogICAgICAgICAgICB5OiBwb3NpdGlvbi55KCksCiAgICAgICAgICAgIHo6IHBvc2l0aW9uLnooKQogICAgICAgICAgfSwKICAgICAgICAgIHF1YXRlcm5pb246IHsKICAgICAgICAgICAgeDogcm90YXRpb24ueCgpLAogICAgICAgICAgICB5OiByb3RhdGlvbi55KCksCiAgICAgICAgICAgIHo6IHJvdGF0aW9uLnooKSwKICAgICAgICAgICAgdzogcm90YXRpb24udygpCiAgICAgICAgICB9LAogICAgICAgICAgZHQ6IGR0CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJzZW5kRGlzcGF0Y2hFdmVudCIsIGZ1bmN0aW9uICh1dWlkLCBldmVudE5hbWUsIGV2ZW50RGF0YSkgewogICAgICAgIHJldHVybiBwb3N0TWVzc2FnZSh7CiAgICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRElTUEFUQ0gsCiAgICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgICAgZXZlbnROYW1lOiBldmVudE5hbWUsCiAgICAgICAgICBldmVudERhdGE6IGV2ZW50RGF0YQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH07CiAgICB2YXIgZGlzcGF0Y2hlciQxID0gbmV3IERpc3BhdGNoZXIoKTsKCiAgICB2YXIgYXBwbHlNYXRyaXg0VG9WZWN0b3IzID0gZnVuY3Rpb24gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKF9yZWYpIHsKICAgICAgdmFyIF9yZWYkeCA9IF9yZWYueCwKICAgICAgICAgIHggPSBfcmVmJHggPT09IHZvaWQgMCA/IDAgOiBfcmVmJHgsCiAgICAgICAgICBfcmVmJHkgPSBfcmVmLnksCiAgICAgICAgICB5ID0gX3JlZiR5ID09PSB2b2lkIDAgPyAwIDogX3JlZiR5LAogICAgICAgICAgX3JlZiR6ID0gX3JlZi56LAogICAgICAgICAgeiA9IF9yZWYkeiA9PT0gdm9pZCAwID8gMCA6IF9yZWYkejsKICAgICAgdmFyIG1hdHJpeCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogW107CiAgICAgIHZhciB3ID0gMSAvIChtYXRyaXhbM10gKiB4ICsgbWF0cml4WzddICogeSArIG1hdHJpeFsxMV0gKiB6ICsgbWF0cml4WzE1XSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgeDogKG1hdHJpeFswXSAqIHggKyBtYXRyaXhbNF0gKiB5ICsgbWF0cml4WzhdICogeiArIG1hdHJpeFsxMl0pICogdywKICAgICAgICB5OiAobWF0cml4WzFdICogeCArIG1hdHJpeFs1XSAqIHkgKyBtYXRyaXhbOV0gKiB6ICsgbWF0cml4WzEzXSkgKiB3LAogICAgICAgIHo6IChtYXRyaXhbMl0gKiB4ICsgbWF0cml4WzZdICogeSArIG1hdHJpeFsxMF0gKiB6ICsgbWF0cml4WzE0XSkgKiB3CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBjcmVhdGVSaWdpZEJvZHkgPSBmdW5jdGlvbiBjcmVhdGVSaWdpZEJvZHkoc2hhcGUsIG9wdGlvbnMpIHsKICAgICAgdmFyIHV1aWQgPSBvcHRpb25zLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IG9wdGlvbnMucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gb3B0aW9ucy5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IG9wdGlvbnMubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gb3B0aW9ucy5mcmljdGlvbiwKICAgICAgICAgIF9vcHRpb25zJHJlc3RpdHV0aW9uID0gb3B0aW9ucy5yZXN0aXR1dGlvbiwKICAgICAgICAgIHJlc3RpdHV0aW9uID0gX29wdGlvbnMkcmVzdGl0dXRpb24gPT09IHZvaWQgMCA/IC45IDogX29wdGlvbnMkcmVzdGl0dXRpb24sCiAgICAgICAgICBfb3B0aW9ucyRkYW1waW5nID0gb3B0aW9ucy5kYW1waW5nLAogICAgICAgICAgZGFtcGluZyA9IF9vcHRpb25zJGRhbXBpbmcgPT09IHZvaWQgMCA/IHsKICAgICAgICBsaW5lYXI6IDAuMiwKICAgICAgICBhbmd1bGFyOiAwLjIKICAgICAgfSA6IF9vcHRpb25zJGRhbXBpbmc7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZSh0cmFuc2Zvcm0pOwogICAgICB2YXIgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApOwogICAgICBzaGFwZS5jYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgbG9jYWxJbmVydGlhKTsKICAgICAgdmFyIHJiSW5mbyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgc2hhcGUsIGxvY2FsSW5lcnRpYSk7CiAgICAgIHZhciBib2R5ID0gbmV3IEFtbW8uYnRSaWdpZEJvZHkocmJJbmZvKTsKCiAgICAgIGlmIChtYXNzID4gMCkgewogICAgICAgIGJvZHkuc2V0RnJpY3Rpb24oZnJpY3Rpb24pOwogICAgICAgIGJvZHkuc2V0UmVzdGl0dXRpb24ocmVzdGl0dXRpb24pOwogICAgICAgIGJvZHkuc2V0RGFtcGluZyhkYW1waW5nLmxpbmVhciwgZGFtcGluZy5hbmd1bGFyKTsKICAgICAgICBib2R5LnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIH0gLy8gc3RvcmluZyB1dWlkIGZvciBmdXR1cmUgcmVmZXJlbmNlCgoKICAgICAgYm9keS51dWlkID0gdXVpZDsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICByZXR1cm4gYm9keTsKICAgIH07CiAgICB2YXIgYWRkTW9kZWwgPSBmdW5jdGlvbiBhZGRNb2RlbChvcHRpb25zKSB7CiAgICAgIHZhciB1dWlkID0gb3B0aW9ucy51dWlkLAogICAgICAgICAgdmVydGljZXMgPSBvcHRpb25zLnZlcnRpY2VzLAogICAgICAgICAgbWF0cmljZXMgPSBvcHRpb25zLm1hdHJpY2VzLAogICAgICAgICAgaW5kZXhlcyA9IG9wdGlvbnMuaW5kZXhlcywKICAgICAgICAgIHBvc2l0aW9uID0gb3B0aW9ucy5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBvcHRpb25zLnF1YXRlcm5pb24sCiAgICAgICAgICBfb3B0aW9ucyRtYXNzID0gb3B0aW9ucy5tYXNzLAogICAgICAgICAgbWFzcyA9IF9vcHRpb25zJG1hc3MgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRtYXNzLAogICAgICAgICAgX29wdGlvbnMkZnJpY3Rpb24gPSBvcHRpb25zLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfb3B0aW9ucyRmcmljdGlvbiA9PT0gdm9pZCAwID8gMiA6IF9vcHRpb25zJGZyaWN0aW9uOwogICAgICB2YXIgc2NhbGUgPSBERUZBVUxUX1NDQUxFOwogICAgICB2YXIgYnRhID0gbmV3IEFtbW8uYnRWZWN0b3IzKCk7CiAgICAgIHZhciBidGIgPSBuZXcgQW1tby5idFZlY3RvcjMoKTsKICAgICAgdmFyIGJ0YyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpOwogICAgICB2YXIgdHJpTWVzaCA9IG5ldyBBbW1vLmJ0VHJpYW5nbGVNZXNoKHRydWUsIGZhbHNlKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY29tcG9uZW50cyA9IHZlcnRpY2VzW2ldOwogICAgICAgIHZhciBpbmRleCA9IGluZGV4ZXNbaV0gPyBpbmRleGVzW2ldIDogbnVsbDsKICAgICAgICB2YXIgbWF0cml4ID0gQXJyYXkuZnJvbShtYXRyaWNlc1tpXSk7CgogICAgICAgIGlmIChpbmRleCkgewogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpbmRleC5sZW5ndGg7IGogKz0gMykgewogICAgICAgICAgICB2YXIgYWkgPSBpbmRleFtqXSAqIDM7CiAgICAgICAgICAgIHZhciBiaSA9IGluZGV4W2ogKyAxXSAqIDM7CiAgICAgICAgICAgIHZhciBjaSA9IGluZGV4W2ogKyAyXSAqIDM7CiAgICAgICAgICAgIHZhciB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1thaV0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1thaSArIDFdLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbYWkgKyAyXQogICAgICAgICAgICB9LCBtYXRyaXgpOwogICAgICAgICAgICB2YXIgdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbYmldLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbYmkgKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW2JpICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKICAgICAgICAgICAgdmFyIHZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW2NpXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW2NpICsgMV0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tjaSArIDJdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CiAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTsKICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopOwogICAgICAgICAgICBidGMuc2V0VmFsdWUodmMueCwgdmMueSwgdmMueik7CiAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKHZhciBfaiA9IDA7IF9qIDwgY29tcG9uZW50cy5sZW5ndGg7IF9qICs9IDkpIHsKICAgICAgICAgICAgdmFyIF92YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7CiAgICAgICAgICAgICAgeDogY29tcG9uZW50c1tfaiArIDBdLAogICAgICAgICAgICAgIHk6IGNvbXBvbmVudHNbX2ogKyAxXSwKICAgICAgICAgICAgICB6OiBjb21wb25lbnRzW19qICsgMl0KICAgICAgICAgICAgfSwgbWF0cml4KTsKCiAgICAgICAgICAgIHZhciBfdmIgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoewogICAgICAgICAgICAgIHg6IGNvbXBvbmVudHNbX2ogKyAzXSwKICAgICAgICAgICAgICB5OiBjb21wb25lbnRzW19qICsgNF0sCiAgICAgICAgICAgICAgejogY29tcG9uZW50c1tfaiArIDVdCiAgICAgICAgICAgIH0sIG1hdHJpeCk7CgogICAgICAgICAgICB2YXIgX3ZjID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsKICAgICAgICAgICAgICB4OiBjb21wb25lbnRzW19qICsgNl0sCiAgICAgICAgICAgICAgeTogY29tcG9uZW50c1tfaiArIDddLAogICAgICAgICAgICAgIHo6IGNvbXBvbmVudHNbX2ogKyA4XQogICAgICAgICAgICB9LCBtYXRyaXgpOwoKICAgICAgICAgICAgYnRhLnNldFZhbHVlKF92YS54LCBfdmEueSwgX3ZhLnopOwogICAgICAgICAgICBidGIuc2V0VmFsdWUoX3ZiLngsIF92Yi55LCBfdmIueik7CiAgICAgICAgICAgIGJ0Yy5zZXRWYWx1ZShfdmMueCwgX3ZjLnksIF92Yy56KTsKICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgbG9jYWxTY2FsZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTsKICAgICAgdHJpTWVzaC5zZXRTY2FsaW5nKGxvY2FsU2NhbGUpOwogICAgICBBbW1vLmRlc3Ryb3kobG9jYWxTY2FsZSk7CiAgICAgIHZhciBjb2xsaXNpb25TaGFwZSA9IG5ldyBBbW1vLmJ0QnZoVHJpYW5nbGVNZXNoU2hhcGUodHJpTWVzaCwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIGNvbGxpc2lvblNoYXBlLnJlc291cmNlcyA9IFt0cmlNZXNoXTsKICAgICAgQW1tby5kZXN0cm95KGJ0YSk7CiAgICAgIEFtbW8uZGVzdHJveShidGIpOwogICAgICBBbW1vLmRlc3Ryb3koYnRjKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY29sbGlzaW9uU2hhcGUsIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuTUVTSCwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIGFkZEJveCA9IGZ1bmN0aW9uIGFkZEJveChkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBoZWlnaHQgPSBkYXRhLmhlaWdodCwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBfZGF0YSRtYXNzID0gZGF0YS5tYXNzLAogICAgICAgICAgbWFzcyA9IF9kYXRhJG1hc3MgPT09IHZvaWQgMCA/IDAgOiBfZGF0YSRtYXNzLAogICAgICAgICAgX2RhdGEkZnJpY3Rpb24gPSBkYXRhLmZyaWN0aW9uLAogICAgICAgICAgZnJpY3Rpb24gPSBfZGF0YSRmcmljdGlvbiA9PT0gdm9pZCAwID8gMiA6IF9kYXRhJGZyaWN0aW9uOwogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIDAuNSwgaGVpZ2h0ICogMC41LCBsZW5ndGggKiAwLjUpKTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoZ2VvbWV0cnksIHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbiwKICAgICAgICBxdWF0ZXJuaW9uOiBxdWF0ZXJuaW9uLAogICAgICAgIG1hc3M6IG1hc3MsCiAgICAgICAgZnJpY3Rpb246IGZyaWN0aW9uCiAgICAgIH0pOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuQk9YLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgYWRkU3BoZXJlID0gZnVuY3Rpb24gYWRkU3BoZXJlKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICByYWRpdXMgPSBkYXRhLnJhZGl1cywKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbiwKICAgICAgICAgIHF1YXRlcm5pb24gPSBkYXRhLnF1YXRlcm5pb24sCiAgICAgICAgICBfZGF0YSRtYXNzMiA9IGRhdGEubWFzcywKICAgICAgICAgIG1hc3MgPSBfZGF0YSRtYXNzMiA9PT0gdm9pZCAwID8gMCA6IF9kYXRhJG1hc3MyLAogICAgICAgICAgX2RhdGEkZnJpY3Rpb24yID0gZGF0YS5mcmljdGlvbiwKICAgICAgICAgIGZyaWN0aW9uID0gX2RhdGEkZnJpY3Rpb24yID09PSB2b2lkIDAgPyAyIDogX2RhdGEkZnJpY3Rpb24yOwogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idFNwaGVyZVNoYXBlKHJhZGl1cyk7CiAgICAgIHZhciBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBwb3NpdGlvbjogcG9zaXRpb24sCiAgICAgICAgcXVhdGVybmlvbjogcXVhdGVybmlvbiwKICAgICAgICBtYXNzOiBtYXNzLAogICAgICAgIGZyaWN0aW9uOiBmcmljdGlvbgogICAgICB9KTsKICAgICAgd29ybGQuYWRkRWxlbWVudCh7CiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICBib2R5OiBib2R5LAogICAgICAgIHR5cGU6IFRZUEVTLlNQSEVSRSwKICAgICAgICBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHNldExpbmVhclZlbG9jaXR5ID0gZnVuY3Rpb24gc2V0TGluZWFyVmVsb2NpdHkoZGF0YSkgewogICAgICB2YXIgdXVpZCA9IGRhdGEudXVpZCwKICAgICAgICAgIF9kYXRhJHZlbG9jaXR5ID0gZGF0YS52ZWxvY2l0eSwKICAgICAgICAgIHZlbG9jaXR5ID0gX2RhdGEkdmVsb2NpdHkgPT09IHZvaWQgMCA/IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZIDogX2RhdGEkdmVsb2NpdHk7CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpLAogICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgbGluZWFyVmVsb2NpdHkgPSBuZXcgQW1tby5idFZlY3RvcjModmVsb2NpdHkueCwgdmVsb2NpdHkueSwgdmVsb2NpdHkueik7CiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7CiAgICAgICAgQW1tby5kZXN0cm95KGxpbmVhclZlbG9jaXR5KTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIHNldFBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQyID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudDIuYm9keTsKCiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnopKTsKICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgfTsKICAgIHZhciBhcHBseUltcHVzZSA9IGZ1bmN0aW9uIGFwcGx5SW1wdXNlKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJGltcHVsc2UgPSBfcmVmLmltcHVsc2UsCiAgICAgICAgICBpbXB1bHNlID0gX3JlZiRpbXB1bHNlID09PSB2b2lkIDAgPyBERUZBVUxUX0lNUFVMU0UgOiBfcmVmJGltcHVsc2U7CgogICAgICB2YXIgX3dvcmxkJGdldEVsZW1lbnQzID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgIGJvZHkgPSBfd29ybGQkZ2V0RWxlbWVudDMuYm9keTsKCiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKCiAgICAgIGlmIChtb3Rpb25TdGF0ZSkgewogICAgICAgIHZhciBpbXB1bHNlVmVjdG9yID0gbmV3IEFtbW8uYnRWZWN0b3IzKGltcHVsc2UueCwgaW1wdWxzZS55LCBpbXB1bHNlLnopOwogICAgICAgIGJvZHkuYXBwbHlDZW50cmFsSW1wdWxzZShpbXB1bHNlVmVjdG9yKTsKICAgICAgICBBbW1vLmRlc3Ryb3koaW1wdWxzZVZlY3Rvcik7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlRWxlbWVudFVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZUVsZW1lbnRVcGRhdGUoX3JlZjIsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZjIuYm9keSwKICAgICAgICAgIHV1aWQgPSBfcmVmMi51dWlkLAogICAgICAgICAgX3JlZjIkc3RhdGUgPSBfcmVmMi5zdGF0ZTsKICAgICAgdmFyIG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpOwoKICAgICAgaWYgKG1vdGlvblN0YXRlKSB7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB2YXIgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICAgIHZhciByb3RhdGlvbiA9IHRyYW5zZm9ybS5nZXRSb3RhdGlvbigpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7CiAgICAgICAgQW1tby5kZXN0cm95KHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGFkZFBsYXllciA9IGZ1bmN0aW9uIGFkZFBsYXllcihkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgd2lkdGggPSBkYXRhLndpZHRoLAogICAgICAgICAgaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb24sCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uLAogICAgICAgICAgbWFzcyA9IGRhdGEubWFzcywKICAgICAgICAgIGZyaWN0aW9uID0gZGF0YS5mcmljdGlvbjsKICAgICAgdmFyIGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgdmFyIGJvZHkgPSBjcmVhdGVSaWdpZEJvZHkoY2Fwc3VsZSwgewogICAgICAgIHV1aWQ6IHV1aWQsCiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uLAogICAgICAgIHF1YXRlcm5pb246IHF1YXRlcm5pb24sCiAgICAgICAgbWFzczogbWFzcywKICAgICAgICBmcmljdGlvbjogZnJpY3Rpb24KICAgICAgfSk7IC8vIGRpc2FibGlpbmcgcm90YXRpb24gZm9yIGNvbGxpc2lvbnMKCiAgICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTsKICAgICAgd29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpOwogICAgICB3b3JsZC5hZGRFbGVtZW50KHsKICAgICAgICB1dWlkOiB1dWlkLAogICAgICAgIGJvZHk6IGJvZHksCiAgICAgICAgdHlwZTogVFlQRVMuUExBWUVSLAogICAgICAgIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgaGFuZGxlUGxheWVyVXBkYXRlID0gZnVuY3Rpb24gaGFuZGxlUGxheWVyVXBkYXRlKF9yZWYsIGR0KSB7CiAgICAgIHZhciBib2R5ID0gX3JlZi5ib2R5LAogICAgICAgICAgdXVpZCA9IF9yZWYudXVpZCwKICAgICAgICAgIF9yZWYkc3RhdGUgPSBfcmVmLnN0YXRlLAogICAgICAgICAgc3RhdGUgPSBfcmVmJHN0YXRlID09PSB2b2lkIDAgPyBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSA6IF9yZWYkc3RhdGU7CiAgICAgIHZhciBtb3ZlbWVudCA9IHN0YXRlLm1vdmVtZW50LAogICAgICAgICAgZGlyZWN0aW9uID0gc3RhdGUuZGlyZWN0aW9uLAogICAgICAgICAgY2FtZXJhRGlyZWN0aW9uID0gc3RhdGUuY2FtZXJhRGlyZWN0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IHN0YXRlLnF1YXRlcm5pb24sCiAgICAgICAgICBwb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uOwogICAgICB2YXIgTUFYX1NQRUVEID0gMTsKICAgICAgdmFyIHdhbGtWZWxvY2l0eSA9IC4xOwogICAgICB2YXIgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7CgogICAgICBpZiAobW90aW9uU3RhdGUpIHsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHZhciBsaW5lYXJWZWxvY2l0eSA9IGJvZHkuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICB2YXIgc3BlZWQgPSBsaW5lYXJWZWxvY2l0eS5sZW5ndGgoKTsKICAgICAgICB2YXIgZm9yd2FyZERpciA9IHRyYW5zZm9ybS5nZXRCYXNpcygpLmdldFJvdygyKTsKICAgICAgICBmb3J3YXJkRGlyLm5vcm1hbGl6ZSgpOwogICAgICAgIHZhciB3YWxrRGlyZWN0aW9uID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAuMCwgMC4wLCAwLjApOwogICAgICAgIHZhciB3YWxrU3BlZWQgPSB3YWxrVmVsb2NpdHkgKiBkdDsKCiAgICAgICAgaWYgKG1vdmVtZW50LmZvcndhcmQpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSArIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpICsgZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSArIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmIChtb3ZlbWVudC5iYWNrd2FyZHMpIHsKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0WCh3YWxrRGlyZWN0aW9uLngoKSAtIGZvcndhcmREaXIueCgpKTsgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpIC0gZm9yd2FyZERpci55KCkpOwoKICAgICAgICAgIHdhbGtEaXJlY3Rpb24uc2V0Wih3YWxrRGlyZWN0aW9uLnooKSAtIGZvcndhcmREaXIueigpKTsKICAgICAgICB9CgogICAgICAgIGlmICghbW92ZW1lbnQuZm9yd2FyZCAmJiAhbW92ZW1lbnQuYmFja3dhcmRzKSB7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSAqIDAuMik7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSAqIDAuMik7CiAgICAgICAgfSBlbHNlIGlmIChzcGVlZCA8IE1BWF9TUEVFRCkgewogICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WChsaW5lYXJWZWxvY2l0eS54KCkgKyBjYW1lcmFEaXJlY3Rpb24ueCAqIHdhbGtTcGVlZCk7CiAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSArIGNhbWVyYURpcmVjdGlvbi56ICogd2Fsa1NwZWVkKTsKICAgICAgICB9CgogICAgICAgIGJvZHkuc2V0TGluZWFyVmVsb2NpdHkobGluZWFyVmVsb2NpdHkpOwogICAgICAgIGJvZHkuZ2V0TW90aW9uU3RhdGUoKS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGJvZHkuc2V0Q2VudGVyT2ZNYXNzVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdmFyIG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICB2YXIgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTsKICAgICAgICBkaXNwYXRjaGVyLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgQ2xvY2sgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBDbG9jaygpIHsKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgQ2xvY2spOwoKICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhDbG9jaywgW3sKICAgICAgICBrZXk6ICJnZXREZWx0YSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldERlbHRhKCkgewogICAgICAgICAgdmFyIHRpbWUgPSBEYXRlLm5vdygpOwoKICAgICAgICAgIGlmICh0aGlzLnRpbWVzdGFtcCkgewogICAgICAgICAgICB2YXIgZGVsdGEgPSB0aW1lIC0gdGhpcy50aW1lc3RhbXA7CiAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gdGltZTsKICAgICAgICAgICAgcmV0dXJuIGRlbHRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH1dKTsKCiAgICAgIHJldHVybiBDbG9jazsKICAgIH0oKTsKCiAgICB2YXIgV29ybGQgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBXb3JsZCgpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgV29ybGQpOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImluaXQiLCBmdW5jdGlvbiAob3B0aW9ucykgewogICAgICAgICAgdmFyIF9vcHRpb25zJGdyYXZpdHkgPSBvcHRpb25zLmdyYXZpdHksCiAgICAgICAgICAgICAgZ3Jhdml0eSA9IF9vcHRpb25zJGdyYXZpdHkgPT09IHZvaWQgMCA/IEdSQVZJVFkgOiBfb3B0aW9ucyRncmF2aXR5OwogICAgICAgICAgX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IG5ldyBBbW1vLmJ0RGVmYXVsdENvbGxpc2lvbkNvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgIF90aGlzLmRpc3BhdGNoZXIgPSBuZXcgQW1tby5idENvbGxpc2lvbkRpc3BhdGNoZXIoX3RoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7CiAgICAgICAgICBfdGhpcy5icm9hZHBoYXNlID0gbmV3IEFtbW8uYnREYnZ0QnJvYWRwaGFzZSgpOwogICAgICAgICAgX3RoaXMuc29sdmVyID0gbmV3IEFtbW8uYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIoKTsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQgPSBuZXcgQW1tby5idERpc2NyZXRlRHluYW1pY3NXb3JsZChfdGhpcy5kaXNwYXRjaGVyLCBfdGhpcy5icm9hZHBoYXNlLCBfdGhpcy5zb2x2ZXIsIF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwoKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc2V0R3Jhdml0eShuZXcgQW1tby5idFZlY3RvcjMoZ3Jhdml0eS54LCBncmF2aXR5LnksIGdyYXZpdHkueikpOyAvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZ2hvc3RPYmplY3QgY29sbGlzaW9ucwoKCiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmdldEJyb2FkcGhhc2UoKS5nZXRPdmVybGFwcGluZ1BhaXJDYWNoZSgpLnNldEludGVybmFsR2hvc3RQYWlyQ2FsbGJhY2sobmV3IEFtbW8uYnRHaG9zdFBhaXJDYWxsYmFjaygpKTsKCiAgICAgICAgICBfdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAicmVtb3ZlRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICBpZiAoX3RoaXMuaGFzRWxlbWVudCh1dWlkKSkgewogICAgICAgICAgICBfdGhpcy5lbGVtZW50c1t1dWlkXS5kZWxldGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJyZW1vdmVEZWxldGVkRWxlbWVudHMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZpbHRlcihmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZDsKICAgICAgICAgIH0pLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgZGVsZXRlIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiaGFzRWxlbWVudCIsIGZ1bmN0aW9uICh1dWlkKSB7CiAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmluY2x1ZGVzKHV1aWQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImdldEVsZW1lbnQiLCBmdW5jdGlvbiAodXVpZCkgewogICAgICAgICAgcmV0dXJuIF90aGlzLmVsZW1lbnRzW3V1aWRdOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImlzSW5pdGlhbGlzZWQiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuaW5pdGlhbGlzZWQ7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAiZ2V0RHluYW1pY3NXb3JsZCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIHJldHVybiBfdGhpcy5keW5hbWljc1dvcmxkOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZFJpZ2lkQm9keSIsIGZ1bmN0aW9uIChib2R5KSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZFJpZ2lkQm9keShib2R5KTsKICAgICAgICB9KTsKCiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRoaXMsICJhZGRBY3Rpb24iLCBmdW5jdGlvbiAoYWN0aW9uKSB7CiAgICAgICAgICBfdGhpcy5keW5hbWljc1dvcmxkLmFkZEFjdGlvbihhY3Rpb24pOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZENvbGxpc2lvbk9iamVjdCIsIGZ1bmN0aW9uIChjb2xsaXNpb25PYmplY3QpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGNvbGxpc2lvbk9iamVjdCk7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAic3RlcFNpbXVsYXRpb24iLCBmdW5jdGlvbiAoZHQpIHsKICAgICAgICAgIF90aGlzLmR5bmFtaWNzV29ybGQuc3RlcFNpbXVsYXRpb24oZHQpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInNpbXVsYXRlIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgdmFyIGR0ID0gX3RoaXMuY2xvY2suZ2V0RGVsdGEoKTsKCiAgICAgICAgICBfdGhpcy5zdGVwU2ltdWxhdGlvbihkdCk7CgogICAgICAgICAgT2JqZWN0LmtleXMoX3RoaXMuZWxlbWVudHMpLmZvckVhY2goZnVuY3Rpb24gKHV1aWQpIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBfdGhpcy5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5CT1g6CiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlNQSEVSRToKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuTUVTSDoKICAgICAgICAgICAgICAgICAgaGFuZGxlRWxlbWVudFVwZGF0ZShlbGVtZW50LCBkdCk7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuUExBWUVSOgogICAgICAgICAgICAgICAgICBoYW5kbGVQbGF5ZXJVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlZFSElDTEU6CiAgICAgICAgICAgICAgICAgIGhhbmRsZVZlaGljbGVVcGRhdGUoZWxlbWVudCwgZHQpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIF90aGlzLmNhbGN1bGF0ZUNvbGxpc2lvbnMoKTsKCiAgICAgICAgICBfdGhpcy5yZW1vdmVEZWxldGVkRWxlbWVudHMoKTsKCiAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZFBoeXNpY3NVcGRhdGUoZHQpOwogICAgICAgICAgX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoX3RoaXMuc2ltdWxhdGUuYmluZChfdGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImNhbGN1bGF0ZUNvbGxpc2lvbnMiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgYW1tb0Rpc3BhdGNoZXIgPSBfdGhpcy5keW5hbWljc1dvcmxkLmdldERpc3BhdGNoZXIoKTsKCiAgICAgICAgICB2YXIgbnVtTWFuaWZvbGRzID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TnVtTWFuaWZvbGRzKCk7CgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1NYW5pZm9sZHM7IGkrKykgewogICAgICAgICAgICB2YXIgY29udGFjdE1hbmlmb2xkID0gYW1tb0Rpc3BhdGNoZXIuZ2V0TWFuaWZvbGRCeUluZGV4SW50ZXJuYWwoaSk7CiAgICAgICAgICAgIHZhciByYjAgPSBBbW1vLmNhc3RPYmplY3QoY29udGFjdE1hbmlmb2xkLmdldEJvZHkwKCksIEFtbW8uYnRSaWdpZEJvZHkpOwogICAgICAgICAgICB2YXIgcmIxID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MSgpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICAgICAgdmFyIG51bUNvbnRhY3RzID0gY29udGFjdE1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7IC8vIHRoaXMgaXRlcmF0aW9uIGRvZXNuJ3QgaGF2ZSB1dWlkcwoKICAgICAgICAgICAgaWYgKCFyYjAudXVpZCB8fCAhcmIxLnV1aWQpIGNvbnRpbnVlOwogICAgICAgICAgICB2YXIgY29udGFjdHMgPSBbXTsKCiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbnVtQ29udGFjdHM7IGorKykgewogICAgICAgICAgICAgIHZhciBjb250YWN0UG9pbnQgPSBjb250YWN0TWFuaWZvbGQuZ2V0Q29udGFjdFBvaW50KGopOwogICAgICAgICAgICAgIHZhciBkaXN0YW5jZSA9IGNvbnRhY3RQb2ludC5nZXREaXN0YW5jZSgpOwogICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA+IDAuMCkgY29udGludWU7CiAgICAgICAgICAgICAgdmFyIHZlbG9jaXR5MCA9IHJiMC5nZXRMaW5lYXJWZWxvY2l0eSgpOwogICAgICAgICAgICAgIHZhciB2ZWxvY2l0eTEgPSByYjEuZ2V0TGluZWFyVmVsb2NpdHkoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MwID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkEoKTsKICAgICAgICAgICAgICB2YXIgd29ybGRQb3MxID0gY29udGFjdFBvaW50LmdldF9tX3Bvc2l0aW9uV29ybGRPbkIoKTsKICAgICAgICAgICAgICB2YXIgbG9jYWxQb3MwID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRBKCk7CiAgICAgICAgICAgICAgdmFyIGxvY2FsUG9zMSA9IGNvbnRhY3RQb2ludC5nZXRfbV9sb2NhbFBvaW50QigpOwogICAgICAgICAgICAgIGNvbnRhY3RzLnB1c2goewogICAgICAgICAgICAgICAgZGlzdGFuY2U6IGRpc3RhbmNlLAogICAgICAgICAgICAgICAgZWxlbWVudHM6IFt7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMC51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MC54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkwLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTAueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MwLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczAueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMC56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczAueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMC55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MwLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgIHV1aWQ6IHJiMS51dWlkLAogICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogewogICAgICAgICAgICAgICAgICAgIHg6IHZlbG9jaXR5MS54KCksCiAgICAgICAgICAgICAgICAgICAgeTogdmVsb2NpdHkxLnkoKSwKICAgICAgICAgICAgICAgICAgICB6OiB2ZWxvY2l0eTEueigpCiAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgIHdvcmxkUG9zOiB7CiAgICAgICAgICAgICAgICAgICAgeDogd29ybGRQb3MxLngoKSwKICAgICAgICAgICAgICAgICAgICB5OiB3b3JsZFBvczEueSgpLAogICAgICAgICAgICAgICAgICAgIHo6IHdvcmxkUG9zMS56KCkKICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgbG9jYWxQb3M6IHsKICAgICAgICAgICAgICAgICAgICB4OiBsb2NhbFBvczEueCgpLAogICAgICAgICAgICAgICAgICAgIHk6IGxvY2FsUG9zMS55KCksCiAgICAgICAgICAgICAgICAgICAgejogbG9jYWxQb3MxLnooKQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIwLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQocmIxLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7CiAgICAgICAgICAgICAgY29udGFjdHM6IGNvbnRhY3RzCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgImFkZEVsZW1lbnQiLCBmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgX3RoaXMuZWxlbWVudHNbZGF0YS51dWlkXSA9IGRhdGE7CiAgICAgICAgfSk7CgogICAgICAgIF9kZWZpbmVQcm9wZXJ0eSh0aGlzLCAidXBkYXRlQm9keVN0YXRlIiwgZnVuY3Rpb24gKF9yZWYpIHsKICAgICAgICAgIHZhciB1dWlkID0gX3JlZi51dWlkLAogICAgICAgICAgICAgIHN0YXRlID0gX3JlZi5zdGF0ZTsKICAgICAgICAgIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0gX29iamVjdFNwcmVhZDIoX29iamVjdFNwcmVhZDIoe30sIF90aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlKSwgc3RhdGUpOwogICAgICAgIH0pOwoKICAgICAgICBfZGVmaW5lUHJvcGVydHkodGhpcywgInRlcm1pbmF0ZSIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5keW5hbWljc1dvcmxkKTsKICAgICAgICAgIEFtbW8uZGVzdHJveShfdGhpcy5zb2x2ZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmRpc3BhdGNoZXIpOwogICAgICAgICAgQW1tby5kZXN0cm95KF90aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoX3RoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQpOwogICAgICAgICAgZGlzcGF0Y2hlciQxLnNlbmRUZXJtaW5hdGVFdmVudCgpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307CiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuc29sdmVyID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gbnVsbDsKICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDbGFzcyhXb3JsZCwgW3sKICAgICAgICBrZXk6ICJkaXNwb3NlQm9keSIsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3Bvc2VCb2R5KF9yZWYyKSB7CiAgICAgICAgICB2YXIgdXVpZCA9IF9yZWYyLnV1aWQ7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTsKICAgICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5yZW1vdmVSaWdpZEJvZHkoZWxlbWVudC5ib2R5KTsKICAgICAgICAgIHRoaXMucmVtb3ZlRWxlbWVudCh1dWlkKTsKICAgICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRWxlbWVudERpc3Bvc2VkKHsKICAgICAgICAgICAgdXVpZDogdXVpZAogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9XSk7CgogICAgICByZXR1cm4gV29ybGQ7CiAgICB9KCk7CiAgICB2YXIgd29ybGQgPSBuZXcgV29ybGQoKTsKCiAgICB2YXIgREVGQVVMVF9ST0xMX0lORkxVRU5DRSA9IDAuMjsKICAgIHZhciBERUZBVUxUX0ZSSUNUSU9OID0gMTAwMDsKICAgIHZhciBERUZBVUxUX01BU1MgPSA4MDA7CiAgICB2YXIgYWRkVmVoaWNsZSA9IGZ1bmN0aW9uIGFkZFZlaGljbGUoZGF0YSkgewogICAgICB2YXIgcG9zaXRpb24gPSBkYXRhLnBvc2l0aW9uLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICB3aGVlbHMgPSBkYXRhLndoZWVscywKICAgICAgICAgIF9kYXRhJG1hc3MgPSBkYXRhLm1hc3MsCiAgICAgICAgICBtYXNzID0gX2RhdGEkbWFzcyA9PT0gdm9pZCAwID8gREVGQVVMVF9NQVNTIDogX2RhdGEkbWFzcywKICAgICAgICAgIF9kYXRhJHdpZHRoID0gZGF0YS53aWR0aCwKICAgICAgICAgIHdpZHRoID0gX2RhdGEkd2lkdGggPT09IHZvaWQgMCA/IDEuOCA6IF9kYXRhJHdpZHRoLAogICAgICAgICAgX2RhdGEkaGVpZ2h0ID0gZGF0YS5oZWlnaHQsCiAgICAgICAgICBoZWlnaHQgPSBfZGF0YSRoZWlnaHQgPT09IHZvaWQgMCA/IC42IDogX2RhdGEkaGVpZ2h0LAogICAgICAgICAgX2RhdGEkbGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBsZW5ndGggPSBfZGF0YSRsZW5ndGggPT09IHZvaWQgMCA/IDQgOiBfZGF0YSRsZW5ndGgsCiAgICAgICAgICBfZGF0YSRmcmljdGlvbiA9IGRhdGEuZnJpY3Rpb24sCiAgICAgICAgICBmcmljdGlvbiA9IF9kYXRhJGZyaWN0aW9uID09PSB2b2lkIDAgPyBERUZBVUxUX0ZSSUNUSU9OIDogX2RhdGEkZnJpY3Rpb24sCiAgICAgICAgICBfZGF0YSRyb2xsSW5mbHVlbmNlID0gZGF0YS5yb2xsSW5mbHVlbmNlLAogICAgICAgICAgcm9sbEluZmx1ZW5jZSA9IF9kYXRhJHJvbGxJbmZsdWVuY2UgPT09IHZvaWQgMCA/IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UgOiBfZGF0YSRyb2xsSW5mbHVlbmNlLAogICAgICAgICAgX2RhdGEkd2hlZWxzT3B0aW9ucyA9IGRhdGEud2hlZWxzT3B0aW9ucywKICAgICAgICAgIHdoZWVsc09wdGlvbnMgPSBfZGF0YSR3aGVlbHNPcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHdoZWVsc09wdGlvbnMsCiAgICAgICAgICBfZGF0YSRzdXNwZW5zaW9ucyA9IGRhdGEuc3VzcGVuc2lvbnMsCiAgICAgICAgICBzdXNwZW5zaW9ucyA9IF9kYXRhJHN1c3BlbnNpb25zID09PSB2b2lkIDAgPyB7fSA6IF9kYXRhJHN1c3BlbnNpb25zOwogICAgICB2YXIgX3doZWVsc09wdGlvbnMkYmFjayA9IHdoZWVsc09wdGlvbnMuYmFjaywKICAgICAgICAgIGJhY2sgPSBfd2hlZWxzT3B0aW9ucyRiYWNrID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGJhY2ssCiAgICAgICAgICBfd2hlZWxzT3B0aW9ucyRmcm9udCA9IHdoZWVsc09wdGlvbnMuZnJvbnQsCiAgICAgICAgICBmcm9udCA9IF93aGVlbHNPcHRpb25zJGZyb250ID09PSB2b2lkIDAgPyB7fSA6IF93aGVlbHNPcHRpb25zJGZyb250OwogICAgICB2YXIgX2JhY2skYXhpc1Bvc2l0aW9uID0gYmFjay5heGlzUG9zaXRpb24sCiAgICAgICAgICBheGlzUG9zaXRpb25CYWNrID0gX2JhY2skYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAtMSA6IF9iYWNrJGF4aXNQb3NpdGlvbiwKICAgICAgICAgIF9iYWNrJHJhZGl1cyA9IGJhY2sucmFkaXVzLAogICAgICAgICAgd2hlZWxSYWRpdXNCYWNrID0gX2JhY2skcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9iYWNrJHJhZGl1cywKICAgICAgICAgIF9iYWNrJGhhbGZUcmFjayA9IGJhY2suaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tCYWNrID0gX2JhY2skaGFsZlRyYWNrID09PSB2b2lkIDAgPyAxIDogX2JhY2skaGFsZlRyYWNrLAogICAgICAgICAgX2JhY2skYXhpc0hlaWdodCA9IGJhY2suYXhpc0hlaWdodCwKICAgICAgICAgIHdoZWVsQXhpc0hlaWdodEJhY2sgPSBfYmFjayRheGlzSGVpZ2h0ID09PSB2b2lkIDAgPyAuMyA6IF9iYWNrJGF4aXNIZWlnaHQ7CiAgICAgIHZhciBfZnJvbnQkYXhpc1Bvc2l0aW9uID0gZnJvbnQuYXhpc1Bvc2l0aW9uLAogICAgICAgICAgYXhpc1Bvc2l0aW9uRnJvbnQgPSBfZnJvbnQkYXhpc1Bvc2l0aW9uID09PSB2b2lkIDAgPyAxLjcgOiBfZnJvbnQkYXhpc1Bvc2l0aW9uLAogICAgICAgICAgX2Zyb250JHJhZGl1cyA9IGZyb250LnJhZGl1cywKICAgICAgICAgIHdoZWVsUmFkaXVzRnJvbnQgPSBfZnJvbnQkcmFkaXVzID09PSB2b2lkIDAgPyAuNCA6IF9mcm9udCRyYWRpdXMsCiAgICAgICAgICBfZnJvbnQkaGFsZlRyYWNrID0gZnJvbnQuaGFsZlRyYWNrLAogICAgICAgICAgd2hlZWxIYWxmVHJhY2tGcm9udCA9IF9mcm9udCRoYWxmVHJhY2sgPT09IHZvaWQgMCA/IDEgOiBfZnJvbnQkaGFsZlRyYWNrLAogICAgICAgICAgX2Zyb250JGF4aXNIZWlnaHQgPSBmcm9udC5heGlzSGVpZ2h0LAogICAgICAgICAgd2hlZWxBeGlzSGVpZ2h0RnJvbnQgPSBfZnJvbnQkYXhpc0hlaWdodCA9PT0gdm9pZCAwID8gLjMgOiBfZnJvbnQkYXhpc0hlaWdodDsKICAgICAgdmFyIF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9IHN1c3BlbnNpb25zLnN0aWZmbmVzcywKICAgICAgICAgIHN0aWZmbmVzcyA9IF9zdXNwZW5zaW9ucyRzdGlmZm5lcyA9PT0gdm9pZCAwID8gMjAuMCA6IF9zdXNwZW5zaW9ucyRzdGlmZm5lcywKICAgICAgICAgIF9zdXNwZW5zaW9ucyRkYW1waW5nID0gc3VzcGVuc2lvbnMuZGFtcGluZywKICAgICAgICAgIGRhbXBpbmcgPSBfc3VzcGVuc2lvbnMkZGFtcGluZyA9PT0gdm9pZCAwID8gMi4zIDogX3N1c3BlbnNpb25zJGRhbXBpbmcsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkY29tcHJlc3MgPSBzdXNwZW5zaW9ucy5jb21wcmVzc2lvbiwKICAgICAgICAgIGNvbXByZXNzaW9uID0gX3N1c3BlbnNpb25zJGNvbXByZXNzID09PSB2b2lkIDAgPyA0LjQgOiBfc3VzcGVuc2lvbnMkY29tcHJlc3MsCiAgICAgICAgICBfc3VzcGVuc2lvbnMkcmVzdExlbmcgPSBzdXNwZW5zaW9ucy5yZXN0TGVuZ3RoLAogICAgICAgICAgcmVzdExlbmd0aCA9IF9zdXNwZW5zaW9ucyRyZXN0TGVuZyA9PT0gdm9pZCAwID8gMC42IDogX3N1c3BlbnNpb25zJHJlc3RMZW5nOyAvLyBDaGFzc2lzCgogICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIC41LCBoZWlnaHQgKiAuNSwgbGVuZ3RoICogLjUpKTsKICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgIHRyYW5zZm9ybS5zZXRJZGVudGl0eSgpOwogICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7CiAgICAgIHZhciBsb2NhbEluZXJ0aWEgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgMCwgMCk7CiAgICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpOwogICAgICB2YXIgY2hhc3NpcyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgZ2VvbWV0cnksIGxvY2FsSW5lcnRpYSkpOwogICAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7CiAgICAgIHdvcmxkLmFkZFJpZ2lkQm9keShjaGFzc2lzKTsgLy8gUmF5Y2FzdCBWZWhpY2xlCgogICAgICB2YXIgdHVuaW5nID0gbmV3IEFtbW8uYnRWZWhpY2xlVHVuaW5nKCk7CiAgICAgIHZhciByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7CiAgICAgIHZhciB2ZWhpY2xlID0gbmV3IEFtbW8uYnRSYXljYXN0VmVoaWNsZSh0dW5pbmcsIGNoYXNzaXMsIHJheUNhc3Rlcik7CiAgICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTsKICAgICAgd29ybGQuYWRkQWN0aW9uKHZlaGljbGUpOwogICAgICB2YXIgd2hlZWxEaXJlY3Rpb25DUzAgPSBuZXcgQW1tby5idFZlY3RvcjMoMCwgLTEsIDApOwogICAgICB2YXIgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApOwoKICAgICAgdmFyIGFkZFdoZWVsID0gZnVuY3Rpb24gYWRkV2hlZWwoaXNGcm9udCwgcG9zLCByYWRpdXMpIHsKICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChwb3MsIHdoZWVsRGlyZWN0aW9uQ1MwLCB3aGVlbEF4bGVDUywgcmVzdExlbmd0aCwgcmFkaXVzLCB0dW5pbmcsIGlzRnJvbnQpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9zdXNwZW5zaW9uU3RpZmZuZXNzKHN0aWZmbmVzcyk7CiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV93aGVlbHNEYW1waW5nQ29tcHJlc3Npb24oY29tcHJlc3Npb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9mcmljdGlvblNsaXAoZnJpY3Rpb24pOwogICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpOwogICAgICB9OwoKICAgICAgYWRkV2hlZWwodHJ1ZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKC13aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spOwogICAgICBhZGRXaGVlbChmYWxzZSwgbmV3IEFtbW8uYnRWZWN0b3IzKHdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7CiAgICAgIHZlaGljbGUudXVpZCA9IHV1aWQ7CiAgICAgIHdvcmxkLmFkZEVsZW1lbnQoewogICAgICAgIHR5cGU6IFRZUEVTLlZFSElDTEUsCiAgICAgICAgdXVpZDogdXVpZCwKICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLAogICAgICAgIHdoZWVsczogd2hlZWxzLAogICAgICAgIG9wdGlvbnM6IGRhdGEsCiAgICAgICAgc3RhdGU6IERFRkFVTFRfVkVISUNMRV9TVEFURQogICAgICB9KTsKICAgIH07CiAgICB2YXIgc2V0VmVoaWNsZVBvc2l0aW9uID0gZnVuY3Rpb24gc2V0VmVoaWNsZVBvc2l0aW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IGRhdGEucG9zaXRpb247CiAgICAgIHZhciBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTsKCiAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHsKICAgICAgICB2YXIgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBib2R5LmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpOwogICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgfQogICAgfTsKICAgIHZhciBzZXRWZWhpY2xlUXVhdGVybmlvbiA9IGZ1bmN0aW9uIHNldFZlaGljbGVRdWF0ZXJuaW9uKGRhdGEpIHsKICAgICAgdmFyIHV1aWQgPSBkYXRhLnV1aWQsCiAgICAgICAgICBxdWF0ZXJuaW9uID0gZGF0YS5xdWF0ZXJuaW9uOwogICAgICB2YXIgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7CgogICAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7CiAgICAgICAgdmFyIGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7CiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7CiAgICAgICAgYm9keS5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIHJlc2V0VmVoaWNsZSA9IGZ1bmN0aW9uIHJlc2V0VmVoaWNsZShkYXRhKSB7CiAgICAgIHZhciB1dWlkID0gZGF0YS51dWlkLAogICAgICAgICAgcXVhdGVybmlvbiA9IGRhdGEucXVhdGVybmlvbiwKICAgICAgICAgIHBvc2l0aW9uID0gZGF0YS5wb3NpdGlvbjsKICAgICAgdmFyIGVsZW1lbnQgPSB3b3JsZC5nZXRFbGVtZW50KHV1aWQpOwoKICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gVFlQRVMuVkVISUNMRSkgewogICAgICAgIHZhciBib2R5ID0gZWxlbWVudC52ZWhpY2xlLmdldFJpZ2lkQm9keSgpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTsKICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7CiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTsKICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7CiAgICAgIH0KICAgIH07CiAgICB2YXIgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVZlaGljbGVVcGRhdGUoX3JlZiwgZHQpIHsKICAgICAgdmFyIHZlaGljbGUgPSBfcmVmLnZlaGljbGUsCiAgICAgICAgICB3aGVlbHMgPSBfcmVmLndoZWVscywKICAgICAgICAgIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBfcmVmJHN0YXRlID0gX3JlZi5zdGF0ZSwKICAgICAgICAgIHN0YXRlID0gX3JlZiRzdGF0ZSA9PT0gdm9pZCAwID8gREVGQVVMVF9WRUhJQ0xFX1NUQVRFIDogX3JlZiRzdGF0ZSwKICAgICAgICAgIF9yZWYkb3B0aW9ucyA9IF9yZWYub3B0aW9ucywKICAgICAgICAgIG9wdGlvbnMgPSBfcmVmJG9wdGlvbnMgPT09IHZvaWQgMCA/IHt9IDogX3JlZiRvcHRpb25zOwogICAgICB2YXIgc3BlZWQgPSB2ZWhpY2xlLmdldEN1cnJlbnRTcGVlZEttSG91cigpOwogICAgICBkaXNwYXRjaGVyJDEuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TUEVFRCwgewogICAgICAgIHNwZWVkOiBzcGVlZAogICAgICB9KTsKICAgICAgdmFyIGJyZWFraW5nRm9yY2UgPSAwOwogICAgICB2YXIgZW5naW5lRm9yY2UgPSAwOwogICAgICB2YXIgX29wdGlvbnMkc3RlZXJpbmdDbGFtID0gb3B0aW9ucy5zdGVlcmluZ0NsYW1wLAogICAgICAgICAgc3RlZXJpbmdDbGFtcCA9IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19DTEFNUCA6IF9vcHRpb25zJHN0ZWVyaW5nQ2xhbSwKICAgICAgICAgIF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9IG9wdGlvbnMuc3RlZXJpbmdJbmNyZW1lbnQsCiAgICAgICAgICBzdGVlcmluZ0luY3JlbWVudCA9IF9vcHRpb25zJHN0ZWVyaW5nSW5jciA9PT0gdm9pZCAwID8gREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlQgOiBfb3B0aW9ucyRzdGVlcmluZ0luY3IsCiAgICAgICAgICBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPSBvcHRpb25zLm1heEVuZ2luZUZvcmNlLAogICAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBfb3B0aW9ucyRtYXhFbmdpbmVGb3IgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSA6IF9vcHRpb25zJG1heEVuZ2luZUZvciwKICAgICAgICAgIF9vcHRpb25zJG1heEJyZWFraW5nRiA9IG9wdGlvbnMubWF4QnJlYWtpbmdGb3JjZSwKICAgICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBfb3B0aW9ucyRtYXhCcmVha2luZ0YgPT09IHZvaWQgMCA/IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIDogX29wdGlvbnMkbWF4QnJlYWtpbmdGOwoKICAgICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikgewogICAgICAgIGlmIChzcGVlZCA8IC0xKSBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5icmFraW5nKSB7CiAgICAgICAgaWYgKHNwZWVkID4gMSkgYnJlYWtpbmdGb3JjZSA9IG1heEJyZWFraW5nRm9yY2U7ZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5sZWZ0KSB7CiAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA8IHN0ZWVyaW5nQ2xhbXApIHN0YXRlLnZlaGljbGVTdGVlcmluZyArPSBzdGVlcmluZ0luY3JlbWVudDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc3RhdGUucmlnaHQpIHsKICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiAtc3RlZXJpbmdDbGFtcCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RhdGUudmVoaWNsZVN0ZWVyaW5nIDwgLXN0ZWVyaW5nSW5jcmVtZW50KSBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgKz0gc3RlZXJpbmdJbmNyZW1lbnQ7ZWxzZSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPiBzdGVlcmluZ0luY3JlbWVudCkgc3RhdGUudmVoaWNsZVN0ZWVyaW5nIC09IHN0ZWVyaW5nSW5jcmVtZW50O2Vsc2UgewogICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19MRUZUKTsKICAgICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlIC8gMiwgRlJPTlRfTEVGVCk7CiAgICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSAvIDIsIEZST05UX1JJR0hUKTsKICAgICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpOwogICAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UsIEJBQ0tfUklHSFQpOwogICAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTsKICAgICAgdmVoaWNsZS5zZXRTdGVlcmluZ1ZhbHVlKHN0YXRlLnZlaGljbGVTdGVlcmluZywgRlJPTlRfUklHSFQpOwogICAgICB2YXIgdG0sIHAsIHEsIGk7CiAgICAgIHZhciBuID0gdmVoaWNsZS5nZXROdW1XaGVlbHMoKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpOwogICAgICAgIHRtID0gdmVoaWNsZS5nZXRXaGVlbFRyYW5zZm9ybVdTKGkpOwogICAgICAgIHAgPSB0bS5nZXRPcmlnaW4oKTsKICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTsKICAgICAgICB2YXIgd2hlZWxVVUlEID0gd2hlZWxzW2ldOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kQm9keVVwZGF0ZSh3aGVlbFVVSUQsIHAsIHEsIGR0KTsKICAgICAgfQoKICAgICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpOwogICAgICBwID0gdG0uZ2V0T3JpZ2luKCk7CiAgICAgIHEgPSB0bS5nZXRSb3RhdGlvbigpOwogICAgICB2YXIgZGlyZWN0aW9uID0gdmVoaWNsZS5nZXRGb3J3YXJkVmVjdG9yKCk7CiAgICAgIGRpc3BhdGNoZXIkMS5zZW5kRGlzcGF0Y2hFdmVudCh1dWlkLCBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLkRJUkVDVElPTiwgewogICAgICAgIGRpcmVjdGlvbjogewogICAgICAgICAgeDogZGlyZWN0aW9uLngoKSwKICAgICAgICAgIHk6IGRpcmVjdGlvbi55KCksCiAgICAgICAgICB6OiBkaXJlY3Rpb24ueigpCiAgICAgICAgfQogICAgICB9KTsKICAgICAgZGlzcGF0Y2hlciQxLnNlbmRCb2R5VXBkYXRlKHV1aWQsIHAsIHEsIGR0KTsKICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTsKICAgIH07CgogICAgdmFyIGNyZWF0ZUdob3N0Q29sbGlkZXIgPSBmdW5jdGlvbiBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgcG9zaXRpb24pIHsKICAgICAgdmFyIGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7CiAgICAgIHZhciB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpOwogICAgICBnaG9zdENvbGxpZGVyLnNldENvbGxpc2lvblNoYXBlKG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKSk7CiAgICAgIGdob3N0Q29sbGlkZXIuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7CiAgICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4ocG9zaXRpb24pOwogICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTsKICAgICAgZ2hvc3RDb2xsaWRlci5zZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICByZXR1cm4gewogICAgICAgIGdob3N0Q29sbGlkZXI6IGdob3N0Q29sbGlkZXIsCiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm0KICAgICAgfTsKICAgIH07CiAgICB2YXIgZm9yRWFjaEdob3N0Q29sbGlzaW9uID0gZnVuY3Rpb24gZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIpIHsKICAgICAgdmFyIGZvckVhY2hDYWxsYmFjayA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZnVuY3Rpb24gKCkge307CiAgICAgIHZhciBjb2xsaXNpb25zID0gZ2hvc3RDb2xsaWRlci5nZXROdW1PdmVybGFwcGluZ09iamVjdHMoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29sbGlzaW9uczsgaSsrKSB7CiAgICAgICAgdmFyIG9iamVjdCA9IEFtbW8uY2FzdE9iamVjdChnaG9zdENvbGxpZGVyLmdldE92ZXJsYXBwaW5nT2JqZWN0KGkpLCBBbW1vLmJ0UmlnaWRCb2R5KTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBvYmplY3QuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpOwogICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pOwogICAgICB9CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvblBvc2l0aW9uID0gZnVuY3Rpb24gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pIHsKICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247CgogICAgICBpZiAoIWV4cGxvc2lvblBvc2l0aW9uKSB7CiAgICAgICAgdmFyIF93b3JsZCRnZXRFbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKSwKICAgICAgICAgICAgYm9keSA9IF93b3JsZCRnZXRFbGVtZW50LmJvZHk7CgogICAgICAgIHZhciBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTsKICAgICAgICB2YXIgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTsKICAgICAgICBtb3Rpb25TdGF0ZS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpOwogICAgICB9CgogICAgICByZXR1cm4gZXhwbG9zaW9uUG9zaXRpb247CiAgICB9OwogICAgdmFyIGdldEV4cGxvc2lvbkltcHVsc2UgPSBmdW5jdGlvbiBnZXRFeHBsb3Npb25JbXB1bHNlKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpIHsKICAgICAgdmFyIGRpc3RhbmNlID0gcG9zaXRpb24ub3Bfc3ViKGV4cGxvc2lvblBvc2l0aW9uKTsKICAgICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7CiAgICAgIHZhciBpbXB1bHNlID0gZGlzdGFuY2Uub3BfbXVsKHN0cmVuZ3RoKTsKICAgICAgaW1wdWxzZS5zZXRZKGltcHVsc2UueSgpICsgc3RyZW5ndGgpOwogICAgICByZXR1cm4gaW1wdWxzZTsKICAgIH07CiAgICB2YXIgY3JlYXRlRXhwbG9zaW9uID0gZnVuY3Rpb24gY3JlYXRlRXhwbG9zaW9uKF9yZWYpIHsKICAgICAgdmFyIHV1aWQgPSBfcmVmLnV1aWQsCiAgICAgICAgICBwb3NpdGlvbiA9IF9yZWYucG9zaXRpb24sCiAgICAgICAgICBfcmVmJHJhZGl1cyA9IF9yZWYucmFkaXVzLAogICAgICAgICAgcmFkaXVzID0gX3JlZiRyYWRpdXMgPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TSVpFUy5TTUFMTCA6IF9yZWYkcmFkaXVzLAogICAgICAgICAgX3JlZiRzdHJlbmd0aCA9IF9yZWYuc3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aCA9IF9yZWYkc3RyZW5ndGggPT09IHZvaWQgMCA/IEVYUExPU0lPTl9TVFJFTkdUSFMuTUVESVVNIDogX3JlZiRzdHJlbmd0aDsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFyIGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pOwoKICAgICAgICB2YXIgX2NyZWF0ZUdob3N0Q29sbGlkZXIgPSBjcmVhdGVHaG9zdENvbGxpZGVyKHJhZGl1cywgZXhwbG9zaW9uUG9zaXRpb24pLAogICAgICAgICAgICBnaG9zdENvbGxpZGVyID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIuZ2hvc3RDb2xsaWRlciwKICAgICAgICAgICAgdHJhbnNmb3JtID0gX2NyZWF0ZUdob3N0Q29sbGlkZXIudHJhbnNmb3JtOwoKICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7CiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIGZ1bmN0aW9uIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgewogICAgICAgICAgdmFyIG9yaWdpbiA9IG9iamVjdFRyYW5zZm9ybS5nZXRPcmlnaW4oKTsKICAgICAgICAgIG9iamVjdC5hY3RpdmF0ZSh0cnVlKTsKICAgICAgICAgIG9iamVjdC5hcHBseUNlbnRyYWxJbXB1bHNlKGdldEV4cGxvc2lvbkltcHVsc2Uob3JpZ2luLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpKTsKICAgICAgICB9KTsKICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpOwogICAgICAgIEFtbW8uZGVzdHJveShnaG9zdENvbGxpZGVyKTsKICAgICAgICBBbW1vLmRlc3Ryb3kodHJhbnNmb3JtKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUubG9nKGUpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBoYW5kbGVMb2FkRXZlbnQgPSBmdW5jdGlvbiBoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKEFtbW8pIHsKICAgICAgICBzZWxmLkFtbW8gPSBBbW1vOwoKICAgICAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZikgewogICAgICAgICAgdmFyIGRhdGEgPSBfcmVmLmRhdGE7CgogICAgICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELkJPWDoKICAgICAgICAgICAgICBhZGRCb3goZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5TUEhFUkU6CiAgICAgICAgICAgICAgYWRkU3BoZXJlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuVkVISUNMRToKICAgICAgICAgICAgICBhZGRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuTU9ERUw6CiAgICAgICAgICAgICAgYWRkTW9kZWwoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5QTEFZRVI6CiAgICAgICAgICAgICAgYWRkUGxheWVyKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULlNFVC5MSU5FQVJfVkVMT0NJVFk6CiAgICAgICAgICAgICAgc2V0TGluZWFyVmVsb2NpdHkoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULlBPU0lUSU9OOgogICAgICAgICAgICAgIHNldFBvc2l0aW9uKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5WRUhJQ0xFLlNFVC5QT1NJVElPTjoKICAgICAgICAgICAgICBzZXRWZWhpY2xlUG9zaXRpb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlFVQVRFUk5JT046CiAgICAgICAgICAgICAgc2V0VmVoaWNsZVF1YXRlcm5pb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuUkVTRVQ6CiAgICAgICAgICAgICAgcmVzZXRWZWhpY2xlKGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkFQUExZLklNUFVMU0U6CiAgICAgICAgICAgICAgYXBwbHlJbXB1c2UoZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFOgogICAgICAgICAgICAgIHdvcmxkLnVwZGF0ZUJvZHlTdGF0ZShkYXRhKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5ESVNQT1NFOgogICAgICAgICAgICAgIHdvcmxkLmRpc3Bvc2VCb2R5KGRhdGEpOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FRkZFQ1RTLkVYUExPU0lPTjoKICAgICAgICAgICAgICBjcmVhdGVFeHBsb3Npb24oZGF0YSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURToKICAgICAgICAgICAgICB3b3JsZC50ZXJtaW5hdGUoKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB3b3JsZC5pbml0KG9wdGlvbnMpOwogICAgICAgIGRpc3BhdGNoZXIkMS5zZW5kUmVhZHlFdmVudCgpOwogICAgICAgIHdvcmxkLnNpbXVsYXRlKCk7CiAgICAgIH07CiAgICB9OwoKICAgIHZhciBsb2FkQW1tbyA9IGZ1bmN0aW9uIGxvYWRBbW1vKG9wdGlvbnMpIHsKICAgICAgdmFyIHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTsKICAgICAgaW1wb3J0U2NyaXB0cyhzY3JpcHRVcmwpOwogICAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpOwogICAgfTsKCiAgICBvbm1lc3NhZ2UgPSBmdW5jdGlvbiBvbm1lc3NhZ2UoX3JlZjIpIHsKICAgICAgdmFyIGRhdGEgPSBfcmVmMi5kYXRhOwoKICAgICAgc3dpdGNoIChkYXRhLmV2ZW50KSB7CiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86CiAgICAgICAgICBsb2FkQW1tbyhkYXRhKTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9OwoKfSgpKTsKCg==', 'data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy9jb25zdGFudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3MvbWVzc2FnZXMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL2xpYi9kaXNwYXRjaGVyLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9saWIvbWF0aC5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvZWxlbWVudHMuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3BsYXllci5qcyIsIndvcmtlcjovL3dlYi13b3JrZXIvcGh5c2ljcy93b3JrZXIvd29ybGQuanMiLCJ3b3JrZXI6Ly93ZWItd29ya2VyL3BoeXNpY3Mvd29ya2VyL3ZlaGljbGVzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9lZmZlY3RzLmpzIiwid29ya2VyOi8vd2ViLXdvcmtlci9waHlzaWNzL3dvcmtlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgTElCUkFSWV9OQU1FID0gJ2FtbW8uanMnO1xuXG5leHBvcnQgY29uc3QgVFlQRVMgPSB7XG4gICAgQk9YOiAnQk9YJyxcbiAgICBTUEhFUkU6ICdTUEhFUkUnLFxuICAgIFZFSElDTEU6ICdWRUhJQ0xFJyxcbiAgICBNRVNIOiAnTUVTSCcsXG4gICAgUExBWUVSOiAnUExBWUVSJ1xufTtcblxuZXhwb3J0IGNvbnN0IENPTExJREVSX1RZUEVTID0ge1xuICAgIEJPWDogJ0JPWCcsXG4gICAgVkVISUNMRTogJ1ZFSElDTEUnLFxuICAgIFBMQVlFUjogJ1BMQVlFUicsXG4gICAgU1BIRVJFOiAnU1BIRVJFJ1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfVkVISUNMRV9TVEFURSA9IHtcbiAgICB2ZWhpY2xlU3RlZXJpbmc6IDAsXG4gICAgYWNjZWxlcmF0aW9uOiBmYWxzZSxcbiAgICBicmVha2luZzogZmFsc2UsXG4gICAgcmlnaHQ6IGZhbHNlLFxuICAgIGxlZnQ6IGZhbHNlXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgPSB7XG4gICAgdmVsb2NpdHk6IHsgeDogMCwgeTogMCwgejogMCB9LFxuICAgIG1vdmVtZW50OiB7XG4gICAgICAgIGZvcndhcmQ6IGZhbHNlLFxuICAgICAgICBiYWNrd2FyZHM6IGZhbHNlLFxuICAgICAgICBsZWZ0OiBmYWxzZSxcbiAgICAgICAgcmlnaHQ6IGZhbHNlXG4gICAgfSxcbiAgICBkaXJlY3Rpb246IHtcbiAgICAgICAgeDogMCxcbiAgICAgICAgeTogMCxcbiAgICAgICAgejogMFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NDQUxFID0geyB4OiAxLCB5OiAxLCB6OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9RVUFURVJOSU9OID0geyB4OiAwLCB5OiAwLCB6OiAwLCB3OiAxIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9QT1NJVElPTiA9IHsgeDogMCwgeTogMCwgejogMCB9O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5leHBvcnQgY29uc3QgREVGQVVMVF9JTVBVTFNFID0geyB4OiAwLCB5OiAwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBESVNBQkxFX0RFQUNUSVZBVElPTiA9IDQ7XG5leHBvcnQgY29uc3QgR1JBVklUWSA9IHsgeDogMCwgeTogLTEwLCB6OiAwIH07XG5cbmV4cG9ydCBjb25zdCBGUk9OVF9MRUZUID0gMDtcbmV4cG9ydCBjb25zdCBGUk9OVF9SSUdIVCA9IDE7XG5leHBvcnQgY29uc3QgQkFDS19MRUZUID0gMjtcbmV4cG9ydCBjb25zdCBCQUNLX1JJR0hUID0gMztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UID0gLjA0O1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAgPSAuNTtcbmV4cG9ydCBjb25zdCBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UgPSAyMDAwO1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFID0gMTAwO1xuXG5leHBvcnQgY29uc3QgRVhQTE9TSU9OX1NJWkVTID0ge1xuICAgIFNNQUxMOiA0LFxuICAgIE1FRElVTTogNixcbiAgICBMQVJHRTogOCxcbiAgICBNQVNTSVZFOiAxMlxufTtcblxuZXhwb3J0IGNvbnN0IEVYUExPU0lPTl9TVFJFTkdUSFMgPSB7XG4gICAgVkVSWV9XRUFLOiAyLFxuICAgIFdFQUs6IDQsXG4gICAgTUVESVVNOiA4LFxuICAgIExBUkdFOiAxNixcbiAgICBNQVNTSVZFOiAzMixcbiAgICBPS19OTzogNjRcbn07IiwiZXhwb3J0IGNvbnN0IFBIWVNJQ1NfRVZFTlRTID0ge1xuICAgIERJU1BBVENIOiAncGh5c2ljczpkaXNwYXRjaCcsXG4gICAgVEVSTUlOQVRFOiAncGh5c2ljczp0ZXJtaW5hdGUnLFxuICAgIExPQUQ6IHtcbiAgICAgICAgQU1NTzogJ3BoeXNpY3M6bG9hZDphbW1vJyxcbiAgICB9LFxuICAgIFJFQURZOiAncGh5c2ljczpyZWFkeScsXG4gICAgSU5JVDogJ3BoeXNpY3M6aW5pdCcsXG4gICAgVVBEQVRFOiAncGh5c2ljczp1cGRhdGUnLFxuICAgIFxuICAgIEFERDoge1xuICAgICAgICBCT1g6ICdwaHlzaWNzOmFkZDpib3gnLFxuICAgICAgICBWRUhJQ0xFOiAncGh5c2ljczphZGQ6dmVoaWNsZScsXG4gICAgICAgIE1PREVMOiAncGh5c2ljczphZGQ6bW9kZWwnLFxuICAgICAgICBQTEFZRVI6ICdwaHlzaWNzOmFkZDpwbGF5ZXInLFxuICAgICAgICBTUEhFUkU6ICdwaHlzaWNzOmFkZDpzcGhlcmUnLFxuICAgIH0sXG5cbiAgICBFTEVNRU5UOiB7XG4gICAgICAgIERJU1BPU0U6ICdwaHlzaWNzOmVsZW1lbnQ6ZGlzcG9zZScsXG4gICAgICAgIENPTExJU0lPTjogJ3BoeXNpY3M6ZWxlbWVudDpjb2xsaXNpb24nLFxuICAgICAgICBVUERBVEU6ICdwaHlzaWNzOmVsZW1lbnQ6dXBkYXRlJyxcbiAgICAgICAgQ1JFQVRFRDogJ3BoeXNpY3M6ZWxlbWVudDpjcmVhdGVkJyxcblxuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczplbGVtZW50OnNldDpxdWF0ZXJuaW9uJyxcbiAgICAgICAgICAgIExJTkVBUl9WRUxPQ0lUWTogJ3BoeXNpY3M6ZWxlbWVudDpzZXQ6bGluZWFyX3ZlbG9jaXR5J1xuICAgICAgICB9LFxuXG4gICAgICAgIEFQUExZOiB7XG4gICAgICAgICAgICBJTVBVTFNFOiAncGh5c2ljczplbGVtZW50OmFwcGx5OmltcHVsc2UnXG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgVkVISUNMRToge1xuICAgICAgICBTRVQ6IHtcbiAgICAgICAgICAgIFBPU0lUSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpwb3NpdGlvbicsXG4gICAgICAgICAgICBRVUFURVJOSU9OOiAncGh5c2ljczp2ZWhpY2xlOnNldDpxdWF0ZXJuaW9uJ1xuICAgICAgICB9LFxuICAgICAgICBSRVNFVDogJ3BoeXNpY3M6dmVoaWNsZTpyZXNldCcsXG4gICAgICAgIFxuICAgICAgICBTUEVFRDogJ3BoeXNpY3M6dmVoaWNsZTpzcGVlZCcsXG4gICAgICAgIERJUkVDVElPTjogJ3BoeXNpY3M6dmVoaWNsZTpkaXJlY3Rpb24nXG4gICAgfSxcblxuICAgIEVGRkVDVFM6IHtcbiAgICAgICAgRVhQTE9TSU9OOiAncGh5c2ljczplZmZlY3RzOmV4cGxvc2lvbidcbiAgICB9XG59OyIsImltcG9ydCB7IFBIWVNJQ1NfRVZFTlRTIH0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcGF0Y2hlciB7XG5cbiAgICBzZW5kUGh5c2ljc1VwZGF0ZSA9IGR0ID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlVQREFURSwgZHQgfSlcbiAgICBzZW5kUmVhZHlFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlJFQURZIH0pO1xuICAgIHNlbmRUZXJtaW5hdGVFdmVudCA9ICgpID0+IHBvc3RNZXNzYWdlKHsgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLlRFUk1JTkFURSB9KTtcblxuICAgIHNlbmRCb2R5VXBkYXRlID0gKHV1aWQsIHBvc2l0aW9uLCByb3RhdGlvbiwgZHQpID0+IHBvc3RNZXNzYWdlKHtcbiAgICAgICAgZXZlbnQ6IFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuVVBEQVRFLFxuICAgICAgICB1dWlkLFxuICAgICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54KCksIHk6IHBvc2l0aW9uLnkoKSwgejogcG9zaXRpb24ueigpIH0sXG4gICAgICAgIHF1YXRlcm5pb246IHsgeDogcm90YXRpb24ueCgpLCB5OiByb3RhdGlvbi55KCksIHo6IHJvdGF0aW9uLnooKSwgdzogcm90YXRpb24udygpIH0sXG4gICAgICAgIGR0XG4gICAgfSk7XG5cbiAgICBzZW5kRGlzcGF0Y2hFdmVudCA9ICh1dWlkLCBldmVudE5hbWUsIGV2ZW50RGF0YSkgPT4gcG9zdE1lc3NhZ2Uoe1xuICAgICAgICBldmVudDogUEhZU0lDU19FVkVOVFMuRElTUEFUQ0gsXG4gICAgICAgIHV1aWQsXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgZXZlbnREYXRhXG4gICAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgRGlzcGF0Y2hlcigpOyIsImV4cG9ydCBjb25zdCBhcHBseU1hdHJpeDRUb1ZlY3RvcjMgPSAoeyB4ID0gMCwgeSA9IDAsIHogPSAwIH0sIG1hdHJpeCA9IFtdKSA9PiB7XG4gICAgY29uc3QgdyA9IDEgLyAoIG1hdHJpeFsgMyBdICogeCArIG1hdHJpeFsgNyBdICogeSArIG1hdHJpeFsgMTEgXSAqIHogKyBtYXRyaXhbIDE1IF0gKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHg6ICggbWF0cml4WyAwIF0gKiB4ICsgbWF0cml4WyA0IF0gKiB5ICsgbWF0cml4WyA4IF0gKiB6ICsgbWF0cml4WyAxMiBdICkgKiB3LFxuICAgICAgICB5OiAoIG1hdHJpeFsgMSBdICogeCArIG1hdHJpeFsgNSBdICogeSArIG1hdHJpeFsgOSBdICogeiArIG1hdHJpeFsgMTMgXSApICogdyxcbiAgICAgICAgejogKCBtYXRyaXhbIDIgXSAqIHggKyBtYXRyaXhbIDYgXSAqIHkgKyBtYXRyaXhbIDEwIF0gKiB6ICsgbWF0cml4WyAxNCBdICkgKiB3LFxuICAgIH1cbn07IiwiaW1wb3J0IGRpc3BhdGNoZXIgZnJvbSAnLi9saWIvZGlzcGF0Y2hlcic7XG5pbXBvcnQgd29ybGQgZnJvbSAnLi93b3JsZCc7XG5cbmltcG9ydCB7XG4gICAgYXBwbHlNYXRyaXg0VG9WZWN0b3IzXG59IGZyb20gJy4vbGliL21hdGgnO1xuXG5pbXBvcnQge1xuICAgIERFRkFVTFRfUklHSURCT0RZX1NUQVRFLFxuICAgIFRZUEVTLFxuICAgIERFRkFVTFRfU0NBTEUsXG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgREVGQVVMVF9MSU5FQVJfVkVMT0NJVFksXG4gICAgREVGQVVMVF9JTVBVTFNFXG59IGZyb20gJy4uL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSaWdpZEJvZHkgPSAoc2hhcGUsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIHV1aWQsXG4gICAgICAgIHBvc2l0aW9uLFxuICAgICAgICBxdWF0ZXJuaW9uLFxuICAgICAgICBtYXNzLFxuICAgICAgICBmcmljdGlvbixcbiAgICAgICAgcmVzdGl0dXRpb24gPSAuOSxcbiAgICAgICAgZGFtcGluZyA9IHsgbGluZWFyOiAwLjIsIGFuZ3VsYXI6IDAuMiB9XG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgdHJhbnNmb3JtLnNldElkZW50aXR5KCk7XG4gICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueikpO1xuICAgIHRyYW5zZm9ybS5zZXRSb3RhdGlvbihuZXcgQW1tby5idFF1YXRlcm5pb24ocXVhdGVybmlvbi54LCBxdWF0ZXJuaW9uLnksIHF1YXRlcm5pb24ueiwgcXVhdGVybmlvbi53KSk7XG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBuZXcgQW1tby5idERlZmF1bHRNb3Rpb25TdGF0ZSh0cmFuc2Zvcm0pO1xuICAgIGNvbnN0IGxvY2FsSW5lcnRpYSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAwLCAwKTtcbiAgICBzaGFwZS5jYWxjdWxhdGVMb2NhbEluZXJ0aWEobWFzcywgbG9jYWxJbmVydGlhKTtcblxuICAgIGNvbnN0IHJiSW5mbyA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5Q29uc3RydWN0aW9uSW5mbyhtYXNzLCBtb3Rpb25TdGF0ZSwgc2hhcGUsIGxvY2FsSW5lcnRpYSk7XG4gICAgY29uc3QgYm9keSA9IG5ldyBBbW1vLmJ0UmlnaWRCb2R5KHJiSW5mbyk7XG5cbiAgICBcblxuICAgIGlmIChtYXNzID4gMCkge1xuICAgICAgICBib2R5LnNldEZyaWN0aW9uKGZyaWN0aW9uKTtcbiAgICAgICAgYm9keS5zZXRSZXN0aXR1dGlvbihyZXN0aXR1dGlvbik7XG4gICAgICAgIGJvZHkuc2V0RGFtcGluZyhkYW1waW5nLmxpbmVhciwgZGFtcGluZy5hbmd1bGFyKTtcbiAgICAgICAgYm9keS5zZXRBY3RpdmF0aW9uU3RhdGUoRElTQUJMRV9ERUFDVElWQVRJT04pO1xuICAgIH1cblxuICAgIC8vIHN0b3JpbmcgdXVpZCBmb3IgZnV0dXJlIHJlZmVyZW5jZVxuICAgIGJvZHkudXVpZCA9IHV1aWQ7XG5cbiAgICB3b3JsZC5hZGRSaWdpZEJvZHkoYm9keSk7XG5cbiAgICByZXR1cm4gYm9keTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZE1vZGVsID0gKG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIHV1aWQsXG4gICAgICAgIHZlcnRpY2VzLFxuICAgICAgICBtYXRyaWNlcyxcbiAgICAgICAgaW5kZXhlcyxcbiAgICAgICAgcG9zaXRpb24sXG4gICAgICAgIHF1YXRlcm5pb24sXG4gICAgICAgIG1hc3MgPSAwLFxuICAgICAgICBmcmljdGlvbiA9IDJcbiAgICB9ID0gb3B0aW9ucztcblxuICAgIGNvbnN0IHNjYWxlID0gREVGQVVMVF9TQ0FMRTtcblxuICAgIGNvbnN0IGJ0YSA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IGJ0YiA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IGJ0YyA9IG5ldyBBbW1vLmJ0VmVjdG9yMygpO1xuICAgIGNvbnN0IHRyaU1lc2ggPSBuZXcgQW1tby5idFRyaWFuZ2xlTWVzaCh0cnVlLCBmYWxzZSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudHMgPSB2ZXJ0aWNlc1tpXTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBpbmRleGVzW2ldID8gaW5kZXhlc1tpXSA6IG51bGw7XG4gICAgICAgIGNvbnN0IG1hdHJpeCA9IEFycmF5LmZyb20obWF0cmljZXNbaV0pO1xuXG4gICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbmRleC5sZW5ndGg7IGogKz0gMykge1xuICAgICAgICAgICAgY29uc3QgYWkgPSBpbmRleFtqXSAqIDM7XG4gICAgICAgICAgICBjb25zdCBiaSA9IGluZGV4W2ogKyAxXSAqIDM7XG4gICAgICAgICAgICBjb25zdCBjaSA9IGluZGV4W2ogKyAyXSAqIDM7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhID0gYXBwbHlNYXRyaXg0VG9WZWN0b3IzKHsgeDogY29tcG9uZW50c1thaV0sIHk6IGNvbXBvbmVudHNbYWkgKyAxXSwgejogY29tcG9uZW50c1thaSArIDJdIH0sIG1hdHJpeCk7XG4gICAgICAgICAgICBjb25zdCB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbYmldLCB5OiBjb21wb25lbnRzW2JpICsgMV0sIHo6IGNvbXBvbmVudHNbYmkgKyAyXSB9LCBtYXRyaXgpO1xuICAgICAgICAgICAgY29uc3QgdmMgPSBhcHBseU1hdHJpeDRUb1ZlY3RvcjMoeyB4OiBjb21wb25lbnRzW2NpXSwgeTogY29tcG9uZW50c1tjaSArIDFdLCB6OiBjb21wb25lbnRzW2NpICsgMl0gfSwgbWF0cml4KTtcblxuICAgICAgICAgICAgYnRhLnNldFZhbHVlKHZhLngsIHZhLnksIHZhLnopO1xuICAgICAgICAgICAgYnRiLnNldFZhbHVlKHZiLngsIHZiLnksIHZiLnopO1xuICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopO1xuICAgICAgICAgICAgdHJpTWVzaC5hZGRUcmlhbmdsZShidGEsIGJ0YiwgYnRjLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbXBvbmVudHMubGVuZ3RoOyBqICs9IDkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YSA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDBdLCB5OiBjb21wb25lbnRzW2ogKyAxXSwgejogY29tcG9uZW50c1tqICsgMl0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YiA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDNdLCB5OiBjb21wb25lbnRzW2ogKyA0XSwgejogY29tcG9uZW50c1tqICsgNV0gfSwgbWF0cml4KTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YyA9IGFwcGx5TWF0cml4NFRvVmVjdG9yMyh7IHg6IGNvbXBvbmVudHNbaiArIDZdLCB5OiBjb21wb25lbnRzW2ogKyA3XSwgejogY29tcG9uZW50c1tqICsgOF0gfSwgbWF0cml4KTtcblxuICAgICAgICAgICAgICAgIGJ0YS5zZXRWYWx1ZSh2YS54LCB2YS55LCB2YS56KTtcbiAgICAgICAgICAgICAgICBidGIuc2V0VmFsdWUodmIueCwgdmIueSwgdmIueik7XG4gICAgICAgICAgICAgICAgYnRjLnNldFZhbHVlKHZjLngsIHZjLnksIHZjLnopO1xuICAgICAgICAgICAgICAgIHRyaU1lc2guYWRkVHJpYW5nbGUoYnRhLCBidGIsIGJ0YywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWxTY2FsZSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyhzY2FsZS54LCBzY2FsZS55LCBzY2FsZS56KTtcbiAgICB0cmlNZXNoLnNldFNjYWxpbmcobG9jYWxTY2FsZSk7XG4gICAgQW1tby5kZXN0cm95KGxvY2FsU2NhbGUpO1xuXG4gICAgY29uc3QgY29sbGlzaW9uU2hhcGUgPSBuZXcgQW1tby5idEJ2aFRyaWFuZ2xlTWVzaFNoYXBlKHRyaU1lc2gsIHRydWUsIHRydWUpO1xuICAgIGNvbGxpc2lvblNoYXBlLnJlc291cmNlcyA9IFt0cmlNZXNoXTtcblxuICAgIEFtbW8uZGVzdHJveShidGEpO1xuICAgIEFtbW8uZGVzdHJveShidGIpO1xuICAgIEFtbW8uZGVzdHJveShidGMpO1xuXG4gICAgY29uc3QgYm9keSA9IGNyZWF0ZVJpZ2lkQm9keShjb2xsaXNpb25TaGFwZSwgeyB1dWlkLCBwb3NpdGlvbiwgcXVhdGVybmlvbiwgbWFzcywgZnJpY3Rpb24gfSk7XG4gICAgd29ybGQuYWRkRWxlbWVudCh7IHV1aWQsIGJvZHksIHR5cGU6IFRZUEVTLk1FU0gsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZEJveCA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB3aWR0aCwgbGVuZ3RoLCBoZWlnaHQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzID0gMCwgZnJpY3Rpb24gPSAyIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgQW1tby5idEJveFNoYXBlKG5ldyBBbW1vLmJ0VmVjdG9yMyh3aWR0aCAqIDAuNSwgaGVpZ2h0ICogMC41LCBsZW5ndGggKiAwLjUpKTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIHdvcmxkLmFkZEVsZW1lbnQoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5CT1gsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRTcGhlcmUgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHJhZGl1cywgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MgPSAwLCBmcmljdGlvbiA9IDIgfSA9IGRhdGE7XG5cbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBBbW1vLmJ0U3BoZXJlU2hhcGUocmFkaXVzKTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGdlb21ldHJ5LCB7IHV1aWQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9KTtcblxuICAgIHdvcmxkLmFkZEVsZW1lbnQoeyB1dWlkLCBib2R5LCB0eXBlOiBUWVBFUy5TUEhFUkUsIHN0YXRlOiBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRMaW5lYXJWZWxvY2l0eSA9IChkYXRhKSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCB2ZWxvY2l0eSA9IERFRkFVTFRfTElORUFSX1ZFTE9DSVRZIH0gPSBkYXRhO1xuICAgIGNvbnN0IHsgYm9keSB9ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBsaW5lYXJWZWxvY2l0eSA9IG5ldyBBbW1vLmJ0VmVjdG9yMyh2ZWxvY2l0eS54LCB2ZWxvY2l0eS55LCB2ZWxvY2l0eS56KTtcbiAgICAgICAgYm9keS5zZXRMaW5lYXJWZWxvY2l0eShsaW5lYXJWZWxvY2l0eSk7XG4gICAgICAgIEFtbW8uZGVzdHJveShsaW5lYXJWZWxvY2l0eSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNldFBvc2l0aW9uID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgIHRyYW5zZm9ybS5zZXRPcmlnaW4obmV3IEFtbW8uYnRWZWN0b3IzKHBvc2l0aW9uLngsIHBvc2l0aW9uLnksIHBvc2l0aW9uLnogKSk7XG5cbiAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseUltcHVzZSA9ICh7IHV1aWQsIGltcHVsc2UgPSBERUZBVUxUX0lNUFVMU0UgfSkgPT4ge1xuICAgIGNvbnN0IHsgYm9keSB9ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IGJvZHkuZ2V0TW90aW9uU3RhdGUoKTtcblxuICAgIGlmIChtb3Rpb25TdGF0ZSkge1xuICAgICAgICBjb25zdCBpbXB1bHNlVmVjdG9yID0gbmV3IEFtbW8uYnRWZWN0b3IzKGltcHVsc2UueCwgaW1wdWxzZS55LCBpbXB1bHNlLnopO1xuICAgICAgICBib2R5LmFwcGx5Q2VudHJhbEltcHVsc2UoaW1wdWxzZVZlY3Rvcik7XG4gICAgICAgIEFtbW8uZGVzdHJveShpbXB1bHNlVmVjdG9yKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVFbGVtZW50VXBkYXRlID0gKHsgYm9keSwgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuXG4gICAgaWYgKG1vdGlvblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgbGV0IG9yaWdpbiA9IHRyYW5zZm9ybS5nZXRPcmlnaW4oKTtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdHJhbnNmb3JtLmdldFJvdGF0aW9uKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBvcmlnaW4sIHJvdGF0aW9uLCBkdCk7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBjcmVhdGVSaWdpZEJvZHkgfSBmcm9tICcuL2VsZW1lbnRzJztcbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcblxuaW1wb3J0IHtcbiAgICBUWVBFUyxcbiAgICBERUZBVUxUX1JJR0lEQk9EWV9TVEFURVxufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5leHBvcnQgY29uc3QgYWRkUGxheWVyID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHdpZHRoLCBoZWlnaHQsIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBtYXNzLCBmcmljdGlvbiB9ID0gZGF0YTtcblxuICAgIGNvbnN0IGNhcHN1bGUgPSBuZXcgQW1tby5idENhcHN1bGVTaGFwZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCBib2R5ID0gY3JlYXRlUmlnaWRCb2R5KGNhcHN1bGUsIHsgdXVpZCwgcG9zaXRpb24sIHF1YXRlcm5pb24sIG1hc3MsIGZyaWN0aW9uIH0pO1xuXG4gICAgLy8gZGlzYWJsaWluZyByb3RhdGlvbiBmb3IgY29sbGlzaW9uc1xuICAgIGJvZHkuc2V0QW5ndWxhckZhY3RvcigwKTtcblxuICAgIHdvcmxkLmFkZFJpZ2lkQm9keShib2R5KTtcbiAgICB3b3JsZC5hZGRFbGVtZW50KHsgdXVpZCwgYm9keSwgdHlwZTogVFlQRVMuUExBWUVSLCBzdGF0ZTogREVGQVVMVF9SSUdJREJPRFlfU1RBVEUgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlUGxheWVyVXBkYXRlID0gKHsgYm9keSwgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1JJR0lEQk9EWV9TVEFURSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IHsgbW92ZW1lbnQsIGRpcmVjdGlvbiwgY2FtZXJhRGlyZWN0aW9uLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gc3RhdGU7XG5cbiAgICBjb25zdCBNQVhfU1BFRUQgPSAxO1xuICAgIGNvbnN0IHdhbGtWZWxvY2l0eSA9IC4xO1xuXG4gICAgY29uc3QgbW90aW9uU3RhdGUgPSBib2R5LmdldE1vdGlvblN0YXRlKCk7XG5cbiAgICBpZiAobW90aW9uU3RhdGUpIHtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgbW90aW9uU3RhdGUuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICBjb25zdCBsaW5lYXJWZWxvY2l0eSA9IGJvZHkuZ2V0TGluZWFyVmVsb2NpdHkoKTtcbiAgICAgICAgY29uc3Qgc3BlZWQgPSBsaW5lYXJWZWxvY2l0eS5sZW5ndGgoKTtcblxuICAgICAgICBjb25zdCBmb3J3YXJkRGlyID0gdHJhbnNmb3JtLmdldEJhc2lzKCkuZ2V0Um93KDIpO1xuICAgICAgICBmb3J3YXJkRGlyLm5vcm1hbGl6ZSgpO1xuICAgICAgICBjb25zdCB3YWxrRGlyZWN0aW9uID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgIGNvbnN0IHdhbGtTcGVlZCA9IHdhbGtWZWxvY2l0eSAqIGR0O1xuXG4gICAgICAgIGlmIChtb3ZlbWVudC5mb3J3YXJkKSB7XG4gICAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgoIHdhbGtEaXJlY3Rpb24ueCgpICsgZm9yd2FyZERpci54KCkpO1xuICAgICAgICAgICAgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpICsgZm9yd2FyZERpci55KCkpO1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRaKCB3YWxrRGlyZWN0aW9uLnooKSArIGZvcndhcmREaXIueigpKTtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBpZiAobW92ZW1lbnQuYmFja3dhcmRzKSB7XG4gICAgICAgICAgICB3YWxrRGlyZWN0aW9uLnNldFgoIHdhbGtEaXJlY3Rpb24ueCgpIC0gZm9yd2FyZERpci54KCkpO1xuICAgICAgICAgICAgLy93YWxrRGlyZWN0aW9uLnNldFkoIHdhbGtEaXJlY3Rpb24ueSgpIC0gZm9yd2FyZERpci55KCkpO1xuICAgICAgICAgICAgd2Fsa0RpcmVjdGlvbi5zZXRaKCB3YWxrRGlyZWN0aW9uLnooKSAtIGZvcndhcmREaXIueigpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghbW92ZW1lbnQuZm9yd2FyZCAmJiAhbW92ZW1lbnQuYmFja3dhcmRzKSB7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRYKGxpbmVhclZlbG9jaXR5LngoKSAqIDAuMik7XG4gICAgICAgICAgICBsaW5lYXJWZWxvY2l0eS5zZXRaKGxpbmVhclZlbG9jaXR5LnooKSAqIDAuMik7XG4gICAgICAgIH0gZWxzZSBpZiAoc3BlZWQgPCBNQVhfU1BFRUQpIHtcbiAgICAgICAgICAgIGxpbmVhclZlbG9jaXR5LnNldFgobGluZWFyVmVsb2NpdHkueCgpICsgY2FtZXJhRGlyZWN0aW9uLnggKiB3YWxrU3BlZWQpO1xuICAgICAgICAgICAgbGluZWFyVmVsb2NpdHkuc2V0WihsaW5lYXJWZWxvY2l0eS56KCkgKyBjYW1lcmFEaXJlY3Rpb24ueiAqIHdhbGtTcGVlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBib2R5LnNldExpbmVhclZlbG9jaXR5KGxpbmVhclZlbG9jaXR5KTtcblxuICAgICAgICBib2R5LmdldE1vdGlvblN0YXRlKCkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICAgICAgYm9keS5zZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICBsZXQgb3JpZ2luID0gdHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICBkaXNwYXRjaGVyLnNlbmRCb2R5VXBkYXRlKHV1aWQsIG9yaWdpbiwgcm90YXRpb24sIGR0KTtcbiAgICB9XG59OyIsImltcG9ydCB7XG4gICAgR1JBVklUWSxcbiAgICBUWVBFU1xufSBmcm9tICcuLi9jb25zdGFudHMnO1xuXG5pbXBvcnQgeyBoYW5kbGVFbGVtZW50VXBkYXRlIH0gZnJvbSAnLi9lbGVtZW50cyc7XG5pbXBvcnQgeyBoYW5kbGVWZWhpY2xlVXBkYXRlIH0gZnJvbSAnLi92ZWhpY2xlcyc7XG5pbXBvcnQgeyBoYW5kbGVQbGF5ZXJVcGRhdGUgfSBmcm9tICcuL3BsYXllcic7XG5cbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHsgUEhZU0lDU19FVkVOVFMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmNsYXNzIENsb2NrIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IG51bGw7XG4gICAgfVxuXG4gICAgZ2V0RGVsdGEoKSB7XG4gICAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAodGhpcy50aW1lc3RhbXApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gdGltZSAtIHRoaXMudGltZXN0YW1wO1xuICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVsdGE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRpbWVzdGFtcCA9IHRpbWU7XG5cbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFdvcmxkIHtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVsZW1lbnRzID0ge307XG4gICAgICAgIHRoaXMuaW5pdGlhbGlzZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbGxpc2lvbkNvbmZpZ3VyYXRpb24gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnNvbHZlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMucmVxdWVzdEFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB0aGlzLmNsb2NrID0gbmV3IENsb2NrKCk7XG4gICAgfVxuXG4gICAgaW5pdCA9IChvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZ3Jhdml0eSA9IEdSQVZJVFkgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uID0gbmV3IEFtbW8uYnREZWZhdWx0Q29sbGlzaW9uQ29uZmlndXJhdGlvbigpO1xuICAgICAgICB0aGlzLmRpc3BhdGNoZXIgPSBuZXcgQW1tby5idENvbGxpc2lvbkRpc3BhdGNoZXIodGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5icm9hZHBoYXNlID0gbmV3IEFtbW8uYnREYnZ0QnJvYWRwaGFzZSgpO1xuICAgICAgICB0aGlzLnNvbHZlciA9IG5ldyBBbW1vLmJ0U2VxdWVudGlhbEltcHVsc2VDb25zdHJhaW50U29sdmVyKCk7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZCA9IG5ldyBBbW1vLmJ0RGlzY3JldGVEeW5hbWljc1dvcmxkKHRoaXMuZGlzcGF0Y2hlciwgdGhpcy5icm9hZHBoYXNlLCB0aGlzLnNvbHZlciwgdGhpcy5jb2xsaXNpb25Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnNldEdyYXZpdHkobmV3IEFtbW8uYnRWZWN0b3IzKGdyYXZpdHkueCwgZ3Jhdml0eS55LCBncmF2aXR5LnopKTtcblxuICAgICAgICAvLyB0aGlzIGlzIG5lZWRlZCBmb3IgZ2hvc3RPYmplY3QgY29sbGlzaW9uc1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGRcbiAgICAgICAgICAgIC5nZXRCcm9hZHBoYXNlKClcbiAgICAgICAgICAgIC5nZXRPdmVybGFwcGluZ1BhaXJDYWNoZSgpXG4gICAgICAgICAgICAuc2V0SW50ZXJuYWxHaG9zdFBhaXJDYWxsYmFjayhuZXcgQW1tby5idEdob3N0UGFpckNhbGxiYWNrKCkpXG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXNlZCA9IHRydWU7XG4gICAgfTtcblxuICAgIHJlbW92ZUVsZW1lbnQgPSB1dWlkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaGFzRWxlbWVudCh1dWlkKSkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50c1t1dWlkXS5kZWxldGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbW92ZURlbGV0ZWRFbGVtZW50cyA9ICgpID0+IChcbiAgICAgICAgT2JqZWN0XG4gICAgICAgICAgICAua2V5cyh0aGlzLmVsZW1lbnRzKVxuICAgICAgICAgICAgLmZpbHRlcih1dWlkID0+IHRoaXMuZWxlbWVudHNbdXVpZF0uZGVsZXRlZClcbiAgICAgICAgICAgIC5mb3JFYWNoKHV1aWQgPT4ge1xuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmVsZW1lbnRzW3V1aWRdO1xuICAgICAgICAgICAgfSlcbiAgICApO1xuXG4gICAgaGFzRWxlbWVudCA9IHV1aWQgPT4ge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5lbGVtZW50cykuaW5jbHVkZXModXVpZCk7XG4gICAgfVxuXG4gICAgZ2V0RWxlbWVudCA9IHV1aWQgPT4gdGhpcy5lbGVtZW50c1t1dWlkXTtcblxuICAgIGlzSW5pdGlhbGlzZWQgPSAoKSA9PiB0aGlzLmluaXRpYWxpc2VkO1xuXG4gICAgZ2V0RHluYW1pY3NXb3JsZCA9ICgpID0+IHRoaXMuZHluYW1pY3NXb3JsZDtcblxuICAgIGFkZFJpZ2lkQm9keSA9IGJvZHkgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkUmlnaWRCb2R5KGJvZHkpO1xuICAgIH1cblxuICAgIGFkZEFjdGlvbiA9IGFjdGlvbiA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5hZGRBY3Rpb24oYWN0aW9uKTtcbiAgICB9XG5cbiAgICBhZGRDb2xsaXNpb25PYmplY3QgPSBjb2xsaXNpb25PYmplY3QgPT4ge1xuICAgICAgICB0aGlzLmR5bmFtaWNzV29ybGQuYWRkQ29sbGlzaW9uT2JqZWN0KGNvbGxpc2lvbk9iamVjdCk7XG4gICAgfVxuXG4gICAgc3RlcFNpbXVsYXRpb24gPSBkdCA9PiB7XG4gICAgICAgIHRoaXMuZHluYW1pY3NXb3JsZC5zdGVwU2ltdWxhdGlvbihkdCk7XG4gICAgfVxuXG4gICAgc2ltdWxhdGUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGR0ID0gdGhpcy5jbG9jay5nZXREZWx0YSgpO1xuICAgICAgICB0aGlzLnN0ZXBTaW11bGF0aW9uKGR0KTtcblxuICAgICAgICBPYmplY3RcbiAgICAgICAgICAgIC5rZXlzKHRoaXMuZWxlbWVudHMpXG4gICAgICAgICAgICAuZm9yRWFjaCh1dWlkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50KHV1aWQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGVsZW1lbnQudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFUy5CT1g6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlNQSEVSRTpcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuTUVTSDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbGVtZW50VXBkYXRlKGVsZW1lbnQsIGR0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRVMuUExBWUVSOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBsYXllclVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVTLlZFSElDTEU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVmVoaWNsZVVwZGF0ZShlbGVtZW50LCBkdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVDb2xsaXNpb25zKCk7XG4gICAgICAgIHRoaXMucmVtb3ZlRGVsZXRlZEVsZW1lbnRzKCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kUGh5c2ljc1VwZGF0ZShkdCk7XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnNpbXVsYXRlLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIGNhbGN1bGF0ZUNvbGxpc2lvbnMgPSAoKSA9PiB7XG4gICAgICAgIGxldCBhbW1vRGlzcGF0Y2hlciA9IHRoaXMuZHluYW1pY3NXb3JsZC5nZXREaXNwYXRjaGVyKCk7XG4gICAgICAgIGxldCBudW1NYW5pZm9sZHMgPSBhbW1vRGlzcGF0Y2hlci5nZXROdW1NYW5pZm9sZHMoKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU1hbmlmb2xkczsgaSsrKSB7XG5cbiAgICAgICAgICAgIGxldCBjb250YWN0TWFuaWZvbGQgPSBhbW1vRGlzcGF0Y2hlci5nZXRNYW5pZm9sZEJ5SW5kZXhJbnRlcm5hbChpKTtcblxuICAgICAgICAgICAgbGV0IHJiMCA9IEFtbW8uY2FzdE9iamVjdChjb250YWN0TWFuaWZvbGQuZ2V0Qm9keTAoKSwgQW1tby5idFJpZ2lkQm9keSk7XG4gICAgICAgICAgICBsZXQgcmIxID0gQW1tby5jYXN0T2JqZWN0KGNvbnRhY3RNYW5pZm9sZC5nZXRCb2R5MSgpLCBBbW1vLmJ0UmlnaWRCb2R5KTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IG51bUNvbnRhY3RzID0gY29udGFjdE1hbmlmb2xkLmdldE51bUNvbnRhY3RzKCk7XG5cbiAgICAgICAgICAgIC8vIHRoaXMgaXRlcmF0aW9uIGRvZXNuJ3QgaGF2ZSB1dWlkc1xuICAgICAgICAgICAgaWYgKCFyYjAudXVpZCB8fCAhcmIxLnV1aWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgY29udGFjdHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db250YWN0czsgaisrKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29udGFjdFBvaW50ID0gY29udGFjdE1hbmlmb2xkLmdldENvbnRhY3RQb2ludChqKTtcbiAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBjb250YWN0UG9pbnQuZ2V0RGlzdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGlmKCBkaXN0YW5jZSA+IDAuMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBsZXQgdmVsb2NpdHkwID0gcmIwLmdldExpbmVhclZlbG9jaXR5KCk7XG4gICAgICAgICAgICAgICAgbGV0IHZlbG9jaXR5MSA9IHJiMS5nZXRMaW5lYXJWZWxvY2l0eSgpO1xuICAgICAgICAgICAgICAgIGxldCB3b3JsZFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSgpO1xuICAgICAgICAgICAgICAgIGxldCB3b3JsZFBvczEgPSBjb250YWN0UG9pbnQuZ2V0X21fcG9zaXRpb25Xb3JsZE9uQigpO1xuICAgICAgICAgICAgICAgIGxldCBsb2NhbFBvczAgPSBjb250YWN0UG9pbnQuZ2V0X21fbG9jYWxQb2ludEEoKTtcbiAgICAgICAgICAgICAgICBsZXQgbG9jYWxQb3MxID0gY29udGFjdFBvaW50LmdldF9tX2xvY2FsUG9pbnRCKCk7XG5cbiAgICAgICAgICAgICAgICBjb250YWN0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOltcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiByYjAudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogeyB4OiB2ZWxvY2l0eTAueCgpLCB5OiB2ZWxvY2l0eTAueSgpLCB6OiB2ZWxvY2l0eTAueigpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsgeDogd29ybGRQb3MwLngoKSwgeTogd29ybGRQb3MwLnkoKSwgejogd29ybGRQb3MwLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7IHg6IGxvY2FsUG9zMC54KCksIHk6IGxvY2FsUG9zMC55KCksIHo6IGxvY2FsUG9zMC56KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkOiByYjEudXVpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eTogeyB4OiB2ZWxvY2l0eTEueCgpLCB5OiB2ZWxvY2l0eTEueSgpLCB6OiB2ZWxvY2l0eTEueigpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ybGRQb3M6IHsgeDogd29ybGRQb3MxLngoKSwgeTogd29ybGRQb3MxLnkoKSwgejogd29ybGRQb3MxLnooKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUG9zOiB7IHg6IGxvY2FsUG9zMS54KCksIHk6IGxvY2FsUG9zMS55KCksIHo6IGxvY2FsUG9zMS56KCkgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQocmIwLnV1aWQsIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQ09MTElTSU9OLCB7IGNvbnRhY3RzIH0pO1xuICAgICAgICAgICAgZGlzcGF0Y2hlci5zZW5kRGlzcGF0Y2hFdmVudChyYjEudXVpZCwgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5DT0xMSVNJT04sIHsgY29udGFjdHMgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRFbGVtZW50ID0gZGF0YSA9PiB7XG4gICAgICAgIHRoaXMuZWxlbWVudHNbZGF0YS51dWlkXSA9IGRhdGE7XG4gICAgfVxuXG4gICAgdXBkYXRlQm9keVN0YXRlID0gKHsgdXVpZCwgc3RhdGUgfSkgPT4ge1xuICAgICAgICB0aGlzLmVsZW1lbnRzW3V1aWRdLnN0YXRlID0ge1xuICAgICAgICAgICAgLi4udGhpcy5lbGVtZW50c1t1dWlkXS5zdGF0ZSxcbiAgICAgICAgICAgIC4uLnN0YXRlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZGlzcG9zZUJvZHkoeyB1dWlkIH0pIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZ2V0RWxlbWVudCh1dWlkKTtcbiAgICAgICAgdGhpcy5keW5hbWljc1dvcmxkLnJlbW92ZVJpZ2lkQm9keShlbGVtZW50LmJvZHkpO1xuICAgICAgICB0aGlzLnJlbW92ZUVsZW1lbnQodXVpZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kRWxlbWVudERpc3Bvc2VkKHsgdXVpZCB9KTtcbiAgICB9XG5cbiAgICB0ZXJtaW5hdGUgPSAoKSA9PiB7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0aGlzLmR5bmFtaWNzV29ybGQpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5zb2x2ZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3kodGhpcy5kaXNwYXRjaGVyKTtcbiAgICAgICAgQW1tby5kZXN0cm95KHRoaXMuY29sbGlzaW9uQ29uZmlndXJhdGlvbik7XG5cbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG5cbiAgICAgICAgZGlzcGF0Y2hlci5zZW5kVGVybWluYXRlRXZlbnQoKTtcbiAgICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBXb3JsZCgpOyIsImltcG9ydCB7XG4gICAgRElTQUJMRV9ERUFDVElWQVRJT04sXG4gICAgVFlQRVMsXG4gICAgREVGQVVMVF9WRUhJQ0xFX1NUQVRFLFxuICAgIEJBQ0tfTEVGVCxcbiAgICBCQUNLX1JJR0hULFxuICAgIEZST05UX0xFRlQsXG4gICAgRlJPTlRfUklHSFQsXG4gICAgREVGQVVMVF9NQVhfRU5HSU5FX0ZPUkNFLFxuICAgIERFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFLFxuICAgIERFRkFVTFRfU1RFRVJJTkdfQ0xBTVAsXG4gICAgREVGQVVMVF9TVEVFUklOR19JTkNSRU1FTlRcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHtcbiAgICBQSFlTSUNTX0VWRU5UU1xufSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmltcG9ydCB3b3JsZCBmcm9tICcuL3dvcmxkJztcbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuXG5jb25zdCBERUZBVUxUX1JPTExfSU5GTFVFTkNFID0gMC4yO1xuY29uc3QgREVGQVVMVF9GUklDVElPTiA9IDEwMDA7XG5jb25zdCBERUZBVUxUX01BU1MgPSA4MDA7XG5cbmV4cG9ydCBjb25zdCBhZGRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgICBwb3NpdGlvbixcbiAgICAgICAgcXVhdGVybmlvbixcbiAgICAgICAgdXVpZCxcbiAgICAgICAgd2hlZWxzLFxuICAgICAgICBtYXNzID0gREVGQVVMVF9NQVNTLFxuICAgICAgICB3aWR0aCA9IDEuOCxcbiAgICAgICAgaGVpZ2h0ID0gLjYsXG4gICAgICAgIGxlbmd0aCA9IDQsXG4gICAgICAgIGZyaWN0aW9uID0gREVGQVVMVF9GUklDVElPTixcbiAgICAgICAgcm9sbEluZmx1ZW5jZSA9IERFRkFVTFRfUk9MTF9JTkZMVUVOQ0UsXG4gICAgICAgIHdoZWVsc09wdGlvbnMgPSB7fSxcbiAgICAgICAgc3VzcGVuc2lvbnMgPSB7fVxuICAgIH0gPSBkYXRhO1xuXG4gICAgY29uc3QgeyBiYWNrID0ge30sIGZyb250ID0ge30gfSA9IHdoZWVsc09wdGlvbnM7XG4gICAgY29uc3Qge1xuICAgICAgICBheGlzUG9zaXRpb246IGF4aXNQb3NpdGlvbkJhY2sgPSAtMSxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0JhY2sgPSAuNCxcbiAgICAgICAgaGFsZlRyYWNrOiB3aGVlbEhhbGZUcmFja0JhY2sgPSAxLFxuICAgICAgICBheGlzSGVpZ2h0OiB3aGVlbEF4aXNIZWlnaHRCYWNrID0gLjNcbiAgICB9ID0gYmFjaztcblxuICAgIGNvbnN0IHtcbiAgICAgICAgYXhpc1Bvc2l0aW9uOiBheGlzUG9zaXRpb25Gcm9udCA9IDEuNyxcbiAgICAgICAgcmFkaXVzOiB3aGVlbFJhZGl1c0Zyb250ID0gLjQsXG4gICAgICAgIGhhbGZUcmFjazogd2hlZWxIYWxmVHJhY2tGcm9udCA9IDEsXG4gICAgICAgIGF4aXNIZWlnaHQ6IHdoZWVsQXhpc0hlaWdodEZyb250ID0gLjNcbiAgICB9ID0gZnJvbnQ7XG5cbiAgICBjb25zdCB7IHN0aWZmbmVzcyA9IDIwLjAsIGRhbXBpbmcgPSAyLjMsIGNvbXByZXNzaW9uID0gNC40LCByZXN0TGVuZ3RoID0gMC42IH0gPSBzdXNwZW5zaW9ucztcblxuXG4gICAgLy8gQ2hhc3Npc1xuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IEFtbW8uYnRCb3hTaGFwZShuZXcgQW1tby5idFZlY3RvcjMod2lkdGggKiAuNSwgaGVpZ2h0ICogLjUsIGxlbmd0aCAqIC41KSk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56KSk7XG4gICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcbiAgICBjb25zdCBtb3Rpb25TdGF0ZSA9IG5ldyBBbW1vLmJ0RGVmYXVsdE1vdGlvblN0YXRlKHRyYW5zZm9ybSk7XG4gICAgY29uc3QgbG9jYWxJbmVydGlhID0gbmV3IEFtbW8uYnRWZWN0b3IzKDAsIDAsIDApO1xuICAgIGdlb21ldHJ5LmNhbGN1bGF0ZUxvY2FsSW5lcnRpYShtYXNzLCBsb2NhbEluZXJ0aWEpO1xuICAgIGNvbnN0IGNoYXNzaXMgPSBuZXcgQW1tby5idFJpZ2lkQm9keShuZXcgQW1tby5idFJpZ2lkQm9keUNvbnN0cnVjdGlvbkluZm8obWFzcywgbW90aW9uU3RhdGUsIGdlb21ldHJ5LCBsb2NhbEluZXJ0aWEpKTtcbiAgICBjaGFzc2lzLnNldEFjdGl2YXRpb25TdGF0ZShESVNBQkxFX0RFQUNUSVZBVElPTik7XG4gICAgd29ybGQuYWRkUmlnaWRCb2R5KGNoYXNzaXMpO1xuXG5cbiAgICAvLyBSYXljYXN0IFZlaGljbGVcbiAgICBjb25zdCB0dW5pbmcgPSBuZXcgQW1tby5idFZlaGljbGVUdW5pbmcoKTtcbiAgICBjb25zdCByYXlDYXN0ZXIgPSBuZXcgQW1tby5idERlZmF1bHRWZWhpY2xlUmF5Y2FzdGVyKHdvcmxkLmdldER5bmFtaWNzV29ybGQoKSk7XG4gICAgY29uc3QgdmVoaWNsZSA9IG5ldyBBbW1vLmJ0UmF5Y2FzdFZlaGljbGUodHVuaW5nLCBjaGFzc2lzLCByYXlDYXN0ZXIpO1xuICAgIHZlaGljbGUuc2V0Q29vcmRpbmF0ZVN5c3RlbSgwLCAxLCAyKTtcbiAgICB3b3JsZC5hZGRBY3Rpb24odmVoaWNsZSk7XG5cbiAgICBjb25zdCB3aGVlbERpcmVjdGlvbkNTMCA9IG5ldyBBbW1vLmJ0VmVjdG9yMygwLCAtMSwgMCk7XG4gICAgY29uc3Qgd2hlZWxBeGxlQ1MgPSBuZXcgQW1tby5idFZlY3RvcjMoLTEsIDAsIDApO1xuXG4gICAgY29uc3QgYWRkV2hlZWwgPSAoaXNGcm9udCwgcG9zLCByYWRpdXMpID0+IHtcblxuICAgICAgICB2YXIgd2hlZWxJbmZvID0gdmVoaWNsZS5hZGRXaGVlbChcbiAgICAgICAgICAgIHBvcyxcbiAgICAgICAgICAgIHdoZWVsRGlyZWN0aW9uQ1MwLFxuICAgICAgICAgICAgd2hlZWxBeGxlQ1MsXG4gICAgICAgICAgICByZXN0TGVuZ3RoLFxuICAgICAgICAgICAgcmFkaXVzLFxuICAgICAgICAgICAgdHVuaW5nLFxuICAgICAgICAgICAgaXNGcm9udCk7XG5cbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3Moc3RpZmZuZXNzKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX3doZWVsc0RhbXBpbmdSZWxheGF0aW9uKGRhbXBpbmcpO1xuICAgICAgICB3aGVlbEluZm8uc2V0X21fd2hlZWxzRGFtcGluZ0NvbXByZXNzaW9uKGNvbXByZXNzaW9uKTtcbiAgICAgICAgd2hlZWxJbmZvLnNldF9tX2ZyaWN0aW9uU2xpcChmcmljdGlvbik7XG4gICAgICAgIHdoZWVsSW5mby5zZXRfbV9yb2xsSW5mbHVlbmNlKHJvbGxJbmZsdWVuY2UpO1xuICAgIH1cblxuICAgIGFkZFdoZWVsKHRydWUsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0Zyb250LCB3aGVlbEF4aXNIZWlnaHRGcm9udCwgYXhpc1Bvc2l0aW9uRnJvbnQpLCB3aGVlbFJhZGl1c0Zyb250KTtcbiAgICBhZGRXaGVlbCh0cnVlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrRnJvbnQsIHdoZWVsQXhpc0hlaWdodEZyb250LCBheGlzUG9zaXRpb25Gcm9udCksIHdoZWVsUmFkaXVzRnJvbnQpO1xuICAgIGFkZFdoZWVsKGZhbHNlLCBuZXcgQW1tby5idFZlY3RvcjMoLXdoZWVsSGFsZlRyYWNrQmFjaywgd2hlZWxBeGlzSGVpZ2h0QmFjaywgYXhpc1Bvc2l0aW9uQmFjayksIHdoZWVsUmFkaXVzQmFjayk7XG4gICAgYWRkV2hlZWwoZmFsc2UsIG5ldyBBbW1vLmJ0VmVjdG9yMyh3aGVlbEhhbGZUcmFja0JhY2ssIHdoZWVsQXhpc0hlaWdodEJhY2ssIGF4aXNQb3NpdGlvbkJhY2spLCB3aGVlbFJhZGl1c0JhY2spO1xuXG4gICAgdmVoaWNsZS51dWlkID0gdXVpZDtcblxuICAgIHdvcmxkLmFkZEVsZW1lbnQoe1xuICAgICAgICB0eXBlOiBUWVBFUy5WRUhJQ0xFLFxuICAgICAgICB1dWlkLFxuICAgICAgICB2ZWhpY2xlOiB2ZWhpY2xlLFxuICAgICAgICB3aGVlbHMsXG4gICAgICAgIG9wdGlvbnM6IGRhdGEsXG4gICAgICAgIHN0YXRlOiBERUZBVUxUX1ZFSElDTEVfU1RBVEVcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNldFZlaGljbGVQb3NpdGlvbiA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgdXVpZCwgcG9zaXRpb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKG5ldyBBbW1vLmJ0VmVjdG9yMyhwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56ICkpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0VmVoaWNsZVF1YXRlcm5pb24gPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IHV1aWQsIHF1YXRlcm5pb24gfSA9IGRhdGE7XG4gICAgY29uc3QgZWxlbWVudCA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG5cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSBUWVBFUy5WRUhJQ0xFKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBlbGVtZW50LnZlaGljbGUuZ2V0UmlnaWRCb2R5KCk7XG4gICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBBbW1vLmJ0VHJhbnNmb3JtKCk7XG5cbiAgICAgICAgYm9keS5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKHF1YXRlcm5pb24ueCwgcXVhdGVybmlvbi55LCBxdWF0ZXJuaW9uLnosIHF1YXRlcm5pb24udykpO1xuXG4gICAgICAgIGJvZHkuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRWZWhpY2xlID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyB1dWlkLCBxdWF0ZXJuaW9uLCBwb3NpdGlvbiB9ID0gZGF0YTtcbiAgICBjb25zdCBlbGVtZW50ID0gd29ybGQuZ2V0RWxlbWVudCh1dWlkKTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFRZUEVTLlZFSElDTEUpIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGVsZW1lbnQudmVoaWNsZS5nZXRSaWdpZEJvZHkoKTtcbiAgICAgICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcbiAgICAgICAgXG4gICAgICAgIGJvZHkuZ2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgICAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldE9yaWdpbihuZXcgQW1tby5idFZlY3RvcjMocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueiApKTtcbiAgICAgICAgdHJhbnNmb3JtLnNldFJvdGF0aW9uKG5ldyBBbW1vLmJ0UXVhdGVybmlvbihxdWF0ZXJuaW9uLngsIHF1YXRlcm5pb24ueSwgcXVhdGVybmlvbi56LCBxdWF0ZXJuaW9uLncpKTtcblxuICAgICAgICBib2R5LnNldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgaGFuZGxlVmVoaWNsZVVwZGF0ZSA9ICh7IHZlaGljbGUsIHdoZWVscywgdXVpZCwgc3RhdGUgPSBERUZBVUxUX1ZFSElDTEVfU1RBVEUsIG9wdGlvbnMgPSB7fSB9LCBkdCkgPT4ge1xuICAgIGNvbnN0IHNwZWVkID0gdmVoaWNsZS5nZXRDdXJyZW50U3BlZWRLbUhvdXIoKTtcblxuICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TUEVFRCwgeyBzcGVlZCB9KTtcblxuICAgIGxldCBicmVha2luZ0ZvcmNlID0gMDtcbiAgICBsZXQgZW5naW5lRm9yY2UgPSAwO1xuXG4gICAgY29uc3Qge1xuICAgICAgICBzdGVlcmluZ0NsYW1wID0gREVGQVVMVF9TVEVFUklOR19DTEFNUCxcbiAgICAgICAgc3RlZXJpbmdJbmNyZW1lbnQgPSBERUZBVUxUX1NURUVSSU5HX0lOQ1JFTUVOVCxcbiAgICAgICAgbWF4RW5naW5lRm9yY2UgPSBERUZBVUxUX01BWF9FTkdJTkVfRk9SQ0UsXG4gICAgICAgIG1heEJyZWFraW5nRm9yY2UgPSBERUZBVUxUX01BWF9CUkVBS0lOR19GT1JDRVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgaWYgKHN0YXRlLmFjY2VsZXJhdGlvbikge1xuICAgICAgICBpZiAoc3BlZWQgPCAtMSlcbiAgICAgICAgICAgIGJyZWFraW5nRm9yY2UgPSBtYXhCcmVha2luZ0ZvcmNlO1xuICAgICAgICBlbHNlIGVuZ2luZUZvcmNlID0gbWF4RW5naW5lRm9yY2U7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5icmFraW5nKSB7XG4gICAgICAgIGlmIChzcGVlZCA+IDEpXG4gICAgICAgICAgICBicmVha2luZ0ZvcmNlID0gbWF4QnJlYWtpbmdGb3JjZTtcbiAgICAgICAgZWxzZSBlbmdpbmVGb3JjZSA9IC1tYXhFbmdpbmVGb3JjZSAvIDI7XG4gICAgfVxuICAgIGlmIChzdGF0ZS5sZWZ0KSB7XG4gICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCBzdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChzdGF0ZS5yaWdodCkge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IC1zdGVlcmluZ0NsYW1wKVxuICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyAtPSBzdGVlcmluZ0luY3JlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgPCAtc3RlZXJpbmdJbmNyZW1lbnQpXG4gICAgICAgICAgICAgICAgc3RhdGUudmVoaWNsZVN0ZWVyaW5nICs9IHN0ZWVyaW5nSW5jcmVtZW50O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlLnZlaGljbGVTdGVlcmluZyA+IHN0ZWVyaW5nSW5jcmVtZW50KVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZS52ZWhpY2xlU3RlZXJpbmcgLT0gc3RlZXJpbmdJbmNyZW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlLnZlaGljbGVTdGVlcmluZyA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmVoaWNsZS5hcHBseUVuZ2luZUZvcmNlKGVuZ2luZUZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuYXBwbHlFbmdpbmVGb3JjZShlbmdpbmVGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldEJyYWtlKGJyZWFraW5nRm9yY2UgLyAyLCBGUk9OVF9SSUdIVCk7XG4gICAgdmVoaWNsZS5zZXRCcmFrZShicmVha2luZ0ZvcmNlLCBCQUNLX0xFRlQpO1xuICAgIHZlaGljbGUuc2V0QnJha2UoYnJlYWtpbmdGb3JjZSwgQkFDS19SSUdIVCk7XG5cbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9MRUZUKTtcbiAgICB2ZWhpY2xlLnNldFN0ZWVyaW5nVmFsdWUoc3RhdGUudmVoaWNsZVN0ZWVyaW5nLCBGUk9OVF9SSUdIVCk7XG5cbiAgICBsZXQgdG0sIHAsIHEsIGk7XG4gICAgY29uc3QgbiA9IHZlaGljbGUuZ2V0TnVtV2hlZWxzKCk7XG4gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICB2ZWhpY2xlLnVwZGF0ZVdoZWVsVHJhbnNmb3JtKGksIHRydWUpO1xuICAgICAgICB0bSA9IHZlaGljbGUuZ2V0V2hlZWxUcmFuc2Zvcm1XUyhpKTtcbiAgICAgICAgcCA9IHRtLmdldE9yaWdpbigpO1xuICAgICAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgICAgICBjb25zdCB3aGVlbFVVSUQgPSB3aGVlbHNbaV07XG4gICAgICAgIGRpc3BhdGNoZXIuc2VuZEJvZHlVcGRhdGUod2hlZWxVVUlELCBwLCBxLCBkdCk7XG4gICAgfVxuXG4gICAgdG0gPSB2ZWhpY2xlLmdldENoYXNzaXNXb3JsZFRyYW5zZm9ybSgpO1xuICAgIHAgPSB0bS5nZXRPcmlnaW4oKTtcbiAgICBxID0gdG0uZ2V0Um90YXRpb24oKTtcblxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IHZlaGljbGUuZ2V0Rm9yd2FyZFZlY3RvcigpO1xuICAgIGRpc3BhdGNoZXIuc2VuZERpc3BhdGNoRXZlbnQodXVpZCwgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5ESVJFQ1RJT04sIHtcbiAgICAgICAgZGlyZWN0aW9uOiB7XG4gICAgICAgICAgICB4OiBkaXJlY3Rpb24ueCgpLFxuICAgICAgICAgICAgeTogZGlyZWN0aW9uLnkoKSxcbiAgICAgICAgICAgIHo6IGRpcmVjdGlvbi56KClcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGlzcGF0Y2hlci5zZW5kQm9keVVwZGF0ZSh1dWlkLCBwLCBxLCBkdCk7XG4gICAgd29ybGQudXBkYXRlQm9keVN0YXRlKHV1aWQsIHN0YXRlKTtcbn0iLCJpbXBvcnQgeyBFWFBMT1NJT05fU0laRVMsIEVYUExPU0lPTl9TVFJFTkdUSFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgd29ybGQgZnJvbSBcIi4vd29ybGRcIjtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUdob3N0Q29sbGlkZXIgPSAocmFkaXVzLCBwb3NpdGlvbikgPT4ge1xuICAgIGNvbnN0IGdob3N0Q29sbGlkZXIgPSBuZXcgQW1tby5idEdob3N0T2JqZWN0KCk7XG4gICAgY29uc3QgdHJhbnNmb3JtID0gbmV3IEFtbW8uYnRUcmFuc2Zvcm0oKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0Q29sbGlzaW9uU2hhcGUobmV3IEFtbW8uYnRTcGhlcmVTaGFwZShyYWRpdXMpKTtcbiAgICBnaG9zdENvbGxpZGVyLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG5cbiAgICB0cmFuc2Zvcm0uc2V0SWRlbnRpdHkoKTtcbiAgICB0cmFuc2Zvcm0uc2V0T3JpZ2luKHBvc2l0aW9uKTtcbiAgICB0cmFuc2Zvcm0uc2V0Um90YXRpb24obmV3IEFtbW8uYnRRdWF0ZXJuaW9uKDAsIDAsIDAsIDEpKTtcblxuICAgIGdob3N0Q29sbGlkZXIuc2V0V29ybGRUcmFuc2Zvcm0odHJhbnNmb3JtKTtcblxuICAgIHJldHVybiB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvckVhY2hHaG9zdENvbGxpc2lvbiA9IChnaG9zdENvbGxpZGVyLCBmb3JFYWNoQ2FsbGJhY2sgPSAoKSA9PiB7fSkgPT4ge1xuICAgIGNvbnN0IGNvbGxpc2lvbnMgPSBnaG9zdENvbGxpZGVyLmdldE51bU92ZXJsYXBwaW5nT2JqZWN0cygpO1xuICAgIGZvciAobGV0IGk9MDsgaTxjb2xsaXNpb25zOyBpKyspIHtcbiAgICAgICAgY29uc3Qgb2JqZWN0ID0gQW1tby5jYXN0T2JqZWN0KGdob3N0Q29sbGlkZXIuZ2V0T3ZlcmxhcHBpbmdPYmplY3QoaSksIEFtbW8uYnRSaWdpZEJvZHkpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG9iamVjdC5nZXRXb3JsZFRyYW5zZm9ybSh0cmFuc2Zvcm0pO1xuICAgICAgICBmb3JFYWNoQ2FsbGJhY2sob2JqZWN0LCB0cmFuc2Zvcm0sIGkpO1xuXG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdldEV4cGxvc2lvblBvc2l0aW9uID0gKHV1aWQsIHBvc2l0aW9uKSA9PiB7XG4gICAgbGV0IGV4cGxvc2lvblBvc2l0aW9uID0gcG9zaXRpb247XG4gICAgaWYgKCFleHBsb3Npb25Qb3NpdGlvbikge1xuICAgICAgICBjb25zdCB7IGJvZHkgfSA9IHdvcmxkLmdldEVsZW1lbnQodXVpZCk7XG4gICAgICAgIGNvbnN0IG1vdGlvblN0YXRlID0gYm9keS5nZXRNb3Rpb25TdGF0ZSgpO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBuZXcgQW1tby5idFRyYW5zZm9ybSgpO1xuXG4gICAgICAgIG1vdGlvblN0YXRlLmdldFdvcmxkVHJhbnNmb3JtKHRyYW5zZm9ybSk7XG4gICAgICAgIGV4cGxvc2lvblBvc2l0aW9uID0gdHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgIH1cblxuICAgIHJldHVybiBleHBsb3Npb25Qb3NpdGlvbjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBsb3Npb25JbXB1bHNlID0gKHBvc2l0aW9uLCBleHBsb3Npb25Qb3NpdGlvbiwgc3RyZW5ndGgpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IHBvc2l0aW9uLm9wX3N1YihleHBsb3Npb25Qb3NpdGlvbik7XG4gICAgZGlzdGFuY2Uubm9ybWFsaXplKCk7XG4gICAgY29uc3QgaW1wdWxzZSA9IGRpc3RhbmNlLm9wX211bChzdHJlbmd0aCk7XG5cbiAgICBpbXB1bHNlLnNldFkoaW1wdWxzZS55KCkgKyBzdHJlbmd0aCk7XG5cbiAgICByZXR1cm4gaW1wdWxzZTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUV4cGxvc2lvbiA9ICh7XG4gICAgdXVpZCxcbiAgICBwb3NpdGlvbixcbiAgICByYWRpdXMgPSBFWFBMT1NJT05fU0laRVMuU01BTEwsXG4gICAgc3RyZW5ndGggPSBFWFBMT1NJT05fU1RSRU5HVEhTLk1FRElVTVxufSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV4cGxvc2lvblBvc2l0aW9uID0gZ2V0RXhwbG9zaW9uUG9zaXRpb24odXVpZCwgcG9zaXRpb24pO1xuICAgICAgICBjb25zdCB7IGdob3N0Q29sbGlkZXIsIHRyYW5zZm9ybSB9ID0gY3JlYXRlR2hvc3RDb2xsaWRlcihyYWRpdXMsIGV4cGxvc2lvblBvc2l0aW9uKTtcblxuICAgICAgICB3b3JsZC5hZGRDb2xsaXNpb25PYmplY3QoZ2hvc3RDb2xsaWRlcik7XG5cbiAgICAgICAgZm9yRWFjaEdob3N0Q29sbGlzaW9uKGdob3N0Q29sbGlkZXIsIChvYmplY3QsIG9iamVjdFRyYW5zZm9ybSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gb2JqZWN0VHJhbnNmb3JtLmdldE9yaWdpbigpO1xuICAgICAgICAgICAgb2JqZWN0LmFjdGl2YXRlKHRydWUpO1xuICAgICAgICAgICAgb2JqZWN0LmFwcGx5Q2VudHJhbEltcHVsc2UoZ2V0RXhwbG9zaW9uSW1wdWxzZShvcmlnaW4sIGV4cGxvc2lvblBvc2l0aW9uLCBzdHJlbmd0aCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICB3b3JsZC5nZXREeW5hbWljc1dvcmxkKCkucmVtb3ZlQ29sbGlzaW9uT2JqZWN0KGdob3N0Q29sbGlkZXIpO1xuICAgICAgICBBbW1vLmRlc3Ryb3koZ2hvc3RDb2xsaWRlcik7XG4gICAgICAgIEFtbW8uZGVzdHJveSh0cmFuc2Zvcm0pO1xuICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG59IiwiaW1wb3J0IHtcbiAgICBMSUJSQVJZX05BTUVcbn0gZnJvbSAnLi4vY29uc3RhbnRzJztcblxuaW1wb3J0IHsgYWRkVmVoaWNsZSwgcmVzZXRWZWhpY2xlLCBzZXRWZWhpY2xlUG9zaXRpb24sIHNldFZlaGljbGVRdWF0ZXJuaW9uIH0gZnJvbSAnLi92ZWhpY2xlcyc7XG5pbXBvcnQgeyBhZGRCb3gsIGFkZE1vZGVsLCBzZXRMaW5lYXJWZWxvY2l0eSwgYXBwbHlJbXB1c2UsIGFkZFNwaGVyZSwgc2V0UG9zaXRpb24gfSBmcm9tICcuL2VsZW1lbnRzJztcbmltcG9ydCB7IGNyZWF0ZUV4cGxvc2lvbiB9IGZyb20gJy4vZWZmZWN0cyc7XG5pbXBvcnQgeyBhZGRQbGF5ZXIgfSBmcm9tICcuL3BsYXllcic7XG5cbmltcG9ydCBkaXNwYXRjaGVyIGZyb20gJy4vbGliL2Rpc3BhdGNoZXInO1xuaW1wb3J0IHdvcmxkIGZyb20gJy4vd29ybGQnO1xuaW1wb3J0IHsgUEhZU0lDU19FVkVOVFMgfSBmcm9tICcuLi9tZXNzYWdlcyc7XG5cbmNvbnN0IGhhbmRsZUxvYWRFdmVudCA9IG9wdGlvbnMgPT4gQW1tbyA9PiB7XG4gICAgc2VsZi5BbW1vID0gQW1tbztcblxuICAgIG9ubWVzc2FnZSA9ICh7IGRhdGEgfSkgPT4ge1xuICAgICAgICBzd2l0Y2goZGF0YS5ldmVudCkge1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5BREQuQk9YOlxuICAgICAgICAgICAgICAgIGFkZEJveChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlNQSEVSRTpcbiAgICAgICAgICAgICAgICBhZGRTcGhlcmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5WRUhJQ0xFOlxuICAgICAgICAgICAgICAgIGFkZFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkFERC5NT0RFTDpcbiAgICAgICAgICAgICAgICBhZGRNb2RlbChkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuQURELlBMQVlFUjpcbiAgICAgICAgICAgICAgICBhZGRQbGF5ZXIoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuU0VULkxJTkVBUl9WRUxPQ0lUWTpcbiAgICAgICAgICAgICAgICBzZXRMaW5lYXJWZWxvY2l0eShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5TRVQuUE9TSVRJT046XG4gICAgICAgICAgICAgICAgc2V0UG9zaXRpb24oZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLlZFSElDTEUuU0VULlBPU0lUSU9OOlxuICAgICAgICAgICAgICAgIHNldFZlaGljbGVQb3NpdGlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5TRVQuUVVBVEVSTklPTjpcbiAgICAgICAgICAgICAgICBzZXRWZWhpY2xlUXVhdGVybmlvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVkVISUNMRS5SRVNFVDpcbiAgICAgICAgICAgICAgICByZXNldFZlaGljbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVMRU1FTlQuQVBQTFkuSU1QVUxTRTpcbiAgICAgICAgICAgICAgICBhcHBseUltcHVzZShkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuRUxFTUVOVC5VUERBVEU6XG4gICAgICAgICAgICAgICAgd29ybGQudXBkYXRlQm9keVN0YXRlKGRhdGEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5FTEVNRU5ULkRJU1BPU0U6XG4gICAgICAgICAgICAgICAgd29ybGQuZGlzcG9zZUJvZHkoZGF0YSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBIWVNJQ1NfRVZFTlRTLkVGRkVDVFMuRVhQTE9TSU9OOlxuICAgICAgICAgICAgICAgIGNyZWF0ZUV4cGxvc2lvbihkYXRhKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhZU0lDU19FVkVOVFMuVEVSTUlOQVRFOlxuICAgICAgICAgICAgICAgIHdvcmxkLnRlcm1pbmF0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd29ybGQuaW5pdChvcHRpb25zKTtcbiAgICBkaXNwYXRjaGVyLnNlbmRSZWFkeUV2ZW50KCk7XG4gICAgd29ybGQuc2ltdWxhdGUoKVxufTtcblxuY29uc3QgbG9hZEFtbW8gPSAob3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHNjcmlwdFVybCA9IG9wdGlvbnMuaG9zdCArICcvJyArIChvcHRpb25zLnBhdGggfHwgTElCUkFSWV9OQU1FKTtcbiAgICBpbXBvcnRTY3JpcHRzKHNjcmlwdFVybCk7XG5cbiAgICBBbW1vKCkudGhlbihoYW5kbGVMb2FkRXZlbnQob3B0aW9ucykpO1xufTtcblxub25tZXNzYWdlID0gKHsgZGF0YSB9KSA9PiB7XG4gICAgc3dpdGNoKGRhdGEuZXZlbnQpIHtcbiAgICAgICAgY2FzZSBQSFlTSUNTX0VWRU5UUy5MT0FELkFNTU86XG4gICAgICAgICAgICBsb2FkQW1tbyhkYXRhKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxufSJdLCJuYW1lcyI6WyJMSUJSQVJZX05BTUUiLCJUWVBFUyIsIkJPWCIsIlNQSEVSRSIsIlZFSElDTEUiLCJNRVNIIiwiUExBWUVSIiwiREVGQVVMVF9WRUhJQ0xFX1NUQVRFIiwidmVoaWNsZVN0ZWVyaW5nIiwiYWNjZWxlcmF0aW9uIiwiYnJlYWtpbmciLCJyaWdodCIsImxlZnQiLCJERUZBVUxUX1JJR0lEQk9EWV9TVEFURSIsInZlbG9jaXR5IiwieCIsInkiLCJ6IiwibW92ZW1lbnQiLCJmb3J3YXJkIiwiYmFja3dhcmRzIiwiZGlyZWN0aW9uIiwiREVGQVVMVF9TQ0FMRSIsIkRFRkFVTFRfTElORUFSX1ZFTE9DSVRZIiwiREVGQVVMVF9JTVBVTFNFIiwiRElTQUJMRV9ERUFDVElWQVRJT04iLCJHUkFWSVRZIiwiRlJPTlRfTEVGVCIsIkZST05UX1JJR0hUIiwiQkFDS19MRUZUIiwiQkFDS19SSUdIVCIsIkRFRkFVTFRfU1RFRVJJTkdfSU5DUkVNRU5UIiwiREVGQVVMVF9TVEVFUklOR19DTEFNUCIsIkRFRkFVTFRfTUFYX0VOR0lORV9GT1JDRSIsIkRFRkFVTFRfTUFYX0JSRUFLSU5HX0ZPUkNFIiwiRVhQTE9TSU9OX1NJWkVTIiwiU01BTEwiLCJNRURJVU0iLCJMQVJHRSIsIk1BU1NJVkUiLCJFWFBMT1NJT05fU1RSRU5HVEhTIiwiVkVSWV9XRUFLIiwiV0VBSyIsIk9LX05PIiwiUEhZU0lDU19FVkVOVFMiLCJESVNQQVRDSCIsIlRFUk1JTkFURSIsIkxPQUQiLCJBTU1PIiwiUkVBRFkiLCJJTklUIiwiVVBEQVRFIiwiQUREIiwiTU9ERUwiLCJFTEVNRU5UIiwiRElTUE9TRSIsIkNPTExJU0lPTiIsIkNSRUFURUQiLCJTRVQiLCJQT1NJVElPTiIsIlFVQVRFUk5JT04iLCJMSU5FQVJfVkVMT0NJVFkiLCJBUFBMWSIsIklNUFVMU0UiLCJSRVNFVCIsIlNQRUVEIiwiRElSRUNUSU9OIiwiRUZGRUNUUyIsIkVYUExPU0lPTiIsIkRpc3BhdGNoZXIiLCJkdCIsInBvc3RNZXNzYWdlIiwiZXZlbnQiLCJ1dWlkIiwicG9zaXRpb24iLCJyb3RhdGlvbiIsInF1YXRlcm5pb24iLCJ3IiwiZXZlbnROYW1lIiwiZXZlbnREYXRhIiwiYXBwbHlNYXRyaXg0VG9WZWN0b3IzIiwibWF0cml4IiwiY3JlYXRlUmlnaWRCb2R5Iiwic2hhcGUiLCJvcHRpb25zIiwibWFzcyIsImZyaWN0aW9uIiwicmVzdGl0dXRpb24iLCJkYW1waW5nIiwibGluZWFyIiwiYW5ndWxhciIsInRyYW5zZm9ybSIsIkFtbW8iLCJidFRyYW5zZm9ybSIsInNldElkZW50aXR5Iiwic2V0T3JpZ2luIiwiYnRWZWN0b3IzIiwic2V0Um90YXRpb24iLCJidFF1YXRlcm5pb24iLCJtb3Rpb25TdGF0ZSIsImJ0RGVmYXVsdE1vdGlvblN0YXRlIiwibG9jYWxJbmVydGlhIiwiY2FsY3VsYXRlTG9jYWxJbmVydGlhIiwicmJJbmZvIiwiYnRSaWdpZEJvZHlDb25zdHJ1Y3Rpb25JbmZvIiwiYm9keSIsImJ0UmlnaWRCb2R5Iiwic2V0RnJpY3Rpb24iLCJzZXRSZXN0aXR1dGlvbiIsInNldERhbXBpbmciLCJzZXRBY3RpdmF0aW9uU3RhdGUiLCJ3b3JsZCIsImFkZFJpZ2lkQm9keSIsImFkZE1vZGVsIiwidmVydGljZXMiLCJtYXRyaWNlcyIsImluZGV4ZXMiLCJzY2FsZSIsImJ0YSIsImJ0YiIsImJ0YyIsInRyaU1lc2giLCJidFRyaWFuZ2xlTWVzaCIsImkiLCJsZW5ndGgiLCJjb21wb25lbnRzIiwiaW5kZXgiLCJBcnJheSIsImZyb20iLCJqIiwiYWkiLCJiaSIsImNpIiwidmEiLCJ2YiIsInZjIiwic2V0VmFsdWUiLCJhZGRUcmlhbmdsZSIsImxvY2FsU2NhbGUiLCJzZXRTY2FsaW5nIiwiZGVzdHJveSIsImNvbGxpc2lvblNoYXBlIiwiYnRCdmhUcmlhbmdsZU1lc2hTaGFwZSIsInJlc291cmNlcyIsImFkZEVsZW1lbnQiLCJ0eXBlIiwic3RhdGUiLCJhZGRCb3giLCJkYXRhIiwid2lkdGgiLCJoZWlnaHQiLCJnZW9tZXRyeSIsImJ0Qm94U2hhcGUiLCJhZGRTcGhlcmUiLCJyYWRpdXMiLCJidFNwaGVyZVNoYXBlIiwic2V0TGluZWFyVmVsb2NpdHkiLCJnZXRFbGVtZW50IiwiZ2V0TW90aW9uU3RhdGUiLCJsaW5lYXJWZWxvY2l0eSIsInNldFBvc2l0aW9uIiwiZ2V0V29ybGRUcmFuc2Zvcm0iLCJzZXRXb3JsZFRyYW5zZm9ybSIsImFwcGx5SW1wdXNlIiwiaW1wdWxzZSIsImltcHVsc2VWZWN0b3IiLCJhcHBseUNlbnRyYWxJbXB1bHNlIiwiaGFuZGxlRWxlbWVudFVwZGF0ZSIsIm9yaWdpbiIsImdldE9yaWdpbiIsImdldFJvdGF0aW9uIiwiZGlzcGF0Y2hlciIsInNlbmRCb2R5VXBkYXRlIiwiYWRkUGxheWVyIiwiY2Fwc3VsZSIsImJ0Q2Fwc3VsZVNoYXBlIiwic2V0QW5ndWxhckZhY3RvciIsImhhbmRsZVBsYXllclVwZGF0ZSIsImNhbWVyYURpcmVjdGlvbiIsIk1BWF9TUEVFRCIsIndhbGtWZWxvY2l0eSIsImdldExpbmVhclZlbG9jaXR5Iiwic3BlZWQiLCJmb3J3YXJkRGlyIiwiZ2V0QmFzaXMiLCJnZXRSb3ciLCJub3JtYWxpemUiLCJ3YWxrRGlyZWN0aW9uIiwid2Fsa1NwZWVkIiwic2V0WCIsInNldFoiLCJzZXRDZW50ZXJPZk1hc3NUcmFuc2Zvcm0iLCJDbG9jayIsInRpbWVzdGFtcCIsInRpbWUiLCJEYXRlIiwibm93IiwiZGVsdGEiLCJXb3JsZCIsImdyYXZpdHkiLCJjb2xsaXNpb25Db25maWd1cmF0aW9uIiwiYnREZWZhdWx0Q29sbGlzaW9uQ29uZmlndXJhdGlvbiIsImJ0Q29sbGlzaW9uRGlzcGF0Y2hlciIsImJyb2FkcGhhc2UiLCJidERidnRCcm9hZHBoYXNlIiwic29sdmVyIiwiYnRTZXF1ZW50aWFsSW1wdWxzZUNvbnN0cmFpbnRTb2x2ZXIiLCJkeW5hbWljc1dvcmxkIiwiYnREaXNjcmV0ZUR5bmFtaWNzV29ybGQiLCJzZXRHcmF2aXR5IiwiZ2V0QnJvYWRwaGFzZSIsImdldE92ZXJsYXBwaW5nUGFpckNhY2hlIiwic2V0SW50ZXJuYWxHaG9zdFBhaXJDYWxsYmFjayIsImJ0R2hvc3RQYWlyQ2FsbGJhY2siLCJpbml0aWFsaXNlZCIsImhhc0VsZW1lbnQiLCJlbGVtZW50cyIsImRlbGV0ZWQiLCJPYmplY3QiLCJrZXlzIiwiZmlsdGVyIiwiZm9yRWFjaCIsImluY2x1ZGVzIiwiYWN0aW9uIiwiYWRkQWN0aW9uIiwiY29sbGlzaW9uT2JqZWN0IiwiYWRkQ29sbGlzaW9uT2JqZWN0Iiwic3RlcFNpbXVsYXRpb24iLCJjbG9jayIsImdldERlbHRhIiwiZWxlbWVudCIsImhhbmRsZVZlaGljbGVVcGRhdGUiLCJjYWxjdWxhdGVDb2xsaXNpb25zIiwicmVtb3ZlRGVsZXRlZEVsZW1lbnRzIiwic2VuZFBoeXNpY3NVcGRhdGUiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInNpbXVsYXRlIiwiYmluZCIsImFtbW9EaXNwYXRjaGVyIiwiZ2V0RGlzcGF0Y2hlciIsIm51bU1hbmlmb2xkcyIsImdldE51bU1hbmlmb2xkcyIsImNvbnRhY3RNYW5pZm9sZCIsImdldE1hbmlmb2xkQnlJbmRleEludGVybmFsIiwicmIwIiwiY2FzdE9iamVjdCIsImdldEJvZHkwIiwicmIxIiwiZ2V0Qm9keTEiLCJudW1Db250YWN0cyIsImdldE51bUNvbnRhY3RzIiwiY29udGFjdHMiLCJjb250YWN0UG9pbnQiLCJnZXRDb250YWN0UG9pbnQiLCJkaXN0YW5jZSIsImdldERpc3RhbmNlIiwidmVsb2NpdHkwIiwidmVsb2NpdHkxIiwid29ybGRQb3MwIiwiZ2V0X21fcG9zaXRpb25Xb3JsZE9uQSIsIndvcmxkUG9zMSIsImdldF9tX3Bvc2l0aW9uV29ybGRPbkIiLCJsb2NhbFBvczAiLCJnZXRfbV9sb2NhbFBvaW50QSIsImxvY2FsUG9zMSIsImdldF9tX2xvY2FsUG9pbnRCIiwicHVzaCIsIndvcmxkUG9zIiwibG9jYWxQb3MiLCJzZW5kRGlzcGF0Y2hFdmVudCIsImNhbmNlbEFuaW1hdGlvbkZyYW1lIiwic2VuZFRlcm1pbmF0ZUV2ZW50IiwidW5kZWZpbmVkIiwicmVtb3ZlUmlnaWRCb2R5IiwicmVtb3ZlRWxlbWVudCIsInNlbmRFbGVtZW50RGlzcG9zZWQiLCJERUZBVUxUX1JPTExfSU5GTFVFTkNFIiwiREVGQVVMVF9GUklDVElPTiIsIkRFRkFVTFRfTUFTUyIsImFkZFZlaGljbGUiLCJ3aGVlbHMiLCJyb2xsSW5mbHVlbmNlIiwid2hlZWxzT3B0aW9ucyIsInN1c3BlbnNpb25zIiwiYmFjayIsImZyb250IiwiYXhpc1Bvc2l0aW9uIiwiYXhpc1Bvc2l0aW9uQmFjayIsIndoZWVsUmFkaXVzQmFjayIsImhhbGZUcmFjayIsIndoZWVsSGFsZlRyYWNrQmFjayIsImF4aXNIZWlnaHQiLCJ3aGVlbEF4aXNIZWlnaHRCYWNrIiwiYXhpc1Bvc2l0aW9uRnJvbnQiLCJ3aGVlbFJhZGl1c0Zyb250Iiwid2hlZWxIYWxmVHJhY2tGcm9udCIsIndoZWVsQXhpc0hlaWdodEZyb250Iiwic3RpZmZuZXNzIiwiY29tcHJlc3Npb24iLCJyZXN0TGVuZ3RoIiwiY2hhc3NpcyIsInR1bmluZyIsImJ0VmVoaWNsZVR1bmluZyIsInJheUNhc3RlciIsImJ0RGVmYXVsdFZlaGljbGVSYXljYXN0ZXIiLCJnZXREeW5hbWljc1dvcmxkIiwidmVoaWNsZSIsImJ0UmF5Y2FzdFZlaGljbGUiLCJzZXRDb29yZGluYXRlU3lzdGVtIiwid2hlZWxEaXJlY3Rpb25DUzAiLCJ3aGVlbEF4bGVDUyIsImFkZFdoZWVsIiwiaXNGcm9udCIsInBvcyIsIndoZWVsSW5mbyIsInNldF9tX3N1c3BlbnNpb25TdGlmZm5lc3MiLCJzZXRfbV93aGVlbHNEYW1waW5nUmVsYXhhdGlvbiIsInNldF9tX3doZWVsc0RhbXBpbmdDb21wcmVzc2lvbiIsInNldF9tX2ZyaWN0aW9uU2xpcCIsInNldF9tX3JvbGxJbmZsdWVuY2UiLCJzZXRWZWhpY2xlUG9zaXRpb24iLCJnZXRSaWdpZEJvZHkiLCJzZXRWZWhpY2xlUXVhdGVybmlvbiIsInJlc2V0VmVoaWNsZSIsImdldEN1cnJlbnRTcGVlZEttSG91ciIsImJyZWFraW5nRm9yY2UiLCJlbmdpbmVGb3JjZSIsInN0ZWVyaW5nQ2xhbXAiLCJzdGVlcmluZ0luY3JlbWVudCIsIm1heEVuZ2luZUZvcmNlIiwibWF4QnJlYWtpbmdGb3JjZSIsImJyYWtpbmciLCJhcHBseUVuZ2luZUZvcmNlIiwic2V0QnJha2UiLCJzZXRTdGVlcmluZ1ZhbHVlIiwidG0iLCJwIiwicSIsIm4iLCJnZXROdW1XaGVlbHMiLCJ1cGRhdGVXaGVlbFRyYW5zZm9ybSIsImdldFdoZWVsVHJhbnNmb3JtV1MiLCJ3aGVlbFVVSUQiLCJnZXRDaGFzc2lzV29ybGRUcmFuc2Zvcm0iLCJnZXRGb3J3YXJkVmVjdG9yIiwidXBkYXRlQm9keVN0YXRlIiwiY3JlYXRlR2hvc3RDb2xsaWRlciIsImdob3N0Q29sbGlkZXIiLCJidEdob3N0T2JqZWN0Iiwic2V0Q29sbGlzaW9uU2hhcGUiLCJmb3JFYWNoR2hvc3RDb2xsaXNpb24iLCJmb3JFYWNoQ2FsbGJhY2siLCJjb2xsaXNpb25zIiwiZ2V0TnVtT3ZlcmxhcHBpbmdPYmplY3RzIiwib2JqZWN0IiwiZ2V0T3ZlcmxhcHBpbmdPYmplY3QiLCJnZXRFeHBsb3Npb25Qb3NpdGlvbiIsImV4cGxvc2lvblBvc2l0aW9uIiwiZ2V0RXhwbG9zaW9uSW1wdWxzZSIsInN0cmVuZ3RoIiwib3Bfc3ViIiwib3BfbXVsIiwic2V0WSIsImNyZWF0ZUV4cGxvc2lvbiIsIm9iamVjdFRyYW5zZm9ybSIsImFjdGl2YXRlIiwicmVtb3ZlQ29sbGlzaW9uT2JqZWN0IiwiZSIsImNvbnNvbGUiLCJsb2ciLCJoYW5kbGVMb2FkRXZlbnQiLCJzZWxmIiwib25tZXNzYWdlIiwiZGlzcG9zZUJvZHkiLCJ0ZXJtaW5hdGUiLCJpbml0Iiwic2VuZFJlYWR5RXZlbnQiLCJsb2FkQW1tbyIsInNjcmlwdFVybCIsImhvc3QiLCJwYXRoIiwiaW1wb3J0U2NyaXB0cyIsInRoZW4iXSwibWFwcGluZ3MiOiI7OztJQUFPLElBQU1BLFlBQVksR0FBRyxTQUFyQjtJQUVBLElBQU1DLEtBQUssR0FBRztJQUNqQkMsRUFBQUEsR0FBRyxFQUFFLEtBRFk7SUFFakJDLEVBQUFBLE1BQU0sRUFBRSxRQUZTO0lBR2pCQyxFQUFBQSxPQUFPLEVBQUUsU0FIUTtJQUlqQkMsRUFBQUEsSUFBSSxFQUFFLE1BSlc7SUFLakJDLEVBQUFBLE1BQU0sRUFBRTtJQUxTLENBQWQ7SUFlQSxJQUFNQyxxQkFBcUIsR0FBRztJQUNqQ0MsRUFBQUEsZUFBZSxFQUFFLENBRGdCO0lBRWpDQyxFQUFBQSxZQUFZLEVBQUUsS0FGbUI7SUFHakNDLEVBQUFBLFFBQVEsRUFBRSxLQUh1QjtJQUlqQ0MsRUFBQUEsS0FBSyxFQUFFLEtBSjBCO0lBS2pDQyxFQUFBQSxJQUFJLEVBQUU7SUFMMkIsQ0FBOUI7SUFRQSxJQUFNQyx1QkFBdUIsR0FBRztJQUNuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQUVDLElBQUFBLENBQUMsRUFBRSxDQUFMO0lBQVFDLElBQUFBLENBQUMsRUFBRSxDQUFYO0lBQWNDLElBQUFBLENBQUMsRUFBRTtJQUFqQixHQUR5QjtJQUVuQ0MsRUFBQUEsUUFBUSxFQUFFO0lBQ05DLElBQUFBLE9BQU8sRUFBRSxLQURIO0lBRU5DLElBQUFBLFNBQVMsRUFBRSxLQUZMO0lBR05SLElBQUFBLElBQUksRUFBRSxLQUhBO0lB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', false);
57552
57552
  /* eslint-enable */var PHYSICS_EVENTS = {
57553
57553
  DISPATCH: 'physics:dispatch',
57554
57554
  TERMINATE: 'physics:terminate',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mage-engine",
3
- "version": "3.16.1",
3
+ "version": "3.16.2",
4
4
  "description": "A WebGL Javascript Game Engine, built on top of THREE.js and many other libraries.",
5
5
  "main": "dist/mage.js",
6
6
  "author": {