@cartanova/qgrid-cli 2.7.0 → 2.7.1

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 (126) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +20 -1
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +17 -6
  3. package/bundle/dist/application/qgrid/qgrid.frame.js +1 -1
  4. package/bundle/dist/application/qgrid/schema-prompt.js +240 -0
  5. package/bundle/dist/application/qgrid/tool-emulation.js +7 -5
  6. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/2020.js +112 -0
  7. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js +140 -0
  8. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js +676 -0
  9. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js +143 -0
  10. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js +104 -0
  11. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/index.js +225 -0
  12. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js +30 -0
  13. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/ref_error.js +20 -0
  14. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/resolve.js +135 -0
  15. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js +63 -0
  16. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js +148 -0
  17. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/applicability.js +25 -0
  18. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js +50 -0
  19. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js +174 -0
  20. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/defaults.js +33 -0
  21. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/index.js +435 -0
  22. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/keyword.js +115 -0
  23. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/subschema.js +74 -0
  24. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js +585 -0
  25. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/data.js +20 -0
  26. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/index.js +44 -0
  27. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/applicator.js +52 -0
  28. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/content.js +22 -0
  29. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/core.js +53 -0
  30. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/format-annotation.js +18 -0
  31. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/meta-data.js +38 -0
  32. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/unevaluated.js +21 -0
  33. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/meta/validation.js +87 -0
  34. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/refs/json-schema-2020-12/schema.js +61 -0
  35. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/equal.js +14 -0
  36. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/ucs2length.js +27 -0
  37. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/uri.js +14 -0
  38. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/runtime/validation_error.js +18 -0
  39. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalItems.js +59 -0
  40. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/additionalProperties.js +98 -0
  41. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/allOf.js +31 -0
  42. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/anyOf.js +18 -0
  43. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/contains.js +91 -0
  44. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependencies.js +89 -0
  45. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/dependentSchemas.js +18 -0
  46. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/if.js +64 -0
  47. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/index.js +62 -0
  48. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items.js +61 -0
  49. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/items2020.js +36 -0
  50. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/not.js +33 -0
  51. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/oneOf.js +53 -0
  52. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/patternProperties.js +63 -0
  53. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/prefixItems.js +19 -0
  54. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/properties.js +54 -0
  55. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/propertyNames.js +43 -0
  56. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/applicator/thenElse.js +19 -0
  57. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/code.js +132 -0
  58. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/id.js +16 -0
  59. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/index.js +24 -0
  60. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/core/ref.js +114 -0
  61. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/index.js +103 -0
  62. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/discriminator/types.js +16 -0
  63. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/draft2020.js +37 -0
  64. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicAnchor.js +48 -0
  65. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/dynamicRef.js +47 -0
  66. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/index.js +24 -0
  67. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveAnchor.js +22 -0
  68. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/dynamic/recursiveRef.js +17 -0
  69. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/format.js +94 -0
  70. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/format/index.js +12 -0
  71. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/metadata.js +25 -0
  72. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/next.js +21 -0
  73. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/index.js +15 -0
  74. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedItems.js +48 -0
  75. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedProperties.js +61 -0
  76. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/const.js +29 -0
  77. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/dependentRequired.js +19 -0
  78. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/enum.js +51 -0
  79. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/index.js +50 -0
  80. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitContains.js +20 -0
  81. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitItems.js +30 -0
  82. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitLength.js +35 -0
  83. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitNumber.js +49 -0
  84. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/limitProperties.js +30 -0
  85. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/multipleOf.js +29 -0
  86. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/pattern.js +40 -0
  87. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/required.js +74 -0
  88. package/bundle/dist/node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/vocabularies/validation/uniqueItems.js +72 -0
  89. package/bundle/dist/node_modules/.pnpm/fast-deep-equal@3.1.3/node_modules/fast-deep-equal/index.js +35 -0
  90. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/index.js +238 -0
  91. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/schemes.js +189 -0
  92. package/bundle/dist/node_modules/.pnpm/fast-uri@3.1.0/node_modules/fast-uri/lib/utils.js +284 -0
  93. package/bundle/dist/node_modules/.pnpm/json-schema-traverse@1.0.0/node_modules/json-schema-traverse/index.js +80 -0
  94. package/bundle/dist/testing/schema-bench.js +0 -0
  95. package/bundle/dist/utils/providers/anthropic/fence-strip.js +83 -0
  96. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +3 -5
  97. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +250 -34
  98. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +36 -5
  99. package/bundle/src/application/qgrid/qgrid.frame.test.ts +120 -153
  100. package/bundle/src/application/qgrid/qgrid.frame.ts +2 -0
  101. package/bundle/src/application/qgrid/schema-prompt.test.ts +166 -0
  102. package/bundle/src/application/qgrid/schema-prompt.ts +293 -0
  103. package/bundle/src/application/qgrid/tool-emulation.test.ts +36 -0
  104. package/bundle/src/application/qgrid/tool-emulation.ts +19 -7
  105. package/bundle/src/testing/schema-bench.test.ts +358 -0
  106. package/bundle/src/testing/schema-bench.ts +352 -0
  107. package/bundle/src/utils/providers/anthropic/fence-strip.test.ts +122 -0
  108. package/bundle/src/utils/providers/anthropic/fence-strip.ts +105 -0
  109. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +2 -8
  110. package/bundle/web-dist/client/assets/{index-C24D5PiN.js → index-C0594sjh.js} +3 -3
  111. package/bundle/web-dist/client/assets/{logs-CIlZG6A3.js → logs-BotUcOEB.js} +1 -1
  112. package/bundle/web-dist/client/assets/{monit-DZFBMxKl.js → monit-kk3vnGvu.js} +1 -1
  113. package/bundle/web-dist/client/assets/{routes-C3wlSNBL.js → routes-J4bnHVfl.js} +1 -1
  114. package/bundle/web-dist/client/assets/{settings-ClRDWO-8.js → settings-CAAQSIyg.js} +1 -1
  115. package/bundle/web-dist/client/assets/{show-BP7U8yyJ.js → show-BryNvjUT.js} +1 -1
  116. package/bundle/web-dist/client/assets/{tokens-DfQeULnJ.js → tokens-DDrATjGA.js} +1 -1
  117. package/bundle/web-dist/client/assets/{use-oauth-login-flow-CY-ASCfL.js → use-oauth-login-flow-CptleCFM.js} +1 -1
  118. package/bundle/web-dist/client/index.html +1 -1
  119. package/bundle/web-dist/server/entry-server.generated.js +1 -1
  120. package/package.json +1 -1
  121. package/skills/qgrid/references/ai-sdk-provider-contract.md +20 -15
  122. package/skills/qgrid/references/anthropic-claude-code-runtime.md +31 -14
  123. package/skills/qgrid/references/decision-rationale.md +13 -3
  124. package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
  125. package/skills/qgrid/references/provider-runtime-differences.md +3 -3
  126. package/skills/qgrid/references/tool-calling-and-multiturn.md +16 -6
@@ -0,0 +1,585 @@
1
+ import { __commonJSMin } from "../../../../../../_virtual/_rolldown/runtime.js";
2
+ import { require_codegen } from "./compile/codegen/index.js";
3
+ import { require_util } from "./compile/util.js";
4
+ import { require_rules } from "./compile/rules.js";
5
+ import { require_dataType } from "./compile/validate/dataType.js";
6
+ import { require_resolve } from "./compile/resolve.js";
7
+ import { require_validate } from "./compile/validate/index.js";
8
+ import { require_validation_error } from "./runtime/validation_error.js";
9
+ import { require_ref_error } from "./compile/ref_error.js";
10
+ import { require_compile } from "./compile/index.js";
11
+ import { require_data } from "./refs/data.js";
12
+ import { require_uri } from "./runtime/uri.js";
13
+ //#region ../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/core.js
14
+ var require_core = /* @__PURE__ */ __commonJSMin(((exports) => {
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CodeGen = exports.Name = exports.nil = exports.stringify = exports.str = exports._ = exports.KeywordCxt = void 0;
17
+ var validate_1 = require_validate();
18
+ Object.defineProperty(exports, "KeywordCxt", {
19
+ enumerable: true,
20
+ get: function() {
21
+ return validate_1.KeywordCxt;
22
+ }
23
+ });
24
+ var codegen_1 = require_codegen();
25
+ Object.defineProperty(exports, "_", {
26
+ enumerable: true,
27
+ get: function() {
28
+ return codegen_1._;
29
+ }
30
+ });
31
+ Object.defineProperty(exports, "str", {
32
+ enumerable: true,
33
+ get: function() {
34
+ return codegen_1.str;
35
+ }
36
+ });
37
+ Object.defineProperty(exports, "stringify", {
38
+ enumerable: true,
39
+ get: function() {
40
+ return codegen_1.stringify;
41
+ }
42
+ });
43
+ Object.defineProperty(exports, "nil", {
44
+ enumerable: true,
45
+ get: function() {
46
+ return codegen_1.nil;
47
+ }
48
+ });
49
+ Object.defineProperty(exports, "Name", {
50
+ enumerable: true,
51
+ get: function() {
52
+ return codegen_1.Name;
53
+ }
54
+ });
55
+ Object.defineProperty(exports, "CodeGen", {
56
+ enumerable: true,
57
+ get: function() {
58
+ return codegen_1.CodeGen;
59
+ }
60
+ });
61
+ const validation_error_1 = require_validation_error();
62
+ const ref_error_1 = require_ref_error();
63
+ const rules_1 = require_rules();
64
+ const compile_1 = require_compile();
65
+ const codegen_2 = require_codegen();
66
+ const resolve_1 = require_resolve();
67
+ const dataType_1 = require_dataType();
68
+ const util_1 = require_util();
69
+ const $dataRefSchema = require_data();
70
+ const uri_1 = require_uri();
71
+ const defaultRegExp = (str, flags) => new RegExp(str, flags);
72
+ defaultRegExp.code = "new RegExp";
73
+ const META_IGNORE_OPTIONS = [
74
+ "removeAdditional",
75
+ "useDefaults",
76
+ "coerceTypes"
77
+ ];
78
+ const EXT_SCOPE_NAMES = /* @__PURE__ */ new Set([
79
+ "validate",
80
+ "serialize",
81
+ "parse",
82
+ "wrapper",
83
+ "root",
84
+ "schema",
85
+ "keyword",
86
+ "pattern",
87
+ "formats",
88
+ "validate$data",
89
+ "func",
90
+ "obj",
91
+ "Error"
92
+ ]);
93
+ const removedOptions = {
94
+ errorDataPath: "",
95
+ format: "`validateFormats: false` can be used instead.",
96
+ nullable: "\"nullable\" keyword is supported by default.",
97
+ jsonPointers: "Deprecated jsPropertySyntax can be used instead.",
98
+ extendRefs: "Deprecated ignoreKeywordsWithRef can be used instead.",
99
+ missingRefs: "Pass empty schema with $id that should be ignored to ajv.addSchema.",
100
+ processCode: "Use option `code: {process: (code, schemaEnv: object) => string}`",
101
+ sourceCode: "Use option `code: {source: true}`",
102
+ strictDefaults: "It is default now, see option `strict`.",
103
+ strictKeywords: "It is default now, see option `strict`.",
104
+ uniqueItems: "\"uniqueItems\" keyword is always validated.",
105
+ unknownFormats: "Disable strict mode or pass `true` to `ajv.addFormat` (or `formats` option).",
106
+ cache: "Map is used as cache, schema object as key.",
107
+ serialize: "Map is used as cache, schema object as key.",
108
+ ajvErrors: "It is default now."
109
+ };
110
+ const deprecatedOptions = {
111
+ ignoreKeywordsWithRef: "",
112
+ jsPropertySyntax: "",
113
+ unicode: "\"minLength\"/\"maxLength\" account for unicode characters by default."
114
+ };
115
+ const MAX_EXPRESSION = 200;
116
+ function requiredOptions(o) {
117
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
118
+ const s = o.strict;
119
+ const _optz = (_a = o.code) === null || _a === void 0 ? void 0 : _a.optimize;
120
+ const optimize = _optz === true || _optz === void 0 ? 1 : _optz || 0;
121
+ const regExp = (_c = (_b = o.code) === null || _b === void 0 ? void 0 : _b.regExp) !== null && _c !== void 0 ? _c : defaultRegExp;
122
+ const uriResolver = (_d = o.uriResolver) !== null && _d !== void 0 ? _d : uri_1.default;
123
+ return {
124
+ strictSchema: (_f = (_e = o.strictSchema) !== null && _e !== void 0 ? _e : s) !== null && _f !== void 0 ? _f : true,
125
+ strictNumbers: (_h = (_g = o.strictNumbers) !== null && _g !== void 0 ? _g : s) !== null && _h !== void 0 ? _h : true,
126
+ strictTypes: (_k = (_j = o.strictTypes) !== null && _j !== void 0 ? _j : s) !== null && _k !== void 0 ? _k : "log",
127
+ strictTuples: (_m = (_l = o.strictTuples) !== null && _l !== void 0 ? _l : s) !== null && _m !== void 0 ? _m : "log",
128
+ strictRequired: (_p = (_o = o.strictRequired) !== null && _o !== void 0 ? _o : s) !== null && _p !== void 0 ? _p : false,
129
+ code: o.code ? {
130
+ ...o.code,
131
+ optimize,
132
+ regExp
133
+ } : {
134
+ optimize,
135
+ regExp
136
+ },
137
+ loopRequired: (_q = o.loopRequired) !== null && _q !== void 0 ? _q : MAX_EXPRESSION,
138
+ loopEnum: (_r = o.loopEnum) !== null && _r !== void 0 ? _r : MAX_EXPRESSION,
139
+ meta: (_s = o.meta) !== null && _s !== void 0 ? _s : true,
140
+ messages: (_t = o.messages) !== null && _t !== void 0 ? _t : true,
141
+ inlineRefs: (_u = o.inlineRefs) !== null && _u !== void 0 ? _u : true,
142
+ schemaId: (_v = o.schemaId) !== null && _v !== void 0 ? _v : "$id",
143
+ addUsedSchema: (_w = o.addUsedSchema) !== null && _w !== void 0 ? _w : true,
144
+ validateSchema: (_x = o.validateSchema) !== null && _x !== void 0 ? _x : true,
145
+ validateFormats: (_y = o.validateFormats) !== null && _y !== void 0 ? _y : true,
146
+ unicodeRegExp: (_z = o.unicodeRegExp) !== null && _z !== void 0 ? _z : true,
147
+ int32range: (_0 = o.int32range) !== null && _0 !== void 0 ? _0 : true,
148
+ uriResolver
149
+ };
150
+ }
151
+ var Ajv = class {
152
+ constructor(opts = {}) {
153
+ this.schemas = {};
154
+ this.refs = {};
155
+ this.formats = Object.create(null);
156
+ this._compilations = /* @__PURE__ */ new Set();
157
+ this._loading = {};
158
+ this._cache = /* @__PURE__ */ new Map();
159
+ opts = this.opts = {
160
+ ...opts,
161
+ ...requiredOptions(opts)
162
+ };
163
+ const { es5, lines } = this.opts.code;
164
+ this.scope = new codegen_2.ValueScope({
165
+ scope: {},
166
+ prefixes: EXT_SCOPE_NAMES,
167
+ es5,
168
+ lines
169
+ });
170
+ this.logger = getLogger(opts.logger);
171
+ const formatOpt = opts.validateFormats;
172
+ opts.validateFormats = false;
173
+ this.RULES = (0, rules_1.getRules)();
174
+ checkOptions.call(this, removedOptions, opts, "NOT SUPPORTED");
175
+ checkOptions.call(this, deprecatedOptions, opts, "DEPRECATED", "warn");
176
+ this._metaOpts = getMetaSchemaOptions.call(this);
177
+ if (opts.formats) addInitialFormats.call(this);
178
+ this._addVocabularies();
179
+ this._addDefaultMetaSchema();
180
+ if (opts.keywords) addInitialKeywords.call(this, opts.keywords);
181
+ if (typeof opts.meta == "object") this.addMetaSchema(opts.meta);
182
+ addInitialSchemas.call(this);
183
+ opts.validateFormats = formatOpt;
184
+ }
185
+ _addVocabularies() {
186
+ this.addKeyword("$async");
187
+ }
188
+ _addDefaultMetaSchema() {
189
+ const { $data, meta, schemaId } = this.opts;
190
+ let _dataRefSchema = $dataRefSchema;
191
+ if (schemaId === "id") {
192
+ _dataRefSchema = { ...$dataRefSchema };
193
+ _dataRefSchema.id = _dataRefSchema.$id;
194
+ delete _dataRefSchema.$id;
195
+ }
196
+ if (meta && $data) this.addMetaSchema(_dataRefSchema, _dataRefSchema[schemaId], false);
197
+ }
198
+ defaultMeta() {
199
+ const { meta, schemaId } = this.opts;
200
+ return this.opts.defaultMeta = typeof meta == "object" ? meta[schemaId] || meta : void 0;
201
+ }
202
+ validate(schemaKeyRef, data) {
203
+ let v;
204
+ if (typeof schemaKeyRef == "string") {
205
+ v = this.getSchema(schemaKeyRef);
206
+ if (!v) throw new Error(`no schema with key or ref "${schemaKeyRef}"`);
207
+ } else v = this.compile(schemaKeyRef);
208
+ const valid = v(data);
209
+ if (!("$async" in v)) this.errors = v.errors;
210
+ return valid;
211
+ }
212
+ compile(schema, _meta) {
213
+ const sch = this._addSchema(schema, _meta);
214
+ return sch.validate || this._compileSchemaEnv(sch);
215
+ }
216
+ compileAsync(schema, meta) {
217
+ if (typeof this.opts.loadSchema != "function") throw new Error("options.loadSchema should be a function");
218
+ const { loadSchema } = this.opts;
219
+ return runCompileAsync.call(this, schema, meta);
220
+ async function runCompileAsync(_schema, _meta) {
221
+ await loadMetaSchema.call(this, _schema.$schema);
222
+ const sch = this._addSchema(_schema, _meta);
223
+ return sch.validate || _compileAsync.call(this, sch);
224
+ }
225
+ async function loadMetaSchema($ref) {
226
+ if ($ref && !this.getSchema($ref)) await runCompileAsync.call(this, { $ref }, true);
227
+ }
228
+ async function _compileAsync(sch) {
229
+ try {
230
+ return this._compileSchemaEnv(sch);
231
+ } catch (e) {
232
+ if (!(e instanceof ref_error_1.default)) throw e;
233
+ checkLoaded.call(this, e);
234
+ await loadMissingSchema.call(this, e.missingSchema);
235
+ return _compileAsync.call(this, sch);
236
+ }
237
+ }
238
+ function checkLoaded({ missingSchema: ref, missingRef }) {
239
+ if (this.refs[ref]) throw new Error(`AnySchema ${ref} is loaded but ${missingRef} cannot be resolved`);
240
+ }
241
+ async function loadMissingSchema(ref) {
242
+ const _schema = await _loadSchema.call(this, ref);
243
+ if (!this.refs[ref]) await loadMetaSchema.call(this, _schema.$schema);
244
+ if (!this.refs[ref]) this.addSchema(_schema, ref, meta);
245
+ }
246
+ async function _loadSchema(ref) {
247
+ const p = this._loading[ref];
248
+ if (p) return p;
249
+ try {
250
+ return await (this._loading[ref] = loadSchema(ref));
251
+ } finally {
252
+ delete this._loading[ref];
253
+ }
254
+ }
255
+ }
256
+ addSchema(schema, key, _meta, _validateSchema = this.opts.validateSchema) {
257
+ if (Array.isArray(schema)) {
258
+ for (const sch of schema) this.addSchema(sch, void 0, _meta, _validateSchema);
259
+ return this;
260
+ }
261
+ let id;
262
+ if (typeof schema === "object") {
263
+ const { schemaId } = this.opts;
264
+ id = schema[schemaId];
265
+ if (id !== void 0 && typeof id != "string") throw new Error(`schema ${schemaId} must be string`);
266
+ }
267
+ key = (0, resolve_1.normalizeId)(key || id);
268
+ this._checkUnique(key);
269
+ this.schemas[key] = this._addSchema(schema, _meta, key, _validateSchema, true);
270
+ return this;
271
+ }
272
+ addMetaSchema(schema, key, _validateSchema = this.opts.validateSchema) {
273
+ this.addSchema(schema, key, true, _validateSchema);
274
+ return this;
275
+ }
276
+ validateSchema(schema, throwOrLogError) {
277
+ if (typeof schema == "boolean") return true;
278
+ let $schema;
279
+ $schema = schema.$schema;
280
+ if ($schema !== void 0 && typeof $schema != "string") throw new Error("$schema must be a string");
281
+ $schema = $schema || this.opts.defaultMeta || this.defaultMeta();
282
+ if (!$schema) {
283
+ this.logger.warn("meta-schema not available");
284
+ this.errors = null;
285
+ return true;
286
+ }
287
+ const valid = this.validate($schema, schema);
288
+ if (!valid && throwOrLogError) {
289
+ const message = "schema is invalid: " + this.errorsText();
290
+ if (this.opts.validateSchema === "log") this.logger.error(message);
291
+ else throw new Error(message);
292
+ }
293
+ return valid;
294
+ }
295
+ getSchema(keyRef) {
296
+ let sch;
297
+ while (typeof (sch = getSchEnv.call(this, keyRef)) == "string") keyRef = sch;
298
+ if (sch === void 0) {
299
+ const { schemaId } = this.opts;
300
+ const root = new compile_1.SchemaEnv({
301
+ schema: {},
302
+ schemaId
303
+ });
304
+ sch = compile_1.resolveSchema.call(this, root, keyRef);
305
+ if (!sch) return;
306
+ this.refs[keyRef] = sch;
307
+ }
308
+ return sch.validate || this._compileSchemaEnv(sch);
309
+ }
310
+ removeSchema(schemaKeyRef) {
311
+ if (schemaKeyRef instanceof RegExp) {
312
+ this._removeAllSchemas(this.schemas, schemaKeyRef);
313
+ this._removeAllSchemas(this.refs, schemaKeyRef);
314
+ return this;
315
+ }
316
+ switch (typeof schemaKeyRef) {
317
+ case "undefined":
318
+ this._removeAllSchemas(this.schemas);
319
+ this._removeAllSchemas(this.refs);
320
+ this._cache.clear();
321
+ return this;
322
+ case "string": {
323
+ const sch = getSchEnv.call(this, schemaKeyRef);
324
+ if (typeof sch == "object") this._cache.delete(sch.schema);
325
+ delete this.schemas[schemaKeyRef];
326
+ delete this.refs[schemaKeyRef];
327
+ return this;
328
+ }
329
+ case "object": {
330
+ const cacheKey = schemaKeyRef;
331
+ this._cache.delete(cacheKey);
332
+ let id = schemaKeyRef[this.opts.schemaId];
333
+ if (id) {
334
+ id = (0, resolve_1.normalizeId)(id);
335
+ delete this.schemas[id];
336
+ delete this.refs[id];
337
+ }
338
+ return this;
339
+ }
340
+ default: throw new Error("ajv.removeSchema: invalid parameter");
341
+ }
342
+ }
343
+ addVocabulary(definitions) {
344
+ for (const def of definitions) this.addKeyword(def);
345
+ return this;
346
+ }
347
+ addKeyword(kwdOrDef, def) {
348
+ let keyword;
349
+ if (typeof kwdOrDef == "string") {
350
+ keyword = kwdOrDef;
351
+ if (typeof def == "object") {
352
+ this.logger.warn("these parameters are deprecated, see docs for addKeyword");
353
+ def.keyword = keyword;
354
+ }
355
+ } else if (typeof kwdOrDef == "object" && def === void 0) {
356
+ def = kwdOrDef;
357
+ keyword = def.keyword;
358
+ if (Array.isArray(keyword) && !keyword.length) throw new Error("addKeywords: keyword must be string or non-empty array");
359
+ } else throw new Error("invalid addKeywords parameters");
360
+ checkKeyword.call(this, keyword, def);
361
+ if (!def) {
362
+ (0, util_1.eachItem)(keyword, (kwd) => addRule.call(this, kwd));
363
+ return this;
364
+ }
365
+ keywordMetaschema.call(this, def);
366
+ const definition = {
367
+ ...def,
368
+ type: (0, dataType_1.getJSONTypes)(def.type),
369
+ schemaType: (0, dataType_1.getJSONTypes)(def.schemaType)
370
+ };
371
+ (0, util_1.eachItem)(keyword, definition.type.length === 0 ? (k) => addRule.call(this, k, definition) : (k) => definition.type.forEach((t) => addRule.call(this, k, definition, t)));
372
+ return this;
373
+ }
374
+ getKeyword(keyword) {
375
+ const rule = this.RULES.all[keyword];
376
+ return typeof rule == "object" ? rule.definition : !!rule;
377
+ }
378
+ removeKeyword(keyword) {
379
+ const { RULES } = this;
380
+ delete RULES.keywords[keyword];
381
+ delete RULES.all[keyword];
382
+ for (const group of RULES.rules) {
383
+ const i = group.rules.findIndex((rule) => rule.keyword === keyword);
384
+ if (i >= 0) group.rules.splice(i, 1);
385
+ }
386
+ return this;
387
+ }
388
+ addFormat(name, format) {
389
+ if (typeof format == "string") format = new RegExp(format);
390
+ this.formats[name] = format;
391
+ return this;
392
+ }
393
+ errorsText(errors = this.errors, { separator = ", ", dataVar = "data" } = {}) {
394
+ if (!errors || errors.length === 0) return "No errors";
395
+ return errors.map((e) => `${dataVar}${e.instancePath} ${e.message}`).reduce((text, msg) => text + separator + msg);
396
+ }
397
+ $dataMetaSchema(metaSchema, keywordsJsonPointers) {
398
+ const rules = this.RULES.all;
399
+ metaSchema = JSON.parse(JSON.stringify(metaSchema));
400
+ for (const jsonPointer of keywordsJsonPointers) {
401
+ const segments = jsonPointer.split("/").slice(1);
402
+ let keywords = metaSchema;
403
+ for (const seg of segments) keywords = keywords[seg];
404
+ for (const key in rules) {
405
+ const rule = rules[key];
406
+ if (typeof rule != "object") continue;
407
+ const { $data } = rule.definition;
408
+ const schema = keywords[key];
409
+ if ($data && schema) keywords[key] = schemaOrData(schema);
410
+ }
411
+ }
412
+ return metaSchema;
413
+ }
414
+ _removeAllSchemas(schemas, regex) {
415
+ for (const keyRef in schemas) {
416
+ const sch = schemas[keyRef];
417
+ if (!regex || regex.test(keyRef)) {
418
+ if (typeof sch == "string") delete schemas[keyRef];
419
+ else if (sch && !sch.meta) {
420
+ this._cache.delete(sch.schema);
421
+ delete schemas[keyRef];
422
+ }
423
+ }
424
+ }
425
+ }
426
+ _addSchema(schema, meta, baseId, validateSchema = this.opts.validateSchema, addSchema = this.opts.addUsedSchema) {
427
+ let id;
428
+ const { schemaId } = this.opts;
429
+ if (typeof schema == "object") id = schema[schemaId];
430
+ else if (this.opts.jtd) throw new Error("schema must be object");
431
+ else if (typeof schema != "boolean") throw new Error("schema must be object or boolean");
432
+ let sch = this._cache.get(schema);
433
+ if (sch !== void 0) return sch;
434
+ baseId = (0, resolve_1.normalizeId)(id || baseId);
435
+ const localRefs = resolve_1.getSchemaRefs.call(this, schema, baseId);
436
+ sch = new compile_1.SchemaEnv({
437
+ schema,
438
+ schemaId,
439
+ meta,
440
+ baseId,
441
+ localRefs
442
+ });
443
+ this._cache.set(sch.schema, sch);
444
+ if (addSchema && !baseId.startsWith("#")) {
445
+ if (baseId) this._checkUnique(baseId);
446
+ this.refs[baseId] = sch;
447
+ }
448
+ if (validateSchema) this.validateSchema(schema, true);
449
+ return sch;
450
+ }
451
+ _checkUnique(id) {
452
+ if (this.schemas[id] || this.refs[id]) throw new Error(`schema with key or id "${id}" already exists`);
453
+ }
454
+ _compileSchemaEnv(sch) {
455
+ if (sch.meta) this._compileMetaSchema(sch);
456
+ else compile_1.compileSchema.call(this, sch);
457
+ /* istanbul ignore if */
458
+ if (!sch.validate) throw new Error("ajv implementation error");
459
+ return sch.validate;
460
+ }
461
+ _compileMetaSchema(sch) {
462
+ const currentOpts = this.opts;
463
+ this.opts = this._metaOpts;
464
+ try {
465
+ compile_1.compileSchema.call(this, sch);
466
+ } finally {
467
+ this.opts = currentOpts;
468
+ }
469
+ }
470
+ };
471
+ Ajv.ValidationError = validation_error_1.default;
472
+ Ajv.MissingRefError = ref_error_1.default;
473
+ exports.default = Ajv;
474
+ function checkOptions(checkOpts, options, msg, log = "error") {
475
+ for (const key in checkOpts) {
476
+ const opt = key;
477
+ if (opt in options) this.logger[log](`${msg}: option ${key}. ${checkOpts[opt]}`);
478
+ }
479
+ }
480
+ function getSchEnv(keyRef) {
481
+ keyRef = (0, resolve_1.normalizeId)(keyRef);
482
+ return this.schemas[keyRef] || this.refs[keyRef];
483
+ }
484
+ function addInitialSchemas() {
485
+ const optsSchemas = this.opts.schemas;
486
+ if (!optsSchemas) return;
487
+ if (Array.isArray(optsSchemas)) this.addSchema(optsSchemas);
488
+ else for (const key in optsSchemas) this.addSchema(optsSchemas[key], key);
489
+ }
490
+ function addInitialFormats() {
491
+ for (const name in this.opts.formats) {
492
+ const format = this.opts.formats[name];
493
+ if (format) this.addFormat(name, format);
494
+ }
495
+ }
496
+ function addInitialKeywords(defs) {
497
+ if (Array.isArray(defs)) {
498
+ this.addVocabulary(defs);
499
+ return;
500
+ }
501
+ this.logger.warn("keywords option as map is deprecated, pass array");
502
+ for (const keyword in defs) {
503
+ const def = defs[keyword];
504
+ if (!def.keyword) def.keyword = keyword;
505
+ this.addKeyword(def);
506
+ }
507
+ }
508
+ function getMetaSchemaOptions() {
509
+ const metaOpts = { ...this.opts };
510
+ for (const opt of META_IGNORE_OPTIONS) delete metaOpts[opt];
511
+ return metaOpts;
512
+ }
513
+ const noLogs = {
514
+ log() {},
515
+ warn() {},
516
+ error() {}
517
+ };
518
+ function getLogger(logger) {
519
+ if (logger === false) return noLogs;
520
+ if (logger === void 0) return console;
521
+ if (logger.log && logger.warn && logger.error) return logger;
522
+ throw new Error("logger must implement log, warn and error methods");
523
+ }
524
+ const KEYWORD_NAME = /^[a-z_$][a-z0-9_$:-]*$/i;
525
+ function checkKeyword(keyword, def) {
526
+ const { RULES } = this;
527
+ (0, util_1.eachItem)(keyword, (kwd) => {
528
+ if (RULES.keywords[kwd]) throw new Error(`Keyword ${kwd} is already defined`);
529
+ if (!KEYWORD_NAME.test(kwd)) throw new Error(`Keyword ${kwd} has invalid name`);
530
+ });
531
+ if (!def) return;
532
+ if (def.$data && !("code" in def || "validate" in def)) throw new Error("$data keyword must have \"code\" or \"validate\" function");
533
+ }
534
+ function addRule(keyword, definition, dataType) {
535
+ var _a;
536
+ const post = definition === null || definition === void 0 ? void 0 : definition.post;
537
+ if (dataType && post) throw new Error("keyword with \"post\" flag cannot have \"type\"");
538
+ const { RULES } = this;
539
+ let ruleGroup = post ? RULES.post : RULES.rules.find(({ type: t }) => t === dataType);
540
+ if (!ruleGroup) {
541
+ ruleGroup = {
542
+ type: dataType,
543
+ rules: []
544
+ };
545
+ RULES.rules.push(ruleGroup);
546
+ }
547
+ RULES.keywords[keyword] = true;
548
+ if (!definition) return;
549
+ const rule = {
550
+ keyword,
551
+ definition: {
552
+ ...definition,
553
+ type: (0, dataType_1.getJSONTypes)(definition.type),
554
+ schemaType: (0, dataType_1.getJSONTypes)(definition.schemaType)
555
+ }
556
+ };
557
+ if (definition.before) addBeforeRule.call(this, ruleGroup, rule, definition.before);
558
+ else ruleGroup.rules.push(rule);
559
+ RULES.all[keyword] = rule;
560
+ (_a = definition.implements) === null || _a === void 0 || _a.forEach((kwd) => this.addKeyword(kwd));
561
+ }
562
+ function addBeforeRule(ruleGroup, rule, before) {
563
+ const i = ruleGroup.rules.findIndex((_rule) => _rule.keyword === before);
564
+ if (i >= 0) ruleGroup.rules.splice(i, 0, rule);
565
+ else {
566
+ ruleGroup.rules.push(rule);
567
+ this.logger.warn(`rule ${before} is not defined`);
568
+ }
569
+ }
570
+ function keywordMetaschema(def) {
571
+ let { metaSchema } = def;
572
+ if (metaSchema === void 0) return;
573
+ if (def.$data && this.opts.$data) metaSchema = schemaOrData(metaSchema);
574
+ def.validateSchema = this.compile(metaSchema, true);
575
+ }
576
+ const $dataRef = { $ref: "https://raw.githubusercontent.com/ajv-validator/ajv/master/lib/refs/data.json#" };
577
+ function schemaOrData(schema) {
578
+ return { anyOf: [schema, $dataRef] };
579
+ }
580
+ }));
581
+ //#endregion
582
+ export default require_core();
583
+ export { require_core };
584
+
585
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vYWp2QDguMjAuMC9ub2RlX21vZHVsZXMvYWp2L2Rpc3QvY29yZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuQ29kZUdlbiA9IGV4cG9ydHMuTmFtZSA9IGV4cG9ydHMubmlsID0gZXhwb3J0cy5zdHJpbmdpZnkgPSBleHBvcnRzLnN0ciA9IGV4cG9ydHMuXyA9IGV4cG9ydHMuS2V5d29yZEN4dCA9IHZvaWQgMDtcbnZhciB2YWxpZGF0ZV8xID0gcmVxdWlyZShcIi4vY29tcGlsZS92YWxpZGF0ZVwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIktleXdvcmRDeHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbGlkYXRlXzEuS2V5d29yZEN4dDsgfSB9KTtcbnZhciBjb2RlZ2VuXzEgPSByZXF1aXJlKFwiLi9jb21waWxlL2NvZGVnZW5cIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb2RlZ2VuXzEuXzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInN0clwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29kZWdlbl8xLnN0cjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcInN0cmluZ2lmeVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29kZWdlbl8xLnN0cmluZ2lmeTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIm5pbFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29kZWdlbl8xLm5pbDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5hbWVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvZGVnZW5fMS5OYW1lOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29kZUdlblwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29kZWdlbl8xLkNvZGVHZW47IH0gfSk7XG5jb25zdCB2YWxpZGF0aW9uX2Vycm9yXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lL3ZhbGlkYXRpb25fZXJyb3JcIik7XG5jb25zdCByZWZfZXJyb3JfMSA9IHJlcXVpcmUoXCIuL2NvbXBpbGUvcmVmX2Vycm9yXCIpO1xuY29uc3QgcnVsZXNfMSA9IHJlcXVpcmUoXCIuL2NvbXBpbGUvcnVsZXNcIik7XG5jb25zdCBjb21waWxlXzEgPSByZXF1aXJlKFwiLi9jb21waWxlXCIpO1xuY29uc3QgY29kZWdlbl8yID0gcmVxdWlyZShcIi4vY29tcGlsZS9jb2RlZ2VuXCIpO1xuY29uc3QgcmVzb2x2ZV8xID0gcmVxdWlyZShcIi4vY29tcGlsZS9yZXNvbHZlXCIpO1xuY29uc3QgZGF0YVR5cGVfMSA9IHJlcXVpcmUoXCIuL2NvbXBpbGUvdmFsaWRhdGUvZGF0YVR5cGVcIik7XG5jb25zdCB1dGlsXzEgPSByZXF1aXJlKFwiLi9jb21waWxlL3V0aWxcIik7XG5jb25zdCAkZGF0YVJlZlNjaGVtYSA9IHJlcXVpcmUoXCIuL3JlZnMvZGF0YS5qc29uXCIpO1xuY29uc3QgdXJpXzEgPSByZXF1aXJlKFwiLi9ydW50aW1lL3VyaVwiKTtcbmNvbnN0IGRlZmF1bHRSZWdFeHAgPSAoc3RyLCBmbGFncykgPT4gbmV3IFJlZ0V4cChzdHIsIGZsYWdzKTtcbmRlZmF1bHRSZWdFeHAuY29kZSA9IFwibmV3IFJlZ0V4cFwiO1xuY29uc3QgTUVUQV9JR05PUkVfT1BUSU9OUyA9IFtcInJlbW92ZUFkZGl0aW9uYWxcIiwgXCJ1c2VEZWZhdWx0c1wiLCBcImNvZXJjZVR5cGVzXCJdO1xuY29uc3QgRVhUX1NDT1BFX05BTUVTID0gbmV3IFNldChbXG4gICAgXCJ2YWxpZGF0ZVwiLFxuICAgIFwic2VyaWFsaXplXCIsXG4gICAgXCJwYXJzZVwiLFxuICAgIFwid3JhcHBlclwiLFxuICAgIFwicm9vdFwiLFxuICAgIFwic2NoZW1hXCIsXG4gICAgXCJrZXl3b3JkXCIsXG4gICAgXCJwYXR0ZXJuXCIsXG4gICAgXCJmb3JtYXRzXCIsXG4gICAgXCJ2YWxpZGF0ZSRkYXRhXCIsXG4gICAgXCJmdW5jXCIsXG4gICAgXCJvYmpcIixcbiAgICBcIkVycm9yXCIsXG5dKTtcbmNvbnN0IHJlbW92ZWRPcHRpb25zID0ge1xuICAgIGVycm9yRGF0YVBhdGg6IFwiXCIsXG4gICAgZm9ybWF0OiBcImB2YWxpZGF0ZUZvcm1hdHM6IGZhbHNlYCBjYW4gYmUgdXNlZCBpbnN0ZWFkLlwiLFxuICAgIG51bGxhYmxlOiAnXCJudWxsYWJsZVwiIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuJyxcbiAgICBqc29uUG9pbnRlcnM6IFwiRGVwcmVjYXRlZCBqc1Byb3BlcnR5U3ludGF4IGNhbiBiZSB1c2VkIGluc3RlYWQuXCIsXG4gICAgZXh0ZW5kUmVmczogXCJEZXByZWNhdGVkIGlnbm9yZUtleXdvcmRzV2l0aFJlZiBjYW4gYmUgdXNlZCBpbnN0ZWFkLlwiLFxuICAgIG1pc3NpbmdSZWZzOiBcIlBhc3MgZW1wdHkgc2NoZW1hIHdpdGggJGlkIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgdG8gYWp2LmFkZFNjaGVtYS5cIixcbiAgICBwcm9jZXNzQ29kZTogXCJVc2Ugb3B0aW9uIGBjb2RlOiB7cHJvY2VzczogKGNvZGUsIHNjaGVtYUVudjogb2JqZWN0KSA9PiBzdHJpbmd9YFwiLFxuICAgIHNvdXJjZUNvZGU6IFwiVXNlIG9wdGlvbiBgY29kZToge3NvdXJjZTogdHJ1ZX1gXCIsXG4gICAgc3RyaWN0RGVmYXVsdHM6IFwiSXQgaXMgZGVmYXVsdCBub3csIHNlZSBvcHRpb24gYHN0cmljdGAuXCIsXG4gICAgc3RyaWN0S2V5d29yZHM6IFwiSXQgaXMgZGVmYXVsdCBub3csIHNlZSBvcHRpb24gYHN0cmljdGAuXCIsXG4gICAgdW5pcXVlSXRlbXM6ICdcInVuaXF1ZUl0ZW1zXCIga2V5d29yZCBpcyBhbHdheXMgdmFsaWRhdGVkLicsXG4gICAgdW5rbm93bkZvcm1hdHM6IFwiRGlzYWJsZSBzdHJpY3QgbW9kZSBvciBwYXNzIGB0cnVlYCB0byBgYWp2LmFkZEZvcm1hdGAgKG9yIGBmb3JtYXRzYCBvcHRpb24pLlwiLFxuICAgIGNhY2hlOiBcIk1hcCBpcyB1c2VkIGFzIGNhY2hlLCBzY2hlbWEgb2JqZWN0IGFzIGtleS5cIixcbiAgICBzZXJpYWxpemU6IFwiTWFwIGlzIHVzZWQgYXMgY2FjaGUsIHNjaGVtYSBvYmplY3QgYXMga2V5LlwiLFxuICAgIGFqdkVycm9yczogXCJJdCBpcyBkZWZhdWx0IG5vdy5cIixcbn07XG5jb25zdCBkZXByZWNhdGVkT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVLZXl3b3Jkc1dpdGhSZWY6IFwiXCIsXG4gICAganNQcm9wZXJ0eVN5bnRheDogXCJcIixcbiAgICB1bmljb2RlOiAnXCJtaW5MZW5ndGhcIi9cIm1heExlbmd0aFwiIGFjY291bnQgZm9yIHVuaWNvZGUgY2hhcmFjdGVycyBieSBkZWZhdWx0LicsXG59O1xuY29uc3QgTUFYX0VYUFJFU1NJT04gPSAyMDA7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gcmVxdWlyZWRPcHRpb25zKG8pIHtcbiAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lLCBfZiwgX2csIF9oLCBfaiwgX2ssIF9sLCBfbSwgX28sIF9wLCBfcSwgX3IsIF9zLCBfdCwgX3UsIF92LCBfdywgX3gsIF95LCBfeiwgXzA7XG4gICAgY29uc3QgcyA9IG8uc3RyaWN0O1xuICAgIGNvbnN0IF9vcHR6ID0gKF9hID0gby5jb2RlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eub3B0aW1pemU7XG4gICAgY29uc3Qgb3B0aW1pemUgPSBfb3B0eiA9PT0gdHJ1ZSB8fCBfb3B0eiA9PT0gdW5kZWZpbmVkID8gMSA6IF9vcHR6IHx8IDA7XG4gICAgY29uc3QgcmVnRXhwID0gKF9jID0gKF9iID0gby5jb2RlKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IucmVnRXhwKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBkZWZhdWx0UmVnRXhwO1xuICAgIGNvbnN0IHVyaVJlc29sdmVyID0gKF9kID0gby51cmlSZXNvbHZlcikgIT09IG51bGwgJiYgX2QgIT09IHZvaWQgMCA/IF9kIDogdXJpXzEuZGVmYXVsdDtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdHJpY3RTY2hlbWE6IChfZiA9IChfZSA9IG8uc3RyaWN0U2NoZW1hKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiBzKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiB0cnVlLFxuICAgICAgICBzdHJpY3ROdW1iZXJzOiAoX2ggPSAoX2cgPSBvLnN0cmljdE51bWJlcnMpICE9PSBudWxsICYmIF9nICE9PSB2b2lkIDAgPyBfZyA6IHMpICE9PSBudWxsICYmIF9oICE9PSB2b2lkIDAgPyBfaCA6IHRydWUsXG4gICAgICAgIHN0cmljdFR5cGVzOiAoX2sgPSAoX2ogPSBvLnN0cmljdFR5cGVzKSAhPT0gbnVsbCAmJiBfaiAhPT0gdm9pZCAwID8gX2ogOiBzKSAhPT0gbnVsbCAmJiBfayAhPT0gdm9pZCAwID8gX2sgOiBcImxvZ1wiLFxuICAgICAgICBzdHJpY3RUdXBsZXM6IChfbSA9IChfbCA9IG8uc3RyaWN0VHVwbGVzKSAhPT0gbnVsbCAmJiBfbCAhPT0gdm9pZCAwID8gX2wgOiBzKSAhPT0gbnVsbCAmJiBfbSAhPT0gdm9pZCAwID8gX20gOiBcImxvZ1wiLFxuICAgICAgICBzdHJpY3RSZXF1aXJlZDogKF9wID0gKF9vID0gby5zdHJpY3RSZXF1aXJlZCkgIT09IG51bGwgJiYgX28gIT09IHZvaWQgMCA/IF9vIDogcykgIT09IG51bGwgJiYgX3AgIT09IHZvaWQgMCA/IF9wIDogZmFsc2UsXG4gICAgICAgIGNvZGU6IG8uY29kZSA/IHsgLi4uby5jb2RlLCBvcHRpbWl6ZSwgcmVnRXhwIH0gOiB7IG9wdGltaXplLCByZWdFeHAgfSxcbiAgICAgICAgbG9vcFJlcXVpcmVkOiAoX3EgPSBvLmxvb3BSZXF1aXJlZCkgIT09IG51bGwgJiYgX3EgIT09IHZvaWQgMCA/IF9xIDogTUFYX0VYUFJFU1NJT04sXG4gICAgICAgIGxvb3BFbnVtOiAoX3IgPSBvLmxvb3BFbnVtKSAhPT0gbnVsbCAmJiBfciAhPT0gdm9pZCAwID8gX3IgOiBNQVhfRVhQUkVTU0lPTixcbiAgICAgICAgbWV0YTogKF9zID0gby5tZXRhKSAhPT0gbnVsbCAmJiBfcyAhPT0gdm9pZCAwID8gX3MgOiB0cnVlLFxuICAgICAgICBtZXNzYWdlczogKF90ID0gby5tZXNzYWdlcykgIT09IG51bGwgJiYgX3QgIT09IHZvaWQgMCA/IF90IDogdHJ1ZSxcbiAgICAgICAgaW5saW5lUmVmczogKF91ID0gby5pbmxpbmVSZWZzKSAhPT0gbnVsbCAmJiBfdSAhPT0gdm9pZCAwID8gX3UgOiB0cnVlLFxuICAgICAgICBzY2hlbWFJZDogKF92ID0gby5zY2hlbWFJZCkgIT09IG51bGwgJiYgX3YgIT09IHZvaWQgMCA/IF92IDogXCIkaWRcIixcbiAgICAgICAgYWRkVXNlZFNjaGVtYTogKF93ID0gby5hZGRVc2VkU2NoZW1hKSAhPT0gbnVsbCAmJiBfdyAhPT0gdm9pZCAwID8gX3cgOiB0cnVlLFxuICAgICAgICB2YWxpZGF0ZVNjaGVtYTogKF94ID0gby52YWxpZGF0ZVNjaGVtYSkgIT09IG51bGwgJiYgX3ggIT09IHZvaWQgMCA/IF94IDogdHJ1ZSxcbiAgICAgICAgdmFsaWRhdGVGb3JtYXRzOiAoX3kgPSBvLnZhbGlkYXRlRm9ybWF0cykgIT09IG51bGwgJiYgX3kgIT09IHZvaWQgMCA/IF95IDogdHJ1ZSxcbiAgICAgICAgdW5pY29kZVJlZ0V4cDogKF96ID0gby51bmljb2RlUmVnRXhwKSAhPT0gbnVsbCAmJiBfeiAhPT0gdm9pZCAwID8gX3ogOiB0cnVlLFxuICAgICAgICBpbnQzMnJhbmdlOiAoXzAgPSBvLmludDMycmFuZ2UpICE9PSBudWxsICYmIF8wICE9PSB2b2lkIDAgPyBfMCA6IHRydWUsXG4gICAgICAgIHVyaVJlc29sdmVyOiB1cmlSZXNvbHZlcixcbiAgICB9O1xufVxuY2xhc3MgQWp2IHtcbiAgICBjb25zdHJ1Y3RvcihvcHRzID0ge30pIHtcbiAgICAgICAgdGhpcy5zY2hlbWFzID0ge307XG4gICAgICAgIHRoaXMucmVmcyA9IHt9O1xuICAgICAgICB0aGlzLmZvcm1hdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9jb21waWxhdGlvbnMgPSBuZXcgU2V0KCk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmcgPSB7fTtcbiAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgTWFwKCk7XG4gICAgICAgIG9wdHMgPSB0aGlzLm9wdHMgPSB7IC4uLm9wdHMsIC4uLnJlcXVpcmVkT3B0aW9ucyhvcHRzKSB9O1xuICAgICAgICBjb25zdCB7IGVzNSwgbGluZXMgfSA9IHRoaXMub3B0cy5jb2RlO1xuICAgICAgICB0aGlzLnNjb3BlID0gbmV3IGNvZGVnZW5fMi5WYWx1ZVNjb3BlKHsgc2NvcGU6IHt9LCBwcmVmaXhlczogRVhUX1NDT1BFX05BTUVTLCBlczUsIGxpbmVzIH0pO1xuICAgICAgICB0aGlzLmxvZ2dlciA9IGdldExvZ2dlcihvcHRzLmxvZ2dlcik7XG4gICAgICAgIGNvbnN0IGZvcm1hdE9wdCA9IG9wdHMudmFsaWRhdGVGb3JtYXRzO1xuICAgICAgICBvcHRzLnZhbGlkYXRlRm9ybWF0cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLlJVTEVTID0gKDAsIHJ1bGVzXzEuZ2V0UnVsZXMpKCk7XG4gICAgICAgIGNoZWNrT3B0aW9ucy5jYWxsKHRoaXMsIHJlbW92ZWRPcHRpb25zLCBvcHRzLCBcIk5PVCBTVVBQT1JURURcIik7XG4gICAgICAgIGNoZWNrT3B0aW9ucy5jYWxsKHRoaXMsIGRlcHJlY2F0ZWRPcHRpb25zLCBvcHRzLCBcIkRFUFJFQ0FURURcIiwgXCJ3YXJuXCIpO1xuICAgICAgICB0aGlzLl9tZXRhT3B0cyA9IGdldE1ldGFTY2hlbWFPcHRpb25zLmNhbGwodGhpcyk7XG4gICAgICAgIGlmIChvcHRzLmZvcm1hdHMpXG4gICAgICAgICAgICBhZGRJbml0aWFsRm9ybWF0cy5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLl9hZGRWb2NhYnVsYXJpZXMoKTtcbiAgICAgICAgdGhpcy5fYWRkRGVmYXVsdE1ldGFTY2hlbWEoKTtcbiAgICAgICAgaWYgKG9wdHMua2V5d29yZHMpXG4gICAgICAgICAgICBhZGRJbml0aWFsS2V5d29yZHMuY2FsbCh0aGlzLCBvcHRzLmtleXdvcmRzKTtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRzLm1ldGEgPT0gXCJvYmplY3RcIilcbiAgICAgICAgICAgIHRoaXMuYWRkTWV0YVNjaGVtYShvcHRzLm1ldGEpO1xuICAgICAgICBhZGRJbml0aWFsU2NoZW1hcy5jYWxsKHRoaXMpO1xuICAgICAgICBvcHRzLnZhbGlkYXRlRm9ybWF0cyA9IGZvcm1hdE9wdDtcbiAgICB9XG4gICAgX2FkZFZvY2FidWxhcmllcygpIHtcbiAgICAgICAgdGhpcy5hZGRLZXl3b3JkKFwiJGFzeW5jXCIpO1xuICAgIH1cbiAgICBfYWRkRGVmYXVsdE1ldGFTY2hlbWEoKSB7XG4gICAgICAgIGNvbnN0IHsgJGRhdGEsIG1ldGEsIHNjaGVtYUlkIH0gPSB0aGlzLm9wdHM7XG4gICAgICAgIGxldCBfZGF0YVJlZlNjaGVtYSA9ICRkYXRhUmVmU2NoZW1hO1xuICAgICAgICBpZiAoc2NoZW1hSWQgPT09IFwiaWRcIikge1xuICAgICAgICAgICAgX2RhdGFSZWZTY2hlbWEgPSB7IC4uLiRkYXRhUmVmU2NoZW1hIH07XG4gICAgICAgICAgICBfZGF0YVJlZlNjaGVtYS5pZCA9IF9kYXRhUmVmU2NoZW1hLiRpZDtcbiAgICAgICAgICAgIGRlbGV0ZSBfZGF0YVJlZlNjaGVtYS4kaWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1ldGEgJiYgJGRhdGEpXG4gICAgICAgICAgICB0aGlzLmFkZE1ldGFTY2hlbWEoX2RhdGFSZWZTY2hlbWEsIF9kYXRhUmVmU2NoZW1hW3NjaGVtYUlkXSwgZmFsc2UpO1xuICAgIH1cbiAgICBkZWZhdWx0TWV0YSgpIHtcbiAgICAgICAgY29uc3QgeyBtZXRhLCBzY2hlbWFJZCB9ID0gdGhpcy5vcHRzO1xuICAgICAgICByZXR1cm4gKHRoaXMub3B0cy5kZWZhdWx0TWV0YSA9IHR5cGVvZiBtZXRhID09IFwib2JqZWN0XCIgPyBtZXRhW3NjaGVtYUlkXSB8fCBtZXRhIDogdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgdmFsaWRhdGUoc2NoZW1hS2V5UmVmLCAvLyBrZXksIHJlZiBvciBzY2hlbWEgb2JqZWN0XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZWR1bmRhbnQtdHlwZS1jb25zdGl0dWVudHNcbiAgICBkYXRhIC8vIHRvIGJlIHZhbGlkYXRlZFxuICAgICkge1xuICAgICAgICBsZXQgdjtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFLZXlSZWYgPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdiA9IHRoaXMuZ2V0U2NoZW1hKHNjaGVtYUtleVJlZik7XG4gICAgICAgICAgICBpZiAoIXYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBzY2hlbWEgd2l0aCBrZXkgb3IgcmVmIFwiJHtzY2hlbWFLZXlSZWZ9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHYgPSB0aGlzLmNvbXBpbGUoc2NoZW1hS2V5UmVmKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWxpZCA9IHYoZGF0YSk7XG4gICAgICAgIGlmICghKFwiJGFzeW5jXCIgaW4gdikpXG4gICAgICAgICAgICB0aGlzLmVycm9ycyA9IHYuZXJyb3JzO1xuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIGNvbXBpbGUoc2NoZW1hLCBfbWV0YSkge1xuICAgICAgICBjb25zdCBzY2ggPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfbWV0YSk7XG4gICAgICAgIHJldHVybiAoc2NoLnZhbGlkYXRlIHx8IHRoaXMuX2NvbXBpbGVTY2hlbWFFbnYoc2NoKSk7XG4gICAgfVxuICAgIGNvbXBpbGVBc3luYyhzY2hlbWEsIG1ldGEpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdHMubG9hZFNjaGVtYSAhPSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIm9wdGlvbnMubG9hZFNjaGVtYSBzaG91bGQgYmUgYSBmdW5jdGlvblwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGxvYWRTY2hlbWEgfSA9IHRoaXMub3B0cztcbiAgICAgICAgcmV0dXJuIHJ1bkNvbXBpbGVBc3luYy5jYWxsKHRoaXMsIHNjaGVtYSwgbWV0YSk7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIHJ1bkNvbXBpbGVBc3luYyhfc2NoZW1hLCBfbWV0YSkge1xuICAgICAgICAgICAgYXdhaXQgbG9hZE1ldGFTY2hlbWEuY2FsbCh0aGlzLCBfc2NoZW1hLiRzY2hlbWEpO1xuICAgICAgICAgICAgY29uc3Qgc2NoID0gdGhpcy5fYWRkU2NoZW1hKF9zY2hlbWEsIF9tZXRhKTtcbiAgICAgICAgICAgIHJldHVybiBzY2gudmFsaWRhdGUgfHwgX2NvbXBpbGVBc3luYy5jYWxsKHRoaXMsIHNjaCk7XG4gICAgICAgIH1cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gbG9hZE1ldGFTY2hlbWEoJHJlZikge1xuICAgICAgICAgICAgaWYgKCRyZWYgJiYgIXRoaXMuZ2V0U2NoZW1hKCRyZWYpKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcnVuQ29tcGlsZUFzeW5jLmNhbGwodGhpcywgeyAkcmVmIH0sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIF9jb21waWxlQXN5bmMoc2NoKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21waWxlU2NoZW1hRW52KHNjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGlmICghKGUgaW5zdGFuY2VvZiByZWZfZXJyb3JfMS5kZWZhdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgICAgICBjaGVja0xvYWRlZC5jYWxsKHRoaXMsIGUpO1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nU2NoZW1hLmNhbGwodGhpcywgZS5taXNzaW5nU2NoZW1hKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2NvbXBpbGVBc3luYy5jYWxsKHRoaXMsIHNjaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2FkZWQoeyBtaXNzaW5nU2NoZW1hOiByZWYsIG1pc3NpbmdSZWYgfSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVmc1tyZWZdKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbnlTY2hlbWEgJHtyZWZ9IGlzIGxvYWRlZCBidXQgJHttaXNzaW5nUmVmfSBjYW5ub3QgYmUgcmVzb2x2ZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmdW5jdGlvbiBsb2FkTWlzc2luZ1NjaGVtYShyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IF9zY2hlbWEgPSBhd2FpdCBfbG9hZFNjaGVtYS5jYWxsKHRoaXMsIHJlZik7XG4gICAgICAgICAgICBpZiAoIXRoaXMucmVmc1tyZWZdKVxuICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRNZXRhU2NoZW1hLmNhbGwodGhpcywgX3NjaGVtYS4kc2NoZW1hKTtcbiAgICAgICAgICAgIGlmICghdGhpcy5yZWZzW3JlZl0pXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRTY2hlbWEoX3NjaGVtYSwgcmVmLCBtZXRhKTtcbiAgICAgICAgfVxuICAgICAgICBhc3luYyBmdW5jdGlvbiBfbG9hZFNjaGVtYShyZWYpIHtcbiAgICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLl9sb2FkaW5nW3JlZl07XG4gICAgICAgICAgICBpZiAocClcbiAgICAgICAgICAgICAgICByZXR1cm4gcDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0ICh0aGlzLl9sb2FkaW5nW3JlZl0gPSBsb2FkU2NoZW1hKHJlZikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2xvYWRpbmdbcmVmXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBBZGRzIHNjaGVtYSB0byB0aGUgaW5zdGFuY2VcbiAgICBhZGRTY2hlbWEoc2NoZW1hLCAvLyBJZiBhcnJheSBpcyBwYXNzZWQsIGBrZXlgIHdpbGwgYmUgaWdub3JlZFxuICAgIGtleSwgLy8gT3B0aW9uYWwgc2NoZW1hIGtleS4gQ2FuIGJlIHBhc3NlZCB0byBgdmFsaWRhdGVgIG1ldGhvZCBpbnN0ZWFkIG9mIHNjaGVtYSBvYmplY3Qgb3IgaWQvcmVmLiBPbmUgc2NoZW1hIHBlciBpbnN0YW5jZSBjYW4gaGF2ZSBlbXB0eSBgaWRgIGFuZCBga2V5YC5cbiAgICBfbWV0YSwgLy8gdHJ1ZSBpZiBzY2hlbWEgaXMgYSBtZXRhLXNjaGVtYS4gVXNlZCBpbnRlcm5hbGx5LCBhZGRNZXRhU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgX3ZhbGlkYXRlU2NoZW1hID0gdGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hIC8vIGZhbHNlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24uIFVzZWQgaW50ZXJuYWxseSwgb3B0aW9uIHZhbGlkYXRlU2NoZW1hIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuXG4gICAgKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc2NoIG9mIHNjaGVtYSlcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFNjaGVtYShzY2gsIHVuZGVmaW5lZCwgX21ldGEsIF92YWxpZGF0ZVNjaGVtYSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBjb25zdCB7IHNjaGVtYUlkIH0gPSB0aGlzLm9wdHM7XG4gICAgICAgICAgICBpZCA9IHNjaGVtYVtzY2hlbWFJZF07XG4gICAgICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgaWQgIT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc2NoZW1hICR7c2NoZW1hSWR9IG11c3QgYmUgc3RyaW5nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5ID0gKDAsIHJlc29sdmVfMS5ub3JtYWxpemVJZCkoa2V5IHx8IGlkKTtcbiAgICAgICAgdGhpcy5fY2hlY2tVbmlxdWUoa2V5KTtcbiAgICAgICAgdGhpcy5zY2hlbWFzW2tleV0gPSB0aGlzLl9hZGRTY2hlbWEoc2NoZW1hLCBfbWV0YSwga2V5LCBfdmFsaWRhdGVTY2hlbWEsIHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgLy8gQWRkIHNjaGVtYSB0aGF0IHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSBvdGhlciBzY2hlbWFzXG4gICAgLy8gb3B0aW9ucyBpbiBNRVRBX0lHTk9SRV9PUFRJT05TIGFyZSBhbHdheSBzZXQgdG8gZmFsc2VcbiAgICBhZGRNZXRhU2NoZW1hKHNjaGVtYSwga2V5LCAvLyBzY2hlbWEga2V5XG4gICAgX3ZhbGlkYXRlU2NoZW1hID0gdGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hIC8vIGZhbHNlIHRvIHNraXAgc2NoZW1hIHZhbGlkYXRpb24sIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHZhbGlkYXRlU2NoZW1hIG9wdGlvbiBmb3IgbWV0YS1zY2hlbWFcbiAgICApIHtcbiAgICAgICAgdGhpcy5hZGRTY2hlbWEoc2NoZW1hLCBrZXksIHRydWUsIF92YWxpZGF0ZVNjaGVtYSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyAgVmFsaWRhdGUgc2NoZW1hIGFnYWluc3QgaXRzIG1ldGEtc2NoZW1hXG4gICAgdmFsaWRhdGVTY2hlbWEoc2NoZW1hLCB0aHJvd09yTG9nRXJyb3IpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEgPT0gXCJib29sZWFuXCIpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgbGV0ICRzY2hlbWE7XG4gICAgICAgICRzY2hlbWEgPSBzY2hlbWEuJHNjaGVtYTtcbiAgICAgICAgaWYgKCRzY2hlbWEgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgJHNjaGVtYSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIkc2NoZW1hIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgJHNjaGVtYSA9ICRzY2hlbWEgfHwgdGhpcy5vcHRzLmRlZmF1bHRNZXRhIHx8IHRoaXMuZGVmYXVsdE1ldGEoKTtcbiAgICAgICAgaWYgKCEkc2NoZW1hKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwibWV0YS1zY2hlbWEgbm90IGF2YWlsYWJsZVwiKTtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkID0gdGhpcy52YWxpZGF0ZSgkc2NoZW1hLCBzY2hlbWEpO1xuICAgICAgICBpZiAoIXZhbGlkICYmIHRocm93T3JMb2dFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFwic2NoZW1hIGlzIGludmFsaWQ6IFwiICsgdGhpcy5lcnJvcnNUZXh0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLnZhbGlkYXRlU2NoZW1hID09PSBcImxvZ1wiKVxuICAgICAgICAgICAgICAgIHRoaXMubG9nZ2VyLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsaWQ7XG4gICAgfVxuICAgIC8vIEdldCBjb21waWxlZCBzY2hlbWEgYnkgYGtleWAgb3IgYHJlZmAuXG4gICAgLy8gKGBrZXlgIHRoYXQgd2FzIHBhc3NlZCB0byBgYWRkU2NoZW1hYCBvciBmdWxsIHNjaGVtYSByZWZlcmVuY2UgLSBgc2NoZW1hLiRpZGAgb3IgcmVzb2x2ZWQgaWQpXG4gICAgZ2V0U2NoZW1hKGtleVJlZikge1xuICAgICAgICBsZXQgc2NoO1xuICAgICAgICB3aGlsZSAodHlwZW9mIChzY2ggPSBnZXRTY2hFbnYuY2FsbCh0aGlzLCBrZXlSZWYpKSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAga2V5UmVmID0gc2NoO1xuICAgICAgICBpZiAoc2NoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc2NoZW1hSWQgfSA9IHRoaXMub3B0cztcbiAgICAgICAgICAgIGNvbnN0IHJvb3QgPSBuZXcgY29tcGlsZV8xLlNjaGVtYUVudih7IHNjaGVtYToge30sIHNjaGVtYUlkIH0pO1xuICAgICAgICAgICAgc2NoID0gY29tcGlsZV8xLnJlc29sdmVTY2hlbWEuY2FsbCh0aGlzLCByb290LCBrZXlSZWYpO1xuICAgICAgICAgICAgaWYgKCFzY2gpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5yZWZzW2tleVJlZl0gPSBzY2g7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChzY2gudmFsaWRhdGUgfHwgdGhpcy5fY29tcGlsZVNjaGVtYUVudihzY2gpKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGNhY2hlZCBzY2hlbWEocykuXG4gICAgLy8gSWYgbm8gcGFyYW1ldGVyIGlzIHBhc3NlZCBhbGwgc2NoZW1hcyBidXQgbWV0YS1zY2hlbWFzIGFyZSByZW1vdmVkLlxuICAgIC8vIElmIFJlZ0V4cCBpcyBwYXNzZWQgYWxsIHNjaGVtYXMgd2l0aCBrZXkvaWQgbWF0Y2hpbmcgcGF0dGVybiBidXQgbWV0YS1zY2hlbWFzIGFyZSByZW1vdmVkLlxuICAgIC8vIEV2ZW4gaWYgc2NoZW1hIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgc2NoZW1hcyBpdCBzdGlsbCBjYW4gYmUgcmVtb3ZlZCBhcyBvdGhlciBzY2hlbWFzIGhhdmUgbG9jYWwgcmVmZXJlbmNlcy5cbiAgICByZW1vdmVTY2hlbWEoc2NoZW1hS2V5UmVmKSB7XG4gICAgICAgIGlmIChzY2hlbWFLZXlSZWYgaW5zdGFuY2VvZiBSZWdFeHApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFsbFNjaGVtYXModGhpcy5zY2hlbWFzLCBzY2hlbWFLZXlSZWYpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMsIHNjaGVtYUtleVJlZik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHR5cGVvZiBzY2hlbWFLZXlSZWYpIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVBbGxTY2hlbWFzKHRoaXMuc2NoZW1hcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQWxsU2NoZW1hcyh0aGlzLnJlZnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzY2ggPSBnZXRTY2hFbnYuY2FsbCh0aGlzLCBzY2hlbWFLZXlSZWYpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2NoID09IFwib2JqZWN0XCIpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShzY2guc2NoZW1hKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2hlbWFzW3NjaGVtYUtleVJlZl07XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMucmVmc1tzY2hlbWFLZXlSZWZdO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBzY2hlbWFLZXlSZWY7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGUuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICBsZXQgaWQgPSBzY2hlbWFLZXlSZWZbdGhpcy5vcHRzLnNjaGVtYUlkXTtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWQgPSAoMCwgcmVzb2x2ZV8xLm5vcm1hbGl6ZUlkKShpZCk7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnNjaGVtYXNbaWRdO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5yZWZzW2lkXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFqdi5yZW1vdmVTY2hlbWE6IGludmFsaWQgcGFyYW1ldGVyXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGFkZCBcInZvY2FidWxhcnlcIiAtIGEgY29sbGVjdGlvbiBvZiBrZXl3b3Jkc1xuICAgIGFkZFZvY2FidWxhcnkoZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkZWYgb2YgZGVmaW5pdGlvbnMpXG4gICAgICAgICAgICB0aGlzLmFkZEtleXdvcmQoZGVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFkZEtleXdvcmQoa3dkT3JEZWYsIGRlZiAvLyBkZXByZWNhdGVkXG4gICAgKSB7XG4gICAgICAgIGxldCBrZXl3b3JkO1xuICAgICAgICBpZiAodHlwZW9mIGt3ZE9yRGVmID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGtleXdvcmQgPSBrd2RPckRlZjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGVmID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwidGhlc2UgcGFyYW1ldGVycyBhcmUgZGVwcmVjYXRlZCwgc2VlIGRvY3MgZm9yIGFkZEtleXdvcmRcIik7XG4gICAgICAgICAgICAgICAgZGVmLmtleXdvcmQgPSBrZXl3b3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBrd2RPckRlZiA9PSBcIm9iamVjdFwiICYmIGRlZiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkZWYgPSBrd2RPckRlZjtcbiAgICAgICAgICAgIGtleXdvcmQgPSBkZWYua2V5d29yZDtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXdvcmQpICYmICFrZXl3b3JkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImFkZEtleXdvcmRzOiBrZXl3b3JkIG11c3QgYmUgc3RyaW5nIG9yIG5vbi1lbXB0eSBhcnJheVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgYWRkS2V5d29yZHMgcGFyYW1ldGVyc1wiKTtcbiAgICAgICAgfVxuICAgICAgICBjaGVja0tleXdvcmQuY2FsbCh0aGlzLCBrZXl3b3JkLCBkZWYpO1xuICAgICAgICBpZiAoIWRlZikge1xuICAgICAgICAgICAgKDAsIHV0aWxfMS5lYWNoSXRlbSkoa2V5d29yZCwgKGt3ZCkgPT4gYWRkUnVsZS5jYWxsKHRoaXMsIGt3ZCkpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAga2V5d29yZE1ldGFzY2hlbWEuY2FsbCh0aGlzLCBkZWYpO1xuICAgICAgICBjb25zdCBkZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgLi4uZGVmLFxuICAgICAgICAgICAgdHlwZTogKDAsIGRhdGFUeXBlXzEuZ2V0SlNPTlR5cGVzKShkZWYudHlwZSksXG4gICAgICAgICAgICBzY2hlbWFUeXBlOiAoMCwgZGF0YVR5cGVfMS5nZXRKU09OVHlwZXMpKGRlZi5zY2hlbWFUeXBlKSxcbiAgICAgICAgfTtcbiAgICAgICAgKDAsIHV0aWxfMS5lYWNoSXRlbSkoa2V5d29yZCwgZGVmaW5pdGlvbi50eXBlLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgPyAoaykgPT4gYWRkUnVsZS5jYWxsKHRoaXMsIGssIGRlZmluaXRpb24pXG4gICAgICAgICAgICA6IChrKSA9PiBkZWZpbml0aW9uLnR5cGUuZm9yRWFjaCgodCkgPT4gYWRkUnVsZS5jYWxsKHRoaXMsIGssIGRlZmluaXRpb24sIHQpKSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBnZXRLZXl3b3JkKGtleXdvcmQpIHtcbiAgICAgICAgY29uc3QgcnVsZSA9IHRoaXMuUlVMRVMuYWxsW2tleXdvcmRdO1xuICAgICAgICByZXR1cm4gdHlwZW9mIHJ1bGUgPT0gXCJvYmplY3RcIiA/IHJ1bGUuZGVmaW5pdGlvbiA6ICEhcnVsZTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGtleXdvcmRcbiAgICByZW1vdmVLZXl3b3JkKGtleXdvcmQpIHtcbiAgICAgICAgLy8gVE9ETyByZXR1cm4gdHlwZSBzaG91bGQgYmUgQWp2XG4gICAgICAgIGNvbnN0IHsgUlVMRVMgfSA9IHRoaXM7XG4gICAgICAgIGRlbGV0ZSBSVUxFUy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgICAgICAgZGVsZXRlIFJVTEVTLmFsbFtrZXl3b3JkXTtcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBSVUxFUy5ydWxlcykge1xuICAgICAgICAgICAgY29uc3QgaSA9IGdyb3VwLnJ1bGVzLmZpbmRJbmRleCgocnVsZSkgPT4gcnVsZS5rZXl3b3JkID09PSBrZXl3b3JkKTtcbiAgICAgICAgICAgIGlmIChpID49IDApXG4gICAgICAgICAgICAgICAgZ3JvdXAucnVsZXMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICAvLyBBZGQgZm9ybWF0XG4gICAgYWRkRm9ybWF0KG5hbWUsIGZvcm1hdCkge1xuICAgICAgICBpZiAodHlwZW9mIGZvcm1hdCA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgZm9ybWF0ID0gbmV3IFJlZ0V4cChmb3JtYXQpO1xuICAgICAgICB0aGlzLmZvcm1hdHNbbmFtZV0gPSBmb3JtYXQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBlcnJvcnNUZXh0KGVycm9ycyA9IHRoaXMuZXJyb3JzLCAvLyBvcHRpb25hbCBhcnJheSBvZiB2YWxpZGF0aW9uIGVycm9yc1xuICAgIHsgc2VwYXJhdG9yID0gXCIsIFwiLCBkYXRhVmFyID0gXCJkYXRhXCIgfSA9IHt9IC8vIG9wdGlvbmFsIG9wdGlvbnMgd2l0aCBwcm9wZXJ0aWVzIGBzZXBhcmF0b3JgIGFuZCBgZGF0YVZhcmBcbiAgICApIHtcbiAgICAgICAgaWYgKCFlcnJvcnMgfHwgZXJyb3JzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBcIk5vIGVycm9yc1wiO1xuICAgICAgICByZXR1cm4gZXJyb3JzXG4gICAgICAgICAgICAubWFwKChlKSA9PiBgJHtkYXRhVmFyfSR7ZS5pbnN0YW5jZVBhdGh9ICR7ZS5tZXNzYWdlfWApXG4gICAgICAgICAgICAucmVkdWNlKCh0ZXh0LCBtc2cpID0+IHRleHQgKyBzZXBhcmF0b3IgKyBtc2cpO1xuICAgIH1cbiAgICAkZGF0YU1ldGFTY2hlbWEobWV0YVNjaGVtYSwga2V5d29yZHNKc29uUG9pbnRlcnMpIHtcbiAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLlJVTEVTLmFsbDtcbiAgICAgICAgbWV0YVNjaGVtYSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobWV0YVNjaGVtYSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGpzb25Qb2ludGVyIG9mIGtleXdvcmRzSnNvblBvaW50ZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBzZWdtZW50cyA9IGpzb25Qb2ludGVyLnNwbGl0KFwiL1wiKS5zbGljZSgxKTsgLy8gZmlyc3Qgc2VnbWVudCBpcyBhbiBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgIGxldCBrZXl3b3JkcyA9IG1ldGFTY2hlbWE7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlZyBvZiBzZWdtZW50cylcbiAgICAgICAgICAgICAgICBrZXl3b3JkcyA9IGtleXdvcmRzW3NlZ107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBydWxlcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBydWxlc1trZXldO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcnVsZSAhPSBcIm9iamVjdFwiKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCB7ICRkYXRhIH0gPSBydWxlLmRlZmluaXRpb247XG4gICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0ga2V5d29yZHNba2V5XTtcbiAgICAgICAgICAgICAgICBpZiAoJGRhdGEgJiYgc2NoZW1hKVxuICAgICAgICAgICAgICAgICAgICBrZXl3b3Jkc1trZXldID0gc2NoZW1hT3JEYXRhKHNjaGVtYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFTY2hlbWE7XG4gICAgfVxuICAgIF9yZW1vdmVBbGxTY2hlbWFzKHNjaGVtYXMsIHJlZ2V4KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5UmVmIGluIHNjaGVtYXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNjaCA9IHNjaGVtYXNba2V5UmVmXTtcbiAgICAgICAgICAgIGlmICghcmVnZXggfHwgcmVnZXgudGVzdChrZXlSZWYpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzY2ggPT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2NoZW1hc1trZXlSZWZdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzY2ggJiYgIXNjaC5tZXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlLmRlbGV0ZShzY2guc2NoZW1hKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHNjaGVtYXNba2V5UmVmXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgX2FkZFNjaGVtYShzY2hlbWEsIG1ldGEsIGJhc2VJZCwgdmFsaWRhdGVTY2hlbWEgPSB0aGlzLm9wdHMudmFsaWRhdGVTY2hlbWEsIGFkZFNjaGVtYSA9IHRoaXMub3B0cy5hZGRVc2VkU2NoZW1hKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgY29uc3QgeyBzY2hlbWFJZCB9ID0gdGhpcy5vcHRzO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYSA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZCA9IHNjaGVtYVtzY2hlbWFJZF07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRzLmp0ZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzY2hlbWEgbXVzdCBiZSBvYmplY3RcIik7XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc2NoZW1hICE9IFwiYm9vbGVhblwiKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNjaGVtYSBtdXN0IGJlIG9iamVjdCBvciBib29sZWFuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzY2ggPSB0aGlzLl9jYWNoZS5nZXQoc2NoZW1hKTtcbiAgICAgICAgaWYgKHNjaCAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIHNjaDtcbiAgICAgICAgYmFzZUlkID0gKDAsIHJlc29sdmVfMS5ub3JtYWxpemVJZCkoaWQgfHwgYmFzZUlkKTtcbiAgICAgICAgY29uc3QgbG9jYWxSZWZzID0gcmVzb2x2ZV8xLmdldFNjaGVtYVJlZnMuY2FsbCh0aGlzLCBzY2hlbWEsIGJhc2VJZCk7XG4gICAgICAgIHNjaCA9IG5ldyBjb21waWxlXzEuU2NoZW1hRW52KHsgc2NoZW1hLCBzY2hlbWFJZCwgbWV0YSwgYmFzZUlkLCBsb2NhbFJlZnMgfSk7XG4gICAgICAgIHRoaXMuX2NhY2hlLnNldChzY2guc2NoZW1hLCBzY2gpO1xuICAgICAgICBpZiAoYWRkU2NoZW1hICYmICFiYXNlSWQuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgICAgIC8vIFRPRE8gYXRtIGl0IGlzIGFsbG93ZWQgdG8gb3ZlcndyaXRlIHNjaGVtYXMgd2l0aG91dCBpZCAoaW5zdGVhZCBvZiBub3QgYWRkaW5nIHRoZW0pXG4gICAgICAgICAgICBpZiAoYmFzZUlkKVxuICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrVW5pcXVlKGJhc2VJZCk7XG4gICAgICAgICAgICB0aGlzLnJlZnNbYmFzZUlkXSA9IHNjaDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGVTY2hlbWEpXG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRlU2NoZW1hKHNjaGVtYSwgdHJ1ZSk7XG4gICAgICAgIHJldHVybiBzY2g7XG4gICAgfVxuICAgIF9jaGVja1VuaXF1ZShpZCkge1xuICAgICAgICBpZiAodGhpcy5zY2hlbWFzW2lkXSB8fCB0aGlzLnJlZnNbaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHNjaGVtYSB3aXRoIGtleSBvciBpZCBcIiR7aWR9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBfY29tcGlsZVNjaGVtYUVudihzY2gpIHtcbiAgICAgICAgaWYgKHNjaC5tZXRhKVxuICAgICAgICAgICAgdGhpcy5fY29tcGlsZU1ldGFTY2hlbWEoc2NoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgY29tcGlsZV8xLmNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLCBzY2gpO1xuICAgICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgICAgaWYgKCFzY2gudmFsaWRhdGUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhanYgaW1wbGVtZW50YXRpb24gZXJyb3JcIik7XG4gICAgICAgIHJldHVybiBzY2gudmFsaWRhdGU7XG4gICAgfVxuICAgIF9jb21waWxlTWV0YVNjaGVtYShzY2gpIHtcbiAgICAgICAgY29uc3QgY3VycmVudE9wdHMgPSB0aGlzLm9wdHM7XG4gICAgICAgIHRoaXMub3B0cyA9IHRoaXMuX21ldGFPcHRzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29tcGlsZV8xLmNvbXBpbGVTY2hlbWEuY2FsbCh0aGlzLCBzY2gpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5vcHRzID0gY3VycmVudE9wdHM7XG4gICAgICAgIH1cbiAgICB9XG59XG5BanYuVmFsaWRhdGlvbkVycm9yID0gdmFsaWRhdGlvbl9lcnJvcl8xLmRlZmF1bHQ7XG5BanYuTWlzc2luZ1JlZkVycm9yID0gcmVmX2Vycm9yXzEuZGVmYXVsdDtcbmV4cG9ydHMuZGVmYXVsdCA9IEFqdjtcbmZ1bmN0aW9uIGNoZWNrT3B0aW9ucyhjaGVja09wdHMsIG9wdGlvbnMsIG1zZywgbG9nID0gXCJlcnJvclwiKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gY2hlY2tPcHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGtleTtcbiAgICAgICAgaWYgKG9wdCBpbiBvcHRpb25zKVxuICAgICAgICAgICAgdGhpcy5sb2dnZXJbbG9nXShgJHttc2d9OiBvcHRpb24gJHtrZXl9LiAke2NoZWNrT3B0c1tvcHRdfWApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFNjaEVudihrZXlSZWYpIHtcbiAgICBrZXlSZWYgPSAoMCwgcmVzb2x2ZV8xLm5vcm1hbGl6ZUlkKShrZXlSZWYpOyAvLyBUT0RPIHRlc3RzIGZhaWwgd2l0aG91dCB0aGlzIGxpbmVcbiAgICByZXR1cm4gdGhpcy5zY2hlbWFzW2tleVJlZl0gfHwgdGhpcy5yZWZzW2tleVJlZl07XG59XG5mdW5jdGlvbiBhZGRJbml0aWFsU2NoZW1hcygpIHtcbiAgICBjb25zdCBvcHRzU2NoZW1hcyA9IHRoaXMub3B0cy5zY2hlbWFzO1xuICAgIGlmICghb3B0c1NjaGVtYXMpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRzU2NoZW1hcykpXG4gICAgICAgIHRoaXMuYWRkU2NoZW1hKG9wdHNTY2hlbWFzKTtcbiAgICBlbHNlXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9wdHNTY2hlbWFzKVxuICAgICAgICAgICAgdGhpcy5hZGRTY2hlbWEob3B0c1NjaGVtYXNba2V5XSwga2V5KTtcbn1cbmZ1bmN0aW9uIGFkZEluaXRpYWxGb3JtYXRzKCkge1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB0aGlzLm9wdHMuZm9ybWF0cykge1xuICAgICAgICBjb25zdCBmb3JtYXQgPSB0aGlzLm9wdHMuZm9ybWF0c1tuYW1lXTtcbiAgICAgICAgaWYgKGZvcm1hdClcbiAgICAgICAgICAgIHRoaXMuYWRkRm9ybWF0KG5hbWUsIGZvcm1hdCk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkSW5pdGlhbEtleXdvcmRzKGRlZnMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkZWZzKSkge1xuICAgICAgICB0aGlzLmFkZFZvY2FidWxhcnkoZGVmcyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIud2FybihcImtleXdvcmRzIG9wdGlvbiBhcyBtYXAgaXMgZGVwcmVjYXRlZCwgcGFzcyBhcnJheVwiKTtcbiAgICBmb3IgKGNvbnN0IGtleXdvcmQgaW4gZGVmcykge1xuICAgICAgICBjb25zdCBkZWYgPSBkZWZzW2tleXdvcmRdO1xuICAgICAgICBpZiAoIWRlZi5rZXl3b3JkKVxuICAgICAgICAgICAgZGVmLmtleXdvcmQgPSBrZXl3b3JkO1xuICAgICAgICB0aGlzLmFkZEtleXdvcmQoZGVmKTtcbiAgICB9XG59XG5mdW5jdGlvbiBnZXRNZXRhU2NoZW1hT3B0aW9ucygpIHtcbiAgICBjb25zdCBtZXRhT3B0cyA9IHsgLi4udGhpcy5vcHRzIH07XG4gICAgZm9yIChjb25zdCBvcHQgb2YgTUVUQV9JR05PUkVfT1BUSU9OUylcbiAgICAgICAgZGVsZXRlIG1ldGFPcHRzW29wdF07XG4gICAgcmV0dXJuIG1ldGFPcHRzO1xufVxuY29uc3Qgbm9Mb2dzID0geyBsb2coKSB7IH0sIHdhcm4oKSB7IH0sIGVycm9yKCkgeyB9IH07XG5mdW5jdGlvbiBnZXRMb2dnZXIobG9nZ2VyKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gZmFsc2UpXG4gICAgICAgIHJldHVybiBub0xvZ3M7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gY29uc29sZTtcbiAgICBpZiAobG9nZ2VyLmxvZyAmJiBsb2dnZXIud2FybiAmJiBsb2dnZXIuZXJyb3IpXG4gICAgICAgIHJldHVybiBsb2dnZXI7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibG9nZ2VyIG11c3QgaW1wbGVtZW50IGxvZywgd2FybiBhbmQgZXJyb3IgbWV0aG9kc1wiKTtcbn1cbmNvbnN0IEtFWVdPUkRfTkFNRSA9IC9eW2Etel8kXVthLXowLTlfJDotXSokL2k7XG5mdW5jdGlvbiBjaGVja0tleXdvcmQoa2V5d29yZCwgZGVmKSB7XG4gICAgY29uc3QgeyBSVUxFUyB9ID0gdGhpcztcbiAgICAoMCwgdXRpbF8xLmVhY2hJdGVtKShrZXl3b3JkLCAoa3dkKSA9PiB7XG4gICAgICAgIGlmIChSVUxFUy5rZXl3b3Jkc1trd2RdKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXl3b3JkICR7a3dkfSBpcyBhbHJlYWR5IGRlZmluZWRgKTtcbiAgICAgICAgaWYgKCFLRVlXT1JEX05BTUUudGVzdChrd2QpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBLZXl3b3JkICR7a3dkfSBoYXMgaW52YWxpZCBuYW1lYCk7XG4gICAgfSk7XG4gICAgaWYgKCFkZWYpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoZGVmLiRkYXRhICYmICEoXCJjb2RlXCIgaW4gZGVmIHx8IFwidmFsaWRhdGVcIiBpbiBkZWYpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignJGRhdGEga2V5d29yZCBtdXN0IGhhdmUgXCJjb2RlXCIgb3IgXCJ2YWxpZGF0ZVwiIGZ1bmN0aW9uJyk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkUnVsZShrZXl3b3JkLCBkZWZpbml0aW9uLCBkYXRhVHlwZSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBwb3N0ID0gZGVmaW5pdGlvbiA9PT0gbnVsbCB8fCBkZWZpbml0aW9uID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZpbml0aW9uLnBvc3Q7XG4gICAgaWYgKGRhdGFUeXBlICYmIHBvc3QpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcigna2V5d29yZCB3aXRoIFwicG9zdFwiIGZsYWcgY2Fubm90IGhhdmUgXCJ0eXBlXCInKTtcbiAgICBjb25zdCB7IFJVTEVTIH0gPSB0aGlzO1xuICAgIGxldCBydWxlR3JvdXAgPSBwb3N0ID8gUlVMRVMucG9zdCA6IFJVTEVTLnJ1bGVzLmZpbmQoKHsgdHlwZTogdCB9KSA9PiB0ID09PSBkYXRhVHlwZSk7XG4gICAgaWYgKCFydWxlR3JvdXApIHtcbiAgICAgICAgcnVsZUdyb3VwID0geyB0eXBlOiBkYXRhVHlwZSwgcnVsZXM6IFtdIH07XG4gICAgICAgIFJVTEVTLnJ1bGVzLnB1c2gocnVsZUdyb3VwKTtcbiAgICB9XG4gICAgUlVMRVMua2V5d29yZHNba2V5d29yZF0gPSB0cnVlO1xuICAgIGlmICghZGVmaW5pdGlvbilcbiAgICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHJ1bGUgPSB7XG4gICAgICAgIGtleXdvcmQsXG4gICAgICAgIGRlZmluaXRpb246IHtcbiAgICAgICAgICAgIC4uLmRlZmluaXRpb24sXG4gICAgICAgICAgICB0eXBlOiAoMCwgZGF0YVR5cGVfMS5nZXRKU09OVHlwZXMpKGRlZmluaXRpb24udHlwZSksXG4gICAgICAgICAgICBzY2hlbWFUeXBlOiAoMCwgZGF0YVR5cGVfMS5nZXRKU09OVHlwZXMpKGRlZmluaXRpb24uc2NoZW1hVHlwZSksXG4gICAgICAgIH0sXG4gICAgfTtcbiAgICBpZiAoZGVmaW5pdGlvbi5iZWZvcmUpXG4gICAgICAgIGFkZEJlZm9yZVJ1bGUuY2FsbCh0aGlzLCBydWxlR3JvdXAsIHJ1bGUsIGRlZmluaXRpb24uYmVmb3JlKTtcbiAgICBlbHNlXG4gICAgICAgIHJ1bGVHcm91cC5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgIFJVTEVTLmFsbFtrZXl3b3JkXSA9IHJ1bGU7XG4gICAgKF9hID0gZGVmaW5pdGlvbi5pbXBsZW1lbnRzKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaCgoa3dkKSA9PiB0aGlzLmFkZEtleXdvcmQoa3dkKSk7XG59XG5mdW5jdGlvbiBhZGRCZWZvcmVSdWxlKHJ1bGVHcm91cCwgcnVsZSwgYmVmb3JlKSB7XG4gICAgY29uc3QgaSA9IHJ1bGVHcm91cC5ydWxlcy5maW5kSW5kZXgoKF9ydWxlKSA9PiBfcnVsZS5rZXl3b3JkID09PSBiZWZvcmUpO1xuICAgIGlmIChpID49IDApIHtcbiAgICAgICAgcnVsZUdyb3VwLnJ1bGVzLnNwbGljZShpLCAwLCBydWxlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJ1bGVHcm91cC5ydWxlcy5wdXNoKHJ1bGUpO1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBydWxlICR7YmVmb3JlfSBpcyBub3QgZGVmaW5lZGApO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGtleXdvcmRNZXRhc2NoZW1hKGRlZikge1xuICAgIGxldCB7IG1ldGFTY2hlbWEgfSA9IGRlZjtcbiAgICBpZiAobWV0YVNjaGVtYSA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm47XG4gICAgaWYgKGRlZi4kZGF0YSAmJiB0aGlzLm9wdHMuJGRhdGEpXG4gICAgICAgIG1ldGFTY2hlbWEgPSBzY2hlbWFPckRhdGEobWV0YVNjaGVtYSk7XG4gICAgZGVmLnZhbGlkYXRlU2NoZW1hID0gdGhpcy5jb21waWxlKG1ldGFTY2hlbWEsIHRydWUpO1xufVxuY29uc3QgJGRhdGFSZWYgPSB7XG4gICAgJHJlZjogXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYWp2LXZhbGlkYXRvci9hanYvbWFzdGVyL2xpYi9yZWZzL2RhdGEuanNvbiNcIixcbn07XG5mdW5jdGlvbiBzY2hlbWFPckRhdGEoc2NoZW1hKSB7XG4gICAgcmV0dXJuIHsgYW55T2Y6IFtzY2hlbWEsICRkYXRhUmVmXSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29yZS5qcy5tYXAiXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Q0FDQSxPQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7Q0FDNUQsUUFBUSxVQUFVLFFBQVEsT0FBTyxRQUFRLE1BQU0sUUFBUSxZQUFZLFFBQVEsTUFBTSxRQUFRLElBQUksUUFBUSxhQUFhLEtBQUs7Q0FDdkgsSUFBSSxhQUFBLGlCQUFBO0NBQ0osT0FBTyxlQUFlLFNBQVMsY0FBYztFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFdBQVc7RUFBWTtDQUFFLENBQUM7Q0FDckgsSUFBSSxZQUFBLGdCQUFBO0NBQ0osT0FBTyxlQUFlLFNBQVMsS0FBSztFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBRztDQUFFLENBQUM7Q0FDbEcsT0FBTyxlQUFlLFNBQVMsT0FBTztFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBSztDQUFFLENBQUM7Q0FDdEcsT0FBTyxlQUFlLFNBQVMsYUFBYTtFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBVztDQUFFLENBQUM7Q0FDbEgsT0FBTyxlQUFlLFNBQVMsT0FBTztFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBSztDQUFFLENBQUM7Q0FDdEcsT0FBTyxlQUFlLFNBQVMsUUFBUTtFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBTTtDQUFFLENBQUM7Q0FDeEcsT0FBTyxlQUFlLFNBQVMsV0FBVztFQUFFLFlBQVk7RUFBTSxLQUFLLFdBQVk7R0FBRSxPQUFPLFVBQVU7RUFBUztDQUFF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