@witnet/sdk 1.0.4 → 1.0.5

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 (211) hide show
  1. package/.env_witnet +6 -6
  2. package/LICENSE +21 -21
  3. package/README.md +103 -103
  4. package/dist/package.json +3 -4
  5. package/dist/src/bin/helpers.js +1 -1
  6. package/dist/src/index.js +1 -1
  7. package/dist/src/lib/crypto/account.d.ts +3 -1
  8. package/dist/src/lib/crypto/account.d.ts.map +1 -1
  9. package/dist/src/lib/crypto/account.js +7 -1
  10. package/dist/src/lib/crypto/coinbase.js +1 -1
  11. package/dist/src/lib/crypto/index.js +1 -1
  12. package/dist/src/lib/crypto/interfaces.d.ts +2 -0
  13. package/dist/src/lib/crypto/interfaces.d.ts.map +1 -1
  14. package/dist/src/lib/crypto/interfaces.js +1 -1
  15. package/dist/src/lib/crypto/payloads/DataRequestPayload.js +1 -1
  16. package/dist/src/lib/crypto/payloads/StakePayload.js +1 -1
  17. package/dist/src/lib/crypto/payloads/UnstakePayload.js +1 -1
  18. package/dist/src/lib/crypto/payloads/ValueTransferPayload.js +1 -1
  19. package/dist/src/lib/crypto/payloads.d.ts.map +1 -1
  20. package/dist/src/lib/crypto/payloads.js +12 -1
  21. package/dist/src/lib/crypto/signer.d.ts +1 -0
  22. package/dist/src/lib/crypto/signer.d.ts.map +1 -1
  23. package/dist/src/lib/crypto/signer.js +18 -1
  24. package/dist/src/lib/crypto/transmitters/DataRequests.js +1 -1
  25. package/dist/src/lib/crypto/transmitters/StakeDeposits.js +1 -1
  26. package/dist/src/lib/crypto/transmitters/StakeWithdrawals.js +1 -1
  27. package/dist/src/lib/crypto/transmitters/ValueTransfers.js +1 -1
  28. package/dist/src/lib/crypto/transmitters.js +4 -4
  29. package/dist/src/lib/crypto/types.d.ts.map +1 -1
  30. package/dist/src/lib/crypto/types.js +2 -1
  31. package/dist/src/lib/crypto/utils.js +1 -1
  32. package/dist/src/lib/crypto/wallet.d.ts +3 -1
  33. package/dist/src/lib/crypto/wallet.d.ts.map +1 -1
  34. package/dist/src/lib/crypto/wallet.js +10 -1
  35. package/dist/src/lib/index.js +1 -1
  36. package/dist/src/lib/radon/ccdr/eth.js +1 -1
  37. package/dist/src/lib/radon/ccdr/index.js +1 -1
  38. package/dist/src/lib/radon/ccdr/wit.js +1 -1
  39. package/dist/src/lib/radon/filters.js +1 -1
  40. package/dist/src/lib/radon/index.js +1 -1
  41. package/dist/src/lib/radon/reducers.js +1 -1
  42. package/dist/src/lib/radon/types.js +1 -1
  43. package/dist/src/lib/radon/utils.js +1 -1
  44. package/dist/src/lib/rpc/index.js +1 -1
  45. package/dist/src/lib/rpc/nodes.js +1 -1
  46. package/dist/src/lib/rpc/provider.js +1 -1
  47. package/dist/src/lib/rpc/types.d.ts +6 -4
  48. package/dist/src/lib/rpc/types.d.ts.map +1 -1
  49. package/dist/src/lib/rpc/types.js +1 -1
  50. package/dist/src/lib/types.d.ts +0 -1
  51. package/dist/src/lib/types.d.ts.map +1 -1
  52. package/dist/src/lib/types.js +1 -1
  53. package/dist/src/lib/utils.js +1 -1
  54. package/dist/witnet/assets/index.js +1 -1
  55. package/dist/witnet/assets/modals/index.js +1 -1
  56. package/dist/witnet/assets/modals/web3/eth.js +1 -1
  57. package/dist/witnet/assets/modals/web3/ipfs.js +1 -1
  58. package/dist/witnet/assets/modals/web3/wit.js +1 -1
  59. package/dist/witnet/assets/requests.js +1 -1
  60. package/package.json +3 -4
  61. package/src/bin/cli/history.js +31 -31
  62. package/src/bin/cli/inspect.js +405 -405
  63. package/src/bin/cli/network.js +594 -594
  64. package/src/bin/cli/nodes.js +364 -364
  65. package/src/bin/cli/radon.js +817 -815
  66. package/src/bin/cli/wallet.js +1121 -1117
  67. package/src/bin/helpers.js +840 -840
  68. package/src/bin/postinstall.js +9 -9
  69. package/src/bin/toolkit.js +295 -295
  70. package/witnet/assets/_index.js +8 -8
  71. package/witnet/assets/_requests.js +25 -25
  72. package/witnet/assets/_sources.js +36 -36
  73. package/witnet/assets/_templates.js +36 -36
  74. package/witnet/assets/index.js +4 -4
  75. package/witnet/assets/modals/index.js +9 -9
  76. package/witnet/assets/modals/web3/eth.js +29 -29
  77. package/witnet/assets/modals/web3/ipfs.js +19 -19
  78. package/witnet/assets/modals/web3/wit.js +21 -21
  79. package/witnet/assets/requests.js +95 -95
  80. package/dist/bin/helpers.d.ts +0 -88
  81. package/dist/bin/helpers.d.ts.map +0 -1
  82. package/dist/bin/helpers.js +0 -866
  83. package/dist/index.d.ts +0 -4
  84. package/dist/index.d.ts.map +0 -1
  85. package/dist/index.js +0 -42
  86. package/dist/lib/crypto/account.d.ts +0 -18
  87. package/dist/lib/crypto/account.d.ts.map +0 -1
  88. package/dist/lib/crypto/account.js +0 -152
  89. package/dist/lib/crypto/coinbase.d.ts +0 -9
  90. package/dist/lib/crypto/coinbase.d.ts.map +0 -1
  91. package/dist/lib/crypto/coinbase.js +0 -39
  92. package/dist/lib/crypto/index.d.ts +0 -7
  93. package/dist/lib/crypto/index.d.ts.map +0 -1
  94. package/dist/lib/crypto/index.js +0 -28
  95. package/dist/lib/crypto/interfaces.d.ts +0 -80
  96. package/dist/lib/crypto/interfaces.d.ts.map +0 -1
  97. package/dist/lib/crypto/interfaces.js +0 -3
  98. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts +0 -47
  99. package/dist/lib/crypto/payloads/DataRequestPayload.d.ts.map +0 -1
  100. package/dist/lib/crypto/payloads/DataRequestPayload.js +0 -384
  101. package/dist/lib/crypto/payloads/StakePayload.d.ts +0 -27
  102. package/dist/lib/crypto/payloads/StakePayload.d.ts.map +0 -1
  103. package/dist/lib/crypto/payloads/StakePayload.js +0 -184
  104. package/dist/lib/crypto/payloads/UnstakePayload.d.ts +0 -35
  105. package/dist/lib/crypto/payloads/UnstakePayload.d.ts.map +0 -1
  106. package/dist/lib/crypto/payloads/UnstakePayload.js +0 -244
  107. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts +0 -24
  108. package/dist/lib/crypto/payloads/ValueTransferPayload.d.ts.map +0 -1
  109. package/dist/lib/crypto/payloads/ValueTransferPayload.js +0 -182
  110. package/dist/lib/crypto/payloads.d.ts +0 -54
  111. package/dist/lib/crypto/payloads.d.ts.map +0 -1
  112. package/dist/lib/crypto/payloads.js +0 -224
  113. package/dist/lib/crypto/signer.d.ts +0 -26
  114. package/dist/lib/crypto/signer.d.ts.map +0 -1
  115. package/dist/lib/crypto/signer.js +0 -299
  116. package/dist/lib/crypto/transmitters/DataRequests.d.ts +0 -14
  117. package/dist/lib/crypto/transmitters/DataRequests.d.ts.map +0 -1
  118. package/dist/lib/crypto/transmitters/DataRequests.js +0 -62
  119. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts +0 -11
  120. package/dist/lib/crypto/transmitters/StakeDeposits.d.ts.map +0 -1
  121. package/dist/lib/crypto/transmitters/StakeDeposits.js +0 -48
  122. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts +0 -17
  123. package/dist/lib/crypto/transmitters/StakeWithdrawals.d.ts.map +0 -1
  124. package/dist/lib/crypto/transmitters/StakeWithdrawals.js +0 -115
  125. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts +0 -10
  126. package/dist/lib/crypto/transmitters/ValueTransfers.d.ts.map +0 -1
  127. package/dist/lib/crypto/transmitters/ValueTransfers.js +0 -47
  128. package/dist/lib/crypto/transmitters.d.ts +0 -46
  129. package/dist/lib/crypto/transmitters.d.ts.map +0 -1
  130. package/dist/lib/crypto/transmitters.js +0 -506
  131. package/dist/lib/crypto/types.d.ts +0 -127
  132. package/dist/lib/crypto/types.d.ts.map +0 -1
  133. package/dist/lib/crypto/types.js +0 -261
  134. package/dist/lib/crypto/utils.d.ts +0 -10
  135. package/dist/lib/crypto/utils.d.ts.map +0 -1
  136. package/dist/lib/crypto/utils.js +0 -97
  137. package/dist/lib/crypto/wallet.d.ts +0 -26
  138. package/dist/lib/crypto/wallet.d.ts.map +0 -1
  139. package/dist/lib/crypto/wallet.js +0 -327
  140. package/dist/lib/helpers.d.ts +0 -90
  141. package/dist/lib/helpers.d.ts.map +0 -1
  142. package/dist/lib/helpers.js +0 -1031
  143. package/dist/lib/index.d.ts +0 -5
  144. package/dist/lib/index.d.ts.map +0 -1
  145. package/dist/lib/index.js +0 -21
  146. package/dist/lib/radon/artifacts.d.ts +0 -55
  147. package/dist/lib/radon/artifacts.d.ts.map +0 -1
  148. package/dist/lib/radon/artifacts.js +0 -347
  149. package/dist/lib/radon/ccdr/eth.d.ts +0 -100
  150. package/dist/lib/radon/ccdr/eth.d.ts.map +0 -1
  151. package/dist/lib/radon/ccdr/eth.js +0 -237
  152. package/dist/lib/radon/ccdr/index.d.ts +0 -34
  153. package/dist/lib/radon/ccdr/index.d.ts.map +0 -1
  154. package/dist/lib/radon/ccdr/index.js +0 -63
  155. package/dist/lib/radon/ccdr/wit.d.ts +0 -29
  156. package/dist/lib/radon/ccdr/wit.d.ts.map +0 -1
  157. package/dist/lib/radon/ccdr/wit.js +0 -60
  158. package/dist/lib/radon/filters.d.ts +0 -14
  159. package/dist/lib/radon/filters.d.ts.map +0 -1
  160. package/dist/lib/radon/filters.js +0 -47
  161. package/dist/lib/radon/index.d.ts +0 -36
  162. package/dist/lib/radon/index.d.ts.map +0 -1
  163. package/dist/lib/radon/index.js +0 -154
  164. package/dist/lib/radon/reducers.d.ts +0 -29
  165. package/dist/lib/radon/reducers.d.ts.map +0 -1
  166. package/dist/lib/radon/reducers.js +0 -101
  167. package/dist/lib/radon/retrievals.d.ts +0 -120
  168. package/dist/lib/radon/retrievals.d.ts.map +0 -1
  169. package/dist/lib/radon/retrievals.js +0 -358
  170. package/dist/lib/radon/sources.d.ts +0 -102
  171. package/dist/lib/radon/sources.d.ts.map +0 -1
  172. package/dist/lib/radon/sources.js +0 -294
  173. package/dist/lib/radon/types.d.ts +0 -521
  174. package/dist/lib/radon/types.d.ts.map +0 -1
  175. package/dist/lib/radon/types.js +0 -1066
  176. package/dist/lib/radon/utils.d.ts +0 -55
  177. package/dist/lib/radon/utils.d.ts.map +0 -1
  178. package/dist/lib/radon/utils.js +0 -181
  179. package/dist/lib/rpc/farm.d.ts +0 -66
  180. package/dist/lib/rpc/farm.d.ts.map +0 -1
  181. package/dist/lib/rpc/farm.js +0 -808
  182. package/dist/lib/rpc/index.d.ts +0 -3
  183. package/dist/lib/rpc/index.d.ts.map +0 -1
  184. package/dist/lib/rpc/index.js +0 -19
  185. package/dist/lib/rpc/node.d.ts +0 -38
  186. package/dist/lib/rpc/node.d.ts.map +0 -1
  187. package/dist/lib/rpc/node.js +0 -335
  188. package/dist/lib/rpc/nodes.d.ts +0 -40
  189. package/dist/lib/rpc/nodes.d.ts.map +0 -1
  190. package/dist/lib/rpc/nodes.js +0 -531
  191. package/dist/lib/rpc/provider.d.ts +0 -72
  192. package/dist/lib/rpc/provider.d.ts.map +0 -1
  193. package/dist/lib/rpc/provider.js +0 -402
  194. package/dist/lib/rpc/reporter.d.ts +0 -18
  195. package/dist/lib/rpc/reporter.d.ts.map +0 -1
  196. package/dist/lib/rpc/reporter.js +0 -99
  197. package/dist/lib/rpc/types.d.ts +0 -396
  198. package/dist/lib/rpc/types.d.ts.map +0 -1
  199. package/dist/lib/rpc/types.js +0 -81
  200. package/dist/lib/rpc/wallet.d.ts +0 -72
  201. package/dist/lib/rpc/wallet.d.ts.map +0 -1
  202. package/dist/lib/rpc/wallet.js +0 -41
  203. package/dist/lib/types.d.ts +0 -19
  204. package/dist/lib/types.d.ts.map +0 -1
  205. package/dist/lib/types.js +0 -7
  206. package/dist/lib/utils.d.ts +0 -5
  207. package/dist/lib/utils.d.ts.map +0 -1
  208. package/dist/lib/utils.js +0 -51
  209. package/dist/src/lib/rpc/reporter.d.ts +0 -17
  210. package/dist/src/lib/rpc/reporter.d.ts.map +0 -1
  211. package/dist/src/lib/rpc/reporter.js +0 -27
@@ -1,1066 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
18
- if (k2 === undefined) k2 = k;
19
- var desc = Object.getOwnPropertyDescriptor(m, k);
20
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
21
- desc = { enumerable: true, get: function() { return m[k]; } };
22
- }
23
- Object.defineProperty(o, k2, desc);
24
- }) : (function(o, m, k, k2) {
25
- if (k2 === undefined) k2 = k;
26
- o[k2] = m[k];
27
- }));
28
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
29
- Object.defineProperty(o, "default", { enumerable: true, value: v });
30
- }) : function(o, v) {
31
- o["default"] = v;
32
- });
33
- var __importStar = (this && this.__importStar) || (function () {
34
- var ownKeys = function(o) {
35
- ownKeys = Object.getOwnPropertyNames || function (o) {
36
- var ar = [];
37
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
38
- return ar;
39
- };
40
- return ownKeys(o);
41
- };
42
- return function (mod) {
43
- if (mod && mod.__esModule) return mod;
44
- var result = {};
45
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
46
- __setModuleDefault(result, mod);
47
- return result;
48
- };
49
- })();
50
- var __read = (this && this.__read) || function (o, n) {
51
- var m = typeof Symbol === "function" && o[Symbol.iterator];
52
- if (!m) return o;
53
- var i = m.call(o), r, ar = [], e;
54
- try {
55
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
56
- }
57
- catch (error) { e = { error: error }; }
58
- finally {
59
- try {
60
- if (r && !r.done && (m = i["return"])) m.call(i);
61
- }
62
- finally { if (e) throw e.error; }
63
- }
64
- return ar;
65
- };
66
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
67
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
68
- if (ar || !(i in from)) {
69
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
70
- ar[i] = from[i];
71
- }
72
- }
73
- return to.concat(ar || Array.prototype.slice.call(from));
74
- };
75
- Object.defineProperty(exports, "__esModule", { value: true });
76
- exports.RadonString = exports.RadonMap = exports.RadonInteger = exports.RadonFloat = exports.RadonBytes = exports.RadonBoolean = exports.RadonArray = exports.RadonAny = exports.RadonScript = exports.RadonOperator = exports.RadonOperators = exports.RadonEncodings = void 0;
77
- var cbor_1 = require("cbor");
78
- var helpers = __importStar(require("../../bin/helpers"));
79
- var Utils = __importStar(require("../utils"));
80
- var RadonEncodings;
81
- (function (RadonEncodings) {
82
- RadonEncodings[RadonEncodings["HexString"] = 0] = "HexString";
83
- RadonEncodings[RadonEncodings["Base64"] = 1] = "Base64";
84
- })(RadonEncodings || (exports.RadonEncodings = RadonEncodings = {}));
85
- var RadonOperators;
86
- (function (RadonOperators) {
87
- RadonOperators[RadonOperators["ArrayLength"] = 16] = "ArrayLength";
88
- RadonOperators[RadonOperators["ArrayFilter"] = 17] = "ArrayFilter";
89
- RadonOperators[RadonOperators["ArrayJoin"] = 18] = "ArrayJoin";
90
- RadonOperators[RadonOperators["ArrayGetArray"] = 19] = "ArrayGetArray";
91
- RadonOperators[RadonOperators["ArrayGetBoolean"] = 20] = "ArrayGetBoolean";
92
- RadonOperators[RadonOperators["ArrayGetBytes"] = 21] = "ArrayGetBytes";
93
- RadonOperators[RadonOperators["ArrayGetFloat"] = 22] = "ArrayGetFloat";
94
- RadonOperators[RadonOperators["ArrayGetInteger"] = 23] = "ArrayGetInteger";
95
- RadonOperators[RadonOperators["ArrayGetMap"] = 24] = "ArrayGetMap";
96
- RadonOperators[RadonOperators["ArrayGetString"] = 25] = "ArrayGetString";
97
- RadonOperators[RadonOperators["ArrayMap"] = 26] = "ArrayMap";
98
- RadonOperators[RadonOperators["ArrayReduce"] = 27] = "ArrayReduce";
99
- RadonOperators[RadonOperators["ArraySort"] = 29] = "ArraySort";
100
- RadonOperators[RadonOperators["ArrayPick"] = 30] = "ArrayPick";
101
- RadonOperators[RadonOperators["BooleanStringify"] = 32] = "BooleanStringify";
102
- RadonOperators[RadonOperators["BooleanNegate"] = 34] = "BooleanNegate";
103
- RadonOperators[RadonOperators["BytesStringify"] = 48] = "BytesStringify";
104
- RadonOperators[RadonOperators["BytesHash"] = 49] = "BytesHash";
105
- RadonOperators[RadonOperators["BytesAsInteger"] = 50] = "BytesAsInteger";
106
- RadonOperators[RadonOperators["BytesLength"] = 52] = "BytesLength";
107
- RadonOperators[RadonOperators["BytesSlice"] = 60] = "BytesSlice";
108
- RadonOperators[RadonOperators["FloatAbsolute"] = 80] = "FloatAbsolute";
109
- RadonOperators[RadonOperators["FloatStringify"] = 81] = "FloatStringify";
110
- RadonOperators[RadonOperators["FloatCeiling"] = 82] = "FloatCeiling";
111
- RadonOperators[RadonOperators["FloatGreaterThan"] = 83] = "FloatGreaterThan";
112
- RadonOperators[RadonOperators["FloatFloor"] = 84] = "FloatFloor";
113
- RadonOperators[RadonOperators["FloatLessThan"] = 85] = "FloatLessThan";
114
- RadonOperators[RadonOperators["FloatModule"] = 86] = "FloatModule";
115
- RadonOperators[RadonOperators["FloatMultiply"] = 87] = "FloatMultiply";
116
- RadonOperators[RadonOperators["FloatNegate"] = 88] = "FloatNegate";
117
- RadonOperators[RadonOperators["FloatPower"] = 89] = "FloatPower";
118
- RadonOperators[RadonOperators["FloatRound"] = 91] = "FloatRound";
119
- RadonOperators[RadonOperators["FloatTruncate"] = 93] = "FloatTruncate";
120
- RadonOperators[RadonOperators["IntegerAbsolute"] = 64] = "IntegerAbsolute";
121
- RadonOperators[RadonOperators["IntegerToFloat"] = 65] = "IntegerToFloat";
122
- RadonOperators[RadonOperators["IntegerStringify"] = 66] = "IntegerStringify";
123
- RadonOperators[RadonOperators["IntegerGreaterThan"] = 67] = "IntegerGreaterThan";
124
- RadonOperators[RadonOperators["IntegerLessThan"] = 68] = "IntegerLessThan";
125
- RadonOperators[RadonOperators["IntegerModulo"] = 70] = "IntegerModulo";
126
- RadonOperators[RadonOperators["IntegerMultiply"] = 71] = "IntegerMultiply";
127
- RadonOperators[RadonOperators["IntegerNegate"] = 72] = "IntegerNegate";
128
- RadonOperators[RadonOperators["IntegerPower"] = 73] = "IntegerPower";
129
- RadonOperators[RadonOperators["IntegerToBytes"] = 74] = "IntegerToBytes";
130
- RadonOperators[RadonOperators["MapStringify"] = 96] = "MapStringify";
131
- RadonOperators[RadonOperators["MapGetArray"] = 97] = "MapGetArray";
132
- RadonOperators[RadonOperators["MapGetBoolean"] = 98] = "MapGetBoolean";
133
- RadonOperators[RadonOperators["MapGetFloat"] = 100] = "MapGetFloat";
134
- RadonOperators[RadonOperators["MapGetInteger"] = 101] = "MapGetInteger";
135
- RadonOperators[RadonOperators["MapGetMap"] = 102] = "MapGetMap";
136
- RadonOperators[RadonOperators["MapGetString"] = 103] = "MapGetString";
137
- RadonOperators[RadonOperators["MapKeys"] = 104] = "MapKeys";
138
- RadonOperators[RadonOperators["MapValues"] = 105] = "MapValues";
139
- RadonOperators[RadonOperators["MapAlter"] = 107] = "MapAlter";
140
- RadonOperators[RadonOperators["MapPick"] = 110] = "MapPick";
141
- RadonOperators[RadonOperators["StringAsBoolean"] = 112] = "StringAsBoolean";
142
- RadonOperators[RadonOperators["StringAsBytes"] = 113] = "StringAsBytes";
143
- RadonOperators[RadonOperators["StringAsFloat"] = 114] = "StringAsFloat";
144
- RadonOperators[RadonOperators["StringLength"] = 116] = "StringLength";
145
- RadonOperators[RadonOperators["StringMatch"] = 117] = "StringMatch";
146
- RadonOperators[RadonOperators["StringParseJSONArray"] = 118] = "StringParseJSONArray";
147
- RadonOperators[RadonOperators["StringParseJSONMap"] = 119] = "StringParseJSONMap";
148
- RadonOperators[RadonOperators["StringParseXMLMap"] = 120] = "StringParseXMLMap";
149
- RadonOperators[RadonOperators["StringToLowerCase"] = 121] = "StringToLowerCase";
150
- RadonOperators[RadonOperators["StringToUppserCase"] = 122] = "StringToUppserCase";
151
- RadonOperators[RadonOperators["StringParseReplace"] = 123] = "StringParseReplace";
152
- RadonOperators[RadonOperators["StringParseSlice"] = 124] = "StringParseSlice";
153
- RadonOperators[RadonOperators["StringParseSplit"] = 125] = "StringParseSplit";
154
- })(RadonOperators || (exports.RadonOperators = RadonOperators = {}));
155
- var RadonClass = /** @class */ (function () {
156
- function RadonClass(prev) {
157
- this.prev = prev;
158
- }
159
- return RadonClass;
160
- }());
161
- var RadonOperator = /** @class */ (function (_super) {
162
- __extends(RadonOperator, _super);
163
- function RadonOperator(opcode, params, ops) {
164
- var _this = _super.call(this, ops) || this;
165
- _this.opcode = opcode;
166
- _this.params = params || [];
167
- return _this;
168
- }
169
- RadonOperator.prototype.argsCount = function () {
170
- var _a, _b;
171
- var maxCount = 0;
172
- (_a = this.params) === null || _a === void 0 ? void 0 : _a.forEach(function (param) {
173
- if (typeof param === 'string') {
174
- var count = helpers.getWildcardsCountFromString(param);
175
- if (count > maxCount)
176
- maxCount = count;
177
- }
178
- else if (typeof param === 'object' && param instanceof RadonScript) {
179
- var count = param.argsCount();
180
- if (count > maxCount)
181
- maxCount = count;
182
- }
183
- });
184
- return Math.max(maxCount, ((_b = this.prev) === null || _b === void 0 ? void 0 : _b.argsCount()) || 0);
185
- };
186
- RadonOperator.prototype.disect = function (level) {
187
- var _a, _b;
188
- if (level === void 0) { level = 0; }
189
- var result = ((_a = this === null || this === void 0 ? void 0 : this.prev) === null || _a === void 0 ? void 0 : _a.disect(level)) || [];
190
- var operator = RadonOperators[this.opcode];
191
- var inputType = "Radon".concat(operator.split(/(?=[A-Z])/)[0]);
192
- var radonCall = operator.split(/(?=[A-Z])/).slice(1).join('');
193
- radonCall = radonCall.charAt(0).toLowerCase() + radonCall.slice(1);
194
- var args = "";
195
- var script;
196
- if (this.params && this.params[0] !== undefined) {
197
- this.params.map(function (param) {
198
- if (typeof param !== 'object' || !(param instanceof RadonScript)) {
199
- args += (typeof param === 'string' ? "\"".concat(param, "\"") : param.toString()) + ", ";
200
- }
201
- else {
202
- script = param;
203
- }
204
- });
205
- if (script)
206
- args += "RadonOperator {";
207
- else
208
- args = args.slice(0, -2);
209
- }
210
- if (script) {
211
- var outputType = "".concat(((_b = script.outputType) === null || _b === void 0 ? void 0 : _b.constructor.name) || "RadonAny");
212
- radonCall += "(".concat(args);
213
- result.push([level, inputType, radonCall]);
214
- result.push.apply(result, __spreadArray([], __read(script.disect(level + 1)), false));
215
- result.push([level, outputType, "})"]);
216
- }
217
- else {
218
- radonCall += "(".concat(args, ")");
219
- result.push([level, inputType, radonCall]);
220
- }
221
- return result;
222
- };
223
- RadonOperator.prototype.encode = function () {
224
- var encoded;
225
- if ((this === null || this === void 0 ? void 0 : this.params) && this.params[0] !== undefined) {
226
- var args = this.params.map(function (param) {
227
- var _a;
228
- if (typeof param === 'object') {
229
- if (param instanceof RadonAny) {
230
- return (_a = param.prev) === null || _a === void 0 ? void 0 : _a.encode();
231
- }
232
- else if (param instanceof RadonOperator) {
233
- return param.encode();
234
- }
235
- else if (param instanceof RadonScript) {
236
- return param.encode();
237
- }
238
- }
239
- else {
240
- return param;
241
- }
242
- });
243
- encoded = __spreadArray([this.opcode], __read(args), false);
244
- }
245
- else {
246
- encoded = this.opcode;
247
- }
248
- if (this.prev) {
249
- return __spreadArray(__spreadArray([], __read(this.prev.encode()), false), [encoded], false);
250
- }
251
- else {
252
- return [encoded];
253
- }
254
- };
255
- RadonOperator.prototype.replaceWildcards = function (args) {
256
- var _a, _b;
257
- if (args.length < this.argsCount()) {
258
- throw EvalError("Insufficent args were provided (".concat(args.length, " < ").concat(this.argsCount(), ")"));
259
- }
260
- return new RadonOperator(this.opcode, (_a = this.params) === null || _a === void 0 ? void 0 : _a.map(function (param) {
261
- if (typeof param === 'string') {
262
- return helpers.replaceWildcards(param, args);
263
- }
264
- else if (typeof param === 'object' && param instanceof RadonScript) {
265
- return param.replaceWildcards.apply(param, __spreadArray([], __read(args), false));
266
- }
267
- else {
268
- return param;
269
- }
270
- }), (_b = this === null || this === void 0 ? void 0 : this.prev) === null || _b === void 0 ? void 0 : _b.replaceWildcards(args));
271
- };
272
- RadonOperator.prototype.spliceWildcard = function (argIndex, argValue) {
273
- var _this = this;
274
- var _a, _b;
275
- return new RadonOperator(this.opcode, (_a = this.params) === null || _a === void 0 ? void 0 : _a.map(function (param) {
276
- if (typeof param === 'string') {
277
- return helpers.spliceWildcard(param, argIndex, argValue, _this.argsCount());
278
- }
279
- else if (typeof param === 'object' && param instanceof RadonScript) {
280
- return param.spliceWildcard(argIndex, argValue);
281
- }
282
- else {
283
- return param;
284
- }
285
- }), (_b = this === null || this === void 0 ? void 0 : this.prev) === null || _b === void 0 ? void 0 : _b.spliceWildcard(argIndex, argValue));
286
- };
287
- RadonOperator.prototype.toString = function (left, indent, level) {
288
- var _a;
289
- if (left === void 0) { left = ""; }
290
- if (indent === void 0) { indent = 4; }
291
- if (level === void 0) { level = 0; }
292
- var lf = left !== "" ? "\n" : "";
293
- var str = ((_a = this === null || this === void 0 ? void 0 : this.prev) === null || _a === void 0 ? void 0 : _a.toString(left, indent, level)) || "";
294
- var methodName = RadonOperators[this.opcode].split(/(?=[A-Z])/).slice(1).join('');
295
- methodName = methodName.charAt(0).toLowerCase() + methodName.slice(1);
296
- str += "".concat(left).concat(" ".repeat(indent * level), ".").concat(methodName, "(");
297
- if (this.params && this.params[0] !== undefined) {
298
- this.params.forEach(function (param) {
299
- if (typeof param === 'string') {
300
- str += "\"".concat(param, "\", ");
301
- }
302
- else if (typeof param === 'object' && param instanceof RadonScript) {
303
- str += "".concat(param.toString(left, indent, level + 1)).concat(left).concat(" ".repeat(indent * level), ", ");
304
- }
305
- else {
306
- str += param.toString() + ", ";
307
- }
308
- });
309
- str = str.slice(0, -2);
310
- }
311
- str += ")".concat(lf);
312
- return str;
313
- };
314
- return RadonOperator;
315
- }(RadonClass));
316
- exports.RadonOperator = RadonOperator;
317
- var RadonScript = /** @class */ (function () {
318
- function RadonScript(output) {
319
- this.ops = output === null || output === void 0 ? void 0 : output.prev;
320
- var radonTypes = {
321
- "Array": RadonArray,
322
- "Boolean": RadonBoolean,
323
- "Bytes": RadonBytes,
324
- "Float": RadonFloat,
325
- "Integer": RadonInteger,
326
- "Map": RadonMap,
327
- "String": RadonString,
328
- };
329
- var input = output === null || output === void 0 ? void 0 : output.prev;
330
- while (input === null || input === void 0 ? void 0 : input.prev)
331
- input = input === null || input === void 0 ? void 0 : input.prev;
332
- var inputType = Object.entries(radonTypes).find(function (_a) {
333
- var _b = __read(_a, 2), prefix = _b[0], _ = _b[1];
334
- return input && RadonOperators[input.opcode].startsWith(prefix);
335
- });
336
- if (inputType && inputType[1])
337
- this.inputType = new inputType[1]();
338
- var outputType = Object.values(radonTypes).find(function (outputType) { return output instanceof outputType; });
339
- if (outputType)
340
- this.outputType = new outputType();
341
- }
342
- RadonScript.prototype.argsCount = function () {
343
- var _a;
344
- return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.argsCount()) || 0;
345
- };
346
- RadonScript.prototype.disect = function (level) {
347
- var _a;
348
- if (level === void 0) { level = 0; }
349
- return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.disect(level)) || [[level, "RadonAny", ""]];
350
- };
351
- RadonScript.prototype.encode = function () {
352
- var _a;
353
- return ((_a = this.ops) === null || _a === void 0 ? void 0 : _a.encode()) || [];
354
- };
355
- RadonScript.prototype.replaceWildcards = function () {
356
- var _this = this;
357
- var _a;
358
- var args = [];
359
- for (var _i = 0; _i < arguments.length; _i++) {
360
- args[_i] = arguments[_i];
361
- }
362
- var OutputType = [
363
- RadonArray,
364
- RadonBoolean,
365
- RadonBytes,
366
- RadonFloat,
367
- RadonInteger,
368
- RadonMap,
369
- RadonString,
370
- ].find(function (OutputType) { return _this.outputType instanceof OutputType; });
371
- if (OutputType) {
372
- return new OutputType((_a = this.ops) === null || _a === void 0 ? void 0 : _a.replaceWildcards(args));
373
- }
374
- else {
375
- throw EvalError("Cannot replace wildcards on empty script");
376
- }
377
- };
378
- RadonScript.prototype.spliceWildcard = function (argIndex, argValue) {
379
- var _this = this;
380
- var _a;
381
- var OutputType = [
382
- RadonArray,
383
- RadonBoolean,
384
- RadonBytes,
385
- RadonFloat,
386
- RadonInteger,
387
- RadonMap,
388
- RadonString,
389
- ].find(function (OutputType) { return _this.outputType instanceof OutputType; });
390
- if (OutputType) {
391
- return new OutputType((_a = this.ops) === null || _a === void 0 ? void 0 : _a.spliceWildcard(argIndex, argValue));
392
- }
393
- else {
394
- throw EvalError("Cannot splice wildcards on empty script");
395
- }
396
- };
397
- RadonScript.prototype.toBytecode = function () {
398
- return Utils.toHexString(Object.values(Uint8Array.from((0, cbor_1.encode)(this.encode()))), true);
399
- };
400
- RadonScript.prototype.toString = function (left, indent, level) {
401
- var _a, _b;
402
- if (left === void 0) { left = ""; }
403
- if (indent === void 0) { indent = 0; }
404
- if (level === void 0) { level = 0; }
405
- var lf = left !== "" ? "\n" : "";
406
- return "RadonOperator(".concat(((_a = this.inputType) === null || _a === void 0 ? void 0 : _a.constructor.name) || "", ")").concat(lf).concat((_b = this.ops) === null || _b === void 0 ? void 0 : _b.toString(left, indent, level + 1));
407
- };
408
- return RadonScript;
409
- }());
410
- exports.RadonScript = RadonScript;
411
- var RadonAny = /** @class */ (function (_super) {
412
- __extends(RadonAny, _super);
413
- function RadonAny() {
414
- return _super !== null && _super.apply(this, arguments) || this;
415
- }
416
- RadonAny.prototype._pushOperator = function (outputType, params) {
417
- var _a;
418
- var name;
419
- try {
420
- throw new Error();
421
- }
422
- catch (err) {
423
- var result = err;
424
- name = (_a = result.stack) === null || _a === void 0 ? void 0 : _a.split(' at ')[2].split(' ')[0].split('.').map(function (part) { return helpers.toUpperCamelCase(part); }).join('').split(/(?=[A-Z])/).slice(1).join('');
425
- }
426
- var opcode = RadonOperators[name];
427
- if (!opcode) {
428
- throw Error("Fatal: unknown Radon Operator opcode '".concat(name, "'"));
429
- }
430
- else {
431
- return new outputType(new RadonOperator(opcode, __spreadArray([], __read(params), false), this === null || this === void 0 ? void 0 : this.prev));
432
- }
433
- };
434
- return RadonAny;
435
- }(RadonClass));
436
- exports.RadonAny = RadonAny;
437
- var RadonArray = /** @class */ (function (_super) {
438
- __extends(RadonArray, _super);
439
- function RadonArray() {
440
- return _super !== null && _super.apply(this, arguments) || this;
441
- }
442
- /**
443
- * Discard the items in the input array that make the given `innerScript` to return a `false` value.
444
- * @param script Filtering script ultimately returning a `RadonBoolean` object.
445
- * Must accept as input the same data types as the ones of the items being iterated.
446
- * @returns A `RadonArray` object containing only the items that make the `innerScript` to return a `true` value.
447
- */
448
- RadonArray.prototype.filter = function (innerScript) {
449
- if (!(innerScript instanceof RadonBoolean)) {
450
- throw new EvalError("Inner script must fetch a RadonBoolean value");
451
- }
452
- return this._pushOperator((RadonArray), [new RadonScript(innerScript)]);
453
- };
454
- /**
455
- * Fetch the item at the given `index` as a `RadonArray` object.
456
- * @param index
457
- */
458
- RadonArray.prototype.getArray = function (index) {
459
- return this._pushOperator((RadonArray), [index]);
460
- };
461
- /**
462
- * Fetch the item at the given `index` as a `RadonBoolean` object.
463
- * @param index
464
- */
465
- RadonArray.prototype.getBoolean = function (index) {
466
- return this._pushOperator(RadonBoolean, [index]);
467
- };
468
- /**
469
- * Fetch the item at the given `index` as a `RadonBytes` object.
470
- * @param index
471
- */
472
- RadonArray.prototype.getBytes = function (index) {
473
- return this._pushOperator(RadonBytes, [index]);
474
- };
475
- /**
476
- * Fetch the item at the given `index` as a `RadonFloat` object.
477
- * @param index
478
- */
479
- RadonArray.prototype.getFloat = function (index) {
480
- return this._pushOperator(RadonFloat, [index]);
481
- };
482
- /**
483
- * Fetch the item at the given `index` as a `RadonInteger` object.
484
- * @param index
485
- */
486
- RadonArray.prototype.getInteger = function (index) {
487
- return this._pushOperator(RadonInteger, [index]);
488
- };
489
- /**
490
- * Fetch the item at the given `index` as a `RadonMap` object.
491
- * @param index
492
- */
493
- RadonArray.prototype.getMap = function (index) {
494
- return this._pushOperator(RadonMap, [index]);
495
- };
496
- /**
497
- * Fetch the item at the given `index` as a `RadonString` object.
498
- * @param index
499
- */
500
- RadonArray.prototype.getString = function (index) {
501
- return this._pushOperator(RadonString, [index]);
502
- };
503
- /**
504
- * Join all items of the array into a value of the given type. The array must be homogeneous,
505
- * all items being of the same type as the outputType`, if specified, or the Array's itemsType otherwise.
506
- * @param separator Separator to be used when joining strings. When joining RadonMaps, it can be used to settle base schema on resulting object.
507
- * @param outputType Radon type of the output value.
508
- */
509
- RadonArray.prototype.join = function (separator, outputType) {
510
- if (separator === void 0) { separator = ""; }
511
- if (outputType)
512
- this._pushOperator((RadonArray), [separator]);
513
- else
514
- this._pushOperator((RadonArray), [separator]);
515
- };
516
- /**
517
- * Count the number of items.
518
- * @returns A `RadonInteger` object.
519
- */
520
- RadonArray.prototype.length = function () {
521
- return this._pushOperator(RadonInteger, []);
522
- };
523
- /**
524
- * Map all items in the array with the given `innerScript`.
525
- * @param innerScript Mapping script returning some `RadonAny` object.
526
- * Must accept as input the same data type as the one of the items being iterated.
527
- * @returns A `RadonArray` object containing the mapped values.
528
- */
529
- RadonArray.prototype.map = function (innerScript) {
530
- return this._pushOperator(RadonArray, [innerScript]);
531
- };
532
- // public map<OutputItemsType extends RadonAny>(innerScript: RadonOperator<OutputItemsType>) {
533
- // // todo: check script's input type matches array's items type, if any ??
534
- // return this._pushOperator(RadonArray<OutputItemsType>, [innerScript])
535
- // }
536
- /**
537
- * Reduce all items in the array into a single value.
538
- * @param reductor The reductor method to be applied. All array items must be
539
- * convertable into float values.
540
- * @returns A `RadonFloat` object.
541
- */
542
- RadonArray.prototype.reduce = function (reductor) {
543
- return this._pushOperator(RadonFloat, [reductor]);
544
- };
545
- /**
546
- * Order the array items based either on the results of applying the given `innerScript` to every item, or on the
547
- * actual item values (as long as these are either integers or strings).
548
- * Fails if applied on non-homegenous arrays (i.e. not all items sharing the same `RadonAny`).
549
- * @param innerScript (Optional) Sorting script returning either a `RadonInteger` or a `RadonString` object.
550
- * @returns A `RadonArray` object.
551
- */
552
- // TODO
553
- // public sort(innerScript?: RadonOperator<RadonString | RadonInteger>) {
554
- // return this._pushOperator(RadonArray<ItemsType>, [innerScript])
555
- // }
556
- /**
557
- * Take a selection of items from the input array.
558
- * @param indexes Indexes of the input items to take into the output array.
559
- * @return A `RadonArray` object.
560
- */
561
- RadonArray.prototype.pick = function () {
562
- var indexes = [];
563
- for (var _i = 0; _i < arguments.length; _i++) {
564
- indexes[_i] = arguments[_i];
565
- }
566
- if (Array(indexes).length == 0) {
567
- throw new EvalError("\u001B[1;33mRadonArray::pick: a non-empty array of numbers must be provided\u001B[0m");
568
- }
569
- return this._pushOperator((RadonArray), __spreadArray([], __read(indexes), false));
570
- };
571
- return RadonArray;
572
- }(RadonAny));
573
- exports.RadonArray = RadonArray;
574
- var RadonBoolean = /** @class */ (function (_super) {
575
- __extends(RadonBoolean, _super);
576
- function RadonBoolean() {
577
- return _super !== null && _super.apply(this, arguments) || this;
578
- }
579
- /**
580
- * Reverse value.
581
- * @returns A `RadonBoolean` object.
582
- */
583
- RadonBoolean.prototype.negate = function () {
584
- return this._pushOperator(RadonBoolean, []);
585
- };
586
- /**
587
- * Cast value into a string.
588
- * @returns A `RadonString` object.
589
- */
590
- RadonBoolean.prototype.stringify = function () {
591
- return this._pushOperator(RadonString, []);
592
- };
593
- return RadonBoolean;
594
- }(RadonAny));
595
- exports.RadonBoolean = RadonBoolean;
596
- var RadonBytes = /** @class */ (function (_super) {
597
- __extends(RadonBytes, _super);
598
- function RadonBytes() {
599
- return _super !== null && _super.apply(this, arguments) || this;
600
- }
601
- /**
602
- * Convert buffer into (big-endian) integer.
603
- * @returns A `RadonBytes` object.
604
- */
605
- RadonBytes.prototype.asInteger = function () {
606
- return this._pushOperator(RadonInteger, []);
607
- };
608
- /**
609
- * Apply the SHA2-256 hash function.
610
- * @returns A `RadonBytes` object.
611
- */
612
- RadonBytes.prototype.hash = function () {
613
- return this._pushOperator(RadonBytes, []);
614
- };
615
- /**
616
- * Count the number of bytes.
617
- * @returns A `RadonInteger` object.
618
- */
619
- RadonBytes.prototype.length = function () {
620
- return this._pushOperator(RadonInteger, []);
621
- };
622
- /**
623
- * Returns a slice extracted from the input buffer.
624
- * A `startIndex` of 0 refers to the beginning of the input buffer. If no `endIndex` is provided, it will be assumed
625
- * the length of the input buffer. Negative values will be relative to the end of the input buffer.
626
- * @param startIndex Position within input buffer where the output buffer will start.
627
- * @param endIndex Position within input buffer where the output buffer will end
628
- * @returns A `RadonBytes` object.
629
- */
630
- RadonBytes.prototype.slice = function (startIndex, endIndex) {
631
- if (startIndex === void 0) { startIndex = 0; }
632
- return this._pushOperator(RadonBytes, [startIndex, endIndex]);
633
- };
634
- /**
635
- * Convert the input buffer into a string.
636
- * @param encoding Enum integer value specifying the encoding schema on the output string, standing:
637
- * 0 -> Hex string (default, if none was specified)
638
- * 1 -> Base64 string
639
- * @returns A `RadonString` object.
640
- */
641
- RadonBytes.prototype.stringify = function (encoding) {
642
- if (encoding === void 0) { encoding = RadonEncodings.HexString; }
643
- return this._pushOperator(RadonString, [encoding]);
644
- };
645
- RadonBytes.Encodings = RadonEncodings;
646
- return RadonBytes;
647
- }(RadonAny));
648
- exports.RadonBytes = RadonBytes;
649
- var RadonFloat = /** @class */ (function (_super) {
650
- __extends(RadonFloat, _super);
651
- function RadonFloat() {
652
- return _super !== null && _super.apply(this, arguments) || this;
653
- }
654
- /**
655
- * Compute the absolute value.
656
- * @returns A `RadonFloat` object.
657
- */
658
- RadonFloat.prototype.absolute = function () {
659
- return this._pushOperator(RadonFloat, []);
660
- };
661
- /**
662
- * Compute the lowest integer greater than or equal to the float value.
663
- * @returns A `RadonInteger` object.
664
- */
665
- RadonFloat.prototype.ceiling = function () {
666
- return this._pushOperator(RadonFloat, []);
667
- };
668
- /**
669
- * Compute the greatest integer less than or equal to the float value.
670
- * @returns A `RadonInteger` object.
671
- */
672
- RadonFloat.prototype.floor = function () {
673
- return this._pushOperator(RadonInteger, []);
674
- };
675
- /**
676
- * Determine if the float value is greater than the given `input`.
677
- * @param input
678
- * @returns A `RadonBoolean` object.
679
- */
680
- RadonFloat.prototype.greaterThan = function (input) {
681
- return this._pushOperator(RadonBoolean, [input]);
682
- };
683
- /**
684
- * Determine if the float value is less than the given `input`.
685
- * @param input
686
- * @returns A `RadonBoolean` object.
687
- */
688
- RadonFloat.prototype.lessThan = function (input) {
689
- return this._pushOperator(RadonBoolean, [input]);
690
- };
691
- /**
692
- * Compute the float remainder of dividing the value by the given `integer`.
693
- * @param integer
694
- * @returns A `RadonFloat` object.
695
- */
696
- RadonFloat.prototype.modulo = function (integer) {
697
- return this._pushOperator(RadonFloat, [integer]);
698
- };
699
- /**
700
- * Multiply the float value by the given `factor`.
701
- * @param factor
702
- * @returns A `RadonFloat` object.
703
- */
704
- RadonFloat.prototype.multiply = function (factor) {
705
- return this._pushOperator(RadonFloat, [factor]);
706
- };
707
- /**
708
- * Negate the float value.
709
- * @returns A `RadonFloat` object.
710
- */
711
- RadonFloat.prototype.negate = function () {
712
- return this._pushOperator(RadonFloat, []);
713
- };
714
- /**
715
- * Compute the float value raised to the power of given `exponent`
716
- * @param exponent
717
- * @returns A `RadonFloat` object.
718
- */
719
- RadonFloat.prototype.power = function (exponent) {
720
- return this._pushOperator(RadonFloat, [exponent]);
721
- };
722
- /**
723
- * Round to the closest integer value.
724
- * @returns A `RadonInteger` object.
725
- */
726
- RadonFloat.prototype.round = function () {
727
- return this._pushOperator(RadonInteger, []);
728
- };
729
- /**
730
- * Stringify the float value.
731
- * @returns A `RadonString` object.
732
- */
733
- RadonFloat.prototype.stringify = function () {
734
- return this._pushOperator(RadonString, []);
735
- };
736
- /**
737
- * Take the integer part of the float value.
738
- * @returns A `RadonInteger` object.
739
- */
740
- RadonFloat.prototype.truncate = function () {
741
- return this._pushOperator(RadonInteger, []);
742
- };
743
- return RadonFloat;
744
- }(RadonAny));
745
- exports.RadonFloat = RadonFloat;
746
- var RadonInteger = /** @class */ (function (_super) {
747
- __extends(RadonInteger, _super);
748
- function RadonInteger() {
749
- return _super !== null && _super.apply(this, arguments) || this;
750
- }
751
- /**
752
- * Compute the absolute value.
753
- * @returns A `RadonInteger` object.
754
- */
755
- RadonInteger.prototype.absolute = function () {
756
- return this._pushOperator(RadonInteger, []);
757
- };
758
- /**
759
- * Determine if the integer value is greater than the given `input`.
760
- * @param input
761
- * @returns A `RadonBoolean` object.
762
- */
763
- RadonInteger.prototype.greaterThan = function (input) {
764
- return this._pushOperator(RadonBoolean, [input]);
765
- };
766
- /**
767
- * Determine if the integer value is less than the given `input`.
768
- * @param input
769
- * @returns A `RadonBoolean` object.
770
- */
771
- RadonInteger.prototype.lessThan = function (input) {
772
- return this._pushOperator(RadonBoolean, [input]);
773
- };
774
- /**
775
- * Compute the remainder of dividing the value by the given `integer`.
776
- * @param integer
777
- * @returns A `RadonFloat` object.
778
- */
779
- RadonInteger.prototype.modulo = function (integer) {
780
- return this._pushOperator(RadonInteger, [integer]);
781
- };
782
- /**
783
- * Multiply the value by the given `integer`.
784
- * @param integer
785
- * @returns A `RadonInteger` object.
786
- */
787
- RadonInteger.prototype.multiply = function (integer) {
788
- return this._pushOperator(RadonInteger, [integer]);
789
- };
790
- /**
791
- * Negate the integer value.
792
- * @returns A `RadonFloat` object.
793
- */
794
- RadonInteger.prototype.negate = function () {
795
- return this._pushOperator(RadonInteger, []);
796
- };
797
- /**
798
- * Compute the value raised to the power of given `exponent`
799
- * @param exponent
800
- * @returns A `RadonInteger` object.
801
- */
802
- RadonInteger.prototype.power = function (exponent) {
803
- return this._pushOperator(RadonInteger, [exponent]);
804
- };
805
- /**
806
- * Stringify the value.
807
- * @returns A `RadonString` object.
808
- */
809
- RadonInteger.prototype.stringify = function () {
810
- return this._pushOperator(RadonString, []);
811
- };
812
- /**
813
- * Cast into a big-endian bytes buffer.
814
- * @returns A `RadonBytes` object.
815
- */
816
- RadonInteger.prototype.toBytes = function () {
817
- return this._pushOperator(RadonBytes, []);
818
- };
819
- /**
820
- * Cast into a float value.
821
- * @returns A `RadonFloat` object.
822
- */
823
- RadonInteger.prototype.toFloat = function () {
824
- return this._pushOperator(RadonFloat, []);
825
- };
826
- return RadonInteger;
827
- }(RadonAny));
828
- exports.RadonInteger = RadonInteger;
829
- var RadonMap = /** @class */ (function (_super) {
830
- __extends(RadonMap, _super);
831
- function RadonMap() {
832
- return _super !== null && _super.apply(this, arguments) || this;
833
- }
834
- /**
835
- * Alter the value of the item(s) identified by `keys`, applying the given `innerScript` to each one of them.
836
- * @param key
837
- * @param innerScript
838
- * @returns The same RadonMap upon which this operator is executed, with the specified item(s) altered
839
- * by the given `innerScript`.
840
- */
841
- // TODO
842
- // public alter<AlteredOutputType extends RadonAny>(innerScript: RadonOperator<AlteredOutputType>, ...keys: string[]) {
843
- // return this._pushOperator(RadonMap, [innerScript, ...keys])
844
- // }
845
- /**
846
- * Fetch the array within the specified `key` field.
847
- * @param key
848
- * @returns A `RadonArray` object.
849
- */
850
- RadonMap.prototype.getArray = function (key, _itemsType) {
851
- return this._pushOperator((RadonArray), [key]);
852
- };
853
- /**
854
- * Fetch the boolean within the specified `key` field.
855
- * @param key
856
- * @returns A `RadonBoolean` object.
857
- */
858
- RadonMap.prototype.getBoolean = function (key) {
859
- return this._pushOperator(RadonBoolean, [key]);
860
- };
861
- /**
862
- * Fetch the float value within the specified `key` field.
863
- * @param key
864
- * @returns A `RadonFloat` object.
865
- */
866
- RadonMap.prototype.getFloat = function (key) {
867
- return this._pushOperator(RadonFloat, [key]);
868
- };
869
- /**
870
- * Fetch the integer value within the specified `key` field.
871
- * @param key
872
- * @returns A `RadonInteger` object.
873
- */
874
- RadonMap.prototype.getInteger = function (key) {
875
- return this._pushOperator(RadonInteger, [key]);
876
- };
877
- /**
878
- * Fetch the map object within the specified `key` field.
879
- * @param key
880
- * @returns A `RadonMap` object.
881
- */
882
- RadonMap.prototype.getMap = function (key) {
883
- return this._pushOperator(RadonMap, [key]);
884
- };
885
- /**
886
- * Fetch the string within the specified `key` field.
887
- * @param key
888
- * @returns A `RadonString` object.
889
- */
890
- RadonMap.prototype.getString = function (key) {
891
- return this._pushOperator(RadonString, [key]);
892
- };
893
- /**
894
- * Extract key names of the map into an array of strings.
895
- * @returns A `RadonArray` object.
896
- */
897
- RadonMap.prototype.keys = function () {
898
- return this._pushOperator((RadonArray), []);
899
- };
900
- /**
901
- * Take a selection of items from the input map. Fails if unexistent items are referred.
902
- * @param keys Key string of the input items to take into the output map.
903
- * @return A `RadonMap` object.
904
- */
905
- RadonMap.prototype.pick = function () {
906
- var keys = [];
907
- for (var _i = 0; _i < arguments.length; _i++) {
908
- keys[_i] = arguments[_i];
909
- }
910
- if (Array(keys).length == 0) {
911
- throw new EvalError("\u001B[1;33mRadonMap::pick: a non-empty array of key strings must be provided\u001B[0m");
912
- }
913
- return this._pushOperator(RadonMap, __spreadArray([], __read(keys), false));
914
- };
915
- /**
916
- * Extract the map values into an array.
917
- * @returns A `RadonArray` object.
918
- */
919
- RadonMap.prototype.values = function () {
920
- return this._pushOperator(RadonArray, []);
921
- };
922
- /**
923
- * Stringify input `RadonMap` object into a JSON string.
924
- * @return A `RadonString` object.
925
- */
926
- RadonMap.prototype.stringify = function () {
927
- return this._pushOperator(RadonString, []);
928
- };
929
- return RadonMap;
930
- }(RadonAny));
931
- exports.RadonMap = RadonMap;
932
- var RadonString = /** @class */ (function (_super) {
933
- __extends(RadonString, _super);
934
- function RadonString() {
935
- return _super !== null && _super.apply(this, arguments) || this;
936
- }
937
- /**
938
- * Cast into a boolean value.
939
- * @returns A `RadonBoolean` object.
940
- */
941
- RadonString.prototype.asBoolean = function () {
942
- return this._pushOperator(RadonBoolean, []);
943
- };
944
- /**
945
- * Convert the input string into a bytes buffer.
946
- * @param encoding Enum integer value specifying the encoding schema on the input string, standing:
947
- * 0 -> Hex string (default, if none was specified)
948
- * 1 -> Base64 string
949
- * @returns A `RadonBytes` object.
950
- */
951
- RadonString.prototype.asBytes = function (encoding) {
952
- if (encoding === void 0) { encoding = RadonEncodings.HexString; }
953
- return this._pushOperator(RadonBytes, [encoding]);
954
- };
955
- /**
956
- * Cast into a float number.
957
- * @returns A `RadonFloat` object.
958
- */
959
- RadonString.prototype.asFloat = function () {
960
- return this._pushOperator(RadonFloat, []);
961
- };
962
- /**
963
- * Count the number of chars.
964
- * @returns A `RadonInteger` object.
965
- */
966
- RadonString.prototype.length = function () {
967
- return this._pushOperator(RadonInteger, []);
968
- };
969
- /**
970
- * Replace the string by a value of type `outputType`, determined on whether the string value matches
971
- * any of the keys within the provided `matchingMap`, or set to a `defaultValue` if no match is found.
972
- * @param outputType Radon type of the output value.
973
- * @param matchingMap Map determining the output value depending on the string value.
974
- * @param defaultValue Value returned if no match is found.
975
- * @returns
976
- */
977
- RadonString.prototype.match = function (outputType, matchingMap, defaultValue) {
978
- return this._pushOperator(outputType, [matchingMap, defaultValue]);
979
- // this._bytecode = [
980
- // 0x75,
981
- // matchingMap,
982
- // defaultValue
983
- // ]
984
- // this._method = "match"
985
- // this._params = `{ ${Object.entries(matchingMap).map((entry: [string, any]) => `\"${entry[0]}\": ${entry[1]}, `)}}, ${defaultValue}`
986
- // let keys: string = ""
987
- // Object.keys(matchingMap).map((key: string) => keys += key + ";")
988
- // return new outputType(this, keys)
989
- };
990
- /**
991
- * Parse input string as an array of JSON items.
992
- * @param jsonPaths (optional) Array of JSON paths within input `RadonString` from where to fetch items that will be appended to the output `RadonArray`.
993
- * @returns A `RadonArray` object.
994
- */
995
- RadonString.prototype.parseJSONArray = function () {
996
- var jsonPaths = [];
997
- for (var _i = 0; _i < arguments.length; _i++) {
998
- jsonPaths[_i] = arguments[_i];
999
- }
1000
- return this._pushOperator((RadonArray), __spreadArray([], __read(jsonPaths), false));
1001
- };
1002
- /**
1003
- * Parse string as a JSON-encoded map.
1004
- * @param jsonPath (optional) JSON path within input `RadonString` from where to extract the output `RadonMap`.
1005
- * @returns A `RadonMap` object.
1006
- */
1007
- RadonString.prototype.parseJSONMap = function (jsonPath) {
1008
- return this._pushOperator(RadonMap, [jsonPath]);
1009
- };
1010
- /**
1011
- * Parse string as an XML-encoded map.
1012
- * @returns A `RadonMap` object.
1013
- */
1014
- RadonString.prototype.parseXMLMap = function () {
1015
- return this._pushOperator(RadonMap, []);
1016
- };
1017
- /**
1018
- * Replace with given `replacement` string, all parts of the input string that match with given regular expression.
1019
- * @param regex Regular expression to be matched.
1020
- * @param replacement Text that will replace all occurences.
1021
- * @returns A `RadonString` object.
1022
- */
1023
- RadonString.prototype.replace = function (regex, replacement) {
1024
- if (regex === void 0) { regex = ""; }
1025
- if (replacement === void 0) { replacement = ""; }
1026
- return this._pushOperator(RadonString, [regex, replacement]);
1027
- };
1028
- /**
1029
- * Returns a slice extracted from the input string.
1030
- * A `startIndex` of 0 refers to the beginning of the input string. If no `endIndex` is provided, it will be assumed
1031
- * the length of the input string. Negative values will be relative to the end of the input string.
1032
- * @param startIndex Position within input string where the output string will start.
1033
- * @param endIndex Position within input string where the output string will end.
1034
- * @returns A `RadonString` object.
1035
- */
1036
- RadonString.prototype.slice = function (startIndex, endIndex) {
1037
- if (startIndex === void 0) { startIndex = 0; }
1038
- return this._pushOperator(RadonString, [startIndex, endIndex]);
1039
- };
1040
- /**
1041
- * Divides input string into an array of substrings,
1042
- * @param regex The string or regular expression to use for splitting.
1043
- * @returns A `RadonArray` object.
1044
- */
1045
- RadonString.prototype.split = function (regex) {
1046
- if (regex === void 0) { regex = "\r"; }
1047
- return this._pushOperator((RadonArray), [regex]);
1048
- };
1049
- /**
1050
- * Lower case all characters.
1051
- * @returns A `RadonString` object.
1052
- */
1053
- RadonString.prototype.toLowercase = function () {
1054
- return this._pushOperator(RadonString, []);
1055
- };
1056
- /**
1057
- * Upper case all characters.
1058
- * @returns A `RadonString` object.
1059
- */
1060
- RadonString.prototype.toUpperCase = function () {
1061
- return this._pushOperator(RadonString, []);
1062
- };
1063
- return RadonString;
1064
- }(RadonAny));
1065
- exports.RadonString = RadonString;
1066
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JhZG9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2QkFBMkM7QUFDM0MseURBQTRDO0FBRzVDLDhDQUFpQztBQUVqQyxJQUFZLGNBR1g7QUFIRCxXQUFZLGNBQWM7SUFDdEIsNkRBQWEsQ0FBQTtJQUNiLHVEQUFVLENBQUE7QUFDZCxDQUFDLEVBSFcsY0FBYyw4QkFBZCxjQUFjLFFBR3pCO0FBRUQsSUFBWSxjQW9FWDtBQXBFRCxXQUFZLGNBQWM7SUFDdEIsa0VBQWtCLENBQUE7SUFDbEIsa0VBQWtCLENBQUE7SUFDbEIsOERBQWdCLENBQUE7SUFDaEIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsc0VBQW9CLENBQUE7SUFDcEIsc0VBQW9CLENBQUE7SUFDcEIsMEVBQXNCLENBQUE7SUFDdEIsa0VBQWtCLENBQUE7SUFDbEIsd0VBQXFCLENBQUE7SUFDckIsNERBQWUsQ0FBQTtJQUNmLGtFQUFrQixDQUFBO0lBQ2xCLDhEQUFnQixDQUFBO0lBQ2hCLDhEQUFnQixDQUFBO0lBQ2hCLDRFQUF1QixDQUFBO0lBQ3ZCLHNFQUFvQixDQUFBO0lBQ3BCLHdFQUFxQixDQUFBO0lBQ3JCLDhEQUFnQixDQUFBO0lBQ2hCLHdFQUFxQixDQUFBO0lBQ3JCLGtFQUFrQixDQUFBO0lBQ2xCLGdFQUFpQixDQUFBO0lBQ2pCLHNFQUFvQixDQUFBO0lBQ3BCLHdFQUFxQixDQUFBO0lBQ3JCLG9FQUFtQixDQUFBO0lBQ25CLDRFQUF1QixDQUFBO0lBQ3ZCLGdFQUFpQixDQUFBO0lBQ2pCLHNFQUFvQixDQUFBO0lBQ3BCLGtFQUFrQixDQUFBO0lBQ2xCLHNFQUFvQixDQUFBO0lBQ3BCLGtFQUFrQixDQUFB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QUNEOzs7O09BSUc7SUFDSSwyQkFBSyxHQUFaLFVBQWEsS0FBb0I7UUFBcEIsc0JBQUEsRUFBQSxZQUFvQjtRQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQSxVQUF1QixDQUFBLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFDRDs7O09BR0c7SUFDSSxpQ0FBVyxHQUFsQjtRQUNJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUNEOzs7T0FHRztJQUNJLGlDQUFXLEdBQWxCO1FBQ0ksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM5QyxDQUFDO0lBQ0wsa0JBQUM7QUFBRCxDQUFDLEFBMUhELENBQWlDLFFBQVEsR0EwSHhDO0FBMUhZLGtDQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZW5jb2RlIGFzIGNib3JFbmNvZGUgfSBmcm9tIFwiY2JvclwiXG5pbXBvcnQgKiBhcyBoZWxwZXJzIGZyb20gXCIuLi8uLi9iaW4vaGVscGVyc1wiXG5cbmltcG9ydCB7IE9wY29kZXMgYXMgUmFkb25SZWR1Y2VyT3Bjb2RlcyB9IGZyb20gJy4vcmVkdWNlcnMnXG5pbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuLi91dGlscydcblxuZXhwb3J0IGVudW0gUmFkb25FbmNvZGluZ3Mge1xuICAgIEhleFN0cmluZyA9IDAsXG4gICAgQmFzZTY0ID0gMSxcbn1cblxuZXhwb3J0IGVudW0gUmFkb25PcGVyYXRvcnMge1xuICAgIEFycmF5TGVuZ3RoID0gMHgxMCxcbiAgICBBcnJheUZpbHRlciA9IDB4MTEsXG4gICAgQXJyYXlKb2luID0gMHgxMixcbiAgICBBcnJheUdldEFycmF5ID0gMHgxMyxcbiAgICBBcnJheUdldEJvb2xlYW4gPSAweDE0LFxuICAgIEFycmF5R2V0Qnl0ZXMgPSAweDE1LFxuICAgIEFycmF5R2V0RmxvYXQgPSAweDE2LFxuICAgIEFycmF5R2V0SW50ZWdlciA9IDB4MTcsXG4gICAgQXJyYXlHZXRNYXAgPSAweDE4LFxuICAgIEFycmF5R2V0U3RyaW5nID0gMHgxOSxcbiAgICBBcnJheU1hcCA9IDB4MWEsXG4gICAgQXJyYXlSZWR1Y2UgPSAweDFiLFxuICAgIEFycmF5U29ydCA9IDB4MWQsXG4gICAgQXJyYXlQaWNrID0gMHgxZSxcbiAgICBCb29sZWFuU3RyaW5naWZ5ID0gMHgyMCxcbiAgICBCb29sZWFuTmVnYXRlID0gMHgyMixcbiAgICBCeXRlc1N0cmluZ2lmeSA9IDB4MzAsXG4gICAgQnl0ZXNIYXNoID0gMHgzMSxcbiAgICBCeXRlc0FzSW50ZWdlciA9IDB4MzIsXG4gICAgQnl0ZXNMZW5ndGggPSAweDM0LFxuICAgIEJ5dGVzU2xpY2UgPSAweDNjLFxuICAgIEZsb2F0QWJzb2x1dGUgPSAweDUwLFxuICAgIEZsb2F0U3RyaW5naWZ5ID0gMHg1MSxcbiAgICBGbG9hdENlaWxpbmcgPSAweDUyLFxuICAgIEZsb2F0R3JlYXRlclRoYW4gPSAweDUzLFxuICAgIEZsb2F0Rmxvb3IgPSAweDU0LFxuICAgIEZsb2F0TGVzc1RoYW4gPSAweDU1LFxuICAgIEZsb2F0TW9kdWxlID0gMHg1NixcbiAgICBGbG9hdE11bHRpcGx5ID0gMHg1NyxcbiAgICBGbG9hdE5lZ2F0ZSA9IDB4NTgsXG4gICAgRmxvYXRQb3dlciA9IDB4NTksXG4gICAgRmxvYXRSb3VuZCA9IDB4NWIsXG4gICAgRmxvYXRUcnVuY2F0ZSA9IDB4NWQsXG4gICAgSW50ZWdlckFic29sdXRlID0gMHg0MCxcbiAgICBJbnRlZ2VyVG9GbG9hdCA9IDB4NDEsXG4gICAgSW50ZWdlclN0cmluZ2lmeSA9IDB4NDIsXG4gICAgSW50ZWdlckdyZWF0ZXJUaGFuID0gMHg0MyxcbiAgICBJbnRlZ2VyTGVzc1RoYW4gPSAweDQ0LFxuICAgIEludGVnZXJNb2R1bG8gPSAweDQ2LFxuICAgIEludGVnZXJNdWx0aXBseSA9IDB4NDcsXG4gICAgSW50ZWdlck5lZ2F0ZSA9IDB4NDgsXG4gICAgSW50ZWdlclBvd2VyID0gMHg0OSxcbiAgICBJbnRlZ2VyVG9CeXRlcyA9IDB4NGEsXG4gICAgTWFwU3RyaW5naWZ5ID0gMHg2MCxcbiAgICBNYXBHZXRBcnJheSA9IDB4NjEsXG4gICAgTWFwR2V0Qm9vbGVhbiA9IDB4NjIsXG4gICAgTWFwR2V0RmxvYXQgPSAweDY0LFxuICAgIE1hcEdldEludGVnZXIgPSAweDY1LFxuICAgIE1hcEdldE1hcCA9IDB4NjYsXG4gICAgTWFwR2V0U3RyaW5nID0gMHg2NyxcbiAgICBNYXBLZXlzID0gMHg2OCxcbiAgICBNYXBWYWx1ZXMgPSAweDY5LFxuICAgIE1hcEFsdGVyID0gMHg2YixcbiAgICBNYXBQaWNrID0gMHg2ZSwgICBcbiAgICBTdHJpbmdBc0Jvb2xlYW4gPSAweDcwLFxuICAgIFN0cmluZ0FzQnl0ZXMgPSAweDcxLFxuICAgIFN0cmluZ0FzRmxvYXQgPSAweDcyLFxuICAgIFN0cmluZ0xlbmd0aCA9IDB4NzQsXG4gICAgU3RyaW5nTWF0Y2ggPSAweDc1LFxuICAgIFN0cmluZ1BhcnNlSlNPTkFycmF5ID0gMHg3NixcbiAgICBTdHJpbmdQYXJzZUpTT05NYXAgPSAweDc3LFxuICAgIFN0cmluZ1BhcnNlWE1MTWFwID0gMHg3OCxcbiAgICBTdHJpbmdUb0xvd2VyQ2FzZSA9IDB4NzksXG4gICAgU3RyaW5nVG9VcHBzZXJDYXNlID0gMHg3YSxcbiAgICBTdHJpbmdQYXJzZVJlcGxhY2UgPSAweDdiLFxuICAgIFN0cmluZ1BhcnNlU2xpY2UgPSAweDdjLFxuICAgIFN0cmluZ1BhcnNlU3BsaXQgPSAweDdkLFxufVxuXG5hYnN0cmFjdCBjbGFzcyBSYWRvbkNsYXNzIHtcbiAgICByZWFkb25seSBwcmV2PzogUmFkb25PcGVyYXRvcjtcbiAgICBjb25zdHJ1Y3RvcihwcmV2PzogUmFkb25PcGVyYXRvcikge1xuICAgICAgICB0aGlzLnByZXYgPSBwcmV2XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25PcGVyYXRvciBleHRlbmRzIFJhZG9uQ2xhc3Mge1xuICAgIHJlYWRvbmx5IG9wY29kZTogUmFkb25PcGVyYXRvcnNcbiAgICByZWFkb25seSBwYXJhbXM/OiBhbnlbXVxuICAgIGNvbnN0cnVjdG9yKG9wY29kZTogUmFkb25PcGVyYXRvcnMsIHBhcmFtcz86IGFueVtdLCBvcHM/OiBSYWRvbk9wZXJhdG9yKSB7XG4gICAgICAgIHN1cGVyKG9wcylcbiAgICAgICAgdGhpcy5vcGNvZGUgPSBvcGNvZGVcbiAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXMgfHwgW11cbiAgICB9XG4gICAgcHVibGljIGFyZ3NDb3VudCgpOiBudW1iZXIgeyBcbiAgICAgICAgbGV0IG1heENvdW50OiBudW1iZXIgPSAwXG4gICAgICAgIHRoaXMucGFyYW1zPy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY291bnQgPSBoZWxwZXJzLmdldFdpbGRjYXJkc0NvdW50RnJvbVN0cmluZyhwYXJhbSlcbiAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBtYXhDb3VudCkgbWF4Q291bnQgPSBjb3VudFxuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW0gPT09ICdvYmplY3QnICYmIHBhcmFtIGluc3RhbmNlb2YgUmFkb25TY3JpcHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IHBhcmFtLmFyZ3NDb3VudCgpXG4gICAgICAgICAgICAgICAgaWYgKGNvdW50ID4gbWF4Q291bnQpIG1heENvdW50ID0gY291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KFxuICAgICAgICAgICAgbWF4Q291bnQsXG4gICAgICAgICAgICB0aGlzLnByZXY/LmFyZ3NDb3VudCgpIHx8IDBcbiAgICAgICAgKVxuICAgIH1cbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcz8ucHJldj8uZGlzZWN0KGxldmVsKSB8fCBbXVxuICAgICAgICBjb25zdCBvcGVyYXRvciA9IFJhZG9uT3BlcmF0b3JzW3RoaXMub3Bjb2RlXVxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBgUmFkb24ke29wZXJhdG9yLnNwbGl0KC8oPz1bQS1aXSkvKVswXX1gXG4gICAgICAgIGxldCByYWRvbkNhbGwgPSBvcGVyYXRvci5zcGxpdCgvKD89W0EtWl0pLykuc2xpY2UoMSkuam9pbignJylcbiAgICAgICAgcmFkb25DYWxsID0gcmFkb25DYWxsLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcmFkb25DYWxsLnNsaWNlKDEpXG4gICAgICAgIGxldCBhcmdzID0gXCJcIlxuICAgICAgICBsZXQgc2NyaXB0XG4gICAgICAgIGlmICh0aGlzLnBhcmFtcyAmJiB0aGlzLnBhcmFtc1swXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5tYXAocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW0gIT09ICdvYmplY3QnIHx8ICEocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJyA/ICBgXCIke3BhcmFtfVwiYCA6IHBhcmFtLnRvU3RyaW5nKCkpICsgXCIsIFwiXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2NyaXB0ID0gcGFyYW1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgaWYgKHNjcmlwdCkgYXJncyArPSBcIlJhZG9uT3BlcmF0b3Ige1wiXG4gICAgICAgICAgICBlbHNlIGFyZ3MgPSBhcmdzLnNsaWNlKDAsIC0yKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzY3JpcHQpIHtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dFR5cGUgPSBgJHsoc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5vdXRwdXRUeXBlPy5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiUmFkb25BbnlcIn1gXG4gICAgICAgICAgICByYWRvbkNhbGwgKz0gYCgke2FyZ3N9YFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXG4gICAgICAgICAgICByZXN1bHQucHVzaCguLi4oc2NyaXB0IGFzIFJhZG9uU2NyaXB0KS5kaXNlY3QobGV2ZWwgKyAxKSlcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKFtsZXZlbCwgb3V0cHV0VHlwZSwgXCJ9KVwiXSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJhZG9uQ2FsbCArPSBgKCR7YXJnc30pYFxuICAgICAgICAgICAgcmVzdWx0LnB1c2goW2xldmVsLCBpbnB1dFR5cGUsIHJhZG9uQ2FsbF0pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH1cbiAgICBwdWJsaWMgZW5jb2RlKCk6IGFueVtdIHsgXG4gICAgICAgIGxldCBlbmNvZGVkXG4gICAgICAgIGlmICh0aGlzPy5wYXJhbXMgJiYgdGhpcy5wYXJhbXNbMF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYXJncyA9IHRoaXMucGFyYW1zLm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25BbnkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5wcmV2Py5lbmNvZGUoKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgUmFkb25PcGVyYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLmVuY29kZSgpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgZW5jb2RlZCA9IFt0aGlzLm9wY29kZSwgLi4uYXJnc11cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVuY29kZWQgPSB0aGlzLm9wY29kZVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnByZXYpIHtcbiAgICAgICAgICAgIHJldHVybiBbLi4udGhpcy5wcmV2LmVuY29kZSgpLCBlbmNvZGVkXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtlbmNvZGVkXVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyByZXBsYWNlV2lsZGNhcmRzKGFyZ3M6IHN0cmluZ1tdKTogUmFkb25PcGVyYXRvciB7XG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IHRoaXMuYXJnc0NvdW50KCkpIHtcbiAgICAgICAgICAgIHRocm93IEV2YWxFcnJvcihgSW5zdWZmaWNlbnQgYXJncyB3ZXJlIHByb3ZpZGVkICgke2FyZ3MubGVuZ3RofSA8ICR7dGhpcy5hcmdzQ291bnQoKX0pYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJhZG9uT3BlcmF0b3IoXG4gICAgICAgICAgICB0aGlzLm9wY29kZSwgXG4gICAgICAgICAgICB0aGlzLnBhcmFtcz8ubWFwKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGVscGVycy5yZXBsYWNlV2lsZGNhcmRzKHBhcmFtLCBhcmdzKVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbS5yZXBsYWNlV2lsZGNhcmRzKC4uLmFyZ3MpXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIFxuICAgICAgICAgICAgdGhpcz8ucHJldj8ucmVwbGFjZVdpbGRjYXJkcyhhcmdzKVxuICAgICAgICApXG4gICAgfVxuICAgIHB1YmxpYyBzcGxpY2VXaWxkY2FyZChhcmdJbmRleDogbnVtYmVyLCBhcmdWYWx1ZTogc3RyaW5nKTogUmFkb25PcGVyYXRvciB7XG4gICAgICAgIHJldHVybiBuZXcgUmFkb25PcGVyYXRvcihcbiAgICAgICAgICAgIHRoaXMub3Bjb2RlLFxuICAgICAgICAgICAgdGhpcy5wYXJhbXM/Lm1hcChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMuc3BsaWNlV2lsZGNhcmQocGFyYW0sIGFyZ0luZGV4LCBhcmdWYWx1ZSwgdGhpcy5hcmdzQ291bnQoKSlcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCcgJiYgcGFyYW0gaW5zdGFuY2VvZiBSYWRvblNjcmlwdCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW0uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGhpcz8ucHJldj8uc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXgsIGFyZ1ZhbHVlKVxuICAgICAgICApXG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gNCwgbGV2ZWwgPSAwKTogc3RyaW5nIHsgXG4gICAgICAgIGNvbnN0IGxmID0gbGVmdCAhPT0gXCJcIiA/IFwiXFxuXCIgOiBcIlwiXG4gICAgICAgIGxldCBzdHIgPSB0aGlzPy5wcmV2Py50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsKSB8fCBcIlwiXG4gICAgICAgIGxldCBtZXRob2ROYW1lID0gUmFkb25PcGVyYXRvcnNbdGhpcy5vcGNvZGVdLnNwbGl0KC8oPz1bQS1aXSkvKS5zbGljZSgxKS5qb2luKCcnKVxuICAgICAgICBtZXRob2ROYW1lID0gbWV0aG9kTmFtZS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIG1ldGhvZE5hbWUuc2xpY2UoMSlcbiAgICAgICAgc3RyICs9IGAke2xlZnR9JHtcIiBcIi5yZXBlYXQoaW5kZW50ICogbGV2ZWwpfS4ke21ldGhvZE5hbWV9KGBcbiAgICAgICAgaWYgKHRoaXMucGFyYW1zICYmIHRoaXMucGFyYW1zWzBdICE9PSB1bmRlZmluZWQpIHsgXG4gICAgICAgICAgICB0aGlzLnBhcmFtcy5mb3JFYWNoKHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gYFwiJHtwYXJhbX1cIiwgYFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhcmFtID09PSAnb2JqZWN0JyAmJiBwYXJhbSBpbnN0YW5jZW9mIFJhZG9uU2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciArPSBgJHtwYXJhbS50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9JHtsZWZ0fSR7XCIgXCIucmVwZWF0KGluZGVudCAqIGxldmVsKX0sIGBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHIgKz0gcGFyYW0udG9TdHJpbmcoKSArIFwiLCBcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBzdHIgPSBzdHIuc2xpY2UoMCwgLTIpXG4gICAgICAgIH1cbiAgICAgICAgc3RyICs9IGApJHtsZn1gXG4gICAgICAgIHJldHVybiBzdHJcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvblNjcmlwdCB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG9wcz86IFJhZG9uT3BlcmF0b3I7XG4gICAgcHVibGljIHJlYWRvbmx5IGlucHV0VHlwZT86IFJhZG9uQW55O1xuICAgIHB1YmxpYyByZWFkb25seSBvdXRwdXRUeXBlPzogUmFkb25Bbnk7XG4gICAgY29uc3RydWN0b3IgKG91dHB1dDogUmFkb25BbnkpIHtcbiAgICAgICAgdGhpcy5vcHMgPSBvdXRwdXQ/LnByZXY7XG4gICAgICAgIGNvbnN0IHJhZG9uVHlwZXMgPSB7XG4gICAgICAgICAgICBcIkFycmF5XCI6IFJhZG9uQXJyYXksXG4gICAgICAgICAgICBcIkJvb2xlYW5cIjogUmFkb25Cb29sZWFuLFxuICAgICAgICAgICAgXCJCeXRlc1wiOiBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgXCJGbG9hdFwiOiBSYWRvbkZsb2F0LFxuICAgICAgICAgICAgXCJJbnRlZ2VyXCI6IFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFwiTWFwXCI6IFJhZG9uTWFwLFxuICAgICAgICAgICAgXCJTdHJpbmdcIjogUmFkb25TdHJpbmcsXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlucHV0ID0gb3V0cHV0Py5wcmV2XG4gICAgICAgIHdoaWxlIChpbnB1dD8ucHJldikgaW5wdXQgPSBpbnB1dD8ucHJldlxuICAgICAgICBjb25zdCBpbnB1dFR5cGUgPSBPYmplY3QuZW50cmllcyhyYWRvblR5cGVzKS5maW5kKChbcHJlZml4LCBfXSkgPT4gaW5wdXQgJiYgUmFkb25PcGVyYXRvcnNbaW5wdXQub3Bjb2RlXS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgIGlmIChpbnB1dFR5cGUgJiYgaW5wdXRUeXBlWzFdKSB0aGlzLmlucHV0VHlwZSA9IG5ldyBpbnB1dFR5cGVbMV0oKVxuICAgICAgICBjb25zdCBvdXRwdXRUeXBlID0gT2JqZWN0LnZhbHVlcyhyYWRvblR5cGVzKS5maW5kKG91dHB1dFR5cGUgPT4gb3V0cHV0IGluc3RhbmNlb2Ygb3V0cHV0VHlwZSk7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLm91dHB1dFR5cGUgPSBuZXcgb3V0cHV0VHlwZSgpXG4gICAgfVxuICAgIHB1YmxpYyBhcmdzQ291bnQoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5hcmdzQ291bnQoKSB8fCAwO1xuICAgIH1cbiAgICBwdWJsaWMgZGlzZWN0KGxldmVsID0gMCk6IFtudW1iZXIsIHN0cmluZywgc3RyaW5nXVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub3BzPy5kaXNlY3QobGV2ZWwpIHx8IFtbbGV2ZWwsIFwiUmFkb25BbnlcIiwgXCJcIl1dXG4gICAgfVxuICAgIHB1YmxpYyBlbmNvZGUoKTogYW55W10ge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHM/LmVuY29kZSgpIHx8IFtdO1xuICAgIH1cbiAgICBwdWJsaWMgcmVwbGFjZVdpbGRjYXJkcyguLi5hcmdzOiBzdHJpbmdbXSk6IFJhZG9uQW55IHtcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgUmFkb25GbG9hdCxcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFJhZG9uTWFwLFxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5yZXBsYWNlV2lsZGNhcmRzKGFyZ3MpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3QgcmVwbGFjZSB3aWxkY2FyZHMgb24gZW1wdHkgc2NyaXB0YClcbiAgICAgICAgfVxuICAgIH1cbiAgICBwdWJsaWMgc3BsaWNlV2lsZGNhcmQoYXJnSW5kZXg6IG51bWJlciwgYXJnVmFsdWU6IHN0cmluZyk6IFJhZG9uQW55IHtcbiAgICAgICAgY29uc3QgT3V0cHV0VHlwZSA9IFtcbiAgICAgICAgICAgIFJhZG9uQXJyYXksXG4gICAgICAgICAgICBSYWRvbkJvb2xlYW4sXG4gICAgICAgICAgICBSYWRvbkJ5dGVzLFxuICAgICAgICAgICAgUmFkb25GbG9hdCxcbiAgICAgICAgICAgIFJhZG9uSW50ZWdlcixcbiAgICAgICAgICAgIFJhZG9uTWFwLFxuICAgICAgICAgICAgUmFkb25TdHJpbmcsXG4gICAgICAgIF0uZmluZChPdXRwdXRUeXBlID0+IHRoaXMub3V0cHV0VHlwZSBpbnN0YW5jZW9mIE91dHB1dFR5cGUpO1xuICAgICAgICBpZiAoT3V0cHV0VHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRUeXBlKHRoaXMub3BzPy5zcGxpY2VXaWxkY2FyZChhcmdJbmRleCwgYXJnVmFsdWUpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXZhbEVycm9yKGBDYW5ub3Qgc3BsaWNlIHdpbGRjYXJkcyBvbiBlbXB0eSBzY3JpcHRgKVxuICAgICAgICB9XG4gICAgfVxuICAgIHB1YmxpYyB0b0J5dGVjb2RlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBVdGlscy50b0hleFN0cmluZyhPYmplY3QudmFsdWVzKFVpbnQ4QXJyYXkuZnJvbShjYm9yRW5jb2RlKHRoaXMuZW5jb2RlKCkpKSksIHRydWUpXG4gICAgfVxuICAgIHB1YmxpYyB0b1N0cmluZyhsZWZ0ID0gXCJcIiwgaW5kZW50ID0gMCwgbGV2ZWwgPSAwKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbGYgPSBsZWZ0ICE9PSBcIlwiID8gXCJcXG5cIiA6IFwiXCJcbiAgICAgICAgcmV0dXJuIGBSYWRvbk9wZXJhdG9yKCR7dGhpcy5pbnB1dFR5cGU/LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJcIn0pJHtsZn0ke3RoaXMub3BzPy50b1N0cmluZyhsZWZ0LCBpbmRlbnQsIGxldmVsICsgMSl9YFxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJhZG9uQW55IGV4dGVuZHMgUmFkb25DbGFzcyB7XG4gICAgcHJvdGVjdGVkIF9wdXNoT3BlcmF0b3I8T3V0cHV0VHlwZSBleHRlbmRzIFJhZG9uQW55PihcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcob3BzPzogUmFkb25PcGVyYXRvcik6IE91dHB1dFR5cGU7IH0sIFxuICAgICAgICBwYXJhbXM6IGFueVtdLFxuICAgICk6IE91dHB1dFR5cGUge1xuICAgICAgICBsZXQgbmFtZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gKGVyciBhcyBFcnJvcilcbiAgICAgICAgICAgIG5hbWUgPSByZXN1bHQuc3RhY2s/LnNwbGl0KCcgYXQgJylbMl1cbiAgICAgICAgICAgICAgICAuc3BsaXQoJyAnKVswXVxuICAgICAgICAgICAgICAgIC5zcGxpdCgnLicpXG4gICAgICAgICAgICAgICAgLm1hcChwYXJ0ID0+IGhlbHBlcnMudG9VcHBlckNhbWVsQ2FzZShwYXJ0KSlcbiAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAuc3BsaXQoLyg/PVtBLVpdKS8pLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgLmpvaW4oJycpXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3Bjb2RlID0gUmFkb25PcGVyYXRvcnNbbmFtZSBhcyBrZXlvZiB0eXBlb2YgUmFkb25PcGVyYXRvcnNdXG4gICAgICAgIGlmICghb3Bjb2RlKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgRmF0YWw6IHVua25vd24gUmFkb24gT3BlcmF0b3Igb3Bjb2RlICcke25hbWV9J2ApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IG91dHB1dFR5cGUobmV3IFJhZG9uT3BlcmF0b3IoXG4gICAgICAgICAgICAgICAgb3Bjb2RlLCBcbiAgICAgICAgICAgICAgICBbLi4ucGFyYW1zXSwgXG4gICAgICAgICAgICAgICAgdGhpcz8ucHJldlxuICAgICAgICAgICAgKSlcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55PiB7XG4gICAgaXRlbXNUeXBlOiBJdGVtc1R5cGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvbkFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+IGV4dGVuZHMgUmFkb25Bbnkge1xuICAgIC8qKlxuICAgICAqIERpc2NhcmQgdGhlIGl0ZW1zIGluIHRoZSBpbnB1dCBhcnJheSB0aGF0IG1ha2UgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYGZhbHNlYCB2YWx1ZS4gXG4gICAgICogQHBhcmFtIHNjcmlwdCBGaWx0ZXJpbmcgc2NyaXB0IHVsdGltYXRlbHkgcmV0dXJuaW5nIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqIE11c3QgYWNjZXB0IGFzIGlucHV0IHRoZSBzYW1lIGRhdGEgdHlwZXMgYXMgdGhlIG9uZXMgb2YgdGhlIGl0ZW1zIGJlaW5nIGl0ZXJhdGVkLiBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QgY29udGFpbmluZyBvbmx5IHRoZSBpdGVtcyB0aGF0IG1ha2UgdGhlIGBpbm5lclNjcmlwdGAgdG8gcmV0dXJuIGEgYHRydWVgIHZhbHVlLiBcbiAgICAgKi9cbiAgICBwdWJsaWMgZmlsdGVyKGlubmVyU2NyaXB0OiBSYWRvbkJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCEoaW5uZXJTY3JpcHQgaW5zdGFuY2VvZiBSYWRvbkJvb2xlYW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXZhbEVycm9yKGBJbm5lciBzY3JpcHQgbXVzdCBmZXRjaCBhIFJhZG9uQm9vbGVhbiB2YWx1ZWApXG4gICAgICAgIH0gXG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbbmV3IFJhZG9uU2NyaXB0KGlubmVyU2NyaXB0KV0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gaW5kZXggXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5PFN1Ykl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5PFN1Ykl0ZW1zVHlwZT4sIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Qm9vbGVhbihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICogQHBhcmFtIGluZGV4IFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCeXRlcyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW2luZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmxvYXQoaW5kZXg6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBgaW5kZXhgIGFzIGEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBhcyBhIGBSYWRvbk1hcGAgb2JqZWN0LlxuICAgICAqIEBwYXJhbSBpbmRleCBcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0TWFwKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2luZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGBpbmRleGAgYXMgYSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gaW5kZXggXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25TdHJpbmcsIFtpbmRleF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEpvaW4gYWxsIGl0ZW1zIG9mIHRoZSBhcnJheSBpbnRvIGEgdmFsdWUgb2YgdGhlIGdpdmVuIHR5cGUuIFRoZSBhcnJheSBtdXN0IGJlIGhvbW9nZW5lb3VzLCBcbiAgICAgKiBhbGwgaXRlbXMgYmVpbmcgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGUgb3V0cHV0VHlwZWAsIGlmIHNwZWNpZmllZCwgb3IgdGhlIEFycmF5J3MgaXRlbXNUeXBlIG90aGVyd2lzZS5cbiAgICAgKiBAcGFyYW0gc2VwYXJhdG9yIFNlcGFyYXRvciB0byBiZSB1c2VkIHdoZW4gam9pbmluZyBzdHJpbmdzLiBXaGVuIGpvaW5pbmcgUmFkb25NYXBzLCBpdCBjYW4gYmUgdXNlZCB0byBzZXR0bGUgYmFzZSBzY2hlbWEgb24gcmVzdWx0aW5nIG9iamVjdC5cbiAgICAgKiBAcGFyYW0gb3V0cHV0VHlwZSBSYWRvbiB0eXBlIG9mIHRoZSBvdXRwdXQgdmFsdWUuIFxuICAgICAqL1xuICAgIHB1YmxpYyBqb2luPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uQW55PihzZXBhcmF0b3IgPSBcIlwiLCBvdXRwdXRUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XG4gICAgICAgIGlmIChvdXRwdXRUeXBlKSB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxPdXRwdXRUeXBlPiwgW3NlcGFyYXRvcl0pXG4gICAgICAgIGVsc2UgdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8SXRlbXNUeXBlPiwgW3NlcGFyYXRvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgaXRlbXMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogTWFwIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YC4gXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IE1hcHBpbmcgc2NyaXB0IHJldHVybmluZyBzb21lIGBSYWRvbkFueWAgb2JqZWN0LlxuICAgICAqIE11c3QgYWNjZXB0IGFzIGlucHV0IHRoZSBzYW1lIGRhdGEgdHlwZSBhcyB0aGUgb25lIG9mIHRoZSBpdGVtcyBiZWluZyBpdGVyYXRlZC4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG1hcHBlZCB2YWx1ZXMuIFxuICAgICAqL1xuICAgIHB1YmxpYyBtYXAoaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkFycmF5LCBbaW5uZXJTY3JpcHRdKVxuICAgIH1cbiAgICAvLyBwdWJsaWMgbWFwPE91dHB1dEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55Pihpbm5lclNjcmlwdDogUmFkb25PcGVyYXRvcjxPdXRwdXRJdGVtc1R5cGU+KSB7XG4gICAgLy8gICAgIC8vIHRvZG86IGNoZWNrIHNjcmlwdCdzIGlucHV0IHR5cGUgbWF0Y2hlcyBhcnJheSdzIGl0ZW1zIHR5cGUsIGlmIGFueSA/P1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8T3V0cHV0SXRlbXNUeXBlPiwgW2lubmVyU2NyaXB0XSlcbiAgICAvLyB9XG4gICAgLyoqXG4gICAgICogUmVkdWNlIGFsbCBpdGVtcyBpbiB0aGUgYXJyYXkgaW50byBhIHNpbmdsZSB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gcmVkdWN0b3IgVGhlIHJlZHVjdG9yIG1ldGhvZCB0byBiZSBhcHBsaWVkLiBBbGwgYXJyYXkgaXRlbXMgbXVzdCBiZSBcbiAgICAgKiBjb252ZXJ0YWJsZSBpbnRvIGZsb2F0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHJlZHVjZShyZWR1Y3RvcjogUmFkb25SZWR1Y2VyT3Bjb2Rlcykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtyZWR1Y3Rvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE9yZGVyIHRoZSBhcnJheSBpdGVtcyBiYXNlZCBlaXRoZXIgb24gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGdpdmVuIGBpbm5lclNjcmlwdGAgdG8gZXZlcnkgaXRlbSwgb3Igb24gdGhlIFxuICAgICAqIGFjdHVhbCBpdGVtIHZhbHVlcyAoYXMgbG9uZyBhcyB0aGVzZSBhcmUgZWl0aGVyIGludGVnZXJzIG9yIHN0cmluZ3MpLlxuICAgICAqIEZhaWxzIGlmIGFwcGxpZWQgb24gbm9uLWhvbWVnZW5vdXMgYXJyYXlzIChpLmUuIG5vdCBhbGwgaXRlbXMgc2hhcmluZyB0aGUgc2FtZSBgUmFkb25BbnlgKS4gXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IChPcHRpb25hbCkgU29ydGluZyBzY3JpcHQgcmV0dXJuaW5nIGVpdGhlciBhIGBSYWRvbkludGVnZXJgIG9yIGEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIC8vIFRPRE9cbiAgICAvLyBwdWJsaWMgc29ydChpbm5lclNjcmlwdD86IFJhZG9uT3BlcmF0b3I8UmFkb25TdHJpbmcgfCBSYWRvbkludGVnZXI+KSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbaW5uZXJTY3JpcHRdKVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBUYWtlIGEgc2VsZWN0aW9uIG9mIGl0ZW1zIGZyb20gdGhlIGlucHV0IGFycmF5LlxuICAgICAqIEBwYXJhbSBpbmRleGVzIEluZGV4ZXMgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IGFycmF5LiBcbiAgICAgKiBAcmV0dXJuIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGljayguLi5pbmRleGVzOiBudW1iZXJbXSkge1xuICAgICAgICBpZiAoQXJyYXkoaW5kZXhlcykubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFdmFsRXJyb3IoYFxceDFiWzE7MzNtUmFkb25BcnJheTo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2YgbnVtYmVycyBtdXN0IGJlIHByb3ZpZGVkXFx4MWJbMG1gKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBbLi4uaW5kZXhlc10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25Cb29sZWFuIGV4dGVuZHMgUmFkb25Bbnkge1xuICAgIC8qKlxuICAgICAqIFJldmVyc2UgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIG5lZ2F0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXN0IHZhbHVlIGludG8gYSBzdHJpbmcuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25CeXRlcyBleHRlbmRzIFJhZG9uQW55IHtcbiAgICBzdGF0aWMgcmVhZG9ubHkgRW5jb2RpbmdzID0gUmFkb25FbmNvZGluZ3M7XG4gICAgLyoqXG4gICAgICogQ29udmVydCBidWZmZXIgaW50byAoYmlnLWVuZGlhbikgaW50ZWdlci5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGFzSW50ZWdlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBBcHBseSB0aGUgU0hBMi0yNTYgaGFzaCBmdW5jdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJ5dGVzYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGhhc2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25CeXRlcywgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgYnl0ZXMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIHNsaWNlIGV4dHJhY3RlZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuIFxuICAgICAqIEEgYHN0YXJ0SW5kZXhgIG9mIDAgcmVmZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4gSWYgbm8gYGVuZEluZGV4YCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBhc3N1bWVkIFxuICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlci4gTmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgYnVmZmVyLlxuICAgICAqIEBwYXJhbSBzdGFydEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBidWZmZXIgd2hlcmUgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBzdGFydC5cbiAgICAgKiBAcGFyYW0gZW5kSW5kZXggUG9zaXRpb24gd2l0aGluIGlucHV0IGJ1ZmZlciB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciB3aWxsIGVuZFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJ5dGVzLCBbc3RhcnRJbmRleCwgZW5kSW5kZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRoZSBpbnB1dCBidWZmZXIgaW50byBhIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZW5jb2RpbmcgRW51bSBpbnRlZ2VyIHZhbHVlIHNwZWNpZnlpbmcgdGhlIGVuY29kaW5nIHNjaGVtYSBvbiB0aGUgb3V0cHV0IHN0cmluZywgc3RhbmRpbmc6XG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeShlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbZW5jb2RpbmddKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhZG9uRmxvYXQgZXh0ZW5kcyBSYWRvbkFueSB7XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgYWJzb2x1dGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhYnNvbHV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgbG93ZXN0IGludGVnZXIgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBmbG9hdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC4gXG4gICAgICovXG4gICAgcHVibGljIGNlaWxpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZ3JlYXRlc3QgaW50ZWdlciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGZsb2F0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBmbG9vcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGZsb2F0IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXG4gICAgICogQHBhcmFtIGlucHV0XG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGUgZmxvYXQgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBgaW5wdXRgLlxuICAgICAqIEBwYXJhbSBpbnB1dCBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkJvb2xlYW5gIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGVzc1RoYW4oaW5wdXQ6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQm9vbGVhbiwgW2lucHV0XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgZmxvYXQgcmVtYWluZGVyIG9mIGRpdmlkaW5nIHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbW9kdWxvKGludGVnZXI6IG51bWJlciB8IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtpbnRlZ2VyXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogTXVsdGlwbHkgdGhlIGZsb2F0IHZhbHVlIGJ5IHRoZSBnaXZlbiBgZmFjdG9yYC5cbiAgICAgKiBAcGFyYW0gZmFjdG9yIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC4gXG4gICAgICovXG4gICAgcHVibGljIG11bHRpcGx5KGZhY3RvcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW2ZhY3Rvcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0aGUgZmxvYXQgdmFsdWUuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uRmxvYXRgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgbmVnYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBmbG9hdCB2YWx1ZSByYWlzZWQgdG8gdGhlIHBvd2VyIG9mIGdpdmVuIGBleHBvbmVudGBcbiAgICAgKiBAcGFyYW0gZXhwb25lbnRcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkZsb2F0LCBbZXhwb25lbnRdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSb3VuZCB0byB0aGUgY2xvc2VzdCBpbnRlZ2VyIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyByb3VuZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdHJpbmdpZnkgdGhlIGZsb2F0IHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHN0cmluZ2lmeSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB0aGUgZmxvYXQgdmFsdWUuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0cnVuY2F0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtdKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhZG9uSW50ZWdlciBleHRlbmRzIFJhZG9uQW55IHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSBhYnNvbHV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWJzb2x1dGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIHRoZSBpbnRlZ2VyIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gYGlucHV0YC4gXG4gICAgICogQHBhcmFtIGlucHV0XG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdyZWF0ZXJUaGFuKGlucHV0OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkJvb2xlYW4sIFtpbnB1dF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGUgaW50ZWdlciB2YWx1ZSBpcyBsZXNzIHRoYW4gdGhlIGdpdmVuIGBpbnB1dGAuIFxuICAgICAqIEBwYXJhbSBpbnB1dFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZXNzVGhhbihpbnB1dDogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbaW5wdXRdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlIHRoZSByZW1haW5kZXIgb2YgZGl2aWRpbmcgdGhlIHZhbHVlIGJ5IHRoZSBnaXZlbiBgaW50ZWdlcmAuXG4gICAgICogQHBhcmFtIGludGVnZXIgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBtb2R1bG8oaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE11bHRpcGx5IHRoZSB2YWx1ZSBieSB0aGUgZ2l2ZW4gYGludGVnZXJgLlxuICAgICAqIEBwYXJhbSBpbnRlZ2VyIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LiBcbiAgICAgKi9cbiAgICBwdWJsaWMgbXVsdGlwbHkoaW50ZWdlcjogbnVtYmVyIHwgc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbaW50ZWdlcl0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIE5lZ2F0ZSB0aGUgaW50ZWdlciB2YWx1ZS4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBuZWdhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29tcHV0ZSB0aGUgdmFsdWUgcmFpc2VkIHRvIHRoZSBwb3dlciBvZiBnaXZlbiBgZXhwb25lbnRgXG4gICAgICogQHBhcmFtIGV4cG9uZW50XG4gICAgICogQHJldHVybnMgQSBgUmFkb25JbnRlZ2VyYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBvd2VyKGV4cG9uZW50OiBudW1iZXIgfCBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbkludGVnZXIsIFtleHBvbmVudF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFN0cmluZ2lmeSB0aGUgdmFsdWUuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ2FzdCBpbnRvIGEgYmlnLWVuZGlhbiBieXRlcyBidWZmZXIuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25CeXRlc2Agb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b0J5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXN0IGludG8gYSBmbG9hdCB2YWx1ZS5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvRmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFkb25NYXAgZXh0ZW5kcyBSYWRvbkFueSB7XG4gICAgLyoqXG4gICAgICogQWx0ZXIgdGhlIHZhbHVlIG9mIHRoZSBpdGVtKHMpIGlkZW50aWZpZWQgYnkgYGtleXNgLCBhcHBseWluZyB0aGUgZ2l2ZW4gYGlubmVyU2NyaXB0YCB0byBlYWNoIG9uZSBvZiB0aGVtLlxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHBhcmFtIGlubmVyU2NyaXB0IFxuICAgICAqIEByZXR1cm5zIFRoZSBzYW1lIFJhZG9uTWFwIHVwb24gd2hpY2ggdGhpcyBvcGVyYXRvciBpcyBleGVjdXRlZCwgd2l0aCB0aGUgc3BlY2lmaWVkIGl0ZW0ocykgYWx0ZXJlZFxuICAgICAqIGJ5IHRoZSBnaXZlbiBgaW5uZXJTY3JpcHRgLlxuICAgICAqL1xuICAgIC8vIFRPRE9cbiAgICAvLyBwdWJsaWMgYWx0ZXI8QWx0ZXJlZE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueT4oaW5uZXJTY3JpcHQ6IFJhZG9uT3BlcmF0b3I8QWx0ZXJlZE91dHB1dFR5cGU+LCAuLi5rZXlzOiBzdHJpbmdbXSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbaW5uZXJTY3JpcHQsIC4uLmtleXNdKVxuICAgIC8vIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgYXJyYXkgd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldEFycmF5PEl0ZW1zVHlwZSBleHRlbmRzIFJhZG9uQW55ID0gUmFkb25Bbnk+KGtleTogc3RyaW5nLCBfaXRlbXNUeXBlPzogeyBuZXcoKTogSXRlbXNUeXBlOyB9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25BcnJheTxJdGVtc1R5cGU+LCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGJvb2xlYW4gd2l0aGluIHRoZSBzcGVjaWZpZWQgYGtleWAgZmllbGQuIFxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25Cb29sZWFuYCBvYmplY3QuIFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRCb29sZWFuKGtleTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIGZsb2F0IHZhbHVlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLlxuICAgICAqIEBwYXJhbSBrZXkgXG4gICAgICogQHJldHVybnMgQSBgUmFkb25GbG9hdGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGbG9hdChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uRmxvYXQsIFtrZXldKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZXRjaCB0aGUgaW50ZWdlciB2YWx1ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC4gXG4gICAgICogQHBhcmFtIGtleSBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkludGVnZXJgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SW50ZWdlcihrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uSW50ZWdlciwgW2tleV0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIEZldGNoIHRoZSBtYXAgb2JqZWN0IHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBrZXlgIGZpZWxkLiBcbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldE1hcChrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmV0Y2ggdGhlIHN0cmluZyB3aXRoaW4gdGhlIHNwZWNpZmllZCBga2V5YCBmaWVsZC5cbiAgICAgKiBAcGFyYW0ga2V5IFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGdldFN0cmluZyhrZXk6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBba2V5XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdCBrZXkgbmFtZXMgb2YgdGhlIG1hcCBpbnRvIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBrZXlzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGFrZSBhIHNlbGVjdGlvbiBvZiBpdGVtcyBmcm9tIHRoZSBpbnB1dCBtYXAuIEZhaWxzIGlmIHVuZXhpc3RlbnQgaXRlbXMgYXJlIHJlZmVycmVkLlxuICAgICAqIEBwYXJhbSBrZXlzIEtleSBzdHJpbmcgb2YgdGhlIGlucHV0IGl0ZW1zIHRvIHRha2UgaW50byB0aGUgb3V0cHV0IG1hcC4gXG4gICAgICogQHJldHVybiBBIGBSYWRvbk1hcGAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBwaWNrKC4uLmtleXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmIChBcnJheShrZXlzKS5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEV2YWxFcnJvcihgXFx4MWJbMTszM21SYWRvbk1hcDo6cGljazogYSBub24tZW1wdHkgYXJyYXkgb2Yga2V5IHN0cmluZ3MgbXVzdCBiZSBwcm92aWRlZFxceDFiWzBtYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uTWFwLCBbLi4ua2V5c10pXG5cbiAgICB9XG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgbWFwIHZhbHVlcyBpbnRvIGFuIGFycmF5LlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQXJyYXlgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXksIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBTdHJpbmdpZnkgaW5wdXQgYFJhZG9uTWFwYCBvYmplY3QgaW50byBhIEpTT04gc3RyaW5nLlxuICAgICAqIEByZXR1cm4gQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RyaW5naWZ5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYWRvblN0cmluZyBleHRlbmRzIFJhZG9uQW55IHtcbiAgICAvKipcbiAgICAgKiBDYXN0IGludG8gYSBib29sZWFuIHZhbHVlLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQm9vbGVhbmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc0Jvb2xlYW4oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25Cb29sZWFuLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29udmVydCB0aGUgaW5wdXQgc3RyaW5nIGludG8gYSBieXRlcyBidWZmZXIuXG4gICAgICogQHBhcmFtIGVuY29kaW5nIEVudW0gaW50ZWdlciB2YWx1ZSBzcGVjaWZ5aW5nIHRoZSBlbmNvZGluZyBzY2hlbWEgb24gdGhlIGlucHV0IHN0cmluZywgc3RhbmRpbmc6XG4gICAgICogICAwIC0+IEhleCBzdHJpbmcgKGRlZmF1bHQsIGlmIG5vbmUgd2FzIHNwZWNpZmllZClcbiAgICAgKiAgIDEgLT4gQmFzZTY0IHN0cmluZ1xuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uQnl0ZXNgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXNCeXRlcyhlbmNvZGluZyA9IFJhZG9uRW5jb2RpbmdzLkhleFN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQnl0ZXMsIFtlbmNvZGluZ10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENhc3QgaW50byBhIGZsb2F0IG51bWJlci5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkZsb2F0YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIGFzRmxvYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25GbG9hdCwgW10pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvdW50IHRoZSBudW1iZXIgb2YgY2hhcnMuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uSW50ZWdlcmAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25JbnRlZ2VyLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwbGFjZSB0aGUgc3RyaW5nIGJ5IGEgdmFsdWUgb2YgdHlwZSBgb3V0cHV0VHlwZWAsIGRldGVybWluZWQgb24gd2hldGhlciB0aGUgc3RyaW5nIHZhbHVlIG1hdGNoZXMgXG4gICAgICogYW55IG9mIHRoZSBrZXlzIHdpdGhpbiB0aGUgcHJvdmlkZWQgYG1hdGNoaW5nTWFwYCwgb3Igc2V0IHRvIGEgYGRlZmF1bHRWYWx1ZWAgaWYgbm8gbWF0Y2ggaXMgZm91bmQuXG4gICAgICogQHBhcmFtIG91dHB1dFR5cGUgUmFkb24gdHlwZSBvZiB0aGUgb3V0cHV0IHZhbHVlLiBcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdNYXAgTWFwIGRldGVybWluaW5nIHRoZSBvdXRwdXQgdmFsdWUgZGVwZW5kaW5nIG9uIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBWYWx1ZSByZXR1cm5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZC4gXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIG1hdGNoPE91dHB1dFR5cGUgZXh0ZW5kcyBSYWRvbkFueSA9IFJhZG9uU3RyaW5nPihcbiAgICAgICAgb3V0cHV0VHlwZTogeyBuZXcocHJldj86IFJhZG9uT3BlcmF0b3IpOiBPdXRwdXRUeXBlOyB9LCBcbiAgICAgICAgbWF0Y2hpbmdNYXA6IE1hcDxzdHJpbmcsIGFueT4sIFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGFueVxuICAgICkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKG91dHB1dFR5cGUsIFttYXRjaGluZ01hcCwgZGVmYXVsdFZhbHVlXSlcbiAgICAgICAgLy8gdGhpcy5fYnl0ZWNvZGUgPSBbIFxuICAgICAgICAvLyAgICAgMHg3NSwgIFxuICAgICAgICAvLyAgICAgbWF0Y2hpbmdNYXAsXG4gICAgICAgIC8vICAgICBkZWZhdWx0VmFsdWVcbiAgICAgICAgLy8gXVxuICAgICAgICAvLyB0aGlzLl9tZXRob2QgPSBcIm1hdGNoXCJcbiAgICAgICAgLy8gdGhpcy5fcGFyYW1zID0gYHsgJHtPYmplY3QuZW50cmllcyhtYXRjaGluZ01hcCkubWFwKChlbnRyeTogW3N0cmluZywgYW55XSkgPT4gYFxcXCIke2VudHJ5WzBdfVxcXCI6ICR7ZW50cnlbMV19LCBgKX19LCAke2RlZmF1bHRWYWx1ZX1gXG4gICAgICAgIC8vIGxldCBrZXlzOiBzdHJpbmcgPSBcIlwiXG4gICAgICAgIC8vIE9iamVjdC5rZXlzKG1hdGNoaW5nTWFwKS5tYXAoKGtleTogc3RyaW5nKSA9PiBrZXlzICs9IGtleSArIFwiO1wiKVxuICAgICAgICAvLyByZXR1cm4gbmV3IG91dHB1dFR5cGUodGhpcywga2V5cylcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2UgaW5wdXQgc3RyaW5nIGFzIGFuIGFycmF5IG9mIEpTT04gaXRlbXMuIFxuICAgICAqIEBwYXJhbSBqc29uUGF0aHMgKG9wdGlvbmFsKSBBcnJheSBvZiBKU09OIHBhdGhzIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZmV0Y2ggaXRlbXMgdGhhdCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYFJhZG9uQXJyYXlgLiBcbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvbkFycmF5YCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHBhcnNlSlNPTkFycmF5KC4uLmpzb25QYXRoczogc3RyaW5nW10pOiBSYWRvbkFycmF5PFJhZG9uQW55PiB7IFxuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25Bbnk+LCBbLi4uanNvblBhdGhzXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGEgSlNPTi1lbmNvZGVkIG1hcC4gXG4gICAgICogQHBhcmFtIGpzb25QYXRoIChvcHRpb25hbCkgSlNPTiBwYXRoIHdpdGhpbiBpbnB1dCBgUmFkb25TdHJpbmdgIGZyb20gd2hlcmUgdG8gZXh0cmFjdCB0aGUgb3V0cHV0IGBSYWRvbk1hcGAuIFxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uTWFwYCBvYmplY3QuIFxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJzZUpTT05NYXAoanNvblBhdGg/OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvbk1hcCwgW2pzb25QYXRoXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogUGFyc2Ugc3RyaW5nIGFzIGFuIFhNTC1lbmNvZGVkIG1hcC4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25NYXBgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VYTUxNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wdXNoT3BlcmF0b3IoUmFkb25NYXAsIFtdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXBsYWNlIHdpdGggZ2l2ZW4gYHJlcGxhY2VtZW50YCBzdHJpbmcsIGFsbCBwYXJ0cyBvZiB0aGUgaW5wdXQgc3RyaW5nIHRoYXQgbWF0Y2ggd2l0aCBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24uIFxuICAgICAqIEBwYXJhbSByZWdleCBSZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgbWF0Y2hlZC5cbiAgICAgKiBAcGFyYW0gcmVwbGFjZW1lbnQgVGV4dCB0aGF0IHdpbGwgcmVwbGFjZSBhbGwgb2NjdXJlbmNlcy4gXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVwbGFjZShyZWdleDogc3RyaW5nID0gXCJcIiwgcmVwbGFjZW1lbnQ6IHN0cmluZyA9IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3JlZ2V4LCByZXBsYWNlbWVudF0pXG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBzbGljZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgc3RyaW5nLiBcbiAgICAgKiBBIGBzdGFydEluZGV4YCBvZiAwIHJlZmVycyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJpbmcuIElmIG5vIGBlbmRJbmRleGAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgYXNzdW1lZCBcbiAgICAgKiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnB1dCBzdHJpbmcuIE5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmluZy5cbiAgICAgKiBAcGFyYW0gc3RhcnRJbmRleCBQb3NpdGlvbiB3aXRoaW4gaW5wdXQgc3RyaW5nIHdoZXJlIHRoZSBvdXRwdXQgc3RyaW5nIHdpbGwgc3RhcnQuXG4gICAgICogQHBhcmFtIGVuZEluZGV4IFBvc2l0aW9uIHdpdGhpbiBpbnB1dCBzdHJpbmcgd2hlcmUgdGhlIG91dHB1dCBzdHJpbmcgd2lsbCBlbmQuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25TdHJpbmdgIG9iamVjdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2xpY2Uoc3RhcnRJbmRleDogbnVtYmVyID0gMCwgZW5kSW5kZXg/OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW3N0YXJ0SW5kZXgsIGVuZEluZGV4XSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogRGl2aWRlcyBpbnB1dCBzdHJpbmcgaW50byBhbiBhcnJheSBvZiBzdWJzdHJpbmdzLCBcbiAgICAgKiBAcGFyYW0gcmVnZXggVGhlIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gdG8gdXNlIGZvciBzcGxpdHRpbmcuXG4gICAgICogQHJldHVybnMgQSBgUmFkb25BcnJheWAgb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyBzcGxpdChyZWdleDogc3RyaW5nID0gXCJcXHJcIikge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uQXJyYXk8UmFkb25TdHJpbmc+LCBbcmVnZXhdKVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBMb3dlciBjYXNlIGFsbCBjaGFyYWN0ZXJzLlxuICAgICAqIEByZXR1cm5zIEEgYFJhZG9uU3RyaW5nYCBvYmplY3QuXG4gICAgICovXG4gICAgcHVibGljIHRvTG93ZXJjYXNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcHVzaE9wZXJhdG9yKFJhZG9uU3RyaW5nLCBbXSlcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBwZXIgY2FzZSBhbGwgY2hhcmFjdGVycy5cbiAgICAgKiBAcmV0dXJucyBBIGBSYWRvblN0cmluZ2Agb2JqZWN0LlxuICAgICAqL1xuICAgIHB1YmxpYyB0b1VwcGVyQ2FzZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3B1c2hPcGVyYXRvcihSYWRvblN0cmluZywgW10pXG4gICAgfVxufVxuIl19