@decaf-ts/core 0.5.0 → 0.5.2
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/LICENSE.md +21 -157
- package/README.md +652 -15
- package/dist/core.cjs +2638 -1085
- package/dist/core.esm.cjs +2636 -1070
- package/lib/esm/identity/decorators.d.ts +52 -14
- package/lib/esm/identity/decorators.js +54 -16
- package/lib/esm/identity/utils.d.ts +20 -1
- package/lib/esm/identity/utils.js +22 -2
- package/lib/esm/index.d.ts +11 -15
- package/lib/esm/index.js +17 -19
- package/lib/esm/interfaces/ErrorParser.d.ts +12 -0
- package/lib/esm/interfaces/ErrorParser.js +1 -1
- package/lib/esm/interfaces/Executor.d.ts +10 -13
- package/lib/esm/interfaces/Executor.js +1 -1
- package/lib/esm/interfaces/Observable.d.ts +20 -18
- package/lib/esm/interfaces/Observable.js +1 -1
- package/lib/esm/interfaces/Observer.d.ts +7 -8
- package/lib/esm/interfaces/Observer.js +1 -1
- package/lib/esm/interfaces/Paginatable.d.ts +18 -2
- package/lib/esm/interfaces/Paginatable.js +1 -1
- package/lib/esm/interfaces/Queriable.d.ts +44 -3
- package/lib/esm/interfaces/Queriable.js +1 -1
- package/lib/esm/interfaces/RawExecutor.d.ts +10 -13
- package/lib/esm/interfaces/RawExecutor.js +1 -1
- package/lib/esm/interfaces/SequenceOptions.d.ts +50 -5
- package/lib/esm/interfaces/SequenceOptions.js +19 -1
- package/lib/esm/interfaces/index.d.ts +0 -1
- package/lib/esm/interfaces/index.js +1 -2
- package/lib/esm/model/BaseModel.d.ts +31 -0
- package/lib/esm/model/BaseModel.js +24 -1
- package/lib/esm/model/construction.d.ts +442 -9
- package/lib/esm/model/construction.js +441 -2
- package/lib/esm/model/decorators.d.ts +166 -42
- package/lib/esm/model/decorators.js +161 -37
- package/lib/esm/model/index.js +1 -2
- package/lib/esm/model/types.d.ts +9 -0
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/persistence/Adapter.d.ts +384 -40
- package/lib/esm/persistence/Adapter.js +415 -59
- package/lib/esm/persistence/Dispatch.d.ts +131 -0
- package/lib/esm/persistence/Dispatch.js +187 -0
- package/lib/esm/persistence/ObserverHandler.d.ts +109 -0
- package/lib/esm/persistence/ObserverHandler.js +137 -0
- package/lib/esm/persistence/Sequence.d.ts +89 -8
- package/lib/esm/persistence/Sequence.js +91 -1
- package/lib/esm/persistence/constants.d.ts +22 -5
- package/lib/esm/persistence/constants.js +23 -7
- package/lib/esm/persistence/decorators.d.ts +10 -0
- package/lib/esm/persistence/decorators.js +11 -1
- package/lib/esm/persistence/errors.d.ts +23 -3
- package/lib/esm/persistence/errors.js +25 -7
- package/lib/esm/persistence/index.d.ts +3 -0
- package/lib/esm/persistence/index.js +4 -1
- package/lib/esm/persistence/types.d.ts +21 -0
- package/lib/esm/persistence/types.js +2 -0
- package/lib/esm/query/Condition.d.ts +88 -44
- package/lib/esm/query/Condition.js +144 -62
- package/lib/esm/query/Paginator.d.ts +67 -10
- package/lib/esm/query/Paginator.js +64 -10
- package/lib/esm/query/Statement.d.ts +82 -47
- package/lib/esm/query/Statement.js +175 -122
- package/lib/esm/query/constants.d.ts +25 -64
- package/lib/esm/query/constants.js +26 -68
- package/lib/esm/query/errors.d.ts +14 -0
- package/lib/esm/query/errors.js +15 -1
- package/lib/esm/query/index.d.ts +0 -5
- package/lib/esm/query/index.js +1 -6
- package/lib/esm/query/options.d.ts +69 -178
- package/lib/esm/query/options.js +1 -1
- package/lib/esm/query/selectors.d.ts +20 -24
- package/lib/esm/query/selectors.js +1 -1
- package/lib/esm/ram/RamAdapter.d.ts +322 -20
- package/lib/esm/ram/RamAdapter.js +360 -140
- package/lib/esm/ram/RamContext.d.ts +16 -1
- package/lib/esm/ram/RamContext.js +18 -3
- package/lib/esm/ram/RamPaginator.d.ts +51 -6
- package/lib/esm/ram/RamPaginator.js +58 -6
- package/lib/esm/ram/RamSequence.d.ts +49 -24
- package/lib/esm/ram/RamSequence.js +52 -40
- package/lib/esm/ram/RamStatement.d.ts +84 -6
- package/lib/esm/ram/RamStatement.js +175 -6
- package/lib/esm/ram/constants.d.ts +9 -0
- package/lib/esm/ram/constants.js +10 -0
- package/lib/esm/ram/handlers.d.ts +25 -0
- package/lib/esm/ram/handlers.js +27 -0
- package/lib/esm/ram/index.d.ts +4 -4
- package/lib/esm/ram/index.js +9 -5
- package/lib/esm/ram/model/RamSequence.d.ts +21 -9
- package/lib/esm/ram/model/RamSequence.js +19 -1
- package/lib/esm/ram/types.d.ts +47 -5
- package/lib/esm/ram/types.js +1 -1
- package/lib/esm/repository/Repository.d.ts +381 -22
- package/lib/esm/repository/Repository.js +446 -43
- package/lib/esm/repository/constants.d.ts +23 -13
- package/lib/esm/repository/constants.js +24 -14
- package/lib/esm/repository/decorators.d.ts +27 -0
- package/lib/esm/repository/decorators.js +28 -1
- package/lib/esm/repository/errors.d.ts +12 -11
- package/lib/esm/repository/errors.js +13 -16
- package/lib/esm/repository/injectables.d.ts +18 -0
- package/lib/esm/repository/injectables.js +19 -1
- package/lib/esm/repository/types.d.ts +13 -1
- package/lib/esm/repository/types.js +1 -1
- package/lib/esm/repository/utils.d.ts +11 -0
- package/lib/esm/repository/utils.js +12 -1
- package/lib/esm/utils/decorators.d.ts +9 -0
- package/lib/esm/utils/decorators.js +19 -0
- package/lib/esm/utils/errors.d.ts +56 -0
- package/lib/esm/utils/errors.js +63 -0
- package/lib/esm/utils/index.d.ts +2 -0
- package/lib/esm/utils/index.js +3 -0
- package/lib/identity/decorators.cjs +54 -16
- package/lib/identity/decorators.d.ts +52 -14
- package/lib/identity/utils.cjs +22 -2
- package/lib/identity/utils.d.ts +20 -1
- package/lib/index.cjs +17 -19
- package/lib/index.d.ts +11 -15
- package/lib/interfaces/ErrorParser.cjs +1 -1
- package/lib/interfaces/ErrorParser.d.ts +12 -0
- package/lib/interfaces/Executor.cjs +1 -1
- package/lib/interfaces/Executor.d.ts +10 -13
- package/lib/interfaces/Observable.cjs +1 -1
- package/lib/interfaces/Observable.d.ts +20 -18
- package/lib/interfaces/Observer.cjs +1 -1
- package/lib/interfaces/Observer.d.ts +7 -8
- package/lib/interfaces/Paginatable.cjs +1 -1
- package/lib/interfaces/Paginatable.d.ts +18 -2
- package/lib/interfaces/Queriable.cjs +1 -1
- package/lib/interfaces/Queriable.d.ts +44 -3
- package/lib/interfaces/RawExecutor.cjs +1 -1
- package/lib/interfaces/RawExecutor.d.ts +10 -13
- package/lib/interfaces/SequenceOptions.cjs +19 -1
- package/lib/interfaces/SequenceOptions.d.ts +50 -5
- package/lib/interfaces/index.cjs +1 -2
- package/lib/interfaces/index.d.ts +0 -1
- package/lib/model/BaseModel.cjs +24 -1
- package/lib/model/BaseModel.d.ts +31 -0
- package/lib/model/construction.cjs +441 -2
- package/lib/model/construction.d.ts +442 -9
- package/lib/model/decorators.cjs +161 -37
- package/lib/model/decorators.d.ts +166 -42
- package/lib/model/index.cjs +1 -2
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +9 -0
- package/lib/persistence/Adapter.cjs +414 -58
- package/lib/persistence/Adapter.d.ts +384 -40
- package/lib/persistence/Dispatch.cjs +191 -0
- package/lib/persistence/Dispatch.d.ts +131 -0
- package/lib/persistence/ObserverHandler.cjs +141 -0
- package/lib/persistence/ObserverHandler.d.ts +109 -0
- package/lib/persistence/Sequence.cjs +91 -1
- package/lib/persistence/Sequence.d.ts +89 -8
- package/lib/persistence/constants.cjs +24 -8
- package/lib/persistence/constants.d.ts +22 -5
- package/lib/persistence/decorators.cjs +11 -1
- package/lib/persistence/decorators.d.ts +10 -0
- package/lib/persistence/errors.cjs +26 -9
- package/lib/persistence/errors.d.ts +23 -3
- package/lib/persistence/index.cjs +4 -1
- package/lib/persistence/index.d.ts +3 -0
- package/lib/persistence/types.cjs +3 -0
- package/lib/persistence/types.d.ts +21 -0
- package/lib/query/Condition.cjs +143 -61
- package/lib/query/Condition.d.ts +88 -44
- package/lib/query/Paginator.cjs +64 -10
- package/lib/query/Paginator.d.ts +67 -10
- package/lib/query/Statement.cjs +174 -121
- package/lib/query/Statement.d.ts +82 -47
- package/lib/query/constants.cjs +27 -69
- package/lib/query/constants.d.ts +25 -64
- package/lib/query/errors.cjs +15 -1
- package/lib/query/errors.d.ts +14 -0
- package/lib/query/index.cjs +1 -6
- package/lib/query/index.d.ts +0 -5
- package/lib/query/options.cjs +1 -1
- package/lib/query/options.d.ts +69 -178
- package/lib/query/selectors.cjs +1 -1
- package/lib/query/selectors.d.ts +20 -24
- package/lib/ram/RamAdapter.cjs +358 -172
- package/lib/ram/RamAdapter.d.ts +322 -20
- package/lib/ram/RamContext.cjs +18 -3
- package/lib/ram/RamContext.d.ts +16 -1
- package/lib/ram/RamPaginator.cjs +58 -6
- package/lib/ram/RamPaginator.d.ts +51 -6
- package/lib/ram/RamSequence.cjs +52 -41
- package/lib/ram/RamSequence.d.ts +49 -24
- package/lib/ram/RamStatement.cjs +175 -6
- package/lib/ram/RamStatement.d.ts +84 -6
- package/lib/ram/constants.cjs +13 -0
- package/lib/ram/constants.d.ts +9 -0
- package/lib/ram/handlers.cjs +30 -0
- package/lib/ram/handlers.d.ts +25 -0
- package/lib/ram/index.cjs +9 -5
- package/lib/ram/index.d.ts +4 -4
- package/lib/ram/model/RamSequence.cjs +19 -1
- package/lib/ram/model/RamSequence.d.ts +21 -9
- package/lib/ram/types.cjs +1 -1
- package/lib/ram/types.d.ts +47 -5
- package/lib/repository/Repository.cjs +445 -42
- package/lib/repository/Repository.d.ts +381 -22
- package/lib/repository/constants.cjs +24 -14
- package/lib/repository/constants.d.ts +23 -13
- package/lib/repository/decorators.cjs +28 -1
- package/lib/repository/decorators.d.ts +27 -0
- package/lib/repository/errors.cjs +14 -19
- package/lib/repository/errors.d.ts +12 -11
- package/lib/repository/injectables.cjs +19 -1
- package/lib/repository/injectables.d.ts +18 -0
- package/lib/repository/types.cjs +1 -1
- package/lib/repository/types.d.ts +13 -1
- package/lib/repository/utils.cjs +12 -1
- package/lib/repository/utils.d.ts +11 -0
- package/lib/utils/decorators.cjs +22 -0
- package/lib/utils/decorators.d.ts +9 -0
- package/lib/utils/errors.cjs +69 -0
- package/lib/utils/errors.d.ts +56 -0
- package/lib/{validators → utils}/index.cjs +2 -2
- package/lib/utils/index.d.ts +2 -0
- package/package.json +5 -5
- package/lib/esm/interfaces/Builder.d.ts +0 -16
- package/lib/esm/interfaces/Builder.js +0 -2
- package/lib/esm/model/IdentifiedBaseModel.d.ts +0 -7
- package/lib/esm/model/IdentifiedBaseModel.js +0 -25
- package/lib/esm/query/Clause.d.ts +0 -50
- package/lib/esm/query/Clause.js +0 -82
- package/lib/esm/query/ClauseFactory.d.ts +0 -71
- package/lib/esm/query/ClauseFactory.js +0 -6
- package/lib/esm/query/Query.d.ts +0 -43
- package/lib/esm/query/Query.js +0 -54
- package/lib/esm/query/clauses/FromClause.d.ts +0 -45
- package/lib/esm/query/clauses/FromClause.js +0 -59
- package/lib/esm/query/clauses/GroupByClause.d.ts +0 -21
- package/lib/esm/query/clauses/GroupByClause.js +0 -19
- package/lib/esm/query/clauses/InsertClause.d.ts +0 -37
- package/lib/esm/query/clauses/InsertClause.js +0 -55
- package/lib/esm/query/clauses/LimitClause.d.ts +0 -29
- package/lib/esm/query/clauses/LimitClause.js +0 -27
- package/lib/esm/query/clauses/OffsetClause.d.ts +0 -21
- package/lib/esm/query/clauses/OffsetClause.js +0 -19
- package/lib/esm/query/clauses/OrderByClause.d.ts +0 -37
- package/lib/esm/query/clauses/OrderByClause.js +0 -39
- package/lib/esm/query/clauses/SelectClause.d.ts +0 -47
- package/lib/esm/query/clauses/SelectClause.js +0 -62
- package/lib/esm/query/clauses/SelectorBasedClause.d.ts +0 -25
- package/lib/esm/query/clauses/SelectorBasedClause.js +0 -44
- package/lib/esm/query/clauses/ValuesClause.d.ts +0 -21
- package/lib/esm/query/clauses/ValuesClause.js +0 -36
- package/lib/esm/query/clauses/WhereClause.d.ts +0 -46
- package/lib/esm/query/clauses/WhereClause.js +0 -71
- package/lib/esm/query/clauses/index.d.ts +0 -10
- package/lib/esm/query/clauses/index.js +0 -11
- package/lib/esm/query/types.d.ts +0 -2
- package/lib/esm/query/types.js +0 -2
- package/lib/esm/ram/RamClauseFactory.d.ts +0 -17
- package/lib/esm/ram/RamClauseFactory.js +0 -92
- package/lib/esm/ram/clauses/FromClause.d.ts +0 -7
- package/lib/esm/ram/clauses/FromClause.js +0 -11
- package/lib/esm/ram/clauses/InsertClause.d.ts +0 -7
- package/lib/esm/ram/clauses/InsertClause.js +0 -13
- package/lib/esm/ram/clauses/OrderByClause.d.ts +0 -7
- package/lib/esm/ram/clauses/OrderByClause.js +0 -39
- package/lib/esm/ram/clauses/SelectClause.d.ts +0 -7
- package/lib/esm/ram/clauses/SelectClause.js +0 -16
- package/lib/esm/ram/clauses/ValuesClause.d.ts +0 -7
- package/lib/esm/ram/clauses/ValuesClause.js +0 -12
- package/lib/esm/ram/clauses/WhereClause.d.ts +0 -7
- package/lib/esm/ram/clauses/WhereClause.js +0 -11
- package/lib/esm/ram/clauses/index.d.ts +0 -6
- package/lib/esm/ram/clauses/index.js +0 -7
- package/lib/esm/validators/ClauseSequenceValidator.d.ts +0 -28
- package/lib/esm/validators/ClauseSequenceValidator.js +0 -95
- package/lib/esm/validators/decorators.d.ts +0 -10
- package/lib/esm/validators/decorators.js +0 -24
- package/lib/esm/validators/index.d.ts +0 -2
- package/lib/esm/validators/index.js +0 -3
- package/lib/interfaces/Builder.cjs +0 -3
- package/lib/interfaces/Builder.d.ts +0 -16
- package/lib/model/IdentifiedBaseModel.cjs +0 -29
- package/lib/model/IdentifiedBaseModel.d.ts +0 -7
- package/lib/query/Clause.cjs +0 -86
- package/lib/query/Clause.d.ts +0 -50
- package/lib/query/ClauseFactory.cjs +0 -10
- package/lib/query/ClauseFactory.d.ts +0 -71
- package/lib/query/Query.cjs +0 -58
- package/lib/query/Query.d.ts +0 -43
- package/lib/query/clauses/FromClause.cjs +0 -63
- package/lib/query/clauses/FromClause.d.ts +0 -45
- package/lib/query/clauses/GroupByClause.cjs +0 -23
- package/lib/query/clauses/GroupByClause.d.ts +0 -21
- package/lib/query/clauses/InsertClause.cjs +0 -59
- package/lib/query/clauses/InsertClause.d.ts +0 -37
- package/lib/query/clauses/LimitClause.cjs +0 -31
- package/lib/query/clauses/LimitClause.d.ts +0 -29
- package/lib/query/clauses/OffsetClause.cjs +0 -23
- package/lib/query/clauses/OffsetClause.d.ts +0 -21
- package/lib/query/clauses/OrderByClause.cjs +0 -43
- package/lib/query/clauses/OrderByClause.d.ts +0 -37
- package/lib/query/clauses/SelectClause.cjs +0 -66
- package/lib/query/clauses/SelectClause.d.ts +0 -47
- package/lib/query/clauses/SelectorBasedClause.cjs +0 -48
- package/lib/query/clauses/SelectorBasedClause.d.ts +0 -25
- package/lib/query/clauses/ValuesClause.cjs +0 -40
- package/lib/query/clauses/ValuesClause.d.ts +0 -21
- package/lib/query/clauses/WhereClause.cjs +0 -75
- package/lib/query/clauses/WhereClause.d.ts +0 -46
- package/lib/query/clauses/index.cjs +0 -27
- package/lib/query/clauses/index.d.ts +0 -10
- package/lib/query/types.cjs +0 -3
- package/lib/query/types.d.ts +0 -2
- package/lib/ram/RamClauseFactory.cjs +0 -96
- package/lib/ram/RamClauseFactory.d.ts +0 -17
- package/lib/ram/clauses/FromClause.cjs +0 -15
- package/lib/ram/clauses/FromClause.d.ts +0 -7
- package/lib/ram/clauses/InsertClause.cjs +0 -17
- package/lib/ram/clauses/InsertClause.d.ts +0 -7
- package/lib/ram/clauses/OrderByClause.cjs +0 -43
- package/lib/ram/clauses/OrderByClause.d.ts +0 -7
- package/lib/ram/clauses/SelectClause.cjs +0 -20
- package/lib/ram/clauses/SelectClause.d.ts +0 -7
- package/lib/ram/clauses/ValuesClause.cjs +0 -16
- package/lib/ram/clauses/ValuesClause.d.ts +0 -7
- package/lib/ram/clauses/WhereClause.cjs +0 -15
- package/lib/ram/clauses/WhereClause.d.ts +0 -7
- package/lib/ram/clauses/index.cjs +0 -23
- package/lib/ram/clauses/index.d.ts +0 -6
- package/lib/validators/ClauseSequenceValidator.cjs +0 -98
- package/lib/validators/ClauseSequenceValidator.d.ts +0 -28
- package/lib/validators/decorators.cjs +0 -27
- package/lib/validators/decorators.d.ts +0 -10
- package/lib/validators/index.d.ts +0 -2
@@ -1,139 +1,359 @@
|
|
1
1
|
import { RamStatement } from "./RamStatement";
|
2
|
-
import { RamClauseFactory } from "./RamClauseFactory";
|
3
|
-
import * as crypto from "node:crypto";
|
4
2
|
import { RamContext } from "./RamContext";
|
5
3
|
import { Repository } from "../repository/Repository";
|
6
|
-
import {
|
7
|
-
import { Adapter, PersistenceKeys } from "../persistence";
|
8
|
-
import { Paginator } from "../query/Paginator";
|
9
|
-
import { GroupOperator, Operator, QueryError, } from "../query";
|
4
|
+
import { Adapter, PersistenceKeys, Sequence } from "../persistence";
|
10
5
|
import { Lock } from "@decaf-ts/transactional-decorators";
|
11
6
|
import { Decoration, Model, propMetadata, } from "@decaf-ts/decorator-validation";
|
12
|
-
import { BaseError, ConflictError,
|
7
|
+
import { BaseError, ConflictError, findPrimaryKey, InternalError, NotFoundError, onCreate, } from "@decaf-ts/db-decorators";
|
13
8
|
import { RamSequence } from "./RamSequence";
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
9
|
+
import { createdByOnRamCreateUpdate } from "./handlers";
|
10
|
+
import { RamFlavour } from "./constants";
|
11
|
+
/**
|
12
|
+
* @description In-memory adapter for data persistence
|
13
|
+
* @summary The RamAdapter provides an in-memory implementation of the persistence layer.
|
14
|
+
* It stores data in JavaScript Maps and provides CRUD operations and query capabilities.
|
15
|
+
* This adapter is useful for testing, prototyping, and applications that don't require
|
16
|
+
* persistent storage across application restarts.
|
17
|
+
* @class RamAdapter
|
18
|
+
* @category Ram
|
19
|
+
* @example
|
20
|
+
* ```typescript
|
21
|
+
* // Create a new RAM adapter
|
22
|
+
* const adapter = new RamAdapter('myRamAdapter');
|
23
|
+
*
|
24
|
+
* // Create a repository for a model
|
25
|
+
* const userRepo = new (adapter.repository<User>())(User, adapter);
|
26
|
+
*
|
27
|
+
* // Perform CRUD operations
|
28
|
+
* const user = new User({ name: 'John', email: 'john@example.com' });
|
29
|
+
* await userRepo.create(user);
|
30
|
+
* const retrievedUser = await userRepo.findById(user.id);
|
31
|
+
* ```
|
32
|
+
* @mermaid
|
33
|
+
* sequenceDiagram
|
34
|
+
* participant Client
|
35
|
+
* participant Repository
|
36
|
+
* participant RamAdapter
|
37
|
+
* participant Storage as In-Memory Storage
|
38
|
+
*
|
39
|
+
* Client->>Repository: create(model)
|
40
|
+
* Repository->>RamAdapter: create(tableName, id, model)
|
41
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
42
|
+
* RamAdapter->>Storage: set(id, model)
|
43
|
+
* RamAdapter->>RamAdapter: lock.release()
|
44
|
+
* RamAdapter-->>Repository: model
|
45
|
+
* Repository-->>Client: model
|
46
|
+
*
|
47
|
+
* Client->>Repository: findById(id)
|
48
|
+
* Repository->>RamAdapter: read(tableName, id)
|
49
|
+
* RamAdapter->>Storage: get(id)
|
50
|
+
* Storage-->>RamAdapter: model
|
51
|
+
* RamAdapter-->>Repository: model
|
52
|
+
* Repository-->>Client: model
|
53
|
+
*/
|
30
54
|
export class RamAdapter extends Adapter {
|
31
|
-
constructor(
|
32
|
-
super(
|
55
|
+
constructor(alias) {
|
56
|
+
super(new Map(), RamFlavour, alias);
|
57
|
+
this.Context = RamContext;
|
33
58
|
this.indexes = {};
|
34
59
|
this.lock = new Lock();
|
35
|
-
this.sequences = {};
|
36
60
|
}
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
61
|
+
/**
|
62
|
+
* @description Gets the repository constructor for a model
|
63
|
+
* @summary Returns a constructor for creating repositories that work with the specified model type.
|
64
|
+
* This method overrides the base implementation to provide RAM-specific repository functionality.
|
65
|
+
* @template M - The model type for the repository
|
66
|
+
* @return {Constructor<RamRepository<M>>} A constructor for creating RAM repositories
|
67
|
+
*/
|
68
|
+
repository() {
|
69
|
+
return super.repository();
|
70
|
+
}
|
71
|
+
/**
|
72
|
+
* @description Creates operation flags with UUID
|
73
|
+
* @summary Extends the base flags with a UUID for user identification.
|
74
|
+
* This method ensures that all operations have a unique identifier for tracking purposes.
|
75
|
+
* @template M - The model type for the operation
|
76
|
+
* @param {OperationKeys} operation - The type of operation being performed
|
77
|
+
* @param {Constructor<M>} model - The model constructor
|
78
|
+
* @param {Partial<RamFlags>} flags - Partial flags to be extended
|
79
|
+
* @return {RamFlags} Complete flags with UUID
|
80
|
+
*/
|
81
|
+
flags(operation, model, flags) {
|
82
|
+
return Object.assign(super.flags(operation, model, flags), {
|
45
83
|
UUID: crypto.randomUUID(),
|
46
|
-
})
|
84
|
+
});
|
47
85
|
}
|
86
|
+
/**
|
87
|
+
* @description Initializes the RAM adapter
|
88
|
+
* @summary A no-op initialization method for the RAM adapter.
|
89
|
+
* Since RAM adapter doesn't require any setup, this method simply resolves immediately.
|
90
|
+
* @param {...any[]} args - Initialization arguments (unused)
|
91
|
+
* @return {Promise<void>} A promise that resolves when initialization is complete
|
92
|
+
*/
|
48
93
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
49
94
|
async initialize(...args) {
|
50
95
|
return Promise.resolve(undefined);
|
51
96
|
}
|
97
|
+
/**
|
98
|
+
* @description Indexes models in the RAM adapter
|
99
|
+
* @summary A no-op indexing method for the RAM adapter.
|
100
|
+
* Since RAM adapter doesn't require explicit indexing, this method simply resolves immediately.
|
101
|
+
* @param models - Models to be indexed (unused)
|
102
|
+
* @return {Promise<any>} A promise that resolves when indexing is complete
|
103
|
+
*/
|
52
104
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
53
105
|
async index(...models) {
|
54
106
|
return Promise.resolve(undefined);
|
55
107
|
}
|
108
|
+
/**
|
109
|
+
* @description Prepares a model for storage
|
110
|
+
* @summary Converts a model instance to a format suitable for storage in the RAM adapter.
|
111
|
+
* This method extracts the primary key and creates a record without the primary key field.
|
112
|
+
* @template M - The model type being prepared
|
113
|
+
* @param {M} model - The model instance to prepare
|
114
|
+
* @param pk - The primary key property name
|
115
|
+
* @return Object containing the record and ID
|
116
|
+
*/
|
56
117
|
prepare(model, pk) {
|
57
118
|
const prepared = super.prepare(model, pk);
|
58
119
|
delete prepared.record[pk];
|
59
120
|
return prepared;
|
60
121
|
}
|
122
|
+
/**
|
123
|
+
* @description Converts a stored record back to a model instance
|
124
|
+
* @summary Reconstructs a model instance from a stored record by adding back the primary key.
|
125
|
+
* This method is the inverse of the prepare method.
|
126
|
+
* @template M - The model type to revert to
|
127
|
+
* @param {Record<string, any>} obj - The stored record
|
128
|
+
* @param {string | Constructor<M>} clazz - The model class or name
|
129
|
+
* @param pk - The primary key property name
|
130
|
+
* @param {string | number} id - The primary key value
|
131
|
+
* @return {M} The reconstructed model instance
|
132
|
+
*/
|
61
133
|
revert(obj, clazz, pk, id) {
|
62
134
|
const res = super.revert(obj, clazz, pk, id);
|
63
135
|
return res;
|
64
136
|
}
|
137
|
+
/**
|
138
|
+
* @description Creates a new record in the in-memory storage
|
139
|
+
* @summary Stores a new record in the specified table with the given ID.
|
140
|
+
* This method acquires a lock to ensure thread safety, creates the table if it doesn't exist,
|
141
|
+
* checks for conflicts, and stores the model.
|
142
|
+
* @param {string} tableName - The name of the table to store the record in
|
143
|
+
* @param {string | number} id - The unique identifier for the record
|
144
|
+
* @param {Record<string, any>} model - The record data to store
|
145
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the stored record
|
146
|
+
* @mermaid
|
147
|
+
* sequenceDiagram
|
148
|
+
* participant Caller
|
149
|
+
* participant RamAdapter
|
150
|
+
* participant Storage as In-Memory Storage
|
151
|
+
*
|
152
|
+
* Caller->>RamAdapter: create(tableName, id, model)
|
153
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
154
|
+
* RamAdapter->>Storage: has(tableName)
|
155
|
+
* alt Table doesn't exist
|
156
|
+
* RamAdapter->>Storage: set(tableName, new Map())
|
157
|
+
* end
|
158
|
+
* RamAdapter->>Storage: has(id)
|
159
|
+
* alt Record exists
|
160
|
+
* RamAdapter-->>Caller: throw ConflictError
|
161
|
+
* end
|
162
|
+
* RamAdapter->>Storage: set(id, model)
|
163
|
+
* RamAdapter->>RamAdapter: lock.release()
|
164
|
+
* RamAdapter-->>Caller: model
|
165
|
+
*/
|
65
166
|
async create(tableName, id, model) {
|
66
167
|
await this.lock.acquire();
|
67
|
-
if (!this.native
|
68
|
-
this.native
|
69
|
-
if (
|
168
|
+
if (!this.native.has(tableName))
|
169
|
+
this.native.set(tableName, new Map());
|
170
|
+
if (this.native.get(tableName) && this.native.get(tableName)?.has(id))
|
70
171
|
throw new ConflictError(`Record with id ${id} already exists in table ${tableName}`);
|
71
|
-
this.native
|
172
|
+
this.native.get(tableName)?.set(id, model);
|
72
173
|
this.lock.release();
|
73
174
|
return model;
|
74
175
|
}
|
176
|
+
/**
|
177
|
+
* @description Retrieves a record from in-memory storage
|
178
|
+
* @summary Fetches a record with the specified ID from the given table.
|
179
|
+
* This method checks if the table and record exist and throws appropriate errors if not.
|
180
|
+
* @param {string} tableName - The name of the table to retrieve from
|
181
|
+
* @param {string | number} id - The unique identifier of the record to retrieve
|
182
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the retrieved record
|
183
|
+
* @mermaid
|
184
|
+
* sequenceDiagram
|
185
|
+
* participant Caller
|
186
|
+
* participant RamAdapter
|
187
|
+
* participant Storage as In-Memory Storage
|
188
|
+
*
|
189
|
+
* Caller->>RamAdapter: read(tableName, id)
|
190
|
+
* RamAdapter->>Storage: has(tableName)
|
191
|
+
* alt Table doesn't exist
|
192
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
193
|
+
* end
|
194
|
+
* RamAdapter->>Storage: has(id)
|
195
|
+
* alt Record doesn't exist
|
196
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
197
|
+
* end
|
198
|
+
* RamAdapter->>Storage: get(id)
|
199
|
+
* Storage-->>RamAdapter: record
|
200
|
+
* RamAdapter-->>Caller: record
|
201
|
+
*/
|
75
202
|
async read(tableName, id) {
|
76
|
-
if (!
|
203
|
+
if (!this.native.has(tableName))
|
77
204
|
throw new NotFoundError(`Table ${tableName} not found`);
|
78
|
-
if (!
|
205
|
+
if (!this.native.get(tableName)?.has(id))
|
79
206
|
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
80
|
-
return this.native
|
207
|
+
return this.native.get(tableName)?.get(id);
|
81
208
|
}
|
209
|
+
/**
|
210
|
+
* @description Updates an existing record in the in-memory storage
|
211
|
+
* @summary Updates a record with the specified ID in the given table.
|
212
|
+
* This method acquires a lock to ensure thread safety, checks if the table and record exist,
|
213
|
+
* and updates the record with the new data.
|
214
|
+
* @param {string} tableName - The name of the table containing the record
|
215
|
+
* @param {string | number} id - The unique identifier of the record to update
|
216
|
+
* @param {Record<string, any>} model - The new record data
|
217
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the updated record
|
218
|
+
* @mermaid
|
219
|
+
* sequenceDiagram
|
220
|
+
* participant Caller
|
221
|
+
* participant RamAdapter
|
222
|
+
* participant Storage as In-Memory Storage
|
223
|
+
*
|
224
|
+
* Caller->>RamAdapter: update(tableName, id, model)
|
225
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
226
|
+
* RamAdapter->>Storage: has(tableName)
|
227
|
+
* alt Table doesn't exist
|
228
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
229
|
+
* end
|
230
|
+
* RamAdapter->>Storage: has(id)
|
231
|
+
* alt Record doesn't exist
|
232
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
233
|
+
* end
|
234
|
+
* RamAdapter->>Storage: set(id, model)
|
235
|
+
* RamAdapter->>RamAdapter: lock.release()
|
236
|
+
* RamAdapter-->>Caller: model
|
237
|
+
*/
|
82
238
|
async update(tableName, id, model) {
|
83
239
|
await this.lock.acquire();
|
84
|
-
if (!
|
240
|
+
if (!this.native.has(tableName))
|
85
241
|
throw new NotFoundError(`Table ${tableName} not found`);
|
86
|
-
if (!
|
242
|
+
if (!this.native.get(tableName)?.has(id))
|
87
243
|
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
88
|
-
this.native
|
244
|
+
this.native.get(tableName)?.set(id, model);
|
89
245
|
this.lock.release();
|
90
246
|
return model;
|
91
247
|
}
|
248
|
+
/**
|
249
|
+
* @description Deletes a record from the in-memory storage
|
250
|
+
* @summary Removes a record with the specified ID from the given table.
|
251
|
+
* This method acquires a lock to ensure thread safety, checks if the table and record exist,
|
252
|
+
* retrieves the record before deletion, and then removes it from storage.
|
253
|
+
* @param {string} tableName - The name of the table containing the record
|
254
|
+
* @param {string | number} id - The unique identifier of the record to delete
|
255
|
+
* @return {Promise<Record<string, any>>} A promise that resolves to the deleted record
|
256
|
+
* @mermaid
|
257
|
+
* sequenceDiagram
|
258
|
+
* participant Caller
|
259
|
+
* participant RamAdapter
|
260
|
+
* participant Storage as In-Memory Storage
|
261
|
+
*
|
262
|
+
* Caller->>RamAdapter: delete(tableName, id)
|
263
|
+
* RamAdapter->>RamAdapter: lock.acquire()
|
264
|
+
* RamAdapter->>Storage: has(tableName)
|
265
|
+
* alt Table doesn't exist
|
266
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
267
|
+
* end
|
268
|
+
* RamAdapter->>Storage: has(id)
|
269
|
+
* alt Record doesn't exist
|
270
|
+
* RamAdapter-->>Caller: throw NotFoundError
|
271
|
+
* end
|
272
|
+
* RamAdapter->>Storage: get(id)
|
273
|
+
* Storage-->>RamAdapter: record
|
274
|
+
* RamAdapter->>Storage: delete(id)
|
275
|
+
* RamAdapter->>RamAdapter: lock.release()
|
276
|
+
* RamAdapter-->>Caller: record
|
277
|
+
*/
|
92
278
|
async delete(tableName, id) {
|
93
279
|
await this.lock.acquire();
|
94
|
-
if (!
|
280
|
+
if (!this.native.has(tableName))
|
95
281
|
throw new NotFoundError(`Table ${tableName} not found`);
|
96
|
-
if (!
|
282
|
+
if (!this.native.get(tableName)?.has(id))
|
97
283
|
throw new NotFoundError(`Record with id ${id} not found in table ${tableName}`);
|
98
|
-
const natived = this.native
|
99
|
-
|
284
|
+
const natived = this.native.get(tableName)?.get(id);
|
285
|
+
this.native.get(tableName)?.delete(id);
|
100
286
|
this.lock.release();
|
101
287
|
return natived;
|
102
288
|
}
|
289
|
+
/**
|
290
|
+
* @description Gets or creates a table in the in-memory storage
|
291
|
+
* @summary Retrieves the Map representing a table for a given model or table name.
|
292
|
+
* If the table doesn't exist, it creates a new one. This is a helper method used
|
293
|
+
* by other methods to access the correct storage location.
|
294
|
+
* @template M - The model type for the table
|
295
|
+
* @param {string | Constructor<M>} from - The model class or table name
|
296
|
+
* @return {Map<string | number, any> | undefined} The table Map or undefined
|
297
|
+
*/
|
103
298
|
tableFor(from) {
|
104
299
|
if (typeof from === "string")
|
105
300
|
from = Model.get(from);
|
106
301
|
const table = Repository.table(from);
|
107
|
-
if (!
|
108
|
-
this.native
|
109
|
-
return this.native
|
302
|
+
if (!this.native.has(table))
|
303
|
+
this.native.set(table, new Map());
|
304
|
+
return this.native.get(table);
|
110
305
|
}
|
111
|
-
|
112
|
-
|
306
|
+
/**
|
307
|
+
* @description Executes a raw query against the in-memory storage
|
308
|
+
* @summary Performs a query operation on the in-memory data store using the provided query specification.
|
309
|
+
* This method supports filtering, sorting, pagination, and field selection.
|
310
|
+
* @template R - The return type of the query
|
311
|
+
* @param {RawRamQuery<any>} rawInput - The query specification
|
312
|
+
* @return {Promise<R>} A promise that resolves to the query results
|
313
|
+
* @mermaid
|
314
|
+
* sequenceDiagram
|
315
|
+
* participant Caller
|
316
|
+
* participant RamAdapter
|
317
|
+
* participant Storage as In-Memory Storage
|
318
|
+
*
|
319
|
+
* Caller->>RamAdapter: raw(rawInput)
|
320
|
+
* RamAdapter->>RamAdapter: tableFor(from)
|
321
|
+
* alt Table doesn't exist
|
322
|
+
* RamAdapter-->>Caller: throw InternalError
|
323
|
+
* end
|
324
|
+
* RamAdapter->>RamAdapter: findPrimaryKey(new from())
|
325
|
+
* RamAdapter->>Storage: entries()
|
326
|
+
* Storage-->>RamAdapter: entries
|
327
|
+
* loop For each entry
|
328
|
+
* RamAdapter->>RamAdapter: revert(r, from, id, pk)
|
329
|
+
* end
|
330
|
+
* alt Where condition exists
|
331
|
+
* RamAdapter->>RamAdapter: result.filter(where)
|
332
|
+
* end
|
333
|
+
* alt Sort condition exists
|
334
|
+
* RamAdapter->>RamAdapter: result.sort(sort)
|
335
|
+
* end
|
336
|
+
* alt Skip specified
|
337
|
+
* RamAdapter->>RamAdapter: result.slice(skip)
|
338
|
+
* end
|
339
|
+
* alt Limit specified
|
340
|
+
* RamAdapter->>RamAdapter: result.slice(0, limit)
|
341
|
+
* end
|
342
|
+
* alt Select fields specified
|
343
|
+
* loop For each result
|
344
|
+
* RamAdapter->>RamAdapter: Filter to selected fields
|
345
|
+
* end
|
346
|
+
* end
|
347
|
+
* RamAdapter-->>Caller: result
|
348
|
+
*/
|
349
|
+
async raw(rawInput) {
|
113
350
|
const { where, sort, limit, skip, from } = rawInput;
|
114
351
|
let { select } = rawInput;
|
115
352
|
const collection = this.tableFor(from);
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
switch (props.type) {
|
121
|
-
case "Number":
|
122
|
-
result = parseInt(result);
|
123
|
-
if (isNaN(result))
|
124
|
-
throw new Error(`Invalid id ${id}`);
|
125
|
-
break;
|
126
|
-
case "BigInt":
|
127
|
-
result = BigInt(parseInt(result));
|
128
|
-
break;
|
129
|
-
case "String":
|
130
|
-
break;
|
131
|
-
default:
|
132
|
-
throw new InternalError(`Invalid id type ${props.type}. should be impossible`);
|
133
|
-
}
|
134
|
-
return result;
|
135
|
-
}
|
136
|
-
let result = Object.entries(collection).map(([pk, r]) => this.revert(r, clazz, id, parseId(pk)));
|
353
|
+
if (!collection)
|
354
|
+
throw new InternalError(`Table ${from} not found in RamAdapter`);
|
355
|
+
const { id, props } = findPrimaryKey(new from());
|
356
|
+
let result = Array.from(collection.entries()).map(([pk, r]) => this.revert(r, from, id, Sequence.parseValue(props.type, pk)));
|
137
357
|
result = where ? result.filter(where) : result;
|
138
358
|
if (sort)
|
139
359
|
result = result.sort(sort);
|
@@ -151,80 +371,80 @@ export class RamAdapter extends Adapter {
|
|
151
371
|
}
|
152
372
|
return result;
|
153
373
|
}
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
}
|
163
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
164
|
-
page(page) {
|
165
|
-
throw new Error("Method not implemented.");
|
166
|
-
}
|
167
|
-
})(10);
|
168
|
-
}
|
374
|
+
/**
|
375
|
+
* @description Parses and converts errors to appropriate types
|
376
|
+
* @summary Ensures that errors are of the correct type for consistent error handling.
|
377
|
+
* If the error is already a BaseError, it's returned as is; otherwise, it's wrapped in an InternalError.
|
378
|
+
* @template V - The expected error type, extending BaseError
|
379
|
+
* @param {Error} err - The error to parse
|
380
|
+
* @return {V} The parsed error of the expected type
|
381
|
+
*/
|
169
382
|
parseError(err) {
|
170
383
|
if (err instanceof BaseError)
|
171
384
|
return err;
|
172
385
|
return new InternalError(err);
|
173
386
|
}
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
387
|
+
/**
|
388
|
+
* @description Creates a new statement builder for queries
|
389
|
+
* @summary Factory method that creates a new RamStatement instance for building queries.
|
390
|
+
* This method allows for fluent query construction against the RAM adapter.
|
391
|
+
* @template M - The model type for the statement
|
392
|
+
* @return {RamStatement<M, any>} A new statement builder instance
|
393
|
+
*/
|
394
|
+
Statement() {
|
180
395
|
return new RamStatement(this);
|
181
396
|
}
|
397
|
+
/**
|
398
|
+
* @description Creates a new sequence for generating sequential IDs
|
399
|
+
* @summary Factory method that creates a new RamSequence instance for ID generation.
|
400
|
+
* This method provides a way to create auto-incrementing sequences for entity IDs.
|
401
|
+
* @param {SequenceOptions} options - Configuration options for the sequence
|
402
|
+
* @return {Promise<Sequence>} A promise that resolves to the new sequence instance
|
403
|
+
*/
|
182
404
|
async Sequence(options) {
|
183
405
|
return new RamSequence(options, this);
|
184
406
|
}
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
}
|
226
|
-
},
|
227
|
-
};
|
407
|
+
/**
|
408
|
+
* @description Sets up RAM-specific decorations for model properties
|
409
|
+
* @summary Configures decorations for createdBy and updatedBy fields in the RAM adapter.
|
410
|
+
* This static method is called during initialization to set up handlers that automatically
|
411
|
+
* populate these fields with the current user's UUID during create and update operations.
|
412
|
+
* @return {void}
|
413
|
+
* @mermaid
|
414
|
+
* sequenceDiagram
|
415
|
+
* participant RamAdapter
|
416
|
+
* participant Decoration
|
417
|
+
* participant Repository
|
418
|
+
*
|
419
|
+
* RamAdapter->>Repository: key(PersistenceKeys.CREATED_BY)
|
420
|
+
* Repository-->>RamAdapter: createdByKey
|
421
|
+
* RamAdapter->>Repository: key(PersistenceKeys.UPDATED_BY)
|
422
|
+
* Repository-->>RamAdapter: updatedByKey
|
423
|
+
*
|
424
|
+
* RamAdapter->>Decoration: flavouredAs(RamFlavour)
|
425
|
+
* Decoration-->>RamAdapter: DecoratorBuilder
|
426
|
+
* RamAdapter->>Decoration: for(createdByKey)
|
427
|
+
* RamAdapter->>Decoration: define(onCreate, propMetadata)
|
428
|
+
* RamAdapter->>Decoration: apply()
|
429
|
+
*
|
430
|
+
* RamAdapter->>Decoration: flavouredAs(RamFlavour)
|
431
|
+
* Decoration-->>RamAdapter: DecoratorBuilder
|
432
|
+
* RamAdapter->>Decoration: for(updatedByKey)
|
433
|
+
* RamAdapter->>Decoration: define(onCreate, propMetadata)
|
434
|
+
* RamAdapter->>Decoration: apply()
|
435
|
+
*/
|
436
|
+
static decoration() {
|
437
|
+
const createdByKey = Repository.key(PersistenceKeys.CREATED_BY);
|
438
|
+
const updatedByKey = Repository.key(PersistenceKeys.UPDATED_BY);
|
439
|
+
Decoration.flavouredAs(RamFlavour)
|
440
|
+
.for(createdByKey)
|
441
|
+
.define(onCreate(createdByOnRamCreateUpdate), propMetadata(createdByKey, {}))
|
442
|
+
.apply();
|
443
|
+
Decoration.flavouredAs(RamFlavour)
|
444
|
+
.for(updatedByKey)
|
445
|
+
.define(onCreate(createdByOnRamCreateUpdate), propMetadata(updatedByKey, {}))
|
446
|
+
.apply();
|
228
447
|
}
|
229
448
|
}
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQVEsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQVksTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDL0MsT0FBTyxFQUdMLGFBQWEsRUFDYixRQUFRLEVBQ1IsVUFBVSxHQUNYLE1BQU0sVUFBVSxDQUFDO0FBRWxCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRCxPQUFPLEVBRUwsVUFBVSxFQUNWLEtBQUssRUFDTCxZQUFZLEdBQ2IsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsU0FBUyxFQUNULGFBQWEsRUFDYixzQkFBc0IsRUFDdEIsY0FBYyxFQUNkLGFBQWEsRUFDYixhQUFhLEVBQ2IsUUFBUSxFQUNSLGFBQWEsR0FDZCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxDQUFDLEtBQUssVUFBVSwwQkFBMEIsQ0FROUMsT0FBbUIsRUFDbkIsSUFBTyxFQUNQLEdBQVksRUFDWixLQUFRO0lBRVIsTUFBTSxJQUFJLEdBQVcsT0FBTyxDQUFDLEdB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QUM7U0FDZSxDQUFDO0lBQ3JCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnRleHQgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7IFJhbUZsYWdzLCBSYW1RdWVyeSwgUmFtU3RvcmFnZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSYW1TdGF0ZW1lbnQgfSBmcm9tIFwiLi9SYW1TdGF0ZW1lbnRcIjtcbmltcG9ydCB7IFJhbUNsYXVzZUZhY3RvcnkgfSBmcm9tIFwiLi9SYW1DbGF1c2VGYWN0b3J5XCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwbywgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IFJlbGF0aW9uc01ldGFkYXRhIH0gZnJvbSBcIi4uL21vZGVsL3R5cGVzXCI7XG5pbXBvcnQgeyBVbnN1cHBvcnRlZEVycm9yIH0gZnJvbSBcIi4uL3BlcnNpc3RlbmNlL2Vycm9yc1wiO1xuaW1wb3J0IHsgQWRhcHRlciwgUGVyc2lzdGVuY2VLZXlzLCBTZXF1ZW5jZSB9IGZyb20gXCIuLi9wZXJzaXN0ZW5jZVwiO1xuaW1wb3J0IHsgUGFnaW5hdG9yIH0gZnJvbSBcIi4uL3F1ZXJ5L1BhZ2luYXRvclwiO1xuaW1wb3J0IHtcbiAgQ2xhdXNlRmFjdG9yeSxcbiAgQ29uZGl0aW9uLFxuICBHcm91cE9wZXJhdG9yLFxuICBPcGVyYXRvcixcbiAgUXVlcnlFcnJvcixcbn0gZnJvbSBcIi4uL3F1ZXJ5XCI7XG5pbXBvcnQgeyBTZXF1ZW5jZU9wdGlvbnMgfSBmcm9tIFwiLi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgTG9jayB9IGZyb20gXCJAZGVjYWYtdHMvdHJhbnNhY3Rpb25hbC1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgRGVjb3JhdGlvbixcbiAgTW9kZWwsXG4gIHByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQmFzZUVycm9yLFxuICBDb25mbGljdEVycm9yLFxuICBEZWZhdWx0UmVwb3NpdG9yeUZsYWdzLFxuICBmaW5kUHJpbWFyeUtleSxcbiAgSW50ZXJuYWxFcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbiAgb25DcmVhdGUsXG4gIE9wZXJhdGlvbktleXMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgUmFtU2VxdWVuY2UgfSBmcm9tIFwiLi9SYW1TZXF1ZW5jZVwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlZEJ5T25SYW1DcmVhdGVVcGRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbCxcbiAgUiBleHRlbmRzIFJlcG88TSwgQywgRj4sXG4gIFYgZXh0ZW5kcyBSZWxhdGlvbnNNZXRhZGF0YSxcbiAgRiBleHRlbmRzIFJhbUZsYWdzLFxuICBDIGV4dGVuZHMgQ29udGV4dDxGPixcbj4oXG4gIHRoaXM6IFIsXG4gIGNvbnRleHQ6IENvbnRleHQ8Rj4sXG4gIGRhdGE6IFYsXG4gIGtleToga2V5b2YgTSxcbiAgbW9kZWw6IE1cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB1dWlkOiBzdHJpbmcgPSBjb250ZXh0LmdldChcIlVVSURcIik7XG4gIGlmICghdXVpZClcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRFcnJvcihcbiAgICAgIFwiVGhpcyBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgdXNlciBpZGVudGlmaWNhdGlvblwiXG4gICAgKTtcbiAgbW9kZWxba2V5XSA9IHV1aWQgYXMgTVtrZXlvZiBNXTtcbn1cblxuY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuY29uc3QgdXBkYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLlVQREFURURfQlkpO1xuRGVjb3JhdGlvbi5mbGF2b3VyZWRBcyhcInJhbVwiKVxuICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgLmRlZmluZShvbkNyZWF0ZShjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSksIHByb3BNZXRhZGF0YShjcmVhdGVkQnlLZXksIHt9KSlcbiAgLmFwcGx5KCk7XG5EZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFwicmFtXCIpXG4gIC5mb3IodXBkYXRlZEJ5S2V5KVxuICAuZGVmaW5lKG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSwgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pKVxuICAuYXBwbHkoKTtcblxuZXhwb3J0IGNsYXNzIFJhbUFkYXB0ZXIgZXh0ZW5kcyBBZGFwdGVyPFxuICBSYW1TdG9yYWdlLFxuICBSYW1RdWVyeTxhbnk+LFxuICBSYW1GbGFncyxcbiAgQ29udGV4dDxSYW1GbGFncz5cbj4ge1xuICBwcm90ZWN0ZWQgZmFjdG9yeT86IFJhbUNsYXVzZUZhY3Rvcnk7XG5cbiAgY29uc3RydWN0b3IoZmxhdm91cjogc3RyaW5nID0gXCJyYW1cIikge1xuICAgIHN1cGVyKHt9LCBmbGF2b3VyKTtcbiAgfVxuXG4gIGFzeW5jIGNvbnRleHQ8TSBleHRlbmRzIE1vZGVsLCBDIGV4dGVuZHMgUmFtQ29udGV4dCwgRiBleHRlbmRzIFJhbUZsYWdzPihcbiAgICBvcGVyYXRpb246IGFueSxcbiAgICBvdmVycmlkZXM6IFBhcnRpYWw8UmFtRmxhZ3M+LFxuICAgIG1vZGVsOiBDb25zdHJ1Y3RvcjxNPixcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxDPiB7XG4gICAgcmV0dXJuIG5ldyBSYW1Db250ZXh0KFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdFJlcG9zaXRvcnlGbGFncywgb3ZlcnJpZGVzLCB7XG4gICAgICAgIGFmZmVjdGVkVGFibGVzOiBbbW9kZWwubmFtZV0sXG4gICAgICAgIHdyaXRlT3BlcmF0aW9uOiBvcGVyYXRpb24gIT09IE9wZXJhdGlvbktleXMuUkVBRCxcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLFxuICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbixcbiAgICAgICAgVVVJRDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIH0pIGFzIEZcbiAgICApIGFzIEM7XG4gIH1cbiAgcHJpdmF0ZSBpbmRleGVzOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIFJlY29yZDxzdHJpbmcsIGFueT4+XG4gID4gPSB7fTtcblxuICBwcml2YXRlIGxvY2sgPSBuZXcgTG9jaygpO1xuXG4gIHByaXZhdGUgc2VxdWVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBpbmRleCguLi5tb2RlbHM6IFJlY29yZDxzdHJpbmcsIGFueT5bXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuICAgIGRlbGV0ZSBwcmVwYXJlZC5yZWNvcmRbcGsgYXMgc3RyaW5nXTtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICByZXZlcnQ8TSBleHRlbmRzIE1vZGVsPihcbiAgICBvYmo6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2xheno6IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+LFxuICAgIHBrOiBrZXlvZiBNLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXJcbiAgKTogTSB7XG4gICAgY29uc3QgcmVzID0gc3VwZXIucmV2ZXJ0KG9iaiwgY2xhenosIHBrLCBpZCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgIG1vZGVsOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdID0ge307XG4gICAgaWYgKGlkIGluIHRoaXMubmF0aXZlW3RhYmxlTmFtZV0pXG4gICAgICB0aHJvdyBuZXcgQ29uZmxpY3RFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IGFscmVhZHkgZXhpc3RzIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF0gPSBtb2RlbDtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIHJlYWQoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBpZiAoISh0YWJsZU5hbWUgaW4gdGhpcy5uYXRpdmUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIShpZCBpbiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMubmF0aXZlW3RhYmxlTmFtZV1baWRdO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgbW9kZWw6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gICAgYXdhaXQgdGhpcy5sb2NrLmFjcXVpcmUoKTtcbiAgICBpZiAoISh0YWJsZU5hbWUgaW4gdGhpcy5uYXRpdmUpKVxuICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXJyb3IoYFRhYmxlICR7dGFibGVOYW1lfSBub3QgZm91bmRgKTtcbiAgICBpZiAoIShpZCBpbiB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgUmVjb3JkIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kIGluIHRhYmxlICR7dGFibGVOYW1lfWBcbiAgICAgICk7XG4gICAgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF0gPSBtb2RlbDtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGF3YWl0IHRoaXMubG9jay5hY3F1aXJlKCk7XG4gICAgaWYgKCEodGFibGVOYW1lIGluIHRoaXMubmF0aXZlKSlcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKGBUYWJsZSAke3RhYmxlTmFtZX0gbm90IGZvdW5kYCk7XG4gICAgaWYgKCEoaWQgaW4gdGhpcy5uYXRpdmVbdGFibGVOYW1lXSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IG5hdGl2ZWQgPSB0aGlzLm5hdGl2ZVt0YWJsZU5hbWVdW2lkXTtcbiAgICBkZWxldGUgdGhpcy5uYXRpdmVbdGFibGVOYW1lXVtpZF07XG4gICAgdGhpcy5sb2NrLnJlbGVhc2UoKTtcbiAgICByZXR1cm4gbmF0aXZlZDtcbiAgfVxuXG4gIHByb3RlY3RlZCB0YWJsZUZvcjxNIGV4dGVuZHMgTW9kZWw+KGZyb206IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSBcInN0cmluZ1wiKSBmcm9tID0gTW9kZWwuZ2V0KGZyb20pIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IHRhYmxlID0gUmVwb3NpdG9yeS50YWJsZShmcm9tKTtcbiAgICBpZiAoISh0YWJsZSBpbiB0aGlzLm5hdGl2ZSkpIHRoaXMubmF0aXZlW3RhYmxlXSA9IHt9O1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZVt0YWJsZV07XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIHJhdzxaPihyYXdJbnB1dDogUmFtUXVlcnk8YW55PiwgcHJvY2VzczogYm9vbGVhbik6IFByb21pc2U8Wj4ge1xuICAgIGNvbnN0IHsgd2hlcmUsIHNvcnQsIGxpbWl0LCBza2lwLCBmcm9tIH0gPSByYXdJbnB1dDtcbiAgICBsZXQgeyBzZWxlY3QgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLnRhYmxlRm9yKGZyb20pO1xuXG4gICAgY29uc3QgY2xhenogPSB0eXBlb2YgZnJvbSA9PT0gXCJzdHJpbmdcIiA/IE1vZGVsLmdldChmcm9tKSA6IGZyb207XG4gICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyBjbGF6eigpKTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSWQoaWQ6IGFueSkge1xuICAgICAgbGV0IHJlc3VsdCA9IGlkO1xuICAgICAgc3dpdGNoIChwcm9wcy50eXBlKSB7XG4gICAgICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICAgICAgICByZXN1bHQgPSBwYXJzZUludChyZXN1bHQpO1xuICAgICAgICAgIGlmIChpc05hTihyZXN1bHQpKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaWQgJHtpZH1gKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkJpZ0ludFwiOlxuICAgICAgICAgIHJlc3VsdCA9IEJpZ0ludChwYXJzZUludChyZXN1bHQpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgaWQgdHlwZSAke3Byb3BzLnR5cGV9LiBzaG91bGQgYmUgaW1wb3NzaWJsZWBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0OiBhbnlbXSA9IE9iamVjdC5lbnRyaWVzKGNvbGxlY3Rpb24pLm1hcCgoW3BrLCByXSkgPT5cbiAgICAgIHRoaXMucmV2ZXJ0KHIsIGNsYXp6LCBpZCBhcyBhbnksIHBhcnNlSWQocGspKVxuICAgICk7XG5cbiAgICByZXN1bHQgPSB3aGVyZSA/IHJlc3VsdC5maWx0ZXIod2hlcmUpIDogcmVzdWx0O1xuXG4gICAgaWYgKHNvcnQpIHJlc3VsdCA9IHJlc3VsdC5zb3J0KHNvcnQpO1xuXG4gICAgaWYgKHNraXApIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwKTtcbiAgICBpZiAobGltaXQpIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3QgOiBbc2VsZWN0XTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHIpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHIpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKChzZWxlY3QgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkpIGFjY1trZXldID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgWjtcbiAgfVxuXG4gIGFzeW5jIHBhZ2luYXRlPFo+KHJhd0lucHV0OiBzdHJpbmcpOiBQcm9taXNlPFBhZ2luYXRvcjxaLCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIG5ldyAoY2xhc3MgZXh0ZW5kcyBQYWdpbmF0b3I8Wiwgc3RyaW5nPiB7XG4gICAgICBjb25zdHJ1Y3RvcihzaXplOiBudW1iZXIpIHtcbiAgICAgICAgc3VwZXIodW5kZWZpbmVkIGFzIHVua25vd24gYXMgYW55LCBzaXplLCByYXdJbnB1dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIHByb3RlY3RlZCBwcmVwYXJlKHJhd1N0YXRlbWVudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC5cIik7XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBwYWdlKHBhZ2U6IG51bWJlcik6IFByb21pc2U8WltdPiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICAgICAgfVxuICAgIH0pKDEwKTtcbiAgfVxuXG4gIHBhcnNlRXJyb3I8ViBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvcik6IFYge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgVjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBWO1xuICB9XG5cbiAgZ2V0IENsYXVzZXMoKTogQ2xhdXNlRmFjdG9yeTxSYW1TdG9yYWdlLCBSYW1RdWVyeTxhbnk+LCB0eXBlb2YgdGhpcz4ge1xuICAgIGlmICghdGhpcy5mYWN0b3J5KSB0aGlzLmZhY3RvcnkgPSBuZXcgUmFtQ2xhdXNlRmFjdG9yeSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5mYWN0b3J5IGFzIGFueTtcbiAgfVxuXG4gIGdldCBTdGF0ZW1lbnQoKTogUmFtU3RhdGVtZW50PGFueT4ge1xuICAgIHJldHVybiBuZXcgUmFtU3RhdGVtZW50KHRoaXMpO1xuICB9XG5cbiAgYXN5bmMgU2VxdWVuY2Uob3B0aW9uczogU2VxdWVuY2VPcHRpb25zKTogUHJvbWlzZTxTZXF1ZW5jZT4ge1xuICAgIHJldHVybiBuZXcgUmFtU2VxdWVuY2Uob3B0aW9ucywgdGhpcyk7XG4gIH1cblxuICBwYXJzZUNvbmRpdGlvbihjb25kaXRpb246IENvbmRpdGlvbik6IFJhbVF1ZXJ5PGFueT4ge1xuICAgIHJldHVybiB7XG4gICAgICB3aGVyZTogKG06IE1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgYXR0cjEsIG9wZXJhdG9yLCBjb21wYXJpc29uIH0gPSBjb25kaXRpb24gYXMgdW5rbm93biBhcyB7XG4gICAgICAgICAgYXR0cjE6IHN0cmluZyB8IENvbmRpdGlvbjtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3IgfCBHcm91cE9wZXJhdG9yO1xuICAgICAgICAgIGNvbXBhcmlzb246IGFueTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgW0dyb3VwT3BlcmF0b3IuQU5ELCBHcm91cE9wZXJhdG9yLk9SLCBPcGVyYXRvci5OT1RdLmluZGV4T2YoXG4gICAgICAgICAgICBvcGVyYXRvciBhcyBHcm91cE9wZXJhdG9yXG4gICAgICAgICAgKSA9PT0gLTFcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5CSUdHRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA+IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkJJR0dFUl9FUTpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID49IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLkRJRkZFUkVOVDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdICE9PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5FUVVBTDpcbiAgICAgICAgICAgICAgcmV0dXJuIG1bYXR0cjEgYXMga2V5b2YgTW9kZWxdID09PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgY2FzZSBPcGVyYXRvci5SRUdFWFA6XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gIT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFF1ZXJ5RXJyb3IoXG4gICAgICAgICAgICAgICAgICBgSW52YWxpZCByZWdleHAgY29tcGFyaXNvbiBvbiBhIG5vbiBzdHJpbmcgYXR0cmlidXRlOiAke21bYXR0cjEgYXMga2V5b2YgTW9kZWxdfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gISEobVthdHRyMSBhcyBrZXlvZiBNb2RlbF0gYXMgdW5rbm93biBhcyBzdHJpbmcpLm1hdGNoKFxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoY29tcGFyaXNvbiwgXCJnXCIpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVI6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8IGNvbXBhcmlzb247XG4gICAgICAgICAgICBjYXNlIE9wZXJhdG9yLlNNQUxMRVJfRVE6XG4gICAgICAgICAgICAgIHJldHVybiBtW2F0dHIxIGFzIGtleW9mIE1vZGVsXSA8PSBjb21wYXJpc29uO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICAgICAgICAgICAgYEludmFsaWQgb3BlcmF0b3IgZm9yIHN0YW5kYXJkIGNvbXBhcmlzb25zOiAke29wZXJhdG9yfWBcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3IgPT09IE9wZXJhdG9yLk5PVCkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm90IGltcGxlbWVudGVkXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG9wMTogUmFtUXVlcnk8YW55PiA9IHRoaXMucGFyc2VDb25kaXRpb24oYXR0cjEgYXMgQ29uZGl0aW9uKTtcbiAgICAgICAgICBjb25zdCBvcDI6IFJhbVF1ZXJ5PGFueT4gPSB0aGlzLnBhcnNlQ29uZGl0aW9uKFxuICAgICAgICAgICAgY29tcGFyaXNvbiBhcyBDb25kaXRpb25cbiAgICAgICAgICApO1xuICAgICAgICAgIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICAgICAgICAgIGNhc2UgR3JvdXBPcGVyYXRvci5BTkQ6XG4gICAgICAgICAgICAgIHJldHVybiBvcDEud2hlcmUobSkgJiYgb3AyLndoZXJlKG0pO1xuICAgICAgICAgICAgY2FzZSBHcm91cE9wZXJhdG9yLk9SOlxuICAgICAgICAgICAgICByZXR1cm4gb3AxLndoZXJlKG0pIHx8IG9wMi53aGVyZShtKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgICAgIGBJbnZhbGlkIG9wZXJhdG9yIGZvciBBbmQvT3IgY29tcGFyaXNvbnM6ICR7b3BlcmF0b3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9IGFzIFJhbVF1ZXJ5PGFueT47XG4gIH1cbn1cbiJdfQ==
|
449
|
+
RamAdapter.decoration();
|
450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFtQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yYW0vUmFtQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFcEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzFELE9BQU8sRUFFTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLFlBQVksR0FDYixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGNBQWMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFFBQVEsR0FFVCxNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFekM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsT0FLL0I7SUFDQyxZQUFZLEtBQWM7UUFDeEIsS0FBSyxDQUFDLElBQUksR0FBRyxFQUE0QixFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQWtDdkQsWUFBTyxHQUFHLFVBQVUsQ0FBQztRQUV0QixZQUFPLEdBR1gsRUFBRSxDQUFDO1FBRUMsU0FBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7SUF4QzFCLENBQUM7SUFFRDs7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QUFDO1FBQ2hFLFVBQVUsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO2FBQy9CLEdBQUcsQ0FBQyxZQUFZLENBQUM7YUFDakIsTUFBTSxDQUNMLFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxFQUNwQyxZQUFZLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUMvQjthQUNBLEtBQUssRUFBRSxDQUFDO1FBQ1gsVUFBVSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7YUFDL0IsR0FBRyxDQUFDLFlBQVksQ0FBQzthQUNqQixNQUFNLENBQ0wsUUFBUSxDQUFDLDBCQUEwQixDQUFDLEVBQ3BDLFlBQVksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQy9CO2FBQ0EsS0FBSyxFQUFFLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFFRCxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSYW1GbGFncywgUmF3UmFtUXVlcnksIFJhbVN0b3JhZ2UsIFJhbVJlcG9zaXRvcnkgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmFtU3RhdGVtZW50IH0gZnJvbSBcIi4vUmFtU3RhdGVtZW50XCI7XG5pbXBvcnQgeyBSYW1Db250ZXh0IH0gZnJvbSBcIi4vUmFtQ29udGV4dFwiO1xuaW1wb3J0IHsgUmVwb3NpdG9yeSB9IGZyb20gXCIuLi9yZXBvc2l0b3J5L1JlcG9zaXRvcnlcIjtcbmltcG9ydCB7IEFkYXB0ZXIsIFBlcnNpc3RlbmNlS2V5cywgU2VxdWVuY2UgfSBmcm9tIFwiLi4vcGVyc2lzdGVuY2VcIjtcbmltcG9ydCB7IFNlcXVlbmNlT3B0aW9ucyB9IGZyb20gXCIuLi9pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBMb2NrIH0gZnJvbSBcIkBkZWNhZi10cy90cmFuc2FjdGlvbmFsLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBEZWNvcmF0aW9uLFxuICBNb2RlbCxcbiAgcHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBCYXNlRXJyb3IsXG4gIENvbmZsaWN0RXJyb3IsXG4gIGZpbmRQcmltYXJ5S2V5LFxuICBJbnRlcm5hbEVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxuICBvbkNyZWF0ZSxcbiAgT3BlcmF0aW9uS2V5cyxcbn0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBSYW1TZXF1ZW5jZSB9IGZyb20gXCIuL1JhbVNlcXVlbmNlXCI7XG5pbXBvcnQgeyBjcmVhdGVkQnlPblJhbUNyZWF0ZVVwZGF0ZSB9IGZyb20gXCIuL2hhbmRsZXJzXCI7XG5pbXBvcnQgeyBSYW1GbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEluLW1lbW9yeSBhZGFwdGVyIGZvciBkYXRhIHBlcnNpc3RlbmNlXG4gKiBAc3VtbWFyeSBUaGUgUmFtQWRhcHRlciBwcm92aWRlcyBhbiBpbi1tZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIHBlcnNpc3RlbmNlIGxheWVyLlxuICogSXQgc3RvcmVzIGRhdGEgaW4gSmF2YVNjcmlwdCBNYXBzIGFuZCBwcm92aWRlcyBDUlVEIG9wZXJhdGlvbnMgYW5kIHF1ZXJ5IGNhcGFiaWxpdGllcy5cbiAqIFRoaXMgYWRhcHRlciBpcyB1c2VmdWwgZm9yIHRlc3RpbmcsIHByb3RvdHlwaW5nLCBhbmQgYXBwbGljYXRpb25zIHRoYXQgZG9uJ3QgcmVxdWlyZVxuICogcGVyc2lzdGVudCBzdG9yYWdlIGFjcm9zcyBhcHBsaWNhdGlvbiByZXN0YXJ0cy5cbiAqIEBjbGFzcyBSYW1BZGFwdGVyXG4gKiBAY2F0ZWdvcnkgUmFtXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgbmV3IFJBTSBhZGFwdGVyXG4gKiBjb25zdCBhZGFwdGVyID0gbmV3IFJhbUFkYXB0ZXIoJ215UmFtQWRhcHRlcicpO1xuICpcbiAqIC8vIENyZWF0ZSBhIHJlcG9zaXRvcnkgZm9yIGEgbW9kZWxcbiAqIGNvbnN0IHVzZXJSZXBvID0gbmV3IChhZGFwdGVyLnJlcG9zaXRvcnk8VXNlcj4oKSkoVXNlciwgYWRhcHRlcik7XG4gKlxuICogLy8gUGVyZm9ybSBDUlVEIG9wZXJhdGlvbnNcbiAqIGNvbnN0IHVzZXIgPSBuZXcgVXNlcih7IG5hbWU6ICdKb2huJywgZW1haWw6ICdqb2huQGV4YW1wbGUuY29tJyB9KTtcbiAqIGF3YWl0IHVzZXJSZXBvLmNyZWF0ZSh1c2VyKTtcbiAqIGNvbnN0IHJldHJpZXZlZFVzZXIgPSBhd2FpdCB1c2VyUmVwby5maW5kQnlJZCh1c2VyLmlkKTtcbiAqIGBgYFxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUmVwb3NpdG9yeVxuICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGNyZWF0ZShtb2RlbClcbiAqICAgUmVwb3NpdG9yeS0+PlJhbUFkYXB0ZXI6IGNyZWF0ZSh0YWJsZU5hbWUsIGlkLCBtb2RlbClcbiAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBzZXQoaWQsIG1vZGVsKVxuICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAqICAgUmFtQWRhcHRlci0tPj5SZXBvc2l0b3J5OiBtb2RlbFxuICogICBSZXBvc2l0b3J5LS0+PkNsaWVudDogbW9kZWxcbiAqXG4gKiAgIENsaWVudC0+PlJlcG9zaXRvcnk6IGZpbmRCeUlkKGlkKVxuICogICBSZXBvc2l0b3J5LT4+UmFtQWRhcHRlcjogcmVhZCh0YWJsZU5hbWUsIGlkKVxuICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICogICBTdG9yYWdlLS0+PlJhbUFkYXB0ZXI6IG1vZGVsXG4gKiAgIFJhbUFkYXB0ZXItLT4+UmVwb3NpdG9yeTogbW9kZWxcbiAqICAgUmVwb3NpdG9yeS0tPj5DbGllbnQ6IG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBSYW1BZGFwdGVyIGV4dGVuZHMgQWRhcHRlcjxcbiAgUmFtU3RvcmFnZSxcbiAgUmF3UmFtUXVlcnk8YW55PixcbiAgUmFtRmxhZ3MsXG4gIFJhbUNvbnRleHRcbj4ge1xuICBjb25zdHJ1Y3RvcihhbGlhcz86IHN0cmluZykge1xuICAgIHN1cGVyKG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBhbnk+PigpLCBSYW1GbGF2b3VyLCBhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIHJlcG9zaXRvcnkgY29uc3RydWN0b3IgZm9yIGEgbW9kZWxcbiAgICogQHN1bW1hcnkgUmV0dXJucyBhIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyByZXBvc2l0b3JpZXMgdGhhdCB3b3JrIHdpdGggdGhlIHNwZWNpZmllZCBtb2RlbCB0eXBlLlxuICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBSQU0tc3BlY2lmaWMgcmVwb3NpdG9yeSBmdW5jdGlvbmFsaXR5LlxuICAgKiBAdGVtcGxhdGUgTSAtIFRoZSBtb2RlbCB0eXBlIGZvciB0aGUgcmVwb3NpdG9yeVxuICAgKiBAcmV0dXJuIHtDb25zdHJ1Y3RvcjxSYW1SZXBvc2l0b3J5PE0+Pn0gQSBjb25zdHJ1Y3RvciBmb3IgY3JlYXRpbmcgUkFNIHJlcG9zaXRvcmllc1xuICAgKi9cbiAgb3ZlcnJpZGUgcmVwb3NpdG9yeTxNIGV4dGVuZHMgTW9kZWw+KCk6IENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+IHtcbiAgICByZXR1cm4gc3VwZXIucmVwb3NpdG9yeTxNPigpIGFzIENvbnN0cnVjdG9yPFJhbVJlcG9zaXRvcnk8TT4+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIG9wZXJhdGlvbiBmbGFncyB3aXRoIFVVSURcbiAgICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgYmFzZSBmbGFncyB3aXRoIGEgVVVJRCBmb3IgdXNlciBpZGVudGlmaWNhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgZW5zdXJlcyB0aGF0IGFsbCBvcGVyYXRpb25zIGhhdmUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdHJhY2tpbmcgcHVycG9zZXMuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSBvcGVyYXRpb25cbiAgICogQHBhcmFtIHtPcGVyYXRpb25LZXlzfSBvcGVyYXRpb24gLSBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkXG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8TT59IG1vZGVsIC0gVGhlIG1vZGVsIGNvbnN0cnVjdG9yXG4gICAqIEBwYXJhbSB7UGFydGlhbDxSYW1GbGFncz59IGZsYWdzIC0gUGFydGlhbCBmbGFncyB0byBiZSBleHRlbmRlZFxuICAgKiBAcmV0dXJuIHtSYW1GbGFnc30gQ29tcGxldGUgZmxhZ3Mgd2l0aCBVVUlEXG4gICAqL1xuICBvdmVycmlkZSBmbGFnczxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9wZXJhdGlvbjogT3BlcmF0aW9uS2V5cyxcbiAgICBtb2RlbDogQ29uc3RydWN0b3I8TT4sXG4gICAgZmxhZ3M6IFBhcnRpYWw8UmFtRmxhZ3M+XG4gICk6IFJhbUZsYWdzIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihzdXBlci5mbGFncyhvcGVyYXRpb24sIG1vZGVsLCBmbGFncyksIHtcbiAgICAgIFVVSUQ6IGNyeXB0by5yYW5kb21VVUlEKCksXG4gICAgfSkgYXMgUmFtRmxhZ3M7XG4gIH1cblxuICBvdmVycmlkZSBDb250ZXh0ID0gUmFtQ29udGV4dDtcblxuICBwcml2YXRlIGluZGV4ZXM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgUmVjb3JkPHN0cmluZyB8IG51bWJlciwgUmVjb3JkPHN0cmluZywgYW55Pj5cbiAgPiA9IHt9O1xuXG4gIHByaXZhdGUgbG9jayA9IG5ldyBMb2NrKCk7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgUkFNIGFkYXB0ZXJcbiAgICogQHN1bW1hcnkgQSBuby1vcCBpbml0aWFsaXphdGlvbiBtZXRob2QgZm9yIHRoZSBSQU0gYWRhcHRlci5cbiAgICogU2luY2UgUkFNIGFkYXB0ZXIgZG9lc24ndCByZXF1aXJlIGFueSBzZXR1cCwgdGhpcyBtZXRob2Qgc2ltcGx5IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gSW5pdGlhbGl6YXRpb24gYXJndW1lbnRzICh1bnVzZWQpXG4gICAqIEByZXR1cm4ge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgYXN5bmMgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5kZXhlcyBtb2RlbHMgaW4gdGhlIFJBTSBhZGFwdGVyXG4gICAqIEBzdW1tYXJ5IEEgbm8tb3AgaW5kZXhpbmcgbWV0aG9kIGZvciB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFNpbmNlIFJBTSBhZGFwdGVyIGRvZXNuJ3QgcmVxdWlyZSBleHBsaWNpdCBpbmRleGluZywgdGhpcyBtZXRob2Qgc2ltcGx5IHJlc29sdmVzIGltbWVkaWF0ZWx5LlxuICAgKiBAcGFyYW0gbW9kZWxzIC0gTW9kZWxzIHRvIGJlIGluZGV4ZWQgKHVudXNlZClcbiAgICogQHJldHVybiB7UHJvbWlzZTxhbnk+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluZGV4aW5nIGlzIGNvbXBsZXRlXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGluZGV4KC4uLm1vZGVsczogUmVjb3JkPHN0cmluZywgYW55PltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIGEgbW9kZWwgZm9yIHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgQ29udmVydHMgYSBtb2RlbCBpbnN0YW5jZSB0byBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igc3RvcmFnZSBpbiB0aGUgUkFNIGFkYXB0ZXIuXG4gICAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIHRoZSBwcmltYXJ5IGtleSBhbmQgY3JlYXRlcyBhIHJlY29yZCB3aXRob3V0IHRoZSBwcmltYXJ5IGtleSBmaWVsZC5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBiZWluZyBwcmVwYXJlZFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIHByZXBhcmVcbiAgICogQHBhcmFtIHBrIC0gVGhlIHByaW1hcnkga2V5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybiBPYmplY3QgY29udGFpbmluZyB0aGUgcmVjb3JkIGFuZCBJRFxuICAgKi9cbiAgb3ZlcnJpZGUgcHJlcGFyZTxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIHBrOiBrZXlvZiBNXG4gICk6IHsgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+OyBpZDogc3RyaW5nIH0ge1xuICAgIGNvbnN0IHByZXBhcmVkID0gc3VwZXIucHJlcGFyZShtb2RlbCwgcGspO1xuICAgIGRlbGV0ZSBwcmVwYXJlZC5yZWNvcmRbcGsgYXMgc3RyaW5nXTtcbiAgICByZXR1cm4gcHJlcGFyZWQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RvcmVkIHJlY29yZCBiYWNrIHRvIGEgbW9kZWwgaW5zdGFuY2VcbiAgICogQHN1bW1hcnkgUmVjb25zdHJ1Y3RzIGEgbW9kZWwgaW5zdGFuY2UgZnJvbSBhIHN0b3JlZCByZWNvcmQgYnkgYWRkaW5nIGJhY2sgdGhlIHByaW1hcnkga2V5LlxuICAgKiBUaGlzIG1ldGhvZCBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgcHJlcGFyZSBtZXRob2QuXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgdG8gcmV2ZXJ0IHRvXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gb2JqIC0gVGhlIHN0b3JlZCByZWNvcmRcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3RvcjxNPn0gY2xhenogLSBUaGUgbW9kZWwgY2xhc3Mgb3IgbmFtZVxuICAgKiBAcGFyYW0gcGsgLSBUaGUgcHJpbWFyeSBrZXkgcHJvcGVydHkgbmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgcHJpbWFyeSBrZXkgdmFsdWVcbiAgICogQHJldHVybiB7TX0gVGhlIHJlY29uc3RydWN0ZWQgbW9kZWwgaW5zdGFuY2VcbiAgICovXG4gIG92ZXJyaWRlIHJldmVydDxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG9iajogUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjbGF6ejogc3RyaW5nIHwgQ29uc3RydWN0b3I8TT4sXG4gICAgcGs6IGtleW9mIE0sXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBNIHtcbiAgICBjb25zdCByZXMgPSBzdXBlci5yZXZlcnQob2JqLCBjbGF6eiwgcGssIGlkKTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHJlY29yZCBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgU3RvcmVzIGEgbmV3IHJlY29yZCBpbiB0aGUgc3BlY2lmaWVkIHRhYmxlIHdpdGggdGhlIGdpdmVuIElELlxuICAgKiBUaGlzIG1ldGhvZCBhY3F1aXJlcyBhIGxvY2sgdG8gZW5zdXJlIHRocmVhZCBzYWZldHksIGNyZWF0ZXMgdGhlIHRhYmxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QsXG4gICAqIGNoZWNrcyBmb3IgY29uZmxpY3RzLCBhbmQgc3RvcmVzIHRoZSBtb2RlbC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBzdG9yZSB0aGUgcmVjb3JkIGluXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlY29yZFxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIHJlY29yZCBkYXRhIHRvIHN0b3JlXG4gICAqIEByZXR1cm4ge1Byb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBzdG9yZWQgcmVjb3JkXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFJhbUFkYXB0ZXJcbiAgICogICBwYXJ0aWNpcGFudCBTdG9yYWdlIGFzIEluLU1lbW9yeSBTdG9yYWdlXG4gICAqXG4gICAqICAgQ2FsbGVyLT4+UmFtQWRhcHRlcjogY3JlYXRlKHRhYmxlTmFtZSwgaWQsIG1vZGVsKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiBsb2NrLmFjcXVpcmUoKVxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXModGFibGVOYW1lKVxuICAgKiAgIGFsdCBUYWJsZSBkb2Vzbid0IGV4aXN0XG4gICAqICAgICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogc2V0KHRhYmxlTmFtZSwgbmV3IE1hcCgpKVxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItPj5TdG9yYWdlOiBoYXMoaWQpXG4gICAqICAgYWx0IFJlY29yZCBleGlzdHNcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBDb25mbGljdEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyBjcmVhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpIHRoaXMubmF0aXZlLnNldCh0YWJsZU5hbWUsIG5ldyBNYXAoKSk7XG4gICAgaWYgKHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpICYmIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5oYXMoaWQpKVxuICAgICAgdGhyb3cgbmV3IENvbmZsaWN0RXJyb3IoXG4gICAgICAgIGBSZWNvcmQgd2l0aCBpZCAke2lkfSBhbHJlYWR5IGV4aXN0cyBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVjb3JkIGZyb20gaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgRmV0Y2hlcyBhIHJlY29yZCB3aXRoIHRoZSBzcGVjaWZpZWQgSUQgZnJvbSB0aGUgZ2l2ZW4gdGFibGUuXG4gICAqIFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdGFibGUgYW5kIHJlY29yZCBleGlzdCBhbmQgdGhyb3dzIGFwcHJvcHJpYXRlIGVycm9ycyBpZiBub3QuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgdG8gcmV0cmlldmUgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlcn0gaWQgLSBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHJlY29yZCB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmV0cmlldmVkIHJlY29yZFxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgU3RvcmFnZSBhcyBJbi1NZW1vcnkgU3RvcmFnZVxuICAgKlxuICAgKiAgIENhbGxlci0+PlJhbUFkYXB0ZXI6IHJlYWQodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHJlY29yZFxuICAgKi9cbiAgYXN5bmMgcmVhZChcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nIHwgbnVtYmVyXG4gICk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlcyBhbiBleGlzdGluZyByZWNvcmQgaW4gdGhlIGluLW1lbW9yeSBzdG9yYWdlXG4gICAqIEBzdW1tYXJ5IFVwZGF0ZXMgYSByZWNvcmQgd2l0aCB0aGUgc3BlY2lmaWVkIElEIGluIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIGFuZCB1cGRhdGVzIHRoZSByZWNvcmQgd2l0aCB0aGUgbmV3IGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIHVwZGF0ZVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IG1vZGVsIC0gVGhlIG5ldyByZWNvcmQgZGF0YVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXBkYXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiB1cGRhdGUodGFibGVOYW1lLCBpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2suYWNxdWlyZSgpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyh0YWJsZU5hbWUpXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGhhcyhpZClcbiAgICogICBhbHQgUmVjb3JkIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBOb3RGb3VuZEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IHNldChpZCwgbW9kZWwpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGxvY2sucmVsZWFzZSgpXG4gICAqICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IG1vZGVsXG4gICAqL1xuICBhc3luYyB1cGRhdGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlcixcbiAgICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PlxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIHRoaXMubmF0aXZlLmdldCh0YWJsZU5hbWUpPy5zZXQoaWQsIG1vZGVsKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlcyBhIHJlY29yZCBmcm9tIHRoZSBpbi1tZW1vcnkgc3RvcmFnZVxuICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBJRCBmcm9tIHRoZSBnaXZlbiB0YWJsZS5cbiAgICogVGhpcyBtZXRob2QgYWNxdWlyZXMgYSBsb2NrIHRvIGVuc3VyZSB0aHJlYWQgc2FmZXR5LCBjaGVja3MgaWYgdGhlIHRhYmxlIGFuZCByZWNvcmQgZXhpc3QsXG4gICAqIHJldHJpZXZlcyB0aGUgcmVjb3JkIGJlZm9yZSBkZWxldGlvbiwgYW5kIHRoZW4gcmVtb3ZlcyBpdCBmcm9tIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWJsZU5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgdGFibGUgY29udGFpbmluZyB0aGUgcmVjb3JkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyfSBpZCAtIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcmVjb3JkIHRvIGRlbGV0ZVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgZGVsZXRlZCByZWNvcmRcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiBkZWxldGUodGFibGVOYW1lLCBpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5hY3F1aXJlKClcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKHRhYmxlTmFtZSlcbiAgICogICBhbHQgVGFibGUgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogaGFzKGlkKVxuICAgKiAgIGFsdCBSZWNvcmQgZG9lc24ndCBleGlzdFxuICAgKiAgICAgUmFtQWRhcHRlci0tPj5DYWxsZXI6IHRocm93IE5vdEZvdW5kRXJyb3JcbiAgICogICBlbmRcbiAgICogICBSYW1BZGFwdGVyLT4+U3RvcmFnZTogZ2V0KGlkKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogcmVjb3JkXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGRlbGV0ZShpZClcbiAgICogICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogbG9jay5yZWxlYXNlKClcbiAgICogICBSYW1BZGFwdGVyLS0+PkNhbGxlcjogcmVjb3JkXG4gICAqL1xuICBhc3luYyBkZWxldGUoXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyB8IG51bWJlclxuICApOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgICBhd2FpdCB0aGlzLmxvY2suYWNxdWlyZSgpO1xuICAgIGlmICghdGhpcy5uYXRpdmUuaGFzKHRhYmxlTmFtZSkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihgVGFibGUgJHt0YWJsZU5hbWV9IG5vdCBmb3VuZGApO1xuICAgIGlmICghdGhpcy5uYXRpdmUuZ2V0KHRhYmxlTmFtZSk/LmhhcyhpZCkpXG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFcnJvcihcbiAgICAgICAgYFJlY29yZCB3aXRoIGlkICR7aWR9IG5vdCBmb3VuZCBpbiB0YWJsZSAke3RhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIGNvbnN0IG5hdGl2ZWQgPSB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZ2V0KGlkKTtcbiAgICB0aGlzLm5hdGl2ZS5nZXQodGFibGVOYW1lKT8uZGVsZXRlKGlkKTtcbiAgICB0aGlzLmxvY2sucmVsZWFzZSgpO1xuICAgIHJldHVybiBuYXRpdmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZXRzIG9yIGNyZWF0ZXMgYSB0YWJsZSBpbiB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBNYXAgcmVwcmVzZW50aW5nIGEgdGFibGUgZm9yIGEgZ2l2ZW4gbW9kZWwgb3IgdGFibGUgbmFtZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXNuJ3QgZXhpc3QsIGl0IGNyZWF0ZXMgYSBuZXcgb25lLiBUaGlzIGlzIGEgaGVscGVyIG1ldGhvZCB1c2VkXG4gICAqIGJ5IG90aGVyIG1ldGhvZHMgdG8gYWNjZXNzIHRoZSBjb3JyZWN0IHN0b3JhZ2UgbG9jYXRpb24uXG4gICAqIEB0ZW1wbGF0ZSBNIC0gVGhlIG1vZGVsIHR5cGUgZm9yIHRoZSB0YWJsZVxuICAgKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yPE0+fSBmcm9tIC0gVGhlIG1vZGVsIGNsYXNzIG9yIHRhYmxlIG5hbWVcbiAgICogQHJldHVybiB7TWFwPHN0cmluZyB8IG51bWJlciwgYW55PiB8IHVuZGVmaW5lZH0gVGhlIHRhYmxlIE1hcCBvciB1bmRlZmluZWRcbiAgICovXG4gIHByb3RlY3RlZCB0YWJsZUZvcjxNIGV4dGVuZHMgTW9kZWw+KGZyb206IHN0cmluZyB8IENvbnN0cnVjdG9yPE0+KSB7XG4gICAgaWYgKHR5cGVvZiBmcm9tID09PSBcInN0cmluZ1wiKSBmcm9tID0gTW9kZWwuZ2V0KGZyb20pIGFzIENvbnN0cnVjdG9yPE0+O1xuICAgIGNvbnN0IHRhYmxlID0gUmVwb3NpdG9yeS50YWJsZShmcm9tKTtcbiAgICBpZiAoIXRoaXMubmF0aXZlLmhhcyh0YWJsZSkpIHRoaXMubmF0aXZlLnNldCh0YWJsZSwgbmV3IE1hcCgpKTtcbiAgICByZXR1cm4gdGhpcy5uYXRpdmUuZ2V0KHRhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSByYXcgcXVlcnkgYWdhaW5zdCB0aGUgaW4tbWVtb3J5IHN0b3JhZ2VcbiAgICogQHN1bW1hcnkgUGVyZm9ybXMgYSBxdWVyeSBvcGVyYXRpb24gb24gdGhlIGluLW1lbW9yeSBkYXRhIHN0b3JlIHVzaW5nIHRoZSBwcm92aWRlZCBxdWVyeSBzcGVjaWZpY2F0aW9uLlxuICAgKiBUaGlzIG1ldGhvZCBzdXBwb3J0cyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIGFuZCBmaWVsZCBzZWxlY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBxdWVyeVxuICAgKiBAcGFyYW0ge1Jhd1JhbVF1ZXJ5PGFueT59IHJhd0lucHV0IC0gVGhlIHF1ZXJ5IHNwZWNpZmljYXRpb25cbiAgICogQHJldHVybiB7UHJvbWlzZTxSPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHF1ZXJ5IHJlc3VsdHNcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUmFtQWRhcHRlclxuICAgKiAgIHBhcnRpY2lwYW50IFN0b3JhZ2UgYXMgSW4tTWVtb3J5IFN0b3JhZ2VcbiAgICpcbiAgICogICBDYWxsZXItPj5SYW1BZGFwdGVyOiByYXcocmF3SW5wdXQpXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IHRhYmxlRm9yKGZyb20pXG4gICAqICAgYWx0IFRhYmxlIGRvZXNuJ3QgZXhpc3RcbiAgICogICAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiB0aHJvdyBJbnRlcm5hbEVycm9yXG4gICAqICAgZW5kXG4gICAqICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpXG4gICAqICAgUmFtQWRhcHRlci0+PlN0b3JhZ2U6IGVudHJpZXMoKVxuICAgKiAgIFN0b3JhZ2UtLT4+UmFtQWRhcHRlcjogZW50cmllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggZW50cnlcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXZlcnQociwgZnJvbSwgaWQsIHBrKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBXaGVyZSBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LmZpbHRlcih3aGVyZSlcbiAgICogICBlbmRcbiAgICogICBhbHQgU29ydCBjb25kaXRpb24gZXhpc3RzXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNvcnQoc29ydClcbiAgICogICBlbmRcbiAgICogICBhbHQgU2tpcCBzcGVjaWZpZWRcbiAgICogICAgIFJhbUFkYXB0ZXItPj5SYW1BZGFwdGVyOiByZXN1bHQuc2xpY2Uoc2tpcClcbiAgICogICBlbmRcbiAgICogICBhbHQgTGltaXQgc3BlY2lmaWVkXG4gICAqICAgICBSYW1BZGFwdGVyLT4+UmFtQWRhcHRlcjogcmVzdWx0LnNsaWNlKDAsIGxpbWl0KVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBTZWxlY3QgZmllbGRzIHNwZWNpZmllZFxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCByZXN1bHRcbiAgICogICAgICAgUmFtQWRhcHRlci0+PlJhbUFkYXB0ZXI6IEZpbHRlciB0byBzZWxlY3RlZCBmaWVsZHNcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIFJhbUFkYXB0ZXItLT4+Q2FsbGVyOiByZXN1bHRcbiAgICovXG4gIGFzeW5jIHJhdzxSPihyYXdJbnB1dDogUmF3UmFtUXVlcnk8YW55Pik6IFByb21pc2U8Uj4ge1xuICAgIGNvbnN0IHsgd2hlcmUsIHNvcnQsIGxpbWl0LCBza2lwLCBmcm9tIH0gPSByYXdJbnB1dDtcbiAgICBsZXQgeyBzZWxlY3QgfSA9IHJhd0lucHV0O1xuICAgIGNvbnN0IGNvbGxlY3Rpb24gPSB0aGlzLnRhYmxlRm9yKGZyb20pO1xuICAgIGlmICghY29sbGVjdGlvbilcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKGBUYWJsZSAke2Zyb219IG5vdCBmb3VuZCBpbiBSYW1BZGFwdGVyYCk7XG4gICAgY29uc3QgeyBpZCwgcHJvcHMgfSA9IGZpbmRQcmltYXJ5S2V5KG5ldyBmcm9tKCkpO1xuXG4gICAgbGV0IHJlc3VsdDogYW55W10gPSBBcnJheS5mcm9tKGNvbGxlY3Rpb24uZW50cmllcygpKS5tYXAoKFtwaywgcl0pID0+XG4gICAgICB0aGlzLnJldmVydChcbiAgICAgICAgcixcbiAgICAgICAgZnJvbSxcbiAgICAgICAgaWQgYXMgYW55LFxuICAgICAgICBTZXF1ZW5jZS5wYXJzZVZhbHVlKHByb3BzLnR5cGUgYXMgYW55LCBwayBhcyBzdHJpbmcpIGFzIHN0cmluZ1xuICAgICAgKVxuICAgICk7XG5cbiAgICByZXN1bHQgPSB3aGVyZSA/IHJlc3VsdC5maWx0ZXIod2hlcmUpIDogcmVzdWx0O1xuXG4gICAgaWYgKHNvcnQpIHJlc3VsdCA9IHJlc3VsdC5zb3J0KHNvcnQpO1xuXG4gICAgaWYgKHNraXApIHJlc3VsdCA9IHJlc3VsdC5zbGljZShza2lwKTtcbiAgICBpZiAobGltaXQpIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBsaW1pdCk7XG5cbiAgICBpZiAoc2VsZWN0KSB7XG4gICAgICBzZWxlY3QgPSBBcnJheS5pc0FycmF5KHNlbGVjdCkgPyBzZWxlY3QgOiBbc2VsZWN0XTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5tYXAoKHIpID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKHIpLnJlZHVjZSgoYWNjOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICAgICAgaWYgKChzZWxlY3QgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGtleSkpIGFjY1trZXldID0gdmFsO1xuICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgIH0sIHt9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGFuZCBjb252ZXJ0cyBlcnJvcnMgdG8gYXBwcm9wcmlhdGUgdHlwZXNcbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IGVycm9ycyBhcmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgY29uc2lzdGVudCBlcnJvciBoYW5kbGluZy5cbiAgICogSWYgdGhlIGVycm9yIGlzIGFscmVhZHkgYSBCYXNlRXJyb3IsIGl0J3MgcmV0dXJuZWQgYXMgaXM7IG90aGVyd2lzZSwgaXQncyB3cmFwcGVkIGluIGFuIEludGVybmFsRXJyb3IuXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIGV4cGVjdGVkIGVycm9yIHR5cGUsIGV4dGVuZGluZyBCYXNlRXJyb3JcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyIC0gVGhlIGVycm9yIHRvIHBhcnNlXG4gICAqIEByZXR1cm4ge1Z9IFRoZSBwYXJzZWQgZXJyb3Igb2YgdGhlIGV4cGVjdGVkIHR5cGVcbiAgICovXG4gIHBhcnNlRXJyb3I8ViBleHRlbmRzIEJhc2VFcnJvcj4oZXJyOiBFcnJvcik6IFYge1xuICAgIGlmIChlcnIgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHJldHVybiBlcnIgYXMgVjtcbiAgICByZXR1cm4gbmV3IEludGVybmFsRXJyb3IoZXJyKSBhcyBWO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IHN0YXRlbWVudCBidWlsZGVyIGZvciBxdWVyaWVzXG4gICAqIEBzdW1tYXJ5IEZhY3RvcnkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIG5ldyBSYW1TdGF0ZW1lbnQgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHF1ZXJpZXMuXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgZmx1ZW50IHF1ZXJ5IGNvbnN0cnVjdGlvbiBhZ2FpbnN0IHRoZSBSQU0gYWRhcHRlci5cbiAgICogQHRlbXBsYXRlIE0gLSBUaGUgbW9kZWwgdHlwZSBmb3IgdGhlIHN0YXRlbWVudFxuICAgKiBAcmV0dXJuIHtSYW1TdGF0ZW1lbnQ8TSwgYW55Pn0gQSBuZXcgc3RhdGVtZW50IGJ1aWxkZXIgaW5zdGFuY2VcbiAgICovXG4gIFN0YXRlbWVudDxNIGV4dGVuZHMgTW9kZWw+KCk6IFJhbVN0YXRlbWVudDxNLCBhbnk+IHtcbiAgICByZXR1cm4gbmV3IFJhbVN0YXRlbWVudDxNLCBhbnk+KHRoaXMgYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBzZXF1ZW5jZSBmb3IgZ2VuZXJhdGluZyBzZXF1ZW50aWFsIElEc1xuICAgKiBAc3VtbWFyeSBGYWN0b3J5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBuZXcgUmFtU2VxdWVuY2UgaW5zdGFuY2UgZm9yIElEIGdlbmVyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd2F5IHRvIGNyZWF0ZSBhdXRvLWluY3JlbWVudGluZyBzZXF1ZW5jZXMgZm9yIGVudGl0eSBJRHMuXG4gICAqIEBwYXJhbSB7U2VxdWVuY2VPcHRpb25zfSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2VxdWVuY2VcbiAgICogQHJldHVybiB7UHJvbWlzZTxTZXF1ZW5jZT59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBuZXcgc2VxdWVuY2UgaW5zdGFuY2VcbiAgICovXG4gIGFzeW5jIFNlcXVlbmNlKG9wdGlvbnM6IFNlcXVlbmNlT3B0aW9ucyk6IFByb21pc2U8U2VxdWVuY2U+IHtcbiAgICByZXR1cm4gbmV3IFJhbVNlcXVlbmNlKG9wdGlvbnMsIHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHVwIFJBTS1zcGVjaWZpYyBkZWNvcmF0aW9ucyBmb3IgbW9kZWwgcHJvcGVydGllc1xuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGRlY29yYXRpb25zIGZvciBjcmVhdGVkQnkgYW5kIHVwZGF0ZWRCeSBmaWVsZHMgaW4gdGhlIFJBTSBhZGFwdGVyLlxuICAgKiBUaGlzIHN0YXRpYyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbiB0byBzZXQgdXAgaGFuZGxlcnMgdGhhdCBhdXRvbWF0aWNhbGx5XG4gICAqIHBvcHVsYXRlIHRoZXNlIGZpZWxkcyB3aXRoIHRoZSBjdXJyZW50IHVzZXIncyBVVUlEIGR1cmluZyBjcmVhdGUgYW5kIHVwZGF0ZSBvcGVyYXRpb25zLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSYW1BZGFwdGVyXG4gICAqICAgcGFydGljaXBhbnQgRGVjb3JhdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IFJlcG9zaXRvcnlcbiAgICpcbiAgICogICBSYW1BZGFwdGVyLT4+UmVwb3NpdG9yeToga2V5KFBlcnNpc3RlbmNlS2V5cy5DUkVBVEVEX0JZKVxuICAgKiAgIFJlcG9zaXRvcnktLT4+UmFtQWRhcHRlcjogY3JlYXRlZEJ5S2V5XG4gICAqICAgUmFtQWRhcHRlci0+PlJlcG9zaXRvcnk6IGtleShQZXJzaXN0ZW5jZUtleXMuVVBEQVRFRF9CWSlcbiAgICogICBSZXBvc2l0b3J5LS0+PlJhbUFkYXB0ZXI6IHVwZGF0ZWRCeUtleVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IoY3JlYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKlxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmbGF2b3VyZWRBcyhSYW1GbGF2b3VyKVxuICAgKiAgIERlY29yYXRpb24tLT4+UmFtQWRhcHRlcjogRGVjb3JhdG9yQnVpbGRlclxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBmb3IodXBkYXRlZEJ5S2V5KVxuICAgKiAgIFJhbUFkYXB0ZXItPj5EZWNvcmF0aW9uOiBkZWZpbmUob25DcmVhdGUsIHByb3BNZXRhZGF0YSlcbiAgICogICBSYW1BZGFwdGVyLT4+RGVjb3JhdGlvbjogYXBwbHkoKVxuICAgKi9cbiAgc3RhdGljIGRlY29yYXRpb24oKSB7XG4gICAgY29uc3QgY3JlYXRlZEJ5S2V5ID0gUmVwb3NpdG9yeS5rZXkoUGVyc2lzdGVuY2VLZXlzLkNSRUFURURfQlkpO1xuICAgIGNvbnN0IHVwZGF0ZWRCeUtleSA9IFJlcG9zaXRvcnkua2V5KFBlcnNpc3RlbmNlS2V5cy5VUERBVEVEX0JZKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAgICAuZm9yKGNyZWF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKGNyZWF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJlZEFzKFJhbUZsYXZvdXIpXG4gICAgICAuZm9yKHVwZGF0ZWRCeUtleSlcbiAgICAgIC5kZWZpbmUoXG4gICAgICAgIG9uQ3JlYXRlKGNyZWF0ZWRCeU9uUmFtQ3JlYXRlVXBkYXRlKSxcbiAgICAgICAgcHJvcE1ldGFkYXRhKHVwZGF0ZWRCeUtleSwge30pXG4gICAgICApXG4gICAgICAuYXBwbHkoKTtcbiAgfVxufVxuXG5SYW1BZGFwdGVyLmRlY29yYXRpb24oKTtcbiJdfQ==
|