@fgv/ts-json 1.9.6 → 2.0.2-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/ts-json.d.ts +1826 -0
  2. package/dist/tsdoc-metadata.json +11 -0
  3. package/lib/index.d.ts +5 -0
  4. package/lib/index.d.ts.map +1 -0
  5. package/lib/index.js +42 -0
  6. package/lib/index.js.map +1 -0
  7. package/lib/packlets/context/compositeJsonMap.d.ts +60 -0
  8. package/lib/packlets/context/compositeJsonMap.d.ts.map +1 -0
  9. package/lib/packlets/context/compositeJsonMap.js +105 -0
  10. package/lib/packlets/context/compositeJsonMap.js.map +1 -0
  11. package/lib/packlets/context/contextHelpers.d.ts +116 -0
  12. package/lib/packlets/context/contextHelpers.d.ts.map +1 -0
  13. package/lib/packlets/context/contextHelpers.js +191 -0
  14. package/lib/packlets/context/contextHelpers.js.map +1 -0
  15. package/lib/packlets/context/index.d.ts +4 -0
  16. package/lib/packlets/context/index.d.ts.map +1 -0
  17. package/lib/packlets/context/index.js +31 -0
  18. package/lib/packlets/context/index.js.map +1 -0
  19. package/lib/packlets/context/jsonContext.d.ts +84 -0
  20. package/lib/packlets/context/jsonContext.d.ts.map +1 -0
  21. package/lib/packlets/context/jsonContext.js +41 -0
  22. package/lib/packlets/context/jsonContext.js.map +1 -0
  23. package/lib/packlets/converters/converters.d.ts +54 -0
  24. package/lib/packlets/converters/converters.d.ts.map +1 -0
  25. package/lib/packlets/converters/converters.js +105 -0
  26. package/lib/packlets/converters/converters.js.map +1 -0
  27. package/lib/packlets/converters/file.d.ts +83 -0
  28. package/lib/packlets/converters/file.d.ts.map +1 -0
  29. package/lib/packlets/converters/file.js +162 -0
  30. package/lib/packlets/converters/file.js.map +1 -0
  31. package/lib/packlets/converters/index.d.ts +5 -0
  32. package/lib/packlets/converters/index.d.ts.map +1 -0
  33. package/lib/packlets/converters/index.js +56 -0
  34. package/lib/packlets/converters/index.js.map +1 -0
  35. package/lib/packlets/converters/jsonConverter.d.ts +276 -0
  36. package/lib/packlets/converters/jsonConverter.d.ts.map +1 -0
  37. package/lib/packlets/converters/jsonConverter.js +310 -0
  38. package/lib/packlets/converters/jsonConverter.js.map +1 -0
  39. package/lib/packlets/editor/common.d.ts +67 -0
  40. package/lib/packlets/editor/common.d.ts.map +1 -0
  41. package/lib/packlets/editor/common.js +3 -0
  42. package/lib/packlets/editor/common.js.map +1 -0
  43. package/lib/packlets/editor/index.d.ts +8 -0
  44. package/lib/packlets/editor/index.d.ts.map +1 -0
  45. package/{jsonEditor → lib/packlets/editor}/index.js +15 -9
  46. package/lib/packlets/editor/index.js.map +1 -0
  47. package/lib/packlets/editor/jsonEditor.d.ts +155 -0
  48. package/lib/packlets/editor/jsonEditor.d.ts.map +1 -0
  49. package/lib/packlets/editor/jsonEditor.js +332 -0
  50. package/lib/packlets/editor/jsonEditor.js.map +1 -0
  51. package/lib/packlets/editor/jsonEditorRule.d.ts +64 -0
  52. package/lib/packlets/editor/jsonEditorRule.d.ts.map +1 -0
  53. package/lib/packlets/editor/jsonEditorRule.js +54 -0
  54. package/lib/packlets/editor/jsonEditorRule.js.map +1 -0
  55. package/lib/packlets/editor/jsonEditorState.d.ts +125 -0
  56. package/lib/packlets/editor/jsonEditorState.d.ts.map +1 -0
  57. package/lib/packlets/editor/jsonEditorState.js +177 -0
  58. package/lib/packlets/editor/jsonEditorState.js.map +1 -0
  59. package/lib/packlets/editor/jsonReferenceMap.d.ts +303 -0
  60. package/lib/packlets/editor/jsonReferenceMap.d.ts.map +1 -0
  61. package/lib/packlets/editor/jsonReferenceMap.js +324 -0
  62. package/lib/packlets/editor/jsonReferenceMap.js.map +1 -0
  63. package/lib/packlets/editor/rules/conditional.d.ts +107 -0
  64. package/lib/packlets/editor/rules/conditional.d.ts.map +1 -0
  65. package/lib/packlets/editor/rules/conditional.js +167 -0
  66. package/lib/packlets/editor/rules/conditional.js.map +1 -0
  67. package/{jsonEditor → lib/packlets/editor}/rules/index.d.ts +1 -0
  68. package/lib/packlets/editor/rules/index.d.ts.map +1 -0
  69. package/lib/packlets/editor/rules/index.js +42 -0
  70. package/lib/packlets/editor/rules/index.js.map +1 -0
  71. package/lib/packlets/editor/rules/multivalue.d.ts +94 -0
  72. package/lib/packlets/editor/rules/multivalue.d.ts.map +1 -0
  73. package/lib/packlets/editor/rules/multivalue.js +141 -0
  74. package/lib/packlets/editor/rules/multivalue.js.map +1 -0
  75. package/lib/packlets/editor/rules/references.d.ts +69 -0
  76. package/lib/packlets/editor/rules/references.d.ts.map +1 -0
  77. package/lib/packlets/editor/rules/references.js +159 -0
  78. package/lib/packlets/editor/rules/references.js.map +1 -0
  79. package/lib/packlets/editor/rules/templates.d.ts +74 -0
  80. package/lib/packlets/editor/rules/templates.d.ts.map +1 -0
  81. package/lib/packlets/editor/rules/templates.js +127 -0
  82. package/lib/packlets/editor/rules/templates.js.map +1 -0
  83. package/lib/packlets/json/common.d.ts +85 -0
  84. package/lib/packlets/json/common.d.ts.map +1 -0
  85. package/lib/packlets/json/common.js +123 -0
  86. package/lib/packlets/json/common.js.map +1 -0
  87. package/lib/packlets/json/index.d.ts +2 -0
  88. package/lib/packlets/json/index.d.ts.map +1 -0
  89. package/lib/packlets/json/index.js +39 -0
  90. package/lib/packlets/json/index.js.map +1 -0
  91. package/package.json +58 -49
  92. package/common.d.ts +0 -58
  93. package/common.js +0 -116
  94. package/compositeJsonMap.d.ts +0 -47
  95. package/compositeJsonMap.js +0 -97
  96. package/contextHelpers.d.ts +0 -21
  97. package/contextHelpers.js +0 -101
  98. package/converters.d.ts +0 -37
  99. package/converters.js +0 -92
  100. package/file.d.ts +0 -60
  101. package/file.js +0 -140
  102. package/index.d.ts +0 -10
  103. package/index.js +0 -62
  104. package/jsonContext.d.ts +0 -74
  105. package/jsonContext.js +0 -40
  106. package/jsonConverter.d.ts +0 -229
  107. package/jsonConverter.js +0 -292
  108. package/jsonEditor/common.d.ts +0 -36
  109. package/jsonEditor/common.js +0 -3
  110. package/jsonEditor/index.d.ts +0 -5
  111. package/jsonEditor/jsonEditor.d.ts +0 -74
  112. package/jsonEditor/jsonEditor.js +0 -259
  113. package/jsonEditor/jsonEditorRule.d.ts +0 -47
  114. package/jsonEditor/jsonEditorRule.js +0 -44
  115. package/jsonEditor/jsonEditorState.d.ts +0 -24
  116. package/jsonEditor/jsonEditorState.js +0 -86
  117. package/jsonEditor/rules/conditional.d.ts +0 -84
  118. package/jsonEditor/rules/conditional.js +0 -146
  119. package/jsonEditor/rules/index.js +0 -21
  120. package/jsonEditor/rules/multivalue.d.ts +0 -78
  121. package/jsonEditor/rules/multivalue.js +0 -129
  122. package/jsonEditor/rules/references.d.ts +0 -62
  123. package/jsonEditor/rules/references.js +0 -158
  124. package/jsonEditor/rules/templates.d.ts +0 -56
  125. package/jsonEditor/rules/templates.js +0 -115
  126. package/jsonReferenceMap.d.ts +0 -138
  127. package/jsonReferenceMap.js +0 -202
@@ -1,202 +0,0 @@
1
- "use strict";
2
- /*
3
- * Copyright (c) 2020 Erik Fortune
4
- *
5
- * Permission is hereby granted, free of charge, to any person obtaining a copy
6
- * of this software and associated documentation files (the "Software"), to deal
7
- * in the Software without restriction, including without limitation the rights
8
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- * copies of the Software, and to permit persons to whom the Software is
10
- * furnished to do so, subject to the following conditions:
11
- *
12
- * The above copyright notice and this permission notice shall be included in all
13
- * copies or substantial portions of the Software.
14
- *
15
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- * SOFTWARE.
22
- */
23
- Object.defineProperty(exports, "__esModule", { value: true });
24
- exports.PrefixedJsonMap = exports.SimpleJsonMap = exports.SimpleJsonMapBase = exports.PrefixKeyPolicy = exports.ReferenceMapKeyPolicy = void 0;
25
- const ts_utils_1 = require("@fgv/ts-utils");
26
- const common_1 = require("./common");
27
- const jsonEditor_1 = require("./jsonEditor/jsonEditor");
28
- /**
29
- * Policy object responsible for validating or correcting
30
- * keys in a reference map
31
- */
32
- class ReferenceMapKeyPolicy {
33
- constructor(options, isValid) {
34
- this._defaultOptions = options;
35
- this._isValid = isValid !== null && isValid !== void 0 ? isValid : ReferenceMapKeyPolicy.defaultKeyPredicate;
36
- }
37
- static defaultKeyPredicate(key) {
38
- return (key.length > 0) && (!key.includes('{{')) && (!key.startsWith('?'));
39
- }
40
- isValid(key, item) {
41
- return this._isValid(key, item);
42
- }
43
- validate(key, item, _options) {
44
- return this.isValid(key, item) ? (0, ts_utils_1.succeed)(key) : (0, ts_utils_1.fail)(`${key}: invalid key`);
45
- }
46
- validateItems(items, options) {
47
- return (0, ts_utils_1.mapResults)(items.map((item) => {
48
- return this.validate(...item, options).onSuccess((valid) => {
49
- return (0, ts_utils_1.succeed)([valid, item[1]]);
50
- });
51
- }));
52
- }
53
- validateMap(map, options) {
54
- return this.validateItems(Array.from(map.entries()), options).onSuccess((valid) => {
55
- return (0, ts_utils_1.captureResult)(() => new Map(valid));
56
- });
57
- }
58
- }
59
- exports.ReferenceMapKeyPolicy = ReferenceMapKeyPolicy;
60
- class PrefixKeyPolicy extends ReferenceMapKeyPolicy {
61
- constructor(prefix, options) {
62
- super(options);
63
- this.prefix = prefix;
64
- }
65
- isValid(key, _item) {
66
- return key.startsWith(this.prefix) && (key !== this.prefix) && ReferenceMapKeyPolicy.defaultKeyPredicate(key);
67
- }
68
- validate(key, item, options) {
69
- var _a;
70
- // istanbul ignore next
71
- const makeValid = ((_a = (options !== null && options !== void 0 ? options : this._defaultOptions)) === null || _a === void 0 ? void 0 : _a.makeValid) === true;
72
- if (this.isValid(key, item)) {
73
- return (0, ts_utils_1.succeed)(key);
74
- }
75
- else if (makeValid && ReferenceMapKeyPolicy.defaultKeyPredicate(key)) {
76
- return (0, ts_utils_1.succeed)(`${this.prefix}${key}`);
77
- }
78
- return (0, ts_utils_1.fail)(`${key}: invalid key`);
79
- }
80
- }
81
- exports.PrefixKeyPolicy = PrefixKeyPolicy;
82
- /**
83
- * A SimpleJsonMap presents a view of a simple map of @see JsonValue
84
- */
85
- class SimpleJsonMapBase {
86
- constructor(values, context, keyPolicy) {
87
- values = SimpleJsonMapBase._toMap(values).orThrow();
88
- this._keyPolicy = keyPolicy !== null && keyPolicy !== void 0 ? keyPolicy : new ReferenceMapKeyPolicy();
89
- this._values = this._keyPolicy.validateMap(values).orThrow();
90
- this._context = context;
91
- }
92
- static _toMap(values) {
93
- if (values === undefined) {
94
- return (0, ts_utils_1.captureResult)(() => new Map());
95
- }
96
- else if (!(values instanceof Map)) {
97
- return (0, ts_utils_1.recordToMap)(values, (_k, v) => (0, ts_utils_1.succeed)(v));
98
- }
99
- return (0, ts_utils_1.succeed)(values);
100
- }
101
- /**
102
- * Determine if a key might be valid for this map but does not determine if key actually
103
- * exists. Allows key range to be constrained.
104
- * @param key key to be tested
105
- * @returns true if the key is in the valid range, false otherwise.
106
- */
107
- keyIsInRange(key) {
108
- return this._keyPolicy.isValid(key);
109
- }
110
- /**
111
- * Determines if an object with the specified key actually exists in the map.
112
- * @param key key to be tested
113
- * @returns true if an object with the specified key exists, false otherwise.
114
- */
115
- has(key) {
116
- return this._values.has(key);
117
- }
118
- /**
119
- * Gets a JSON object specified by key.
120
- * @param key key of the object to be retrieved
121
- * @param context optional @see JsonContext used to format the object
122
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
123
- * if no such object exists, or failure with detail 'error' if the object was found but
124
- * could not be formatted.
125
- */
126
- getJsonObject(key, context) {
127
- return this.getJsonValue(key, context).onSuccess((jv) => {
128
- if (!(0, common_1.isJsonObject)(jv)) {
129
- return (0, ts_utils_1.failWithDetail)(`${key}: not an object`, 'error');
130
- }
131
- return (0, ts_utils_1.succeedWithDetail)(jv);
132
- });
133
- }
134
- }
135
- exports.SimpleJsonMapBase = SimpleJsonMapBase;
136
- /**
137
- * A SimpleJsonMap presents a view of a simple map of @see JsonValue
138
- */
139
- class SimpleJsonMap extends SimpleJsonMapBase {
140
- constructor(values, context, options) {
141
- super(values, context, options === null || options === void 0 ? void 0 : options.keyPolicy);
142
- this._editor = options === null || options === void 0 ? void 0 : options.editor;
143
- }
144
- /**
145
- * Creates a new @see SimpleJsonMap from the supplied objects
146
- * @param values A string-keyed Map or Record of the @see JsonObject to be returned
147
- * @param context Optional @see JsonContext used to format returned values
148
- * @param options Optional @see SimpleJsonMapOptions for initialization
149
- */
150
- static createSimple(values, context, options) {
151
- return (0, ts_utils_1.captureResult)(() => new SimpleJsonMap(values, context, options));
152
- }
153
- /**
154
- * Gets a JSON value specified by key.
155
- * @param key key of the object to be retrieved
156
- * @param context Optional @see JsonContext used to format the value
157
- * @returns Success with the formatted object if successful. Failure with detail 'unknown'
158
- * if no such object exists, or failure with detail 'error' if the object was found but
159
- * could not be formatted.
160
- */
161
- // eslint-disable-next-line no-use-before-define
162
- getJsonValue(key, context) {
163
- context = context !== null && context !== void 0 ? context : this._context;
164
- const value = this._values.get(key);
165
- if (!value) {
166
- return (0, ts_utils_1.failWithDetail)(`${key}: JSON value not found`, 'unknown');
167
- }
168
- return this._clone(value, context);
169
- }
170
- _clone(value, context) {
171
- if (!this._editor) {
172
- const result = jsonEditor_1.JsonEditor.create();
173
- // istanbul ignore next: nearly impossible to reproduce
174
- if (result.isFailure()) {
175
- return (0, ts_utils_1.failWithDetail)(result.message, 'error');
176
- }
177
- this._editor = result.value;
178
- }
179
- return this._editor.clone(value, context).withFailureDetail('error');
180
- }
181
- }
182
- exports.SimpleJsonMap = SimpleJsonMap;
183
- /**
184
- * A PrefixedJsonMap enforces a supplied prefix for all contained values, optionally
185
- * adding the prefix as necessary (default true).
186
- */
187
- class PrefixedJsonMap extends SimpleJsonMap {
188
- constructor(values, context, options) {
189
- super(values, context, options);
190
- }
191
- static createPrefixed(prefixOptions, values, context, editor) {
192
- return (0, ts_utils_1.captureResult)(() => new PrefixedJsonMap(values, context, { keyPolicy: this._toPolicy(prefixOptions), editor }));
193
- }
194
- static _toPolicy(prefixOptions) {
195
- if (typeof prefixOptions === 'string') {
196
- return new PrefixKeyPolicy(prefixOptions, { makeValid: true });
197
- }
198
- return new PrefixKeyPolicy(prefixOptions.prefix, { makeValid: (prefixOptions.addPrefix !== false) });
199
- }
200
- }
201
- exports.PrefixedJsonMap = PrefixedJsonMap;
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvblJlZmVyZW5jZU1hcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9qc29uUmVmZXJlbmNlTWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7OztBQUVILDRDQVV1QjtBQUd2QixxQ0FBK0Q7QUFDL0Qsd0RBQXFEO0FBTXJEOzs7R0FHRztBQUNILE1BQWEscUJBQXFCO0lBSTlCLFlBQW1CLE9BQThDLEVBQUUsT0FBNEM7UUFDM0csSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLGFBQVAsT0FBTyxjQUFQLE9BQU8sR0FBSSxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQztJQUN6RSxDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLEdBQVc7UUFDekMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFTSxPQUFPLENBQUMsR0FBVyxFQUFFLElBQVE7UUFDaEMsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRU0sUUFBUSxDQUFDLEdBQVcsRUFBRSxJQUFRLEVBQUUsUUFBK0M7UUFDbEYsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxrQkFBTyxFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGVBQUksRUFBQyxHQUFHLEdBQUcsZUFBZSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVNLGFBQWEsQ0FBQyxLQUFvQixFQUFFLE9BQThD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QzthQUNsRDtZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztTQUMvQjtRQUNELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pFLENBQUM7Q0FDSjtBQS9DRCxzQ0ErQ0M7QUFpQkQ7OztHQUdHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLGFBQWE7SUFDOUMsWUFBc0IsTUFBK0IsRUFBRSxPQUFxQixFQUFFLE9BQThCO1FBQ3hHLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFvQk0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxhQUFzQyxFQUFFLE1BQStCLEVBQUUsT0FBcUIsRUFBRSxNQUFtQjtRQUM1SSxPQUFPLElBQUEsd0JBQWEsRUFBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLGVBQWUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNILENBQUM7SUFFUyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQXNDO1FBQzdELElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO1lBQ25DLE9BQU8sSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLElBQUksZUFBZSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0NBQ0o7QUFqQ0QsMENBaUNDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7XG4gICAgRGV0YWlsZWRSZXN1bHQsXG4gICAgUmVzdWx0LFxuICAgIGNhcHR1cmVSZXN1bHQsXG4gICAgZmFpbCxcbiAgICBmYWlsV2l0aERldGFpbCxcbiAgICBtYXBSZXN1bHRzLFxuICAgIHJlY29yZFRvTWFwLFxuICAgIHN1Y2NlZWQsXG4gICAgc3VjY2VlZFdpdGhEZXRhaWwsXG59IGZyb20gJ0BmZ3YvdHMtdXRpbHMnO1xuXG5pbXBvcnQgeyBKc29uQ29udGV4dCwgSnNvblJlZmVyZW5jZU1hcCwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24gfSBmcm9tICcuL2pzb25Db250ZXh0JztcbmltcG9ydCB7IEpzb25PYmplY3QsIEpzb25WYWx1ZSwgaXNKc29uT2JqZWN0IH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHsgSnNvbkVkaXRvciB9IGZyb20gJy4vanNvbkVkaXRvci9qc29uRWRpdG9yJztcblxuZXhwb3J0IGludGVyZmFjZSBSZWZlcmVuY2VNYXBLZXlQb2xpY3lWYWxpZGF0ZU9wdGlvbnMge1xuICAgIG1ha2VWYWxpZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUG9saWN5IG9iamVjdCByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGluZyBvciBjb3JyZWN0aW5nXG4gKiBrZXlzIGluIGEgcmVmZXJlbmNlIG1hcFxuICovXG5leHBvcnQgY2xhc3MgUmVmZXJlbmNlTWFwS2V5UG9saWN5PFQ+IHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgX2RlZmF1bHRPcHRpb25zPzogUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfaXNWYWxpZDogKGtleTogc3RyaW5nLCBpdGVtPzogVCkgPT4gYm9vbGVhbjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zPzogUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zLCBpc1ZhbGlkPzogKGtleTogc3RyaW5nLCBpdGVtPzogVCkgPT4gYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIHRoaXMuX2lzVmFsaWQgPSBpc1ZhbGlkID8/IFJlZmVyZW5jZU1hcEtleVBvbGljeS5kZWZhdWx0S2V5UHJlZGljYXRlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdEtleVByZWRpY2F0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKGtleS5sZW5ndGggPiAwKSAmJiAoIWtleS5pbmNsdWRlcygne3snKSkgJiYgKCFrZXkuc3RhcnRzV2l0aCgnPycpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNWYWxpZChrZXk6IHN0cmluZywgaXRlbT86IFQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQoa2V5LCBpdGVtKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmFsaWRhdGUoa2V5OiBzdHJpbmcsIGl0ZW0/OiBULCBfb3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucyk6IFJlc3VsdDxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZChrZXksIGl0ZW0pID8gc3VjY2VlZChrZXkpIDogZmFpbChgJHtrZXl9OiBpbnZhbGlkIGtleWApO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZUl0ZW1zKGl0ZW1zOiBbc3RyaW5nLCBUXVtdLCBvcHRpb25zPzogUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zKTogUmVzdWx0PFtzdHJpbmcsIFRdW10+IHtcbiAgICAgICAgcmV0dXJuIG1hcFJlc3VsdHMoaXRlbXMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0ZSguLi5pdGVtLCBvcHRpb25zKS5vblN1Y2Nlc3MoKHZhbGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2NlZWQoW3ZhbGlkLCBpdGVtWzFdXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZU1hcChtYXA6IE1hcDxzdHJpbmcsIFQ+LCBvcHRpb25zPzogUmVmZXJlbmNlTWFwS2V5UG9saWN5VmFsaWRhdGVPcHRpb25zKTogUmVzdWx0PE1hcDxzdHJpbmcsIFQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbGlkYXRlSXRlbXMoQXJyYXkuZnJvbShtYXAuZW50cmllcygpKSwgb3B0aW9ucykub25TdWNjZXNzKCh2YWxpZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IE1hcCh2YWxpZCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmVmaXhLZXlQb2xpY3k8VD4gZXh0ZW5kcyBSZWZlcmVuY2VNYXBLZXlQb2xpY3k8VD4ge1xuICAgIHB1YmxpYyByZWFkb25seSBwcmVmaXg6IHN0cmluZztcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwcmVmaXg6IHN0cmluZywgb3B0aW9ucz86IFJlZmVyZW5jZU1hcEtleVBvbGljeVZhbGlkYXRlT3B0aW9ucykge1xuICAgICAgICBzdXBlcihvcHRpb25zKTtcbiAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFsaWQoa2V5OiBzdHJpbmcsIF9pdGVtPzogVCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgodGhpcy5wcmVmaXgpICYmIChrZXkgIT09IHRoaXMucHJlZml4KSAmJiBSZWZlcmVuY2VNYXBLZXlQb2xpY3kuZGVmYXVsdEtleVByZWRpY2F0ZShrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZShrZXk6IHN0cmluZywgaXRlbT86IFQsIG9wdGlvbnM/OiBSZWZlcmVuY2VNYXBLZXlQb2xpY3lWYWxpZGF0ZU9wdGlvbnMpOiBSZXN1bHQ8c3RyaW5nPiB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIGNvbnN0IG1ha2VWYWxpZCA9IChvcHRpb25zID8/IHRoaXMuX2RlZmF1bHRPcHRpb25zKT8ubWFrZVZhbGlkID09PSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKGtleSwgaXRlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFrZVZhbGlkICYmIFJlZmVyZW5jZU1hcEtleVBvbGljeS5kZWZhdWx0S2V5UHJlZGljYXRlKGtleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkKGAke3RoaXMucHJlZml4fSR7a2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGAke2tleX06IGludmFsaWQga2V5YCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBNYXBPclJlY29yZDxUPiA9IE1hcDxzdHJpbmcsIFQ+fFJlY29yZDxzdHJpbmcsIFQ+O1xuXG4vKipcbiAqIEEgU2ltcGxlSnNvbk1hcCBwcmVzZW50cyBhIHZpZXcgb2YgYSBzaW1wbGUgbWFwIG9mIEBzZWUgSnNvblZhbHVlXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaW1wbGVKc29uTWFwQmFzZTxUPiBpbXBsZW1lbnRzIEpzb25SZWZlcmVuY2VNYXAge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfa2V5UG9saWN5OiBSZWZlcmVuY2VNYXBLZXlQb2xpY3k8VD47XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF92YWx1ZXM6IE1hcDxzdHJpbmcsIFQ+O1xuICAgIHByb3RlY3RlZCByZWFkb25seSBfY29udGV4dD86IEpzb25Db250ZXh0O1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHZhbHVlcz86IE1hcE9yUmVjb3JkPFQ+LCBjb250ZXh0PzogSnNvbkNvbnRleHQsIGtleVBvbGljeT86IFJlZmVyZW5jZU1hcEtleVBvbGljeTxUPikge1xuICAgICAgICB2YWx1ZXMgPSBTaW1wbGVKc29uTWFwQmFzZS5fdG9NYXAodmFsdWVzKS5vclRocm93KCk7XG4gICAgICAgIHRoaXMuX2tleVBvbGljeSA9IGtleVBvbGljeSA/PyBuZXcgUmVmZXJlbmNlTWFwS2V5UG9saWN5KCk7XG4gICAgICAgIHRoaXMuX3ZhbHVlcyA9IHRoaXMuX2tleVBvbGljeS52YWxpZGF0ZU1hcCh2YWx1ZXMpLm9yVGhyb3coKTtcbiAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHN0YXRpYyBfdG9NYXA8VD4odmFsdWVzPzogTWFwT3JSZWNvcmQ8VD4pOiBSZXN1bHQ8TWFwPHN0cmluZywgVD4+IHtcbiAgICAgICAgaWYgKHZhbHVlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgTWFwPHN0cmluZywgVD4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoISh2YWx1ZXMgaW5zdGFuY2VvZiBNYXApKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVjb3JkVG9NYXAodmFsdWVzLCAoX2ssIHYpID0+IHN1Y2NlZWQodikpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZWVkKHZhbHVlcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIGlmIGEga2V5IG1pZ2h0IGJlIHZhbGlkIGZvciB0aGlzIG1hcCBidXQgZG9lcyBub3QgZGV0ZXJtaW5lIGlmIGtleSBhY3R1YWxseVxuICAgICAqIGV4aXN0cy4gQWxsb3dzIGtleSByYW5nZSB0byBiZSBjb25zdHJhaW5lZC5cbiAgICAgKiBAcGFyYW0ga2V5IGtleSB0byBiZSB0ZXN0ZWRcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHZhbGlkIHJhbmdlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGtleUlzSW5SYW5nZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fa2V5UG9saWN5LmlzVmFsaWQoa2V5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIGFuIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IGFjdHVhbGx5IGV4aXN0cyBpbiB0aGUgbWFwLlxuICAgICAqIEBwYXJhbSBrZXkga2V5IHRvIGJlIHRlc3RlZFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYW4gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcHVibGljIGhhcyhrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWVzLmhhcyhrZXkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBKU09OIG9iamVjdCBzcGVjaWZpZWQgYnkga2V5LlxuICAgICAqIEBwYXJhbSBrZXkga2V5IG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgb3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCB0aGUgb2JqZWN0XG4gICAgICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSBmb3JtYXR0ZWQgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIEZhaWx1cmUgd2l0aCBkZXRhaWwgJ3Vua25vd24nXG4gICAgICogaWYgbm8gc3VjaCBvYmplY3QgZXhpc3RzLCBvciBmYWlsdXJlIHdpdGggZGV0YWlsICdlcnJvcicgaWYgdGhlIG9iamVjdCB3YXMgZm91bmQgYnV0XG4gICAgICogY291bGQgbm90IGJlIGZvcm1hdHRlZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SnNvbk9iamVjdChrZXk6IHN0cmluZywgY29udGV4dD86IEpzb25Db250ZXh0KTogRGV0YWlsZWRSZXN1bHQ8SnNvbk9iamVjdCwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SnNvblZhbHVlKGtleSwgY29udGV4dCkub25TdWNjZXNzKChqdikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc0pzb25PYmplY3QoanYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKGAke2tleX06IG5vdCBhbiBvYmplY3RgLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdWNjZWVkV2l0aERldGFpbChqdik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBKU09OIHZhbHVlIHNwZWNpZmllZCBieSBrZXkuXG4gICAgICogQHBhcmFtIGtleSBrZXkgb2YgdGhlIG9iamVjdCB0byBiZSByZXRyaWV2ZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHVzZWQgdG8gZm9ybWF0IHRoZSB2YWx1ZVxuICAgICAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgZm9ybWF0dGVkIG9iamVjdCBpZiBzdWNjZXNzZnVsLiBGYWlsdXJlIHdpdGggZGV0YWlsICd1bmtub3duJ1xuICAgICAqIGlmIG5vIHN1Y2ggb2JqZWN0IGV4aXN0cywgb3IgZmFpbHVyZSB3aXRoIGRldGFpbCAnZXJyb3InIGlmIHRoZSBvYmplY3Qgd2FzIGZvdW5kIGJ1dFxuICAgICAqIGNvdWxkIG5vdCBiZSBmb3JtYXR0ZWQuXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lXG4gICAgcHVibGljIGFic3RyYWN0IGdldEpzb25WYWx1ZShrZXk6IHN0cmluZywgY29udGV4dD86IEpzb25Db250ZXh0KTogRGV0YWlsZWRSZXN1bHQ8SnNvblZhbHVlLCBKc29uUmVmZXJlbmNlTWFwRmFpbHVyZVJlYXNvbj47XG59XG5cbi8qKlxuICogSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBmb3IgYSBAc2VlIFNpbXBsZUpzb25NYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVKc29uTWFwT3B0aW9ucyB7XG4gICAga2V5UG9saWN5PzogUmVmZXJlbmNlTWFwS2V5UG9saWN5PEpzb25WYWx1ZT4sXG4gICAgZWRpdG9yPzogSnNvbkVkaXRvcixcbn1cblxuLyoqXG4gKiBBIFNpbXBsZUpzb25NYXAgcHJlc2VudHMgYSB2aWV3IG9mIGEgc2ltcGxlIG1hcCBvZiBAc2VlIEpzb25WYWx1ZVxuICovXG5leHBvcnQgY2xhc3MgU2ltcGxlSnNvbk1hcCBleHRlbmRzIFNpbXBsZUpzb25NYXBCYXNlPEpzb25WYWx1ZT4ge1xuICAgIHByb3RlY3RlZCBfZWRpdG9yPzogSnNvbkVkaXRvcjtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcih2YWx1ZXM/OiBNYXBPclJlY29yZDxKc29uVmFsdWU+LCBjb250ZXh0PzogSnNvbkNvbnRleHQsIG9wdGlvbnM/OiBTaW1wbGVKc29uTWFwT3B0aW9ucykge1xuICAgICAgICBzdXBlcih2YWx1ZXMsIGNvbnRleHQsIG9wdGlvbnM/LmtleVBvbGljeSk7XG4gICAgICAgIHRoaXMuX2VkaXRvciA9IG9wdGlvbnM/LmVkaXRvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEBzZWUgU2ltcGxlSnNvbk1hcCBmcm9tIHRoZSBzdXBwbGllZCBvYmplY3RzXG4gICAgICogQHBhcmFtIHZhbHVlcyBBIHN0cmluZy1rZXllZCBNYXAgb3IgUmVjb3JkIG9mIHRoZSBAc2VlIEpzb25PYmplY3QgdG8gYmUgcmV0dXJuZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHVzZWQgdG8gZm9ybWF0IHJldHVybmVkIHZhbHVlc1xuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbmFsIEBzZWUgU2ltcGxlSnNvbk1hcE9wdGlvbnMgZm9yIGluaXRpYWxpemF0aW9uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjcmVhdGVTaW1wbGUodmFsdWVzPzogTWFwT3JSZWNvcmQ8SnNvblZhbHVlPiwgY29udGV4dD86IEpzb25Db250ZXh0LCBvcHRpb25zPzogU2ltcGxlSnNvbk1hcE9wdGlvbnMpOiBSZXN1bHQ8U2ltcGxlSnNvbk1hcD4ge1xuICAgICAgICByZXR1cm4gY2FwdHVyZVJlc3VsdCgoKSA9PiBuZXcgU2ltcGxlSnNvbk1hcCh2YWx1ZXMsIGNvbnRleHQsIG9wdGlvbnMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGEgSlNPTiB2YWx1ZSBzcGVjaWZpZWQgYnkga2V5LlxuICAgICAqIEBwYXJhbSBrZXkga2V5IG9mIHRoZSBvYmplY3QgdG8gYmUgcmV0cmlldmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCB0aGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggdGhlIGZvcm1hdHRlZCBvYmplY3QgaWYgc3VjY2Vzc2Z1bC4gRmFpbHVyZSB3aXRoIGRldGFpbCAndW5rbm93bidcbiAgICAgKiBpZiBubyBzdWNoIG9iamVjdCBleGlzdHMsIG9yIGZhaWx1cmUgd2l0aCBkZXRhaWwgJ2Vycm9yJyBpZiB0aGUgb2JqZWN0IHdhcyBmb3VuZCBidXRcbiAgICAgKiBjb3VsZCBub3QgYmUgZm9ybWF0dGVkLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZVxuICAgIHB1YmxpYyBnZXRKc29uVmFsdWUoa2V5OiBzdHJpbmcsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgPz8gdGhpcy5fY29udGV4dDtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl92YWx1ZXMuZ2V0KGtleSk7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWlsV2l0aERldGFpbChgJHtrZXl9OiBKU09OIHZhbHVlIG5vdCBmb3VuZGAsICd1bmtub3duJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nsb25lKHZhbHVlLCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgX2Nsb25lKHZhbHVlOiBKc29uVmFsdWUsIGNvbnRleHQ/OiBKc29uQ29udGV4dCk6IERldGFpbGVkUmVzdWx0PEpzb25WYWx1ZSwgSnNvblJlZmVyZW5jZU1hcEZhaWx1cmVSZWFzb24+IHtcbiAgICAgICAgaWYgKCF0aGlzLl9lZGl0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IEpzb25FZGl0b3IuY3JlYXRlKCk7XG4gICAgICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogbmVhcmx5IGltcG9zc2libGUgdG8gcmVwcm9kdWNlXG4gICAgICAgICAgICBpZiAocmVzdWx0LmlzRmFpbHVyZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWxXaXRoRGV0YWlsKHJlc3VsdC5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2VkaXRvciA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fZWRpdG9yLmNsb25lKHZhbHVlLCBjb250ZXh0KS53aXRoRmFpbHVyZURldGFpbCgnZXJyb3InKTtcbiAgICB9XG59XG5cbi8qKlxuICogSW5pdGlhbGl6YXRpb24gb3B0aW9ucyBmb3IgYSBQcmVmaXhlZEpzb25NYXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlQcmVmaXhPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcHJlZml4IHNob3VsZCBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGFzIG5lZWRlZCAoZGVmYXVsdCB0cnVlKVxuICAgICAqL1xuICAgIGFkZFByZWZpeD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZml4IHRvIGJlIGVuZm9yY2VkXG4gICAgICovXG4gICAgcHJlZml4OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBQcmVmaXhlZEpzb25NYXAgZW5mb3JjZXMgYSBzdXBwbGllZCBwcmVmaXggZm9yIGFsbCBjb250YWluZWQgdmFsdWVzLCBvcHRpb25hbGx5XG4gKiBhZGRpbmcgdGhlIHByZWZpeCBhcyBuZWNlc3NhcnkgKGRlZmF1bHQgdHJ1ZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmVmaXhlZEpzb25NYXAgZXh0ZW5kcyBTaW1wbGVKc29uTWFwIHtcbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IodmFsdWVzPzogTWFwT3JSZWNvcmQ8SnNvblZhbHVlPiwgY29udGV4dD86IEpzb25Db250ZXh0LCBvcHRpb25zPzogU2ltcGxlSnNvbk1hcE9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIodmFsdWVzLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEBzZWUgUHJlZml4ZWRKc29uTWFwIGZyb20gdGhlIHN1cHBsaWVkIHZhbHVlc1xuICAgICAqIEBwYXJhbSBwcmVmaXggQSBzdHJpbmcgcHJlZml4IHRvIGJlIGVuZm9yY2VkIGZvciBhbmQgYWRkZWQgdG8ga2V5IG5hbWVzIGFzIG5lY2Vzc2FyeVxuICAgICAqIEBwYXJhbSB2YWx1ZXMgQSBzdHJpbmcta2V5ZWQgTWFwIG9yIFJlY29yZCBvZiB0aGUgQHNlZSBKc29uVmFsdWUgdG8gYmUgcmV0dXJuZWRcbiAgICAgKiBAcGFyYW0gY29udGV4dCBPcHRpb25hbCBAc2VlIEpzb25Db250ZXh0IHVzZWQgdG8gZm9ybWF0IHJldHVybmVkIHZhbHVlc1xuICAgICAqIEBwYXJhbSBlZGl0b3IgT3B0aW9uYWwgQHNlZSBKc29uRWRpdG9yIHVzZWQgdG8gZm9ybWF0IHJldHVybmVkIHZhbHVlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJlZml4ZWQocHJlZml4OiBzdHJpbmcsIHZhbHVlcz86IE1hcE9yUmVjb3JkPEpzb25WYWx1ZT4sIGNvbnRleHQ/OiBKc29uQ29udGV4dCwgZWRpdG9yPzogSnNvbkVkaXRvcik6IFJlc3VsdDxQcmVmaXhlZEpzb25NYXA+O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBAc2VlIFByZWZpeGVkSnNvbk1hcCBmcm9tIHRoZSBzdXBwbGllZCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gcHJlZml4T3B0aW9ucyBBIEtleVByZWZpeE9wdGlvbnMgaW5kaWNhdGluZyB0aGUgcHJlZml4IHRvIGVuZm9yY2UgYW5kIHdoZXRoZXIgdGhhdCBwcmVmaXggc2hvdWxkXG4gICAgICogYmUgYWRkZWQgYXV0b21hdGljYWxseSBpZiBuZWNlc3NhcnkgKGRlZmF1bHQgdHJ1ZSlcbiAgICAgKiBAcGFyYW0gdmFsdWVzIEEgc3RyaW5nLWtleWVkIE1hcCBvciByZWNvcmQgb2YgdGhlIEBzZWUgSnNvblZhbHVlIHRvIGJlIHJldHVybmVkXG4gICAgICogQHBhcmFtIGNvbnRleHQgT3B0aW9uYWwgQHNlZSBKc29uQ29udGV4dCB1c2VkIHRvIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXNcbiAgICAgKiBAcGFyYW0gZWRpdG9yIE9wdGlvbmFsIEBzZWUgSnNvbkVkaXRvciB1c2VkIHRvIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNyZWF0ZVByZWZpeGVkKHByZWZpeE9wdGlvbnM6IEtleVByZWZpeE9wdGlvbnMsIHZhbHVlcz86IE1hcE9yUmVjb3JkPEpzb25WYWx1ZT4sIGNvbnRleHQ/OiBKc29uQ29udGV4dCwgZWRpdG9yPzogSnNvbkVkaXRvcik6IFJlc3VsdDxQcmVmaXhlZEpzb25NYXA+O1xuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUHJlZml4ZWQocHJlZml4T3B0aW9uczogc3RyaW5nfEtleVByZWZpeE9wdGlvbnMsIHZhbHVlcz86IE1hcE9yUmVjb3JkPEpzb25WYWx1ZT4sIGNvbnRleHQ/OiBKc29uQ29udGV4dCwgZWRpdG9yPzogSnNvbkVkaXRvcik6IFJlc3VsdDxQcmVmaXhlZEpzb25NYXA+IHtcbiAgICAgICAgcmV0dXJuIGNhcHR1cmVSZXN1bHQoKCkgPT4gbmV3IFByZWZpeGVkSnNvbk1hcCh2YWx1ZXMsIGNvbnRleHQsIHsga2V5UG9saWN5OiB0aGlzLl90b1BvbGljeShwcmVmaXhPcHRpb25zKSwgZWRpdG9yIH0pKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc3RhdGljIF90b1BvbGljeShwcmVmaXhPcHRpb25zOiBzdHJpbmd8S2V5UHJlZml4T3B0aW9ucyk6IFJlZmVyZW5jZU1hcEtleVBvbGljeTxKc29uVmFsdWU+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBwcmVmaXhPcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhLZXlQb2xpY3kocHJlZml4T3B0aW9ucywgeyBtYWtlVmFsaWQ6IHRydWUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBQcmVmaXhLZXlQb2xpY3kocHJlZml4T3B0aW9ucy5wcmVmaXgsIHsgbWFrZVZhbGlkOiAocHJlZml4T3B0aW9ucy5hZGRQcmVmaXggIT09IGZhbHNlKSB9KTtcbiAgICB9XG59XG5cbiJdfQ==