@cubist-labs/cubesigner-sdk 0.1.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/LICENSE-APACHE +177 -0
  2. package/LICENSE-MIT +25 -0
  3. package/NOTICE +13 -0
  4. package/README.md +470 -0
  5. package/dist/examples/ethers.d.ts +1 -0
  6. package/dist/examples/ethers.js +142 -0
  7. package/dist/spec/env/beta.json +9 -0
  8. package/dist/spec/env/gamma.json +9 -0
  9. package/dist/spec/env/prod.json +9 -0
  10. package/dist/src/client.d.ts +10 -0
  11. package/dist/src/client.js +21 -0
  12. package/dist/src/env.d.ts +15 -0
  13. package/dist/src/env.js +35 -0
  14. package/dist/src/ethers/index.d.ts +50 -0
  15. package/dist/src/ethers/index.js +122 -0
  16. package/dist/src/index.d.ts +114 -0
  17. package/dist/src/index.js +205 -0
  18. package/dist/src/key.d.ts +114 -0
  19. package/dist/src/key.js +201 -0
  20. package/dist/src/mfa.d.ts +23 -0
  21. package/dist/src/mfa.js +63 -0
  22. package/dist/src/org.d.ts +161 -0
  23. package/dist/src/org.js +264 -0
  24. package/dist/src/role.d.ts +224 -0
  25. package/dist/src/role.js +256 -0
  26. package/dist/src/schema.d.ts +3049 -0
  27. package/dist/src/schema.js +7 -0
  28. package/dist/src/session/generic.d.ts +47 -0
  29. package/dist/src/session/generic.js +3 -0
  30. package/dist/src/session/management_session_manager.d.ts +59 -0
  31. package/dist/src/session/management_session_manager.js +111 -0
  32. package/dist/src/session/oidc_session_manager.d.ts +78 -0
  33. package/dist/src/session/oidc_session_manager.js +142 -0
  34. package/dist/src/session/session_manager.d.ts +74 -0
  35. package/dist/src/session/session_manager.js +79 -0
  36. package/dist/src/session/session_storage.d.ts +47 -0
  37. package/dist/src/session/session_storage.js +76 -0
  38. package/dist/src/session/signer_session_manager.d.ts +88 -0
  39. package/dist/src/session/signer_session_manager.js +159 -0
  40. package/dist/src/sign.d.ts +114 -0
  41. package/dist/src/sign.js +248 -0
  42. package/dist/src/signer_session.d.ts +180 -0
  43. package/dist/src/signer_session.js +369 -0
  44. package/dist/src/util.d.ts +35 -0
  45. package/dist/src/util.js +75 -0
  46. package/dist/test/sessions.d.ts +35 -0
  47. package/dist/test/sessions.js +56 -0
  48. package/package.json +61 -0
  49. package/src/client.ts +12 -0
  50. package/src/env.ts +25 -0
  51. package/src/ethers/index.ts +131 -0
  52. package/src/index.ts +220 -0
  53. package/src/key.ts +249 -0
  54. package/src/org.ts +333 -0
  55. package/src/role.ts +385 -0
  56. package/src/schema.ts +3054 -0
  57. package/src/session/management_session_manager.ts +136 -0
  58. package/src/session/oidc_session_manager.ts +193 -0
  59. package/src/session/session_manager.ts +114 -0
  60. package/src/session/session_storage.ts +73 -0
  61. package/src/session/signer_session_manager.ts +211 -0
  62. package/src/signer_session.ts +464 -0
  63. package/src/util.ts +58 -0
  64. package/tsconfig.json +32 -0
@@ -0,0 +1,224 @@
1
+ import { CubeSigner, Key, MfaType, SignerSession, SignerSessionInfo, SignerSessionLifetime, SignerSessionStorage } from ".";
2
+ import { components } from "./client";
3
+ type KeyWithPoliciesInfo = components["schemas"]["KeyWithPolicies"];
4
+ export type RoleInfo = components["schemas"]["RoleInfo"];
5
+ /** Restrict transaction receiver.
6
+ * @example { TxReceiver: "0x8c594691c0e592ffa21f153a16ae41db5befcaaa" }
7
+ * */
8
+ export type TxReceiver = {
9
+ TxReceiver: string;
10
+ };
11
+ /** The kind of deposit contracts. */
12
+ export declare enum DepositContract {
13
+ /** Canonical deposit contract */
14
+ Canonical = 0,
15
+ /** Wrapper deposit contract */
16
+ Wrapper = 1
17
+ }
18
+ /** Restrict transactions to calls to deposit contract. */
19
+ export type TxDeposit = TxDepositBase | TxDepositPubkey | TxDepositRole;
20
+ /** Restrict transactions to calls to deposit contract*/
21
+ export type TxDepositBase = {
22
+ TxDeposit: {
23
+ kind: DepositContract;
24
+ };
25
+ };
26
+ /** Restrict transactions to calls to deposit contract with fixed validator (pubkey):
27
+ * @example { TxDeposit: { kind: DespositContract.Canonical, validator: { pubkey: "8879...8"} }}
28
+ * */
29
+ export type TxDepositPubkey = {
30
+ TxDeposit: {
31
+ kind: DepositContract;
32
+ pubkey: string;
33
+ };
34
+ };
35
+ /** Restrict transactions to calls to deposit contract with any validator key in a role:
36
+ * @example { TxDeposit: { kind: DespositContract.Canonical, validator: { role_id: "Role#c63...af"} }}
37
+ * */
38
+ export type TxDepositRole = {
39
+ TxDeposit: {
40
+ kind: DepositContract;
41
+ role_id: string;
42
+ };
43
+ };
44
+ /** All different kinds of sensitive operations. */
45
+ export declare enum OperationKind {
46
+ BlobSign = "BlobSign",
47
+ EvmSign = "Eth1Sign",
48
+ Eth2Sign = "Eth2Sign",
49
+ Eth2Stake = "Eth2Stake",
50
+ Eth2Unstake = "Eth2Unstake",
51
+ SolanaSign = "SolanaSign"
52
+ }
53
+ /** Require MFA for transactions.
54
+ * @example {
55
+ * RequireMfa: {
56
+ * count: 1,
57
+ * allowed_mfa_types: [ "Totp" ],
58
+ * allowed_approvers: [ "User#123" ],
59
+ * restricted_operations: [
60
+ * "Eth1Sign",
61
+ * "BlobSign"
62
+ * ]
63
+ * }
64
+ * }
65
+ * */
66
+ export type RequireMfa = {
67
+ RequireMfa: {
68
+ count?: number;
69
+ restricted_operations?: OperationKind[];
70
+ allowed_approvers?: string[];
71
+ allowed_mfa_types?: MfaType[];
72
+ };
73
+ };
74
+ /** Allow raw blob signing */
75
+ export type AllowRawBlobSigning = "AllowRawBlobSigning";
76
+ /** Key policy
77
+ * @example [
78
+ * {
79
+ * "TxReceiver": "0x8c594691c0e592ffa21f153a16ae41db5befcaaa"
80
+ * },
81
+ * {
82
+ * "TxDeposit": {
83
+ * "kind": "Canonical"
84
+ * }
85
+ * },
86
+ * {
87
+ * "RequireMfa": {
88
+ * "count": 1,
89
+ * "allowed_mfa_types": ["CubeSigner"],
90
+ * "restricted_operations": [
91
+ * "Eth1Sign",
92
+ * "BlobSign"
93
+ * ]
94
+ * }
95
+ * }
96
+ * ]
97
+ * */
98
+ export type KeyPolicy = (TxReceiver | TxDeposit | RequireMfa | AllowRawBlobSigning)[];
99
+ /** A key guarded by a policy. */
100
+ export declare class KeyWithPolicies {
101
+ #private;
102
+ readonly keyId: string;
103
+ readonly policy?: KeyPolicy;
104
+ /** @return {Promise<Key>} The key */
105
+ getKey(): Promise<Key>;
106
+ /** Constructor.
107
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
108
+ * @param {string} orgId The id of the organization to which the key belongs.
109
+ * @param {KeyWithPoliciesInfo} keyWithPolicies The key and its policies
110
+ * @internal
111
+ * */
112
+ constructor(cs: CubeSigner, orgId: string, keyWithPolicies: KeyWithPoliciesInfo);
113
+ }
114
+ /** Roles. */
115
+ export declare class Role {
116
+ #private;
117
+ /** Human-readable name for the role */
118
+ readonly name?: string;
119
+ /**
120
+ * The ID of the role.
121
+ * @example Role#bfe3eccb-731e-430d-b1e5-ac1363e6b06b
122
+ * */
123
+ readonly id: string;
124
+ /** Delete the role. */
125
+ delete(): Promise<void>;
126
+ /** Is the role enabled? */
127
+ enabled(): Promise<boolean>;
128
+ /** Enable the role. */
129
+ enable(): Promise<void>;
130
+ /** Disable the role. */
131
+ disable(): Promise<void>;
132
+ /** The list of users with access to the role.
133
+ * @example [
134
+ * "User#c3b9379c-4e8c-4216-bd0a-65ace53cf98f",
135
+ * "User#5593c25b-52e2-4fb5-b39b-96d41d681d82"
136
+ * ]
137
+ * */
138
+ users(): Promise<string[]>;
139
+ /** Add a user to the role.
140
+ * Adds an existing user to an existing role.
141
+ * @param {string} userId The user-id of the user to add to the role.
142
+ * */
143
+ addUser(userId: string): Promise<void>;
144
+ /** The list of keys in the role.
145
+ * @example [
146
+ * {
147
+ * id: "Key#bfe3eccb-731e-430d-b1e5-ac1363e6b06b",
148
+ * policy: { TxReceiver: "0x8c594691c0e592ffa21f153a16ae41db5befcaaa" }
149
+ * },
150
+ * ]
151
+ * */
152
+ keys(): Promise<KeyWithPolicies[]>;
153
+ /** Add keys to the role.
154
+ * Adds a list of existing keys to an existing role.
155
+ * @param {Key[]} keys The list of keys to add to the role.
156
+ * @param {KeyPolicy?} policy The optional policy to apply to each key.
157
+ * */
158
+ addKeys(keys: Key[], policy?: KeyPolicy): Promise<void>;
159
+ /** Add a key to the role.
160
+ * Adds an existing key to an existing role.
161
+ * @param {Key} key The key to add to the role.
162
+ * @param {KeyPolicy?} policy The optional policy to apply to the key.
163
+ * */
164
+ addKey(key: Key, policy?: KeyPolicy): Promise<void>;
165
+ /** Remove key from the role.
166
+ * Removes an existing key from an existing role.
167
+ * @param {Key} key The key to remove from the role.
168
+ * */
169
+ removeKey(key: Key): Promise<void>;
170
+ /**
171
+ * Create a new session for this role.
172
+ * @param {SignerSessionStorage} storage The session storage to use
173
+ * @param {string} purpose Descriptive purpose.
174
+ * @param {SignerSessionLifetime} ttl Optional session lifetimes.
175
+ * @return {Promise<SignerSession>} New signer session.
176
+ */
177
+ createSession(storage: SignerSessionStorage, purpose: string, ttl?: SignerSessionLifetime): Promise<SignerSession>;
178
+ /**
179
+ * List all signer sessions for this role. Returned objects can be used to
180
+ * revoke individual sessions, but they cannot be used for authentication.
181
+ * @return {Promise<SignerSessionInfo[]>} Signer sessions for this role.
182
+ */
183
+ sessions(): Promise<SignerSessionInfo[]>;
184
+ /** Create a new role.
185
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
186
+ * @param {string} orgId The id of the organization to which the role belongs.
187
+ * @param {RoleInfo} data The JSON response from the API server.
188
+ * @internal
189
+ * */
190
+ constructor(cs: CubeSigner, orgId: string, data: RoleInfo);
191
+ /** Update the role.
192
+ * @param {UpdateRoleRequest} request The JSON request to send to the API server.
193
+ * */
194
+ private update;
195
+ /** Create new role.
196
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
197
+ * @param {string} orgId The id of the organization to which the role belongs.
198
+ * @param {string?} name The optional name of the role.
199
+ * @return {Role} The new role.
200
+ * @internal
201
+ * */
202
+ static createRole(cs: CubeSigner, orgId: string, name?: string): Promise<Role>;
203
+ /** Get a role by id.
204
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
205
+ * @param {string} orgId The id of the organization to which the role belongs.
206
+ * @param {string} roleId The id of the role to get.
207
+ * @return {Role} The role.
208
+ * @internal
209
+ * */
210
+ static getRole(cs: CubeSigner, orgId: string, roleId: string): Promise<Role>;
211
+ /** Fetches the role information.
212
+ * @return {RoleInfo} The role information.
213
+ * @internal
214
+ * */
215
+ private fetch;
216
+ /** Delete role.
217
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
218
+ * @param {string} orgId The id of the organization to which the role belongs.
219
+ * @param {string} roleId The id of the role to delete.
220
+ * @internal
221
+ * */
222
+ private static deleteRole;
223
+ }
224
+ export {};
@@ -0,0 +1,256 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var _KeyWithPolicies_cs, _KeyWithPolicies_orgId, _Role_cs, _Role_orgId;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Role = exports.KeyWithPolicies = exports.OperationKind = exports.DepositContract = void 0;
16
+ const _1 = require(".");
17
+ const util_1 = require("./util");
18
+ /** The kind of deposit contracts. */
19
+ var DepositContract;
20
+ (function (DepositContract) {
21
+ /** Canonical deposit contract */
22
+ DepositContract[DepositContract["Canonical"] = 0] = "Canonical";
23
+ /** Wrapper deposit contract */
24
+ DepositContract[DepositContract["Wrapper"] = 1] = "Wrapper";
25
+ })(DepositContract || (exports.DepositContract = DepositContract = {}));
26
+ /** All different kinds of sensitive operations. */
27
+ var OperationKind;
28
+ (function (OperationKind) {
29
+ OperationKind["BlobSign"] = "BlobSign";
30
+ OperationKind["EvmSign"] = "Eth1Sign";
31
+ OperationKind["Eth2Sign"] = "Eth2Sign";
32
+ OperationKind["Eth2Stake"] = "Eth2Stake";
33
+ OperationKind["Eth2Unstake"] = "Eth2Unstake";
34
+ OperationKind["SolanaSign"] = "SolanaSign";
35
+ })(OperationKind || (exports.OperationKind = OperationKind = {}));
36
+ /** A key guarded by a policy. */
37
+ class KeyWithPolicies {
38
+ /** @return {Promise<Key>} The key */
39
+ async getKey() {
40
+ return await _1.Key.getKey(__classPrivateFieldGet(this, _KeyWithPolicies_cs, "f"), __classPrivateFieldGet(this, _KeyWithPolicies_orgId, "f"), this.keyId);
41
+ }
42
+ /** Constructor.
43
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
44
+ * @param {string} orgId The id of the organization to which the key belongs.
45
+ * @param {KeyWithPoliciesInfo} keyWithPolicies The key and its policies
46
+ * @internal
47
+ * */
48
+ constructor(cs, orgId, keyWithPolicies) {
49
+ _KeyWithPolicies_cs.set(this, void 0);
50
+ _KeyWithPolicies_orgId.set(this, void 0);
51
+ __classPrivateFieldSet(this, _KeyWithPolicies_cs, cs, "f");
52
+ __classPrivateFieldSet(this, _KeyWithPolicies_orgId, orgId, "f");
53
+ this.keyId = keyWithPolicies.key_id;
54
+ this.policy = keyWithPolicies.policy;
55
+ }
56
+ }
57
+ exports.KeyWithPolicies = KeyWithPolicies;
58
+ _KeyWithPolicies_cs = new WeakMap(), _KeyWithPolicies_orgId = new WeakMap();
59
+ /** Roles. */
60
+ class Role {
61
+ /** Delete the role. */
62
+ async delete() {
63
+ await Role.deleteRole(__classPrivateFieldGet(this, _Role_cs, "f"), __classPrivateFieldGet(this, _Role_orgId, "f"), this.id);
64
+ }
65
+ /** Is the role enabled? */
66
+ async enabled() {
67
+ const data = await this.fetch();
68
+ return data.enabled;
69
+ }
70
+ /** Enable the role. */
71
+ async enable() {
72
+ await this.update({ enabled: true });
73
+ }
74
+ /** Disable the role. */
75
+ async disable() {
76
+ await this.update({ enabled: false });
77
+ }
78
+ /** The list of users with access to the role.
79
+ * @example [
80
+ * "User#c3b9379c-4e8c-4216-bd0a-65ace53cf98f",
81
+ * "User#5593c25b-52e2-4fb5-b39b-96d41d681d82"
82
+ * ]
83
+ * */
84
+ async users() {
85
+ const data = await this.fetch();
86
+ return data.users;
87
+ }
88
+ /** Add a user to the role.
89
+ * Adds an existing user to an existing role.
90
+ * @param {string} userId The user-id of the user to add to the role.
91
+ * */
92
+ async addUser(userId) {
93
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).put("/v0/org/{org_id}/roles/{role_id}/add_user/{user_id}", {
94
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id, user_id: userId } },
95
+ parseAs: "json",
96
+ });
97
+ (0, util_1.assertOk)(resp, "Failed to add user to role");
98
+ }
99
+ /** The list of keys in the role.
100
+ * @example [
101
+ * {
102
+ * id: "Key#bfe3eccb-731e-430d-b1e5-ac1363e6b06b",
103
+ * policy: { TxReceiver: "0x8c594691c0e592ffa21f153a16ae41db5befcaaa" }
104
+ * },
105
+ * ]
106
+ * */
107
+ async keys() {
108
+ const data = await this.fetch();
109
+ return data.keys.map((k) => new KeyWithPolicies(__classPrivateFieldGet(this, _Role_cs, "f"), __classPrivateFieldGet(this, _Role_orgId, "f"), k));
110
+ }
111
+ /** Add keys to the role.
112
+ * Adds a list of existing keys to an existing role.
113
+ * @param {Key[]} keys The list of keys to add to the role.
114
+ * @param {KeyPolicy?} policy The optional policy to apply to each key.
115
+ * */
116
+ async addKeys(keys, policy) {
117
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).put("/v0/org/{org_id}/roles/{role_id}/add_keys", {
118
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id } },
119
+ body: {
120
+ key_ids: keys.map((k) => k.id),
121
+ policy: (policy ?? null),
122
+ },
123
+ parseAs: "json",
124
+ });
125
+ (0, util_1.assertOk)(resp, "Failed to add keys to role");
126
+ }
127
+ /** Add a key to the role.
128
+ * Adds an existing key to an existing role.
129
+ * @param {Key} key The key to add to the role.
130
+ * @param {KeyPolicy?} policy The optional policy to apply to the key.
131
+ * */
132
+ async addKey(key, policy) {
133
+ return await this.addKeys([key], policy);
134
+ }
135
+ /** Remove key from the role.
136
+ * Removes an existing key from an existing role.
137
+ * @param {Key} key The key to remove from the role.
138
+ * */
139
+ async removeKey(key) {
140
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).del("/v0/org/{org_id}/roles/{role_id}/keys/{key_id}", {
141
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id, key_id: key.id } },
142
+ parseAs: "json",
143
+ });
144
+ (0, util_1.assertOk)(resp, "Failed to remove key from role");
145
+ }
146
+ /**
147
+ * Create a new session for this role.
148
+ * @param {SignerSessionStorage} storage The session storage to use
149
+ * @param {string} purpose Descriptive purpose.
150
+ * @param {SignerSessionLifetime} ttl Optional session lifetimes.
151
+ * @return {Promise<SignerSession>} New signer session.
152
+ */
153
+ async createSession(storage, purpose, ttl) {
154
+ const manager = await _1.SignerSessionManager.create(__classPrivateFieldGet(this, _Role_cs, "f"), storage, __classPrivateFieldGet(this, _Role_orgId, "f"), this.id, purpose, ttl);
155
+ return new _1.SignerSession(__classPrivateFieldGet(this, _Role_cs, "f"), manager);
156
+ }
157
+ /**
158
+ * List all signer sessions for this role. Returned objects can be used to
159
+ * revoke individual sessions, but they cannot be used for authentication.
160
+ * @return {Promise<SignerSessionInfo[]>} Signer sessions for this role.
161
+ */
162
+ async sessions() {
163
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).get("/v0/org/{org_id}/roles/{role_id}/tokens", {
164
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id } },
165
+ });
166
+ const data = (0, util_1.assertOk)(resp);
167
+ return data.tokens.map((t) => new _1.SignerSessionInfo(__classPrivateFieldGet(this, _Role_cs, "f"), __classPrivateFieldGet(this, _Role_orgId, "f"), this.id, t.hash, t.purpose));
168
+ }
169
+ // --------------------------------------------------------------------------
170
+ // -- INTERNAL --------------------------------------------------------------
171
+ // --------------------------------------------------------------------------
172
+ /** Create a new role.
173
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
174
+ * @param {string} orgId The id of the organization to which the role belongs.
175
+ * @param {RoleInfo} data The JSON response from the API server.
176
+ * @internal
177
+ * */
178
+ constructor(cs, orgId, data) {
179
+ _Role_cs.set(this, void 0);
180
+ _Role_orgId.set(this, void 0);
181
+ __classPrivateFieldSet(this, _Role_cs, cs, "f");
182
+ __classPrivateFieldSet(this, _Role_orgId, orgId, "f");
183
+ this.id = data.role_id;
184
+ this.name = data.name ?? undefined;
185
+ }
186
+ /** Update the role.
187
+ * @param {UpdateRoleRequest} request The JSON request to send to the API server.
188
+ * */
189
+ async update(request) {
190
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).patch("/v0/org/{org_id}/roles/{role_id}", {
191
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id } },
192
+ body: request,
193
+ parseAs: "json",
194
+ });
195
+ (0, util_1.assertOk)(resp);
196
+ }
197
+ /** Create new role.
198
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
199
+ * @param {string} orgId The id of the organization to which the role belongs.
200
+ * @param {string?} name The optional name of the role.
201
+ * @return {Role} The new role.
202
+ * @internal
203
+ * */
204
+ static async createRole(cs, orgId, name) {
205
+ const resp = await (await cs.management()).post("/v0/org/{org_id}/roles", {
206
+ params: { path: { org_id: orgId } },
207
+ body: name ? { name } : undefined,
208
+ parseAs: "json",
209
+ });
210
+ const data = (0, util_1.assertOk)(resp);
211
+ return await Role.getRole(cs, orgId, data.role_id);
212
+ }
213
+ /** Get a role by id.
214
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
215
+ * @param {string} orgId The id of the organization to which the role belongs.
216
+ * @param {string} roleId The id of the role to get.
217
+ * @return {Role} The role.
218
+ * @internal
219
+ * */
220
+ static async getRole(cs, orgId, roleId) {
221
+ const resp = await (await cs.management()).get("/v0/org/{org_id}/roles/{role_id}", {
222
+ params: { path: { org_id: orgId, role_id: roleId } },
223
+ parseAs: "json",
224
+ });
225
+ const data = (0, util_1.assertOk)(resp);
226
+ return new Role(cs, orgId, data);
227
+ }
228
+ /** Fetches the role information.
229
+ * @return {RoleInfo} The role information.
230
+ * @internal
231
+ * */
232
+ async fetch() {
233
+ const resp = await (await __classPrivateFieldGet(this, _Role_cs, "f").management()).get("/v0/org/{org_id}/roles/{role_id}", {
234
+ params: { path: { org_id: __classPrivateFieldGet(this, _Role_orgId, "f"), role_id: this.id } },
235
+ parseAs: "json",
236
+ });
237
+ const data = (0, util_1.assertOk)(resp);
238
+ return data;
239
+ }
240
+ /** Delete role.
241
+ * @param {CubeSigner} cs The CubeSigner instance to use for signing.
242
+ * @param {string} orgId The id of the organization to which the role belongs.
243
+ * @param {string} roleId The id of the role to delete.
244
+ * @internal
245
+ * */
246
+ static async deleteRole(cs, orgId, roleId) {
247
+ const resp = await (await cs.management()).del("/v0/org/{org_id}/roles/{role_id}", {
248
+ params: { path: { org_id: orgId, role_id: roleId } },
249
+ parseAs: "json",
250
+ });
251
+ (0, util_1.assertOk)(resp);
252
+ }
253
+ }
254
+ exports.Role = Role;
255
+ _Role_cs = new WeakMap(), _Role_orgId = new WeakMap();
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yb2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdCQVNXO0FBRVgsaUNBQWtDO0FBWWxDLHFDQUFxQztBQUNyQyxJQUFZLGVBS1g7QUFMRCxXQUFZLGVBQWU7SUFDekIsaUNBQWlDO0lBQ2pDLCtEQUFTLENBQUE7SUFDVCwrQkFBK0I7SUFDL0IsMkRBQU8sQ0FBQTtBQUNULENBQUMsRUFMVyxlQUFlLCtCQUFmLGVBQWUsUUFLMUI7QUFrQkQsbURBQW1EO0FBQ25ELElBQVksYUFPWDtBQVBELFdBQVksYUFBYTtJQUN2QixzQ0FBcUIsQ0FBQTtJQUNyQixxQ0FBb0IsQ0FBQTtJQUNwQixzQ0FBcUIsQ0FBQTtJQUNyQix3Q0FBdUIsQ0FBQTtJQUN2Qiw0Q0FBMkIsQ0FBQTtJQUMzQiwwQ0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBUFcsYUFBYSw2QkFBYixhQUFhLFFBT3hCO0FBbURELGlDQUFpQztBQUNqQyxNQUFhLGVBQWU7SUFNMUIscUNBQXFDO0lBQ3JDLEtBQUssQ0FBQyxNQUFNO1FBQ1YsT0FBTyxNQUFNLE1BQUcsQ0FBQyxNQUFNLENBQUMsdUJBQUEsSUFBSSwyQkFBSSxFQUFFLHVCQUFBLElBQUksOEJBQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOzs7OztTQUtLO0lBQ0wsWUFBWSxFQUFjLEVBQUUsS0FBYSxFQUFFLGVBQW9DO1FBaEJ0RSxzQ0FBZ0I7UUFDaEIseUNBQWU7UUFnQnRCLHVCQUFBLElBQUksdUJBQU8sRUFBRSxNQUFBLENBQUM7UUFDZCx1QkFBQSxJQUFJLDBCQUFVLEtBQUssTUFBQSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQztRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQyxNQUE4QixDQUFDO0lBQy9ELENB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QUcsSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRDs7O1NBR0s7SUFDRyxLQUFLLENBQUMsS0FBSztRQUNqQixNQUFNLElBQUksR0FBRyxNQUFNLENBQ2pCLE1BQU0sdUJBQUEsSUFBSSxnQkFBSSxDQUFDLFVBQVUsRUFBRSxDQUM1QixDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsRUFBRTtZQUN4QyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsdUJBQUEsSUFBSSxtQkFBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDM0QsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxJQUFJLEdBQUcsSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7O1NBS0s7SUFDRyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFjLEVBQUUsS0FBYSxFQUFFLE1BQWM7UUFDM0UsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUNqQixNQUFNLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FDdEIsQ0FBQyxHQUFHLENBQUMsa0NBQWtDLEVBQUU7WUFDeEMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDcEQsT0FBTyxFQUFFLE1BQU07U0FDaEIsQ0FBQyxDQUFDO1FBQ0gsSUFBQSxlQUFRLEVBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBM1BELG9CQTJQQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEN1YmVTaWduZXIsXG4gIEtleSxcbiAgTWZhVHlwZSxcbiAgU2lnbmVyU2Vzc2lvbixcbiAgU2lnbmVyU2Vzc2lvbkluZm8sXG4gIFNpZ25lclNlc3Npb25MaWZldGltZSxcbiAgU2lnbmVyU2Vzc2lvbk1hbmFnZXIsXG4gIFNpZ25lclNlc3Npb25TdG9yYWdlLFxufSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgY29tcG9uZW50cywgcGF0aHMgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB7IGFzc2VydE9rIH0gZnJvbSBcIi4vdXRpbFwiO1xuXG50eXBlIFVwZGF0ZVJvbGVSZXF1ZXN0ID1cbiAgcGF0aHNbXCIvdjAvb3JnL3tvcmdfaWR9L2tleXMve2tleV9pZH1cIl1bXCJwYXRjaFwiXVtcInJlcXVlc3RCb2R5XCJdW1wiY29udGVudFwiXVtcImFwcGxpY2F0aW9uL2pzb25cIl07XG50eXBlIEtleVdpdGhQb2xpY2llc0luZm8gPSBjb21wb25lbnRzW1wic2NoZW1hc1wiXVtcIktleVdpdGhQb2xpY2llc1wiXTtcbmV4cG9ydCB0eXBlIFJvbGVJbmZvID0gY29tcG9uZW50c1tcInNjaGVtYXNcIl1bXCJSb2xlSW5mb1wiXTtcblxuLyoqIFJlc3RyaWN0IHRyYW5zYWN0aW9uIHJlY2VpdmVyLlxuICogQGV4YW1wbGUgeyBUeFJlY2VpdmVyOiBcIjB4OGM1OTQ2OTFjMGU1OTJmZmEyMWYxNTNhMTZhZTQxZGI1YmVmY2FhYVwiIH1cbiAqICovXG5leHBvcnQgdHlwZSBUeFJlY2VpdmVyID0geyBUeFJlY2VpdmVyOiBzdHJpbmcgfTtcblxuLyoqIFRoZSBraW5kIG9mIGRlcG9zaXQgY29udHJhY3RzLiAqL1xuZXhwb3J0IGVudW0gRGVwb3NpdENvbnRyYWN0IHtcbiAgLyoqIENhbm9uaWNhbCBkZXBvc2l0IGNvbnRyYWN0ICovXG4gIENhbm9uaWNhbCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAvKiogV3JhcHBlciBkZXBvc2l0IGNvbnRyYWN0ICovXG4gIFdyYXBwZXIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbn1cblxuLyoqIFJlc3RyaWN0IHRyYW5zYWN0aW9ucyB0byBjYWxscyB0byBkZXBvc2l0IGNvbnRyYWN0LiAqL1xuZXhwb3J0IHR5cGUgVHhEZXBvc2l0ID0gVHhEZXBvc2l0QmFzZSB8IFR4RGVwb3NpdFB1YmtleSB8IFR4RGVwb3NpdFJvbGU7XG5cbi8qKiBSZXN0cmljdCB0cmFuc2FjdGlvbnMgdG8gY2FsbHMgdG8gZGVwb3NpdCBjb250cmFjdCovXG5leHBvcnQgdHlwZSBUeERlcG9zaXRCYXNlID0geyBUeERlcG9zaXQ6IHsga2luZDogRGVwb3NpdENvbnRyYWN0IH0gfTtcblxuLyoqIFJlc3RyaWN0IHRyYW5zYWN0aW9ucyB0byBjYWxscyB0byBkZXBvc2l0IGNvbnRyYWN0IHdpdGggZml4ZWQgdmFsaWRhdG9yIChwdWJrZXkpOlxuICogIEBleGFtcGxlIHsgVHhEZXBvc2l0OiB7IGtpbmQ6IERlc3Bvc2l0Q29udHJhY3QuQ2Fub25pY2FsLCB2YWxpZGF0b3I6IHsgcHVia2V5OiBcIjg4NzkuLi44XCJ9IH19XG4gKiAqL1xuZXhwb3J0IHR5cGUgVHhEZXBvc2l0UHVia2V5ID0geyBUeERlcG9zaXQ6IHsga2luZDogRGVwb3NpdENvbnRyYWN0OyBwdWJrZXk6IHN0cmluZyB9IH07XG5cbi8qKiBSZXN0cmljdCB0cmFuc2FjdGlvbnMgdG8gY2FsbHMgdG8gZGVwb3NpdCBjb250cmFjdCB3aXRoIGFueSB2YWxpZGF0b3Iga2V5IGluIGEgcm9sZTpcbiAqIEBleGFtcGxlIHsgVHhEZXBvc2l0OiB7IGtpbmQ6IERlc3Bvc2l0Q29udHJhY3QuQ2Fub25pY2FsLCB2YWxpZGF0b3I6IHsgcm9sZV9pZDogXCJSb2xlI2M2My4uLmFmXCJ9IH19XG4gKiAqL1xuZXhwb3J0IHR5cGUgVHhEZXBvc2l0Um9sZSA9IHsgVHhEZXBvc2l0OiB7IGtpbmQ6IERlcG9zaXRDb250cmFjdDsgcm9sZV9pZDogc3RyaW5nIH0gfTtcblxuLyoqIEFsbCBkaWZmZXJlbnQga2luZHMgb2Ygc2Vuc2l0aXZlIG9wZXJhdGlvbnMuICovXG5leHBvcnQgZW51bSBPcGVyYXRpb25LaW5kIHtcbiAgQmxvYlNpZ24gPSBcIkJsb2JTaWduXCIsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgRXZtU2lnbiA9IFwiRXRoMVNpZ25cIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBFdGgyU2lnbiA9IFwiRXRoMlNpZ25cIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICBFdGgyU3Rha2UgPSBcIkV0aDJTdGFrZVwiLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIEV0aDJVbnN0YWtlID0gXCJFdGgyVW5zdGFrZVwiLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gIFNvbGFuYVNpZ24gPSBcIlNvbGFuYVNpZ25cIiwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xufVxuXG4vKiogUmVxdWlyZSBNRkEgZm9yIHRyYW5zYWN0aW9ucy5cbiAqIEBleGFtcGxlIHtcbiAqICAgICBSZXF1aXJlTWZhOiB7XG4gKiAgICAgICBjb3VudDogMSxcbiAqICAgICAgIGFsbG93ZWRfbWZhX3R5cGVzOiBbIFwiVG90cFwiIF0sXG4gKiAgICAgICBhbGxvd2VkX2FwcHJvdmVyczogWyBcIlVzZXIjMTIzXCIgXSxcbiAqICAgICAgIHJlc3RyaWN0ZWRfb3BlcmF0aW9uczogW1xuICogICAgICAgICBcIkV0aDFTaWduXCIsXG4gKiAgICAgICAgIFwiQmxvYlNpZ25cIlxuICogICAgICAgXVxuICogICAgIH1cbiAqICAgfVxuICogKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVNZmEgPSB7XG4gIFJlcXVpcmVNZmE6IHtcbiAgICBjb3VudD86IG51bWJlcjtcbiAgICByZXN0cmljdGVkX29wZXJhdGlvbnM/OiBPcGVyYXRpb25LaW5kW107XG4gICAgYWxsb3dlZF9hcHByb3ZlcnM/OiBzdHJpbmdbXTtcbiAgICBhbGxvd2VkX21mYV90eXBlcz86IE1mYVR5cGVbXTtcbiAgfTtcbn07XG5cbi8qKiBBbGxvdyByYXcgYmxvYiBzaWduaW5nICovXG5leHBvcnQgdHlwZSBBbGxvd1Jhd0Jsb2JTaWduaW5nID0gXCJBbGxvd1Jhd0Jsb2JTaWduaW5nXCI7XG5cbi8qKiBLZXkgcG9saWN5XG4gKiBAZXhhbXBsZSBbXG4gKiAgIHtcbiAqICAgICBcIlR4UmVjZWl2ZXJcIjogXCIweDhjNTk0NjkxYzBlNTkyZmZhMjFmMTUzYTE2YWU0MWRiNWJlZmNhYWFcIlxuICogICB9LFxuICogICB7XG4gKiAgICAgXCJUeERlcG9zaXRcIjoge1xuICogICAgICAgXCJraW5kXCI6IFwiQ2Fub25pY2FsXCJcbiAqICAgICB9XG4gKiAgIH0sXG4gKiAgIHtcbiAqICAgICBcIlJlcXVpcmVNZmFcIjoge1xuICogICAgICAgXCJjb3VudFwiOiAxLFxuICogICAgICAgXCJhbGxvd2VkX21mYV90eXBlc1wiOiBbXCJDdWJlU2lnbmVyXCJdLFxuICogICAgICAgXCJyZXN0cmljdGVkX29wZXJhdGlvbnNcIjogW1xuICogICAgICAgICBcIkV0aDFTaWduXCIsXG4gKiAgICAgICAgIFwiQmxvYlNpZ25cIlxuICogICAgICAgXVxuICogICAgIH1cbiAqICAgfVxuICogXVxuICogKi9cbmV4cG9ydCB0eXBlIEtleVBvbGljeSA9IChUeFJlY2VpdmVyIHwgVHhEZXBvc2l0IHwgUmVxdWlyZU1mYSB8IEFsbG93UmF3QmxvYlNpZ25pbmcpW107XG5cbi8qKiBBIGtleSBndWFyZGVkIGJ5IGEgcG9saWN5LiAqL1xuZXhwb3J0IGNsYXNzIEtleVdpdGhQb2xpY2llcyB7XG4gIHJlYWRvbmx5ICNjczogQ3ViZVNpZ25lcjtcbiAgcmVhZG9ubHkgI29yZ0lkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtleUlkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBvbGljeT86IEtleVBvbGljeTtcblxuICAvKiogQHJldHVybiB7UHJvbWlzZTxLZXk+fSBUaGUga2V5ICovXG4gIGFzeW5jIGdldEtleSgpOiBQcm9taXNlPEtleT4ge1xuICAgIHJldHVybiBhd2FpdCBLZXkuZ2V0S2V5KHRoaXMuI2NzLCB0aGlzLiNvcmdJZCwgdGhpcy5rZXlJZCk7XG4gIH1cblxuICAvKiogQ29uc3RydWN0b3IuXG4gICAqIEBwYXJhbSB7Q3ViZVNpZ25lcn0gY3MgVGhlIEN1YmVTaWduZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBzaWduaW5nLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gb3JnSWQgVGhlIGlkIG9mIHRoZSBvcmdhbml6YXRpb24gdG8gd2hpY2ggdGhlIGtleSBiZWxvbmdzLlxuICAgKiBAcGFyYW0ge0tleVdpdGhQb2xpY2llc0luZm99IGtleVdpdGhQb2xpY2llcyBUaGUga2V5IGFuZCBpdHMgcG9saWNpZXNcbiAgICogQGludGVybmFsXG4gICAqICovXG4gIGNvbnN0cnVjdG9yKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCBrZXlXaXRoUG9saWNpZXM6IEtleVdpdGhQb2xpY2llc0luZm8pIHtcbiAgICB0aGlzLiNjcyA9IGNzO1xuICAgIHRoaXMuI29yZ0lkID0gb3JnSWQ7XG4gICAgdGhpcy5rZXlJZCA9IGtleVdpdGhQb2xpY2llcy5rZXlfaWQ7XG4gICAgdGhpcy5wb2xpY3kgPSBrZXlXaXRoUG9saWNpZXMucG9saWN5IGFzIHVua25vd24gYXMgS2V5UG9saWN5O1xuICB9XG59XG5cbi8qKiBSb2xlcy4gKi9cbmV4cG9ydCBjbGFzcyBSb2xlIHtcbiAgcmVhZG9ubHkgI2NzOiBDdWJlU2lnbmVyO1xuICByZWFkb25seSAjb3JnSWQ6IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSByb2xlICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgdGhlIHJvbGUuXG4gICAqIEBleGFtcGxlIFJvbGUjYmZlM2VjY2ItNzMxZS00MzBkLWIxZTUtYWMxMzYzZTZiMDZiXG4gICAqICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqIERlbGV0ZSB0aGUgcm9sZS4gKi9cbiAgYXN5bmMgZGVsZXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IFJvbGUuZGVsZXRlUm9sZSh0aGlzLiNjcywgdGhpcy4jb3JnSWQsIHRoaXMuaWQpO1xuICB9XG5cbiAgLyoqIElzIHRoZSByb2xlIGVuYWJsZWQ/ICovXG4gIGFzeW5jIGVuYWJsZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMuZmV0Y2goKTtcbiAgICByZXR1cm4gZGF0YS5lbmFibGVkO1xuICB9XG5cbiAgLyoqIEVuYWJsZSB0aGUgcm9sZS4gKi9cbiAgYXN5bmMgZW5hYmxlKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgZW5hYmxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKiBEaXNhYmxlIHRoZSByb2xlLiAqL1xuICBhc3luYyBkaXNhYmxlKCkge1xuICAgIGF3YWl0IHRoaXMudXBkYXRlKHsgZW5hYmxlZDogZmFsc2UgfSk7XG4gIH1cblxuICAvKiogVGhlIGxpc3Qgb2YgdXNlcnMgd2l0aCBhY2Nlc3MgdG8gdGhlIHJvbGUuXG4gICAqIEBleGFtcGxlIFtcbiAgICogICBcIlVzZXIjYzNiOTM3OWMtNGU4Yy00MjE2LWJkMGEtNjVhY2U1M2NmOThmXCIsXG4gICAqICAgXCJVc2VyIzU1OTNjMjViLTUyZTItNGZiNS1iMzliLTk2ZDQxZDY4MWQ4MlwiXG4gICAqIF1cbiAgICogKi9cbiAgYXN5bmMgdXNlcnMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0aGlzLmZldGNoKCk7XG4gICAgcmV0dXJuIGRhdGEudXNlcnM7XG4gIH1cblxuICAvKiogQWRkIGEgdXNlciB0byB0aGUgcm9sZS5cbiAgICogQWRkcyBhbiBleGlzdGluZyB1c2VyIHRvIGFuIGV4aXN0aW5nIHJvbGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VySWQgVGhlIHVzZXItaWQgb2YgdGhlIHVzZXIgdG8gYWRkIHRvIHRoZSByb2xlLlxuICAgKiAqL1xuICBhc3luYyBhZGRVc2VyKHVzZXJJZDogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IHRoaXMuI2NzLm1hbmFnZW1lbnQoKVxuICAgICkucHV0KFwiL3YwL29yZy97b3JnX2lkfS9yb2xlcy97cm9sZV9pZH0vYWRkX3VzZXIve3VzZXJfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHJvbGVfaWQ6IHRoaXMuaWQsIHVzZXJfaWQ6IHVzZXJJZCB9IH0sXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICBhc3NlcnRPayhyZXNwLCBcIkZhaWxlZCB0byBhZGQgdXNlciB0byByb2xlXCIpO1xuICB9XG5cbiAgLyoqIFRoZSBsaXN0IG9mIGtleXMgaW4gdGhlIHJvbGUuXG4gICAqIEBleGFtcGxlIFtcbiAgICogICAge1xuICAgKiAgICAgaWQ6IFwiS2V5I2JmZTNlY2NiLTczMWUtNDMwZC1iMWU1LWFjMTM2M2U2YjA2YlwiLFxuICAgKiAgICAgcG9saWN5OiB7IFR4UmVjZWl2ZXI6IFwiMHg4YzU5NDY5MWMwZTU5MmZmYTIxZjE1M2ExNmFlNDFkYjViZWZjYWFhXCIgfVxuICAgKiAgICB9LFxuICAgKiAgXVxuICAgKiAqL1xuICBhc3luYyBrZXlzKCk6IFByb21pc2U8S2V5V2l0aFBvbGljaWVzW10+IHtcbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5mZXRjaCgpO1xuICAgIHJldHVybiBkYXRhLmtleXMubWFwKChrKSA9PiBuZXcgS2V5V2l0aFBvbGljaWVzKHRoaXMuI2NzLCB0aGlzLiNvcmdJZCwgaykpO1xuICB9XG5cbiAgLyoqIEFkZCBrZXlzIHRvIHRoZSByb2xlLlxuICAgKiBBZGRzIGEgbGlzdCBvZiBleGlzdGluZyBrZXlzIHRvIGFuIGV4aXN0aW5nIHJvbGUuXG4gICAqIEBwYXJhbSB7S2V5W119IGtleXMgVGhlIGxpc3Qgb2Yga2V5cyB0byBhZGQgdG8gdGhlIHJvbGUuXG4gICAqIEBwYXJhbSB7S2V5UG9saWN5P30gcG9saWN5IFRoZSBvcHRpb25hbCBwb2xpY3kgdG8gYXBwbHkgdG8gZWFjaCBrZXkuXG4gICAqICovXG4gIGFzeW5jIGFkZEtleXMoa2V5czogS2V5W10sIHBvbGljeT86IEtleVBvbGljeSkge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLnB1dChcIi92MC9vcmcve29yZ19pZH0vcm9sZXMve3JvbGVfaWR9L2FkZF9rZXlzXCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHJvbGVfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgYm9keToge1xuICAgICAgICBrZXlfaWRzOiBrZXlzLm1hcCgoaykgPT4gay5pZCksXG4gICAgICAgIHBvbGljeTogKHBvbGljeSA/PyBudWxsKSBhcyBSZWNvcmQ8c3RyaW5nLCBuZXZlcj5bXSB8IG51bGwsXG4gICAgICB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgYXNzZXJ0T2socmVzcCwgXCJGYWlsZWQgdG8gYWRkIGtleXMgdG8gcm9sZVwiKTtcbiAgfVxuXG4gIC8qKiBBZGQgYSBrZXkgdG8gdGhlIHJvbGUuXG4gICAqIEFkZHMgYW4gZXhpc3Rpbmcga2V5IHRvIGFuIGV4aXN0aW5nIHJvbGUuXG4gICAqIEBwYXJhbSB7S2V5fSBrZXkgVGhlIGtleSB0byBhZGQgdG8gdGhlIHJvbGUuXG4gICAqIEBwYXJhbSB7S2V5UG9saWN5P30gcG9saWN5IFRoZSBvcHRpb25hbCBwb2xpY3kgdG8gYXBwbHkgdG8gdGhlIGtleS5cbiAgICogKi9cbiAgYXN5bmMgYWRkS2V5KGtleTogS2V5LCBwb2xpY3k/OiBLZXlQb2xpY3kpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hZGRLZXlzKFtrZXldLCBwb2xpY3kpO1xuICB9XG5cbiAgLyoqIFJlbW92ZSBrZXkgZnJvbSB0aGUgcm9sZS5cbiAgICogUmVtb3ZlcyBhbiBleGlzdGluZyBrZXkgZnJvbSBhbiBleGlzdGluZyByb2xlLlxuICAgKiBAcGFyYW0ge0tleX0ga2V5IFRoZSBrZXkgdG8gcmVtb3ZlIGZyb20gdGhlIHJvbGUuXG4gICAqICovXG4gIGFzeW5jIHJlbW92ZUtleShrZXk6IEtleSkge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLmRlbChcIi92MC9vcmcve29yZ19pZH0vcm9sZXMve3JvbGVfaWR9L2tleXMve2tleV9pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiB0aGlzLiNvcmdJZCwgcm9sZV9pZDogdGhpcy5pZCwga2V5X2lkOiBrZXkuaWQgfSB9LFxuICAgICAgcGFyc2VBczogXCJqc29uXCIsXG4gICAgfSk7XG4gICAgYXNzZXJ0T2socmVzcCwgXCJGYWlsZWQgdG8gcmVtb3ZlIGtleSBmcm9tIHJvbGVcIik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHNlc3Npb24gZm9yIHRoaXMgcm9sZS5cbiAgICogQHBhcmFtIHtTaWduZXJTZXNzaW9uU3RvcmFnZX0gc3RvcmFnZSBUaGUgc2Vzc2lvbiBzdG9yYWdlIHRvIHVzZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHVycG9zZSBEZXNjcmlwdGl2ZSBwdXJwb3NlLlxuICAgKiBAcGFyYW0ge1NpZ25lclNlc3Npb25MaWZldGltZX0gdHRsIE9wdGlvbmFsIHNlc3Npb24gbGlmZXRpbWVzLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lclNlc3Npb24+fSBOZXcgc2lnbmVyIHNlc3Npb24uXG4gICAqL1xuICBhc3luYyBjcmVhdGVTZXNzaW9uKFxuICAgIHN0b3JhZ2U6IFNpZ25lclNlc3Npb25TdG9yYWdlLFxuICAgIHB1cnBvc2U6IHN0cmluZyxcbiAgICB0dGw/OiBTaWduZXJTZXNzaW9uTGlmZXRpbWUsXG4gICk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbj4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBhd2FpdCBTaWduZXJTZXNzaW9uTWFuYWdlci5jcmVhdGUoXG4gICAgICB0aGlzLiNjcyxcbiAgICAgIHN0b3JhZ2UsXG4gICAgICB0aGlzLiNvcmdJZCxcbiAgICAgIHRoaXMuaWQsXG4gICAgICBwdXJwb3NlLFxuICAgICAgdHRsLFxuICAgICk7XG4gICAgcmV0dXJuIG5ldyBTaWduZXJTZXNzaW9uKHRoaXMuI2NzLCBtYW5hZ2VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IGFsbCBzaWduZXIgc2Vzc2lvbnMgZm9yIHRoaXMgcm9sZS4gUmV0dXJuZWQgb2JqZWN0cyBjYW4gYmUgdXNlZCB0b1xuICAgKiByZXZva2UgaW5kaXZpZHVhbCBzZXNzaW9ucywgYnV0IHRoZXkgY2Fubm90IGJlIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uLlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFNpZ25lclNlc3Npb25JbmZvW10+fSBTaWduZXIgc2Vzc2lvbnMgZm9yIHRoaXMgcm9sZS5cbiAgICovXG4gIGFzeW5jIHNlc3Npb25zKCk6IFByb21pc2U8U2lnbmVyU2Vzc2lvbkluZm9bXT4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCB0aGlzLiNjcy5tYW5hZ2VtZW50KClcbiAgICApLmdldChcIi92MC9vcmcve29yZ19pZH0vcm9sZXMve3JvbGVfaWR9L3Rva2Vuc1wiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCByb2xlX2lkOiB0aGlzLmlkIH0gfSxcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXNzZXJ0T2socmVzcCk7XG4gICAgcmV0dXJuIGRhdGEudG9rZW5zLm1hcChcbiAgICAgICh0KSA9PiBuZXcgU2lnbmVyU2Vzc2lvbkluZm8odGhpcy4jY3MsIHRoaXMuI29yZ0lkLCB0aGlzLmlkLCB0Lmhhc2gsIHQucHVycG9zZSksXG4gICAgKTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tIElOVEVSTkFMIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIENyZWF0ZSBhIG5ldyByb2xlLlxuICAgKiBAcGFyYW0ge0N1YmVTaWduZXJ9IGNzIFRoZSBDdWJlU2lnbmVyIGluc3RhbmNlIHRvIHVzZSBmb3Igc2lnbmluZy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG9yZ0lkIFRoZSBpZCBvZiB0aGUgb3JnYW5pemF0aW9uIHRvIHdoaWNoIHRoZSByb2xlIGJlbG9uZ3MuXG4gICAqIEBwYXJhbSB7Um9sZUluZm99IGRhdGEgVGhlIEpTT04gcmVzcG9uc2UgZnJvbSB0aGUgQVBJIHNlcnZlci5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIGNvbnN0cnVjdG9yKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCBkYXRhOiBSb2xlSW5mbykge1xuICAgIHRoaXMuI2NzID0gY3M7XG4gICAgdGhpcy4jb3JnSWQgPSBvcmdJZDtcbiAgICB0aGlzLmlkID0gZGF0YS5yb2xlX2lkO1xuICAgIHRoaXMubmFtZSA9IGRhdGEubmFtZSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogVXBkYXRlIHRoZSByb2xlLlxuICAgKiBAcGFyYW0ge1VwZGF0ZVJvbGVSZXF1ZXN0fSByZXF1ZXN0IFRoZSBKU09OIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgQVBJIHNlcnZlci5cbiAgICogKi9cbiAgcHJpdmF0ZSBhc3luYyB1cGRhdGUocmVxdWVzdDogVXBkYXRlUm9sZVJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5wYXRjaChcIi92MC9vcmcve29yZ19pZH0vcm9sZXMve3JvbGVfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogdGhpcy4jb3JnSWQsIHJvbGVfaWQ6IHRoaXMuaWQgfSB9LFxuICAgICAgYm9keTogcmVxdWVzdCxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGFzc2VydE9rKHJlc3ApO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBuZXcgcm9sZS5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUgcm9sZSBiZWxvbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZz99IG5hbWUgVGhlIG9wdGlvbmFsIG5hbWUgb2YgdGhlIHJvbGUuXG4gICAqIEByZXR1cm4ge1JvbGV9IFRoZSBuZXcgcm9sZS5cbiAgICogQGludGVybmFsXG4gICAqICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVSb2xlKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCBuYW1lPzogc3RyaW5nKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IGNzLm1hbmFnZW1lbnQoKVxuICAgICkucG9zdChcIi92MC9vcmcve29yZ19pZH0vcm9sZXNcIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiBvcmdJZCB9IH0sXG4gICAgICBib2R5OiBuYW1lID8geyBuYW1lIH0gOiB1bmRlZmluZWQsXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICBjb25zdCBkYXRhID0gYXNzZXJ0T2socmVzcCk7XG4gICAgcmV0dXJuIGF3YWl0IFJvbGUuZ2V0Um9sZShjcywgb3JnSWQsIGRhdGEucm9sZV9pZCk7XG4gIH1cblxuICAvKiogR2V0IGEgcm9sZSBieSBpZC5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUgcm9sZSBiZWxvbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZUlkIFRoZSBpZCBvZiB0aGUgcm9sZSB0byBnZXQuXG4gICAqIEByZXR1cm4ge1JvbGV9IFRoZSByb2xlLlxuICAgKiBAaW50ZXJuYWxcbiAgICogKi9cbiAgc3RhdGljIGFzeW5jIGdldFJvbGUoY3M6IEN1YmVTaWduZXIsIG9yZ0lkOiBzdHJpbmcsIHJvbGVJZDogc3RyaW5nKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3QgcmVzcCA9IGF3YWl0IChcbiAgICAgIGF3YWl0IGNzLm1hbmFnZW1lbnQoKVxuICAgICkuZ2V0KFwiL3YwL29yZy97b3JnX2lkfS9yb2xlcy97cm9sZV9pZH1cIiwge1xuICAgICAgcGFyYW1zOiB7IHBhdGg6IHsgb3JnX2lkOiBvcmdJZCwgcm9sZV9pZDogcm9sZUlkIH0gfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gbmV3IFJvbGUoY3MsIG9yZ0lkLCBkYXRhKTtcbiAgfVxuXG4gIC8qKiBGZXRjaGVzIHRoZSByb2xlIGluZm9ybWF0aW9uLlxuICAgKiBAcmV0dXJuIHtSb2xlSW5mb30gVGhlIHJvbGUgaW5mb3JtYXRpb24uXG4gICAqIEBpbnRlcm5hbFxuICAgKiAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoKCk6IFByb21pc2U8Um9sZUluZm8+IHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgKFxuICAgICAgYXdhaXQgdGhpcy4jY3MubWFuYWdlbWVudCgpXG4gICAgKS5nZXQoXCIvdjAvb3JnL3tvcmdfaWR9L3JvbGVzL3tyb2xlX2lkfVwiLCB7XG4gICAgICBwYXJhbXM6IHsgcGF0aDogeyBvcmdfaWQ6IHRoaXMuI29yZ0lkLCByb2xlX2lkOiB0aGlzLmlkIH0gfSxcbiAgICAgIHBhcnNlQXM6IFwianNvblwiLFxuICAgIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBhc3NlcnRPayhyZXNwKTtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIC8qKiBEZWxldGUgcm9sZS5cbiAgICogQHBhcmFtIHtDdWJlU2lnbmVyfSBjcyBUaGUgQ3ViZVNpZ25lciBpbnN0YW5jZSB0byB1c2UgZm9yIHNpZ25pbmcuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBvcmdJZCBUaGUgaWQgb2YgdGhlIG9yZ2FuaXphdGlvbiB0byB3aGljaCB0aGUgcm9sZSBiZWxvbmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcm9sZUlkIFRoZSBpZCBvZiB0aGUgcm9sZSB0byBkZWxldGUuXG4gICAqIEBpbnRlcm5hbFxuICAgKiAqL1xuICBwcml2YXRlIHN0YXRpYyBhc3luYyBkZWxldGVSb2xlKGNzOiBDdWJlU2lnbmVyLCBvcmdJZDogc3RyaW5nLCByb2xlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCAoXG4gICAgICBhd2FpdCBjcy5tYW5hZ2VtZW50KClcbiAgICApLmRlbChcIi92MC9vcmcve29yZ19pZH0vcm9sZXMve3JvbGVfaWR9XCIsIHtcbiAgICAgIHBhcmFtczogeyBwYXRoOiB7IG9yZ19pZDogb3JnSWQsIHJvbGVfaWQ6IHJvbGVJZCB9IH0sXG4gICAgICBwYXJzZUFzOiBcImpzb25cIixcbiAgICB9KTtcbiAgICBhc3NlcnRPayhyZXNwKTtcbiAgfVxufVxuIl19