@ultipa-graph/ultipa-driver 5.1.5-s5.2 → 6.0.4

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 (260) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +65 -0
  3. package/dist/client.d.ts +196 -0
  4. package/dist/client.js +394 -0
  5. package/dist/config.d.ts +65 -0
  6. package/dist/config.js +135 -0
  7. package/dist/connection.d.ts +30 -0
  8. package/dist/connection.js +190 -0
  9. package/dist/errors.d.ts +99 -0
  10. package/dist/errors.js +237 -0
  11. package/dist/index.d.ts +14 -5
  12. package/dist/index.js +88 -39
  13. package/dist/printers.d.ts +33 -0
  14. package/dist/printers.js +312 -0
  15. package/dist/proto/gqldb.proto +689 -0
  16. package/dist/response.d.ts +256 -0
  17. package/dist/response.js +723 -0
  18. package/dist/services/admin-service.d.ts +44 -0
  19. package/dist/services/admin-service.js +168 -0
  20. package/dist/services/bulk-import-service.d.ts +35 -0
  21. package/dist/services/bulk-import-service.js +105 -0
  22. package/dist/services/converters.d.ts +57 -0
  23. package/dist/services/converters.js +254 -0
  24. package/dist/services/data-service.d.ts +44 -0
  25. package/dist/services/data-service.js +206 -0
  26. package/dist/services/graph-service.d.ts +32 -0
  27. package/dist/services/graph-service.js +127 -0
  28. package/dist/services/health-service.d.ts +50 -0
  29. package/dist/services/health-service.js +78 -0
  30. package/dist/services/index.d.ts +13 -0
  31. package/dist/services/index.js +30 -0
  32. package/dist/services/query-service.d.ts +39 -0
  33. package/dist/services/query-service.js +112 -0
  34. package/dist/services/service-context.d.ts +39 -0
  35. package/dist/services/service-context.js +73 -0
  36. package/dist/services/session-service.d.ts +24 -0
  37. package/dist/services/session-service.js +66 -0
  38. package/dist/services/transaction-service.d.ts +33 -0
  39. package/dist/services/transaction-service.js +100 -0
  40. package/dist/services.d.ts +28 -0
  41. package/dist/services.js +122 -0
  42. package/dist/session.d.ts +45 -0
  43. package/dist/session.js +75 -0
  44. package/dist/transaction.d.ts +42 -0
  45. package/dist/transaction.js +89 -0
  46. package/dist/types/bulk_import.d.ts +53 -0
  47. package/dist/types/bulk_import.js +6 -0
  48. package/dist/types/data_types.d.ts +116 -0
  49. package/dist/types/data_types.js +122 -0
  50. package/dist/types/enums.d.ts +59 -0
  51. package/dist/types/enums.js +67 -0
  52. package/dist/types/graph_models.d.ts +54 -0
  53. package/dist/types/graph_models.js +6 -0
  54. package/dist/types/index.d.ts +11 -5
  55. package/dist/types/index.js +36 -37
  56. package/dist/types/metadata.d.ts +107 -0
  57. package/dist/types/metadata.js +6 -0
  58. package/dist/types/schema.d.ts +31 -0
  59. package/dist/types/schema.js +6 -0
  60. package/dist/types/typed_value.d.ts +25 -0
  61. package/dist/types/typed_value.js +1176 -0
  62. package/dist/types/wrappers.d.ts +23 -0
  63. package/dist/types/wrappers.js +39 -0
  64. package/dist/types.d.ts +7 -0
  65. package/dist/types.js +24 -0
  66. package/package.json +50 -63
  67. package/dist/connection/connection.final.d.ts +0 -14
  68. package/dist/connection/connection.final.js +0 -94
  69. package/dist/connection/connection.final.js.map +0 -1
  70. package/dist/connection/connection.pool.d.ts +0 -21
  71. package/dist/connection/connection.pool.js +0 -103
  72. package/dist/connection/connection.pool.js.map +0 -1
  73. package/dist/connection/extra/algos/algo.extra.d.ts +0 -34
  74. package/dist/connection/extra/algos/algo.extra.js +0 -69
  75. package/dist/connection/extra/algos/algo.extra.js.map +0 -1
  76. package/dist/connection/extra/algos/algo.utils.d.ts +0 -3
  77. package/dist/connection/extra/algos/algo.utils.js +0 -54
  78. package/dist/connection/extra/algos/algo.utils.js.map +0 -1
  79. package/dist/connection/extra/algos/community.d.ts +0 -27
  80. package/dist/connection/extra/algos/community.js +0 -76
  81. package/dist/connection/extra/algos/community.js.map +0 -1
  82. package/dist/connection/extra/algos/degrees.d.ts +0 -10
  83. package/dist/connection/extra/algos/degrees.js +0 -24
  84. package/dist/connection/extra/algos/degrees.js.map +0 -1
  85. package/dist/connection/extra/algos/embedding.d.ts +0 -13
  86. package/dist/connection/extra/algos/embedding.js +0 -33
  87. package/dist/connection/extra/algos/embedding.js.map +0 -1
  88. package/dist/connection/extra/algos/index.d.ts +0 -5
  89. package/dist/connection/extra/algos/index.js +0 -14
  90. package/dist/connection/extra/algos/index.js.map +0 -1
  91. package/dist/connection/extra/base.extra.d.ts +0 -18
  92. package/dist/connection/extra/base.extra.js +0 -111
  93. package/dist/connection/extra/base.extra.js.map +0 -1
  94. package/dist/connection/extra/batch.insert.extra.d.ts +0 -58
  95. package/dist/connection/extra/batch.insert.extra.js +0 -354
  96. package/dist/connection/extra/batch.insert.extra.js.map +0 -1
  97. package/dist/connection/extra/connection.base.d.ts +0 -112
  98. package/dist/connection/extra/connection.base.js +0 -530
  99. package/dist/connection/extra/connection.base.js.map +0 -1
  100. package/dist/connection/extra/connection.d.ts +0 -17
  101. package/dist/connection/extra/connection.js +0 -44
  102. package/dist/connection/extra/connection.js.map +0 -1
  103. package/dist/connection/extra/graph.extra.d.ts +0 -54
  104. package/dist/connection/extra/graph.extra.js +0 -151
  105. package/dist/connection/extra/graph.extra.js.map +0 -1
  106. package/dist/connection/extra/hdc.extra.d.ts +0 -89
  107. package/dist/connection/extra/hdc.extra.js +0 -322
  108. package/dist/connection/extra/hdc.extra.js.map +0 -1
  109. package/dist/connection/extra/index.extra.d.ts +0 -102
  110. package/dist/connection/extra/index.extra.js +0 -210
  111. package/dist/connection/extra/index.extra.js.map +0 -1
  112. package/dist/connection/extra/job.extra.d.ts +0 -32
  113. package/dist/connection/extra/job.extra.js +0 -122
  114. package/dist/connection/extra/job.extra.js.map +0 -1
  115. package/dist/connection/extra/meta.extra.d.ts +0 -36
  116. package/dist/connection/extra/meta.extra.js +0 -123
  117. package/dist/connection/extra/meta.extra.js.map +0 -1
  118. package/dist/connection/extra/policy.extra.d.ts +0 -32
  119. package/dist/connection/extra/policy.extra.js +0 -114
  120. package/dist/connection/extra/policy.extra.js.map +0 -1
  121. package/dist/connection/extra/privilege.extra.d.ts +0 -8
  122. package/dist/connection/extra/privilege.extra.js +0 -20
  123. package/dist/connection/extra/privilege.extra.js.map +0 -1
  124. package/dist/connection/extra/property.extra.d.ts +0 -66
  125. package/dist/connection/extra/property.extra.js +0 -190
  126. package/dist/connection/extra/property.extra.js.map +0 -1
  127. package/dist/connection/extra/schema.extra.d.ts +0 -108
  128. package/dist/connection/extra/schema.extra.js +0 -253
  129. package/dist/connection/extra/schema.extra.js.map +0 -1
  130. package/dist/connection/extra/search.extra.d.ts +0 -12
  131. package/dist/connection/extra/search.extra.js +0 -117
  132. package/dist/connection/extra/search.extra.js.map +0 -1
  133. package/dist/connection/extra/task.extra.d.ts +0 -24
  134. package/dist/connection/extra/task.extra.js +0 -107
  135. package/dist/connection/extra/task.extra.js.map +0 -1
  136. package/dist/connection/extra/user.extra.d.ts +0 -28
  137. package/dist/connection/extra/user.extra.js +0 -91
  138. package/dist/connection/extra/user.extra.js.map +0 -1
  139. package/dist/connection/extra/user.privilege.extra.d.ts +0 -64
  140. package/dist/connection/extra/user.privilege.extra.js +0 -273
  141. package/dist/connection/extra/user.privilege.extra.js.map +0 -1
  142. package/dist/connection/index.d.ts +0 -5
  143. package/dist/connection/index.js +0 -13
  144. package/dist/connection/index.js.map +0 -1
  145. package/dist/connection/network.manager.d.ts +0 -28
  146. package/dist/connection/network.manager.js +0 -179
  147. package/dist/connection/network.manager.js.map +0 -1
  148. package/dist/index.js.map +0 -1
  149. package/dist/printers/alias.d.ts +0 -2
  150. package/dist/printers/alias.js +0 -39
  151. package/dist/printers/alias.js.map +0 -1
  152. package/dist/printers/any.d.ts +0 -2
  153. package/dist/printers/any.js +0 -63
  154. package/dist/printers/any.js.map +0 -1
  155. package/dist/printers/array.aio.d.ts +0 -3
  156. package/dist/printers/array.aio.js +0 -259
  157. package/dist/printers/array.aio.js.map +0 -1
  158. package/dist/printers/common.d.ts +0 -0
  159. package/dist/printers/common.js +0 -1
  160. package/dist/printers/common.js.map +0 -1
  161. package/dist/printers/edge.d.ts +0 -5
  162. package/dist/printers/edge.js +0 -78
  163. package/dist/printers/edge.js.map +0 -1
  164. package/dist/printers/explain.plan.d.ts +0 -2
  165. package/dist/printers/explain.plan.js +0 -46
  166. package/dist/printers/explain.plan.js.map +0 -1
  167. package/dist/printers/index.d.ts +0 -24
  168. package/dist/printers/index.js +0 -43
  169. package/dist/printers/index.js.map +0 -1
  170. package/dist/printers/node.d.ts +0 -5
  171. package/dist/printers/node.js +0 -77
  172. package/dist/printers/node.js.map +0 -1
  173. package/dist/printers/path.d.ts +0 -3
  174. package/dist/printers/path.js +0 -62
  175. package/dist/printers/path.js.map +0 -1
  176. package/dist/printers/status.d.ts +0 -3
  177. package/dist/printers/status.js +0 -68
  178. package/dist/printers/status.js.map +0 -1
  179. package/dist/printers/table.d.ts +0 -2
  180. package/dist/printers/table.js +0 -56
  181. package/dist/printers/table.js.map +0 -1
  182. package/dist/proto/tmp.js +0 -366
  183. package/dist/proto/ultipa_grpc_pb.d.ts +0 -258
  184. package/dist/proto/ultipa_grpc_pb.js +0 -366
  185. package/dist/proto/ultipa_grpc_pb.js.map +0 -1
  186. package/dist/proto/ultipa_pb.d.ts +0 -1
  187. package/dist/proto/ultipa_pb.js +0 -12119
  188. package/dist/proto/ultipa_pb.js.map +0 -1
  189. package/dist/types/index.js.map +0 -1
  190. package/dist/types/types.algos.params.d.ts +0 -545
  191. package/dist/types/types.algos.params.js +0 -16
  192. package/dist/types/types.algos.params.js.map +0 -1
  193. package/dist/types/types.d.ts +0 -1214
  194. package/dist/types/types.extra.d.ts +0 -146
  195. package/dist/types/types.extra.js +0 -27
  196. package/dist/types/types.extra.js.map +0 -1
  197. package/dist/types/types.js +0 -1606
  198. package/dist/types/types.js.map +0 -1
  199. package/dist/types/util.d.ts +0 -15
  200. package/dist/types/util.js +0 -136
  201. package/dist/types/util.js.map +0 -1
  202. package/dist/utils/common.d.ts +0 -3
  203. package/dist/utils/common.js +0 -22
  204. package/dist/utils/common.js.map +0 -1
  205. package/dist/utils/config.d.ts +0 -3
  206. package/dist/utils/config.js +0 -7
  207. package/dist/utils/config.js.map +0 -1
  208. package/dist/utils/format.d.ts +0 -45
  209. package/dist/utils/format.js +0 -879
  210. package/dist/utils/format.js.map +0 -1
  211. package/dist/utils/index.d.ts +0 -10
  212. package/dist/utils/index.js +0 -30
  213. package/dist/utils/index.js.map +0 -1
  214. package/dist/utils/params.validate.d.ts +0 -4
  215. package/dist/utils/params.validate.js +0 -14
  216. package/dist/utils/params.validate.js.map +0 -1
  217. package/dist/utils/property.d.ts +0 -24
  218. package/dist/utils/property.js +0 -203
  219. package/dist/utils/property.js.map +0 -1
  220. package/dist/utils/raft.retry.d.ts +0 -0
  221. package/dist/utils/raft.retry.js +0 -1
  222. package/dist/utils/raft.retry.js.map +0 -1
  223. package/dist/utils/serialize/commont.d.ts +0 -12
  224. package/dist/utils/serialize/commont.js +0 -46
  225. package/dist/utils/serialize/commont.js.map +0 -1
  226. package/dist/utils/serialize/deserialize.d.ts +0 -10
  227. package/dist/utils/serialize/deserialize.js +0 -288
  228. package/dist/utils/serialize/deserialize.js.map +0 -1
  229. package/dist/utils/serialize/null.d.ts +0 -32
  230. package/dist/utils/serialize/null.js +0 -178
  231. package/dist/utils/serialize/null.js.map +0 -1
  232. package/dist/utils/serialize/serialize.d.ts +0 -10
  233. package/dist/utils/serialize/serialize.js +0 -146
  234. package/dist/utils/serialize/serialize.js.map +0 -1
  235. package/dist/utils/stream.helper.d.ts +0 -10
  236. package/dist/utils/stream.helper.js +0 -71
  237. package/dist/utils/stream.helper.js.map +0 -1
  238. package/dist/utils/time.record.d.ts +0 -15
  239. package/dist/utils/time.record.js +0 -52
  240. package/dist/utils/time.record.js.map +0 -1
  241. package/dist/utils/timezone.d.ts +0 -7
  242. package/dist/utils/timezone.js +0 -21
  243. package/dist/utils/timezone.js.map +0 -1
  244. package/dist/utils/ultipa.datetime.d.ts +0 -14
  245. package/dist/utils/ultipa.datetime.js +0 -160
  246. package/dist/utils/ultipa.datetime.js.map +0 -1
  247. package/dist/utils/uql-maker.d.ts +0 -165
  248. package/dist/utils/uql-maker.js +0 -402
  249. package/dist/utils/uql-maker.js.map +0 -1
  250. package/dist/utils/uql.parse.d.ts +0 -27
  251. package/dist/utils/uql.parse.js +0 -205
  252. package/dist/utils/uql.parse.js.map +0 -1
  253. package/readme.md +0 -65
  254. package/src/proto/build.sh +0 -41
  255. package/src/proto/build_windows.sh +0 -40
  256. package/src/proto/ultipa.proto +0 -531
  257. package/src/proto/ultipa_grpc_pb.d.ts +0 -92
  258. package/src/proto/ultipa_grpc_pb.js +0 -414
  259. package/src/proto/ultipa_pb.d.ts +0 -1983
  260. package/src/proto/ultipa_pb.js +0 -14852
@@ -0,0 +1,1176 @@
1
+ "use strict";
2
+ /**
3
+ * TypedValue encoding and decoding for GQLDB Node.js driver.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.createTypedValue = createTypedValue;
7
+ exports.typedValueToJS = typedValueToJS;
8
+ exports.formatValue = formatValue;
9
+ exports.fromString = fromString;
10
+ exports.createParameter = createParameter;
11
+ const enums_1 = require("./enums");
12
+ const wrappers_1 = require("./wrappers");
13
+ const data_types_1 = require("./data_types");
14
+ // =============================================================================
15
+ // Binary Format Helpers
16
+ // =============================================================================
17
+ /** Encode a length-prefixed string: [len:2 uint16LE][utf8 bytes] */
18
+ function encodeString(s) {
19
+ const strBuf = Buffer.from(s, 'utf-8');
20
+ const result = Buffer.alloc(2 + strBuf.length);
21
+ result.writeUInt16LE(strBuf.length, 0);
22
+ strBuf.copy(result, 2);
23
+ return result;
24
+ }
25
+ /** Decode a length-prefixed string. Returns [string, bytesConsumed]. */
26
+ function decodeString(data, offset) {
27
+ if (offset + 2 > data.length)
28
+ return ['', 0];
29
+ const len = data.readUInt16LE(offset);
30
+ if (offset + 2 + len > data.length)
31
+ return ['', 0];
32
+ return [data.slice(offset + 2, offset + 2 + len).toString('utf-8'), 2 + len];
33
+ }
34
+ /** Encode a TypedValueEntry: [type:1][isNull:1][dataLen:4 uint32LE][data] */
35
+ function encodeTypedValueEntry(tv) {
36
+ const result = Buffer.alloc(6 + tv.data.length);
37
+ result.writeUInt8(tv.type, 0);
38
+ result.writeUInt8(tv.isNull ? 1 : 0, 1);
39
+ result.writeUInt32LE(tv.data.length, 2);
40
+ if (tv.data.length > 0) {
41
+ tv.data.copy(result, 6);
42
+ }
43
+ return result;
44
+ }
45
+ /** Decode a TypedValueEntry. Returns [TypedValue, bytesConsumed]. */
46
+ function decodeTypedValueEntry(data, offset) {
47
+ if (offset + 6 > data.length) {
48
+ return [{ type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true }, 0];
49
+ }
50
+ const type = data.readUInt8(offset);
51
+ const isNull = data.readUInt8(offset + 1) !== 0;
52
+ const dataLen = data.readUInt32LE(offset + 2);
53
+ if (offset + 6 + dataLen > data.length) {
54
+ return [{ type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true }, 0];
55
+ }
56
+ const tvData = data.slice(offset + 6, offset + 6 + dataLen);
57
+ return [{ type, data: tvData, isNull }, 6 + dataLen];
58
+ }
59
+ /** Decode binary properties: [count:2][keyLen:2][key][TVE]... */
60
+ function decodePropertiesBinary(data, offset) {
61
+ if (offset + 2 > data.length)
62
+ return [{}, 0];
63
+ const count = data.readUInt16LE(offset);
64
+ let pos = offset + 2;
65
+ const result = {};
66
+ for (let i = 0; i < count; i++) {
67
+ const [key, keyLen] = decodeString(data, pos);
68
+ if (keyLen === 0)
69
+ break;
70
+ pos += keyLen;
71
+ const [tv, tvLen] = decodeTypedValueEntry(data, pos);
72
+ if (tvLen === 0)
73
+ break;
74
+ pos += tvLen;
75
+ result[key] = typedValueToJS(tv);
76
+ }
77
+ return [result, pos - offset];
78
+ }
79
+ // =============================================================================
80
+ // Encoding: JS → TypedValue
81
+ // =============================================================================
82
+ /** Create a TypedValue from a JavaScript value */
83
+ function createTypedValue(value) {
84
+ if (value === null || value === undefined) {
85
+ return { type: enums_1.PropertyType.NULL, data: Buffer.alloc(0), isNull: true };
86
+ }
87
+ // Pass-through: if already a TypedValue, return directly
88
+ if (typeof value === 'object' && 'type' in value && 'data' in value && 'isNull' in value && value.data instanceof Buffer) {
89
+ return value;
90
+ }
91
+ if (typeof value === 'boolean') {
92
+ const data = Buffer.alloc(1);
93
+ data.writeUInt8(value ? 1 : 0, 0);
94
+ return { type: enums_1.PropertyType.BOOL, data, isNull: false };
95
+ }
96
+ // Handle explicit type wrappers
97
+ if (value instanceof wrappers_1.Int32) {
98
+ const data = Buffer.alloc(4);
99
+ data.writeInt32LE(value.value, 0);
100
+ return { type: enums_1.PropertyType.INT32, data, isNull: false };
101
+ }
102
+ if (value instanceof wrappers_1.UInt32) {
103
+ const data = Buffer.alloc(4);
104
+ data.writeUInt32LE(value.value, 0);
105
+ return { type: enums_1.PropertyType.UINT32, data, isNull: false };
106
+ }
107
+ if (value instanceof wrappers_1.Float32) {
108
+ const data = Buffer.alloc(4);
109
+ data.writeFloatLE(value.value, 0);
110
+ return { type: enums_1.PropertyType.FLOAT, data, isNull: false };
111
+ }
112
+ if (value instanceof wrappers_1.UInt64) {
113
+ const data = Buffer.alloc(8);
114
+ data.writeBigUInt64LE(value.value, 0);
115
+ return { type: enums_1.PropertyType.UINT64, data, isNull: false };
116
+ }
117
+ if (typeof value === 'number') {
118
+ // Use isSafeInteger to avoid issues with large floats like Number.MAX_VALUE
119
+ // which appear as integers due to precision loss
120
+ if (Number.isSafeInteger(value)) {
121
+ const data = Buffer.alloc(8);
122
+ data.writeBigInt64LE(BigInt(value), 0);
123
+ return { type: enums_1.PropertyType.INT64, data, isNull: false };
124
+ }
125
+ else {
126
+ const data = Buffer.alloc(8);
127
+ data.writeDoubleLE(value, 0);
128
+ return { type: enums_1.PropertyType.DOUBLE, data, isNull: false };
129
+ }
130
+ }
131
+ if (typeof value === 'bigint') {
132
+ const data = Buffer.alloc(8);
133
+ // Check if value fits in signed INT64 range
134
+ const INT64_MIN = BigInt('-9223372036854775808');
135
+ const INT64_MAX = BigInt('9223372036854775807');
136
+ if (value >= INT64_MIN && value <= INT64_MAX) {
137
+ data.writeBigInt64LE(value, 0);
138
+ return { type: enums_1.PropertyType.INT64, data, isNull: false };
139
+ }
140
+ else {
141
+ // Value is outside INT64 range, use UINT64
142
+ data.writeBigUInt64LE(value, 0);
143
+ return { type: enums_1.PropertyType.UINT64, data, isNull: false };
144
+ }
145
+ }
146
+ if (typeof value === 'string') {
147
+ return { type: enums_1.PropertyType.STRING, data: Buffer.from(value, 'utf-8'), isNull: false };
148
+ }
149
+ if (Buffer.isBuffer(value)) {
150
+ return { type: enums_1.PropertyType.BLOB, data: value, isNull: false };
151
+ }
152
+ if (value instanceof Date) {
153
+ const unixSeconds = BigInt(Math.floor(value.getTime() / 1000));
154
+ const nanos = (value.getTime() % 1000) * 1_000_000;
155
+ const data = Buffer.alloc(12);
156
+ data.writeBigInt64LE(unixSeconds, 0);
157
+ data.writeUInt32LE(nanos < 0 ? nanos + 1_000_000_000 : nanos, 8);
158
+ return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
159
+ }
160
+ if ((0, data_types_1.isGqldbTimestamp)(value)) {
161
+ const unixSeconds = BigInt(Math.floor(Date.UTC(value.year, value.month - 1, value.day, value.hour, value.minute, value.second) / 1000));
162
+ const data = Buffer.alloc(12);
163
+ data.writeBigInt64LE(unixSeconds, 0);
164
+ data.writeUInt32LE(value.nanosecond, 8);
165
+ return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
166
+ }
167
+ if (Array.isArray(value)) {
168
+ return encodeList(value);
169
+ }
170
+ // Check for new types before generic object handling
171
+ if ((0, data_types_1.isPoint)(value)) {
172
+ const data = Buffer.alloc(16);
173
+ data.writeDoubleLE(value.longitude, 0);
174
+ data.writeDoubleLE(value.latitude, 8);
175
+ return { type: enums_1.PropertyType.POINT, data, isNull: false };
176
+ }
177
+ if ((0, data_types_1.isPoint3D)(value)) {
178
+ const data = Buffer.alloc(24);
179
+ data.writeDoubleLE(value.x, 0);
180
+ data.writeDoubleLE(value.y, 8);
181
+ data.writeDoubleLE(value.z, 16);
182
+ return { type: enums_1.PropertyType.POINT3D, data, isNull: false };
183
+ }
184
+ if ((0, data_types_1.isGqldbDecimal)(value)) {
185
+ return { type: enums_1.PropertyType.DECIMAL, data: Buffer.from(value.value, 'utf-8'), isNull: false };
186
+ }
187
+ if ((0, data_types_1.isGqldbLocalDateTime)(value)) {
188
+ const data = Buffer.alloc(11);
189
+ data.writeUInt16LE(value.year, 0);
190
+ data.writeUInt8(value.month, 2);
191
+ data.writeUInt8(value.day, 3);
192
+ data.writeUInt8(value.hour, 4);
193
+ data.writeUInt8(value.minute, 5);
194
+ data.writeUInt8(value.second, 6);
195
+ data.writeUInt32LE(value.nanosecond, 7);
196
+ return { type: enums_1.PropertyType.LOCAL_DATETIME, data, isNull: false };
197
+ }
198
+ if ((0, data_types_1.isGqldbDate)(value)) {
199
+ const data = Buffer.alloc(8);
200
+ data.writeUInt16LE(value.year, 0);
201
+ data.writeUInt8(value.month, 2);
202
+ data.writeUInt8(value.day, 3);
203
+ // bytes 4-7 are padding (zeros)
204
+ return { type: enums_1.PropertyType.DATE, data, isNull: false };
205
+ }
206
+ if ((0, data_types_1.isGqldbZonedDateTime)(value)) {
207
+ const data = Buffer.alloc(13);
208
+ data.writeUInt16LE(value.year, 0);
209
+ data.writeUInt8(value.month, 2);
210
+ data.writeUInt8(value.day, 3);
211
+ data.writeUInt8(value.hour, 4);
212
+ data.writeUInt8(value.minute, 5);
213
+ data.writeUInt8(value.second, 6);
214
+ data.writeUInt32LE(value.nanosecond, 7);
215
+ data.writeInt16LE(value.offsetMinutes, 11);
216
+ return { type: enums_1.PropertyType.ZONED_DATETIME, data, isNull: false };
217
+ }
218
+ if ((0, data_types_1.isGqldbZonedTime)(value)) {
219
+ const data = Buffer.alloc(10);
220
+ data.writeUInt8(value.hour, 0);
221
+ data.writeUInt8(value.minute, 1);
222
+ data.writeUInt8(value.second, 2);
223
+ // byte 3 is padding
224
+ data.writeUInt32LE(value.nanosecond, 4);
225
+ data.writeInt16LE(value.offsetMinutes, 8);
226
+ return { type: enums_1.PropertyType.ZONED_TIME, data, isNull: false };
227
+ }
228
+ if ((0, data_types_1.isGqldbLocalTime)(value)) {
229
+ const data = Buffer.alloc(8);
230
+ data.writeUInt8(value.hour, 0);
231
+ data.writeUInt8(value.minute, 1);
232
+ data.writeUInt8(value.second, 2);
233
+ // byte 3 is padding
234
+ data.writeUInt32LE(value.nanosecond, 4);
235
+ return { type: enums_1.PropertyType.LOCAL_TIME, data, isNull: false };
236
+ }
237
+ if ((0, data_types_1.isYearToMonth)(value)) {
238
+ const data = Buffer.alloc(4);
239
+ data.writeInt32LE(value.months, 0);
240
+ return { type: enums_1.PropertyType.YEAR_TO_MONTH, data, isNull: false };
241
+ }
242
+ if ((0, data_types_1.isDayToSecond)(value)) {
243
+ const data = Buffer.alloc(12);
244
+ data.writeBigUInt64LE(BigInt(value.seconds), 0);
245
+ data.writeUInt32LE(value.nanoseconds, 8);
246
+ return { type: enums_1.PropertyType.DAY_TO_SECOND, data, isNull: false };
247
+ }
248
+ if ((0, data_types_1.isVector)(value)) {
249
+ const data = Buffer.alloc(4 + value.values.length * 4);
250
+ data.writeUInt32LE(value.values.length, 0);
251
+ for (let i = 0; i < value.values.length; i++) {
252
+ data.writeFloatLE(value.values[i], 4 + i * 4);
253
+ }
254
+ return { type: enums_1.PropertyType.VECTOR, data, isNull: false };
255
+ }
256
+ if ((0, data_types_1.isGqldbSet)(value)) {
257
+ return encodeSet(value);
258
+ }
259
+ if (typeof value === 'object') {
260
+ return encodeMap(value);
261
+ }
262
+ throw new Error(`Unsupported type: ${typeof value}`);
263
+ }
264
+ // =============================================================================
265
+ // Decoding: TypedValue → JS
266
+ // =============================================================================
267
+ /** Convert a TypedValue to a JavaScript value */
268
+ function typedValueToJS(tv) {
269
+ if (tv.isNull || tv.type === enums_1.PropertyType.NULL) {
270
+ return null;
271
+ }
272
+ switch (tv.type) {
273
+ case enums_1.PropertyType.BOOL:
274
+ return tv.data.length >= 1 && tv.data.readUInt8(0) !== 0;
275
+ case enums_1.PropertyType.INT32:
276
+ return tv.data.length >= 4 ? tv.data.readInt32LE(0) : 0;
277
+ case enums_1.PropertyType.UINT32:
278
+ return tv.data.length >= 4 ? tv.data.readUInt32LE(0) : 0;
279
+ case enums_1.PropertyType.INT64: {
280
+ if (tv.data.length < 8)
281
+ return 0;
282
+ const bigVal = tv.data.readBigInt64LE(0);
283
+ // Return regular number if value fits in safe integer range
284
+ if (bigVal >= BigInt(Number.MIN_SAFE_INTEGER) && bigVal <= BigInt(Number.MAX_SAFE_INTEGER)) {
285
+ return Number(bigVal);
286
+ }
287
+ return bigVal;
288
+ }
289
+ case enums_1.PropertyType.UINT64: {
290
+ if (tv.data.length < 8)
291
+ return 0;
292
+ const bigVal = tv.data.readBigUInt64LE(0);
293
+ // Return regular number if value fits in safe integer range
294
+ if (bigVal <= BigInt(Number.MAX_SAFE_INTEGER)) {
295
+ return Number(bigVal);
296
+ }
297
+ return bigVal;
298
+ }
299
+ case enums_1.PropertyType.FLOAT:
300
+ return tv.data.length >= 4 ? tv.data.readFloatLE(0) : 0;
301
+ case enums_1.PropertyType.DOUBLE:
302
+ return tv.data.length >= 8 ? tv.data.readDoubleLE(0) : 0;
303
+ case enums_1.PropertyType.STRING:
304
+ case enums_1.PropertyType.TEXT:
305
+ return tv.data.toString('utf-8');
306
+ case enums_1.PropertyType.BLOB:
307
+ return tv.data;
308
+ case enums_1.PropertyType.TIMESTAMP:
309
+ if (tv.data.length >= 12) {
310
+ const secs = Number(tv.data.readBigInt64LE(0));
311
+ const nanos = tv.data.readUInt32LE(8);
312
+ const d = new Date(secs * 1000 + Math.floor(nanos / 1_000_000));
313
+ return (0, data_types_1.createTimestamp)(d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHours(), d.getUTCMinutes(), d.getUTCSeconds(), nanos);
314
+ }
315
+ return (0, data_types_1.createTimestamp)(0, 0, 0, 0, 0, 0, 0);
316
+ case enums_1.PropertyType.DATE:
317
+ if (tv.data.length >= 4) {
318
+ return {
319
+ year: tv.data.readUInt16LE(0),
320
+ month: tv.data.readUInt8(2),
321
+ day: tv.data.readUInt8(3),
322
+ };
323
+ }
324
+ return { year: 0, month: 0, day: 0 };
325
+ case enums_1.PropertyType.LOCAL_TIME:
326
+ if (tv.data.length >= 8) {
327
+ return {
328
+ hour: tv.data.readUInt8(0),
329
+ minute: tv.data.readUInt8(1),
330
+ second: tv.data.readUInt8(2),
331
+ nanosecond: tv.data.readUInt32LE(4),
332
+ };
333
+ }
334
+ return { hour: 0, minute: 0, second: 0, nanosecond: 0 };
335
+ case enums_1.PropertyType.ZONED_TIME:
336
+ if (tv.data.length >= 10) {
337
+ return {
338
+ hour: tv.data.readUInt8(0),
339
+ minute: tv.data.readUInt8(1),
340
+ second: tv.data.readUInt8(2),
341
+ nanosecond: tv.data.readUInt32LE(4),
342
+ offsetMinutes: tv.data.readInt16LE(8),
343
+ };
344
+ }
345
+ return { hour: 0, minute: 0, second: 0, nanosecond: 0, offsetMinutes: 0 };
346
+ case enums_1.PropertyType.ZONED_DATETIME:
347
+ if (tv.data.length >= 13) {
348
+ return {
349
+ year: tv.data.readUInt16LE(0),
350
+ month: tv.data.readUInt8(2),
351
+ day: tv.data.readUInt8(3),
352
+ hour: tv.data.readUInt8(4),
353
+ minute: tv.data.readUInt8(5),
354
+ second: tv.data.readUInt8(6),
355
+ nanosecond: tv.data.readUInt32LE(7),
356
+ offsetMinutes: tv.data.readInt16LE(11),
357
+ };
358
+ }
359
+ return { year: 0, month: 0, day: 0, hour: 0, minute: 0, second: 0, nanosecond: 0, offsetMinutes: 0 };
360
+ case enums_1.PropertyType.LOCAL_DATETIME:
361
+ case enums_1.PropertyType.DATETIME:
362
+ if (tv.data.length >= 11) {
363
+ return (0, data_types_1.createLocalDateTime)(tv.data.readUInt16LE(0), // year
364
+ tv.data.readUInt8(2), // month
365
+ tv.data.readUInt8(3), // day
366
+ tv.data.readUInt8(4), // hour
367
+ tv.data.readUInt8(5), // minute
368
+ tv.data.readUInt8(6), // second
369
+ tv.data.readUInt32LE(7));
370
+ }
371
+ return (0, data_types_1.createLocalDateTime)(0, 0, 0, 0, 0, 0, 0);
372
+ case enums_1.PropertyType.YEAR_TO_MONTH:
373
+ if (tv.data.length >= 4) {
374
+ return { months: tv.data.readInt32LE(0) };
375
+ }
376
+ return { months: 0 };
377
+ case enums_1.PropertyType.DAY_TO_SECOND:
378
+ if (tv.data.length >= 12) {
379
+ return {
380
+ seconds: Number(tv.data.readBigUInt64LE(0)),
381
+ nanoseconds: tv.data.readUInt32LE(8),
382
+ };
383
+ }
384
+ return { seconds: 0, nanoseconds: 0 };
385
+ case enums_1.PropertyType.POINT:
386
+ if (tv.data.length >= 16) {
387
+ return {
388
+ longitude: tv.data.readDoubleLE(0),
389
+ latitude: tv.data.readDoubleLE(8),
390
+ };
391
+ }
392
+ return { latitude: 0, longitude: 0 };
393
+ case enums_1.PropertyType.POINT3D:
394
+ if (tv.data.length >= 24) {
395
+ return {
396
+ x: tv.data.readDoubleLE(0),
397
+ y: tv.data.readDoubleLE(8),
398
+ z: tv.data.readDoubleLE(16),
399
+ };
400
+ }
401
+ return { x: 0, y: 0, z: 0 };
402
+ case enums_1.PropertyType.DECIMAL:
403
+ return { value: tv.data.toString('utf-8') };
404
+ case enums_1.PropertyType.VECTOR:
405
+ if (tv.data.length >= 4) {
406
+ const dim = tv.data.readUInt32LE(0);
407
+ if (tv.data.length >= 4 + dim * 4) {
408
+ const values = [];
409
+ for (let i = 0; i < dim; i++) {
410
+ values.push(tv.data.readFloatLE(4 + i * 4));
411
+ }
412
+ return { values };
413
+ }
414
+ }
415
+ return { values: [] };
416
+ case enums_1.PropertyType.LIST:
417
+ return decodeList(tv.data);
418
+ case enums_1.PropertyType.SET:
419
+ return new Set(decodeList(tv.data));
420
+ case enums_1.PropertyType.MAP:
421
+ case enums_1.PropertyType.RECORD:
422
+ return decodeMap(tv.data);
423
+ case enums_1.PropertyType.TABLE:
424
+ return decodeTable(tv.data);
425
+ case enums_1.PropertyType.NODE:
426
+ return decodeNode(tv.data);
427
+ case enums_1.PropertyType.EDGE:
428
+ return decodeEdge(tv.data);
429
+ case enums_1.PropertyType.PATH:
430
+ return decodePath(tv.data);
431
+ case enums_1.PropertyType.ERROR:
432
+ return decodeError(tv.data);
433
+ default:
434
+ return tv.data;
435
+ }
436
+ }
437
+ // =============================================================================
438
+ // Decode: Complex Types
439
+ // =============================================================================
440
+ /**
441
+ * Decode a node from binary format.
442
+ * Format: [idLen:2][id][labelCount:2][labelLen:2][label]...[properties_binary]
443
+ */
444
+ function decodeNode(data) {
445
+ let offset = 0;
446
+ // Decode ID
447
+ const [id, idLen] = decodeString(data, offset);
448
+ if (idLen === 0)
449
+ return { id: '', labels: [], properties: {} };
450
+ offset += idLen;
451
+ // Decode labels
452
+ if (offset + 2 > data.length)
453
+ return { id, labels: [], properties: {} };
454
+ const labelCount = data.readUInt16LE(offset);
455
+ offset += 2;
456
+ const labels = [];
457
+ for (let i = 0; i < labelCount; i++) {
458
+ const [label, labelLen] = decodeString(data, offset);
459
+ if (labelLen === 0)
460
+ break;
461
+ labels.push(label);
462
+ offset += labelLen;
463
+ }
464
+ // Decode properties
465
+ const [properties] = decodePropertiesBinary(data, offset);
466
+ return { id, labels, properties };
467
+ }
468
+ /**
469
+ * Decode an edge from binary format.
470
+ * Format: [idLen:2][id][labelLen:2][label][fromLen:2][from][toLen:2][to][properties_binary]
471
+ */
472
+ function decodeEdge(data) {
473
+ let offset = 0;
474
+ const [id, idLen] = decodeString(data, offset);
475
+ if (idLen === 0)
476
+ return { id: '', label: '', fromNodeId: '', toNodeId: '', properties: {} };
477
+ offset += idLen;
478
+ const [label, labelLen] = decodeString(data, offset);
479
+ if (labelLen === 0)
480
+ return { id, label: '', fromNodeId: '', toNodeId: '', properties: {} };
481
+ offset += labelLen;
482
+ const [fromNodeId, fromLen] = decodeString(data, offset);
483
+ if (fromLen === 0)
484
+ return { id, label, fromNodeId: '', toNodeId: '', properties: {} };
485
+ offset += fromLen;
486
+ const [toNodeId, toLen] = decodeString(data, offset);
487
+ if (toLen === 0)
488
+ return { id, label, fromNodeId, toNodeId: '', properties: {} };
489
+ offset += toLen;
490
+ const [properties] = decodePropertiesBinary(data, offset);
491
+ return { id, label, fromNodeId, toNodeId, properties };
492
+ }
493
+ /**
494
+ * Decode a path from binary format.
495
+ * Format: [nodeCount:2][nodeLen:4][nodeData]...[edgeCount:2][edgeLen:4][edgeData]...
496
+ */
497
+ function decodePath(data) {
498
+ let offset = 0;
499
+ // Decode nodes
500
+ if (offset + 2 > data.length)
501
+ return { nodes: [], edges: [] };
502
+ const nodeCount = data.readUInt16LE(offset);
503
+ offset += 2;
504
+ const nodes = [];
505
+ for (let i = 0; i < nodeCount; i++) {
506
+ if (offset + 4 > data.length)
507
+ break;
508
+ const nodeLen = data.readUInt32LE(offset);
509
+ offset += 4;
510
+ if (offset + nodeLen > data.length)
511
+ break;
512
+ const nodeData = data.slice(offset, offset + nodeLen);
513
+ nodes.push(decodeNode(nodeData));
514
+ offset += nodeLen;
515
+ }
516
+ // Decode edges
517
+ if (offset + 2 > data.length)
518
+ return { nodes, edges: [] };
519
+ const edgeCount = data.readUInt16LE(offset);
520
+ offset += 2;
521
+ const edges = [];
522
+ for (let i = 0; i < edgeCount; i++) {
523
+ if (offset + 4 > data.length)
524
+ break;
525
+ const edgeLen = data.readUInt32LE(offset);
526
+ offset += 4;
527
+ if (offset + edgeLen > data.length)
528
+ break;
529
+ const edgeData = data.slice(offset, offset + edgeLen);
530
+ edges.push(decodeEdge(edgeData));
531
+ offset += edgeLen;
532
+ }
533
+ return { nodes, edges };
534
+ }
535
+ /**
536
+ * Decode a list from binary format.
537
+ * Format: [count:2 uint16LE][TypedValueEntry]...
538
+ */
539
+ function decodeList(data) {
540
+ if (data.length < 2)
541
+ return [];
542
+ const count = data.readUInt16LE(0);
543
+ let offset = 2;
544
+ const result = [];
545
+ for (let i = 0; i < count; i++) {
546
+ const [tv, tvLen] = decodeTypedValueEntry(data, offset);
547
+ if (tvLen === 0)
548
+ break;
549
+ result.push(typedValueToJS(tv));
550
+ offset += tvLen;
551
+ }
552
+ return result;
553
+ }
554
+ /**
555
+ * Decode a map from binary format.
556
+ * Format: [count:2][keyLen:2][key][TVE]...
557
+ */
558
+ function decodeMap(data) {
559
+ const [result] = decodePropertiesBinary(data, 0);
560
+ return result;
561
+ }
562
+ /**
563
+ * Decode a table from binary format.
564
+ * Format: [colCount:2][colLen:2][col]...[rowCount:2][cellCount:2][TVE]...
565
+ */
566
+ function decodeTable(data) {
567
+ let offset = 0;
568
+ // Decode columns
569
+ if (offset + 2 > data.length)
570
+ return { columns: [], rows: [] };
571
+ const colCount = data.readUInt16LE(offset);
572
+ offset += 2;
573
+ const columns = [];
574
+ for (let i = 0; i < colCount; i++) {
575
+ const [col, colLen] = decodeString(data, offset);
576
+ if (colLen === 0)
577
+ break;
578
+ columns.push(col);
579
+ offset += colLen;
580
+ }
581
+ // Decode rows
582
+ if (offset + 2 > data.length)
583
+ return { columns, rows: [] };
584
+ const rowCount = data.readUInt16LE(offset);
585
+ offset += 2;
586
+ const rows = [];
587
+ for (let i = 0; i < rowCount; i++) {
588
+ if (offset + 2 > data.length)
589
+ break;
590
+ const cellCount = data.readUInt16LE(offset);
591
+ offset += 2;
592
+ const row = [];
593
+ for (let j = 0; j < cellCount; j++) {
594
+ const [tv, tvLen] = decodeTypedValueEntry(data, offset);
595
+ if (tvLen === 0)
596
+ break;
597
+ row.push(typedValueToJS(tv));
598
+ offset += tvLen;
599
+ }
600
+ rows.push(row);
601
+ }
602
+ return { columns, rows };
603
+ }
604
+ function decodeError(data) {
605
+ try {
606
+ const json = data.toString('utf-8');
607
+ const errData = JSON.parse(json);
608
+ return {
609
+ code: typeof errData.code === 'number' ? errData.code : 0,
610
+ message: typeof errData.message === 'string' ? errData.message : json,
611
+ };
612
+ }
613
+ catch {
614
+ // If not valid JSON, treat as plain message
615
+ return { code: 0, message: data.toString('utf-8') };
616
+ }
617
+ }
618
+ // =============================================================================
619
+ // Encode: Complex Types
620
+ // =============================================================================
621
+ /**
622
+ * Encode a list in binary format.
623
+ * Format: [count:2 uint16LE][TypedValueEntry]...
624
+ */
625
+ function encodeList(values) {
626
+ const parts = [];
627
+ // Write count
628
+ const countBuf = Buffer.alloc(2);
629
+ countBuf.writeUInt16LE(values.length, 0);
630
+ parts.push(countBuf);
631
+ for (const v of values) {
632
+ const tv = createTypedValue(v);
633
+ parts.push(encodeTypedValueEntry(tv));
634
+ }
635
+ return { type: enums_1.PropertyType.LIST, data: Buffer.concat(parts), isNull: false };
636
+ }
637
+ /**
638
+ * Encode a map in binary format.
639
+ * Format: [count:2][keyLen:2][key][TVE]...
640
+ */
641
+ function encodeMap(m) {
642
+ const parts = [];
643
+ const entries = Object.entries(m);
644
+ // Write count
645
+ const countBuf = Buffer.alloc(2);
646
+ countBuf.writeUInt16LE(entries.length, 0);
647
+ parts.push(countBuf);
648
+ for (const [k, v] of entries) {
649
+ // Write key (length-prefixed)
650
+ parts.push(encodeString(k));
651
+ // Write value as TVE
652
+ const tv = createTypedValue(v);
653
+ parts.push(encodeTypedValueEntry(tv));
654
+ }
655
+ return { type: enums_1.PropertyType.MAP, data: Buffer.concat(parts), isNull: false };
656
+ }
657
+ /**
658
+ * Encode a set in binary format (same as list).
659
+ */
660
+ function encodeSet(set) {
661
+ const values = Array.from(set);
662
+ const parts = [];
663
+ // Write count
664
+ const countBuf = Buffer.alloc(2);
665
+ countBuf.writeUInt16LE(values.length, 0);
666
+ parts.push(countBuf);
667
+ for (const v of values) {
668
+ const tv = createTypedValue(v);
669
+ parts.push(encodeTypedValueEntry(tv));
670
+ }
671
+ return { type: enums_1.PropertyType.SET, data: Buffer.concat(parts), isNull: false };
672
+ }
673
+ // =============================================================================
674
+ // Format & Parse: TypedValue ↔ String
675
+ // =============================================================================
676
+ /** Pad a number to a fixed width with leading zeros */
677
+ function pad(n, width) {
678
+ return n.toString().padStart(width, '0');
679
+ }
680
+ /** Format nanoseconds, trimming trailing zeros. Returns empty string if zero. */
681
+ function formatNanos(nanos) {
682
+ if (nanos === 0)
683
+ return '';
684
+ const s = nanos.toString().padStart(9, '0');
685
+ return '.' + s.replace(/0+$/, '');
686
+ }
687
+ /** Format an offset in minutes as "+HH:MM" or "-HH:MM" */
688
+ function formatOffset(offsetMinutes) {
689
+ const sign = offsetMinutes < 0 ? '-' : '+';
690
+ const abs = Math.abs(offsetMinutes);
691
+ const h = Math.floor(abs / 60);
692
+ const m = abs % 60;
693
+ return `${sign}${pad(h, 2)}:${pad(m, 2)}`;
694
+ }
695
+ /** Serialize a TypedValue to its canonical string representation */
696
+ function formatValue(tv) {
697
+ if (tv.isNull || tv.type === enums_1.PropertyType.NULL) {
698
+ return '';
699
+ }
700
+ switch (tv.type) {
701
+ case enums_1.PropertyType.BOOL:
702
+ return tv.data.length >= 1 && tv.data.readUInt8(0) !== 0 ? 'true' : 'false';
703
+ case enums_1.PropertyType.INT32:
704
+ return tv.data.length >= 4 ? tv.data.readInt32LE(0).toString() : '0';
705
+ case enums_1.PropertyType.UINT32:
706
+ return tv.data.length >= 4 ? tv.data.readUInt32LE(0).toString() : '0';
707
+ case enums_1.PropertyType.INT64: {
708
+ if (tv.data.length < 8)
709
+ return '0';
710
+ return tv.data.readBigInt64LE(0).toString();
711
+ }
712
+ case enums_1.PropertyType.UINT64: {
713
+ if (tv.data.length < 8)
714
+ return '0';
715
+ return tv.data.readBigUInt64LE(0).toString();
716
+ }
717
+ case enums_1.PropertyType.FLOAT:
718
+ return tv.data.length >= 4 ? tv.data.readFloatLE(0).toString() : '0';
719
+ case enums_1.PropertyType.DOUBLE:
720
+ return tv.data.length >= 8 ? tv.data.readDoubleLE(0).toString() : '0';
721
+ case enums_1.PropertyType.STRING:
722
+ case enums_1.PropertyType.TEXT:
723
+ return tv.data.toString('utf-8');
724
+ case enums_1.PropertyType.DECIMAL:
725
+ return tv.data.toString('utf-8');
726
+ case enums_1.PropertyType.DATE: {
727
+ if (tv.data.length < 4)
728
+ return '0000-00-00';
729
+ const y = tv.data.readUInt16LE(0);
730
+ const m = tv.data.readUInt8(2);
731
+ const d = tv.data.readUInt8(3);
732
+ return `${pad(y, 4)}-${pad(m, 2)}-${pad(d, 2)}`;
733
+ }
734
+ case enums_1.PropertyType.LOCAL_TIME: {
735
+ if (tv.data.length < 8)
736
+ return '00:00:00';
737
+ const h = tv.data.readUInt8(0);
738
+ const m = tv.data.readUInt8(1);
739
+ const s = tv.data.readUInt8(2);
740
+ const ns = tv.data.readUInt32LE(4);
741
+ return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
742
+ }
743
+ case enums_1.PropertyType.ZONED_TIME: {
744
+ if (tv.data.length < 10)
745
+ return '00:00:00+00:00';
746
+ const h = tv.data.readUInt8(0);
747
+ const m = tv.data.readUInt8(1);
748
+ const s = tv.data.readUInt8(2);
749
+ const ns = tv.data.readUInt32LE(4);
750
+ const off = tv.data.readInt16LE(8);
751
+ return `${pad(h, 2)}:${pad(m, 2)}:${pad(s, 2)}${formatNanos(ns)}${formatOffset(off)}`;
752
+ }
753
+ case enums_1.PropertyType.LOCAL_DATETIME:
754
+ case enums_1.PropertyType.DATETIME: {
755
+ if (tv.data.length < 11)
756
+ return '0000-00-00 00:00:00';
757
+ const y = tv.data.readUInt16LE(0);
758
+ const mo = tv.data.readUInt8(2);
759
+ const d = tv.data.readUInt8(3);
760
+ const h = tv.data.readUInt8(4);
761
+ const mi = tv.data.readUInt8(5);
762
+ const s = tv.data.readUInt8(6);
763
+ const ns = tv.data.readUInt32LE(7);
764
+ return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
765
+ }
766
+ case enums_1.PropertyType.ZONED_DATETIME: {
767
+ if (tv.data.length < 13)
768
+ return '0000-00-00 00:00:00+00:00';
769
+ const y = tv.data.readUInt16LE(0);
770
+ const mo = tv.data.readUInt8(2);
771
+ const d = tv.data.readUInt8(3);
772
+ const h = tv.data.readUInt8(4);
773
+ const mi = tv.data.readUInt8(5);
774
+ const s = tv.data.readUInt8(6);
775
+ const ns = tv.data.readUInt32LE(7);
776
+ const off = tv.data.readInt16LE(11);
777
+ return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}${formatOffset(off)}`;
778
+ }
779
+ case enums_1.PropertyType.TIMESTAMP: {
780
+ if (tv.data.length < 12)
781
+ return '0000-00-00 00:00:00';
782
+ const secs = Number(tv.data.readBigInt64LE(0));
783
+ const ns = tv.data.readUInt32LE(8);
784
+ const dt = new Date(secs * 1000 + Math.floor(ns / 1_000_000));
785
+ const y = dt.getUTCFullYear();
786
+ const mo = dt.getUTCMonth() + 1;
787
+ const d = dt.getUTCDate();
788
+ const h = dt.getUTCHours();
789
+ const mi = dt.getUTCMinutes();
790
+ const s = dt.getUTCSeconds();
791
+ return `${pad(y, 4)}-${pad(mo, 2)}-${pad(d, 2)} ${pad(h, 2)}:${pad(mi, 2)}:${pad(s, 2)}${formatNanos(ns)}`;
792
+ }
793
+ case enums_1.PropertyType.YEAR_TO_MONTH: {
794
+ if (tv.data.length < 4)
795
+ return 'P0M';
796
+ const totalMonths = tv.data.readInt32LE(0);
797
+ if (totalMonths === 0)
798
+ return 'P0M';
799
+ const negative = totalMonths < 0;
800
+ const abs = Math.abs(totalMonths);
801
+ const years = Math.floor(abs / 12);
802
+ const months = abs % 12;
803
+ let result = negative ? '-P' : 'P';
804
+ if (years > 0)
805
+ result += `${years}Y`;
806
+ if (months > 0)
807
+ result += `${months}M`;
808
+ // If only years and no months, that's fine (e.g. "P2Y")
809
+ return result;
810
+ }
811
+ case enums_1.PropertyType.DAY_TO_SECOND: {
812
+ if (tv.data.length < 12)
813
+ return 'PT0S';
814
+ const totalSec = Number(tv.data.readBigUInt64LE(0));
815
+ const nanos = tv.data.readUInt32LE(8);
816
+ if (totalSec === 0 && nanos === 0)
817
+ return 'PT0S';
818
+ const days = Math.floor(totalSec / 86400);
819
+ const rem = totalSec % 86400;
820
+ const hours = Math.floor(rem / 3600);
821
+ const rem2 = rem % 3600;
822
+ const mins = Math.floor(rem2 / 60);
823
+ const secs = rem2 % 60;
824
+ let result = 'P';
825
+ if (days > 0)
826
+ result += `${days}D`;
827
+ if (hours > 0 || mins > 0 || secs > 0 || nanos > 0) {
828
+ result += 'T';
829
+ if (hours > 0)
830
+ result += `${hours}H`;
831
+ if (mins > 0)
832
+ result += `${mins}M`;
833
+ if (secs > 0 || nanos > 0) {
834
+ if (nanos > 0) {
835
+ const fracStr = nanos.toString().padStart(9, '0').replace(/0+$/, '');
836
+ result += `${secs}.${fracStr}S`;
837
+ }
838
+ else {
839
+ result += `${secs}S`;
840
+ }
841
+ }
842
+ }
843
+ return result;
844
+ }
845
+ default:
846
+ return tv.data.toString('utf-8');
847
+ }
848
+ }
849
+ /** Parse an offset string like "+05:30" or "-08:00" into minutes */
850
+ function parseOffset(s) {
851
+ const sign = s[0] === '-' ? -1 : 1;
852
+ const parts = s.substring(1).split(':');
853
+ return sign * (parseInt(parts[0], 10) * 60 + parseInt(parts[1], 10));
854
+ }
855
+ /** Parse a string into a TypedValue for the given target type */
856
+ function fromString(s, targetType) {
857
+ if (s === '') {
858
+ return { type: targetType, data: Buffer.alloc(0), isNull: true };
859
+ }
860
+ switch (targetType) {
861
+ case enums_1.PropertyType.BOOL: {
862
+ const val = s.toLowerCase() === 'true';
863
+ const data = Buffer.alloc(1);
864
+ data.writeUInt8(val ? 1 : 0, 0);
865
+ return { type: enums_1.PropertyType.BOOL, data, isNull: false };
866
+ }
867
+ case enums_1.PropertyType.INT32: {
868
+ const data = Buffer.alloc(4);
869
+ data.writeInt32LE(parseInt(s, 10), 0);
870
+ return { type: enums_1.PropertyType.INT32, data, isNull: false };
871
+ }
872
+ case enums_1.PropertyType.UINT32: {
873
+ const data = Buffer.alloc(4);
874
+ data.writeUInt32LE(parseInt(s, 10) >>> 0, 0);
875
+ return { type: enums_1.PropertyType.UINT32, data, isNull: false };
876
+ }
877
+ case enums_1.PropertyType.INT64: {
878
+ const data = Buffer.alloc(8);
879
+ data.writeBigInt64LE(BigInt(s), 0);
880
+ return { type: enums_1.PropertyType.INT64, data, isNull: false };
881
+ }
882
+ case enums_1.PropertyType.UINT64: {
883
+ const data = Buffer.alloc(8);
884
+ data.writeBigUInt64LE(BigInt(s), 0);
885
+ return { type: enums_1.PropertyType.UINT64, data, isNull: false };
886
+ }
887
+ case enums_1.PropertyType.FLOAT: {
888
+ const data = Buffer.alloc(4);
889
+ data.writeFloatLE(parseFloat(s), 0);
890
+ return { type: enums_1.PropertyType.FLOAT, data, isNull: false };
891
+ }
892
+ case enums_1.PropertyType.DOUBLE: {
893
+ const data = Buffer.alloc(8);
894
+ data.writeDoubleLE(parseFloat(s), 0);
895
+ return { type: enums_1.PropertyType.DOUBLE, data, isNull: false };
896
+ }
897
+ case enums_1.PropertyType.STRING:
898
+ case enums_1.PropertyType.TEXT:
899
+ return { type: targetType, data: Buffer.from(s, 'utf-8'), isNull: false };
900
+ case enums_1.PropertyType.DECIMAL:
901
+ return { type: enums_1.PropertyType.DECIMAL, data: Buffer.from(s, 'utf-8'), isNull: false };
902
+ case enums_1.PropertyType.DATE: {
903
+ // "yyyy-MM-dd"
904
+ const parts = s.split('-');
905
+ const data = Buffer.alloc(8);
906
+ data.writeUInt16LE(parseInt(parts[0], 10), 0);
907
+ data.writeUInt8(parseInt(parts[1], 10), 2);
908
+ data.writeUInt8(parseInt(parts[2], 10), 3);
909
+ return { type: enums_1.PropertyType.DATE, data, isNull: false };
910
+ }
911
+ case enums_1.PropertyType.LOCAL_TIME: {
912
+ // "HH:mm:ss[.nnnnnnnnn]" — strip any trailing offset or Z, keep local time only
913
+ const cleaned = removeOffset(s);
914
+ const { hour, minute, second, nanosecond } = parseTimeString(cleaned);
915
+ const data = Buffer.alloc(8);
916
+ data.writeUInt8(hour, 0);
917
+ data.writeUInt8(minute, 1);
918
+ data.writeUInt8(second, 2);
919
+ data.writeUInt32LE(nanosecond, 4);
920
+ return { type: enums_1.PropertyType.LOCAL_TIME, data, isNull: false };
921
+ }
922
+ case enums_1.PropertyType.ZONED_TIME: {
923
+ // "HH:mm:ss[.n]+HH:MM"
924
+ const { timePart, offsetPart } = splitTimeAndOffset(s);
925
+ const { hour, minute, second, nanosecond } = parseTimeString(timePart);
926
+ const offMin = parseOffset(offsetPart);
927
+ const data = Buffer.alloc(10);
928
+ data.writeUInt8(hour, 0);
929
+ data.writeUInt8(minute, 1);
930
+ data.writeUInt8(second, 2);
931
+ data.writeUInt32LE(nanosecond, 4);
932
+ data.writeInt16LE(offMin, 8);
933
+ return { type: enums_1.PropertyType.ZONED_TIME, data, isNull: false };
934
+ }
935
+ case enums_1.PropertyType.LOCAL_DATETIME:
936
+ case enums_1.PropertyType.DATETIME: {
937
+ // "yyyy-MM-dd HH:mm:ss[.n]" — strip any trailing offset or Z, keep local time only
938
+ // Normalize T separator to space
939
+ const cleaned = removeOffset(s.replace('T', ' '));
940
+ const spaceIdx = cleaned.indexOf(' ');
941
+ const datePart = cleaned.substring(0, spaceIdx);
942
+ const timePart = cleaned.substring(spaceIdx + 1);
943
+ const dp = datePart.split('-');
944
+ const { hour, minute, second, nanosecond } = parseTimeString(timePart);
945
+ const data = Buffer.alloc(11);
946
+ data.writeUInt16LE(parseInt(dp[0], 10), 0);
947
+ data.writeUInt8(parseInt(dp[1], 10), 2);
948
+ data.writeUInt8(parseInt(dp[2], 10), 3);
949
+ data.writeUInt8(hour, 4);
950
+ data.writeUInt8(minute, 5);
951
+ data.writeUInt8(second, 6);
952
+ data.writeUInt32LE(nanosecond, 7);
953
+ return { type: targetType, data, isNull: false };
954
+ }
955
+ case enums_1.PropertyType.ZONED_DATETIME: {
956
+ // "yyyy-MM-dd HH:mm:ss[.n]+HH:MM" — also supports T separator, Z suffix, space-separated offset
957
+ const norm = normalizeOffset(s.replace('T', ' '));
958
+ const spaceIdx = norm.indexOf(' ');
959
+ const datePart = norm.substring(0, spaceIdx);
960
+ const rest = norm.substring(spaceIdx + 1);
961
+ const { timePart, offsetPart } = splitTimeAndOffset(rest);
962
+ const dp = datePart.split('-');
963
+ const { hour, minute, second, nanosecond } = parseTimeString(timePart);
964
+ const offMin = parseOffset(offsetPart);
965
+ const data = Buffer.alloc(13);
966
+ data.writeUInt16LE(parseInt(dp[0], 10), 0);
967
+ data.writeUInt8(parseInt(dp[1], 10), 2);
968
+ data.writeUInt8(parseInt(dp[2], 10), 3);
969
+ data.writeUInt8(hour, 4);
970
+ data.writeUInt8(minute, 5);
971
+ data.writeUInt8(second, 6);
972
+ data.writeUInt32LE(nanosecond, 7);
973
+ data.writeInt16LE(offMin, 11);
974
+ return { type: enums_1.PropertyType.ZONED_DATETIME, data, isNull: false };
975
+ }
976
+ case enums_1.PropertyType.TIMESTAMP: {
977
+ // Support epoch seconds like "1715169600" or "yyyy-MM-dd HH:mm:ss[.n]"
978
+ if (/^\d+$/.test(s)) {
979
+ // Epoch seconds
980
+ const epoch = parseInt(s, 10);
981
+ const data = Buffer.alloc(12);
982
+ data.writeBigInt64LE(BigInt(epoch), 0);
983
+ data.writeUInt32LE(0, 8);
984
+ return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
985
+ }
986
+ // "yyyy-MM-dd HH:mm:ss[.n]" or "yyyy-MM-ddTHH:mm:ss[.n][+-]HH:MM" / "[+-]HHMM" / "Z"
987
+ // Also supports space-separated offset: "2024-06-15 14:30:00 +08:00"
988
+ // Normalize T separator to space
989
+ const normalized = s.replace('T', ' ');
990
+ // Check for Z suffix → treat as +00:00
991
+ const hasZ = normalized.endsWith('Z') || normalized.endsWith('z');
992
+ // Normalize space-separated offsets: " +08:00" → "+08:00"
993
+ // Also normalize Z to +00:00
994
+ let processed = normalized;
995
+ if (hasZ) {
996
+ processed = normalized.slice(0, -1) + '+00:00';
997
+ }
998
+ else {
999
+ // Collapse space before offset (only in last ~10 chars to avoid date hyphens)
1000
+ const spaceOffMatch = processed.match(/^(.+?)\s+([+-]\d{2}:?\d{2})$/);
1001
+ if (spaceOffMatch) {
1002
+ processed = spaceOffMatch[1] + spaceOffMatch[2];
1003
+ }
1004
+ }
1005
+ const sepIdx = processed.indexOf(' ');
1006
+ const datePart = processed.substring(0, sepIdx);
1007
+ const rest = processed.substring(sepIdx + 1);
1008
+ // Check for timezone offset: +HH:MM, -HH:MM, +HHMM, -HHMM at the end
1009
+ const offsetMatch = rest.match(/([+-])(\d{2}):?(\d{2})$/);
1010
+ if (offsetMatch) {
1011
+ const timePart = rest.substring(0, offsetMatch.index);
1012
+ const sign = offsetMatch[1] === '-' ? -1 : 1;
1013
+ const offHours = parseInt(offsetMatch[2], 10);
1014
+ const offMins = parseInt(offsetMatch[3], 10);
1015
+ const offsetTotalMinutes = sign * (offHours * 60 + offMins);
1016
+ const dp = datePart.split('-');
1017
+ const { hour, minute, second, nanosecond } = parseTimeString(timePart);
1018
+ // Convert to UTC by subtracting the offset
1019
+ const d = new Date(Date.UTC(parseInt(dp[0], 10), parseInt(dp[1], 10) - 1, parseInt(dp[2], 10), hour, minute - offsetTotalMinutes, second));
1020
+ const unixSecs = BigInt(Math.floor(d.getTime() / 1000));
1021
+ const data = Buffer.alloc(12);
1022
+ data.writeBigInt64LE(unixSecs, 0);
1023
+ data.writeUInt32LE(nanosecond, 8);
1024
+ return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
1025
+ }
1026
+ // No offset — treat as local datetime (convert to UTC using Date.UTC)
1027
+ const dp = datePart.split('-');
1028
+ const { hour, minute, second, nanosecond } = parseTimeString(rest);
1029
+ const d = new Date(Date.UTC(parseInt(dp[0], 10), parseInt(dp[1], 10) - 1, parseInt(dp[2], 10), hour, minute, second));
1030
+ const unixSecs = BigInt(Math.floor(d.getTime() / 1000));
1031
+ const data = Buffer.alloc(12);
1032
+ data.writeBigInt64LE(unixSecs, 0);
1033
+ data.writeUInt32LE(nanosecond, 8);
1034
+ return { type: enums_1.PropertyType.TIMESTAMP, data, isNull: false };
1035
+ }
1036
+ case enums_1.PropertyType.YEAR_TO_MONTH: {
1037
+ // ISO-8601: "P2Y5M", "P0M", "-P1Y5M"
1038
+ const negative = s.startsWith('-');
1039
+ const body = negative ? s.substring(2) : s.substring(1); // skip P or -P
1040
+ let years = 0;
1041
+ let months = 0;
1042
+ const ym = body.match(/(\d+)Y/);
1043
+ if (ym)
1044
+ years = parseInt(ym[1], 10);
1045
+ const mm = body.match(/(\d+)M/);
1046
+ if (mm)
1047
+ months = parseInt(mm[1], 10);
1048
+ const total = (years * 12 + months) * (negative ? -1 : 1);
1049
+ const data = Buffer.alloc(4);
1050
+ data.writeInt32LE(total, 0);
1051
+ return { type: enums_1.PropertyType.YEAR_TO_MONTH, data, isNull: false };
1052
+ }
1053
+ case enums_1.PropertyType.DAY_TO_SECOND: {
1054
+ // ISO-8601: "P3DT4H", "PT0S", "P1DT2H3M4.12S"
1055
+ const body = s.substring(1); // skip P
1056
+ let days = 0;
1057
+ let hours = 0;
1058
+ let mins = 0;
1059
+ let secs = 0;
1060
+ let nanos = 0;
1061
+ const tIdx = body.indexOf('T');
1062
+ const datePart2 = tIdx >= 0 ? body.substring(0, tIdx) : body;
1063
+ const timePart2 = tIdx >= 0 ? body.substring(tIdx + 1) : '';
1064
+ const dm = datePart2.match(/(\d+)D/);
1065
+ if (dm)
1066
+ days = parseInt(dm[1], 10);
1067
+ if (timePart2) {
1068
+ const hm = timePart2.match(/(\d+)H/);
1069
+ if (hm)
1070
+ hours = parseInt(hm[1], 10);
1071
+ const minm = timePart2.match(/(\d+)M/);
1072
+ if (minm)
1073
+ mins = parseInt(minm[1], 10);
1074
+ const sm = timePart2.match(/([\d.]+)S/);
1075
+ if (sm) {
1076
+ const secStr = sm[1];
1077
+ const dotIdx = secStr.indexOf('.');
1078
+ if (dotIdx >= 0) {
1079
+ secs = parseInt(secStr.substring(0, dotIdx), 10);
1080
+ const frac = secStr.substring(dotIdx + 1);
1081
+ nanos = parseInt(frac.padEnd(9, '0').substring(0, 9), 10);
1082
+ }
1083
+ else {
1084
+ secs = parseInt(secStr, 10);
1085
+ }
1086
+ }
1087
+ }
1088
+ const totalSeconds = days * 86400 + hours * 3600 + mins * 60 + secs;
1089
+ const data = Buffer.alloc(12);
1090
+ data.writeBigUInt64LE(BigInt(totalSeconds), 0);
1091
+ data.writeUInt32LE(nanos, 8);
1092
+ return { type: enums_1.PropertyType.DAY_TO_SECOND, data, isNull: false };
1093
+ }
1094
+ default:
1095
+ return { type: targetType, data: Buffer.from(s, 'utf-8'), isNull: false };
1096
+ }
1097
+ }
1098
+ /** Parse "HH:mm:ss[.nnnnnnnnn]" into components */
1099
+ function parseTimeString(s) {
1100
+ const dotIdx = s.indexOf('.');
1101
+ let timePortion;
1102
+ let nanosecond = 0;
1103
+ if (dotIdx >= 0) {
1104
+ timePortion = s.substring(0, dotIdx);
1105
+ const frac = s.substring(dotIdx + 1);
1106
+ nanosecond = parseInt(frac.padEnd(9, '0').substring(0, 9), 10);
1107
+ }
1108
+ else {
1109
+ timePortion = s;
1110
+ }
1111
+ const parts = timePortion.split(':');
1112
+ return {
1113
+ hour: parseInt(parts[0], 10),
1114
+ minute: parseInt(parts[1], 10),
1115
+ second: parseInt(parts[2], 10),
1116
+ nanosecond,
1117
+ };
1118
+ }
1119
+ /** Split "HH:mm:ss[.n]+HH:MM" or "HH:mm:ss[.n]-HH:MM" into timePart and offsetPart.
1120
+ * Also supports Z suffix (treated as +00:00) and space-separated offsets like "14:30:00 +08:00". */
1121
+ function splitTimeAndOffset(s) {
1122
+ const normalized = normalizeOffset(s);
1123
+ // Find the last '+' or '-' that indicates offset (skip the one at position 0 if present)
1124
+ // Offset is always in the format +HH:MM or -HH:MM at the end
1125
+ // Search for + or - that is followed by exactly DD:DD pattern at end
1126
+ const match = normalized.match(/^(.+?)([+-]\d{2}:\d{2})$/);
1127
+ if (match) {
1128
+ return { timePart: match[1], offsetPart: match[2] };
1129
+ }
1130
+ return { timePart: normalized, offsetPart: '+00:00' };
1131
+ }
1132
+ /**
1133
+ * Remove trailing timezone offset or Z suffix from a datetime/time string.
1134
+ * Only looks in the last ~10 characters to avoid matching date hyphens like "1993-05-06".
1135
+ * Returns the clean local time/datetime string.
1136
+ */
1137
+ function removeOffset(s) {
1138
+ // Handle Z suffix
1139
+ if (s.endsWith('Z') || s.endsWith('z')) {
1140
+ return s.slice(0, -1);
1141
+ }
1142
+ // Handle space-separated offset: " +HH:MM" or " -HH:MM"
1143
+ const spaceOffMatch = s.match(/^(.+?)\s+[+-]\d{2}:?\d{2}$/);
1144
+ if (spaceOffMatch) {
1145
+ return spaceOffMatch[1];
1146
+ }
1147
+ // Handle attached offset: "+HH:MM" or "-HH:MM" or "+HHMM" or "-HHMM" at end
1148
+ // Only match in the last 10 chars to avoid date hyphens
1149
+ const tail = s.length > 10 ? s.substring(s.length - 10) : s;
1150
+ const offMatch = tail.match(/[+-]\d{2}:?\d{2}$/);
1151
+ if (offMatch) {
1152
+ return s.substring(0, s.length - offMatch[0].length);
1153
+ }
1154
+ return s;
1155
+ }
1156
+ /**
1157
+ * Normalize a string's trailing offset: collapse space before offset, convert Z to +00:00.
1158
+ * Only looks in the last ~10 characters to avoid matching date hyphens.
1159
+ */
1160
+ function normalizeOffset(s) {
1161
+ // Handle Z suffix → +00:00
1162
+ if (s.endsWith('Z') || s.endsWith('z')) {
1163
+ return s.slice(0, -1) + '+00:00';
1164
+ }
1165
+ // Handle space-separated offset: " +HH:MM" or " -HH:MM"
1166
+ const spaceOffMatch = s.match(/^(.+?)\s+([+-]\d{2}:\d{2})$/);
1167
+ if (spaceOffMatch) {
1168
+ return spaceOffMatch[1] + spaceOffMatch[2];
1169
+ }
1170
+ return s;
1171
+ }
1172
+ /** Create a parameter from name and value */
1173
+ function createParameter(name, value) {
1174
+ return { name, value: createTypedValue(value) };
1175
+ }
1176
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZWRfdmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvdHlwZWRfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOztBQTBISCw0Q0ErTUM7QUFRRCx3Q0E4TUM7QUF1U0Qsa0NBMEpDO0FBV0QsZ0NBOFFDO0FBeUZELDBDQUVDO0FBbDFDRCxtQ0FBdUM7QUFDdkMseUNBQTREO0FBQzVELDZDQThCc0I7QUFZdEIsZ0ZBQWdGO0FBQ2hGLHdCQUF3QjtBQUN4QixnRkFBZ0Y7QUFFaEYsb0VBQW9FO0FBQ3BFLFNBQVMsWUFBWSxDQUFDLENBQVM7SUFDN0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9DLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsd0VBQXdFO0FBQ3hFLFNBQVMsWUFBWSxDQUFDLElBQVksRUFBRSxNQUFjO0lBQ2hELElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTTtRQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNuRCxPQUFPLENB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QUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFDRCx3REFBd0Q7SUFDeEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzdELElBQUksYUFBYSxFQUFFLENBQUM7UUFDbEIsT0FBTyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFTRCw2Q0FBNkM7QUFDN0MsU0FBZ0IsZUFBZSxDQUFDLElBQVksRUFBRSxLQUFVO0lBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHlwZWRWYWx1ZSBlbmNvZGluZyBhbmQgZGVjb2RpbmcgZm9yIEdRTERCIE5vZGUuanMgZHJpdmVyLlxuICovXG5cbmltcG9ydCB7IFByb3BlcnR5VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgSW50MzIsIFVJbnQzMiwgRmxvYXQzMiwgVUludDY0IH0gZnJvbSAnLi93cmFwcGVycyc7XG5pbXBvcnQge1xuICBQb2ludCxcbiAgUG9pbnQzRCxcbiAgR3FsZGJEZWNpbWFsLFxuICBHcWxkYlRpbWVzdGFtcCxcbiAgR3FsZGJMb2NhbERhdGVUaW1lLFxuICBHcWxkYkRhdGUsXG4gIEdxbGRiWm9uZWREYXRlVGltZSxcbiAgR3FsZGJMb2NhbFRpbWUsXG4gIEdxbGRiWm9uZWRUaW1lLFxuICBHcWxkYlRhYmxlLFxuICBZZWFyVG9Nb250aCxcbiAgRGF5VG9TZWNvbmQsXG4gIFZlY3RvcixcbiAgaXNQb2ludCxcbiAgaXNQb2ludDNELFxuICBpc0dxbGRiRGVjaW1hbCxcbiAgaXNHcWxkYlRpbWVzdGFtcCxcbiAgaXNHcWxkYkxvY2FsRGF0ZVRpbWUsXG4gIGlzR3FsZGJEYXRlLFxuICBpc0dxbGRiWm9uZWREYXRlVGltZSxcbiAgaXNHcWxkYkxvY2FsVGltZSxcbiAgaXNHcWxkYlpvbmVkVGltZSxcbiAgaXNZZWFyVG9Nb250aCxcbiAgaXNEYXlUb1NlY29uZCxcbiAgaXNWZWN0b3IsXG4gIGlzR3FsZGJTZXQsXG4gIHRpbWVzdGFtcEZyb21EYXRlLFxuICBjcmVhdGVUaW1lc3RhbXAsXG4gIGNyZWF0ZUxvY2FsRGF0ZVRpbWUsXG59IGZyb20gJy4vZGF0YV90eXBlcyc7XG5pbXBvcnQgeyBHcWxkYk5vZGUsIEdxbGRiRWRnZSwgR3FsZGJQYXRoLCBHcWxkYkVycm9yIH0gZnJvbSAnLi9ncmFwaF9tb2RlbHMnO1xuXG5cbi8qKiBSZXByZXNlbnRzIGEgdHlwZWQgdmFsdWUgZm9yIHdpcmUgdHJhbnNtaXNzaW9uICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVkVmFsdWUge1xuICB0eXBlOiBQcm9wZXJ0eVR5cGU7XG4gIGRhdGE6IEJ1ZmZlcjtcbiAgaXNOdWxsOiBib29sZWFuO1xufVxuXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBCaW5hcnkgRm9ybWF0IEhlbHBlcnNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBFbmNvZGUgYSBsZW5ndGgtcHJlZml4ZWQgc3RyaW5nOiBbbGVuOjIgdWludDE2TEVdW3V0ZjggYnl0ZXNdICovXG5mdW5jdGlvbiBlbmNvZGVTdHJpbmcoczogc3RyaW5nKTogQnVmZmVyIHtcbiAgY29uc3Qgc3RyQnVmID0gQnVmZmVyLmZyb20ocywgJ3V0Zi04Jyk7XG4gIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYygyICsgc3RyQnVmLmxlbmd0aCk7XG4gIHJlc3VsdC53cml0ZVVJbnQxNkxFKHN0ckJ1Zi5sZW5ndGgsIDApO1xuICBzdHJCdWYuY29weShyZXN1bHQsIDIpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogRGVjb2RlIGEgbGVuZ3RoLXByZWZpeGVkIHN0cmluZy4gUmV0dXJucyBbc3RyaW5nLCBieXRlc0NvbnN1bWVkXS4gKi9cbmZ1bmN0aW9uIGRlY29kZVN0cmluZyhkYXRhOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogW3N0cmluZywgbnVtYmVyXSB7XG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiBbJycsIDBdO1xuICBjb25zdCBsZW4gPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICBpZiAob2Zmc2V0ICsgMiArIGxlbiA+IGRhdGEubGVuZ3RoKSByZXR1cm4gWycnLCAwXTtcbiAgcmV0dXJuIFtkYXRhLnNsaWNlKG9mZnNldCArIDIsIG9mZnNldCArIDIgKyBsZW4pLnRvU3RyaW5nKCd1dGYtOCcpLCAyICsgbGVuXTtcbn1cblxuLyoqIEVuY29kZSBhIFR5cGVkVmFsdWVFbnRyeTogW3R5cGU6MV1baXNOdWxsOjFdW2RhdGFMZW46NCB1aW50MzJMRV1bZGF0YV0gKi9cbmZ1bmN0aW9uIGVuY29kZVR5cGVkVmFsdWVFbnRyeSh0djogVHlwZWRWYWx1ZSk6IEJ1ZmZlciB7XG4gIGNvbnN0IHJlc3VsdCA9IEJ1ZmZlci5hbGxvYyg2ICsgdHYuZGF0YS5sZW5ndGgpO1xuICByZXN1bHQud3JpdGVVSW50OCh0di50eXBlLCAwKTtcbiAgcmVzdWx0LndyaXRlVUludDgodHYuaXNOdWxsID8gMSA6IDAsIDEpO1xuICByZXN1bHQud3JpdGVVSW50MzJMRSh0di5kYXRhLmxlbmd0aCwgMik7XG4gIGlmICh0di5kYXRhLmxlbmd0aCA+IDApIHtcbiAgICB0di5kYXRhLmNvcHkocmVzdWx0LCA2KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKiogRGVjb2RlIGEgVHlwZWRWYWx1ZUVudHJ5LiBSZXR1cm5zIFtUeXBlZFZhbHVlLCBieXRlc0NvbnN1bWVkXS4gKi9cbmZ1bmN0aW9uIGRlY29kZVR5cGVkVmFsdWVFbnRyeShkYXRhOiBCdWZmZXIsIG9mZnNldDogbnVtYmVyKTogW1R5cGVkVmFsdWUsIG51bWJlcl0ge1xuICBpZiAob2Zmc2V0ICsgNiA+IGRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFByb3BlcnR5VHlwZS5OVUxMLCBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIGlzTnVsbDogdHJ1ZSB9LCAwXTtcbiAgfVxuICBjb25zdCB0eXBlID0gZGF0YS5yZWFkVUludDgob2Zmc2V0KSBhcyBQcm9wZXJ0eVR5cGU7XG4gIGNvbnN0IGlzTnVsbCA9IGRhdGEucmVhZFVJbnQ4KG9mZnNldCArIDEpICE9PSAwO1xuICBjb25zdCBkYXRhTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0ICsgMik7XG4gIGlmIChvZmZzZXQgKyA2ICsgZGF0YUxlbiA+IGRhdGEubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFt7IHR5cGU6IFByb3BlcnR5VHlwZS5OVUxMLCBkYXRhOiBCdWZmZXIuYWxsb2MoMCksIGlzTnVsbDogdHJ1ZSB9LCAwXTtcbiAgfVxuICBjb25zdCB0dkRhdGEgPSBkYXRhLnNsaWNlKG9mZnNldCArIDYsIG9mZnNldCArIDYgKyBkYXRhTGVuKTtcbiAgcmV0dXJuIFt7IHR5cGUsIGRhdGE6IHR2RGF0YSwgaXNOdWxsIH0sIDYgKyBkYXRhTGVuXTtcbn1cblxuLyoqIERlY29kZSBiaW5hcnkgcHJvcGVydGllczogW2NvdW50OjJdW2tleUxlbjoyXVtrZXldW1RWRV0uLi4gKi9cbmZ1bmN0aW9uIGRlY29kZVByb3BlcnRpZXNCaW5hcnkoZGF0YTogQnVmZmVyLCBvZmZzZXQ6IG51bWJlcik6IFtSZWNvcmQ8c3RyaW5nLCBhbnk+LCBudW1iZXJdIHtcbiAgaWYgKG9mZnNldCArIDIgPiBkYXRhLmxlbmd0aCkgcmV0dXJuIFt7fSwgMF07XG4gIGNvbnN0IGNvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcbiAgbGV0IHBvcyA9IG9mZnNldCArIDI7XG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGNvbnN0IFtrZXksIGtleUxlbl0gPSBkZWNvZGVTdHJpbmcoZGF0YSwgcG9zKTtcbiAgICBpZiAoa2V5TGVuID09PSAwKSBicmVhaztcbiAgICBwb3MgKz0ga2V5TGVuO1xuXG4gICAgY29uc3QgW3R2LCB0dkxlbl0gPSBkZWNvZGVUeXBlZFZhbHVlRW50cnkoZGF0YSwgcG9zKTtcbiAgICBpZiAodHZMZW4gPT09IDApIGJyZWFrO1xuICAgIHBvcyArPSB0dkxlbjtcblxuICAgIHJlc3VsdFtrZXldID0gdHlwZWRWYWx1ZVRvSlModHYpO1xuICB9XG5cbiAgcmV0dXJuIFtyZXN1bHQsIHBvcyAtIG9mZnNldF07XG59XG5cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuY29kaW5nOiBKUyDihpIgVHlwZWRWYWx1ZVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqIENyZWF0ZSBhIFR5cGVkVmFsdWUgZnJvbSBhIEphdmFTY3JpcHQgdmFsdWUgKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUeXBlZFZhbHVlKHZhbHVlOiBhbnkpOiBUeXBlZFZhbHVlIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTlVMTCwgZGF0YTogQnVmZmVyLmFsbG9jKDApLCBpc051bGw6IHRydWUgfTtcbiAgfVxuXG4gIC8vIFBhc3MtdGhyb3VnaDogaWYgYWxyZWFkeSBhIFR5cGVkVmFsdWUsIHJldHVybiBkaXJlY3RseVxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndHlwZScgaW4gdmFsdWUgJiYgJ2RhdGEnIGluIHZhbHVlICYmICdpc051bGwnIGluIHZhbHVlICYmIHZhbHVlLmRhdGEgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgVHlwZWRWYWx1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJykge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMSk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlID8gMSA6IDAsIDApO1xuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5CT09MLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gIH1cblxuICAvLyBIYW5kbGUgZXhwbGljaXQgdHlwZSB3cmFwcGVyc1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnQzMikge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgZGF0YS53cml0ZUludDMyTEUodmFsdWUudmFsdWUsIDApO1xuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5JTlQzMiwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVUludDMyKSB7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUodmFsdWUudmFsdWUsIDApO1xuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5VSU5UMzIsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0MzIpIHtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgIGRhdGEud3JpdGVGbG9hdExFKHZhbHVlLnZhbHVlLCAwKTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuRkxPQVQsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVJbnQ2NCkge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgZGF0YS53cml0ZUJpZ1VJbnQ2NExFKHZhbHVlLnZhbHVlLCAwKTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVUlOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIC8vIFVzZSBpc1NhZmVJbnRlZ2VyIHRvIGF2b2lkIGlzc3VlcyB3aXRoIGxhcmdlIGZsb2F0cyBsaWtlIE51bWJlci5NQVhfVkFMVUVcbiAgICAvLyB3aGljaCBhcHBlYXIgYXMgaW50ZWdlcnMgZHVlIHRvIHByZWNpc2lvbiBsb3NzXG4gICAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSkge1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAgIGRhdGEud3JpdGVCaWdJbnQ2NExFKEJpZ0ludCh2YWx1ZSksIDApO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUsIDApO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkRPVUJMRSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSB7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAvLyBDaGVjayBpZiB2YWx1ZSBmaXRzIGluIHNpZ25lZCBJTlQ2NCByYW5nZVxuICAgIGNvbnN0IElOVDY0X01JTiA9IEJpZ0ludCgnLTkyMjMzNzIwMzY4NTQ3NzU4MDgnKTtcbiAgICBjb25zdCBJTlQ2NF9NQVggPSBCaWdJbnQoJzkyMjMzNzIwMzY4NTQ3NzU4MDcnKTtcbiAgICBpZiAodmFsdWUgPj0gSU5UNjRfTUlOICYmIHZhbHVlIDw9IElOVDY0X01BWCkge1xuICAgICAgZGF0YS53cml0ZUJpZ0ludDY0TEUodmFsdWUsIDApO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLklOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFZhbHVlIGlzIG91dHNpZGUgSU5UNjQgcmFuZ2UsIHVzZSBVSU5UNjRcbiAgICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRSh2YWx1ZSwgMCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVUlOVDY0LCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuU1RSSU5HLCBkYXRhOiBCdWZmZXIuZnJvbSh2YWx1ZSwgJ3V0Zi04JyksIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkJMT0IsIGRhdGE6IHZhbHVlLCBpc051bGw6IGZhbHNlIH07XG4gIH1cblxuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgY29uc3QgdW5peFNlY29uZHMgPSBCaWdJbnQoTWF0aC5mbG9vcih2YWx1ZS5nZXRUaW1lKCkgLyAxMDAwKSk7XG4gICAgY29uc3QgbmFub3MgPSAodmFsdWUuZ2V0VGltZSgpICUgMTAwMCkgKiAxXzAwMF8wMDA7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgZGF0YS53cml0ZUJpZ0ludDY0TEUodW5peFNlY29uZHMsIDApO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vcyA8IDAgPyBuYW5vcyArIDFfMDAwXzAwMF8wMDAgOiBuYW5vcywgOCk7XG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlRJTUVTVEFNUCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzR3FsZGJUaW1lc3RhbXAodmFsdWUpKSB7XG4gICAgY29uc3QgdW5peFNlY29uZHMgPSBCaWdJbnQoTWF0aC5mbG9vcihcbiAgICAgIERhdGUuVVRDKHZhbHVlLnllYXIsIHZhbHVlLm1vbnRoIC0gMSwgdmFsdWUuZGF5LCB2YWx1ZS5ob3VyLCB2YWx1ZS5taW51dGUsIHZhbHVlLnNlY29uZCkgLyAxMDAwXG4gICAgKSk7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgZGF0YS53cml0ZUJpZ0ludDY0TEUodW5peFNlY29uZHMsIDApO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSh2YWx1ZS5uYW5vc2Vjb25kLCA4KTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZW5jb2RlTGlzdCh2YWx1ZSk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgbmV3IHR5cGVzIGJlZm9yZSBnZW5lcmljIG9iamVjdCBoYW5kbGluZ1xuICBpZiAoaXNQb2ludCh2YWx1ZSkpIHtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDE2KTtcbiAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUubG9uZ2l0dWRlLCAwKTtcbiAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUubGF0aXR1ZGUsIDgpO1xuICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5QT0lOVCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzUG9pbnQzRCh2YWx1ZSkpIHtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDI0KTtcbiAgICBkYXRhLndyaXRlRG91YmxlTEUodmFsdWUueCwgMCk7XG4gICAgZGF0YS53cml0ZURvdWJsZUxFKHZhbHVlLnksIDgpO1xuICAgIGRhdGEud3JpdGVEb3VibGVMRSh2YWx1ZS56LCAxNik7XG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlBPSU5UM0QsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChpc0dxbGRiRGVjaW1hbCh2YWx1ZSkpIHtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuREVDSU1BTCwgZGF0YTogQnVmZmVyLmZyb20odmFsdWUudmFsdWUsICd1dGYtOCcpLCBpc051bGw6IGZhbHNlIH07XG4gIH1cblxuICBpZiAoaXNHcWxkYkxvY2FsRGF0ZVRpbWUodmFsdWUpKSB7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMSk7XG4gICAgZGF0YS53cml0ZVVJbnQxNkxFKHZhbHVlLnllYXIsIDApO1xuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5tb250aCwgMik7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLmRheSwgMyk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLmhvdXIsIDQpO1xuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5taW51dGUsIDUpO1xuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5zZWNvbmQsIDYpO1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSh2YWx1ZS5uYW5vc2Vjb25kLCA3KTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTE9DQUxfREFURVRJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChpc0dxbGRiRGF0ZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgIGRhdGEud3JpdGVVSW50MTZMRSh2YWx1ZS55ZWFyLCAwKTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUubW9udGgsIDIpO1xuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5kYXksIDMpO1xuICAgIC8vIGJ5dGVzIDQtNyBhcmUgcGFkZGluZyAoemVyb3MpXG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkRBVEUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChpc0dxbGRiWm9uZWREYXRlVGltZSh2YWx1ZSkpIHtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEzKTtcbiAgICBkYXRhLndyaXRlVUludDE2TEUodmFsdWUueWVhciwgMCk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLm1vbnRoLCAyKTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuZGF5LCAzKTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuaG91ciwgNCk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLm1pbnV0ZSwgNSk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLnNlY29uZCwgNik7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmQsIDcpO1xuICAgIGRhdGEud3JpdGVJbnQxNkxFKHZhbHVlLm9mZnNldE1pbnV0ZXMsIDExKTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWk9ORURfREFURVRJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChpc0dxbGRiWm9uZWRUaW1lKHZhbHVlKSkge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTApO1xuICAgIGRhdGEud3JpdGVVSW50OCh2YWx1ZS5ob3VyLCAwKTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUubWludXRlLCAxKTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuc2Vjb25kLCAyKTtcbiAgICAvLyBieXRlIDMgaXMgcGFkZGluZ1xuICAgIGRhdGEud3JpdGVVSW50MzJMRSh2YWx1ZS5uYW5vc2Vjb25kLCA0KTtcbiAgICBkYXRhLndyaXRlSW50MTZMRSh2YWx1ZS5vZmZzZXRNaW51dGVzLCA4KTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWk9ORURfVElNRSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzR3FsZGJMb2NhbFRpbWUodmFsdWUpKSB7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICBkYXRhLndyaXRlVUludDgodmFsdWUuaG91ciwgMCk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLm1pbnV0ZSwgMSk7XG4gICAgZGF0YS53cml0ZVVJbnQ4KHZhbHVlLnNlY29uZCwgMik7XG4gICAgLy8gYnl0ZSAzIGlzIHBhZGRpbmdcbiAgICBkYXRhLndyaXRlVUludDMyTEUodmFsdWUubmFub3NlY29uZCwgNCk7XG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLkxPQ0FMX1RJTUUsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgfVxuXG4gIGlmIChpc1llYXJUb01vbnRoKHZhbHVlKSkge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoNCk7XG4gICAgZGF0YS53cml0ZUludDMyTEUodmFsdWUubW9udGhzLCAwKTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWUVBUl9UT19NT05USCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzRGF5VG9TZWNvbmQodmFsdWUpKSB7XG4gICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgZGF0YS53cml0ZUJpZ1VJbnQ2NExFKEJpZ0ludCh2YWx1ZS5zZWNvbmRzKSwgMCk7XG4gICAgZGF0YS53cml0ZVVJbnQzMkxFKHZhbHVlLm5hbm9zZWNvbmRzLCA4KTtcbiAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuREFZX1RPX1NFQ09ORCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzVmVjdG9yKHZhbHVlKSkge1xuICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoNCArIHZhbHVlLnZhbHVlcy5sZW5ndGggKiA0KTtcbiAgICBkYXRhLndyaXRlVUludDMyTEUodmFsdWUudmFsdWVzLmxlbmd0aCwgMCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRhdGEud3JpdGVGbG9hdExFKHZhbHVlLnZhbHVlc1tpXSwgNCArIGkgKiA0KTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlZFQ1RPUiwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICB9XG5cbiAgaWYgKGlzR3FsZGJTZXQodmFsdWUpKSB7XG4gICAgcmV0dXJuIGVuY29kZVNldCh2YWx1ZSk7XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBlbmNvZGVNYXAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGU6ICR7dHlwZW9mIHZhbHVlfWApO1xufVxuXG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEZWNvZGluZzogVHlwZWRWYWx1ZSDihpIgSlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBDb252ZXJ0IGEgVHlwZWRWYWx1ZSB0byBhIEphdmFTY3JpcHQgdmFsdWUgKi9cbmV4cG9ydCBmdW5jdGlvbiB0eXBlZFZhbHVlVG9KUyh0djogVHlwZWRWYWx1ZSk6IGFueSB7XG4gIGlmICh0di5pc051bGwgfHwgdHYudHlwZSA9PT0gUHJvcGVydHlUeXBlLk5VTEwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN3aXRjaCAodHYudHlwZSkge1xuICAgIGNhc2UgUHJvcGVydHlUeXBlLkJPT0w6XG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gMSAmJiB0di5kYXRhLnJlYWRVSW50OCgwKSAhPT0gMDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDMyOlxuICAgICAgcmV0dXJuIHR2LmRhdGEubGVuZ3RoID49IDQgPyB0di5kYXRhLnJlYWRJbnQzMkxFKDApIDogMDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQzMjpcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkVUludDMyTEUoMCkgOiAwO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UNjQ6IHtcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDgpIHJldHVybiAwO1xuICAgICAgY29uc3QgYmlnVmFsID0gdHYuZGF0YS5yZWFkQmlnSW50NjRMRSgwKTtcbiAgICAgIC8vIFJldHVybiByZWd1bGFyIG51bWJlciBpZiB2YWx1ZSBmaXRzIGluIHNhZmUgaW50ZWdlciByYW5nZVxuICAgICAgaWYgKGJpZ1ZhbCA+PSBCaWdJbnQoTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVIpICYmIGJpZ1ZhbCA8PSBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKSB7XG4gICAgICAgIHJldHVybiBOdW1iZXIoYmlnVmFsKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBiaWdWYWw7XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVUlOVDY0OiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCA4KSByZXR1cm4gMDtcbiAgICAgIGNvbnN0IGJpZ1ZhbCA9IHR2LmRhdGEucmVhZEJpZ1VJbnQ2NExFKDApO1xuICAgICAgLy8gUmV0dXJuIHJlZ3VsYXIgbnVtYmVyIGlmIHZhbHVlIGZpdHMgaW4gc2FmZSBpbnRlZ2VyIHJhbmdlXG4gICAgICBpZiAoYmlnVmFsIDw9IEJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcbiAgICAgICAgcmV0dXJuIE51bWJlcihiaWdWYWwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJpZ1ZhbDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5GTE9BVDpcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkRmxvYXRMRSgwKSA6IDA7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ET1VCTEU6XG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gOCA/IHR2LmRhdGEucmVhZERvdWJsZUxFKDApIDogMDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlNUUklORzpcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5URVhUOlxuICAgICAgcmV0dXJuIHR2LmRhdGEudG9TdHJpbmcoJ3V0Zi04Jyk7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5CTE9COlxuICAgICAgcmV0dXJuIHR2LmRhdGE7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5USU1FU1RBTVA6XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gMTIpIHtcbiAgICAgICAgY29uc3Qgc2VjcyA9IE51bWJlcih0di5kYXRhLnJlYWRCaWdJbnQ2NExFKDApKTtcbiAgICAgICAgY29uc3QgbmFub3MgPSB0di5kYXRhLnJlYWRVSW50MzJMRSg4KTtcbiAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHNlY3MgKiAxMDAwICsgTWF0aC5mbG9vcihuYW5vcyAvIDFfMDAwXzAwMCkpO1xuICAgICAgICByZXR1cm4gY3JlYXRlVGltZXN0YW1wKFxuICAgICAgICAgIGQuZ2V0VVRDRnVsbFllYXIoKSxcbiAgICAgICAgICBkLmdldFVUQ01vbnRoKCkgKyAxLFxuICAgICAgICAgIGQuZ2V0VVRDRGF0ZSgpLFxuICAgICAgICAgIGQuZ2V0VVRDSG91cnMoKSxcbiAgICAgICAgICBkLmdldFVUQ01pbnV0ZXMoKSxcbiAgICAgICAgICBkLmdldFVUQ1NlY29uZHMoKSxcbiAgICAgICAgICBuYW5vcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjcmVhdGVUaW1lc3RhbXAoMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5EQVRFOlxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB5ZWFyOiB0di5kYXRhLnJlYWRVSW50MTZMRSgwKSxcbiAgICAgICAgICBtb250aDogdHYuZGF0YS5yZWFkVUludDgoMiksXG4gICAgICAgICAgZGF5OiB0di5kYXRhLnJlYWRVSW50OCgzKSxcbiAgICAgICAgfSBhcyBHcWxkYkRhdGU7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyOiAwLCBtb250aDogMCwgZGF5OiAwIH0gYXMgR3FsZGJEYXRlO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRTpcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSA4KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaG91cjogdHYuZGF0YS5yZWFkVUludDgoMCksXG4gICAgICAgICAgbWludXRlOiB0di5kYXRhLnJlYWRVSW50OCgxKSxcbiAgICAgICAgICBzZWNvbmQ6IHR2LmRhdGEucmVhZFVJbnQ4KDIpLFxuICAgICAgICAgIG5hbm9zZWNvbmQ6IHR2LmRhdGEucmVhZFVJbnQzMkxFKDQpLFxuICAgICAgICB9IGFzIEdxbGRiTG9jYWxUaW1lO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgaG91cjogMCwgbWludXRlOiAwLCBzZWNvbmQ6IDAsIG5hbm9zZWNvbmQ6IDAgfSBhcyBHcWxkYkxvY2FsVGltZTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlpPTkVEX1RJTUU6XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gMTApIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBob3VyOiB0di5kYXRhLnJlYWRVSW50OCgwKSxcbiAgICAgICAgICBtaW51dGU6IHR2LmRhdGEucmVhZFVJbnQ4KDEpLFxuICAgICAgICAgIHNlY29uZDogdHYuZGF0YS5yZWFkVUludDgoMiksXG4gICAgICAgICAgbmFub3NlY29uZDogdHYuZGF0YS5yZWFkVUludDMyTEUoNCksXG4gICAgICAgICAgb2Zmc2V0TWludXRlczogdHYuZGF0YS5yZWFkSW50MTZMRSg4KSxcbiAgICAgICAgfSBhcyBHcWxkYlpvbmVkVGltZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGhvdXI6IDAsIG1pbnV0ZTogMCwgc2Vjb25kOiAwLCBuYW5vc2Vjb25kOiAwLCBvZmZzZXRNaW51dGVzOiAwIH0gYXMgR3FsZGJab25lZFRpbWU7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5aT05FRF9EQVRFVElNRTpcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSAxMykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHllYXI6IHR2LmRhdGEucmVhZFVJbnQxNkxFKDApLFxuICAgICAgICAgIG1vbnRoOiB0di5kYXRhLnJlYWRVSW50OCgyKSxcbiAgICAgICAgICBkYXk6IHR2LmRhdGEucmVhZFVJbnQ4KDMpLFxuICAgICAgICAgIGhvdXI6IHR2LmRhdGEucmVhZFVJbnQ4KDQpLFxuICAgICAgICAgIG1pbnV0ZTogdHYuZGF0YS5yZWFkVUludDgoNSksXG4gICAgICAgICAgc2Vjb25kOiB0di5kYXRhLnJlYWRVSW50OCg2KSxcbiAgICAgICAgICBuYW5vc2Vjb25kOiB0di5kYXRhLnJlYWRVSW50MzJMRSg3KSxcbiAgICAgICAgICBvZmZzZXRNaW51dGVzOiB0di5kYXRhLnJlYWRJbnQxNkxFKDExKSxcbiAgICAgICAgfSBhcyBHcWxkYlpvbmVkRGF0ZVRpbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB5ZWFyOiAwLCBtb250aDogMCwgZGF5OiAwLCBob3VyOiAwLCBtaW51dGU6IDAsIHNlY29uZDogMCwgbmFub3NlY29uZDogMCwgb2Zmc2V0TWludXRlczogMCB9IGFzIEdxbGRiWm9uZWREYXRlVGltZTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkxPQ0FMX0RBVEVUSU1FOlxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEVUSU1FOlxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDExKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbERhdGVUaW1lKFxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQxNkxFKDApLCAgIC8vIHllYXJcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50OCgyKSwgICAgICAvLyBtb250aFxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQ4KDMpLCAgICAgIC8vIGRheVxuICAgICAgICAgIHR2LmRhdGEucmVhZFVJbnQ4KDQpLCAgICAgIC8vIGhvdXJcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50OCg1KSwgICAgICAvLyBtaW51dGVcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50OCg2KSwgICAgICAvLyBzZWNvbmRcbiAgICAgICAgICB0di5kYXRhLnJlYWRVSW50MzJMRSg3KSwgICAvLyBuYW5vc2Vjb25kXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlTG9jYWxEYXRlVGltZSgwLCAwLCAwLCAwLCAwLCAwLCAwKTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLllFQVJfVE9fTU9OVEg6XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gNCkge1xuICAgICAgICByZXR1cm4geyBtb250aHM6IHR2LmRhdGEucmVhZEludDMyTEUoMCkgfSBhcyBZZWFyVG9Nb250aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IG1vbnRoczogMCB9IGFzIFllYXJUb01vbnRoO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFZX1RPX1NFQ09ORDpcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSAxMikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHNlY29uZHM6IE51bWJlcih0di5kYXRhLnJlYWRCaWdVSW50NjRMRSgwKSksXG4gICAgICAgICAgbmFub3NlY29uZHM6IHR2LmRhdGEucmVhZFVJbnQzMkxFKDgpLFxuICAgICAgICB9IGFzIERheVRvU2Vjb25kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc2Vjb25kczogMCwgbmFub3NlY29uZHM6IDAgfSBhcyBEYXlUb1NlY29uZDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlBPSU5UOlxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDE2KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbG9uZ2l0dWRlOiB0di5kYXRhLnJlYWREb3VibGVMRSgwKSxcbiAgICAgICAgICBsYXRpdHVkZTogdHYuZGF0YS5yZWFkRG91YmxlTEUoOCksXG4gICAgICAgIH0gYXMgUG9pbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4geyBsYXRpdHVkZTogMCwgbG9uZ2l0dWRlOiAwIH0gYXMgUG9pbnQ7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5QT0lOVDNEOlxuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoID49IDI0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgeDogdHYuZGF0YS5yZWFkRG91YmxlTEUoMCksXG4gICAgICAgICAgeTogdHYuZGF0YS5yZWFkRG91YmxlTEUoOCksXG4gICAgICAgICAgejogdHYuZGF0YS5yZWFkRG91YmxlTEUoMTYpLFxuICAgICAgICB9IGFzIFBvaW50M0Q7XG4gICAgICB9XG4gICAgICByZXR1cm4geyB4OiAwLCB5OiAwLCB6OiAwIH0gYXMgUG9pbnQzRDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRFQ0lNQUw6XG4gICAgICByZXR1cm4geyB2YWx1ZTogdHYuZGF0YS50b1N0cmluZygndXRmLTgnKSB9IGFzIEdxbGRiRGVjaW1hbDtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlZFQ1RPUjpcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA+PSA0KSB7XG4gICAgICAgIGNvbnN0IGRpbSA9IHR2LmRhdGEucmVhZFVJbnQzMkxFKDApO1xuICAgICAgICBpZiAodHYuZGF0YS5sZW5ndGggPj0gNCArIGRpbSAqIDQpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZXM6IG51bWJlcltdID0gW107XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaW07IGkrKykge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2godHYuZGF0YS5yZWFkRmxvYXRMRSg0ICsgaSAqIDQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgdmFsdWVzIH0gYXMgVmVjdG9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4geyB2YWx1ZXM6IFtdIH0gYXMgVmVjdG9yO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTElTVDpcbiAgICAgIHJldHVybiBkZWNvZGVMaXN0KHR2LmRhdGEpO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuU0VUOlxuICAgICAgcmV0dXJuIG5ldyBTZXQoZGVjb2RlTGlzdCh0di5kYXRhKSk7XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5NQVA6XG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuUkVDT1JEOlxuICAgICAgcmV0dXJuIGRlY29kZU1hcCh0di5kYXRhKTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlRBQkxFOlxuICAgICAgcmV0dXJuIGRlY29kZVRhYmxlKHR2LmRhdGEpO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTk9ERTpcbiAgICAgIHJldHVybiBkZWNvZGVOb2RlKHR2LmRhdGEpO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRURHRTpcbiAgICAgIHJldHVybiBkZWNvZGVFZGdlKHR2LmRhdGEpO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuUEFUSDpcbiAgICAgIHJldHVybiBkZWNvZGVQYXRoKHR2LmRhdGEpO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRVJST1I6XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3IodHYuZGF0YSk7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHR2LmRhdGE7XG4gIH1cbn1cblxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRGVjb2RlOiBDb21wbGV4IFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIERlY29kZSBhIG5vZGUgZnJvbSBiaW5hcnkgZm9ybWF0LlxuICogRm9ybWF0OiBbaWRMZW46Ml1baWRdW2xhYmVsQ291bnQ6Ml1bbGFiZWxMZW46Ml1bbGFiZWxdLi4uW3Byb3BlcnRpZXNfYmluYXJ5XVxuICovXG5mdW5jdGlvbiBkZWNvZGVOb2RlKGRhdGE6IEJ1ZmZlcik6IEdxbGRiTm9kZSB7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIC8vIERlY29kZSBJRFxuICBjb25zdCBbaWQsIGlkTGVuXSA9IGRlY29kZVN0cmluZyhkYXRhLCBvZmZzZXQpO1xuICBpZiAoaWRMZW4gPT09IDApIHJldHVybiB7IGlkOiAnJywgbGFiZWxzOiBbXSwgcHJvcGVydGllczoge30gfTtcbiAgb2Zmc2V0ICs9IGlkTGVuO1xuXG4gIC8vIERlY29kZSBsYWJlbHNcbiAgaWYgKG9mZnNldCArIDIgPiBkYXRhLmxlbmd0aCkgcmV0dXJuIHsgaWQsIGxhYmVsczogW10sIHByb3BlcnRpZXM6IHt9IH07XG4gIGNvbnN0IGxhYmVsQ291bnQgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICBvZmZzZXQgKz0gMjtcblxuICBjb25zdCBsYWJlbHM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgW2xhYmVsLCBsYWJlbExlbl0gPSBkZWNvZGVTdHJpbmcoZGF0YSwgb2Zmc2V0KTtcbiAgICBpZiAobGFiZWxMZW4gPT09IDApIGJyZWFrO1xuICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICBvZmZzZXQgKz0gbGFiZWxMZW47XG4gIH1cblxuICAvLyBEZWNvZGUgcHJvcGVydGllc1xuICBjb25zdCBbcHJvcGVydGllc10gPSBkZWNvZGVQcm9wZXJ0aWVzQmluYXJ5KGRhdGEsIG9mZnNldCk7XG5cbiAgcmV0dXJuIHsgaWQsIGxhYmVscywgcHJvcGVydGllcyB9O1xufVxuXG4vKipcbiAqIERlY29kZSBhbiBlZGdlIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAqIEZvcm1hdDogW2lkTGVuOjJdW2lkXVtsYWJlbExlbjoyXVtsYWJlbF1bZnJvbUxlbjoyXVtmcm9tXVt0b0xlbjoyXVt0b11bcHJvcGVydGllc19iaW5hcnldXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUVkZ2UoZGF0YTogQnVmZmVyKTogR3FsZGJFZGdlIHtcbiAgbGV0IG9mZnNldCA9IDA7XG5cbiAgY29uc3QgW2lkLCBpZExlbl0gPSBkZWNvZGVTdHJpbmcoZGF0YSwgb2Zmc2V0KTtcbiAgaWYgKGlkTGVuID09PSAwKSByZXR1cm4geyBpZDogJycsIGxhYmVsOiAnJywgZnJvbU5vZGVJZDogJycsIHRvTm9kZUlkOiAnJywgcHJvcGVydGllczoge30gfTtcbiAgb2Zmc2V0ICs9IGlkTGVuO1xuXG4gIGNvbnN0IFtsYWJlbCwgbGFiZWxMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XG4gIGlmIChsYWJlbExlbiA9PT0gMCkgcmV0dXJuIHsgaWQsIGxhYmVsOiAnJywgZnJvbU5vZGVJZDogJycsIHRvTm9kZUlkOiAnJywgcHJvcGVydGllczoge30gfTtcbiAgb2Zmc2V0ICs9IGxhYmVsTGVuO1xuXG4gIGNvbnN0IFtmcm9tTm9kZUlkLCBmcm9tTGVuXSA9IGRlY29kZVN0cmluZyhkYXRhLCBvZmZzZXQpO1xuICBpZiAoZnJvbUxlbiA9PT0gMCkgcmV0dXJuIHsgaWQsIGxhYmVsLCBmcm9tTm9kZUlkOiAnJywgdG9Ob2RlSWQ6ICcnLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBvZmZzZXQgKz0gZnJvbUxlbjtcblxuICBjb25zdCBbdG9Ob2RlSWQsIHRvTGVuXSA9IGRlY29kZVN0cmluZyhkYXRhLCBvZmZzZXQpO1xuICBpZiAodG9MZW4gPT09IDApIHJldHVybiB7IGlkLCBsYWJlbCwgZnJvbU5vZGVJZCwgdG9Ob2RlSWQ6ICcnLCBwcm9wZXJ0aWVzOiB7fSB9O1xuICBvZmZzZXQgKz0gdG9MZW47XG5cbiAgY29uc3QgW3Byb3BlcnRpZXNdID0gZGVjb2RlUHJvcGVydGllc0JpbmFyeShkYXRhLCBvZmZzZXQpO1xuXG4gIHJldHVybiB7IGlkLCBsYWJlbCwgZnJvbU5vZGVJZCwgdG9Ob2RlSWQsIHByb3BlcnRpZXMgfTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBwYXRoIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAqIEZvcm1hdDogW25vZGVDb3VudDoyXVtub2RlTGVuOjRdW25vZGVEYXRhXS4uLltlZGdlQ291bnQ6Ml1bZWRnZUxlbjo0XVtlZGdlRGF0YV0uLi5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlUGF0aChkYXRhOiBCdWZmZXIpOiBHcWxkYlBhdGgge1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICAvLyBEZWNvZGUgbm9kZXNcbiAgaWYgKG9mZnNldCArIDIgPiBkYXRhLmxlbmd0aCkgcmV0dXJuIHsgbm9kZXM6IFtdLCBlZGdlczogW10gfTtcbiAgY29uc3Qgbm9kZUNvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDI7XG5cbiAgY29uc3Qgbm9kZXM6IEdxbGRiTm9kZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZUNvdW50OyBpKyspIHtcbiAgICBpZiAob2Zmc2V0ICsgNCA+IGRhdGEubGVuZ3RoKSBicmVhaztcbiAgICBjb25zdCBub2RlTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcblxuICAgIGlmIChvZmZzZXQgKyBub2RlTGVuID4gZGF0YS5sZW5ndGgpIGJyZWFrO1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIG5vZGVMZW4pO1xuICAgIG5vZGVzLnB1c2goZGVjb2RlTm9kZShub2RlRGF0YSkpO1xuICAgIG9mZnNldCArPSBub2RlTGVuO1xuICB9XG5cbiAgLy8gRGVjb2RlIGVkZ2VzXG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiB7IG5vZGVzLCBlZGdlczogW10gfTtcbiAgY29uc3QgZWRnZUNvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDI7XG5cbiAgY29uc3QgZWRnZXM6IEdxbGRiRWRnZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWRnZUNvdW50OyBpKyspIHtcbiAgICBpZiAob2Zmc2V0ICsgNCA+IGRhdGEubGVuZ3RoKSBicmVhaztcbiAgICBjb25zdCBlZGdlTGVuID0gZGF0YS5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gNDtcblxuICAgIGlmIChvZmZzZXQgKyBlZGdlTGVuID4gZGF0YS5sZW5ndGgpIGJyZWFrO1xuICAgIGNvbnN0IGVkZ2VEYXRhID0gZGF0YS5zbGljZShvZmZzZXQsIG9mZnNldCArIGVkZ2VMZW4pO1xuICAgIGVkZ2VzLnB1c2goZGVjb2RlRWRnZShlZGdlRGF0YSkpO1xuICAgIG9mZnNldCArPSBlZGdlTGVuO1xuICB9XG5cbiAgcmV0dXJuIHsgbm9kZXMsIGVkZ2VzIH07XG59XG5cbi8qKlxuICogRGVjb2RlIGEgbGlzdCBmcm9tIGJpbmFyeSBmb3JtYXQuXG4gKiBGb3JtYXQ6IFtjb3VudDoyIHVpbnQxNkxFXVtUeXBlZFZhbHVlRW50cnldLi4uXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUxpc3QoZGF0YTogQnVmZmVyKTogYW55W10ge1xuICBpZiAoZGF0YS5sZW5ndGggPCAyKSByZXR1cm4gW107XG5cbiAgY29uc3QgY291bnQgPSBkYXRhLnJlYWRVSW50MTZMRSgwKTtcbiAgbGV0IG9mZnNldCA9IDI7XG4gIGNvbnN0IHJlc3VsdDogYW55W10gPSBbXTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBjb25zdCBbdHYsIHR2TGVuXSA9IGRlY29kZVR5cGVkVmFsdWVFbnRyeShkYXRhLCBvZmZzZXQpO1xuICAgIGlmICh0dkxlbiA9PT0gMCkgYnJlYWs7XG4gICAgcmVzdWx0LnB1c2godHlwZWRWYWx1ZVRvSlModHYpKTtcbiAgICBvZmZzZXQgKz0gdHZMZW47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIG1hcCBmcm9tIGJpbmFyeSBmb3JtYXQuXG4gKiBGb3JtYXQ6IFtjb3VudDoyXVtrZXlMZW46Ml1ba2V5XVtUVkVdLi4uXG4gKi9cbmZ1bmN0aW9uIGRlY29kZU1hcChkYXRhOiBCdWZmZXIpOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgW3Jlc3VsdF0gPSBkZWNvZGVQcm9wZXJ0aWVzQmluYXJ5KGRhdGEsIDApO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIHRhYmxlIGZyb20gYmluYXJ5IGZvcm1hdC5cbiAqIEZvcm1hdDogW2NvbENvdW50OjJdW2NvbExlbjoyXVtjb2xdLi4uW3Jvd0NvdW50OjJdW2NlbGxDb3VudDoyXVtUVkVdLi4uXG4gKi9cbmZ1bmN0aW9uIGRlY29kZVRhYmxlKGRhdGE6IEJ1ZmZlcik6IEdxbGRiVGFibGUge1xuICBsZXQgb2Zmc2V0ID0gMDtcblxuICAvLyBEZWNvZGUgY29sdW1uc1xuICBpZiAob2Zmc2V0ICsgMiA+IGRhdGEubGVuZ3RoKSByZXR1cm4geyBjb2x1bW5zOiBbXSwgcm93czogW10gfTtcbiAgY29uc3QgY29sQ291bnQgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICBvZmZzZXQgKz0gMjtcblxuICBjb25zdCBjb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbENvdW50OyBpKyspIHtcbiAgICBjb25zdCBbY29sLCBjb2xMZW5dID0gZGVjb2RlU3RyaW5nKGRhdGEsIG9mZnNldCk7XG4gICAgaWYgKGNvbExlbiA9PT0gMCkgYnJlYWs7XG4gICAgY29sdW1ucy5wdXNoKGNvbCk7XG4gICAgb2Zmc2V0ICs9IGNvbExlbjtcbiAgfVxuXG4gIC8vIERlY29kZSByb3dzXG4gIGlmIChvZmZzZXQgKyAyID4gZGF0YS5sZW5ndGgpIHJldHVybiB7IGNvbHVtbnMsIHJvd3M6IFtdIH07XG4gIGNvbnN0IHJvd0NvdW50ID0gZGF0YS5yZWFkVUludDE2TEUob2Zmc2V0KTtcbiAgb2Zmc2V0ICs9IDI7XG5cbiAgY29uc3Qgcm93czogYW55W11bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHtcbiAgICBpZiAob2Zmc2V0ICsgMiA+IGRhdGEubGVuZ3RoKSBicmVhaztcbiAgICBjb25zdCBjZWxsQ291bnQgPSBkYXRhLnJlYWRVSW50MTZMRShvZmZzZXQpO1xuICAgIG9mZnNldCArPSAyO1xuXG4gICAgY29uc3Qgcm93OiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2VsbENvdW50OyBqKyspIHtcbiAgICAgIGNvbnN0IFt0diwgdHZMZW5dID0gZGVjb2RlVHlwZWRWYWx1ZUVudHJ5KGRhdGEsIG9mZnNldCk7XG4gICAgICBpZiAodHZMZW4gPT09IDApIGJyZWFrO1xuICAgICAgcm93LnB1c2godHlwZWRWYWx1ZVRvSlModHYpKTtcbiAgICAgIG9mZnNldCArPSB0dkxlbjtcbiAgICB9XG4gICAgcm93cy5wdXNoKHJvdyk7XG4gIH1cblxuICByZXR1cm4geyBjb2x1bW5zLCByb3dzIH07XG59XG5cbmZ1bmN0aW9uIGRlY29kZUVycm9yKGRhdGE6IEJ1ZmZlcik6IEdxbGRiRXJyb3Ige1xuICB0cnkge1xuICAgIGNvbnN0IGpzb24gPSBkYXRhLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgIGNvbnN0IGVyckRhdGEgPSBKU09OLnBhcnNlKGpzb24pO1xuICAgIHJldHVybiB7XG4gICAgICBjb2RlOiB0eXBlb2YgZXJyRGF0YS5jb2RlID09PSAnbnVtYmVyJyA/IGVyckRhdGEuY29kZSA6IDAsXG4gICAgICBtZXNzYWdlOiB0eXBlb2YgZXJyRGF0YS5tZXNzYWdlID09PSAnc3RyaW5nJyA/IGVyckRhdGEubWVzc2FnZSA6IGpzb24sXG4gICAgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWYgbm90IHZhbGlkIEpTT04sIHRyZWF0IGFzIHBsYWluIG1lc3NhZ2VcbiAgICByZXR1cm4geyBjb2RlOiAwLCBtZXNzYWdlOiBkYXRhLnRvU3RyaW5nKCd1dGYtOCcpIH07XG4gIH1cbn1cblxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRW5jb2RlOiBDb21wbGV4IFR5cGVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEVuY29kZSBhIGxpc3QgaW4gYmluYXJ5IGZvcm1hdC5cbiAqIEZvcm1hdDogW2NvdW50OjIgdWludDE2TEVdW1R5cGVkVmFsdWVFbnRyeV0uLi5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlTGlzdCh2YWx1ZXM6IGFueVtdKTogVHlwZWRWYWx1ZSB7XG4gIGNvbnN0IHBhcnRzOiBCdWZmZXJbXSA9IFtdO1xuXG4gIC8vIFdyaXRlIGNvdW50XG4gIGNvbnN0IGNvdW50QnVmID0gQnVmZmVyLmFsbG9jKDIpO1xuICBjb3VudEJ1Zi53cml0ZVVJbnQxNkxFKHZhbHVlcy5sZW5ndGgsIDApO1xuICBwYXJ0cy5wdXNoKGNvdW50QnVmKTtcblxuICBmb3IgKGNvbnN0IHYgb2YgdmFsdWVzKSB7XG4gICAgY29uc3QgdHYgPSBjcmVhdGVUeXBlZFZhbHVlKHYpO1xuICAgIHBhcnRzLnB1c2goZW5jb2RlVHlwZWRWYWx1ZUVudHJ5KHR2KSk7XG4gIH1cblxuICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTElTVCwgZGF0YTogQnVmZmVyLmNvbmNhdChwYXJ0cyksIGlzTnVsbDogZmFsc2UgfTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYSBtYXAgaW4gYmluYXJ5IGZvcm1hdC5cbiAqIEZvcm1hdDogW2NvdW50OjJdW2tleUxlbjoyXVtrZXldW1RWRV0uLi5cbiAqL1xuZnVuY3Rpb24gZW5jb2RlTWFwKG06IFJlY29yZDxzdHJpbmcsIGFueT4pOiBUeXBlZFZhbHVlIHtcbiAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhtKTtcblxuICAvLyBXcml0ZSBjb3VudFxuICBjb25zdCBjb3VudEJ1ZiA9IEJ1ZmZlci5hbGxvYygyKTtcbiAgY291bnRCdWYud3JpdGVVSW50MTZMRShlbnRyaWVzLmxlbmd0aCwgMCk7XG4gIHBhcnRzLnB1c2goY291bnRCdWYpO1xuXG4gIGZvciAoY29uc3QgW2ssIHZdIG9mIGVudHJpZXMpIHtcbiAgICAvLyBXcml0ZSBrZXkgKGxlbmd0aC1wcmVmaXhlZClcbiAgICBwYXJ0cy5wdXNoKGVuY29kZVN0cmluZyhrKSk7XG5cbiAgICAvLyBXcml0ZSB2YWx1ZSBhcyBUVkVcbiAgICBjb25zdCB0diA9IGNyZWF0ZVR5cGVkVmFsdWUodik7XG4gICAgcGFydHMucHVzaChlbmNvZGVUeXBlZFZhbHVlRW50cnkodHYpKTtcbiAgfVxuXG4gIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5NQVAsIGRhdGE6IEJ1ZmZlci5jb25jYXQocGFydHMpLCBpc051bGw6IGZhbHNlIH07XG59XG5cbi8qKlxuICogRW5jb2RlIGEgc2V0IGluIGJpbmFyeSBmb3JtYXQgKHNhbWUgYXMgbGlzdCkuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZVNldChzZXQ6IFNldDxhbnk+KTogVHlwZWRWYWx1ZSB7XG4gIGNvbnN0IHZhbHVlcyA9IEFycmF5LmZyb20oc2V0KTtcbiAgY29uc3QgcGFydHM6IEJ1ZmZlcltdID0gW107XG5cbiAgLy8gV3JpdGUgY291bnRcbiAgY29uc3QgY291bnRCdWYgPSBCdWZmZXIuYWxsb2MoMik7XG4gIGNvdW50QnVmLndyaXRlVUludDE2TEUodmFsdWVzLmxlbmd0aCwgMCk7XG4gIHBhcnRzLnB1c2goY291bnRCdWYpO1xuXG4gIGZvciAoY29uc3QgdiBvZiB2YWx1ZXMpIHtcbiAgICBjb25zdCB0diA9IGNyZWF0ZVR5cGVkVmFsdWUodik7XG4gICAgcGFydHMucHVzaChlbmNvZGVUeXBlZFZhbHVlRW50cnkodHYpKTtcbiAgfVxuXG4gIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5TRVQsIGRhdGE6IEJ1ZmZlci5jb25jYXQocGFydHMpLCBpc051bGw6IGZhbHNlIH07XG59XG5cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEZvcm1hdCAmIFBhcnNlOiBUeXBlZFZhbHVlIOKGlCBTdHJpbmdcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKiBQYWQgYSBudW1iZXIgdG8gYSBmaXhlZCB3aWR0aCB3aXRoIGxlYWRpbmcgemVyb3MgKi9cbmZ1bmN0aW9uIHBhZChuOiBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gbi50b1N0cmluZygpLnBhZFN0YXJ0KHdpZHRoLCAnMCcpO1xufVxuXG4vKiogRm9ybWF0IG5hbm9zZWNvbmRzLCB0cmltbWluZyB0cmFpbGluZyB6ZXJvcy4gUmV0dXJucyBlbXB0eSBzdHJpbmcgaWYgemVyby4gKi9cbmZ1bmN0aW9uIGZvcm1hdE5hbm9zKG5hbm9zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobmFub3MgPT09IDApIHJldHVybiAnJztcbiAgY29uc3QgcyA9IG5hbm9zLnRvU3RyaW5nKCkucGFkU3RhcnQoOSwgJzAnKTtcbiAgcmV0dXJuICcuJyArIHMucmVwbGFjZSgvMCskLywgJycpO1xufVxuXG4vKiogRm9ybWF0IGFuIG9mZnNldCBpbiBtaW51dGVzIGFzIFwiK0hIOk1NXCIgb3IgXCItSEg6TU1cIiAqL1xuZnVuY3Rpb24gZm9ybWF0T2Zmc2V0KG9mZnNldE1pbnV0ZXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IHNpZ24gPSBvZmZzZXRNaW51dGVzIDwgMCA/ICctJyA6ICcrJztcbiAgY29uc3QgYWJzID0gTWF0aC5hYnMob2Zmc2V0TWludXRlcyk7XG4gIGNvbnN0IGggPSBNYXRoLmZsb29yKGFicyAvIDYwKTtcbiAgY29uc3QgbSA9IGFicyAlIDYwO1xuICByZXR1cm4gYCR7c2lnbn0ke3BhZChoLCAyKX06JHtwYWQobSwgMil9YDtcbn1cblxuLyoqIFNlcmlhbGl6ZSBhIFR5cGVkVmFsdWUgdG8gaXRzIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh0djogVHlwZWRWYWx1ZSk6IHN0cmluZyB7XG4gIGlmICh0di5pc051bGwgfHwgdHYudHlwZSA9PT0gUHJvcGVydHlUeXBlLk5VTEwpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzd2l0Y2ggKHR2LnR5cGUpIHtcbiAgICBjYXNlIFByb3BlcnR5VHlwZS5CT09MOlxuICAgICAgcmV0dXJuIHR2LmRhdGEubGVuZ3RoID49IDEgJiYgdHYuZGF0YS5yZWFkVUludDgoMCkgIT09IDAgPyAndHJ1ZScgOiAnZmFsc2UnO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuSU5UMzI6XG4gICAgICByZXR1cm4gdHYuZGF0YS5sZW5ndGggPj0gNCA/IHR2LmRhdGEucmVhZEludDMyTEUoMCkudG9TdHJpbmcoKSA6ICcwJztcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQzMjpcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkVUludDMyTEUoMCkudG9TdHJpbmcoKSA6ICcwJztcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDY0OiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCA4KSByZXR1cm4gJzAnO1xuICAgICAgcmV0dXJuIHR2LmRhdGEucmVhZEJpZ0ludDY0TEUoMCkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5VSU5UNjQ6IHtcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDgpIHJldHVybiAnMCc7XG4gICAgICByZXR1cm4gdHYuZGF0YS5yZWFkQmlnVUludDY0TEUoMCkudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5GTE9BVDpcbiAgICAgIHJldHVybiB0di5kYXRhLmxlbmd0aCA+PSA0ID8gdHYuZGF0YS5yZWFkRmxvYXRMRSgwKS50b1N0cmluZygpIDogJzAnO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuRE9VQkxFOlxuICAgICAgcmV0dXJuIHR2LmRhdGEubGVuZ3RoID49IDggPyB0di5kYXRhLnJlYWREb3VibGVMRSgwKS50b1N0cmluZygpIDogJzAnO1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuU1RSSU5HOlxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlRFWFQ6XG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRFQ0lNQUw6XG4gICAgICByZXR1cm4gdHYuZGF0YS50b1N0cmluZygndXRmLTgnKTtcblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEU6IHtcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDQpIHJldHVybiAnMDAwMC0wMC0wMCc7XG4gICAgICBjb25zdCB5ID0gdHYuZGF0YS5yZWFkVUludDE2TEUoMCk7XG4gICAgICBjb25zdCBtID0gdHYuZGF0YS5yZWFkVUludDgoMik7XG4gICAgICBjb25zdCBkID0gdHYuZGF0YS5yZWFkVUludDgoMyk7XG4gICAgICByZXR1cm4gYCR7cGFkKHksIDQpfS0ke3BhZChtLCAyKX0tJHtwYWQoZCwgMil9YDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5MT0NBTF9USU1FOiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCA4KSByZXR1cm4gJzAwOjAwOjAwJztcbiAgICAgIGNvbnN0IGggPSB0di5kYXRhLnJlYWRVSW50OCgwKTtcbiAgICAgIGNvbnN0IG0gPSB0di5kYXRhLnJlYWRVSW50OCgxKTtcbiAgICAgIGNvbnN0IHMgPSB0di5kYXRhLnJlYWRVSW50OCgyKTtcbiAgICAgIGNvbnN0IG5zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoNCk7XG4gICAgICByZXR1cm4gYCR7cGFkKGgsIDIpfToke3BhZChtLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9YDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5aT05FRF9USU1FOiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCAxMCkgcmV0dXJuICcwMDowMDowMCswMDowMCc7XG4gICAgICBjb25zdCBoID0gdHYuZGF0YS5yZWFkVUludDgoMCk7XG4gICAgICBjb25zdCBtID0gdHYuZGF0YS5yZWFkVUludDgoMSk7XG4gICAgICBjb25zdCBzID0gdHYuZGF0YS5yZWFkVUludDgoMik7XG4gICAgICBjb25zdCBucyA9IHR2LmRhdGEucmVhZFVJbnQzMkxFKDQpO1xuICAgICAgY29uc3Qgb2ZmID0gdHYuZGF0YS5yZWFkSW50MTZMRSg4KTtcbiAgICAgIHJldHVybiBgJHtwYWQoaCwgMil9OiR7cGFkKG0sIDIpfToke3BhZChzLCAyKX0ke2Zvcm1hdE5hbm9zKG5zKX0ke2Zvcm1hdE9mZnNldChvZmYpfWA7XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTE9DQUxfREFURVRJTUU6XG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFURVRJTUU6IHtcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDExKSByZXR1cm4gJzAwMDAtMDAtMDAgMDA6MDA6MDAnO1xuICAgICAgY29uc3QgeSA9IHR2LmRhdGEucmVhZFVJbnQxNkxFKDApO1xuICAgICAgY29uc3QgbW8gPSB0di5kYXRhLnJlYWRVSW50OCgyKTtcbiAgICAgIGNvbnN0IGQgPSB0di5kYXRhLnJlYWRVSW50OCgzKTtcbiAgICAgIGNvbnN0IGggPSB0di5kYXRhLnJlYWRVSW50OCg0KTtcbiAgICAgIGNvbnN0IG1pID0gdHYuZGF0YS5yZWFkVUludDgoNSk7XG4gICAgICBjb25zdCBzID0gdHYuZGF0YS5yZWFkVUludDgoNik7XG4gICAgICBjb25zdCBucyA9IHR2LmRhdGEucmVhZFVJbnQzMkxFKDcpO1xuICAgICAgcmV0dXJuIGAke3BhZCh5LCA0KX0tJHtwYWQobW8sIDIpfS0ke3BhZChkLCAyKX0gJHtwYWQoaCwgMil9OiR7cGFkKG1pLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9YDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5aT05FRF9EQVRFVElNRToge1xuICAgICAgaWYgKHR2LmRhdGEubGVuZ3RoIDwgMTMpIHJldHVybiAnMDAwMC0wMC0wMCAwMDowMDowMCswMDowMCc7XG4gICAgICBjb25zdCB5ID0gdHYuZGF0YS5yZWFkVUludDE2TEUoMCk7XG4gICAgICBjb25zdCBtbyA9IHR2LmRhdGEucmVhZFVJbnQ4KDIpO1xuICAgICAgY29uc3QgZCA9IHR2LmRhdGEucmVhZFVJbnQ4KDMpO1xuICAgICAgY29uc3QgaCA9IHR2LmRhdGEucmVhZFVJbnQ4KDQpO1xuICAgICAgY29uc3QgbWkgPSB0di5kYXRhLnJlYWRVSW50OCg1KTtcbiAgICAgIGNvbnN0IHMgPSB0di5kYXRhLnJlYWRVSW50OCg2KTtcbiAgICAgIGNvbnN0IG5zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoNyk7XG4gICAgICBjb25zdCBvZmYgPSB0di5kYXRhLnJlYWRJbnQxNkxFKDExKTtcbiAgICAgIHJldHVybiBgJHtwYWQoeSwgNCl9LSR7cGFkKG1vLCAyKX0tJHtwYWQoZCwgMil9ICR7cGFkKGgsIDIpfToke3BhZChtaSwgMil9OiR7cGFkKHMsIDIpfSR7Zm9ybWF0TmFub3MobnMpfSR7Zm9ybWF0T2Zmc2V0KG9mZil9YDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5USU1FU1RBTVA6IHtcbiAgICAgIGlmICh0di5kYXRhLmxlbmd0aCA8IDEyKSByZXR1cm4gJzAwMDAtMDAtMDAgMDA6MDA6MDAnO1xuICAgICAgY29uc3Qgc2VjcyA9IE51bWJlcih0di5kYXRhLnJlYWRCaWdJbnQ2NExFKDApKTtcbiAgICAgIGNvbnN0IG5zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoOCk7XG4gICAgICBjb25zdCBkdCA9IG5ldyBEYXRlKHNlY3MgKiAxMDAwICsgTWF0aC5mbG9vcihucyAvIDFfMDAwXzAwMCkpO1xuICAgICAgY29uc3QgeSA9IGR0LmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgICBjb25zdCBtbyA9IGR0LmdldFVUQ01vbnRoKCkgKyAxO1xuICAgICAgY29uc3QgZCA9IGR0LmdldFVUQ0RhdGUoKTtcbiAgICAgIGNvbnN0IGggPSBkdC5nZXRVVENIb3VycygpO1xuICAgICAgY29uc3QgbWkgPSBkdC5nZXRVVENNaW51dGVzKCk7XG4gICAgICBjb25zdCBzID0gZHQuZ2V0VVRDU2Vjb25kcygpO1xuICAgICAgcmV0dXJuIGAke3BhZCh5LCA0KX0tJHtwYWQobW8sIDIpfS0ke3BhZChkLCAyKX0gJHtwYWQoaCwgMil9OiR7cGFkKG1pLCAyKX06JHtwYWQocywgMil9JHtmb3JtYXROYW5vcyhucyl9YDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRIOiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCA0KSByZXR1cm4gJ1AwTSc7XG4gICAgICBjb25zdCB0b3RhbE1vbnRocyA9IHR2LmRhdGEucmVhZEludDMyTEUoMCk7XG4gICAgICBpZiAodG90YWxNb250aHMgPT09IDApIHJldHVybiAnUDBNJztcbiAgICAgIGNvbnN0IG5lZ2F0aXZlID0gdG90YWxNb250aHMgPCAwO1xuICAgICAgY29uc3QgYWJzID0gTWF0aC5hYnModG90YWxNb250aHMpO1xuICAgICAgY29uc3QgeWVhcnMgPSBNYXRoLmZsb29yKGFicyAvIDEyKTtcbiAgICAgIGNvbnN0IG1vbnRocyA9IGFicyAlIDEyO1xuICAgICAgbGV0IHJlc3VsdCA9IG5lZ2F0aXZlID8gJy1QJyA6ICdQJztcbiAgICAgIGlmICh5ZWFycyA+IDApIHJlc3VsdCArPSBgJHt5ZWFyc31ZYDtcbiAgICAgIGlmIChtb250aHMgPiAwKSByZXN1bHQgKz0gYCR7bW9udGhzfU1gO1xuICAgICAgLy8gSWYgb25seSB5ZWFycyBhbmQgbm8gbW9udGhzLCB0aGF0J3MgZmluZSAoZS5nLiBcIlAyWVwiKVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05EOiB7XG4gICAgICBpZiAodHYuZGF0YS5sZW5ndGggPCAxMikgcmV0dXJuICdQVDBTJztcbiAgICAgIGNvbnN0IHRvdGFsU2VjID0gTnVtYmVyKHR2LmRhdGEucmVhZEJpZ1VJbnQ2NExFKDApKTtcbiAgICAgIGNvbnN0IG5hbm9zID0gdHYuZGF0YS5yZWFkVUludDMyTEUoOCk7XG4gICAgICBpZiAodG90YWxTZWMgPT09IDAgJiYgbmFub3MgPT09IDApIHJldHVybiAnUFQwUyc7XG5cbiAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRvdGFsU2VjIC8gODY0MDApO1xuICAgICAgY29uc3QgcmVtID0gdG90YWxTZWMgJSA4NjQwMDtcbiAgICAgIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcihyZW0gLyAzNjAwKTtcbiAgICAgIGNvbnN0IHJlbTIgPSByZW0gJSAzNjAwO1xuICAgICAgY29uc3QgbWlucyA9IE1hdGguZmxvb3IocmVtMiAvIDYwKTtcbiAgICAgIGNvbnN0IHNlY3MgPSByZW0yICUgNjA7XG5cbiAgICAgIGxldCByZXN1bHQgPSAnUCc7XG4gICAgICBpZiAoZGF5cyA+IDApIHJlc3VsdCArPSBgJHtkYXlzfURgO1xuICAgICAgaWYgKGhvdXJzID4gMCB8fCBtaW5zID4gMCB8fCBzZWNzID4gMCB8fCBuYW5vcyA+IDApIHtcbiAgICAgICAgcmVzdWx0ICs9ICdUJztcbiAgICAgICAgaWYgKGhvdXJzID4gMCkgcmVzdWx0ICs9IGAke2hvdXJzfUhgO1xuICAgICAgICBpZiAobWlucyA+IDApIHJlc3VsdCArPSBgJHttaW5zfU1gO1xuICAgICAgICBpZiAoc2VjcyA+IDAgfHwgbmFub3MgPiAwKSB7XG4gICAgICAgICAgaWYgKG5hbm9zID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZnJhY1N0ciA9IG5hbm9zLnRvU3RyaW5nKCkucGFkU3RhcnQoOSwgJzAnKS5yZXBsYWNlKC8wKyQvLCAnJyk7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCR7c2Vjc30uJHtmcmFjU3RyfVNgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgKz0gYCR7c2Vjc31TYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB0di5kYXRhLnRvU3RyaW5nKCd1dGYtOCcpO1xuICB9XG59XG5cblxuLyoqIFBhcnNlIGFuIG9mZnNldCBzdHJpbmcgbGlrZSBcIiswNTozMFwiIG9yIFwiLTA4OjAwXCIgaW50byBtaW51dGVzICovXG5mdW5jdGlvbiBwYXJzZU9mZnNldChzOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBzaWduID0gc1swXSA9PT0gJy0nID8gLTEgOiAxO1xuICBjb25zdCBwYXJ0cyA9IHMuc3Vic3RyaW5nKDEpLnNwbGl0KCc6Jyk7XG4gIHJldHVybiBzaWduICogKHBhcnNlSW50KHBhcnRzWzBdLCAxMCkgKiA2MCArIHBhcnNlSW50KHBhcnRzWzFdLCAxMCkpO1xufVxuXG4vKiogUGFyc2UgYSBzdHJpbmcgaW50byBhIFR5cGVkVmFsdWUgZm9yIHRoZSBnaXZlbiB0YXJnZXQgdHlwZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcoczogc3RyaW5nLCB0YXJnZXRUeXBlOiBQcm9wZXJ0eVR5cGUpOiBUeXBlZFZhbHVlIHtcbiAgaWYgKHMgPT09ICcnKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogdGFyZ2V0VHlwZSwgZGF0YTogQnVmZmVyLmFsbG9jKDApLCBpc051bGw6IHRydWUgfTtcbiAgfVxuXG4gIHN3aXRjaCAodGFyZ2V0VHlwZSkge1xuICAgIGNhc2UgUHJvcGVydHlUeXBlLkJPT0w6IHtcbiAgICAgIGNvbnN0IHZhbCA9IHMudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OCh2YWwgPyAxIDogMCwgMCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuQk9PTCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDMyOiB7XG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgZGF0YS53cml0ZUludDMyTEUocGFyc2VJbnQocywgMTApLCAwKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5JTlQzMiwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQzMjoge1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShwYXJzZUludChzLCAxMCkgPj4+IDAsIDApO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlVJTlQzMiwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLklOVDY0OiB7XG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDgpO1xuICAgICAgZGF0YS53cml0ZUJpZ0ludDY0TEUoQmlnSW50KHMpLCAwKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5JTlQ2NCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlVJTlQ2NDoge1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAgIGRhdGEud3JpdGVCaWdVSW50NjRMRShCaWdJbnQocyksIDApO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlVJTlQ2NCwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkZMT0FUOiB7XG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDQpO1xuICAgICAgZGF0YS53cml0ZUZsb2F0TEUocGFyc2VGbG9hdChzKSwgMCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuRkxPQVQsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgICB9XG5cbiAgICBjYXNlIFByb3BlcnR5VHlwZS5ET1VCTEU6IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoOCk7XG4gICAgICBkYXRhLndyaXRlRG91YmxlTEUocGFyc2VGbG9hdChzKSwgMCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuRE9VQkxFLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuU1RSSU5HOlxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlRFWFQ6XG4gICAgICByZXR1cm4geyB0eXBlOiB0YXJnZXRUeXBlLCBkYXRhOiBCdWZmZXIuZnJvbShzLCAndXRmLTgnKSwgaXNOdWxsOiBmYWxzZSB9O1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREVDSU1BTDpcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5ERUNJTUFMLCBkYXRhOiBCdWZmZXIuZnJvbShzLCAndXRmLTgnKSwgaXNOdWxsOiBmYWxzZSB9O1xuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFURToge1xuICAgICAgLy8gXCJ5eXl5LU1NLWRkXCJcbiAgICAgIGNvbnN0IHBhcnRzID0gcy5zcGxpdCgnLScpO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAgIGRhdGEud3JpdGVVSW50MTZMRShwYXJzZUludChwYXJ0c1swXSwgMTApLCAwKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChwYXJ0c1sxXSwgMTApLCAyKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChwYXJ0c1syXSwgMTApLCAzKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVRFLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRToge1xuICAgICAgLy8gXCJISDptbTpzc1subm5ubm5ubm5uXVwiIOKAlCBzdHJpcCBhbnkgdHJhaWxpbmcgb2Zmc2V0IG9yIFosIGtlZXAgbG9jYWwgdGltZSBvbmx5XG4gICAgICBjb25zdCBjbGVhbmVkID0gcmVtb3ZlT2Zmc2V0KHMpO1xuICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKGNsZWFuZWQpO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg4KTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChob3VyLCAwKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChtaW51dGUsIDEpO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KHNlY29uZCwgMik7XG4gICAgICBkYXRhLndyaXRlVUludDMyTEUobmFub3NlY29uZCwgNCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuTE9DQUxfVElNRSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLlpPTkVEX1RJTUU6IHtcbiAgICAgIC8vIFwiSEg6bW06c3NbLm5dK0hIOk1NXCJcbiAgICAgIGNvbnN0IHsgdGltZVBhcnQsIG9mZnNldFBhcnQgfSA9IHNwbGl0VGltZUFuZE9mZnNldChzKTtcbiAgICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG5hbm9zZWNvbmQgfSA9IHBhcnNlVGltZVN0cmluZyh0aW1lUGFydCk7XG4gICAgICBjb25zdCBvZmZNaW4gPSBwYXJzZU9mZnNldChvZmZzZXRQYXJ0KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTApO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KGhvdXIsIDApO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KG1pbnV0ZSwgMSk7XG4gICAgICBkYXRhLndyaXRlVUludDgoc2Vjb25kLCAyKTtcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vc2Vjb25kLCA0KTtcbiAgICAgIGRhdGEud3JpdGVJbnQxNkxFKG9mZk1pbiwgOCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuWk9ORURfVElNRSwgZGF0YSwgaXNOdWxsOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkxPQ0FMX0RBVEVUSU1FOlxuICAgIGNhc2UgUHJvcGVydHlUeXBlLkRBVEVUSU1FOiB7XG4gICAgICAvLyBcInl5eXktTU0tZGQgSEg6bW06c3NbLm5dXCIg4oCUIHN0cmlwIGFueSB0cmFpbGluZyBvZmZzZXQgb3IgWiwga2VlcCBsb2NhbCB0aW1lIG9ubHlcbiAgICAgIC8vIE5vcm1hbGl6ZSBUIHNlcGFyYXRvciB0byBzcGFjZVxuICAgICAgY29uc3QgY2xlYW5lZCA9IHJlbW92ZU9mZnNldChzLnJlcGxhY2UoJ1QnLCAnICcpKTtcbiAgICAgIGNvbnN0IHNwYWNlSWR4ID0gY2xlYW5lZC5pbmRleE9mKCcgJyk7XG4gICAgICBjb25zdCBkYXRlUGFydCA9IGNsZWFuZWQuc3Vic3RyaW5nKDAsIHNwYWNlSWR4KTtcbiAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gY2xlYW5lZC5zdWJzdHJpbmcoc3BhY2VJZHggKyAxKTtcbiAgICAgIGNvbnN0IGRwID0gZGF0ZVBhcnQuc3BsaXQoJy0nKTtcbiAgICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG5hbm9zZWNvbmQgfSA9IHBhcnNlVGltZVN0cmluZyh0aW1lUGFydCk7XG4gICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDExKTtcbiAgICAgIGRhdGEud3JpdGVVSW50MTZMRShwYXJzZUludChkcFswXSwgMTApLCAwKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChkcFsxXSwgMTApLCAyKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChwYXJzZUludChkcFsyXSwgMTApLCAzKTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChob3VyLCA0KTtcbiAgICAgIGRhdGEud3JpdGVVSW50OChtaW51dGUsIDUpO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KHNlY29uZCwgNik7XG4gICAgICBkYXRhLndyaXRlVUludDMyTEUobmFub3NlY29uZCwgNyk7XG4gICAgICByZXR1cm4geyB0eXBlOiB0YXJnZXRUeXBlLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuWk9ORURfREFURVRJTUU6IHtcbiAgICAgIC8vIFwieXl5eS1NTS1kZCBISDptbTpzc1subl0rSEg6TU1cIiDigJQgYWxzbyBzdXBwb3J0cyBUIHNlcGFyYXRvciwgWiBzdWZmaXgsIHNwYWNlLXNlcGFyYXRlZCBvZmZzZXRcbiAgICAgIGNvbnN0IG5vcm0gPSBub3JtYWxpemVPZmZzZXQocy5yZXBsYWNlKCdUJywgJyAnKSk7XG4gICAgICBjb25zdCBzcGFjZUlkeCA9IG5vcm0uaW5kZXhPZignICcpO1xuICAgICAgY29uc3QgZGF0ZVBhcnQgPSBub3JtLnN1YnN0cmluZygwLCBzcGFjZUlkeCk7XG4gICAgICBjb25zdCByZXN0ID0gbm9ybS5zdWJzdHJpbmcoc3BhY2VJZHggKyAxKTtcbiAgICAgIGNvbnN0IHsgdGltZVBhcnQsIG9mZnNldFBhcnQgfSA9IHNwbGl0VGltZUFuZE9mZnNldChyZXN0KTtcbiAgICAgIGNvbnN0IGRwID0gZGF0ZVBhcnQuc3BsaXQoJy0nKTtcbiAgICAgIGNvbnN0IHsgaG91ciwgbWludXRlLCBzZWNvbmQsIG5hbm9zZWNvbmQgfSA9IHBhcnNlVGltZVN0cmluZyh0aW1lUGFydCk7XG4gICAgICBjb25zdCBvZmZNaW4gPSBwYXJzZU9mZnNldChvZmZzZXRQYXJ0KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTMpO1xuICAgICAgZGF0YS53cml0ZVVJbnQxNkxFKHBhcnNlSW50KGRwWzBdLCAxMCksIDApO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KHBhcnNlSW50KGRwWzFdLCAxMCksIDIpO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KHBhcnNlSW50KGRwWzJdLCAxMCksIDMpO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KGhvdXIsIDQpO1xuICAgICAgZGF0YS53cml0ZVVJbnQ4KG1pbnV0ZSwgNSk7XG4gICAgICBkYXRhLndyaXRlVUludDgoc2Vjb25kLCA2KTtcbiAgICAgIGRhdGEud3JpdGVVSW50MzJMRShuYW5vc2Vjb25kLCA3KTtcbiAgICAgIGRhdGEud3JpdGVJbnQxNkxFKG9mZk1pbiwgMTEpO1xuICAgICAgcmV0dXJuIHsgdHlwZTogUHJvcGVydHlUeXBlLlpPTkVEX0RBVEVUSU1FLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QOiB7XG4gICAgICAvLyBTdXBwb3J0IGVwb2NoIHNlY29uZHMgbGlrZSBcIjE3MTUxNjk2MDBcIiBvciBcInl5eXktTU0tZGQgSEg6bW06c3NbLm5dXCJcbiAgICAgIGlmICgvXlxcZCskLy50ZXN0KHMpKSB7XG4gICAgICAgIC8vIEVwb2NoIHNlY29uZHNcbiAgICAgICAgY29uc3QgZXBvY2ggPSBwYXJzZUludChzLCAxMCk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMTIpO1xuICAgICAgICBkYXRhLndyaXRlQmlnSW50NjRMRShCaWdJbnQoZXBvY2gpLCAwKTtcbiAgICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKDAsIDgpO1xuICAgICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgICB9XG4gICAgICAvLyBcInl5eXktTU0tZGQgSEg6bW06c3NbLm5dXCIgb3IgXCJ5eXl5LU1NLWRkVEhIOm1tOnNzWy5uXVsrLV1ISDpNTVwiIC8gXCJbKy1dSEhNTVwiIC8gXCJaXCJcbiAgICAgIC8vIEFsc28gc3VwcG9ydHMgc3BhY2Utc2VwYXJhdGVkIG9mZnNldDogXCIyMDI0LTA2LTE1IDE0OjMwOjAwICswODowMFwiXG4gICAgICAvLyBOb3JtYWxpemUgVCBzZXBhcmF0b3IgdG8gc3BhY2VcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBzLnJlcGxhY2UoJ1QnLCAnICcpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgWiBzdWZmaXgg4oaSIHRyZWF0IGFzICswMDowMFxuICAgICAgY29uc3QgaGFzWiA9IG5vcm1hbGl6ZWQuZW5kc1dpdGgoJ1onKSB8fCBub3JtYWxpemVkLmVuZHNXaXRoKCd6Jyk7XG5cbiAgICAgIC8vIE5vcm1hbGl6ZSBzcGFjZS1zZXBhcmF0ZWQgb2Zmc2V0czogXCIgKzA4OjAwXCIg4oaSIFwiKzA4OjAwXCJcbiAgICAgIC8vIEFsc28gbm9ybWFsaXplIFogdG8gKzAwOjAwXG4gICAgICBsZXQgcHJvY2Vzc2VkID0gbm9ybWFsaXplZDtcbiAgICAgIGlmIChoYXNaKSB7XG4gICAgICAgIHByb2Nlc3NlZCA9IG5vcm1hbGl6ZWQuc2xpY2UoMCwgLTEpICsgJyswMDowMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDb2xsYXBzZSBzcGFjZSBiZWZvcmUgb2Zmc2V0IChvbmx5IGluIGxhc3QgfjEwIGNoYXJzIHRvIGF2b2lkIGRhdGUgaHlwaGVucylcbiAgICAgICAgY29uc3Qgc3BhY2VPZmZNYXRjaCA9IHByb2Nlc3NlZC5tYXRjaCgvXiguKz8pXFxzKyhbKy1dXFxkezJ9Oj9cXGR7Mn0pJC8pO1xuICAgICAgICBpZiAoc3BhY2VPZmZNYXRjaCkge1xuICAgICAgICAgIHByb2Nlc3NlZCA9IHNwYWNlT2ZmTWF0Y2hbMV0gKyBzcGFjZU9mZk1hdGNoWzJdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlcElkeCA9IHByb2Nlc3NlZC5pbmRleE9mKCcgJyk7XG4gICAgICBjb25zdCBkYXRlUGFydCA9IHByb2Nlc3NlZC5zdWJzdHJpbmcoMCwgc2VwSWR4KTtcbiAgICAgIGNvbnN0IHJlc3QgPSBwcm9jZXNzZWQuc3Vic3RyaW5nKHNlcElkeCArIDEpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgdGltZXpvbmUgb2Zmc2V0OiArSEg6TU0sIC1ISDpNTSwgK0hITU0sIC1ISE1NIGF0IHRoZSBlbmRcbiAgICAgIGNvbnN0IG9mZnNldE1hdGNoID0gcmVzdC5tYXRjaCgvKFsrLV0pKFxcZHsyfSk6PyhcXGR7Mn0pJC8pO1xuICAgICAgaWYgKG9mZnNldE1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHRpbWVQYXJ0ID0gcmVzdC5zdWJzdHJpbmcoMCwgb2Zmc2V0TWF0Y2guaW5kZXghKTtcbiAgICAgICAgY29uc3Qgc2lnbiA9IG9mZnNldE1hdGNoWzFdID09PSAnLScgPyAtMSA6IDE7XG4gICAgICAgIGNvbnN0IG9mZkhvdXJzID0gcGFyc2VJbnQob2Zmc2V0TWF0Y2hbMl0sIDEwKTtcbiAgICAgICAgY29uc3Qgb2ZmTWlucyA9IHBhcnNlSW50KG9mZnNldE1hdGNoWzNdLCAxMCk7XG4gICAgICAgIGNvbnN0IG9mZnNldFRvdGFsTWludXRlcyA9IHNpZ24gKiAob2ZmSG91cnMgKiA2MCArIG9mZk1pbnMpO1xuXG4gICAgICAgIGNvbnN0IGRwID0gZGF0ZVBhcnQuc3BsaXQoJy0nKTtcbiAgICAgICAgY29uc3QgeyBob3VyLCBtaW51dGUsIHNlY29uZCwgbmFub3NlY29uZCB9ID0gcGFyc2VUaW1lU3RyaW5nKHRpbWVQYXJ0KTtcblxuICAgICAgICAvLyBDb252ZXJ0IHRvIFVUQyBieSBzdWJ0cmFjdGluZyB0aGUgb2Zmc2V0XG4gICAgICAgIGNvbnN0IGQgPSBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgICBwYXJzZUludChkcFswXSwgMTApLCBwYXJzZUludChkcFsxXSwgMTApIC0gMSwgcGFyc2VJbnQoZHBbMl0sIDEwKSxcbiAgICAgICAgICBob3VyLCBtaW51dGUgLSBvZmZzZXRUb3RhbE1pbnV0ZXMsIHNlY29uZFxuICAgICAgICApKTtcblxuICAgICAgICBjb25zdCB1bml4U2VjcyA9IEJpZ0ludChNYXRoLmZsb29yKGQuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICAgICAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDEyKTtcbiAgICAgICAgZGF0YS53cml0ZUJpZ0ludDY0TEUodW5peFNlY3MsIDApO1xuICAgICAgICBkYXRhLndyaXRlVUludDMyTEUobmFub3NlY29uZCwgOCk7XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5USU1FU1RBTVAsIGRhdGEsIGlzTnVsbDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgLy8gTm8gb2Zmc2V0IOKAlCB0cmVhdCBhcyBsb2NhbCBkYXRldGltZSAoY29udmVydCB0byBVVEMgdXNpbmcgRGF0ZS5VVEMpXG4gICAgICBjb25zdCBkcCA9IGRhdGVQYXJ0LnNwbGl0KCctJyk7XG4gICAgICBjb25zdCB7IGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBuYW5vc2Vjb25kIH0gPSBwYXJzZVRpbWVTdHJpbmcocmVzdCk7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUoRGF0ZS5VVEMoXG4gICAgICAgIHBhcnNlSW50KGRwWzBdLCAxMCksIHBhcnNlSW50KGRwWzFdLCAxMCkgLSAxLCBwYXJzZUludChkcFsyXSwgMTApLFxuICAgICAgICBob3VyLCBtaW51dGUsIHNlY29uZFxuICAgICAgKSk7XG4gICAgICBjb25zdCB1bml4U2VjcyA9IEJpZ0ludChNYXRoLmZsb29yKGQuZ2V0VGltZSgpIC8gMTAwMCkpO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgICBkYXRhLndyaXRlQmlnSW50NjRMRSh1bml4U2VjcywgMCk7XG4gICAgICBkYXRhLndyaXRlVUludDMyTEUobmFub3NlY29uZCwgOCk7XG4gICAgICByZXR1cm4geyB0eXBlOiBQcm9wZXJ0eVR5cGUuVElNRVNUQU1QLCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuWUVBUl9UT19NT05USDoge1xuICAgICAgLy8gSVNPLTg2MDE6IFwiUDJZNU1cIiwgXCJQME1cIiwgXCItUDFZNU1cIlxuICAgICAgY29uc3QgbmVnYXRpdmUgPSBzLnN0YXJ0c1dpdGgoJy0nKTtcbiAgICAgIGNvbnN0IGJvZHkgPSBuZWdhdGl2ZSA/IHMuc3Vic3RyaW5nKDIpIDogcy5zdWJzdHJpbmcoMSk7IC8vIHNraXAgUCBvciAtUFxuICAgICAgbGV0IHllYXJzID0gMDtcbiAgICAgIGxldCBtb250aHMgPSAwO1xuICAgICAgY29uc3QgeW0gPSBib2R5Lm1hdGNoKC8oXFxkKylZLyk7XG4gICAgICBpZiAoeW0pIHllYXJzID0gcGFyc2VJbnQoeW1bMV0sIDEwKTtcbiAgICAgIGNvbnN0IG1tID0gYm9keS5tYXRjaCgvKFxcZCspTS8pO1xuICAgICAgaWYgKG1tKSBtb250aHMgPSBwYXJzZUludChtbVsxXSwgMTApO1xuICAgICAgY29uc3QgdG90YWwgPSAoeWVhcnMgKiAxMiArIG1vbnRocykgKiAobmVnYXRpdmUgPyAtMSA6IDEpO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyg0KTtcbiAgICAgIGRhdGEud3JpdGVJbnQzMkxFKHRvdGFsLCAwKTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5ZRUFSX1RPX01PTlRILCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgY2FzZSBQcm9wZXJ0eVR5cGUuREFZX1RPX1NFQ09ORDoge1xuICAgICAgLy8gSVNPLTg2MDE6IFwiUDNEVDRIXCIsIFwiUFQwU1wiLCBcIlAxRFQySDNNNC4xMlNcIlxuICAgICAgY29uc3QgYm9keSA9IHMuc3Vic3RyaW5nKDEpOyAvLyBza2lwIFBcbiAgICAgIGxldCBkYXlzID0gMDtcbiAgICAgIGxldCBob3VycyA9IDA7XG4gICAgICBsZXQgbWlucyA9IDA7XG4gICAgICBsZXQgc2VjcyA9IDA7XG4gICAgICBsZXQgbmFub3MgPSAwO1xuXG4gICAgICBjb25zdCB0SWR4ID0gYm9keS5pbmRleE9mKCdUJyk7XG4gICAgICBjb25zdCBkYXRlUGFydDIgPSB0SWR4ID49IDAgPyBib2R5LnN1YnN0cmluZygwLCB0SWR4KSA6IGJvZHk7XG4gICAgICBjb25zdCB0aW1lUGFydDIgPSB0SWR4ID49IDAgPyBib2R5LnN1YnN0cmluZyh0SWR4ICsgMSkgOiAnJztcblxuICAgICAgY29uc3QgZG0gPSBkYXRlUGFydDIubWF0Y2goLyhcXGQrKUQvKTtcbiAgICAgIGlmIChkbSkgZGF5cyA9IHBhcnNlSW50KGRtWzFdLCAxMCk7XG5cbiAgICAgIGlmICh0aW1lUGFydDIpIHtcbiAgICAgICAgY29uc3QgaG0gPSB0aW1lUGFydDIubWF0Y2goLyhcXGQrKUgvKTtcbiAgICAgICAgaWYgKGhtKSBob3VycyA9IHBhcnNlSW50KGhtWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IG1pbm0gPSB0aW1lUGFydDIubWF0Y2goLyhcXGQrKU0vKTtcbiAgICAgICAgaWYgKG1pbm0pIG1pbnMgPSBwYXJzZUludChtaW5tWzFdLCAxMCk7XG4gICAgICAgIGNvbnN0IHNtID0gdGltZVBhcnQyLm1hdGNoKC8oW1xcZC5dKylTLyk7XG4gICAgICAgIGlmIChzbSkge1xuICAgICAgICAgIGNvbnN0IHNlY1N0ciA9IHNtWzFdO1xuICAgICAgICAgIGNvbnN0IGRvdElkeCA9IHNlY1N0ci5pbmRleE9mKCcuJyk7XG4gICAgICAgICAgaWYgKGRvdElkeCA+PSAwKSB7XG4gICAgICAgICAgICBzZWNzID0gcGFyc2VJbnQoc2VjU3RyLnN1YnN0cmluZygwLCBkb3RJZHgpLCAxMCk7XG4gICAgICAgICAgICBjb25zdCBmcmFjID0gc2VjU3RyLnN1YnN0cmluZyhkb3RJZHggKyAxKTtcbiAgICAgICAgICAgIG5hbm9zID0gcGFyc2VJbnQoZnJhYy5wYWRFbmQoOSwgJzAnKS5zdWJzdHJpbmcoMCwgOSksIDEwKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VjcyA9IHBhcnNlSW50KHNlY1N0ciwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB0b3RhbFNlY29uZHMgPSBkYXlzICogODY0MDAgKyBob3VycyAqIDM2MDAgKyBtaW5zICogNjAgKyBzZWNzO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYygxMik7XG4gICAgICBkYXRhLndyaXRlQmlnVUludDY0TEUoQmlnSW50KHRvdGFsU2Vjb25kcyksIDApO1xuICAgICAgZGF0YS53cml0ZVVJbnQzMkxFKG5hbm9zLCA4KTtcbiAgICAgIHJldHVybiB7IHR5cGU6IFByb3BlcnR5VHlwZS5EQVlfVE9fU0VDT05ELCBkYXRhLCBpc051bGw6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB7IHR5cGU6IHRhcmdldFR5cGUsIGRhdGE6IEJ1ZmZlci5mcm9tKHMsICd1dGYtOCcpLCBpc051bGw6IGZhbHNlIH07XG4gIH1cbn1cblxuLyoqIFBhcnNlIFwiSEg6bW06c3NbLm5ubm5ubm5ubl1cIiBpbnRvIGNvbXBvbmVudHMgKi9cbmZ1bmN0aW9uIHBhcnNlVGltZVN0cmluZyhzOiBzdHJpbmcpOiB7IGhvdXI6IG51bWJlcjsgbWludXRlOiBudW1iZXI7IHNlY29uZDogbnVtYmVyOyBuYW5vc2Vjb25kOiBudW1iZXIgfSB7XG4gIGNvbnN0IGRvdElkeCA9IHMuaW5kZXhPZignLicpO1xuICBsZXQgdGltZVBvcnRpb246IHN0cmluZztcbiAgbGV0IG5hbm9zZWNvbmQgPSAwO1xuXG4gIGlmIChkb3RJZHggPj0gMCkge1xuICAgIHRpbWVQb3J0aW9uID0gcy5zdWJzdHJpbmcoMCwgZG90SWR4KTtcbiAgICBjb25zdCBmcmFjID0gcy5zdWJzdHJpbmcoZG90SWR4ICsgMSk7XG4gICAgbmFub3NlY29uZCA9IHBhcnNlSW50KGZyYWMucGFkRW5kKDksICcwJykuc3Vic3RyaW5nKDAsIDkpLCAxMCk7XG4gIH0gZWxzZSB7XG4gICAgdGltZVBvcnRpb24gPSBzO1xuICB9XG5cbiAgY29uc3QgcGFydHMgPSB0aW1lUG9ydGlvbi5zcGxpdCgnOicpO1xuICByZXR1cm4ge1xuICAgIGhvdXI6IHBhcnNlSW50KHBhcnRzWzBdLCAxMCksXG4gICAgbWludXRlOiBwYXJzZUludChwYXJ0c1sxXSwgMTApLFxuICAgIHNlY29uZDogcGFyc2VJbnQocGFydHNbMl0sIDEwKSxcbiAgICBuYW5vc2Vjb25kLFxuICB9O1xufVxuXG4vKiogU3BsaXQgXCJISDptbTpzc1subl0rSEg6TU1cIiBvciBcIkhIOm1tOnNzWy5uXS1ISDpNTVwiIGludG8gdGltZVBhcnQgYW5kIG9mZnNldFBhcnQuXG4gKiAgQWxzbyBzdXBwb3J0cyBaIHN1ZmZpeCAodHJlYXRlZCBhcyArMDA6MDApIGFuZCBzcGFjZS1zZXBhcmF0ZWQgb2Zmc2V0cyBsaWtlIFwiMTQ6MzA6MDAgKzA4OjAwXCIuICovXG5mdW5jdGlvbiBzcGxpdFRpbWVBbmRPZmZzZXQoczogc3RyaW5nKTogeyB0aW1lUGFydDogc3RyaW5nOyBvZmZzZXRQYXJ0OiBzdHJpbmcgfSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVPZmZzZXQocyk7XG4gIC8vIEZpbmQgdGhlIGxhc3QgJysnIG9yICctJyB0aGF0IGluZGljYXRlcyBvZmZzZXQgKHNraXAgdGhlIG9uZSBhdCBwb3NpdGlvbiAwIGlmIHByZXNlbnQpXG4gIC8vIE9mZnNldCBpcyBhbHdheXMgaW4gdGhlIGZvcm1hdCArSEg6TU0gb3IgLUhIOk1NIGF0IHRoZSBlbmRcbiAgLy8gU2VhcmNoIGZvciArIG9yIC0gdGhhdCBpcyBmb2xsb3dlZCBieSBleGFjdGx5IEREOkREIHBhdHRlcm4gYXQgZW5kXG4gIGNvbnN0IG1hdGNoID0gbm9ybWFsaXplZC5tYXRjaCgvXiguKz8pKFsrLV1cXGR7Mn06XFxkezJ9KSQvKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgcmV0dXJuIHsgdGltZVBhcnQ6IG1hdGNoWzFdLCBvZmZzZXRQYXJ0OiBtYXRjaFsyXSB9O1xuICB9XG4gIHJldHVybiB7IHRpbWVQYXJ0OiBub3JtYWxpemVkLCBvZmZzZXRQYXJ0OiAnKzAwOjAwJyB9O1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyB0aW1lem9uZSBvZmZzZXQgb3IgWiBzdWZmaXggZnJvbSBhIGRhdGV0aW1lL3RpbWUgc3RyaW5nLlxuICogT25seSBsb29rcyBpbiB0aGUgbGFzdCB+MTAgY2hhcmFjdGVycyB0byBhdm9pZCBtYXRjaGluZyBkYXRlIGh5cGhlbnMgbGlrZSBcIjE5OTMtMDUtMDZcIi5cbiAqIFJldHVybnMgdGhlIGNsZWFuIGxvY2FsIHRpbWUvZGF0ZXRpbWUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiByZW1vdmVPZmZzZXQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIFogc3VmZml4XG4gIGlmIChzLmVuZHNXaXRoKCdaJykgfHwgcy5lbmRzV2l0aCgneicpKSB7XG4gICAgcmV0dXJuIHMuc2xpY2UoMCwgLTEpO1xuICB9XG4gIC8vIEhhbmRsZSBzcGFjZS1zZXBhcmF0ZWQgb2Zmc2V0OiBcIiArSEg6TU1cIiBvciBcIiAtSEg6TU1cIlxuICBjb25zdCBzcGFjZU9mZk1hdGNoID0gcy5tYXRjaCgvXiguKz8pXFxzK1srLV1cXGR7Mn06P1xcZHsyfSQvKTtcbiAgaWYgKHNwYWNlT2ZmTWF0Y2gpIHtcbiAgICByZXR1cm4gc3BhY2VPZmZNYXRjaFsxXTtcbiAgfVxuICAvLyBIYW5kbGUgYXR0YWNoZWQgb2Zmc2V0OiBcIitISDpNTVwiIG9yIFwiLUhIOk1NXCIgb3IgXCIrSEhNTVwiIG9yIFwiLUhITU1cIiBhdCBlbmRcbiAgLy8gT25seSBtYXRjaCBpbiB0aGUgbGFzdCAxMCBjaGFycyB0byBhdm9pZCBkYXRlIGh5cGhlbnNcbiAgY29uc3QgdGFpbCA9IHMubGVuZ3RoID4gMTAgPyBzLnN1YnN0cmluZyhzLmxlbmd0aCAtIDEwKSA6IHM7XG4gIGNvbnN0IG9mZk1hdGNoID0gdGFpbC5tYXRjaCgvWystXVxcZHsyfTo/XFxkezJ9JC8pO1xuICBpZiAob2ZmTWF0Y2gpIHtcbiAgICByZXR1cm4gcy5zdWJzdHJpbmcoMCwgcy5sZW5ndGggLSBvZmZNYXRjaFswXS5sZW5ndGgpO1xuICB9XG4gIHJldHVybiBzO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHN0cmluZydzIHRyYWlsaW5nIG9mZnNldDogY29sbGFwc2Ugc3BhY2UgYmVmb3JlIG9mZnNldCwgY29udmVydCBaIHRvICswMDowMC5cbiAqIE9ubHkgbG9va3MgaW4gdGhlIGxhc3QgfjEwIGNoYXJhY3RlcnMgdG8gYXZvaWQgbWF0Y2hpbmcgZGF0ZSBoeXBoZW5zLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVPZmZzZXQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gSGFuZGxlIFogc3VmZml4IOKGkiArMDA6MDBcbiAgaWYgKHMuZW5kc1dpdGgoJ1onKSB8fCBzLmVuZHNXaXRoKCd6JykpIHtcbiAgICByZXR1cm4gcy5zbGljZSgwLCAtMSkgKyAnKzAwOjAwJztcbiAgfVxuICAvLyBIYW5kbGUgc3BhY2Utc2VwYXJhdGVkIG9mZnNldDogXCIgK0hIOk1NXCIgb3IgXCIgLUhIOk1NXCJcbiAgY29uc3Qgc3BhY2VPZmZNYXRjaCA9IHMubWF0Y2goL14oLis/KVxccysoWystXVxcZHsyfTpcXGR7Mn0pJC8pO1xuICBpZiAoc3BhY2VPZmZNYXRjaCkge1xuICAgIHJldHVybiBzcGFjZU9mZk1hdGNoWzFdICsgc3BhY2VPZmZNYXRjaFsyXTtcbiAgfVxuICByZXR1cm4gcztcbn1cblxuXG4vKiogUGFyYW1ldGVyIGZvciBxdWVyaWVzICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmFtZXRlciB7XG4gIG5hbWU6IHN0cmluZztcbiAgdmFsdWU6IFR5cGVkVmFsdWU7XG59XG5cbi8qKiBDcmVhdGUgYSBwYXJhbWV0ZXIgZnJvbSBuYW1lIGFuZCB2YWx1ZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVBhcmFtZXRlcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBQYXJhbWV0ZXIge1xuICByZXR1cm4geyBuYW1lLCB2YWx1ZTogY3JlYXRlVHlwZWRWYWx1ZSh2YWx1ZSkgfTtcbn1cbiJdfQ==