schema-shield 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +291 -59
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +49 -7
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/dist/index.mjs +49 -7
- package/dist/utils.d.ts +21 -4
- package/dist/utils.d.ts.map +1 -1
- package/lib/index.ts +10 -1
- package/lib/utils.ts +61 -14
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -8,36 +8,35 @@ Despite its feature-rich and easy extendable nature, SchemaShield is designed to
|
|
|
8
8
|
|
|
9
9
|
## Table of Contents
|
|
10
10
|
|
|
11
|
-
- [
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
- [Adding Custom
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
- [
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
- [Legal](#legal)
|
|
11
|
+
- [Table of Contents](#table-of-contents)
|
|
12
|
+
- [Features](#features)
|
|
13
|
+
- [Usage](#usage)
|
|
14
|
+
- [No Code Generation](#no-code-generation)
|
|
15
|
+
- [Error Handling](#error-handling)
|
|
16
|
+
- [Adding Custom Types](#adding-custom-types)
|
|
17
|
+
- [Method Signature](#method-signature)
|
|
18
|
+
- [Example: Adding a Custom Type](#example-adding-a-custom-type)
|
|
19
|
+
- [Adding Custom Formats](#adding-custom-formats)
|
|
20
|
+
- [Method Signature](#method-signature-1)
|
|
21
|
+
- [Example: Adding a Custom Format](#example-adding-a-custom-format)
|
|
22
|
+
- [Adding Custom Keywords](#adding-custom-keywords)
|
|
23
|
+
- [Method Signature](#method-signature-2)
|
|
24
|
+
- [Example: Adding a Custom Keyword](#example-adding-a-custom-keyword)
|
|
25
|
+
- [Complex example: Adding a Custom Keyword that uses the instance](#complex-example-adding-a-custom-keyword-that-uses-the-instance)
|
|
26
|
+
- [No Code Generation Opened Possibilities](#no-code-generation-opened-possibilities)
|
|
27
|
+
- [More on Error Handling](#more-on-error-handling)
|
|
28
|
+
- [ValidationError Properties](#validationerror-properties)
|
|
29
|
+
- [Get the path to the error location](#get-the-path-to-the-error-location)
|
|
30
|
+
- [Get the full error chain as a tree](#get-the-full-error-chain-as-a-tree)
|
|
31
|
+
- [Get the cause of the error](#get-the-cause-of-the-error)
|
|
32
|
+
- [Immutable Mode](#immutable-mode)
|
|
33
|
+
- [TypeScript Support](#typescript-support)
|
|
34
|
+
- [Known Limitations](#known-limitations)
|
|
35
|
+
- [Schema References and Schema Definitions](#schema-references-and-schema-definitions)
|
|
36
|
+
- [Unsupported Formats](#unsupported-formats)
|
|
37
|
+
- [Testing](#testing)
|
|
38
|
+
- [Contribute](#contribute)
|
|
39
|
+
- [Legal](#legal)
|
|
41
40
|
|
|
42
41
|
## Features
|
|
43
42
|
|
|
@@ -47,6 +46,7 @@ Despite its feature-rich and easy extendable nature, SchemaShield is designed to
|
|
|
47
46
|
- Immutable mode for data protection.
|
|
48
47
|
- Lightweight and fast.
|
|
49
48
|
- Easy to use and extend.
|
|
49
|
+
- No dependencies.
|
|
50
50
|
- Typescript support.
|
|
51
51
|
|
|
52
52
|
## Usage
|
|
@@ -127,9 +127,9 @@ if (validationResult.valid) {
|
|
|
127
127
|
|
|
128
128
|
**`validationResult`**: Contains the following properties:
|
|
129
129
|
|
|
130
|
-
- `data`: The validated (and potentially modified) data
|
|
131
|
-
- `error`: A `ValidationError` instance if validation failed, otherwise null
|
|
132
|
-
- `valid`: true if validation was successful, otherwise false
|
|
130
|
+
- `data`: The validated (and potentially modified) data.
|
|
131
|
+
- `error`: A `ValidationError` instance if validation failed, otherwise null.
|
|
132
|
+
- `valid`: true if validation was successful, otherwise false.
|
|
133
133
|
|
|
134
134
|
## No Code Generation
|
|
135
135
|
|
|
@@ -150,30 +150,14 @@ You can see a full example of this in the [No Code Generation opened possibiliti
|
|
|
150
150
|
|
|
151
151
|
## Error Handling
|
|
152
152
|
|
|
153
|
-
SchemaShield provides
|
|
154
|
-
|
|
155
|
-
This returned error instance uses the new [Error: cause](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) property introduced in ES6. This allows you to analyze the whole error chain or to retrieve the root cause of the error using the `getCause()` method.
|
|
156
|
-
|
|
157
|
-
### ValidationError Properties
|
|
158
|
-
|
|
159
|
-
- `message`: A string containing a description of the error
|
|
160
|
-
- `item`: The final item in the path that caused the error
|
|
161
|
-
- `keyword`: The keyword that triggered the error
|
|
162
|
-
- `cause`: A nested ValidationError that caused the current error
|
|
163
|
-
- `path`: The JSON Pointer path to the error location in the schema (Only available using the `getCause()` method)
|
|
164
|
-
- `data`: The data that caused the error (optional)
|
|
165
|
-
- `schema`: The compiled schema that caused the error (optional)
|
|
166
|
-
|
|
167
|
-
### Get the cause of the error
|
|
168
|
-
|
|
169
|
-
You can use the `getCause()` method to retrieve the root cause of a validation error. This method returns the nested ValidationError instance that triggered the current error and contains the `path` property.
|
|
153
|
+
SchemaShield provides comprehensive error handling for schema validation. When a validation error occurs, a `ValidationError` instance is returned in the error property of the validation result. This error has the `getPath()` method, which is particularly useful for quickly identifying the location of an error in both the schema and the data.
|
|
170
154
|
|
|
171
155
|
**Example:**
|
|
172
156
|
|
|
173
157
|
```javascript
|
|
174
158
|
import { SchemaShield } from "schema-shield";
|
|
175
159
|
|
|
176
|
-
const schemaShield = new SchemaShield(
|
|
160
|
+
const schemaShield = new SchemaShield();
|
|
177
161
|
|
|
178
162
|
const schema = {
|
|
179
163
|
type: "object",
|
|
@@ -200,16 +184,15 @@ if (validationResult.valid) {
|
|
|
200
184
|
} else {
|
|
201
185
|
console.error("Validation error:", validationResult.error.message); // "Property is invalid"
|
|
202
186
|
|
|
203
|
-
// Get the
|
|
204
|
-
const
|
|
205
|
-
console.error("
|
|
206
|
-
console.error("
|
|
207
|
-
console.error("Error data:", errorCause.data); // 15
|
|
208
|
-
console.error("Error schema:", errorCause.schema); // 18
|
|
209
|
-
console.error("Error keyword:", errorCause.keyword); // "minimum"
|
|
187
|
+
// Get the paths to the error location in the schema and in the data
|
|
188
|
+
const errorPaths = validationResult.error.getPath();
|
|
189
|
+
console.error("Schema path:", errorPaths.schemaPath); // "#/properties/age/minimum"
|
|
190
|
+
console.error("Instance path:", errorPaths.instancePath); // "#/age"
|
|
210
191
|
}
|
|
211
192
|
```
|
|
212
193
|
|
|
194
|
+
For more advanced error handling and a detailed explanation of the ValidationError properties and methods, refer to the [More on Error Handling](#more-on-error-handling) section.
|
|
195
|
+
|
|
213
196
|
## Adding Custom Types
|
|
214
197
|
|
|
215
198
|
SchemaShield allows you to add custom types for validation using the `addType` method.
|
|
@@ -418,7 +401,7 @@ In this example, we'll add a custom keyword called divisibleBy that validates if
|
|
|
418
401
|
```javascript
|
|
419
402
|
import { SchemaShield, ValidationError } from "./path/to/SchemaShield";
|
|
420
403
|
|
|
421
|
-
const schemaShield = new SchemaShield(
|
|
404
|
+
const schemaShield = new SchemaShield();
|
|
422
405
|
|
|
423
406
|
// Custom keyword 'divisibleBy' validator function
|
|
424
407
|
const divisibleByValidator = (schema, data, defineError, instance) => {
|
|
@@ -681,6 +664,255 @@ if (validationResult.valid) {
|
|
|
681
664
|
|
|
682
665
|
In this example, SchemaShield safely accesses instances of custom classes and utilizes them in the validation process. This level of complexity and flexibility would not be possible or would require a lot of boilerplate code with other libraries that rely on code generation.
|
|
683
666
|
|
|
667
|
+
## More on Error Handling
|
|
668
|
+
|
|
669
|
+
SchemaShield provides a `ValidationError` class to handle errors that occur during schema validation. When a validation error is encountered, a `ValidationError` instance is returned in the error property of the validation result.
|
|
670
|
+
|
|
671
|
+
This error instance uses the new [Error: cause](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause) property introduced in ES6. This allows you to analyze the whole error chain or to retrieve the root cause of the error using the `getCause()` `getTree()` and `getPath()` methods.
|
|
672
|
+
|
|
673
|
+
### ValidationError Properties
|
|
674
|
+
|
|
675
|
+
- `message`: A string containing a description of the error.
|
|
676
|
+
- `item`: The final item in the path that caused the error (either a string or a number) (optional).
|
|
677
|
+
- `keyword`: The keyword that triggered the error.
|
|
678
|
+
- `cause`: A nested ValidationError or a normal Error that caused the current error.
|
|
679
|
+
- `schemaPath`: The JSON Pointer path to the error location in the schema.
|
|
680
|
+
- `instancePath`: The JSON Pointer path to the error location in the data.
|
|
681
|
+
- `data`: The data that caused the error (optional).
|
|
682
|
+
- `schema`: The schema that caused the error (optional).
|
|
683
|
+
|
|
684
|
+
_Note:_ The `schemaPath` and `instancePath` will be only available after using the `getCause()` `getTree()` or `getPath()` methods.
|
|
685
|
+
|
|
686
|
+
### Get the path to the error location
|
|
687
|
+
|
|
688
|
+
You can use the `getPath` method to get the JSON Pointer path to the error location in the schema and in the data. This method returns an object containing the `schemaPath` and `instancePath`.
|
|
689
|
+
|
|
690
|
+
**Example:**
|
|
691
|
+
|
|
692
|
+
```javascript
|
|
693
|
+
import { SchemaShield } from "schema-shield";
|
|
694
|
+
|
|
695
|
+
const schemaShield = new SchemaShield();
|
|
696
|
+
|
|
697
|
+
const schema = {
|
|
698
|
+
type: "object",
|
|
699
|
+
properties: {
|
|
700
|
+
description: { type: "string" },
|
|
701
|
+
shouldLoadDb: { type: "boolean" },
|
|
702
|
+
enableNetConnectFor: { type: "array", items: { type: "string" } },
|
|
703
|
+
params: {
|
|
704
|
+
type: "object",
|
|
705
|
+
additionalProperties: {
|
|
706
|
+
type: "object",
|
|
707
|
+
properties: {
|
|
708
|
+
description: { type: "string" },
|
|
709
|
+
default: { type: "string" }
|
|
710
|
+
},
|
|
711
|
+
required: ["description"]
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
run: { type: "string" }
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
|
|
718
|
+
const validator = schemaShield.compile(schema);
|
|
719
|
+
|
|
720
|
+
const invalidData = {
|
|
721
|
+
description: "Say hello to the bot.",
|
|
722
|
+
shouldLoadDb: false,
|
|
723
|
+
enableNetConnectFor: [],
|
|
724
|
+
params: {
|
|
725
|
+
color: {
|
|
726
|
+
type: "string",
|
|
727
|
+
// description: "The color of the text", // Missing description on purpose
|
|
728
|
+
default: "red"
|
|
729
|
+
}
|
|
730
|
+
},
|
|
731
|
+
run: "run"
|
|
732
|
+
};
|
|
733
|
+
|
|
734
|
+
const validationResult = validator(invalidData);
|
|
735
|
+
|
|
736
|
+
if (validationResult.valid) {
|
|
737
|
+
console.log("Data is valid:", validationResult.data);
|
|
738
|
+
} else {
|
|
739
|
+
console.error("Validation error:", validationResult.error.message); // "Property is invalid"
|
|
740
|
+
|
|
741
|
+
// Get the paths to the error location in the schema and in the data
|
|
742
|
+
const errorPaths = validationResult.error.getPath();
|
|
743
|
+
console.error("Schema path:", errorPaths.schemaPath); // "#/properties/params/additionalProperties/required"
|
|
744
|
+
console.error("Instance path:", errorPaths.instancePath); // "#/params/color/description"
|
|
745
|
+
}
|
|
746
|
+
```
|
|
747
|
+
|
|
748
|
+
### Get the full error chain as a tree
|
|
749
|
+
|
|
750
|
+
You can use the `getTree()` method to retrieve the full error chain as a tree. This method returns an ErrorTree object with the complete nested error structure, allowing you to analyze the full chain of errors that occurred during validation.
|
|
751
|
+
|
|
752
|
+
#### ErrorTree Signature
|
|
753
|
+
|
|
754
|
+
```typescript
|
|
755
|
+
interface ErrorTree {
|
|
756
|
+
message: string; // The error message
|
|
757
|
+
keyword: string; // The keyword that triggered the error
|
|
758
|
+
item?: string | number; // The final item in the path that caused the error (either a string or a number) (optional)
|
|
759
|
+
schemaPath: string; // The JSON Pointer path to the error location in the schema
|
|
760
|
+
instancePath: string; // The JSON Pointer path to the error location in the data
|
|
761
|
+
data?: any; // The data that caused the error (optional)
|
|
762
|
+
cause?: ErrorTree; // A nested ErrorTree representation of the nested error that caused the current error
|
|
763
|
+
}
|
|
764
|
+
```
|
|
765
|
+
|
|
766
|
+
**Example:**
|
|
767
|
+
|
|
768
|
+
```javascript
|
|
769
|
+
import { SchemaShield } from "schema-shield";
|
|
770
|
+
|
|
771
|
+
const schemaShield = new SchemaShield();
|
|
772
|
+
|
|
773
|
+
const schema = {
|
|
774
|
+
type: "object",
|
|
775
|
+
properties: {
|
|
776
|
+
description: { type: "string" },
|
|
777
|
+
shouldLoadDb: { type: "boolean" },
|
|
778
|
+
enableNetConnectFor: { type: "array", items: { type: "string" } },
|
|
779
|
+
params: {
|
|
780
|
+
type: "object",
|
|
781
|
+
additionalProperties: {
|
|
782
|
+
type: "object",
|
|
783
|
+
properties: {
|
|
784
|
+
description: { type: "string" },
|
|
785
|
+
default: { type: "string" }
|
|
786
|
+
},
|
|
787
|
+
required: ["description"]
|
|
788
|
+
}
|
|
789
|
+
},
|
|
790
|
+
run: { type: "string" }
|
|
791
|
+
}
|
|
792
|
+
};
|
|
793
|
+
|
|
794
|
+
const validator = schemaShield.compile(schema);
|
|
795
|
+
|
|
796
|
+
const invalidData = {
|
|
797
|
+
description: "Say hello to the bot.",
|
|
798
|
+
shouldLoadDb: false,
|
|
799
|
+
enableNetConnectFor: [],
|
|
800
|
+
params: {
|
|
801
|
+
color: {
|
|
802
|
+
type: "string",
|
|
803
|
+
// description: "The color of the text", // Missing description on purpose
|
|
804
|
+
default: "red"
|
|
805
|
+
}
|
|
806
|
+
},
|
|
807
|
+
run: "run"
|
|
808
|
+
};
|
|
809
|
+
|
|
810
|
+
const validationResult = validator(invalidData);
|
|
811
|
+
|
|
812
|
+
if (validationResult.valid) {
|
|
813
|
+
console.log("Data is valid:", validationResult.data);
|
|
814
|
+
} else {
|
|
815
|
+
console.error("Validation error:", validationResult.error.message); // "Property is invalid"
|
|
816
|
+
|
|
817
|
+
// Get the full error chain as a tree
|
|
818
|
+
const errorTree = validationResult.error.getTree();
|
|
819
|
+
console.error(errorTree);
|
|
820
|
+
|
|
821
|
+
/*
|
|
822
|
+
{
|
|
823
|
+
message: "Property is invalid",
|
|
824
|
+
keyword: "properties",
|
|
825
|
+
item: "params",
|
|
826
|
+
schemaPath: "#/properties/params",
|
|
827
|
+
instancePath: "#/params",
|
|
828
|
+
data: { color: { type: "string", default: "red" } },
|
|
829
|
+
cause: {
|
|
830
|
+
message: "Additional properties are invalid",
|
|
831
|
+
keyword: "additionalProperties",
|
|
832
|
+
item: "color",
|
|
833
|
+
schemaPath: "#/properties/params/additionalProperties",
|
|
834
|
+
instancePath: "#/params/color",
|
|
835
|
+
data: { type: "string", default: "red" },
|
|
836
|
+
cause: {
|
|
837
|
+
message: "Required property is missing",
|
|
838
|
+
keyword: "required",
|
|
839
|
+
item: "description",
|
|
840
|
+
schemaPath: "#/properties/params/additionalProperties/required",
|
|
841
|
+
instancePath: "#/params/color/description",
|
|
842
|
+
data: undefined
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
*/
|
|
847
|
+
}
|
|
848
|
+
```
|
|
849
|
+
|
|
850
|
+
The `errorTree` object contains the full error chain with nested causes, allowing you to analyze the entire error structure.
|
|
851
|
+
|
|
852
|
+
### Get the cause of the error
|
|
853
|
+
|
|
854
|
+
You can use the `getCause()` method to retrieve the root cause of a validation error. This method returns the nested ValidationError instance that triggered the current error and contains the `schemaPath` and `instancePath` properties.
|
|
855
|
+
|
|
856
|
+
```javascript
|
|
857
|
+
import { SchemaShield } from "schema-shield";
|
|
858
|
+
|
|
859
|
+
const schemaShield = new SchemaShield();
|
|
860
|
+
|
|
861
|
+
const schema = {
|
|
862
|
+
type: "object",
|
|
863
|
+
properties: {
|
|
864
|
+
description: { type: "string" },
|
|
865
|
+
shouldLoadDb: { type: "boolean" },
|
|
866
|
+
enableNetConnectFor: { type: "array", items: { type: "string" } },
|
|
867
|
+
params: {
|
|
868
|
+
type: "object",
|
|
869
|
+
additionalProperties: {
|
|
870
|
+
type: "object",
|
|
871
|
+
properties: {
|
|
872
|
+
description: { type: "string" },
|
|
873
|
+
default: { type: "string" }
|
|
874
|
+
},
|
|
875
|
+
required: ["description"]
|
|
876
|
+
}
|
|
877
|
+
},
|
|
878
|
+
run: { type: "string" }
|
|
879
|
+
}
|
|
880
|
+
};
|
|
881
|
+
|
|
882
|
+
const validator = schemaShield.compile(schema);
|
|
883
|
+
|
|
884
|
+
const invalidData = {
|
|
885
|
+
description: "Say hello to the bot.",
|
|
886
|
+
shouldLoadDb: false,
|
|
887
|
+
enableNetConnectFor: [],
|
|
888
|
+
params: {
|
|
889
|
+
color: {
|
|
890
|
+
type: "string",
|
|
891
|
+
// description: "The color of the text", // Missing description on purpose
|
|
892
|
+
default: "red"
|
|
893
|
+
}
|
|
894
|
+
},
|
|
895
|
+
run: "run"
|
|
896
|
+
};
|
|
897
|
+
|
|
898
|
+
const validationResult = validator(invalidData);
|
|
899
|
+
|
|
900
|
+
if (validationResult.valid) {
|
|
901
|
+
console.log("Data is valid:", validationResult.data);
|
|
902
|
+
} else {
|
|
903
|
+
console.error("Validation error:", validationResult.error.message); // "Property is invalid"
|
|
904
|
+
|
|
905
|
+
// Get the root cause of the error
|
|
906
|
+
const errorCause = validationResult.error.getCause();
|
|
907
|
+
console.error("Root cause:", errorCause.message); // "Required property is missing"
|
|
908
|
+
console.error("Schema path:", errorCause.schemaPath); // "#/properties/params/additionalProperties/required"
|
|
909
|
+
console.error("Instance path:", errorCause.instancePath); // "#/params/color/description"
|
|
910
|
+
console.error("Error data:", errorCause.data); // undefined
|
|
911
|
+
console.error("Error schema:", errorCause.schema); // ["description"]
|
|
912
|
+
console.error("Error keyword:", errorCause.keyword); // "required"
|
|
913
|
+
}
|
|
914
|
+
```
|
|
915
|
+
|
|
684
916
|
## Immutable Mode
|
|
685
917
|
|
|
686
918
|
SchemaShield offers an optional immutable mode to prevent modifications to the input data during validation. In some cases, SchemaShield may mutate the data when using the `default` keyword or within custom added keywords.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EAKhB,MAAM,SAAS,CAAC;AAMjB,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,eAAe,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,CACE,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,YAAY,GACrB,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAS;gBAEd,EACV,SAAiB,EAClB,GAAE;QACD,SAAS,CAAC,EAAE,OAAO,CAAC;KAChB;IAoBN,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,UAAQ;IAOhE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK;IAI3C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,UAAQ;IAOpE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,KAAK;IAIjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,UAAQ;IAOtE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,KAAK;IAIpD,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS;IA6B/B,OAAO,CAAC,aAAa;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,eAAe,EAKhB,MAAM,SAAS,CAAC;AAMjB,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,eAAe,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,CACE,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,mBAAmB,EAChC,QAAQ,EAAE,YAAY,GACrB,MAAM,CAAC;CACX;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,IAAI,EAAE,GAAG,GAAG,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,IAAI,EAAE,GAAG,GAAG;QAAE,IAAI,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA4C;IACzD,OAAO,CAAC,OAAO,CAA8C;IAC7D,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAS;gBAEd,EACV,SAAiB,EAClB,GAAE;QACD,SAAS,CAAC,EAAE,OAAO,CAAC;KAChB;IAoBN,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,UAAQ;IAOhE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,KAAK;IAI3C,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,UAAQ;IAOpE,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,KAAK;IAIjD,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,UAAQ;IAOtE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,KAAK;IAIpD,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,SAAS;IA6B/B,OAAO,CAAC,aAAa;IA0IrB,YAAY,CAAC,SAAS,EAAE,GAAG,GAAG,OAAO;CActC"}
|
package/dist/index.js
CHANGED
|
@@ -29,20 +29,54 @@ var ValidationError = class extends Error {
|
|
|
29
29
|
item;
|
|
30
30
|
keyword;
|
|
31
31
|
cause;
|
|
32
|
-
|
|
32
|
+
schemaPath = "";
|
|
33
|
+
instancePath = "";
|
|
33
34
|
data;
|
|
34
35
|
schema;
|
|
35
|
-
_getCause(pointer = "#") {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
_getCause(pointer = "#", instancePointer = "#") {
|
|
37
|
+
let schemaPath = `${pointer}/${this.keyword}`;
|
|
38
|
+
let instancePath = `${instancePointer}`;
|
|
39
|
+
if (typeof this.item !== "undefined") {
|
|
40
|
+
if (typeof this.item === "string" && this.item in this.schema) {
|
|
41
|
+
schemaPath += `/${this.item}`;
|
|
42
|
+
}
|
|
43
|
+
instancePath += `/${this.item}`;
|
|
44
|
+
}
|
|
45
|
+
this.instancePath = instancePath;
|
|
46
|
+
this.schemaPath = schemaPath;
|
|
47
|
+
if (!this.cause || !(this.cause instanceof ValidationError)) {
|
|
39
48
|
return this;
|
|
40
49
|
}
|
|
41
|
-
return this.cause._getCause(
|
|
50
|
+
return this.cause._getCause(schemaPath, instancePath);
|
|
42
51
|
}
|
|
43
52
|
getCause() {
|
|
44
53
|
return this._getCause();
|
|
45
54
|
}
|
|
55
|
+
_getTree() {
|
|
56
|
+
const tree = {
|
|
57
|
+
message: this.message,
|
|
58
|
+
keyword: this.keyword,
|
|
59
|
+
item: this.item,
|
|
60
|
+
schemaPath: this.schemaPath,
|
|
61
|
+
instancePath: this.instancePath,
|
|
62
|
+
data: this.data
|
|
63
|
+
};
|
|
64
|
+
if (this.cause) {
|
|
65
|
+
tree.cause = this.cause._getTree();
|
|
66
|
+
}
|
|
67
|
+
return tree;
|
|
68
|
+
}
|
|
69
|
+
getTree() {
|
|
70
|
+
this.getCause();
|
|
71
|
+
return this._getTree();
|
|
72
|
+
}
|
|
73
|
+
getPath() {
|
|
74
|
+
const cause = this.getCause();
|
|
75
|
+
return {
|
|
76
|
+
schemaPath: cause.schemaPath,
|
|
77
|
+
instancePath: cause.instancePath
|
|
78
|
+
};
|
|
79
|
+
}
|
|
46
80
|
};
|
|
47
81
|
function getDefinedErrorFunctionForKey(key, schema) {
|
|
48
82
|
const KeywordError = new ValidationError(`Invalid ${key}`);
|
|
@@ -1127,7 +1161,7 @@ var SchemaShield = class {
|
|
|
1127
1161
|
};
|
|
1128
1162
|
}
|
|
1129
1163
|
}
|
|
1130
|
-
const compiledSchema =
|
|
1164
|
+
const compiledSchema = deepClone(schema);
|
|
1131
1165
|
const defineTypeError = getDefinedErrorFunctionForKey("type", schema);
|
|
1132
1166
|
const typeValidations = [];
|
|
1133
1167
|
let methodName = "";
|
|
@@ -1208,6 +1242,14 @@ var SchemaShield = class {
|
|
|
1208
1242
|
}
|
|
1209
1243
|
}
|
|
1210
1244
|
if (isObject(schema[key])) {
|
|
1245
|
+
if (key === "properties") {
|
|
1246
|
+
for (const subKey of Object.keys(schema[key])) {
|
|
1247
|
+
compiledSchema[key][subKey] = this.compileSchema(
|
|
1248
|
+
schema[key][subKey]
|
|
1249
|
+
);
|
|
1250
|
+
}
|
|
1251
|
+
continue;
|
|
1252
|
+
}
|
|
1211
1253
|
compiledSchema[key] = this.compileSchema(schema[key]);
|
|
1212
1254
|
continue;
|
|
1213
1255
|
}
|
package/dist/index.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(()=>{var e=class extends Error{message;item;keyword;cause;path="";data;schema;_getCause(e="#"){const t=e+"/"+this.keyword+(void 0!==this.item?"/"+this.item:"");return this.cause?this.cause._getCause(t):(this.path=t,this)}getCause(){return this._getCause()}};function t(t,i){const r=new e(`Invalid ${t}`);r.keyword=t,r.schema=i;return o(`defineError_${t}`,(e,t={})=>(r.message=e,r.item=t.item,r.cause=t.cause,r.data=t.data,r))}function i(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const n of r)if(!i(e[n],t[n]))return!1;return!0}return e===t}function r(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function n(e){if(Array.isArray(e)){const t=[];for(let i=0;i<e.length;i++)t[i]=n(e[i]);return t}if(e&&e.constructor&&"Object"!==e.constructor.name)return e;if(r(e)){const t={...e};for(const i in e)t[i]=n(e[i]);return t}return e}function a(e){return r(e)&&"$validate"in e}function o(e,t){return Object.defineProperty(t,"name",{value:e})}var s={"date-time"(e){const t=e.match(/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i);if(!t)return!1;let i=Number(t[3]);if("02"===t[2]&&i>29)return!1;const[,r,n,,a,o,s,l,f,u]=t;let d=Number(r),m=Number(n),c=Number(a),p=Number(o),y=Number(s);if("-"===l||"+"===l){const e=Number(f),t=Number(u);if("-"===l?(c+=e,p+=t):"+"===l&&(c-=e,p-=t),p>59?(c+=1,p-=60):p<0&&(c-=1,p+=60),c>23?(i+=1,c-=24):c<0&&(i-=1,c+=24),i>31?(m+=1,i-=31):i<1&&(m-=1,i+=31),m>12?(d+=1,m-=12):m<1&&(d-=1,m+=12),d<0)return!1}return!(i>(2===m?d%4!=0||d%100==0&&d%400!=0?28:29:[31,,31,30,31,30,31,31,30,31,30,31][m-1]))&&(60!==y||59===p&&23===c)},uri:e=>/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/.test(e),email:e=>/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i.test(e),ipv4:e=>/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(t))return!1}const r=-1!==e.indexOf("::"),n=t?i.join(":"):e;if(r)return!(n.split("::").length-1>1)&&(!!/^[0-9a-fA-F:.]*$/.test(n)&&/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/.test(n));const a=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/.test(n),o=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/.test(n);return t?a||!o:a&&!o},hostname:e=>/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i.test(e),date:e=>!1!==/^(\d{4})-(\d{2})-(\d{2})$/.test(e)&&!isNaN(new Date(e).getTime()),regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||/^\/(?:[^~]|~0|~1)*$/.test(e),"relative-json-pointer":e=>""===e||/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/.test(e),time:e=>/^(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/.test(e),"uri-reference":e=>!/\\/.test(e)&&/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i.test(e),"uri-template":e=>/^(?:(?:https?:\/\/[\w.-]+)?\/?)?[\w- ;,.\/?%&=]*(?:\{[\w-]+(?::\d+)?\}[\w- ;,.\/?%&=]*)*\/?$/.test(e),duration:!1,uuid:!1,"idn-email":!1,"idn-hostname":!1,iri:!1,"iri-reference":!1},l={object:e=>r(e),array:e=>!!Array.isArray(e)||"object"==typeof e&&null!==e&&"length"in e&&"0"in e&&Object.keys(e).length-1===e.length,string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},f={...{required(e,t,i){if(r(t))for(let r=0;r<e.required.length;r++){const n=e.required[r];if(!t.hasOwnProperty(n))return i("Required property is missing",{item:n,data:t[n]})}},properties(e,t,i){if(r(t))for(const n of Object.keys(e.properties))if(t.hasOwnProperty(n)){if("boolean"!=typeof e.properties[n]){if("$validate"in e.properties[n]){const r=e.properties[n].$validate(t[n]);if(r)return i("Property is invalid",{item:n,cause:r,data:t[n]})}}else if(!1===e.properties[n])return i("Property is not allowed",{item:n,data:t[n]})}else{const i=e.properties[n];r(i)&&"default"in i&&(t[n]=i.default)}},values(e,t,i){if(!r(t)||!a(e.values))return;const n=Object.keys(t);for(const r of n){const n=e.values.$validate(t[r]);if(n)return i("Property is invalid",{item:r,cause:n,data:t[r]})}},maxProperties(e,t,i){if(r(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(r(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!r(t))return;const n=Object.keys(t),o=a(e.additionalProperties);for(const r of n)if(!e.properties||!e.properties.hasOwnProperty(r)){if(e.patternProperties){let t=!1;for(const i in e.patternProperties)if(new RegExp(i,"u").test(r)){t=!0;break}if(t)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:r,data:t[r]});if(o){const n=e.additionalProperties.$validate(t[r]);if(n)return i("Additional properties are invalid",{item:r,cause:n,data:t[r]})}}},patternProperties(e,t,i){if(!r(t))return;const n=Object.keys(e.patternProperties);for(const r of n){const n=new RegExp(r,"u");if("boolean"==typeof e.patternProperties[r]){if(!1===e.patternProperties[r])for(const e in t)if(n.test(e))return i("Property is not allowed",{item:e,data:t[e]});continue}const a=Object.keys(t);for(const o of a)if(n.test(o)&&"$validate"in e.patternProperties[r]){const n=e.patternProperties[r].$validate(t[o]);if(n)return i("Property is invalid",{item:o,cause:n,data:t[o]})}}},propertyNames(e,t,i){if(r(t)){if("boolean"==typeof e.propertyNames&&!1===e.propertyNames&&Object.keys(t).length>0)return i("Properties are not allowed",{data:t});if(a(e.propertyNames))for(let r in t){const n=e.propertyNames.$validate(r);if(n)return i("Property name is invalid",{item:r,cause:n,data:t[r]})}}},dependencies(e,t,i){if(r(t))for(const r in e.dependencies){if(r in t==!1)continue;const n=e.dependencies[r];if(Array.isArray(n)){for(let e=0;e<n.length;e++)if(!(n[e]in t))return i("Dependency is not satisfied",{item:e,data:n[e]});continue}if("boolean"==typeof n){if(n)continue;return i("Dependency is not satisfied",{data:n})}if("string"==typeof n){if(n in t)continue;return i("Dependency is not satisfied",{data:n})}const a=n.$validate(t);if(a)return i("Dependency is not satisfied",{cause:a,data:t})}},then:!1,else:!1,default:!1,$ref:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,n=t.length;if("boolean"==typeof r)return!1===r&&n>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,o=Math.min(e,n);for(let e=0;e<o;e++){const n=r[e];if("boolean"!=typeof n){if(a(n)){const r=n.$validate(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}else if(!1===n&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]})}}else if(a(r))for(let e=0;e<n;e++){const n=r.$validate(t[e]);if(n)return i("Array item is invalid",{item:e,cause:n,data:t[e]})}},elements(e,t,i){if(Array.isArray(t)&&a(e.elements))for(let r=0;r<t.length;r++){const n=e.elements.$validate(t[r]);if(n)return i("Array item is invalid",{item:r,cause:n,data:t[r]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!r(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(r(e.additionalItems)){if(a(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const n=e.additionalItems.$validate(t[r]);if(n)return i("Array item is invalid",{item:r,cause:n,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const n=new Set;for(const e of t){let t;if(t="string"==typeof e?`s:${e}`:r(e)?`o:${JSON.stringify(Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t))))}`:Array.isArray(e)?JSON.stringify(e):String(e),n.has(t))return i("Array items are not unique",{data:e});n.add(t)}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;const r=new RegExp(e.pattern,"u");return r instanceof RegExp==!1?i("Invalid regular expression",{data:t}):r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;const n=r.getFormat(e.format);return n&&!n(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let n=e.minimum;return"number"==typeof e.exclusiveMinimum?n=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(n+=1e-15),t<n?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let n=e.maximum;return"number"==typeof e.exclusiveMaximum?n=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(n-=1e-15),t>n?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const n=t/e.multipleOf;return isFinite(n)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(n,Math.round(n))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,r){const n=Array.isArray(t),a="object"==typeof t&&null!==t;for(let r=0;r<e.enum.length;r++){const o=e.enum[r];if(o===t)return;if((n&&Array.isArray(o)||a&&"object"==typeof o&&null!==o)&&i(o,t))return}return r("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let n=0;n<e.allOf.length;n++)if(r(e.allOf[n])){if("$validate"in e.allOf[n]){const r=e.allOf[n].$validate(t);if(r)return i("Value is not valid",{cause:r,data:t})}}else if("boolean"!=typeof e.allOf[n]){if(t!==e.allOf[n])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[n])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(r(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){let n=0;for(let i=0;i<e.oneOf.length;i++)if(r(e.oneOf[i])){if("$validate"in e.oneOf[i]){e.oneOf[i].$validate(t)||n++;continue}n++}else"boolean"!=typeof e.oneOf[i]?t===e.oneOf[i]&&n++:Boolean(t)===e.oneOf[i]&&n++;if(1!==n)return i("Value is not valid",{data:t})},const(e,t,n){if(!(t===e.const||r(t)&&r(e.const)&&i(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&i(t,e.const)))return n("Value is not valid",{data:t})},if(e,t,i){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(a(e.then))return e.then.$validate(t)}else if(a(e.else))return e.else.$validate(t);return}if(!a(e.if))return;return e.if.$validate(t)?a(e.else)?e.else.$validate(t):void 0:a(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(r(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})}}},u={SchemaShield:class{types={};formats={};keywords={};immutable=!1;constructor({immutable:e=!1}={}){this.immutable=e;for(const[e,t]of Object.entries(l))t&&this.addType(e,t);for(const[e,t]of Object.entries(f))this.addKeyword(e,t);for(const[e,t]of Object.entries(s))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}compile(t){const i=this.compileSchema(t);if(!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=o("any",()=>{})}const r=e=>{const t=this.immutable?n(e):e,r=i.$validate(t);return{data:t,error:r||null,valid:!r}};return r.compiledSchema=i,r}compileSchema(e){r(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const i={...e},n=t("type",e),a=[];let s="";if("type"in e){const t=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim());for(const e of t){const t=this.getType(e);t&&(a.push(t),s+=(s?"_OR_":"")+t.name)}const r=a.length;if(0===r)throw n("Invalid type for schema",{data:e.type});if(1===r){const e=a[0];i.$validate=o(s,t=>{if(!e(t))return n("Invalid type",{data:t})})}else r>1&&(i.$validate=o(s,e=>{for(let t=0;t<r;t++)if(a[t](e))return;return n("Invalid type",{data:e})}))}for(const n of Object.keys(e)){if("type"===n){i.type=e.type;continue}const a=this.getKeyword(n);if(a){const r=t(n,e[n]);if(i.$validate){const e=i.$validate;s+=`_AND_${a.name}`,i.$validate=o(s,t=>{const n=e(t);return n||a(i,t,r,this)})}else s=a.name,i.$validate=o(s,e=>a(i,e,r,this))}r(e[n])?i[n]=this.compileSchema(e[n]):Array.isArray(e[n])?i[n]=e[n].map((e,t)=>this.isSchemaLike(e)?this.compileSchema(e):e):i[n]=e[n]}return i}isSchemaLike(e){if(r(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}}};"undefined"!=typeof module?module.exports=u:self.SchemaShield=u})();//# sourceMappingURL=index.min.js.map
|
|
1
|
+
(()=>{var e=class extends Error{message;item;keyword;cause;schemaPath="";instancePath="";data;schema;_getCause(t="#",i="#"){let r=`${t}/${this.keyword}`,a=`${i}`;return void 0!==this.item&&("string"==typeof this.item&&this.item in this.schema&&(r+=`/${this.item}`),a+=`/${this.item}`),this.instancePath=a,this.schemaPath=r,this.cause&&this.cause instanceof e?this.cause._getCause(r,a):this}getCause(){return this._getCause()}_getTree(){const e={message:this.message,keyword:this.keyword,item:this.item,schemaPath:this.schemaPath,instancePath:this.instancePath,data:this.data};return this.cause&&(e.cause=this.cause._getTree()),e}getTree(){return this.getCause(),this._getTree()}getPath(){const e=this.getCause();return{schemaPath:e.schemaPath,instancePath:e.instancePath}}};function t(t,i){const r=new e(`Invalid ${t}`);r.keyword=t,r.schema=i;return s(`defineError_${t}`,(e,t={})=>(r.message=e,r.item=t.item,r.cause=t.cause,r.data=t.data,r))}function i(e,t){if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let r=0;r<e.length;r++)if(!i(e[r],t[r]))return!1;return!0}if("object"==typeof e&&"object"==typeof t){if(null===e||null===t)return e===t;const r=Object.keys(e);if(r.length!==Object.keys(t).length)return!1;for(const a of r)if(!i(e[a],t[a]))return!1;return!0}return e===t}function r(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function a(e){if(Array.isArray(e)){const t=[];for(let i=0;i<e.length;i++)t[i]=a(e[i]);return t}if(e&&e.constructor&&"Object"!==e.constructor.name)return e;if(r(e)){const t={...e};for(const i in e)t[i]=a(e[i]);return t}return e}function n(e){return r(e)&&"$validate"in e}function s(e,t){return Object.defineProperty(t,"name",{value:e})}var o={"date-time"(e){const t=e.match(/^(\d{4})-(0[0-9]|1[0-2])-(\d{2})T(0[0-9]|1\d|2[0-3]):([0-5]\d):((?:[0-5]\d|60))(?:.\d+)?(?:([+-])(0[0-9]|1\d|2[0-3]):([0-5]\d)|Z)?$/i);if(!t)return!1;let i=Number(t[3]);if("02"===t[2]&&i>29)return!1;const[,r,a,,n,s,o,l,u,f]=t;let d=Number(r),m=Number(a),c=Number(n),p=Number(s),y=Number(o);if("-"===l||"+"===l){const e=Number(u),t=Number(f);if("-"===l?(c+=e,p+=t):"+"===l&&(c-=e,p-=t),p>59?(c+=1,p-=60):p<0&&(c-=1,p+=60),c>23?(i+=1,c-=24):c<0&&(i-=1,c+=24),i>31?(m+=1,i-=31):i<1&&(m-=1,i+=31),m>12?(d+=1,m-=12):m<1&&(d-=1,m+=12),d<0)return!1}return!(i>(2===m?d%4!=0||d%100==0&&d%400!=0?28:29:[31,,31,30,31,30,31,31,30,31,30,31][m-1]))&&(60!==y||59===p&&23===c)},uri:e=>/^[a-zA-Z][a-zA-Z0-9+\-.]*:[^\s]*$/.test(e),email:e=>/^(?!\.)(?!.*\.$)[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,20}(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]{1,21}){0,2}@[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?(?:\.[a-z0-9](?:[a-z0-9-]{0,60}[a-z0-9])?){0,3}$/i.test(e),ipv4:e=>/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(e),ipv6(e){if("::"===e)return!0;if(-1===e.indexOf(":")||/(?:\s+|:::+|^\w{5,}|\w{5}$|^:{1}\w|\w:{1}$)/.test(e))return!1;const t=-1!==e.indexOf(".");let i=e;if(t){i=e.split(":");const t=i.pop();if(!/^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])$/.test(t))return!1}const r=-1!==e.indexOf("::"),a=t?i.join(":"):e;if(r)return!(a.split("::").length-1>1)&&(!!/^[0-9a-fA-F:.]*$/.test(a)&&/^(?:(?:(?:[0-9a-fA-F]{1,4}(?::|$)){1,6}))|(?:::(?:[0-9a-fA-F]{1,4})){0,5}$/.test(a));const n=/^(?:(?:[0-9a-fA-F]{1,4}:){7}(?:[0-9a-fA-F]{1,4}|:))$/.test(a),s=/(?:[0-9a-fA-F]{5,}|\D[0-9a-fA-F]{3}:)/.test(a);return t?n||!s:n&&!s},hostname:e=>/^[a-z0-9][a-z0-9-]{0,62}(?:\.[a-z0-9][a-z0-9-]{0,62})*[a-z0-9]$/i.test(e),date:e=>!1!==/^(\d{4})-(\d{2})-(\d{2})$/.test(e)&&!isNaN(new Date(e).getTime()),regex(e){try{return new RegExp(e),!0}catch(e){return!1}},"json-pointer":e=>""===e||/^\/(?:[^~]|~0|~1)*$/.test(e),"relative-json-pointer":e=>""===e||/^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/.test(e),time:e=>/^(\d{2}):(\d{2}):(\d{2})(\.\d+)?(Z|([+-])(\d{2}):(\d{2}))$/.test(e),"uri-reference":e=>!/\\/.test(e)&&/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#((?![^#]*\\)[^#]*))?/i.test(e),"uri-template":e=>/^(?:(?:https?:\/\/[\w.-]+)?\/?)?[\w- ;,.\/?%&=]*(?:\{[\w-]+(?::\d+)?\}[\w- ;,.\/?%&=]*)*\/?$/.test(e),duration:!1,uuid:!1,"idn-email":!1,"idn-hostname":!1,iri:!1,"iri-reference":!1},l={object:e=>r(e),array:e=>!!Array.isArray(e)||"object"==typeof e&&null!==e&&"length"in e&&"0"in e&&Object.keys(e).length-1===e.length,string:e=>"string"==typeof e,number:e=>"number"==typeof e,integer:e=>"number"==typeof e&&e%1==0,boolean:e=>"boolean"==typeof e,null:e=>null===e,timestamp:!1,int8:!1,unit8:!1,int16:!1,unit16:!1,int32:!1,unit32:!1,float32:!1,float64:!1},u={...{required(e,t,i){if(r(t))for(let r=0;r<e.required.length;r++){const a=e.required[r];if(!t.hasOwnProperty(a))return i("Required property is missing",{item:a,data:t[a]})}},properties(e,t,i){if(r(t))for(const a of Object.keys(e.properties))if(t.hasOwnProperty(a)){if("boolean"!=typeof e.properties[a]){if("$validate"in e.properties[a]){const r=e.properties[a].$validate(t[a]);if(r)return i("Property is invalid",{item:a,cause:r,data:t[a]})}}else if(!1===e.properties[a])return i("Property is not allowed",{item:a,data:t[a]})}else{const i=e.properties[a];r(i)&&"default"in i&&(t[a]=i.default)}},values(e,t,i){if(!r(t)||!n(e.values))return;const a=Object.keys(t);for(const r of a){const a=e.values.$validate(t[r]);if(a)return i("Property is invalid",{item:r,cause:a,data:t[r]})}},maxProperties(e,t,i){if(r(t)&&!(Object.keys(t).length<=e.maxProperties))return i("Too many properties",{data:t})},minProperties(e,t,i){if(r(t)&&!(Object.keys(t).length>=e.minProperties))return i("Too few properties",{data:t})},additionalProperties(e,t,i){if(!r(t))return;const a=Object.keys(t),s=n(e.additionalProperties);for(const r of a)if(!e.properties||!e.properties.hasOwnProperty(r)){if(e.patternProperties){let t=!1;for(const i in e.patternProperties)if(new RegExp(i,"u").test(r)){t=!0;break}if(t)continue}if(!1===e.additionalProperties)return i("Additional properties are not allowed",{item:r,data:t[r]});if(s){const a=e.additionalProperties.$validate(t[r]);if(a)return i("Additional properties are invalid",{item:r,cause:a,data:t[r]})}}},patternProperties(e,t,i){if(!r(t))return;const a=Object.keys(e.patternProperties);for(const r of a){const a=new RegExp(r,"u");if("boolean"==typeof e.patternProperties[r]){if(!1===e.patternProperties[r])for(const e in t)if(a.test(e))return i("Property is not allowed",{item:e,data:t[e]});continue}const n=Object.keys(t);for(const s of n)if(a.test(s)&&"$validate"in e.patternProperties[r]){const a=e.patternProperties[r].$validate(t[s]);if(a)return i("Property is invalid",{item:s,cause:a,data:t[s]})}}},propertyNames(e,t,i){if(r(t)){if("boolean"==typeof e.propertyNames&&!1===e.propertyNames&&Object.keys(t).length>0)return i("Properties are not allowed",{data:t});if(n(e.propertyNames))for(let r in t){const a=e.propertyNames.$validate(r);if(a)return i("Property name is invalid",{item:r,cause:a,data:t[r]})}}},dependencies(e,t,i){if(r(t))for(const r in e.dependencies){if(r in t==!1)continue;const a=e.dependencies[r];if(Array.isArray(a)){for(let e=0;e<a.length;e++)if(!(a[e]in t))return i("Dependency is not satisfied",{item:e,data:a[e]});continue}if("boolean"==typeof a){if(a)continue;return i("Dependency is not satisfied",{data:a})}if("string"==typeof a){if(a in t)continue;return i("Dependency is not satisfied",{data:a})}const n=a.$validate(t);if(n)return i("Dependency is not satisfied",{cause:n,data:t})}},then:!1,else:!1,default:!1,$ref:!1,definitions:!1,$id:!1,$schema:!1,title:!1,description:!1,$comment:!1,examples:!1,contentMediaType:!1,contentEncoding:!1,discriminator:!1,nullable:!1},...{items(e,t,i){if(!Array.isArray(t))return;const r=e.items,a=t.length;if("boolean"==typeof r)return!1===r&&a>0?i("Array items are not allowed",{data:t}):void 0;if(Array.isArray(r)){const e=r.length,s=Math.min(e,a);for(let e=0;e<s;e++){const a=r[e];if("boolean"!=typeof a){if(n(a)){const r=a.$validate(t[e]);if(r)return i("Array item is invalid",{item:e,cause:r,data:t[e]})}}else if(!1===a&&void 0!==t[e])return i("Array item is not allowed",{item:e,data:t[e]})}}else if(n(r))for(let e=0;e<a;e++){const a=r.$validate(t[e]);if(a)return i("Array item is invalid",{item:e,cause:a,data:t[e]})}},elements(e,t,i){if(Array.isArray(t)&&n(e.elements))for(let r=0;r<t.length;r++){const a=e.elements.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}},minItems(e,t,i){if(Array.isArray(t)&&!(t.length>=e.minItems))return i("Array is too short",{data:t})},maxItems(e,t,i){if(Array.isArray(t)&&!(t.length<=e.maxItems))return i("Array is too long",{data:t})},additionalItems(e,t,i){if(e.items&&!r(e.items)){if(!1===e.additionalItems)return t.length>e.items.length?i("Array is too long",{data:t}):void 0;if(r(e.additionalItems)){if(n(e.additionalItems)){for(let r=e.items.length;r<t.length;r++){const a=e.additionalItems.$validate(t[r]);if(a)return i("Array item is invalid",{item:r,cause:a,data:t[r]})}return}}else;}},uniqueItems(e,t,i){if(!Array.isArray(t)||!e.uniqueItems)return;const a=new Set;for(const e of t){let t;if(t="string"==typeof e?`s:${e}`:r(e)?`o:${JSON.stringify(Object.fromEntries(Object.entries(e).sort(([e],[t])=>e.localeCompare(t))))}`:Array.isArray(e)?JSON.stringify(e):String(e),a.has(t))return i("Array items are not unique",{data:e});a.add(t)}},contains(e,t,i){if(Array.isArray(t)){if("boolean"==typeof e.contains)return e.contains?0===t.length?i("Array must contain at least one item",{data:t}):void 0:i("Array must not contain any items",{data:t});for(let i=0;i<t.length;i++){if(!e.contains.$validate(t[i]))return}return i("Array must contain at least one item",{data:t})}}},...{minLength(e,t,i){if(!("string"!=typeof t||t.length>=e.minLength))return i("Value is shorter than the minimum length",{data:t})},maxLength(e,t,i){if(!("string"!=typeof t||t.length<=e.maxLength))return i("Value is longer than the maximum length",{data:t})},pattern(e,t,i){if("string"!=typeof t)return;const r=new RegExp(e.pattern,"u");return r instanceof RegExp==!1?i("Invalid regular expression",{data:t}):r.test(t)?void 0:i("Value does not match the pattern",{data:t})},format(e,t,i,r){if("string"!=typeof t)return;const a=r.getFormat(e.format);return a&&!a(t)?i("Value does not match the format",{data:t}):void 0}},...{minimum(e,t,i,r){if("number"!=typeof t)return;let a=e.minimum;return"number"==typeof e.exclusiveMinimum?a=e.exclusiveMinimum+1e-15:!0===e.exclusiveMinimum&&(a+=1e-15),t<a?i("Value is less than the minimum",{data:t}):void 0},maximum(e,t,i,r){if("number"!=typeof t)return;let a=e.maximum;return"number"==typeof e.exclusiveMaximum?a=e.exclusiveMaximum-1e-15:!0===e.exclusiveMaximum&&(a-=1e-15),t>a?i("Value is greater than the maximum",{data:t}):void 0},multipleOf(e,t,i,r){if("number"!=typeof t)return;const a=t/e.multipleOf;return isFinite(a)?function(e,t,i=1e-15){return Math.abs(e-t)<=i*Math.max(Math.abs(e),Math.abs(t))}(a,Math.round(a))?void 0:i("Value is not a multiple of the multipleOf",{data:t}):void 0},exclusiveMinimum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMinimum&&!("minimum"in e))return t<=e.exclusiveMinimum+1e-15?i("Value is less than or equal to the exclusiveMinimum"):void 0},exclusiveMaximum(e,t,i,r){if("number"==typeof t&&"number"==typeof e.exclusiveMaximum&&!("maximum"in e))return t>=e.exclusiveMaximum?i("Value is greater than or equal to the exclusiveMaximum",{data:t}):void 0}},...{enum(e,t,r){const a=Array.isArray(t),n="object"==typeof t&&null!==t;for(let r=0;r<e.enum.length;r++){const s=e.enum[r];if(s===t)return;if((a&&Array.isArray(s)||n&&"object"==typeof s&&null!==s)&&i(s,t))return}return r("Value is not one of the allowed values",{data:t})},allOf(e,t,i){for(let a=0;a<e.allOf.length;a++)if(r(e.allOf[a])){if("$validate"in e.allOf[a]){const r=e.allOf[a].$validate(t);if(r)return i("Value is not valid",{cause:r,data:t})}}else if("boolean"!=typeof e.allOf[a]){if(t!==e.allOf[a])return i("Value is not valid",{data:t})}else if(Boolean(t)!==e.allOf[a])return i("Value is not valid",{data:t})},anyOf(e,t,i){for(let i=0;i<e.anyOf.length;i++){if(r(e.anyOf[i])){if("$validate"in e.anyOf[i]){if(!e.anyOf[i].$validate(t))return;continue}return}if("boolean"==typeof e.anyOf[i]&&Boolean(t)===e.anyOf[i])return;if(t===e.anyOf[i])return}return i("Value is not valid",{data:t})},oneOf(e,t,i){let a=0;for(let i=0;i<e.oneOf.length;i++)if(r(e.oneOf[i])){if("$validate"in e.oneOf[i]){e.oneOf[i].$validate(t)||a++;continue}a++}else"boolean"!=typeof e.oneOf[i]?t===e.oneOf[i]&&a++:Boolean(t)===e.oneOf[i]&&a++;if(1!==a)return i("Value is not valid",{data:t})},const(e,t,a){if(!(t===e.const||r(t)&&r(e.const)&&i(t,e.const)||Array.isArray(t)&&Array.isArray(e.const)&&i(t,e.const)))return a("Value is not valid",{data:t})},if(e,t,i){if("then"in e==!1&&"else"in e==!1)return;if("boolean"==typeof e.if){if(e.if){if(n(e.then))return e.then.$validate(t)}else if(n(e.else))return e.else.$validate(t);return}if(!n(e.if))return;return e.if.$validate(t)?n(e.else)?e.else.$validate(t):void 0:n(e.then)?e.then.$validate(t):void 0},not(e,t,i){if("boolean"==typeof e.not)return e.not?i("Value is not valid",{data:t}):void 0;if(r(e.not)){if("$validate"in e.not){const r=e.not.$validate(t);return r?void 0:i("Value is not valid",{cause:r,data:t})}return i("Value is not valid",{data:t})}return i("Value is not valid",{data:t})}}},f={SchemaShield:class{types={};formats={};keywords={};immutable=!1;constructor({immutable:e=!1}={}){this.immutable=e;for(const[e,t]of Object.entries(l))t&&this.addType(e,t);for(const[e,t]of Object.entries(u))this.addKeyword(e,t);for(const[e,t]of Object.entries(o))t&&this.addFormat(e,t)}addType(t,i,r=!1){if(this.types[t]&&!r)throw new e(`Type "${t}" already exists`);this.types[t]=i}getType(e){return this.types[e]}addFormat(t,i,r=!1){if(this.formats[t]&&!r)throw new e(`Format "${t}" already exists`);this.formats[t]=i}getFormat(e){return this.formats[e]}addKeyword(t,i,r=!1){if(this.keywords[t]&&!r)throw new e(`Keyword "${t}" already exists`);this.keywords[t]=i}getKeyword(e){return this.keywords[e]}compile(t){const i=this.compileSchema(t);if(!i.$validate){if(!1===this.isSchemaLike(t))throw new e("Invalid schema");i.$validate=s("any",()=>{})}const r=e=>{const t=this.immutable?a(e):e,r=i.$validate(t);return{data:t,error:r||null,valid:!r}};return r.compiledSchema=i,r}compileSchema(e){r(e)||(e=!0===e?{anyOf:[{}]}:!1===e?{oneOf:[]}:{oneOf:[e]});const i=a(e),n=t("type",e),o=[];let l="";if("type"in e){const t=Array.isArray(e.type)?e.type:e.type.split(",").map(e=>e.trim());for(const e of t){const t=this.getType(e);t&&(o.push(t),l+=(l?"_OR_":"")+t.name)}const r=o.length;if(0===r)throw n("Invalid type for schema",{data:e.type});if(1===r){const e=o[0];i.$validate=s(l,t=>{if(!e(t))return n("Invalid type",{data:t})})}else r>1&&(i.$validate=s(l,e=>{for(let t=0;t<r;t++)if(o[t](e))return;return n("Invalid type",{data:e})}))}for(const a of Object.keys(e)){if("type"===a){i.type=e.type;continue}const n=this.getKeyword(a);if(n){const r=t(a,e[a]);if(i.$validate){const e=i.$validate;l+=`_AND_${n.name}`,i.$validate=s(l,t=>{const a=e(t);return a||n(i,t,r,this)})}else l=n.name,i.$validate=s(l,e=>n(i,e,r,this))}if(r(e[a])){if("properties"===a){for(const t of Object.keys(e[a]))i[a][t]=this.compileSchema(e[a][t]);continue}i[a]=this.compileSchema(e[a])}else Array.isArray(e[a])?i[a]=e[a].map((e,t)=>this.isSchemaLike(e)?this.compileSchema(e):e):i[a]=e[a]}return i}isSchemaLike(e){if(r(e)){if("type"in e)return!0;for(let t in e)if(t in this.keywords)return!0}return!1}}};"undefined"!=typeof module?module.exports=f:self.SchemaShield=f})();//# sourceMappingURL=index.min.js.map
|
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwicGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkiLCJrZXkiLCJLZXl3b3JkRXJyb3IiLCJnZXROYW1lZEZ1bmN0aW9uIiwib3B0aW9ucyIsImRlZXBFcXVhbCIsIm9iaiIsIm90aGVyIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwiaSIsImtleXMiLCJPYmplY3QiLCJpc09iamVjdCIsImRlZXBDbG9uZSIsInJlc3VsdCIsImNvbnN0cnVjdG9yIiwibmFtZSIsImlzQ29tcGlsZWRTY2hlbWEiLCJzdWJTY2hlbWEiLCJmbiIsImRlZmluZVByb3BlcnR5IiwidmFsdWUiLCJGb3JtYXRzIiwibWF0Y2giLCJkYXkiLCJOdW1iZXIiLCJ5ZWFyU3RyIiwibW9udGhTdHIiLCJob3VyU3RyIiwibWludXRlU3RyIiwic2Vjb25kU3RyIiwidGltZXpvbmVTaWduIiwidGltZXpvbmVIb3VyU3RyIiwidGltZXpvbmVNaW51dGVTdHIiLCJ5ZWFyIiwibW9udGgiLCJob3VyIiwibWludXRlIiwic2Vjb25kIiwidGltZXpvbmVIb3VyIiwidGltZXpvbmVNaW51dGUiLCJ1cmkiLCJ0ZXN0IiwiZW1haWwiLCJpcHY0IiwiaXB2NiIsImluZGV4T2YiLCJoYXNJcHY0IiwiYWRkcmVzc1BhcnRzIiwic3BsaXQiLCJpcHY0UGFydCIsInBvcCIsImlzU2hvcnRlbmVkIiwiaXB2NlBhcnQiLCJqb2luIiwiaXNJcHY2VmFsaWQiLCJoYXNJbnZhbGlkQ2hhciIsImhvc3RuYW1lIiwiZGF0ZSIsImlzTmFOIiwiRGF0ZSIsImdldFRpbWUiLCJyZWdleCIsIlJlZ0V4cCIsImUiLCJ0aW1lIiwiZHVyYXRpb24iLCJ1dWlkIiwiaXJpIiwiVHlwZXMiLCJvYmplY3QiLCJhcnJheSIsInN0cmluZyIsIm51bWJlciIsImludGVnZXIiLCJib29sZWFuIiwibnVsbCIsInRpbWVzdGFtcCIsImludDgiLCJ1bml0OCIsImludDE2IiwidW5pdDE2IiwiaW50MzIiLCJ1bml0MzIiLCJmbG9hdDMyIiwiZmxvYXQ2NCIsImtleXdvcmRzIiwicmVxdWlyZWQiLCJkZWZpbmVFcnJvciIsImhhc093blByb3BlcnR5IiwicHJvcGVydGllcyIsImVycm9yIiwiJHZhbGlkYXRlIiwic2NoZW1hUHJvcCIsImRlZmF1bHQiLCJ2YWx1ZXMiLCJtYXhQcm9wZXJ0aWVzIiwibWluUHJvcGVydGllcyIsImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiwiaXNDb21waWxlZCIsInBhdHRlcm5Qcm9wZXJ0aWVzIiwicGF0dGVybiIsInBhdHRlcm5zIiwicHJvcGVydHlOYW1lcyIsImRlcGVuZGVuY2llcyIsImRlcGVuZGVuY3kiLCJ0aGVuIiwiZWxzZSIsIiRyZWYiLCJkZWZpbml0aW9ucyIsIiRpZCIsIiRzY2hlbWEiLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwiJGNvbW1lbnQiLCJleGFtcGxlcyIsImNvbnRlbnRNZWRpYVR5cGUiLCJjb250ZW50RW5jb2RpbmciLCJkaXNjcmltaW5hdG9yIiwibnVsbGFibGUiLCJpdGVtcyIsInNjaGVtYUl0ZW1zIiwiZGF0YUxlbmd0aCIsInNjaGVtYUl0ZW1zTGVuZ3RoIiwiaXRlbXNMZW5ndGgiLCJNYXRoIiwibWluIiwic2NoZW1hSXRlbSIsImVsZW1lbnRzIiwibWluSXRlbXMiLCJtYXhJdGVtcyIsImFkZGl0aW9uYWxJdGVtcyIsInVuaXF1ZUl0ZW1zIiwidW5pcXVlIiwiU2V0IiwiaXRlbVN0ciIsIkpTT04iLCJzdHJpbmdpZnkiLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiU3RyaW5nIiwiaGFzIiwiYWRkIiwiY29udGFpbnMiLCJtaW5MZW5ndGgiLCJtYXhMZW5ndGgiLCJwYXR0ZXJuUmVnZXhwIiwiZm9ybWF0IiwiaW5zdGFuY2UiLCJmb3JtYXRWYWxpZGF0ZSIsImdldEZvcm1hdCIsIm1pbmltdW0iLCJleGNsdXNpdmVNaW5pbXVtIiwibWF4aW11bSIsIm1heCIsImV4Y2x1c2l2ZU1heGltdW0iLCJtdWx0aXBsZU9mIiwicXVvdGllbnQiLCJpc0Zpbml0ZSIsImVwc2lsb24iLCJhYnMiLCJhcmVDbG9zZUVub3VnaCIsInJvdW5kIiwiZW51bSIsImVudW1JdGVtIiwiYWxsT2YiLCJCb29sZWFuIiwiYW55T2YiLCJvbmVPZiIsInZhbGlkQ291bnQiLCJjb25zdCIsImlmIiwibm90IiwidHlwZXMiLCJmb3JtYXRzIiwiaW1tdXRhYmxlIiwidHlwZSIsInZhbGlkYXRvciIsImFkZFR5cGUiLCJhZGRLZXl3b3JkIiwiYWRkRm9ybWF0Iiwib3ZlcndyaXRlIiwiZ2V0VHlwZSIsImdldEtleXdvcmQiLCJjb21waWxlIiwiY29tcGlsZWRTY2hlbWEiLCJjb21waWxlU2NoZW1hIiwiaXNTY2hlbWFMaWtlIiwidmFsaWRhdGUiLCJjbG9uZWREYXRhIiwidmFsaWQiLCJkZWZpbmVUeXBlRXJyb3IiLCJ0eXBlVmFsaWRhdGlvbnMiLCJtZXRob2ROYW1lIiwibWFwIiwidCIsInRyaW0iLCJwdXNoIiwidHlwZVZhbGlkYXRpb25zTGVuZ3RoIiwidHlwZVZhbGlkYXRpb24iLCJrZXl3b3JkVmFsaWRhdG9yIiwicHJldlZhbGlkYXRvciIsImluZGV4Iiwic3ViS2V5Il0sInNvdXJjZXMiOlsiLi4vbGliL3V0aWxzLnRzIiwiLi4vbGliL2Zvcm1hdHMudHMiLCIuLi9saWIvdHlwZXMudHMiLCIuLi9saWIva2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb2JqZWN0LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL2FycmF5LWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL3N0cmluZy1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvb3RoZXIta2V5d29yZHMudHMiLCIuLi9saWIvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcGlsZWRTY2hlbWEgfSBmcm9tIFwiLi9pbmRleFwiO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGl0ZW06IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZTogVmFsaWRhdGlvbkVycm9yO1xuICBwYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIpIHtcbiAgICBjb25zdCBwYXRoID1cbiAgICAgIHBvaW50ZXIgK1xuICAgICAgXCIvXCIgK1xuICAgICAgdGhpcy5rZXl3b3JkICtcbiAgICAgICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiID8gXCIvXCIgKyB0aGlzLml0ZW0gOiBcIlwiKTtcblxuICAgIGlmICghdGhpcy5jYXVzZSkge1xuICAgICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhdXNlLl9nZXRDYXVzZShwYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCkge1xuICAgIHJldHVybiB0aGlzLl9nZXRDYXVzZSgpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JPcHRpb25zIHtcbiAgaXRlbT86IGFueTsgLy8gRmluYWwgaXRlbSBpbiB0aGUgcGF0aFxuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjsgLy8gQ2F1c2Ugb2YgdGhlIGVycm9yXG4gIGRhdGE/OiBhbnk7IC8vIERhdGEgdGhhdCBjYXVzZWQgdGhlIGVycm9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVmaW5lRXJyb3JGdW5jdGlvbiB7XG4gIChtZXNzYWdlOiBzdHJpbmcsIG9wdGlvbnM/OiBEZWZpbmVFcnJvck9wdGlvbnMpOiBWYWxpZGF0aW9uRXJyb3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleShcbiAga2V5OiBzdHJpbmcsXG4gIHNjaGVtYTogQ29tcGlsZWRTY2hlbWFcbikge1xuICBjb25zdCBLZXl3b3JkRXJyb3IgPSBuZXcgVmFsaWRhdGlvbkVycm9yKGBJbnZhbGlkICR7a2V5fWApO1xuICBLZXl3b3JkRXJyb3Iua2V5d29yZCA9IGtleTtcbiAgS2V5d29yZEVycm9yLnNjaGVtYSA9IHNjaGVtYTtcblxuICBjb25zdCBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbiA9IChtZXNzYWdlLCBvcHRpb25zID0ge30pID0+IHtcbiAgICBLZXl3b3JkRXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgS2V5d29yZEVycm9yLml0ZW0gPSBvcHRpb25zLml0ZW07XG4gICAgS2V5d29yZEVycm9yLmNhdXNlID0gb3B0aW9ucy5jYXVzZTtcbiAgICBLZXl3b3JkRXJyb3IuZGF0YSA9IG9wdGlvbnMuZGF0YTtcbiAgICByZXR1cm4gS2V5d29yZEVycm9yO1xuICB9O1xuXG4gIHJldHVybiBnZXROYW1lZEZ1bmN0aW9uPERlZmluZUVycm9yRnVuY3Rpb24+KFxuICAgIGBkZWZpbmVFcnJvcl8ke2tleX1gLFxuICAgIGRlZmluZUVycm9yXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwRXF1YWwoXG4gIG9iajogQXJyYXk8YW55PiB8IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIG90aGVyOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG9iaikgJiYgQXJyYXkuaXNBcnJheShvdGhlcikpIHtcbiAgICBpZiAob2JqLmxlbmd0aCAhPT0gb3RoZXIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtpXSwgb3RoZXJbaV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBvdGhlciA9PT0gXCJvYmplY3RcIikge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgb3RoZXIgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBvYmogPT09IG90aGVyO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gT2JqZWN0LmtleXMob3RoZXIpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmICghZGVlcEVxdWFsKG9ialtrZXldLCBvdGhlcltrZXldKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gb2JqID09PSBvdGhlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0KGRhdGEpIHtcbiAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmVDbG9zZUVub3VnaChhLCBiLCBlcHNpbG9uID0gMWUtMTUpIHtcbiAgcmV0dXJuIE1hdGguYWJzKGEgLSBiKSA8PSBlcHNpbG9uICogTWF0aC5tYXgoTWF0aC5hYnMoYSksIE1hdGguYWJzKGIpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVURjE2TGVuZ3RoKHN0cikge1xuICBsZXQgbGVuZ3RoID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2RlUG9pbnQgPSBzdHIuY29kZVBvaW50QXQoaSk7XG4gICAgaWYgKGNvZGVQb2ludCA+IDB4ZmZmZikge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZW5ndGgrKztcbiAgfVxuICByZXR1cm4gbGVuZ3RoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVlcENsb25lKG9iajogYW55KTogYW55IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7XG4gICAgICByZXN1bHRbaV0gPSBkZWVwQ2xvbmUob2JqW2ldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIElzIGNsYXNzIGluc3RhbmNlIG9mIGFueSBraW5kXG4gIGlmIChvYmogJiYgb2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5uYW1lICE9PSBcIk9iamVjdFwiKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGlmIChpc09iamVjdChvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgLi4ub2JqXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgIHJlc3VsdFtrZXldID0gZGVlcENsb25lKG9ialtrZXldKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbXBpbGVkU2NoZW1hKHN1YlNjaGVtYTogYW55KTogc3ViU2NoZW1hIGlzIENvbXBpbGVkU2NoZW1hIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHN1YlNjaGVtYSkgJiYgXCIkdmFsaWRhdGVcIiBpbiBzdWJTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lZEZ1bmN0aW9uPFQ+KG5hbWU6IHN0cmluZywgZm46IFQpOiBUIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmbiwgXCJuYW1lXCIsIHsgdmFsdWU6IG5hbWUgfSk7XG59XG4iLCJpbXBvcnQgeyBGb3JtYXRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBGb3JtYXRzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgW1wiZGF0ZS10aW1lXCJdKGRhdGEpIHtcbiAgICBjb25zdCBtYXRjaCA9IGRhdGEubWF0Y2goXG4gICAgICAvXihcXGR7NH0pLSgwWzAtOV18MVswLTJdKS0oXFxkezJ9KVQoMFswLTldfDFcXGR8MlswLTNdKTooWzAtNV1cXGQpOigoPzpbMC01XVxcZHw2MCkpKD86LlxcZCspPyg/OihbKy1dKSgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCl8Wik/JC9pXG4gICAgKTtcblxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgZGF5ID0gTnVtYmVyKG1hdGNoWzNdKTtcblxuICAgIGlmIChtYXRjaFsyXSA9PT0gXCIwMlwiICYmIGRheSA+IDI5KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgW1xuICAgICAgLFxuICAgICAgeWVhclN0cixcbiAgICAgIG1vbnRoU3RyLFxuICAgICAgLFxuICAgICAgaG91clN0cixcbiAgICAgIG1pbnV0ZVN0cixcbiAgICAgIHNlY29uZFN0cixcbiAgICAgIHRpbWV6b25lU2lnbixcbiAgICAgIHRpbWV6b25lSG91clN0cixcbiAgICAgIHRpbWV6b25lTWludXRlU3RyXG4gICAgXSA9IG1hdGNoO1xuXG4gICAgbGV0IHllYXIgPSBOdW1iZXIoeWVhclN0cik7XG4gICAgbGV0IG1vbnRoID0gTnVtYmVyKG1vbnRoU3RyKTtcbiAgICBsZXQgaG91ciA9IE51bWJlcihob3VyU3RyKTtcbiAgICBsZXQgbWludXRlID0gTnVtYmVyKG1pbnV0ZVN0cik7XG4gICAgbGV0IHNlY29uZCA9IE51bWJlcihzZWNvbmRTdHIpO1xuXG4gICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIgfHwgdGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgY29uc3QgdGltZXpvbmVIb3VyID0gTnVtYmVyKHRpbWV6b25lSG91clN0cik7XG4gICAgICBjb25zdCB0aW1lem9uZU1pbnV0ZSA9IE51bWJlcih0aW1lem9uZU1pbnV0ZVN0cik7XG5cbiAgICAgIGlmICh0aW1lem9uZVNpZ24gPT09IFwiLVwiKSB7XG4gICAgICAgIGhvdXIgKz0gdGltZXpvbmVIb3VyO1xuICAgICAgICBtaW51dGUgKz0gdGltZXpvbmVNaW51dGU7XG4gICAgICB9IGVsc2UgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCIrXCIpIHtcbiAgICAgICAgaG91ciAtPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSAtPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1pbnV0ZSA+IDU5KSB7XG4gICAgICAgIGhvdXIgKz0gMTtcbiAgICAgICAgbWludXRlIC09IDYwO1xuICAgICAgfSBlbHNlIGlmIChtaW51dGUgPCAwKSB7XG4gICAgICAgIGhvdXIgLT0gMTtcbiAgICAgICAgbWludXRlICs9IDYwO1xuICAgICAgfVxuXG4gICAgICBpZiAoaG91ciA+IDIzKSB7XG4gICAgICAgIGRheSArPSAxO1xuICAgICAgICBob3VyIC09IDI0O1xuICAgICAgfSBlbHNlIGlmIChob3VyIDwgMCkge1xuICAgICAgICBkYXkgLT0gMTtcbiAgICAgICAgaG91ciArPSAyNDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRheSA+IDMxKSB7XG4gICAgICAgIG1vbnRoICs9IDE7XG4gICAgICAgIGRheSAtPSAzMTtcbiAgICAgIH0gZWxzZSBpZiAoZGF5IDwgMSkge1xuICAgICAgICBtb250aCAtPSAxO1xuICAgICAgICBkYXkgKz0gMzE7XG4gICAgICB9XG5cbiAgICAgIGlmIChtb250aCA+IDEyKSB7XG4gICAgICAgIHllYXIgKz0gMTtcbiAgICAgICAgbW9udGggLT0gMTI7XG4gICAgICB9IGVsc2UgaWYgKG1vbnRoIDwgMSkge1xuICAgICAgICB5ZWFyIC09IDE7XG4gICAgICAgIG1vbnRoICs9IDEyO1xuICAgICAgfVxuXG4gICAgICBpZiAoeWVhciA8IDApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRheXNJbk1vbnRoID0gWzMxLCAsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXTtcbiAgICBjb25zdCBtYXhEYXlzID1cbiAgICAgIG1vbnRoID09PSAyXG4gICAgICAgID8geWVhciAlIDQgPT09IDAgJiYgKHllYXIgJSAxMDAgIT09IDAgfHwgeWVhciAlIDQwMCA9PT0gMClcbiAgICAgICAgICA/IDI5XG4gICAgICAgICAgOiAyOFxuICAgICAgICA6IGRheXNJbk1vbnRoW21vbnRoIC0gMV07XG5cbiAgICBpZiAoZGF5ID4gbWF4RGF5cykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExlYXAgc2Vjb25kc1xuICAgIGlmIChzZWNvbmQgPT09IDYwICYmIChtaW51dGUgIT09IDU5IHx8IGhvdXIgIT09IDIzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuICB1cmkoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXpBLVpdW2EtekEtWjAtOStcXC0uXSo6W15cXHNdKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIGVtYWlsKGRhdGEpIHtcbiAgICByZXR1cm4gL14oPyFcXC4pKD8hLipcXC4kKVthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIwfSg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXXsxLDIxfSl7MCwyfUBbYS16MC05XSg/OlthLXowLTktXXswLDYxfVthLXowLTldKT8oPzpcXC5bYS16MC05XSg/OlthLXowLTktXXswLDYwfVthLXowLTldKT8pezAsM30kL2kudGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBpcHY0KGRhdGEpIHtcbiAgICAvLyBNYXRjaGVzIGEgc3RyaW5nIGZvcm1lZCBieSA0IG51bWJlcnMgYmV0d2VlbiAwIGFuZCAyNTUgc2VwYXJhdGVkIGJ5IGRvdHMgd2l0aG91dCBsZWFkaW5nIHplcm9zXG4gICAgLy8gL14oKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSgyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvXG4gICAgcmV0dXJuIC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSkkLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gaXB2NjogaXNNeUlwVmFsaWQoeyB2ZXJzaW9uOiA2IH0pLFxuICBpcHY2KGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCI6OlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBkYXRhLmluZGV4T2YoXCI6XCIpID09PSAtMSB8fFxuICAgICAgLyg/Olxccyt8Ojo6K3xeXFx3ezUsfXxcXHd7NX0kfF46ezF9XFx3fFxcdzp7MX0kKS8udGVzdChkYXRhKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0lwdjQgPSBkYXRhLmluZGV4T2YoXCIuXCIpICE9PSAtMTtcbiAgICBsZXQgYWRkcmVzc1BhcnRzID0gZGF0YTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICBhZGRyZXNzUGFydHMgPSBkYXRhLnNwbGl0KFwiOlwiKTtcbiAgICAgIGNvbnN0IGlwdjRQYXJ0ID0gYWRkcmVzc1BhcnRzLnBvcCgpO1xuICAgICAgaWYgKFxuICAgICAgICAhL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICAgICAgaXB2NFBhcnRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpc1Nob3J0ZW5lZCA9IGRhdGEuaW5kZXhPZihcIjo6XCIpICE9PSAtMTtcbiAgICBjb25zdCBpcHY2UGFydCA9IGhhc0lwdjQgPyBhZGRyZXNzUGFydHMuam9pbihcIjpcIikgOiBkYXRhO1xuXG4gICAgaWYgKGlzU2hvcnRlbmVkKSB7XG4gICAgICBpZiAoaXB2NlBhcnQuc3BsaXQoXCI6OlwiKS5sZW5ndGggLSAxID4gMSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICghL15bMC05YS1mQS1GOi5dKiQvLnRlc3QoaXB2NlBhcnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIC9eKD86KD86KD86WzAtOWEtZkEtRl17MSw0fSg/Ojp8JCkpezEsNn0pKXwoPzo6Oig/OlswLTlhLWZBLUZdezEsNH0pKXswLDV9JC8udGVzdChcbiAgICAgICAgaXB2NlBhcnRcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNJcHY2VmFsaWQgPVxuICAgICAgL14oPzooPzpbMC05YS1mQS1GXXsxLDR9Oil7N30oPzpbMC05YS1mQS1GXXsxLDR9fDopKSQvLnRlc3QoaXB2NlBhcnQpO1xuXG4gICAgY29uc3QgaGFzSW52YWxpZENoYXIgPSAvKD86WzAtOWEtZkEtRl17NSx9fFxcRFswLTlhLWZBLUZdezN9OikvLnRlc3QoXG4gICAgICBpcHY2UGFydFxuICAgICk7XG5cbiAgICBpZiAoaGFzSXB2NCkge1xuICAgICAgcmV0dXJuIGlzSXB2NlZhbGlkIHx8ICFoYXNJbnZhbGlkQ2hhcjtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNJcHY2VmFsaWQgJiYgIWhhc0ludmFsaWRDaGFyO1xuICB9LFxuXG4gIGhvc3RuYW1lKGRhdGEpIHtcbiAgICByZXR1cm4gL15bYS16MC05XVthLXowLTktXXswLDYyfSg/OlxcLlthLXowLTldW2EtejAtOS1dezAsNjJ9KSpbYS16MC05XSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGRhdGUoZGF0YSkge1xuICAgIGlmICgvXihcXGR7NH0pLShcXGR7Mn0pLShcXGR7Mn0pJC8udGVzdChkYXRhKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gIWlzTmFOKG5ldyBEYXRlKGRhdGEpLmdldFRpbWUoKSk7XG4gIH0sXG4gIHJlZ2V4KGRhdGEpIHtcbiAgICB0cnkge1xuICAgICAgbmV3IFJlZ0V4cChkYXRhKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0sXG4gIFwianNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL15cXC8oPzpbXn5dfH4wfH4xKSokLy50ZXN0KGRhdGEpO1xuICB9LFxuICBcInJlbGF0aXZlLWpzb24tcG9pbnRlclwiKGRhdGEpIHtcbiAgICBpZiAoZGF0YSA9PT0gXCJcIikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKFswLTldKykoI3xcXC8oPzpbXn5dfH4wfH4xKSopPyQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIHRpbWUoZGF0YSkge1xuICAgIHJldHVybiAvXihcXGR7Mn0pOihcXGR7Mn0pOihcXGR7Mn0pKFxcLlxcZCspPyhafChbKy1dKShcXGR7Mn0pOihcXGR7Mn0pKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgXCJ1cmktcmVmZXJlbmNlXCIoZGF0YSkge1xuICAgIGlmICgvXFxcXC8udGVzdChkYXRhKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAvXigoW146Lz8jXSspOik/KFxcL1xcLyhbXi8/I10qKSk/KFtePyNdKikoXFw/KFteI10qKSk/KCMoKD8hW14jXSpcXFxcKVteI10qKSk/L2kudGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS10ZW1wbGF0ZVwiKGRhdGEpIHtcbiAgICByZXR1cm4gL14oPzooPzpodHRwcz86XFwvXFwvW1xcdy4tXSspP1xcLz8pP1tcXHctIDssLlxcLz8lJj1dKig/Olxce1tcXHctXSsoPzo6XFxkKyk/XFx9W1xcdy0gOywuXFwvPyUmPV0qKSpcXC8/JC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgeWV0XG4gIGR1cmF0aW9uOiBmYWxzZSxcbiAgdXVpZDogZmFsc2UsXG4gIFwiaWRuLWVtYWlsXCI6IGZhbHNlLFxuICBcImlkbi1ob3N0bmFtZVwiOiBmYWxzZSxcbiAgaXJpOiBmYWxzZSxcbiAgXCJpcmktcmVmZXJlbmNlXCI6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgVHlwZUZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IFR5cGVzOiBSZWNvcmQ8c3RyaW5nLCBUeXBlRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIG9iamVjdChkYXRhKSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGRhdGEpO1xuICB9LFxuICBhcnJheShkYXRhKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgZGF0YSAhPT0gbnVsbCAmJlxuICAgICAgXCJsZW5ndGhcIiBpbiBkYXRhICYmXG4gICAgICBcIjBcIiBpbiBkYXRhICYmXG4gICAgICBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggLSAxID09PSBkYXRhLmxlbmd0aFxuICAgICk7XG4gIH0sXG4gIHN0cmluZyhkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiO1xuICB9LFxuICBudW1iZXIoZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJudW1iZXJcIjtcbiAgfSxcbiAgaW50ZWdlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiICYmIGRhdGEgJSAxID09PSAwO1xuICB9LFxuICBib29sZWFuKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwiYm9vbGVhblwiO1xuICB9LFxuICBudWxsKGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YSA9PT0gbnVsbDtcbiAgfSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gIHRpbWVzdGFtcDogZmFsc2UsXG4gIGludDg6IGZhbHNlLFxuICB1bml0ODogZmFsc2UsXG4gIGludDE2OiBmYWxzZSxcbiAgdW5pdDE2OiBmYWxzZSxcbiAgaW50MzI6IGZhbHNlLFxuICB1bml0MzI6IGZhbHNlLFxuICBmbG9hdDMyOiBmYWxzZSxcbiAgZmxvYXQ2NDogZmFsc2VcblxuXG59O1xuIiwiaW1wb3J0IHsgQXJyYXlLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL2FycmF5LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgTnVtYmVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9udW1iZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IE9iamVjdEtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb2JqZWN0LWtleXdvcmRzXCI7XG5pbXBvcnQgeyBPdGhlcktleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvb3RoZXIta2V5d29yZHNcIjtcbmltcG9ydCB7IFN0cmluZ0tleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvc3RyaW5nLWtleXdvcmRzXCI7XG5cbmV4cG9ydCBjb25zdCBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAuLi5PYmplY3RLZXl3b3JkcyxcbiAgLi4uQXJyYXlLZXl3b3JkcyxcbiAgLi4uU3RyaW5nS2V5d29yZHMsXG4gIC4uLk51bWJlcktleXdvcmRzLFxuICAuLi5PdGhlcktleXdvcmRzXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBPYmplY3RLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICAvLyBPYmplY3RcbiAgcmVxdWlyZWQoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5yZXF1aXJlZC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gc2NoZW1hLnJlcXVpcmVkW2ldO1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUmVxdWlyZWQgcHJvcGVydHkgaXMgbWlzc2luZ1wiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYS5wcm9wZXJ0aWVzKSkge1xuICAgICAgaWYgKCFkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hUHJvcCA9IHNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgIGlmIChpc09iamVjdChzY2hlbWFQcm9wKSAmJiBcImRlZmF1bHRcIiBpbiBzY2hlbWFQcm9wKSB7XG4gICAgICAgICAgZGF0YVtrZXldID0gc2NoZW1hUHJvcC5kZWZhdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucHJvcGVydGllc1trZXldID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEucHJvcGVydGllc1trZXldKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XS4kdmFsaWRhdGUoZGF0YVtrZXldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICB2YWx1ZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnZhbHVlcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEudmFsdWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIGludmFsaWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpIHx8IE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCA8PSBzY2hlbWEubWF4UHJvcGVydGllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlRvbyBtYW55IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1pblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID49IHNjaGVtYS5taW5Qcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIGZldyBwcm9wZXJ0aWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhZGRpdGlvbmFsUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBjb25zdCBpc0NvbXBpbGVkID0gaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydGllcyAmJiBzY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgaWYgKG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpLnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgbWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0NvbXBpbGVkKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcGF0dGVyblByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXR0ZXJucyA9IE9iamVjdC5rZXlzKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocGF0dGVybiwgXCJ1XCIpO1xuICAgICAgaWYgKHR5cGVvZiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgaWYgKHJlZ2V4LnRlc3Qoa2V5KSkge1xuICAgICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucGF0dGVyblByb3BlcnRpZXNbcGF0dGVybl0uJHZhbGlkYXRlKFxuICAgICAgICAgICAgICBkYXRhW2tleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHByb3BlcnR5TmFtZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEucHJvcGVydHlOYW1lcyA9PT0gZmFsc2UgJiYgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5wcm9wZXJ0eU5hbWVzKSkge1xuICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydHlOYW1lcy4kdmFsaWRhdGUoa2V5KTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgbmFtZSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGRlcGVuZGVuY2llcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZGF0YSA9PT0gZmFsc2UpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSBzY2hlbWEuZGVwZW5kZW5jaWVzW2tleV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShkZXBlbmRlbmN5KSkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlcGVuZGVuY3kubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBpZiAoIShkZXBlbmRlbmN5W2ldIGluIGRhdGEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkZXBlbmRlbmN5W2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiRGVwZW5kZW5jeSBpcyBub3Qgc2F0aXNmaWVkXCIsIHsgZGF0YTogZGVwZW5kZW5jeSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmIChkZXBlbmRlbmN5IGluIGRhdGEpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyb3IgPSBkZXBlbmRlbmN5LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwge1xuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICAvLyBSZXF1aXJlZCBieSBvdGhlciBrZXl3b3JkcyBidXQgbm90IHVzZWQgYXMgYSBmdW5jdGlvbiBpdHNlbGZcbiAgdGhlbjogZmFsc2UsXG4gIGVsc2U6IGZhbHNlLFxuICBkZWZhdWx0OiBmYWxzZSxcblxuICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0XG4gICRyZWY6IGZhbHNlLFxuICBkZWZpbml0aW9uczogZmFsc2UsXG4gICRpZDogZmFsc2UsXG4gICRzY2hlbWE6IGZhbHNlLFxuXG4gIC8vIE1ldGFkYXRhIGtleXdvcmRzIChub3QgdXNlZCBhcyBhIGZ1bmN0aW9uKVxuICB0aXRsZTogZmFsc2UsXG4gIGRlc2NyaXB0aW9uOiBmYWxzZSxcbiAgJGNvbW1lbnQ6IGZhbHNlLFxuICBleGFtcGxlczogZmFsc2UsXG4gIGNvbnRlbnRNZWRpYVR5cGU6IGZhbHNlLFxuICBjb250ZW50RW5jb2Rpbmc6IGZhbHNlLFxuXG4gIC8vIE5vdCBzdXBwb3J0ZWQgT3BlbiBBUEkga2V5d29yZHNcbiAgZGlzY3JpbWluYXRvcjogZmFsc2UsXG4gIG51bGxhYmxlOiBmYWxzZVxufTtcbiIsImltcG9ydCB7IGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgQXJyYXlLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgaXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNjaGVtYUl0ZW1zID0gc2NoZW1hLml0ZW1zO1xuICAgIGNvbnN0IGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDtcblxuICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbXMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hSXRlbXMgPT09IGZhbHNlICYmIGRhdGFMZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgYWxsb3dlZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWFJdGVtcykpIHtcbiAgICAgIGNvbnN0IHNjaGVtYUl0ZW1zTGVuZ3RoID0gc2NoZW1hSXRlbXMubGVuZ3RoO1xuICAgICAgY29uc3QgaXRlbXNMZW5ndGggPSBNYXRoLm1pbihzY2hlbWFJdGVtc0xlbmd0aCwgZGF0YUxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3Qgc2NoZW1hSXRlbSA9IHNjaGVtYUl0ZW1zW2ldO1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYUl0ZW0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKHNjaGVtYUl0ZW0gPT09IGZhbHNlICYmIHR5cGVvZiBkYXRhW2ldICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbSkpIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW0uJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYUl0ZW1zKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWFJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGVsZW1lbnRzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsZW1lbnRzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuZWxlbWVudHMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgZGF0YTogZGF0YVtpXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgbWluSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluSXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gc2hvcnRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heEl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXMgdG9vIGxvbmdcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxJdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFzY2hlbWEuaXRlbXMgfHwgaXNPYmplY3Qoc2NoZW1hLml0ZW1zKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEuYWRkaXRpb25hbEl0ZW1zID09PSBmYWxzZSkge1xuICAgICAgaWYgKGRhdGEubGVuZ3RoID4gc2NoZW1hLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuYWRkaXRpb25hbEl0ZW1zKSkge1xuICAgICAgICBmb3IgKGxldCBpID0gc2NoZW1hLml0ZW1zLmxlbmd0aDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgaXRlbTogaSxcbiAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHVuaXF1ZUl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkgfHwgIXNjaGVtYS51bmlxdWVJdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBTZXQoKTtcblxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBkYXRhKSB7XG4gICAgICBsZXQgaXRlbVN0cjtcblxuICAgICAgLy8gQ2hhbmdlIHN0cmluZyB0byBcInN0cmluZ1wiIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBgczoke2l0ZW19YDtcbiAgICAgICAgLy8gU29ydCBvYmplY3Qga2V5cyB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXNcbiAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBvOiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoaXRlbSkuc29ydCgoW2FdLCBbYl0pID0+IGEubG9jYWxlQ29tcGFyZShiKSlcbiAgICAgICAgICApXG4gICAgICAgICl9YDtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gSlNPTi5zdHJpbmdpZnkoaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpdGVtU3RyID0gU3RyaW5nKGl0ZW0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodW5pcXVlLmhhcyhpdGVtU3RyKSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtcyBhcmUgbm90IHVuaXF1ZVwiLCB7IGRhdGE6IGl0ZW0gfSk7XG4gICAgICB9XG4gICAgICB1bmlxdWUuYWRkKGl0ZW1TdHIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBjb250YWlucyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmNvbnRhaW5zID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5jb250YWlucykge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgbXVzdCBub3QgY29udGFpbiBhbnkgaXRlbXNcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuY29udGFpbnMuJHZhbGlkYXRlKGRhdGFbaV0pO1xuICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGl0ZW1cIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBTdHJpbmdLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgbWluTGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPj0gc2NoZW1hLm1pbkxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIG1heExlbmd0aChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiIHx8IGRhdGEubGVuZ3RoIDw9IHNjaGVtYS5tYXhMZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGhcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIHBhdHRlcm4oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5SZWdleHAgPSBuZXcgUmVnRXhwKHNjaGVtYS5wYXR0ZXJuLCBcInVcIik7XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cCBpbnN0YW5jZW9mIFJlZ0V4cCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkludmFsaWQgcmVndWxhciBleHByZXNzaW9uXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICBpZiAocGF0dGVyblJlZ2V4cC50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm5cIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIC8vIFRha2UgaW50byBhY2NvdW50IHRoYXQgaWYgd2UgcmVjZWl2ZSBhIGZvcm1hdCB0aGF0IGlzIG5vdCBkZWZpbmVkLCB3ZVxuICAvLyB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvciwgd2UganVzdCBpZ25vcmUgaXQuXG4gIGZvcm1hdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yLCBpbnN0YW5jZSkge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGZvcm1hdFZhbGlkYXRlID0gaW5zdGFuY2UuZ2V0Rm9ybWF0KHNjaGVtYS5mb3JtYXQpO1xuICAgIGlmICghZm9ybWF0VmFsaWRhdGUgfHwgZm9ybWF0VmFsaWRhdGUoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0XCIsIHsgZGF0YSB9KTtcbiAgfVxufTtcbiIsImltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuaW1wb3J0IHsgYXJlQ2xvc2VFbm91Z2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZXhwb3J0IGNvbnN0IE51bWJlcktleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1pbiA9IHNjaGVtYS5taW5pbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1pbiA9IHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICsgMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWluICs9IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhIDwgbWluKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gdGhlIG1pbmltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG1heCA9IHNjaGVtYS5tYXhpbXVtO1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIG1heCA9IHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtIC0gMWUtMTU7XG4gICAgfSBlbHNlIGlmIChzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gdHJ1ZSkge1xuICAgICAgbWF4IC09IDFlLTE1O1xuICAgIH1cblxuICAgIGlmIChkYXRhID4gbWF4KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW1cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtdWx0aXBsZU9mKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcXVvdGllbnQgPSBkYXRhIC8gc2NoZW1hLm11bHRpcGxlT2Y7XG5cbiAgICBpZiAoIWlzRmluaXRlKHF1b3RpZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghYXJlQ2xvc2VFbm91Z2gocXVvdGllbnQsIE1hdGgucm91bmQocXVvdGllbnQpKSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIG11bHRpcGxlT2ZcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNaW5pbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtaW5pbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPD0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBleGNsdXNpdmVNaW5pbXVtXCIpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBleGNsdXNpdmVNYXhpbXVtKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgIHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgXCJtYXhpbXVtXCIgaW4gc2NoZW1hXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPj0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcbiAgICAgICAgXCJWYWx1ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1heGltdW1cIixcbiAgICAgICAgeyBkYXRhIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgZGVlcEVxdWFsLCBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE90aGVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIGVudW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgY29uc3QgaXNPYmplY3QgPSB0eXBlb2YgZGF0YSA9PT0gXCJvYmplY3RcIiAmJiBkYXRhICE9PSBudWxsO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuZW51bS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZW51bUl0ZW0gPSBzY2hlbWEuZW51bVtpXTtcblxuICAgICAgLy8gU2ltcGxlIGVxdWFsaXR5IGNoZWNrXG4gICAgICBpZiAoZW51bUl0ZW0gPT09IGRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBkYXRhIGlzIGFuIGFycmF5IG9yIGFuIG9iamVjdCwgY2hlY2sgZm9yIGRlZXAgZXF1YWxpdHlcbiAgICAgIGlmIChcbiAgICAgICAgKGlzQXJyYXkgJiYgQXJyYXkuaXNBcnJheShlbnVtSXRlbSkpIHx8XG4gICAgICAgIChpc09iamVjdCAmJiB0eXBlb2YgZW51bUl0ZW0gPT09IFwib2JqZWN0XCIgJiYgZW51bUl0ZW0gIT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgaWYgKGRlZXBFcXVhbChlbnVtSXRlbSwgZGF0YSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBhbGxvd2VkIHZhbHVlc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWxsT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFsbE9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFsbE9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbGxPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbGxPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhICE9PSBzY2hlbWEuYWxsT2ZbaV0pIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgYW55T2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmFueU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFueU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5hbnlPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIHNjaGVtYS5hbnlPZltpXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRhdGEgPT09IHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgb25lT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGxldCB2YWxpZENvdW50ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5vbmVPZi5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5vbmVPZltpXSkpIHtcbiAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLm9uZU9mW2ldKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEub25lT2ZbaV0uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLm9uZU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICAgIHZhbGlkQ291bnQrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLm9uZU9mW2ldKSB7XG4gICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHZhbGlkQ291bnQgPT09IDEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGNvbnN0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoXG4gICAgICBkYXRhID09PSBzY2hlbWEuY29uc3QgfHxcbiAgICAgIChpc09iamVjdChkYXRhKSAmJlxuICAgICAgICBpc09iamVjdChzY2hlbWEuY29uc3QpICYmXG4gICAgICAgIGRlZXBFcXVhbChkYXRhLCBzY2hlbWEuY29uc3QpKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiZcbiAgICAgICAgQXJyYXkuaXNBcnJheShzY2hlbWEuY29uc3QpICYmXG4gICAgICAgIGRlZXBFcXVhbChkYXRhLCBzY2hlbWEuY29uc3QpKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGlmKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoXCJ0aGVuXCIgaW4gc2NoZW1hID09PSBmYWxzZSAmJiBcImVsc2VcIiBpbiBzY2hlbWEgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0eXBlb2Ygc2NoZW1hLmlmID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5pZikge1xuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgICByZXR1cm4gc2NoZW1hLnRoZW4uJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5pZikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5pZi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgaWYgKCFlcnJvcikge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnRoZW4pKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5lbHNlKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLmVsc2UuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfSxcblxuICBub3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2Ygc2NoZW1hLm5vdCA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWEubm90KSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzT2JqZWN0KHNjaGVtYS5ub3QpKSB7XG4gICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEubm90KSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLm5vdC4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBjYXVzZTogZXJyb3IsIGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHtcbiAgRGVmaW5lRXJyb3JGdW5jdGlvbixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBkZWVwQ2xvbmUsXG4gIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5LFxuICBnZXROYW1lZEZ1bmN0aW9uLFxuICBpc09iamVjdFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBGb3JtYXRzIH0gZnJvbSBcIi4vZm9ybWF0c1wiO1xuaW1wb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsga2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkc1wiO1xuXG5leHBvcnQgdHlwZSBSZXN1bHQgPSB2b2lkIHwgVmFsaWRhdGlvbkVycm9yO1xuXG5leHBvcnQgaW50ZXJmYWNlIEtleXdvcmRGdW5jdGlvbiB7XG4gIChcbiAgICBzY2hlbWE6IENvbXBpbGVkU2NoZW1hLFxuICAgIGRhdGE6IGFueSxcbiAgICBkZWZpbmVFcnJvcjogRGVmaW5lRXJyb3JGdW5jdGlvbixcbiAgICBpbnN0YW5jZTogU2NoZW1hU2hpZWxkXG4gICk6IFJlc3VsdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUeXBlRnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRlRnVuY3Rpb24ge1xuICAoZGF0YTogYW55KTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBpbGVkU2NoZW1hIHtcbiAgJHZhbGlkYXRlPzogVmFsaWRhdGVGdW5jdGlvbjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRvciB7XG4gIChkYXRhOiBhbnkpOiB7IGRhdGE6IGFueTsgZXJyb3I6IFZhbGlkYXRpb25FcnJvciB8IG51bGw7IHZhbGlkOiBib29sZWFuIH07XG4gIGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYTtcbn1cblxuZXhwb3J0IGNsYXNzIFNjaGVtYVNoaWVsZCB7XG4gIHByaXZhdGUgdHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUga2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlPiA9IHt9O1xuICBwcml2YXRlIGltbXV0YWJsZSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBpbW11dGFibGUgPSBmYWxzZVxuICB9OiB7XG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5pbW11dGFibGUgPSBpbW11dGFibGU7XG5cbiAgICBmb3IgKGNvbnN0IFt0eXBlLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKFR5cGVzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZFR5cGUodHlwZSwgdmFsaWRhdG9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtrZXl3b3JkLCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKGtleXdvcmRzKSkge1xuICAgICAgdGhpcy5hZGRLZXl3b3JkKGtleXdvcmQsIHZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2Zvcm1hdCwgdmFsaWRhdG9yXSBvZiBPYmplY3QuZW50cmllcyhGb3JtYXRzKSkge1xuICAgICAgaWYgKHZhbGlkYXRvcikge1xuICAgICAgICB0aGlzLmFkZEZvcm1hdChmb3JtYXQsIHZhbGlkYXRvciBhcyBGb3JtYXRGdW5jdGlvbik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVHlwZShuYW1lOiBzdHJpbmcsIHZhbGlkYXRvcjogVHlwZUZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLnR5cGVzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFR5cGUgXCIke25hbWV9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB9XG4gICAgdGhpcy50eXBlc1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldFR5cGUodHlwZTogc3RyaW5nKTogVHlwZUZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLnR5cGVzW3R5cGVdO1xuICB9XG5cbiAgYWRkRm9ybWF0KG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBGb3JtYXRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5mb3JtYXRzW25hbWVdICYmICFvdmVyd3JpdGUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEZvcm1hdCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmZvcm1hdHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRGb3JtYXQoZm9ybWF0OiBzdHJpbmcpOiBGb3JtYXRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtYXRzW2Zvcm1hdF07XG4gIH1cblxuICBhZGRLZXl3b3JkKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBLZXl3b3JkRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMua2V5d29yZHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgS2V5d29yZCBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLmtleXdvcmRzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0S2V5d29yZChrZXl3b3JkOiBzdHJpbmcpOiBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMua2V5d29yZHNba2V5d29yZF07XG4gIH1cblxuICBjb21waWxlKHNjaGVtYTogYW55KTogVmFsaWRhdG9yIHtcbiAgICBjb25zdCBjb21waWxlZFNjaGVtYSA9IHRoaXMuY29tcGlsZVNjaGVtYShzY2hlbWEpO1xuICAgIGlmICghY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKSB7XG4gICAgICBpZiAodGhpcy5pc1NjaGVtYUxpa2Uoc2NoZW1hKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcIkludmFsaWQgc2NoZW1hXCIpO1xuICAgICAgfVxuXG4gICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICBcImFueVwiLFxuICAgICAgICAoKSA9PiB7fVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB2YWxpZGF0ZTogVmFsaWRhdG9yID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgY29uc3QgY2xvbmVkRGF0YSA9IHRoaXMuaW1tdXRhYmxlID8gZGVlcENsb25lKGRhdGEpIDogZGF0YTtcbiAgICAgIGNvbnN0IGVycm9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlKGNsb25lZERhdGEpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkYXRhOiBjbG9uZWREYXRhLFxuICAgICAgICBlcnJvcjogZXJyb3IgPyBlcnJvciA6IG51bGwsXG4gICAgICAgIHZhbGlkOiAhZXJyb3JcbiAgICAgIH07XG4gICAgfTtcblxuICAgIHZhbGlkYXRlLmNvbXBpbGVkU2NoZW1hID0gY29tcGlsZWRTY2hlbWE7XG5cbiAgICByZXR1cm4gdmFsaWRhdGU7XG4gIH1cblxuICBwcml2YXRlIGNvbXBpbGVTY2hlbWEoc2NoZW1hOiBQYXJ0aWFsPENvbXBpbGVkU2NoZW1hPiB8IGFueSk6IENvbXBpbGVkU2NoZW1hIHtcbiAgICBpZiAoIWlzT2JqZWN0KHNjaGVtYSkpIHtcbiAgICAgIGlmIChzY2hlbWEgPT09IHRydWUpIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIGFueU9mOiBbe31dXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIG9uZU9mOiBbXVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZW1hID0ge1xuICAgICAgICAgIG9uZU9mOiBbc2NoZW1hXVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hOiBDb21waWxlZFNjaGVtYSA9IHsgLi4uc2NoZW1hIH0gYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BRU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLEtBQWUsR0FDZkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxLQUMxQixNQUFNSixFQUNKSSxFQUNBLElBQ0FDLEtBQUtQLGNBQ2lCLElBQWRPLEtBQUtSLEtBQXVCLElBQU1RLEtBQUtSLEtBQU8sSUFFeEQsT0FBS1EsS0FBS04sTUFLSE0sS0FBS04sTUFBTUksVUFBVUgsSUFKMUJLLEtBQUtMLEtBQU9BLEVBQ0xLLEtBSVgsQ0FFQUMsV0FDRSxPQUFPRCxLQUFLRixXQUNkLEdBYUssU0FBU0ksRUFDZEMsRUFDQU4sR0FFQSxNQUFNTyxFQUFlLElBQUlmLEVBQWdCLFdBQVdjLEtBQ3BEQyxFQUFhWCxRQUFVVSxFQUN2QkMsRUFBYVAsT0FBU0EsRUFVdEIsT0FBT1EsRUFDTCxlQUFlRixJQVR3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
|
|
1
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWYWxpZGF0aW9uRXJyb3IiLCJFcnJvciIsIm1lc3NhZ2UiLCJpdGVtIiwia2V5d29yZCIsImNhdXNlIiwic2NoZW1hUGF0aCIsImluc3RhbmNlUGF0aCIsImRhdGEiLCJzY2hlbWEiLCJfZ2V0Q2F1c2UiLCJwb2ludGVyIiwiaW5zdGFuY2VQb2ludGVyIiwidGhpcyIsImdldENhdXNlIiwiX2dldFRyZWUiLCJ0cmVlIiwiZ2V0VHJlZSIsImdldFBhdGgiLCJnZXREZWZpbmVkRXJyb3JGdW5jdGlvbkZvcktleSIsImtleSIsIktleXdvcmRFcnJvciIsImdldE5hbWVkRnVuY3Rpb24iLCJvcHRpb25zIiwiZGVlcEVxdWFsIiwib2JqIiwib3RoZXIiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpIiwia2V5cyIsIk9iamVjdCIsImlzT2JqZWN0IiwiZGVlcENsb25lIiwicmVzdWx0IiwiY29uc3RydWN0b3IiLCJuYW1lIiwiaXNDb21waWxlZFNjaGVtYSIsInN1YlNjaGVtYSIsImZuIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsIkZvcm1hdHMiLCJtYXRjaCIsImRheSIsIk51bWJlciIsInllYXJTdHIiLCJtb250aFN0ciIsImhvdXJTdHIiLCJtaW51dGVTdHIiLCJzZWNvbmRTdHIiLCJ0aW1lem9uZVNpZ24iLCJ0aW1lem9uZUhvdXJTdHIiLCJ0aW1lem9uZU1pbnV0ZVN0ciIsInllYXIiLCJtb250aCIsImhvdXIiLCJtaW51dGUiLCJzZWNvbmQiLCJ0aW1lem9uZUhvdXIiLCJ0aW1lem9uZU1pbnV0ZSIsInVyaSIsInRlc3QiLCJlbWFpbCIsImlwdjQiLCJpcHY2IiwiaW5kZXhPZiIsImhhc0lwdjQiLCJhZGRyZXNzUGFydHMiLCJzcGxpdCIsImlwdjRQYXJ0IiwicG9wIiwiaXNTaG9ydGVuZWQiLCJpcHY2UGFydCIsImpvaW4iLCJpc0lwdjZWYWxpZCIsImhhc0ludmFsaWRDaGFyIiwiaG9zdG5hbWUiLCJkYXRlIiwiaXNOYU4iLCJEYXRlIiwiZ2V0VGltZSIsInJlZ2V4IiwiUmVnRXhwIiwiZSIsInRpbWUiLCJkdXJhdGlvbiIsInV1aWQiLCJpcmkiLCJUeXBlcyIsIm9iamVjdCIsImFycmF5Iiwic3RyaW5nIiwibnVtYmVyIiwiaW50ZWdlciIsImJvb2xlYW4iLCJudWxsIiwidGltZXN0YW1wIiwiaW50OCIsInVuaXQ4IiwiaW50MTYiLCJ1bml0MTYiLCJpbnQzMiIsInVuaXQzMiIsImZsb2F0MzIiLCJmbG9hdDY0Iiwia2V5d29yZHMiLCJyZXF1aXJlZCIsImRlZmluZUVycm9yIiwiaGFzT3duUHJvcGVydHkiLCJwcm9wZXJ0aWVzIiwiZXJyb3IiLCIkdmFsaWRhdGUiLCJzY2hlbWFQcm9wIiwiZGVmYXVsdCIsInZhbHVlcyIsIm1heFByb3BlcnRpZXMiLCJtaW5Qcm9wZXJ0aWVzIiwiYWRkaXRpb25hbFByb3BlcnRpZXMiLCJpc0NvbXBpbGVkIiwicGF0dGVyblByb3BlcnRpZXMiLCJwYXR0ZXJuIiwicGF0dGVybnMiLCJwcm9wZXJ0eU5hbWVzIiwiZGVwZW5kZW5jaWVzIiwiZGVwZW5kZW5jeSIsInRoZW4iLCJlbHNlIiwiJHJlZiIsImRlZmluaXRpb25zIiwiJGlkIiwiJHNjaGVtYSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCIkY29tbWVudCIsImV4YW1wbGVzIiwiY29udGVudE1lZGlhVHlwZSIsImNvbnRlbnRFbmNvZGluZyIsImRpc2NyaW1pbmF0b3IiLCJudWxsYWJsZSIsIml0ZW1zIiwic2NoZW1hSXRlbXMiLCJkYXRhTGVuZ3RoIiwic2NoZW1hSXRlbXNMZW5ndGgiLCJpdGVtc0xlbmd0aCIsIk1hdGgiLCJtaW4iLCJzY2hlbWFJdGVtIiwiZWxlbWVudHMiLCJtaW5JdGVtcyIsIm1heEl0ZW1zIiwiYWRkaXRpb25hbEl0ZW1zIiwidW5pcXVlSXRlbXMiLCJ1bmlxdWUiLCJTZXQiLCJpdGVtU3RyIiwiSlNPTiIsInN0cmluZ2lmeSIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJTdHJpbmciLCJoYXMiLCJhZGQiLCJjb250YWlucyIsIm1pbkxlbmd0aCIsIm1heExlbmd0aCIsInBhdHRlcm5SZWdleHAiLCJmb3JtYXQiLCJpbnN0YW5jZSIsImZvcm1hdFZhbGlkYXRlIiwiZ2V0Rm9ybWF0IiwibWluaW11bSIsImV4Y2x1c2l2ZU1pbmltdW0iLCJtYXhpbXVtIiwibWF4IiwiZXhjbHVzaXZlTWF4aW11bSIsIm11bHRpcGxlT2YiLCJxdW90aWVudCIsImlzRmluaXRlIiwiZXBzaWxvbiIsImFicyIsImFyZUNsb3NlRW5vdWdoIiwicm91bmQiLCJlbnVtIiwiZW51bUl0ZW0iLCJhbGxPZiIsIkJvb2xlYW4iLCJhbnlPZiIsIm9uZU9mIiwidmFsaWRDb3VudCIsImNvbnN0IiwiaWYiLCJub3QiLCJ0eXBlcyIsImZvcm1hdHMiLCJpbW11dGFibGUiLCJ0eXBlIiwidmFsaWRhdG9yIiwiYWRkVHlwZSIsImFkZEtleXdvcmQiLCJhZGRGb3JtYXQiLCJvdmVyd3JpdGUiLCJnZXRUeXBlIiwiZ2V0S2V5d29yZCIsImNvbXBpbGUiLCJjb21waWxlZFNjaGVtYSIsImNvbXBpbGVTY2hlbWEiLCJpc1NjaGVtYUxpa2UiLCJ2YWxpZGF0ZSIsImNsb25lZERhdGEiLCJ2YWxpZCIsImRlZmluZVR5cGVFcnJvciIsInR5cGVWYWxpZGF0aW9ucyIsIm1ldGhvZE5hbWUiLCJtYXAiLCJ0IiwidHJpbSIsInB1c2giLCJ0eXBlVmFsaWRhdGlvbnNMZW5ndGgiLCJ0eXBlVmFsaWRhdGlvbiIsImtleXdvcmRWYWxpZGF0b3IiLCJwcmV2VmFsaWRhdG9yIiwic3ViS2V5IiwiaW5kZXgiXSwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiLCIuLi9saWIvZm9ybWF0cy50cyIsIi4uL2xpYi90eXBlcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvYXJyYXkta2V5d29yZHMudHMiLCIuLi9saWIva2V5d29yZHMvc3RyaW5nLWtleXdvcmRzLnRzIiwiLi4vbGliL2tleXdvcmRzL251bWJlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkcy50cyIsIi4uL2xpYi9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21waWxlZFNjaGVtYSB9IGZyb20gXCIuL2luZGV4XCI7XG5cbmludGVyZmFjZSBFcnJvclRyZWUge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGtleXdvcmQ6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nO1xuICBpbnN0YW5jZVBhdGg6IHN0cmluZztcbiAgZGF0YT86IGFueTtcbiAgY2F1c2U/OiBFcnJvclRyZWU7XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaXRlbT86IHN0cmluZyB8IG51bWJlcjtcbiAga2V5d29yZDogc3RyaW5nO1xuICBjYXVzZT86IFZhbGlkYXRpb25FcnJvcjtcbiAgc2NoZW1hUGF0aDogc3RyaW5nID0gXCJcIjtcbiAgaW5zdGFuY2VQYXRoOiBzdHJpbmcgPSBcIlwiO1xuICBkYXRhPzogYW55O1xuICBzY2hlbWE/OiBDb21waWxlZFNjaGVtYTtcblxuICBwcml2YXRlIF9nZXRDYXVzZShwb2ludGVyID0gXCIjXCIsIGluc3RhbmNlUG9pbnRlciA9IFwiI1wiKTogVmFsaWRhdGlvbkVycm9yIHtcbiAgICBsZXQgc2NoZW1hUGF0aCA9IGAke3BvaW50ZXJ9LyR7dGhpcy5rZXl3b3JkfWA7XG4gICAgbGV0IGluc3RhbmNlUGF0aCA9IGAke2luc3RhbmNlUG9pbnRlcn1gO1xuICAgIGlmICh0eXBlb2YgdGhpcy5pdGVtICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuaXRlbSA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLml0ZW0gaW4gdGhpcy5zY2hlbWEpIHtcbiAgICAgICAgc2NoZW1hUGF0aCArPSBgLyR7dGhpcy5pdGVtfWA7XG4gICAgICB9XG4gICAgICBpbnN0YW5jZVBhdGggKz0gYC8ke3RoaXMuaXRlbX1gO1xuICAgIH1cblxuICAgIHRoaXMuaW5zdGFuY2VQYXRoID0gaW5zdGFuY2VQYXRoO1xuICAgIHRoaXMuc2NoZW1hUGF0aCA9IHNjaGVtYVBhdGg7XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBjYXVzZSBvciB0aGUgY2F1c2UgaXMgbm90IGEgVmFsaWRhdGlvbkVycm9yLCByZXR1cm4gdGhpc1xuICAgIGlmICghdGhpcy5jYXVzZSB8fCAhKHRoaXMuY2F1c2UgaW5zdGFuY2VvZiBWYWxpZGF0aW9uRXJyb3IpKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jYXVzZS5fZ2V0Q2F1c2Uoc2NoZW1hUGF0aCwgaW5zdGFuY2VQYXRoKTtcbiAgfVxuXG4gIGdldENhdXNlKCk6IFZhbGlkYXRpb25FcnJvciB7XG4gICAgcmV0dXJuIHRoaXMuX2dldENhdXNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUcmVlKCk6IEVycm9yVHJlZSB7XG4gICAgY29uc3QgdHJlZTogRXJyb3JUcmVlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlLFxuICAgICAga2V5d29yZDogdGhpcy5rZXl3b3JkLFxuICAgICAgaXRlbTogdGhpcy5pdGVtLFxuICAgICAgc2NoZW1hUGF0aDogdGhpcy5zY2hlbWFQYXRoLFxuICAgICAgaW5zdGFuY2VQYXRoOiB0aGlzLmluc3RhbmNlUGF0aCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5jYXVzZSkge1xuICAgICAgdHJlZS5jYXVzZSA9IHRoaXMuY2F1c2UuX2dldFRyZWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJlZTtcbiAgfVxuXG4gIGdldFRyZWUoKTogRXJyb3JUcmVlIHtcbiAgICB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFRyZWUoKTtcbiAgfVxuXG4gIGdldFBhdGgoKSB7XG4gICAgY29uc3QgY2F1c2UgPSB0aGlzLmdldENhdXNlKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjaGVtYVBhdGg6IGNhdXNlLnNjaGVtYVBhdGgsXG4gICAgICBpbnN0YW5jZVBhdGg6IGNhdXNlLmluc3RhbmNlUGF0aFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvck9wdGlvbnMge1xuICBpdGVtPzogYW55OyAvLyBGaW5hbCBpdGVtIGluIHRoZSBzY2hlbWFQYXRoXG4gIGNhdXNlPzogVmFsaWRhdGlvbkVycm9yOyAvLyBDYXVzZSBvZiB0aGUgZXJyb3JcbiAgZGF0YT86IGFueTsgLy8gRGF0YSB0aGF0IGNhdXNlZCB0aGUgZXJyb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWZpbmVFcnJvckZ1bmN0aW9uIHtcbiAgKG1lc3NhZ2U6IHN0cmluZywgb3B0aW9ucz86IERlZmluZUVycm9yT3B0aW9ucyk6IFZhbGlkYXRpb25FcnJvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERlZmluZWRFcnJvckZ1bmN0aW9uRm9yS2V5KFxuICBrZXk6IHN0cmluZyxcbiAgc2NoZW1hOiBDb21waWxlZFNjaGVtYVxuKSB7XG4gIGNvbnN0IEtleXdvcmRFcnJvciA9IG5ldyBWYWxpZGF0aW9uRXJyb3IoYEludmFsaWQgJHtrZXl9YCk7XG4gIEtleXdvcmRFcnJvci5rZXl3b3JkID0ga2V5O1xuICBLZXl3b3JkRXJyb3Iuc2NoZW1hID0gc2NoZW1hO1xuXG4gIGNvbnN0IGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uID0gKG1lc3NhZ2UsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIEtleXdvcmRFcnJvci5tZXNzYWdlID0gbWVzc2FnZTtcbiAgICBLZXl3b3JkRXJyb3IuaXRlbSA9IG9wdGlvbnMuaXRlbTtcbiAgICBLZXl3b3JkRXJyb3IuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIEtleXdvcmRFcnJvci5kYXRhID0gb3B0aW9ucy5kYXRhO1xuICAgIHJldHVybiBLZXl3b3JkRXJyb3I7XG4gIH07XG5cbiAgcmV0dXJuIGdldE5hbWVkRnVuY3Rpb248RGVmaW5lRXJyb3JGdW5jdGlvbj4oXG4gICAgYGRlZmluZUVycm9yXyR7a2V5fWAsXG4gICAgZGVmaW5lRXJyb3JcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBFcXVhbChcbiAgb2JqOiBBcnJheTxhbnk+IHwgUmVjb3JkPHN0cmluZywgYW55PixcbiAgb3RoZXI6IEFycmF5PGFueT4gfCBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSAmJiBBcnJheS5pc0FycmF5KG90aGVyKSkge1xuICAgIGlmIChvYmoubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iai5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2ldLCBvdGhlcltpXSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIG90aGVyID09PSBcIm9iamVjdFwiKSB7XG4gICAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvdGhlciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG9iaiA9PT0gb3RoZXI7XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG4gICAgaWYgKGtleXMubGVuZ3RoICE9PSBPYmplY3Qua2V5cyhvdGhlcikubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKCFkZWVwRXF1YWwob2JqW2tleV0sIG90aGVyW2tleV0pKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBvYmogPT09IG90aGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3QoZGF0YSkge1xuICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgZGF0YSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFyZUNsb3NlRW5vdWdoKGEsIGIsIGVwc2lsb24gPSAxZS0xNSkge1xuICByZXR1cm4gTWF0aC5hYnMoYSAtIGIpIDw9IGVwc2lsb24gKiBNYXRoLm1heChNYXRoLmFicyhhKSwgTWF0aC5hYnMoYikpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VVRGMTZMZW5ndGgoc3RyKSB7XG4gIGxldCBsZW5ndGggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNvZGVQb2ludCA9IHN0ci5jb2RlUG9pbnRBdChpKTtcbiAgICBpZiAoY29kZVBvaW50ID4gMHhmZmZmKSB7XG4gICAgICBpKys7XG4gICAgfVxuICAgIGxlbmd0aCsrO1xuICB9XG4gIHJldHVybiBsZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ2xvbmUob2JqOiBhbnkpOiBhbnkge1xuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IGRlZXBDbG9uZShvYmpbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSXMgY2xhc3MgaW5zdGFuY2Ugb2YgYW55IGtpbmRcbiAgaWYgKG9iaiAmJiBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT09IFwiT2JqZWN0XCIpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKGlzT2JqZWN0KG9iaikpIHtcbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAuLi5vYmpcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgcmVzdWx0W2tleV0gPSBkZWVwQ2xvbmUob2JqW2tleV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIG9iajtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcGlsZWRTY2hlbWEoc3ViU2NoZW1hOiBhbnkpOiBzdWJTY2hlbWEgaXMgQ29tcGlsZWRTY2hlbWEge1xuICByZXR1cm4gaXNPYmplY3Qoc3ViU2NoZW1hKSAmJiBcIiR2YWxpZGF0ZVwiIGluIHN1YlNjaGVtYTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5hbWVkRnVuY3Rpb248VD4obmFtZTogc3RyaW5nLCBmbjogVCk6IFQge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGZuLCBcIm5hbWVcIiwgeyB2YWx1ZTogbmFtZSB9KTtcbn1cbiIsImltcG9ydCB7IEZvcm1hdEZ1bmN0aW9uIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IEZvcm1hdHM6IFJlY29yZDxzdHJpbmcsIEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2U+ID0ge1xuICBbXCJkYXRlLXRpbWVcIl0oZGF0YSkge1xuICAgIGNvbnN0IG1hdGNoID0gZGF0YS5tYXRjaChcbiAgICAgIC9eKFxcZHs0fSktKDBbMC05XXwxWzAtMl0pLShcXGR7Mn0pVCgwWzAtOV18MVxcZHwyWzAtM10pOihbMC01XVxcZCk6KCg/OlswLTVdXFxkfDYwKSkoPzouXFxkKyk/KD86KFsrLV0pKDBbMC05XXwxXFxkfDJbMC0zXSk6KFswLTVdXFxkKXxaKT8kL2lcbiAgICApO1xuXG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBkYXkgPSBOdW1iZXIobWF0Y2hbM10pO1xuXG4gICAgaWYgKG1hdGNoWzJdID09PSBcIjAyXCIgJiYgZGF5ID4gMjkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbXG4gICAgICAsXG4gICAgICB5ZWFyU3RyLFxuICAgICAgbW9udGhTdHIsXG4gICAgICAsXG4gICAgICBob3VyU3RyLFxuICAgICAgbWludXRlU3RyLFxuICAgICAgc2Vjb25kU3RyLFxuICAgICAgdGltZXpvbmVTaWduLFxuICAgICAgdGltZXpvbmVIb3VyU3RyLFxuICAgICAgdGltZXpvbmVNaW51dGVTdHJcbiAgICBdID0gbWF0Y2g7XG5cbiAgICBsZXQgeWVhciA9IE51bWJlcih5ZWFyU3RyKTtcbiAgICBsZXQgbW9udGggPSBOdW1iZXIobW9udGhTdHIpO1xuICAgIGxldCBob3VyID0gTnVtYmVyKGhvdXJTdHIpO1xuICAgIGxldCBtaW51dGUgPSBOdW1iZXIobWludXRlU3RyKTtcbiAgICBsZXQgc2Vjb25kID0gTnVtYmVyKHNlY29uZFN0cik7XG5cbiAgICBpZiAodGltZXpvbmVTaWduID09PSBcIi1cIiB8fCB0aW1lem9uZVNpZ24gPT09IFwiK1wiKSB7XG4gICAgICBjb25zdCB0aW1lem9uZUhvdXIgPSBOdW1iZXIodGltZXpvbmVIb3VyU3RyKTtcbiAgICAgIGNvbnN0IHRpbWV6b25lTWludXRlID0gTnVtYmVyKHRpbWV6b25lTWludXRlU3RyKTtcblxuICAgICAgaWYgKHRpbWV6b25lU2lnbiA9PT0gXCItXCIpIHtcbiAgICAgICAgaG91ciArPSB0aW1lem9uZUhvdXI7XG4gICAgICAgIG1pbnV0ZSArPSB0aW1lem9uZU1pbnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAodGltZXpvbmVTaWduID09PSBcIitcIikge1xuICAgICAgICBob3VyIC09IHRpbWV6b25lSG91cjtcbiAgICAgICAgbWludXRlIC09IHRpbWV6b25lTWludXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAobWludXRlID4gNTkpIHtcbiAgICAgICAgaG91ciArPSAxO1xuICAgICAgICBtaW51dGUgLT0gNjA7XG4gICAgICB9IGVsc2UgaWYgKG1pbnV0ZSA8IDApIHtcbiAgICAgICAgaG91ciAtPSAxO1xuICAgICAgICBtaW51dGUgKz0gNjA7XG4gICAgICB9XG5cbiAgICAgIGlmIChob3VyID4gMjMpIHtcbiAgICAgICAgZGF5ICs9IDE7XG4gICAgICAgIGhvdXIgLT0gMjQ7XG4gICAgICB9IGVsc2UgaWYgKGhvdXIgPCAwKSB7XG4gICAgICAgIGRheSAtPSAxO1xuICAgICAgICBob3VyICs9IDI0O1xuICAgICAgfVxuXG4gICAgICBpZiAoZGF5ID4gMzEpIHtcbiAgICAgICAgbW9udGggKz0gMTtcbiAgICAgICAgZGF5IC09IDMxO1xuICAgICAgfSBlbHNlIGlmIChkYXkgPCAxKSB7XG4gICAgICAgIG1vbnRoIC09IDE7XG4gICAgICAgIGRheSArPSAzMTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vbnRoID4gMTIpIHtcbiAgICAgICAgeWVhciArPSAxO1xuICAgICAgICBtb250aCAtPSAxMjtcbiAgICAgIH0gZWxzZSBpZiAobW9udGggPCAxKSB7XG4gICAgICAgIHllYXIgLT0gMTtcbiAgICAgICAgbW9udGggKz0gMTI7XG4gICAgICB9XG5cbiAgICAgIGlmICh5ZWFyIDwgMCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF5c0luTW9udGggPSBbMzEsICwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdO1xuICAgIGNvbnN0IG1heERheXMgPVxuICAgICAgbW9udGggPT09IDJcbiAgICAgICAgPyB5ZWFyICUgNCA9PT0gMCAmJiAoeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwKVxuICAgICAgICAgID8gMjlcbiAgICAgICAgICA6IDI4XG4gICAgICAgIDogZGF5c0luTW9udGhbbW9udGggLSAxXTtcblxuICAgIGlmIChkYXkgPiBtYXhEYXlzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gTGVhcCBzZWNvbmRzXG4gICAgaWYgKHNlY29uZCA9PT0gNjAgJiYgKG1pbnV0ZSAhPT0gNTkgfHwgaG91ciAhPT0gMjMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0sXG4gIHVyaShkYXRhKSB7XG4gICAgcmV0dXJuIC9eW2EtekEtWl1bYS16QS1aMC05K1xcLS5dKjpbXlxcc10qJC8udGVzdChkYXRhKTtcbiAgfSxcbiAgZW1haWwoZGF0YSkge1xuICAgIHJldHVybiAvXig/IVxcLikoPyEuKlxcLiQpW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjB9KD86XFwuW2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dezEsMjF9KXswLDJ9QFthLXowLTldKD86W2EtejAtOS1dezAsNjF9W2EtejAtOV0pPyg/OlxcLlthLXowLTldKD86W2EtejAtOS1dezAsNjB9W2EtejAtOV0pPyl7MCwzfSQvaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIGlwdjQoZGF0YSkge1xuICAgIC8vIE1hdGNoZXMgYSBzdHJpbmcgZm9ybWVkIGJ5IDQgbnVtYmVycyBiZXR3ZWVuIDAgYW5kIDI1NSBzZXBhcmF0ZWQgYnkgZG90cyB3aXRob3V0IGxlYWRpbmcgemVyb3NcbiAgICAvLyAvXigoMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC9cbiAgICByZXR1cm4gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKSQvLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcblxuICAvLyBpcHY2OiBpc015SXBWYWxpZCh7IHZlcnNpb246IDYgfSksXG4gIGlwdjYoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIjo6XCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIGRhdGEuaW5kZXhPZihcIjpcIikgPT09IC0xIHx8XG4gICAgICAvKD86XFxzK3w6OjorfF5cXHd7NSx9fFxcd3s1fSR8Xjp7MX1cXHd8XFx3OnsxfSQpLy50ZXN0KGRhdGEpXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaGFzSXB2NCA9IGRhdGEuaW5kZXhPZihcIi5cIikgIT09IC0xO1xuICAgIGxldCBhZGRyZXNzUGFydHMgPSBkYXRhO1xuXG4gICAgaWYgKGhhc0lwdjQpIHtcbiAgICAgIGFkZHJlc3NQYXJ0cyA9IGRhdGEuc3BsaXQoXCI6XCIpO1xuICAgICAgY29uc3QgaXB2NFBhcnQgPSBhZGRyZXNzUGFydHMucG9wKCk7XG4gICAgICBpZiAoXG4gICAgICAgICEvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pJC8udGVzdChcbiAgICAgICAgICBpcHY0UGFydFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlzU2hvcnRlbmVkID0gZGF0YS5pbmRleE9mKFwiOjpcIikgIT09IC0xO1xuICAgIGNvbnN0IGlwdjZQYXJ0ID0gaGFzSXB2NCA/IGFkZHJlc3NQYXJ0cy5qb2luKFwiOlwiKSA6IGRhdGE7XG5cbiAgICBpZiAoaXNTaG9ydGVuZWQpIHtcbiAgICAgIGlmIChpcHY2UGFydC5zcGxpdChcIjo6XCIpLmxlbmd0aCAtIDEgPiAxKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCEvXlswLTlhLWZBLUY6Ll0qJC8udGVzdChpcHY2UGFydCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gL14oPzooPzooPzpbMC05YS1mQS1GXXsxLDR9KD86OnwkKSl7MSw2fSkpfCg/Ojo6KD86WzAtOWEtZkEtRl17MSw0fSkpezAsNX0kLy50ZXN0KFxuICAgICAgICBpcHY2UGFydFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc0lwdjZWYWxpZCA9XG4gICAgICAvXig/Oig/OlswLTlhLWZBLUZdezEsNH06KXs3fSg/OlswLTlhLWZBLUZdezEsNH18OikpJC8udGVzdChpcHY2UGFydCk7XG5cbiAgICBjb25zdCBoYXNJbnZhbGlkQ2hhciA9IC8oPzpbMC05YS1mQS1GXXs1LH18XFxEWzAtOWEtZkEtRl17M306KS8udGVzdChcbiAgICAgIGlwdjZQYXJ0XG4gICAgKTtcblxuICAgIGlmIChoYXNJcHY0KSB7XG4gICAgICByZXR1cm4gaXNJcHY2VmFsaWQgfHwgIWhhc0ludmFsaWRDaGFyO1xuICAgIH1cblxuICAgIHJldHVybiBpc0lwdjZWYWxpZCAmJiAhaGFzSW52YWxpZENoYXI7XG4gIH0sXG5cbiAgaG9zdG5hbWUoZGF0YSkge1xuICAgIHJldHVybiAvXlthLXowLTldW2EtejAtOS1dezAsNjJ9KD86XFwuW2EtejAtOV1bYS16MC05LV17MCw2Mn0pKlthLXowLTldJC9pLnRlc3QoXG4gICAgICBkYXRhXG4gICAgKTtcbiAgfSxcbiAgZGF0ZShkYXRhKSB7XG4gICAgaWYgKC9eKFxcZHs0fSktKFxcZHsyfSktKFxcZHsyfSkkLy50ZXN0KGRhdGEpID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiAhaXNOYU4obmV3IERhdGUoZGF0YSkuZ2V0VGltZSgpKTtcbiAgfSxcbiAgcmVnZXgoZGF0YSkge1xuICAgIHRyeSB7XG4gICAgICBuZXcgUmVnRXhwKGRhdGEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSxcbiAgXCJqc29uLXBvaW50ZXJcIihkYXRhKSB7XG4gICAgaWYgKGRhdGEgPT09IFwiXCIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiAvXlxcLyg/Oltefl18fjB8fjEpKiQvLnRlc3QoZGF0YSk7XG4gIH0sXG4gIFwicmVsYXRpdmUtanNvbi1wb2ludGVyXCIoZGF0YSkge1xuICAgIGlmIChkYXRhID09PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gL14oWzAtOV0rKSgjfFxcLyg/Oltefl18fjB8fjEpKik/JC8udGVzdChkYXRhKTtcbiAgfSxcbiAgdGltZShkYXRhKSB7XG4gICAgcmV0dXJuIC9eKFxcZHsyfSk6KFxcZHsyfSk6KFxcZHsyfSkoXFwuXFxkKyk/KFp8KFsrLV0pKFxcZHsyfSk6KFxcZHsyfSkpJC8udGVzdChcbiAgICAgIGRhdGFcbiAgICApO1xuICB9LFxuICBcInVyaS1yZWZlcmVuY2VcIihkYXRhKSB7XG4gICAgaWYgKC9cXFxcLy50ZXN0KGRhdGEpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIC9eKChbXjovPyNdKyk6KT8oXFwvXFwvKFteLz8jXSopKT8oW14/I10qKShcXD8oW14jXSopKT8oIygoPyFbXiNdKlxcXFwpW14jXSopKT8vaS50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG4gIFwidXJpLXRlbXBsYXRlXCIoZGF0YSkge1xuICAgIHJldHVybiAvXig/Oig/Omh0dHBzPzpcXC9cXC9bXFx3Li1dKyk/XFwvPyk/W1xcdy0gOywuXFwvPyUmPV0qKD86XFx7W1xcdy1dKyg/OjpcXGQrKT9cXH1bXFx3LSA7LC5cXC8/JSY9XSopKlxcLz8kLy50ZXN0KFxuICAgICAgZGF0YVxuICAgICk7XG4gIH0sXG5cbiAgLy8gTm90IHN1cHBvcnRlZCB5ZXRcbiAgZHVyYXRpb246IGZhbHNlLFxuICB1dWlkOiBmYWxzZSxcbiAgXCJpZG4tZW1haWxcIjogZmFsc2UsXG4gIFwiaWRuLWhvc3RuYW1lXCI6IGZhbHNlLFxuICBpcmk6IGZhbHNlLFxuICBcImlyaS1yZWZlcmVuY2VcIjogZmFsc2Vcbn07XG4iLCJpbXBvcnQgeyBUeXBlRnVuY3Rpb24gfSBmcm9tIFwiLi9pbmRleFwiO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgVHlwZXM6IFJlY29yZDxzdHJpbmcsIFR5cGVGdW5jdGlvbiB8IGZhbHNlPiA9IHtcbiAgb2JqZWN0KGRhdGEpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoZGF0YSk7XG4gIH0sXG4gIGFycmF5KGRhdGEpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmXG4gICAgICBkYXRhICE9PSBudWxsICYmXG4gICAgICBcImxlbmd0aFwiIGluIGRhdGEgJiZcbiAgICAgIFwiMFwiIGluIGRhdGEgJiZcbiAgICAgIE9iamVjdC5rZXlzKGRhdGEpLmxlbmd0aCAtIDEgPT09IGRhdGEubGVuZ3RoXG4gICAgKTtcbiAgfSxcbiAgc3RyaW5nKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCI7XG4gIH0sXG4gIG51bWJlcihkYXRhKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBkYXRhID09PSBcIm51bWJlclwiO1xuICB9LFxuICBpbnRlZ2VyKGRhdGEpIHtcbiAgICByZXR1cm4gdHlwZW9mIGRhdGEgPT09IFwibnVtYmVyXCIgJiYgZGF0YSAlIDEgPT09IDA7XG4gIH0sXG4gIGJvb2xlYW4oZGF0YSkge1xuICAgIHJldHVybiB0eXBlb2YgZGF0YSA9PT0gXCJib29sZWFuXCI7XG4gIH0sXG4gIG51bGwoZGF0YSkge1xuICAgIHJldHVybiBkYXRhID09PSBudWxsO1xuICB9LFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgdGltZXN0YW1wOiBmYWxzZSxcbiAgaW50ODogZmFsc2UsXG4gIHVuaXQ4OiBmYWxzZSxcbiAgaW50MTY6IGZhbHNlLFxuICB1bml0MTY6IGZhbHNlLFxuICBpbnQzMjogZmFsc2UsXG4gIHVuaXQzMjogZmFsc2UsXG4gIGZsb2F0MzI6IGZhbHNlLFxuICBmbG9hdDY0OiBmYWxzZVxuXG5cbn07XG4iLCJpbXBvcnQgeyBBcnJheUtleXdvcmRzIH0gZnJvbSBcIi4va2V5d29yZHMvYXJyYXkta2V5d29yZHNcIjtcbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuL2luZGV4XCI7XG5pbXBvcnQgeyBOdW1iZXJLZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzL251bWJlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgT2JqZWN0S2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vYmplY3Qta2V5d29yZHNcIjtcbmltcG9ydCB7IE90aGVyS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9vdGhlci1rZXl3b3Jkc1wiO1xuaW1wb3J0IHsgU3RyaW5nS2V5d29yZHMgfSBmcm9tIFwiLi9rZXl3b3Jkcy9zdHJpbmcta2V5d29yZHNcIjtcblxuZXhwb3J0IGNvbnN0IGtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC4uLk9iamVjdEtleXdvcmRzLFxuICAuLi5BcnJheUtleXdvcmRzLFxuICAuLi5TdHJpbmdLZXl3b3JkcyxcbiAgLi4uTnVtYmVyS2V5d29yZHMsXG4gIC4uLk90aGVyS2V5d29yZHNcbn07XG4iLCJpbXBvcnQgeyBpc0NvbXBpbGVkU2NoZW1hLCBpc09iamVjdCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5pbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IE9iamVjdEtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24gfCBmYWxzZT4gPSB7XG4gIC8vIE9iamVjdFxuICByZXF1aXJlZChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBzY2hlbWEucmVxdWlyZWRbaV07XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJSZXF1aXJlZCBwcm9wZXJ0eSBpcyBtaXNzaW5nXCIsIHtcbiAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hLnByb3BlcnRpZXMpKSB7XG4gICAgICBpZiAoIWRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICBjb25zdCBzY2hlbWFQcm9wID0gc2NoZW1hLnByb3BlcnRpZXNba2V5XTtcbiAgICAgICAgaWYgKGlzT2JqZWN0KHNjaGVtYVByb3ApICYmIFwiZGVmYXVsdFwiIGluIHNjaGVtYVByb3ApIHtcbiAgICAgICAgICBkYXRhW2tleV0gPSBzY2hlbWFQcm9wLmRlZmF1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLnByb3BlcnRpZXNba2V5XSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEucHJvcGVydGllc1trZXldLiR2YWxpZGF0ZShkYXRhW2tleV0pO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGtleSxcbiAgICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIHZhbHVlcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEudmFsdWVzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkYXRhKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS52YWx1ZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiUHJvcGVydHkgaXMgaW52YWxpZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heFByb3BlcnRpZXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghaXNPYmplY3QoZGF0YSkgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoIDw9IHNjaGVtYS5tYXhQcm9wZXJ0aWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVG9vIG1hbnkgcHJvcGVydGllc1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWluUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPj0gc2NoZW1hLm1pblByb3BlcnRpZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJUb28gZmV3IHByb3BlcnRpZXNcIiwgeyBkYXRhIH0pO1xuICB9LFxuXG4gIGFkZGl0aW9uYWxQcm9wZXJ0aWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgIGNvbnN0IGlzQ29tcGlsZWQgPSBpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyk7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHNjaGVtYS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgbGV0IG1hdGNoID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcGF0dGVybiBpbiBzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHtcbiAgICAgICAgICBpZiAobmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIikudGVzdChrZXkpKSB7XG4gICAgICAgICAgICBtYXRjaCA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQWRkaXRpb25hbCBwcm9wZXJ0aWVzIGFyZSBub3QgYWxsb3dlZFwiLCB7XG4gICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzQ29tcGlsZWQpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMuJHZhbGlkYXRlKGRhdGFba2V5XSk7XG4gICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFkZGl0aW9uYWwgcHJvcGVydGllcyBhcmUgaW52YWxpZFwiLCB7XG4gICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2tleV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBwYXR0ZXJuUHJvcGVydGllcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gT2JqZWN0LmtleXMoc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzKTtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuLCBcInVcIik7XG4gICAgICBpZiAodHlwZW9mIHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnR5IGlzIG5vdCBhbGxvd2VkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAocmVnZXgudGVzdChrZXkpKSB7XG4gICAgICAgICAgaWYgKFwiJHZhbGlkYXRlXCIgaW4gc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXS4kdmFsaWRhdGUoXG4gICAgICAgICAgICAgIGRhdGFba2V5XVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgICAgICBpdGVtOiBrZXksXG4gICAgICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFba2V5XVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgcHJvcGVydHlOYW1lcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0eU5hbWVzID09PSBmYWxzZSAmJiBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlByb3BlcnRpZXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLnByb3BlcnR5TmFtZXMpKSB7XG4gICAgICBmb3IgKGxldCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5wcm9wZXJ0eU5hbWVzLiR2YWxpZGF0ZShrZXkpO1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJQcm9wZXJ0eSBuYW1lIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgaXRlbToga2V5LFxuICAgICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgICAgZGF0YTogZGF0YVtrZXldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZGVwZW5kZW5jaWVzKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc2NoZW1hLmRlcGVuZGVuY2llcykge1xuICAgICAgaWYgKGtleSBpbiBkYXRhID09PSBmYWxzZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHNjaGVtYS5kZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlcGVuZGVuY3kpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwZW5kZW5jeS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGlmICghKGRlcGVuZGVuY3lbaV0gaW4gZGF0YSkpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICAgIGRhdGE6IGRlcGVuZGVuY3lbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jeSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJEZXBlbmRlbmN5IGlzIG5vdCBzYXRpc2ZpZWRcIiwgeyBkYXRhOiBkZXBlbmRlbmN5IH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGRlcGVuZGVuY3kgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3kgaW4gZGF0YSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7IGRhdGE6IGRlcGVuZGVuY3kgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJvciA9IGRlcGVuZGVuY3kuJHZhbGlkYXRlKGRhdGEpO1xuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkRlcGVuZGVuY3kgaXMgbm90IHNhdGlzZmllZFwiLCB7XG4gICAgICAgICAgY2F1c2U6IGVycm9yLFxuICAgICAgICAgIGRhdGFcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIC8vIFJlcXVpcmVkIGJ5IG90aGVyIGtleXdvcmRzIGJ1dCBub3QgdXNlZCBhcyBhIGZ1bmN0aW9uIGl0c2VsZlxuICB0aGVuOiBmYWxzZSxcbiAgZWxzZTogZmFsc2UsXG4gIGRlZmF1bHQ6IGZhbHNlLFxuXG4gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXRcbiAgJHJlZjogZmFsc2UsXG4gIGRlZmluaXRpb25zOiBmYWxzZSxcbiAgJGlkOiBmYWxzZSxcbiAgJHNjaGVtYTogZmFsc2UsXG5cbiAgLy8gTWV0YWRhdGEga2V5d29yZHMgKG5vdCB1c2VkIGFzIGEgZnVuY3Rpb24pXG4gIHRpdGxlOiBmYWxzZSxcbiAgZGVzY3JpcHRpb246IGZhbHNlLFxuICAkY29tbWVudDogZmFsc2UsXG4gIGV4YW1wbGVzOiBmYWxzZSxcbiAgY29udGVudE1lZGlhVHlwZTogZmFsc2UsXG4gIGNvbnRlbnRFbmNvZGluZzogZmFsc2UsXG5cbiAgLy8gTm90IHN1cHBvcnRlZCBPcGVuIEFQSSBrZXl3b3Jkc1xuICBkaXNjcmltaW5hdG9yOiBmYWxzZSxcbiAgbnVsbGFibGU6IGZhbHNlXG59O1xuIiwiaW1wb3J0IHsgaXNDb21waWxlZFNjaGVtYSwgaXNPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmV4cG9ydCBjb25zdCBBcnJheUtleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBpdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1hSXRlbXMgPSBzY2hlbWEuaXRlbXM7XG4gICAgY29uc3QgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuXG4gICAgaWYgKHR5cGVvZiBzY2hlbWFJdGVtcyA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgIGlmIChzY2hlbWFJdGVtcyA9PT0gZmFsc2UgJiYgZGF0YUxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbXMgYXJlIG5vdCBhbGxvd2VkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYUl0ZW1zKSkge1xuICAgICAgY29uc3Qgc2NoZW1hSXRlbXNMZW5ndGggPSBzY2hlbWFJdGVtcy5sZW5ndGg7XG4gICAgICBjb25zdCBpdGVtc0xlbmd0aCA9IE1hdGgubWluKHNjaGVtYUl0ZW1zTGVuZ3RoLCBkYXRhTGVuZ3RoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBzY2hlbWFJdGVtID0gc2NoZW1hSXRlbXNbaV07XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hSXRlbSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgICBpZiAoc2NoZW1hSXRlbSA9PT0gZmFsc2UgJiYgdHlwZW9mIGRhdGFbaV0gIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW0gaXMgbm90IGFsbG93ZWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWFJdGVtKSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hSXRlbS4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hSXRlbXMpKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYUl0ZW1zLiR2YWxpZGF0ZShkYXRhW2ldKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICAgIGl0ZW06IGksXG4gICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgZWxlbWVudHMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxlbWVudHMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5lbGVtZW50cy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiQXJyYXkgaXRlbSBpcyBpbnZhbGlkXCIsIHtcbiAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgIGNhdXNlOiBlcnJvcixcbiAgICAgICAgICBkYXRhOiBkYXRhW2ldXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBtaW5JdGVtcyhzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpIHx8IGRhdGEubGVuZ3RoID49IHNjaGVtYS5taW5JdGVtcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBzaG9ydFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4SXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCBkYXRhLmxlbmd0aCA8PSBzY2hlbWEubWF4SXRlbXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpcyB0b28gbG9uZ1wiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgYWRkaXRpb25hbEl0ZW1zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIXNjaGVtYS5pdGVtcyB8fCBpc09iamVjdChzY2hlbWEuaXRlbXMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMgPT09IGZhbHNlKSB7XG4gICAgICBpZiAoZGF0YS5sZW5ndGggPiBzY2hlbWEuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGlzIHRvbyBsb25nXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLmFkZGl0aW9uYWxJdGVtcykpIHtcbiAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS5hZGRpdGlvbmFsSXRlbXMpKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBzY2hlbWEuaXRlbXMubGVuZ3RoOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFkZGl0aW9uYWxJdGVtcy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBpdGVtIGlzIGludmFsaWRcIiwge1xuICAgICAgICAgICAgICBpdGVtOiBpLFxuICAgICAgICAgICAgICBjYXVzZTogZXJyb3IsXG4gICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH0sXG5cbiAgdW5pcXVlSXRlbXMoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSB8fCAhc2NoZW1hLnVuaXF1ZUl0ZW1zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdW5pcXVlID0gbmV3IFNldCgpO1xuXG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGRhdGEpIHtcbiAgICAgIGxldCBpdGVtU3RyO1xuXG4gICAgICAvLyBDaGFuZ2Ugc3RyaW5nIHRvIFwic3RyaW5nXCIgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgaXRlbVN0ciA9IGBzOiR7aXRlbX1gO1xuICAgICAgICAvLyBTb3J0IG9iamVjdCBrZXlzIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlc1xuICAgICAgfSBlbHNlIGlmIChpc09iamVjdChpdGVtKSkge1xuICAgICAgICBpdGVtU3RyID0gYG86JHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhpdGVtKS5zb3J0KChbYV0sIFtiXSkgPT4gYS5sb2NhbGVDb21wYXJlKGIpKVxuICAgICAgICAgIClcbiAgICAgICAgKX1gO1xuICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgIGl0ZW1TdHIgPSBKU09OLnN0cmluZ2lmeShpdGVtKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGl0ZW1TdHIgPSBTdHJpbmcoaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1bmlxdWUuaGFzKGl0ZW1TdHIpKSB7XG4gICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IGl0ZW1zIGFyZSBub3QgdW5pcXVlXCIsIHsgZGF0YTogaXRlbSB9KTtcbiAgICAgIH1cbiAgICAgIHVuaXF1ZS5hZGQoaXRlbVN0cik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGNvbnRhaW5zKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuY29udGFpbnMgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmNvbnRhaW5zKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJBcnJheSBtdXN0IG5vdCBjb250YWluIGFueSBpdGVtc1wiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5jb250YWlucy4kdmFsaWRhdGUoZGF0YVtpXSk7XG4gICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgaXRlbVwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBLZXl3b3JkRnVuY3Rpb24gfSBmcm9tIFwiLi4vaW5kZXhcIjtcblxuZXhwb3J0IGNvbnN0IFN0cmluZ0tleXdvcmRzOiBSZWNvcmQ8c3RyaW5nLCBLZXl3b3JkRnVuY3Rpb24+ID0ge1xuICBtaW5MZW5ndGgoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiB8fCBkYXRhLmxlbmd0aCA+PSBzY2hlbWEubWluTGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgbWF4TGVuZ3RoKHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgfHwgZGF0YS5sZW5ndGggPD0gc2NoZW1hLm1heExlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgcGF0dGVybihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVyblJlZ2V4cCA9IG5ldyBSZWdFeHAoc2NoZW1hLnBhdHRlcm4sIFwidVwiKTtcblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwIGluc3RhbmNlb2YgUmVnRXhwID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb25cIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIGlmIChwYXR0ZXJuUmVnZXhwLnRlc3QoZGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVyblwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhhdCBpZiB3ZSByZWNlaXZlIGEgZm9ybWF0IHRoYXQgaXMgbm90IGRlZmluZWQsIHdlXG4gIC8vIHdpbGwgbm90IHRocm93IGFuIGVycm9yLCB3ZSBqdXN0IGlnbm9yZSBpdC5cbiAgZm9ybWF0KHNjaGVtYSwgZGF0YSwgZGVmaW5lRXJyb3IsIGluc3RhbmNlKSB7XG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybWF0VmFsaWRhdGUgPSBpbnN0YW5jZS5nZXRGb3JtYXQoc2NoZW1hLmZvcm1hdCk7XG4gICAgaWYgKCFmb3JtYXRWYWxpZGF0ZSB8fCBmb3JtYXRWYWxpZGF0ZShkYXRhKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXRcIiwgeyBkYXRhIH0pO1xuICB9XG59O1xuIiwiaW1wb3J0IHsgS2V5d29yZEZ1bmN0aW9uIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBhcmVDbG9zZUVub3VnaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgY29uc3QgTnVtYmVyS2V5d29yZHM6IFJlY29yZDxzdHJpbmcsIEtleXdvcmRGdW5jdGlvbj4gPSB7XG4gIG1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWluID0gc2NoZW1hLm1pbmltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWluID0gc2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gKyAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtID09PSB0cnVlKSB7XG4gICAgICBtaW4gKz0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPCBtaW4pIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGxlc3MgdGhhbiB0aGUgbWluaW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbWF4ID0gc2NoZW1hLm1heGltdW07XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgbWF4ID0gc2NoZW1hLmV4Y2x1c2l2ZU1heGltdW0gLSAxZS0xNTtcbiAgICB9IGVsc2UgaWYgKHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtID09PSB0cnVlKSB7XG4gICAgICBtYXggLT0gMWUtMTU7XG4gICAgfVxuXG4gICAgaWYgKGRhdGEgPiBtYXgpIHtcbiAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bVwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIG11bHRpcGxlT2Yoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgIT09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBxdW90aWVudCA9IGRhdGEgLyBzY2hlbWEubXVsdGlwbGVPZjtcblxuICAgIGlmICghaXNGaW5pdGUocXVvdGllbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFhcmVDbG9zZUVub3VnaChxdW90aWVudCwgTWF0aC5yb3VuZChxdW90aWVudCkpKSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgbXVsdGlwbGVPZlwiLCB7IGRhdGEgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1pbmltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNaW5pbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1pbmltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA8PSBzY2hlbWEuZXhjbHVzaXZlTWluaW11bSArIDFlLTE1KSB7XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGV4Y2x1c2l2ZU1pbmltdW1cIik7XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9LFxuXG4gIGV4Y2x1c2l2ZU1heGltdW0oc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvciwgaW5zdGFuY2UpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZGF0YSAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgdHlwZW9mIHNjaGVtYS5leGNsdXNpdmVNYXhpbXVtICE9PSBcIm51bWJlclwiIHx8XG4gICAgICBcIm1heGltdW1cIiBpbiBzY2hlbWFcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZGF0YSA+PSBzY2hlbWEuZXhjbHVzaXZlTWF4aW11bSkge1xuICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFxuICAgICAgICBcIlZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgZXhjbHVzaXZlTWF4aW11bVwiLFxuICAgICAgICB7IGRhdGEgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cbn07XG4iLCJpbXBvcnQgeyBkZWVwRXF1YWwsIGlzQ29tcGlsZWRTY2hlbWEsIGlzT2JqZWN0IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmltcG9ydCB7IEtleXdvcmRGdW5jdGlvbiB9IGZyb20gXCIuLi9pbmRleFwiO1xuXG5leHBvcnQgY29uc3QgT3RoZXJLZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uPiA9IHtcbiAgZW51bShzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgLy8gQ2hlY2sgaWYgZGF0YSBpcyBhbiBhcnJheSBvciBhbiBvYmplY3RcbiAgICBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBjb25zdCBpc09iamVjdCA9IHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmIGRhdGEgIT09IG51bGw7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNjaGVtYS5lbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBlbnVtSXRlbSA9IHNjaGVtYS5lbnVtW2ldO1xuXG4gICAgICAvLyBTaW1wbGUgZXF1YWxpdHkgY2hlY2tcbiAgICAgIGlmIChlbnVtSXRlbSA9PT0gZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGRhdGEgaXMgYW4gYXJyYXkgb3IgYW4gb2JqZWN0LCBjaGVjayBmb3IgZGVlcCBlcXVhbGl0eVxuICAgICAgaWYgKFxuICAgICAgICAoaXNBcnJheSAmJiBBcnJheS5pc0FycmF5KGVudW1JdGVtKSkgfHxcbiAgICAgICAgKGlzT2JqZWN0ICYmIHR5cGVvZiBlbnVtSXRlbSA9PT0gXCJvYmplY3RcIiAmJiBlbnVtSXRlbSAhPT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBpZiAoZGVlcEVxdWFsKGVudW1JdGVtLCBkYXRhKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgdmFsdWVzXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBhbGxPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYWxsT2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYWxsT2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFsbE9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFsbE9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICBpZiAoQm9vbGVhbihkYXRhKSAhPT0gc2NoZW1hLmFsbE9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEgIT09IHNjaGVtYS5hbGxPZltpXSkge1xuICAgICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybjtcbiAgfSxcblxuICBhbnlPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY2hlbWEuYW55T2YubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChpc09iamVjdChzY2hlbWEuYW55T2ZbaV0pKSB7XG4gICAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5hbnlPZltpXSkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmFueU9mW2ldLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hLmFueU9mW2ldID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIGlmIChCb29sZWFuKGRhdGEpID09PSBzY2hlbWEuYW55T2ZbaV0pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGF0YSA9PT0gc2NoZW1hLmFueU9mW2ldKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgfSxcblxuICBvbmVPZihzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgbGV0IHZhbGlkQ291bnQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLm9uZU9mLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm9uZU9mW2ldKSkge1xuICAgICAgICBpZiAoXCIkdmFsaWRhdGVcIiBpbiBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICBjb25zdCBlcnJvciA9IHNjaGVtYS5vbmVPZltpXS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWEub25lT2ZbaV0gPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgaWYgKEJvb2xlYW4oZGF0YSkgPT09IHNjaGVtYS5vbmVPZltpXSkge1xuICAgICAgICAgICAgdmFsaWRDb3VudCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkYXRhID09PSBzY2hlbWEub25lT2ZbaV0pIHtcbiAgICAgICAgICB2YWxpZENvdW50Kys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRDb3VudCA9PT0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgY29uc3Qoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcbiAgICAgIGRhdGEgPT09IHNjaGVtYS5jb25zdCB8fFxuICAgICAgKGlzT2JqZWN0KGRhdGEpICYmXG4gICAgICAgIGlzT2JqZWN0KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpIHx8XG4gICAgICAoQXJyYXkuaXNBcnJheShkYXRhKSAmJlxuICAgICAgICBBcnJheS5pc0FycmF5KHNjaGVtYS5jb25zdCkgJiZcbiAgICAgICAgZGVlcEVxdWFsKGRhdGEsIHNjaGVtYS5jb25zdCkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH0sXG5cbiAgaWYoc2NoZW1hLCBkYXRhLCBkZWZpbmVFcnJvcikge1xuICAgIGlmIChcInRoZW5cIiBpbiBzY2hlbWEgPT09IGZhbHNlICYmIFwiZWxzZVwiIGluIHNjaGVtYSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEuaWYgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICBpZiAoc2NoZW1hLmlmKSB7XG4gICAgICAgIGlmIChpc0NvbXBpbGVkU2NoZW1hKHNjaGVtYS50aGVuKSkge1xuICAgICAgICAgIHJldHVybiBzY2hlbWEudGhlbi4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEuZWxzZSkpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS5lbHNlLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmlmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVycm9yID0gc2NoZW1hLmlmLiR2YWxpZGF0ZShkYXRhKTtcbiAgICBpZiAoIWVycm9yKSB7XG4gICAgICBpZiAoaXNDb21waWxlZFNjaGVtYShzY2hlbWEudGhlbikpIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYS50aGVuLiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzQ29tcGlsZWRTY2hlbWEoc2NoZW1hLmVsc2UpKSB7XG4gICAgICAgIHJldHVybiBzY2hlbWEuZWxzZS4kdmFsaWRhdGUoZGF0YSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9LFxuXG4gIG5vdChzY2hlbWEsIGRhdGEsIGRlZmluZUVycm9yKSB7XG4gICAgaWYgKHR5cGVvZiBzY2hlbWEubm90ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgaWYgKHNjaGVtYS5ub3QpIHtcbiAgICAgICAgcmV0dXJuIGRlZmluZUVycm9yKFwiVmFsdWUgaXMgbm90IHZhbGlkXCIsIHsgZGF0YSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Qoc2NoZW1hLm5vdCkpIHtcbiAgICAgIGlmIChcIiR2YWxpZGF0ZVwiIGluIHNjaGVtYS5ub3QpIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBzY2hlbWEubm90LiR2YWxpZGF0ZShkYXRhKTtcbiAgICAgICAgaWYgKCFlcnJvcikge1xuICAgICAgICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGNhdXNlOiBlcnJvciwgZGF0YSB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVmaW5lRXJyb3IoXCJWYWx1ZSBpcyBub3QgdmFsaWRcIiwgeyBkYXRhIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBkZWZpbmVFcnJvcihcIlZhbHVlIGlzIG5vdCB2YWxpZFwiLCB7IGRhdGEgfSk7XG4gIH1cbn07XG4iLCJpbXBvcnQge1xuICBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIGRlZXBDbG9uZSxcbiAgZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXksXG4gIGdldE5hbWVkRnVuY3Rpb24sXG4gIGlzT2JqZWN0XG59IGZyb20gXCIuL3V0aWxzXCI7XG5cbmltcG9ydCB7IEZvcm1hdHMgfSBmcm9tIFwiLi9mb3JtYXRzXCI7XG5pbXBvcnQgeyBUeXBlcyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBrZXl3b3JkcyB9IGZyb20gXCIuL2tleXdvcmRzXCI7XG5cbmV4cG9ydCB0eXBlIFJlc3VsdCA9IHZvaWQgfCBWYWxpZGF0aW9uRXJyb3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2V5d29yZEZ1bmN0aW9uIHtcbiAgKFxuICAgIHNjaGVtYTogQ29tcGlsZWRTY2hlbWEsXG4gICAgZGF0YTogYW55LFxuICAgIGRlZmluZUVycm9yOiBEZWZpbmVFcnJvckZ1bmN0aW9uLFxuICAgIGluc3RhbmNlOiBTY2hlbWFTaGllbGRcbiAgKTogUmVzdWx0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFR5cGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdEZ1bmN0aW9uIHtcbiAgKGRhdGE6IGFueSk6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGVGdW5jdGlvbiB7XG4gIChkYXRhOiBhbnkpOiBSZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcGlsZWRTY2hlbWEge1xuICAkdmFsaWRhdGU/OiBWYWxpZGF0ZUZ1bmN0aW9uO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdG9yIHtcbiAgKGRhdGE6IGFueSk6IHsgZGF0YTogYW55OyBlcnJvcjogVmFsaWRhdGlvbkVycm9yIHwgbnVsbDsgdmFsaWQ6IGJvb2xlYW4gfTtcbiAgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hO1xufVxuXG5leHBvcnQgY2xhc3MgU2NoZW1hU2hpZWxkIHtcbiAgcHJpdmF0ZSB0eXBlczogUmVjb3JkPHN0cmluZywgVHlwZUZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgZm9ybWF0czogUmVjb3JkPHN0cmluZywgRm9ybWF0RnVuY3Rpb24gfCBmYWxzZT4gPSB7fTtcbiAgcHJpdmF0ZSBrZXl3b3JkczogUmVjb3JkPHN0cmluZywgS2V5d29yZEZ1bmN0aW9uIHwgZmFsc2U+ID0ge307XG4gIHByaXZhdGUgaW1tdXRhYmxlID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGltbXV0YWJsZSA9IGZhbHNlXG4gIH06IHtcbiAgICBpbW11dGFibGU/OiBib29sZWFuO1xuICB9ID0ge30pIHtcbiAgICB0aGlzLmltbXV0YWJsZSA9IGltbXV0YWJsZTtcblxuICAgIGZvciAoY29uc3QgW3R5cGUsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoVHlwZXMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkVHlwZSh0eXBlLCB2YWxpZGF0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2tleXdvcmQsIHZhbGlkYXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5d29yZHMpKSB7XG4gICAgICB0aGlzLmFkZEtleXdvcmQoa2V5d29yZCwgdmFsaWRhdG9yIGFzIEtleXdvcmRGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbZm9ybWF0LCB2YWxpZGF0b3JdIG9mIE9iamVjdC5lbnRyaWVzKEZvcm1hdHMpKSB7XG4gICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgIHRoaXMuYWRkRm9ybWF0KGZvcm1hdCwgdmFsaWRhdG9yIGFzIEZvcm1hdEZ1bmN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhZGRUeXBlKG5hbWU6IHN0cmluZywgdmFsaWRhdG9yOiBUeXBlRnVuY3Rpb24sIG92ZXJ3cml0ZSA9IGZhbHNlKSB7XG4gICAgaWYgKHRoaXMudHlwZXNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgVHlwZSBcIiR7bmFtZX1cIiBhbHJlYWR5IGV4aXN0c2ApO1xuICAgIH1cbiAgICB0aGlzLnR5cGVzW25hbWVdID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgZ2V0VHlwZSh0eXBlOiBzdHJpbmcpOiBUeXBlRnVuY3Rpb24gfCBmYWxzZSB7XG4gICAgcmV0dXJuIHRoaXMudHlwZXNbdHlwZV07XG4gIH1cblxuICBhZGRGb3JtYXQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEZvcm1hdEZ1bmN0aW9uLCBvdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmZvcm1hdHNbbmFtZV0gJiYgIW92ZXJ3cml0ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgRm9ybWF0IFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybWF0c1tuYW1lXSA9IHZhbGlkYXRvcjtcbiAgfVxuXG4gIGdldEZvcm1hdChmb3JtYXQ6IHN0cmluZyk6IEZvcm1hdEZ1bmN0aW9uIHwgZmFsc2Uge1xuICAgIHJldHVybiB0aGlzLmZvcm1hdHNbZm9ybWF0XTtcbiAgfVxuXG4gIGFkZEtleXdvcmQobmFtZTogc3RyaW5nLCB2YWxpZGF0b3I6IEtleXdvcmRGdW5jdGlvbiwgb3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy5rZXl3b3Jkc1tuYW1lXSAmJiAhb3ZlcndyaXRlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGBLZXl3b3JkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgfVxuICAgIHRoaXMua2V5d29yZHNbbmFtZV0gPSB2YWxpZGF0b3I7XG4gIH1cblxuICBnZXRLZXl3b3JkKGtleXdvcmQ6IHN0cmluZyk6IEtleXdvcmRGdW5jdGlvbiB8IGZhbHNlIHtcbiAgICByZXR1cm4gdGhpcy5rZXl3b3Jkc1trZXl3b3JkXTtcbiAgfVxuXG4gIGNvbXBpbGUoc2NoZW1hOiBhbnkpOiBWYWxpZGF0b3Ige1xuICAgIGNvbnN0IGNvbXBpbGVkU2NoZW1hID0gdGhpcy5jb21waWxlU2NoZW1hKHNjaGVtYSk7XG4gICAgaWYgKCFjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgIGlmICh0aGlzLmlzU2NoZW1hTGlrZShzY2hlbWEpID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFwiSW52YWxpZCBzY2hlbWFcIik7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hLiR2YWxpZGF0ZSA9IGdldE5hbWVkRnVuY3Rpb248VmFsaWRhdGVGdW5jdGlvbj4oXG4gICAgICAgIFwiYW55XCIsXG4gICAgICAgICgpID0+IHt9XG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbGlkYXRlOiBWYWxpZGF0b3IgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICBjb25zdCBjbG9uZWREYXRhID0gdGhpcy5pbW11dGFibGUgPyBkZWVwQ2xvbmUoZGF0YSkgOiBkYXRhO1xuICAgICAgY29uc3QgZXJyb3IgPSBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUoY2xvbmVkRGF0YSk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGE6IGNsb25lZERhdGEsXG4gICAgICAgIGVycm9yOiBlcnJvciA/IGVycm9yIDogbnVsbCxcbiAgICAgICAgdmFsaWQ6ICFlcnJvclxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgdmFsaWRhdGUuY29tcGlsZWRTY2hlbWEgPSBjb21waWxlZFNjaGVtYTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgY29tcGlsZVNjaGVtYShzY2hlbWE6IFBhcnRpYWw8Q29tcGlsZWRTY2hlbWE+IHwgYW55KTogQ29tcGlsZWRTY2hlbWEge1xuICAgIGlmICghaXNPYmplY3Qoc2NoZW1hKSkge1xuICAgICAgaWYgKHNjaGVtYSA9PT0gdHJ1ZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgYW55T2Y6IFt7fV1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAoc2NoZW1hID09PSBmYWxzZSkge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtdXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzY2hlbWEgPSB7XG4gICAgICAgICAgb25lT2Y6IFtzY2hlbWFdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsZWRTY2hlbWE6IENvbXBpbGVkU2NoZW1hID0gZGVlcENsb25lKHNjaGVtYSkgYXMgQ29tcGlsZWRTY2hlbWE7XG4gICAgY29uc3QgZGVmaW5lVHlwZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoXCJ0eXBlXCIsIHNjaGVtYSk7XG4gICAgY29uc3QgdHlwZVZhbGlkYXRpb25zOiBUeXBlRnVuY3Rpb25bXSA9IFtdO1xuXG4gICAgbGV0IG1ldGhvZE5hbWUgPSBcIlwiO1xuXG4gICAgaWYgKFwidHlwZVwiIGluIHNjaGVtYSkge1xuICAgICAgY29uc3QgdHlwZXMgPSBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKVxuICAgICAgICA/IHNjaGVtYS50eXBlXG4gICAgICAgIDogc2NoZW1hLnR5cGUuc3BsaXQoXCIsXCIpLm1hcCgodCkgPT4gdC50cmltKCkpO1xuXG4gICAgICBmb3IgKGNvbnN0IHR5cGUgb2YgdHlwZXMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy5nZXRUeXBlKHR5cGUpO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgdHlwZVZhbGlkYXRpb25zLnB1c2godmFsaWRhdG9yKTtcbiAgICAgICAgICBtZXRob2ROYW1lICs9IChtZXRob2ROYW1lID8gXCJfT1JfXCIgOiBcIlwiKSArIHZhbGlkYXRvci5uYW1lO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9IHR5cGVWYWxpZGF0aW9ucy5sZW5ndGg7XG5cbiAgICAgIGlmICh0eXBlVmFsaWRhdGlvbnNMZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgZGVmaW5lVHlwZUVycm9yKFwiSW52YWxpZCB0eXBlIGZvciBzY2hlbWFcIiwgeyBkYXRhOiBzY2hlbWEudHlwZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc0xlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb25zdCB0eXBlVmFsaWRhdGlvbiA9IHR5cGVWYWxpZGF0aW9uc1swXTtcbiAgICAgICAgY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlID0gZ2V0TmFtZWRGdW5jdGlvbjxWYWxpZGF0ZUZ1bmN0aW9uPihcbiAgICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXR5cGVWYWxpZGF0aW9uKGRhdGEpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlRXJyb3IoXCJJbnZhbGlkIHR5cGVcIiwgeyBkYXRhIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVZhbGlkYXRpb25zTGVuZ3RoID4gMSkge1xuICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVZhbGlkYXRpb25zTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVWYWxpZGF0aW9uc1tpXShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRlZmluZVR5cGVFcnJvcihcIkludmFsaWQgdHlwZVwiLCB7IGRhdGEgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHNjaGVtYSkpIHtcbiAgICAgIGlmIChrZXkgPT09IFwidHlwZVwiKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hLnR5cGUgPSBzY2hlbWEudHlwZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGtleXdvcmRWYWxpZGF0b3IgPSB0aGlzLmdldEtleXdvcmQoa2V5KTtcbiAgICAgIGlmIChrZXl3b3JkVmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IGRlZmluZUVycm9yID0gZ2V0RGVmaW5lZEVycm9yRnVuY3Rpb25Gb3JLZXkoa2V5LCBzY2hlbWFba2V5XSk7XG4gICAgICAgIGlmIChjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUpIHtcbiAgICAgICAgICBjb25zdCBwcmV2VmFsaWRhdG9yID0gY29tcGlsZWRTY2hlbWEuJHZhbGlkYXRlO1xuICAgICAgICAgIG1ldGhvZE5hbWUgKz0gYF9BTkRfJHtrZXl3b3JkVmFsaWRhdG9yLm5hbWV9YDtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcHJldlZhbGlkYXRvcihkYXRhKTtcbiAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbWV0aG9kTmFtZSA9IGtleXdvcmRWYWxpZGF0b3IubmFtZTtcbiAgICAgICAgICBjb21waWxlZFNjaGVtYS4kdmFsaWRhdGUgPSBnZXROYW1lZEZ1bmN0aW9uPFZhbGlkYXRlRnVuY3Rpb24+KFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICAgIChkYXRhKSA9PlxuICAgICAgICAgICAgICAoa2V5d29yZFZhbGlkYXRvciBhcyBLZXl3b3JkRnVuY3Rpb24pKFxuICAgICAgICAgICAgICAgIGNvbXBpbGVkU2NoZW1hLFxuICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgZGVmaW5lRXJyb3IsXG4gICAgICAgICAgICAgICAgdGhpc1xuICAgICAgICAgICAgICApXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNPYmplY3Qoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIC8vIElmIHRoZSBrZXkgaXMgcHJvcGVydGllcyBnbyB0aHJvdWdoIGVhY2ggcHJvcGVydHkgYW5kIHRyeSB0byBjb21waWxlIGl0IGFzIGEgc2NoZW1hXG4gICAgICAgIGlmIChrZXkgPT09IFwicHJvcGVydGllc1wiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBzdWJLZXkgb2YgT2JqZWN0LmtleXMoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgICAgICBjb21waWxlZFNjaGVtYVtrZXldW3N1YktleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoXG4gICAgICAgICAgICAgIHNjaGVtYVtrZXldW3N1YktleV1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSB0aGlzLmNvbXBpbGVTY2hlbWEoc2NoZW1hW2tleV0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hW2tleV0pKSB7XG4gICAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XS5tYXAoKHN1YlNjaGVtYSwgaW5kZXgpID0+XG4gICAgICAgICAgdGhpcy5pc1NjaGVtYUxpa2Uoc3ViU2NoZW1hKVxuICAgICAgICAgICAgPyB0aGlzLmNvbXBpbGVTY2hlbWEoc3ViU2NoZW1hKVxuICAgICAgICAgICAgOiBzdWJTY2hlbWFcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbXBpbGVkU2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcGlsZWRTY2hlbWEgYXMgQ29tcGlsZWRTY2hlbWE7XG4gIH1cblxuICBpc1NjaGVtYUxpa2Uoc3ViU2NoZW1hOiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAoaXNPYmplY3Qoc3ViU2NoZW1hKSkge1xuICAgICAgaWYgKFwidHlwZVwiIGluIHN1YlNjaGVtYSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgc3ViS2V5IGluIHN1YlNjaGVtYSkge1xuICAgICAgICBpZiAoc3ViS2V5IGluIHRoaXMua2V5d29yZHMpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ik1BWU8sSUFBTUEsRUFBTixjQUE4QkMsTUFDbkNDLFFBQ0FDLEtBQ0FDLFFBQ0FDLE1BQ0FDLFdBQXFCLEdBQ3JCQyxhQUF1QixHQUN2QkMsS0FDQUMsT0FFUUMsVUFBVUMsRUFBVSxJQUFLQyxFQUFrQixLQUNqRCxJQUFJTixFQUFhLEdBQUdLLEtBQVdFLEtBQUtULFVBQ2hDRyxFQUFlLEdBQUdLLElBWXRCLFlBWHlCLElBQWRDLEtBQUtWLE9BQ1csaUJBQWRVLEtBQUtWLE1BQXFCVSxLQUFLVixRQUFRVSxLQUFLSixTQUNyREgsR0FBYyxJQUFJTyxLQUFLVixRQUV6QkksR0FBZ0IsSUFBSU0sS0FBS1YsUUFHM0JVLEtBQUtOLGFBQWVBLEVBQ3BCTSxLQUFLUCxXQUFhQSxFQUdiTyxLQUFLUixPQUFXUSxLQUFLUixpQkFBaUJMLEVBSXBDYSxLQUFLUixNQUFNSyxVQUFVSixFQUFZQyxHQUgvQk0sSUFJWCxDQUVBQyxXQUNFLE9BQU9ELEtBQUtILFdBQ2QsQ0FFUUssV0FDTixNQUFNQyxFQUFrQixDQUN0QmQsUUFBU1csS0FBS1gsUUFDZEUsUUFBU1MsS0FBS1QsUUFDZEQsS0FBTVUsS0FB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
|
package/dist/index.mjs
CHANGED
|
@@ -4,20 +4,54 @@ var ValidationError = class extends Error {
|
|
|
4
4
|
item;
|
|
5
5
|
keyword;
|
|
6
6
|
cause;
|
|
7
|
-
|
|
7
|
+
schemaPath = "";
|
|
8
|
+
instancePath = "";
|
|
8
9
|
data;
|
|
9
10
|
schema;
|
|
10
|
-
_getCause(pointer = "#") {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
_getCause(pointer = "#", instancePointer = "#") {
|
|
12
|
+
let schemaPath = `${pointer}/${this.keyword}`;
|
|
13
|
+
let instancePath = `${instancePointer}`;
|
|
14
|
+
if (typeof this.item !== "undefined") {
|
|
15
|
+
if (typeof this.item === "string" && this.item in this.schema) {
|
|
16
|
+
schemaPath += `/${this.item}`;
|
|
17
|
+
}
|
|
18
|
+
instancePath += `/${this.item}`;
|
|
19
|
+
}
|
|
20
|
+
this.instancePath = instancePath;
|
|
21
|
+
this.schemaPath = schemaPath;
|
|
22
|
+
if (!this.cause || !(this.cause instanceof ValidationError)) {
|
|
14
23
|
return this;
|
|
15
24
|
}
|
|
16
|
-
return this.cause._getCause(
|
|
25
|
+
return this.cause._getCause(schemaPath, instancePath);
|
|
17
26
|
}
|
|
18
27
|
getCause() {
|
|
19
28
|
return this._getCause();
|
|
20
29
|
}
|
|
30
|
+
_getTree() {
|
|
31
|
+
const tree = {
|
|
32
|
+
message: this.message,
|
|
33
|
+
keyword: this.keyword,
|
|
34
|
+
item: this.item,
|
|
35
|
+
schemaPath: this.schemaPath,
|
|
36
|
+
instancePath: this.instancePath,
|
|
37
|
+
data: this.data
|
|
38
|
+
};
|
|
39
|
+
if (this.cause) {
|
|
40
|
+
tree.cause = this.cause._getTree();
|
|
41
|
+
}
|
|
42
|
+
return tree;
|
|
43
|
+
}
|
|
44
|
+
getTree() {
|
|
45
|
+
this.getCause();
|
|
46
|
+
return this._getTree();
|
|
47
|
+
}
|
|
48
|
+
getPath() {
|
|
49
|
+
const cause = this.getCause();
|
|
50
|
+
return {
|
|
51
|
+
schemaPath: cause.schemaPath,
|
|
52
|
+
instancePath: cause.instancePath
|
|
53
|
+
};
|
|
54
|
+
}
|
|
21
55
|
};
|
|
22
56
|
function getDefinedErrorFunctionForKey(key, schema) {
|
|
23
57
|
const KeywordError = new ValidationError(`Invalid ${key}`);
|
|
@@ -1102,7 +1136,7 @@ var SchemaShield = class {
|
|
|
1102
1136
|
};
|
|
1103
1137
|
}
|
|
1104
1138
|
}
|
|
1105
|
-
const compiledSchema =
|
|
1139
|
+
const compiledSchema = deepClone(schema);
|
|
1106
1140
|
const defineTypeError = getDefinedErrorFunctionForKey("type", schema);
|
|
1107
1141
|
const typeValidations = [];
|
|
1108
1142
|
let methodName = "";
|
|
@@ -1183,6 +1217,14 @@ var SchemaShield = class {
|
|
|
1183
1217
|
}
|
|
1184
1218
|
}
|
|
1185
1219
|
if (isObject(schema[key])) {
|
|
1220
|
+
if (key === "properties") {
|
|
1221
|
+
for (const subKey of Object.keys(schema[key])) {
|
|
1222
|
+
compiledSchema[key][subKey] = this.compileSchema(
|
|
1223
|
+
schema[key][subKey]
|
|
1224
|
+
);
|
|
1225
|
+
}
|
|
1226
|
+
continue;
|
|
1227
|
+
}
|
|
1186
1228
|
compiledSchema[key] = this.compileSchema(schema[key]);
|
|
1187
1229
|
continue;
|
|
1188
1230
|
}
|
package/dist/utils.d.ts
CHANGED
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
import { CompiledSchema } from "./index";
|
|
2
|
+
interface ErrorTree {
|
|
3
|
+
message: string;
|
|
4
|
+
keyword: string;
|
|
5
|
+
item?: string | number;
|
|
6
|
+
schemaPath: string;
|
|
7
|
+
instancePath: string;
|
|
8
|
+
data?: any;
|
|
9
|
+
cause?: ErrorTree;
|
|
10
|
+
}
|
|
2
11
|
export declare class ValidationError extends Error {
|
|
3
12
|
message: string;
|
|
4
|
-
item
|
|
13
|
+
item?: string | number;
|
|
5
14
|
keyword: string;
|
|
6
|
-
cause
|
|
7
|
-
|
|
15
|
+
cause?: ValidationError;
|
|
16
|
+
schemaPath: string;
|
|
17
|
+
instancePath: string;
|
|
8
18
|
data?: any;
|
|
9
19
|
schema?: CompiledSchema;
|
|
10
20
|
private _getCause;
|
|
11
|
-
getCause():
|
|
21
|
+
getCause(): ValidationError;
|
|
22
|
+
private _getTree;
|
|
23
|
+
getTree(): ErrorTree;
|
|
24
|
+
getPath(): {
|
|
25
|
+
schemaPath: string;
|
|
26
|
+
instancePath: string;
|
|
27
|
+
};
|
|
12
28
|
}
|
|
13
29
|
export interface DefineErrorOptions {
|
|
14
30
|
item?: any;
|
|
@@ -26,4 +42,5 @@ export declare function getUTF16Length(str: any): number;
|
|
|
26
42
|
export declare function deepClone(obj: any): any;
|
|
27
43
|
export declare function isCompiledSchema(subSchema: any): subSchema is CompiledSchema;
|
|
28
44
|
export declare function getNamedFunction<T>(name: string, fn: T): T;
|
|
45
|
+
export {};
|
|
29
46
|
//# sourceMappingURL=utils.d.ts.map
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,qBAAa,eAAgB,SAAQ,KAAK;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED,qBAAa,eAAgB,SAAQ,KAAK;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAM;IACxB,YAAY,EAAE,MAAM,CAAM;IAC1B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,cAAc,CAAC;IAExB,OAAO,CAAC,SAAS;IAqBjB,QAAQ,IAAI,eAAe;IAI3B,OAAO,CAAC,QAAQ;IAiBhB,OAAO,IAAI,SAAS;IAKpB,OAAO;;;;CAOR;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,eAAe,CAAC;CAClE;AAED,wBAAgB,6BAA6B,CAC3C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,cAAc,uBAkBvB;AAED,wBAAgB,SAAS,CACvB,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACrC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,WAoCxC;AAED,wBAAgB,QAAQ,CAAC,IAAI,KAAA,WAE5B;AAED,wBAAgB,cAAc,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA,EAAE,OAAO,SAAQ,WAEnD;AAED,wBAAgB,cAAc,CAAC,GAAG,KAAA,UAUjC;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAyBvC;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,GAAG,GAAG,SAAS,IAAI,cAAc,CAE5E;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAE1D"}
|
package/lib/index.ts
CHANGED
|
@@ -153,7 +153,7 @@ export class SchemaShield {
|
|
|
153
153
|
}
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
const compiledSchema: CompiledSchema =
|
|
156
|
+
const compiledSchema: CompiledSchema = deepClone(schema) as CompiledSchema;
|
|
157
157
|
const defineTypeError = getDefinedErrorFunctionForKey("type", schema);
|
|
158
158
|
const typeValidations: TypeFunction[] = [];
|
|
159
159
|
|
|
@@ -246,6 +246,15 @@ export class SchemaShield {
|
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
if (isObject(schema[key])) {
|
|
249
|
+
// If the key is properties go through each property and try to compile it as a schema
|
|
250
|
+
if (key === "properties") {
|
|
251
|
+
for (const subKey of Object.keys(schema[key])) {
|
|
252
|
+
compiledSchema[key][subKey] = this.compileSchema(
|
|
253
|
+
schema[key][subKey]
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
249
258
|
compiledSchema[key] = this.compileSchema(schema[key]);
|
|
250
259
|
continue;
|
|
251
260
|
}
|
package/lib/utils.ts
CHANGED
|
@@ -1,36 +1,83 @@
|
|
|
1
1
|
import { CompiledSchema } from "./index";
|
|
2
2
|
|
|
3
|
+
interface ErrorTree {
|
|
4
|
+
message: string;
|
|
5
|
+
keyword: string;
|
|
6
|
+
item?: string | number;
|
|
7
|
+
schemaPath: string;
|
|
8
|
+
instancePath: string;
|
|
9
|
+
data?: any;
|
|
10
|
+
cause?: ErrorTree;
|
|
11
|
+
}
|
|
12
|
+
|
|
3
13
|
export class ValidationError extends Error {
|
|
4
14
|
message: string;
|
|
5
|
-
item
|
|
15
|
+
item?: string | number;
|
|
6
16
|
keyword: string;
|
|
7
|
-
cause
|
|
8
|
-
|
|
17
|
+
cause?: ValidationError;
|
|
18
|
+
schemaPath: string = "";
|
|
19
|
+
instancePath: string = "";
|
|
9
20
|
data?: any;
|
|
10
21
|
schema?: CompiledSchema;
|
|
11
22
|
|
|
12
|
-
private _getCause(pointer = "#") {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
this.
|
|
17
|
-
|
|
23
|
+
private _getCause(pointer = "#", instancePointer = "#"): ValidationError {
|
|
24
|
+
let schemaPath = `${pointer}/${this.keyword}`;
|
|
25
|
+
let instancePath = `${instancePointer}`;
|
|
26
|
+
if (typeof this.item !== "undefined") {
|
|
27
|
+
if (typeof this.item === "string" && this.item in this.schema) {
|
|
28
|
+
schemaPath += `/${this.item}`;
|
|
29
|
+
}
|
|
30
|
+
instancePath += `/${this.item}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
this.instancePath = instancePath;
|
|
34
|
+
this.schemaPath = schemaPath;
|
|
18
35
|
|
|
19
|
-
|
|
20
|
-
|
|
36
|
+
// If there is no cause or the cause is not a ValidationError, return this
|
|
37
|
+
if (!this.cause || !(this.cause instanceof ValidationError)) {
|
|
21
38
|
return this;
|
|
22
39
|
}
|
|
23
40
|
|
|
24
|
-
return this.cause._getCause(
|
|
41
|
+
return this.cause._getCause(schemaPath, instancePath);
|
|
25
42
|
}
|
|
26
43
|
|
|
27
|
-
getCause() {
|
|
44
|
+
getCause(): ValidationError {
|
|
28
45
|
return this._getCause();
|
|
29
46
|
}
|
|
47
|
+
|
|
48
|
+
private _getTree(): ErrorTree {
|
|
49
|
+
const tree: ErrorTree = {
|
|
50
|
+
message: this.message,
|
|
51
|
+
keyword: this.keyword,
|
|
52
|
+
item: this.item,
|
|
53
|
+
schemaPath: this.schemaPath,
|
|
54
|
+
instancePath: this.instancePath,
|
|
55
|
+
data: this.data
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
if (this.cause) {
|
|
59
|
+
tree.cause = this.cause._getTree();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return tree;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
getTree(): ErrorTree {
|
|
66
|
+
this.getCause();
|
|
67
|
+
return this._getTree();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
getPath() {
|
|
71
|
+
const cause = this.getCause();
|
|
72
|
+
return {
|
|
73
|
+
schemaPath: cause.schemaPath,
|
|
74
|
+
instancePath: cause.instancePath
|
|
75
|
+
};
|
|
76
|
+
}
|
|
30
77
|
}
|
|
31
78
|
|
|
32
79
|
export interface DefineErrorOptions {
|
|
33
|
-
item?: any; // Final item in the
|
|
80
|
+
item?: any; // Final item in the schemaPath
|
|
34
81
|
cause?: ValidationError; // Cause of the error
|
|
35
82
|
data?: any; // Data that caused the error
|
|
36
83
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "schema-shield",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "A fast library that protects your JSON schema from invalid data.",
|
|
5
5
|
"repository": "git@github.com:Masquerade-Circus/schema-shield.git",
|
|
6
6
|
"author": "Masquerade <christian@masquerade-circus.net>",
|
|
@@ -89,6 +89,7 @@
|
|
|
89
89
|
"@release-it/conventional-changelog": "^5.1.1",
|
|
90
90
|
"@typescript-eslint/eslint-plugin": "^5.56.0",
|
|
91
91
|
"@typescript-eslint/parser": "^5.56.0",
|
|
92
|
+
"ajv": "^8.12.0",
|
|
92
93
|
"cz-conventional-changelog": "^3.3.0",
|
|
93
94
|
"esbuild": "^0.17.12",
|
|
94
95
|
"eslint": "^8.36.0",
|