@cybrid/cybrid-api-id-angular 0.129.749 → 0.129.751

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 (37) hide show
  1. package/README.md +2 -2
  2. package/esm2020/api/bankApplications.service.mjs +2 -2
  3. package/esm2020/api/customerTokens.service.mjs +2 -2
  4. package/esm2020/api/organizationApplications.service.mjs +2 -2
  5. package/esm2020/api/users.service.mjs +2 -2
  6. package/esm2020/model/application.mjs +2 -2
  7. package/esm2020/model/applicationList.mjs +1 -1
  8. package/esm2020/model/applicationWithSecret.mjs +1 -1
  9. package/esm2020/model/applicationWithSecretAllOf.mjs +2 -2
  10. package/esm2020/model/customerToken.mjs +2 -2
  11. package/esm2020/model/errorResponse.mjs +2 -2
  12. package/esm2020/model/patchApplication.mjs +2 -2
  13. package/esm2020/model/patchUser.mjs +2 -2
  14. package/esm2020/model/postBankApplication.mjs +2 -2
  15. package/esm2020/model/postCustomerToken.mjs +2 -2
  16. package/esm2020/model/postOrganizationApplication.mjs +2 -2
  17. package/esm2020/model/postUser.mjs +2 -2
  18. package/esm2020/model/user.mjs +2 -2
  19. package/esm2020/model/userList.mjs +1 -1
  20. package/fesm2015/cybrid-cybrid-api-id-angular.mjs +9 -9
  21. package/fesm2015/cybrid-cybrid-api-id-angular.mjs.map +1 -1
  22. package/fesm2020/cybrid-cybrid-api-id-angular.mjs +15 -15
  23. package/fesm2020/cybrid-cybrid-api-id-angular.mjs.map +1 -1
  24. package/model/application.d.ts +1 -1
  25. package/model/applicationList.d.ts +1 -1
  26. package/model/applicationWithSecretAllOf.d.ts +1 -1
  27. package/model/customerToken.d.ts +1 -1
  28. package/model/errorResponse.d.ts +1 -1
  29. package/model/patchApplication.d.ts +1 -1
  30. package/model/patchUser.d.ts +1 -1
  31. package/model/postBankApplication.d.ts +1 -1
  32. package/model/postCustomerToken.d.ts +1 -1
  33. package/model/postOrganizationApplication.d.ts +1 -1
  34. package/model/postUser.d.ts +1 -1
  35. package/model/user.d.ts +1 -1
  36. package/model/userList.d.ts +1 -1
  37. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  * Cybrid Identity API
3
3
  * # Cybrid API documentation Welcome to Cybrid, an all-in-one crypto platform that enables you to easily **build** and **launch** white-label crypto products or services. In these documents, you\'ll find details on how our REST API operates and generally how our platform functions. If you\'re looking for our UI SDK Widgets for Web or Mobile (iOS/Android), generated API clients, or demo applications, head over to our [Github repo](https://github.com/Cybrid-app). 💡 We recommend bookmarking the [Cybrid LinkTree](https://linktr.ee/cybridtechnologies) which contains many helpful links to platform resources. ## Getting Started This is Cybrid\'s public interactive API documentation, which allows you to fully test our APIs. If you\'d like to use a different tool to exercise our APIs, you can download the [Open API 3.0 yaml](https://bank.production.cybrid.app/api/schema/v1/swagger.yaml) for import. If you\'re new to our APIs and the Cybrid Platform, follow the below guides to get set up and familiar with the platform: 1. [Introduction](https://docs.cybrid.xyz/docs/introduction) 2. [Platform Overview](https://docs.cybrid.xyz/docs/platform-overview) 3. [Testing with Hosted Web Demo App](https://docs.cybrid.xyz/docs/hosted-demo-app) In [Getting Started in the Cybrid Sandbox](https://docs.cybrid.xyz/docs/cybrid-sandbox), we walk you through how to use the [Cybrid Sandbox](https://id.sandbox.cybrid.app/) to create a test bank and generate API keys. In [Getting Ready for Trading](https://docs.cybrid.xyz/docs/trade-process), we walk through creating customers, customer identities, accounts, as well as executing quotes and trades. ## Working with the Cybrid Platform There are three primary ways you can interact with the Cybrid platform: 1. Directly via our RESTful API (this documentation) 2. Using our API clients available in a variety of languages ([Angular](https://github.com/Cybrid-app/cybrid-api-bank-angular), [Java](https://github.com/Cybrid-app/cybrid-api-bank-java), [Kotlin](https://github.com/Cybrid-app/cybrid-api-bank-kotlin), [Python](https://github.com/Cybrid-app/cybrid-api-bank-python), [Ruby](https://github.com/Cybrid-app/cybrid-api-bank-ruby), [Swift](https://github.com/Cybrid-app/cybrid-api-bank-swift) or [Typescript](https://github.com/Cybrid-app/cybrid-api-bank-typescript)) 3. Integrating a platform specific SDK ([Web](https://github.com/Cybrid-app/cybrid-sdk-web), [Android](https://github.com/Cybrid-app/cybrid-sdk-android), [iOS](https://github.com/Cybrid-app/cybrid-sdk-ios)) Our complete set of APIs allows you to manage resources across three distinct areas: your `Organization`, your `Banks` and your `Identities`. For most of your testing and interaction you\'ll be using the `Bank` API, which is where the majority of APIs reside. *The complete set of APIs can be found on the following pages:* | API | Description | |------------------------------------------------------------------|-------------------------------------------------------------| | [Organization API](https://organization.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organizations | | [Bank API](https://bank.production.cybrid.app/api/schema/swagger-ui) | APIs to manage banks (and all downstream customer activity) | | [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui) | APIs to manage organization and bank identities | For questions please contact [Support](mailto:support@cybrid.xyz) at any time for assistance, or contact the [Product Team](mailto:product@cybrid.xyz) for product suggestions. ## Authenticating with the API The Cybrid Platform uses OAuth 2.0 Bearer Tokens to authenticate requests to the platform. Credentials to create `Organization` and `Bank` tokens can be generated via the [Cybrid Sandbox](https://id.production.cybrid.app). Access tokens can be generated for a `Customer` as well via the [Cybrid IdP](https://id.production.cybrid.app) as well. An `Organization` access token applies broadly to the whole Organization and all of its `Banks`, whereas, a `Bank` access token is specific to an individual Bank. `Customer` tokens, similarly, are scoped to a specific customer in a bank. Both `Organization` and `Bank` tokens can be created using the OAuth Client Credential Grant flow. Each Organization and Bank has its own unique `Client ID` and `Secret` that allows for machine-to-machine authentication. A `Bank` can then generate `Customer` access tokens via API using our [Identities API](https://id.production.cybrid.app/api/schema/swagger-ui). <font color=\"orange\">**⚠️ Never share your Client ID or Secret publicly or in your source code repository.**</font> Your `Client ID` and `Secret` can be exchanged for a time-limited `Bearer Token` by interacting with the Cybrid Identity Provider or through interacting with the **Authorize** button in this document. The following curl command can be used to quickly generate a `Bearer Token` for use in testing the API or demo applications. ``` # Example request when using Bank credentials curl -X POST https://id.production.cybrid.app/oauth/token -d \'{ \"grant_type\": \"client_credentials\", \"client_id\": \"<Your Client ID>\", \"client_secret\": \"<Your Secret>\", \"scope\": \"banks:read banks:write bank_applications:read bank_applications:write bank_applications:execute accounts:read accounts:write accounts:execute counterparties:read counterparties:pii:read counterparties:write counterparties:execute customers:read customers:pii:read customers:write customers:execute prices:read quotes:execute quotes:read trades:execute trades:read transfers:execute transfers:read transfers:write external_bank_accounts:read external_bank_accounts:pii:read external_bank_accounts:write external_bank_accounts:execute external_wallets:read external_wallets:write external_wallets:execute workflows:read workflows:execute deposit_addresses:read deposit_addresses:write deposit_addresses:execute deposit_bank_accounts:read deposit_bank_accounts:write deposit_bank_accounts:execute invoices:read invoices:write invoices:execute identity_verifications:read identity_verifications:pii:read identity_verifications:write identity_verifications:execute persona_sessions:execute sardine_sessions:execute plans:execute plans:read executions:execute executions:read files:read files:pii:read files:execute\" }\' -H \"Content-Type: application/json\" # When using Organization credentials set `scope` to \'organizations:read organizations:write organization_applications:read organization_applications:write organization_applications:execute banks:read banks:write banks:execute bank_applications:read bank_applications:write bank_applications:execute users:read users:write users:execute counterparties:read counterparties:pii:read customers:read customers:pii:read accounts:read accounts:write prices:read quotes:execute quotes:read trades:execute trades:read transfers:read transfers:write transfers:execute external_bank_accounts:read external_bank_accounts:pii:read external_bank_accounts:write external_wallets:read external_wallets:write workflows:read deposit_addresses:read deposit_addresses:write deposit_bank_accounts:read deposit_bank_accounts:write deposit_bank_accounts:execute invoices:read subscriptions:read subscriptions:write subscriptions:execute subscription_events:read subscription_events:execute identity_verifications:read identity_verifications:pii:read identity_verifications:execute persona_sessions:execute sardine_sessions:execute plans:execute plans:read executions:execute executions:read files:read files:pii:read files:execute\' ``` <font color=\"orange\">**⚠️ Note: The above curl will create a bearer token with full scope access. Delete scopes if you\'d like to restrict access.**</font> ## Authentication Scopes The Cybrid platform supports the use of scopes to control the level of access a token is limited to. Scopes do not grant access to resources; instead, they provide limits, in support of the least privilege principal. The following scopes are available on the platform and can be requested when generating either an Organization, Bank or Customer token. Generally speaking, the _Read_ scope is required to read and list resources, the _Write_ scope is required to update a resource and the _Execute_ scope is required to create a resource. | Resource | Read scope (Token Type) | Write scope (Token Type) | Execute scope (Token Type) | |-----------------------|------------------------------------------------------------|-----------------------------------------------|--------------------------------------------------| | Account | accounts:read (Organization, Bank, Customer) | | accounts:execute (Bank, Customer) | | Bank | banks:read (Organization, Bank) | banks:write (Organization, Bank) | banks:execute (Organization) | | Customer | customers:read (Organization, Bank, Customer) | customers:write (Bank, Customer) | customers:execute (Bank) | | Counterparty | counterparties:read (Organization, Bank, Customer) | counterparties:write (Bank, Customer) | counterparties:execute (Bank) | | Deposit Address | deposit_addresses:read (Organization, Bank, Customer) | deposit_addresses:write (Bank, Customer) | deposit_addresses:execute (Bank, Customer) | | External Bank Account | external_bank_accounts:read (Organization, Bank, Customer) | external_bank_accounts:write (Bank, Customer) | external_bank_accounts:execute (Bank, Customer) | | External Wallet | external_wallet:read (Organization, Bank, Customer) | | external_wallet:execute (Bank, Customer) | | Organization | organizations:read (Organization) | organizations:write (Organization) | | | User | users:read (Organization) | | users:execute (Organization) | | Price | prices:read (Bank, Customer) | | | | Quote | quotes:read (Organization, Bank, Customer) | | quotes:execute (Organization, Bank, Customer) | | Trade | trades:read (Organization, Bank, Customer) | | trades:execute (Organization, Bank, Customer) | | Transfer | transfers:read (Organization, Bank, Customer) | | transfers:execute (Organization, Bank, Customer) | | Workflow | workflows:read (Organization, Bank, Customer) | | workflows:execute (Bank, Customer) | | Invoice | invoices:read (Organization, Bank, Customer) | invoices:write (Bank, Customer) | invoices:execute (Bank, Customer) | ## Available Endpoints The available APIs for the [Identity](https://id.production.cybrid.app/api/schema/swagger-ui), [Organization](https://organization.production.cybrid.app/api/schema/swagger-ui) and [Bank](https://bank.production.cybrid.app/api/schema/swagger-ui) API services are listed below: | API Service | Model | API Endpoint Path | Description | |--------------|----------------------|--------------------------------|---------------------------------------------------------------------------------------------------| | Identity | Bank | /api/bank_applications | Create and list banks | | Identity | CustomerToken | /api/customer_tokens | Create customer JWT access tokens | | Identity | Organization | /api/organization_applications | Create and list organizations | | Identity | Organization | /api/users | Create and list organization users | | Organization | Organization | /api/organizations | APIs to retrieve and update organization name | | Bank | Account | /api/accounts | Create and list accounts, which hold a specific asset for a customers | | Bank | Asset | /api/assets | Get a list of assets supported by the platform (ex: BTC, ETH) | | Bank | Bank | /api/banks | Create, update and list banks, the parent to customers, accounts, etc | | Bank | Customer | /api/customers | Create and list customers | | Bank | Counterparty | /api/counterparties | Create and list counterparties | | Bank | DepositAddress | /api/deposit_addresses | Create, get and list deposit addresses | | Bank | ExternalBankAccount | /api/external_bank_accounts | Create, get and list external bank accounts, which connect customer bank accounts to the platform | | Bank | ExternalWallet | /api/external_wallets | Create, get, list and delete external wallets, which connect customer wallets to the platform | | Bank | IdentityVerification | /api/identity_verifications | Create and list identity verifications, which are performed on customers for KYC | | Bank | Invoice | /api/invoices | Create, get, cancel and list invoices | | Bank | PaymentInstruction | /api/payment_instructions | Create, get and list payment instructions for invoices | | Bank | Price | /api/prices | Get the current prices for assets on the platform | | Bank | Quote | /api/quotes | Create and list quotes, which are required to execute trades | | Bank | Symbol | /api/symbols | Get a list of symbols supported for trade (ex: BTC-USD) | | Bank | Trade | /api/trades | Create and list trades, which buy or sell cryptocurrency | | Bank | Transfer | /api/transfers | Create, get and list transfers (e.g., funding, book) | | Bank | Workflow | /api/workflows | Create, get and list workflows | ## Understanding Object Models & Endpoints **Organizations** An `Organization` is meant to represent the organization partnering with Cybrid to use our platform. An `Organization` typically does not directly interact with `customers`. Instead, an Organization has one or more `banks`, which encompass the financial service offerings of the platform. **Banks** A `Bank` is owned by an `Organization` and can be thought of as an environment or container for `customers` and product offerings. Banks are created in either `Sandbox` or `Production` mode, where `Sandbox` is the environment that you would test, prototype and build in prior to moving to `Production`. An `Organization` can have multiple `banks`, in either `Sandbox` or `Production` environments. A `Sandbox Bank` will be backed by stubbed data and process flows. For instance, funding source transfer processes as well as trades will be simulated rather than performed, however asset prices are representative of real-world values. You have an unlimited amount of simulated fiat currency for testing purposes. **Customers** `Customers` represent your banking users on the platform. At present, we offer support for `Individuals` as Customers. `Customers` must be verified (i.e., KYC\'d) in our system before they can play any part on the platform, which means they must have an associated and a passing `Identity Verification`. See the Identity Verifications section for more details on how a customer can be verified. `Customers` must also have an `Account` to be able to transact, in the desired asset class. See the Accounts APIs for more details on setting up accounts for the customer.
4
4
  *
5
- * The version of the OpenAPI document: v0.129.749
5
+ * The version of the OpenAPI document: v0.129.751
6
6
  * Contact: support@cybrid.app
7
7
  *
8
8
  * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
@@ -373,4 +373,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
373
373
  }] }, { type: i2.Configuration, decorators: [{
374
374
  type: Optional
375
375
  }] }]; } });
376
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uQXBwbGljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvb3JnYW5pemF0aW9uQXBwbGljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBK0IsWUFBWSxDQUFDO0FBZ0IvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLCtCQUErQjtJQU94QyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLCtCQUErQixDQUFDO1FBQzlDLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFD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QyxLQUFLLENBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLGtDQUFrQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUNwSix3QkFBd0IsRUFDeEI7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7NkhBMWJRLCtCQUErQiw0Q0FPeUIsU0FBUztpSUFQakUsK0JBQStCLGNBRjlCLE1BQU07NEZBRVAsK0JBQStCO2tCQUgzQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBJZGVudGl0eSBBUElcbiAqICMgQ3licmlkIEFQSSBkb2N1bWVudGF0aW9uICBXZWxjb21lIHRvIEN5YnJpZCwgYW4gYWxsLWluLW9uZSBjcnlwdG8gcGxhdGZvcm0gdGhhdCBlbmFibGVzIHlvdSB0byBlYXNpbHkgKipidWlsZCoqIGFuZCAqKmxhdW5jaCoqIHdoaXRlLWxhYmVsIGNyeXB0byBwcm9kdWN0cyBvciBzZXJ2aWNlcy4gIEluIHRoZXNlIGRvY3VtZW50cywgeW91XFwnbGwgZmluZCBkZXRhaWxzIG9uIGhvdyBvdXIgUkVTVCBBUEkgb3BlcmF0ZXMgYW5kIGdlbmVyYWxseSBob3cgb3VyIHBsYXRmb3JtIGZ1bmN0aW9ucy4gIElmIHlvdVxcJ3JlIGxvb2tpbmcgZm9yIG91ciBVSSBTREsgV2lkZ2V0cyBmb3IgV2ViIG9yIE1vYmlsZSAoaU9TL0FuZHJvaWQpLCBnZW5lcmF0ZWQgQVBJIGNsaWVudHMsIG9yIGRlbW8gYXBwbGljYXRpb25zLCBoZWFkIG92ZXIgdG8gb3VyIFtHaXRodWIgcmVwb10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHApLiAg8J+SoSBXZSByZWNvbW1lbmQgYm9va21hcmtpbmcgdGhlIFtDeWJyaWQgTGlua1RyZWVdKGh0dHBzOi8vbGlua3RyLmVlL2N5YnJpZHRlY2hub2xvZ2llcykgd2hpY2ggY29udGFpbnMgbWFueSBoZWxwZnVsIGxpbmtzIHRvIHBsYXRmb3JtIHJlc291cmNlcy4gICMjIEdldHRpbmcgU3RhcnRlZCAgVGhpcyBpcyBDeWJyaWRcXCdzIHB1YmxpYyBpbnRlcmFjdGl2ZSBBUEkgZG9jdW1lbnRhdGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBmdWxseSB0ZXN0IG91ciBBUElzLiBJZiB5b3VcXCdkIGxpa2UgdG8gdXNlIGEgZGlmZmVyZW50IHRvb2wgdG8gZXhlcmNpc2Ugb3VyIEFQSXMsIHlvdSBjYW4gZG93bmxvYWQgdGhlIFtPcGVuIEFQSSAzLjAgeWFtbF0oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3YxL3N3YWdnZXIueWFtbCkgZm9yIGltcG9ydC4gIElmIHlvdVxcJ3JlIG5ldyB0byBvdXIgQVBJcyBhbmQgdGhlIEN5YnJpZCBQbGF0Zm9ybSwgZm9sbG93IHRoZSBiZWxvdyBndWlkZXMgdG8gZ2V0IHNldCB1cCBhbmQgZmFtaWxpYXIgd2l0aCB0aGUgcGxhdGZvcm06ICAxLiBbSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2ludHJvZHVjdGlvbikgMi4gW1BsYXRmb3JtIE92ZXJ2aWV3XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3BsYXRmb3JtLW92ZXJ2aWV3KSAzLiBbVGVzdGluZyB3aXRoIEhvc3RlZCBXZWIgRGVtbyBBcHBdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG9zdGVkLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvY3licmlkLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90cmFkZS1wcm9jZXNzKSwgd2Ugd2FsayB0aHJvdWdoIGNyZWF0aW5nIGN1c3RvbWVycywgY3VzdG9tZXIgaWRlbnRpdGllcywgYWNjb3VudHMsIGFzIHdlbGwgYXMgZXhlY3V0aW5nIHF1b3RlcyBhbmQgdHJhZGVzLiAgIyMgV29ya2luZyB3aXRoIHRoZSBDeWJyaWQgUGxhdGZvcm0gIFRoZXJlIGFyZSB0aHJlZSBwcmltYXJ5IHdheXMgeW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBDeWJyaWQgcGxhdGZvcm06ICAxLiBEaXJlY3RseSB2aWEgb3VyIFJFU1RmdWwgQVBJICh0aGlzIGRvY3VtZW50YXRpb24pIDIuIFVzaW5nIG91ciBBUEkgY2xpZW50cyBhdmFpbGFibGUgaW4gYSB2YXJpZXR5IG9mIGxhbmd1YWdlcyAoW0FuZ3VsYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1hbmd1bGFyKSwgW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1qYXZhKSwgW0tvdGxpbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWtvdGxpbiksIFtQeXRob25dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1weXRob24pLCBbUnVieV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXJ1YnkpLCBbU3dpZnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1zd2lmdCkgb3IgW1R5cGVzY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay10eXBlc2NyaXB0KSkgMy4gSW50ZWdyYXRpbmcgYSBwbGF0Zm9ybSBzcGVjaWZpYyBTREsgKFtXZWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstd2ViKSwgW0FuZHJvaWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstYW5kcm9pZCksIFtpT1NdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstaW9zKSkgIE91ciBjb21wbGV0ZSBzZXQgb2YgQVBJcyBhbGxvd3MgeW91IHRvIG1hbmFnZSByZXNvdXJjZXMgYWNyb3NzIHRocmVlIGRpc3RpbmN0IGFyZWFzOiB5b3VyIGBPcmdhbml6YXRpb25gLCB5b3VyIGBCYW5rc2AgYW5kIHlvdXIgYElkZW50aXRpZXNgLiBGb3IgbW9zdCBvZiB5b3VyIHRlc3RpbmcgYW5kIGludGVyYWN0aW9uIHlvdVxcJ2xsIGJlIHVzaW5nIHRoZSBgQmFua2AgQVBJLCB3aGljaCBpcyB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgQVBJcyByZXNpZGUuICAqVGhlIGNvbXBsZXRlIHNldCBvZiBBUElzIGNhbiBiZSBmb3VuZCBvbiB0aGUgZm9sbG93aW5nIHBhZ2VzOiogIHwgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IFtPcmdhbml6YXRpb24gQVBJXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFtCYW5rIEFQSV0oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2UgYmFua3MgKGFuZCBhbGwgZG93bnN0cmVhbSBjdXN0b21lciBhY3Rpdml0eSkgfCB8IFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb24gYW5kIGJhbmsgaWRlbnRpdGllcyAgICAgICAgICAgICB8ICBGb3IgcXVlc3Rpb25zIHBsZWFzZSBjb250YWN0IFtTdXBwb3J0XShtYWlsdG86c3VwcG9ydEBjeWJyaWQueHl6KSBhdCBhbnkgdGltZSBmb3IgYXNzaXN0YW5jZSwgb3IgY29udGFjdCB0aGUgW1Byb2R1Y3QgVGVhbV0obWFpbHRvOnByb2R1Y3RAY3licmlkLnh5eikgZm9yIHByb2R1Y3Qgc3VnZ2VzdGlvbnMuICAjIyBBdXRoZW50aWNhdGluZyB3aXRoIHRoZSBBUEkgIFRoZSBDeWJyaWQgUGxhdGZvcm0gdXNlcyBPQXV0aCAyLjAgQmVhcmVyIFRva2VucyB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIHBsYXRmb3JtLiBDcmVkZW50aWFscyB0byBjcmVhdGUgYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCB2aWEgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApLiBBY2Nlc3MgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIGEgYEN1c3RvbWVyYCBhcyB3ZWxsIHZpYSB0aGUgW0N5YnJpZCBJZFBdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKSBhcyB3ZWxsLiAgQW4gYE9yZ2FuaXphdGlvbmAgYWNjZXNzIHRva2VuIGFwcGxpZXMgYnJvYWRseSB0byB0aGUgd2hvbGUgT3JnYW5pemF0aW9uIGFuZCBhbGwgb2YgaXRzIGBCYW5rc2AsIHdoZXJlYXMsIGEgYEJhbmtgIGFjY2VzcyB0b2tlbiBpcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIEJhbmsuIGBDdXN0b21lcmAgdG9rZW5zLCBzaW1pbGFybHksIGFyZSBzY29wZWQgdG8gYSBzcGVjaWZpYyBjdXN0b21lciBpbiBhIGJhbmsuICBCb3RoIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBPQXV0aCBDbGllbnQgQ3JlZGVudGlhbCBHcmFudCBmbG93LiBFYWNoIE9yZ2FuaXphdGlvbiBhbmQgQmFuayBoYXMgaXRzIG93biB1bmlxdWUgYENsaWVudCBJRGAgYW5kIGBTZWNyZXRgIHRoYXQgYWxsb3dzIGZvciBtYWNoaW5lLXRvLW1hY2hpbmUgYXV0aGVudGljYXRpb24uICBBIGBCYW5rYCBjYW4gdGhlbiBnZW5lcmF0ZSBgQ3VzdG9tZXJgIGFjY2VzcyB0b2tlbnMgdmlhIEFQSSB1c2luZyBvdXIgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLiAgPGZvbnQgY29sb3I9XFxcIm9yYW5nZVxcXCI+KirimqDvuI8gTmV2ZXIgc2hhcmUgeW91ciBDbGllbnQgSUQgb3IgU2VjcmV0IHB1YmxpY2x5IG9yIGluIHlvdXIgc291cmNlIGNvZGUgcmVwb3NpdG9yeS4qKjwvZm9udD4gIFlvdXIgYENsaWVudCBJRGAgYW5kIGBTZWNyZXRgIGNhbiBiZSBleGNoYW5nZWQgZm9yIGEgdGltZS1saW1pdGVkIGBCZWFyZXIgVG9rZW5gIGJ5IGludGVyYWN0aW5nIHdpdGggdGhlIEN5YnJpZCBJZGVudGl0eSBQcm92aWRlciBvciB0aHJvdWdoIGludGVyYWN0aW5nIHdpdGggdGhlICoqQXV0aG9yaXplKiogYnV0dG9uIGluIHRoaXMgZG9jdW1lbnQuICBUaGUgZm9sbG93aW5nIGN1cmwgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGdlbmVyYXRlIGEgYEJlYXJlciBUb2tlbmAgZm9yIHVzZSBpbiB0ZXN0aW5nIHRoZSBBUEkgb3IgZGVtbyBhcHBsaWNhdGlvbnMuICBgYGAgIyBFeGFtcGxlIHJlcXVlc3Qgd2hlbiB1c2luZyBCYW5rIGNyZWRlbnRpYWxzIGN1cmwgLVggUE9TVCBodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9vYXV0aC90b2tlbiAtZCBcXCd7ICAgICBcXFwiZ3JhbnRfdHlwZVxcXCI6IFxcXCJjbGllbnRfY3JlZGVudGlhbHNcXFwiLCAgICAgXFxcImNsaWVudF9pZFxcXCI6IFxcXCI8WW91ciBDbGllbnQgSUQ+XFxcIiwgICAgIFxcXCJjbGllbnRfc2VjcmV0XFxcIjogXFxcIjxZb3VyIFNlY3JldD5cXFwiLCAgICAgXFxcInNjb3BlXFxcIjogXFxcImJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua19hcHBsaWNhdGlvbnM6cmVhZCBiYW5rX2FwcGxpY2F0aW9uczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6d3JpdGUgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOnBpaTpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGN1c3RvbWVyczp3cml0ZSBjdXN0b21lcnM6ZXhlY3V0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6ZXhlY3V0ZSB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6d3JpdGUgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6d3JpdGUgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6d3JpdGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBpbnZvaWNlczp3cml0ZSBpbnZvaWNlczpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBzYXJkaW5lX3Nlc3Npb25zOmV4ZWN1dGUgcGxhbnM6ZXhlY3V0ZSBwbGFuczpyZWFkIGV4ZWN1dGlvbnM6ZXhlY3V0ZSBleGVjdXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpwaWk6cmVhZCBmaWxlczpleGVjdXRlXFxcIiAgIH1cXCcgLUggXFxcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxcXCIgICMgV2hlbiB1c2luZyBPcmdhbml6YXRpb24gY3JlZGVudGlhbHMgc2V0IGBzY29wZWAgdG8gXFwnb3JnYW5pemF0aW9uczpyZWFkIG9yZ2FuaXphdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpyZWFkIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlIGJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua3M6ZXhlY3V0ZSBiYW5rX2FwcGxpY2F0aW9uczpyZWFkIGJhbmtfYXBwbGljYXRpb25zOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgdXNlcnM6cmVhZCB1c2Vyczp3cml0ZSB1c2VyczpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGFjY291bnRzOnJlYWQgYWNjb3VudHM6d3JpdGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIHRyYW5zZmVyczpleGVjdXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnBpaTpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6d3JpdGUgd29ya2Zsb3dzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6d3JpdGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpwaWk6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUgcGVyc29uYV9zZXNzaW9uczpleGVjdXRlIHNhcmRpbmVfc2Vzc2lvbnM6ZXhlY3V0ZSBwbGFuczpleGVjdXRlIHBsYW5zOnJlYWQgZXhlY3V0aW9uczpleGVjdXRlIGV4ZWN1dGlvbnM6cmVhZCBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXCcgYGBgIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5vdGU6IFRoZSBhYm92ZSBjdXJsIHdpbGwgY3JlYXRlIGEgYmVhcmVyIHRva2VuIHdpdGggZnVsbCBzY29wZSBhY2Nlc3MuIERlbGV0ZSBzY29wZXMgaWYgeW91XFwnZCBsaWtlIHRvIHJlc3RyaWN0IGFjY2Vzcy4qKjwvZm9udD4gICMjIEF1dGhlbnRpY2F0aW9uIFNjb3BlcyAgVGhlIEN5YnJpZCBwbGF0Zm9ybSBzdXBwb3J0cyB0aGUgdXNlIG9mIHNjb3BlcyB0byBjb250cm9sIHRoZSBsZXZlbCBvZiBhY2Nlc3MgYSB0b2tlbiBpcyBsaW1pdGVkIHRvLiBTY29wZXMgZG8gbm90IGdyYW50IGFjY2VzcyB0byByZXNvdXJjZXM7IGluc3RlYWQsIHRoZXkgcHJvdmlkZSBsaW1pdHMsIGluIHN1cHBvcnQgb2YgdGhlIGxlYXN0IHByaXZpbGVnZSBwcmluY2lwYWwuICBUaGUgZm9sbG93aW5nIHNjb3BlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY2FuIGJlIHJlcXVlc3RlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIGFuIE9yZ2FuaXphdGlvbiwgQmFuayBvciBDdXN0b21lciB0b2tlbi4gR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgX1JlYWRfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHJlYWQgYW5kIGxpc3QgcmVzb3VyY2VzLCB0aGUgX1dyaXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byB1cGRhdGUgYSByZXNvdXJjZSBhbmQgdGhlIF9FeGVjdXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSByZXNvdXJjZS4gIHwgUmVzb3VyY2UgICAgICAgICAgICAgIHwgUmVhZCBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdyaXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICB8IEV4ZWN1dGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgQWNjb3VudCAgICAgICAgICAgICAgIHwgYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgICAgICAgICAgIHwgYmFua3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJhbmtzOndyaXRlIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICB8IGJhbmtzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgQ3VzdG9tZXIgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQ291bnRlcnBhcnR5ICAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICB8IHwgRGVwb3NpdCBBZGRyZXNzICAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICB8IHwgRXh0ZXJuYWwgQmFuayBBY2NvdW50IHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICB8IHwgRXh0ZXJuYWwgV2FsbGV0ICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVybmFsX3dhbGxldDpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IHwgT3JnYW5pemF0aW9uICAgICAgICAgIHwgb3JnYW5pemF0aW9uczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6d3JpdGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgVXNlciAgICAgICAgICAgICAgICAgIHwgdXNlcnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVzZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgUHJpY2UgICAgICAgICAgICAgICAgIHwgcHJpY2VzOnJlYWQgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUXVvdGUgICAgICAgICAgICAgICAgIHwgcXVvdGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHF1b3RlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhZGUgICAgICAgICAgICAgICAgIHwgdHJhZGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYWRlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhbnNmZXIgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zZmVyczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IHwgV29ya2Zsb3cgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvcmtmbG93czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IHwgSW52b2ljZSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8ICAjIyBBdmFpbGFibGUgRW5kcG9pbnRzICBUaGUgYXZhaWxhYmxlIEFQSXMgZm9yIHRoZSBbSWRlbnRpdHldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSksIFtPcmdhbml6YXRpb25dKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIGFuZCBbQmFua10oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIEFQSSBzZXJ2aWNlcyBhcmUgbGlzdGVkIGJlbG93OiAgfCBBUEkgU2VydmljZSAgfCBNb2RlbCAgICAgICAgICAgICAgICB8IEFQSSBFbmRwb2ludCBQYXRoICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgSWRlbnRpdHkgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtfYXBwbGljYXRpb25zICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYmFua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBDdXN0b21lclRva2VuICAgICAgICB8IC9hcGkvY3VzdG9tZXJfdG9rZW5zICAgICAgICAgICB8IENyZWF0ZSBjdXN0b21lciBKV1QgYWNjZXNzIHRva2VucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL3VzZXJzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9uIHVzZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9ucyAgICAgICAgICAgICB8IEFQSXMgdG8gcmV0cmlldmUgYW5kIHVwZGF0ZSBvcmdhbml6YXRpb24gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFjY291bnQgICAgICAgICAgICAgIHwgL2FwaS9hY2NvdW50cyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGFjY291bnRzLCB3aGljaCBob2xkIGEgc3BlY2lmaWMgYXNzZXQgZm9yIGEgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQXNzZXQgICAgICAgICAgICAgICAgfCAvYXBpL2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIGFzc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIChleDogQlRDLCBFVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua3MgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgdXBkYXRlIGFuZCBsaXN0IGJhbmtzLCB0aGUgcGFyZW50IHRvIGN1c3RvbWVycywgYWNjb3VudHMsIGV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEN1c3RvbWVyICAgICAgICAgICAgIHwgL2FwaS9jdXN0b21lcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ291bnRlcnBhcnR5ICAgICAgICAgfCAvYXBpL2NvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY291bnRlcnBhcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBEZXBvc2l0QWRkcmVzcyAgICAgICB8IC9hcGkvZGVwb3NpdF9hZGRyZXNzZXMgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGRlcG9zaXQgYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsQmFua0FjY291bnQgIHwgL2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZXh0ZXJuYWwgYmFuayBhY2NvdW50cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciBiYW5rIGFjY291bnRzIHRvIHRoZSBwbGF0Zm9ybSB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxXYWxsZXQgICAgICAgfCAvYXBpL2V4dGVybmFsX3dhbGxldHMgICAgICAgICAgfCBDcmVhdGUsIGdldCwgbGlzdCBhbmQgZGVsZXRlIGV4dGVybmFsIHdhbGxldHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgd2FsbGV0cyB0byB0aGUgcGxhdGZvcm0gICAgIHwgfCBCYW5rICAgICAgICAgfCBJZGVudGl0eVZlcmlmaWNhdGlvbiB8IC9hcGkvaWRlbnRpdHlfdmVyaWZpY2F0aW9ucyAgICB8IENyZWF0ZSBhbmQgbGlzdCBpZGVudGl0eSB2ZXJpZmljYXRpb25zLCB3aGljaCBhcmUgcGVyZm9ybWVkIG9uIGN1c3RvbWVycyBmb3IgS1lDICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEludm9pY2UgICAgICAgICAgICAgIHwgL2FwaS9pbnZvaWNlcyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGNhbmNlbCBhbmQgbGlzdCBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUGF5bWVudEluc3RydWN0aW9uICAgfCAvYXBpL3BheW1lbnRfaW5zdHJ1Y3Rpb25zICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBwYXltZW50IGluc3RydWN0aW9ucyBmb3IgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQcmljZSAgICAgICAgICAgICAgICB8IC9hcGkvcHJpY2VzICAgICAgICAgICAgICAgICAgICB8IEdldCB0aGUgY3VycmVudCBwcmljZXMgZm9yIGFzc2V0cyBvbiB0aGUgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFF1b3RlICAgICAgICAgICAgICAgIHwgL2FwaS9xdW90ZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHF1b3Rlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdHJhZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgU3ltYm9sICAgICAgICAgICAgICAgfCAvYXBpL3N5bWJvbHMgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIHN5bWJvbHMgc3VwcG9ydGVkIGZvciB0cmFkZSAoZXg6IEJUQy1VU0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFkZSAgICAgICAgICAgICAgICB8IC9hcGkvdHJhZGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCB0cmFkZXMsIHdoaWNoIGJ1eSBvciBzZWxsIGNyeXB0b2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYW5zZmVyICAgICAgICAgICAgIHwgL2FwaS90cmFuc2ZlcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgdHJhbnNmZXJzIChlLmcuLCBmdW5kaW5nLCBib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgV29ya2Zsb3cgICAgICAgICAgICAgfCAvYXBpL3dvcmtmbG93cyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB3b3JrZmxvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICMjIFVuZGVyc3RhbmRpbmcgT2JqZWN0IE1vZGVscyAmIEVuZHBvaW50cyAgKipPcmdhbml6YXRpb25zKiogIEFuIGBPcmdhbml6YXRpb25gIGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgb3JnYW5pemF0aW9uIHBhcnRuZXJpbmcgd2l0aCBDeWJyaWQgdG8gdXNlIG91ciBwbGF0Zm9ybS4gIEFuIGBPcmdhbml6YXRpb25gIHR5cGljYWxseSBkb2VzIG5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIGBjdXN0b21lcnNgLiBJbnN0ZWFkLCBhbiBPcmdhbml6YXRpb24gaGFzIG9uZSBvciBtb3JlIGBiYW5rc2AsIHdoaWNoIGVuY29tcGFzcyB0aGUgZmluYW5jaWFsIHNlcnZpY2Ugb2ZmZXJpbmdzIG9mIHRoZSBwbGF0Zm9ybS4gICoqQmFua3MqKiAgQSBgQmFua2AgaXMgb3duZWQgYnkgYW4gYE9yZ2FuaXphdGlvbmAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFuIGVudmlyb25tZW50IG9yIGNvbnRhaW5lciBmb3IgYGN1c3RvbWVyc2AgYW5kIHByb2R1Y3Qgb2ZmZXJpbmdzLiBCYW5rcyBhcmUgY3JlYXRlZCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBtb2RlLCB3aGVyZSBgU2FuZGJveGAgaXMgdGhlIGVudmlyb25tZW50IHRoYXQgeW91IHdvdWxkIHRlc3QsIHByb3RvdHlwZSBhbmQgYnVpbGQgaW4gcHJpb3IgdG8gbW92aW5nIHRvIGBQcm9kdWN0aW9uYC4gIEFuIGBPcmdhbml6YXRpb25gIGNhbiBoYXZlIG11bHRpcGxlIGBiYW5rc2AsIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIGVudmlyb25tZW50cy4gQSBgU2FuZGJveCBCYW5rYCB3aWxsIGJlIGJhY2tlZCBieSBzdHViYmVkIGRhdGEgYW5kIHByb2Nlc3MgZmxvd3MuIEZvciBpbnN0YW5jZSwgZnVuZGluZyBzb3VyY2UgdHJhbnNmZXIgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdHJhZGVzIHdpbGwgYmUgc2ltdWxhdGVkIHJhdGhlciB0aGFuIHBlcmZvcm1lZCwgaG93ZXZlciBhc3NldCBwcmljZXMgYXJlIHJlcHJlc2VudGF0aXZlIG9mIHJlYWwtd29ybGQgdmFsdWVzLiBZb3UgaGF2ZSBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIHNpbXVsYXRlZCBmaWF0IGN1cnJlbmN5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAgKipDdXN0b21lcnMqKiAgYEN1c3RvbWVyc2AgcmVwcmVzZW50IHlvdXIgYmFua2luZyB1c2VycyBvbiB0aGUgcGxhdGZvcm0uIEF0IHByZXNlbnQsIHdlIG9mZmVyIHN1cHBvcnQgZm9yIGBJbmRpdmlkdWFsc2AgYXMgQ3VzdG9tZXJzLiAgYEN1c3RvbWVyc2AgbXVzdCBiZSB2ZXJpZmllZCAoaS5lLiwgS1lDXFwnZCkgaW4gb3VyIHN5c3RlbSBiZWZvcmUgdGhleSBjYW4gcGxheSBhbnkgcGFydCBvbiB0aGUgcGxhdGZvcm0sIHdoaWNoIG1lYW5zIHRoZXkgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5kIGEgcGFzc2luZyBgSWRlbnRpdHkgVmVyaWZpY2F0aW9uYC4gU2VlIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb25zIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgYSBjdXN0b21lciBjYW4gYmUgdmVyaWZpZWQuICBgQ3VzdG9tZXJzYCBtdXN0IGFsc28gaGF2ZSBhbiBgQWNjb3VudGAgdG8gYmUgYWJsZSB0byB0cmFuc2FjdCwgaW4gdGhlIGRlc2lyZWQgYXNzZXQgY2xhc3MuIFNlZSB0aGUgQWNjb3VudHMgQVBJcyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNldHRpbmcgdXAgYWNjb3VudHMgZm9yIHRoZSBjdXN0b21lci4gXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IHYwLjEyOS43NDlcbiAqIENvbnRhY3Q6IHN1cHBvcnRAY3licmlkLmFwcFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQXBwbGljYXRpb25JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2FwcGxpY2F0aW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYXBwbGljYXRpb25MaXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEFwcGxpY2F0aW9uV2l0aFNlY3JldElkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYXBwbGljYXRpb25XaXRoU2VjcmV0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcGF0Y2hBcHBsaWNhdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbic7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQXBwbGljYXRpb25zU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAnO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBwdWJsaWMgZW5jb2RlcjogSHR0cFBhcmFtZXRlckNvZGVjO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmcsIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlOiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU/OiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAodmFsdWUgYXMgYW55W10pLmZvckVhY2goIGVsZW0gPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIGVsZW0sIGtleSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgKHZhbHVlIGFzIERhdGUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDAsIDEwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgRGF0ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKCBrID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICAgICAgaHR0cFBhcmFtcywgdmFsdWVba10sIGtleSAhPSBudWxsID8gYCR7a2V5fS4ke2t9YCA6IGspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIENyZWF0ZSBhbiBvcmdhbml6YXRpb24gT0F1dGgyIGFwcGxpY2F0aW9uLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gcG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsOiBQb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEFwcGxpY2F0aW9uV2l0aFNlY3JldElkcE1vZGVsPjtcbiAgICBwdWJsaWMgY3JlYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24ocG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWw6IFBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcHBsaWNhdGlvbldpdGhTZWNyZXRJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihwb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbDogUG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcHBsaWNhdGlvbldpdGhTZWNyZXRJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihwb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbDogUG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsID09PSBudWxsIHx8IHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBwbGljYXRpb25XaXRoU2VjcmV0SWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnNgLFxuICAgICAgICAgICAgcG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24uUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gY2xpZW50SWQgSWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGRlbGV0ZU9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKGNsaWVudElkOiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAoY2xpZW50SWQgPT09IG51bGwgfHwgY2xpZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY2xpZW50SWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGU8YW55PihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjbGllbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIFJldHJpZXZlcyBhbiBvcmdhbml6YXRpb24gYXBwbGljYXRpb24uICBSZXF1aXJlZCBzY29wZTogKipvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOnJlYWQqKlxuICAgICAqIEBwYXJhbSBjbGllbnRJZCBJZGVudGlmaWVyIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKGNsaWVudElkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxBcHBsaWNhdGlvbklkcE1vZGVsPjtcbiAgICBwdWJsaWMgZ2V0T3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChjbGllbnRJZCA9PT0gbnVsbCB8fCBjbGllbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjbGllbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcHBsaWNhdGlvbklkcE1vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjbGllbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvcmdhbml6YXRpb24gYXBwbGljYXRpb25zXG4gICAgICogUmV0cmlldmUgYSBsaXN0IG9mIG9yZ2FuaXphdGlvbiBPQXV0aDIgYXBwbGljYXRpb25zLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uczpyZWFkKipcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSBpbmRleCB0byByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0gcGVyUGFnZSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHBlciBwYWdlIHRvIHJldHVybi5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9ucyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8QXBwbGljYXRpb25MaXN0SWRwTW9kZWw+O1xuICAgIHB1YmxpYyBsaXN0T3JnYW5pemF0aW9uQXBwbGljYXRpb25zKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsPj47XG4gICAgcHVibGljIGxpc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsPj47XG4gICAgcHVibGljIGxpc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyUGFnZSAhPT0gdW5kZWZpbmVkICYmIHBlclBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wZXJQYWdlLCAncGVyX3BhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBwbGljYXRpb25MaXN0SWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIFVwZGF0ZXMgYW4gb3JnYW5pemF0aW9uIGFwcGxpY2F0aW9uLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczp3cml0ZSoqXG4gICAgICogQHBhcmFtIGNsaWVudElkIElkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEFwcGxpY2F0aW9uSWRwTW9kZWw+O1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwcGxpY2F0aW9uSWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsOiBQYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKGNsaWVudElkID09PSBudWxsIHx8IGNsaWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNsaWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCA9PT0gbnVsbCB8fCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPEFwcGxpY2F0aW9uSWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGNsaWVudElkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemF0aW9uQXBwbGljYXRpb25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9hcGkvb3JnYW5pemF0aW9uQXBwbGljYXRpb25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7R0FVRztBQUNILHVEQUF1RDtBQUV2RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBMkIsZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBYyxXQUFXLEVBQUUsVUFBVSxFQUNVLFdBQVcsRUFDeEQsTUFBWSxzQkFBc0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBK0IsWUFBWSxDQUFDO0FBZ0IvRSxhQUFhO0FBQ2IsT0FBTyxFQUFFLFNBQVMsRUFBc0IsTUFBMEIsY0FBYyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBMEMsa0JBQWtCLENBQUM7Ozs7QUFPckYsTUFBTSxPQUFPLCtCQUErQjtJQU94QyxZQUFzQixVQUFzQixFQUFnQyxRQUFnQixFQUFjLGFBQTRCO1FBQWhILGVBQVUsR0FBVixVQUFVLENBQVk7UUFMbEMsYUFBUSxHQUFHLCtCQUErQixDQUFDO1FBQzlDLG1CQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxrQkFBYSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFJdkMsSUFBSSxhQUFhLEVBQUU7WUFDZixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztTQUN0QztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDakQsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLEVBQUU7Z0JBQzlCLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1NBQzFDO1FBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sSUFBSSxJQUFJLHdCQUF3QixFQUFFLENBQUM7SUFDaEYsQ0FBQztJQUdPLGVBQWUsQ0FBQyxVQUFzQixFQUFFLEtBQVUsRUFBRSxHQUFZO1FBQ3BFLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssWUFBWSxJQUFJLEtBQUssS0FBSyxFQUFFO1lBQzlELFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pFO2FBQU07WUFDSCxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDdEU7UUFDRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRU8sd0JBQXdCLENBQUMsVUFBc0IsRUFBRSxLQUFXLEVBQUUsR0FBWTtRQUM5RSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7WUFDZixPQUFPLFVBQVUsQ0FBQztTQUNyQjtRQUVELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzNCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDckIsS0FBZSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3hHO2lCQUFNLElBQUksS0FBSyxZQUFZLElBQUksRUFBRTtnQkFDOUIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO29CQUNiLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRyxLQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNwRjtxQkFBTTtvQkFDSixNQUFNLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO2lCQUN0RDthQUNKO2lCQUFNO2dCQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FDdkUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvRDtTQUNKO2FBQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1lBQ3BCLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUM5QzthQUFNO1lBQ0gsTUFBTSxLQUFLLENBQUMscURBQXFELENBQUMsQ0FBQztTQUN0RTtRQUNELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFZTSw2QkFBNkIsQ0FBQyxtQ0FBd0UsRUFBRSxVQUFlLE1BQU0sRUFBRSxpQkFBMEIsS0FBSyxFQUFFLE9BQXdFO1FBQzNPLElBQUksbUNBQW1DLEtBQUssSUFBSSxJQUFJLG1DQUFtQyxLQUFLLFNBQVMsRUFBRTtZQUNuRyxNQUFNLElBQUksS0FBSyxDQUFDLDBIQUEwSCxDQUFDLENBQUM7U0FDL0k7UUFFRCxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRTFDLElBQUksa0JBQXNDLENBQUM7UUFDM0MsdUNBQXVDO1FBQ3ZDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDdkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxtQ0FBbUM7UUFDbkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztTQUMxRjtRQUVELElBQUksZ0NBQWdDLEdBQXVCLE9BQU8sSUFBSSxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDL0YsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsaUNBQWlDO1lBQ2pDLE1BQU0saUJBQWlCLEdBQWE7Z0JBQ2hDLGtCQUFrQjthQUNyQixDQUFDO1lBQ0YsZ0NBQWdDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1NBQy9GO1FBQ0QsSUFBSSxnQ0FBZ0MsS0FBSyxTQUFTLEVBQUU7WUFDaEQsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7U0FDckY7UUFFRCxJQUFJLG1CQUFtQixHQUE0QixPQUFPLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUM5RSxJQUFJLG1CQUFtQixLQUFLLFNBQVMsRUFBRTtZQUNuQyxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBR0QsdUNBQXVDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFhO1lBQ3ZCLGtCQUFrQjtTQUNyQixDQUFDO1FBQ0YsTUFBTSx1QkFBdUIsR0FBdUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN6RyxJQUFJLHVCQUF1QixLQUFLLFNBQVMsRUFBRTtZQUN2QyxlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztTQUNsRjtRQUVELElBQUksYUFBYSxHQUE2QixNQUFNLENBQUM7UUFDckQsSUFBSSxnQ0FBZ0MsRUFBRTtZQUNsQyxJQUFJLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckQsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBZ0MsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsZ0NBQWdDLEVBQ3JILG1DQUFtQyxFQUNuQztZQUNJLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsWUFBWSxFQUFPLGFBQWE7WUFDaEMsZUFBZSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZTtZQUNuRCxPQUFPLEVBQUUsZUFBZTtZQUN4QixPQUFPLEVBQUUsT0FBTztZQUNoQixjQUFjLEVBQUUsY0FBYztTQUNqQyxDQUNKLENBQUM7SUFDTixDQUFDO0lBWU0sNkJBQTZCLENBQUMsUUFBZ0IsRUFBRSxVQUFlLE1BQU0sRUFBRSxpQkFBMEIsS0FBSyxFQUFFLE9BQXdFO1FBQ25MLElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxFQUFFO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0ZBQStGLENBQUMsQ0FBQztTQUNwSDtRQUVELElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFMUMsSUFBSSxrQkFBc0MsQ0FBQztRQUMzQyx1Q0FBdUM7UUFDdkMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN2RSxJQUFJLGtCQUFrQixFQUFFO1lBQ3BCLGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztTQUMxRjtRQUVELG1DQUFtQztRQUNuQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25FLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsSUFBSSxnQ0FBZ0MsR0FBdUIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvRixJQUFJLGdDQUFnQyxLQUFLLFNBQVMsRUFBRTtZQUNoRCxpQ0FBaUM7WUFDakMsTUFBTSxpQkFBaUIsR0FBYTtnQkFDaEMsa0JBQWtCO2FBQ3JCLENBQUM7WUFDRixnQ0FBZ0MsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixDQUFDLENBQUM7U0FDL0Y7UUFDRCxJQUFJLGdDQUFnQyxLQUFLLFNBQVMsRUFBRTtZQUNoRCxlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztTQUNyRjtRQUVELElBQUksbUJBQW1CLEdBQTRCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQzlFLElBQUksbUJBQW1CLEtBQUssU0FBUyxFQUFFO1lBQ25DLG1CQUFtQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7U0FDM0M7UUFHRCxJQUFJLGFBQWEsR0FBNkIsTUFBTSxDQUFDO1FBQ3JELElBQUksZ0NBQWdDLEVBQUU7WUFDbEMsSUFBSSxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JELGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFO2dCQUN4RSxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNO2dCQUNILGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsa0NBQWtDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQ3JJO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixZQUFZLEVBQU8sYUFBYTtZQUNoQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFZTSwwQkFBMEIsQ0FBQyxRQUFnQixFQUFFLFVBQWUsTUFBTSxFQUFFLGlCQUEwQixLQUFLLEVBQUUsT0FBd0U7UUFDaEwsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FBQyw0RkFBNEYsQ0FBQyxDQUFDO1NBQ2pIO1FBRUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUUxQyxJQUFJLGtCQUFzQyxDQUFDO1FBQzNDLHVDQUF1QztRQUN2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsbUNBQW1DO1FBQ25DLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxJQUFJLGdDQUFnQyxHQUF1QixPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQy9GLElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGlDQUFpQztZQUNqQyxNQUFNLGlCQUFpQixHQUFhO2dCQUNoQyxrQkFBa0I7YUFDckIsQ0FBQztZQUNGLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMvRjtRQUNELElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsSUFBSSxtQkFBbUIsR0FBNEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7WUFDbkMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUdELElBQUksYUFBYSxHQUE2QixNQUFNLENBQUM7UUFDckQsSUFBSSxnQ0FBZ0MsRUFBRTtZQUNsQyxJQUFJLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckQsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBc0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsa0NBQWtDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQ2xKO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixZQUFZLEVBQU8sYUFBYTtZQUNoQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlO1lBQ25ELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLGNBQWMsRUFBRSxjQUFjO1NBQ2pDLENBQ0osQ0FBQztJQUNOLENBQUM7SUFhTSw0QkFBNEIsQ0FBQyxJQUFhLEVBQUUsT0FBZ0IsRUFBRSxVQUFlLE1BQU0sRUFBRSxpQkFBMEIsS0FBSyxFQUFFLE9BQXdFO1FBRWpNLElBQUksdUJBQXVCLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDdEUsSUFBSSxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDdkMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFDL0QsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDN0MsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFDL0QsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1NBQzdCO1FBRUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUUxQyxJQUFJLGtCQUFzQyxDQUFDO1FBQzNDLHVDQUF1QztRQUN2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsbUNBQW1DO1FBQ25DLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxJQUFJLGdDQUFnQyxHQUF1QixPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQy9GLElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGlDQUFpQztZQUNqQyxNQUFNLGlCQUFpQixHQUFhO2dCQUNoQyxrQkFBa0I7YUFDckIsQ0FBQztZQUNGLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMvRjtRQUNELElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsSUFBSSxtQkFBbUIsR0FBNEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7WUFDbkMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUdELElBQUksYUFBYSxHQUE2QixNQUFNLENBQUM7UUFDckQsSUFBSSxnQ0FBZ0MsRUFBRTtZQUNsQyxJQUFJLGdDQUFnQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckQsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtpQkFBTSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLEVBQUU7Z0JBQ3hFLGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU07Z0JBQ0gsYUFBYSxHQUFHLE1BQU0sQ0FBQzthQUMxQjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBMEIsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsZ0NBQWdDLEVBQzlHO1lBQ0ksT0FBTyxFQUFFLG1CQUFtQjtZQUM1QixNQUFNLEVBQUUsdUJBQXVCO1lBQy9CLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQztJQWFNLDZCQUE2QixDQUFDLFFBQWdCLEVBQUUsd0JBQWtELEVBQUUsVUFBZSxNQUFNLEVBQUUsaUJBQTBCLEtBQUssRUFBRSxPQUF3RTtRQUN2TyxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtZQUM3QyxNQUFNLElBQUksS0FBSyxDQUFDLCtGQUErRixDQUFDLENBQUM7U0FDcEg7UUFDRCxJQUFJLHdCQUF3QixLQUFLLElBQUksSUFBSSx3QkFBd0IsS0FBSyxTQUFTLEVBQUU7WUFDN0UsTUFBTSxJQUFJLEtBQUssQ0FBQywrR0FBK0csQ0FBQyxDQUFDO1NBQ3BJO1FBRUQsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUUxQyxJQUFJLGtCQUFzQyxDQUFDO1FBQzNDLHVDQUF1QztRQUN2QyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksa0JBQWtCLEVBQUU7WUFDcEIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQzFGO1FBRUQsbUNBQW1DO1FBQ25DLGtCQUFrQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkUsSUFBSSxrQkFBa0IsRUFBRTtZQUNwQixlQUFlLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDMUY7UUFFRCxJQUFJLGdDQUFnQyxHQUF1QixPQUFPLElBQUksT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQy9GLElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGlDQUFpQztZQUNqQyxNQUFNLGlCQUFpQixHQUFhO2dCQUNoQyxrQkFBa0I7YUFDckIsQ0FBQztZQUNGLGdDQUFnQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUMsQ0FBQztTQUMvRjtRQUNELElBQUksZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1lBQ2hELGVBQWUsR0FBRyxlQUFlLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ3JGO1FBRUQsSUFBSSxtQkFBbUIsR0FBNEIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDOUUsSUFBSSxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7WUFDbkMsbUJBQW1CLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztTQUMzQztRQUdELHVDQUF1QztRQUN2QyxNQUFNLFFBQVEsR0FBYTtZQUN2QixrQkFBa0I7U0FDckIsQ0FBQztRQUNGLE1BQU0sdUJBQXVCLEdBQXVCLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekcsSUFBSSx1QkFBdUIsS0FBSyxTQUFTLEVBQUU7WUFDdkMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLHVCQUF1QixDQUFDLENBQUM7U0FDbEY7UUFFRCxJQUFJLGFBQWEsR0FBNkIsTUFBTSxDQUFDO1FBQ3JELElBQUksZ0NBQWdDLEVBQUU7WUFDbEMsSUFBSSxnQ0FBZ0MsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JELGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7aUJBQU0sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFO2dCQUN4RSxhQUFhLEdBQUcsTUFBTSxDQUFDO2FBQzFCO2lCQUFNO2dCQUNILGFBQWEsR0FBRyxNQUFNLENBQUM7YUFDMUI7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQXNCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLGtDQUFrQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUNwSix3QkFBd0IsRUFDeEI7WUFDSSxPQUFPLEVBQUUsbUJBQW1CO1lBQzVCLFlBQVksRUFBTyxhQUFhO1lBQ2hDLGVBQWUsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDbkQsT0FBTyxFQUFFLGVBQWU7WUFDeEIsT0FBTyxFQUFFLE9BQU87WUFDaEIsY0FBYyxFQUFFLGNBQWM7U0FDakMsQ0FDSixDQUFDO0lBQ04sQ0FBQzs7NkhBMWJRLCtCQUErQiw0Q0FPeUIsU0FBUztpSUFQakUsK0JBQStCLGNBRjlCLE1BQU07NEZBRVAsK0JBQStCO2tCQUgzQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBUWtELFFBQVE7OzBCQUFHLE1BQU07MkJBQUMsU0FBUzs7MEJBQXFCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEN5YnJpZCBJZGVudGl0eSBBUElcbiAqICMgQ3licmlkIEFQSSBkb2N1bWVudGF0aW9uICBXZWxjb21lIHRvIEN5YnJpZCwgYW4gYWxsLWluLW9uZSBjcnlwdG8gcGxhdGZvcm0gdGhhdCBlbmFibGVzIHlvdSB0byBlYXNpbHkgKipidWlsZCoqIGFuZCAqKmxhdW5jaCoqIHdoaXRlLWxhYmVsIGNyeXB0byBwcm9kdWN0cyBvciBzZXJ2aWNlcy4gIEluIHRoZXNlIGRvY3VtZW50cywgeW91XFwnbGwgZmluZCBkZXRhaWxzIG9uIGhvdyBvdXIgUkVTVCBBUEkgb3BlcmF0ZXMgYW5kIGdlbmVyYWxseSBob3cgb3VyIHBsYXRmb3JtIGZ1bmN0aW9ucy4gIElmIHlvdVxcJ3JlIGxvb2tpbmcgZm9yIG91ciBVSSBTREsgV2lkZ2V0cyBmb3IgV2ViIG9yIE1vYmlsZSAoaU9TL0FuZHJvaWQpLCBnZW5lcmF0ZWQgQVBJIGNsaWVudHMsIG9yIGRlbW8gYXBwbGljYXRpb25zLCBoZWFkIG92ZXIgdG8gb3VyIFtHaXRodWIgcmVwb10oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHApLiAg8J+SoSBXZSByZWNvbW1lbmQgYm9va21hcmtpbmcgdGhlIFtDeWJyaWQgTGlua1RyZWVdKGh0dHBzOi8vbGlua3RyLmVlL2N5YnJpZHRlY2hub2xvZ2llcykgd2hpY2ggY29udGFpbnMgbWFueSBoZWxwZnVsIGxpbmtzIHRvIHBsYXRmb3JtIHJlc291cmNlcy4gICMjIEdldHRpbmcgU3RhcnRlZCAgVGhpcyBpcyBDeWJyaWRcXCdzIHB1YmxpYyBpbnRlcmFjdGl2ZSBBUEkgZG9jdW1lbnRhdGlvbiwgd2hpY2ggYWxsb3dzIHlvdSB0byBmdWxseSB0ZXN0IG91ciBBUElzLiBJZiB5b3VcXCdkIGxpa2UgdG8gdXNlIGEgZGlmZmVyZW50IHRvb2wgdG8gZXhlcmNpc2Ugb3VyIEFQSXMsIHlvdSBjYW4gZG93bmxvYWQgdGhlIFtPcGVuIEFQSSAzLjAgeWFtbF0oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3YxL3N3YWdnZXIueWFtbCkgZm9yIGltcG9ydC4gIElmIHlvdVxcJ3JlIG5ldyB0byBvdXIgQVBJcyBhbmQgdGhlIEN5YnJpZCBQbGF0Zm9ybSwgZm9sbG93IHRoZSBiZWxvdyBndWlkZXMgdG8gZ2V0IHNldCB1cCBhbmQgZmFtaWxpYXIgd2l0aCB0aGUgcGxhdGZvcm06ICAxLiBbSW50cm9kdWN0aW9uXShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL2ludHJvZHVjdGlvbikgMi4gW1BsYXRmb3JtIE92ZXJ2aWV3XShodHRwczovL2RvY3MuY3licmlkLnh5ei9kb2NzL3BsYXRmb3JtLW92ZXJ2aWV3KSAzLiBbVGVzdGluZyB3aXRoIEhvc3RlZCBXZWIgRGVtbyBBcHBdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvaG9zdGVkLWRlbW8tYXBwKSAgSW4gW0dldHRpbmcgU3RhcnRlZCBpbiB0aGUgQ3licmlkIFNhbmRib3hdKGh0dHBzOi8vZG9jcy5jeWJyaWQueHl6L2RvY3MvY3licmlkLXNhbmRib3gpLCB3ZSB3YWxrIHlvdSB0aHJvdWdoIGhvdyB0byB1c2UgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAvKSB0byBjcmVhdGUgYSB0ZXN0IGJhbmsgYW5kIGdlbmVyYXRlIEFQSSBrZXlzLiBJbiBbR2V0dGluZyBSZWFkeSBmb3IgVHJhZGluZ10oaHR0cHM6Ly9kb2NzLmN5YnJpZC54eXovZG9jcy90cmFkZS1wcm9jZXNzKSwgd2Ugd2FsayB0aHJvdWdoIGNyZWF0aW5nIGN1c3RvbWVycywgY3VzdG9tZXIgaWRlbnRpdGllcywgYWNjb3VudHMsIGFzIHdlbGwgYXMgZXhlY3V0aW5nIHF1b3RlcyBhbmQgdHJhZGVzLiAgIyMgV29ya2luZyB3aXRoIHRoZSBDeWJyaWQgUGxhdGZvcm0gIFRoZXJlIGFyZSB0aHJlZSBwcmltYXJ5IHdheXMgeW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoZSBDeWJyaWQgcGxhdGZvcm06ICAxLiBEaXJlY3RseSB2aWEgb3VyIFJFU1RmdWwgQVBJICh0aGlzIGRvY3VtZW50YXRpb24pIDIuIFVzaW5nIG91ciBBUEkgY2xpZW50cyBhdmFpbGFibGUgaW4gYSB2YXJpZXR5IG9mIGxhbmd1YWdlcyAoW0FuZ3VsYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1hbmd1bGFyKSwgW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1qYXZhKSwgW0tvdGxpbl0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLWtvdGxpbiksIFtQeXRob25dKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1weXRob24pLCBbUnVieV0oaHR0cHM6Ly9naXRodWIuY29tL0N5YnJpZC1hcHAvY3licmlkLWFwaS1iYW5rLXJ1YnkpLCBbU3dpZnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay1zd2lmdCkgb3IgW1R5cGVzY3JpcHRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1hcGktYmFuay10eXBlc2NyaXB0KSkgMy4gSW50ZWdyYXRpbmcgYSBwbGF0Zm9ybSBzcGVjaWZpYyBTREsgKFtXZWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstd2ViKSwgW0FuZHJvaWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstYW5kcm9pZCksIFtpT1NdKGh0dHBzOi8vZ2l0aHViLmNvbS9DeWJyaWQtYXBwL2N5YnJpZC1zZGstaW9zKSkgIE91ciBjb21wbGV0ZSBzZXQgb2YgQVBJcyBhbGxvd3MgeW91IHRvIG1hbmFnZSByZXNvdXJjZXMgYWNyb3NzIHRocmVlIGRpc3RpbmN0IGFyZWFzOiB5b3VyIGBPcmdhbml6YXRpb25gLCB5b3VyIGBCYW5rc2AgYW5kIHlvdXIgYElkZW50aXRpZXNgLiBGb3IgbW9zdCBvZiB5b3VyIHRlc3RpbmcgYW5kIGludGVyYWN0aW9uIHlvdVxcJ2xsIGJlIHVzaW5nIHRoZSBgQmFua2AgQVBJLCB3aGljaCBpcyB3aGVyZSB0aGUgbWFqb3JpdHkgb2YgQVBJcyByZXNpZGUuICAqVGhlIGNvbXBsZXRlIHNldCBvZiBBUElzIGNhbiBiZSBmb3VuZCBvbiB0aGUgZm9sbG93aW5nIHBhZ2VzOiogIHwgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCB8IFtPcmdhbml6YXRpb24gQVBJXShodHRwczovL29yZ2FuaXphdGlvbi5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgIHwgQVBJcyB0byBtYW5hZ2Ugb3JnYW5pemF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IFtCYW5rIEFQSV0oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpICAgICAgICAgICAgICAgICAgIHwgQVBJcyB0byBtYW5hZ2UgYmFua3MgKGFuZCBhbGwgZG93bnN0cmVhbSBjdXN0b21lciBhY3Rpdml0eSkgfCB8IFtJZGVudGl0aWVzIEFQSV0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHAvYXBpL3NjaGVtYS9zd2FnZ2VyLXVpKSAgICAgICAgICAgICAgICAgICAgICAgfCBBUElzIHRvIG1hbmFnZSBvcmdhbml6YXRpb24gYW5kIGJhbmsgaWRlbnRpdGllcyAgICAgICAgICAgICB8ICBGb3IgcXVlc3Rpb25zIHBsZWFzZSBjb250YWN0IFtTdXBwb3J0XShtYWlsdG86c3VwcG9ydEBjeWJyaWQueHl6KSBhdCBhbnkgdGltZSBmb3IgYXNzaXN0YW5jZSwgb3IgY29udGFjdCB0aGUgW1Byb2R1Y3QgVGVhbV0obWFpbHRvOnByb2R1Y3RAY3licmlkLnh5eikgZm9yIHByb2R1Y3Qgc3VnZ2VzdGlvbnMuICAjIyBBdXRoZW50aWNhdGluZyB3aXRoIHRoZSBBUEkgIFRoZSBDeWJyaWQgUGxhdGZvcm0gdXNlcyBPQXV0aCAyLjAgQmVhcmVyIFRva2VucyB0byBhdXRoZW50aWNhdGUgcmVxdWVzdHMgdG8gdGhlIHBsYXRmb3JtLiBDcmVkZW50aWFscyB0byBjcmVhdGUgYE9yZ2FuaXphdGlvbmAgYW5kIGBCYW5rYCB0b2tlbnMgY2FuIGJlIGdlbmVyYXRlZCB2aWEgdGhlIFtDeWJyaWQgU2FuZGJveF0oaHR0cHM6Ly9pZC5wcm9kdWN0aW9uLmN5YnJpZC5hcHApLiBBY2Nlc3MgdG9rZW5zIGNhbiBiZSBnZW5lcmF0ZWQgZm9yIGEgYEN1c3RvbWVyYCBhcyB3ZWxsIHZpYSB0aGUgW0N5YnJpZCBJZFBdKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwKSBhcyB3ZWxsLiAgQW4gYE9yZ2FuaXphdGlvbmAgYWNjZXNzIHRva2VuIGFwcGxpZXMgYnJvYWRseSB0byB0aGUgd2hvbGUgT3JnYW5pemF0aW9uIGFuZCBhbGwgb2YgaXRzIGBCYW5rc2AsIHdoZXJlYXMsIGEgYEJhbmtgIGFjY2VzcyB0b2tlbiBpcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIEJhbmsuIGBDdXN0b21lcmAgdG9rZW5zLCBzaW1pbGFybHksIGFyZSBzY29wZWQgdG8gYSBzcGVjaWZpYyBjdXN0b21lciBpbiBhIGJhbmsuICBCb3RoIGBPcmdhbml6YXRpb25gIGFuZCBgQmFua2AgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSBPQXV0aCBDbGllbnQgQ3JlZGVudGlhbCBHcmFudCBmbG93LiBFYWNoIE9yZ2FuaXphdGlvbiBhbmQgQmFuayBoYXMgaXRzIG93biB1bmlxdWUgYENsaWVudCBJRGAgYW5kIGBTZWNyZXRgIHRoYXQgYWxsb3dzIGZvciBtYWNoaW5lLXRvLW1hY2hpbmUgYXV0aGVudGljYXRpb24uICBBIGBCYW5rYCBjYW4gdGhlbiBnZW5lcmF0ZSBgQ3VzdG9tZXJgIGFjY2VzcyB0b2tlbnMgdmlhIEFQSSB1c2luZyBvdXIgW0lkZW50aXRpZXMgQVBJXShodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpLiAgPGZvbnQgY29sb3I9XFxcIm9yYW5nZVxcXCI+KirimqDvuI8gTmV2ZXIgc2hhcmUgeW91ciBDbGllbnQgSUQgb3IgU2VjcmV0IHB1YmxpY2x5IG9yIGluIHlvdXIgc291cmNlIGNvZGUgcmVwb3NpdG9yeS4qKjwvZm9udD4gIFlvdXIgYENsaWVudCBJRGAgYW5kIGBTZWNyZXRgIGNhbiBiZSBleGNoYW5nZWQgZm9yIGEgdGltZS1saW1pdGVkIGBCZWFyZXIgVG9rZW5gIGJ5IGludGVyYWN0aW5nIHdpdGggdGhlIEN5YnJpZCBJZGVudGl0eSBQcm92aWRlciBvciB0aHJvdWdoIGludGVyYWN0aW5nIHdpdGggdGhlICoqQXV0aG9yaXplKiogYnV0dG9uIGluIHRoaXMgZG9jdW1lbnQuICBUaGUgZm9sbG93aW5nIGN1cmwgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBxdWlja2x5IGdlbmVyYXRlIGEgYEJlYXJlciBUb2tlbmAgZm9yIHVzZSBpbiB0ZXN0aW5nIHRoZSBBUEkgb3IgZGVtbyBhcHBsaWNhdGlvbnMuICBgYGAgIyBFeGFtcGxlIHJlcXVlc3Qgd2hlbiB1c2luZyBCYW5rIGNyZWRlbnRpYWxzIGN1cmwgLVggUE9TVCBodHRwczovL2lkLnByb2R1Y3Rpb24uY3licmlkLmFwcC9vYXV0aC90b2tlbiAtZCBcXCd7ICAgICBcXFwiZ3JhbnRfdHlwZVxcXCI6IFxcXCJjbGllbnRfY3JlZGVudGlhbHNcXFwiLCAgICAgXFxcImNsaWVudF9pZFxcXCI6IFxcXCI8WW91ciBDbGllbnQgSUQ+XFxcIiwgICAgIFxcXCJjbGllbnRfc2VjcmV0XFxcIjogXFxcIjxZb3VyIFNlY3JldD5cXFwiLCAgICAgXFxcInNjb3BlXFxcIjogXFxcImJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua19hcHBsaWNhdGlvbnM6cmVhZCBiYW5rX2FwcGxpY2F0aW9uczp3cml0ZSBiYW5rX2FwcGxpY2F0aW9uczpleGVjdXRlIGFjY291bnRzOnJlYWQgYWNjb3VudHM6d3JpdGUgYWNjb3VudHM6ZXhlY3V0ZSBjb3VudGVycGFydGllczpyZWFkIGNvdW50ZXJwYXJ0aWVzOnBpaTpyZWFkIGNvdW50ZXJwYXJ0aWVzOndyaXRlIGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGN1c3RvbWVyczp3cml0ZSBjdXN0b21lcnM6ZXhlY3V0ZSBwcmljZXM6cmVhZCBxdW90ZXM6ZXhlY3V0ZSBxdW90ZXM6cmVhZCB0cmFkZXM6ZXhlY3V0ZSB0cmFkZXM6cmVhZCB0cmFuc2ZlcnM6ZXhlY3V0ZSB0cmFuc2ZlcnM6cmVhZCB0cmFuc2ZlcnM6d3JpdGUgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cGlpOnJlYWQgZXh0ZXJuYWxfYmFua19hY2NvdW50czp3cml0ZSBleHRlcm5hbF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6d3JpdGUgZXh0ZXJuYWxfd2FsbGV0czpleGVjdXRlIHdvcmtmbG93czpyZWFkIHdvcmtmbG93czpleGVjdXRlIGRlcG9zaXRfYWRkcmVzc2VzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6d3JpdGUgZGVwb3NpdF9hZGRyZXNzZXM6ZXhlY3V0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6d3JpdGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBpbnZvaWNlczp3cml0ZSBpbnZvaWNlczpleGVjdXRlIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOnBpaTpyZWFkIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6d3JpdGUgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpleGVjdXRlIHBlcnNvbmFfc2Vzc2lvbnM6ZXhlY3V0ZSBzYXJkaW5lX3Nlc3Npb25zOmV4ZWN1dGUgcGxhbnM6ZXhlY3V0ZSBwbGFuczpyZWFkIGV4ZWN1dGlvbnM6ZXhlY3V0ZSBleGVjdXRpb25zOnJlYWQgZmlsZXM6cmVhZCBmaWxlczpwaWk6cmVhZCBmaWxlczpleGVjdXRlXFxcIiAgIH1cXCcgLUggXFxcIkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxcXCIgICMgV2hlbiB1c2luZyBPcmdhbml6YXRpb24gY3JlZGVudGlhbHMgc2V0IGBzY29wZWAgdG8gXFwnb3JnYW5pemF0aW9uczpyZWFkIG9yZ2FuaXphdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpyZWFkIG9yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnM6d3JpdGUgb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlIGJhbmtzOnJlYWQgYmFua3M6d3JpdGUgYmFua3M6ZXhlY3V0ZSBiYW5rX2FwcGxpY2F0aW9uczpyZWFkIGJhbmtfYXBwbGljYXRpb25zOndyaXRlIGJhbmtfYXBwbGljYXRpb25zOmV4ZWN1dGUgdXNlcnM6cmVhZCB1c2Vyczp3cml0ZSB1c2VyczpleGVjdXRlIGNvdW50ZXJwYXJ0aWVzOnJlYWQgY291bnRlcnBhcnRpZXM6cGlpOnJlYWQgY3VzdG9tZXJzOnJlYWQgY3VzdG9tZXJzOnBpaTpyZWFkIGFjY291bnRzOnJlYWQgYWNjb3VudHM6d3JpdGUgcHJpY2VzOnJlYWQgcXVvdGVzOmV4ZWN1dGUgcXVvdGVzOnJlYWQgdHJhZGVzOmV4ZWN1dGUgdHJhZGVzOnJlYWQgdHJhbnNmZXJzOnJlYWQgdHJhbnNmZXJzOndyaXRlIHRyYW5zZmVyczpleGVjdXRlIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6cmVhZCBleHRlcm5hbF9iYW5rX2FjY291bnRzOnBpaTpyZWFkIGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgZXh0ZXJuYWxfd2FsbGV0czpyZWFkIGV4dGVybmFsX3dhbGxldHM6d3JpdGUgd29ya2Zsb3dzOnJlYWQgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCBkZXBvc2l0X2FkZHJlc3Nlczp3cml0ZSBkZXBvc2l0X2JhbmtfYWNjb3VudHM6cmVhZCBkZXBvc2l0X2JhbmtfYWNjb3VudHM6d3JpdGUgZGVwb3NpdF9iYW5rX2FjY291bnRzOmV4ZWN1dGUgaW52b2ljZXM6cmVhZCBzdWJzY3JpcHRpb25zOnJlYWQgc3Vic2NyaXB0aW9uczp3cml0ZSBzdWJzY3JpcHRpb25zOmV4ZWN1dGUgc3Vic2NyaXB0aW9uX2V2ZW50czpyZWFkIHN1YnNjcmlwdGlvbl9ldmVudHM6ZXhlY3V0ZSBpZGVudGl0eV92ZXJpZmljYXRpb25zOnJlYWQgaWRlbnRpdHlfdmVyaWZpY2F0aW9uczpwaWk6cmVhZCBpZGVudGl0eV92ZXJpZmljYXRpb25zOmV4ZWN1dGUgcGVyc29uYV9zZXNzaW9uczpleGVjdXRlIHNhcmRpbmVfc2Vzc2lvbnM6ZXhlY3V0ZSBwbGFuczpleGVjdXRlIHBsYW5zOnJlYWQgZXhlY3V0aW9uczpleGVjdXRlIGV4ZWN1dGlvbnM6cmVhZCBmaWxlczpyZWFkIGZpbGVzOnBpaTpyZWFkIGZpbGVzOmV4ZWN1dGVcXCcgYGBgIDxmb250IGNvbG9yPVxcXCJvcmFuZ2VcXFwiPioq4pqg77iPIE5vdGU6IFRoZSBhYm92ZSBjdXJsIHdpbGwgY3JlYXRlIGEgYmVhcmVyIHRva2VuIHdpdGggZnVsbCBzY29wZSBhY2Nlc3MuIERlbGV0ZSBzY29wZXMgaWYgeW91XFwnZCBsaWtlIHRvIHJlc3RyaWN0IGFjY2Vzcy4qKjwvZm9udD4gICMjIEF1dGhlbnRpY2F0aW9uIFNjb3BlcyAgVGhlIEN5YnJpZCBwbGF0Zm9ybSBzdXBwb3J0cyB0aGUgdXNlIG9mIHNjb3BlcyB0byBjb250cm9sIHRoZSBsZXZlbCBvZiBhY2Nlc3MgYSB0b2tlbiBpcyBsaW1pdGVkIHRvLiBTY29wZXMgZG8gbm90IGdyYW50IGFjY2VzcyB0byByZXNvdXJjZXM7IGluc3RlYWQsIHRoZXkgcHJvdmlkZSBsaW1pdHMsIGluIHN1cHBvcnQgb2YgdGhlIGxlYXN0IHByaXZpbGVnZSBwcmluY2lwYWwuICBUaGUgZm9sbG93aW5nIHNjb3BlcyBhcmUgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybSBhbmQgY2FuIGJlIHJlcXVlc3RlZCB3aGVuIGdlbmVyYXRpbmcgZWl0aGVyIGFuIE9yZ2FuaXphdGlvbiwgQmFuayBvciBDdXN0b21lciB0b2tlbi4gR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgX1JlYWRfIHNjb3BlIGlzIHJlcXVpcmVkIHRvIHJlYWQgYW5kIGxpc3QgcmVzb3VyY2VzLCB0aGUgX1dyaXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byB1cGRhdGUgYSByZXNvdXJjZSBhbmQgdGhlIF9FeGVjdXRlXyBzY29wZSBpcyByZXF1aXJlZCB0byBjcmVhdGUgYSByZXNvdXJjZS4gIHwgUmVzb3VyY2UgICAgICAgICAgICAgIHwgUmVhZCBzY29wZSAoVG9rZW4gVHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFdyaXRlIHNjb3BlIChUb2tlbiBUeXBlKSAgICAgICAgICAgICAgICAgICAgICB8IEV4ZWN1dGUgc2NvcGUgKFRva2VuIFR5cGUpICAgICAgICAgICAgICAgICAgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgQWNjb3VudCAgICAgICAgICAgICAgIHwgYWNjb3VudHM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFjY291bnRzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgICAgICAgICAgIHwgYmFua3M6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGJhbmtzOndyaXRlIChPcmdhbml6YXRpb24sIEJhbmspICAgICAgICAgICAgICB8IGJhbmtzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgQ3VzdG9tZXIgICAgICAgICAgICAgIHwgY3VzdG9tZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczp3cml0ZSAoQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8IGN1c3RvbWVyczpleGVjdXRlIChCYW5rKSAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQ291bnRlcnBhcnR5ICAgICAgICAgIHwgY291bnRlcnBhcnRpZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IGNvdW50ZXJwYXJ0aWVzOmV4ZWN1dGUgKEJhbmspICAgICAgICAgICAgICAgICAgICB8IHwgRGVwb3NpdCBBZGRyZXNzICAgICAgIHwgZGVwb3NpdF9hZGRyZXNzZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICB8IGRlcG9zaXRfYWRkcmVzc2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICB8IHwgRXh0ZXJuYWwgQmFuayBBY2NvdW50IHwgZXh0ZXJuYWxfYmFua19hY2NvdW50czpyZWFkIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6d3JpdGUgKEJhbmssIEN1c3RvbWVyKSB8IGV4dGVybmFsX2JhbmtfYWNjb3VudHM6ZXhlY3V0ZSAoQmFuaywgQ3VzdG9tZXIpICB8IHwgRXh0ZXJuYWwgV2FsbGV0ICAgICAgIHwgZXh0ZXJuYWxfd2FsbGV0OnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGV4dGVybmFsX3dhbGxldDpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICB8IHwgT3JnYW5pemF0aW9uICAgICAgICAgIHwgb3JnYW5pemF0aW9uczpyZWFkIChPcmdhbml6YXRpb24pICAgICAgICAgICAgICAgICAgICAgICAgICB8IG9yZ2FuaXphdGlvbnM6d3JpdGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgVXNlciAgICAgICAgICAgICAgICAgIHwgdXNlcnM6cmVhZCAoT3JnYW5pemF0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHVzZXJzOmV4ZWN1dGUgKE9yZ2FuaXphdGlvbikgICAgICAgICAgICAgICAgICAgICB8IHwgUHJpY2UgICAgICAgICAgICAgICAgIHwgcHJpY2VzOnJlYWQgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgUXVvdGUgICAgICAgICAgICAgICAgIHwgcXVvdGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHF1b3RlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhZGUgICAgICAgICAgICAgICAgIHwgdHJhZGVzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYWRlczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSAgICB8IHwgVHJhbnNmZXIgICAgICAgICAgICAgIHwgdHJhbnNmZXJzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zZmVyczpleGVjdXRlIChPcmdhbml6YXRpb24sIEJhbmssIEN1c3RvbWVyKSB8IHwgV29ya2Zsb3cgICAgICAgICAgICAgIHwgd29ya2Zsb3dzOnJlYWQgKE9yZ2FuaXphdGlvbiwgQmFuaywgQ3VzdG9tZXIpICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHdvcmtmbG93czpleGVjdXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IHwgSW52b2ljZSAgICAgICAgICAgICAgIHwgaW52b2ljZXM6cmVhZCAoT3JnYW5pemF0aW9uLCBCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOndyaXRlIChCYW5rLCBDdXN0b21lcikgICAgICAgICAgICAgICB8IGludm9pY2VzOmV4ZWN1dGUgKEJhbmssIEN1c3RvbWVyKSAgICAgICAgICAgICAgICB8ICAjIyBBdmFpbGFibGUgRW5kcG9pbnRzICBUaGUgYXZhaWxhYmxlIEFQSXMgZm9yIHRoZSBbSWRlbnRpdHldKGh0dHBzOi8vaWQucHJvZHVjdGlvbi5jeWJyaWQuYXBwL2FwaS9zY2hlbWEvc3dhZ2dlci11aSksIFtPcmdhbml6YXRpb25dKGh0dHBzOi8vb3JnYW5pemF0aW9uLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIGFuZCBbQmFua10oaHR0cHM6Ly9iYW5rLnByb2R1Y3Rpb24uY3licmlkLmFwcC9hcGkvc2NoZW1hL3N3YWdnZXItdWkpIEFQSSBzZXJ2aWNlcyBhcmUgbGlzdGVkIGJlbG93OiAgfCBBUEkgU2VydmljZSAgfCBNb2RlbCAgICAgICAgICAgICAgICB8IEFQSSBFbmRwb2ludCBQYXRoICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8LS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgSWRlbnRpdHkgICAgIHwgQmFuayAgICAgICAgICAgICAgICAgfCAvYXBpL2JhbmtfYXBwbGljYXRpb25zICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgYmFua3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBJZGVudGl0eSAgICAgfCBDdXN0b21lclRva2VuICAgICAgICB8IC9hcGkvY3VzdG9tZXJfdG9rZW5zICAgICAgICAgICB8IENyZWF0ZSBjdXN0b21lciBKV1QgYWNjZXNzIHRva2VucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IElkZW50aXR5ICAgICB8IE9yZ2FuaXphdGlvbiAgICAgICAgIHwgL2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zIHwgQ3JlYXRlIGFuZCBsaXN0IG9yZ2FuaXphdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgSWRlbnRpdHkgICAgIHwgT3JnYW5pemF0aW9uICAgICAgICAgfCAvYXBpL3VzZXJzICAgICAgICAgICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3Qgb3JnYW5pemF0aW9uIHVzZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBPcmdhbml6YXRpb24gfCBPcmdhbml6YXRpb24gICAgICAgICB8IC9hcGkvb3JnYW5pemF0aW9ucyAgICAgICAgICAgICB8IEFQSXMgdG8gcmV0cmlldmUgYW5kIHVwZGF0ZSBvcmdhbml6YXRpb24gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEFjY291bnQgICAgICAgICAgICAgIHwgL2FwaS9hY2NvdW50cyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGFjY291bnRzLCB3aGljaCBob2xkIGEgc3BlY2lmaWMgYXNzZXQgZm9yIGEgY3VzdG9tZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQXNzZXQgICAgICAgICAgICAgICAgfCAvYXBpL2Fzc2V0cyAgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIGFzc2V0cyBzdXBwb3J0ZWQgYnkgdGhlIHBsYXRmb3JtIChleDogQlRDLCBFVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBCYW5rICAgICAgICAgICAgICAgICB8IC9hcGkvYmFua3MgICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSwgdXBkYXRlIGFuZCBsaXN0IGJhbmtzLCB0aGUgcGFyZW50IHRvIGN1c3RvbWVycywgYWNjb3VudHMsIGV0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEN1c3RvbWVyICAgICAgICAgICAgIHwgL2FwaS9jdXN0b21lcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IGN1c3RvbWVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgQ291bnRlcnBhcnR5ICAgICAgICAgfCAvYXBpL2NvdW50ZXJwYXJ0aWVzICAgICAgICAgICAgfCBDcmVhdGUgYW5kIGxpc3QgY291bnRlcnBhcnRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBEZXBvc2l0QWRkcmVzcyAgICAgICB8IC9hcGkvZGVwb3NpdF9hZGRyZXNzZXMgICAgICAgICB8IENyZWF0ZSwgZ2V0IGFuZCBsaXN0IGRlcG9zaXQgYWRkcmVzc2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEV4dGVybmFsQmFua0FjY291bnQgIHwgL2FwaS9leHRlcm5hbF9iYW5rX2FjY291bnRzICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgZXh0ZXJuYWwgYmFuayBhY2NvdW50cywgd2hpY2ggY29ubmVjdCBjdXN0b21lciBiYW5rIGFjY291bnRzIHRvIHRoZSBwbGF0Zm9ybSB8IHwgQmFuayAgICAgICAgIHwgRXh0ZXJuYWxXYWxsZXQgICAgICAgfCAvYXBpL2V4dGVybmFsX3dhbGxldHMgICAgICAgICAgfCBDcmVhdGUsIGdldCwgbGlzdCBhbmQgZGVsZXRlIGV4dGVybmFsIHdhbGxldHMsIHdoaWNoIGNvbm5lY3QgY3VzdG9tZXIgd2FsbGV0cyB0byB0aGUgcGxhdGZvcm0gICAgIHwgfCBCYW5rICAgICAgICAgfCBJZGVudGl0eVZlcmlmaWNhdGlvbiB8IC9hcGkvaWRlbnRpdHlfdmVyaWZpY2F0aW9ucyAgICB8IENyZWF0ZSBhbmQgbGlzdCBpZGVudGl0eSB2ZXJpZmljYXRpb25zLCB3aGljaCBhcmUgcGVyZm9ybWVkIG9uIGN1c3RvbWVycyBmb3IgS1lDICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IEludm9pY2UgICAgICAgICAgICAgIHwgL2FwaS9pbnZvaWNlcyAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQsIGNhbmNlbCBhbmQgbGlzdCBpbnZvaWNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgUGF5bWVudEluc3RydWN0aW9uICAgfCAvYXBpL3BheW1lbnRfaW5zdHJ1Y3Rpb25zICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCBwYXltZW50IGluc3RydWN0aW9ucyBmb3IgaW52b2ljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBQcmljZSAgICAgICAgICAgICAgICB8IC9hcGkvcHJpY2VzICAgICAgICAgICAgICAgICAgICB8IEdldCB0aGUgY3VycmVudCBwcmljZXMgZm9yIGFzc2V0cyBvbiB0aGUgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFF1b3RlICAgICAgICAgICAgICAgIHwgL2FwaS9xdW90ZXMgICAgICAgICAgICAgICAgICAgIHwgQ3JlYXRlIGFuZCBsaXN0IHF1b3Rlcywgd2hpY2ggYXJlIHJlcXVpcmVkIHRvIGV4ZWN1dGUgdHJhZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgU3ltYm9sICAgICAgICAgICAgICAgfCAvYXBpL3N5bWJvbHMgICAgICAgICAgICAgICAgICAgfCBHZXQgYSBsaXN0IG9mIHN5bWJvbHMgc3VwcG9ydGVkIGZvciB0cmFkZSAoZXg6IEJUQy1VU0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfCBCYW5rICAgICAgICAgfCBUcmFkZSAgICAgICAgICAgICAgICB8IC9hcGkvdHJhZGVzICAgICAgICAgICAgICAgICAgICB8IENyZWF0ZSBhbmQgbGlzdCB0cmFkZXMsIHdoaWNoIGJ1eSBvciBzZWxsIGNyeXB0b2N1cnJlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB8IEJhbmsgICAgICAgICB8IFRyYW5zZmVyICAgICAgICAgICAgIHwgL2FwaS90cmFuc2ZlcnMgICAgICAgICAgICAgICAgIHwgQ3JlYXRlLCBnZXQgYW5kIGxpc3QgdHJhbnNmZXJzIChlLmcuLCBmdW5kaW5nLCBib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHwgQmFuayAgICAgICAgIHwgV29ya2Zsb3cgICAgICAgICAgICAgfCAvYXBpL3dvcmtmbG93cyAgICAgICAgICAgICAgICAgfCBDcmVhdGUsIGdldCBhbmQgbGlzdCB3b3JrZmxvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICMjIFVuZGVyc3RhbmRpbmcgT2JqZWN0IE1vZGVscyAmIEVuZHBvaW50cyAgKipPcmdhbml6YXRpb25zKiogIEFuIGBPcmdhbml6YXRpb25gIGlzIG1lYW50IHRvIHJlcHJlc2VudCB0aGUgb3JnYW5pemF0aW9uIHBhcnRuZXJpbmcgd2l0aCBDeWJyaWQgdG8gdXNlIG91ciBwbGF0Zm9ybS4gIEFuIGBPcmdhbml6YXRpb25gIHR5cGljYWxseSBkb2VzIG5vdCBkaXJlY3RseSBpbnRlcmFjdCB3aXRoIGBjdXN0b21lcnNgLiBJbnN0ZWFkLCBhbiBPcmdhbml6YXRpb24gaGFzIG9uZSBvciBtb3JlIGBiYW5rc2AsIHdoaWNoIGVuY29tcGFzcyB0aGUgZmluYW5jaWFsIHNlcnZpY2Ugb2ZmZXJpbmdzIG9mIHRoZSBwbGF0Zm9ybS4gICoqQmFua3MqKiAgQSBgQmFua2AgaXMgb3duZWQgYnkgYW4gYE9yZ2FuaXphdGlvbmAgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGFuIGVudmlyb25tZW50IG9yIGNvbnRhaW5lciBmb3IgYGN1c3RvbWVyc2AgYW5kIHByb2R1Y3Qgb2ZmZXJpbmdzLiBCYW5rcyBhcmUgY3JlYXRlZCBpbiBlaXRoZXIgYFNhbmRib3hgIG9yIGBQcm9kdWN0aW9uYCBtb2RlLCB3aGVyZSBgU2FuZGJveGAgaXMgdGhlIGVudmlyb25tZW50IHRoYXQgeW91IHdvdWxkIHRlc3QsIHByb3RvdHlwZSBhbmQgYnVpbGQgaW4gcHJpb3IgdG8gbW92aW5nIHRvIGBQcm9kdWN0aW9uYC4gIEFuIGBPcmdhbml6YXRpb25gIGNhbiBoYXZlIG11bHRpcGxlIGBiYW5rc2AsIGluIGVpdGhlciBgU2FuZGJveGAgb3IgYFByb2R1Y3Rpb25gIGVudmlyb25tZW50cy4gQSBgU2FuZGJveCBCYW5rYCB3aWxsIGJlIGJhY2tlZCBieSBzdHViYmVkIGRhdGEgYW5kIHByb2Nlc3MgZmxvd3MuIEZvciBpbnN0YW5jZSwgZnVuZGluZyBzb3VyY2UgdHJhbnNmZXIgcHJvY2Vzc2VzIGFzIHdlbGwgYXMgdHJhZGVzIHdpbGwgYmUgc2ltdWxhdGVkIHJhdGhlciB0aGFuIHBlcmZvcm1lZCwgaG93ZXZlciBhc3NldCBwcmljZXMgYXJlIHJlcHJlc2VudGF0aXZlIG9mIHJlYWwtd29ybGQgdmFsdWVzLiBZb3UgaGF2ZSBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIHNpbXVsYXRlZCBmaWF0IGN1cnJlbmN5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLiAgKipDdXN0b21lcnMqKiAgYEN1c3RvbWVyc2AgcmVwcmVzZW50IHlvdXIgYmFua2luZyB1c2VycyBvbiB0aGUgcGxhdGZvcm0uIEF0IHByZXNlbnQsIHdlIG9mZmVyIHN1cHBvcnQgZm9yIGBJbmRpdmlkdWFsc2AgYXMgQ3VzdG9tZXJzLiAgYEN1c3RvbWVyc2AgbXVzdCBiZSB2ZXJpZmllZCAoaS5lLiwgS1lDXFwnZCkgaW4gb3VyIHN5c3RlbSBiZWZvcmUgdGhleSBjYW4gcGxheSBhbnkgcGFydCBvbiB0aGUgcGxhdGZvcm0sIHdoaWNoIG1lYW5zIHRoZXkgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgYW5kIGEgcGFzc2luZyBgSWRlbnRpdHkgVmVyaWZpY2F0aW9uYC4gU2VlIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb25zIHNlY3Rpb24gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgYSBjdXN0b21lciBjYW4gYmUgdmVyaWZpZWQuICBgQ3VzdG9tZXJzYCBtdXN0IGFsc28gaGF2ZSBhbiBgQWNjb3VudGAgdG8gYmUgYWJsZSB0byB0cmFuc2FjdCwgaW4gdGhlIGRlc2lyZWQgYXNzZXQgY2xhc3MuIFNlZSB0aGUgQWNjb3VudHMgQVBJcyBmb3IgbW9yZSBkZXRhaWxzIG9uIHNldHRpbmcgdXAgYWNjb3VudHMgZm9yIHRoZSBjdXN0b21lci4gXG4gKlxuICogVGhlIHZlcnNpb24gb2YgdGhlIE9wZW5BUEkgZG9jdW1lbnQ6IHYwLjEyOS43NTFcbiAqIENvbnRhY3Q6IHN1cHBvcnRAY3licmlkLmFwcFxuICpcbiAqIE5PVEU6IFRoaXMgY2xhc3MgaXMgYXV0byBnZW5lcmF0ZWQgYnkgT3BlbkFQSSBHZW5lcmF0b3IgKGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaCkuXG4gKiBodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2hcbiAqIERvIG5vdCBlZGl0IHRoZSBjbGFzcyBtYW51YWxseS5cbiAqL1xuLyogdHNsaW50OmRpc2FibGU6bm8tdW51c2VkLXZhcmlhYmxlIG1lbWJlci1vcmRlcmluZyAqL1xuXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gICAgICAgICAgICAgICAgICAgICAgZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFBhcmFtcyxcbiAgICAgICAgIEh0dHBSZXNwb25zZSwgSHR0cEV2ZW50LCBIdHRwUGFyYW1ldGVyQ29kZWMsIEh0dHBDb250ZXh0IFxuICAgICAgICB9ICAgICAgIGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEN1c3RvbUh0dHBQYXJhbWV0ZXJDb2RlYyB9ICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9lbmNvZGVyJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tICdyeGpzJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQXBwbGljYXRpb25JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2FwcGxpY2F0aW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYXBwbGljYXRpb25MaXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEFwcGxpY2F0aW9uV2l0aFNlY3JldElkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvYXBwbGljYXRpb25XaXRoU2VjcmV0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEVycm9yUmVzcG9uc2VJZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL2Vycm9yUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIH0gZnJvbSAnLi4vbW9kZWwvcGF0Y2hBcHBsaWNhdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbCB9IGZyb20gJy4uL21vZGVsL3Bvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbic7XG5cbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTIH0gICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgT3JnYW5pemF0aW9uQXBwbGljYXRpb25zU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly9pZC5zYW5kYm94LmN5YnJpZC5hcHAnO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBwdWJsaWMgZW5jb2RlcjogSHR0cFBhcmFtZXRlckNvZGVjO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmcsIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcbiAgICB9XG5cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlOiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUsIGtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU/OiBhbnksIGtleT86IHN0cmluZyk6IEh0dHBQYXJhbXMge1xuICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAodmFsdWUgYXMgYW55W10pLmZvckVhY2goIGVsZW0gPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIGVsZW0sIGtleSkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgKHZhbHVlIGFzIERhdGUpLnRvSVNPU3RyaW5nKCkuc3Vic3RyKDAsIDEwKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgRGF0ZVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKCBrID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShcbiAgICAgICAgICAgICAgICAgICAgaHR0cFBhcmFtcywgdmFsdWVba10sIGtleSAhPSBudWxsID8gYCR7a2V5fS4ke2t9YCA6IGspKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IGh0dHBQYXJhbXMuYXBwZW5kKGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIG5vdCBvYmplY3Qgb3IgYXJyYXlcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGh0dHBQYXJhbXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIENyZWF0ZSBhbiBvcmdhbml6YXRpb24gT0F1dGgyIGFwcGxpY2F0aW9uLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gcG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwgXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZU9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsOiBQb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEFwcGxpY2F0aW9uV2l0aFNlY3JldElkcE1vZGVsPjtcbiAgICBwdWJsaWMgY3JlYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24ocG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWw6IFBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcHBsaWNhdGlvbldpdGhTZWNyZXRJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihwb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbDogUG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxBcHBsaWNhdGlvbldpdGhTZWNyZXRJZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBjcmVhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihwb3N0T3JnYW5pemF0aW9uQXBwbGljYXRpb25JZHBNb2RlbDogUG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsID09PSBudWxsIHx8IHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHBvc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8QXBwbGljYXRpb25XaXRoU2VjcmV0SWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnNgLFxuICAgICAgICAgICAgcG9zdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uSWRwTW9kZWwsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIERlbGV0ZXMgYW4gYXBwbGljYXRpb24uUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczpleGVjdXRlKipcbiAgICAgKiBAcGFyYW0gY2xpZW50SWQgSWRlbnRpZmllciBmb3IgdGhlIGFwcGxpY2F0aW9uLlxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PjtcbiAgICBwdWJsaWMgZGVsZXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8YW55Pj47XG4gICAgcHVibGljIGRlbGV0ZU9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKGNsaWVudElkOiBzdHJpbmcsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PjtcbiAgICBwdWJsaWMgZGVsZXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBpZiAoY2xpZW50SWQgPT09IG51bGwgfHwgY2xpZW50SWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY2xpZW50SWQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5kZWxldGU8YW55PihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjbGllbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIFJldHJpZXZlcyBhbiBvcmdhbml6YXRpb24gYXBwbGljYXRpb24uICBSZXF1aXJlZCBzY29wZTogKipvcmdhbml6YXRpb25fYXBwbGljYXRpb25zOnJlYWQqKlxuICAgICAqIEBwYXJhbSBjbGllbnRJZCBJZGVudGlmaWVyIGZvciB0aGUgYXBwbGljYXRpb24uXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uKGNsaWVudElkOiBzdHJpbmcsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxBcHBsaWNhdGlvbklkcE1vZGVsPjtcbiAgICBwdWJsaWMgZ2V0T3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyBnZXRPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGlmIChjbGllbnRJZCA9PT0gbnVsbCB8fCBjbGllbnRJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjbGllbnRJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAoQmVhcmVyQXV0aCkgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ0JlYXJlckF1dGgnKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxBcHBsaWNhdGlvbklkcE1vZGVsPihgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9L2FwaS9vcmdhbml6YXRpb25fYXBwbGljYXRpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhjbGllbnRJZCkpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBvcmdhbml6YXRpb24gYXBwbGljYXRpb25zXG4gICAgICogUmV0cmlldmUgYSBsaXN0IG9mIG9yZ2FuaXphdGlvbiBPQXV0aDIgYXBwbGljYXRpb25zLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uczpyZWFkKipcbiAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcGFnZSBpbmRleCB0byByZXRyaWV2ZS5cbiAgICAgKiBAcGFyYW0gcGVyUGFnZSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHBlciBwYWdlIHRvIHJldHVybi5cbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdE9yZ2FuaXphdGlvbkFwcGxpY2F0aW9ucyhwYWdlPzogc3RyaW5nLCBwZXJQYWdlPzogc3RyaW5nLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8QXBwbGljYXRpb25MaXN0SWRwTW9kZWw+O1xuICAgIHB1YmxpYyBsaXN0T3JnYW5pemF0aW9uQXBwbGljYXRpb25zKHBhZ2U/OiBzdHJpbmcsIHBlclBhZ2U/OiBzdHJpbmcsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsPj47XG4gICAgcHVibGljIGxpc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwcGxpY2F0aW9uTGlzdElkcE1vZGVsPj47XG4gICAgcHVibGljIGxpc3RPcmdhbml6YXRpb25BcHBsaWNhdGlvbnMocGFnZT86IHN0cmluZywgcGVyUGFnZT86IHN0cmluZywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPGFueT4ge1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGVyUGFnZSAhPT0gdW5kZWZpbmVkICYmIHBlclBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wZXJQYWdlLCAncGVyX3BhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKEJlYXJlckF1dGgpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdCZWFyZXJBdXRoJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5nZXQ8QXBwbGljYXRpb25MaXN0SWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnNgLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIG9yZ2FuaXphdGlvbiBhcHBsaWNhdGlvblxuICAgICAqIFVwZGF0ZXMgYW4gb3JnYW5pemF0aW9uIGFwcGxpY2F0aW9uLiAgUmVxdWlyZWQgc2NvcGU6ICoqb3JnYW5pemF0aW9uX2FwcGxpY2F0aW9uczp3cml0ZSoqXG4gICAgICogQHBhcmFtIGNsaWVudElkIElkZW50aWZpZXIgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAgICAgKiBAcGFyYW0gcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIFxuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAnYXBwbGljYXRpb24vanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dH0pOiBPYnNlcnZhYmxlPEFwcGxpY2F0aW9uSWRwTW9kZWw+O1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXBwbGljYXRpb25JZHBNb2RlbD4+O1xuICAgIHB1YmxpYyB1cGRhdGVPcmdhbml6YXRpb25BcHBsaWNhdGlvbihjbGllbnRJZDogc3RyaW5nLCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWw6IFBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCwgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICdhcHBsaWNhdGlvbi9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0fSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFwcGxpY2F0aW9uSWRwTW9kZWw+PjtcbiAgICBwdWJsaWMgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24oY2xpZW50SWQ6IHN0cmluZywgcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsOiBQYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWwsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ2FwcGxpY2F0aW9uL2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHR9KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgaWYgKGNsaWVudElkID09PSBudWxsIHx8IGNsaWVudElkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNsaWVudElkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCA9PT0gbnVsbCB8fCBwYXRjaEFwcGxpY2F0aW9uSWRwTW9kZWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcGF0Y2hBcHBsaWNhdGlvbklkcE1vZGVsIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlT3JnYW5pemF0aW9uQXBwbGljYXRpb24uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChCZWFyZXJBdXRoKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnQmVhcmVyQXV0aCcpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBhdGNoPEFwcGxpY2F0aW9uSWRwTW9kZWw+KGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0vYXBpL29yZ2FuaXphdGlvbl9hcHBsaWNhdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGNsaWVudElkKSl9YCxcbiAgICAgICAgICAgIHBhdGNoQXBwbGljYXRpb25JZHBNb2RlbCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==