@cartanova/qgrid-cli 1.0.1 → 1.0.3

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 (138) hide show
  1. package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorate.js +9 -0
  2. package/bundle/dist/dist/_virtual/_@oxc-project_runtime@0.122.0/helpers/decorateMetadata.js +6 -0
  3. package/bundle/dist/dist/_virtual/_rolldown/runtime.js +15 -0
  4. package/bundle/dist/dist/application/qgrid/oauth.js +140 -0
  5. package/bundle/dist/dist/application/qgrid/pool.js +100 -0
  6. package/bundle/dist/dist/application/qgrid/qgrid.frame.js +280 -0
  7. package/bundle/dist/dist/application/qgrid/qgrid.types.js +79 -0
  8. package/bundle/dist/dist/application/qgrid/worker.js +183 -0
  9. package/bundle/dist/dist/application/queries.generated.js +31 -0
  10. package/bundle/dist/dist/application/request-log/request-log.model.js +113 -0
  11. package/bundle/dist/dist/application/request-log/request-log.types.js +13 -0
  12. package/bundle/dist/dist/application/sonamu.generated.js +99 -0
  13. package/bundle/dist/dist/application/sonamu.generated.sso.js +34 -0
  14. package/bundle/dist/dist/application/token/token.model.js +157 -0
  15. package/bundle/dist/dist/application/token/token.types.js +22 -0
  16. package/bundle/dist/dist/i18n/en.js +63 -0
  17. package/bundle/dist/dist/i18n/ko.js +62 -0
  18. package/bundle/dist/dist/i18n/sd.generated.js +272 -0
  19. package/bundle/dist/dist/index.js +11 -0
  20. package/bundle/dist/dist/migrations/20260410171405_create__request_logs.js +26 -0
  21. package/bundle/dist/dist/migrations/20260410171406_create__tokens.js +24 -0
  22. package/bundle/dist/dist/migrations/20260411120624_alter_tokens_alter2.js +16 -0
  23. package/bundle/dist/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +155 -0
  24. package/bundle/dist/dist/node_modules/.pnpm/@vitest_expect@4.1.2/node_modules/@vitest/expect/dist/index.js +1484 -0
  25. package/bundle/dist/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js +887 -0
  26. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/chunk-artifact.js +2746 -0
  27. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/index.js +8 -0
  28. package/bundle/dist/dist/node_modules/.pnpm/@vitest_runner@4.1.2/node_modules/@vitest/runner/dist/utils.js +8 -0
  29. package/bundle/dist/dist/node_modules/.pnpm/@vitest_snapshot@4.1.2/node_modules/@vitest/snapshot/dist/index.js +662 -0
  30. package/bundle/dist/dist/node_modules/.pnpm/@vitest_spy@4.1.2/node_modules/@vitest/spy/dist/index.js +386 -0
  31. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +82 -0
  32. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/constants.js +48 -0
  33. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/diff.js +1307 -0
  34. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/display.js +558 -0
  35. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/error.js +33 -0
  36. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/helpers.js +226 -0
  37. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/offset.js +27 -0
  38. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/serialize.js +77 -0
  39. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/source-map.js +374 -0
  40. package/bundle/dist/dist/node_modules/.pnpm/@vitest_utils@4.1.2/node_modules/@vitest/utils/dist/timers.js +37 -0
  41. package/bundle/dist/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +2886 -0
  42. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +10 -0
  43. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +109 -0
  44. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +10 -0
  45. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +10 -0
  46. package/bundle/dist/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +10 -0
  47. package/bundle/dist/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +1127 -0
  48. package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +21 -0
  49. package/bundle/dist/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +432 -0
  50. package/bundle/dist/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +506 -0
  51. package/bundle/dist/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +86 -0
  52. package/bundle/dist/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.9.2_@emnapi_runtime@1.9.2_@types_node@25.0.7_esbuild@0.27.4_jiti@2.6.1_sass@1.98.0_tsx@4.21.0/node_modules/vite/dist/node/module-runner.js +426 -0
  53. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +6 -0
  54. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +41 -0
  55. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +19 -0
  56. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +202 -0
  57. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/index.DOa3dzoN.js +16 -0
  58. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +59 -0
  59. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/test.p_J6dB8a.js +2910 -0
  60. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +44 -0
  61. package/bundle/dist/dist/node_modules/.pnpm/vitest@4.1.2_@opentelemetry_api@1.9.0_@types_node@25.0.7_vite@8.0.3_@emnapi_core@1.9.2__bb31087278f97a39b31b92010beab980/node_modules/vitest/dist/index.js +28 -0
  62. package/bundle/dist/dist/sonamu.config.js +196 -0
  63. package/bundle/dist/dist/testing/fixture.js +8 -0
  64. package/bundle/dist/dist/testing/global.js +9 -0
  65. package/bundle/dist/dist/testing/setup-mocks.js +17 -0
  66. package/bundle/dist/dist/utils/subset-loaders.js +12 -0
  67. package/bundle/src/application/qgrid/oauth.ts +181 -0
  68. package/bundle/src/application/qgrid/pool.ts +132 -0
  69. package/bundle/src/application/qgrid/qgrid.frame.ts +275 -0
  70. package/bundle/src/application/qgrid/qgrid.types.ts +117 -0
  71. package/bundle/src/application/qgrid/worker.ts +234 -0
  72. package/bundle/src/application/queries.generated.ts +59 -0
  73. package/bundle/src/application/request-log/request-log.model.ts +155 -0
  74. package/bundle/src/application/request-log/request-log.types.ts +15 -0
  75. package/bundle/src/application/sonamu.generated.http +187 -0
  76. package/bundle/src/application/sonamu.generated.sso.ts +66 -0
  77. package/bundle/src/application/sonamu.generated.ts +135 -0
  78. package/bundle/src/application/token/token.model.ts +160 -0
  79. package/bundle/src/application/token/token.types.ts +26 -0
  80. package/bundle/src/i18n/en.ts +59 -0
  81. package/bundle/src/i18n/ko.ts +59 -0
  82. package/bundle/src/i18n/sd.generated.ts +384 -0
  83. package/bundle/src/index.ts +6 -0
  84. package/bundle/src/sonamu.config.ts +248 -0
  85. package/bundle/src/src/application/qgrid/oauth.ts +181 -0
  86. package/bundle/src/src/application/qgrid/pool.ts +132 -0
  87. package/bundle/src/src/application/qgrid/qgrid.frame.ts +275 -0
  88. package/bundle/src/src/application/qgrid/qgrid.types.ts +117 -0
  89. package/bundle/src/src/application/qgrid/worker.ts +234 -0
  90. package/bundle/src/src/application/queries.generated.ts +59 -0
  91. package/bundle/src/src/application/request-log/request-log.entity.json +75 -0
  92. package/bundle/src/src/application/request-log/request-log.model.ts +155 -0
  93. package/bundle/src/src/application/request-log/request-log.types.ts +15 -0
  94. package/bundle/src/src/application/sonamu.generated.http +187 -0
  95. package/bundle/src/src/application/sonamu.generated.sso.ts +66 -0
  96. package/bundle/src/src/application/sonamu.generated.ts +135 -0
  97. package/bundle/src/src/application/token/token.entity.json +37 -0
  98. package/bundle/src/src/application/token/token.model.ts +160 -0
  99. package/bundle/src/src/application/token/token.types.ts +26 -0
  100. package/bundle/src/src/i18n/en.ts +59 -0
  101. package/bundle/src/src/i18n/ko.ts +59 -0
  102. package/bundle/src/src/i18n/sd.generated.ts +384 -0
  103. package/bundle/src/src/index.ts +6 -0
  104. package/bundle/src/src/migrations/20260410171405_create__request_logs.ts +23 -0
  105. package/bundle/src/src/migrations/20260410171406_create__tokens.ts +21 -0
  106. package/bundle/src/src/migrations/20260411120624_alter_tokens_alter2.ts +15 -0
  107. package/bundle/src/src/sonamu.config.ts +248 -0
  108. package/bundle/src/src/testing/fixture.ts +6 -0
  109. package/bundle/src/src/testing/global.ts +6 -0
  110. package/bundle/src/src/testing/setup-mocks.ts +44 -0
  111. package/bundle/src/src/typings/fastify.d.ts +8 -0
  112. package/bundle/src/src/typings/sonamu.d.ts +17 -0
  113. package/bundle/src/src/utils/subset-loaders.ts +11 -0
  114. package/bundle/src/testing/fixture.ts +6 -0
  115. package/bundle/src/testing/global.ts +6 -0
  116. package/bundle/src/testing/setup-mocks.ts +44 -0
  117. package/bundle/src/typings/fastify.d.ts +8 -0
  118. package/bundle/src/typings/sonamu.d.ts +17 -0
  119. package/bundle/src/utils/subset-loaders.ts +11 -0
  120. package/bundle/web-dist/web-dist/client/assets/index-DlPchHBY.js +116 -0
  121. package/bundle/web-dist/web-dist/client/assets/index-vZsvyuFn.css +1 -0
  122. package/bundle/web-dist/web-dist/client/assets/rolldown-runtime-Dw2cE7zH.js +1 -0
  123. package/bundle/web-dist/web-dist/client/assets/routes-CagDz23B.js +1 -0
  124. package/bundle/web-dist/web-dist/client/assets/sd.generated-BrQoQXvv.js +47 -0
  125. package/bundle/web-dist/web-dist/client/assets/services.generated-BspO2L0j.js +1 -0
  126. package/bundle/web-dist/web-dist/client/assets/show-aXUGa0gm.js +29 -0
  127. package/bundle/web-dist/web-dist/client/assets/tokens-DRkXtZ3Q.js +1 -0
  128. package/bundle/web-dist/web-dist/client/assets/vendor-react-DH4kUfK2.js +9 -0
  129. package/bundle/web-dist/web-dist/client/assets/vendor-tanstack-CUxlo6YN.js +1 -0
  130. package/bundle/web-dist/web-dist/client/index.html +18 -0
  131. package/bundle/web-dist/web-dist/server/assets/react-dom-CGIzOSuj.js +335 -0
  132. package/bundle/web-dist/web-dist/server/assets/routes-ClzReRep.js +490 -0
  133. package/bundle/web-dist/web-dist/server/assets/sd.generated-BnonqqKr.js +21694 -0
  134. package/bundle/web-dist/web-dist/server/assets/services.generated-D5ABD5fr.js +836 -0
  135. package/bundle/web-dist/web-dist/server/assets/show-C9pcdSxc.js +23364 -0
  136. package/bundle/web-dist/web-dist/server/assets/tokens-JH6FsnWZ.js +860 -0
  137. package/bundle/web-dist/web-dist/server/entry-server.generated.js +44646 -0
  138. package/package.json +11 -10
@@ -0,0 +1,887 @@
1
+ import { y } from "../../../../../tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js";
2
+ //#region ../../node_modules/.pnpm/@vitest+pretty-format@4.1.2/node_modules/@vitest/pretty-format/dist/index.js
3
+ function _mergeNamespaces(n, m) {
4
+ m.forEach(function(e) {
5
+ e && typeof e !== "string" && !Array.isArray(e) && Object.keys(e).forEach(function(k) {
6
+ if (k !== "default" && !(k in n)) {
7
+ var d = Object.getOwnPropertyDescriptor(e, k);
8
+ Object.defineProperty(n, k, d.get ? d : {
9
+ enumerable: true,
10
+ get: function() {
11
+ return e[k];
12
+ }
13
+ });
14
+ }
15
+ });
16
+ });
17
+ return Object.freeze(n);
18
+ }
19
+ function getKeysOfEnumerableProperties(object, compareKeys) {
20
+ const rawKeys = Object.keys(object);
21
+ const keys = compareKeys === null ? rawKeys : rawKeys.sort(compareKeys);
22
+ if (Object.getOwnPropertySymbols) {
23
+ for (const symbol of Object.getOwnPropertySymbols(object)) if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) keys.push(symbol);
24
+ }
25
+ return keys;
26
+ }
27
+ /**
28
+ * Return entries (for example, of a map)
29
+ * with spacing, indentation, and comma
30
+ * without surrounding punctuation (for example, braces)
31
+ */
32
+ function printIteratorEntries(iterator, config, indentation, depth, refs, printer, separator = ": ") {
33
+ let result = "";
34
+ let width = 0;
35
+ let current = iterator.next();
36
+ if (!current.done) {
37
+ result += config.spacingOuter;
38
+ const indentationNext = indentation + config.indent;
39
+ while (!current.done) {
40
+ result += indentationNext;
41
+ if (width++ === config.maxWidth) {
42
+ result += "…";
43
+ break;
44
+ }
45
+ const name = printer(current.value[0], config, indentationNext, depth, refs);
46
+ const value = printer(current.value[1], config, indentationNext, depth, refs);
47
+ result += name + separator + value;
48
+ current = iterator.next();
49
+ if (!current.done) result += `,${config.spacingInner}`;
50
+ else if (!config.min) result += ",";
51
+ }
52
+ result += config.spacingOuter + indentation;
53
+ }
54
+ return result;
55
+ }
56
+ /**
57
+ * Return values (for example, of a set)
58
+ * with spacing, indentation, and comma
59
+ * without surrounding punctuation (braces or brackets)
60
+ */
61
+ function printIteratorValues(iterator, config, indentation, depth, refs, printer) {
62
+ let result = "";
63
+ let width = 0;
64
+ let current = iterator.next();
65
+ if (!current.done) {
66
+ result += config.spacingOuter;
67
+ const indentationNext = indentation + config.indent;
68
+ while (!current.done) {
69
+ result += indentationNext;
70
+ if (width++ === config.maxWidth) {
71
+ result += "…";
72
+ break;
73
+ }
74
+ result += printer(current.value, config, indentationNext, depth, refs);
75
+ current = iterator.next();
76
+ if (!current.done) result += `,${config.spacingInner}`;
77
+ else if (!config.min) result += ",";
78
+ }
79
+ result += config.spacingOuter + indentation;
80
+ }
81
+ return result;
82
+ }
83
+ /**
84
+ * Return items (for example, of an array)
85
+ * with spacing, indentation, and comma
86
+ * without surrounding punctuation (for example, brackets)
87
+ */
88
+ function printListItems(list, config, indentation, depth, refs, printer) {
89
+ let result = "";
90
+ list = list instanceof ArrayBuffer ? new DataView(list) : list;
91
+ const isDataView = (l) => l instanceof DataView;
92
+ const length = isDataView(list) ? list.byteLength : list.length;
93
+ if (length > 0) {
94
+ result += config.spacingOuter;
95
+ const indentationNext = indentation + config.indent;
96
+ for (let i = 0; i < length; i++) {
97
+ result += indentationNext;
98
+ if (i === config.maxWidth) {
99
+ result += "…";
100
+ break;
101
+ }
102
+ if (isDataView(list) || i in list) result += printer(isDataView(list) ? list.getInt8(i) : list[i], config, indentationNext, depth, refs);
103
+ if (i < length - 1) result += `,${config.spacingInner}`;
104
+ else if (!config.min) result += ",";
105
+ }
106
+ result += config.spacingOuter + indentation;
107
+ }
108
+ return result;
109
+ }
110
+ /**
111
+ * Return properties of an object
112
+ * with spacing, indentation, and comma
113
+ * without surrounding punctuation (for example, braces)
114
+ */
115
+ function printObjectProperties(val, config, indentation, depth, refs, printer) {
116
+ let result = "";
117
+ const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
118
+ if (keys.length > 0) {
119
+ result += config.spacingOuter;
120
+ const indentationNext = indentation + config.indent;
121
+ for (let i = 0; i < keys.length; i++) {
122
+ const key = keys[i];
123
+ const name = printer(key, config, indentationNext, depth, refs);
124
+ const value = printer(val[key], config, indentationNext, depth, refs);
125
+ result += `${indentationNext + name}: ${value}`;
126
+ if (i < keys.length - 1) result += `,${config.spacingInner}`;
127
+ else if (!config.min) result += ",";
128
+ }
129
+ result += config.spacingOuter + indentation;
130
+ }
131
+ return result;
132
+ }
133
+ const asymmetricMatcher = typeof Symbol === "function" && Symbol.for ? Symbol.for("jest.asymmetricMatcher") : 1267621;
134
+ const SPACE$2 = " ";
135
+ const serialize$5 = (val, config, indentation, depth, refs, printer) => {
136
+ const stringedValue = val.toString();
137
+ if (stringedValue === "ArrayContaining" || stringedValue === "ArrayNotContaining") {
138
+ if (++depth > config.maxDepth) return `[${stringedValue}]`;
139
+ return `${stringedValue + SPACE$2}[${printListItems(val.sample, config, indentation, depth, refs, printer)}]`;
140
+ }
141
+ if (stringedValue === "ObjectContaining" || stringedValue === "ObjectNotContaining") {
142
+ if (++depth > config.maxDepth) return `[${stringedValue}]`;
143
+ return `${stringedValue + SPACE$2}{${printObjectProperties(val.sample, config, indentation, depth, refs, printer)}}`;
144
+ }
145
+ if (stringedValue === "StringMatching" || stringedValue === "StringNotMatching") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
146
+ if (stringedValue === "StringContaining" || stringedValue === "StringNotContaining") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
147
+ if (typeof val.toAsymmetricMatcher !== "function") throw new TypeError(`Asymmetric matcher ${val.constructor.name} does not implement toAsymmetricMatcher()`);
148
+ return val.toAsymmetricMatcher();
149
+ };
150
+ const test$5 = (val) => val && val.$$typeof === asymmetricMatcher;
151
+ const plugin$5 = {
152
+ serialize: serialize$5,
153
+ test: test$5
154
+ };
155
+ const SPACE$1 = " ";
156
+ const OBJECT_NAMES = new Set(["DOMStringMap", "NamedNodeMap"]);
157
+ const ARRAY_REGEXP = /^(?:HTML\w*Collection|NodeList)$/;
158
+ function testName(name) {
159
+ return OBJECT_NAMES.has(name) || ARRAY_REGEXP.test(name);
160
+ }
161
+ const test$4 = (val) => val && val.constructor && !!val.constructor.name && testName(val.constructor.name);
162
+ function isNamedNodeMap(collection) {
163
+ return collection.constructor.name === "NamedNodeMap";
164
+ }
165
+ const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
166
+ const name = collection.constructor.name;
167
+ if (++depth > config.maxDepth) return `[${name}]`;
168
+ return (config.min ? "" : name + SPACE$1) + (OBJECT_NAMES.has(name) ? `{${printObjectProperties(isNamedNodeMap(collection) ? [...collection].reduce((props, attribute) => {
169
+ props[attribute.name] = attribute.value;
170
+ return props;
171
+ }, {}) : { ...collection }, config, indentation, depth, refs, printer)}}` : `[${printListItems([...collection], config, indentation, depth, refs, printer)}]`);
172
+ };
173
+ const plugin$4 = {
174
+ serialize: serialize$4,
175
+ test: test$4
176
+ };
177
+ /**
178
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
179
+ *
180
+ * This source code is licensed under the MIT license found in the
181
+ * LICENSE file in the root directory of this source tree.
182
+ */
183
+ function escapeHTML(str) {
184
+ return str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
185
+ }
186
+ function printProps(keys, props, config, indentation, depth, refs, printer) {
187
+ const indentationNext = indentation + config.indent;
188
+ const colors = config.colors;
189
+ return keys.map((key) => {
190
+ const value = props[key];
191
+ if (typeof value === "string" && value[0] === "_" && value.startsWith("__vitest_") && value.match(/__vitest_\d+__/)) return "";
192
+ let printed = printer(value, config, indentationNext, depth, refs);
193
+ if (typeof value !== "string") {
194
+ if (printed.includes("\n")) printed = config.spacingOuter + indentationNext + printed + config.spacingOuter + indentation;
195
+ printed = `{${printed}}`;
196
+ }
197
+ return `${config.spacingInner + indentation + colors.prop.open + key + colors.prop.close}=${colors.value.open}${printed}${colors.value.close}`;
198
+ }).join("");
199
+ }
200
+ function printChildren(children, config, indentation, depth, refs, printer) {
201
+ return children.map((child) => config.spacingOuter + indentation + (typeof child === "string" ? printText(child, config) : printer(child, config, indentation, depth, refs))).join("");
202
+ }
203
+ function printShadowRoot(children, config, indentation, depth, refs, printer) {
204
+ if (config.printShadowRoot === false) return "";
205
+ return [`${config.spacingOuter + indentation}#shadow-root`, printChildren(children, config, indentation + config.indent, depth, refs, printer)].join("");
206
+ }
207
+ function printText(text, config) {
208
+ const contentColor = config.colors.content;
209
+ return contentColor.open + escapeHTML(text) + contentColor.close;
210
+ }
211
+ function printComment(comment, config) {
212
+ const commentColor = config.colors.comment;
213
+ return `${commentColor.open}<!--${escapeHTML(comment)}-->${commentColor.close}`;
214
+ }
215
+ function printElement(type, printedProps, printedChildren, config, indentation) {
216
+ const tagColor = config.colors.tag;
217
+ return `${tagColor.open}<${type}${printedProps && tagColor.close + printedProps + config.spacingOuter + indentation + tagColor.open}${printedChildren ? `>${tagColor.close}${printedChildren}${config.spacingOuter}${indentation}${tagColor.open}</${type}` : `${printedProps && !config.min ? "" : " "}/`}>${tagColor.close}`;
218
+ }
219
+ function printElementAsLeaf(type, config) {
220
+ const tagColor = config.colors.tag;
221
+ return `${tagColor.open}<${type}${tagColor.close} …${tagColor.open} />${tagColor.close}`;
222
+ }
223
+ const ELEMENT_NODE = 1;
224
+ const TEXT_NODE = 3;
225
+ const COMMENT_NODE = 8;
226
+ const FRAGMENT_NODE = 11;
227
+ const ELEMENT_REGEXP = /^(?:(?:HTML|SVG)\w*)?Element$/;
228
+ function testHasAttribute(val) {
229
+ try {
230
+ return typeof val.hasAttribute === "function" && val.hasAttribute("is");
231
+ } catch {
232
+ return false;
233
+ }
234
+ }
235
+ function testNode(val) {
236
+ const constructorName = val.constructor.name;
237
+ const { nodeType, tagName } = val;
238
+ const isCustomElement = typeof tagName === "string" && tagName.includes("-") || testHasAttribute(val);
239
+ return nodeType === ELEMENT_NODE && (ELEMENT_REGEXP.test(constructorName) || isCustomElement) || nodeType === TEXT_NODE && constructorName === "Text" || nodeType === COMMENT_NODE && constructorName === "Comment" || nodeType === FRAGMENT_NODE && constructorName === "DocumentFragment";
240
+ }
241
+ const test$3 = (val) => val?.constructor?.name && testNode(val);
242
+ function nodeIsText(node) {
243
+ return node.nodeType === TEXT_NODE;
244
+ }
245
+ function nodeIsComment(node) {
246
+ return node.nodeType === COMMENT_NODE;
247
+ }
248
+ function nodeIsFragment(node) {
249
+ return node.nodeType === FRAGMENT_NODE;
250
+ }
251
+ function filterChildren(children, filterNode) {
252
+ let filtered = children.filter((node) => {
253
+ if (node.nodeType === TEXT_NODE) return (node.data || "").trim().length > 0;
254
+ return true;
255
+ });
256
+ if (filterNode) filtered = filtered.filter(filterNode);
257
+ return filtered;
258
+ }
259
+ function serializeDOM(node, config, indentation, depth, refs, printer, filterNode) {
260
+ if (nodeIsText(node)) return printText(node.data, config);
261
+ if (nodeIsComment(node)) return printComment(node.data, config);
262
+ const type = nodeIsFragment(node) ? "DocumentFragment" : node.tagName.toLowerCase();
263
+ if (++depth > config.maxDepth) return printElementAsLeaf(type, config);
264
+ const children = Array.prototype.slice.call(node.childNodes || node.children);
265
+ const shadowChildren = nodeIsFragment(node) || !node.shadowRoot ? [] : Array.prototype.slice.call(node.shadowRoot.children);
266
+ const resolvedChildren = filterNode ? filterChildren(children, filterNode) : children;
267
+ const resolvedShadowChildren = filterNode ? filterChildren(shadowChildren, filterNode) : shadowChildren;
268
+ return printElement(type, printProps(nodeIsFragment(node) ? [] : Array.from(node.attributes, (attr) => attr.name).sort(), nodeIsFragment(node) ? {} : [...node.attributes].reduce((props, attribute) => {
269
+ props[attribute.name] = attribute.value;
270
+ return props;
271
+ }, {}), config, indentation + config.indent, depth, refs, printer), (resolvedShadowChildren.length > 0 ? printShadowRoot(resolvedShadowChildren, config, indentation + config.indent, depth, refs, printer) : "") + printChildren(resolvedChildren, config, indentation + config.indent, depth, refs, printer), config, indentation);
272
+ }
273
+ const serialize$3 = (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer);
274
+ function createDOMElementFilter(filterNode) {
275
+ return {
276
+ test: test$3,
277
+ serialize: (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer, filterNode)
278
+ };
279
+ }
280
+ const plugin$3 = {
281
+ serialize: serialize$3,
282
+ test: test$3
283
+ };
284
+ const IS_ITERABLE_SENTINEL = "@@__IMMUTABLE_ITERABLE__@@";
285
+ const IS_LIST_SENTINEL = "@@__IMMUTABLE_LIST__@@";
286
+ const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
287
+ const IS_MAP_SENTINEL = "@@__IMMUTABLE_MAP__@@";
288
+ const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
289
+ const IS_RECORD_SENTINEL = "@@__IMMUTABLE_RECORD__@@";
290
+ const IS_SEQ_SENTINEL = "@@__IMMUTABLE_SEQ__@@";
291
+ const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
292
+ const IS_STACK_SENTINEL = "@@__IMMUTABLE_STACK__@@";
293
+ const getImmutableName = (name) => `Immutable.${name}`;
294
+ const printAsLeaf = (name) => `[${name}]`;
295
+ const SPACE = " ";
296
+ const LAZY = "…";
297
+ function printImmutableEntries(val, config, indentation, depth, refs, printer, type) {
298
+ return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}{${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer)}}`;
299
+ }
300
+ function getRecordEntries(val) {
301
+ let i = 0;
302
+ return { next() {
303
+ if (i < val._keys.length) {
304
+ const key = val._keys[i++];
305
+ return {
306
+ done: false,
307
+ value: [key, val.get(key)]
308
+ };
309
+ }
310
+ return {
311
+ done: true,
312
+ value: void 0
313
+ };
314
+ } };
315
+ }
316
+ function printImmutableRecord(val, config, indentation, depth, refs, printer) {
317
+ const name = getImmutableName(val._name || "Record");
318
+ return ++depth > config.maxDepth ? printAsLeaf(name) : `${name + SPACE}{${printIteratorEntries(getRecordEntries(val), config, indentation, depth, refs, printer)}}`;
319
+ }
320
+ function printImmutableSeq(val, config, indentation, depth, refs, printer) {
321
+ const name = getImmutableName("Seq");
322
+ if (++depth > config.maxDepth) return printAsLeaf(name);
323
+ if (val[IS_KEYED_SENTINEL]) return `${name + SPACE}{${val._iter || val._object ? printIteratorEntries(val.entries(), config, indentation, depth, refs, printer) : LAZY}}`;
324
+ return `${name + SPACE}[${val._iter || val._array || val._collection || val._iterable ? printIteratorValues(val.values(), config, indentation, depth, refs, printer) : LAZY}]`;
325
+ }
326
+ function printImmutableValues(val, config, indentation, depth, refs, printer, type) {
327
+ return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}[${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}]`;
328
+ }
329
+ const serialize$2 = (val, config, indentation, depth, refs, printer) => {
330
+ if (val[IS_MAP_SENTINEL]) return printImmutableEntries(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedMap" : "Map");
331
+ if (val[IS_LIST_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "List");
332
+ if (val[IS_SET_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedSet" : "Set");
333
+ if (val[IS_STACK_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "Stack");
334
+ if (val[IS_SEQ_SENTINEL]) return printImmutableSeq(val, config, indentation, depth, refs, printer);
335
+ return printImmutableRecord(val, config, indentation, depth, refs, printer);
336
+ };
337
+ const test$2 = (val) => val && (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
338
+ const plugin$2 = {
339
+ serialize: serialize$2,
340
+ test: test$2
341
+ };
342
+ function getDefaultExportFromCjs(x) {
343
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
344
+ }
345
+ var reactIs$1 = { exports: {} };
346
+ var reactIs_production = {};
347
+ /**
348
+ * @license React
349
+ * react-is.production.js
350
+ *
351
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
352
+ *
353
+ * This source code is licensed under the MIT license found in the
354
+ * LICENSE file in the root directory of this source tree.
355
+ */
356
+ var hasRequiredReactIs_production;
357
+ function requireReactIs_production() {
358
+ if (hasRequiredReactIs_production) return reactIs_production;
359
+ hasRequiredReactIs_production = 1;
360
+ var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");
361
+ function typeOf(object) {
362
+ if ("object" === typeof object && null !== object) {
363
+ var $$typeof = object.$$typeof;
364
+ switch ($$typeof) {
365
+ case REACT_ELEMENT_TYPE: switch (object = object.type, object) {
366
+ case REACT_FRAGMENT_TYPE:
367
+ case REACT_PROFILER_TYPE:
368
+ case REACT_STRICT_MODE_TYPE:
369
+ case REACT_SUSPENSE_TYPE:
370
+ case REACT_SUSPENSE_LIST_TYPE:
371
+ case REACT_VIEW_TRANSITION_TYPE: return object;
372
+ default: switch (object = object && object.$$typeof, object) {
373
+ case REACT_CONTEXT_TYPE:
374
+ case REACT_FORWARD_REF_TYPE:
375
+ case REACT_LAZY_TYPE:
376
+ case REACT_MEMO_TYPE: return object;
377
+ case REACT_CONSUMER_TYPE: return object;
378
+ default: return $$typeof;
379
+ }
380
+ }
381
+ case REACT_PORTAL_TYPE: return $$typeof;
382
+ }
383
+ }
384
+ }
385
+ reactIs_production.ContextConsumer = REACT_CONSUMER_TYPE;
386
+ reactIs_production.ContextProvider = REACT_CONTEXT_TYPE;
387
+ reactIs_production.Element = REACT_ELEMENT_TYPE;
388
+ reactIs_production.ForwardRef = REACT_FORWARD_REF_TYPE;
389
+ reactIs_production.Fragment = REACT_FRAGMENT_TYPE;
390
+ reactIs_production.Lazy = REACT_LAZY_TYPE;
391
+ reactIs_production.Memo = REACT_MEMO_TYPE;
392
+ reactIs_production.Portal = REACT_PORTAL_TYPE;
393
+ reactIs_production.Profiler = REACT_PROFILER_TYPE;
394
+ reactIs_production.StrictMode = REACT_STRICT_MODE_TYPE;
395
+ reactIs_production.Suspense = REACT_SUSPENSE_TYPE;
396
+ reactIs_production.SuspenseList = REACT_SUSPENSE_LIST_TYPE;
397
+ reactIs_production.isContextConsumer = function(object) {
398
+ return typeOf(object) === REACT_CONSUMER_TYPE;
399
+ };
400
+ reactIs_production.isContextProvider = function(object) {
401
+ return typeOf(object) === REACT_CONTEXT_TYPE;
402
+ };
403
+ reactIs_production.isElement = function(object) {
404
+ return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
405
+ };
406
+ reactIs_production.isForwardRef = function(object) {
407
+ return typeOf(object) === REACT_FORWARD_REF_TYPE;
408
+ };
409
+ reactIs_production.isFragment = function(object) {
410
+ return typeOf(object) === REACT_FRAGMENT_TYPE;
411
+ };
412
+ reactIs_production.isLazy = function(object) {
413
+ return typeOf(object) === REACT_LAZY_TYPE;
414
+ };
415
+ reactIs_production.isMemo = function(object) {
416
+ return typeOf(object) === REACT_MEMO_TYPE;
417
+ };
418
+ reactIs_production.isPortal = function(object) {
419
+ return typeOf(object) === REACT_PORTAL_TYPE;
420
+ };
421
+ reactIs_production.isProfiler = function(object) {
422
+ return typeOf(object) === REACT_PROFILER_TYPE;
423
+ };
424
+ reactIs_production.isStrictMode = function(object) {
425
+ return typeOf(object) === REACT_STRICT_MODE_TYPE;
426
+ };
427
+ reactIs_production.isSuspense = function(object) {
428
+ return typeOf(object) === REACT_SUSPENSE_TYPE;
429
+ };
430
+ reactIs_production.isSuspenseList = function(object) {
431
+ return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;
432
+ };
433
+ reactIs_production.isValidElementType = function(type) {
434
+ return "string" === typeof type || "function" === typeof type || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || "object" === typeof type && null !== type && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE || void 0 !== type.getModuleId) ? true : false;
435
+ };
436
+ reactIs_production.typeOf = typeOf;
437
+ return reactIs_production;
438
+ }
439
+ var hasRequiredReactIs$1;
440
+ function requireReactIs$1() {
441
+ if (hasRequiredReactIs$1) return reactIs$1.exports;
442
+ hasRequiredReactIs$1 = 1;
443
+ reactIs$1.exports = requireReactIs_production();
444
+ return reactIs$1.exports;
445
+ }
446
+ var reactIsExports$1 = requireReactIs$1();
447
+ var ReactIs19 = /* @__PURE__ */ _mergeNamespaces({
448
+ __proto__: null,
449
+ default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports$1)
450
+ }, [reactIsExports$1]);
451
+ var reactIs = { exports: {} };
452
+ var reactIs_production_min = {};
453
+ /**
454
+ * @license React
455
+ * react-is.production.min.js
456
+ *
457
+ * Copyright (c) Facebook, Inc. and its affiliates.
458
+ *
459
+ * This source code is licensed under the MIT license found in the
460
+ * LICENSE file in the root directory of this source tree.
461
+ */
462
+ var hasRequiredReactIs_production_min;
463
+ function requireReactIs_production_min() {
464
+ if (hasRequiredReactIs_production_min) return reactIs_production_min;
465
+ hasRequiredReactIs_production_min = 1;
466
+ var b = Symbol.for("react.element"), c = Symbol.for("react.portal"), d = Symbol.for("react.fragment"), e = Symbol.for("react.strict_mode"), f = Symbol.for("react.profiler"), g = Symbol.for("react.provider"), h = Symbol.for("react.context"), k = Symbol.for("react.server_context"), l = Symbol.for("react.forward_ref"), m = Symbol.for("react.suspense"), n = Symbol.for("react.suspense_list"), p = Symbol.for("react.memo"), q = Symbol.for("react.lazy"), t = Symbol.for("react.offscreen"), u = Symbol.for("react.module.reference");
467
+ function v(a) {
468
+ if ("object" === typeof a && null !== a) {
469
+ var r = a.$$typeof;
470
+ switch (r) {
471
+ case b: switch (a = a.type, a) {
472
+ case d:
473
+ case f:
474
+ case e:
475
+ case m:
476
+ case n: return a;
477
+ default: switch (a = a && a.$$typeof, a) {
478
+ case k:
479
+ case h:
480
+ case l:
481
+ case q:
482
+ case p:
483
+ case g: return a;
484
+ default: return r;
485
+ }
486
+ }
487
+ case c: return r;
488
+ }
489
+ }
490
+ }
491
+ reactIs_production_min.ContextConsumer = h;
492
+ reactIs_production_min.ContextProvider = g;
493
+ reactIs_production_min.Element = b;
494
+ reactIs_production_min.ForwardRef = l;
495
+ reactIs_production_min.Fragment = d;
496
+ reactIs_production_min.Lazy = q;
497
+ reactIs_production_min.Memo = p;
498
+ reactIs_production_min.Portal = c;
499
+ reactIs_production_min.Profiler = f;
500
+ reactIs_production_min.StrictMode = e;
501
+ reactIs_production_min.Suspense = m;
502
+ reactIs_production_min.SuspenseList = n;
503
+ reactIs_production_min.isAsyncMode = function() {
504
+ return false;
505
+ };
506
+ reactIs_production_min.isConcurrentMode = function() {
507
+ return false;
508
+ };
509
+ reactIs_production_min.isContextConsumer = function(a) {
510
+ return v(a) === h;
511
+ };
512
+ reactIs_production_min.isContextProvider = function(a) {
513
+ return v(a) === g;
514
+ };
515
+ reactIs_production_min.isElement = function(a) {
516
+ return "object" === typeof a && null !== a && a.$$typeof === b;
517
+ };
518
+ reactIs_production_min.isForwardRef = function(a) {
519
+ return v(a) === l;
520
+ };
521
+ reactIs_production_min.isFragment = function(a) {
522
+ return v(a) === d;
523
+ };
524
+ reactIs_production_min.isLazy = function(a) {
525
+ return v(a) === q;
526
+ };
527
+ reactIs_production_min.isMemo = function(a) {
528
+ return v(a) === p;
529
+ };
530
+ reactIs_production_min.isPortal = function(a) {
531
+ return v(a) === c;
532
+ };
533
+ reactIs_production_min.isProfiler = function(a) {
534
+ return v(a) === f;
535
+ };
536
+ reactIs_production_min.isStrictMode = function(a) {
537
+ return v(a) === e;
538
+ };
539
+ reactIs_production_min.isSuspense = function(a) {
540
+ return v(a) === m;
541
+ };
542
+ reactIs_production_min.isSuspenseList = function(a) {
543
+ return v(a) === n;
544
+ };
545
+ reactIs_production_min.isValidElementType = function(a) {
546
+ return "string" === typeof a || "function" === typeof a || a === d || a === f || a === e || a === m || a === n || a === t || "object" === typeof a && null !== a && (a.$$typeof === q || a.$$typeof === p || a.$$typeof === g || a.$$typeof === h || a.$$typeof === l || a.$$typeof === u || void 0 !== a.getModuleId) ? true : false;
547
+ };
548
+ reactIs_production_min.typeOf = v;
549
+ return reactIs_production_min;
550
+ }
551
+ var hasRequiredReactIs;
552
+ function requireReactIs() {
553
+ if (hasRequiredReactIs) return reactIs.exports;
554
+ hasRequiredReactIs = 1;
555
+ reactIs.exports = requireReactIs_production_min();
556
+ return reactIs.exports;
557
+ }
558
+ var reactIsExports = requireReactIs();
559
+ var ReactIs18 = /* @__PURE__ */ _mergeNamespaces({
560
+ __proto__: null,
561
+ default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports)
562
+ }, [reactIsExports]);
563
+ const ReactIs = Object.fromEntries([
564
+ "isAsyncMode",
565
+ "isConcurrentMode",
566
+ "isContextConsumer",
567
+ "isContextProvider",
568
+ "isElement",
569
+ "isForwardRef",
570
+ "isFragment",
571
+ "isLazy",
572
+ "isMemo",
573
+ "isPortal",
574
+ "isProfiler",
575
+ "isStrictMode",
576
+ "isSuspense",
577
+ "isSuspenseList",
578
+ "isValidElementType"
579
+ ].map((m) => [m, (v) => ReactIs18[m](v) || ReactIs19[m](v)]));
580
+ function getChildren(arg, children = []) {
581
+ if (Array.isArray(arg)) for (const item of arg) getChildren(item, children);
582
+ else if (arg != null && arg !== false && arg !== "") children.push(arg);
583
+ return children;
584
+ }
585
+ function getType(element) {
586
+ const type = element.type;
587
+ if (typeof type === "string") return type;
588
+ if (typeof type === "function") return type.displayName || type.name || "Unknown";
589
+ if (ReactIs.isFragment(element)) return "React.Fragment";
590
+ if (ReactIs.isSuspense(element)) return "React.Suspense";
591
+ if (typeof type === "object" && type !== null) {
592
+ if (ReactIs.isContextProvider(element)) return "Context.Provider";
593
+ if (ReactIs.isContextConsumer(element)) return "Context.Consumer";
594
+ if (ReactIs.isForwardRef(element)) {
595
+ if (type.displayName) return type.displayName;
596
+ const functionName = type.render.displayName || type.render.name || "";
597
+ return functionName === "" ? "ForwardRef" : `ForwardRef(${functionName})`;
598
+ }
599
+ if (ReactIs.isMemo(element)) {
600
+ const functionName = type.displayName || type.type.displayName || type.type.name || "";
601
+ return functionName === "" ? "Memo" : `Memo(${functionName})`;
602
+ }
603
+ }
604
+ return "UNDEFINED";
605
+ }
606
+ function getPropKeys$1(element) {
607
+ const { props } = element;
608
+ return Object.keys(props).filter((key) => key !== "children" && props[key] !== void 0).sort();
609
+ }
610
+ const serialize$1 = (element, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(getType(element), config) : printElement(getType(element), printProps(getPropKeys$1(element), element.props, config, indentation + config.indent, depth, refs, printer), printChildren(getChildren(element.props.children), config, indentation + config.indent, depth, refs, printer), config, indentation);
611
+ const test$1 = (val) => val != null && ReactIs.isElement(val);
612
+ const plugin$1 = {
613
+ serialize: serialize$1,
614
+ test: test$1
615
+ };
616
+ const testSymbol = typeof Symbol === "function" && Symbol.for ? Symbol.for("react.test.json") : 245830487;
617
+ function getPropKeys(object) {
618
+ const { props } = object;
619
+ return props ? Object.keys(props).filter((key) => props[key] !== void 0).sort() : [];
620
+ }
621
+ const serialize = (object, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(object.type, config) : printElement(object.type, object.props ? printProps(getPropKeys(object), object.props, config, indentation + config.indent, depth, refs, printer) : "", object.children ? printChildren(object.children, config, indentation + config.indent, depth, refs, printer) : "", config, indentation);
622
+ const test = (val) => val && val.$$typeof === testSymbol;
623
+ const plugin = {
624
+ serialize,
625
+ test
626
+ };
627
+ const toString = Object.prototype.toString;
628
+ const toISOString = Date.prototype.toISOString;
629
+ const errorToString = Error.prototype.toString;
630
+ const regExpToString = RegExp.prototype.toString;
631
+ /**
632
+ * Explicitly comparing typeof constructor to function avoids undefined as name
633
+ * when mock identity-obj-proxy returns the key as the value for any key.
634
+ */
635
+ function getConstructorName(val) {
636
+ return typeof val.constructor === "function" && val.constructor.name || "Object";
637
+ }
638
+ /** Is val is equal to global window object? Works even if it does not exist :) */
639
+ function isWindow(val) {
640
+ return typeof window !== "undefined" && val === window;
641
+ }
642
+ const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
643
+ const NEWLINE_REGEXP = /\n/g;
644
+ var PrettyFormatPluginError = class extends Error {
645
+ constructor(message, stack) {
646
+ super(message);
647
+ this.stack = stack;
648
+ this.name = this.constructor.name;
649
+ }
650
+ };
651
+ function isToStringedArrayType(toStringed) {
652
+ return toStringed === "[object Array]" || toStringed === "[object ArrayBuffer]" || toStringed === "[object DataView]" || toStringed === "[object Float32Array]" || toStringed === "[object Float64Array]" || toStringed === "[object Int8Array]" || toStringed === "[object Int16Array]" || toStringed === "[object Int32Array]" || toStringed === "[object Uint8Array]" || toStringed === "[object Uint8ClampedArray]" || toStringed === "[object Uint16Array]" || toStringed === "[object Uint32Array]";
653
+ }
654
+ function printNumber(val) {
655
+ return Object.is(val, -0) ? "-0" : String(val);
656
+ }
657
+ function printBigInt(val) {
658
+ return String(`${val}n`);
659
+ }
660
+ function printFunction(val, printFunctionName) {
661
+ if (!printFunctionName) return "[Function]";
662
+ return `[Function ${val.name || "anonymous"}]`;
663
+ }
664
+ function printSymbol(val) {
665
+ return String(val).replace(SYMBOL_REGEXP, "Symbol($1)");
666
+ }
667
+ function printError(val) {
668
+ return `[${errorToString.call(val)}]`;
669
+ }
670
+ /**
671
+ * The first port of call for printing an object, handles most of the
672
+ * data-types in JS.
673
+ */
674
+ function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
675
+ if (val === true || val === false) return `${val}`;
676
+ if (val === void 0) return "undefined";
677
+ if (val === null) return "null";
678
+ const typeOf = typeof val;
679
+ if (typeOf === "number") return printNumber(val);
680
+ if (typeOf === "bigint") return printBigInt(val);
681
+ if (typeOf === "string") {
682
+ if (escapeString) return `"${val.replaceAll(/"|\\/g, "\\$&")}"`;
683
+ return `"${val}"`;
684
+ }
685
+ if (typeOf === "function") return printFunction(val, printFunctionName);
686
+ if (typeOf === "symbol") return printSymbol(val);
687
+ const toStringed = toString.call(val);
688
+ if (toStringed === "[object WeakMap]") return "WeakMap {}";
689
+ if (toStringed === "[object WeakSet]") return "WeakSet {}";
690
+ if (toStringed === "[object Function]" || toStringed === "[object GeneratorFunction]") return printFunction(val, printFunctionName);
691
+ if (toStringed === "[object Symbol]") return printSymbol(val);
692
+ if (toStringed === "[object Date]") return Number.isNaN(+val) ? "Date { NaN }" : toISOString.call(val);
693
+ if (toStringed === "[object Error]") return printError(val);
694
+ if (toStringed === "[object RegExp]") {
695
+ if (escapeRegex) return regExpToString.call(val).replaceAll(/[$()*+.?[\\\]^{|}]/g, "\\$&");
696
+ return regExpToString.call(val);
697
+ }
698
+ if (val instanceof Error) return printError(val);
699
+ return null;
700
+ }
701
+ /**
702
+ * Handles more complex objects ( such as objects with circular references.
703
+ * maps and sets etc )
704
+ */
705
+ function printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON) {
706
+ if (refs.includes(val)) return "[Circular]";
707
+ refs = [...refs];
708
+ refs.push(val);
709
+ const hitMaxDepth = ++depth > config.maxDepth;
710
+ const min = config.min;
711
+ if (config.callToJSON && !hitMaxDepth && val.toJSON && typeof val.toJSON === "function" && !hasCalledToJSON) return printer(val.toJSON(), config, indentation, depth, refs, true);
712
+ const toStringed = toString.call(val);
713
+ if (toStringed === "[object Arguments]") return hitMaxDepth ? "[Arguments]" : `${min ? "" : "Arguments "}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
714
+ if (isToStringedArrayType(toStringed)) return hitMaxDepth ? `[${val.constructor.name}]` : `${min ? "" : !config.printBasicPrototype && val.constructor.name === "Array" ? "" : `${val.constructor.name} `}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
715
+ if (toStringed === "[object Map]") return hitMaxDepth ? "[Map]" : `Map {${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer, " => ")}}`;
716
+ if (toStringed === "[object Set]") return hitMaxDepth ? "[Set]" : `Set {${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}}`;
717
+ return hitMaxDepth || isWindow(val) ? `[${getConstructorName(val)}]` : `${min ? "" : !config.printBasicPrototype && getConstructorName(val) === "Object" ? "" : `${getConstructorName(val)} `}{${printObjectProperties(val, config, indentation, depth, refs, printer)}}`;
718
+ }
719
+ const ErrorPlugin = {
720
+ test: (val) => val && val instanceof Error,
721
+ serialize(val, config, indentation, depth, refs, printer) {
722
+ if (refs.includes(val)) return "[Circular]";
723
+ refs = [...refs, val];
724
+ const hitMaxDepth = ++depth > config.maxDepth;
725
+ const { message, cause, ...rest } = val;
726
+ const entries = {
727
+ message,
728
+ ...typeof cause !== "undefined" ? { cause } : {},
729
+ ...val instanceof AggregateError ? { errors: val.errors } : {},
730
+ ...rest
731
+ };
732
+ const name = val.name !== "Error" ? val.name : getConstructorName(val);
733
+ return hitMaxDepth ? `[${name}]` : `${name} {${printIteratorEntries(Object.entries(entries).values(), config, indentation, depth, refs, printer)}}`;
734
+ }
735
+ };
736
+ function isNewPlugin(plugin) {
737
+ return plugin.serialize != null;
738
+ }
739
+ function printPlugin(plugin, val, config, indentation, depth, refs) {
740
+ let printed;
741
+ try {
742
+ printed = isNewPlugin(plugin) ? plugin.serialize(val, config, indentation, depth, refs, printer) : plugin.print(val, (valChild) => printer(valChild, config, indentation, depth, refs), (str) => {
743
+ const indentationNext = indentation + config.indent;
744
+ return indentationNext + str.replaceAll(NEWLINE_REGEXP, `\n${indentationNext}`);
745
+ }, {
746
+ edgeSpacing: config.spacingOuter,
747
+ min: config.min,
748
+ spacing: config.spacingInner
749
+ }, config.colors);
750
+ } catch (error) {
751
+ throw new PrettyFormatPluginError(error.message, error.stack);
752
+ }
753
+ if (typeof printed !== "string") throw new TypeError(`pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`);
754
+ return printed;
755
+ }
756
+ function findPlugin(plugins, val) {
757
+ for (const plugin of plugins) try {
758
+ if (plugin.test(val)) return plugin;
759
+ } catch (error) {
760
+ throw new PrettyFormatPluginError(error.message, error.stack);
761
+ }
762
+ return null;
763
+ }
764
+ function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
765
+ let result;
766
+ const plugin = findPlugin(config.plugins, val);
767
+ if (plugin !== null) result = printPlugin(plugin, val, config, indentation, depth, refs);
768
+ else {
769
+ const basicResult = printBasicValue(val, config.printFunctionName, config.escapeRegex, config.escapeString);
770
+ if (basicResult !== null) result = basicResult;
771
+ else result = printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON);
772
+ }
773
+ config._outputLengthPerDepth[depth] ??= 0;
774
+ config._outputLengthPerDepth[depth] += result.length;
775
+ if (config._outputLengthPerDepth[depth] > config.maxOutputLength) config.maxDepth = 0;
776
+ return result;
777
+ }
778
+ const DEFAULT_THEME = {
779
+ comment: "gray",
780
+ content: "reset",
781
+ prop: "yellow",
782
+ tag: "cyan",
783
+ value: "green"
784
+ };
785
+ const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
786
+ const DEFAULT_OPTIONS = {
787
+ callToJSON: true,
788
+ compareKeys: void 0,
789
+ escapeRegex: false,
790
+ escapeString: true,
791
+ highlight: false,
792
+ indent: 2,
793
+ maxDepth: Number.POSITIVE_INFINITY,
794
+ maxOutputLength: 1e6,
795
+ maxWidth: Number.POSITIVE_INFINITY,
796
+ min: false,
797
+ plugins: [],
798
+ printBasicPrototype: true,
799
+ printFunctionName: true,
800
+ printShadowRoot: true,
801
+ theme: DEFAULT_THEME
802
+ };
803
+ function validateOptions(options) {
804
+ for (const key of Object.keys(options)) if (!Object.hasOwn(DEFAULT_OPTIONS, key)) throw new Error(`pretty-format: Unknown option "${key}".`);
805
+ if (options.min && options.indent !== void 0 && options.indent !== 0) throw new Error("pretty-format: Options \"min\" and \"indent\" cannot be used together.");
806
+ }
807
+ function getColorsHighlight() {
808
+ return DEFAULT_THEME_KEYS.reduce((colors, key) => {
809
+ const value = DEFAULT_THEME[key];
810
+ const color = value && y[value];
811
+ if (color && typeof color.close === "string" && typeof color.open === "string") colors[key] = color;
812
+ else throw new Error(`pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`);
813
+ return colors;
814
+ }, Object.create(null));
815
+ }
816
+ function getColorsEmpty() {
817
+ return DEFAULT_THEME_KEYS.reduce((colors, key) => {
818
+ colors[key] = {
819
+ close: "",
820
+ open: ""
821
+ };
822
+ return colors;
823
+ }, Object.create(null));
824
+ }
825
+ function getPrintFunctionName(options) {
826
+ return options?.printFunctionName ?? DEFAULT_OPTIONS.printFunctionName;
827
+ }
828
+ function getEscapeRegex(options) {
829
+ return options?.escapeRegex ?? DEFAULT_OPTIONS.escapeRegex;
830
+ }
831
+ function getEscapeString(options) {
832
+ return options?.escapeString ?? DEFAULT_OPTIONS.escapeString;
833
+ }
834
+ function getConfig(options) {
835
+ return {
836
+ callToJSON: options?.callToJSON ?? DEFAULT_OPTIONS.callToJSON,
837
+ colors: options?.highlight ? getColorsHighlight() : getColorsEmpty(),
838
+ compareKeys: typeof options?.compareKeys === "function" || options?.compareKeys === null ? options.compareKeys : DEFAULT_OPTIONS.compareKeys,
839
+ escapeRegex: getEscapeRegex(options),
840
+ escapeString: getEscapeString(options),
841
+ indent: options?.min ? "" : createIndent(options?.indent ?? DEFAULT_OPTIONS.indent),
842
+ maxDepth: options?.maxDepth ?? DEFAULT_OPTIONS.maxDepth,
843
+ maxWidth: options?.maxWidth ?? DEFAULT_OPTIONS.maxWidth,
844
+ min: options?.min ?? DEFAULT_OPTIONS.min,
845
+ plugins: options?.plugins ?? DEFAULT_OPTIONS.plugins,
846
+ printBasicPrototype: options?.printBasicPrototype ?? true,
847
+ printFunctionName: getPrintFunctionName(options),
848
+ printShadowRoot: options?.printShadowRoot ?? true,
849
+ spacingInner: options?.min ? " " : "\n",
850
+ spacingOuter: options?.min ? "" : "\n",
851
+ maxOutputLength: options?.maxOutputLength ?? DEFAULT_OPTIONS.maxOutputLength,
852
+ _outputLengthPerDepth: []
853
+ };
854
+ }
855
+ function createIndent(indent) {
856
+ return Array.from({ length: indent + 1 }).join(" ");
857
+ }
858
+ /**
859
+ * Returns a presentation string of your `val` object
860
+ * @param val any potential JavaScript object
861
+ * @param options Custom settings
862
+ */
863
+ function format(val, options) {
864
+ if (options) {
865
+ validateOptions(options);
866
+ if (options.plugins) {
867
+ const plugin = findPlugin(options.plugins, val);
868
+ if (plugin !== null) return printPlugin(plugin, val, getConfig(options), "", 0, []);
869
+ }
870
+ }
871
+ const basicResult = printBasicValue(val, getPrintFunctionName(options), getEscapeRegex(options), getEscapeString(options));
872
+ if (basicResult !== null) return basicResult;
873
+ return printComplexValue(val, getConfig(options), "", 0, []);
874
+ }
875
+ const plugins = {
876
+ AsymmetricMatcher: plugin$5,
877
+ DOMCollection: plugin$4,
878
+ DOMElement: plugin$3,
879
+ Immutable: plugin$2,
880
+ ReactElement: plugin$1,
881
+ ReactTestComponent: plugin,
882
+ Error: ErrorPlugin
883
+ };
884
+ //#endregion
885
+ export { createDOMElementFilter, format, plugins };
886
+
887
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJzdHlsZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCtwcmV0dHktZm9ybWF0QDQuMS4yL25vZGVfbW9kdWxlcy9Adml0ZXN0L3ByZXR0eS1mb3JtYXQvZGlzdC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVzIGZyb20gJ3RpbnlyYWluYm93JztcblxuZnVuY3Rpb24gX21lcmdlTmFtZXNwYWNlcyhuLCBtKSB7XG4gIG0uZm9yRWFjaChmdW5jdGlvbiAoZSkge1xuICAgIGUgJiYgdHlwZW9mIGUgIT09ICdzdHJpbmcnICYmICFBcnJheS5pc0FycmF5KGUpICYmIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGspIHtcbiAgICAgIGlmIChrICE9PSAnZGVmYXVsdCcgJiYgIShrIGluIG4pKSB7XG4gICAgICAgIHZhciBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCBrKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sIGssIGQuZ2V0ID8gZCA6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZVtrXTsgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKG4pO1xufVxuXG5mdW5jdGlvbiBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyhvYmplY3QsIGNvbXBhcmVLZXlzKSB7XG5cdGNvbnN0IHJhd0tleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuXHRjb25zdCBrZXlzID0gY29tcGFyZUtleXMgPT09IG51bGwgPyByYXdLZXlzIDogcmF3S2V5cy5zb3J0KGNvbXBhcmVLZXlzKTtcblx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcblx0XHRmb3IgKGNvbnN0IHN5bWJvbCBvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCkpIHtcblx0XHRcdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltYm9sKS5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGtleXMucHVzaChzeW1ib2wpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHRyZXR1cm4ga2V5cztcbn1cbi8qKlxuKiBSZXR1cm4gZW50cmllcyAoZm9yIGV4YW1wbGUsIG9mIGEgbWFwKVxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiovXG5mdW5jdGlvbiBwcmludEl0ZXJhdG9yRW50cmllcyhpdGVyYXRvciwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHNlcGFyYXRvciA9IFwiOiBcIikge1xuXHRsZXQgcmVzdWx0ID0gXCJcIjtcblx0bGV0IHdpZHRoID0gMDtcblx0bGV0IGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdGlmICghY3VycmVudC5kb25lKSB7XG5cdFx0cmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXI7XG5cdFx0Y29uc3QgaW5kZW50YXRpb25OZXh0ID0gaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50O1xuXHRcdHdoaWxlICghY3VycmVudC5kb25lKSB7XG5cdFx0XHRyZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXHRcdFx0aWYgKHdpZHRoKysgPT09IGNvbmZpZy5tYXhXaWR0aCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCLigKZcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBuYW1lID0gcHJpbnRlcihjdXJyZW50LnZhbHVlWzBdLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBwcmludGVyKGN1cnJlbnQudmFsdWVbMV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRyZXN1bHQgKz0gbmFtZSArIHNlcGFyYXRvciArIHZhbHVlO1xuXHRcdFx0Y3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0XHRcdGlmICghY3VycmVudC5kb25lKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBgLCR7Y29uZmlnLnNwYWNpbmdJbm5lcn1gO1xuXHRcdFx0fSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCIsXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuKiBSZXR1cm4gdmFsdWVzIChmb3IgZXhhbXBsZSwgb2YgYSBzZXQpXG4qIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuKiB3aXRob3V0IHN1cnJvdW5kaW5nIHB1bmN0dWF0aW9uIChicmFjZXMgb3IgYnJhY2tldHMpXG4qL1xuZnVuY3Rpb24gcHJpbnRJdGVyYXRvclZhbHVlcyhpdGVyYXRvciwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGxldCB3aWR0aCA9IDA7XG5cdGxldCBjdXJyZW50ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHR3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0cmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dDtcblx0XHRcdGlmICh3aWR0aCsrID09PSBjb25maWcubWF4V2lkdGgpIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwi4oCmXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0cmVzdWx0ICs9IHByaW50ZXIoY3VycmVudC52YWx1ZSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcblx0XHRcdGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0XHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gYCwke2NvbmZpZy5zcGFjaW5nSW5uZXJ9YDtcblx0XHRcdH0gZWxzZSBpZiAoIWNvbmZpZy5taW4pIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwiLFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKipcbiogUmV0dXJuIGl0ZW1zIChmb3IgZXhhbXBsZSwgb2YgYW4gYXJyYXkpXG4qIHdpdGggc3BhY2luZywgaW5kZW50YXRpb24sIGFuZCBjb21tYVxuKiB3aXRob3V0IHN1cnJvdW5kaW5nIHB1bmN0dWF0aW9uIChmb3IgZXhhbXBsZSwgYnJhY2tldHMpXG4qL1xuZnVuY3Rpb24gcHJpbnRMaXN0SXRlbXMobGlzdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGxpc3QgPSBsaXN0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBuZXcgRGF0YVZpZXcobGlzdCkgOiBsaXN0O1xuXHRjb25zdCBpc0RhdGFWaWV3ID0gKGwpID0+IGwgaW5zdGFuY2VvZiBEYXRhVmlldztcblx0Y29uc3QgbGVuZ3RoID0gaXNEYXRhVmlldyhsaXN0KSA/IGxpc3QuYnl0ZUxlbmd0aCA6IGxpc3QubGVuZ3RoO1xuXHRpZiAobGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRyZXN1bHQgKz0gaW5kZW50YXRpb25OZXh0O1xuXHRcdFx0aWYgKGkgPT09IGNvbmZpZy5tYXhXaWR0aCkge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCLigKZcIjtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNEYXRhVmlldyhsaXN0KSB8fCBpIGluIGxpc3QpIHtcblx0XHRcdFx0cmVzdWx0ICs9IHByaW50ZXIoaXNEYXRhVmlldyhsaXN0KSA/IGxpc3QuZ2V0SW50OChpKSA6IGxpc3RbaV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoaSA8IGxlbmd0aCAtIDEpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGAsJHtjb25maWcuc3BhY2luZ0lubmVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBcIixcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4qIFJldHVybiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdFxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNlcylcbiovXG5mdW5jdGlvbiBwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuXHRsZXQgcmVzdWx0ID0gXCJcIjtcblx0Y29uc3Qga2V5cyA9IGdldEtleXNPZkVudW1lcmFibGVQcm9wZXJ0aWVzKHZhbCwgY29uZmlnLmNvbXBhcmVLZXlzKTtcblx0aWYgKGtleXMubGVuZ3RoID4gMCkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbaV07XG5cdFx0XHRjb25zdCBuYW1lID0gcHJpbnRlcihrZXksIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHByaW50ZXIodmFsW2tleV0sIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRyZXN1bHQgKz0gYCR7aW5kZW50YXRpb25OZXh0ICsgbmFtZX06ICR7dmFsdWV9YDtcblx0XHRcdGlmIChpIDwga2V5cy5sZW5ndGggLSAxKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBgLCR7Y29uZmlnLnNwYWNpbmdJbm5lcn1gO1xuXHRcdFx0fSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCIsXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cblxuY29uc3QgYXN5bW1ldHJpY01hdGNoZXIgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciA/IFN5bWJvbC5mb3IoXCJqZXN0LmFzeW1tZXRyaWNNYXRjaGVyXCIpIDogMTI2NzYyMTtcbmNvbnN0IFNQQUNFJDIgPSBcIiBcIjtcbmNvbnN0IHNlcmlhbGl6ZSQ1ID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcblx0Y29uc3Qgc3RyaW5nZWRWYWx1ZSA9IHZhbC50b1N0cmluZygpO1xuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJBcnJheUNvbnRhaW5pbmdcIiB8fCBzdHJpbmdlZFZhbHVlID09PSBcIkFycmF5Tm90Q29udGFpbmluZ1wiKSB7XG5cdFx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRcdHJldHVybiBgWyR7c3RyaW5nZWRWYWx1ZX1dYDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke3N0cmluZ2VkVmFsdWUgKyBTUEFDRSQyfVske3ByaW50TGlzdEl0ZW1zKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYDtcblx0fVxuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJPYmplY3RDb250YWluaW5nXCIgfHwgc3RyaW5nZWRWYWx1ZSA9PT0gXCJPYmplY3ROb3RDb250YWluaW5nXCIpIHtcblx0XHRpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuXHRcdFx0cmV0dXJuIGBbJHtzdHJpbmdlZFZhbHVlfV1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7c3RyaW5nZWRWYWx1ZSArIFNQQUNFJDJ9eyR7cHJpbnRPYmplY3RQcm9wZXJ0aWVzKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcblx0fVxuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJTdHJpbmdNYXRjaGluZ1wiIHx8IHN0cmluZ2VkVmFsdWUgPT09IFwiU3RyaW5nTm90TWF0Y2hpbmdcIikge1xuXHRcdHJldHVybiBzdHJpbmdlZFZhbHVlICsgU1BBQ0UkMiArIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpO1xuXHR9XG5cdGlmIChzdHJpbmdlZFZhbHVlID09PSBcIlN0cmluZ0NvbnRhaW5pbmdcIiB8fCBzdHJpbmdlZFZhbHVlID09PSBcIlN0cmluZ05vdENvbnRhaW5pbmdcIikge1xuXHRcdHJldHVybiBzdHJpbmdlZFZhbHVlICsgU1BBQ0UkMiArIHByaW50ZXIodmFsLnNhbXBsZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpO1xuXHR9XG5cdGlmICh0eXBlb2YgdmFsLnRvQXN5bW1ldHJpY01hdGNoZXIgIT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYEFzeW1tZXRyaWMgbWF0Y2hlciAke3ZhbC5jb25zdHJ1Y3Rvci5uYW1lfSBkb2VzIG5vdCBpbXBsZW1lbnQgdG9Bc3ltbWV0cmljTWF0Y2hlcigpYCk7XG5cdH1cblx0cmV0dXJuIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyKCk7XG59O1xuY29uc3QgdGVzdCQ1ID0gKHZhbCkgPT4gdmFsICYmIHZhbC4kJHR5cGVvZiA9PT0gYXN5bW1ldHJpY01hdGNoZXI7XG5jb25zdCBwbHVnaW4kNSA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkNSxcblx0dGVzdDogdGVzdCQ1XG59O1xuXG5jb25zdCBTUEFDRSQxID0gXCIgXCI7XG5jb25zdCBPQkpFQ1RfTkFNRVMgPSBuZXcgU2V0KFtcIkRPTVN0cmluZ01hcFwiLCBcIk5hbWVkTm9kZU1hcFwiXSk7XG5jb25zdCBBUlJBWV9SRUdFWFAgPSAvXig/OkhUTUxcXHcqQ29sbGVjdGlvbnxOb2RlTGlzdCkkLztcbmZ1bmN0aW9uIHRlc3ROYW1lKG5hbWUpIHtcblx0cmV0dXJuIE9CSkVDVF9OQU1FUy5oYXMobmFtZSkgfHwgQVJSQVlfUkVHRVhQLnRlc3QobmFtZSk7XG59XG5jb25zdCB0ZXN0JDQgPSAodmFsKSA9PiB2YWwgJiYgdmFsLmNvbnN0cnVjdG9yICYmICEhdmFsLmNvbnN0cnVjdG9yLm5hbWUgJiYgdGVzdE5hbWUodmFsLmNvbnN0cnVjdG9yLm5hbWUpO1xuZnVuY3Rpb24gaXNOYW1lZE5vZGVNYXAoY29sbGVjdGlvbikge1xuXHRyZXR1cm4gY29sbGVjdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk5hbWVkTm9kZU1hcFwiO1xufVxuY29uc3Qgc2VyaWFsaXplJDQgPSAoY29sbGVjdGlvbiwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcblx0Y29uc3QgbmFtZSA9IGNvbGxlY3Rpb24uY29uc3RydWN0b3IubmFtZTtcblx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRyZXR1cm4gYFske25hbWV9XWA7XG5cdH1cblx0cmV0dXJuIChjb25maWcubWluID8gXCJcIiA6IG5hbWUgKyBTUEFDRSQxKSArIChPQkpFQ1RfTkFNRVMuaGFzKG5hbWUpID8gYHske3ByaW50T2JqZWN0UHJvcGVydGllcyhpc05hbWVkTm9kZU1hcChjb2xsZWN0aW9uKSA/IFsuLi5jb2xsZWN0aW9uXS5yZWR1Y2UoKHByb3BzLCBhdHRyaWJ1dGUpID0+IHtcblx0XHRwcm9wc1thdHRyaWJ1dGUubmFtZV0gPSBhdHRyaWJ1dGUudmFsdWU7XG5cdFx0cmV0dXJuIHByb3BzO1xuXHR9LCB7fSkgOiB7IC4uLmNvbGxlY3Rpb24gfSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gIDogYFske3ByaW50TGlzdEl0ZW1zKFsuLi5jb2xsZWN0aW9uXSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfV1gKTtcbn07XG5jb25zdCBwbHVnaW4kNCA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkNCxcblx0dGVzdDogdGVzdCQ0XG59O1xuXG4vKipcbiogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbipcbiogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4qIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiovXG5mdW5jdGlvbiBlc2NhcGVIVE1MKHN0cikge1xuXHRyZXR1cm4gc3RyLnJlcGxhY2VBbGwoXCI8XCIsIFwiJmx0O1wiKS5yZXBsYWNlQWxsKFwiPlwiLCBcIiZndDtcIik7XG59XG5cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYga2V5cyBpcyBlbXB0eS5cbmZ1bmN0aW9uIHByaW50UHJvcHMoa2V5cywgcHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0Y29uc3QgY29sb3JzID0gY29uZmlnLmNvbG9ycztcblx0cmV0dXJuIGtleXMubWFwKChrZXkpID0+IHtcblx0XHRjb25zdCB2YWx1ZSA9IHByb3BzW2tleV07XG5cdFx0Ly8gaGlkZGVuIGluamVjdGVkIHZhbHVlIHRoYXQgc2hvdWxkIG5vdCBiZSBwcmludGVkXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiB2YWx1ZVswXSA9PT0gXCJfXCIgJiYgdmFsdWUuc3RhcnRzV2l0aChcIl9fdml0ZXN0X1wiKSAmJiB2YWx1ZS5tYXRjaCgvX192aXRlc3RfXFxkK19fLykpIHtcblx0XHRcdHJldHVybiBcIlwiO1xuXHRcdH1cblx0XHRsZXQgcHJpbnRlZCA9IHByaW50ZXIodmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0aWYgKHByaW50ZWQuaW5jbHVkZXMoXCJcXG5cIikpIHtcblx0XHRcdFx0cHJpbnRlZCA9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbk5leHQgKyBwcmludGVkICsgY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHRcdFx0fVxuXHRcdFx0cHJpbnRlZCA9IGB7JHtwcmludGVkfX1gO1xuXHRcdH1cblx0XHRyZXR1cm4gYCR7Y29uZmlnLnNwYWNpbmdJbm5lciArIGluZGVudGF0aW9uICsgY29sb3JzLnByb3Aub3BlbiArIGtleSArIGNvbG9ycy5wcm9wLmNsb3NlfT0ke2NvbG9ycy52YWx1ZS5vcGVufSR7cHJpbnRlZH0ke2NvbG9ycy52YWx1ZS5jbG9zZX1gO1xuXHR9KS5qb2luKFwiXCIpO1xufVxuLy8gUmV0dXJuIGVtcHR5IHN0cmluZyBpZiBjaGlsZHJlbiBpcyBlbXB0eS5cbmZ1bmN0aW9uIHByaW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdHJldHVybiBjaGlsZHJlbi5tYXAoKGNoaWxkKSA9PiBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb24gKyAodHlwZW9mIGNoaWxkID09PSBcInN0cmluZ1wiID8gcHJpbnRUZXh0KGNoaWxkLCBjb25maWcpIDogcHJpbnRlcihjaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpKSkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHByaW50U2hhZG93Um9vdChjaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0aWYgKGNvbmZpZy5wcmludFNoYWRvd1Jvb3QgPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIFwiXCI7XG5cdH1cblx0cmV0dXJuIFtgJHtjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb259I3NoYWRvdy1yb290YCwgcHJpbnRDaGlsZHJlbihjaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKV0uam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIHByaW50VGV4dCh0ZXh0LCBjb25maWcpIHtcblx0Y29uc3QgY29udGVudENvbG9yID0gY29uZmlnLmNvbG9ycy5jb250ZW50O1xuXHRyZXR1cm4gY29udGVudENvbG9yLm9wZW4gKyBlc2NhcGVIVE1MKHRleHQpICsgY29udGVudENvbG9yLmNsb3NlO1xufVxuZnVuY3Rpb24gcHJpbnRDb21tZW50KGNvbW1lbnQsIGNvbmZpZykge1xuXHRjb25zdCBjb21tZW50Q29sb3IgPSBjb25maWcuY29sb3JzLmNvbW1lbnQ7XG5cdHJldHVybiBgJHtjb21tZW50Q29sb3Iub3Blbn08IS0tJHtlc2NhcGVIVE1MKGNvbW1lbnQpfS0tPiR7Y29tbWVudENvbG9yLmNsb3NlfWA7XG59XG4vLyBTZXBhcmF0ZSB0aGUgZnVuY3Rpb25zIHRvIGZvcm1hdCBwcm9wcywgY2hpbGRyZW4sIGFuZCBlbGVtZW50LFxuLy8gc28gYSBwbHVnaW4gY291bGQgb3ZlcnJpZGUgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLCBpZiBuZWVkZWQuXG4vLyBUb28gYmFkLCBzbyBzYWQ6IHRoZSB0cmFkaXRpb25hbCAoYnV0IHVubmVjZXNzYXJ5KSBzcGFjZVxuLy8gaW4gYSBzZWxmLWNsb3NpbmcgdGFnQ29sb3IgcmVxdWlyZXMgYSBzZWNvbmQgdGVzdCBvZiBwcmludGVkUHJvcHMuXG5mdW5jdGlvbiBwcmludEVsZW1lbnQodHlwZSwgcHJpbnRlZFByb3BzLCBwcmludGVkQ2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24pIHtcblx0Y29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcblx0cmV0dXJuIGAke3RhZ0NvbG9yLm9wZW59PCR7dHlwZX0ke3ByaW50ZWRQcm9wcyAmJiB0YWdDb2xvci5jbG9zZSArIHByaW50ZWRQcm9wcyArIGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbiArIHRhZ0NvbG9yLm9wZW59JHtwcmludGVkQ2hpbGRyZW4gPyBgPiR7dGFnQ29sb3IuY2xvc2V9JHtwcmludGVkQ2hpbGRyZW59JHtjb25maWcuc3BhY2luZ091dGVyfSR7aW5kZW50YXRpb259JHt0YWdDb2xvci5vcGVufTwvJHt0eXBlfWAgOiBgJHtwcmludGVkUHJvcHMgJiYgIWNvbmZpZy5taW4gPyBcIlwiIDogXCIgXCJ9L2B9PiR7dGFnQ29sb3IuY2xvc2V9YDtcbn1cbmZ1bmN0aW9uIHByaW50RWxlbWVudEFzTGVhZih0eXBlLCBjb25maWcpIHtcblx0Y29uc3QgdGFnQ29sb3IgPSBjb25maWcuY29sb3JzLnRhZztcblx0cmV0dXJuIGAke3RhZ0NvbG9yLm9wZW59PCR7dHlwZX0ke3RhZ0NvbG9yLmNsb3NlfSDigKYke3RhZ0NvbG9yLm9wZW59IC8+JHt0YWdDb2xvci5jbG9zZX1gO1xufVxuXG5jb25zdCBFTEVNRU5UX05PREUgPSAxO1xuY29uc3QgVEVYVF9OT0RFID0gMztcbmNvbnN0IENPTU1FTlRfTk9ERSA9IDg7XG5jb25zdCBGUkFHTUVOVF9OT0RFID0gMTE7XG5jb25zdCBFTEVNRU5UX1JFR0VYUCA9IC9eKD86KD86SFRNTHxTVkcpXFx3Kik/RWxlbWVudCQvO1xuZnVuY3Rpb24gdGVzdEhhc0F0dHJpYnV0ZSh2YWwpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbC5oYXNBdHRyaWJ1dGUgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWwuaGFzQXR0cmlidXRlKFwiaXNcIik7XG5cdH0gY2F0Y2gge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuZnVuY3Rpb24gdGVzdE5vZGUodmFsKSB7XG5cdGNvbnN0IGNvbnN0cnVjdG9yTmFtZSA9IHZhbC5jb25zdHJ1Y3Rvci5uYW1lO1xuXHRjb25zdCB7IG5vZGVUeXBlLCB0YWdOYW1lIH0gPSB2YWw7XG5cdGNvbnN0IGlzQ3VzdG9tRWxlbWVudCA9IHR5cGVvZiB0YWdOYW1lID09PSBcInN0cmluZ1wiICYmIHRhZ05hbWUuaW5jbHVkZXMoXCItXCIpIHx8IHRlc3RIYXNBdHRyaWJ1dGUodmFsKTtcblx0cmV0dXJuIG5vZGVUeXBlID09PSBFTEVNRU5UX05PREUgJiYgKEVMRU1FTlRfUkVHRVhQLnRlc3QoY29uc3RydWN0b3JOYW1lKSB8fCBpc0N1c3RvbUVsZW1lbnQpIHx8IG5vZGVUeXBlID09PSBURVhUX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSBcIlRleHRcIiB8fCBub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFICYmIGNvbnN0cnVjdG9yTmFtZSA9PT0gXCJDb21tZW50XCIgfHwgbm9kZVR5cGUgPT09IEZSQUdNRU5UX05PREUgJiYgY29uc3RydWN0b3JOYW1lID09PSBcIkRvY3VtZW50RnJhZ21lbnRcIjtcbn1cbmNvbnN0IHRlc3QkMyA9ICh2YWwpID0+IHZhbD8uY29uc3RydWN0b3I/Lm5hbWUgJiYgdGVzdE5vZGUodmFsKTtcbmZ1bmN0aW9uIG5vZGVJc1RleHQobm9kZSkge1xuXHRyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gVEVYVF9OT0RFO1xufVxuZnVuY3Rpb24gbm9kZUlzQ29tbWVudChub2RlKSB7XG5cdHJldHVybiBub2RlLm5vZGVUeXBlID09PSBDT01NRU5UX05PREU7XG59XG5mdW5jdGlvbiBub2RlSXNGcmFnbWVudChub2RlKSB7XG5cdHJldHVybiBub2RlLm5vZGVUeXBlID09PSBGUkFHTUVOVF9OT0RFO1xufVxuZnVuY3Rpb24gZmlsdGVyQ2hpbGRyZW4oY2hpbGRyZW4sIGZpbHRlck5vZGUpIHtcblx0Ly8gRmlsdGVyIG91dCB0ZXh0IG5vZGVzIHRoYXQgb25seSBjb250YWluIHdoaXRlc3BhY2UgdG8gcHJldmVudCBlbXB0eSBsaW5lc1xuXHQvLyBUaGlzIGlzIGRvbmUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgZmlsdGVyTm9kZSBpcyBwcm92aWRlZFxuXHRsZXQgZmlsdGVyZWQgPSBjaGlsZHJlbi5maWx0ZXIoKG5vZGUpID0+IHtcblx0XHQvLyBGaWx0ZXIgb3V0IHRleHQgbm9kZXMgdGhhdCBhcmUgb25seSB3aGl0ZXNwYWNlXG5cdFx0aWYgKG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERSkge1xuXHRcdFx0Y29uc3QgdGV4dCA9IG5vZGUuZGF0YSB8fCBcIlwiO1xuXHRcdFx0Ly8gS2VlcCB0ZXh0IG5vZGVzIHRoYXQgaGF2ZSBub24td2hpdGVzcGFjZSBjb250ZW50XG5cdFx0XHRyZXR1cm4gdGV4dC50cmltKCkubGVuZ3RoID4gMDtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0pO1xuXHQvLyBBcHBseSBhZGRpdGlvbmFsIHVzZXItcHJvdmlkZWQgZmlsdGVyIGlmIHNwZWNpZmllZFxuXHRpZiAoZmlsdGVyTm9kZSkge1xuXHRcdGZpbHRlcmVkID0gZmlsdGVyZWQuZmlsdGVyKGZpbHRlck5vZGUpO1xuXHR9XG5cdHJldHVybiBmaWx0ZXJlZDtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZURPTShub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgZmlsdGVyTm9kZSkge1xuXHRpZiAobm9kZUlzVGV4dChub2RlKSkge1xuXHRcdHJldHVybiBwcmludFRleHQobm9kZS5kYXRhLCBjb25maWcpO1xuXHR9XG5cdGlmIChub2RlSXNDb21tZW50KG5vZGUpKSB7XG5cdFx0cmV0dXJuIHByaW50Q29tbWVudChub2RlLmRhdGEsIGNvbmZpZyk7XG5cdH1cblx0Y29uc3QgdHlwZSA9IG5vZGVJc0ZyYWdtZW50KG5vZGUpID8gXCJEb2N1bWVudEZyYWdtZW50XCIgOiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRyZXR1cm4gcHJpbnRFbGVtZW50QXNMZWFmKHR5cGUsIGNvbmZpZyk7XG5cdH1cblx0Y29uc3QgY2hpbGRyZW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChub2RlLmNoaWxkTm9kZXMgfHwgbm9kZS5jaGlsZHJlbik7XG5cdGNvbnN0IHNoYWRvd0NoaWxkcmVuID0gbm9kZUlzRnJhZ21lbnQobm9kZSkgfHwgIW5vZGUuc2hhZG93Um9vdCA/IFtdIDogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9kZS5zaGFkb3dSb290LmNoaWxkcmVuKTtcblx0Y29uc3QgcmVzb2x2ZWRDaGlsZHJlbiA9IGZpbHRlck5vZGUgPyBmaWx0ZXJDaGlsZHJlbihjaGlsZHJlbiwgZmlsdGVyTm9kZSkgOiBjaGlsZHJlbjtcblx0Y29uc3QgcmVzb2x2ZWRTaGFkb3dDaGlsZHJlbiA9IGZpbHRlck5vZGUgPyBmaWx0ZXJDaGlsZHJlbihzaGFkb3dDaGlsZHJlbiwgZmlsdGVyTm9kZSkgOiBzaGFkb3dDaGlsZHJlbjtcblx0cmV0dXJuIHByaW50RWxlbWVudCh0eXBlLCBwcmludFByb3BzKG5vZGVJc0ZyYWdtZW50KG5vZGUpID8gW10gOiBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcywgKGF0dHIpID0+IGF0dHIubmFtZSkuc29ydCgpLCBub2RlSXNGcmFnbWVudChub2RlKSA/IHt9IDogWy4uLm5vZGUuYXR0cmlidXRlc10ucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG5cdFx0cHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuXHRcdHJldHVybiBwcm9wcztcblx0fSwge30pLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpLCAocmVzb2x2ZWRTaGFkb3dDaGlsZHJlbi5sZW5ndGggPiAwID8gcHJpbnRTaGFkb3dSb290KHJlc29sdmVkU2hhZG93Q2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBcIlwiKSArIHByaW50Q2hpbGRyZW4ocmVzb2x2ZWRDaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKSwgY29uZmlnLCBpbmRlbnRhdGlvbik7XG59XG5jb25zdCBzZXJpYWxpemUkMyA9IChub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gc2VyaWFsaXplRE9NKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKTtcbmZ1bmN0aW9uIGNyZWF0ZURPTUVsZW1lbnRGaWx0ZXIoZmlsdGVyTm9kZSkge1xuXHRyZXR1cm4ge1xuXHRcdHRlc3Q6IHRlc3QkMyxcblx0XHRzZXJpYWxpemU6IChub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gc2VyaWFsaXplRE9NKG5vZGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBmaWx0ZXJOb2RlKVxuXHR9O1xufVxuY29uc3QgcGx1Z2luJDMgPSB7XG5cdHNlcmlhbGl6ZTogc2VyaWFsaXplJDMsXG5cdHRlc3Q6IHRlc3QkM1xufTtcblxuLy8gU0VOVElORUwgY29uc3RhbnRzIGFyZSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9pbW11dGFibGUtanNcbmNvbnN0IElTX0lURVJBQkxFX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX0lURVJBQkxFX19AQFwiO1xuY29uc3QgSVNfTElTVF9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9MSVNUX19AQFwiO1xuY29uc3QgSVNfS0VZRURfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfS0VZRURfX0BAXCI7XG5jb25zdCBJU19NQVBfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfTUFQX19AQFwiO1xuY29uc3QgSVNfT1JERVJFRF9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9PUkRFUkVEX19AQFwiO1xuY29uc3QgSVNfUkVDT1JEX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX1JFQ09SRF9fQEBcIjtcbmNvbnN0IElTX1NFUV9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9TRVFfX0BAXCI7XG5jb25zdCBJU19TRVRfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfU0VUX19AQFwiO1xuY29uc3QgSVNfU1RBQ0tfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfU1RBQ0tfX0BAXCI7XG5jb25zdCBnZXRJbW11dGFibGVOYW1lID0gKG5hbWUpID0+IGBJbW11dGFibGUuJHtuYW1lfWA7XG5jb25zdCBwcmludEFzTGVhZiA9IChuYW1lKSA9PiBgWyR7bmFtZX1dYDtcbmNvbnN0IFNQQUNFID0gXCIgXCI7XG5jb25zdCBMQVpZID0gXCLigKZcIjtcbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlRW50cmllcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCB0eXBlKSB7XG5cdHJldHVybiArK2RlcHRoID4gY29uZmlnLm1heERlcHRoID8gcHJpbnRBc0xlYWYoZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSkgOiBgJHtnZXRJbW11dGFibGVOYW1lKHR5cGUpICsgU1BBQ0V9eyR7cHJpbnRJdGVyYXRvckVudHJpZXModmFsLmVudHJpZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gO1xufVxuLy8gUmVjb3JkIGhhcyBhbiBlbnRyaWVzIG1ldGhvZCBiZWNhdXNlIGl0IGlzIGEgY29sbGVjdGlvbiBpbiBpbW11dGFibGUgdjMuXG4vLyBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIEltbXV0YWJsZSBSZWNvcmQgZnJvbSB2ZXJzaW9uIHYzIG9yIHY0LlxuZnVuY3Rpb24gZ2V0UmVjb3JkRW50cmllcyh2YWwpIHtcblx0bGV0IGkgPSAwO1xuXHRyZXR1cm4geyBuZXh0KCkge1xuXHRcdGlmIChpIDwgdmFsLl9rZXlzLmxlbmd0aCkge1xuXHRcdFx0Y29uc3Qga2V5ID0gdmFsLl9rZXlzW2krK107XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRkb25lOiBmYWxzZSxcblx0XHRcdFx0dmFsdWU6IFtrZXksIHZhbC5nZXQoa2V5KV1cblx0XHRcdH07XG5cdFx0fVxuXHRcdHJldHVybiB7XG5cdFx0XHRkb25lOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHVuZGVmaW5lZFxuXHRcdH07XG5cdH0gfTtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlUmVjb3JkKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0Ly8gX25hbWUgcHJvcGVydHkgaXMgZGVmaW5lZCBvbmx5IGZvciBhbiBJbW11dGFibGUgUmVjb3JkIGluc3RhbmNlXG5cdC8vIHdoaWNoIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGEgc2Vjb25kIG9wdGlvbmFsIGRlc2NyaXB0aXZlIG5hbWUgYXJnXG5cdGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKHZhbC5fbmFtZSB8fCBcIlJlY29yZFwiKTtcblx0cmV0dXJuICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEFzTGVhZihuYW1lKSA6IGAke25hbWUgKyBTUEFDRX17JHtwcmludEl0ZXJhdG9yRW50cmllcyhnZXRSZWNvcmRFbnRyaWVzKHZhbCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlU2VxKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0Y29uc3QgbmFtZSA9IGdldEltbXV0YWJsZU5hbWUoXCJTZXFcIik7XG5cdGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG5cdFx0cmV0dXJuIHByaW50QXNMZWFmKG5hbWUpO1xuXHR9XG5cdGlmICh2YWxbSVNfS0VZRURfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIGAke25hbWUgKyBTUEFDRX17JHt2YWwuX2l0ZXIgfHwgdmFsLl9vYmplY3QgPyBwcmludEl0ZXJhdG9yRW50cmllcyh2YWwuZW50cmllcygpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBMQVpZfX1gO1xuXHR9XG5cdHJldHVybiBgJHtuYW1lICsgU1BBQ0V9WyR7dmFsLl9pdGVyIHx8IHZhbC5fYXJyYXkgfHwgdmFsLl9jb2xsZWN0aW9uIHx8IHZhbC5faXRlcmFibGUgPyBwcmludEl0ZXJhdG9yVmFsdWVzKHZhbC52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogTEFaWX1dYDtcbn1cbmZ1bmN0aW9uIHByaW50SW1tdXRhYmxlVmFsdWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHR5cGUpIHtcblx0cmV0dXJuICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEFzTGVhZihnZXRJbW11dGFibGVOYW1lKHR5cGUpKSA6IGAke2dldEltbXV0YWJsZU5hbWUodHlwZSkgKyBTUEFDRX1bJHtwcmludEl0ZXJhdG9yVmFsdWVzKHZhbC52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfV1gO1xufVxuY29uc3Qgc2VyaWFsaXplJDIgPSAodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4ge1xuXHRpZiAodmFsW0lTX01BUF9TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVFbnRyaWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/IFwiT3JkZXJlZE1hcFwiIDogXCJNYXBcIik7XG5cdH1cblx0aWYgKHZhbFtJU19MSVNUX1NFTlRJTkVMXSkge1xuXHRcdHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBcIkxpc3RcIik7XG5cdH1cblx0aWYgKHZhbFtJU19TRVRfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIHZhbFtJU19PUkRFUkVEX1NFTlRJTkVMXSA/IFwiT3JkZXJlZFNldFwiIDogXCJTZXRcIik7XG5cdH1cblx0aWYgKHZhbFtJU19TVEFDS19TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVWYWx1ZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgXCJTdGFja1wiKTtcblx0fVxuXHRpZiAodmFsW0lTX1NFUV9TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVTZXEodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG5cdH1cblx0Ly8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBpbW11dGFibGUgdjMgYW5kIHY0LCBsZXQgcmVjb3JkIGJlIHRoZSBkZWZhdWx0LlxuXHRyZXR1cm4gcHJpbnRJbW11dGFibGVSZWNvcmQodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG59O1xuLy8gRXhwbGljaXRseSBjb21wYXJpbmcgc2VudGluZWwgcHJvcGVydGllcyB0byB0cnVlIGF2b2lkcyBmYWxzZSBwb3NpdGl2ZVxuLy8gd2hlbiBtb2NrIGlkZW50aXR5LW9iai1wcm94eSByZXR1cm5zIHRoZSBrZXkgYXMgdGhlIHZhbHVlIGZvciBhbnkga2V5LlxuY29uc3QgdGVzdCQyID0gKHZhbCkgPT4gdmFsICYmICh2YWxbSVNfSVRFUkFCTEVfU0VOVElORUxdID09PSB0cnVlIHx8IHZhbFtJU19SRUNPUkRfU0VOVElORUxdID09PSB0cnVlKTtcbmNvbnN0IHBsdWdpbiQyID0ge1xuXHRzZXJpYWxpemU6IHNlcmlhbGl6ZSQyLFxuXHR0ZXN0OiB0ZXN0JDJcbn07XG5cbmZ1bmN0aW9uIGdldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHgpIHtcblx0cmV0dXJuIHggJiYgeC5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LCBcImRlZmF1bHRcIikgPyB4W1wiZGVmYXVsdFwiXSA6IHg7XG59XG5cbnZhciByZWFjdElzJDEgPSB7ZXhwb3J0czoge319O1xuXG52YXIgcmVhY3RJc19wcm9kdWN0aW9uID0ge307XG5cbi8qKlxuICogQGxpY2Vuc2UgUmVhY3RcbiAqIHJlYWN0LWlzLnByb2R1Y3Rpb24uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIE1ldGEgUGxhdGZvcm1zLCBJbmMuIGFuZCBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbjtcblxuZnVuY3Rpb24gcmVxdWlyZVJlYWN0SXNfcHJvZHVjdGlvbiAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbikgcmV0dXJuIHJlYWN0SXNfcHJvZHVjdGlvbjtcblx0aGFzUmVxdWlyZWRSZWFjdElzX3Byb2R1Y3Rpb24gPSAxO1xuXHR2YXIgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuXHQgIFJFQUNUX1BPUlRBTF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnBvcnRhbFwiKSxcblx0ICBSRUFDVF9GUkFHTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLFxuXHQgIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksXG5cdCAgUkVBQ1RfUFJPRklMRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wcm9maWxlclwiKSxcblx0ICBSRUFDVF9DT05TVU1FUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmNvbnN1bWVyXCIpLFxuXHQgIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLFxuXHQgIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksXG5cdCAgUkVBQ1RfU1VTUEVOU0VfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxcblx0ICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxcblx0ICBSRUFDVF9NRU1PX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubWVtb1wiKSxcblx0ICBSRUFDVF9MQVpZX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSxcblx0ICBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC52aWV3X3RyYW5zaXRpb25cIiksXG5cdCAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpO1xuXHRmdW5jdGlvbiB0eXBlT2Yob2JqZWN0KSB7XG5cdCAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiBvYmplY3QgJiYgbnVsbCAhPT0gb2JqZWN0KSB7XG5cdCAgICB2YXIgJCR0eXBlb2YgPSBvYmplY3QuJCR0eXBlb2Y7XG5cdCAgICBzd2l0Y2ggKCQkdHlwZW9mKSB7XG5cdCAgICAgIGNhc2UgUkVBQ1RfRUxFTUVOVF9UWVBFOlxuXHQgICAgICAgIHN3aXRjaCAoKChvYmplY3QgPSBvYmplY3QudHlwZSksIG9iamVjdCkpIHtcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfRlJBR01FTlRfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1RSSUNUX01PREVfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFOlxuXHQgICAgICAgICAgY2FzZSBSRUFDVF9WSUVXX1RSQU5TSVRJT05fVFlQRTpcblx0ICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcblx0ICAgICAgICAgIGRlZmF1bHQ6XG5cdCAgICAgICAgICAgIHN3aXRjaCAoKChvYmplY3QgPSBvYmplY3QgJiYgb2JqZWN0LiQkdHlwZW9mKSwgb2JqZWN0KSkge1xuXHQgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OVEVYVF9UWVBFOlxuXHQgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTpcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX0xBWllfVFlQRTpcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX01FTU9fVFlQRTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG5cdCAgICAgICAgICAgICAgY2FzZSBSRUFDVF9DT05TVU1FUl9UWVBFOlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcblx0ICAgICAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICAgICAgcmV0dXJuICQkdHlwZW9mO1xuXHQgICAgICAgICAgICB9XG5cdCAgICAgICAgfVxuXHQgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuXHQgICAgICAgIHJldHVybiAkJHR5cGVvZjtcblx0ICAgIH1cblx0ICB9XG5cdH1cblx0cmVhY3RJc19wcm9kdWN0aW9uLkNvbnRleHRDb25zdW1lciA9IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5Db250ZXh0UHJvdmlkZXIgPSBSRUFDVF9DT05URVhUX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5FbGVtZW50ID0gUkVBQ1RfRUxFTUVOVF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uRm9yd2FyZFJlZiA9IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5GcmFnbWVudCA9IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5MYXp5ID0gUkVBQ1RfTEFaWV9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uTWVtbyA9IFJFQUNUX01FTU9fVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLlBvcnRhbCA9IFJFQUNUX1BPUlRBTF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uUHJvZmlsZXIgPSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uU3RyaWN0TW9kZSA9IFJFQUNUX1NUUklDVF9NT0RFX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5TdXNwZW5zZSA9IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5TdXNwZW5zZUxpc3QgPSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0NvbnRleHRDb25zdW1lciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlNVTUVSX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0NvbnRleHRQcm92aWRlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0NPTlRFWFRfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzRWxlbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gKFxuXHQgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG9iamVjdCAmJlxuXHQgICAgbnVsbCAhPT0gb2JqZWN0ICYmXG5cdCAgICBvYmplY3QuJCR0eXBlb2YgPT09IFJFQUNUX0VMRU1FTlRfVFlQRVxuXHQgICk7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0ZvcndhcmRSZWYgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNGcmFnbWVudCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0xhenkgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9MQVpZX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc01lbW8gPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9NRU1PX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1BvcnRhbCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BPUlRBTF9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNQcm9maWxlciA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1BST0ZJTEVSX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1N0cmljdE1vZGUgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNTdXNwZW5zZSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1N1c3BlbnNlTGlzdCA9IGZ1bmN0aW9uIChvYmplY3QpIHtcblx0ICByZXR1cm4gdHlwZU9mKG9iamVjdCkgPT09IFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzVmFsaWRFbGVtZW50VHlwZSA9IGZ1bmN0aW9uICh0eXBlKSB7XG5cdCAgcmV0dXJuIFwic3RyaW5nXCIgPT09IHR5cGVvZiB0eXBlIHx8XG5cdCAgICBcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFIHx8XG5cdCAgICB0eXBlID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgfHxcblx0ICAgIChcIm9iamVjdFwiID09PSB0eXBlb2YgdHlwZSAmJlxuXHQgICAgICBudWxsICE9PSB0eXBlICYmXG5cdCAgICAgICh0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9MQVpZX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9NRU1PX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05URVhUX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DT05TVU1FUl9UWVBFIHx8XG5cdCAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSB8fFxuXHQgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgfHxcblx0ICAgICAgICB2b2lkIDAgIT09IHR5cGUuZ2V0TW9kdWxlSWQpKVxuXHQgICAgPyB0cnVlXG5cdCAgICA6IGZhbHNlO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24udHlwZU9mID0gdHlwZU9mO1xuXHRyZXR1cm4gcmVhY3RJc19wcm9kdWN0aW9uO1xufVxuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzJDE7XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWFjdElzJDEgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRSZWFjdElzJDEpIHJldHVybiByZWFjdElzJDEuZXhwb3J0cztcblx0aGFzUmVxdWlyZWRSZWFjdElzJDEgPSAxO1xuXG5cdHtcblx0ICByZWFjdElzJDEuZXhwb3J0cyA9IHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb24oKTtcblx0fVxuXHRyZXR1cm4gcmVhY3RJcyQxLmV4cG9ydHM7XG59XG5cbnZhciByZWFjdElzRXhwb3J0cyQxID0gcmVxdWlyZVJlYWN0SXMkMSgpO1xudmFyIGluZGV4JDEgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVhY3RJc0V4cG9ydHMkMSk7XG5cbnZhciBSZWFjdElzMTkgPSAvKiNfX1BVUkVfXyovX21lcmdlTmFtZXNwYWNlcyh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDogaW5kZXgkMVxufSwgW3JlYWN0SXNFeHBvcnRzJDFdKTtcblxudmFyIHJlYWN0SXMgPSB7ZXhwb3J0czoge319O1xuXG52YXIgcmVhY3RJc19wcm9kdWN0aW9uX21pbiA9IHt9O1xuXG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLm1pbi5qc1xuICpcbiAqIENvcHlyaWdodCAoYykgRmFjZWJvb2ssIEluYy4gYW5kIGl0cyBhZmZpbGlhdGVzLlxuICpcbiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciBoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbl9taW47XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb25fbWluICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkUmVhY3RJc19wcm9kdWN0aW9uX21pbikgcmV0dXJuIHJlYWN0SXNfcHJvZHVjdGlvbl9taW47XG5cdGhhc1JlcXVpcmVkUmVhY3RJc19wcm9kdWN0aW9uX21pbiA9IDE7XG52YXIgYj1TeW1ib2wuZm9yKFwicmVhY3QuZWxlbWVudFwiKSxjPVN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksZD1TeW1ib2wuZm9yKFwicmVhY3QuZnJhZ21lbnRcIiksZT1TeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksZj1TeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIiksZz1TeW1ib2wuZm9yKFwicmVhY3QucHJvdmlkZXJcIiksaD1TeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxrPVN5bWJvbC5mb3IoXCJyZWFjdC5zZXJ2ZXJfY29udGV4dFwiKSxsPVN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxtPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZVwiKSxuPVN5bWJvbC5mb3IoXCJyZWFjdC5zdXNwZW5zZV9saXN0XCIpLHA9U3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIikscT1TeW1ib2wuZm9yKFwicmVhY3QubGF6eVwiKSx0PVN5bWJvbC5mb3IoXCJyZWFjdC5vZmZzY3JlZW5cIiksdTt1PVN5bWJvbC5mb3IoXCJyZWFjdC5tb2R1bGUucmVmZXJlbmNlXCIpO1xuXHRmdW5jdGlvbiB2KGEpe2lmKFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEpe3ZhciByPWEuJCR0eXBlb2Y7c3dpdGNoKHIpe2Nhc2UgYjpzd2l0Y2goYT1hLnR5cGUsYSl7Y2FzZSBkOmNhc2UgZjpjYXNlIGU6Y2FzZSBtOmNhc2UgbjpyZXR1cm4gYTtkZWZhdWx0OnN3aXRjaChhPWEmJmEuJCR0eXBlb2YsYSl7Y2FzZSBrOmNhc2UgaDpjYXNlIGw6Y2FzZSBxOmNhc2UgcDpjYXNlIGc6cmV0dXJuIGE7ZGVmYXVsdDpyZXR1cm4gcn19Y2FzZSBjOnJldHVybiByfX19cmVhY3RJc19wcm9kdWN0aW9uX21pbi5Db250ZXh0Q29uc3VtZXI9aDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkNvbnRleHRQcm92aWRlcj1nO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRWxlbWVudD1iO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRm9yd2FyZFJlZj1sO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uRnJhZ21lbnQ9ZDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkxhenk9cTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLk1lbW89cDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlBvcnRhbD1jO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uUHJvZmlsZXI9ZjtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlN0cmljdE1vZGU9ZTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlN1c3BlbnNlPW07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbl9taW4uU3VzcGVuc2VMaXN0PW47cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0FzeW5jTW9kZT1mdW5jdGlvbigpe3JldHVybiAgZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNDb25jdXJyZW50TW9kZT1mdW5jdGlvbigpe3JldHVybiAgZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNDb250ZXh0Q29uc3VtZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1ofTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzQ29udGV4dFByb3ZpZGVyPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09Z307cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0VsZW1lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJmEuJCR0eXBlb2Y9PT1ifTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzRm9yd2FyZFJlZj1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWx9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNGcmFnbWVudD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWR9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNMYXp5PWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09cX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc01lbW89ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1wfTtcblx0cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1BvcnRhbD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWN9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNQcm9maWxlcj1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWZ9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNTdHJpY3RNb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09ZX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1N1c3BlbnNlPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09bX07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1N1c3BlbnNlTGlzdD1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PW59O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzVmFsaWRFbGVtZW50VHlwZT1mdW5jdGlvbihhKXtyZXR1cm4gXCJzdHJpbmdcIj09PXR5cGVvZiBhfHxcImZ1bmN0aW9uXCI9PT10eXBlb2YgYXx8YT09PWR8fGE9PT1mfHxhPT09ZXx8YT09PW18fGE9PT1ufHxhPT09dHx8XCJvYmplY3RcIj09PXR5cGVvZiBhJiZudWxsIT09YSYmKGEuJCR0eXBlb2Y9PT1xfHxhLiQkdHlwZW9mPT09cHx8YS4kJHR5cGVvZj09PWd8fGEuJCR0eXBlb2Y9PT1ofHxhLiQkdHlwZW9mPT09bHx8YS4kJHR5cGVvZj09PXV8fHZvaWQgMCE9PWEuZ2V0TW9kdWxlSWQpP3RydWU6ZmFsc2V9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4udHlwZU9mPXY7XG5cdHJldHVybiByZWFjdElzX3Byb2R1Y3Rpb25fbWluO1xufVxuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzO1xuXG5mdW5jdGlvbiByZXF1aXJlUmVhY3RJcyAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFJlYWN0SXMpIHJldHVybiByZWFjdElzLmV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkUmVhY3RJcyA9IDE7XG5cblx0e1xuXHQgIHJlYWN0SXMuZXhwb3J0cyA9IHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb25fbWluKCk7XG5cdH1cblx0cmV0dXJuIHJlYWN0SXMuZXhwb3J0cztcbn1cblxudmFyIHJlYWN0SXNFeHBvcnRzID0gcmVxdWlyZVJlYWN0SXMoKTtcbnZhciBpbmRleCA9IC8qQF9fUFVSRV9fKi9nZXREZWZhdWx0RXhwb3J0RnJvbUNqcyhyZWFjdElzRXhwb3J0cyk7XG5cbnZhciBSZWFjdElzMTggPSAvKiNfX1BVUkVfXyovX21lcmdlTmFtZXNwYWNlcyh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDogaW5kZXhcbn0sIFtyZWFjdElzRXhwb3J0c10pO1xuXG5jb25zdCByZWFjdElzTWV0aG9kcyA9IFtcblx0XCJpc0FzeW5jTW9kZVwiLFxuXHRcImlzQ29uY3VycmVudE1vZGVcIixcblx0XCJpc0NvbnRleHRDb25zdW1lclwiLFxuXHRcImlzQ29udGV4dFByb3ZpZGVyXCIsXG5cdFwiaXNFbGVtZW50XCIsXG5cdFwiaXNGb3J3YXJkUmVmXCIsXG5cdFwiaXNGcmFnbWVudFwiLFxuXHRcImlzTGF6eVwiLFxuXHRcImlzTWVtb1wiLFxuXHRcImlzUG9ydGFsXCIsXG5cdFwiaXNQcm9maWxlclwiLFxuXHRcImlzU3RyaWN0TW9kZVwiLFxuXHRcImlzU3VzcGVuc2VcIixcblx0XCJpc1N1c3BlbnNlTGlzdFwiLFxuXHRcImlzVmFsaWRFbGVtZW50VHlwZVwiXG5dO1xuY29uc3QgUmVhY3RJcyA9IE9iamVjdC5mcm9tRW50cmllcyhyZWFjdElzTWV0aG9kcy5tYXAoKG0pID0+IFttLCAodikgPT4gUmVhY3RJczE4W21dKHYpIHx8IFJlYWN0SXMxOVttXSh2KV0pKTtcbi8vIEdpdmVuIGVsZW1lbnQucHJvcHMuY2hpbGRyZW4sIG9yIHN1YnRyZWUgZHVyaW5nIHJlY3Vyc2l2ZSB0cmF2ZXJzYWwsXG4vLyByZXR1cm4gZmxhdHRlbmVkIGFycmF5IG9mIGNoaWxkcmVuLlxuZnVuY3Rpb24gZ2V0Q2hpbGRyZW4oYXJnLCBjaGlsZHJlbiA9IFtdKSB7XG5cdGlmIChBcnJheS5pc0FycmF5KGFyZykpIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW0gb2YgYXJnKSB7XG5cdFx0XHRnZXRDaGlsZHJlbihpdGVtLCBjaGlsZHJlbik7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKGFyZyAhPSBudWxsICYmIGFyZyAhPT0gZmFsc2UgJiYgYXJnICE9PSBcIlwiKSB7XG5cdFx0Y2hpbGRyZW4ucHVzaChhcmcpO1xuXHR9XG5cdHJldHVybiBjaGlsZHJlbjtcbn1cbmZ1bmN0aW9uIGdldFR5cGUoZWxlbWVudCkge1xuXHRjb25zdCB0eXBlID0gZWxlbWVudC50eXBlO1xuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gdHlwZTtcblx0fVxuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHJldHVybiB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBcIlVua25vd25cIjtcblx0fVxuXHRpZiAoUmVhY3RJcy5pc0ZyYWdtZW50KGVsZW1lbnQpKSB7XG5cdFx0cmV0dXJuIFwiUmVhY3QuRnJhZ21lbnRcIjtcblx0fVxuXHRpZiAoUmVhY3RJcy5pc1N1c3BlbnNlKGVsZW1lbnQpKSB7XG5cdFx0cmV0dXJuIFwiUmVhY3QuU3VzcGVuc2VcIjtcblx0fVxuXHRpZiAodHlwZW9mIHR5cGUgPT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gbnVsbCkge1xuXHRcdGlmIChSZWFjdElzLmlzQ29udGV4dFByb3ZpZGVyKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm4gXCJDb250ZXh0LlByb3ZpZGVyXCI7XG5cdFx0fVxuXHRcdGlmIChSZWFjdElzLmlzQ29udGV4dENvbnN1bWVyKGVsZW1lbnQpKSB7XG5cdFx0XHRyZXR1cm4gXCJDb250ZXh0LkNvbnN1bWVyXCI7XG5cdFx0fVxuXHRcdGlmIChSZWFjdElzLmlzRm9yd2FyZFJlZihlbGVtZW50KSkge1xuXHRcdFx0aWYgKHR5cGUuZGlzcGxheU5hbWUpIHtcblx0XHRcdFx0cmV0dXJuIHR5cGUuZGlzcGxheU5hbWU7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLnJlbmRlci5kaXNwbGF5TmFtZSB8fCB0eXBlLnJlbmRlci5uYW1lIHx8IFwiXCI7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb25OYW1lID09PSBcIlwiID8gXCJGb3J3YXJkUmVmXCIgOiBgRm9yd2FyZFJlZigke2Z1bmN0aW9uTmFtZX0pYDtcblx0XHR9XG5cdFx0aWYgKFJlYWN0SXMuaXNNZW1vKGVsZW1lbnQpKSB7XG5cdFx0XHRjb25zdCBmdW5jdGlvbk5hbWUgPSB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUudHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUubmFtZSB8fCBcIlwiO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uTmFtZSA9PT0gXCJcIiA/IFwiTWVtb1wiIDogYE1lbW8oJHtmdW5jdGlvbk5hbWV9KWA7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBcIlVOREVGSU5FRFwiO1xufVxuZnVuY3Rpb24gZ2V0UHJvcEtleXMkMShlbGVtZW50KSB7XG5cdGNvbnN0IHsgcHJvcHMgfSA9IGVsZW1lbnQ7XG5cdHJldHVybiBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKChrZXkpID0+IGtleSAhPT0gXCJjaGlsZHJlblwiICYmIHByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkuc29ydCgpO1xufVxuY29uc3Qgc2VyaWFsaXplJDEgPSAoZWxlbWVudCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+ICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEVsZW1lbnRBc0xlYWYoZ2V0VHlwZShlbGVtZW50KSwgY29uZmlnKSA6IHByaW50RWxlbWVudChnZXRUeXBlKGVsZW1lbnQpLCBwcmludFByb3BzKGdldFByb3BLZXlzJDEoZWxlbWVudCksIGVsZW1lbnQucHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlciksIHByaW50Q2hpbGRyZW4oZ2V0Q2hpbGRyZW4oZWxlbWVudC5wcm9wcy5jaGlsZHJlbiksIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlciksIGNvbmZpZywgaW5kZW50YXRpb24pO1xuY29uc3QgdGVzdCQxID0gKHZhbCkgPT4gdmFsICE9IG51bGwgJiYgUmVhY3RJcy5pc0VsZW1lbnQodmFsKTtcbmNvbnN0IHBsdWdpbiQxID0ge1xuXHRzZXJpYWxpemU6IHNlcmlhbGl6ZSQxLFxuXHR0ZXN0OiB0ZXN0JDFcbn07XG5cbmNvbnN0IHRlc3RTeW1ib2wgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgU3ltYm9sLmZvciA/IFN5bWJvbC5mb3IoXCJyZWFjdC50ZXN0Lmpzb25cIikgOiAyNDU4MzA0ODc7XG5mdW5jdGlvbiBnZXRQcm9wS2V5cyhvYmplY3QpIHtcblx0Y29uc3QgeyBwcm9wcyB9ID0gb2JqZWN0O1xuXHRyZXR1cm4gcHJvcHMgPyBPYmplY3Qua2V5cyhwcm9wcykuZmlsdGVyKChrZXkpID0+IHByb3BzW2tleV0gIT09IHVuZGVmaW5lZCkuc29ydCgpIDogW107XG59XG5jb25zdCBzZXJpYWxpemUgPSAob2JqZWN0LCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikgPT4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCA/IHByaW50RWxlbWVudEFzTGVhZihvYmplY3QudHlwZSwgY29uZmlnKSA6IHByaW50RWxlbWVudChvYmplY3QudHlwZSwgb2JqZWN0LnByb3BzID8gcHJpbnRQcm9wcyhnZXRQcm9wS2V5cyhvYmplY3QpLCBvYmplY3QucHJvcHMsIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBcIlwiLCBvYmplY3QuY2hpbGRyZW4gPyBwcmludENoaWxkcmVuKG9iamVjdC5jaGlsZHJlbiwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKSA6IFwiXCIsIGNvbmZpZywgaW5kZW50YXRpb24pO1xuY29uc3QgdGVzdCA9ICh2YWwpID0+IHZhbCAmJiB2YWwuJCR0eXBlb2YgPT09IHRlc3RTeW1ib2w7XG5jb25zdCBwbHVnaW4gPSB7XG5cdHNlcmlhbGl6ZSxcblx0dGVzdFxufTtcblxuY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgdG9JU09TdHJpbmcgPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcbmNvbnN0IGVycm9yVG9TdHJpbmcgPSBFcnJvci5wcm90b3R5cGUudG9TdHJpbmc7XG5jb25zdCByZWdFeHBUb1N0cmluZyA9IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmc7XG4vKipcbiogRXhwbGljaXRseSBjb21wYXJpbmcgdHlwZW9mIGNvbnN0cnVjdG9yIHRvIGZ1bmN0aW9uIGF2b2lkcyB1bmRlZmluZWQgYXMgbmFtZVxuKiB3aGVuIG1vY2sgaWRlbnRpdHktb2JqLXByb3h5IHJldHVybnMgdGhlIGtleSBhcyB0aGUgdmFsdWUgZm9yIGFueSBrZXkuXG4qL1xuZnVuY3Rpb24gZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lIHx8IFwiT2JqZWN0XCI7XG59XG4vKiogSXMgdmFsIGlzIGVxdWFsIHRvIGdsb2JhbCB3aW5kb3cgb2JqZWN0PyBXb3JrcyBldmVuIGlmIGl0IGRvZXMgbm90IGV4aXN0IDopICovXG5mdW5jdGlvbiBpc1dpbmRvdyh2YWwpIHtcblx0cmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgdmFsID09PSB3aW5kb3c7XG59XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVnZXhwL25vLXN1cGVyLWxpbmVhci1iYWNrdHJhY2tpbmdcbmNvbnN0IFNZTUJPTF9SRUdFWFAgPSAvXlN5bWJvbFxcKCguKilcXCkoLiopJC87XG5jb25zdCBORVdMSU5FX1JFR0VYUCA9IC9cXG4vZztcbmNsYXNzIFByZXR0eUZvcm1hdFBsdWdpbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlLCBzdGFjaykge1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHRcdHRoaXMuc3RhY2sgPSBzdGFjaztcblx0XHR0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG5cdH1cbn1cbmZ1bmN0aW9uIGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSB7XG5cdHJldHVybiB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgQXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEFycmF5QnVmZmVyXVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBEYXRhVmlld11cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRmxvYXQzMkFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBGbG9hdDY0QXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEludDhBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgSW50MTZBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgSW50MzJBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgVWludDhBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgVWludDhDbGFtcGVkQXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFVpbnQxNkFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBVaW50MzJBcnJheV1cIjtcbn1cbmZ1bmN0aW9uIHByaW50TnVtYmVyKHZhbCkge1xuXHRyZXR1cm4gT2JqZWN0LmlzKHZhbCwgLTApID8gXCItMFwiIDogU3RyaW5nKHZhbCk7XG59XG5mdW5jdGlvbiBwcmludEJpZ0ludCh2YWwpIHtcblx0cmV0dXJuIFN0cmluZyhgJHt2YWx9bmApO1xufVxuZnVuY3Rpb24gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKSB7XG5cdGlmICghcHJpbnRGdW5jdGlvbk5hbWUpIHtcblx0XHRyZXR1cm4gXCJbRnVuY3Rpb25dXCI7XG5cdH1cblx0cmV0dXJuIGBbRnVuY3Rpb24gJHt2YWwubmFtZSB8fCBcImFub255bW91c1wifV1gO1xufVxuZnVuY3Rpb24gcHJpbnRTeW1ib2wodmFsKSB7XG5cdHJldHVybiBTdHJpbmcodmFsKS5yZXBsYWNlKFNZTUJPTF9SRUdFWFAsIFwiU3ltYm9sKCQxKVwiKTtcbn1cbmZ1bmN0aW9uIHByaW50RXJyb3IodmFsKSB7XG5cdHJldHVybiBgWyR7ZXJyb3JUb1N0cmluZy5jYWxsKHZhbCl9XWA7XG59XG4vKipcbiogVGhlIGZpcnN0IHBvcnQgb2YgY2FsbCBmb3IgcHJpbnRpbmcgYW4gb2JqZWN0LCBoYW5kbGVzIG1vc3Qgb2YgdGhlXG4qIGRhdGEtdHlwZXMgaW4gSlMuXG4qL1xuZnVuY3Rpb24gcHJpbnRCYXNpY1ZhbHVlKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUsIGVzY2FwZVJlZ2V4LCBlc2NhcGVTdHJpbmcpIHtcblx0aWYgKHZhbCA9PT0gdHJ1ZSB8fCB2YWwgPT09IGZhbHNlKSB7XG5cdFx0cmV0dXJuIGAke3ZhbH1gO1xuXHR9XG5cdGlmICh2YWwgPT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBcInVuZGVmaW5lZFwiO1xuXHR9XG5cdGlmICh2YWwgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gXCJudWxsXCI7XG5cdH1cblx0Y29uc3QgdHlwZU9mID0gdHlwZW9mIHZhbDtcblx0aWYgKHR5cGVPZiA9PT0gXCJudW1iZXJcIikge1xuXHRcdHJldHVybiBwcmludE51bWJlcih2YWwpO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwiYmlnaW50XCIpIHtcblx0XHRyZXR1cm4gcHJpbnRCaWdJbnQodmFsKTtcblx0fVxuXHRpZiAodHlwZU9mID09PSBcInN0cmluZ1wiKSB7XG5cdFx0aWYgKGVzY2FwZVN0cmluZykge1xuXHRcdFx0cmV0dXJuIGBcIiR7dmFsLnJlcGxhY2VBbGwoL1wifFxcXFwvZywgXCJcXFxcJCZcIil9XCJgO1xuXHRcdH1cblx0XHRyZXR1cm4gYFwiJHt2YWx9XCJgO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdHJldHVybiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpO1xuXHR9XG5cdGlmICh0eXBlT2YgPT09IFwic3ltYm9sXCIpIHtcblx0XHRyZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcblx0fVxuXHRjb25zdCB0b1N0cmluZ2VkID0gdG9TdHJpbmcuY2FsbCh2YWwpO1xuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFdlYWtNYXBdXCIpIHtcblx0XHRyZXR1cm4gXCJXZWFrTWFwIHt9XCI7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBXZWFrU2V0XVwiKSB7XG5cdFx0cmV0dXJuIFwiV2Vha1NldCB7fVwiO1xuXHR9XG5cdGlmICh0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEdlbmVyYXRvckZ1bmN0aW9uXVwiKSB7XG5cdFx0cmV0dXJuIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSk7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBTeW1ib2xdXCIpIHtcblx0XHRyZXR1cm4gcHJpbnRTeW1ib2wodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IERhdGVdXCIpIHtcblx0XHRyZXR1cm4gTnVtYmVyLmlzTmFOKCt2YWwpID8gXCJEYXRlIHsgTmFOIH1cIiA6IHRvSVNPU3RyaW5nLmNhbGwodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEVycm9yXVwiKSB7XG5cdFx0cmV0dXJuIHByaW50RXJyb3IodmFsKTtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFJlZ0V4cF1cIikge1xuXHRcdGlmIChlc2NhcGVSZWdleCkge1xuXHRcdFx0Ly8gaHR0cHM6Ly9naXRodWIuY29tL2JlbmphbWluZ3IvUmVnRXhwLmVzY2FwZS9ibG9iL21haW4vcG9seWZpbGwuanNcblx0XHRcdHJldHVybiByZWdFeHBUb1N0cmluZy5jYWxsKHZhbCkucmVwbGFjZUFsbCgvWyQoKSorLj9bXFxcXFxcXV57fH1dL2csIFwiXFxcXCQmXCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpO1xuXHR9XG5cdGlmICh2YWwgaW5zdGFuY2VvZiBFcnJvcikge1xuXHRcdHJldHVybiBwcmludEVycm9yKHZhbCk7XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG4vKipcbiogSGFuZGxlcyBtb3JlIGNvbXBsZXggb2JqZWN0cyAoIHN1Y2ggYXMgb2JqZWN0cyB3aXRoIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4qIG1hcHMgYW5kIHNldHMgZXRjIClcbiovXG5mdW5jdGlvbiBwcmludENvbXBsZXhWYWx1ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcblx0aWYgKHJlZnMuaW5jbHVkZXModmFsKSkge1xuXHRcdHJldHVybiBcIltDaXJjdWxhcl1cIjtcblx0fVxuXHRyZWZzID0gWy4uLnJlZnNdO1xuXHRyZWZzLnB1c2godmFsKTtcblx0Y29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuXHRjb25zdCBtaW4gPSBjb25maWcubWluO1xuXHRpZiAoY29uZmlnLmNhbGxUb0pTT04gJiYgIWhpdE1heERlcHRoICYmIHZhbC50b0pTT04gJiYgdHlwZW9mIHZhbC50b0pTT04gPT09IFwiZnVuY3Rpb25cIiAmJiAhaGFzQ2FsbGVkVG9KU09OKSB7XG5cdFx0cmV0dXJuIHByaW50ZXIodmFsLnRvSlNPTigpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgdHJ1ZSk7XG5cdH1cblx0Y29uc3QgdG9TdHJpbmdlZCA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBBcmd1bWVudHNdXCIpIHtcblx0XHRyZXR1cm4gaGl0TWF4RGVwdGggPyBcIltBcmd1bWVudHNdXCIgOiBgJHttaW4gPyBcIlwiIDogXCJBcmd1bWVudHMgXCJ9WyR7cHJpbnRMaXN0SXRlbXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9XWA7XG5cdH1cblx0aWYgKGlzVG9TdHJpbmdlZEFycmF5VHlwZSh0b1N0cmluZ2VkKSkge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IGBbJHt2YWwuY29uc3RydWN0b3IubmFtZX1dYCA6IGAke21pbiA/IFwiXCIgOiAhY29uZmlnLnByaW50QmFzaWNQcm90b3R5cGUgJiYgdmFsLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiQXJyYXlcIiA/IFwiXCIgOiBgJHt2YWwuY29uc3RydWN0b3IubmFtZX0gYH1bJHtwcmludExpc3RJdGVtcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYDtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IE1hcF1cIikge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IFwiW01hcF1cIiA6IGBNYXAgeyR7cHJpbnRJdGVyYXRvckVudHJpZXModmFsLmVudHJpZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIFwiID0+IFwiKX19YDtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFNldF1cIikge1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IFwiW1NldF1cIiA6IGBTZXQgeyR7cHJpbnRJdGVyYXRvclZhbHVlcyh2YWwudmFsdWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcblx0fVxuXHQvLyBBdm9pZCBmYWlsdXJlIHRvIHNlcmlhbGl6ZSBnbG9iYWwgd2luZG93IG9iamVjdCBpbiBqc2RvbSB0ZXN0IGVudmlyb25tZW50LlxuXHQvLyBGb3IgZXhhbXBsZSwgbm90IGV2ZW4gcmVsZXZhbnQgaWYgd2luZG93IGlzIHByb3Agb2YgUmVhY3QgZWxlbWVudC5cblx0cmV0dXJuIGhpdE1heERlcHRoIHx8IGlzV2luZG93KHZhbCkgPyBgWyR7Z2V0Q29uc3RydWN0b3JOYW1lKHZhbCl9XWAgOiBgJHttaW4gPyBcIlwiIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpID09PSBcIk9iamVjdFwiID8gXCJcIiA6IGAke2dldENvbnN0cnVjdG9yTmFtZSh2YWwpfSBgfXske3ByaW50T2JqZWN0UHJvcGVydGllcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcbn1cbmNvbnN0IEVycm9yUGx1Z2luID0ge1xuXHR0ZXN0OiAodmFsKSA9PiB2YWwgJiYgdmFsIGluc3RhbmNlb2YgRXJyb3IsXG5cdHNlcmlhbGl6ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdFx0aWYgKHJlZnMuaW5jbHVkZXModmFsKSkge1xuXHRcdFx0cmV0dXJuIFwiW0NpcmN1bGFyXVwiO1xuXHRcdH1cblx0XHRyZWZzID0gWy4uLnJlZnMsIHZhbF07XG5cdFx0Y29uc3QgaGl0TWF4RGVwdGggPSArK2RlcHRoID4gY29uZmlnLm1heERlcHRoO1xuXHRcdGNvbnN0IHsgbWVzc2FnZSwgY2F1c2UsIC4uLnJlc3QgfSA9IHZhbDtcblx0XHRjb25zdCBlbnRyaWVzID0ge1xuXHRcdFx0bWVzc2FnZSxcblx0XHRcdC4uLnR5cGVvZiBjYXVzZSAhPT0gXCJ1bmRlZmluZWRcIiA/IHsgY2F1c2UgfSA6IHt9LFxuXHRcdFx0Li4udmFsIGluc3RhbmNlb2YgQWdncmVnYXRlRXJyb3IgPyB7IGVycm9yczogdmFsLmVycm9ycyB9IDoge30sXG5cdFx0XHQuLi5yZXN0XG5cdFx0fTtcblx0XHRjb25zdCBuYW1lID0gdmFsLm5hbWUgIT09IFwiRXJyb3JcIiA/IHZhbC5uYW1lIDogZ2V0Q29uc3RydWN0b3JOYW1lKHZhbCk7XG5cdFx0cmV0dXJuIGhpdE1heERlcHRoID8gYFske25hbWV9XWAgOiBgJHtuYW1lfSB7JHtwcmludEl0ZXJhdG9yRW50cmllcyhPYmplY3QuZW50cmllcyhlbnRyaWVzKS52YWx1ZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfX1gO1xuXHR9XG59O1xuZnVuY3Rpb24gaXNOZXdQbHVnaW4ocGx1Z2luKSB7XG5cdHJldHVybiBwbHVnaW4uc2VyaWFsaXplICE9IG51bGw7XG59XG5mdW5jdGlvbiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpIHtcblx0bGV0IHByaW50ZWQ7XG5cdHRyeSB7XG5cdFx0cHJpbnRlZCA9IGlzTmV3UGx1Z2luKHBsdWdpbikgPyBwbHVnaW4uc2VyaWFsaXplKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogcGx1Z2luLnByaW50KHZhbCwgKHZhbENoaWxkKSA9PiBwcmludGVyKHZhbENoaWxkLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyksIChzdHIpID0+IHtcblx0XHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHRcdHJldHVybiBpbmRlbnRhdGlvbk5leHQgKyBzdHIucmVwbGFjZUFsbChORVdMSU5FX1JFR0VYUCwgYFxcbiR7aW5kZW50YXRpb25OZXh0fWApO1xuXHRcdH0sIHtcblx0XHRcdGVkZ2VTcGFjaW5nOiBjb25maWcuc3BhY2luZ091dGVyLFxuXHRcdFx0bWluOiBjb25maWcubWluLFxuXHRcdFx0c3BhY2luZzogY29uZmlnLnNwYWNpbmdJbm5lclxuXHRcdH0sIGNvbmZpZy5jb2xvcnMpO1xuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdHRocm93IG5ldyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG5cdH1cblx0aWYgKHR5cGVvZiBwcmludGVkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0dGhyb3cgbmV3IFR5cGVFcnJvcihgcHJldHR5LWZvcm1hdDogUGx1Z2luIG11c3QgcmV0dXJuIHR5cGUgXCJzdHJpbmdcIiBidXQgaW5zdGVhZCByZXR1cm5lZCBcIiR7dHlwZW9mIHByaW50ZWR9XCIuYCk7XG5cdH1cblx0cmV0dXJuIHByaW50ZWQ7XG59XG5mdW5jdGlvbiBmaW5kUGx1Z2luKHBsdWdpbnMsIHZhbCkge1xuXHRmb3IgKGNvbnN0IHBsdWdpbiBvZiBwbHVnaW5zKSB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmIChwbHVnaW4udGVzdCh2YWwpKSB7XG5cdFx0XHRcdHJldHVybiBwbHVnaW47XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvcihlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjayk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gcHJpbnRlcih2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBoYXNDYWxsZWRUb0pTT04pIHtcblx0bGV0IHJlc3VsdDtcblx0Y29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihjb25maWcucGx1Z2lucywgdmFsKTtcblx0aWYgKHBsdWdpbiAhPT0gbnVsbCkge1xuXHRcdHJlc3VsdCA9IHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcyk7XG5cdH0gZWxzZSB7XG5cdFx0Y29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUodmFsLCBjb25maWcucHJpbnRGdW5jdGlvbk5hbWUsIGNvbmZpZy5lc2NhcGVSZWdleCwgY29uZmlnLmVzY2FwZVN0cmluZyk7XG5cdFx0aWYgKGJhc2ljUmVzdWx0ICE9PSBudWxsKSB7XG5cdFx0XHRyZXN1bHQgPSBiYXNpY1Jlc3VsdDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0ID0gcHJpbnRDb21wbGV4VmFsdWUodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgaGFzQ2FsbGVkVG9KU09OKTtcblx0XHR9XG5cdH1cblx0Ly8gUGVyLWRlcHRoIG91dHB1dCBidWRnZXQgKGluc3BpcmVkIGJ5IE5vZGUncyB1dGlsLmluc3BlY3QpLlxuXHQvLyBFYWNoIGRlcHRoIGxldmVsIHRyYWNrcyBvdXRwdXQgaW5kZXBlbmRlbnRseSwgc28gbmVzdGVkIHJlc3VsdHNcblx0Ly8gZG9uJ3QgaW5mbGF0ZSBhIHNpbmdsZSBjb3VudGVyICh3aGljaCB3b3VsZCB1bmRlcmNvdW50IGJ5IH5OeCBmb3Jcblx0Ly8gTiBsZXZlbHMgb2YgbmVzdGluZykuIE5vZGVzIGF0IHRoZSBzYW1lIGRlcHRoIHByb2R1Y2UgZGlzam9pbnQgc3BhbnNcblx0Ly8gaW4gdGhlIG91dHB1dCBzdHJpbmcsIHNvIGVhY2ggYnVja2V0IGFjY3VyYXRlbHkgcmVmbGVjdHMgb3V0cHV0IGF0XG5cdC8vIHRoYXQgbGV2ZWwuIFRvdGFsIG91dHB1dCBpcyBib3VuZGVkIGJ5IG1heERlcHRoIMOXIG1heE91dHB1dExlbmd0aC5cblx0Y29uZmlnLl9vdXRwdXRMZW5ndGhQZXJEZXB0aFtkZXB0aF0gPz89IDA7XG5cdGNvbmZpZy5fb3V0cHV0TGVuZ3RoUGVyRGVwdGhbZGVwdGhdICs9IHJlc3VsdC5sZW5ndGg7XG5cdGlmIChjb25maWcuX291dHB1dExlbmd0aFBlckRlcHRoW2RlcHRoXSA+IGNvbmZpZy5tYXhPdXRwdXRMZW5ndGgpIHtcblx0XHRjb25maWcubWF4RGVwdGggPSAwO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5jb25zdCBERUZBVUxUX1RIRU1FID0ge1xuXHRjb21tZW50OiBcImdyYXlcIixcblx0Y29udGVudDogXCJyZXNldFwiLFxuXHRwcm9wOiBcInllbGxvd1wiLFxuXHR0YWc6IFwiY3lhblwiLFxuXHR2YWx1ZTogXCJncmVlblwiXG59O1xuY29uc3QgREVGQVVMVF9USEVNRV9LRVlTID0gT2JqZWN0LmtleXMoREVGQVVMVF9USEVNRSk7XG5jb25zdCBERUZBVUxUX09QVElPTlMgPSB7XG5cdGNhbGxUb0pTT046IHRydWUsXG5cdGNvbXBhcmVLZXlzOiB1bmRlZmluZWQsXG5cdGVzY2FwZVJlZ2V4OiBmYWxzZSxcblx0ZXNjYXBlU3RyaW5nOiB0cnVlLFxuXHRoaWdobGlnaHQ6IGZhbHNlLFxuXHRpbmRlbnQ6IDIsXG5cdG1heERlcHRoOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG5cdG1heE91dHB1dExlbmd0aDogMWU2LFxuXHRtYXhXaWR0aDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRtaW46IGZhbHNlLFxuXHRwbHVnaW5zOiBbXSxcblx0cHJpbnRCYXNpY1Byb3RvdHlwZTogdHJ1ZSxcblx0cHJpbnRGdW5jdGlvbk5hbWU6IHRydWUsXG5cdHByaW50U2hhZG93Um9vdDogdHJ1ZSxcblx0dGhlbWU6IERFRkFVTFRfVEhFTUVcbn07XG5mdW5jdGlvbiB2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucykge1xuXHRmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuXHRcdGlmICghT2JqZWN0Lmhhc093bihERUZBVUxUX09QVElPTlMsIGtleSkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgcHJldHR5LWZvcm1hdDogVW5rbm93biBvcHRpb24gXCIke2tleX1cIi5gKTtcblx0XHR9XG5cdH1cblx0aWYgKG9wdGlvbnMubWluICYmIG9wdGlvbnMuaW5kZW50ICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5pbmRlbnQgIT09IDApIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoXCJwcmV0dHktZm9ybWF0OiBPcHRpb25zIFxcXCJtaW5cXFwiIGFuZCBcXFwiaW5kZW50XFxcIiBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cIik7XG5cdH1cbn1cbmZ1bmN0aW9uIGdldENvbG9yc0hpZ2hsaWdodCgpIHtcblx0cmV0dXJuIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSBERUZBVUxUX1RIRU1FW2tleV07XG5cdFx0Y29uc3QgY29sb3IgPSB2YWx1ZSAmJiBzdHlsZXNbdmFsdWVdO1xuXHRcdGlmIChjb2xvciAmJiB0eXBlb2YgY29sb3IuY2xvc2UgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIGNvbG9yLm9wZW4gPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGNvbG9yc1trZXldID0gY29sb3I7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgcHJldHR5LWZvcm1hdDogT3B0aW9uIFwidGhlbWVcIiBoYXMgYSBrZXkgXCIke2tleX1cIiB3aG9zZSB2YWx1ZSBcIiR7dmFsdWV9XCIgaXMgdW5kZWZpbmVkIGluIGFuc2ktc3R5bGVzLmApO1xuXHRcdH1cblx0XHRyZXR1cm4gY29sb3JzO1xuXHR9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbn1cbmZ1bmN0aW9uIGdldENvbG9yc0VtcHR5KCkge1xuXHRyZXR1cm4gREVGQVVMVF9USEVNRV9LRVlTLnJlZHVjZSgoY29sb3JzLCBrZXkpID0+IHtcblx0XHRjb2xvcnNba2V5XSA9IHtcblx0XHRcdGNsb3NlOiBcIlwiLFxuXHRcdFx0b3BlbjogXCJcIlxuXHRcdH07XG5cdFx0cmV0dXJuIGNvbG9ycztcblx0fSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5mdW5jdGlvbiBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSB7XG5cdHJldHVybiBvcHRpb25zPy5wcmludEZ1bmN0aW9uTmFtZSA/PyBERUZBVUxUX09QVElPTlMucHJpbnRGdW5jdGlvbk5hbWU7XG59XG5mdW5jdGlvbiBnZXRFc2NhcGVSZWdleChvcHRpb25zKSB7XG5cdHJldHVybiBvcHRpb25zPy5lc2NhcGVSZWdleCA/PyBERUZBVUxUX09QVElPTlMuZXNjYXBlUmVnZXg7XG59XG5mdW5jdGlvbiBnZXRFc2NhcGVTdHJpbmcob3B0aW9ucykge1xuXHRyZXR1cm4gb3B0aW9ucz8uZXNjYXBlU3RyaW5nID8/IERFRkFVTFRfT1BUSU9OUy5lc2NhcGVTdHJpbmc7XG59XG5mdW5jdGlvbiBnZXRDb25maWcob3B0aW9ucykge1xuXHRyZXR1cm4ge1xuXHRcdGNhbGxUb0pTT046IG9wdGlvbnM/LmNhbGxUb0pTT04gPz8gREVGQVVMVF9PUFRJT05TLmNhbGxUb0pTT04sXG5cdFx0Y29sb3JzOiBvcHRpb25zPy5oaWdobGlnaHQgPyBnZXRDb2xvcnNIaWdobGlnaHQoKSA6IGdldENvbG9yc0VtcHR5KCksXG5cdFx0Y29tcGFyZUtleXM6IHR5cGVvZiBvcHRpb25zPy5jb21wYXJlS2V5cyA9PT0gXCJmdW5jdGlvblwiIHx8IG9wdGlvbnM/LmNvbXBhcmVLZXlzID09PSBudWxsID8gb3B0aW9ucy5jb21wYXJlS2V5cyA6IERFRkFVTFRfT1BUSU9OUy5jb21wYXJlS2V5cyxcblx0XHRlc2NhcGVSZWdleDogZ2V0RXNjYXBlUmVnZXgob3B0aW9ucyksXG5cdFx0ZXNjYXBlU3RyaW5nOiBnZXRFc2NhcGVTdHJpbmcob3B0aW9ucyksXG5cdFx0aW5kZW50OiBvcHRpb25zPy5taW4gPyBcIlwiIDogY3JlYXRlSW5kZW50KG9wdGlvbnM/LmluZGVudCA/PyBERUZBVUxUX09QVElPTlMuaW5kZW50KSxcblx0XHRtYXhEZXB0aDogb3B0aW9ucz8ubWF4RGVwdGggPz8gREVGQVVMVF9PUFRJT05TLm1heERlcHRoLFxuXHRcdG1heFdpZHRoOiBvcHRpb25zPy5tYXhXaWR0aCA/PyBERUZBVUxUX09QVElPTlMubWF4V2lkdGgsXG5cdFx0bWluOiBvcHRpb25zPy5taW4gPz8gREVGQVVMVF9PUFRJT05TLm1pbixcblx0XHRwbHVnaW5zOiBvcHRpb25zPy5wbHVnaW5zID8/IERFRkFVTFRfT1BUSU9OUy5wbHVnaW5zLFxuXHRcdHByaW50QmFzaWNQcm90b3R5cGU6IG9wdGlvbnM/LnByaW50QmFzaWNQcm90b3R5cGUgPz8gdHJ1ZSxcblx0XHRwcmludEZ1bmN0aW9uTmFtZTogZ2V0UHJpbnRGdW5jdGlvbk5hbWUob3B0aW9ucyksXG5cdFx0cHJpbnRTaGFkb3dSb290OiBvcHRpb25zPy5wcmludFNoYWRvd1Jvb3QgPz8gdHJ1ZSxcblx0XHRzcGFjaW5nSW5uZXI6IG9wdGlvbnM/Lm1pbiA/IFwiIFwiIDogXCJcXG5cIixcblx0XHRzcGFjaW5nT3V0ZXI6IG9wdGlvbnM/Lm1pbiA/IFwiXCIgOiBcIlxcblwiLFxuXHRcdG1heE91dHB1dExlbmd0aDogb3B0aW9ucz8ubWF4T3V0cHV0TGVuZ3RoID8/IERFRkFVTFRfT1BUSU9OUy5tYXhPdXRwdXRMZW5ndGgsXG5cdFx0X291dHB1dExlbmd0aFBlckRlcHRoOiBbXVxuXHR9O1xufVxuZnVuY3Rpb24gY3JlYXRlSW5kZW50KGluZGVudCkge1xuXHRyZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogaW5kZW50ICsgMSB9KS5qb2luKFwiIFwiKTtcbn1cbi8qKlxuKiBSZXR1cm5zIGEgcHJlc2VudGF0aW9uIHN0cmluZyBvZiB5b3VyIGB2YWxgIG9iamVjdFxuKiBAcGFyYW0gdmFsIGFueSBwb3RlbnRpYWwgSmF2YVNjcmlwdCBvYmplY3RcbiogQHBhcmFtIG9wdGlvbnMgQ3VzdG9tIHNldHRpbmdzXG4qL1xuZnVuY3Rpb24gZm9ybWF0KHZhbCwgb3B0aW9ucykge1xuXHRpZiAob3B0aW9ucykge1xuXHRcdHZhbGlkYXRlT3B0aW9ucyhvcHRpb25zKTtcblx0XHRpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG5cdFx0XHRjb25zdCBwbHVnaW4gPSBmaW5kUGx1Z2luKG9wdGlvbnMucGx1Z2lucywgdmFsKTtcblx0XHRcdGlmIChwbHVnaW4gIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHByaW50UGx1Z2luKHBsdWdpbiwgdmFsLCBnZXRDb25maWcob3B0aW9ucyksIFwiXCIsIDAsIFtdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0Y29uc3QgYmFzaWNSZXN1bHQgPSBwcmludEJhc2ljVmFsdWUodmFsLCBnZXRQcmludEZ1bmN0aW9uTmFtZShvcHRpb25zKSwgZ2V0RXNjYXBlUmVnZXgob3B0aW9ucyksIGdldEVzY2FwZVN0cmluZyhvcHRpb25zKSk7XG5cdGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuXHRcdHJldHVybiBiYXNpY1Jlc3VsdDtcblx0fVxuXHRyZXR1cm4gcHJpbnRDb21wbGV4VmFsdWUodmFsLCBnZXRDb25maWcob3B0aW9ucyksIFwiXCIsIDAsIFtdKTtcbn1cbmNvbnN0IHBsdWdpbnMgPSB7XG5cdEFzeW1tZXRyaWNNYXRjaGVyOiBwbHVnaW4kNSxcblx0RE9NQ29sbGVjdGlvbjogcGx1Z2luJDQsXG5cdERPTUVsZW1lbnQ6IHBsdWdpbiQzLFxuXHRJbW11dGFibGU6IHBsdWdpbiQyLFxuXHRSZWFjdEVsZW1lbnQ6IHBsdWdpbiQxLFxuXHRSZWFjdFRlc3RDb21wb25lbnQ6IHBsdWdpbixcblx0RXJyb3I6IEVycm9yUGx1Z2luXG59O1xuXG5leHBvcnQgeyBERUZBVUxUX09QVElPTlMsIGNyZWF0ZURPTUVsZW1lbnRGaWx0ZXIsIGZvcm1hdCwgcGx1Z2lucyB9O1xuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXSwibWFwcGluZ3MiOiI7O0FBRUEsU0FBUyxpQkFBaUIsR0FBRyxHQUFHO0FBQzlCLEdBQUUsUUFB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