parse-server 5.3.0-alpha.3 → 5.3.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +62 -59
- package/lib/Adapters/Auth/facebook.js +10 -8
- package/lib/Adapters/Auth/gcenter.js +104 -30
- package/lib/Adapters/Auth/spotify.js +10 -8
- package/lib/Adapters/Cache/LRUCache.js +2 -2
- package/lib/Adapters/Files/GridFSBucketAdapter.js +27 -11
- package/lib/Adapters/Storage/Mongo/MongoStorageAdapter.js +5 -1
- package/lib/Adapters/Storage/Postgres/PostgresStorageAdapter.js +29 -20
- package/lib/Auth.js +11 -1
- package/lib/Config.js +17 -1
- package/lib/Controllers/DatabaseController.js +31 -31
- package/lib/Controllers/LiveQueryController.js +9 -1
- package/lib/Controllers/SchemaController.js +13 -6
- package/lib/Controllers/index.js +3 -2
- package/lib/Deprecator/Deprecations.js +4 -1
- package/lib/GraphQL/ParseGraphQLSchema.js +39 -58
- package/lib/GraphQL/ParseGraphQLServer.js +37 -26
- package/lib/GraphQL/helpers/objectsQueries.js +6 -12
- package/lib/GraphQL/loaders/defaultGraphQLTypes.js +14 -11
- package/lib/GraphQL/loaders/defaultRelaySchema.js +2 -2
- package/lib/GraphQL/loaders/filesMutations.js +9 -22
- package/lib/GraphQL/loaders/schemaDirectives.js +51 -42
- package/lib/GraphQL/loaders/schemaTypes.js +14 -14
- package/lib/GraphQL/parseGraphQLUtils.js +5 -3
- package/lib/GraphQL/transformers/mutation.js +2 -2
- package/lib/GraphQL/transformers/query.js +3 -3
- package/lib/LiveQuery/ParseCloudCodePublisher.js +11 -1
- package/lib/LiveQuery/ParseLiveQueryServer.js +78 -17
- package/lib/LiveQuery/ParseWebSocketServer.js +8 -2
- package/lib/LiveQuery/QueryTools.js +27 -4
- package/lib/LiveQuery/SessionTokenCache.js +2 -2
- package/lib/Options/Definitions.js +62 -39
- package/lib/Options/docs.js +21 -3
- package/lib/Options/index.js +1 -1
- package/lib/RestQuery.js +18 -1
- package/lib/RestWrite.js +56 -5
- package/lib/Routers/AudiencesRouter.js +2 -2
- package/lib/Routers/ClassesRouter.js +4 -4
- package/lib/Routers/FilesRouter.js +27 -15
- package/lib/Routers/InstallationsRouter.js +2 -2
- package/lib/SchemaMigrations/DefinedSchemas.js +14 -4
- package/lib/SchemaMigrations/Migrations.js +1 -1
- package/lib/cloud-code/Parse.Cloud.js +36 -16
- package/lib/triggers.js +7 -18
- package/package.json +37 -39
package/README.md
CHANGED
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
[](https://codecov.io/github/parse-community/parse-server?branch=alpha)
|
|
8
8
|
[](https://github.com/parse-community/parse-dashboard/releases)
|
|
9
9
|
|
|
10
|
-
[](https://nodejs.org)
|
|
11
|
-
[](https://www.mongodb.com)
|
|
12
|
-
[](https://www.postgresql.org)
|
|
10
|
+
[](https://nodejs.org)
|
|
11
|
+
[](https://www.mongodb.com)
|
|
12
|
+
[](https://www.postgresql.org)
|
|
13
13
|
|
|
14
14
|
[](https://www.npmjs.com/package/parse-server)
|
|
15
15
|
[](https://www.npmjs.com/package/parse-server)
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
[![License][license-svg]][license-link]
|
|
21
21
|
[](https://community.parseplatform.org/c/parse-server)
|
|
22
22
|
[](https://twitter.com/intent/follow?screen_name=ParsePlatform)
|
|
23
|
+
[](https://chat.parseplatform.org)
|
|
23
24
|
|
|
24
25
|
---
|
|
25
26
|
|
|
@@ -31,16 +32,14 @@ The full documentation for Parse Server is available in the [wiki](https://githu
|
|
|
31
32
|
|
|
32
33
|
A big *thank you* 🙏 to our [sponsors](#sponsors) and [backers](#backers) who support the development of Parse Platform!
|
|
33
34
|
|
|
34
|
-
### Diamond Sponsors
|
|
35
|
-
|
|
36
|
-
[](https://opencollective.com/parse-server/contribute/diamond-sponsor-10560)
|
|
37
|
-
|
|
38
35
|
#### Bronze Sponsors
|
|
39
36
|
|
|
40
37
|
[](https://opencollective.com/parse-server/contribute/bronze-sponsor-10559)
|
|
41
38
|
|
|
42
39
|
---
|
|
43
40
|
|
|
41
|
+
- [Flavors & Branches](#flavors--branches)
|
|
42
|
+
- [Long Term Support](#long-term-support)
|
|
44
43
|
- [Getting Started](#getting-started)
|
|
45
44
|
- [Running Parse Server](#running-parse-server)
|
|
46
45
|
- [Compatibility](#compatibility)
|
|
@@ -88,13 +87,25 @@ A big *thank you* 🙏 to our [sponsors](#sponsors) and [backers](#backers) who
|
|
|
88
87
|
- [Using automatically generated operations](#using-automatically-generated-operations)
|
|
89
88
|
- [Customizing your GraphQL Schema](#customizing-your-graphql-schema)
|
|
90
89
|
- [Learning more](#learning-more)
|
|
91
|
-
- [Upgrading to 3.0
|
|
92
|
-
- [Want to ride the bleeding edge?](#want-to-ride-the-bleeding-edge)
|
|
90
|
+
- [Upgrading to Parse Server 3.0](#upgrading-to-parse-server-30)
|
|
93
91
|
- [Contributing](#contributing)
|
|
94
92
|
- [Contributors](#contributors)
|
|
95
93
|
- [Sponsors](#sponsors)
|
|
96
94
|
- [Backers](#backers)
|
|
97
95
|
|
|
96
|
+
# Flavors & Branches
|
|
97
|
+
|
|
98
|
+
Parse Server is available in different flavors on different branches:
|
|
99
|
+
|
|
100
|
+
- The main branches are [release][log_release], [beta][log_beta] and [alpha][log_alpha]. See the [changelog overview](CHANGELOG.md) for details.
|
|
101
|
+
- The long-term-support (LTS) branches are named `release-<version>.x.x`, for example `release-4.x.x`. LTS branches do not have pre-release branches.
|
|
102
|
+
|
|
103
|
+
## Long Term Support
|
|
104
|
+
|
|
105
|
+
Long-Term-Support (LTS) is provided for the previous Parse Server major version. For example, Parse Server 4.x will receive security updates until Parse Server 5.x is superseded by Parse Server 6.x and becomes the new LTS version. While the current major version is published on branch `release`, a LTS version is published on branch `release-#.x.x`, for example `release-4.x.x` for the Parse Server 4.x LTS branch.
|
|
106
|
+
|
|
107
|
+
⚠️ LTS versions are provided to help you transition as soon as possible to the current major version. While we aim to fix security vulnerabilities in the LTS version, our main focus is on developing the current major version and preparing the next major release. Therefore we may leave certain vulnerabilities up to the community to fix. Search for [pull requests with the specific LTS base branch](https://github.com/parse-community/parse-server/pulls?q=is%3Aopen+is%3Apr+base%3Arelease-4.x.x) to see the current open vulnerabilities for that LTS branch.
|
|
108
|
+
|
|
98
109
|
# Getting Started
|
|
99
110
|
|
|
100
111
|
The fastest and easiest way to get started is to run MongoDB and Parse Server locally.
|
|
@@ -110,38 +121,43 @@ Before you start make sure you have installed:
|
|
|
110
121
|
### Compatibility
|
|
111
122
|
|
|
112
123
|
#### Node.js
|
|
124
|
+
|
|
113
125
|
Parse Server is continuously tested with the most recent releases of Node.js to ensure compatibility. We follow the [Node.js Long Term Support plan](https://github.com/nodejs/Release) and only test against versions that are officially supported and have not reached their end-of-life date.
|
|
114
126
|
|
|
115
|
-
| Version | Latest Version | End-of-Life | Compatible
|
|
116
|
-
|
|
117
|
-
| Node.js 12 | 12.22.
|
|
118
|
-
| Node.js 14 | 14.
|
|
119
|
-
| Node.js 16 | 16.
|
|
120
|
-
| Node.js 17 | 17.
|
|
127
|
+
| Version | Latest Version | End-of-Life | Compatible |
|
|
128
|
+
|------------|----------------|-------------|------------|
|
|
129
|
+
| Node.js 12 | 12.22.11 | April 2022 | ✅ Yes |
|
|
130
|
+
| Node.js 14 | 14.19.1 | April 2023 | ✅ Yes |
|
|
131
|
+
| Node.js 16 | 16.14.2 | April 2024 | ✅ Yes |
|
|
132
|
+
| Node.js 17 | 17.9.0 | June 2022 | ✅ Yes |
|
|
133
|
+
| Node.js 18 | 18.1.0 | April 2025 | ✅ Yes |
|
|
121
134
|
|
|
122
135
|
#### MongoDB
|
|
123
|
-
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and only test against versions that are officially supported and have not reached their end-of-life date.
|
|
124
136
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
|
128
|
-
|
|
129
|
-
| MongoDB 4.
|
|
130
|
-
| MongoDB
|
|
131
|
-
| MongoDB
|
|
132
|
-
| MongoDB 5.
|
|
137
|
+
Parse Server is continuously tested with the most recent releases of MongoDB to ensure compatibility. We follow the [MongoDB support schedule](https://www.mongodb.com/support-policy) and [MongoDB lifecycle schedule](https://www.mongodb.com/support-policy/lifecycles) and only test against versions that are officially supported and have not reached their end-of-life date. We consider the end-of-life date of a MongoDB "rapid release" to be the same as its major version release.
|
|
138
|
+
|
|
139
|
+
| Version | Latest Version | End-of-Life | Compatible |
|
|
140
|
+
|-------------|----------------|---------------|--------------|
|
|
141
|
+
| MongoDB 4.0 | 4.0.28 | April 2022 | ✅ Yes |
|
|
142
|
+
| MongoDB 4.2 | 4.2.19 | April 2023 | ✅ Yes |
|
|
143
|
+
| MongoDB 4.4 | 4.4.13 | February 2024 | ✅ Yes |
|
|
144
|
+
| MongoDB 5.3 | 5.3.2 | October 2024 | ✅ Yes |
|
|
145
|
+
| MongoDB 6 | 6.0.2 | July 2025 | ✅ Yes |
|
|
133
146
|
|
|
134
147
|
#### PostgreSQL
|
|
135
|
-
Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support if a version is older than 3.5 years and a newer version has been available for at least 2.5 years.
|
|
136
148
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
|
140
|
-
|
|
141
|
-
| Postgres
|
|
142
|
-
| Postgres
|
|
149
|
+
Parse Server is continuously tested with the most recent releases of PostgreSQL and PostGIS to ensure compatibility, using [PostGIS docker images](https://registry.hub.docker.com/r/postgis/postgis/tags?page=1&ordering=last_updated). We follow the [PostgreSQL support schedule](https://www.postgresql.org/support/versioning) and [PostGIS support schedule](https://www.postgis.net/eol_policy/) and only test against versions that are officially supported and have not reached their end-of-life date. Due to the extensive PostgreSQL support duration of 5 years, Parse Server drops support about 2 years before the official end-of-life date.
|
|
150
|
+
|
|
151
|
+
| Version | PostGIS Version | End-of-Life | Parse Server Support | Compatible |
|
|
152
|
+
|-------------|--------------------|---------------|----------------------|------------|
|
|
153
|
+
| Postgres 11 | 3.0, 3.1, 3.2, 3.3 | November 2023 | <= 5.x (2022) | ✅ Yes |
|
|
154
|
+
| Postgres 12 | 3.3 | November 2024 | <= 5.x (2022) | ✅ Yes |
|
|
155
|
+
| Postgres 13 | 3.3 | November 2025 | <= 6.x (2023) | ✅ Yes |
|
|
156
|
+
| Postgres 14 | 3.3 | November 2026 | <= 7.x (2024) | ✅ Yes |
|
|
157
|
+
| Postgres 15 | 3.3 | November 2027 | <= 8.x (2025) | ✅ Yes |
|
|
143
158
|
|
|
144
159
|
### Locally
|
|
160
|
+
|
|
145
161
|
```bash
|
|
146
162
|
$ npm install -g parse-server mongodb-runner
|
|
147
163
|
$ mongodb-runner start
|
|
@@ -234,7 +250,6 @@ $ curl -X GET \
|
|
|
234
250
|
}
|
|
235
251
|
]
|
|
236
252
|
}
|
|
237
|
-
|
|
238
253
|
```
|
|
239
254
|
|
|
240
255
|
To learn more about using saving and querying objects on Parse Server, check out the [Parse documentation](http://docs.parseplatform.org).
|
|
@@ -340,8 +355,10 @@ const server = ParseServer({
|
|
|
340
355
|
});
|
|
341
356
|
```
|
|
342
357
|
|
|
358
|
+
Offical email adapters maintained by Parse Platform:
|
|
359
|
+
- [parse-server-api-mail-adapter](https://github.com/parse-community/parse-server-api-mail-adapter) (localization, templates, universally supports any email provider)
|
|
360
|
+
|
|
343
361
|
Email adapters contributed by the community:
|
|
344
|
-
- [parse-server-api-mail-adapter](https://www.npmjs.com/package/parse-server-api-mail-adapter) (localization, templates, universally supports any email provider)
|
|
345
362
|
- [parse-smtp-template](https://www.npmjs.com/package/parse-smtp-template) (localization, templates)
|
|
346
363
|
- [parse-server-postmark-adapter](https://www.npmjs.com/package/parse-server-postmark-adapter)
|
|
347
364
|
- [parse-server-sendgrid-adapter](https://www.npmjs.com/package/parse-server-sendgrid-adapter)
|
|
@@ -384,6 +401,7 @@ const server = ParseServer({
|
|
|
384
401
|
```
|
|
385
402
|
|
|
386
403
|
## Custom Routes
|
|
404
|
+
|
|
387
405
|
**Caution, this is an experimental feature that may not be appropriate for production.**
|
|
388
406
|
|
|
389
407
|
Custom routes allow to build user flows with webpages, similar to the existing password reset and email verification features. Custom routes are defined with the `pages` option in the Parse Server configuration:
|
|
@@ -416,6 +434,7 @@ The above route can be invoked by sending a `GET` request to:
|
|
|
416
434
|
The `handler` receives the `request` and returns a `custom_page.html` webpage from the `pages.pagesPath` directory as response. The advantage of building a custom route this way is that it automatically makes use of Parse Server's built-in capabilities, such as [page localization](#pages) and [dynamic placeholders](#dynamic-placeholders).
|
|
417
435
|
|
|
418
436
|
### Reserved Paths
|
|
437
|
+
|
|
419
438
|
The following paths are already used by Parse Server's built-in features and are therefore not available for custom routes. Custom routes with an identical combination of `path` and `method` are ignored.
|
|
420
439
|
|
|
421
440
|
| Path | HTTP Method | Feature |
|
|
@@ -511,6 +530,7 @@ Identical requests are identified by their request header `X-Parse-Request-Id`.
|
|
|
511
530
|
Deduplication is only done for object creation and update (`POST` and `PUT` requests). Deduplication is not done for object finding and deletion (`GET` and `DELETE` requests), as these operations are already idempotent by definition.
|
|
512
531
|
|
|
513
532
|
### Configuration example <!-- omit in toc -->
|
|
533
|
+
|
|
514
534
|
```
|
|
515
535
|
let api = new ParseServer({
|
|
516
536
|
idempotencyOptions: {
|
|
@@ -519,6 +539,7 @@ let api = new ParseServer({
|
|
|
519
539
|
}
|
|
520
540
|
}
|
|
521
541
|
```
|
|
542
|
+
|
|
522
543
|
### Parameters <!-- omit in toc -->
|
|
523
544
|
|
|
524
545
|
| Parameter | Optional | Type | Default value | Example values | Environment variable | Description |
|
|
@@ -551,6 +572,7 @@ Assuming the script above is named, `parse_idempotency_delete_expired_records.sh
|
|
|
551
572
|
## Localization
|
|
552
573
|
|
|
553
574
|
### Pages
|
|
575
|
+
|
|
554
576
|
**Caution, this is an experimental feature that may not be appropriate for production.**
|
|
555
577
|
|
|
556
578
|
Custom pages as well as feature pages (e.g. password reset, email verification) can be localized with the `pages` option in the Parse Server configuration:
|
|
@@ -1094,37 +1116,15 @@ You also have a very powerful tool inside your GraphQL Playground. Please look a
|
|
|
1094
1116
|
|
|
1095
1117
|
Additionally, the [GraphQL Learn Section](https://graphql.org/learn/) is a very good source to learn more about the power of the GraphQL language.
|
|
1096
1118
|
|
|
1097
|
-
# Upgrading to 3.0
|
|
1098
|
-
|
|
1099
|
-
Starting 3.0.0, parse-server uses the JS SDK version 2.0.
|
|
1100
|
-
In short, parse SDK v2.0 removes the backbone style callbacks as well as the Parse.Promise object in favor of native promises.
|
|
1101
|
-
All the Cloud Code interfaces also have been updated to reflect those changes, and all backbone style response objects are removed and replaced by Promise style resolution.
|
|
1102
|
-
|
|
1103
|
-
We have written up a [migration guide](3.0.0.md), hoping this will help you transition to the next major release.
|
|
1104
|
-
|
|
1105
|
-
# Want to ride the bleeding edge?
|
|
1106
|
-
|
|
1107
|
-
It is recommend to use builds deployed npm for many reasons, but if you want to use
|
|
1108
|
-
the latest not-yet-released version of parse-server, you can do so by depending
|
|
1109
|
-
directly on this branch:
|
|
1119
|
+
# Upgrading to Parse Server 3.0
|
|
1110
1120
|
|
|
1111
|
-
|
|
1112
|
-
npm install parse-community/parse-server.git#master
|
|
1113
|
-
```
|
|
1114
|
-
|
|
1115
|
-
## Experimenting <!-- omit in toc -->
|
|
1116
|
-
|
|
1117
|
-
You can also use your own forks, and work in progress branches by specifying them:
|
|
1118
|
-
|
|
1119
|
-
```
|
|
1120
|
-
npm install github:myUsername/parse-server#my-awesome-feature
|
|
1121
|
-
```
|
|
1121
|
+
Starting Parse Server 3.0, Parse Server uses the Parse JavaScript SDK 2.0. In short, the Parse JavaScript SDK 2.0 removes the backbone style callbacks as well as the `Parse.Promise` object in favor of native promises. All the Cloud Code interfaces also have been updated to reflect those changes, and all backbone style response objects are removed and replaced by promise style resolution.
|
|
1122
1122
|
|
|
1123
|
-
|
|
1123
|
+
We have written up a [migration guide](3.0.0.md) to help you transition to the next major release.
|
|
1124
1124
|
|
|
1125
1125
|
# Contributing
|
|
1126
1126
|
|
|
1127
|
-
|
|
1127
|
+
Please see the [Contributing Guide](CONTRIBUTING.md).
|
|
1128
1128
|
|
|
1129
1129
|
# Contributors
|
|
1130
1130
|
|
|
@@ -1180,3 +1180,6 @@ As of April 5, 2017, Parse, LLC has transferred this code to the parse-community
|
|
|
1180
1180
|
[license-svg]: https://img.shields.io/badge/license-BSD-lightgrey.svg
|
|
1181
1181
|
[license-link]: LICENSE
|
|
1182
1182
|
[open-collective-link]: https://opencollective.com/parse-server
|
|
1183
|
+
[log_release]: https://github.com/parse-community/parse-server/blob/release/changelogs/CHANGELOG_release.md
|
|
1184
|
+
[log_beta]: https://github.com/parse-community/parse-server/blob/beta/changelogs/CHANGELOG_beta.md
|
|
1185
|
+
[log_alpha]: https://github.com/parse-community/parse-server/blob/alpha/changelogs/CHANGELOG_alpha.md
|
|
@@ -36,24 +36,26 @@ function validateGraphToken(authData, options) {
|
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
function validateGraphAppId(appIds, authData, options) {
|
|
39
|
+
async function validateGraphAppId(appIds, authData, options) {
|
|
40
40
|
var access_token = authData.access_token;
|
|
41
41
|
|
|
42
42
|
if (process.env.TESTING && access_token === 'test') {
|
|
43
|
-
return
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (!Array.isArray(appIds)) {
|
|
47
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'appIds must be an array.');
|
|
44
48
|
}
|
|
45
49
|
|
|
46
50
|
if (!appIds.length) {
|
|
47
51
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Facebook auth is not configured.');
|
|
48
52
|
}
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
if (data && appIds.indexOf(data.id) != -1) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
+
const data = await graphRequest(`app?access_token=${access_token}${getAppSecretPath(authData, options)}`);
|
|
54
55
|
|
|
56
|
+
if (!data || !appIds.includes(data.id)) {
|
|
55
57
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Facebook auth is invalid for this user.');
|
|
56
|
-
}
|
|
58
|
+
}
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
const getFacebookKeyByKeyId = async (keyId, cacheMaxEntries, cacheMaxAge) => {
|
|
@@ -159,4 +161,4 @@ module.exports = {
|
|
|
159
161
|
validateAppId: validateAppId,
|
|
160
162
|
validateAuthData: validateAuthData
|
|
161
163
|
};
|
|
162
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2ZhY2Vib29rLmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsImNyeXB0byIsImp3a3NDbGllbnQiLCJ1dGlsIiwiand0IiwiaHR0cHNSZXF1ZXN0IiwiVE9LRU5fSVNTVUVSIiwiZ2V0QXBwU2VjcmV0UGF0aCIsImF1dGhEYXRhIiwib3B0aW9ucyIsImFwcFNlY3JldCIsImFwcHNlY3JldF9wcm9vZiIsImNyZWF0ZUhtYWMiLCJ1cGRhdGUiLCJhY2Nlc3NfdG9rZW4iLCJkaWdlc3QiLCJ2YWxpZGF0ZUdyYXBoVG9rZW4iLCJncmFwaFJlcXVlc3QiLCJ0aGVuIiwiZGF0YSIsImlkIiwicHJvY2VzcyIsImVudiIsIlRFU1RJTkciLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUdyYXBoQXBwSWQiLCJhcHBJZHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsImxlbmd0aCIsImluZGV4T2YiLCJnZXRGYWNlYm9va0tleUJ5S2V5SWQiLCJrZXlJZCIsImNhY2hlTWF4RW50cmllcyIsImNhY2hlTWF4QWdlIiwiY2xpZW50Iiwiandrc1VyaSIsImNhY2hlIiwiYXN5bmNHZXRTaWduaW5nS2V5RnVuY3Rpb24iLCJwcm9taXNpZnkiLCJnZXRTaWduaW5nS2V5Iiwia2V5IiwiZXJyb3IiLCJnZXRIZWFkZXJGcm9tVG9rZW4iLCJ0b2tlbiIsImRlY29kZWRUb2tlbiIsImRlY29kZSIsImNvbXBsZXRlIiwiaGVhZGVyIiwidmVyaWZ5SWRUb2tlbiIsImNsaWVudElkIiwia2lkIiwiYWxnIiwiYWxnb3JpdGhtIiwiT05FX0hPVVJfSU5fTVMiLCJqd3RDbGFpbXMiLCJmYWNlYm9va0tleSIsInNpZ25pbmdLZXkiLCJwdWJsaWNLZXkiLCJyc2FQdWJsaWNLZXkiLCJ2ZXJpZnkiLCJhbGdvcml0aG1zIiwiYXVkaWVuY2UiLCJleGNlcHRpb24iLCJtZXNzYWdlIiwiaXNzIiwic3ViIiwidmFsaWRhdGVBdXRo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Q2ZKLEVBQUFBLGFBQWEsRUFBRUEsYUFEQTtBQUVmRCxFQUFBQSxnQkFBZ0IsRUFBRUE7QUFGSCxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgRmFjZWJvb2sgR3JhcGggQVBJLlxuY29uc3QgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGp3a3NDbGllbnQgPSByZXF1aXJlKCdqd2tzLXJzYScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGp3dCA9IHJlcXVpcmUoJ2pzb253ZWJ0b2tlbicpO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcblxuY29uc3QgVE9LRU5fSVNTVUVSID0gJ2h0dHBzOi8vZmFjZWJvb2suY29tJztcblxuZnVuY3Rpb24gZ2V0QXBwU2VjcmV0UGF0aChhdXRoRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGFwcFNlY3JldCA9IG9wdGlvbnMuYXBwU2VjcmV0O1xuICBpZiAoIWFwcFNlY3JldCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBhcHBzZWNyZXRfcHJvb2YgPSBjcnlwdG9cbiAgICAuY3JlYXRlSG1hYygnc2hhMjU2JywgYXBwU2VjcmV0KVxuICAgIC51cGRhdGUoYXV0aERhdGEuYWNjZXNzX3Rva2VuKVxuICAgIC5kaWdlc3QoJ2hleCcpO1xuXG4gIHJldHVybiBgJmFwcHNlY3JldF9wcm9vZj0ke2FwcHNlY3JldF9wcm9vZn1gO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyYXBoVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGdyYXBoUmVxdWVzdChcbiAgICAnbWU/ZmllbGRzPWlkJmFjY2Vzc190b2tlbj0nICsgYXV0aERhdGEuYWNjZXNzX3Rva2VuICsgZ2V0QXBwU2VjcmV0UGF0aChhdXRoRGF0YSwgb3B0aW9ucylcbiAgKS50aGVuKGRhdGEgPT4ge1xuICAgIGlmICgoZGF0YSAmJiBkYXRhLmlkID09IGF1dGhEYXRhLmlkKSB8fCAocHJvY2Vzcy5lbnYuVEVTVElORyAmJiBhdXRoRGF0YS5pZCA9PT0gJ3Rlc3QnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0ZhY2Vib29rIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVHcmFwaEFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGFjY2Vzc190b2tlbiA9IGF1dGhEYXRhLmFjY2Vzc190b2tlbjtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcgJiYgYWNjZXNzX3Rva2VuID09PSAndGVzdCcpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgaWYgKCFhcHBJZHMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdGYWNlYm9vayBhdXRoIGlzIG5vdCBjb25maWd1cmVkLicpO1xuICB9XG4gIHJldHVybiBncmFwaFJlcXVlc3QoXG4gICAgJ2FwcD9hY2Nlc3NfdG9rZW49JyArIGFjY2Vzc190b2tlbiArIGdldEFwcFNlY3JldFBhdGgoYXV0aERhdGEsIG9wdGlvbnMpXG4gICkudGhlbihkYXRhID0+IHtcbiAgICBpZiAoZGF0YSAmJiBhcHBJZHMuaW5kZXhPZihkYXRhLmlkKSAhPSAtMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0ZhY2Vib29rIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9KTtcbn1cblxuY29uc3QgZ2V0RmFjZWJvb2tLZXlCeUtleUlkID0gYXN5bmMgKGtleUlkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlKSA9PiB7XG4gIGNvbnN0IGNsaWVudCA9IGp3a3NDbGllbnQoe1xuICAgIGp3a3NVcmk6IGAke1RPS0VOX0lTU1VFUn0vLndlbGwta25vd24vb2F1dGgvb3BlbmlkL2p3a3MvYCxcbiAgICBjYWNoZTogdHJ1ZSxcbiAgICBjYWNoZU1heEVudHJpZXMsXG4gICAgY2FjaGVNYXhBZ2UsXG4gIH0pO1xuXG4gIGNvbnN0IGFzeW5jR2V0U2lnbmluZ0tleUZ1bmN0aW9uID0gdXRpbC5wcm9taXNpZnkoY2xpZW50LmdldFNpZ25pbmdLZXkpO1xuXG4gIGxldCBrZXk7XG4gIHRyeSB7XG4gICAga2V5ID0gYXdhaXQgYXN5bmNHZXRTaWduaW5nS2V5RnVuY3Rpb24oa2V5SWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcga2V5IGZvciBLZXkgSUQ6ICR7a2V5SWR9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGtleTtcbn07XG5cbmNvbnN0IGdldEhlYWRlckZyb21Ub2tlbiA9IHRva2VuID0+IHtcbiAgY29uc3QgZGVjb2RlZFRva2VuID0gand0LmRlY29kZSh0b2tlbiwgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ3Byb3ZpZGVkIHRva2VuIGRvZXMgbm90IGRlY29kZSBhcyBKV1QnKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVkVG9rZW4uaGVhZGVyO1xufTtcblxuY29uc3QgdmVyaWZ5SWRUb2tlbiA9IGFzeW5jICh7IHRva2VuLCBpZCB9LCB7IGNsaWVudElkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlIH0pID0+IHtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnaWQgdG9rZW4gaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9XG5cbiAgY29uc3QgeyBraWQ6IGtleUlkLCBhbGc6IGFsZ29yaXRobSB9ID0gZ2V0SGVhZGVyRnJvbVRva2VuKHRva2VuKTtcbiAgY29uc3QgT05FX0hPVVJfSU5fTVMgPSAzNjAwMDAwO1xuICBsZXQgand0Q2xhaW1zO1xuXG4gIGNhY2hlTWF4QWdlID0gY2FjaGVNYXhBZ2UgfHwgT05FX0hPVVJfSU5fTVM7XG4gIGNhY2hlTWF4RW50cmllcyA9IGNhY2hlTWF4RW50cmllcyB8fCA1O1xuXG4gIGNvbnN0IGZhY2Vib29rS2V5ID0gYXdhaXQgZ2V0RmFjZWJvb2tLZXlCeUtleUlkKGtleUlkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlKTtcbiAgY29uc3Qgc2lnbmluZ0tleSA9IGZhY2Vib29rS2V5LnB1YmxpY0tleSB8fCBmYWNlYm9va0tleS5yc2FQdWJsaWNLZXk7XG5cbiAgdHJ5IHtcbiAgICBqd3RDbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBzaWduaW5nS2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBhbGdvcml0aG0sXG4gICAgICAvLyB0aGUgYXVkaWVuY2UgY2FuIGJlIGNoZWNrZWQgYWdhaW5zdCBhIHN0cmluZywgYSByZWd1bGFyIGV4cHJlc3Npb24gb3IgYSBsaXN0IG9mIHN0cmluZ3MgYW5kL29yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAgICBhdWRpZW5jZTogY2xpZW50SWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTtcblxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgJHttZXNzYWdlfWApO1xuICB9XG5cbiAgaWYgKGp3dENsYWltcy5pc3MgIT09IFRPS0VOX0lTU1VFUikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGlzc3VlZCBieSBjb3JyZWN0IE9wZW5JRCBwcm92aWRlciAtIGV4cGVjdGVkOiAke1RPS0VOX0lTU1VFUn0gfCBmcm9tOiAke2p3dENsYWltcy5pc3N9YFxuICAgICk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLnN1YiAhPT0gaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ2F1dGggZGF0YSBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH1cbiAgcmV0dXJuIGp3dENsYWltcztcbn07XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKGF1dGhEYXRhLnRva2VuKSB7XG4gICAgcmV0dXJuIHZlcmlmeUlkVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWxpZGF0ZUdyYXBoVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gIGlmIChhdXRoRGF0YS50b2tlbikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsaWRhdGVHcmFwaEFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8vIEEgcHJvbWlzZXkgd3JhcHBlciBmb3IgRkIgZ3JhcGggcmVxdWVzdHMuXG5mdW5jdGlvbiBncmFwaFJlcXVlc3QocGF0aCkge1xuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldCgnaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJyArIHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZDogdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YTogdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXX0=
|
|
164
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2ZhY2Vib29rLmpzIl0sIm5hbWVzIjpbIlBhcnNlIiwicmVxdWlyZSIsImNyeXB0byIsImp3a3NDbGllbnQiLCJ1dGlsIiwiand0IiwiaHR0cHNSZXF1ZXN0IiwiVE9LRU5fSVNTVUVSIiwiZ2V0QXBwU2VjcmV0UGF0aCIsImF1dGhEYXRhIiwib3B0aW9ucyIsImFwcFNlY3JldCIsImFwcHNlY3JldF9wcm9vZiIsImNyZWF0ZUhtYWMiLCJ1cGRhdGUiLCJhY2Nlc3NfdG9rZW4iLCJkaWdlc3QiLCJ2YWxpZGF0ZUdyYXBoVG9rZW4iLCJncmFwaFJlcXVlc3QiLCJ0aGVuIiwiZGF0YSIsImlkIiwicHJvY2VzcyIsImVudiIsIlRFU1RJTkciLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJ2YWxpZGF0ZUdyYXBoQXBwSWQiLCJhcHBJZHMiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJpbmNsdWRlcyIsImdldEZhY2Vib29rS2V5QnlLZXlJZCIsImtleUlkIiwiY2FjaGVNYXhFbnRyaWVzIiwiY2FjaGVNYXhBZ2UiLCJjbGllbnQiLCJqd2tzVXJpIiwiY2FjaGUiLCJhc3luY0dldFNpZ25pbmdLZXlGdW5jdGlvbiIsInByb21pc2lmeSIsImdldFNpZ25pbmdLZXkiLCJrZXkiLCJlcnJvciIsImdldEhlYWRlckZyb21Ub2tlbiIsInRva2VuIiwiZGVjb2RlZFRva2VuIiwiZGVjb2RlIiwiY29tcGxldGUiLCJoZWFkZXIiLCJ2ZXJpZnlJZFRva2VuIiwiY2xpZW50SWQiLCJraWQiLCJhbGciLCJhbGdvcml0aG0iLCJPTkVfSE9VUl9JTl9NUyIsImp3dENsYWltcyIsImZhY2Vib29rS2V5Iiwic2lnbmluZ0tleSIsInB1YmxpY0tleSIsInJzYVB1YmxpY0tleSIsInZlcmlmeSIsImFsZ29yaXRobXMiLCJhdWRpZW5jZSIsImV4Y2VwdGlvbiIsIm1lc3NhZ2UiLCJpc3MiLCJzdWIiLCJ2YWxpZGF0ZUF1dGhEYXRhIiwidmFsaWRhdGVBcHBJZCIsIlByb21pc2UiLCJyZXNvbHZlIiwicGF0aCIsImdldCIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7O0FBQUE7QUFDQSxNQUFNQSxLQUFLLEdBQUdDLE9BQU8sQ0FBQyxZQUFELENBQVAsQ0FBc0JELEtBQXBDOztBQUNBLE1BQU1FLE1BQU0sR0FBR0QsT0FBTyxDQUFDLFFBQUQsQ0FBdEI7O0FBQ0EsTUFBTUUsVUFBVSxHQUFHRixPQUFPLENBQUMsVUFBRCxDQUExQjs7QUFDQSxNQUFNRyxJQUFJLEdBQUdILE9BQU8sQ0FBQyxNQUFELENBQXBCOztBQUNBLE1BQU1JLEdBQUcsR0FBR0osT0FBTyxDQUFDLGNBQUQsQ0FBbkI7O0FBQ0EsTUFBTUssWUFBWSxHQUFHTCxPQUFPLENBQUMsZ0JBQUQsQ0FBNUI7O0FBRUEsTUFBTU0sWUFBWSxHQUFHLHNCQUFyQjs7QUFFQSxTQUFTQyxnQkFBVCxDQUEwQkMsUUFBMUIsRUFBb0NDLE9BQU8sR0FBRyxFQUE5QyxFQUFrRDtBQUNoRCxRQUFNQyxTQUFTLEdBQUdELE9BQU8sQ0FBQ0MsU0FBMUI7O0FBQ0EsTUFBSSxDQUFDQSxTQUFMLEVBQWdCO0FBQ2QsV0FBTyxFQUFQO0FBQ0Q7O0FBQ0QsUUFBTUMsZUFBZSxHQUFHVixNQUFNLENBQzNCVyxVQURxQixDQUNWLFFBRFUsRUFDQUYsU0FEQSxFQUVyQkcsTUFGcUIsQ0FFZEwsUUFBUSxDQUFDTSxZQUZLLEVBR3JCQyxNQUhxQixDQUdkLEtBSGMsQ0FBeEI7QUFLQSxTQUFRLG9CQUFtQkosZUFBZ0IsRUFBM0M7QUFDRDs7QUFFRCxTQUFTSyxrQkFBVCxDQUE0QlIsUUFBNUIsRUFBc0NDLE9BQXRDLEVBQStDO0FBQzdDLFNBQU9RLFlBQVksQ0FDakIsK0JBQStCVCxRQUFRLENBQUNNLFlBQXhDLEdBQXVEUCxnQkFBZ0IsQ0FBQ0MsUUFBRCxFQUFXQyxPQUFYLENBRHRELENBQVosQ0FFTFMsSUFGSyxDQUVBQyxJQUFJLElBQUk7QUFDYixRQUFLQSxJQUFJLElBQUlB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LFlBQVQsQ0FBc0J1RCxJQUF0QixFQUE0QjtBQUMxQixTQUFPbkUsWUFBWSxDQUFDb0UsR0FBYixDQUFpQixnQ0FBZ0NELElBQWpELENBQVA7QUFDRDs7QUFFREUsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZOLEVBQUFBLGFBQWEsRUFBRUEsYUFEQTtBQUVmRCxFQUFBQSxnQkFBZ0IsRUFBRUE7QUFGSCxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGFjY2Vzc2luZyB0aGUgRmFjZWJvb2sgR3JhcGggQVBJLlxuY29uc3QgUGFyc2UgPSByZXF1aXJlKCdwYXJzZS9ub2RlJykuUGFyc2U7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGp3a3NDbGllbnQgPSByZXF1aXJlKCdqd2tzLXJzYScpO1xuY29uc3QgdXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbmNvbnN0IGp3dCA9IHJlcXVpcmUoJ2pzb253ZWJ0b2tlbicpO1xuY29uc3QgaHR0cHNSZXF1ZXN0ID0gcmVxdWlyZSgnLi9odHRwc1JlcXVlc3QnKTtcblxuY29uc3QgVE9LRU5fSVNTVUVSID0gJ2h0dHBzOi8vZmFjZWJvb2suY29tJztcblxuZnVuY3Rpb24gZ2V0QXBwU2VjcmV0UGF0aChhdXRoRGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGFwcFNlY3JldCA9IG9wdGlvbnMuYXBwU2VjcmV0O1xuICBpZiAoIWFwcFNlY3JldCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBhcHBzZWNyZXRfcHJvb2YgPSBjcnlwdG9cbiAgICAuY3JlYXRlSG1hYygnc2hhMjU2JywgYXBwU2VjcmV0KVxuICAgIC51cGRhdGUoYXV0aERhdGEuYWNjZXNzX3Rva2VuKVxuICAgIC5kaWdlc3QoJ2hleCcpO1xuXG4gIHJldHVybiBgJmFwcHNlY3JldF9wcm9vZj0ke2FwcHNlY3JldF9wcm9vZn1gO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdyYXBoVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIGdyYXBoUmVxdWVzdChcbiAgICAnbWU/ZmllbGRzPWlkJmFjY2Vzc190b2tlbj0nICsgYXV0aERhdGEuYWNjZXNzX3Rva2VuICsgZ2V0QXBwU2VjcmV0UGF0aChhdXRoRGF0YSwgb3B0aW9ucylcbiAgKS50aGVuKGRhdGEgPT4ge1xuICAgIGlmICgoZGF0YSAmJiBkYXRhLmlkID09IGF1dGhEYXRhLmlkKSB8fCAocHJvY2Vzcy5lbnYuVEVTVElORyAmJiBhdXRoRGF0YS5pZCA9PT0gJ3Rlc3QnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ0ZhY2Vib29rIGF1dGggaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVHcmFwaEFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgdmFyIGFjY2Vzc190b2tlbiA9IGF1dGhEYXRhLmFjY2Vzc190b2tlbjtcbiAgaWYgKHByb2Nlc3MuZW52LlRFU1RJTkcgJiYgYWNjZXNzX3Rva2VuID09PSAndGVzdCcpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KGFwcElkcykpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ2FwcElkcyBtdXN0IGJlIGFuIGFycmF5LicpO1xuICB9XG4gIGlmICghYXBwSWRzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnRmFjZWJvb2sgYXV0aCBpcyBub3QgY29uZmlndXJlZC4nKTtcbiAgfVxuICBjb25zdCBkYXRhID0gYXdhaXQgZ3JhcGhSZXF1ZXN0KFxuICAgIGBhcHA/YWNjZXNzX3Rva2VuPSR7YWNjZXNzX3Rva2VufSR7Z2V0QXBwU2VjcmV0UGF0aChhdXRoRGF0YSwgb3B0aW9ucyl9YFxuICApO1xuICBpZiAoIWRhdGEgfHwgIWFwcElkcy5pbmNsdWRlcyhkYXRhLmlkKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnRmFjZWJvb2sgYXV0aCBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH1cbn1cblxuY29uc3QgZ2V0RmFjZWJvb2tLZXlCeUtleUlkID0gYXN5bmMgKGtleUlkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlKSA9PiB7XG4gIGNvbnN0IGNsaWVudCA9IGp3a3NDbGllbnQoe1xuICAgIGp3a3NVcmk6IGAke1RPS0VOX0lTU1VFUn0vLndlbGwta25vd24vb2F1dGgvb3BlbmlkL2p3a3MvYCxcbiAgICBjYWNoZTogdHJ1ZSxcbiAgICBjYWNoZU1heEVudHJpZXMsXG4gICAgY2FjaGVNYXhBZ2UsXG4gIH0pO1xuXG4gIGNvbnN0IGFzeW5jR2V0U2lnbmluZ0tleUZ1bmN0aW9uID0gdXRpbC5wcm9taXNpZnkoY2xpZW50LmdldFNpZ25pbmdLZXkpO1xuXG4gIGxldCBrZXk7XG4gIHRyeSB7XG4gICAga2V5ID0gYXdhaXQgYXN5bmNHZXRTaWduaW5nS2V5RnVuY3Rpb24oa2V5SWQpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgVW5hYmxlIHRvIGZpbmQgbWF0Y2hpbmcga2V5IGZvciBLZXkgSUQ6ICR7a2V5SWR9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGtleTtcbn07XG5cbmNvbnN0IGdldEhlYWRlckZyb21Ub2tlbiA9IHRva2VuID0+IHtcbiAgY29uc3QgZGVjb2RlZFRva2VuID0gand0LmRlY29kZSh0b2tlbiwgeyBjb21wbGV0ZTogdHJ1ZSB9KTtcbiAgaWYgKCFkZWNvZGVkVG9rZW4pIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ3Byb3ZpZGVkIHRva2VuIGRvZXMgbm90IGRlY29kZSBhcyBKV1QnKTtcbiAgfVxuXG4gIHJldHVybiBkZWNvZGVkVG9rZW4uaGVhZGVyO1xufTtcblxuY29uc3QgdmVyaWZ5SWRUb2tlbiA9IGFzeW5jICh7IHRva2VuLCBpZCB9LCB7IGNsaWVudElkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlIH0pID0+IHtcbiAgaWYgKCF0b2tlbikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnaWQgdG9rZW4gaXMgaW52YWxpZCBmb3IgdGhpcyB1c2VyLicpO1xuICB9XG5cbiAgY29uc3QgeyBraWQ6IGtleUlkLCBhbGc6IGFsZ29yaXRobSB9ID0gZ2V0SGVhZGVyRnJvbVRva2VuKHRva2VuKTtcbiAgY29uc3QgT05FX0hPVVJfSU5fTVMgPSAzNjAwMDAwO1xuICBsZXQgand0Q2xhaW1zO1xuXG4gIGNhY2hlTWF4QWdlID0gY2FjaGVNYXhBZ2UgfHwgT05FX0hPVVJfSU5fTVM7XG4gIGNhY2hlTWF4RW50cmllcyA9IGNhY2hlTWF4RW50cmllcyB8fCA1O1xuXG4gIGNvbnN0IGZhY2Vib29rS2V5ID0gYXdhaXQgZ2V0RmFjZWJvb2tLZXlCeUtleUlkKGtleUlkLCBjYWNoZU1heEVudHJpZXMsIGNhY2hlTWF4QWdlKTtcbiAgY29uc3Qgc2lnbmluZ0tleSA9IGZhY2Vib29rS2V5LnB1YmxpY0tleSB8fCBmYWNlYm9va0tleS5yc2FQdWJsaWNLZXk7XG5cbiAgdHJ5IHtcbiAgICBqd3RDbGFpbXMgPSBqd3QudmVyaWZ5KHRva2VuLCBzaWduaW5nS2V5LCB7XG4gICAgICBhbGdvcml0aG1zOiBhbGdvcml0aG0sXG4gICAgICAvLyB0aGUgYXVkaWVuY2UgY2FuIGJlIGNoZWNrZWQgYWdhaW5zdCBhIHN0cmluZywgYSByZWd1bGFyIGV4cHJlc3Npb24gb3IgYSBsaXN0IG9mIHN0cmluZ3MgYW5kL29yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG4gICAgICBhdWRpZW5jZTogY2xpZW50SWQsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGV4Y2VwdGlvbikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlcHRpb24ubWVzc2FnZTtcblxuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCBgJHttZXNzYWdlfWApO1xuICB9XG5cbiAgaWYgKGp3dENsYWltcy5pc3MgIT09IFRPS0VOX0lTU1VFUikge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICBgaWQgdG9rZW4gbm90IGlzc3VlZCBieSBjb3JyZWN0IE9wZW5JRCBwcm92aWRlciAtIGV4cGVjdGVkOiAke1RPS0VOX0lTU1VFUn0gfCBmcm9tOiAke2p3dENsYWltcy5pc3N9YFxuICAgICk7XG4gIH1cblxuICBpZiAoand0Q2xhaW1zLnN1YiAhPT0gaWQpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCwgJ2F1dGggZGF0YSBpcyBpbnZhbGlkIGZvciB0aGlzIHVzZXIuJyk7XG4gIH1cbiAgcmV0dXJuIGp3dENsYWltcztcbn07XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEsIG9wdGlvbnMpIHtcbiAgaWYgKGF1dGhEYXRhLnRva2VuKSB7XG4gICAgcmV0dXJuIHZlcmlmeUlkVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB2YWxpZGF0ZUdyYXBoVG9rZW4oYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWZmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zKSB7XG4gIGlmIChhdXRoRGF0YS50b2tlbikge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdmFsaWRhdGVHcmFwaEFwcElkKGFwcElkcywgYXV0aERhdGEsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8vIEEgcHJvbWlzZXkgd3JhcHBlciBmb3IgRkIgZ3JhcGggcmVxdWVzdHMuXG5mdW5jdGlvbiBncmFwaFJlcXVlc3QocGF0aCkge1xuICByZXR1cm4gaHR0cHNSZXF1ZXN0LmdldCgnaHR0cHM6Ly9ncmFwaC5mYWNlYm9vay5jb20vJyArIHBhdGgpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgdmFsaWRhdGVBcHBJZDogdmFsaWRhdGVBcHBJZCxcbiAgdmFsaWRhdGVBdXRoRGF0YTogdmFsaWRhdGVBdXRoRGF0YSxcbn07XG4iXX0=
|
|
@@ -20,21 +20,20 @@ const crypto = require('crypto');
|
|
|
20
20
|
|
|
21
21
|
const https = require('https');
|
|
22
22
|
|
|
23
|
+
const {
|
|
24
|
+
pki
|
|
25
|
+
} = require('node-forge');
|
|
26
|
+
|
|
27
|
+
const ca = {
|
|
28
|
+
cert: null,
|
|
29
|
+
url: null
|
|
30
|
+
};
|
|
23
31
|
const cache = {}; // (publicKey -> cert) cache
|
|
24
32
|
|
|
25
33
|
function verifyPublicKeyUrl(publicKeyUrl) {
|
|
26
34
|
try {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
if (parsedUrl.protocol !== 'https:') {
|
|
30
|
-
return false;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const hostnameParts = parsedUrl.hostname.split('.');
|
|
34
|
-
const length = hostnameParts.length;
|
|
35
|
-
const domainParts = hostnameParts.slice(length - 2, length);
|
|
36
|
-
const domain = domainParts.join('.');
|
|
37
|
-
return domain === 'apple.com';
|
|
35
|
+
const regex = /^https:\/\/(?:[-_A-Za-z0-9]+\.){0,}apple\.com\/.*\.cer$/;
|
|
36
|
+
return regex.test(publicKeyUrl);
|
|
38
37
|
} catch (error) {
|
|
39
38
|
return false;
|
|
40
39
|
}
|
|
@@ -48,7 +47,7 @@ function convertX509CertToPEM(X509Cert) {
|
|
|
48
47
|
return pemPreFix + certBody + pemPostFix;
|
|
49
48
|
}
|
|
50
49
|
|
|
51
|
-
function getAppleCertificate(publicKeyUrl) {
|
|
50
|
+
async function getAppleCertificate(publicKeyUrl) {
|
|
52
51
|
if (!verifyPublicKeyUrl(publicKeyUrl)) {
|
|
53
52
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
54
53
|
}
|
|
@@ -57,28 +56,66 @@ function getAppleCertificate(publicKeyUrl) {
|
|
|
57
56
|
return cache[publicKeyUrl];
|
|
58
57
|
}
|
|
59
58
|
|
|
59
|
+
const url = new URL(publicKeyUrl);
|
|
60
|
+
const headOptions = {
|
|
61
|
+
hostname: url.hostname,
|
|
62
|
+
path: url.pathname,
|
|
63
|
+
method: 'HEAD'
|
|
64
|
+
};
|
|
65
|
+
const cert_headers = await new Promise((resolve, reject) => https.get(headOptions, res => resolve(res.headers)).on('error', reject));
|
|
66
|
+
const validContentTypes = ['application/x-x509-ca-cert', 'application/pkix-cert'];
|
|
67
|
+
|
|
68
|
+
if (!validContentTypes.includes(cert_headers['content-type']) || cert_headers['content-length'] == null || cert_headers['content-length'] > 10000) {
|
|
69
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const {
|
|
73
|
+
certificate,
|
|
74
|
+
headers
|
|
75
|
+
} = await getCertificate(publicKeyUrl);
|
|
76
|
+
|
|
77
|
+
if (headers['cache-control']) {
|
|
78
|
+
const expire = headers['cache-control'].match(/max-age=([0-9]+)/);
|
|
79
|
+
|
|
80
|
+
if (expire) {
|
|
81
|
+
cache[publicKeyUrl] = certificate; // we'll expire the cache entry later, as per max-age
|
|
82
|
+
|
|
83
|
+
setTimeout(() => {
|
|
84
|
+
delete cache[publicKeyUrl];
|
|
85
|
+
}, parseInt(expire[1], 10) * 1000);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return verifyPublicKeyIssuer(certificate, publicKeyUrl);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function getCertificate(url, buffer) {
|
|
60
93
|
return new Promise((resolve, reject) => {
|
|
61
|
-
https.get(
|
|
62
|
-
|
|
94
|
+
https.get(url, res => {
|
|
95
|
+
const data = [];
|
|
63
96
|
res.on('data', chunk => {
|
|
64
|
-
data
|
|
97
|
+
data.push(chunk);
|
|
65
98
|
});
|
|
66
99
|
res.on('end', () => {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
100
|
+
if (buffer) {
|
|
101
|
+
resolve({
|
|
102
|
+
certificate: Buffer.concat(data),
|
|
103
|
+
headers: res.headers
|
|
104
|
+
});
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
71
107
|
|
|
72
|
-
|
|
73
|
-
cache[publicKeyUrl] = cert; // we'll expire the cache entry later, as per max-age
|
|
108
|
+
let cert = '';
|
|
74
109
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
}, parseInt(expire[1], 10) * 1000);
|
|
78
|
-
}
|
|
110
|
+
for (const chunk of data) {
|
|
111
|
+
cert += chunk.toString('base64');
|
|
79
112
|
}
|
|
80
113
|
|
|
81
|
-
|
|
114
|
+
const certificate = convertX509CertToPEM(cert);
|
|
115
|
+
resolve({
|
|
116
|
+
certificate,
|
|
117
|
+
headers: res.headers
|
|
118
|
+
});
|
|
82
119
|
});
|
|
83
120
|
}).on('error', reject);
|
|
84
121
|
});
|
|
@@ -103,6 +140,24 @@ function verifySignature(publicKey, authData) {
|
|
|
103
140
|
if (!verifier.verify(publicKey, authData.signature, 'base64')) {
|
|
104
141
|
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center - invalid signature');
|
|
105
142
|
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function verifyPublicKeyIssuer(cert, publicKeyUrl) {
|
|
146
|
+
const publicKeyCert = pki.certificateFromPem(cert);
|
|
147
|
+
|
|
148
|
+
if (!ca.cert) {
|
|
149
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
try {
|
|
153
|
+
if (!ca.cert.verify(publicKeyCert)) {
|
|
154
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
155
|
+
}
|
|
156
|
+
} catch (e) {
|
|
157
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, `Apple Game Center - invalid publicKeyUrl: ${publicKeyUrl}`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return cert;
|
|
106
161
|
} // Returns a promise that fulfills if this user id is valid.
|
|
107
162
|
|
|
108
163
|
|
|
@@ -117,12 +172,31 @@ async function validateAuthData(authData) {
|
|
|
117
172
|
} // Returns a promise that fulfills if this app id is valid.
|
|
118
173
|
|
|
119
174
|
|
|
120
|
-
function validateAppId() {
|
|
121
|
-
|
|
175
|
+
async function validateAppId(appIds, authData, options = {}) {
|
|
176
|
+
if (!options.rootCertificateUrl) {
|
|
177
|
+
options.rootCertificateUrl = 'https://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt.pem';
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
if (ca.url === options.rootCertificateUrl) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const {
|
|
185
|
+
certificate,
|
|
186
|
+
headers
|
|
187
|
+
} = await getCertificate(options.rootCertificateUrl, true);
|
|
188
|
+
|
|
189
|
+
if (headers['content-type'] !== 'application/x-pem-file' || headers['content-length'] == null || headers['content-length'] > 10000) {
|
|
190
|
+
throw new Parse.Error(Parse.Error.OBJECT_NOT_FOUND, 'Apple Game Center auth adapter parameter `rootCertificateURL` is invalid.');
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
ca.cert = pki.certificateFromPem(certificate);
|
|
194
|
+
ca.url = options.rootCertificateUrl;
|
|
122
195
|
}
|
|
123
196
|
|
|
124
197
|
module.exports = {
|
|
125
198
|
validateAppId,
|
|
126
|
-
validateAuthData
|
|
199
|
+
validateAuthData,
|
|
200
|
+
cache
|
|
127
201
|
};
|
|
128
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInBhcnNlZFVybCIsIlVSTCIsInByb3RvY29sIiwiaG9zdG5hbWVQYXJ0cyIsImhvc3RuYW1lIiwic3BsaXQiLCJsZW5ndGgiLCJkb21haW5QYXJ0cyIsInNsaWNlIiwiZG9tYWluIiwiam9pbiIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiZ2V0QXBwbGVDZXJ0aWZpY2F0ZSIsIkVycm9yIiwiT0JKRUNUX05PVF9GT1VORCIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiZ2V0IiwicmVzIiwiZGF0YSIsIm9uIiwiY2h1bmsiLCJ0b1N0cmluZyIsImNlcnQiLCJoZWFkZXJzIiwiZXhwaXJlIiwic2V0VGltZW91dCIsInBhcnNlSW50IiwiY29udmVydFRpbWVzdGFtcFRvQmlnRW5kaWFuIiwidGltZXN0YW1wIiwiYnVmZmVyIiwiQnVmZmVyIiwiYWxsb2MiLCJoaWdoIiwibG93Iiwid3JpdGVVSW50MzJCRSIsInZlcmlmeVNpZ25hdHVyZSIsInB1YmxpY0tleSIsImF1dGhEYXRhIiwidmVyaWZpZXIiLCJjcmVhdGVWZXJpZnkiLCJ1cGRhdGUiLCJwbGF5ZXJJZCIsImJ1bmRsZUlkIiwic2FsdCIsInZlcmlmeSIsInNpZ25hdHVyZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVB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Q1UsUUFBUSxDQUFDVCxTQUFWLENBQTNDO0FBQ0FVLEVBQUFBLFFBQVEsQ0FBQ0UsTUFBVCxDQUFnQkgsUUFBUSxDQUFDTSxJQUF6QixFQUErQixRQUEvQjs7QUFFQSxNQUFJLENBQUNMLFFBQVEsQ0FBQ00sTUFBVCxDQUFnQlIsU0FBaEIsRUFBMkJDLFFBQVEsQ0FBQ1EsU0FBcEMsRUFBK0MsUUFBL0MsQ0FBTCxFQUErRDtBQUM3RCxVQUFNLElBQUk5RCxLQUFLLENBQUM0QixLQUFWLENBQWdCNUIsS0FBSyxDQUFDNEIsS0FBTixDQUFZQyxnQkFBNUIsRUFBOEMsdUNBQTlDLENBQU47QUFDRDtBQUNGLEMsQ0FFRDs7O0FBQ0EsZUFBZWtDLGdCQUFmLENBQWdDVCxRQUFoQyxFQUEwQztBQUN4QyxNQUFJLENBQUNBLFFBQVEsQ0FBQ1UsRUFBZCxFQUFrQjtBQUNoQixVQUFNLElBQUloRSxLQUFLLENBQUM0QixLQUFWLENBQWdCNUIsS0FBSyxDQUFDNEIsS0FBTixDQUFZQyxnQkFBNUIsRUFBOEMseUNBQTlDLENBQU47QUFDRDs7QUFDRHlCLEVBQUFBLFFBQVEsQ0FBQ0ksUUFBVCxHQUFvQkosUUFBUSxDQUFDVSxFQUE3QjtBQUNBLFFBQU1YLFNBQVMsR0FBRyxNQUFNMUIsbUJBQW1CLENBQUMyQixRQUFRLENBQUNoRCxZQUFWLENBQTNDO0FBQ0EsU0FBTzhDLGVBQWUsQ0FBQ0MsU0FBRCxFQUFZQyxRQUFaLENBQXRCO0FBQ0QsQyxDQUVEOzs7QUFDQSxTQUFTVyxhQUFULEdBQXlCO0FBQ3ZCLFNBQU9uQyxPQUFPLENBQUNDLE9BQVIsRUFBUDtBQUNEOztBQUVEbUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCO0FBQ2ZGLEVBQUFBLGFBRGU7QUFFZkYsRUFBQUE7QUFGZSxDQUFqQiIsInNvdXJjZXNDb250ZW50IjpbIi8qIEFwcGxlIEdhbWUgQ2VudGVyIEF1dGhcbmh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL2dhbWVraXQvZ2tsb2NhbHBsYXllci8xNTE1NDA3LWdlbmVyYXRlaWRlbnRpdHl2ZXJpZmljYXRpb25zaWduI2Rpc2N1c3Npb25cblxuY29uc3QgYXV0aERhdGEgPSB7XG4gIHB1YmxpY0tleVVybDogJ2h0dHBzOi8vdmFsaWQuYXBwbGUuY29tL3B1YmxpYy90aW1lb3V0LmNlcicsXG4gIHRpbWVzdGFtcDogMTQ2MDk4MTQyMTMwMyxcbiAgc2lnbmF0dXJlOiAnUG9Ed2YzOURDTjQ2NEI0OWpKQ1UwZDlZMEonLFxuICBzYWx0OiAnc2FsdFNUPT0nLFxuICBidW5kbGVJZDogJ2NvbS52YWxpZC5hcHAnXG4gIGlkOiAncGxheWVySWQnLFxufTtcbiovXG5cbmNvbnN0IHsgUGFyc2UgfSA9IHJlcXVpcmUoJ3BhcnNlL25vZGUnKTtcbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuY29uc3QgaHR0cHMgPSByZXF1aXJlKCdodHRwcycpO1xuXG5jb25zdCBjYWNoZSA9IHt9OyAvLyAocHVibGljS2V5IC0+IGNlcnQpIGNhY2hlXG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYXJzZWRVcmwgPSBuZXcgVVJMKHB1YmxpY0tleVVybCk7XG4gICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgaG9zdG5hbWVQYXJ0cyA9IHBhcnNlZFVybC5ob3N0bmFtZS5zcGxpdCgnLicpO1xuICAgIGNvbnN0IGxlbmd0aCA9IGhvc3RuYW1lUGFydHMubGVuZ3RoO1xuICAgIGNvbnN0IGRvbWFpblBhcnRzID0gaG9zdG5hbWVQYXJ0cy5zbGljZShsZW5ndGggLSAyLCBsZW5ndGgpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGRvbWFpblBhcnRzLmpvaW4oJy4nKTtcbiAgICByZXR1cm4gZG9tYWluID09PSAnYXBwbGUuY29tJztcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5mdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaHR0cHNcbiAgICAgIC5nZXQocHVibGljS2V5VXJsLCByZXMgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9ICcnO1xuICAgICAgICByZXMub24oJ2RhdGEnLCBjaHVuayA9PiB7XG4gICAgICAgICAgZGF0YSArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBjZXJ0ID0gY29udmVydFg1MDlDZXJ0VG9QRU0oZGF0YSk7XG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICAgICAgICAgIHZhciBleHBpcmUgPSByZXMuaGVhZGVyc1snY2FjaGUtY29udHJvbCddLm1hdGNoKC9tYXgtYWdlPShbMC05XSspLyk7XG4gICAgICAgICAgICBpZiAoZXhwaXJlKSB7XG4gICAgICAgICAgICAgIGNhY2hlW3B1YmxpY0tleVVybF0gPSBjZXJ0O1xuICAgICAgICAgICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVbcHVibGljS2V5VXJsXTtcbiAgICAgICAgICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShjZXJ0KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyB1c2VyIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBdXRoRGF0YShhdXRoRGF0YSkge1xuICBpZiAoIWF1dGhEYXRhLmlkKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsICdBcHBsZSBHYW1lIENlbnRlciAtIGF1dGhEYXRhIGlkIG1pc3NpbmcnKTtcbiAgfVxuICBhdXRoRGF0YS5wbGF5ZXJJZCA9IGF1dGhEYXRhLmlkO1xuICBjb25zdCBwdWJsaWNLZXkgPSBhd2FpdCBnZXRBcHBsZUNlcnRpZmljYXRlKGF1dGhEYXRhLnB1YmxpY0tleVVybCk7XG4gIHJldHVybiB2ZXJpZnlTaWduYXR1cmUocHVibGljS2V5LCBhdXRoRGF0YSk7XG59XG5cbi8vIFJldHVybnMgYSBwcm9taXNlIHRoYXQgZnVsZmlsbHMgaWYgdGhpcyBhcHAgaWQgaXMgdmFsaWQuXG5mdW5jdGlvbiB2YWxpZGF0ZUFwcElkKCkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxufTtcbiJdfQ==
|
|
202
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9BZGFwdGVycy9BdXRoL2djZW50ZXIuanMiXSwibmFtZXMiOlsiUGFyc2UiLCJyZXF1aXJlIiwiY3J5cHRvIiwiaHR0cHMiLCJwa2kiLCJjYSIsImNlcnQiLCJ1cmwiLCJjYWNoZSIsInZlcmlmeVB1YmxpY0tleVVybCIsInB1YmxpY0tleVVybCIsInJlZ2V4IiwidGVzdCIsImVycm9yIiwiY29udmVydFg1MDlDZXJ0VG9QRU0iLCJYNTA5Q2VydCIsInBlbVByZUZpeCIsInBlbVBvc3RGaXgiLCJiYXNlNjQiLCJjZXJ0Qm9keSIsIm1hdGNoIiwiUmVnRXhwIiwiam9pbiIsImdldEFwcGxlQ2VydGlmaWNhdGUiLCJFcnJvciIsIk9CSkVDVF9OT1RfRk9VTkQiLCJVUkwiLCJoZWFkT3B0aW9ucyIsImhvc3RuYW1lIiwicGF0aCIsInBhdGhuYW1lIiwibWV0aG9kIiwiY2VydF9oZWFkZXJzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJnZXQiLCJyZXMiLCJoZWFkZXJzIiwib24iLCJ2YWxpZENvbnRlbnRUeXBlcyIsImluY2x1ZGVzIiwiY2VydGlmaWNhdGUiLCJnZXRDZXJ0aWZpY2F0ZSIsImV4cGlyZSIsInNldFRpbWVvdXQiLCJwYXJzZUludCIsInZlcmlmeVB1YmxpY0tleUlzc3VlciIsImJ1ZmZlciIsImRhdGEiLCJjaHVuayIsInB1c2giLCJCdWZmZXIiLCJjb25jYXQiLCJ0b1N0cmluZyIsImNvbnZlcnRUaW1lc3RhbXBUb0JpZ0VuZGlhbiIsInRpbWVzdGFtcCIsImFsbG9jIiwiaGlnaCIsImxvdyIsIndyaXRlVUludDMyQkUiLCJ2ZXJpZnlTaWduYXR1cmUiLCJwdWJsaWNLZXkiLCJhdXRoRGF0YSIsInZlcmlmaWVyIiwiY3JlYXRlVmVyaWZ5IiwidXBkYXRlIiwicGxheWVySWQiLCJidW5kbGVJZCIsInNhbHQiLCJ2ZXJpZnkiLCJzaWduYXR1cmUiLCJwdWJsaWNLZXlDZXJ0IiwiY2VydGlmaWNhdGVGcm9tUGVtIiwiZSIsInZhbGlkYXRlQXV0aERhdGEiLCJpZCIsInZhbGlkYXRlQXBwSWQiLCJhcHBJZHMiLCJvcHRpb25zIiwicm9vdENlcnRpZmljYXRlVXJsIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNO0FBQUVBLEVBQUFBO0FBQUYsSUFBWUMsT0FBTyxDQUFDLFlBQUQsQ0FBekI7O0FBQ0EsTUFBTUMsTUFBTSxHQUFHRCxPQUFPLENBQUMsUUFBRCxDQUF0Qjs7QUFDQSxNQUFNRSxLQUFLLEdBQUdGLE9BQU8sQ0FBQyxPQUFELENBQXJCOztBQUNBLE1BQU07QUFBRUcsRUFBQUE7QUFBRixJQUFVSCxPQUFPLENBQUMsWUFBRCxDQUF2Qjs7QUFDQSxNQUFNSSxFQUFFLEdBQUc7QUFBRUMsRUFBQUEsSUFBSSxFQUFFLElBQVI7QUFBY0MsRUFBQUEsR0FBRyxFQUFFO0FBQW5CLENBQVg7QUFDQSxNQUFNQyxLQUFLLEdBQUcsRUFBZCxDLENBQWtCOztBQUVsQixTQUFTQyxrQkFBVCxDQUE0QkMsWUFBNUIsRUFBMEM7QUFDeEMsTUFBSTtBQUNGLFVBQU1DLEtBQUssR0FBRyx5REFBZDtBQUNBLFdBQU9BLEtBQUssQ0FBQ0MsSUFBTixDQUFXRixZQUFYLENBQVA7QUFDRCxHQUhELENBR0UsT0FBT0csS0FBUCxFQUFjO0FBQ2QsV0FBTyxLQUFQO0FBQ0Q7QUFDRjs7QUFFRCxTQUFTQyxvQkFBVCxDQUE4QkMsUUFBOUIsRUFBd0M7QUFDdEMsUUFBTUMsU0FBUyxHQUFHLCtCQUFsQjtBQUNBLFFBQU1DLFVBQVUsR0FBRywyQkFBbkI7QUFFQSxRQUFNQyxNQUFNLEdBQUdILFFBQWY7QUFDQSxRQUFNSSxRQUFRLEdBQUdELE1BQU0sQ0FBQ0UsS0FBUCxDQUFhLElBQUlDLE1BQUosQ0FBVyxTQUFYLEVBQXNCLEdBQXRCLENBQWIsRUFBeUNDLElBQXpDLENBQThDLElBQTlDLENBQWpC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QWYsTUFBMkIsTUFBTUssY0FBYyxDQUFDb0MsT0FBTyxDQUFDQyxrQkFBVCxFQUE2QixJQUE3QixDQUFyRDs7QUFDQSxNQUNFMUMsT0FBTyxDQUFDLGNBQUQsQ0FBUCxLQUE0Qix3QkFBNUIsSUFDQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsSUFBNkIsSUFEN0IsSUFFQUEsT0FBTyxDQUFDLGdCQUFELENBQVAsR0FBNEIsS0FIOUIsRUFJRTtBQUNBLFVBQU0sSUFBSXRDLEtBQUssQ0FBQ3dCLEtBQVYsQ0FDSnhCLEtBQUssQ0FBQ3dCLEtBQU4sQ0FBWUMsZ0JBRFIsRUFFSiwyRUFGSSxDQUFOO0FBSUQ7O0FBQ0RwQixFQUFBQSxFQUFFLENBQUNDLElBQUgsR0FBVUYsR0FBRyxDQUFDcUUsa0JBQUosQ0FBdUIvQixXQUF2QixDQUFWO0FBQ0FyQyxFQUFBQSxFQUFFLENBQUNFLEdBQUgsR0FBU3dFLE9BQU8sQ0FBQ0Msa0JBQWpCO0FBQ0Q7O0FBRURDLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQjtBQUNmTCxFQUFBQSxhQURlO0FBRWZGLEVBQUFBLGdCQUZlO0FBR2ZuRSxFQUFBQTtBQUhlLENBQWpCIiwic291cmNlc0NvbnRlbnQiOlsiLyogQXBwbGUgR2FtZSBDZW50ZXIgQXV0aFxuaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2RvY3VtZW50YXRpb24vZ2FtZWtpdC9na2xvY2FscGxheWVyLzE1MTU0MDctZ2VuZXJhdGVpZGVudGl0eXZlcmlmaWNhdGlvbnNpZ24jZGlzY3Vzc2lvblxuXG5jb25zdCBhdXRoRGF0YSA9IHtcbiAgcHVibGljS2V5VXJsOiAnaHR0cHM6Ly92YWxpZC5hcHBsZS5jb20vcHVibGljL3RpbWVvdXQuY2VyJyxcbiAgdGltZXN0YW1wOiAxNDYwOTgxNDIxMzAzLFxuICBzaWduYXR1cmU6ICdQb0R3ZjM5RENONDY0QjQ5akpDVTBkOVkwSicsXG4gIHNhbHQ6ICdzYWx0U1Q9PScsXG4gIGJ1bmRsZUlkOiAnY29tLnZhbGlkLmFwcCdcbiAgaWQ6ICdwbGF5ZXJJZCcsXG59O1xuKi9cblxuY29uc3QgeyBQYXJzZSB9ID0gcmVxdWlyZSgncGFyc2Uvbm9kZScpO1xuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBodHRwcyA9IHJlcXVpcmUoJ2h0dHBzJyk7XG5jb25zdCB7IHBraSB9ID0gcmVxdWlyZSgnbm9kZS1mb3JnZScpO1xuY29uc3QgY2EgPSB7IGNlcnQ6IG51bGwsIHVybDogbnVsbCB9O1xuY29uc3QgY2FjaGUgPSB7fTsgLy8gKHB1YmxpY0tleSAtPiBjZXJ0KSBjYWNoZVxuXG5mdW5jdGlvbiB2ZXJpZnlQdWJsaWNLZXlVcmwocHVibGljS2V5VXJsKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVnZXggPSAvXmh0dHBzOlxcL1xcLyg/OlstX0EtWmEtejAtOV0rXFwuKXswLH1hcHBsZVxcLmNvbVxcLy4qXFwuY2VyJC87XG4gICAgcmV0dXJuIHJlZ2V4LnRlc3QocHVibGljS2V5VXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29udmVydFg1MDlDZXJ0VG9QRU0oWDUwOUNlcnQpIHtcbiAgY29uc3QgcGVtUHJlRml4ID0gJy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxcbic7XG4gIGNvbnN0IHBlbVBvc3RGaXggPSAnLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSc7XG5cbiAgY29uc3QgYmFzZTY0ID0gWDUwOUNlcnQ7XG4gIGNvbnN0IGNlcnRCb2R5ID0gYmFzZTY0Lm1hdGNoKG5ldyBSZWdFeHAoJy57MCw2NH0nLCAnZycpKS5qb2luKCdcXG4nKTtcblxuICByZXR1cm4gcGVtUHJlRml4ICsgY2VydEJvZHkgKyBwZW1Qb3N0Rml4O1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHBsZUNlcnRpZmljYXRlKHB1YmxpY0tleVVybCkge1xuICBpZiAoIXZlcmlmeVB1YmxpY0tleVVybChwdWJsaWNLZXlVcmwpKSB7XG4gICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgUGFyc2UuRXJyb3IuT0JKRUNUX05PVF9GT1VORCxcbiAgICAgIGBBcHBsZSBHYW1lIENlbnRlciAtIGludmFsaWQgcHVibGljS2V5VXJsOiAke3B1YmxpY0tleVVybH1gXG4gICAgKTtcbiAgfVxuICBpZiAoY2FjaGVbcHVibGljS2V5VXJsXSkge1xuICAgIHJldHVybiBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICB9XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocHVibGljS2V5VXJsKTtcbiAgY29uc3QgaGVhZE9wdGlvbnMgPSB7XG4gICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICBwYXRoOiB1cmwucGF0aG5hbWUsXG4gICAgbWV0aG9kOiAnSEVBRCcsXG4gIH07XG4gIGNvbnN0IGNlcnRfaGVhZGVycyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgaHR0cHMuZ2V0KGhlYWRPcHRpb25zLCByZXMgPT4gcmVzb2x2ZShyZXMuaGVhZGVycykpLm9uKCdlcnJvcicsIHJlamVjdClcbiAgKTtcbiAgY29uc3QgdmFsaWRDb250ZW50VHlwZXMgPSBbJ2FwcGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0JywgJ2FwcGxpY2F0aW9uL3BraXgtY2VydCddO1xuICBpZiAoXG4gICAgIXZhbGlkQ29udGVudFR5cGVzLmluY2x1ZGVzKGNlcnRfaGVhZGVyc1snY29udGVudC10eXBlJ10pIHx8XG4gICAgY2VydF9oZWFkZXJzWydjb250ZW50LWxlbmd0aCddID09IG51bGwgfHxcbiAgICBjZXJ0X2hlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPiAxMDAwMFxuICApIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgY2VydGlmaWNhdGUsIGhlYWRlcnMgfSA9IGF3YWl0IGdldENlcnRpZmljYXRlKHB1YmxpY0tleVVybCk7XG4gIGlmIChoZWFkZXJzWydjYWNoZS1jb250cm9sJ10pIHtcbiAgICBjb25zdCBleHBpcmUgPSBoZWFkZXJzWydjYWNoZS1jb250cm9sJ10ubWF0Y2goL21heC1hZ2U9KFswLTldKykvKTtcbiAgICBpZiAoZXhwaXJlKSB7XG4gICAgICBjYWNoZVtwdWJsaWNLZXlVcmxdID0gY2VydGlmaWNhdGU7XG4gICAgICAvLyB3ZSdsbCBleHBpcmUgdGhlIGNhY2hlIGVudHJ5IGxhdGVyLCBhcyBwZXIgbWF4LWFnZVxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGRlbGV0ZSBjYWNoZVtwdWJsaWNLZXlVcmxdO1xuICAgICAgfSwgcGFyc2VJbnQoZXhwaXJlWzFdLCAxMCkgKiAxMDAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0aWZpY2F0ZSwgcHVibGljS2V5VXJsKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGUodXJsLCBidWZmZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBodHRwc1xuICAgICAgLmdldCh1cmwsIHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBbXTtcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgY2h1bmsgPT4ge1xuICAgICAgICAgIGRhdGEucHVzaChjaHVuayk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICBpZiAoYnVmZmVyKSB7XG4gICAgICAgICAgICByZXNvbHZlKHsgY2VydGlmaWNhdGU6IEJ1ZmZlci5jb25jYXQoZGF0YSksIGhlYWRlcnM6IHJlcy5oZWFkZXJzIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgY2VydCA9ICcnO1xuICAgICAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgZGF0YSkge1xuICAgICAgICAgICAgY2VydCArPSBjaHVuay50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlID0gY29udmVydFg1MDlDZXJ0VG9QRU0oY2VydCk7XG4gICAgICAgICAgcmVzb2x2ZSh7IGNlcnRpZmljYXRlLCBoZWFkZXJzOiByZXMuaGVhZGVycyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLm9uKCdlcnJvcicsIHJlamVjdCk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4odGltZXN0YW1wKSB7XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyg4KTtcblxuICBjb25zdCBoaWdoID0gfn4odGltZXN0YW1wIC8gMHhmZmZmZmZmZik7XG4gIGNvbnN0IGxvdyA9IHRpbWVzdGFtcCAlICgweGZmZmZmZmZmICsgMHgxKTtcblxuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChoaWdoLCAxMCksIDApO1xuICBidWZmZXIud3JpdGVVSW50MzJCRShwYXJzZUludChsb3csIDEwKSwgNCk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpIHtcbiAgY29uc3QgdmVyaWZpZXIgPSBjcnlwdG8uY3JlYXRlVmVyaWZ5KCdzaGEyNTYnKTtcbiAgdmVyaWZpZXIudXBkYXRlKGF1dGhEYXRhLnBsYXllcklkLCAndXRmOCcpO1xuICB2ZXJpZmllci51cGRhdGUoYXV0aERhdGEuYnVuZGxlSWQsICd1dGY4Jyk7XG4gIHZlcmlmaWVyLnVwZGF0ZShjb252ZXJ0VGltZXN0YW1wVG9CaWdFbmRpYW4oYXV0aERhdGEudGltZXN0YW1wKSk7XG4gIHZlcmlmaWVyLnVwZGF0ZShhdXRoRGF0YS5zYWx0LCAnYmFzZTY0Jyk7XG5cbiAgaWYgKCF2ZXJpZmllci52ZXJpZnkocHVibGljS2V5LCBhdXRoRGF0YS5zaWduYXR1cmUsICdiYXNlNjQnKSkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHNpZ25hdHVyZScpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZlcmlmeVB1YmxpY0tleUlzc3VlcihjZXJ0LCBwdWJsaWNLZXlVcmwpIHtcbiAgY29uc3QgcHVibGljS2V5Q2VydCA9IHBraS5jZXJ0aWZpY2F0ZUZyb21QZW0oY2VydCk7XG4gIGlmICghY2EuY2VydCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIHRyeSB7XG4gICAgaWYgKCFjYS5jZXJ0LnZlcmlmeShwdWJsaWNLZXlDZXJ0KSkge1xuICAgICAgdGhyb3cgbmV3IFBhcnNlLkVycm9yKFxuICAgICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgICBgQXBwbGUgR2FtZSBDZW50ZXIgLSBpbnZhbGlkIHB1YmxpY0tleVVybDogJHtwdWJsaWNLZXlVcmx9YFxuICAgICAgKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgUGFyc2UuRXJyb3IoXG4gICAgICBQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELFxuICAgICAgYEFwcGxlIEdhbWUgQ2VudGVyIC0gaW52YWxpZCBwdWJsaWNLZXlVcmw6ICR7cHVibGljS2V5VXJsfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBjZXJ0O1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgdXNlciBpZCBpcyB2YWxpZC5cbmFzeW5jIGZ1bmN0aW9uIHZhbGlkYXRlQXV0aERhdGEoYXV0aERhdGEpIHtcbiAgaWYgKCFhdXRoRGF0YS5pZCkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihQYXJzZS5FcnJvci5PQkpFQ1RfTk9UX0ZPVU5ELCAnQXBwbGUgR2FtZSBDZW50ZXIgLSBhdXRoRGF0YSBpZCBtaXNzaW5nJyk7XG4gIH1cbiAgYXV0aERhdGEucGxheWVySWQgPSBhdXRoRGF0YS5pZDtcbiAgY29uc3QgcHVibGljS2V5ID0gYXdhaXQgZ2V0QXBwbGVDZXJ0aWZpY2F0ZShhdXRoRGF0YS5wdWJsaWNLZXlVcmwpO1xuICByZXR1cm4gdmVyaWZ5U2lnbmF0dXJlKHB1YmxpY0tleSwgYXV0aERhdGEpO1xufVxuXG4vLyBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGZ1bGZpbGxzIGlmIHRoaXMgYXBwIGlkIGlzIHZhbGlkLlxuYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBcHBJZChhcHBJZHMsIGF1dGhEYXRhLCBvcHRpb25zID0ge30pIHtcbiAgaWYgKCFvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIG9wdGlvbnMucm9vdENlcnRpZmljYXRlVXJsID1cbiAgICAgICdodHRwczovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQucGVtJztcbiAgfVxuICBpZiAoY2EudXJsID09PSBvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB7IGNlcnRpZmljYXRlLCBoZWFkZXJzIH0gPSBhd2FpdCBnZXRDZXJ0aWZpY2F0ZShvcHRpb25zLnJvb3RDZXJ0aWZpY2F0ZVVybCwgdHJ1ZSk7XG4gIGlmIChcbiAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSAhPT0gJ2FwcGxpY2F0aW9uL3gtcGVtLWZpbGUnIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA9PSBudWxsIHx8XG4gICAgaGVhZGVyc1snY29udGVudC1sZW5ndGgnXSA+IDEwMDAwXG4gICkge1xuICAgIHRocm93IG5ldyBQYXJzZS5FcnJvcihcbiAgICAgIFBhcnNlLkVycm9yLk9CSkVDVF9OT1RfRk9VTkQsXG4gICAgICAnQXBwbGUgR2FtZSBDZW50ZXIgYXV0aCBhZGFwdGVyIHBhcmFtZXRlciBgcm9vdENlcnRpZmljYXRlVVJMYCBpcyBpbnZhbGlkLidcbiAgICApO1xuICB9XG4gIGNhLmNlcnQgPSBwa2kuY2VydGlmaWNhdGVGcm9tUGVtKGNlcnRpZmljYXRlKTtcbiAgY2EudXJsID0gb3B0aW9ucy5yb290Q2VydGlmaWNhdGVVcmw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICB2YWxpZGF0ZUFwcElkLFxuICB2YWxpZGF0ZUF1dGhEYXRhLFxuICBjYWNoZSxcbn07XG4iXX0=
|