tedious 20.2.3 → 20.3.0

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 (109) hide show
  1. package/lib/always-encrypted/get-parameter-encryption-metadata.js +5 -2
  2. package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -1
  3. package/lib/bulk-load-payload.js +9 -5
  4. package/lib/bulk-load-payload.js.map +1 -1
  5. package/lib/bulk-load.js +17 -6
  6. package/lib/bulk-load.js.map +1 -1
  7. package/lib/connection.d.ts +5 -0
  8. package/lib/connection.js +33 -26
  9. package/lib/connection.js.map +1 -1
  10. package/lib/data-type.d.ts +47 -3
  11. package/lib/data-type.js +113 -2
  12. package/lib/data-type.js.map +1 -1
  13. package/lib/data-types/bigint.js +10 -17
  14. package/lib/data-types/bigint.js.map +1 -1
  15. package/lib/data-types/binary.js +10 -17
  16. package/lib/data-types/binary.js.map +1 -1
  17. package/lib/data-types/bit.js +10 -14
  18. package/lib/data-types/bit.js.map +1 -1
  19. package/lib/data-types/bitn.js +3 -6
  20. package/lib/data-types/bitn.js.map +1 -1
  21. package/lib/data-types/char.js +12 -17
  22. package/lib/data-types/char.js.map +1 -1
  23. package/lib/data-types/date.js +11 -27
  24. package/lib/data-types/date.js.map +1 -1
  25. package/lib/data-types/datetime.js +17 -37
  26. package/lib/data-types/datetime.js.map +1 -1
  27. package/lib/data-types/datetime2.js +12 -67
  28. package/lib/data-types/datetime2.js.map +1 -1
  29. package/lib/data-types/datetimen.js +3 -6
  30. package/lib/data-types/datetimen.js.map +1 -1
  31. package/lib/data-types/datetimeoffset.js +13 -60
  32. package/lib/data-types/datetimeoffset.js.map +1 -1
  33. package/lib/data-types/decimal-common.d.ts +18 -0
  34. package/lib/data-types/decimal-common.js +79 -0
  35. package/lib/data-types/decimal-common.js.map +1 -0
  36. package/lib/data-types/decimal.js +6 -67
  37. package/lib/data-types/decimal.js.map +1 -1
  38. package/lib/data-types/decimaln.js +3 -6
  39. package/lib/data-types/decimaln.js.map +1 -1
  40. package/lib/data-types/float.js +10 -15
  41. package/lib/data-types/float.js.map +1 -1
  42. package/lib/data-types/floatn.js +3 -6
  43. package/lib/data-types/floatn.js.map +1 -1
  44. package/lib/data-types/image.js +10 -17
  45. package/lib/data-types/image.js.map +1 -1
  46. package/lib/data-types/int.js +8 -15
  47. package/lib/data-types/int.js.map +1 -1
  48. package/lib/data-types/intn.js +3 -6
  49. package/lib/data-types/intn.js.map +1 -1
  50. package/lib/data-types/money.js +14 -18
  51. package/lib/data-types/money.js.map +1 -1
  52. package/lib/data-types/moneyn.js +3 -6
  53. package/lib/data-types/moneyn.js.map +1 -1
  54. package/lib/data-types/nchar.js +17 -31
  55. package/lib/data-types/nchar.js.map +1 -1
  56. package/lib/data-types/ntext.js +13 -17
  57. package/lib/data-types/ntext.js.map +1 -1
  58. package/lib/data-types/null.js +3 -6
  59. package/lib/data-types/null.js.map +1 -1
  60. package/lib/data-types/numeric.js +6 -67
  61. package/lib/data-types/numeric.js.map +1 -1
  62. package/lib/data-types/numericn.js +3 -6
  63. package/lib/data-types/numericn.js.map +1 -1
  64. package/lib/data-types/nvarchar.js +68 -57
  65. package/lib/data-types/nvarchar.js.map +1 -1
  66. package/lib/data-types/plp-stream.d.ts +19 -0
  67. package/lib/data-types/plp-stream.js +59 -0
  68. package/lib/data-types/plp-stream.js.map +1 -0
  69. package/lib/data-types/real.js +10 -16
  70. package/lib/data-types/real.js.map +1 -1
  71. package/lib/data-types/smalldatetime.js +17 -23
  72. package/lib/data-types/smalldatetime.js.map +1 -1
  73. package/lib/data-types/smallint.js +10 -16
  74. package/lib/data-types/smallint.js.map +1 -1
  75. package/lib/data-types/smallmoney.js +10 -16
  76. package/lib/data-types/smallmoney.js.map +1 -1
  77. package/lib/data-types/sql-variant.js +3 -6
  78. package/lib/data-types/sql-variant.js.map +1 -1
  79. package/lib/data-types/temporal.d.ts +22 -0
  80. package/lib/data-types/temporal.js +72 -0
  81. package/lib/data-types/temporal.js.map +1 -0
  82. package/lib/data-types/text.js +12 -18
  83. package/lib/data-types/text.js.map +1 -1
  84. package/lib/data-types/time.js +11 -55
  85. package/lib/data-types/time.js.map +1 -1
  86. package/lib/data-types/tinyint.js +10 -16
  87. package/lib/data-types/tinyint.js.map +1 -1
  88. package/lib/data-types/tvp.js +145 -87
  89. package/lib/data-types/tvp.js.map +1 -1
  90. package/lib/data-types/udt.js +3 -6
  91. package/lib/data-types/udt.js.map +1 -1
  92. package/lib/data-types/uniqueidentifier.js +12 -14
  93. package/lib/data-types/uniqueidentifier.js.map +1 -1
  94. package/lib/data-types/varbinary.js +58 -48
  95. package/lib/data-types/varbinary.js.map +1 -1
  96. package/lib/data-types/varchar.js +84 -50
  97. package/lib/data-types/varchar.js.map +1 -1
  98. package/lib/data-types/xml.js +3 -6
  99. package/lib/data-types/xml.js.map +1 -1
  100. package/lib/request.d.ts +23 -3
  101. package/lib/request.js +29 -3
  102. package/lib/request.js.map +1 -1
  103. package/lib/rpcrequest-payload.d.ts +21 -9
  104. package/lib/rpcrequest-payload.js +62 -51
  105. package/lib/rpcrequest-payload.js.map +1 -1
  106. package/lib/tedious.d.ts +2 -2
  107. package/lib/tedious.js +7 -1
  108. package/lib/tedious.js.map +1 -1
  109. package/package.json +1 -1
@@ -84,7 +84,10 @@ const getParameterEncryptionMetadata = (connection, request, callback) => {
84
84
  metadataRequest.on('row', columns => {
85
85
  resultRows.push(columns);
86
86
  });
87
- connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));
87
+
88
+ // This request is built from raw `Parameter`s rather than a `Request`
89
+ // that has been through `validateParameters`, so they are resolved inline.
90
+ connection.makeRequest(metadataRequest, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(metadataRequest.sqlTextOrProcedure, metadataRequest.parameters.map(parameter => (0, _dataType.resolveParameter)(parameter, connection.databaseCollation, connection.config.options)), connection.currentTransactionDescriptor(), connection.config.options));
88
91
  };
89
92
  exports.getParameterEncryptionMetadata = getParameterEncryptionMetadata;
90
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEiLCJjb25uZWN0aW9uIiwicmVxdWVzdCIsImNhbGxiYWNrIiwiY3J5cHRvTWV0YWRhdGFMb2FkZWQiLCJtZXRhZGF0YVJlcXVlc3QiLCJSZXF1ZXN0IiwiZXJyb3IiLCJkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMiLCJjZWtMaXN0IiwicGFyYW1Db3VudCIsImNvbHVtbnMiLCJyZXN1bHRSb3dzIiwiaXNGaXJzdFJlY29yZFNldCIsInNvbWUiLCJjb2wiLCJtZXRhZGF0YSIsImNvbE5hbWUiLCJjdXJyZW50T3JkaW5hbCIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEiLCJLZXlPcmRpbmFsIiwidmFsdWUiLCJjZWtFbnRyeSIsIkNFS0VudHJ5Iiwib3JkaW5hbCIsImFkZCIsIkVuY3J5cHRlZEtleSIsIkRiSWQiLCJLZXlJZCIsIktleVZlcnNpb24iLCJLZXlNZFZlcnNpb24iLCJLZXlQYXRoIiwiUHJvdmlkZXJOYW1lIiwiS2V5RW5jcnlwdGlvbkFsZ29yaXRobSIsInBhcmFtTmFtZSIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIiLCJQYXJhbWV0ZXJOYW1lIiwicGFyYW1JbmRleCIsInBhcmFtZXRlcnMiLCJmaW5kSW5kZXgiLCJwYXJhbSIsIm5hbWUiLCJjZWtPcmRpbmFsIiwiQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWwiLCJsZW5ndGgiLCJFcnJvciIsImVuY1R5cGUiLCJDb2x1bW5FbmNyeXRpb25UeXBlIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJQbGFpblRleHQiLCJjcnlwdG9NZXRhZGF0YSIsImNpcGhlckFsZ29yaXRobUlkIiwiQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobSIsImVuY3J5cHRpb25UeXBlIiwibm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwiQnVmZmVyIiwiZnJvbSIsIk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbiIsInB1c2giLCJkZWNyeXB0U3ltbWV0cmljS2V5IiwiY29uZmlnIiwib3B0aW9ucyIsImZvcmNlRW5jcnlwdCIsInNxbFRleHRPclByb2NlZHVyZSIsIlByb21pc2UiLCJhbGwiLCJ0aGVuIiwicHJvY2VzcyIsIm5leHRUaWNrIiwiYWRkUGFyYW1ldGVyIiwiVFlQRVMiLCJOVmFyQ2hhciIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJvbiIsIm1ha2VSZXF1ZXN0IiwiVFlQRSIsIlJQQ19SRVFVRVNUIiwiUnBjUmVxdWVzdFBheWxvYWQiLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiZGF0YWJhc2VDb2xsYXRpb24iLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fsd2F5cy1lbmNyeXB0ZWQvZ2V0LXBhcmFtZXRlci1lbmNyeXB0aW9uLW1ldGFkYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFRoaXMgY29kZSBpcyBiYXNlZCBvbiB0aGUgYG1zc3FsLWpkYmNgIGxpYnJhcnkgcHVibGlzaGVkIHVuZGVyIHRoZSBjb25kaXRpb25zIG9mIE1JVCBsaWNlbnNlLlxuLy8gQ29weXJpZ2h0IChjKSAyMDE5IE1pY3Jvc29mdCBDb3Jwb3JhdGlvblxuXG5pbXBvcnQgeyBTUUxTZXJ2ZXJFbmNyeXB0aW9uVHlwZSwgdHlwZSBDcnlwdG9NZXRhZGF0YSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MSwgRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQ0VLRW50cnkgfSBmcm9tICcuL2Nlay1lbnRyeSc7XG5pbXBvcnQgeyBkZWNyeXB0U3ltbWV0cmljS2V5IH0gZnJvbSAnLi9rZXktY3J5cHRvJztcbmltcG9ydCB7IHR5cGVCeU5hbWUgYXMgVFlQRVMsIHR5cGUgUGFyYW1ldGVyIH0gZnJvbSAnLi4vZGF0YS10eXBlJztcbmltcG9ydCBSZXF1ZXN0IGZyb20gJy4uL3JlcXVlc3QnO1xuaW1wb3J0IENvbm5lY3Rpb24gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5pbXBvcnQgUnBjUmVxdWVzdFBheWxvYWQgZnJvbSAnLi4vcnBjcmVxdWVzdC1wYXlsb2FkJztcbmltcG9ydCB7IFRZUEUgfSBmcm9tICcuLi9wYWNrZXQnO1xuXG5leHBvcnQgY29uc3QgZ2V0UGFyYW1ldGVyRW5jcnlwdGlvbk1ldGFkYXRhID0gKGNvbm5lY3Rpb246IENvbm5lY3Rpb24sIHJlcXVlc3Q6IFJlcXVlc3QsIGNhbGxiYWNrOiAoZXJyb3I/OiBFcnJvcikgPT4gdm9pZCkgPT4ge1xuICBpZiAocmVxdWVzdC5jcnlwdG9NZXRhZGF0YUxvYWRlZCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBjYWxsYmFjaygpO1xuICB9XG5cbiAgY29uc3QgbWV0YWRhdGFSZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJ3NwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uJywgKGVycm9yKSA9PiB7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICByZXR1cm4gY2FsbGJhY2soZXJyb3IpO1xuICAgIH1cblxuICAgIGNvbnN0IGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgY29uc3QgY2VrTGlzdDogQ0VLRW50cnlbXSA9IFtdO1xuICAgIGxldCBwYXJhbUNvdW50ID0gMDtcblxuICAgIGZvciAoY29uc3QgY29sdW1ucyBvZiByZXN1bHRSb3dzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpc0ZpcnN0UmVjb3JkU2V0ID0gY29sdW1ucy5zb21lKChjb2w6IGFueSkgPT4gKGNvbCAmJiBjb2wubWV0YWRhdGEgJiYgY29sLm1ldGFkYXRhLmNvbE5hbWUpID09PSAnZGF0YWJhc2VfaWQnKTtcbiAgICAgICAgaWYgKGlzRmlyc3RSZWNvcmRTZXQgPT09IHRydWUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50T3JkaW5hbCA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBsZXQgY2VrRW50cnk6IENFS0VudHJ5O1xuICAgICAgICAgIGlmICghY2VrTGlzdFtjdXJyZW50T3JkaW5hbF0pIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gbmV3IENFS0VudHJ5KGN1cnJlbnRPcmRpbmFsKTtcbiAgICAgICAgICAgIGNla0xpc3RbY2VrRW50cnkub3JkaW5hbF0gPSBjZWtFbnRyeTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2VrRW50cnkgPSBjZWtMaXN0W2N1cnJlbnRPcmRpbmFsXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2VrRW50cnkuYWRkKGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5FbmNyeXB0ZWRLZXldLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRGJJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlJZF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlWZXJzaW9uXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLktleU1kVmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlQYXRoXS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLlByb3ZpZGVyTmFtZV0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlFbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyYW1Db3VudCsrO1xuICAgICAgICAgIGNvbnN0IHBhcmFtTmFtZTogc3RyaW5nID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLlBhcmFtZXRlck5hbWVdLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHBhcmFtSW5kZXg6IG51bWJlciA9IHJlcXVlc3QucGFyYW1ldGVycy5maW5kSW5kZXgoKHBhcmFtOiBQYXJhbWV0ZXIpID0+IHBhcmFtTmFtZSA9PT0gYEAke3BhcmFtLm5hbWV9YCk7XG4gICAgICAgICAgY29uc3QgY2VrT3JkaW5hbDogbnVtYmVyID0gY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQyLkNvbHVtbkVuY3J5cHRpb25LZXlPcmRpbmFsXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBjZWtFbnRyeTogQ0VLRW50cnkgPSBjZWtMaXN0W2Nla09yZGluYWxdO1xuXG4gICAgICAgICAgaWYgKGNla0VudHJ5ICYmIGNla0xpc3QubGVuZ3RoIDwgY2VrT3JkaW5hbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFRoZSByZWZlcmVuY2VkIGNvbHVtbiBlbmNyeXB0aW9uIGtleSBvcmRpbmFsIFwiJHtjZWtPcmRpbmFsfVwiIGlzIG1pc3NpbmcgaW4gdGhlIGVuY3J5cHRpb24gbWV0YWRhdGEgcmV0dXJuZWQgYnkgc3BfZGVzY3JpYmVfcGFyYW1ldGVyX2VuY3J5cHRpb24uIE1heCBvcmRpbmFsIGlzIFwiJHtjZWtMaXN0Lmxlbmd0aH1cIi5gKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZW5jVHlwZSA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXRpb25UeXBlXS52YWx1ZTtcbiAgICAgICAgICBpZiAoU1FMU2VydmVyRW5jcnlwdGlvblR5cGUuUGxhaW5UZXh0ICE9PSBlbmNUeXBlKSB7XG4gICAgICAgICAgICByZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgPSB7XG4gICAgICAgICAgICAgIGNla0VudHJ5OiBjZWtFbnRyeSxcbiAgICAgICAgICAgICAgb3JkaW5hbDogY2VrT3JkaW5hbCxcbiAgICAgICAgICAgICAgY2lwaGVyQWxnb3JpdGhtSWQ6IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uQWxnb3JpdGhtXS52YWx1ZSxcbiAgICAgICAgICAgICAgZW5jcnlwdGlvblR5cGU6IGVuY1R5cGUsXG4gICAgICAgICAgICAgIG5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbjogQnVmZmVyLmZyb20oW2NvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Ob3JtYWxpemF0aW9uUnVsZVZlcnNpb25dLnZhbHVlXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzLnB1c2goZGVjcnlwdFN5bW1ldHJpY0tleShyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uY3J5cHRvTWV0YWRhdGEgYXMgQ3J5cHRvTWV0YWRhdGEsIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QucGFyYW1ldGVyc1twYXJhbUluZGV4XS5mb3JjZUVuY3J5cHQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYENhbm5vdCBleGVjdXRlIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX0gYmVjYXVzZSBGb3JjZSBFbmNyeXB0aW9uIHdhcyBzZXQgYXMgdHJ1ZSBmb3IgcGFyYW1ldGVyICR7cGFyYW1JbmRleCArIDF9IGFuZCB0aGUgZGF0YWJhc2UgZXhwZWN0cyB0aGlzIHBhcmFtZXRlciB0byBiZSBzZW50IGFzIHBsYWludGV4dC4gVGhpcyBtYXkgYmUgZHVlIHRvIGEgY29uZmlndXJhdGlvbiBlcnJvci5gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIFVuYWJsZSB0byBwYXJzZSBwYXJhbWV0ZXIgZW5jcnlwdGlvbiBtZXRhZGF0YSBpbiBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlIFwiJHtyZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZX1cImApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocGFyYW1Db3VudCAhPT0gcmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKG5ldyBFcnJvcihgSW50ZXJuYWwgZXJyb3IuIE1ldGFkYXRhIGZvciBzb21lIHBhcmFtZXRlcnMgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCIgaXMgbWlzc2luZyBpbiB0aGUgcmVzdWx0c2V0IHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLmApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoZGVjcnlwdFN5bW1ldHJpY0tleVByb21pc2VzKS50aGVuKCgpID0+IHtcbiAgICAgIHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPSB0cnVlO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjayk7XG4gICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGNhbGxiYWNrLCBlcnJvcik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3RzcWwnLCBUWVBFUy5OVmFyQ2hhciwgcmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUpO1xuICBpZiAocmVxdWVzdC5wYXJhbWV0ZXJzLmxlbmd0aCkge1xuICAgIG1ldGFkYXRhUmVxdWVzdC5hZGRQYXJhbWV0ZXIoJ3BhcmFtcycsIFRZUEVTLk5WYXJDaGFyLCBtZXRhZGF0YVJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdFJvd3M6IGFueVtdID0gW107XG5cbiAgbWV0YWRhdGFSZXF1ZXN0Lm9uKCdyb3cnLCAoY29sdW1uczogYW55KSA9PiB7XG4gICAgcmVzdWx0Um93cy5wdXNoKGNvbHVtbnMpO1xuICB9KTtcblxuICBjb25uZWN0aW9uLm1ha2VSZXF1ZXN0KG1ldGFkYXRhUmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKG1ldGFkYXRhUmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCBtZXRhZGF0YVJlcXVlc3QucGFyYW1ldGVycywgY29ubmVjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIGNvbm5lY3Rpb24uY29uZmlnLm9wdGlvbnMsIGNvbm5lY3Rpb24uZGF0YWJhc2VDb2xsYXRpb24pKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFNBQUEsR0FBQUQsT0FBQTtBQUNB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
93
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdHlwZXMiLCJyZXF1aXJlIiwiX2Nla0VudHJ5IiwiX2tleUNyeXB0byIsIl9kYXRhVHlwZSIsIl9yZXF1ZXN0IiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9ycGNyZXF1ZXN0UGF5bG9hZCIsIl9wYWNrZXQiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJnZXRQYXJhbWV0ZXJFbmNyeXB0aW9uTWV0YWRhdGEiLCJjb25uZWN0aW9uIiwicmVxdWVzdCIsImNhbGxiYWNrIiwiY3J5cHRvTWV0YWRhdGFMb2FkZWQiLCJtZXRhZGF0YVJlcXVlc3QiLCJSZXF1ZXN0IiwiZXJyb3IiLCJkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXMiLCJjZWtMaXN0IiwicGFyYW1Db3VudCIsImNvbHVtbnMiLCJyZXN1bHRSb3dzIiwiaXNGaXJzdFJlY29yZFNldCIsInNvbWUiLCJjb2wiLCJtZXRhZGF0YSIsImNvbE5hbWUiLCJjdXJyZW50T3JkaW5hbCIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEiLCJLZXlPcmRpbmFsIiwidmFsdWUiLCJjZWtFbnRyeSIsIkNFS0VudHJ5Iiwib3JkaW5hbCIsImFkZCIsIkVuY3J5cHRlZEtleSIsIkRiSWQiLCJLZXlJZCIsIktleVZlcnNpb24iLCJLZXlNZFZlcnNpb24iLCJLZXlQYXRoIiwiUHJvdmlkZXJOYW1lIiwiS2V5RW5jcnlwdGlvbkFsZ29yaXRobSIsInBhcmFtTmFtZSIsIkRlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIiLCJQYXJhbWV0ZXJOYW1lIiwicGFyYW1JbmRleCIsInBhcmFtZXRlcnMiLCJmaW5kSW5kZXgiLCJwYXJhbSIsIm5hbWUiLCJjZWtPcmRpbmFsIiwiQ29sdW1uRW5jcnlwdGlvbktleU9yZGluYWwiLCJsZW5ndGgiLCJFcnJvciIsImVuY1R5cGUiLCJDb2x1bW5FbmNyeXRpb25UeXBlIiwiU1FMU2VydmVyRW5jcnlwdGlvblR5cGUiLCJQbGFpblRleHQiLCJjcnlwdG9NZXRhZGF0YSIsImNpcGhlckFsZ29yaXRobUlkIiwiQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobSIsImVuY3J5cHRpb25UeXBlIiwibm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uIiwiQnVmZmVyIiwiZnJvbSIsIk5vcm1hbGl6YXRpb25SdWxlVmVyc2lvbiIsInB1c2giLCJkZWNyeXB0U3ltbWV0cmljS2V5IiwiY29uZmlnIiwib3B0aW9ucyIsImZvcmNlRW5jcnlwdCIsInNxbFRleHRPclByb2NlZHVyZSIsIlByb21pc2UiLCJhbGwiLCJ0aGVuIiwicHJvY2VzcyIsIm5leHRUaWNrIiwiYWRkUGFyYW1ldGVyIiwiVFlQRVMiLCJOVmFyQ2hhciIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJvbiIsIm1ha2VSZXF1ZXN0IiwiVFlQRSIsIlJQQ19SRVFVRVNUIiwiUnBjUmVxdWVzdFBheWxvYWQiLCJtYXAiLCJwYXJhbWV0ZXIiLCJyZXNvbHZlUGFyYW1ldGVyIiwiZGF0YWJhc2VDb2xsYXRpb24iLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hbHdheXMtZW5jcnlwdGVkL2dldC1wYXJhbWV0ZXItZW5jcnlwdGlvbi1tZXRhZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIGBtc3NxbC1qZGJjYCBsaWJyYXJ5IHB1Ymxpc2hlZCB1bmRlciB0aGUgY29uZGl0aW9ucyBvZiBNSVQgbGljZW5zZS5cbi8vIENvcHlyaWdodCAoYykgMjAxOSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cblxuaW1wb3J0IHsgU1FMU2VydmVyRW5jcnlwdGlvblR5cGUsIHR5cGUgQ3J5cHRvTWV0YWRhdGEsIERlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEsIERlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IENFS0VudHJ5IH0gZnJvbSAnLi9jZWstZW50cnknO1xuaW1wb3J0IHsgZGVjcnlwdFN5bW1ldHJpY0tleSB9IGZyb20gJy4va2V5LWNyeXB0byc7XG5pbXBvcnQgeyB0eXBlQnlOYW1lIGFzIFRZUEVTLCB0eXBlIFBhcmFtZXRlciwgcmVzb2x2ZVBhcmFtZXRlciB9IGZyb20gJy4uL2RhdGEtdHlwZSc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuLi9yZXF1ZXN0JztcbmltcG9ydCBDb25uZWN0aW9uIGZyb20gJy4uL2Nvbm5lY3Rpb24nO1xuaW1wb3J0IFJwY1JlcXVlc3RQYXlsb2FkIGZyb20gJy4uL3JwY3JlcXVlc3QtcGF5bG9hZCc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi4vcGFja2V0JztcblxuZXhwb3J0IGNvbnN0IGdldFBhcmFtZXRlckVuY3J5cHRpb25NZXRhZGF0YSA9IChjb25uZWN0aW9uOiBDb25uZWN0aW9uLCByZXF1ZXN0OiBSZXF1ZXN0LCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpID0+IHtcbiAgaWYgKHJlcXVlc3QuY3J5cHRvTWV0YWRhdGFMb2FkZWQgPT09IHRydWUpIHtcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIGNvbnN0IG1ldGFkYXRhUmVxdWVzdCA9IG5ldyBSZXF1ZXN0KCdzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbicsIChlcnJvcikgPT4ge1xuICAgIGlmIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycm9yKTtcbiAgICB9XG5cbiAgICBjb25zdCBkZWNyeXB0U3ltbWV0cmljS2V5UHJvbWlzZXM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgIGNvbnN0IGNla0xpc3Q6IENFS0VudHJ5W10gPSBbXTtcbiAgICBsZXQgcGFyYW1Db3VudCA9IDA7XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbnMgb2YgcmVzdWx0Um93cykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaXNGaXJzdFJlY29yZFNldCA9IGNvbHVtbnMuc29tZSgoY29sOiBhbnkpID0+IChjb2wgJiYgY29sLm1ldGFkYXRhICYmIGNvbC5tZXRhZGF0YS5jb2xOYW1lKSA9PT0gJ2RhdGFiYXNlX2lkJyk7XG4gICAgICAgIGlmIChpc0ZpcnN0UmVjb3JkU2V0ID09PSB0cnVlKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudE9yZGluYWwgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgbGV0IGNla0VudHJ5OiBDRUtFbnRyeTtcbiAgICAgICAgICBpZiAoIWNla0xpc3RbY3VycmVudE9yZGluYWxdKSB7XG4gICAgICAgICAgICBjZWtFbnRyeSA9IG5ldyBDRUtFbnRyeShjdXJyZW50T3JkaW5hbCk7XG4gICAgICAgICAgICBjZWtMaXN0W2Nla0VudHJ5Lm9yZGluYWxdID0gY2VrRW50cnk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNla0VudHJ5ID0gY2VrTGlzdFtjdXJyZW50T3JkaW5hbF07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNla0VudHJ5LmFkZChjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuRW5jcnlwdGVkS2V5XS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc1tEZXNjcmliZVBhcmFtZXRlckVuY3J5cHRpb25SZXN1bHRTZXQxLkRiSWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5SWRdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5VmVyc2lvbl0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5LZXlNZFZlcnNpb25dLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5UGF0aF0udmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0MS5Qcm92aWRlck5hbWVdLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDEuS2V5RW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcmFtQ291bnQrKztcbiAgICAgICAgICBjb25zdCBwYXJhbU5hbWU6IHN0cmluZyA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5QYXJhbWV0ZXJOYW1lXS52YWx1ZTtcbiAgICAgICAgICBjb25zdCBwYXJhbUluZGV4OiBudW1iZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnMuZmluZEluZGV4KChwYXJhbTogUGFyYW1ldGVyKSA9PiBwYXJhbU5hbWUgPT09IGBAJHtwYXJhbS5uYW1lfWApO1xuICAgICAgICAgIGNvbnN0IGNla09yZGluYWw6IG51bWJlciA9IGNvbHVtbnNbRGVzY3JpYmVQYXJhbWV0ZXJFbmNyeXB0aW9uUmVzdWx0U2V0Mi5Db2x1bW5FbmNyeXB0aW9uS2V5T3JkaW5hbF0udmFsdWU7XG4gICAgICAgICAgY29uc3QgY2VrRW50cnk6IENFS0VudHJ5ID0gY2VrTGlzdFtjZWtPcmRpbmFsXTtcblxuICAgICAgICAgIGlmIChjZWtFbnRyeSAmJiBjZWtMaXN0Lmxlbmd0aCA8IGNla09yZGluYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBUaGUgcmVmZXJlbmNlZCBjb2x1bW4gZW5jcnlwdGlvbiBrZXkgb3JkaW5hbCBcIiR7Y2VrT3JkaW5hbH1cIiBpcyBtaXNzaW5nIGluIHRoZSBlbmNyeXB0aW9uIG1ldGFkYXRhIHJldHVybmVkIGJ5IHNwX2Rlc2NyaWJlX3BhcmFtZXRlcl9lbmNyeXB0aW9uLiBNYXggb3JkaW5hbCBpcyBcIiR7Y2VrTGlzdC5sZW5ndGh9XCIuYCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVuY1R5cGUgPSBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnl0aW9uVHlwZV0udmFsdWU7XG4gICAgICAgICAgaWYgKFNRTFNlcnZlckVuY3J5cHRpb25UeXBlLlBsYWluVGV4dCAhPT0gZW5jVHlwZSkge1xuICAgICAgICAgICAgcmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhID0ge1xuICAgICAgICAgICAgICBjZWtFbnRyeTogY2VrRW50cnksXG4gICAgICAgICAgICAgIG9yZGluYWw6IGNla09yZGluYWwsXG4gICAgICAgICAgICAgIGNpcGhlckFsZ29yaXRobUlkOiBjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuQ29sdW1uRW5jcnlwdGlvbkFsZ29yaXRobV0udmFsdWUsXG4gICAgICAgICAgICAgIGVuY3J5cHRpb25UeXBlOiBlbmNUeXBlLFxuICAgICAgICAgICAgICBub3JtYWxpemF0aW9uUnVsZVZlcnNpb246IEJ1ZmZlci5mcm9tKFtjb2x1bW5zW0Rlc2NyaWJlUGFyYW1ldGVyRW5jcnlwdGlvblJlc3VsdFNldDIuTm9ybWFsaXphdGlvblJ1bGVWZXJzaW9uXS52YWx1ZV0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcy5wdXNoKGRlY3J5cHRTeW1tZXRyaWNLZXkocmVxdWVzdC5wYXJhbWV0ZXJzW3BhcmFtSW5kZXhdLmNyeXB0b01ldGFkYXRhIGFzIENyeXB0b01ldGFkYXRhLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zKSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0LnBhcmFtZXRlcnNbcGFyYW1JbmRleF0uZm9yY2VFbmNyeXB0ID09PSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FsbGJhY2sobmV3IEVycm9yKGBDYW5ub3QgZXhlY3V0ZSBzdGF0ZW1lbnQgb3IgcHJvY2VkdXJlICR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9IGJlY2F1c2UgRm9yY2UgRW5jcnlwdGlvbiB3YXMgc2V0IGFzIHRydWUgZm9yIHBhcmFtZXRlciAke3BhcmFtSW5kZXggKyAxfSBhbmQgdGhlIGRhdGFiYXNlIGV4cGVjdHMgdGhpcyBwYXJhbWV0ZXIgdG8gYmUgc2VudCBhcyBwbGFpbnRleHQuIFRoaXMgbWF5IGJlIGR1ZSB0byBhIGNvbmZpZ3VyYXRpb24gZXJyb3IuYCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBVbmFibGUgdG8gcGFyc2UgcGFyYW1ldGVyIGVuY3J5cHRpb24gbWV0YWRhdGEgaW4gc3RhdGVtZW50IG9yIHByb2NlZHVyZSBcIiR7cmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmV9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtQ291bnQgIT09IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBjYWxsYmFjayhuZXcgRXJyb3IoYEludGVybmFsIGVycm9yLiBNZXRhZGF0YSBmb3Igc29tZSBwYXJhbWV0ZXJzIGluIHN0YXRlbWVudCBvciBwcm9jZWR1cmUgXCIke3JlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlfVwiIGlzIG1pc3NpbmcgaW4gdGhlIHJlc3VsdHNldCByZXR1cm5lZCBieSBzcF9kZXNjcmliZV9wYXJhbWV0ZXJfZW5jcnlwdGlvbi5gKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKGRlY3J5cHRTeW1tZXRyaWNLZXlQcm9taXNlcykudGhlbigoKSA9PiB7XG4gICAgICByZXF1ZXN0LmNyeXB0b01ldGFkYXRhTG9hZGVkID0gdHJ1ZTtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY2FsbGJhY2spO1xuICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjYWxsYmFjaywgZXJyb3IpO1xuICAgIH0pO1xuICB9KTtcblxuICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCd0c3FsJywgVFlQRVMuTlZhckNoYXIsIHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlKTtcbiAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICBtZXRhZGF0YVJlcXVlc3QuYWRkUGFyYW1ldGVyKCdwYXJhbXMnLCBUWVBFUy5OVmFyQ2hhciwgbWV0YWRhdGFSZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSk7XG4gIH1cblxuICBjb25zdCByZXN1bHRSb3dzOiBhbnlbXSA9IFtdO1xuXG4gIG1ldGFkYXRhUmVxdWVzdC5vbigncm93JywgKGNvbHVtbnM6IGFueSkgPT4ge1xuICAgIHJlc3VsdFJvd3MucHVzaChjb2x1bW5zKTtcbiAgfSk7XG5cbiAgLy8gVGhpcyByZXF1ZXN0IGlzIGJ1aWx0IGZyb20gcmF3IGBQYXJhbWV0ZXJgcyByYXRoZXIgdGhhbiBhIGBSZXF1ZXN0YFxuICAvLyB0aGF0IGhhcyBiZWVuIHRocm91Z2ggYHZhbGlkYXRlUGFyYW1ldGVyc2AsIHNvIHRoZXkgYXJlIHJlc29sdmVkIGlubGluZS5cbiAgY29ubmVjdGlvbi5tYWtlUmVxdWVzdChtZXRhZGF0YVJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChtZXRhZGF0YVJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgbWV0YWRhdGFSZXF1ZXN0LnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHJlc29sdmVQYXJhbWV0ZXIocGFyYW1ldGVyLCBjb25uZWN0aW9uLmRhdGFiYXNlQ29sbGF0aW9uLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zKSksIGNvbm5lY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCBjb25uZWN0aW9uLmNvbmZpZy5vcHRpb25zKSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxTQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFFQSxJQUFBTSxrQkFBQSxHQUFBRCxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBQWlDLFNBQUFLLHVCQUFBRyxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBVmpDO0FBQ0E7O0FBV08sTUFBTUcsOEJBQThCLEdBQUdBLENBQUNDLFVBQXNCLEVBQUVDLE9BQWdCLEVBQUVDLFFBQWlDLEtBQUs7RUFDN0gsSUFBSUQsT0FBTyxDQUFDRSxvQkFBb0IsS0FBSyxJQUFJLEVBQUU7SUFDekMsT0FBT0QsUUFBUSxDQUFDLENBQUM7RUFDbkI7RUFFQSxNQUFNRSxlQUFlLEdBQUcsSUFBSUMsZ0JBQU8sQ0FBQyxrQ0FBa0MsRUFBR0MsS0FBSyxJQUFLO0lBQ2pGLElBQUlBLEtBQUssRUFBRTtNQUNULE9BQU9KLFFBQVEsQ0FBQ0ksS0FBSyxDQUFDO0lBQ3hCO0lBRUEsTUFBTUMsMkJBQTRDLEdBQUcsRUFBRTtJQUN2RCxNQUFNQyxPQUFtQixHQUFHLEVBQUU7SUFDOUIsSUFBSUMsVUFBVSxHQUFHLENBQUM7SUFFbEIsS0FBSyxN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
@@ -1 +1 @@
1
- {"version":3,"file":"get-parameter-encryption-metadata.js","names":["_types","require","_cekEntry","_keyCrypto","_dataType","_request","_interopRequireDefault","_rpcrequestPayload","_packet","e","__esModule","default","getParameterEncryptionMetadata","connection","request","callback","cryptoMetadataLoaded","metadataRequest","Request","error","decryptSymmetricKeyPromises","cekList","paramCount","columns","resultRows","isFirstRecordSet","some","col","metadata","colName","currentOrdinal","DescribeParameterEncryptionResultSet1","KeyOrdinal","value","cekEntry","CEKEntry","ordinal","add","EncryptedKey","DbId","KeyId","KeyVersion","KeyMdVersion","KeyPath","ProviderName","KeyEncryptionAlgorithm","paramName","DescribeParameterEncryptionResultSet2","ParameterName","paramIndex","parameters","findIndex","param","name","cekOrdinal","ColumnEncryptionKeyOrdinal","length","Error","encType","ColumnEncrytionType","SQLServerEncryptionType","PlainText","cryptoMetadata","cipherAlgorithmId","ColumnEncryptionAlgorithm","encryptionType","normalizationRuleVersion","Buffer","from","NormalizationRuleVersion","push","decryptSymmetricKey","config","options","forceEncrypt","sqlTextOrProcedure","Promise","all","then","process","nextTick","addParameter","TYPES","NVarChar","makeParamsParameter","on","makeRequest","TYPE","RPC_REQUEST","RpcRequestPayload","currentTransactionDescriptor","databaseCollation","exports"],"sources":["../../src/always-encrypted/get-parameter-encryption-metadata.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { SQLServerEncryptionType, type CryptoMetadata, DescribeParameterEncryptionResultSet1, DescribeParameterEncryptionResultSet2 } from './types';\nimport { CEKEntry } from './cek-entry';\nimport { decryptSymmetricKey } from './key-crypto';\nimport { typeByName as TYPES, type Parameter } from '../data-type';\nimport Request from '../request';\nimport Connection from '../connection';\nimport RpcRequestPayload from '../rpcrequest-payload';\nimport { TYPE } from '../packet';\n\nexport const getParameterEncryptionMetadata = (connection: Connection, request: Request, callback: (error?: Error) => void) => {\n if (request.cryptoMetadataLoaded === true) {\n return callback();\n }\n\n const metadataRequest = new Request('sp_describe_parameter_encryption', (error) => {\n if (error) {\n return callback(error);\n }\n\n const decryptSymmetricKeyPromises: Promise<void>[] = [];\n const cekList: CEKEntry[] = [];\n let paramCount = 0;\n\n for (const columns of resultRows) {\n try {\n const isFirstRecordSet = columns.some((col: any) => (col && col.metadata && col.metadata.colName) === 'database_id');\n if (isFirstRecordSet === true) {\n const currentOrdinal = columns[DescribeParameterEncryptionResultSet1.KeyOrdinal].value;\n let cekEntry: CEKEntry;\n if (!cekList[currentOrdinal]) {\n cekEntry = new CEKEntry(currentOrdinal);\n cekList[cekEntry.ordinal] = cekEntry;\n } else {\n cekEntry = cekList[currentOrdinal];\n }\n cekEntry.add(columns[DescribeParameterEncryptionResultSet1.EncryptedKey].value,\n columns[DescribeParameterEncryptionResultSet1.DbId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyMdVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyPath].value,\n columns[DescribeParameterEncryptionResultSet1.ProviderName].value,\n columns[DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);\n } else {\n paramCount++;\n const paramName: string = columns[DescribeParameterEncryptionResultSet2.ParameterName].value;\n const paramIndex: number = request.parameters.findIndex((param: Parameter) => paramName === `@${param.name}`);\n const cekOrdinal: number = columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;\n const cekEntry: CEKEntry = cekList[cekOrdinal];\n\n if (cekEntry && cekList.length < cekOrdinal) {\n return callback(new Error(`Internal error. The referenced column encryption key ordinal \"${cekOrdinal}\" is missing in the encryption metadata returned by sp_describe_parameter_encryption. Max ordinal is \"${cekList.length}\".`));\n }\n\n const encType = columns[DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;\n if (SQLServerEncryptionType.PlainText !== encType) {\n request.parameters[paramIndex].cryptoMetadata = {\n cekEntry: cekEntry,\n ordinal: cekOrdinal,\n cipherAlgorithmId: columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,\n encryptionType: encType,\n normalizationRuleVersion: Buffer.from([columns[DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value]),\n };\n decryptSymmetricKeyPromises.push(decryptSymmetricKey(request.parameters[paramIndex].cryptoMetadata as CryptoMetadata, connection.config.options));\n } else if (request.parameters[paramIndex].forceEncrypt === true) {\n return callback(new Error(`Cannot execute statement or procedure ${request.sqlTextOrProcedure} because Force Encryption was set as true for parameter ${paramIndex + 1} and the database expects this parameter to be sent as plaintext. This may be due to a configuration error.`));\n }\n }\n } catch {\n return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure \"${request.sqlTextOrProcedure}\"`));\n }\n }\n\n if (paramCount !== request.parameters.length) {\n return callback(new Error(`Internal error. Metadata for some parameters in statement or procedure \"${request.sqlTextOrProcedure}\" is missing in the resultset returned by sp_describe_parameter_encryption.`));\n }\n\n return Promise.all(decryptSymmetricKeyPromises).then(() => {\n request.cryptoMetadataLoaded = true;\n process.nextTick(callback);\n }, (error) => {\n process.nextTick(callback, error);\n });\n });\n\n metadataRequest.addParameter('tsql', TYPES.NVarChar, request.sqlTextOrProcedure);\n if (request.parameters.length) {\n metadataRequest.addParameter('params', TYPES.NVarChar, metadataRequest.makeParamsParameter(request.parameters));\n }\n\n const resultRows: any[] = [];\n\n metadataRequest.on('row', (columns: any) => {\n resultRows.push(columns);\n });\n\n connection.makeRequest(metadataRequest, TYPE.RPC_REQUEST, new RpcRequestPayload(metadataRequest.sqlTextOrProcedure!, metadataRequest.parameters, connection.currentTransactionDescriptor(), connection.config.options, connection.databaseCollation));\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"get-parameter-encryption-metadata.js","names":["_types","require","_cekEntry","_keyCrypto","_dataType","_request","_interopRequireDefault","_rpcrequestPayload","_packet","e","__esModule","default","getParameterEncryptionMetadata","connection","request","callback","cryptoMetadataLoaded","metadataRequest","Request","error","decryptSymmetricKeyPromises","cekList","paramCount","columns","resultRows","isFirstRecordSet","some","col","metadata","colName","currentOrdinal","DescribeParameterEncryptionResultSet1","KeyOrdinal","value","cekEntry","CEKEntry","ordinal","add","EncryptedKey","DbId","KeyId","KeyVersion","KeyMdVersion","KeyPath","ProviderName","KeyEncryptionAlgorithm","paramName","DescribeParameterEncryptionResultSet2","ParameterName","paramIndex","parameters","findIndex","param","name","cekOrdinal","ColumnEncryptionKeyOrdinal","length","Error","encType","ColumnEncrytionType","SQLServerEncryptionType","PlainText","cryptoMetadata","cipherAlgorithmId","ColumnEncryptionAlgorithm","encryptionType","normalizationRuleVersion","Buffer","from","NormalizationRuleVersion","push","decryptSymmetricKey","config","options","forceEncrypt","sqlTextOrProcedure","Promise","all","then","process","nextTick","addParameter","TYPES","NVarChar","makeParamsParameter","on","makeRequest","TYPE","RPC_REQUEST","RpcRequestPayload","map","parameter","resolveParameter","databaseCollation","currentTransactionDescriptor","exports"],"sources":["../../src/always-encrypted/get-parameter-encryption-metadata.ts"],"sourcesContent":["// This code is based on the `mssql-jdbc` library published under the conditions of MIT license.\n// Copyright (c) 2019 Microsoft Corporation\n\nimport { SQLServerEncryptionType, type CryptoMetadata, DescribeParameterEncryptionResultSet1, DescribeParameterEncryptionResultSet2 } from './types';\nimport { CEKEntry } from './cek-entry';\nimport { decryptSymmetricKey } from './key-crypto';\nimport { typeByName as TYPES, type Parameter, resolveParameter } from '../data-type';\nimport Request from '../request';\nimport Connection from '../connection';\nimport RpcRequestPayload from '../rpcrequest-payload';\nimport { TYPE } from '../packet';\n\nexport const getParameterEncryptionMetadata = (connection: Connection, request: Request, callback: (error?: Error) => void) => {\n if (request.cryptoMetadataLoaded === true) {\n return callback();\n }\n\n const metadataRequest = new Request('sp_describe_parameter_encryption', (error) => {\n if (error) {\n return callback(error);\n }\n\n const decryptSymmetricKeyPromises: Promise<void>[] = [];\n const cekList: CEKEntry[] = [];\n let paramCount = 0;\n\n for (const columns of resultRows) {\n try {\n const isFirstRecordSet = columns.some((col: any) => (col && col.metadata && col.metadata.colName) === 'database_id');\n if (isFirstRecordSet === true) {\n const currentOrdinal = columns[DescribeParameterEncryptionResultSet1.KeyOrdinal].value;\n let cekEntry: CEKEntry;\n if (!cekList[currentOrdinal]) {\n cekEntry = new CEKEntry(currentOrdinal);\n cekList[cekEntry.ordinal] = cekEntry;\n } else {\n cekEntry = cekList[currentOrdinal];\n }\n cekEntry.add(columns[DescribeParameterEncryptionResultSet1.EncryptedKey].value,\n columns[DescribeParameterEncryptionResultSet1.DbId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyId].value,\n columns[DescribeParameterEncryptionResultSet1.KeyVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyMdVersion].value,\n columns[DescribeParameterEncryptionResultSet1.KeyPath].value,\n columns[DescribeParameterEncryptionResultSet1.ProviderName].value,\n columns[DescribeParameterEncryptionResultSet1.KeyEncryptionAlgorithm].value);\n } else {\n paramCount++;\n const paramName: string = columns[DescribeParameterEncryptionResultSet2.ParameterName].value;\n const paramIndex: number = request.parameters.findIndex((param: Parameter) => paramName === `@${param.name}`);\n const cekOrdinal: number = columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionKeyOrdinal].value;\n const cekEntry: CEKEntry = cekList[cekOrdinal];\n\n if (cekEntry && cekList.length < cekOrdinal) {\n return callback(new Error(`Internal error. The referenced column encryption key ordinal \"${cekOrdinal}\" is missing in the encryption metadata returned by sp_describe_parameter_encryption. Max ordinal is \"${cekList.length}\".`));\n }\n\n const encType = columns[DescribeParameterEncryptionResultSet2.ColumnEncrytionType].value;\n if (SQLServerEncryptionType.PlainText !== encType) {\n request.parameters[paramIndex].cryptoMetadata = {\n cekEntry: cekEntry,\n ordinal: cekOrdinal,\n cipherAlgorithmId: columns[DescribeParameterEncryptionResultSet2.ColumnEncryptionAlgorithm].value,\n encryptionType: encType,\n normalizationRuleVersion: Buffer.from([columns[DescribeParameterEncryptionResultSet2.NormalizationRuleVersion].value]),\n };\n decryptSymmetricKeyPromises.push(decryptSymmetricKey(request.parameters[paramIndex].cryptoMetadata as CryptoMetadata, connection.config.options));\n } else if (request.parameters[paramIndex].forceEncrypt === true) {\n return callback(new Error(`Cannot execute statement or procedure ${request.sqlTextOrProcedure} because Force Encryption was set as true for parameter ${paramIndex + 1} and the database expects this parameter to be sent as plaintext. This may be due to a configuration error.`));\n }\n }\n } catch {\n return callback(new Error(`Internal error. Unable to parse parameter encryption metadata in statement or procedure \"${request.sqlTextOrProcedure}\"`));\n }\n }\n\n if (paramCount !== request.parameters.length) {\n return callback(new Error(`Internal error. Metadata for some parameters in statement or procedure \"${request.sqlTextOrProcedure}\" is missing in the resultset returned by sp_describe_parameter_encryption.`));\n }\n\n return Promise.all(decryptSymmetricKeyPromises).then(() => {\n request.cryptoMetadataLoaded = true;\n process.nextTick(callback);\n }, (error) => {\n process.nextTick(callback, error);\n });\n });\n\n metadataRequest.addParameter('tsql', TYPES.NVarChar, request.sqlTextOrProcedure);\n if (request.parameters.length) {\n metadataRequest.addParameter('params', TYPES.NVarChar, metadataRequest.makeParamsParameter(request.parameters));\n }\n\n const resultRows: any[] = [];\n\n metadataRequest.on('row', (columns: any) => {\n resultRows.push(columns);\n });\n\n // This request is built from raw `Parameter`s rather than a `Request`\n // that has been through `validateParameters`, so they are resolved inline.\n connection.makeRequest(metadataRequest, TYPE.RPC_REQUEST, new RpcRequestPayload(metadataRequest.sqlTextOrProcedure!, metadataRequest.parameters.map((parameter) => resolveParameter(parameter, connection.databaseCollation, connection.config.options)), connection.currentTransactionDescriptor(), connection.config.options));\n};\n"],"mappings":"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","ignoreList":[]}
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.BulkLoadPayload = void 0;
7
7
  var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
8
8
  var _token = require("./token/token");
9
+ var _errors = require("./errors");
9
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
11
  const rowTokenBuffer = Buffer.from([_token.TYPE.ROW]);
11
12
  const textPointerAndTimestampBuffer = Buffer.from([
@@ -100,10 +101,10 @@ class BulkLoadPayload {
100
101
  // text pointer and timestamp, or as a null pointer.
101
102
  const isTextType = columns.map(c => c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText');
102
103
  const buffer = new _writableTrackingBuffer.default();
103
- buffer.writeBuffer(bulkLoad.getColMetaData());
104
104
  let done = false;
105
105
  let closed = false;
106
106
  try {
107
+ buffer.writeBuffer(bulkLoad.getColMetaData());
107
108
  while (true) {
108
109
  let result = this.pending ?? iterator.next();
109
110
  this.pending = undefined;
@@ -138,9 +139,12 @@ class BulkLoadPayload {
138
139
  if (isTextType[i]) {
139
140
  buffer.writeBuffer(textPointerAndTimestampBuffer);
140
141
  }
141
- buffer.writeBuffer(c.type.generateParameterLength(parameter, options));
142
- for (const chunk of c.type.generateParameterData(parameter, options)) {
143
- buffer.writeBuffer(chunk);
142
+ try {
143
+ c.type.writeValue(buffer, parameter, options);
144
+ } catch (error) {
145
+ throw new _errors.InputError(`Column '${c.name}' could not be serialized`, {
146
+ cause: error
147
+ });
144
148
  }
145
149
  }
146
150
 
@@ -185,4 +189,4 @@ class BulkLoadPayload {
185
189
  }
186
190
  }
187
191
  exports.BulkLoadPayload = BulkLoadPayload;
188
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3Rva2VuIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwicm93VG9rZW5CdWZmZXIiLCJCdWZmZXIiLCJmcm9tIiwiVE9LRU5fVFlQRSIsIlJPVyIsInRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyIiwidGV4dFBvaW50ZXJOdWxsQnVmZmVyIiwiaXNQcm9taXNlTGlrZSIsInZhbHVlIiwidGhlbiIsImlnbm9yZUVycm9yIiwiQnVsa0xvYWRQYXlsb2FkIiwiY29uc3RydWN0b3IiLCJidWxrTG9hZCIsInJvd3MiLCJpdGVyYXRvciIsIlN5bWJvbCIsImFzeW5jSXRlcmF0b3IiLCJmaXJzdCIsIm5leHQiLCJlcnIiLCJQcm9taXNlIiwicmVqZWN0IiwicmVhZCIsInJlc29sdmUiLCJ1bmRlZmluZWQiLCJwZW5kaW5nIiwiY2xvc2UiLCJyZXR1cm4iLCJjbG9zaW5nIiwib3B0aW9ucyIsImNvbHVtbnMiLCJpc1RleHRUeXBlIiwibWFwIiwiYyIsInR5cGUiLCJuYW1lIiwiYnVmZmVyIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlQnVmZmVyIiwiZ2V0Q29sTWV0YURhdGEiLCJkb25lIiwiY2xvc2VkIiwicmVzdWx0Iiwicm93IiwiaXNBcnJheSIsIkFycmF5IiwiaSIsImxlbmd0aCIsInZhbGlkYXRlIiwib2JqTmFtZSIsImNvbGxhdGlvbiIsInBhcmFtZXRlciIsInNjYWxlIiwicHJlY2lzaW9uIiwiZ2VuZXJhdGVQYXJhbWV0ZXJMZW5ndGgiLCJjaHVuayIsImdlbmVyYXRlUGFyYW1ldGVyRGF0YSIsIkNIVU5LX1NJWkUiLCJnZXRCdWZmZXJzIiwiY29uc3VtZSIsImNyZWF0ZURvbmVUb2tlbiIsInRvU3RyaW5nIiwiaW5kZW50IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLWxvYWQtcGF5bG9hZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQnVsa0xvYWQgZnJvbSAnLi9idWxrLWxvYWQnO1xuaW1wb3J0IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIgZnJvbSAnLi90cmFja2luZy1idWZmZXIvd3JpdGFibGUtdHJhY2tpbmctYnVmZmVyJztcbmltcG9ydCB7IFRZUEUgYXMgVE9LRU5fVFlQRSB9IGZyb20gJy4vdG9rZW4vdG9rZW4nO1xuXG5leHBvcnQgdHlwZSBSb3cgPSB1bmtub3duW10gfCB7IFtjb2xOYW1lOiBzdHJpbmddOiB1bmtub3duIH07XG5cbmNvbnN0IHJvd1Rva2VuQnVmZmVyID0gQnVmZmVyLmZyb20oWyBUT0tFTl9UWVBFLlJPVyBdKTtcbmNvbnN0IHRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyID0gQnVmZmVyLmZyb20oW1xuICAvLyBUZXh0UG9pbnRlciBsZW5ndGhcbiAgMHgxMCxcblxuICAvLyBUZXh0UG9pbnRlclxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuXG4gIC8vIFRpbWVzdGFtcFxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXG5dKTtcbmNvbnN0IHRleHRQb2ludGVyTnVsbEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaWdub3JlRXJyb3IoKSB7fVxuXG4vKipcbiAqIFRoZSBURFMgYnl0ZSBzdHJlYW0gb2YgYSBidWxrIGxvYWQ6IENPTE1FVEFEQVRBLCBhIFJPVyB0b2tlbiBwZXIgcm93LFxuICogYW5kIGEgRE9ORSB0b2tlbiBhdCB0aGUgZW5kLCBzZXJpYWxpemVkIGZyb20gdGhlIGJ1bGsgbG9hZCdzIHJvdyBzb3VyY2UuXG4gKlxuICogVGhlIHBheWxvYWQgb3ducyB0aGUgcm93IHNvdXJjZSdzIGl0ZXJhdG9yIHRoZSB3YXkgYSBgZm9yIGF3YWl0YCBsb29wXG4gKiB3b3VsZDogaXQgcmVxdWVzdHMgdGhlIGZpcnN0IHJvdyBhcyBzb29uIGFzIGl0IGlzIGNyZWF0ZWQsIHNvIHRoYXQgYVxuICogc3RyZWFtIHNvdXJjZSBpcyBvYnNlcnZlZCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgaGFuZGVkIG92ZXIsIGFuZCBpdFxuICogY2xvc2VzIHRoZSBzb3VyY2UgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBgcmV0dXJuKClgIHdoZW5ldmVyIHRoZSBidWxrXG4gKiBsb2FkIGRvZXMgbm90IHJ1biB0byBjb21wbGV0aW9uLCB3aGV0aGVyIHRoZSByb3dzIHdlcmUgYmVpbmcgcmVhZFxuICogKFtbU3ltYm9sLmFzeW5jSXRlcmF0b3JdXSkgb3IgbmV2ZXIgZ290IHRvIGJlIChbW2Nsb3NlXV0pLlxuICpcbiAqIFJvd3MgYXJlIHdyaXR0ZW4gaW50byBvbmUgYnVmZmVyIHRoYXQgbGl2ZXMgZm9yIHRoZSB3aG9sZSBidWxrIGxvYWQuXG4gKiBJdHMgY29udGVudHMgYXJlIHlpZWxkZWQgb25jZSBpdCBob2xkcyBhIGNodW5rJ3Mgd29ydGhcbiAqIChgV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFYCksIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgY2VsbCwgYW5kIGF0XG4gKiB0aGUgZW5kLiBSb3dzIGZyb20gYSBzeW5jaHJvbm91cyBzb3VyY2UgYXJlIHNlcmlhbGl6ZWQgd2l0aG91dCBhblxuICogZXZlbnQtbG9vcCB0dXJuIGluIGJldHdlZW47IHJvd3MgZnJvbSBhbiBhc3luY2hyb25vdXMgc291cmNlIGFyZSBhd2FpdGVkXG4gKiBvbmUgYXQgYSB0aW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrTG9hZFBheWxvYWQgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4ge1xuICBkZWNsYXJlIGJ1bGtMb2FkOiBCdWxrTG9hZDtcbiAgZGVjbGFyZSBpdGVyYXRvcjogSXRlcmF0b3I8Um93PiB8IEFzeW5jSXRlcmF0b3I8Um93PjtcbiAgZGVjbGFyZSBwZW5kaW5nOiBJdGVyYXRvclJlc3VsdDxSb3c+IHwgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxSb3c+PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEl0ZXJhYmxlPFJvdz4gfCBBc3luY0l0ZXJhYmxlPFJvdz4pIHtcbiAgICB0aGlzLmJ1bGtMb2FkID0gYnVsa0xvYWQ7XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gdHlwZW9mIChyb3dzIGFzIFBhcnRpYWw8QXN5bmNJdGVyYWJsZTxSb3c+PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nID9cbiAgICAgIChyb3dzIGFzIEFzeW5jSXRlcmFibGU8Um93PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOlxuICAgICAgKHJvd3MgYXMgSXRlcmFibGU8Um93PilbU3ltYm9sLml0ZXJhdG9yXSgpO1xuXG4gICAgLy8gVGhlIGZpcnN0IHJvdyBpcyByZXF1ZXN0ZWQgbm93LCBiZWZvcmUgdGhlIGBJTlNFUlQgQlVMS2Agc3RhdGVtZW50XG4gICAgLy8gaGFzIGdvbmUgb3V0LiBGb3IgYSBzdHJlYW0gc291cmNlIHRoaXMgaXMgd2hhdCBhdHRhY2hlcyBpdHNcbiAgICAvLyBpdGVyYXRvcidzIGxpc3RlbmVyczogYW4gZXJyb3IgaXQgZW1pdHMgd2hpbGUgdGhlIHN0YXRlbWVudCBpcyBpblxuICAgIC8vIGZsaWdodCBpcyBrZXB0IGFuZCByZXBvcnRlZCBvbiB0aGUgbmV4dCByZWFkLCBpbnN0ZWFkIG9mIGJlaW5nIGFuXG4gICAgLy8gdW5oYW5kbGVkIGAnZXJyb3InYCBldmVudC4gVGhlIHJlYWQgaXMgYXdhaXRlZCB3aGVuIHRoZSByb3dzIGFyZVxuICAgIC8vIHNlcmlhbGl6ZWQ7IGl0cyByZWplY3Rpb24gaXMgbm90IHVuaGFuZGxlZCB1bnRpbCB0aGVuLCBhbmQgbmVpdGhlclxuICAgIC8vIGlzIGEgc3luY2hyb25vdXMgc291cmNlJ3MgdGhyb3csIHdoaWNoIHJlYWNoZXMgdGhlIGJ1bGsgbG9hZCdzXG4gICAgLy8gY2FsbGJhY2sgdGhlIHNhbWUgd2F5LlxuICAgIGxldCBmaXJzdDogSXRlcmF0b3JSZXN1bHQ8Um93PiB8IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Um93Pj47XG4gICAgdHJ5IHtcbiAgICAgIGZpcnN0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBmaXJzdCA9IFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJvbWlzZUxpa2UoZmlyc3QpKSB7XG4gICAgICBjb25zdCByZWFkID0gUHJvbWlzZS5yZXNvbHZlKGZpcnN0KTtcbiAgICAgIHJlYWQudGhlbih1bmRlZmluZWQsIGlnbm9yZUVycm9yKTtcbiAgICAgIHRoaXMucGVuZGluZyA9IHJlYWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVuZGluZyA9IGZpcnN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHJvdyBzb3VyY2Ugb2YgYSBidWxrIGxvYWQgd2hvc2Ugcm93cyB3aWxsIG5vdCBiZSByZWFkOlxuICAgKiB0aGUgYElOU0VSVCBCVUxLYCBzdGF0ZW1lbnQgd2FzIHJlamVjdGVkLCB0aGUgYnVsayBsb2FkIHdhcyBjYW5jZWxlZCxcbiAgICogb3IgdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGxvZ2dlZCBpbi4gQmVzdCBlZmZvcnQ6IGEgcmVhZCBzdGlsbFxuICAgKiBwZW5kaW5nIGluIHRoZSBzb3VyY2UgY2Fubm90IGJlIGludGVycnVwdGVkLCBhbmQgYSBjbG9zZSB0aGF0IGZhaWxzXG4gICAqIGhhcyBub3RoaW5nIGxlZnQgdG8gcmVwb3J0IHRvLlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3IucmV0dXJuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3NpbmcgPSBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGNsb3NpbmcpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShjbG9zaW5nKS50aGVuKHVuZGVmaW5lZCwgaWdub3JlRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIHJlcG9ydCB0by5cbiAgICB9XG4gIH1cblxuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBjb25zdCBidWxrTG9hZCA9IHRoaXMuYnVsa0xvYWQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGJ1bGtMb2FkLm9wdGlvbnM7XG4gICAgY29uc3QgY29sdW1ucyA9IGJ1bGtMb2FkLmNvbHVtbnM7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuXG4gICAgLy8gUGVyIGNvbHVtbiwgbm90IHBlciBjZWxsOiBhIHRleHQgdHlwZSdzIHZhbHVlIGlzIHdyaXR0ZW4gYmVoaW5kIGFcbiAgICAvLyB0ZXh0IHBvaW50ZXIgYW5kIHRpbWVzdGFtcCwgb3IgYXMgYSBudWxsIHBvaW50ZXIuXG4gICAgY29uc3QgaXNUZXh0VHlwZSA9IGNvbHVtbnMubWFwKChjKSA9PiBjLnR5cGUubmFtZSA9PT0gJ1RleHQnIHx8IGMudHlwZS5uYW1lID09PSAnSW1hZ2UnIHx8IGMudHlwZS5uYW1lID09PSAnTlRleHQnKTtcblxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgYnVmZmVyLndyaXRlQnVmZmVyKGJ1bGtMb2FkLmdldENvbE1ldGFEYXRhKCkpO1xuXG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBsZXQgY2xvc2VkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBlbmRpbmcgPz8gaXRlcmF0b3IubmV4dCgpO1xuICAgICAgICB0aGlzLnBlbmRpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEEgcm93IGdpdmVuIGFzIGEgcHJvbWlzZSBpcyBzZXR0bGVkIGZpcnN0LCBhcyBgUmVhZGFibGUuZnJvbWBcbiAgICAgICAgLy8gc2V0dGxlZCBpdCBiZWZvcmUgaGFuZGluZyBpdCBvbi5cbiAgICAgICAgbGV0IHJvdyA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKGlzUHJvbWlzZUxpa2Uocm93KSkge1xuICAgICAgICAgIHJvdyA9IGF3YWl0IHJvdztcbiAgICAgICAgfVxuXG4gICAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihyb3dUb2tlbkJ1ZmZlcik7XG5cbiAgICAgICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkocm93KTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgYyA9IGNvbHVtbnNbaV07XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBjLnR5cGUudmFsaWRhdGUoaXNBcnJheSA/IChyb3cgYXMgdW5rbm93bltdKVtpXSA6IChyb3cgYXMgeyBbY29sTmFtZTogc3RyaW5nXTogdW5rbm93biB9KVtjLm9iak5hbWVdLCBjLmNvbGxhdGlvbik7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSB7XG4gICAgICAgICAgICBsZW5ndGg6IGMubGVuZ3RoLFxuICAgICAgICAgICAgc2NhbGU6IGMuc2NhbGUsXG4gICAgICAgICAgICBwcmVjaXNpb246IGMucHJlY2lzaW9uLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChpc1RleHRUeXBlW2ldICYmIHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcih0ZXh0UG9pbnRlck51bGxCdWZmZXIpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoaXNUZXh0VHlwZVtpXSkge1xuICAgICAgICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIodGV4dFBvaW50ZXJBbmRUaW1lc3RhbXBCdWZmZXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIoYy50eXBlLmdlbmVyYXRlUGFyYW1ldGVyTGVuZ3RoKHBhcmFtZXRlciwgb3B0aW9ucykpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjaHVuayBvZiBjLnR5cGUuZ2VuZXJhdGVQYXJhbWV0ZXJEYXRhKHBhcmFtZXRlciwgb3B0aW9ucykpIHtcbiAgICAgICAgICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKGNodW5rKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVja2VkIGFmdGVyIGV2ZXJ5IGNlbGwsIG5vdCBvbmx5IGFmdGVyIGV2ZXJ5IHJvdywgc28gdGhhdCBhXG4gICAgICAgICAgLy8gd2lkZSByb3cgb2YgbGFyZ2UgY2VsbHMgZ29lcyBkb3duc3RyZWFtIGFzIGl0IGlzIHNlcmlhbGl6ZWQuXG4gICAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPj0gV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlci5nZXRCdWZmZXJzKCkpIHtcbiAgICAgICAgICAgICAgeWllbGQgY2h1bms7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBidWZmZXIuY29uc3VtZShidWZmZXIubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIEEgZmFpbGVkIHJvdyBjbG9zZXMgdGhlIHNvdXJjZSBhcyBhIGBmb3IgYXdhaXRgIHdvdWxkLiBBIGNsb3NlXG4gICAgICAvLyB0aGF0IGZhaWxzIG11c3Qgbm90IHJlcGxhY2UgdGhlIHJvdyBlcnJvciB0aGUgYnVsayBsb2FkIGlzXG4gICAgICAvLyBmYWlsaW5nIHdpdGguXG4gICAgICBjbG9zZWQgPSB0cnVlO1xuICAgICAgaWYgKHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gVGhlIHJvdyBlcnJvciBpcyB3aGF0IHN1cmZhY2VzLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIC8vIFRoZSBjb25zdW1lciBzdG9wcGVkIHB1bGxpbmcgKGUuZy4gYmVjYXVzZSB0aGUgYnVsayBsb2FkIHdhc1xuICAgICAgLy8gY2FuY2VsZWQpOiBjbG9zZSB0aGUgc291cmNlIGFzIGEgYGZvciBhd2FpdGAgd291bGQuXG4gICAgICBpZiAoIWRvbmUgJiYgIWNsb3NlZCAmJiB0eXBlb2YgaXRlcmF0b3IucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGJ1ZmZlci53cml0ZUJ1ZmZlcihidWxrTG9hZC5jcmVhdGVEb25lVG9rZW4oKSk7XG4gICAgZm9yIChjb25zdCBjaHVuayBvZiBidWZmZXIuZ2V0QnVmZmVycygpKSB7XG4gICAgICB5aWVsZCBjaHVuaztcbiAgICB9XG4gICAgYnVmZmVyLmNvbnN1bWUoYnVmZmVyLmxlbmd0aCk7XG4gIH1cblxuICB0b1N0cmluZyhpbmRlbnQgPSAnJykge1xuICAgIHJldHVybiBpbmRlbnQgKyAoJ0J1bGtMb2FkJyk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsSUFBQUEsdUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUFtRCxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUluRCxNQUFNRyxjQUFjLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUVDLFdBQVUsQ0FBQ0MsR0FBRyxDQUFFLENBQUM7QUFDdEQsTUFBTUMsNkJBQTZCLEdBQUdKLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDO0FBQ2hEO0FBQ0EsSUFBSTtBQUVKO0FBQ0EsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSTtBQUU5RjtBQUNBLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQy9DLENBQUM7QUFDRixNQUFNSSxxQkFBcUIsR0FBR0wsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUVqRCxTQUFTSyxh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
192
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX3Rva2VuIiwiX2Vycm9ycyIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsInJvd1Rva2VuQnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsIlRPS0VOX1RZUEUiLCJST1ciLCJ0ZXh0UG9pbnRlckFuZFRpbWVzdGFtcEJ1ZmZlciIsInRleHRQb2ludGVyTnVsbEJ1ZmZlciIsImlzUHJvbWlzZUxpa2UiLCJ2YWx1ZSIsInRoZW4iLCJpZ25vcmVFcnJvciIsIkJ1bGtMb2FkUGF5bG9hZCIsImNvbnN0cnVjdG9yIiwiYnVsa0xvYWQiLCJyb3dzIiwiaXRlcmF0b3IiLCJTeW1ib2wiLCJhc3luY0l0ZXJhdG9yIiwiZmlyc3QiLCJuZXh0IiwiZXJyIiwiUHJvbWlzZSIsInJlamVjdCIsInJlYWQiLCJyZXNvbHZlIiwidW5kZWZpbmVkIiwicGVuZGluZyIsImNsb3NlIiwicmV0dXJuIiwiY2xvc2luZyIsIm9wdGlvbnMiLCJjb2x1bW5zIiwiaXNUZXh0VHlwZSIsIm1hcCIsImMiLCJ0eXBlIiwibmFtZSIsImJ1ZmZlciIsIldyaXRhYmxlVHJhY2tpbmdCdWZmZXIiLCJkb25lIiwiY2xvc2VkIiwid3JpdGVCdWZmZXIiLCJnZXRDb2xNZXRhRGF0YSIsInJlc3VsdCIsInJvdyIsImlzQXJyYXkiLCJBcnJheSIsImkiLCJsZW5ndGgiLCJ2YWxpZGF0ZSIsIm9iak5hbWUiLCJjb2xsYXRpb24iLCJwYXJhbWV0ZXIiLCJzY2FsZSIsInByZWNpc2lvbiIsIndyaXRlVmFsdWUiLCJlcnJvciIsIklucHV0RXJyb3IiLCJjYXVzZSIsIkNIVU5LX1NJWkUiLCJjaHVuayIsImdldEJ1ZmZlcnMiLCJjb25zdW1lIiwiY3JlYXRlRG9uZVRva2VuIiwidG9TdHJpbmciLCJpbmRlbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vc3JjL2J1bGstbG9hZC1wYXlsb2FkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCdWxrTG9hZCBmcm9tICcuL2J1bGstbG9hZCc7XG5pbXBvcnQgV3JpdGFibGVUcmFja2luZ0J1ZmZlciBmcm9tICcuL3RyYWNraW5nLWJ1ZmZlci93cml0YWJsZS10cmFja2luZy1idWZmZXInO1xuaW1wb3J0IHsgVFlQRSBhcyBUT0tFTl9UWVBFIH0gZnJvbSAnLi90b2tlbi90b2tlbic7XG5pbXBvcnQgeyBJbnB1dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBSb3cgPSB1bmtub3duW10gfCB7IFtjb2xOYW1lOiBzdHJpbmddOiB1bmtub3duIH07XG5cbmNvbnN0IHJvd1Rva2VuQnVmZmVyID0gQnVmZmVyLmZyb20oWyBUT0tFTl9UWVBFLlJPVyBdKTtcbmNvbnN0IHRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyID0gQnVmZmVyLmZyb20oW1xuICAvLyBUZXh0UG9pbnRlciBsZW5ndGhcbiAgMHgxMCxcblxuICAvLyBUZXh0UG9pbnRlclxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLFxuXG4gIC8vIFRpbWVzdGFtcFxuICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwXG5dKTtcbmNvbnN0IHRleHRQb2ludGVyTnVsbEJ1ZmZlciA9IEJ1ZmZlci5mcm9tKFsweDAwXSk7XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZUxpa2U8VD4odmFsdWU6IFQgfCBQcm9taXNlTGlrZTxUPik6IHZhbHVlIGlzIFByb21pc2VMaWtlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mICh2YWx1ZSBhcyBQcm9taXNlTGlrZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZnVuY3Rpb24gaWdub3JlRXJyb3IoKSB7fVxuXG4vKipcbiAqIFRoZSBURFMgYnl0ZSBzdHJlYW0gb2YgYSBidWxrIGxvYWQ6IENPTE1FVEFEQVRBLCBhIFJPVyB0b2tlbiBwZXIgcm93LFxuICogYW5kIGEgRE9ORSB0b2tlbiBhdCB0aGUgZW5kLCBzZXJpYWxpemVkIGZyb20gdGhlIGJ1bGsgbG9hZCdzIHJvdyBzb3VyY2UuXG4gKlxuICogVGhlIHBheWxvYWQgb3ducyB0aGUgcm93IHNvdXJjZSdzIGl0ZXJhdG9yIHRoZSB3YXkgYSBgZm9yIGF3YWl0YCBsb29wXG4gKiB3b3VsZDogaXQgcmVxdWVzdHMgdGhlIGZpcnN0IHJvdyBhcyBzb29uIGFzIGl0IGlzIGNyZWF0ZWQsIHNvIHRoYXQgYVxuICogc3RyZWFtIHNvdXJjZSBpcyBvYnNlcnZlZCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgaGFuZGVkIG92ZXIsIGFuZCBpdFxuICogY2xvc2VzIHRoZSBzb3VyY2UgdGhyb3VnaCB0aGUgaXRlcmF0b3IncyBgcmV0dXJuKClgIHdoZW5ldmVyIHRoZSBidWxrXG4gKiBsb2FkIGRvZXMgbm90IHJ1biB0byBjb21wbGV0aW9uLCB3aGV0aGVyIHRoZSByb3dzIHdlcmUgYmVpbmcgcmVhZFxuICogKFtbU3ltYm9sLmFzeW5jSXRlcmF0b3JdXSkgb3IgbmV2ZXIgZ290IHRvIGJlIChbW2Nsb3NlXV0pLlxuICpcbiAqIFJvd3MgYXJlIHdyaXR0ZW4gaW50byBvbmUgYnVmZmVyIHRoYXQgbGl2ZXMgZm9yIHRoZSB3aG9sZSBidWxrIGxvYWQuXG4gKiBJdHMgY29udGVudHMgYXJlIHlpZWxkZWQgb25jZSBpdCBob2xkcyBhIGNodW5rJ3Mgd29ydGhcbiAqIChgV3JpdGFibGVUcmFja2luZ0J1ZmZlci5DSFVOS19TSVpFYCksIGNoZWNrZWQgYWZ0ZXIgZXZlcnkgY2VsbCwgYW5kIGF0XG4gKiB0aGUgZW5kLiBSb3dzIGZyb20gYSBzeW5jaHJvbm91cyBzb3VyY2UgYXJlIHNlcmlhbGl6ZWQgd2l0aG91dCBhblxuICogZXZlbnQtbG9vcCB0dXJuIGluIGJldHdlZW47IHJvd3MgZnJvbSBhbiBhc3luY2hyb25vdXMgc291cmNlIGFyZSBhd2FpdGVkXG4gKiBvbmUgYXQgYSB0aW1lLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrTG9hZFBheWxvYWQgaW1wbGVtZW50cyBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4ge1xuICBkZWNsYXJlIGJ1bGtMb2FkOiBCdWxrTG9hZDtcbiAgZGVjbGFyZSBpdGVyYXRvcjogSXRlcmF0b3I8Um93PiB8IEFzeW5jSXRlcmF0b3I8Um93PjtcbiAgZGVjbGFyZSBwZW5kaW5nOiBJdGVyYXRvclJlc3VsdDxSb3c+IHwgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxSb3c+PiB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEl0ZXJhYmxlPFJvdz4gfCBBc3luY0l0ZXJhYmxlPFJvdz4pIHtcbiAgICB0aGlzLmJ1bGtMb2FkID0gYnVsa0xvYWQ7XG5cbiAgICB0aGlzLml0ZXJhdG9yID0gdHlwZW9mIChyb3dzIGFzIFBhcnRpYWw8QXN5bmNJdGVyYWJsZTxSb3c+PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID09PSAnZnVuY3Rpb24nID9cbiAgICAgIChyb3dzIGFzIEFzeW5jSXRlcmFibGU8Um93PilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkgOlxuICAgICAgKHJvd3MgYXMgSXRlcmFibGU8Um93PilbU3ltYm9sLml0ZXJhdG9yXSgpO1xuXG4gICAgLy8gVGhlIGZpcnN0IHJvdyBpcyByZXF1ZXN0ZWQgbm93LCBiZWZvcmUgdGhlIGBJTlNFUlQgQlVMS2Agc3RhdGVtZW50XG4gICAgLy8gaGFzIGdvbmUgb3V0LiBGb3IgYSBzdHJlYW0gc291cmNlIHRoaXMgaXMgd2hhdCBhdHRhY2hlcyBpdHNcbiAgICAvLyBpdGVyYXRvcidzIGxpc3RlbmVyczogYW4gZXJyb3IgaXQgZW1pdHMgd2hpbGUgdGhlIHN0YXRlbWVudCBpcyBpblxuICAgIC8vIGZsaWdodCBpcyBrZXB0IGFuZCByZXBvcnRlZCBvbiB0aGUgbmV4dCByZWFkLCBpbnN0ZWFkIG9mIGJlaW5nIGFuXG4gICAgLy8gdW5oYW5kbGVkIGAnZXJyb3InYCBldmVudC4gVGhlIHJlYWQgaXMgYXdhaXRlZCB3aGVuIHRoZSByb3dzIGFyZVxuICAgIC8vIHNlcmlhbGl6ZWQ7IGl0cyByZWplY3Rpb24gaXMgbm90IHVuaGFuZGxlZCB1bnRpbCB0aGVuLCBhbmQgbmVpdGhlclxuICAgIC8vIGlzIGEgc3luY2hyb25vdXMgc291cmNlJ3MgdGhyb3csIHdoaWNoIHJlYWNoZXMgdGhlIGJ1bGsgbG9hZCdzXG4gICAgLy8gY2FsbGJhY2sgdGhlIHNhbWUgd2F5LlxuICAgIGxldCBmaXJzdDogSXRlcmF0b3JSZXN1bHQ8Um93PiB8IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Um93Pj47XG4gICAgdHJ5IHtcbiAgICAgIGZpcnN0ID0gdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBmaXJzdCA9IFByb21pc2UucmVqZWN0KGVycik7XG4gICAgfVxuXG4gICAgaWYgKGlzUHJvbWlzZUxpa2UoZmlyc3QpKSB7XG4gICAgICBjb25zdCByZWFkID0gUHJvbWlzZS5yZXNvbHZlKGZpcnN0KTtcbiAgICAgIHJlYWQudGhlbih1bmRlZmluZWQsIGlnbm9yZUVycm9yKTtcbiAgICAgIHRoaXMucGVuZGluZyA9IHJlYWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGVuZGluZyA9IGZpcnN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHJvdyBzb3VyY2Ugb2YgYSBidWxrIGxvYWQgd2hvc2Ugcm93cyB3aWxsIG5vdCBiZSByZWFkOlxuICAgKiB0aGUgYElOU0VSVCBCVUxLYCBzdGF0ZW1lbnQgd2FzIHJlamVjdGVkLCB0aGUgYnVsayBsb2FkIHdhcyBjYW5jZWxlZCxcbiAgICogb3IgdGhlIGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGxvZ2dlZCBpbi4gQmVzdCBlZmZvcnQ6IGEgcmVhZCBzdGlsbFxuICAgKiBwZW5kaW5nIGluIHRoZSBzb3VyY2UgY2Fubm90IGJlIGludGVycnVwdGVkLCBhbmQgYSBjbG9zZSB0aGF0IGZhaWxzXG4gICAqIGhhcyBub3RoaW5nIGxlZnQgdG8gcmVwb3J0IHRvLlxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuICAgIGlmICh0eXBlb2YgaXRlcmF0b3IucmV0dXJuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsb3NpbmcgPSBpdGVyYXRvci5yZXR1cm4oKTtcbiAgICAgIGlmIChpc1Byb21pc2VMaWtlKGNsb3NpbmcpKSB7XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShjbG9zaW5nKS50aGVuKHVuZGVmaW5lZCwgaWdub3JlRXJyb3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm90aGluZyBsZWZ0IHRvIHJlcG9ydCB0by5cbiAgICB9XG4gIH1cblxuICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICBjb25zdCBidWxrTG9hZCA9IHRoaXMuYnVsa0xvYWQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGJ1bGtMb2FkLm9wdGlvbnM7XG4gICAgY29uc3QgY29sdW1ucyA9IGJ1bGtMb2FkLmNvbHVtbnM7XG4gICAgY29uc3QgaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yO1xuXG4gICAgLy8gUGVyIGNvbHVtbiwgbm90IHBlciBjZWxsOiBhIHRleHQgdHlwZSdzIHZhbHVlIGlzIHdyaXR0ZW4gYmVoaW5kIGFcbiAgICAvLyB0ZXh0IHBvaW50ZXIgYW5kIHRpbWVzdGFtcCwgb3IgYXMgYSBudWxsIHBvaW50ZXIuXG4gICAgY29uc3QgaXNUZXh0VHlwZSA9IGNvbHVtbnMubWFwKChjKSA9PiBjLnR5cGUubmFtZSA9PT0gJ1RleHQnIHx8IGMudHlwZS5uYW1lID09PSAnSW1hZ2UnIHx8IGMudHlwZS5uYW1lID09PSAnTlRleHQnKTtcblxuICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG5cbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGxldCBjbG9zZWQgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKGJ1bGtMb2FkLmdldENvbE1ldGFEYXRhKCkpO1xuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5wZW5kaW5nID8/IGl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgdGhpcy5wZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoaXNQcm9taXNlTGlrZShyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBIHJvdyBnaXZlbiBhcyBhIHByb21pc2UgaXMgc2V0dGxlZCBmaXJzdCwgYXMgYFJlYWRhYmxlLmZyb21gXG4gICAgICAgIC8vIHNldHRsZWQgaXQgYmVmb3JlIGhhbmRpbmcgaXQgb24uXG4gICAgICAgIGxldCByb3cgPSByZXN1bHQudmFsdWU7XG4gICAgICAgIGlmIChpc1Byb21pc2VMaWtlKHJvdykpIHtcbiAgICAgICAgICByb3cgPSBhd2FpdCByb3c7XG4gICAgICAgIH1cblxuICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIocm93VG9rZW5CdWZmZXIpO1xuXG4gICAgICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHJvdyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGMgPSBjb2x1bW5zW2ldO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYy50eXBlLnZhbGlkYXRlKGlzQXJyYXkgPyAocm93IGFzIHVua25vd25bXSlbaV0gOiAocm93IGFzIHsgW2NvbE5hbWU6IHN0cmluZ106IHVua25vd24gfSlbYy5vYmpOYW1lXSwgYy5jb2xsYXRpb24pO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1ldGVyID0ge1xuICAgICAgICAgICAgbGVuZ3RoOiBjLmxlbmd0aCxcbiAgICAgICAgICAgIHNjYWxlOiBjLnNjYWxlLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiBjLnByZWNpc2lvbixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBpZiAoaXNUZXh0VHlwZVtpXSAmJiB2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBidWZmZXIud3JpdGVCdWZmZXIodGV4dFBvaW50ZXJOdWxsQnVmZmVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGlzVGV4dFR5cGVbaV0pIHtcbiAgICAgICAgICAgICAgYnVmZmVyLndyaXRlQnVmZmVyKHRleHRQb2ludGVyQW5kVGltZXN0YW1wQnVmZmVyKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgYy50eXBlLndyaXRlVmFsdWUoYnVmZmVyLCBwYXJhbWV0ZXIsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IElucHV0RXJyb3IoYENvbHVtbiAnJHtjLm5hbWV9JyBjb3VsZCBub3QgYmUgc2VyaWFsaXplZGAsIHsgY2F1c2U6IGVycm9yIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENoZWNrZWQgYWZ0ZXIgZXZlcnkgY2VsbCwgbm90IG9ubHkgYWZ0ZXIgZXZlcnkgcm93LCBzbyB0aGF0IGFcbiAgICAgICAgICAvLyB3aWRlIHJvdyBvZiBsYXJnZSBjZWxscyBnb2VzIGRvd25zdHJlYW0gYXMgaXQgaXMgc2VyaWFsaXplZC5cbiAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+PSBXcml0YWJsZVRyYWNraW5nQnVmZmVyLkNIVU5LX1NJWkUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgYnVmZmVyLmdldEJ1ZmZlcnMoKSkge1xuICAgICAgICAgICAgICB5aWVsZCBjaHVuaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlci5jb25zdW1lKGJ1ZmZlci5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQSBmYWlsZWQgcm93IGNsb3NlcyB0aGUgc291cmNlIGFzIGEgYGZvciBhd2FpdGAgd291bGQuIEEgY2xvc2VcbiAgICAgIC8vIHRoYXQgZmFpbHMgbXVzdCBub3QgcmVwbGFjZSB0aGUgcm93IGVycm9yIHRoZSBidWxrIGxvYWQgaXNcbiAgICAgIC8vIGZhaWxpbmcgd2l0aC5cbiAgICAgIGNsb3NlZCA9IHRydWU7XG4gICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGl0ZXJhdG9yLnJldHVybigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBUaGUgcm93IGVycm9yIGlzIHdoYXQgc3VyZmFjZXMuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IGVycjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgLy8gVGhlIGNvbnN1bWVyIHN0b3BwZWQgcHVsbGluZyAoZS5nLiBiZWNhdXNlIHRoZSBidWxrIGxvYWQgd2FzXG4gICAgICAvLyBjYW5jZWxlZCk6IGNsb3NlIHRoZSBzb3VyY2UgYXMgYSBgZm9yIGF3YWl0YCB3b3VsZC5cbiAgICAgIGlmICghZG9uZSAmJiAhY2xvc2VkICYmIHR5cGVvZiBpdGVyYXRvci5yZXR1cm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgYXdhaXQgaXRlcmF0b3IucmV0dXJuKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgYnVmZmVyLndyaXRlQnVmZmVyKGJ1bGtMb2FkLmNyZWF0ZURvbmVUb2tlbigpKTtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGJ1ZmZlci5nZXRCdWZmZXJzKCkpIHtcbiAgICAgIHlpZWxkIGNodW5rO1xuICAgIH1cbiAgICBidWZmZXIuY29uc3VtZShidWZmZXIubGVuZ3RoKTtcbiAgfVxuXG4gIHRvU3RyaW5nKGluZGVudCA9ICcnKSB7XG4gICAgcmV0dXJuIGluZGVudCArICgnQnVsa0xvYWQnKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxJQUFBQSx1QkFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBQXNDLFNBQUFELHVCQUFBSSxDQUFBLFdBQUFBLENBQUEsSUFBQUEsQ0FBQSxDQUFBQyxVQUFBLEdBQUFELENBQUEsS0FBQUUsT0FBQSxFQUFBRixDQUFBO0FBSXRDLE1BQU1HLGNBQWMsR0FBR0MsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBRUMsV0FBVSxDQUFDQyxHQUFHLENBQUUsQ0FBQztBQUN0RCxNQUFNQyw2QkFBNkIsR0FBR0osTUFBTSxDQUFDQyxJQUFJLENBQUM7QUFDaEQ7QUFDQSxJQUFJO0FBRUo7QUFDQSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJO0FBRTlGO0FBQ0EsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FDL0MsQ0FBQztBQUNG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
@@ -1 +1 @@
1
- {"version":3,"file":"bulk-load-payload.js","names":["_writableTrackingBuffer","_interopRequireDefault","require","_token","e","__esModule","default","rowTokenBuffer","Buffer","from","TOKEN_TYPE","ROW","textPointerAndTimestampBuffer","textPointerNullBuffer","isPromiseLike","value","then","ignoreError","BulkLoadPayload","constructor","bulkLoad","rows","iterator","Symbol","asyncIterator","first","next","err","Promise","reject","read","resolve","undefined","pending","close","return","closing","options","columns","isTextType","map","c","type","name","buffer","WritableTrackingBuffer","writeBuffer","getColMetaData","done","closed","result","row","isArray","Array","i","length","validate","objName","collation","parameter","scale","precision","generateParameterLength","chunk","generateParameterData","CHUNK_SIZE","getBuffers","consume","createDoneToken","toString","indent","exports"],"sources":["../src/bulk-load-payload.ts"],"sourcesContent":["import BulkLoad from './bulk-load';\nimport WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\nimport { TYPE as TOKEN_TYPE } from './token/token';\n\nexport type Row = unknown[] | { [colName: string]: unknown };\n\nconst rowTokenBuffer = Buffer.from([ TOKEN_TYPE.ROW ]);\nconst textPointerAndTimestampBuffer = Buffer.from([\n // TextPointer length\n 0x10,\n\n // TextPointer\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n // Timestamp\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n]);\nconst textPointerNullBuffer = Buffer.from([0x00]);\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return value != null && typeof (value as PromiseLike<T>).then === 'function';\n}\n\nfunction ignoreError() {}\n\n/**\n * The TDS byte stream of a bulk load: COLMETADATA, a ROW token per row,\n * and a DONE token at the end, serialized from the bulk load's row source.\n *\n * The payload owns the row source's iterator the way a `for await` loop\n * would: it requests the first row as soon as it is created, so that a\n * stream source is observed from the moment it is handed over, and it\n * closes the source through the iterator's `return()` whenever the bulk\n * load does not run to completion, whether the rows were being read\n * ([[Symbol.asyncIterator]]) or never got to be ([[close]]).\n *\n * Rows are written into one buffer that lives for the whole bulk load.\n * Its contents are yielded once it holds a chunk's worth\n * (`WritableTrackingBuffer.CHUNK_SIZE`), checked after every cell, and at\n * the end. Rows from a synchronous source are serialized without an\n * event-loop turn in between; rows from an asynchronous source are awaited\n * one at a time.\n *\n * @private\n */\nexport class BulkLoadPayload implements AsyncIterable<Buffer> {\n declare bulkLoad: BulkLoad;\n declare iterator: Iterator<Row> | AsyncIterator<Row>;\n declare pending: IteratorResult<Row> | Promise<IteratorResult<Row>> | undefined;\n\n constructor(bulkLoad: BulkLoad, rows: Iterable<Row> | AsyncIterable<Row>) {\n this.bulkLoad = bulkLoad;\n\n this.iterator = typeof (rows as Partial<AsyncIterable<Row>>)[Symbol.asyncIterator] === 'function' ?\n (rows as AsyncIterable<Row>)[Symbol.asyncIterator]() :\n (rows as Iterable<Row>)[Symbol.iterator]();\n\n // The first row is requested now, before the `INSERT BULK` statement\n // has gone out. For a stream source this is what attaches its\n // iterator's listeners: an error it emits while the statement is in\n // flight is kept and reported on the next read, instead of being an\n // unhandled `'error'` event. The read is awaited when the rows are\n // serialized; its rejection is not unhandled until then, and neither\n // is a synchronous source's throw, which reaches the bulk load's\n // callback the same way.\n let first: IteratorResult<Row> | Promise<IteratorResult<Row>>;\n try {\n first = this.iterator.next();\n } catch (err) {\n first = Promise.reject(err);\n }\n\n if (isPromiseLike(first)) {\n const read = Promise.resolve(first);\n read.then(undefined, ignoreError);\n this.pending = read;\n } else {\n this.pending = first;\n }\n }\n\n /**\n * Closes the row source of a bulk load whose rows will not be read:\n * the `INSERT BULK` statement was rejected, the bulk load was canceled,\n * or the connection is no longer logged in. Best effort: a read still\n * pending in the source cannot be interrupted, and a close that fails\n * has nothing left to report to.\n */\n close() {\n const iterator = this.iterator;\n if (typeof iterator.return !== 'function') {\n return;\n }\n\n try {\n const closing = iterator.return();\n if (isPromiseLike(closing)) {\n Promise.resolve(closing).then(undefined, ignoreError);\n }\n } catch {\n // Nothing left to report to.\n }\n }\n\n async *[Symbol.asyncIterator]() {\n const bulkLoad = this.bulkLoad;\n const options = bulkLoad.options;\n const columns = bulkLoad.columns;\n const iterator = this.iterator;\n\n // Per column, not per cell: a text type's value is written behind a\n // text pointer and timestamp, or as a null pointer.\n const isTextType = columns.map((c) => c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText');\n\n const buffer = new WritableTrackingBuffer();\n buffer.writeBuffer(bulkLoad.getColMetaData());\n\n let done = false;\n let closed = false;\n try {\n while (true) {\n let result = this.pending ?? iterator.next();\n this.pending = undefined;\n if (isPromiseLike(result)) {\n result = await result;\n }\n\n if (result.done) {\n done = true;\n break;\n }\n\n // A row given as a promise is settled first, as `Readable.from`\n // settled it before handing it on.\n let row = result.value;\n if (isPromiseLike(row)) {\n row = await row;\n }\n\n buffer.writeBuffer(rowTokenBuffer);\n\n const isArray = Array.isArray(row);\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n const value = c.type.validate(isArray ? (row as unknown[])[i] : (row as { [colName: string]: unknown })[c.objName], c.collation);\n\n const parameter = {\n length: c.length,\n scale: c.scale,\n precision: c.precision,\n value: value\n };\n\n if (isTextType[i] && value == null) {\n buffer.writeBuffer(textPointerNullBuffer);\n } else {\n if (isTextType[i]) {\n buffer.writeBuffer(textPointerAndTimestampBuffer);\n }\n\n buffer.writeBuffer(c.type.generateParameterLength(parameter, options));\n for (const chunk of c.type.generateParameterData(parameter, options)) {\n buffer.writeBuffer(chunk);\n }\n }\n\n // Checked after every cell, not only after every row, so that a\n // wide row of large cells goes downstream as it is serialized.\n if (buffer.length >= WritableTrackingBuffer.CHUNK_SIZE) {\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n }\n }\n } catch (err) {\n // A failed row closes the source as a `for await` would. A close\n // that fails must not replace the row error the bulk load is\n // failing with.\n closed = true;\n if (typeof iterator.return === 'function') {\n try {\n await iterator.return();\n } catch {\n // The row error is what surfaces.\n }\n }\n throw err;\n } finally {\n // The consumer stopped pulling (e.g. because the bulk load was\n // canceled): close the source as a `for await` would.\n if (!done && !closed && typeof iterator.return === 'function') {\n await iterator.return();\n }\n }\n\n buffer.writeBuffer(bulkLoad.createDoneToken());\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n\n toString(indent = '') {\n return indent + ('BulkLoad');\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"bulk-load-payload.js","names":["_writableTrackingBuffer","_interopRequireDefault","require","_token","_errors","e","__esModule","default","rowTokenBuffer","Buffer","from","TOKEN_TYPE","ROW","textPointerAndTimestampBuffer","textPointerNullBuffer","isPromiseLike","value","then","ignoreError","BulkLoadPayload","constructor","bulkLoad","rows","iterator","Symbol","asyncIterator","first","next","err","Promise","reject","read","resolve","undefined","pending","close","return","closing","options","columns","isTextType","map","c","type","name","buffer","WritableTrackingBuffer","done","closed","writeBuffer","getColMetaData","result","row","isArray","Array","i","length","validate","objName","collation","parameter","scale","precision","writeValue","error","InputError","cause","CHUNK_SIZE","chunk","getBuffers","consume","createDoneToken","toString","indent","exports"],"sources":["../src/bulk-load-payload.ts"],"sourcesContent":["import BulkLoad from './bulk-load';\nimport WritableTrackingBuffer from './tracking-buffer/writable-tracking-buffer';\nimport { TYPE as TOKEN_TYPE } from './token/token';\nimport { InputError } from './errors';\n\nexport type Row = unknown[] | { [colName: string]: unknown };\n\nconst rowTokenBuffer = Buffer.from([ TOKEN_TYPE.ROW ]);\nconst textPointerAndTimestampBuffer = Buffer.from([\n // TextPointer length\n 0x10,\n\n // TextPointer\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n\n // Timestamp\n 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n]);\nconst textPointerNullBuffer = Buffer.from([0x00]);\n\nfunction isPromiseLike<T>(value: T | PromiseLike<T>): value is PromiseLike<T> {\n return value != null && typeof (value as PromiseLike<T>).then === 'function';\n}\n\nfunction ignoreError() {}\n\n/**\n * The TDS byte stream of a bulk load: COLMETADATA, a ROW token per row,\n * and a DONE token at the end, serialized from the bulk load's row source.\n *\n * The payload owns the row source's iterator the way a `for await` loop\n * would: it requests the first row as soon as it is created, so that a\n * stream source is observed from the moment it is handed over, and it\n * closes the source through the iterator's `return()` whenever the bulk\n * load does not run to completion, whether the rows were being read\n * ([[Symbol.asyncIterator]]) or never got to be ([[close]]).\n *\n * Rows are written into one buffer that lives for the whole bulk load.\n * Its contents are yielded once it holds a chunk's worth\n * (`WritableTrackingBuffer.CHUNK_SIZE`), checked after every cell, and at\n * the end. Rows from a synchronous source are serialized without an\n * event-loop turn in between; rows from an asynchronous source are awaited\n * one at a time.\n *\n * @private\n */\nexport class BulkLoadPayload implements AsyncIterable<Buffer> {\n declare bulkLoad: BulkLoad;\n declare iterator: Iterator<Row> | AsyncIterator<Row>;\n declare pending: IteratorResult<Row> | Promise<IteratorResult<Row>> | undefined;\n\n constructor(bulkLoad: BulkLoad, rows: Iterable<Row> | AsyncIterable<Row>) {\n this.bulkLoad = bulkLoad;\n\n this.iterator = typeof (rows as Partial<AsyncIterable<Row>>)[Symbol.asyncIterator] === 'function' ?\n (rows as AsyncIterable<Row>)[Symbol.asyncIterator]() :\n (rows as Iterable<Row>)[Symbol.iterator]();\n\n // The first row is requested now, before the `INSERT BULK` statement\n // has gone out. For a stream source this is what attaches its\n // iterator's listeners: an error it emits while the statement is in\n // flight is kept and reported on the next read, instead of being an\n // unhandled `'error'` event. The read is awaited when the rows are\n // serialized; its rejection is not unhandled until then, and neither\n // is a synchronous source's throw, which reaches the bulk load's\n // callback the same way.\n let first: IteratorResult<Row> | Promise<IteratorResult<Row>>;\n try {\n first = this.iterator.next();\n } catch (err) {\n first = Promise.reject(err);\n }\n\n if (isPromiseLike(first)) {\n const read = Promise.resolve(first);\n read.then(undefined, ignoreError);\n this.pending = read;\n } else {\n this.pending = first;\n }\n }\n\n /**\n * Closes the row source of a bulk load whose rows will not be read:\n * the `INSERT BULK` statement was rejected, the bulk load was canceled,\n * or the connection is no longer logged in. Best effort: a read still\n * pending in the source cannot be interrupted, and a close that fails\n * has nothing left to report to.\n */\n close() {\n const iterator = this.iterator;\n if (typeof iterator.return !== 'function') {\n return;\n }\n\n try {\n const closing = iterator.return();\n if (isPromiseLike(closing)) {\n Promise.resolve(closing).then(undefined, ignoreError);\n }\n } catch {\n // Nothing left to report to.\n }\n }\n\n async *[Symbol.asyncIterator]() {\n const bulkLoad = this.bulkLoad;\n const options = bulkLoad.options;\n const columns = bulkLoad.columns;\n const iterator = this.iterator;\n\n // Per column, not per cell: a text type's value is written behind a\n // text pointer and timestamp, or as a null pointer.\n const isTextType = columns.map((c) => c.type.name === 'Text' || c.type.name === 'Image' || c.type.name === 'NText');\n\n const buffer = new WritableTrackingBuffer();\n\n let done = false;\n let closed = false;\n try {\n buffer.writeBuffer(bulkLoad.getColMetaData());\n\n while (true) {\n let result = this.pending ?? iterator.next();\n this.pending = undefined;\n if (isPromiseLike(result)) {\n result = await result;\n }\n\n if (result.done) {\n done = true;\n break;\n }\n\n // A row given as a promise is settled first, as `Readable.from`\n // settled it before handing it on.\n let row = result.value;\n if (isPromiseLike(row)) {\n row = await row;\n }\n\n buffer.writeBuffer(rowTokenBuffer);\n\n const isArray = Array.isArray(row);\n for (let i = 0; i < columns.length; i++) {\n const c = columns[i];\n const value = c.type.validate(isArray ? (row as unknown[])[i] : (row as { [colName: string]: unknown })[c.objName], c.collation);\n\n const parameter = {\n length: c.length,\n scale: c.scale,\n precision: c.precision,\n value: value\n };\n\n if (isTextType[i] && value == null) {\n buffer.writeBuffer(textPointerNullBuffer);\n } else {\n if (isTextType[i]) {\n buffer.writeBuffer(textPointerAndTimestampBuffer);\n }\n\n try {\n c.type.writeValue(buffer, parameter, options);\n } catch (error) {\n throw new InputError(`Column '${c.name}' could not be serialized`, { cause: error });\n }\n }\n\n // Checked after every cell, not only after every row, so that a\n // wide row of large cells goes downstream as it is serialized.\n if (buffer.length >= WritableTrackingBuffer.CHUNK_SIZE) {\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n }\n }\n } catch (err) {\n // A failed row closes the source as a `for await` would. A close\n // that fails must not replace the row error the bulk load is\n // failing with.\n closed = true;\n if (typeof iterator.return === 'function') {\n try {\n await iterator.return();\n } catch {\n // The row error is what surfaces.\n }\n }\n throw err;\n } finally {\n // The consumer stopped pulling (e.g. because the bulk load was\n // canceled): close the source as a `for await` would.\n if (!done && !closed && typeof iterator.return === 'function') {\n await iterator.return();\n }\n }\n\n buffer.writeBuffer(bulkLoad.createDoneToken());\n for (const chunk of buffer.getBuffers()) {\n yield chunk;\n }\n buffer.consume(buffer.length);\n }\n\n toString(indent = '') {\n return indent + ('BulkLoad');\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/lib/bulk-load.js CHANGED
@@ -7,6 +7,7 @@ exports.default = void 0;
7
7
  var _events = require("events");
8
8
  var _writableTrackingBuffer = _interopRequireDefault(require("./tracking-buffer/writable-tracking-buffer"));
9
9
  var _token = require("./token/token");
10
+ var _errors = require("./errors");
10
11
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
12
  /**
12
13
  * @private
@@ -225,10 +226,14 @@ class BulkLoad extends _events.EventEmitter {
225
226
  nullable: nullable,
226
227
  collation: this.collation
227
228
  };
228
- if ((type.id & 0x30) === 0x20) {
229
- if (column.length == null && type.resolveLength) {
230
- column.length = type.resolveLength(column);
231
- }
229
+
230
+ // Note: this is deliberately not keyed off the legacy variable-length
231
+ // type id bit pattern ((type.id & 0x30) === 0x20), as that pattern does
232
+ // not hold for type ids introduced in TDS 7.2 and later (e.g. XMLTYPE
233
+ // 0xF1 or VECTORTYPE 0xF5). A type has a length whenever it can resolve
234
+ // one, mirroring how precision and scale are resolved below.
235
+ if (column.length == null && type.resolveLength) {
236
+ column.length = type.resolveLength(column);
232
237
  }
233
238
  if (type.resolvePrecision && column.precision == null) {
234
239
  column.precision = type.resolvePrecision(column);
@@ -345,7 +350,13 @@ class BulkLoad extends _events.EventEmitter {
345
350
  tBuf.writeUInt16LE(flags);
346
351
 
347
352
  // TYPE_INFO
348
- tBuf.writeBuffer(c.type.generateTypeInfo(c, this.options));
353
+ try {
354
+ c.type.writeTypeInfo(tBuf, c, this.options);
355
+ } catch (error) {
356
+ throw new _errors.InputError(`Column '${c.name}' could not be serialized`, {
357
+ cause: error
358
+ });
359
+ }
349
360
 
350
361
  // TableName
351
362
  if (c.type.hasTableName) {
@@ -402,4 +413,4 @@ class BulkLoad extends _events.EventEmitter {
402
413
  }
403
414
  var _default = exports.default = BulkLoad;
404
415
  module.exports = BulkLoad;
405
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl93cml0YWJsZVRyYWNraW5nQnVmZmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl90b2tlbiIsImUiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsIkZMQUdTIiwibnVsbGFibGUiLCJjYXNlU2VuIiwidXBkYXRlYWJsZVJlYWRXcml0ZSIsInVwZGF0ZWFibGVVbmtub3duIiwiaWRlbnRpdHkiLCJjb21wdXRlZCIsImZpeGVkTGVuQ0xSVHlwZSIsInNwYXJzZUNvbHVtblNldCIsImhpZGRlbiIsImtleSIsIm51bGxhYmxlVW5rbm93biIsIkRPTkVfU1RBVFVTIiwiRklOQUwiLCJNT1JFIiwiRVJST1IiLCJJTlhBQ1QiLCJDT1VOVCIsIkFUVE4iLCJTUlZFUlJPUiIsIkJ1bGtMb2FkIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJ0YWJsZSIsImNvbGxhdGlvbiIsImNvbm5lY3Rpb25PcHRpb25zIiwiY2hlY2tDb25zdHJhaW50cyIsImZpcmVUcmlnZ2VycyIsImtlZXBOdWxscyIsImxvY2tUYWJsZSIsIm9yZGVyIiwiY2FsbGJhY2siLCJUeXBlRXJyb3IiLCJjb2x1bW4iLCJkaXJlY3Rpb24iLCJPYmplY3QiLCJlbnRyaWVzIiwiZXJyb3IiLCJ1bmRlZmluZWQiLCJjYW5jZWxlZCIsImV4ZWN1dGlvblN0YXJ0ZWQiLCJvcHRpb25zIiwiY29sdW1ucyIsImNvbHVtbnNCeU5hbWUiLCJidWxrT3B0aW9ucyIsImFkZENvbHVtbiIsIm5hbWUiLCJ0eXBlIiwib3V0cHV0IiwibGVuZ3RoIiwicHJlY2lzaW9uIiwic2NhbGUiLCJvYmpOYW1lIiwiRXJyb3IiLCJ2YWx1ZSIsImlkIiwicmVzb2x2ZUxlbmd0aCIsInJlc29sdmVQcmVjaXNpb24iLCJyZXNvbHZlU2NhbGUiLCJwdXNoIiwiZ2V0T3B0aW9uc1NxbCIsImFkZE9wdGlvbnMiLCJvcmRlckNvbHVtbnMiLCJqb2luIiwiZ2V0QnVsa0luc2VydFNxbCIsInNxbCIsImkiLCJsZW4iLCJjIiwiZGVjbGFyYXRpb24iLCJnZXRUYWJsZUNyZWF0aW9uU3FsIiwiZ2V0Q29sTWV0YURhdGEiLCJ0QnVmIiwiV3JpdGFibGVUcmFja2luZ0J1ZmZlciIsIndyaXRlVUludDgiLCJUT0tFTl9UWVBFIiwiQ09MTUVUQURBVEEiLCJ3cml0ZVVJbnQxNkxFIiwiaiIsInRkc1ZlcnNpb24iLCJ3cml0ZVVJbnQzMkxFIiwiZmxhZ3MiLCJ3cml0ZUJ1ZmZlciIsImdlbmVyYXRlVHlwZUluZm8iLCJoYXNUYWJsZU5hbWUiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlQlZhcmNoYXIiLCJkYXRhIiwic2V0VGltZW91dCIsInRpbWVvdXQiLCJjcmVhdGVEb25lVG9rZW4iLCJET05FIiwic3RhdHVzIiwiY2FuY2VsIiwiZW1pdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5pbXBvcnQgQ29ubmVjdGlvbiwgeyB0eXBlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuXG5pbXBvcnQgeyBUWVBFIGFzIFRPS0VOX1RZUEUgfSBmcm9tICcuL3Rva2VuL3Rva2VuJztcblxuaW1wb3J0IHsgdHlwZSBEYXRhVHlwZSwgdHlwZSBQYXJhbWV0ZXIgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBDb2xsYXRpb24gfSBmcm9tICcuL2NvbGxhdGlvbic7XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRkxBR1MgPSB7XG4gIG51bGxhYmxlOiAxIDw8IDAsXG4gIGNhc2VTZW46IDEgPDwgMSxcbiAgdXBkYXRlYWJsZVJlYWRXcml0ZTogMSA8PCAyLFxuICB1cGRhdGVhYmxlVW5rbm93bjogMSA8PCAzLFxuICBpZGVudGl0eTogMSA8PCA0LFxuICBjb21wdXRlZDogMSA8PCA1LCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAgZml4ZWRMZW5DTFJUeXBlOiAxIDw8IDgsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBzcGFyc2VDb2x1bW5TZXQ6IDEgPDwgMTAsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMy5CXG4gIGhpZGRlbjogMSA8PCAxMywgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIGtleTogMSA8PCAxNCwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIG51bGxhYmxlVW5rbm93bjogMSA8PCAxNSAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbn07XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgRE9ORV9TVEFUVVMgPSB7XG4gIEZJTkFMOiAweDAwLFxuICBNT1JFOiAweDEsXG4gIEVSUk9SOiAweDIsXG4gIElOWEFDVDogMHg0LFxuICBDT1VOVDogMHgxMCxcbiAgQVRUTjogMHgyMCxcbiAgU1JWRVJST1I6IDB4MTAwXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmludGVyZmFjZSBJbnRlcm5hbE9wdGlvbnMge1xuICBjaGVja0NvbnN0cmFpbnRzOiBib29sZWFuO1xuICBmaXJlVHJpZ2dlcnM6IGJvb2xlYW47XG4gIGtlZXBOdWxsczogYm9vbGVhbjtcbiAgbG9ja1RhYmxlOiBib29sZWFuO1xuICBvcmRlcjogeyBbY29sdW1uTmFtZTogc3RyaW5nXTogJ0FTQycgfCAnREVTQycgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcHRpb25zIHtcbiAgLyoqXG4gICAqIEhvbm9ycyBjb25zdHJhaW50cyBkdXJpbmcgYnVsayBsb2FkLCB1c2luZyBULVNRTFxuICAgKiBbQ0hFQ0tfQ09OU1RSQUlOVFNdKGh0dHBzOi8vdGVjaG5ldC5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODYyNDcodj1zcWwuMTA1KS5hc3B4KS5cbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBjaGVja0NvbnN0cmFpbnRzPzogSW50ZXJuYWxPcHRpb25zWydjaGVja0NvbnN0cmFpbnRzJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvbm9ycyBpbnNlcnQgdHJpZ2dlcnMgZHVyaW5nIGJ1bGsgbG9hZCwgdXNpbmcgdGhlIFQtU1FMIFtGSVJFX1RSSUdHRVJTXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3NjQwKHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZmlyZVRyaWdnZXJzPzogSW50ZXJuYWxPcHRpb25zWydmaXJlVHJpZ2dlcnMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogSG9ub3JzIG51bGwgdmFsdWUgcGFzc2VkLCBpZ25vcmVzIHRoZSBkZWZhdWx0IHZhbHVlcyBzZXQgb24gdGFibGUsIHVzaW5nIFQtU1FMIFtLRUVQX05VTExTXShodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg3ODg3KHY9c3FsLjEyMCkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAga2VlcE51bGxzPzogSW50ZXJuYWxPcHRpb25zWydrZWVwTnVsbHMnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUGxhY2VzIGEgYnVsayB1cGRhdGUoQlUpIGxvY2sgb24gdGFibGUgd2hpbGUgcGVyZm9ybWluZyBidWxrIGxvYWQsIHVzaW5nIFQtU1FMIFtUQUJMT0NLXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTgwODc2KHY9c3FsLjEwNSkuYXNweCkuIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgbG9ja1RhYmxlPzogSW50ZXJuYWxPcHRpb25zWydsb2NrVGFibGUnXSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGF0YSB0byBwb3NzaWJseSBpbmNyZWFzZSBidWxrIGluc2VydCBwZXJmb3JtYW5jZSwgdXNpbmcgVC1TUUwgW09SREVSXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9wcmV2aW91cy12ZXJzaW9ucy9zcWwvc3FsLXNlcnZlci0yMDA4LXIyL21zMTc3NDY4KHY9c3FsLjEwNSkpLiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIG9yZGVyPzogSW50ZXJuYWxPcHRpb25zWydvcmRlciddIHwgdW5kZWZpbmVkO1xufVxuXG5cbmV4cG9ydCB0eXBlIENhbGxiYWNrID1cbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIFtbQnVsa0xvYWRdXSBmaW5pc2hlcyBleGVjdXRpbmcuXG4gICAqXG4gICAqIEBwYXJhbSByb3dDb3VudCB0aGUgbnVtYmVyIG9mIHJvd3MgaW5zZXJ0ZWRcbiAgICovXG4gIChlcnI6IEVycm9yIHwgdW5kZWZpbmVkIHwgbnVsbCwgcm93Q291bnQ/OiBudW1iZXIpID0+IHZvaWQ7XG5cbmludGVyZmFjZSBDb2x1bW4gZXh0ZW5kcyBQYXJhbWV0ZXIge1xuICBvYmpOYW1lOiBzdHJpbmc7XG4gIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xufVxuXG5pbnRlcmZhY2UgQ29sdW1uT3B0aW9ucyB7XG4gIG91dHB1dD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciBWYXJDaGFyLCBOVmFyQ2hhciwgVmFyQmluYXJ5LiBVc2UgbGVuZ3RoIGFzIGBJbmZpbml0eWAgZm9yIFZhckNoYXIobWF4KSwgTlZhckNoYXIobWF4KSBhbmQgVmFyQmluYXJ5KG1heCkuXG4gICAqL1xuICBsZW5ndGg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZvciBOdW1lcmljLCBEZWNpbWFsLlxuICAgKi9cbiAgcHJlY2lzaW9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgICovXG4gIHNjYWxlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0sIHRoZW4geW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICovXG4gIG9iak5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBjb2x1bW4gYWNjZXB0cyBOVUxMIHZhbHVlcy5cbiAgICovXG4gIG51bGxhYmxlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIEJ1bGtMb2FkIGluc3RhbmNlIGlzIHVzZWQgdG8gcGVyZm9ybSBhIGJ1bGsgaW5zZXJ0LlxuICpcbiAqIFVzZSBbW0Nvbm5lY3Rpb24ubmV3QnVsa0xvYWRdXSB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2UsIGFuZCBbW0Nvbm5lY3Rpb24uZXhlY0J1bGtMb2FkXV0gdG8gZXhlY3V0ZSBpdC5cbiAqXG4gKiBFeGFtcGxlIG9mIEJ1bGtMb2FkIFVzYWdlczpcbiAqXG4gKiBgYGBqc1xuICogLy8gb3B0aW9uYWwgQnVsa0xvYWQgb3B0aW9uc1xuICogY29uc3Qgb3B0aW9ucyA9IHsga2VlcE51bGxzOiB0cnVlIH07XG4gKlxuICogLy8gaW5zdGFudGlhdGUgLSBwcm92aWRlIHRoZSB0YWJsZSB3aGVyZSB5b3UnbGwgYmUgaW5zZXJ0aW5nIHRvLCBvcHRpb25zIGFuZCBhIGNhbGxiYWNrXG4gKiBjb25zdCBidWxrTG9hZCA9IGNvbm5lY3Rpb24ubmV3QnVsa0xvYWQoJ015VGFibGUnLCBvcHRpb25zLCAoZXJyb3IsIHJvd0NvdW50KSA9PiB7XG4gKiAgIGNvbnNvbGUubG9nKCdpbnNlcnRlZCAlZCByb3dzJywgcm93Q291bnQpO1xuICogfSk7XG4gKlxuICogLy8gc2V0dXAgeW91ciBjb2x1bW5zIC0gYWx3YXlzIGluZGljYXRlIHdoZXRoZXIgdGhlIGNvbHVtbiBpcyBudWxsYWJsZVxuICogYnVsa0xvYWQuYWRkQ29sdW1uKCdteUludCcsIFRZUEVTLkludCwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gKiBidWxrTG9hZC5hZGRDb2x1bW4oJ215U3RyaW5nJywgVFlQRVMuTlZhckNoYXIsIHsgbGVuZ3RoOiA1MCwgbnVsbGFibGU6IHRydWUgfSk7XG4gKlxuICogLy8gZXhlY3V0ZVxuICogY29ubmVjdGlvbi5leGVjQnVsa0xvYWQoYnVsa0xvYWQsIFtcbiAqICAgeyBteUludDogNywgbXlTdHJpbmc6ICdoZWxsbycgfSxcbiAqICAgeyBteUludDogMjMsIG15U3RyaW5nOiAnd29ybGQnIH1cbiAqIF0pO1xuICogYGBgXG4gKi9cbmNsYXNzIEJ1bGtMb2FkIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGNhbmNlbGVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgZXhlY3V0aW9uU3RhcnRlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgdGFibGU6IHN0cmluZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHRpbWVvdXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgb3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGNhbGxiYWNrOiBDYWxsYmFjaztcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgY29sdW1uczogQXJyYXk8Q29sdW1uPjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGNvbHVtbnNCeU5hbWU6IHsgW25hbWU6IHN0cmluZ106IENvbHVtbiB9O1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBidWxrT3B0aW9uczogSW50ZXJuYWxPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjb25uZWN0aW9uOiBDb25uZWN0aW9uIHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgcm93czogQXJyYXk8YW55PiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHJzdDogQXJyYXk8YW55PiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHJvd0NvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgZGVjbGFyZSBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHRhYmxlOiBzdHJpbmcsIGNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkLCBjb25uZWN0aW9uT3B0aW9uczogSW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywge1xuICAgIGNoZWNrQ29uc3RyYWludHMgPSBmYWxzZSxcbiAgICBmaXJlVHJpZ2dlcnMgPSBmYWxzZSxcbiAgICBrZWVwTnVsbHMgPSBmYWxzZSxcbiAgICBsb2NrVGFibGUgPSBmYWxzZSxcbiAgICBvcmRlciA9IHt9LFxuICB9OiBPcHRpb25zLCBjYWxsYmFjazogQ2FsbGJhY2spIHtcbiAgICBpZiAodHlwZW9mIGNoZWNrQ29uc3RyYWludHMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5jaGVja0NvbnN0cmFpbnRzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmaXJlVHJpZ2dlcnMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5maXJlVHJpZ2dlcnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGtlZXBOdWxscyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLmtlZXBOdWxsc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbG9ja1RhYmxlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMubG9ja1RhYmxlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvcmRlciAhPT0gJ29iamVjdCcgfHwgb3JkZXIgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMub3JkZXJcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LicpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhvcmRlcikpIHtcbiAgICAgIGlmIChkaXJlY3Rpb24gIT09ICdBU0MnICYmIGRpcmVjdGlvbiAhPT0gJ0RFU0MnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBvZiB0aGUgXCInICsgY29sdW1uICsgJ1wiIGtleSBpbiB0aGUgXCJvcHRpb25zLm9yZGVyXCIgb2JqZWN0IG11c3QgYmUgZWl0aGVyIFwiQVNDXCIgb3IgXCJERVNDXCIuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3VwZXIoKTtcblxuICAgIHRoaXMuZXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5jYW5jZWxlZCA9IGZhbHNlO1xuICAgIHRoaXMuZXhlY3V0aW9uU3RhcnRlZCA9IGZhbHNlO1xuXG4gICAgdGhpcy5jb2xsYXRpb24gPSBjb2xsYXRpb247XG5cbiAgICB0aGlzLnRhYmxlID0gdGFibGU7XG4gICAgdGhpcy5vcHRpb25zID0gY29ubmVjdGlvbk9wdGlvbnM7XG4gICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgIHRoaXMuY29sdW1ucyA9IFtdO1xuICAgIHRoaXMuY29sdW1uc0J5TmFtZSA9IHt9O1xuXG4gICAgdGhpcy5idWxrT3B0aW9ucyA9IHsgY2hlY2tDb25zdHJhaW50cywgZmlyZVRyaWdnZXJzLCBrZWVwTnVsbHMsIGxvY2tUYWJsZSwgb3JkZXIgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBidWxrIGxvYWQuXG4gICAqXG4gICAqIFRoZSBjb2x1bW4gZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIHRoZSB0YWJsZSB5b3UgYXJlIHRyeWluZyB0byBpbnNlcnQgaW50by5cbiAgICogQXR0ZW1wdGluZyB0byBjYWxsIGFkZENvbHVtbiBhZnRlciB0aGUgZmlyc3Qgcm93IGhhcyBiZWVuIGFkZGVkIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ015SW50Q29sdW1uJywgVFlQRVMuSW50LCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB0eXBlIE9uZSBvZiB0aGUgc3VwcG9ydGVkIGBkYXRhIHR5cGVzYC5cbiAgICogQHBhcmFtIF9fbmFtZWRQYXJhbWV0ZXJzIEFkZGl0aW9uYWwgY29sdW1uIHR5cGUgaW5mb3JtYXRpb24uIEF0IGEgbWluaW11bSwgYG51bGxhYmxlYCBtdXN0IGJlIHNldCB0byB0cnVlIG9yIGZhbHNlLlxuICAgKiBAcGFyYW0gbGVuZ3RoIEZvciBWYXJDaGFyLCBOVmFyQ2hhciwgVmFyQmluYXJ5LiBVc2UgbGVuZ3RoIGFzIGBJbmZpbml0eWAgZm9yIFZhckNoYXIobWF4KSwgTlZhckNoYXIobWF4KSBhbmQgVmFyQmluYXJ5KG1heCkuXG4gICAqIEBwYXJhbSBudWxsYWJsZSBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29sdW1uIGFjY2VwdHMgTlVMTCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBvYmpOYW1lIElmIHRoZSBuYW1lIG9mIHRoZSBjb2x1bW4gaXMgZGlmZmVyZW50IGZyb20gdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGZvdW5kIG9uIGByb3dPYmpgIGFyZ3VtZW50cyBwYXNzZWQgdG8gW1thZGRSb3ddXSBvciBbW0Nvbm5lY3Rpb24uZXhlY0J1bGtMb2FkXV0sIHRoZW4geW91IGNhbiB1c2UgdGhpcyBvcHRpb24gdG8gc3BlY2lmeSB0aGUgcHJvcGVydHkgbmFtZS5cbiAgICogQHBhcmFtIHByZWNpc2lvbiBGb3IgTnVtZXJpYywgRGVjaW1hbC5cbiAgICogQHBhcmFtIHNjYWxlIEZvciBOdW1lcmljLCBEZWNpbWFsLCBUaW1lLCBEYXRlVGltZTIsIERhdGVUaW1lT2Zmc2V0LlxuICAqL1xuICBhZGRDb2x1bW4obmFtZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSwgeyBvdXRwdXQgPSBmYWxzZSwgbGVuZ3RoLCBwcmVjaXNpb24sIHNjYWxlLCBvYmpOYW1lID0gbmFtZSwgbnVsbGFibGUgPSB0cnVlIH06IENvbHVtbk9wdGlvbnMpIHtcbiAgICBpZiAodGhpcy5leGVjdXRpb25TdGFydGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbHVtbnMgY2Fubm90IGJlIGFkZGVkIHRvIGJ1bGsgaW5zZXJ0IGFmdGVyIGV4ZWN1dGlvbiBoYXMgc3RhcnRlZC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW46IENvbHVtbiA9IHtcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBuYW1lOiBuYW1lLFxuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBvdXRwdXQ6IG91dHB1dCxcbiAgICAgIGxlbmd0aDogbGVuZ3RoLFxuICAgICAgcHJlY2lzaW9uOiBwcmVjaXNpb24sXG4gICAgICBzY2FsZTogc2NhbGUsXG4gICAgICBvYmpOYW1lOiBvYmpOYW1lLFxuICAgICAgbnVsbGFibGU6IG51bGxhYmxlLFxuICAgICAgY29sbGF0aW9uOiB0aGlzLmNvbGxhdGlvblxuICAgIH07XG5cbiAgICBpZiAoKHR5cGUuaWQgJiAweDMwKSA9PT0gMHgyMCkge1xuICAgICAgaWYgKGNvbHVtbi5sZW5ndGggPT0gbnVsbCAmJiB0eXBlLnJlc29sdmVMZW5ndGgpIHtcbiAgICAgICAgY29sdW1uLmxlbmd0aCA9IHR5cGUucmVzb2x2ZUxlbmd0aChjb2x1bW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlLnJlc29sdmVQcmVjaXNpb24gJiYgY29sdW1uLnByZWNpc2lvbiA9PSBudWxsKSB7XG4gICAgICBjb2x1bW4ucHJlY2lzaW9uID0gdHlwZS5yZXNvbHZlUHJlY2lzaW9uKGNvbHVtbik7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUucmVzb2x2ZVNjYWxlICYmIGNvbHVtbi5zY2FsZSA9PSBudWxsKSB7XG4gICAgICBjb2x1bW4uc2NhbGUgPSB0eXBlLnJlc29sdmVTY2FsZShjb2x1bW4pO1xuICAgIH1cblxuICAgIHRoaXMuY29sdW1ucy5wdXNoKGNvbHVtbik7XG5cbiAgICB0aGlzLmNvbHVtbnNCeU5hbWVbbmFtZV0gPSBjb2x1bW47XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldE9wdGlvbnNTcWwoKSB7XG4gICAgY29uc3QgYWRkT3B0aW9ucyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMuY2hlY2tDb25zdHJhaW50cykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdDSEVDS19DT05TVFJBSU5UUycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmZpcmVUcmlnZ2Vycykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdGSVJFX1RSSUdHRVJTJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMua2VlcE51bGxzKSB7XG4gICAgICBhZGRPcHRpb25zLnB1c2goJ0tFRVBfTlVMTFMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5sb2NrVGFibGUpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnVEFCTE9DSycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLm9yZGVyKSB7XG4gICAgICBjb25zdCBvcmRlckNvbHVtbnMgPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBbY29sdW1uLCBkaXJlY3Rpb25dIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuYnVsa09wdGlvbnMub3JkZXIpKSB7XG4gICAgICAgIG9yZGVyQ29sdW1ucy5wdXNoKGAke2NvbHVtbn0gJHtkaXJlY3Rpb259YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvcmRlckNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGFkZE9wdGlvbnMucHVzaChgT1JERVIgKCR7b3JkZXJDb2x1bW5zLmpvaW4oJywgJyl9KWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhZGRPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBgIFdJVEggKCR7YWRkT3B0aW9ucy5qb2luKCcsJyl9KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldEJ1bGtJbnNlcnRTcWwoKSB7XG4gICAgbGV0IHNxbCA9ICdpbnNlcnQgYnVsayAnICsgdGhpcy50YWJsZSArICcoJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgc3FsICs9ICcsICc7XG4gICAgICB9XG4gICAgICBzcWwgKz0gJ1snICsgYy5uYW1lICsgJ10gJyArIChjLnR5cGUuZGVjbGFyYXRpb24oYykpO1xuICAgIH1cbiAgICBzcWwgKz0gJyknO1xuXG4gICAgc3FsICs9IHRoaXMuZ2V0T3B0aW9uc1NxbCgpO1xuICAgIHJldHVybiBzcWw7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyBzaW1wbHkgYSBoZWxwZXIgdXRpbGl0eSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgYENSRUFURSBUQUJMRSBTUUxgIHN0YXRlbWVudCBiYXNlZCBvbiB0aGUgY29sdW1ucyBhZGRlZCB0byB0aGUgYnVsa0xvYWQgb2JqZWN0LlxuICAgKiBUaGlzIG1heSBiZSBwYXJ0aWN1bGFybHkgaGFuZHkgd2hlbiB5b3Ugd2FudCB0byBpbnNlcnQgaW50byBhIHRlbXBvcmFyeSB0YWJsZSAoYSB0YWJsZSB3aGljaCBzdGFydHMgd2l0aCBgI2ApLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiB2YXIgc3FsID0gYnVsa0xvYWQuZ2V0VGFibGVDcmVhdGlvblNxbCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQSBzaWRlIG5vdGUgb24gYnVsayBpbnNlcnRpbmcgaW50byB0ZW1wb3JhcnkgdGFibGVzOiBpZiB5b3Ugd2FudCB0byBhY2Nlc3MgYSBsb2NhbCB0ZW1wb3JhcnkgdGFibGUgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBidWxrIGxvYWQsXG4gICAqIHlvdSdsbCBuZWVkIHRvIHVzZSB0aGUgc2FtZSBjb25uZWN0aW9uIGFuZCBleGVjdXRlIHlvdXIgcmVxdWVzdHMgdXNpbmcgW1tDb25uZWN0aW9uLmV4ZWNTcWxCYXRjaF1dIGluc3RlYWQgb2YgW1tDb25uZWN0aW9uLmV4ZWNTcWxdXVxuICAgKi9cbiAgZ2V0VGFibGVDcmVhdGlvblNxbCgpIHtcbiAgICBsZXQgc3FsID0gJ0NSRUFURSBUQUJMRSAnICsgdGhpcy50YWJsZSArICcoXFxuJztcbiAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2ldO1xuICAgICAgaWYgKGkgIT09IDApIHtcbiAgICAgICAgc3FsICs9ICcsXFxuJztcbiAgICAgIH1cbiAgICAgIHNxbCArPSAnWycgKyBjLm5hbWUgKyAnXSAnICsgKGMudHlwZS5kZWNsYXJhdGlvbihjKSk7XG4gICAgICBpZiAoYy5udWxsYWJsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHNxbCArPSAnICcgKyAoYy5udWxsYWJsZSA/ICdOVUxMJyA6ICdOT1QgTlVMTCcpO1xuICAgICAgfVxuICAgIH1cbiAgICBzcWwgKz0gJ1xcbiknO1xuICAgIHJldHVybiBzcWw7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGdldENvbE1ldGFEYXRhKCkge1xuICAgIGNvbnN0IHRCdWYgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIC8vIFRva2VuVHlwZVxuICAgIHRCdWYud3JpdGVVSW50OChUT0tFTl9UWVBFLkNPTE1FVEFEQVRBKTtcbiAgICAvLyBDb3VudFxuICAgIHRCdWYud3JpdGVVSW50MTZMRSh0aGlzLmNvbHVtbnMubGVuZ3RoKTtcblxuICAgIGZvciAobGV0IGogPSAwLCBsZW4gPSB0aGlzLmNvbHVtbnMubGVuZ3RoOyBqIDwgbGVuOyBqKyspIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbHVtbnNbal07XG4gICAgICAvLyBVc2VyVHlwZVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uIDwgJzdfMicpIHtcbiAgICAgICAgdEJ1Zi53cml0ZVVJbnQxNkxFKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdEJ1Zi53cml0ZVVJbnQzMkxFKDApO1xuICAgICAgfVxuXG4gICAgICAvLyBGbGFnc1xuICAgICAgbGV0IGZsYWdzID0gRkxBR1MudXBkYXRlYWJsZVJlYWRXcml0ZTtcbiAgICAgIGlmIChjLm51bGxhYmxlKSB7XG4gICAgICAgIGZsYWdzIHw9IEZMQUdTLm51bGxhYmxlO1xuICAgICAgfSBlbHNlIGlmIChjLm51bGxhYmxlID09PSB1bmRlZmluZWQgJiYgdGhpcy5vcHRpb25zLnRkc1ZlcnNpb24gPj0gJzdfMicpIHtcbiAgICAgICAgZmxhZ3MgfD0gRkxBR1MubnVsbGFibGVVbmtub3duO1xuICAgICAgfVxuICAgICAgdEJ1Zi53cml0ZVVJbnQxNkxFKGZsYWdzKTtcblxuICAgICAgLy8gVFlQRV9JTkZPXG4gICAgICB0QnVmLndyaXRlQnVmZmVyKGMudHlwZS5nZW5lcmF0ZVR5cGVJbmZvKGMsIHRoaXMub3B0aW9ucykpO1xuXG4gICAgICAvLyBUYWJsZU5hbWVcbiAgICAgIGlmIChjLnR5cGUuaGFzVGFibGVOYW1lKSB7XG4gICAgICAgIHRCdWYud3JpdGVVc1ZhcmNoYXIodGhpcy50YWJsZSwgJ3VjczInKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ29sTmFtZVxuICAgICAgdEJ1Zi53cml0ZUJWYXJjaGFyKGMubmFtZSwgJ3VjczInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRCdWYuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdGltZW91dCBmb3IgdGhpcyBidWxrIGxvYWQuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGJ1bGtMb2FkLnNldFRpbWVvdXQodGltZW91dCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gdGltZW91dCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGJ1bGsgbG9hZCBpcyBjb25zaWRlcmVkIGZhaWxlZCwgb3IgMCBmb3Igbm8gdGltZW91dC5cbiAgICogICBXaGVuIG5vIHRpbWVvdXQgaXMgc2V0IGZvciB0aGUgYnVsayBsb2FkLCB0aGUgW1tDb25uZWN0aW9uT3B0aW9ucy5yZXF1ZXN0VGltZW91dF1dIG9mIHRoZSBDb25uZWN0aW9uIGlzIHVzZWQuXG4gICAqL1xuICBzZXRUaW1lb3V0KHRpbWVvdXQ/OiBudW1iZXIpIHtcbiAgICB0aGlzLnRpbWVvdXQgPSB0aW1lb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVEb25lVG9rZW4oKSB7XG4gICAgLy8gSXQgbWlnaHQgYmUgbmljZSB0byBtYWtlIERvbmVUb2tlbiBhIGNsYXNzIGlmIGFueXRoaW5nIG5lZWRzIHRvIGNyZWF0ZSB0aGVtLCBidXQgZm9yIG5vdywganVzdCBkbyBpdCBoZXJlXG4gICAgY29uc3QgdEJ1ZiA9IG5ldyBXcml0YWJsZVRyYWNraW5nQnVmZmVyKCk7XG4gICAgdEJ1Zi53cml0ZVVJbnQ4KFRPS0VOX1RZUEUuRE9ORSk7XG4gICAgY29uc3Qgc3RhdHVzID0gRE9ORV9TVEFUVVMuRklOQUw7XG4gICAgdEJ1Zi53cml0ZVVJbnQxNkxFKHN0YXR1cyk7XG4gICAgdEJ1Zi53cml0ZVVJbnQxNkxFKDApOyAvLyBDdXJDbWQgKFREUyBpZ25vcmVzIHRoaXMpXG4gICAgdEJ1Zi53cml0ZVVJbnQzMkxFKDApOyAvLyByb3cgY291bnQgLSBkb2Vzbid0IHJlYWxseSBtYXR0ZXJcbiAgICBpZiAodGhpcy5vcHRpb25zLnRkc1ZlcnNpb24gPj0gJzdfMicpIHtcbiAgICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTsgLy8gcm93IGNvdW50IGlzIDY0IGJpdHMgaW4gPj0gVERTIDcuMlxuICAgIH1cbiAgICByZXR1cm4gdEJ1Zi5kYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbmNlbGVkID0gdHJ1ZTtcbiAgICB0aGlzLmVtaXQoJ2NhbmNlbCcpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEJ1bGtMb2FkO1xubW9kdWxlLmV4cG9ydHMgPSBCdWxrTG9hZDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsdUJBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUdBLElBQUFHLE1BQUEsR0FBQUgsT0FBQTtBQUFtRCxTQUFBRSx1QkFBQUUsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTtBQUtuRDtBQUNBO0FBQ0E7QUFDQSxNQUFNRyxLQUFLLEdBQUc7RUFDWkMsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDO0VBQ2hCQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFDZkMsbUJBQW1CLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFDM0JDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDO0VBQ3pCQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFDaEJDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQztFQUFFO0VBQ2xCQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUM7RUFBRTtFQUN6QkMsZUFBZSxFQUFFLENBQUMsSUFBSSxFQUFFO0VBQUU7RUFDMUJDLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRTtFQUFFO0VBQ2pCQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7RUFBRTtFQUNkQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMzQixDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLFdBQVcsR0FBRztFQUNsQkMsS0FBSyxFQUFFLElBQUk7RUFDWEMsSUFBSSxFQUFFLEdBQUc7RUFDVEMsS0FB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
416
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl93cml0YWJsZVRyYWNraW5nQnVmZmVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl90b2tlbiIsIl9lcnJvcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJGTEFHUyIsIm51bGxhYmxlIiwiY2FzZVNlbiIsInVwZGF0ZWFibGVSZWFkV3JpdGUiLCJ1cGRhdGVhYmxlVW5rbm93biIsImlkZW50aXR5IiwiY29tcHV0ZWQiLCJmaXhlZExlbkNMUlR5cGUiLCJzcGFyc2VDb2x1bW5TZXQiLCJoaWRkZW4iLCJrZXkiLCJudWxsYWJsZVVua25vd24iLCJET05FX1NUQVRVUyIsIkZJTkFMIiwiTU9SRSIsIkVSUk9SIiwiSU5YQUNUIiwiQ09VTlQiLCJBVFROIiwiU1JWRVJST1IiLCJCdWxrTG9hZCIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwidGFibGUiLCJjb2xsYXRpb24iLCJjb25uZWN0aW9uT3B0aW9ucyIsImNoZWNrQ29uc3RyYWludHMiLCJmaXJlVHJpZ2dlcnMiLCJrZWVwTnVsbHMiLCJsb2NrVGFibGUiLCJvcmRlciIsImNhbGxiYWNrIiwiVHlwZUVycm9yIiwiY29sdW1uIiwiZGlyZWN0aW9uIiwiT2JqZWN0IiwiZW50cmllcyIsImVycm9yIiwidW5kZWZpbmVkIiwiY2FuY2VsZWQiLCJleGVjdXRpb25TdGFydGVkIiwib3B0aW9ucyIsImNvbHVtbnMiLCJjb2x1bW5zQnlOYW1lIiwiYnVsa09wdGlvbnMiLCJhZGRDb2x1bW4iLCJuYW1lIiwidHlwZSIsIm91dHB1dCIsImxlbmd0aCIsInByZWNpc2lvbiIsInNjYWxlIiwib2JqTmFtZSIsIkVycm9yIiwidmFsdWUiLCJyZXNvbHZlTGVuZ3RoIiwicmVzb2x2ZVByZWNpc2lvbiIsInJlc29sdmVTY2FsZSIsInB1c2giLCJnZXRPcHRpb25zU3FsIiwiYWRkT3B0aW9ucyIsIm9yZGVyQ29sdW1ucyIsImpvaW4iLCJnZXRCdWxrSW5zZXJ0U3FsIiwic3FsIiwiaSIsImxlbiIsImMiLCJkZWNsYXJhdGlvbiIsImdldFRhYmxlQ3JlYXRpb25TcWwiLCJnZXRDb2xNZXRhRGF0YSIsInRCdWYiLCJXcml0YWJsZVRyYWNraW5nQnVmZmVyIiwid3JpdGVVSW50OCIsIlRPS0VOX1RZUEUiLCJDT0xNRVRBREFUQSIsIndyaXRlVUludDE2TEUiLCJqIiwidGRzVmVyc2lvbiIsIndyaXRlVUludDMyTEUiLCJmbGFncyIsIndyaXRlVHlwZUluZm8iLCJJbnB1dEVycm9yIiwiY2F1c2UiLCJoYXNUYWJsZU5hbWUiLCJ3cml0ZVVzVmFyY2hhciIsIndyaXRlQlZhcmNoYXIiLCJkYXRhIiwic2V0VGltZW91dCIsInRpbWVvdXQiLCJjcmVhdGVEb25lVG9rZW4iLCJET05FIiwic3RhdHVzIiwiY2FuY2VsIiwiZW1pdCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSJdLCJzb3VyY2VzIjpbIi4uL3NyYy9idWxrLWxvYWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcbmltcG9ydCBXcml0YWJsZVRyYWNraW5nQnVmZmVyIGZyb20gJy4vdHJhY2tpbmctYnVmZmVyL3dyaXRhYmxlLXRyYWNraW5nLWJ1ZmZlcic7XG5pbXBvcnQgQ29ubmVjdGlvbiwgeyB0eXBlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuL2Nvbm5lY3Rpb24nO1xuXG5pbXBvcnQgeyBUWVBFIGFzIFRPS0VOX1RZUEUgfSBmcm9tICcuL3Rva2VuL3Rva2VuJztcblxuaW1wb3J0IHsgdHlwZSBEYXRhVHlwZSwgdHlwZSBQYXJhbWV0ZXIgfSBmcm9tICcuL2RhdGEtdHlwZSc7XG5pbXBvcnQgeyBJbnB1dEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IEZMQUdTID0ge1xuICBudWxsYWJsZTogMSA8PCAwLFxuICBjYXNlU2VuOiAxIDw8IDEsXG4gIHVwZGF0ZWFibGVSZWFkV3JpdGU6IDEgPDwgMixcbiAgdXBkYXRlYWJsZVVua25vd246IDEgPDwgMyxcbiAgaWRlbnRpdHk6IDEgPDwgNCxcbiAgY29tcHV0ZWQ6IDEgPDwgNSwgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG4gIGZpeGVkTGVuQ0xSVHlwZTogMSA8PCA4LCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjJcbiAgc3BhcnNlQ29sdW1uU2V0OiAxIDw8IDEwLCAvLyBpbnRyb2R1Y2VkIGluIFREUyA3LjMuQlxuICBoaWRkZW46IDEgPDwgMTMsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBrZXk6IDEgPDwgMTQsIC8vIGludHJvZHVjZWQgaW4gVERTIDcuMlxuICBudWxsYWJsZVVua25vd246IDEgPDwgMTUgLy8gaW50cm9kdWNlZCBpbiBURFMgNy4yXG59O1xuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERPTkVfU1RBVFVTID0ge1xuICBGSU5BTDogMHgwMCxcbiAgTU9SRTogMHgxLFxuICBFUlJPUjogMHgyLFxuICBJTlhBQ1Q6IDB4NCxcbiAgQ09VTlQ6IDB4MTAsXG4gIEFUVE46IDB4MjAsXG4gIFNSVkVSUk9SOiAweDEwMFxufTtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbnRlcmZhY2UgSW50ZXJuYWxPcHRpb25zIHtcbiAgY2hlY2tDb25zdHJhaW50czogYm9vbGVhbjtcbiAgZmlyZVRyaWdnZXJzOiBib29sZWFuO1xuICBrZWVwTnVsbHM6IGJvb2xlYW47XG4gIGxvY2tUYWJsZTogYm9vbGVhbjtcbiAgb3JkZXI6IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106ICdBU0MnIHwgJ0RFU0MnIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb25vcnMgY29uc3RyYWludHMgZHVyaW5nIGJ1bGsgbG9hZCwgdXNpbmcgVC1TUUxcbiAgICogW0NIRUNLX0NPTlNUUkFJTlRTXShodHRwczovL3RlY2huZXQubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zMTg2MjQ3KHY9c3FsLjEwNSkuYXNweCkuXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgY2hlY2tDb25zdHJhaW50cz86IEludGVybmFsT3B0aW9uc1snY2hlY2tDb25zdHJhaW50cyddIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBIb25vcnMgaW5zZXJ0IHRyaWdnZXJzIGR1cmluZyBidWxrIGxvYWQsIHVzaW5nIHRoZSBULVNRTCBbRklSRV9UUklHR0VSU10oaHR0cHM6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4NzY0MCh2PXNxbC4xMDUpLmFzcHgpLiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGZpcmVUcmlnZ2Vycz86IEludGVybmFsT3B0aW9uc1snZmlyZVRyaWdnZXJzJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEhvbm9ycyBudWxsIHZhbHVlIHBhc3NlZCwgaWdub3JlcyB0aGUgZGVmYXVsdCB2YWx1ZXMgc2V0IG9uIHRhYmxlLCB1c2luZyBULVNRTCBbS0VFUF9OVUxMU10oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4Nzg4Nyh2PXNxbC4xMjApLmFzcHgpLiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGtlZXBOdWxscz86IEludGVybmFsT3B0aW9uc1sna2VlcE51bGxzJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFBsYWNlcyBhIGJ1bGsgdXBkYXRlKEJVKSBsb2NrIG9uIHRhYmxlIHdoaWxlIHBlcmZvcm1pbmcgYnVsayBsb2FkLCB1c2luZyBULVNRTCBbVEFCTE9DS10oaHR0cHM6Ly90ZWNobmV0Lm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4MDg3Nih2PXNxbC4xMDUpLmFzcHgpLiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGxvY2tUYWJsZT86IEludGVybmFsT3B0aW9uc1snbG9ja1RhYmxlJ10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGRhdGEgdG8gcG9zc2libHkgaW5jcmVhc2UgYnVsayBpbnNlcnQgcGVyZm9ybWFuY2UsIHVzaW5nIFQtU1FMIFtPUkRFUl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvcHJldmlvdXMtdmVyc2lvbnMvc3FsL3NxbC1zZXJ2ZXItMjAwOC1yMi9tczE3NzQ2OCh2PXNxbC4xMDUpKS4gKGRlZmF1bHQ6IGB7fWApXG4gICAqL1xuICBvcmRlcj86IEludGVybmFsT3B0aW9uc1snb3JkZXInXSB8IHVuZGVmaW5lZDtcbn1cblxuXG5leHBvcnQgdHlwZSBDYWxsYmFjayA9XG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBbW0J1bGtMb2FkXV0gZmluaXNoZXMgZXhlY3V0aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcm93Q291bnQgdGhlIG51bWJlciBvZiByb3dzIGluc2VydGVkXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IHVuZGVmaW5lZCB8IG51bGwsIHJvd0NvdW50PzogbnVtYmVyKSA9PiB2b2lkO1xuXG5pbnRlcmZhY2UgQ29sdW1uIGV4dGVuZHMgUGFyYW1ldGVyIHtcbiAgb2JqTmFtZTogc3RyaW5nO1xuICBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZDtcbn1cblxuaW50ZXJmYWNlIENvbHVtbk9wdGlvbnMge1xuICBvdXRwdXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGb3IgVmFyQ2hhciwgTlZhckNoYXIsIFZhckJpbmFyeS4gVXNlIGxlbmd0aCBhcyBgSW5maW5pdHlgIGZvciBWYXJDaGFyKG1heCksIE5WYXJDaGFyKG1heCkgYW5kIFZhckJpbmFyeShtYXgpLlxuICAgKi9cbiAgbGVuZ3RoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBGb3IgTnVtZXJpYywgRGVjaW1hbC5cbiAgICovXG4gIHByZWNpc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yIE51bWVyaWMsIERlY2ltYWwsIFRpbWUsIERhdGVUaW1lMiwgRGF0ZVRpbWVPZmZzZXQuXG4gICAqL1xuICBzY2FsZT86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgdGhlIG5hbWUgb2YgdGhlIGNvbHVtbiBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgZm91bmQgb24gYHJvd09iamAgYXJndW1lbnRzIHBhc3NlZCB0byBbW2FkZFJvd11dLCB0aGVuIHlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAqL1xuICBvYmpOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgY29sdW1uIGFjY2VwdHMgTlVMTCB2YWx1ZXMuXG4gICAqL1xuICBudWxsYWJsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBCdWxrTG9hZCBpbnN0YW5jZSBpcyB1c2VkIHRvIHBlcmZvcm0gYSBidWxrIGluc2VydC5cbiAqXG4gKiBVc2UgW1tDb25uZWN0aW9uLm5ld0J1bGtMb2FkXV0gdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlLCBhbmQgW1tDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZF1dIHRvIGV4ZWN1dGUgaXQuXG4gKlxuICogRXhhbXBsZSBvZiBCdWxrTG9hZCBVc2FnZXM6XG4gKlxuICogYGBganNcbiAqIC8vIG9wdGlvbmFsIEJ1bGtMb2FkIG9wdGlvbnNcbiAqIGNvbnN0IG9wdGlvbnMgPSB7IGtlZXBOdWxsczogdHJ1ZSB9O1xuICpcbiAqIC8vIGluc3RhbnRpYXRlIC0gcHJvdmlkZSB0aGUgdGFibGUgd2hlcmUgeW91J2xsIGJlIGluc2VydGluZyB0bywgb3B0aW9ucyBhbmQgYSBjYWxsYmFja1xuICogY29uc3QgYnVsa0xvYWQgPSBjb25uZWN0aW9uLm5ld0J1bGtMb2FkKCdNeVRhYmxlJywgb3B0aW9ucywgKGVycm9yLCByb3dDb3VudCkgPT4ge1xuICogICBjb25zb2xlLmxvZygnaW5zZXJ0ZWQgJWQgcm93cycsIHJvd0NvdW50KTtcbiAqIH0pO1xuICpcbiAqIC8vIHNldHVwIHlvdXIgY29sdW1ucyAtIGFsd2F5cyBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBjb2x1bW4gaXMgbnVsbGFibGVcbiAqIGJ1bGtMb2FkLmFkZENvbHVtbignbXlJbnQnLCBUWVBFUy5JbnQsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICogYnVsa0xvYWQuYWRkQ29sdW1uKCdteVN0cmluZycsIFRZUEVTLk5WYXJDaGFyLCB7IGxlbmd0aDogNTAsIG51bGxhYmxlOiB0cnVlIH0pO1xuICpcbiAqIC8vIGV4ZWN1dGVcbiAqIGNvbm5lY3Rpb24uZXhlY0J1bGtMb2FkKGJ1bGtMb2FkLCBbXG4gKiAgIHsgbXlJbnQ6IDcsIG15U3RyaW5nOiAnaGVsbG8nIH0sXG4gKiAgIHsgbXlJbnQ6IDIzLCBteVN0cmluZzogJ3dvcmxkJyB9XG4gKiBdKTtcbiAqIGBgYFxuICovXG5jbGFzcyBCdWxrTG9hZCBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBlcnJvcjogRXJyb3IgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjYW5jZWxlZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGV4ZWN1dGlvblN0YXJ0ZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHRhYmxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSB0aW1lb3V0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIG9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnM7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjYWxsYmFjazogQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIGNvbHVtbnM6IEFycmF5PENvbHVtbj47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBjb2x1bW5zQnlOYW1lOiB7IFtuYW1lOiBzdHJpbmddOiBDb2x1bW4gfTtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgYnVsa09wdGlvbnM6IEludGVybmFsT3B0aW9ucztcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlY2xhcmUgY29ubmVjdGlvbjogQ29ubmVjdGlvbiB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIHJvd3M6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSByc3Q6IEFycmF5PGFueT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSByb3dDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuXG4gIGRlY2xhcmUgY29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZTogc3RyaW5nLCBjb2xsYXRpb246IENvbGxhdGlvbiB8IHVuZGVmaW5lZCwgY29ubmVjdGlvbk9wdGlvbnM6IEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMsIHtcbiAgICBjaGVja0NvbnN0cmFpbnRzID0gZmFsc2UsXG4gICAgZmlyZVRyaWdnZXJzID0gZmFsc2UsXG4gICAga2VlcE51bGxzID0gZmFsc2UsXG4gICAgbG9ja1RhYmxlID0gZmFsc2UsXG4gICAgb3JkZXIgPSB7fSxcbiAgfTogT3B0aW9ucywgY2FsbGJhY2s6IENhbGxiYWNrKSB7XG4gICAgaWYgKHR5cGVvZiBjaGVja0NvbnN0cmFpbnRzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuY2hlY2tDb25zdHJhaW50c1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZmlyZVRyaWdnZXJzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcIm9wdGlvbnMuZmlyZVRyaWdnZXJzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBrZWVwTnVsbHMgIT09ICdib29sZWFuJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwib3B0aW9ucy5rZWVwTnVsbHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGxvY2tUYWJsZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLmxvY2tUYWJsZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdvYmplY3QnIHx8IG9yZGVyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJvcHRpb25zLm9yZGVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG9iamVjdC4nKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMob3JkZXIpKSB7XG4gICAgICBpZiAoZGlyZWN0aW9uICE9PSAnQVNDJyAmJiBkaXJlY3Rpb24gIT09ICdERVNDJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgdmFsdWUgb2YgdGhlIFwiJyArIGNvbHVtbiArICdcIiBrZXkgaW4gdGhlIFwib3B0aW9ucy5vcmRlclwiIG9iamVjdCBtdXN0IGJlIGVpdGhlciBcIkFTQ1wiIG9yIFwiREVTQ1wiLicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2FuY2VsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmV4ZWN1dGlvblN0YXJ0ZWQgPSBmYWxzZTtcblxuICAgIHRoaXMuY29sbGF0aW9uID0gY29sbGF0aW9uO1xuXG4gICAgdGhpcy50YWJsZSA9IHRhYmxlO1xuICAgIHRoaXMub3B0aW9ucyA9IGNvbm5lY3Rpb25PcHRpb25zO1xuICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB0aGlzLmNvbHVtbnMgPSBbXTtcbiAgICB0aGlzLmNvbHVtbnNCeU5hbWUgPSB7fTtcblxuICAgIHRoaXMuYnVsa09wdGlvbnMgPSB7IGNoZWNrQ29uc3RyYWludHMsIGZpcmVUcmlnZ2Vycywga2VlcE51bGxzLCBsb2NrVGFibGUsIG9yZGVyIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNvbHVtbiB0byB0aGUgYnVsayBsb2FkLlxuICAgKlxuICAgKiBUaGUgY29sdW1uIGRlZmluaXRpb25zIHNob3VsZCBtYXRjaCB0aGUgdGFibGUgeW91IGFyZSB0cnlpbmcgdG8gaW5zZXJ0IGludG8uXG4gICAqIEF0dGVtcHRpbmcgdG8gY2FsbCBhZGRDb2x1bW4gYWZ0ZXIgdGhlIGZpcnN0IHJvdyBoYXMgYmVlbiBhZGRlZCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICpcbiAgICogYGBganNcbiAgICogYnVsa0xvYWQuYWRkQ29sdW1uKCdNeUludENvbHVtbicsIFRZUEVTLkludCwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29sdW1uLlxuICAgKiBAcGFyYW0gdHlwZSBPbmUgb2YgdGhlIHN1cHBvcnRlZCBgZGF0YSB0eXBlc2AuXG4gICAqIEBwYXJhbSBfX25hbWVkUGFyYW1ldGVycyBBZGRpdGlvbmFsIGNvbHVtbiB0eXBlIGluZm9ybWF0aW9uLiBBdCBhIG1pbmltdW0sIGBudWxsYWJsZWAgbXVzdCBiZSBzZXQgdG8gdHJ1ZSBvciBmYWxzZS5cbiAgICogQHBhcmFtIGxlbmd0aCBGb3IgVmFyQ2hhciwgTlZhckNoYXIsIFZhckJpbmFyeS4gVXNlIGxlbmd0aCBhcyBgSW5maW5pdHlgIGZvciBWYXJDaGFyKG1heCksIE5WYXJDaGFyKG1heCkgYW5kIFZhckJpbmFyeShtYXgpLlxuICAgKiBAcGFyYW0gbnVsbGFibGUgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbHVtbiBhY2NlcHRzIE5VTEwgdmFsdWVzLlxuICAgKiBAcGFyYW0gb2JqTmFtZSBJZiB0aGUgbmFtZSBvZiB0aGUgY29sdW1uIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3VuZCBvbiBgcm93T2JqYCBhcmd1bWVudHMgcGFzc2VkIHRvIFtbYWRkUm93XV0gb3IgW1tDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZF1dLCB0aGVuIHlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIHNwZWNpZnkgdGhlIHByb3BlcnR5IG5hbWUuXG4gICAqIEBwYXJhbSBwcmVjaXNpb24gRm9yIE51bWVyaWMsIERlY2ltYWwuXG4gICAqIEBwYXJhbSBzY2FsZSBGb3IgTnVtZXJpYywgRGVjaW1hbCwgVGltZSwgRGF0ZVRpbWUyLCBEYXRlVGltZU9mZnNldC5cbiAgKi9cbiAgYWRkQ29sdW1uKG5hbWU6IHN0cmluZywgdHlwZTogRGF0YVR5cGUsIHsgb3V0cHV0ID0gZmFsc2UsIGxlbmd0aCwgcHJlY2lzaW9uLCBzY2FsZSwgb2JqTmFtZSA9IG5hbWUsIG51bGxhYmxlID0gdHJ1ZSB9OiBDb2x1bW5PcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuZXhlY3V0aW9uU3RhcnRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb2x1bW5zIGNhbm5vdCBiZSBhZGRlZCB0byBidWxrIGluc2VydCBhZnRlciBleGVjdXRpb24gaGFzIHN0YXJ0ZWQuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW4gPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgb3V0cHV0OiBvdXRwdXQsXG4gICAgICBsZW5ndGg6IGxlbmd0aCxcbiAgICAgIHByZWNpc2lvbjogcHJlY2lzaW9uLFxuICAgICAgc2NhbGU6IHNjYWxlLFxuICAgICAgb2JqTmFtZTogb2JqTmFtZSxcbiAgICAgIG51bGxhYmxlOiBudWxsYWJsZSxcbiAgICAgIGNvbGxhdGlvbjogdGhpcy5jb2xsYXRpb25cbiAgICB9O1xuXG4gICAgLy8gTm90ZTogdGhpcyBpcyBkZWxpYmVyYXRlbHkgbm90IGtleWVkIG9mZiB0aGUgbGVnYWN5IHZhcmlhYmxlLWxlbmd0aFxuICAgIC8vIHR5cGUgaWQgYml0IHBhdHRlcm4gKCh0eXBlLmlkICYgMHgzMCkgPT09IDB4MjApLCBhcyB0aGF0IHBhdHRlcm4gZG9lc1xuICAgIC8vIG5vdCBob2xkIGZvciB0eXBlIGlkcyBpbnRyb2R1Y2VkIGluIFREUyA3LjIgYW5kIGxhdGVyIChlLmcuIFhNTFRZUEVcbiAgICAvLyAweEYxIG9yIFZFQ1RPUlRZUEUgMHhGNSkuIEEgdHlwZSBoYXMgYSBsZW5ndGggd2hlbmV2ZXIgaXQgY2FuIHJlc29sdmVcbiAgICAvLyBvbmUsIG1pcnJvcmluZyBob3cgcHJlY2lzaW9uIGFuZCBzY2FsZSBhcmUgcmVzb2x2ZWQgYmVsb3cuXG4gICAgaWYgKGNvbHVtbi5sZW5ndGggPT0gbnVsbCAmJiB0eXBlLnJlc29sdmVMZW5ndGgpIHtcbiAgICAgIGNvbHVtbi5sZW5ndGggPSB0eXBlLnJlc29sdmVMZW5ndGgoY29sdW1uKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZS5yZXNvbHZlUHJlY2lzaW9uICYmIGNvbHVtbi5wcmVjaXNpb24gPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnByZWNpc2lvbiA9IHR5cGUucmVzb2x2ZVByZWNpc2lvbihjb2x1bW4pO1xuICAgIH1cblxuICAgIGlmICh0eXBlLnJlc29sdmVTY2FsZSAmJiBjb2x1bW4uc2NhbGUgPT0gbnVsbCkge1xuICAgICAgY29sdW1uLnNjYWxlID0gdHlwZS5yZXNvbHZlU2NhbGUoY29sdW1uKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pO1xuXG4gICAgdGhpcy5jb2x1bW5zQnlOYW1lW25hbWVdID0gY29sdW1uO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRPcHRpb25zU3FsKCkge1xuICAgIGNvbnN0IGFkZE9wdGlvbnMgPSBbXTtcblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmNoZWNrQ29uc3RyYWludHMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnQ0hFQ0tfQ09OU1RSQUlOVFMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5maXJlVHJpZ2dlcnMpIHtcbiAgICAgIGFkZE9wdGlvbnMucHVzaCgnRklSRV9UUklHR0VSUycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmJ1bGtPcHRpb25zLmtlZXBOdWxscykge1xuICAgICAgYWRkT3B0aW9ucy5wdXNoKCdLRUVQX05VTExTJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYnVsa09wdGlvbnMubG9ja1RhYmxlKSB7XG4gICAgICBhZGRPcHRpb25zLnB1c2goJ1RBQkxPQ0snKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5idWxrT3B0aW9ucy5vcmRlcikge1xuICAgICAgY29uc3Qgb3JkZXJDb2x1bW5zID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgW2NvbHVtbiwgZGlyZWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJ1bGtPcHRpb25zLm9yZGVyKSkge1xuICAgICAgICBvcmRlckNvbHVtbnMucHVzaChgJHtjb2x1bW59ICR7ZGlyZWN0aW9ufWApO1xuICAgICAgfVxuXG4gICAgICBpZiAob3JkZXJDb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBhZGRPcHRpb25zLnB1c2goYE9SREVSICgke29yZGVyQ29sdW1ucy5qb2luKCcsICcpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWRkT3B0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gYCBXSVRIICgke2FkZE9wdGlvbnMuam9pbignLCcpfSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRCdWxrSW5zZXJ0U3FsKCkge1xuICAgIGxldCBzcWwgPSAnaW5zZXJ0IGJ1bGsgJyArIHRoaXMudGFibGUgKyAnKCc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLCAnO1xuICAgICAgfVxuICAgICAgc3FsICs9ICdbJyArIGMubmFtZSArICddICcgKyAoYy50eXBlLmRlY2xhcmF0aW9uKGMpKTtcbiAgICB9XG4gICAgc3FsICs9ICcpJztcblxuICAgIHNxbCArPSB0aGlzLmdldE9wdGlvbnNTcWwoKTtcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgc2ltcGx5IGEgaGVscGVyIHV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIGBDUkVBVEUgVEFCTEUgU1FMYCBzdGF0ZW1lbnQgYmFzZWQgb24gdGhlIGNvbHVtbnMgYWRkZWQgdG8gdGhlIGJ1bGtMb2FkIG9iamVjdC5cbiAgICogVGhpcyBtYXkgYmUgcGFydGljdWxhcmx5IGhhbmR5IHdoZW4geW91IHdhbnQgdG8gaW5zZXJ0IGludG8gYSB0ZW1wb3JhcnkgdGFibGUgKGEgdGFibGUgd2hpY2ggc3RhcnRzIHdpdGggYCNgKS5cbiAgICpcbiAgICogYGBganNcbiAgICogdmFyIHNxbCA9IGJ1bGtMb2FkLmdldFRhYmxlQ3JlYXRpb25TcWwoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEEgc2lkZSBub3RlIG9uIGJ1bGsgaW5zZXJ0aW5nIGludG8gdGVtcG9yYXJ5IHRhYmxlczogaWYgeW91IHdhbnQgdG8gYWNjZXNzIGEgbG9jYWwgdGVtcG9yYXJ5IHRhYmxlIGFmdGVyIGV4ZWN1dGluZyB0aGUgYnVsayBsb2FkLFxuICAgKiB5b3UnbGwgbmVlZCB0byB1c2UgdGhlIHNhbWUgY29ubmVjdGlvbiBhbmQgZXhlY3V0ZSB5b3VyIHJlcXVlc3RzIHVzaW5nIFtbQ29ubmVjdGlvbi5leGVjU3FsQmF0Y2hdXSBpbnN0ZWFkIG9mIFtbQ29ubmVjdGlvbi5leGVjU3FsXV1cbiAgICovXG4gIGdldFRhYmxlQ3JlYXRpb25TcWwoKSB7XG4gICAgbGV0IHNxbCA9ICdDUkVBVEUgVEFCTEUgJyArIHRoaXMudGFibGUgKyAnKFxcbic7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHRoaXMuY29sdW1ucy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuY29sdW1uc1tpXTtcbiAgICAgIGlmIChpICE9PSAwKSB7XG4gICAgICAgIHNxbCArPSAnLFxcbic7XG4gICAgICB9XG4gICAgICBzcWwgKz0gJ1snICsgYy5uYW1lICsgJ10gJyArIChjLnR5cGUuZGVjbGFyYXRpb24oYykpO1xuICAgICAgaWYgKGMubnVsbGFibGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzcWwgKz0gJyAnICsgKGMubnVsbGFibGUgPyAnTlVMTCcgOiAnTk9UIE5VTEwnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3FsICs9ICdcXG4pJztcbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRDb2xNZXRhRGF0YSgpIHtcbiAgICBjb25zdCB0QnVmID0gbmV3IFdyaXRhYmxlVHJhY2tpbmdCdWZmZXIoKTtcbiAgICAvLyBUb2tlblR5cGVcbiAgICB0QnVmLndyaXRlVUludDgoVE9LRU5fVFlQRS5DT0xNRVRBREFUQSk7XG4gICAgLy8gQ291bnRcbiAgICB0QnVmLndyaXRlVUludDE2TEUodGhpcy5jb2x1bW5zLmxlbmd0aCk7XG5cbiAgICBmb3IgKGxldCBqID0gMCwgbGVuID0gdGhpcy5jb2x1bW5zLmxlbmd0aDsgaiA8IGxlbjsgaisrKSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5jb2x1bW5zW2pdO1xuICAgICAgLy8gVXNlclR5cGVcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MTZMRSgwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTtcbiAgICAgIH1cblxuICAgICAgLy8gRmxhZ3NcbiAgICAgIGxldCBmbGFncyA9IEZMQUdTLnVwZGF0ZWFibGVSZWFkV3JpdGU7XG4gICAgICBpZiAoYy5udWxsYWJsZSkge1xuICAgICAgICBmbGFncyB8PSBGTEFHUy5udWxsYWJsZTtcbiAgICAgIH0gZWxzZSBpZiAoYy5udWxsYWJsZSA9PT0gdW5kZWZpbmVkICYmIHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uID49ICc3XzInKSB7XG4gICAgICAgIGZsYWdzIHw9IEZMQUdTLm51bGxhYmxlVW5rbm93bjtcbiAgICAgIH1cbiAgICAgIHRCdWYud3JpdGVVSW50MTZMRShmbGFncyk7XG5cbiAgICAgIC8vIFRZUEVfSU5GT1xuICAgICAgdHJ5IHtcbiAgICAgICAgYy50eXBlLndyaXRlVHlwZUluZm8odEJ1ZiwgYywgdGhpcy5vcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnB1dEVycm9yKGBDb2x1bW4gJyR7Yy5uYW1lfScgY291bGQgbm90IGJlIHNlcmlhbGl6ZWRgLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVGFibGVOYW1lXG4gICAgICBpZiAoYy50eXBlLmhhc1RhYmxlTmFtZSkge1xuICAgICAgICB0QnVmLndyaXRlVXNWYXJjaGFyKHRoaXMudGFibGUsICd1Y3MyJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENvbE5hbWVcbiAgICAgIHRCdWYud3JpdGVCVmFyY2hhcihjLm5hbWUsICd1Y3MyJyk7XG4gICAgfVxuICAgIHJldHVybiB0QnVmLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBhIHRpbWVvdXQgZm9yIHRoaXMgYnVsayBsb2FkLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBidWxrTG9hZC5zZXRUaW1lb3V0KHRpbWVvdXQpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHRpbWVvdXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBidWxrIGxvYWQgaXMgY29uc2lkZXJlZCBmYWlsZWQsIG9yIDAgZm9yIG5vIHRpbWVvdXQuXG4gICAqICAgV2hlbiBubyB0aW1lb3V0IGlzIHNldCBmb3IgdGhlIGJ1bGsgbG9hZCwgdGhlIFtbQ29ubmVjdGlvbk9wdGlvbnMucmVxdWVzdFRpbWVvdXRdXSBvZiB0aGUgQ29ubmVjdGlvbiBpcyB1c2VkLlxuICAgKi9cbiAgc2V0VGltZW91dCh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgdGhpcy50aW1lb3V0ID0gdGltZW91dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlRG9uZVRva2VuKCkge1xuICAgIC8vIEl0IG1pZ2h0IGJlIG5pY2UgdG8gbWFrZSBEb25lVG9rZW4gYSBjbGFzcyBpZiBhbnl0aGluZyBuZWVkcyB0byBjcmVhdGUgdGhlbSwgYnV0IGZvciBub3csIGp1c3QgZG8gaXQgaGVyZVxuICAgIGNvbnN0IHRCdWYgPSBuZXcgV3JpdGFibGVUcmFja2luZ0J1ZmZlcigpO1xuICAgIHRCdWYud3JpdGVVSW50OChUT0tFTl9UWVBFLkRPTkUpO1xuICAgIGNvbnN0IHN0YXR1cyA9IERPTkVfU1RBVFVTLkZJTkFMO1xuICAgIHRCdWYud3JpdGVVSW50MTZMRShzdGF0dXMpO1xuICAgIHRCdWYud3JpdGVVSW50MTZMRSgwKTsgLy8gQ3VyQ21kIChURFMgaWdub3JlcyB0aGlzKVxuICAgIHRCdWYud3JpdGVVSW50MzJMRSgwKTsgLy8gcm93IGNvdW50IC0gZG9lc24ndCByZWFsbHkgbWF0dGVyXG4gICAgaWYgKHRoaXMub3B0aW9ucy50ZHNWZXJzaW9uID49ICc3XzInKSB7XG4gICAgICB0QnVmLndyaXRlVUludDMyTEUoMCk7IC8vIHJvdyBjb3VudCBpcyA2NCBiaXRzIGluID49IFREUyA3LjJcbiAgICB9XG4gICAgcmV0dXJuIHRCdWYuZGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jYW5jZWxlZCA9IHRydWU7XG4gICAgdGhpcy5lbWl0KCdjYW5jZWwnKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCdWxrTG9hZDtcbm1vZHVsZS5leHBvcnRzID0gQnVsa0xvYWQ7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLHVCQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFHQSxJQUFBRyxNQUFBLEdBQUFILE9BQUE7QUFHQSxJQUFBSSxPQUFBLEdBQUFKLE9BQUE7QUFBc0MsU0FBQUUsdUJBQUFHLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENBQUFDLFVBQUEsR0FBQUQsQ0FBQSxLQUFBRSxPQUFBLEVB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